pax_global_header00006660000000000000000000000064130504256770014523gustar00rootroot0000000000000052 comment=32e4d227af032365cfd7f9291d9f2c2fca57d99d gnss-sdr-0.0.9/000077500000000000000000000000001305042567700132715ustar00rootroot00000000000000gnss-sdr-0.0.9/.gitignore000066400000000000000000000002321305042567700152560ustar00rootroot00000000000000*~ .*.swp docs/doxygen/Doxyfile docs/html docs/latex docs/GNSS-SDR_manual.pdf src/tests/data/output.dat thirdparty/ .project .cproject /install .DS_Store gnss-sdr-0.0.9/AUTHORS000066400000000000000000000047311305042567700143460ustar00rootroot00000000000000GNSS-SDR Authorship ------------------------------------------------------------------------------ The GNSS-SDR project is hosted and sponsored by the Centre Tecnologic de Telecomunicacions de Catalunya (CTTC), a non-profit research foundation located in Castelldefels (40.396764 N, 3.713379 E), 20 km south of Barcelona, Spain. GNSS-SDR is the by-product of GNSS research conducted at the Communications Systems Division of CTTC, and it is the combined effort of students, software engineers and researchers from different institutions around the World. Contact Information ------------------------------------------------------------------------------ GNSS-SDR Homepage ---------------------------- http://gnss-sdr.org CTTC Homepage ---------------------------- http://www.cttc.cat Mailing Lists ---------------------------- gnss-sdr-developers@lists.sourceforge.net http://lists.sourceforge.net/lists/listinfo/gnss-sdr-developers Email ---------------------------- Inquiries beyond the mailing list can be sent to carles.fernandez@cttc.cat List of authors ------------------------------------------------------------------------------ Carles Fernandez-Prades carles.fernandez@cttc.cat Project manager Javier Arribas javier.arribas@cttc.cat Developer Luis Esteve Elfau luis@epsilon-formacion.com Developer Pau Closas pau.closas@cttc.cat Consultant Carlos Aviles carlos.avilesr@googlemail.com Developer David Pubill david.pubill@cttc.cat Developer Mara Branzanti mara.branzanti@gmail.com Developer Marc Molina marc.molina.pena@gmail.com Developer Daniel Fehr daniel.co@bluewin.ch Developer Marc Sales marcsales92@gmail.com Developer Damian Miralles dmiralles2009@gmail.com Developer Andres Cecilia Luque a.cecilia.luque@gmail.com Developer Leonardo Tonetto tonetto.dev@gmail.com Contributor Anthony Arnold anthony.arnold@uqconnect.edu.au Contributor Fran Fabra fabra@ice.csic.es Contributor Cillian O'Driscoll cillian.odriscoll@gmail.com Contributor Ignacio Paniego ignacio.paniego@gmail.com Web design Eva Puchol eva.puchol@gmail.com Web developer Carlos Paniego carpanie@hotmail.com Artwork gnss-sdr-0.0.9/CMakeLists.txt000066400000000000000000001710111305042567700160320ustar00rootroot00000000000000# Copyright (C) 2010-2017 (see AUTHORS file for a list of contributors) # # 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 . # ######################################################################## # Project setup ######################################################################## if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) message(WARNING "In-tree build is bad practice. Try 'cd build && cmake ../' ") endif(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) cmake_minimum_required(VERSION 2.8) project(gnss-sdr CXX C) list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules) file(RELATIVE_PATH RELATIVE_CMAKE_CALL ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) if(NOT CMAKE_PREFIX_PATH) if(DEFINED ENV{PYBOMBS_PREFIX}) set(CMAKE_PREFIX_PATH $ENV{PYBOMBS_PREFIX}) endif(DEFINED ENV{PYBOMBS_PREFIX}) if(DEFINED ENV{SNAP}) set(CMAKE_PREFIX_PATH $ENV{SNAP}) endif(DEFINED ENV{SNAP}) endif(NOT CMAKE_PREFIX_PATH) ######################################################################## # Determine optional blocks/libraries to be built (default: not built) # Enable them here or at the command line by doing 'cmake -DENABLE_XXX=ON ../' ######################################################################## # Support of optional RF front-ends option(ENABLE_OSMOSDR "Enable the use of OsmoSDR and other front-ends (RTL-based dongles, HackRF, bladeRF, etc.) as signal source (experimental)" OFF) option(ENABLE_FLEXIBAND "Enable the use of the signal source adater for the Teleorbit Flexiband GNURadio driver" OFF) option(ENABLE_ARRAY "Enable the use of CTTC's antenna array front-end as signal source (experimental)" OFF) option(ENABLE_GN3S "Enable the use of the GN3S dongle as signal source (experimental)" OFF) # Performance analysis tools option(ENABLE_GPERFTOOLS "Enable linking to Gperftools libraries (tcmalloc and profiler)" OFF) option(ENABLE_GPROF "Enable the use of the GNU profiler tool 'gprof'" OFF) # Acceleration option(ENABLE_PROFILING "Enable execution of volk_gnsssdr_profile at the end of the building" OFF) option(ENABLE_OPENCL "Enable building of processing blocks implemented with OpenCL (experimental)" OFF) option(ENABLE_CUDA "Enable building of processing blocks implemented with CUDA (experimental, requires CUDA SDK)" OFF) # Building and packaging options option(ENABLE_GENERIC_ARCH "Builds a portable binary" OFF) option(ENABLE_PACKAGING "Enable software packaging" OFF) option(ENABLE_OWN_GLOG "Download glog and link it to gflags" OFF) option(ENABLE_OWN_ARMADILLO "Download and build Armadillo locally" OFF) option(ENABLE_LOG "Enable logging" ON) if(ENABLE_PACKAGING) set(ENABLE_GENERIC_ARCH ON) endif(ENABLE_PACKAGING) # Testing option(ENABLE_UNIT_TESTING "Build unit tests" ON) option(ENABLE_UNIT_TESTING_EXTRA "Download external files and build extra unit tests" OFF) option(ENABLE_SYSTEM_TESTING "Build system tests" OFF) option(ENABLE_SYSTEM_TESTING_EXTRA "Download external tools and build extra system tests" OFF) if(ENABLE_SYSTEM_TESTING_EXTRA) set(ENABLE_SYSTEM_TESTING ON) endif(ENABLE_SYSTEM_TESTING_EXTRA) option(ENABLE_OWN_GPSTK "Force to download, build and link GPSTk for system tests, even if it is already installed" OFF) ############################### # GNSS-SDR version information ############################### set(THIS_IS_A_RELEASE ON) # only related to version name, no further implications. if(NOT ${THIS_IS_A_RELEASE}) # Get the current working branch execute_process( COMMAND git rev-parse --abbrev-ref HEAD WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE GIT_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE ) # Get the latest abbreviated commit hash of the working branch execute_process( COMMAND git log -1 --format=%h WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE GIT_COMMIT_HASH OUTPUT_STRIP_TRAILING_WHITESPACE ) endif(NOT ${THIS_IS_A_RELEASE}) set(VERSION_INFO_MAJOR_VERSION 0) set(VERSION_INFO_API_COMPAT 0) if(${THIS_IS_A_RELEASE}) set(VERSION_INFO_MINOR_VERSION 9) else(${THIS_IS_A_RELEASE}) set(VERSION_INFO_MINOR_VERSION 9.git-${GIT_BRANCH}-${GIT_COMMIT_HASH}) endif(${THIS_IS_A_RELEASE}) set(VERSION ${VERSION_INFO_MAJOR_VERSION}.${VERSION_INFO_API_COMPAT}.${VERSION_INFO_MINOR_VERSION}) ######################################################################## # Environment setup ######################################################################## include(ExternalProject) # Detect 64-bits machine if( CMAKE_SIZEOF_VOID_P EQUAL 8 ) set(ARCH_64BITS TRUE) endif( CMAKE_SIZEOF_VOID_P EQUAL 8 ) set(OS_IS_MACOSX "") set(OS_IS_LINUX "") # Detect Linux Distribution if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") set(OperatingSystem "Linux") set(OS_IS_LINUX TRUE) if(ARCH_64BITS) set(ARCH_ "(64 bits)") else(ARCH_64BITS) set(ARCH_ "(32 bits)") endif(ARCH_64BITS) if(EXISTS "/etc/lsb-release") execute_process(COMMAND cat /etc/lsb-release COMMAND grep DISTRIB_ID COMMAND awk -F= "{ print $2 }" COMMAND tr "\n" " " COMMAND sed "s/ //" OUTPUT_VARIABLE LINUX_DISTRIBUTION RESULT_VARIABLE LINUX_ID_RESULT ) execute_process(COMMAND cat /etc/lsb-release COMMAND grep DISTRIB_RELEASE COMMAND awk -F= "{ print $2 }" COMMAND tr "\n" " " COMMAND sed "s/ //" OUTPUT_VARIABLE LINUX_VER RESULT_VARIABLE LINUX_VER_RESULT ) endif(EXISTS "/etc/lsb-release") if(NOT LINUX_DISTRIBUTION) if(EXISTS "/etc/linuxmint/info") set(LINUX_DISTRIBUTION "LinuxMint") execute_process(COMMAND cat /etc/linuxmint/info COMMAND grep -m1 RELEASE COMMAND awk -F= "{ print $2 }" COMMAND tr "\n" " " COMMAND sed "s/ //" OUTPUT_VARIABLE LINUX_VER RESULT_VARIABLE LINUX_VER_RESULT ) endif(EXISTS "/etc/linuxmint/info") endif(NOT LINUX_DISTRIBUTION) if(NOT LINUX_DISTRIBUTION) if(EXISTS "/etc/os-release") execute_process(COMMAND cat /etc/os-release COMMAND grep -m1 NAME COMMAND awk -F= "{ print $2 }" COMMAND tr "\n" " " COMMAND sed "s/ //" OUTPUT_VARIABLE LINUX_DISTRIBUTION RESULT_VARIABLE LINUX_ID_RESULT ) execute_process(COMMAND cat /etc/os-release COMMAND grep VERSION_ID COMMAND awk -F= "{ print $2 }" COMMAND tr "\n" " " COMMAND sed "s/ //" OUTPUT_VARIABLE LINUX_VER RESULT_VARIABLE LINUX_VER_RESULT ) if(${LINUX_DISTRIBUTION} MATCHES "Debian") set(LINUX_DISTRIBUTION "Debian") file(READ /etc/debian_version LINUX_VER) endif(${LINUX_DISTRIBUTION} MATCHES "Debian") endif(EXISTS "/etc/os-release") endif(NOT LINUX_DISTRIBUTION) if(NOT LINUX_DISTRIBUTION) if(EXISTS "/etc/redhat-release") set(LINUX_DISTRIBUTION "Red Hat") file (READ /etc/redhat-release LINUX_VER) endif(EXISTS "/etc/redhat-release") endif(NOT LINUX_DISTRIBUTION) if(NOT LINUX_DISTRIBUTION) if(EXISTS "/etc/debian_version") set(LINUX_DISTRIBUTION "Debian") file (READ /etc/debian_version LINUX_VER) endif(EXISTS "/etc/debian_version") endif(NOT LINUX_DISTRIBUTION) if(NOT LINUX_DISTRIBUTION) set(LINUX_DISTRIBUTION "Generic") set(LINUX_VER "Unknown") 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") # Detect Mac OS X Version if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(OperatingSystem "Mac OS X") set(OS_IS_MACOSX TRUE) exec_program(uname ARGS -v OUTPUT_VARIABLE DARWIN_VERSION) string(REGEX MATCH "[0-9]+" DARWIN_VERSION ${DARWIN_VERSION}) if(${DARWIN_VERSION} MATCHES "16") set(MACOS_SIERRA TRUE) set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++11") set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++") message(STATUS "Configuring GNSS-SDR v${VERSION} to be built on macOS Sierra 10.12") endif(${DARWIN_VERSION} MATCHES "16") if(${DARWIN_VERSION} MATCHES "15") set(MACOSX_EL_CAPITAN TRUE) set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++11") set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++") message(STATUS "Configuring GNSS-SDR v${VERSION} to be built on Mac OS X 10.11 El Capitan") endif(${DARWIN_VERSION} MATCHES "15") if(${DARWIN_VERSION} MATCHES "14") set(MACOSX_YOSEMITE TRUE) set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++11") set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++") message(STATUS "Configuring GNSS-SDR v${VERSION} to be built on Mac OS X 10.10 Yosemite") endif(${DARWIN_VERSION} MATCHES "14") if(${DARWIN_VERSION} MATCHES "13") set(MACOSX_MAVERICKS TRUE) set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++11") set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++") set(CMAKE_XCODE_ATTRIBUTE_GCC_VERSION="com.apple.compilers.llvm.clang.1_0") message(STATUS "Configuring GNSS-SDR v${VERSION} to be built on Mac OS X 10.9 Mavericks") endif(${DARWIN_VERSION} MATCHES "13") if(${DARWIN_VERSION} MATCHES "12") message(STATUS "Configuring GNSS-SDR v${VERSION} to be built on Mac OS X 10.8 Mountain Lion") endif(${DARWIN_VERSION} MATCHES "12") if(${DARWIN_VERSION} MATCHES "11") message(STATUS "Configuring GNSS-SDR v${VERSION} to be built on Mac OS X 10.7 Lion") endif(${DARWIN_VERSION} MATCHES "11") if(${DARWIN_VERSION} MATCHES "10") message(STATUS "Configuring GNSS-SDR v${VERSION} to be built on Mac OS X 10.6 Snow Leopard") endif(${DARWIN_VERSION} MATCHES "10") endif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") #select the release build type by default to get optimization flags if(NOT CMAKE_BUILD_TYPE) if(ENABLE_GPERFTOOLS OR ENABLE_GPROF) set(CMAKE_BUILD_TYPE "RelWithDebInfo") message(STATUS "Build type not specified: defaulting to RelWithDebInfo.") else(ENABLE_GPERFTOOLS OR ENABLE_GPROF) set(CMAKE_BUILD_TYPE "Release") message(STATUS "Build type not specified: defaulting to Release.") endif(ENABLE_GPERFTOOLS OR ENABLE_GPROF) else(NOT CMAKE_BUILD_TYPE) message(STATUS "Build type set to ${CMAKE_BUILD_TYPE}.") endif(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "") # Append -O2 optimization flag for Debug builds set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O2") ################################################################################ # Checkout cmake version ################################################################################ if(CMAKE_VERSION VERSION_LESS 2.8.8) message(STATUS "Your CMake version is too old and does not support some features required by GNSS-SDR. CMake version must be at least 2.8.8. For more information check https://github.com/joakimkarlsson/bandit/issues/40") message(FATAL_ERROR "Fatal error: CMake >= 2.8.8 required.") endif(CMAKE_VERSION VERSION_LESS 2.8.8) ################################################################################ # Checkout compiler version ################################################################################ if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.7) message(STATUS "Your GCC version is too old and does not support some C++11 features required by GNSS-SDR. GCC version must be at least 4.7") if(${LINUX_DISTRIBUTION} MATCHES "Ubuntu") if(${LINUX_VER} MATCHES "12.04") message(STATUS "For instructions on how to upgrade GCC, check http://askubuntu.com/a/271561") endif(${LINUX_VER} MATCHES "12.04") endif(${LINUX_DISTRIBUTION} MATCHES "Ubuntu") message(FATAL_ERROR "Fatal error: GCC >= 4.7 required.") endif(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.7) endif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") ################################################################################ # Check if the compiler defines the architecture as ARM ################################################################################ if(NOT OS_IS_MACOSX) if(CMAKE_CROSSCOMPILING) set(IS_ARM TRUE) else(CMAKE_CROSSCOMPILING) include(TestForARM) endif(CMAKE_CROSSCOMPILING) endif(NOT OS_IS_MACOSX) ################################################################################ # Check for availability of SSE ################################################################################ if(NOT ENABLE_GENERIC_ARCH) include(TestForSSE) 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) ################################################################################ # Googletest - https://github.com/google/googletest ################################################################################ enable_testing() if(ENABLE_UNIT_TESTING OR ENABLE_SYSTEM_TESTING) if(EXISTS $ENV{GTEST_DIR}) set(GTEST_DIR $ENV{GTEST_DIR}) endif(EXISTS $ENV{GTEST_DIR}) if(GTEST_DIR) message(STATUS "Googletest root folder set at ${GTEST_DIR}") find_path(LIBGTEST_DEV_DIR NAMES src/gtest-all.cc PATHS ${GTEST_DIR}) if(LIBGTEST_DEV_DIR) message (STATUS "Googletest has been found.") else(LIBGTEST_DEV_DIR) message (FATAL_ERROR " Googletest source code has not been found at ${GTEST_DIR}.") endif(LIBGTEST_DEV_DIR) find_path(GTEST_INCLUDE_DIRS NAMES gtest/gtest.h PATHS ${GTEST_DIR}/include) else(GTEST_DIR) find_path(LIBGTEST_DEV_DIR NAMES src/gtest-all.cc PATHS /usr/src/gtest /opt/local/src/gtest-1.7.0) find_path(GTEST_INCLUDE_DIRS NAMES gtest/gtest.h PATHS /usr/include /opt/local/src/gtest-1.7.0/include) if(LIBGTEST_DEV_DIR) message (STATUS "Googletest (libgtest-dev package) has been found.") else(LIBGTEST_DEV_DIR) message (STATUS " Googletest has not been found.") message (STATUS " Googletest will be downloaded and built automatically ") message (STATUS " when doing 'make'. ") endif(LIBGTEST_DEV_DIR) endif(GTEST_DIR) endif(ENABLE_UNIT_TESTING OR ENABLE_SYSTEM_TESTING) ################################################################################ # Boost - http://www.boost.org ################################################################################ if(UNIX AND EXISTS "/usr/lib64") list(APPEND BOOST_LIBRARYDIR "/usr/lib64") # Fedora 64-bit fix endif(UNIX AND EXISTS "/usr/lib64") set(Boost_ADDITIONAL_VERSIONS "1.45.0" "1.45" "1.46.0" "1.46" "1.48.0" "1.48" "1.49.0" "1.49" "1.50.0" "1.50" "1.51.0" "1.51" "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" "1.70.0" "1.70" "1.71.0" "1.71" "1.72.0" "1.72" "1.73.0" "1.73" "1.74.0" "1.74" ) set(Boost_USE_MULTITHREAD ON) set(Boost_USE_STATIC_LIBS OFF) find_package(Boost COMPONENTS date_time system filesystem thread serialization chrono unit_test_framework program_options REQUIRED) if(NOT Boost_FOUND) message(FATAL_ERROR "Fatal error: Boost (version >=1.45.0) required.") endif(NOT Boost_FOUND) ################################################################################ # GNU Radio - http://gnuradio.org ################################################################################ set(GR_REQUIRED_COMPONENTS RUNTIME ANALOG BLOCKS FFT FILTER PMT) find_package(Gnuradio) if(PC_GNURADIO_RUNTIME_VERSION) if(PC_GNURADIO_RUNTIME_VERSION VERSION_LESS 3.7.3) set(GNURADIO_RUNTIME_FOUND) message(STATUS "The GNU Radio version installed in your system is too old.") endif(PC_GNURADIO_RUNTIME_VERSION VERSION_LESS 3.7.3) endif(PC_GNURADIO_RUNTIME_VERSION) if(NOT GNURADIO_RUNTIME_FOUND) message(STATUS "CMake cannot find GNU Radio >= 3.7.3") if(OS_IS_LINUX) message("Go to https://github.com/gnuradio/pybombs") message("and follow the instructions to install GNU Radio in your system.") message(FATAL_ERROR "GNU Radio 3.7.3 or later is required to build gnss-sdr") endif(OS_IS_LINUX) if(OS_IS_MACOSX) message("You can install it easily via Macports:") message(" sudo port install gnuradio ") message("Alternatively, you can use homebrew:") message(" brew tap odrisci/gnuradio") message(" brew install gnuradio" ) message(FATAL_ERROR "GNU Radio 3.7.3 or later is required to build gnss-sdr") endif(OS_IS_MACOSX) endif(NOT GNURADIO_RUNTIME_FOUND) if(NOT GNURADIO_ANALOG_FOUND) message(FATAL_ERROR "*** The gnuradio-analog library v3.7.3 or later is required to build gnss-sdr") endif() if(NOT GNURADIO_BLOCKS_FOUND) message(FATAL_ERROR "*** The gnuradio-blocks library v3.7.3 or later is required to build gnss-sdr") endif() if(NOT GNURADIO_FILTER_FOUND) message(FATAL_ERROR "*** The gnuradio-filter library v3.7.3 or later is required to build gnss-sdr") endif() if(NOT GNURADIO_FFT_FOUND) message(FATAL_ERROR "*** The gnuradio-fft library v3.7.3 or later is required to build gnss-sdr") endif() if(NOT GNURADIO_PMT_FOUND) message(FATAL_ERROR "*** The gnuradio-pmt library v3.7.3 or later is required to build gnss-sdr") endif() ################################################################################ # VOLK - Vector-Optimized Library of Kernels ################################################################################ find_package(Volk) if(NOT VOLK_FOUND) message(FATAL_ERROR "*** VOLK is required to build gnss-sdr") endif() ################################################################################ # volk_gnsssdr module - GNSS-SDR's own VOLK library ################################################################################ find_package(VolkGnssSdr) if(NOT VOLK_GNSSSDR_FOUND) message(STATUS " volk_gnsssdr will be built along with gnss-sdr when doing 'make'") ############################### # Find Python required modules ############################### include(SetupPython) #sets PYTHON_EXECUTABLE and PYTHON_DASH_B GNSSSDR_PYTHON_CHECK_MODULE("python >= 2.7" sys "sys.version.split()[0] >= '2.7'" PYTHON_MIN_VER_FOUND) GNSSSDR_PYTHON_CHECK_MODULE("mako >= 0.4.2" mako "mako.__version__ >= '0.4.2'" MAKO_FOUND) GNSSSDR_PYTHON_CHECK_MODULE("six - python 2 and 3 compatibility library" six "True" SIX_FOUND) if(NOT PYTHON_MIN_VER_FOUND) message(FATAL_ERROR "Python 2.7 or greater required to build VOLK_GNSSSDR") endif() # Mako if(NOT MAKO_FOUND) message(STATUS "Mako templates not found. See http://www.makotemplates.org/ ") 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 python-mako") elseif(${LINUX_DISTRIBUTION} MATCHES "openSUSE") message(STATUS " sudo zypper install python-Mako") else(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") message(STATUS " sudo apt-get install python-mako") endif(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") message(FATAL_ERROR "Mako templates required to build VOLK_GNSSSDR") endif(NOT MAKO_FOUND) # Six if(NOT SIX_FOUND) message(STATUS "python-six not found. See https://pythonhosted.org/six/ ") 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 python-six") elseif(${LINUX_DISTRIBUTION} MATCHES "openSUSE") message(STATUS " sudo zypper install python-six") else(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") message(STATUS " sudo apt-get install python-six") endif(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") message(FATAL_ERROR "six - python 2 and 3 compatibility library required to build VOLK_GNSSSDR") endif(NOT SIX_FOUND) if(ENABLE_PACKAGING) if(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32) set(STRIP_VOLK_GNSSSDR_PROFILE "-DENABLE_STRIP=ON") endif(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32) endif(ENABLE_PACKAGING) set(VOLK_GNSSSDR_BUILD_COMMAND "make") if(PYTHON_EXECUTABLE) set(USE_THIS_PYTHON "-DPYTHON_EXECUTABLE=${PYTHON_EXECUTABLE}") endif(PYTHON_EXECUTABLE) if(OS_IS_MACOSX) if(CMAKE_GENERATOR STREQUAL Xcode) set(VOLK_GNSSSDR_BUILD_COMMAND "xcodebuild" "-configuration" "Debug" "-target") endif(CMAKE_GENERATOR STREQUAL Xcode) endif(OS_IS_MACOSX) set(CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") set(C_FLAGS "${CMAKE_C_FLAGS} -std=c11") if(CMAKE_CROSSCOMPILING) set(VOLK_GNSSSDR_COMPILER "") else(CMAKE_CROSSCOMPILING) set(VOLK_GNSSSDR_COMPILER -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}) endif(CMAKE_CROSSCOMPILING) set(VOLK_GNSSSDR_CMAKE_ARGS ${VOLK_GNSSSDR_COMPILER} -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/volk_gnsssdr_module/install -DENABLE_STATIC_LIBS=ON -DENABLE_PROFILING=${ENABLE_PROFILING} -DCMAKE_CXX_FLAGS=${CXX_FLAGS} -DCMAKE_C_FLAGS=${C_FLAGS} -DCMAKE_INCLUDE_PATH=${Boost_INCLUDE_DIR} ${STRIP_VOLK_GNSSSDR_PROFILE} ${USE_THIS_PYTHON} ) if(EXISTS $ENV{OECORE_TARGET_SYSROOT}) set(VOLK_GNSSSDR_CMAKE_ARGS ${VOLK_GNSSSDR_CMAKE_ARGS} -DENABLE_ORC=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_CURRENT_SOURCE_DIR}/cmake/Toolchains/oe-sdk_cross.cmake -DCROSSCOMPILE_MULTILIB=TRUE ) endif(EXISTS $ENV{OECORE_TARGET_SYSROOT}) ExternalProject_Add(volk_gnsssdr_module PREFIX ${CMAKE_CURRENT_BINARY_DIR}/volk_gnsssdr_module SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/volk_gnsssdr_module/build CMAKE_ARGS ${VOLK_GNSSSDR_CMAKE_ARGS} DOWNLOAD_COMMAND "" UPDATE_COMMAND "" PATCH_COMMAND "" BUILD_COMMAND ${VOLK_GNSSSDR_BUILD_COMMAND} volk_gnsssdr_profile INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/volk_gnsssdr_module/install ) find_package(ORC) if(NOT ORC_FOUND) set(ORC_LIBRARIES "") set(ORC_INCLUDE_DIRS "") endif(NOT ORC_FOUND) add_library(volk_gnsssdr UNKNOWN IMPORTED) set_property(TARGET volk_gnsssdr PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/volk_gnsssdr_module/install/lib/libvolk_gnsssdr.a) set(VOLK_GNSSSDR_INCLUDE_DIRS "${CMAKE_CURRENT_BINARY_DIR}/volk_gnsssdr_module/build/include/;${CMAKE_CURRENT_SOURCE_DIR}/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/include;${ORC_INCLUDE_DIRS}") set(VOLK_GNSSSDR_LIBRARIES volk_gnsssdr ${ORC_LIBRARIES}) add_custom_command(TARGET volk_gnsssdr_module POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/volk_gnsssdr_module/install/bin/volk_gnsssdr_profile ${CMAKE_SOURCE_DIR}/install/volk_gnsssdr_profile) add_custom_command(TARGET volk_gnsssdr_module POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/volk_gnsssdr_module/install/bin/volk_gnsssdr-config-info ${CMAKE_SOURCE_DIR}/install/volk_gnsssdr-config-info) endif(NOT VOLK_GNSSSDR_FOUND) ################################################################################ # gflags - https://github.com/gflags/gflags ################################################################################ set(LOCAL_GFLAGS false) set(gflags_RELEASE 2.2.0) find_package(GFlags) if (NOT GFlags_FOUND) message (STATUS " gflags library has not been found.") message (STATUS " gflags will be downloaded and built automatically ") message (STATUS " when doing 'make'. ") ExternalProject_Add( gflags-${gflags_RELEASE} PREFIX ${CMAKE_CURRENT_BINARY_DIR}/gflags-${gflags_RELEASE} GIT_REPOSITORY git://github.com/gflags/gflags.git GIT_TAG v${gflags_RELEASE} SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/gflags/gflags-${gflags_RELEASE} BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/gflags-${gflags_RELEASE} CMAKE_ARGS -DBUILD_SHARED_LIBS=ON -DBUILD_STATIC_LIBS=ON -DBUILD_gflags_nothreads_LIB=OFF -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} BUILD_COMMAND make UPDATE_COMMAND "" PATCH_COMMAND "" INSTALL_COMMAND "" ) set(GFlags_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/gflags-${gflags_RELEASE}/include CACHE PATH "Local Gflags headers" ) add_library(gflags UNKNOWN IMPORTED) set_property(TARGET gflags PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/gflags-${gflags_RELEASE}/lib/${CMAKE_FIND_LIBRARY_PREFIXES}gflags.a) add_dependencies(gflags gflags-${gflags_RELEASE}) set(GFlags_LIBS gflags) file(GLOB GFlags_SHARED_LIBS "${CMAKE_CURRENT_BINARY_DIR}/gflags-${gflags_RELEASE}/lib/${CMAKE_FIND_LIBRARY_PREFIXES}gflags${CMAKE_SHARED_LIBRARY_SUFFIX}*") set(GFlags_LIBRARY gflags-${gflags_RELEASE}) set(GFlags_LIBRARY_PATH ${CMAKE_CURRENT_BINARY_DIR}/gflags-${gflags_RELEASE}/lib ) link_directories(${GFlags_LIBRARY_PATH}) set(GFlags_lib ${GFlags_LIBS} CACHE FILEPATH "Local Gflags library") set(GFlags_LIBRARY_PATH ${GFlags_LIBS}) set(LOCAL_GFLAGS true CACHE STRING "GFlags downloaded and built automatically" FORCE) endif(NOT GFlags_FOUND) ################################################################################ # glog - https://github.com/google/glog ################################################################################ if(NOT ${ENABLE_OWN_GLOG}) find_package(GLOG) if(GLOG_INCLUDE_DIRS) set(GLOG_FOUND ON) endif(GLOG_INCLUDE_DIRS) endif(NOT ${ENABLE_OWN_GLOG}) set(glog_RELEASE 0.3.4) if (NOT GLOG_FOUND OR ${LOCAL_GFLAGS}) message (STATUS " glog library has not been found") if(NOT GFlags_FOUND) message(STATUS " or it is likely not linked to gflags.") endif(NOT GFlags_FOUND) message (STATUS " glog will be downloaded and built automatically ") message (STATUS " when doing 'make'. ") if(NOT ${LOCAL_GFLAGS}) add_library(gflags-${gflags_RELEASE} UNKNOWN IMPORTED) set_property(TARGET gflags-${gflags_RELEASE} PROPERTY IMPORTED_LOCATION "${GFlags_LIBS}") endif(NOT ${LOCAL_GFLAGS}) set(TARGET_GFLAGS gflags-${gflags_RELEASE}) if(${LOCAL_GFLAGS}) set(GFLAGS_LIBRARIES_TO_LINK ${GFlags_SHARED_LIBS}) set(GFLAGS_LIBRARY_DIR_TO_LINK ${CMAKE_CURRENT_BINARY_DIR}/gflags-${gflags_RELEASE}/lib) else(${LOCAL_GFLAGS}) set(GFLAGS_LIBRARIES_TO_LINK ${GFlags_LIBS}) set(GFLAGS_LIBRARY_DIR_TO_LINK ${GFlags_LIBRARY_DIRS}) endif(${LOCAL_GFLAGS}) if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}/tmp/configure_with_gflags "#!/bin/sh export CPPFLAGS=-I${GFlags_INCLUDE_DIRS} export LDFLAGS=-L${GFLAGS_LIBRARY_DIR_TO_LINK} export LIBS=\"${GFLAGS_LIBRARIES_TO_LINK} -lc++\" export CXXFLAGS=\"-stdlib=libc++\" export CC=clang export CXX=clang++ cd ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/glog/glog-${glog_RELEASE}/ aclocal automake --add-missing autoreconf -vfi cd ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE} ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/glog/glog-${glog_RELEASE}/configure") else("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}/tmp/configure_with_gflags "#!/bin/sh export CPPFLAGS=-I${GFlags_INCLUDE_DIRS} export LDFLAGS=-L${GFLAGS_LIBRARY_DIR_TO_LINK} export LIBS=${GFLAGS_LIBRARIES_TO_LINK} cd ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/glog/glog-${glog_RELEASE}/ aclocal automake --add-missing autoreconf -vfi cd ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE} ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/glog/glog-${glog_RELEASE}/configure") endif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") file(COPY ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}/tmp/configure_with_gflags DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE} FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) set(GLOG_CONFIGURE ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}/configure_with_gflags) # Ensure that aclocal and libtool are present if(OS_IS_LINUX) if(EXISTS "/usr/bin/libtoolize") if(EXISTS "/usr/bin/aclocal-1.15" OR EXISTS "/usr/bin/aclocal-1.14" OR EXISTS "/usr/bin/aclocal-1.11" OR EXISTS "/usr/bin/aclocal-1.10") # Everything ok, we can move on else(EXISTS "/usr/bin/aclocal-1.15" OR EXISTS "/usr/bin/aclocal-1.14" OR EXISTS "/usr/bin/aclocal-1.11" OR EXISTS "/usr/bin/aclocal-1.10") message(" aclocal 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 groupinstall 'Development Tools'") elseif(${LINUX_DISTRIBUTION} MATCHES "openSUSE") message(" sudo zypper install automake") else(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") message(" sudo apt-get install automake") endif(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") message(FATAL_ERROR "aclocal is required to build glog from source") endif(EXISTS "/usr/bin/aclocal-1.15" OR EXISTS "/usr/bin/aclocal-1.14" OR EXISTS "/usr/bin/aclocal-1.11" OR EXISTS "/usr/bin/aclocal-1.10") else(EXISTS "/usr/bin/libtoolize") message(" libtool 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 groupinstall 'Development Tools'") elseif(${LINUX_DISTRIBUTION} MATCHES "openSUSE") message(" sudo zypper install libtoool") else(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") message(" sudo apt-get install libtool") endif(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") message(FATAL_ERROR "libtool is required to build glog from source") endif(EXISTS "/usr/bin/libtoolize") endif(OS_IS_LINUX) ExternalProject_Add( glog-${glog_RELEASE} DEPENDS ${TARGET_GFLAGS} PREFIX ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE} GIT_REPOSITORY https://github.com/google/glog/ GIT_TAG v${glog_RELEASE} SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/glog/glog-${glog_RELEASE} BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE} CONFIGURE_COMMAND ${GLOG_CONFIGURE} --prefix= BUILD_COMMAND make UPDATE_COMMAND "" PATCH_COMMAND "" INSTALL_COMMAND "" ) # Set up variables set(GLOG_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/glog/glog-${glog_RELEASE}/src/ ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}/src ) set(GLOG_LIBRARIES ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}/.libs/${CMAKE_FIND_LIBRARY_PREFIXES}glog.a ) set(LOCAL_GLOG true CACHE STRING "Glog downloaded and built automatically" FORCE) else(NOT GLOG_FOUND OR ${LOCAL_GFLAGS}) add_library(glog-${glog_RELEASE} UNKNOWN IMPORTED) set_property(TARGET glog-${glog_RELEASE} PROPERTY IMPORTED_LOCATION "${GLOG_LIBRARIES}") endif(NOT GLOG_FOUND OR ${LOCAL_GFLAGS}) if(NOT ENABLE_LOG) message(STATUS "Logging is not enabled") add_definitions(-DGOOGLE_STRIP_LOG=1) endif(NOT ENABLE_LOG) ################################################################################ # Armadillo - http://arma.sourceforge.net/ ################################################################################ if(OS_IS_LINUX) ############################################################################# # Check that LAPACK is found in the system # LAPACK is required for matrix decompositions (eg. SVD) and matrix inverse. ############################################################################# 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") 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) 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 ############################################# 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 ) 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") endif(NOT GFORTRAN) endif(OS_IS_LINUX) find_package(Armadillo) if(NOT ARMADILLO_FOUND OR ENABLE_OWN_ARMADILLO) message(STATUS " Armadillo has not been found.") message(STATUS " Armadillo will be downloaded and built automatically ") message(STATUS " when doing 'make'. ") if(CMAKE_VERSION VERSION_LESS 3.1) # ExternalProject in CMake > 3.1 cannot open .xz files set(armadillo_RELEASE 6.700.7) set(armadillo_MD5 "8116185e1d7391eed3bf6c500f81b4d8") set(ARMA_FILE_EXTENSION "gz") else(CMAKE_VERSION VERSION_LESS 3.1) set(armadillo_RELEASE 7.600.2) set(armadillo_MD5 "8dee8bc37f7cb29323c20c4104126b5c") set(ARMA_FILE_EXTENSION "xz") endif(CMAKE_VERSION VERSION_LESS 3.1) ExternalProject_Add( armadillo-${armadillo_RELEASE} PREFIX ${CMAKE_CURRENT_BINARY_DIR}/armadillo-${armadillo_RELEASE} URL http://sourceforge.net/projects/arma/files/armadillo-${armadillo_RELEASE}.tar.${ARMA_FILE_EXTENSION} DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR}/download/armadillo-${armadillo_RELEASE} URL_MD5 ${armadillo_MD5} CMAKE_ARGS -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} -DBUILD_SHARED_LIBS=OFF BUILD_IN_SOURCE 1 BUILD_COMMAND make UPDATE_COMMAND "" INSTALL_COMMAND "" ) # Set up variables ExternalProject_Get_Property(armadillo-${armadillo_RELEASE} binary_dir) set(ARMADILLO_INCLUDE_DIRS ${binary_dir}/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) set(ARMADILLO_LIBRARIES ${BLAS} ${LAPACK} ${GFORTRAN} ${binary_dir}/${CMAKE_FIND_LIBRARY_PREFIXES}armadillo.a) set(LOCAL_ARMADILLO true CACHE STRING "Armadillo downloaded and built automatically" FORCE) # Save a copy at the thirdparty folder file(COPY ${CMAKE_CURRENT_BINARY_DIR}/armadillo-${armadillo_RELEASE} DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/armadillo ) set(ARMADILLO_VERSION_STRING ${armadillo_RELEASE}) else(NOT ARMADILLO_FOUND OR ENABLE_OWN_ARMADILLO) set(armadillo_RELEASE ${ARMADILLO_VERSION_STRING}) add_library(armadillo-${armadillo_RELEASE} UNKNOWN IMPORTED) set_property(TARGET armadillo-${armadillo_RELEASE} PROPERTY IMPORTED_LOCATION "${ARMADILLO_LIBRARIES}") endif(NOT ARMADILLO_FOUND OR ENABLE_OWN_ARMADILLO) ################################################################################ # GnuTLS - http://www.gnutls.org/ ################################################################################ find_package(GnuTLS) find_library(GNUTLS_OPENSSL_LIBRARY NAMES gnutls-openssl libgnutls-openssl.so.27 HINTS /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64 /opt/local/lib /usr/lib/x86_64-linux-gnu /usr/lib/aarch64-linux-gnu /usr/lib/arm-linux-gnueabihf /usr/lib/arm-linux-gnueabi /usr/lib/i386-linux-gnu /usr/lib/alpha-linux-gnu /usr/lib/hppa-linux-gnu /usr/lib/i686-gnu /usr/lib/i686-linux-gnu /usr/lib/x86_64-kfreebsd-gnu /usr/lib/i686-kfreebsd-gnu /usr/lib/m68k-linux-gnu /usr/lib/mips-linux-gnu /usr/lib/mips64el-linux-gnuabi64 /usr/lib/mipsel-linux-gnu /usr/lib/powerpc-linux-gnu /usr/lib/powerpc-linux-gnuspe /usr/lib/powerpc64-linux-gnu /usr/lib/powerpc64le-linux-gnu /usr/lib/s390x-linux-gnu /usr/lib/sparc64-linux-gnu /usr/lib/x86_64-linux-gnux32 /usr/lib/sh4-linux-gnu ) if(NOT GNUTLS_OPENSSL_LIBRARY) message(STATUS "Looking for OpenSSL instead...") find_package(OpenSSL) if(OPENSSL_FOUND) set(GNUTLS_INCLUDE_DIR ${OPENSSL_INCLUDE_DIR}) set(GNUTLS_LIBRARIES "") set(GNUTLS_OPENSSL_LIBRARY ${OPENSSL_SSL_LIBRARY}) else(OPENSSL_FOUND) message(" The GnuTLS library with openssl compatibility enabled has not been found.") message(" You can try to install the required libraries by typing:") if(OS_IS_LINUX) if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") message(" sudo yum install openssl-devel") else(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") message(" sudo apt-get install libgnutls-openssl-dev") endif(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") endif(OS_IS_LINUX) if(OS_IS_MACOSX) message(" sudo port install gnutls") endif(OS_IS_MACOSX) message(FATAL_ERROR "GnuTLS libraries with openssl compatibility are required to build gnss-sdr") endif(OPENSSL_FOUND) endif(NOT GNUTLS_OPENSSL_LIBRARY) ################################################################################ # USRP Hardware Driver (UHD) - OPTIONAL ################################################################################ find_package(UHD) if(NOT UHD_FOUND) set(ENABLE_UHD OFF) message(STATUS " The USRP Hardware Driver (UHD) signal source will not be built,") message(STATUS " so all USRP-based front-ends will not be usable.") message(STATUS " Please check http://files.ettus.com/manual/") else(NOT UHD_FOUND) set(GR_REQUIRED_COMPONENTS UHD) find_package(Gnuradio) set(ENABLE_UHD ON) endif(NOT UHD_FOUND) ################################################################################ # Doxygen - http://www.stack.nl/~dimitri/doxygen/index.html (OPTIONAL, used if found) ################################################################################ find_package(Doxygen) if(DOXYGEN_FOUND) message(STATUS "Doxygen found.") message(STATUS "You can build the documentation with 'make doc'." ) message(STATUS "When done, point your browser to ${CMAKE_BINARY_DIR}/html/index.html") set(HAVE_DOT ${DOXYGEN_DOT_FOUND}) file(TO_NATIVE_PATH ${CMAKE_SOURCE_DIR} top_srcdir) file(TO_NATIVE_PATH ${CMAKE_BINARY_DIR} top_builddir) find_package(LATEX) if (PDFLATEX_COMPILER) set(GENERATE_PDF_DOCUMENTATION "YES") set(GNSSSDR_USE_MATHJAX "NO") else(PDFLATEX_COMPILER) set(GENERATE_PDF_DOCUMENTATION "NO") set(GNSSSDR_USE_MATHJAX "YES") endif(PDFLATEX_COMPILER) configure_file(${CMAKE_SOURCE_DIR}/docs/doxygen/Doxyfile.in ${CMAKE_BINARY_DIR}/docs/doxygen/Doxyfile @ONLY ) add_custom_target(doc ${DOXYGEN_EXECUTABLE} ${CMAKE_BINARY_DIR}/docs/doxygen/Doxyfile WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMENT "Generating API documentation with Doxygen." VERBATIM ) if(LATEX_COMPILER) message(STATUS "'make pdfmanual' will generate a manual at ${CMAKE_BINARY_DIR}/docs/GNSS-SDR_manual.pdf") add_custom_target(pdfmanual COMMAND ${CMAKE_MAKE_PROGRAM} COMMAND ${CMAKE_COMMAND} -E copy refman.pdf ${CMAKE_BINARY_DIR}/docs/GNSS-SDR_manual.pdf COMMAND ${CMAKE_MAKE_PROGRAM} clean DEPENDS doc WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/docs/latex COMMENT "Generating PDF manual with Doxygen." VERBATIM ) endif(LATEX_COMPILER) message(STATUS "'make doc-clean' will clean the documentation.") add_custom_target(doc-clean COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_BINARY_DIR}/docs/html COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_BINARY_DIR}/docs/latex COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_BINARY_DIR}/docs/GNSS-SDR_manual.pdf COMMENT "Cleaning documentation." VERBATIM ) else(DOXYGEN_FOUND) message(STATUS " Doxygen has not been found in your system.") message(STATUS " You can get nice code documentation by using it!") message(STATUS " Get it from http://www.stack.nl/~dimitri/doxygen/index.html") if(OS_IS_LINUX) if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") message(" or simply by doing 'sudo yum install doxygen-latex'.") else(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") message(" or simply by doing 'sudo apt-get install doxygen-latex'.") endif(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") endif(OS_IS_LINUX) if(OS_IS_MACOSX) message(STATUS " or simply by doing 'sudo port install doxygen +latex'.") endif(OS_IS_MACOSX) endif(DOXYGEN_FOUND) ############################################################################### # OpenCL (OPTIONAL) ############################################################################### if(ENABLE_OPENCL) find_package(OpenCL) if($ENV{DISABLE_OPENCL}) set(DISABLE_OPENCL TRUE) endif($ENV{DISABLE_OPENCL}) if(DISABLE_OPENCL) set(OPENCL_FOUND FALSE) else(DISABLE_OPENCL) if(OPENCL_FOUND) message(STATUS "OpenCL has been found and will be used by some processing blocks") message(STATUS "You can disable OpenCL use by doing 'cmake -DENABLE_OPENCL=OFF ../' ") endif(OPENCL_FOUND) endif(DISABLE_OPENCL) if(ENABLE_GENERIC_ARCH) set(OPENCL_FOUND FALSE) message(STATUS "ENABLE_GENERIC_ARCH is set to ON so the use of OpenCL has been disabled.") endif(ENABLE_GENERIC_ARCH) if(NOT OPENCL_FOUND) message(STATUS "Processing blocks using OpenCL will not be built.") endif(NOT OPENCL_FOUND) else(ENABLE_OPENCL) set(OPENCL_FOUND FALSE) endif(ENABLE_OPENCL) ############################################################################### # CUDA (OPTIONAL) ############################################################################### if($ENV{CUDA_GPU_ACCEL}) message(STATUS "CUDA_GPU_ACCEL environment variable found." ) set(ENABLE_CUDA ON) endif($ENV{CUDA_GPU_ACCEL}) if(ENABLE_CUDA) FIND_PACKAGE(CUDA REQUIRED) message(STATUS "NVIDIA CUDA GPU Acceleration will be enabled." ) message(STATUS "You can disable it with 'cmake -DENABLE_CUDA=OFF ../'" ) else(ENABLE_CUDA) message(STATUS "NVIDIA CUDA GPU Acceleration will be not enabled." ) message(STATUS "Enable it with 'cmake -DENABLE_CUDA=ON ../' to add support for GPU-based acceleration using CUDA." ) endif(ENABLE_CUDA) ################################################################################ # Setup of optional drivers ################################################################################ if($ENV{GN3S_DRIVER}) message(STATUS "GN3S_DRIVER environment variable found." ) set(ENABLE_GN3S ON) endif($ENV{GN3S_DRIVER}) if(GN3S_DRIVER) set(ENABLE_GN3S ON) endif(GN3S_DRIVER) if(ENABLE_GN3S) message(STATUS "The GN3S driver will be compiled.") message(STATUS "You can disable it with 'cmake -DENABLE_GN3S=OFF ../'" ) else(ENABLE_GN3S) message(STATUS "The (optional and experimental) GN3S driver is not enabled." ) message(STATUS "Enable it with 'cmake -DENABLE_GN3S=ON ../' to add support for the GN3S dongle." ) endif(ENABLE_GN3S) if($ENV{RAW_ARRAY_DRIVER}) message(STATUS "RAW_ARRAY_DRIVER environment variable found." ) set(ENABLE_ARRAY ON) endif($ENV{RAW_ARRAY_DRIVER}) if(RAW_ARRAY_DRIVER) set(ENABLE_ARRAY ON) endif(RAW_ARRAY_DRIVER) if(ENABLE_ARRAY) message(STATUS "CTTC's Antenna Array front-end driver will be compiled." ) message(STATUS "You can disable it with 'cmake -DENABLE_ARRAY=OFF ../'" ) # copy firmware to install folder # Build project gr-dbfcttc else(ENABLE_ARRAY) message(STATUS "The (optional) CTTC's Antenna Array front-end driver is not enabled." ) message(STATUS "Enable it with 'cmake -DENABLE_ARRAY=ON ../' to add support for the CTTC experimental array front-end." ) endif(ENABLE_ARRAY) if($ENV{RTLSDR_DRIVER}) message(STATUS "RTLSDR_DRIVER environment variable found." ) set(ENABLE_OSMOSDR ON) endif($ENV{RTLSDR_DRIVER}) if(ENABLE_OSMOSDR) message(STATUS "The driver for OsmoSDR and other front-ends (HackRF, bladeRF, Realtek's RTL2832U-based dongles, etc.) will be compiled." ) message(STATUS "You can disable it with 'cmake -DENABLE_OSMOSDR=OFF ../'" ) else(ENABLE_OSMOSDR) message(STATUS "The (optional) driver for OsmoSDR and related front-ends is not enabled." ) message(STATUS "Enable it with 'cmake -DENABLE_OSMOSDR=ON ../' to add support for OsmoSDR and other front-ends (HackRF, bladeRF, Realtek's RTL2832U-based USB dongles, etc.)" ) endif(ENABLE_OSMOSDR) if($ENV{FLEXIBAND_DRIVER}) message(STATUS "FLEXIBAND_DRIVER environment variable found." ) set(ENABLE_FLEXIBAND ON) endif($ENV{FLEXIBAND_DRIVER}) if(FLEXIBAND_DRIVER) set(ENABLE_FLEXIBAND ON) endif(FLEXIBAND_DRIVER) if(ENABLE_FLEXIBAND) message(STATUS "CTTC's Antenna Array front-end driver will be compiled." ) message(STATUS "You can disable it with 'cmake -DENABLE_FLEXIBAND=OFF ../'" ) else(ENABLE_FLEXIBAND) message(STATUS "The (optional) Teleorbit Flexiband front-end driver adapter is not enabled." ) message(STATUS "Enable it with 'cmake -DENABLE_FLEXIBAND=ON ../' to add support for the Teleorbit Flexiband front-end." ) endif(ENABLE_FLEXIBAND) ################################################################################ # GPerftools - https://github.com/gperftools/gperftools (OPTIONAL) ################################################################################ if(ENABLE_GPERFTOOLS) find_package(Gperftools) if ( NOT GPERFTOOLS_FOUND ) message(STATUS "Although ENABLE_GPERFTOOLS has been set to ON, GPerftools has not been found.") message(STATUS "Binaries will be compiled without 'tcmalloc' and 'profiler' libraries.") message(STATUS "You can install GPerftools from https://github.com/gperftools/gperftools") else( NOT GPERFTOOLS_FOUND ) message(STATUS "GPerftools libraries found." ) message(STATUS "Binaries will be compiled with 'tcmalloc' and 'profiler' libraries.") endif( NOT GPERFTOOLS_FOUND ) endif(ENABLE_GPERFTOOLS) if(ENABLE_GPERFTOOLS) # Set GPerftools related flags if it is available # See http://gperftools.googlecode.com/svn/trunk/README if(GPERFTOOLS_FOUND) if(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32) set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free") endif(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32) if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -fno-builtin") endif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") endif(GPERFTOOLS_FOUND) endif(ENABLE_GPERFTOOLS) ######################################################################## # GNU gprof (OPTIONAL) - https://sourceware.org/binutils/docs/gprof/ ######################################################################## if(ENABLE_GPROF) #if(CMAKE_COMPILER_IS_GNUCXX) set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -pg") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pg") #endif(CMAKE_COMPILER_IS_GNUCXX) endif(ENABLE_GPROF) ######################################################################## # Set compiler flags ######################################################################## # Enable C++11 support in GCC if(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32) set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -std=c++11 -Wall -Wextra") #Add warning flags: For "-Wall" see http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html endif(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32) if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -std=c++11 -stdlib=libc++") if(CMAKE_BUILD_TYPE MATCHES "Release") set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -Wno-unused-private-field") endif(CMAKE_BUILD_TYPE MATCHES "Release") endif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") # Processor-architecture related flags # See http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options if (NOT ARCH_COMPILER_FLAGS) if(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32) if(OS_IS_MACOSX) set(ARCH_COMPILER_FLAGS "-march=corei7 -mfpmath=sse") else(OS_IS_MACOSX) if(NOT ${ENABLE_GENERIC_ARCH}) if(IS_ARM) # ARM-specific options (https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html) if(NOT CMAKE_CROSSCOMPILING) if(ARM_VERSION STREQUAL "arm") # Unknown arm version - try our best to detect set(ARCH_COMPILER_FLAGS "-mcpu=native") else(ARM_VERSION STREQUAL "arm") set(ARCH_COMPILER_FLAGS "-march=${ARM_VERSION}") endif(ARM_VERSION STREQUAL "arm") endif(NOT CMAKE_CROSSCOMPILING) else(IS_ARM) set(ARCH_COMPILER_FLAGS "-march=native -mfpmath=sse") endif(IS_ARM) endif(NOT ${ENABLE_GENERIC_ARCH}) endif(OS_IS_MACOSX) endif(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32) endif (NOT ARCH_COMPILER_FLAGS) set(MY_CXX_FLAGS "${MY_CXX_FLAGS} ${ARCH_COMPILER_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MY_CXX_FLAGS}") if(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32) #http://gcc.gnu.org/wiki/Visibility add_definitions(-fvisibility=hidden) endif(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32) ######################################################################## # Create uninstall target ######################################################################## configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake @ONLY) add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) ######################################################################## # Add subdirectories (in order of deps) ######################################################################## add_subdirectory(src) gnss-sdr-0.0.9/COPYING000066400000000000000000001057551305042567700143410ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . gnss-sdr-0.0.9/MANIFEST.md000066400000000000000000000022311305042567700150170ustar00rootroot00000000000000title: gnss-sdr brief: An open source global navigation satellite systems software defined receiver tags: - sdr - gnss - gps - Galileo author: - Carles Fernandez-Prades - Javier Arribas - et altri (see AUTHORS file for a list of contributors) copyright_owner: - The Authors dependencies: gnuradio (>= 3.7.3), armadillo, gflags, glog, gnutls license: GPLv3+ repo: https://github.com/gnss-sdr/gnss-sdr website: http://gnss-sdr.org icon: http://a.fsdn.com/con/app/proj/gnss-sdr/screenshots/logo400x400.jpg --- Global Navigation Satellite Systems receiver defined by software. It performs all the signal processing from raw signal samples up to the computation of the Position-Velocity-Time solution, including code and phase observables. It is able to work with raw data files or, if there is computational power enough, in real time with suitable radiofrequency front-ends. This software is mainly developed at [CTTC](http://www.cttc.es "Centre Tecnologic de Telecomunicacions de Catalunya") with contributions from around the world. More info at [gnss-sdr.org](http://gnss-sdr.org "GNSS-SDR's Homepage"). gnss-sdr-0.0.9/README.md000066400000000000000000002367511305042567700145660ustar00rootroot00000000000000![](./docs/doxygen/images/gnss-sdr_logo.png) **Welcome to GNSS-SDR!** Visit [gnss-sdr.org](http://gnss-sdr.org "GNSS-SDR's Homepage") for more information about this open source GNSS software defined receiver. If you have questions about GNSS-SDR, please [subscribe to the gnss-sdr-developers mailing list](http://lists.sourceforge.net/lists/listinfo/gnss-sdr-developers "Subscribe to the gnss-sdr-developers mailing list" ) and post your questions there. # How to build GNSS-SDR This section describes how to set up the compilation environment in GNU/Linux or [macOS / Mac OS X](#macosx), and to build GNSS-SDR. See also our [build and install page](http://gnss-sdr.org/build-and-install/ "GNSS-SDR's Build and Install"). GNU/Linux ---------- * Tested distributions: Ubuntu 14.04 LTS and [above](http://packages.ubuntu.com/search?keywords=gnss-sdr), Debian 8.0 "jessie" and [above](https://packages.debian.org/search?searchon=names&keywords=gnss-sdr), Linaro 15.03 * Known to work but not continually tested: Arch Linux, Fedora, and openSUSE * Supported microprocessor architectures: * i386: Intel x86 instruction set (32-bit microprocessors). * amd64: also known as x86-64, the 64-bit version of the x86 instruction set, originally created by AMD and implemented by AMD, Intel, VIA and others. * armel: ARM embedded ABI, supported on ARM v4t and higher. * armhf: ARM hard float, ARMv7 + VFP3-D16 floating-point hardware extension + Thumb-2 instruction set and above. * arm64: ARM 64 bits or ARMv8. * mips: MIPS architecture (big-endian, such as those manufactured by SGI). * mipsel: MIPS architecture (little-endian, such as Loongson 3). * mips64el: 64-bit version of MIPS architecture. * powerpc: the RISC 32-bit microprocessor architecture developed by IBM, Motorola (now Freescale) and Apple. * ppc64: 64-bit big-endian PowerPC architecture. * ppc64el: 64-bit little-endian PowerPC architecture. * s390x: IBM System z architecture for mainframe computers. Older distribution releases might work as well, but you will need GCC 4.7 or newer. Before building GNSS-SDR, you need to install all the required dependencies. There are two alternatives here: through software packages or building them from the source code. It is in general not a good idea to mix both approaches. ### Alternative 1: Install dependencies using software packages If you want to start building and running GNSS-SDR as quick and easy as possible, the best option is to install all the required dependencies as binary packages. If you are using Debian 8, Ubuntu 14.10 or above, this can be done by copying and pasting the following line in a terminal: ~~~~~~ $ sudo apt-get install build-essential cmake git libboost-dev libboost-date-time-dev \ libboost-system-dev libboost-filesystem-dev libboost-thread-dev libboost-chrono-dev \ libboost-serialization-dev libboost-program-options-dev libboost-test-dev \ liblog4cpp5-dev libuhd-dev gnuradio-dev gr-osmosdr libblas-dev liblapack-dev \ libarmadillo-dev libgflags-dev libgoogle-glog-dev libgnutls-openssl-dev libgtest-dev \ python-mako python-six ~~~~~~ Alternatively, and starting from Ubuntu 16.04 LTS, you can install all the required dependencies by adding the line ~~~~~~ deb-src http://us.archive.ubuntu.com/ubuntu/ xenial universe ~~~~~~ to your ```/etc/apt/sources.list``` file and doing: ~~~~~~ $ sudo apt-get update $ sudo apt-get build-dep gnss-sdr ~~~~~~ Once you have installed these packages, you can jump directly to [how to download the source code and build GNSS-SDR](#download-and-build-linux). Note for Ubuntu 14.04 LTS "trusty" users: you will need to build from source and install GNU Radio manually, as explained below, since GNSS-SDR requires gnuradio-dev >= 3.7.3, and Ubuntu 14.04 came with 3.7.2. Install all the packages above BUT EXCEPT ```libuhd-dev```, ```gnuradio-dev``` and ```gr-osmosdr``` (and remove them if they are already installed in your machine), and install those dependencies using PyBOMBS. ### Alternative 2: Install dependencies using PyBOMBS This option is adequate if you are interested in development, in working with the most recent versions of software dependencies, want more fine tuning on the installed versions, or simply in building everything from the scratch just for the fun of it. In such cases, we recommend to use [PyBOMBS](http://gnuradio.org/pybombs "Python Build Overlay Managed Bundle System wiki") (Python Build Overlay Managed Bundle System), GNU Radio's meta-package manager tool that installs software from source, or whatever the local package manager is, that automatically does all the work for you. Please take a look at the configuration options and general PyBOMBS usage at https://github.com/gnuradio/pybombs. Here we provide a quick step-by-step tutorial. First of all, install some basic packages: ~~~~~~ $ sudo apt-get install git python-pip ~~~~~~ Download, build and install PyBOMBS: ~~~~~~ $ sudo pip install git+https://github.com/gnuradio/pybombs.git ~~~~~~ Add some software recipes (i.e., instructions on how to install software dependencies): ~~~~~~ $ pybombs recipes add gr-recipes git+https://github.com/gnuradio/gr-recipes.git $ pybombs recipes add gr-etcetera git+https://github.com/gnuradio/gr-etcetera.git ~~~~~~ Download, build and install GNU Radio, related drivers and some other extra modules into the directory ```/path/to/prefix``` (replace this path by your preferred one, for instance ```$HOME/sdr```): ~~~~~~ $ pybombs prefix init /path/to/prefix -a myprefix -R gnuradio-default ~~~~~~ This will perform a local installation of the dependencies under ```/path/to/prefix```, so they will not be visible when opening a new terminal. In order to make them available, you will need to set up the adequate environment variables: ~~~~~~ $ cd /path/to/prefix $ . ./setup_env.sh ~~~~~~ Now you are ready to use GNU Radio and to jump into building GNSS-SDR after installing a few other dependencies. Actually, those are steps that PyBOMBS can do for you as well: ~~~~~~ $ pybombs install gnss-sdr ~~~~~~ By default, PyBOMBS installs the ‘next’ branch of GNSS-SDR development, which is the most recent version of the source code. This behaviour can be modified by altering the corresponding recipe at ```$HOME/.pybombs/recipes/gr-recipes/gnss-sdr.lwr``` In case you do not want to use PyBOMBS and prefer to build and install GNSS-SDR step by step (i.e., cloning the repository and doing the usual ```cmake .. && make && make install``` dance), Armadillo, GFlags, Glog and GunTLS can be installed either by using PyBOMBS: ~~~~~~ $ pybombs install armadillo gflags glog gnutls ~~~~~~ or manually as explained below, and then please follow instructions on how to [download the source code and build GNSS-SDR](#download-and-build-linux). ### Manual installation of other required dependencies #### Install [Armadillo](http://arma.sourceforge.net/ "Armadillo's Homepage"), a C++ linear algebra library: ~~~~~~ $ sudo apt-get install libopenblas-dev liblapack-dev # For Debian/Ubuntu/LinuxMint $ sudo yum install lapack-devel blas-devel # For Fedora/CentOS/RHEL $ sudo zypper install lapack-devel blas-devel # For OpenSUSE $ wget http://sourceforge.net/projects/arma/files/armadillo-7.600.2.tar.xz $ tar xvfz armadillo-7.600.2.tar.xz $ cd armadillo-7.600.2 $ cmake . $ make $ sudo make install ~~~~~~ The full stop separated from ```cmake``` by a space is important. [CMake](http://www.cmake.org/ "CMake's Homepage") will figure out what other libraries are currently installed and will modify Armadillo's configuration correspondingly. CMake will also generate a run-time armadillo library, which is a combined alias for all the relevant libraries present on your system (eg. BLAS, LAPACK and ATLAS). #### Install [Gflags](https://github.com/gflags/gflags "Gflags' Homepage"), a commandline flags processing module for C++: ~~~~~~ $ wget https://github.com/gflags/gflags/archive/v2.2.0.tar.gz $ tar xvfz v2.2.0.tar.gz $ cd gflags-2.2.0 $ cmake -DBUILD_SHARED_LIBS=ON -DBUILD_STATIC_LIBS=OFF -DBUILD_gflags_nothreads_LIB=OFF . $ make $ sudo make install $ sudo ldconfig ~~~~~~ #### Install [Glog](https://github.com/google/glog "Glog's Homepage"), a library that implements application-level logging: ~~~~~~ $ wget https://github.com/google/glog/archive/v0.3.4.tar.gz $ tar xvfz v0.3.4.tar.gz $ cd glog-0.3.4 $ ./configure $ make $ sudo make install $ sudo ldconfig ~~~~~~ #### Build the [Google C++ Testing Framework](https://github.com/google/googletest "Googletest Homepage"), also known as Google Test: ~~~~~~ $ wget https://github.com/google/googletest/archive/release-1.8.0.zip $ unzip release-1.8.0.zip $ cd googletest-release-1.8.0 $ cmake -DBUILD_GTEST=ON -DBUILD_GMOCK=OFF . $ make ~~~~~~ Please **DO NOT install** Google Test (do *not* type ```sudo make install```). Every user needs to compile his tests using the same compiler flags used to compile the installed Google Test libraries; otherwise he may run into undefined behaviors (i.e. the tests can behave strangely and may even crash for no obvious reasons). The reason is that C++ has this thing called the One-Definition Rule: if two C++ source files contain different definitions of the same class/function/variable, and you link them together, you violate the rule. The linker may or may not catch the error (in many cases it is not required by the C++ standard to catch the violation). If it does not, you get strange run-time behaviors that are unexpected and hard to debug. If you compile Google Test and your test code using different compiler flags, they may see different definitions of the same class/function/variable (e.g. due to the use of ```#if``` in Google Test). Therefore, for your sanity, we recommend to avoid installing pre-compiled Google Test libraries. Instead, each project should compile Google Test itself such that it can be sure that the same flags are used for both Google Test and the tests. The building system of GNSS-SDR does the compilation and linking of googletest to its own tests; it is only required that you tell the system where the googletest folder that you downloaded resides. Just add to your ```$HOME/.bashrc``` file the following line: ~~~~~~ export GTEST_DIR=/home/username/googletest-release-1.8.0/googletest ~~~~~~ changing `/home/username/googletest-release-1.8.0/googletest` by the actual directory where you built googletest. #### Install the [GnuTLS library](http://www.gnutls.org/ "GnuTLS's Homepage"): ~~~~~~ $ sudo apt-get install libgnutls-openssl-dev # For Debian/Ubuntu/LinuxMint $ sudo yum install libgnutls-openssl-devel # For Fedora/CentOS/RHEL ~~~~~~ In case the GnuTLS library with openssl extensions package is not available in your GNU/Linux distribution, GNSS-SDR can also work well with OpenSSL. ### Clone GNSS-SDR's Git repository: ~~~~~~ $ git clone https://github.com/gnss-sdr/gnss-sdr ~~~~~~ Cloning the GNSS-SDR repository as in the line above will create a folder named gnss-sdr with the following structure: ~~~~~~ |-gnss-sdr |---build <- where gnss-sdr is built. |---cmake <- CMake-related files. |---conf <- Configuration files. Each file defines one particular receiver. |---data <- Populate this folder with your captured data. |---docs <- Contains documentation-related files. |---install <- Executables will be placed here. |---src <- Source code folder. |-----algorithms <- Signal processing blocks. |-----core <- Control plane, interfaces, systems' parameters. |-----main <- Main function of the C++ program. |-----tests <- QA code. |-----utils <- some utilities (e.g. Matlab scripts). ~~~~~~ By default, you will be in the 'master' branch of the Git repository, which corresponds to the lastest stable release. If you want to try the latest developments, you can use the 'next' branch by going to the newly created gnss-sdr folder doing: ~~~~~~ $ git checkout next ~~~~~~ More information about GNSS-SDR-specific Git usage and pointers to further readings can be found at our [Git tutorial](http://gnss-sdr.org/docs/tutorials/using-git/ "Using Git"). ### Build and install GNSS-SDR Go to GNSS-SDR's build directory: ~~~~~~ $ cd gnss-sdr/build ~~~~~~ Configure and build the application: ~~~~~~ $ cmake ../ $ make ~~~~~~ By default, CMake will build the Release version, meaning that the compiler will generate a fast, optimized executable. This is the recommended build type when using a RF front-end and you need to attain real time. If working with a file (and thus without real-time constraints), you may want to obtain more information about the internals of the receiver, as well as more fine-grained logging. This can be done by building the Debug version, by doing: ~~~~~~ $ cmake -DCMAKE_BUILD_TYPE=Debug ../ $ make ~~~~~~ This will create four executables at gnss-sdr/install, namely ```gnss-sdr```, ```run_tests```, ```front-end-cal``` and ```volk_gnsssdr_profile```. You can run them from that folder, but if you prefer to install ```gnss-sdr``` on your system and have it available anywhere else, do: ~~~~~~ $ sudo make install ~~~~~~ This will also make a copy of the conf/ folder into /usr/local/share/gnss-sdr/conf for your reference. We suggest to create a working directory at your preferred location and store your own configuration and data files there. You could be interested in creating the documentation by doing: ~~~~~~ $ make doc ~~~~~~ from the gnss-sdr/build folder. This will generate HTML documentation that can be retrieved pointing your browser of preference to build/docs/html/index.html. If a LaTeX installation is detected in your system, ~~~~~~ $ make pdfmanual ~~~~~~ will create a PDF manual at build/docs/GNSS-SDR_manual.pdf. Finally, ~~~~~~ $ make doc-clean ~~~~~~ will remove the content of previously-generated documentation. GNSS-SDR comes with a library which is a module of the Vector-Optimized Library of Kernels (so called [VOLK_GNSSSDR](./src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/README.md)) and a profiler that will build a config file for the best SIMD architecture for your processor. Run ```volk_gnsssdr_profile``` that is installed into ```$PREFIX/bin```. This program tests all known VOLK kernels for each architecture supported by the processor. When finished, it will write to ```$HOME/.volk_gnsssdr/volk_gnsssdr_config``` the best architecture for the VOLK function. This file is read when using a function to know the best version of the function to execute. It mimics GNU Radio's [VOLK](http://libvolk.org/) library, so if you still have not run ```volk_profile```, this is a good moment to do so. If you are using Eclipse as your development environment, CMake can create the project for you. Type: ~~~~~~ $ cmake -G "Eclipse CDT4 - Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug -DECLIPSE_CDT4_GENERATE_SOURCE_PROJECT=TRUE -DCMAKE_ECLIPSE_VERSION=3.7 -DCMAKE_ECLIPSE_MAKE_ARGUMENTS=-j8 ../ ~~~~~~ and then import the created project file into Eclipse: 1. Import project using Menu File -> Import. 2. Select General -> Existing projects into workspace. 3. Browse where your build tree is and select the root build tree directory. Keep "Copy projects into workspace" unchecked. 4. You get a fully functional Eclipse project. ###### Build GN3S V2 Custom firmware and driver (OPTIONAL): Install the GNU Radio module: ~~~~~~ $ git clone https://github.com/gnss-sdr/gr-gn3s $ cd gr-gn3s/build $ cmake ../ $ make $ sudo make install $ sudo ldconfig ~~~~~~ Then configure GNSS-SDR to build the `GN3S_Signal_Source` by: ~~~~~~ $ cd gnss-sdr/build $ cmake -DENABLE_GN3S=ON ../ $ make $ sudo make install ~~~~~~ In order to gain access to USB ports, gnss-sdr should be used as root. In addition, the driver requires access to the GN3S firmware binary file. It should be available in the same path where the application is called. GNSS-SDR comes with a pre-compiled custom GN3S firmware available at gr-gn3s/firmware/GN3S_v2/bin/gn3s_firmware.ihx. Please copy this file to the application path. (in order to disable the `GN3S_Signal_Source` compilation, you can pass `-DENABLE_GN3S=OFF` to cmake and build GNSS-SDR again). More info at https://github.com/gnss-sdr/gr-gn3s ###### Build OSMOSDR support (OPTIONAL): Install the [OsmoSDR](http://sdr.osmocom.org/trac/ "OsmoSDR's Homepage") library and GNU Radio's source block: ~~~~~~ $ git clone git://git.osmocom.org/osmo-sdr.git $ cd osmo-sdr/software/libosmosdr $ mkdir build $ cd build/ $ cmake ../ $ make $ sudo make install $ sudo ldconfig $ cd ../../ $ git clone git://git.osmocom.org/gr-osmosdr $ cd gr-osmosdr $ mkdir build $ cd build $ cmake ../ -Wno-dev $ make $ sudo make install $ sudo ldconfig ~~~~~~ Then, configure GNSS-SDR to build the `Osmosdr_Signal_Source` by: ~~~~~~ $ cmake -DENABLE_OSMOSDR=ON ../ $ make $ sudo make install ~~~~~~ (in order to disable the `Osmosdr_Signal_Source` compilation, you can pass `DENABLE_OSMOSDR=OFF` to cmake and build GNSS-SDR again). ###### Build OpenCL support (OPTIONAL): In order to enable the building of blocks that use OpenCL, type: ~~~~~~ $ cmake -DENABLE_OPENCL=ON ../ $ make $ sudo make install ~~~~~~ ###### Build CUDA support (OPTIONAL): In order to enable the building of blocks that use CUDA, NVIDIA's parallel programming model that enables graphics processing unit (GPU) acceleration for data-parallel computations, first you need to install the CUDA Toolkit from [NVIDIA Developers Download page](https://developer.nvidia.com/cuda-downloads "CUDA Downloads"). Make sure that the SDK samples build well. Then, build GNSS-SDR by doing: ~~~~~~ $ cmake -DENABLE_CUDA=ON ../ $ make $ sudo make install ~~~~~~ Of course, you will also need a GPU that [supports CUDA](https://developer.nvidia.com/cuda-gpus "CUDA GPUs"). ###### Build a portable binary In order to build an executable that not depends on the specific SIMD instruction set that is present in the processor of the compiling machine, so other users can execute it in other machines without those particular sets, use: ~~~~~~ $ cmake -DENABLE_GENERIC_ARCH=ON ../ $ make $ sudo make install ~~~~~~ Using this option, all SIMD instructions are exclusively accessed via VOLK, which automatically includes versions of each function for different SIMD instruction sets, then detects at runtime which to use, or if there are none, substitutes a generic, non-SIMD implementation. macOS and Mac OS X --------- ### macOS Sierra, Mac OS X 10.11 (El Capitan), 10.10 (Yosemite) and 10.9 (Mavericks). If you still have not installed [Xcode](http://developer.apple.com/xcode/ "Xcode"), do it now from the App Store (it's free). You will also need the Xcode Command Line Tools. Launch the Terminal, found in /Applications/Utilities/, and type: ~~~~~~ $ xcode-select --install ~~~~~~ Agree to Xcode license: ~~~~~~ $ sudo xcodebuild -license ~~~~~~ Software pre-requisites can be installed using either [Macports](#macports) or [Homebrew](#homebrew). ####Macports First, [install Macports](http://www.macports.org/install.php). If you are upgrading from a previous installation, please follow the [migration rules](http://trac.macports.org/wiki/Migration). In a terminal, type: ~~~~~~ $ sudo port selfupdate $ sudo port upgrade outdated $ sudo port install doxygen +latex $ sudo port install gnuradio $ sudo port install armadillo $ sudo port install gnutls $ sudo port install google-glog +gflags $ sudo port install py27-mako $ sudo port install py27-six ~~~~~~ You also might need to activate a Python installation. The list of installed versions can be retrieved with: ~~~~~~ $ port select list python ~~~~~~ and you can activate a certain version (2.7 works well) by typing: ~~~~~~ $ sudo port select --set python python27 ~~~~~~ #### Homebrew Instructions for installing GNU Radio using [homebrew](http://www.brew.sh) can be found [here](http://github.com/odrisci/homebrew-gnuradio) - please ensure to install all dependencies as required. Install Armadillo and dependencies: ~~~~~~ $ brew tap homebrew/science $ brew install cmake hdf5 arpack superlu $ brew install armadillo $ brew install glog gflags gnutls ~~~~~~ #### Build GNSS-SDR Finally, you are ready to clone the GNSS-SDR repository, configure and build the software: ~~~~~~ $ git clone https://github.com/gnss-sdr/gnss-sdr $ cd gnss-sdr/build $ cmake ../ $ make ~~~~~~ This will create three executables at gnss-sdr/install, namely ```gnss-sdr```, ```run_tests``` and ```volk_gnsssdr_profile```. You can install the software receiver on your system by doing: ~~~~~~ $ sudo make install ~~~~~~ Note, it is advisable not to run the install step in a homebrew environment. The documentation can be built by: ~~~~~~ $ make doc ~~~~~~ and can be viewed doing: ~~~~~~ $ open ./docs/html/index.html ~~~~~~ GNSS-SDR comes with a library which is a module of the Vector-Optimized Library of Kernels (so called [VOLK_GNSSSDR](./src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/README.md)) and a profiler that will build a config file for the best SIMD architecture for your processor. Run ```volk_gnsssdr_profile``` that is installed into ```$PREFIX/bin```. This program tests all known VOLK kernels for each architecture supported by the processor. When finished, it will write to ```$HOME/.volk_gnsssdr/volk_gnsssdr_config``` the best architecture for the VOLK function. This file is read when using a function to know the best version of the function to execute. It mimics GNU Radio's [VOLK](http://libvolk.org/) library, so if you still have not run ```volk_profile```, this is a good moment to do so. ###### Other package managers GNU Radio and other dependencies can also be installed using other package managers than Macports, such as [Fink](http://www.finkproject.org/ "Fink") or [Homebrew](http://brew.sh/ "Homebrew"). Since the version of Python that ships with OS X is great for learning but it is not good for development, you could have another Python executable in a non-standard location. If that is the case, you need to inform GNSS-SDR's configuration system by defining the `PYTHON_EXECUTABLE` variable as: ~~~~~~ cmake -DPYTHON_EXECUTABLE=/path/to/bin/python ../ ~~~~~~ In case you have installed Macports in a non-standard location, you can use: ~~~~~~ $ cmake -DCMAKE_PREFIX_PATH=/opt/local -DUSE_MACPORTS_PYTHON=/opt/local/bin/python ../ ~~~~~~ changing ```/opt/local``` by the base directory in which your software is installed. The CMake script will create Makefiles that download, build and link Armadillo, Gflags, Glog and Google Test on the fly at compile time if they are not detected in your machine. Other builds --------- * **Snap packages**: [Snaps](http://snapcraft.io) are universal Linux packages aimed to work on any distribution or device, from IoT devices to servers, desktops to mobile devices. Visit [https://github.com/carlesfernandez/snapcraft-sandbox](https://github.com/carlesfernandez/snapcraft-sandbox) for instructions. * **GNSS-SDR in embedded platforms**: we provide a Software Development Kit (SDK) based on [OpenEmbedded](http://www.openembedded.org/wiki/Main_Page) for cross-compiling GNSS-SDR in your desktop computer and for producing executables that can run in embedded platforms, such as a Zedboard or a Raspberry Pi 3. Visit [Cross-compiling GNSS-SDR](http://gnss-sdr.org/docs/tutorials/cross-compiling/) for instructions. Updating GNSS-SDR ================= If you cloned or forked GNSS-SDR some time ago, it is possible that some developer has updated files at the Git repository. If you still have not done so, add the ```upstream``` repository to the list of remotes: ~~~~~~ $ git remote add upstream https://github.com/gnss-sdr/gnss-sdr.git ~~~~~~ and then you can update your working copy by doing: ~~~~~~ $ git checkout master # Switch to branch you want to update $ git pull upstream master # Download the newest code from our repository ~~~~~~ or, if you want to test the latest developments: ~~~~~~ $ git checkout next $ git pull upstream next ~~~~~~ Before rebuilding the source code, it is safe (and recommended) to remove the remainders of old compilations: ~~~~~~ $ rm -rf gnss-sdr/build/* ~~~~~~ If you are interested in contributing to the development of GNSS-SDR, please check out [how to do it](http://gnss-sdr.org/contribute/ "How to contribute to GNSS-SDR source code"). There is a more controlled way to upgrade your repository, which is to use the Git commands ```fetch``` and ```merge```, as described in our [Git Tutorial](http://gnss-sdr.org/docs/tutorials/using-git/ "Using Git"). Getting started =============== 1. After building the code, you will find the ```gnss-sdr``` executable file at gnss-sdr/install. You can make it available everywhere else by ```sudo make install```. Run the profilers ```volk_profile``` and ```volk_gnsssdr_profile``` for testing all available VOLK kernels for each architecture supported by your processor. This only has to be done once. 2. In post-processing mode, you have to provide a captured GNSS signal file. 1. The signal file can be easily recorded using the GNU Radio file sink in ```gr_complex``` mode. 2. You will need a GPS active antenna, a [USRP](http://www.ettus.com/product) and a suitable USRP daughter board to receive GPS L1 C/A signals. GNSS-SDR require to have at least 2 MHz of bandwidth in 1.57542 GHz. (remember to enable the DC bias with the daughter board jumper). We use a [DBSRX2](https://www.ettus.com/product/details/DBSRX2) to do the task, but you can try the newer Ettus' daughter boards as well. 3. The easiest way to capture a signal file is to use the GNU Radio Companion GUI. Only two blocks are needed: a USRP signal source connected to complex float file sink. You need to tune the USRP central frequency and decimation factor using USRP signal source properties box. We suggest using a decimation factor of 20 if you use the USRP2. This will give you 100/20 = 5 MSPS which will be enough to receive GPS L1 C/A signals. The front-end gain should also be configured. In our test with the DBSRX2 we obtained good results with ```G=50```. 4. Capture at least 80 seconds of signal in open sky conditions. During the process, be aware of USRP driver buffer underuns messages. If your hard disk is not fast enough to write data at this speed you can capture to a virtual RAM drive. 80 seconds of signal at 5 MSPS occupies less than 3 Gbytes using ```gr_complex```. 5. If you have no access to a RF front-end, you can download a sample raw data file (that contains GPS and Galileo signals) from [here](http://sourceforge.net/projects/gnss-sdr/files/data/). 3. You are ready to configure the receiver to use your captured file among other parameters: 1. The default configuration file resides at [/usr/local/share/gnss-sdr/conf/default.conf](./conf/gnss-sdr.conf). 2. You need to review/modify at least the following settings: * ```SignalSource.filename=``` (absolute or relative route to your GNSS signal captured file) * ```GNSS-SDR.internal_fs_hz=``` (captured file sampling rate in Hz) * ```SignalSource.sampling_frequency=``` (captured file sampling rate in Hz) * ```SignalConditioner.sample_freq_in=``` (captured file sampling rate in Hz) * ```SignalConditioner.sample_freq_out=``` (captured file sampling rate in Hz) * ```TelemetryDecoder.fs_in=``` (captured file sampling rate in Hz) 3. The configuration file has in-line documentation, you can try to tune the number of channels and several receiver parameters. Store your .conf file in some working directory of your choice. 4. Run the receiver invoking the configuration by ```$ gnss-sdr --config_file=/path/to/my_receiver.conf``` The program reports the current status in text mode, directly to the terminal window. If all goes well, and GNSS-SDR is able to successfully track and decode at least 4 satellites, you will get PVT fixes. The program will write .kml, .geojson and RINEX files in the folder from which ```gnss-sdr``` was run. In addition to the console output, GNSS-SDR also writes log files at /tmp/ (configurable with the commandline flag ```./gnss-sdr --log_dir=/path/to/log```). For more information, check out our [quick start guide](http://gnss-sdr.org/quick-start-guide/). Using GNSS-SDR ============== With GNSS-SDR, you can define you own receiver, work with captured raw data or from a RF front-end, dump into files intermediate signals, or tune every single algorithm used in the signal processing. All the configuration is done in a single file. Those configuration files reside at the [gnss-sdr/conf/](./conf/) folder (or at /usr/local/share/gnss-sdr/conf if you installed the program). By default, the executable ```gnss-sdr``` will read the configuration available at ```gnss-sdr/conf/gnss-sdr.conf``` (or at (usr/local/share/gnss-sdr/conf/default.conf if you installed the program). You can edit that file to fit your needs, or even better, define a new ```my_receiver.conf``` file with your own configuration. This new receiver can be generated by invoking gnss-sdr with the ```--config_file``` flag pointing to your configuration file: ~~~~~~ $ gnss-sdr --config_file=/path/to/my_receiver.conf ~~~~~~ You can use a single configuration file for processing different data files, specifying the file to be processed with the ```--signal_source``` flag: ~~~~~~ $ gnss-sdr --config_file=../conf/my_receiver.conf --signal_source=../data/my_captured_data.dat ~~~~~~ This will override the ```SignalSource.filename``` specified in the configuration file. Control plane ------------- ![](./docs/doxygen/images/GeneralBlockDiagram.png) GNSS-SDR's main method initializes the logging library, processes the command line flags, if any, provided by the user and instantiates a [ControlThread](./src/core/receiver/control_thread.h) object. Its constructor reads the configuration file, creates a control queue and creates a flowgraph according to the configuration. Then, the program's main method calls the run() method of the instantiated object, an action that connects the flowgraph and starts running it. After that, and until a stop message is received, it reads control messages sent by the receiver's modules through a safe-thread queue and processes them. Finally, when a stop message is received, the main method executes the destructor of the ControlThread object, which deallocates memory, does other cleanup and exits the program. The [GNSSFlowgraph](./src/core/receiver/gnss_flowgraph.h) class is responsible for preparing the graph of blocks according to the configuration, running it, modifying it during run-time and stopping it. Blocks are identified by its role. This class knows which roles it has to instantiate and how to connect them. It relies on the configuration to get the correct instances of the roles it needs and then it applies the connections between GNU Radio blocks to make the graph ready to be started. The complexity related to managing the blocks and the data stream is handled by GNU Radio's ```gr::top_block``` class. GNSSFlowgraph wraps the ```gr::top_block``` instance so we can take advantage of the ```gnss_block_factory``` (see below), the configuration system and the processing blocks. This class is also responsible for applying changes to the configuration of the flowgraph during run-time, dynamically reconfiguring channels: it selects the strategy for selecting satellites. This can range from a sequential search over all the satellites' ID to other more efficient approaches. The Control Plane is in charge of creating a flowgraph according to the configuration and then managing the modules. Configuration allows users to define in an easy way their own custom receiver by specifying the flowgraph (type of signal source, number of channels, algorithms to be used for each channel and each module, strategies for satellite selection, type of output format, etc.). Since it is difficult to foresee what future module implementations will be needed in terms of configuration, we used a very simple approach that can be extended without a major impact in the code. This can be achieved by simply mapping the names of the variables in the modules with the names of the parameters in the configuration. ### Configuration Properties are passed around within the program using the [ConfigurationInterface](./src/core/interfaces/configuration_interface.h) class. There are two implementations of this interface: [FileConfiguration](./src/core/receiver/file_configuration.h) and [InMemoryConfiguration](./src/core/receiver/in_memory_configuration.h). FileConfiguration reads the properties (pairs of property name and value) from a file and stores them internally. InMemoryConfiguration does not read from a file; it remains empty after instantiation and property values and names are set using the set property method. FileConfiguration is intended to be used in the actual GNSS-SDR application whereas InMemoryConfiguration is intended to be used in tests to avoid file-dependency in the file system. Classes that need to read configuration parameters will receive instances of ConfigurationInterface from where they will fetch the values. For instance, parameters related to SignalSource should look like this: ~~~~~~ SignalSource.parameter1=value1 SignalSource.parameter2=value2 ~~~~~~ The name of these parameters can be anything but one reserved word: implementation. This parameter indicates in its value the name of the class that has to be instantiated by the factory for that role. For instance, if our signal source is providing data already at baseband and thus we want to use the implementation [Pass_Through](./src/algorithms/libs/pass_through.h) for module SignalConditioner, the corresponding line in the configuration file would be ~~~~~~ SignalConditioner.implementation=Pass_Through ~~~~~~ Since the configuration is just a set of property names and values without any meaning or syntax, the system is very versatile and easily extendable. Adding new properties to the system only implies modifications in the classes that will make use of these properties. In addition, the configuration files are not checked against any strict syntax so it is always in a correct status (as long as it contains pairs of property names and values in the [INI format](http://en.wikipedia.org/wiki/INI_file)). ### GNSS block factory Hence, the application defines a simple accessor class to fetch the configuration pairs of values and passes them to a factory class called [GNSSBlockFactory](./src/core/receiver/gnss_block_factory.h). This factory decides, according to the configuration, which class needs to be instantiated and which parameters should be passed to the constructor. Hence, the factory encapsulates the complexity of blocks' instantiation. With that approach, adding a new block that requires new parameters will be as simple as adding the block class and modifying the factory to be able to instantiate it. This loose coupling between the blocks' implementations and the syntax of the configuration enables extending the application capacities in a high degree. It also allows to produce fully customized receivers, for instance a testbed for acquisition algorithms, and to place observers at any point of the receiver chain. More information can be found at the [Control Plane page](http://gnss-sdr.org/docs/control-plane/). Signal Processing plane ----------------------- GNU Radio's class ```gr::basic_block``` is the abstract base class for all signal processing blocks, a bare abstraction of an entity that has a name and a set of inputs and outputs. It is never instantiated directly; rather, this is the abstract parent class of both ```gr::hier_block2```, which is a recursive container that adds or removes processing or hierarchical blocks to the internal graph, and ```gr::block```, which is the abstract base class for all the processing blocks. ![](./docs/doxygen/images/ClassHierarchy.png) A signal processing flow is constructed by creating a tree of hierarchical blocks, which at any level may also contain terminal nodes that actually implement signal processing functions. Class ```gr::top_block``` is the top-level hierarchical block representing a flowgraph. It defines GNU Radio runtime functions used during the execution of the program: run(), start(), stop(), wait(), etc. A a subclass called [GNSSBlockInterface](./src/core/interfaces/gnss_block_interface.h) is the common interface for all the GNSS-SDR modules. It defines pure virtual methods, that are required to be implemented by a derived class. Subclassing GNSSBlockInterface, we defined interfaces for the GNSS receiver blocks depicted in the figure above. This hierarchy provides the definition of different algorithms and different implementations, which will be instantiated according to the configuration. This strategy allows multiple implementations sharing a common interface, achieving the objective of decoupling interfaces from implementations: it defines a family of algorithms, encapsulates each one, and makes them interchangeable. Hence, we let the algorithm vary independently from the program that uses it. Internally, GNSS-SDR makes use of the complex data types defined by [VOLK](http://libvolk.org/ "Vector-Optimized Library of Kernels home"). They are fundamental for handling sample streams in which samples are complex numbers with real and imaginary components of 8, 16 or 32 bits, common formats delivered by GNSS (and generic SDR) radio frequency front-ends. The following list shows the data type names that GNSS-SDR exposes through the configuration file: - **`byte`**: Signed integer, 8-bit two's complement number ranging from -128 to 127. C++ type name: `int8_t`. - **`short`**: Signed integer, 16-bit two's complement number ranging from -32768 to 32767. C++ type name: `int16_t` . - **`float`**: Defines numbers with fractional parts, can represent values ranging from approx. 1.5e-45 to 3.4e+38 with a precision of 7 digits (32 bits). C++ type name: `float`. - **`ibyte`**: Interleaved (I&Q) stream of samples of type `byte`. C++ type name: `int8_t`. - **`ishort`**: Interleaved (I&Q) stream of samples of type `short`. C++ type name: `int16_t`. - **`cbyte`**: Complex samples, with real and imaginary parts of type `byte`. C++ type name: `lv_8sc_t`. - **`cshort`**: Complex samples, with real and imaginary parts of type `short`. C++ type name: `lv_16sc_t`. - **`gr_complex`**: Complex samples, with real and imaginary parts of type `float`. C++ type name: `std::complex`. More information about the available processing blocks and their configuration parameters can be found at the [Signal Processing Blocks documentation page](http://gnss-sdr.org/docs/sp-blocks/). ### Signal Source The input of a software receiver are the raw bits that come out from the front-end's analog-to-digital converter (ADC). Those bits can be read from a file stored in the hard disk or directly in real-time from a hardware device through USB or Ethernet buses. The Signal Source module is in charge of implementing the hardware driver, that is, the portion of the code that communicates with the RF front-end and receives the samples coming from the ADC. This communication is usually performed through USB or Ethernet buses. Since real-time processing requires a highly optimized implementation of the whole receiver, this module also allows to read samples from a file stored in a hard disk, and thus processing without time constraints. Relevant parameters of those samples are the intermediate frequency (or baseband I&Q components), the sampling rate and number of bits per sample, that must be specified by the user in the configuration file. This module also performs bit-depth adaptation, since most of the existing RF front-ends provide samples quantized with 2 or 3 bits, while operations inside the processor are performed on 32- or 64-bit words, depending on its architecture. Although there are implementations of the most intensive computational processes (mainly correlation) that take advantage of specific data types and architectures for the sake of efficiency, the approach is processor-specific and hardly portable. We suggest to keep signal samples in standard data types and letting the compiler select the best library version (implemented using SIMD or any other processor-specific technology) of the required routines for a given processor. ***Example: File Signal Source*** The user can configure the receiver for reading from a file, setting in the configuration file the data file location, sample format, and the sampling frequency and intermediate frequency at what the signal was originally captured. ~~~~~~ ;######### SIGNAL_SOURCE CONFIG ############ SignalSource.implementation=File_Signal_Source SignalSource.filename=/home/user/gnss-sdr/data/my_capture.dat SignalSource.item_type=gr_complex SignalSource.sampling_frequency=4000000 ; Sampling frequency in [Hz] SignalSource.freq=1575420000 ; RF front-end center frequency in [Hz] ~~~~~~ Type ```gr_complex``` refers to a GNU Radio typedef equivalent to ```std::complex```. In order to save some storage space, you might wanted to store your signal in a more efficient format such as an I/Q interleaved ```short`` integer sample stream. In that case, change the corresponding line to: ~~~~~~ SignalSource.item_type=short ~~~~~~ In this latter case, you will need to convert the interleaved I/Q samples to a complex stream via Data Type Adapter block (see below). ***Example: Two-bit packed file source*** Sometimes, samples are stored in files with a format which is not in the list of _native_ types supported by the ```File_Signal_Source``` implementation (i.e, it is not among ```byte```, ```ibyte```, ```short```, ```ishort```, ```float``` or ```gr_complex```). This is the case of 2-bit samples, which is a common format delivered by GNSS RF front-ends. The ```Two_Bit_Packed_File_Signal_Source``` implementation allows reading two-bit length samples from a file. The data is assumed to be packed as bytes ```item_type=byte``` or shorts ```item_type=short``` so that there are 4 two bit samples in each byte. The two bit values are assumed to have the following interpretation: | **b_1** | **b_0** | **Value** | |:-------:|:--------:|:----------:| | 0 | 0 | +1 | | 0 | 1 | +3 | | 1 | 0 | -3 | | 1 | 1 | -1 | Within a byte the samples may be packed in big endian ```big_endian_bytes=true``` (if the most significant byte value is stored at the memory location with the lowest address, the next byte value in significance is stored at the following memory location, and so on) or little endian ```big_endian_bytes=false``` (if the least significant byte value is at the lowest address, and the other bytes follow in increasing order of significance). If the order is big endian then the most significant two bits will form the first sample output, otherwise the least significant two bits will be used. Additionally the samples may be either real ```sample_type=real```, or complex. If the sample type is complex, then the samples are either stored in the order: real, imag, real, imag, ... ```sample_type=iq``` or in the order: imag, real, imag, real, ... ```sample_type=qi```. Finally, if the data is stored as shorts ```item_type=short```, then it may be stored in either big endian ```big_endian_items=true``` or little endian ```big_endian_items=false```. If the shorts are big endian then the 2nd byte in each short is output first. The output data type is either ```float``` or ```gr_complex``` depending on whether or not ```sample_type``` is real. Example: ~~~~~~ ;######### SIGNAL_SOURCE CONFIG ############ SignalSource.implementation=Two_Bit_Packed_File_Signal_Source SignalSource.filename=/data/my_capture.datz SignalSource.item_type=short SignalSource.sampling_frequency=60000000 SignalSource.freq=1575468750 SignalSource.samples=6000000000 ; Notice that 0 indicates the entire file. SignalSource.repeat=false SignalSource.dump=false SignalSource.dump_filename=./signal_source.dat SignalSource.enable_throttle_control=false SignalSource.sample_type=iq SignalSource.big_endian_items=true SignalSource.big_endian_bytes=false ~~~~~~ ***Example: UHD Signal Source*** The user may prefer to use a [UHD](http://code.ettus.com/redmine/ettus/projects/uhd/wiki)-compatible RF front-end and try real-time processing. For instance, for a USRP1 + DBSRX daughterboard, use: ~~~~~~ ;######### SIGNAL_SOURCE CONFIG ############ SignalSource.implementation=UHD_Signal_Source SignalSource.item_type=gr_complex SignalSource.sampling_frequency=4000000 ; Sampling frequency in [Hz] SignalSource.freq=1575420000 ; RF front-end center frequency in [Hz] SignalSource.gain=60 ; Front-end gain in dB SignalSource.subdevice=B:0 ; UHD subdevice specification (for USRP1 use A:0 or B:0, for USRP B210 use A:0) ~~~~~~ ***Example: Configuring the USRP X300 with two front-ends for receiving signals in L1 and L2 bands*** ~~~~~~ ;######### SIGNAL_SOURCE CONFIG ############ SignalSource.implementation=UHD_Signal_Source SignalSource.device_address=192.168.40.2 ; Put your USRP IP address here SignalSource.item_type=gr_complex SignalSource.RF_channels=2 SignalSource.sampling_frequency=4000000 SignalSource.subdevice=A:0 B:0 ;######### RF Channels specific settings ###### SignalSource.freq0=1575420000 SignalSource.gain0=50 SignalSource.samples0=0 SignalSource.dump0=false SignalSource.freq1=1227600000 SignalSource.gain1=50 SignalSource.samples1=0 SignalSource.dump1=false ~~~~~~ ***Example: OsmoSDR-compatible Signal Source*** [OsmoSDR](http://sdr.osmocom.org/trac) is a small form-factor, inexpensive software defined radio project. It provides a driver for several front-ends, such as [RTL-based dongles](http://sdr.osmocom.org/trac/wiki/rtl-sdr), HackRF, bladeRF, etc. Note that not all the OsmoSDR-compatible devices can work as radio frequency front-ends for proper GNSS signal reception, please check the specifications. For suitable RF front-ends, you can use: ~~~~~~ ;######### SIGNAL_SOURCE CONFIG ############ SignalSource.implementation=Osmosdr_Signal_Source SignalSource.item_type=gr_complex SignalSource.sampling_frequency=2000000 SignalSource.freq=1575420000 SignalSource.rf_gain=40 SignalSource.if_gain=30 SignalSource.enable_throttle_control=false SignalSource.osmosdr_args=rtl_tcp,offset_tune=1 ~~~~~~ In case of using a Zarlink's RTL2832 based DVB-T receiver, you can even use the ```rtl_tcp``` I/Q server in order to use the USB dongle remotely. In a terminal, type: ~~~~~~ $ rtl_tcp -a 127.0.0.1 -p 1234 -f 1575420000 -g 0 -s 2000000 ~~~~~~ and use the following configuration: ~~~~~~ ;######### SIGNAL_SOURCE CONFIG ############ SignalSource.implementation=RtlTcp_Signal_Source SignalSource.item_type=gr_complex SignalSource.sampling_frequency=1200000 SignalSource.freq=1575420000 SignalSource.gain=40 SignalSource.rf_gain=40 SignalSource.if_gain=30 SignalSource.AGC_enabled=false SignalSource.samples=0 SignalSource.enable_throttle_control=false SignalSource.address=127.0.0.1 SignalSource.port=1234 SignalSource.swap_iq=false SignalSource.repeat=false SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat ~~~~~~ Example for a dual-frequency receiver: ~~~~~~ ;######### SIGNAL_SOURCE CONFIG ############ SignalSource.implementation=UHD_Signal_Source SignalSource.device_address=192.168.40.2 ; Put your USRP IP address here SignalSource.item_type=gr_complex SignalSource.RF_channels=2 SignalSource.sampling_frequency=4000000 SignalSource.subdevice=A:0 B:0 ;######### RF Channels specific settings ###### SignalSource.freq0=1575420000 SignalSource.gain0=50 SignalSource.samples0=0 SignalSource.dump0=false SignalSource.freq1=1227600000 SignalSource.gain1=50 SignalSource.samples1=0 SignalSource.dump1=false ~~~~~~ More documentation and examples are available at the [Signal Source Blocks page](http://gnss-sdr.org/docs/sp-blocks/signal-source/). ### Signal Conditioner ![](./docs/doxygen/images/SignalConditioner.png) The signal conditioner is in charge of resampling the signal and delivering a reference sample rate to the downstream processing blocks, acting as a facade between the signal source and the synchronization channels, providing a simplified interface to the input signal. In case of multiband front-ends, this module would be in charge of providing a separated data stream for each band. If your signal source is providing baseband signal samples of type ```gr_complex``` at 4 Msps, you can bypass the Signal Conditioner block by: ~~~~~~ SignalConditioner.implementation=Pass_Through ~~~~~~ If you need to adapt some aspect of you signal, you can enable the Signal Conditioner and configure three internal blocks: a data type adpater, an input signal and a resampler. ~~~~~~ ;#[Signal_Conditioner] enables this block. Then you have to configure [DataTypeAdapter], [InputFilter] and [Resampler] blocks SignalConditioner.implementation=Signal_Conditioner ~~~~~~ More documentation at the [Signal Conditioner Blocks page](http://gnss-sdr.org/docs/sp-blocks/signal-conditioner/). #### Data type adapter This block changes the type of input data samples. If your signal source delivers data samples of type ```short```, you can use this block to convert them to ```gr_complex``` like this: ~~~~~~ ;######### DATA_TYPE_ADAPTER CONFIG ############ ;#implementation: [Pass_Through] disables this block DataTypeAdapter.implementation=Ishort_To_Complex ~~~~~~ More documentation at the [Data Type Adapter Blocks page](http://gnss-sdr.org/docs/sp-blocks/data-type-adapter/). #### Input filter This block filters the input data. It can be combined with frequency translation for IF signals. The computation of the filter taps is based on parameters of GNU Radio's function [pm_remez](http://gnuradio.org/doc/doxygen/pm__remez_8h.html), that calculates the optimal (in the Chebyshev/minimax sense) FIR filter impulse response given a set of band edges, the desired reponse on those bands, and the weight given to the error in those bands. The block can be configured like this: ~~~~~~ ;######### INPUT_FILTER CONFIG ############ ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. InputFilter.implementation=Freq_Xlating_Fir_Filter InputFilter.dump=false ; #dump: Dump the filtered data to a file. InputFilter.dump_filename=../data/input_filter.dat ; #dump_filename: Log path and filename. InputFilter.input_item_type=gr_complex InputFilter.output_item_type=gr_complex InputFilter.taps_item_type=float InputFilter.number_of_taps=5 ; #number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter.number_of_bands=2 ; #number_of_bands: Number of frequency bands in the filter. ; Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ; The number of band_begin and band_end elements must match the number of bands InputFilter.band1_begin=0.0 InputFilter.band1_end=0.85 InputFilter.band2_begin=0.90 InputFilter.band2_end=1.0 ;#ampl: desired amplitude at the band edges. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter.ampl1_begin=1.0 InputFilter.ampl1_end=1.0 InputFilter.ampl2_begin=0.0 InputFilter.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter.band1_error=1.0 InputFilter.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter.IF is the intermediate frequency (in Hz) shifted down to zero Hz InputFilter.sampling_frequency=4000000 InputFilter.IF=0 InputFilter.decimation_factor=1 ~~~~~~ More documentation at the [Input Filter Blocks page](http://gnss-sdr.org/docs/sp-blocks/input-filter/). #### Resampler This block resamples the input data stream. The ```Direct_Resampler``` block implements a nearest neigbourhood interpolation: ~~~~~~ ;######### RESAMPLER CONFIG ############ ;#implementation: Use [Pass_Through] or [Direct_Resampler] ;#[Pass_Through] disables this block Resampler.implementation=Direct_Resampler Resampler.dump=false ; Dumps the resampled data to a file. Resampler.dump_filename=../data/resampler.dat ; log path and filename. Resampler.item_type=gr_complex Resampler.sample_freq_in=8000000 ; sample frequency of the input signal Resampler.sample_freq_out=4000000 ; desired sample frequency of the output signal ~~~~~~ More documentation at the [Resampler Blocks page](http://gnss-sdr.org/docs/sp-blocks/resampler/). ### Channel A channel encapsulates all signal processing devoted to a single satellite. Thus, it is a large composite object which encapsulates the acquisition, tracking and navigation data decoding modules. As a composite object, it can be treated as a single entity, meaning that it can be easily replicated. Since the number of channels is selectable by the user in the configuration file, this approach helps improving the scalability and maintainability of the receiver. Each channel must be assigned to a GNSS signal, according to the following identifiers: | **Signal** | **Identifier** | |:------------------|:---------------:| | GPS L1 C/A | 1C | | GPS L2 L2C(M) | 2S | | Galileo E1B | 1B | | Galileo E5a (I+Q) | 5X | Example: Eight GPS L1 C/A channels. ~~~~~~ ;######### CHANNELS GLOBAL CONFIG ############ Channels_1C.count=8 ; Number of available GPS L1 C/A channels. Channels_1B.count=0 ; Number of available Galileo E1B channels. Channels.in_acquisition=1 ; Number of channels simultaneously acquiring Channel.signal=1C ; ~~~~~~ Example: Four GPS L1 C/A and four Galileo E1B channels. ~~~~~~ ;######### CHANNELS GLOBAL CONFIG ############ Channels_1C.count=4 ; Number of available GPS L1 C/A channels. Channels_1B.count=4 ; Number of available Galileo E1B channels. Channels.in_acquisition=1 ; Number of channels simultaneously acquiring Channel0.signal=1C ; Channel1.signal=1C ; Channel2.signal=1C ; Channel3.signal=1C ; Channel4.signal=1B ; Channel5.signal=1B ; Channel6.signal=1B ; Channel7.signal=1B ; ~~~~~~ This module is also in charge of managing the interplay between acquisition and tracking. Acquisition can be initialized in several ways, depending on the prior information available (called cold start when the receiver has no information about its position nor the satellites almanac; warm start when a rough location and the approximate time of day are available, and the receiver has a recently recorded almanac broadcast; or hot start when the receiver was tracking a satellite and the signal line of sight broke for a short period of time, but the ephemeris and almanac data is still valid, or this information is provided by other means), and an acquisition process can finish deciding that the satellite is not present, that longer integration is needed in order to confirm the presence of the satellite, or declaring the satellite present. In the latter case, acquisition process should stop and trigger the tracking module with coarse estimations of the synchronization parameters. The mathematical abstraction used to design this logic is known as finite state machine (FSM), that is a behavior model composed of a finite number of states, transitions between those states, and actions. For the implementation, we use the [Boost.Statechart library](http://www.boost.org/libs/statechart/doc/tutorial.html), which provides desirable features such as support for asynchronous state machines, multi-threading, type-safety, error handling and compile-time validation. The abstract class [ChannelInterface](./src/core/interfaces/channel_interface.h) represents an interface to a channel GNSS block. Check [Channel](./src/algorithms/channel/adapters/channel.h) for an actual implementation. More documentation at the [Channels page](http://gnss-sdr.org/docs/sp-blocks/channels/). #### Acquisition The first task of a GNSS receiver is to detect the presence or absence of in-view satellites. This is done by the acquisition system process, which also provides a coarse estimation of two signal parameters: the frequency shift with respect to the nominal IF frequency, and a delay term which allows the receiver to create a local code aligned with the incoming code. [AcquisitionInterface](./src/core/interfaces/acquisition_interface.h) is the common interface for all the acquisition algorithms and their corresponding implementations. Algorithms' interface, that may vary depending on the use of information external to the receiver, such as in Assisted GNSS, is defined in classes referred to as *adapters*. These adapters wrap the GNU Radio blocks interface into a compatible interface expected by AcquisitionInterface. This allows the use of existing GNU Radio blocks derived from ```gr::block```, and ensures that newly developed implementations will also be reusable in other GNU Radio-based applications. Moreover, it adds still another layer of abstraction, since each given acquisition algorithm can have different implementations (for instance using different numerical libraries). In such a way, implementations can be continuously improved without having any impact neither on the algorithm interface nor the general acquisition interface. Check [GpsL1CaPcpsAcquisition](./src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h) and [GalileoE1PcpsAmbiguousAcquisition](./src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.h) for examples of adapters from a Parallel Code Phase Search (PCPS) acquisition block, and [pcps_acquisition_cc](./src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_cc.h) for an example of a block implementation. The source code of all the available acquisition algorithms is located at: ~~~~~~ |-gnss-sdr |---src |-----algorithms |-------acquisition |---------adapters <- Adapters of the processing blocks to an AcquisitionInterface |---------gnuradio_blocks <- Signal processing blocks implementation ~~~~~~ The user can select a given implementation for the algorithm to be used in each receiver channel, as well as their parameters, in the configuration file. For a GPS l1 C/A receiver: ~~~~~~ ;######### ACQUISITION GLOBAL CONFIG ############ Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition ; Acquisition algorithm selection for this channel Acquisition_1C.item_type=gr_complex Acquisition_1C.if=0 ; Signal intermediate frequency in [Hz] Acquisition_1C.sampled_ms=1 ; Signal block duration for the acquisition signal detection [ms] Acquisition_1C.threshold=0.005 ; Acquisition threshold Acquisition_1C.pfa=0.0001 ; Acquisition false alarm probability. This option overrides the threshold option. ; Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1C.doppler_max=10000 ; Maximum expected Doppler shift [Hz] Acquisition_1C.doppler_step=500 ; Doppler step in the grid search [Hz] Acquisition_1C.dump=false ; Enables internal data file logging [true] or [false] Acquisition_1C.dump_filename=./acq_dump.dat ; Log path and filename ~~~~~~ and, for Galileo E1B channels: ~~~~~~ ;######### GALILEO ACQUISITION CONFIG ############ Acquisition_1B.implementation=Galileo_E1_PCPS_Ambiguous_Acquisition Acquisition_1B.item_type=gr_complex Acquisition_1B.if=0 Acquisition_1B.sampled_ms=4 Acquisition_1B.pfa=0.0000008 Acquisition_1B.doppler_max=15000 Acquisition_1B.doppler_step=125 Acquisition_1B.dump=false Acquisition_1B.dump_filename=./acq_dump.dat ~~~~~~ More documentation at the [Acquisition Blocks page](http://gnss-sdr.org/docs/sp-blocks/acquisition/). #### Tracking When a satellite is declared present, the parameters estimated by the acquisition module are then fed to the receiver tracking module, which represents the second stage of the signal processing unit, aiming to perform a local search for accurate estimates of code delay and carrier phase, and following their eventual variations. Again, a class hierarchy consisting of a [TrackingInterface](./src/core/interfaces/tracking_interface.h) class and subclasses implementing algorithms provides a way of testing different approaches, with full access to their parameters. Check [GpsL1CaDllPllTracking](./src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.h) or [GalileoE1DllPllVemlTracking](./src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking.h) for examples of adapters, and [Gps_L1_Ca_Dll_Pll_Tracking_cc](./src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.h) for an example of a signal processing block implementation. There are also available some useful classes and functions for signal tracking; take a look at [cpu_multicorrelator.h](./src/algorithms/tracking/libs/cpu_multicorrelator.h), [lock_detectors.h](./src/algorithms/tracking/libs/lock_detectors.h), [tracking_discriminators.h](./src/algorithms/tracking/libs/tracking_discriminators.h) or [tracking_2nd_DLL_filter.h](./src/algorithms/tracking/libs/tracking_2nd_DLL_filter.h). The source code of all the available tracking algorithms is located at: ~~~~~~ |-gnss-sdr |---src |-----algorithms |-------tracking |---------adapters <- Adapters of the processing blocks to a TrackingInterface |---------gnuradio_blocks <- Signal processing blocks implementation |---------libs <- libraries of tracking objects (e.g. correlators, discriminators, and so on) ~~~~~~ The user can select a given implementation for the algorithm to be used in all the tracking blocks, as well as its parameters, in the configuration file. For instance, for GPS l1 channels: ~~~~~~ ;######### TRACKING GPS L1 CONFIG ############ Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking Tracking_1C.item_type=gr_complex Tracking_1C.pll_bw_hz=50.0 ; PLL loop filter bandwidth [Hz] Tracking_1C.dll_bw_hz=2.0 ; DLL loop filter bandwidth [Hz] Tracking_1C.order=3 ; PLL/DLL loop filter order [2] or [3] Tracking_1C.early_late_space_chips=0.5 ; correlator early-late space [chips]. Tracking_1C.dump=false ; Enable internal binary data file logging [true] or [false] Tracking_1C.dump_filename=./tracking_ch_ ; Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. ~~~~~~ and, for Galileo E1B channels: ~~~~~~ ;######### TRACKING GALILEO E1B CONFIG ############ Tracking_1B.implementation=Galileo_E1_DLL_PLL_VEML_Tracking Tracking_1B.item_type=gr_complex Tracking_1B.pll_bw_hz=15.0; Tracking_1B.dll_bw_hz=2.0; Tracking_1B.order=3; Tracking_1B.early_late_space_chips=0.15; Tracking_1B.very_early_late_space_chips=0.6; Tracking_1B.dump=false Tracking_1B.dump_filename=../data/veml_tracking_ch_ ~~~~~~ More documentation at the [Tracking Blocks page](http://gnss-sdr.org/docs/sp-blocks/tracking/). #### Decoding of the navigation message Most of GNSS signal links are modulated by a navigation message containing the time the message was transmitted, orbital parameters of satellites (also known as ephemeris) and an almanac (information about the general system health, rough orbits of all satellites in the network as well as data related to error correction). Navigation data bits are structured in words, pages, subframes, frames and superframes. Sometimes, bits corresponding to a single parameter are spread over different words, and values extracted from different frames are required for proper decoding. Some words are for synchronization purposes, others for error control an others contain actual information. There are also error control mechanisms, from parity checks to forward error correction (FEC) encoding and interleaving, depending on the system. All this decoding complexity is managed by a finite state machine implemented with the [Boost.Statechart library](http://www.boost.org/libs/statechart/doc/tutorial.html). The common interface is [TelemetryDecoderInterface](./src/core/interfaces/telemetry_decoder_interface.h). Check [GpsL1CaTelemetryDecoder](./src/algorithms/telemetry_decoder/adapters/gps_l1_ca_telemetry_decoder.h) for an example of the GPS L1 NAV message decoding adapter, and [gps_l1_ca_telemetry_decoder_cc](./src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.h) for an actual implementation of a signal processing block. Configuration example: ~~~~~~ ;######### TELEMETRY DECODER CONFIG ############ TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false ~~~~~~ In case you are configuring a multi-system receiver, you will need to decimate the one with the fastest code rate in order to get both data streams synchronized. For instance, for hybrid GPS L1 / Galileo E1B receivers: ~~~~~~ ;######### TELEMETRY DECODER GPS L1 CONFIG ############ TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false TelemetryDecoder_1C.decimation_factor=4; ;######### TELEMETRY DECODER GALILEO E1B CONFIG ############ TelemetryDecoder_1B.implementation=Galileo_E1B_Telemetry_Decoder TelemetryDecoder_1B.dump=false TelemetryDecoder_1B.decimation_factor=1; ~~~~~~ More documentation at the [Telemetry Decoder Blocks page](http://gnss-sdr.org/docs/sp-blocks/telemetry-decoder/). #### Observables GNSS systems provide different kinds of observations. The most commonly used are the code observations, also called pseudoranges. The *pseudo* comes from the fact that on the receiver side the clock error is unknown and thus the measurement is not a pure range observation. High accuracy applications also use the carrier phase observations, which are based on measuring the difference between the carrier phase transmitted by the GNSS satellites and the phase of the carrier generated in the receiver. Both observables are computed from the outputs of the tracking module and the decoding of the navigation message. This module collects all the data provided by every tracked channel, aligns all received data into a coherent set, and computes the observables. The common interface is [ObservablesInterface](./src/core/interfaces/observables_interface.h). Configuration example for GPS L1 C/A signals: ~~~~~~ ;######### OBSERVABLES CONFIG ############ Observables.implementation=GPS_L1_CA_Observables Observables.dump=false Observables.dump_filename=./observables.dat ~~~~~~ For Galileo E1B receivers: ~~~~~~ ;######### OBSERVABLES CONFIG ############ Observables.implementation=Galileo_E1B_Observables Observables.dump=false Observables.dump_filename=./observables.dat ~~~~~~ For hybrid GPS L1 / Galileo E1B receivers: ~~~~~~ ;######### OBSERVABLES CONFIG ############ Observables.implementation=Hybrid_Observables Observables.dump=false Observables.dump_filename=./observables.dat ~~~~~~ More documentation at the [Observables Blocks page](http://gnss-sdr.org/docs/sp-blocks/observables/). #### Computation of Position, Velocity and Time Although data processing for obtaining high-accuracy PVT solutions is out of the scope of GNSS-SDR, we provide a module that can compute simple least square solutions (stored in GIS-friendly formats such as [GeoJSON](http://geojson.org/geojson-spec.html) and [KML](http://www.opengeospatial.org/standards/kml), or transmitted via serial port as [NMEA 0183](https://en.wikipedia.org/wiki/NMEA_0183) messages), and leaves room for more sophisticated positioning methods by storing observables and navigation data in [RINEX](https://en.wikipedia.org/wiki/RINEX) files (v2.11 or v3.02), and generating [RTCM](http://www.rtcm.org "Radio Technical Commission for Maritime Services") 3.2 messages that can be disseminated through the Internet in real time. The common interface is [PvtInterface](./src/core/interfaces/pvt_interface.h). Configuration example for GPS L1 C/A signals: ~~~~~~ ;######### PVT CONFIG ############ PVT.implementation=GPS_L1_CA_PVT PVT.averaging_depth=10 ; Number of PVT observations in the moving average algorithm PVT.flag_averaging=true ; Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.output_rate_ms=100 ; Period in [ms] between two PVT outputs PVT.display_rate_ms=500 ; Position console print (std::out) interval [ms]. PVT.dump=false ; Enables the PVT internal binary data file logging [true] or [false] PVT.dump_filename=./PVT ; Log path and filename without extension of GeoJSON and KML files PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea ; NMEA log path and filename PVT.flag_nmea_tty_port=true ; Enables the NMEA log to a serial TTY port PVT.nmea_dump_devname=/dev/pts/4 ; serial device descriptor for NMEA logging PVT.flag_rtcm_server=false ; Enables or disables a TCP/IP server dispatching RTCM messages PVT.flag_rtcm_tty_port=true ; Enables the RTCM log to a serial TTY port PVT.rtcm_dump_devname=/dev/pts/1 ; serial device descriptor for RTCM logging ~~~~~~ For Galileo E1B receivers: ~~~~~~ ;######### PVT CONFIG ############ PVT.implementation=GALILEO_E1_PVT PVT.averaging_depth=100 PVT.flag_averaging=false PVT.output_rate_ms=100; PVT.display_rate_ms=500; PVT.dump=false PVT.dump_filename=./PVT PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea ; NMEA log path and filename PVT.flag_nmea_tty_port=true ; Enables the NMEA log to a serial TTY port PVT.nmea_dump_devname=/dev/pts/4 ; serial device descriptor for NMEA logging PVT.flag_rtcm_server=false ; Enables or disables a TCP/IP server dispatching RTCM messages PVT.flag_rtcm_tty_port=true ; Enables the RTCM log to a serial TTY port PVT.rtcm_dump_devname=/dev/pts/1 ; serial device descriptor for RTCM logging ~~~~~~ For hybrid GPS L1 / Galileo E1B receivers: ~~~~~~ ;######### PVT CONFIG ############ PVT.implementation=Hybrid_PVT PVT.averaging_depth=10 PVT.flag_averaging=false PVT.output_rate_ms=100; PVT.display_rate_ms=500; PVT.dump=false PVT.dump_filename=./PVT ~~~~~~ **Notes on the output formats:** * **GeoJSON** is a geospatial data interchange format based on JavaScript Object Notation (JSON) supported by numerous mapping and GIS software packages, including [OpenLayers](http://openlayers.org), [Leaflet](http://leafletjs.com), [MapServer](http://www.mapserver.org), [GeoServer](http://geoserver.org), [GeoDjango](https://www.djangoproject.com), [GDAL](http://www.gdal.org), and [CartoDB](https://cartodb.com). It is also possible to use GeoJSON with [PostGIS](http://postgis.net) and [Mapnik](http://mapnik.org), both of which handle the format via the GDAL OGR conversion library. The [Google Maps Javascript API](https://developers.google.com/maps/documentation/javascript/) v3 directly supports the [integration of GeoJSON data layers](https://developers.google.com/maps/documentation/javascript/examples/layer-data-simple), and [GitHub also supports GeoJSON rendering](https://github.com/blog/1528-there-s-a-map-for-that). * **KML** (Keyhole Markup Language) is an XML grammar used to encode and transport representations of geographic data for display in an earth browser. KML is an open standard officially named the OpenGIS KML Encoding Standard (OGC KML), and it is maintained by the Open Geospatial Consortium, Inc. (OGC). KML files can be displayed in geobrowsers such as [Google Earth](https://www.google.com/earth/), [Marble](https://marble.kde.org), [osgEarth](http://osgearth.org), or used with the [NASA World Wind SDK for Java](http://worldwind.arc.nasa.gov/java/). * **NMEA 0183** is a combined electrical and data specification for communication between marine electronics such as echo sounder, sonars, anemometer, gyrocompass, autopilot, GPS receivers and many other types of instruments. It has been defined by, and is controlled by, the U.S. [National Marine Electronics Association](http://www.nmea.org/). The NMEA 0183 standard uses a simple ASCII, serial communications protocol that defines how data are transmitted in a *sentence* from one *talker* to multiple *listeners* at a time. Through the use of intermediate expanders, a talker can have a unidirectional conversation with a nearly unlimited number of listeners, and using multiplexers, multiple sensors can talk to a single computer port. At the application layer, the standard also defines the contents of each sentence (message) type, so that all listeners can parse messages accurately. Those messages can be sent through the serial port (that could be for instance a Bluetooth link) and be used/displayed by a number of software applications such as [gpsd](http://www.catb.org/gpsd/ "The UNIX GPS daemon"), [JOSM](https://josm.openstreetmap.de/ "The Java OpenStreetMap Editor"), [OpenCPN](http://opencpn.org/ocpn/ "Open Chart Plotter Navigator"), and many others (and maybe running on other devices). * **RINEX** (Receiver Independent Exchange Format) is an interchange format for raw satellite navigation system data, covering observables and the information contained in the navigation message broadcast by GNSS satellites. This allows the user to post-process the received data to produce a more accurate result (usually with other data unknown to the original receiver, such as better models of the atmospheric conditions at time of measurement). RINEX files can be used by software packages such as [GPSTk](http://www.gpstk.org), [RTKLIB](http://www.rtklib.com/) and [gLAB](http://gage14.upc.es/gLAB/). GNSS-SDR by default generates RINEX version [3.02](https://igscb.jpl.nasa.gov/igscb/data/format/rinex302.pdf). If [2.11](https://igscb.jpl.nasa.gov/igscb/data/format/rinex211.txt) is needed, it can be requested through a commandline flag when invoking the software receiver: ~~~~~~ $ gnss-sdr --RINEX_version=2 ~~~~~~ * **RTCM SC-104** provides standards that define the data structure for differential GNSS correction information for a variety of differential correction applications. Developed by the Radio Technical Commission for Maritime Services ([RTCM](http://www.rtcm.org/overview.php#Standards "Radio Technical Commission for Maritime Services")), they have become an industry standard for communication of correction information. GNSS-SDR implements RTCM version 3.2, defined in the document *RTCM 10403.2, Differential GNSS (Global Navigation Satellite Systems) Services - Version 3* (February 1, 2013), which can be [purchased online](https://ssl29.pair.com/dmarkle/puborder.php?show=3 "RTCM Online Publication Order Form"). By default, the generated RTCM binary messages are dumped into a text file in hexadecimal format. However, GNSS-SDR is equipped with a TCP/IP server, acting as an NTRIP source that can feed an NTRIP server. NTRIP (Networked Transport of RTCM via Internet Protocol) is an open standard protocol that can be freely download from [BKG](http://igs.bkg.bund.de/root_ftp/NTRIP/documentation/NtripDocumentation.pdf "Networked Transport of RTCM via Internet Protocol (Ntrip) Version 1.0"), and it is designed for disseminating differential correction data (*e.g.* in the RTCM-104 format) or other kinds of GNSS streaming data to stationary or mobile users over the Internet. The TCP/IP server can be enabled by setting ```PVT.flag_rtcm_server=true``` in the configuration file, and will be active during the execution of the software receiver. By default, the server will operate on port 2101 (which is the recommended port for RTCM services according to the Internet Assigned Numbers Authority, [IANA](http://www.iana.org/assignments/service-names-port-numbers "Service Name and Transport Protocol Port Number Registry")), and will identify the Reference Station with ID=1234. This behaviour can be changed in the configuration file: ~~~~~~ PVT.flag_rtcm_server=true PVT.rtcm_tcp_port=2102 PVT.rtcm_station_id=1111 ~~~~~~ **Important note:** In order to get well-formatted GeoJSON, KML and RINEX files, always terminate ```gnss-sdr``` execution by pressing key ```q``` and then key ```ENTER```. Those files will be automatically deleted if no position fix have been obtained during the execution of the software receiver. More documentation at the [PVT Blocks page](http://gnss-sdr.org/docs/sp-blocks/pvt/). About the software license ========================== GNSS-SDR is released under the [General Public License (GPL) v3](http://www.gnu.org/licenses/gpl.html), thus securing practical usability, inspection, and continuous improvement by the research community, allowing the discussion based on tangible code and the analysis of results obtained with real signals. The GPL implies that: 1. Copies may be distributed free of charge or for money, but the source code has to be shipped or provided free of charge (or at cost price) on demand. The receiver of the source code has the same rights meaning he can share copies free of charge or resell. 2. The licensed material may be analyzed or modified. 3. Modified material may be distributed under the same licensing terms but *do not* have to be distributed. That means that modifications only have to be made available to the public if distribution happens. So it is perfectly fine to take the GNSS-SDR source code, modify it heavily and use it in a not distributed application / library. This is how companies like Google can run their own patched versions of Linux for example. But what this also means is that non-GPL code cannot use GPL code. This means that you cannot modify / use GNSS-SDR, blend it with non-GPL code, and make money with the resulting software. You cannot distribute the resulting software under a non-disclosure agreement or contract. Distributors under the GPL also grant a license for any of their patents practiced by the software, to practice those patents in GPL software. You can sell a device that runs with GNSS-SDR, but if you distribute the code, it has to remain under GPL. Publications and Credits ======================== If you use GNSS-SDR to produce a research paper or Thesis, we would appreciate if you reference the following article to credit the GNSS-SDR project: * C. Fernández-Prades, J. Arribas, P. Closas, C. Avilés, and L. Esteve, [GNSS-SDR: an open source tool for researchers and developers](http://www.cttc.es/publication/gnss-sdr-an-open-source-tool-for-researchers-and-developers/), in Proc. of the ION GNSS 2011 Conference, Portland, Oregon, Sept. 19-23, 2011. For LaTeX users, this is the BibTeX entry for your convenience: ~~~~~~ @INPROCEEDINGS{GNSS-SDR11, AUTHOR = {C.~{Fern\'{a}ndez--Prades} and J.~Arribas and P.~Closas and C.~Avil\'{e}s and L.~Esteve}, TITLE = {{GNSS-SDR}: An Open Source Tool For Researchers and Developers}, BOOKTITLE = {Proc. of the ION GNSS 2011 Conference}, YEAR = {2011}, address = {Portland, Oregon}, month = {Sept.} } ~~~~~~ There is a list of papers related to GNSS-SDR in our [publications page](http://gnss-sdr.org/publications/ "Publications"). Ok, now what? ============= In order to start using GNSS-SDR, you may want to populate ```gnss-sdr/data``` folder (or anywhere else on your system) with raw data files. By "raw data" we mean the output of a Radio Frequency front-end's Analog-to-Digital converter. GNSS-SDR needs signal samples already in baseband or in passband, at a suitable intemediate frequency (on the order of MHz). Prepare your configuration file, and then you are ready for running ```gnss-sdr --config_file=your_configuration.conf```, and seeing how the file is processed. Another interesting option is working in real-time with a RF front-end. We provide drivers for UHD-compatible hardware such as the [USRP family](http://www.ettus.com/product), for OsmoSDR and other front-ends (HackRF, bladeRF), for the GN3S v2 USB dongle and for some DVB-T USB dongles. Start with a low number of channels and then increase it in order to test how many channels your processor can handle in real-time. You can find more information at the [GNSS-SDR Documentation page](http://gnss-sdr.org/docs/) or directly asking to the [GNSS-SDR Developers mailing list](http://lists.sourceforge.net/lists/listinfo/gnss-sdr-developers). You are also very welcome to contribute to the project, there are many ways to [participate in GNSS-SDR](http://gnss-sdr.org/contribute/). If you need some special feature not yet implemented, the Developer Team would love to be hired for developing it. Please do not hesitate to [contact them](http://gnss-sdr.org/team/). **Enjoy GNSS-SDR!** The Developer Team. gnss-sdr-0.0.9/build/000077500000000000000000000000001305042567700143705ustar00rootroot00000000000000gnss-sdr-0.0.9/build/.gitignore000066400000000000000000000001061305042567700163550ustar00rootroot00000000000000# Ignore everything in this directory * # Except this file !.gitignoregnss-sdr-0.0.9/cmake/000077500000000000000000000000001305042567700143515ustar00rootroot00000000000000gnss-sdr-0.0.9/cmake/Modules/000077500000000000000000000000001305042567700157615ustar00rootroot00000000000000gnss-sdr-0.0.9/cmake/Modules/CMakeParseArgumentsCopy.cmake000066400000000000000000000134031305042567700234600ustar00rootroot00000000000000# CMAKE_PARSE_ARGUMENTS( args...) # # CMAKE_PARSE_ARGUMENTS() is intended to be used in macros or functions for # parsing the arguments given to that macro or function. # It processes the arguments and defines a set of variables which hold the # values of the respective options. # # The argument contains all options for the respective macro, # i.e. keywords which can be used when calling the macro without any value # following, like e.g. the OPTIONAL keyword of the install() command. # # The argument contains all keywords for this macro # which are followed by one value, like e.g. DESTINATION keyword of the # install() command. # # The argument contains all keywords for this macro # which can be followed by more than one value, like e.g. the TARGETS or # FILES keywords of the install() command. # # When done, CMAKE_PARSE_ARGUMENTS() will have defined for each of the # keywords listed in , and # a variable composed of the given # followed by "_" and the name of the respective keyword. # These variables will then hold the respective value from the argument list. # For the keywords this will be TRUE or FALSE. # # All remaining arguments are collected in a variable # _UNPARSED_ARGUMENTS, this can be checked afterwards to see whether # your macro was called with unrecognized parameters. # # As an example here a my_install() macro, which takes similar arguments as the # real install() command: # # function(MY_INSTALL) # set(options OPTIONAL FAST) # set(oneValueArgs DESTINATION RENAME) # set(multiValueArgs TARGETS CONFIGURATIONS) # cmake_parse_arguments(MY_INSTALL "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) # ... # # Assume my_install() has been called like this: # my_install(TARGETS foo bar DESTINATION bin OPTIONAL blub) # # After the cmake_parse_arguments() call the macro will have set the following # variables: # MY_INSTALL_OPTIONAL = TRUE # MY_INSTALL_FAST = FALSE (this option was not used when calling my_install() # MY_INSTALL_DESTINATION = "bin" # MY_INSTALL_RENAME = "" (was not used) # MY_INSTALL_TARGETS = "foo;bar" # MY_INSTALL_CONFIGURATIONS = "" (was not used) # MY_INSTALL_UNPARSED_ARGUMENTS = "blub" (no value expected after "OPTIONAL" # # You can the continue and process these variables. # # Keywords terminate lists of values, e.g. if directly after a one_value_keyword # another recognized keyword follows, this is interpreted as the beginning of # the new option. # E.g. my_install(TARGETS foo DESTINATION OPTIONAL) would result in # MY_INSTALL_DESTINATION set to "OPTIONAL", but MY_INSTALL_DESTINATION would # be empty and MY_INSTALL_OPTIONAL would be set to TRUE therefor. #============================================================================= # Copyright 2010 Alexander Neundorf # # 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.) if(__CMAKE_PARSE_ARGUMENTS_INCLUDED) return() endif() set(__CMAKE_PARSE_ARGUMENTS_INCLUDED TRUE) function(CMAKE_PARSE_ARGUMENTS prefix _optionNames _singleArgNames _multiArgNames) # first set all result variables to empty/FALSE foreach(arg_name ${_singleArgNames} ${_multiArgNames}) set(${prefix}_${arg_name}) endforeach(arg_name) foreach(option ${_optionNames}) set(${prefix}_${option} FALSE) endforeach(option) set(${prefix}_UNPARSED_ARGUMENTS) set(insideValues FALSE) set(currentArgName) # now iterate over all arguments and fill the result variables foreach(currentArg ${ARGN}) list(FIND _optionNames "${currentArg}" optionIndex) # ... then this marks the end of the arguments belonging to this keyword list(FIND _singleArgNames "${currentArg}" singleArgIndex) # ... then this marks the end of the arguments belonging to this keyword list(FIND _multiArgNames "${currentArg}" multiArgIndex) # ... then this marks the end of the arguments belonging to this keyword if(${optionIndex} EQUAL -1 AND ${singleArgIndex} EQUAL -1 AND ${multiArgIndex} EQUAL -1) if(insideValues) if("${insideValues}" STREQUAL "SINGLE") set(${prefix}_${currentArgName} ${currentArg}) set(insideValues FALSE) elseif("${insideValues}" STREQUAL "MULTI") list(APPEND ${prefix}_${currentArgName} ${currentArg}) endif() else(insideValues) list(APPEND ${prefix}_UNPARSED_ARGUMENTS ${currentArg}) endif(insideValues) else() if(NOT ${optionIndex} EQUAL -1) set(${prefix}_${currentArg} TRUE) set(insideValues FALSE) elseif(NOT ${singleArgIndex} EQUAL -1) set(currentArgName ${currentArg}) set(${prefix}_${currentArgName}) set(insideValues "SINGLE") elseif(NOT ${multiArgIndex} EQUAL -1) set(currentArgName ${currentArg}) set(${prefix}_${currentArgName}) set(insideValues "MULTI") endif() endif() endforeach(currentArg) # propagate the result variables to the caller: foreach(arg_name ${_singleArgNames} ${_multiArgNames} ${_optionNames}) set(${prefix}_${arg_name} ${${prefix}_${arg_name}} PARENT_SCOPE) endforeach(arg_name) set(${prefix}_UNPARSED_ARGUMENTS ${${prefix}_UNPARSED_ARGUMENTS} PARENT_SCOPE) endfunction(CMAKE_PARSE_ARGUMENTS _options _singleArgs _multiArgs) gnss-sdr-0.0.9/cmake/Modules/FindGFlags.cmake000066400000000000000000000044241305042567700207330ustar00rootroot00000000000000# - Try to find GFlags # # The following variables are optionally searched for defaults # GFlags_ROOT_DIR: Base directory where all GFlags components are found # # The following are set after configuration is done: # GFlags_FOUND # GFlags_INCLUDE_DIRS # GFlags_LIBS # GFlags_LIBRARY_DIRS # - Try to find GFlags # # # The following are set after configuration is done: # GFlags_FOUND # GFlags_INCLUDE_DIRS # GFlags_LIBS # GFlags_LIBRARY_DIRS cmake_minimum_required(VERSION 2.6) if(APPLE) FIND_PATH(GFlags_ROOT_DIR libgflags.dylib PATHS /opt/local/lib /usr/local/lib ) else(APPLE) FIND_PATH(GFlags_ROOT_DIR libgflags.so HINTS /usr/local/lib /usr/lib/x86_64-linux-gnu /usr/lib/i386-linux-gnu /usr/lib/arm-linux-gnueabihf /usr/lib/arm-linux-gnueabi /usr/lib/aarch64-linux-gnu /usr/lib/mipsel-linux-gnu /usr/lib/mips-linux-gnu /usr/lib/mips64el-linux-gnuabi64 /usr/lib/powerpc-linux-gnu /usr/lib/powerpc64-linux-gnu /usr/lib/powerpc64le-linux-gnu /usr/lib/powerpc-linux-gnuspe /usr/lib/hppa-linux-gnu /usr/lib/s390x-linux-gnu /usr/lib/i386-gnu /usr/lib/hppa-linux-gnu /usr/lib/x86_64-kfreebsd-gnu /usr/lib/i386-kfreebsd-gnu /usr/lib/m68k-linux-gnu /usr/lib/sh4-linux-gnu /usr/lib/sparc64-linux-gnu /usr/lib/x86_64-linux-gnux32 /usr/lib/alpha-linux-gnu /usr/lib64 /usr/lib ) endif(APPLE) IF(GFlags_ROOT_DIR) # We are testing only a couple of files in the include directories FIND_PATH(GFlags_INCLUDE_DIRS gflags/gflags.h HINTS /opt/local/include /usr/local/include /usr/include ${GFlags_ROOT_DIR}/src ) # Find the libraries SET(GFlags_LIBRARY_DIRS ${GFlags_ROOT_DIR}) FIND_LIBRARY(GFlags_lib gflags ${GFlags_LIBRARY_DIRS}) # set up include and link directory include_directories(${GFlags_INCLUDE_DIRS}) link_directories(${GFlags_LIBRARY_DIRS}) message(STATUS "gflags library found at ${GFlags_lib}") SET(GFlags_LIBS ${GFlags_lib}) SET(GFlags_FOUND true) MARK_AS_ADVANCED(GFlags_INCLUDE_DIRS) ELSE(GFlags_ROOT_DIR) MESSAGE(STATUS "Cannot find gflags") SET(GFlags_FOUND false) ENDIF(GFlags_ROOT_DIR) gnss-sdr-0.0.9/cmake/Modules/FindGLOG.cmake000066400000000000000000000070701305042567700203200ustar00rootroot00000000000000# - Try to find the Google Glog library # # This module defines the following variables # # GLOG_FOUND - Was Glog found # GLOG_INCLUDE_DIRS - the Glog include directories # GLOG_LIBRARIES - Link to this # # This module accepts the following variables # # GLOG_ROOT - Can be set to Glog install path or Windows build path # if (NOT DEFINED GLOG_ROOT) set (GLOG_ROOT /usr /usr/local) endif (NOT DEFINED GLOG_ROOT) if(MSVC) set(LIB_PATHS ${GLOG_ROOT} ${GLOG_ROOT}/Release) else(MSVC) set (LIB_PATHS ${GLOG_ROOT} ${GLOG_ROOT}/lib) endif(MSVC) macro(_FIND_GLOG_LIBRARIES _var) find_library(${_var} NAMES ${ARGN} PATHS ${LIB_PATHS} /usr/local/lib /usr/lib/x86_64-linux-gnu /usr/lib/i386-linux-gnu /usr/lib/arm-linux-gnueabihf /usr/lib/arm-linux-gnueabi /usr/lib/aarch64-linux-gnu /usr/lib/mipsel-linux-gnu /usr/lib/mips-linux-gnu /usr/lib/mips64el-linux-gnuabi64 /usr/lib/powerpc-linux-gnu /usr/lib/powerpc64-linux-gnu /usr/lib/powerpc64le-linux-gnu /usr/lib/powerpc-linux-gnuspe /usr/lib/hppa-linux-gnu /usr/lib/s390x-linux-gnu /usr/lib/i386-gnu /usr/lib/hppa-linux-gnu /usr/lib/x86_64-kfreebsd-gnu /usr/lib/i386-kfreebsd-gnu /usr/lib/m68k-linux-gnu /usr/lib/sh4-linux-gnu /usr/lib/sparc64-linux-gnu /usr/lib/x86_64-linux-gnux32 /usr/lib/alpha-linux-gnu /usr/lib64 /usr/lib PATH_SUFFIXES lib ) mark_as_advanced(${_var}) endmacro() macro(_GLOG_APPEND_LIBRARIES _list _release) set(_debug ${_release}_DEBUG) if(${_debug}) set(${_list} ${${_list}} optimized ${${_release}} debug ${${_debug}}) else() set(${_list} ${${_list}} ${${_release}}) endif() endmacro() if(MSVC) find_path(GLOG_INCLUDE_DIR NAMES raw_logging.h PATHS ${GLOG_ROOT}/src/windows ${GLOG_ROOT}/src/windows/glog ) else(MSVC) # Linux/OS X builds find_path(GLOG_INCLUDE_DIR NAMES raw_logging.h PATHS ${GLOG_ROOT}/include/glog /usr/include/glog /opt/local/include/glog # default location in Macports ) endif(MSVC) # Find the libraries if(MSVC) _FIND_GLOG_LIBRARIES(GLOG_LIBRARIES libglog.lib) else(MSVC) # Linux/OS X builds if(UNIX) _FIND_GLOG_LIBRARIES(GLOG_LIBRARIES libglog.so) endif(UNIX) if(APPLE) _FIND_GLOG_LIBRARIES(GLOG_LIBRARIES libglog.dylib) endif(APPLE) endif(MSVC) if(GLOG_FOUND) message(STATUS "glog library found at ${GLOG_LIBRARIES}") endif() # handle the QUIETLY and REQUIRED arguments and set GLOG_FOUND to TRUE if # all listed variables are TRUE include("${CMAKE_ROOT}/Modules/FindPackageHandleStandardArgs.cmake") FIND_PACKAGE_HANDLE_STANDARD_ARGS(Glog DEFAULT_MSG GLOG_LIBRARIES) if(MSVC) string(REGEX REPLACE "/glog$" "" VAR_WITHOUT ${GLOG_INCLUDE_DIR}) string(REGEX REPLACE "/windows$" "" VAR_WITHOUT ${VAR_WITHOUT}) set(GLOG_INCLUDE_DIRS ${GLOG_INCLUDE_DIRS} "${VAR_WITHOUT}") string(REGEX REPLACE "/libglog.lib" "" GLOG_LIBRARIES_DIR ${GLOG_LIBRARIES}) else(MSVC) # Linux/OS X builds set(GLOG_INCLUDE_DIRS ${GLOG_INCLUDE_DIR}) string(REGEX REPLACE "/libglog.so" "" GLOG_LIBRARIES_DIR ${GLOG_LIBRARIES}) endif(MSVC) if(GLOG_FOUND) # _GLOG_APPEND_LIBRARIES(GLOG GLOG_LIBRARIES) endif() gnss-sdr-0.0.9/cmake/Modules/FindGPSTK.cmake000066400000000000000000000015431305042567700204570ustar00rootroot00000000000000# - Find gpstk library # Find the native gpstk includes and library # This module defines # GPSTK_INCLUDE_DIR, where to find Rinex3ObsBase.hpp, etc. # GPSTK_LIBRARIES, libraries to link against to use GPSTK. # GPSTK_FOUND, If false, do not try to use GPSTK. # also defined, but not for general use are # GPSTK_LIBRARY, where to find the GPSTK library. FIND_PATH(GPSTK_INCLUDE_DIR Rinex3ObsBase.hpp) SET(GPSTK_NAMES ${GPSTK_NAMES} gpstk libgpstk) FIND_LIBRARY(GPSTK_LIBRARY NAMES ${GPSTK_NAMES} ) # handle the QUIETLY and REQUIRED arguments and set GPSTK_FOUND to TRUE if # all listed variables are TRUE INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(GPSTK DEFAULT_MSG GPSTK_LIBRARY GPSTK_INCLUDE_DIR) IF(GPSTK_FOUND) SET( GPSTK_LIBRARIES ${GPSTK_LIBRARY} ) ENDIF(GPSTK_FOUND) MARK_AS_ADVANCED(GPSTK_INCLUDE_DIR GPSTK_LIBRARY) gnss-sdr-0.0.9/cmake/Modules/FindGnuradio.cmake000066400000000000000000000152601305042567700213400ustar00rootroot00000000000000######################################################################## # Find GNU Radio ######################################################################## INCLUDE(FindPkgConfig) INCLUDE(FindPackageHandleStandardArgs) # if GR_REQUIRED_COMPONENTS is not defined, it will be set to the following list if(NOT GR_REQUIRED_COMPONENTS) set(GR_REQUIRED_COMPONENTS RUNTIME ANALOG BLOCKS DIGITAL FFT FILTER PMT FEC TRELLIS UHD) endif() # Allows us to use all .cmake files in this directory list(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_CURRENT_LIST_DIR}) # Easily access all libraries and includes of GNU Radio set(GNURADIO_ALL_LIBRARIES "") set(GNURADIO_ALL_INCLUDE_DIRS "") MACRO(LIST_CONTAINS var value) SET(${var}) FOREACH(value2 ${ARGN}) IF (${value} STREQUAL ${value2}) SET(${var} TRUE) ENDIF(${value} STREQUAL ${value2}) ENDFOREACH(value2) ENDMACRO(LIST_CONTAINS) function(GR_MODULE EXTVAR PCNAME INCFILE LIBFILE) LIST_CONTAINS(REQUIRED_MODULE ${EXTVAR} ${GR_REQUIRED_COMPONENTS}) if(NOT REQUIRED_MODULE) #message("Ignoring GNU Radio Module ${EXTVAR}") return() endif() message(STATUS "Checking for GNU Radio Module: ${EXTVAR}") # check for .pc hints PKG_CHECK_MODULES(PC_GNURADIO_${EXTVAR} ${PCNAME}) if(NOT PC_GNURADIO_${EXTVAR}_FOUND) set(PC_GNURADIO_${EXTVAR}_LIBRARIES ${LIBFILE}) endif() set(INCVAR_NAME "GNURADIO_${EXTVAR}_INCLUDE_DIRS") set(LIBVAR_NAME "GNURADIO_${EXTVAR}_LIBRARIES") set(PC_INCDIR ${PC_GNURADIO_${EXTVAR}_INCLUDEDIR}) set(PC_LIBDIR ${PC_GNURADIO_${EXTVAR}_LIBDIR}) # look for include files FIND_PATH( ${INCVAR_NAME} NAMES ${INCFILE} HINTS $ENV{GNURADIO_RUNTIME_DIR}/include ${PC_INCDIR} ${CMAKE_INSTALL_PREFIX}/include ${GNURADIO_INSTALL_PREFIX}/include PATHS /usr/local/include /usr/include ${GNURADIO_INSTALL_PREFIX}/include ) # look for libs foreach(libname ${PC_GNURADIO_${EXTVAR}_LIBRARIES}) FIND_LIBRARY( ${LIBVAR_NAME}_${libname} NAMES ${libname} ${libname}-${PC_GNURADIO_RUNTIME_VERSION} HINTS $ENV{GNURADIO_RUNTIME_DIR}/lib ${PC_LIBDIR} ${CMAKE_INSTALL_PREFIX}/lib/ ${CMAKE_INSTALL_PREFIX}/lib64/ ${GNURADIO_INSTALL_PREFIX}/lib/ ${GNURADIO_INSTALL_PREFIX}/lib64 PATHS /usr/local/lib /usr/lib/x86_64-linux-gnu /usr/lib/i386-linux-gnu /usr/lib/arm-linux-gnueabihf /usr/lib/arm-linux-gnueabi /usr/lib/aarch64-linux-gnu /usr/lib/mipsel-linux-gnu /usr/lib/mips-linux-gnu /usr/lib/mips64el-linux-gnuabi64 /usr/lib/powerpc-linux-gnu /usr/lib/powerpc64-linux-gnu /usr/lib/powerpc64le-linux-gnu /usr/lib/powerpc-linux-gnuspe /usr/lib/hppa-linux-gnu /usr/lib/s390x-linux-gnu /usr/lib/i386-gnu /usr/lib/hppa-linux-gnu /usr/lib/x86_64-kfreebsd-gnu /usr/lib/i386-kfreebsd-gnu /usr/lib/m68k-linux-gnu /usr/lib/sh4-linux-gnu /usr/lib/sparc64-linux-gnu /usr/lib/x86_64-linux-gnux32 /usr/lib/alpha-linux-gnu /usr/lib64 /usr/lib ${GNURADIO_INSTALL_PREFIX}/lib ) list(APPEND ${LIBVAR_NAME} ${${LIBVAR_NAME}_${libname}}) endforeach(libname) set(${LIBVAR_NAME} ${${LIBVAR_NAME}} PARENT_SCOPE) # show results message(STATUS " * INCLUDES=${GNURADIO_${EXTVAR}_INCLUDE_DIRS}") message(STATUS " * LIBS=${GNURADIO_${EXTVAR}_LIBRARIES}") # append to all includes and libs list set(GNURADIO_ALL_INCLUDE_DIRS ${GNURADIO_ALL_INCLUDE_DIRS} ${GNURADIO_${EXTVAR}_INCLUDE_DIRS} PARENT_SCOPE) set(GNURADIO_ALL_LIBRARIES ${GNURADIO_ALL_LIBRARIES} ${GNURADIO_${EXTVAR}_LIBRARIES} PARENT_SCOPE) FIND_PACKAGE_HANDLE_STANDARD_ARGS(GNURADIO_${EXTVAR} DEFAULT_MSG GNURADIO_${EXTVAR}_LIBRARIES GNURADIO_${EXTVAR}_INCLUDE_DIRS) message(STATUS "GNURADIO_${EXTVAR}_FOUND = ${GNURADIO_${EXTVAR}_FOUND}") set(GNURADIO_${EXTVAR}_FOUND ${GNURADIO_${EXTVAR}_FOUND} PARENT_SCOPE) # generate an error if the module is missing if(NOT GNURADIO_${EXTVAR}_FOUND) message(STATUS "Required GNU Radio Component: ${EXTVAR} missing!") endif() MARK_AS_ADVANCED(GNURADIO_${EXTVAR}_LIBRARIES GNURADIO_${EXTVAR}_INCLUDE_DIRS) endfunction() GR_MODULE(RUNTIME gnuradio-runtime gnuradio/top_block.h gnuradio-runtime) GR_MODULE(ANALOG gnuradio-analog gnuradio/analog/api.h gnuradio-analog) GR_MODULE(AUDIO gnuradio-audio gnuradio/audio/api.h gnuradio-audio) GR_MODULE(BLOCKS gnuradio-blocks gnuradio/blocks/api.h gnuradio-blocks) GR_MODULE(CHANNELS gnuradio-channels gnuradio/channels/api.h gnuradio-channels) GR_MODULE(DIGITAL gnuradio-digital gnuradio/digital/api.h gnuradio-digital) GR_MODULE(FCD gnuradio-fcd gnuradio/fcd_api.h gnuradio-fcd) GR_MODULE(FEC gnuradio-fec gnuradio/fec/api.h gnuradio-fec) GR_MODULE(FFT gnuradio-fft gnuradio/fft/api.h gnuradio-fft) GR_MODULE(FILTER gnuradio-filter gnuradio/filter/api.h gnuradio-filter) GR_MODULE(NOAA gnuradio-noaa gnuradio/noaa/api.h gnuradio-noaa) GR_MODULE(PAGER gnuradio-pager gnuradio/pager/api.h gnuradio-pager) GR_MODULE(QTGUI gnuradio-qtgui gnuradio/qtgui/api.h gnuradio-qtgui) GR_MODULE(TRELLIS gnuradio-trellis gnuradio/trellis/api.h gnuradio-trellis) GR_MODULE(UHD gnuradio-uhd gnuradio/uhd/api.h gnuradio-uhd) GR_MODULE(VOCODER gnuradio-vocoder gnuradio/vocoder/api.h gnuradio-vocoder) GR_MODULE(WAVELET gnuradio-wavelet gnuradio/wavelet/api.h gnuradio-wavelet) GR_MODULE(WXGUI gnuradio-wxgui gnuradio/wxgui/api.h gnuradio-wxgui) GR_MODULE(PMT gnuradio-runtime pmt/pmt.h gnuradio-pmt) list(REMOVE_DUPLICATES GNURADIO_ALL_INCLUDE_DIRS) list(REMOVE_DUPLICATES GNURADIO_ALL_LIBRARIES) # Trick to find out that GNU Radio is >= 3.7.4 if pkgconfig is not present if(NOT PC_GNURADIO_RUNTIME_VERSION) find_file(GNURADIO_VERSION_GREATER_THAN_373 NAMES gnuradio/blocks/tsb_vector_sink_f.h HINTS $ENV{GNURADIO_RUNTIME_DIR}/include ${CMAKE_INSTALL_PREFIX}/include ${GNURADIO_INSTALL_PREFIX}/include PATHS /usr/local/include /usr/include ${GNURADIO_INSTALL_PREFIX}/include ) if(GNURADIO_VERSION_GREATER_THAN_373) set(PC_GNURADIO_RUNTIME_VERSION "3.7.4+") endif(GNURADIO_VERSION_GREATER_THAN_373) endif(NOT PC_GNURADIO_RUNTIME_VERSION)gnss-sdr-0.0.9/cmake/Modules/FindGperftools.cmake000066400000000000000000000025321305042567700217120ustar00rootroot00000000000000# Tries to find Gperftools. # # Usage of this module as follows: # # find_package(Gperftools) # # Variables used by this module, they can change the default behaviour and need # to be set before calling find_package: # # Gperftools_ROOT_DIR Set this variable to the root installation of # Gperftools if the module has problems finding # the proper installation path. # # Variables defined by this module: # # GPERFTOOLS_FOUND System has Gperftools libs/headers # GPERFTOOLS_LIBRARIES The Gperftools libraries (tcmalloc & profiler) # GPERFTOOLS_INCLUDE_DIR The location of Gperftools headers find_library(GPERFTOOLS_TCMALLOC NAMES tcmalloc HINTS ${Gperftools_ROOT_DIR}/lib) find_library(GPERFTOOLS_PROFILER NAMES profiler HINTS ${Gperftools_ROOT_DIR}/lib) find_library(GPERFTOOLS_TCMALLOC_AND_PROFILER NAMES tcmalloc_and_profiler HINTS ${Gperftools_ROOT_DIR}/lib) find_path(GPERFTOOLS_INCLUDE_DIR NAMES gperftools/heap-profiler.h HINTS ${Gperftools_ROOT_DIR}/include) set(GPERFTOOLS_LIBRARIES ${GPERFTOOLS_TCMALLOC_AND_PROFILER}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args( Gperftools DEFAULT_MSG GPERFTOOLS_LIBRARIES GPERFTOOLS_INCLUDE_DIR ) mark_as_advanced( Gperftools_ROOT_DIR GPERFTOOLS_TCMALLOC GPERFTOOLS_PROFILER GPERFTOOLS_TCMALLOC_AND_PROFILER GPERFTOOLS_LIBRARIES GPERFTOOLS_INCLUDE_DIR)gnss-sdr-0.0.9/cmake/Modules/FindGrDbfcttc.cmake000066400000000000000000000017401305042567700214300ustar00rootroot00000000000000######################################################################## # Find GR-DBFCTTC Module ######################################################################## INCLUDE(FindPkgConfig) PKG_CHECK_MODULES(PC_GR_DBFCTTC gr-dbfcttc) FIND_PATH( GR_DBFCTTC_INCLUDE_DIRS NAMES dbfcttc/api.h HINTS $ENV{GR_DBFCTTC_DIR}/include ${PC_GR_DBFCTTC_INCLUDEDIR} PATHS ${CMAKE_INSTALL_PREFIX}/include /usr/include /usr/local/include ) FIND_LIBRARY( GR_DBFCTTC_LIBRARIES NAMES gnuradio-dbfcttc HINTS $ENV{GR_DBFCTTC_DIR}/lib ${PC_GR_DBFCTTC_LIBDIR} PATHS ${CMAKE_INSTALL_PREFIX}/lib ${CMAKE_INSTALL_PREFIX}/lib64 /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64 ) INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(GR_DBFCTTC DEFAULT_MSG GR_DBFCTTC_LIBRARIES GR_DBFCTTC_INCLUDE_DIRS) MARK_AS_ADVANCED(GR_DBFCTTC_LIBRARIES GR_DBFCTTC_INCLUDE_DIRS) gnss-sdr-0.0.9/cmake/Modules/FindGrGN3S.cmake000066400000000000000000000016561305042567700205770ustar00rootroot00000000000000######################################################################## # Find GR-GN3S Module ######################################################################## INCLUDE(FindPkgConfig) PKG_CHECK_MODULES(PC_GR_GN3S gr-gn3s) FIND_PATH( GR_GN3S_INCLUDE_DIRS NAMES gn3s/gn3s_api.h HINTS $ENV{GR_GN3S_DIR}/include ${PC_GR_GN3S_INCLUDEDIR} PATHS ${CMAKE_INSTALL_PREFIX}/include /usr/local/include /usr/include ) FIND_LIBRARY( GR_GN3S_LIBRARIES NAMES gr-gn3s HINTS $ENV{GR_GN3S_DIR}/lib ${PC_GR_GN3S_LIBDIR} PATHS ${CMAKE_INSTALL_PREFIX}/lib ${CMAKE_INSTALL_PREFIX}/lib64 /usr/local/lib /usr/local/lib64 /usr/lib /usr/lib64 ) INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(GR_GN3S DEFAULT_MSG GR_GN3S_LIBRARIES GR_GN3S_INCLUDE_DIRS) MARK_AS_ADVANCED(GR_GN3S_LIBRARIES GR_GN3S_INCLUDE_DIRS) gnss-sdr-0.0.9/cmake/Modules/FindGrOsmoSDR.cmake000066400000000000000000000042571305042567700213530ustar00rootroot00000000000000# Tries to find gr-osmosdr. # # Usage of this module as follows: # # find_package(GrOsmoSDR) # # Variables used by this module, they can change the default behaviour and need # to be set before calling find_package: # # GrOsmoSDR_ROOT_DIR Set this variable to the root installation of # gr-osmosdr if the module has problems finding # the proper installation path. # # Variables defined by this module: # # GROSMOSDR_FOUND System has gr-osmosdr libs/headers # GROSMOSDR_LIBRARIES The gr-osmosdr libraries (gnuradio-osmosdr) # GROSMOSDR_INCLUDE_DIR The location of gr-osmosdr headers if(NOT GROSMOSDR_FOUND) pkg_check_modules (GROSMOSDR_PKG gnuradio-osmosdr) find_path(GROSMOSDR_INCLUDE_DIR NAMES osmosdr/source.h osmosdr/api.h PATHS ${GROSMOSDR_PKG_INCLUDE_DIRS} /usr/include /usr/local/include ) find_library(GROSMOSDR_LIBRARIES NAMES gnuradio-osmosdr PATHS ${GROSMOSDR_PKG_LIBRARY_DIRS} /usr/lib /usr/local/lib /usr/lib/x86_64-linux-gnu /usr/lib/i386-linux-gnu /usr/lib/arm-linux-gnueabihf /usr/lib/arm-linux-gnueabi /usr/lib/aarch64-linux-gnu /usr/lib/mipsel-linux-gnu /usr/lib/mips-linux-gnu /usr/lib/mips64el-linux-gnuabi64 /usr/lib/powerpc-linux-gnu /usr/lib/powerpc64-linux-gnu /usr/lib/powerpc64le-linux-gnu /usr/lib/powerpc-linux-gnuspe /usr/lib/hppa-linux-gnu /usr/lib/s390x-linux-gnu /usr/lib/i386-gnu /usr/lib/hppa-linux-gnu /usr/lib/x86_64-kfreebsd-gnu /usr/lib/i386-kfreebsd-gnu /usr/lib/m68k-linux-gnu /usr/lib/sh4-linux-gnu /usr/lib/sparc64-linux-gnu /usr/lib/x86_64-linux-gnux32 /usr/lib/alpha-linux-gnu /usr/lib64 ) if(GROSMOSDR_INCLUDE_DIR AND GROSMOSDR_LIBRARIES) set(GROSMOSDR_FOUND TRUE CACHE INTERNAL "gnuradio-osmosdr found") message(STATUS "Found gnuradio-osmosdr: ${GROSMOSDR_INCLUDE_DIR}, ${GROSMOSDR_LIBRARIES}") else(GROSMOSDR_INCLUDE_DIR AND GROSMOSDR_LIBRARIES) set(GROSMOSDR_FOUND FALSE CACHE INTERNAL "gnuradio-osmosdr found") message(STATUS "gnuradio-osmosdr not found.") endif(GROSMOSDR_INCLUDE_DIR AND GROSMOSDR_LIBRARIES) mark_as_advanced(GROSMOSDR_INCLUDE_DIR GROSMOSDR_LIBRARIES) endif(NOT GROSMOSDR_FOUND) gnss-sdr-0.0.9/cmake/Modules/FindLibOsmoSDR.cmake000066400000000000000000000035361305042567700215100ustar00rootroot00000000000000# Tries to find libosmosdr. # # Usage of this module as follows: # # find_package(LibOsmoSDR) # # # Variables defined by this module: # # LIBOSMOSDR_FOUND System has libosmosdr libs/headers # LIBOSMOSDR_LIBRARIES The libosmosdr libraries # LIBOSMOSDR_INCLUDE_DIR The location of libosmosdr headers if(NOT LIBOSMOSDR_FOUND) pkg_check_modules (LIBOSMOSDR_PKG libosmosdr) find_path(LIBOSMOSDR_INCLUDE_DIR NAMES osmosdr.h PATHS ${LIBOSMOSDR_PKG_INCLUDE_DIRS} /usr/include /usr/local/include ) find_library(LIBOSMOSDR_LIBRARIES NAMES osmosdr PATHS ${LIBOSMOSDR_PKG_LIBRARY_DIRS} /usr/lib /usr/local/lib /usr/lib/x86_64-linux-gnu /usr/lib/i386-linux-gnu /usr/lib/arm-linux-gnueabihf /usr/lib/arm-linux-gnueabi /usr/lib/aarch64-linux-gnu /usr/lib/mipsel-linux-gnu /usr/lib/mips-linux-gnu /usr/lib/mips64el-linux-gnuabi64 /usr/lib/powerpc-linux-gnu /usr/lib/powerpc64-linux-gnu /usr/lib/powerpc64le-linux-gnu /usr/lib/powerpc-linux-gnuspe /usr/lib/hppa-linux-gnu /usr/lib/s390x-linux-gnu /usr/lib/i386-gnu /usr/lib/hppa-linux-gnu /usr/lib/x86_64-kfreebsd-gnu /usr/lib/i386-kfreebsd-gnu /usr/lib/m68k-linux-gnu /usr/lib/sh4-linux-gnu /usr/lib/sparc64-linux-gnu /usr/lib/x86_64-linux-gnux32 /usr/lib/alpha-linux-gnu /usr/lib64 ) if(LIBOSMOSDR_INCLUDE_DIR AND LIBOSMOSDR_LIBRARIES) set(LIBOSMOSDR_FOUND TRUE CACHE INTERNAL "libosmosdr found") message(STATUS "Found libosmosdr: ${LIBOSMOSDR_INCLUDE_DIR}, ${LIBOSMOSDR_LIBRARIES}") else(LIBOSMOSDR_INCLUDE_DIR AND LIBOSMOSDR_LIBRARIES) set(LIBOSMOSDR_FOUND FALSE CACHE INTERNAL "libosmosdr found") message(STATUS "libosmosdr not found.") endif(LIBOSMOSDR_INCLUDE_DIR AND LIBOSMOSDR_LIBRARIES) mark_as_advanced(LIBOSMOSDR_INCLUDE_DIR LIBOSMOSDR_LIBRARIES) endif(NOT LIBOSMOSDR_FOUND) gnss-sdr-0.0.9/cmake/Modules/FindORC.cmake000066400000000000000000000033341305042567700202120ustar00rootroot00000000000000FIND_PACKAGE(PkgConfig) PKG_CHECK_MODULES(PC_ORC "orc-0.4 > 0.4.22") FIND_PROGRAM(ORCC_EXECUTABLE orcc HINTS ${PC_ORC_TOOLSDIR} PATHS ${ORC_ROOT}/bin ${CMAKE_INSTALL_PREFIX}/bin) FIND_PATH(ORC_INCLUDE_DIR NAMES orc/orc.h HINTS ${PC_ORC_INCLUDEDIR} PATHS ${ORC_ROOT}/include/orc-0.4 ${CMAKE_INSTALL_PREFIX}/include/orc-0.4) FIND_PATH(ORC_LIBRARY_DIR NAMES ${CMAKE_SHARED_LIBRARY_PREFIX}orc-0.4${CMAKE_SHARED_LIBRARY_SUFFIX} HINTS ${PC_ORC_LIBDIR} /usr/local/lib /usr/lib/x86_64-linux-gnu /usr/lib/i386-linux-gnu /usr/lib/arm-linux-gnueabihf /usr/lib/arm-linux-gnueabi /usr/lib/aarch64-linux-gnu /usr/lib/mipsel-linux-gnu /usr/lib/mips-linux-gnu /usr/lib/mips64el-linux-gnuabi64 /usr/lib/powerpc-linux-gnu /usr/lib/powerpc64-linux-gnu /usr/lib/powerpc64le-linux-gnu /usr/lib/hppa-linux-gnu /usr/lib/s390x-linux-gnu /usr/lib64 /usr/lib PATHS ${ORC_ROOT}/lib${LIB_SUFFIX} ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}) FIND_LIBRARY(ORC_LIB orc-0.4 HINTS ${PC_ORC_LIBRARY_DIRS} PATHS ${ORC_ROOT}/lib${LIB_SUFFIX} ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}) LIST(APPEND ORC_LIBRARY ${ORC_LIB} ) SET(ORC_INCLUDE_DIRS ${ORC_INCLUDE_DIR}) SET(ORC_LIBRARIES ${ORC_LIBRARY}) SET(ORC_LIBRARY_DIRS ${ORC_LIBRARY_DIR}) INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(ORC "orc files" ORC_LIBRARY ORC_INCLUDE_DIR ORCC_EXECUTABLE) mark_as_advanced(ORC_INCLUDE_DIR ORC_LIBRARY ORCC_EXECUTABLE)gnss-sdr-0.0.9/cmake/Modules/FindOpenBLAS.cmake000066400000000000000000000015521305042567700211320ustar00rootroot00000000000000# - Try to find OpenBLAS library (not headers!) # # The following environment variable is optionally searched # OPENBLAS_HOME: Base directory where all OpenBlas components are found SET(OPEN_BLAS_SEARCH_PATHS /lib/ /lib64/ /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64 /opt/OpenBLAS/lib /opt/local/lib /usr/lib/openblas-base $ENV{OPENBLAS_HOME}/lib ) FIND_LIBRARY(OPENBLAS NAMES openblas PATHS ${OPEN_BLAS_SEARCH_PATHS}) IF (OPENBLAS) SET(OPENBLAS_FOUND ON) MESSAGE(STATUS "Found OpenBLAS") ENDIF (OPENBLAS) MARK_AS_ADVANCED(OPENBLAS) gnss-sdr-0.0.9/cmake/Modules/FindOpenCL.cmake000066400000000000000000000072401305042567700207070ustar00rootroot00000000000000# # This file taken from FindOpenCL project @ http://gitorious.com/findopencl # # - Try to find OpenCL # This module tries to find an OpenCL implementation on your system. It supports # AMD / ATI, Apple and NVIDIA implementations, but shoudl work, too. # # Once done this will define # OPENCL_FOUND - system has OpenCL # OPENCL_INCLUDE_DIRS - the OpenCL include directory # OPENCL_LIBRARIES - link these to use OpenCL # # WIN32 should work, but is untested FIND_PACKAGE( PackageHandleStandardArgs ) SET (OPENCL_VERSION_STRING "0.1.0") SET (OPENCL_VERSION_MAJOR 0) SET (OPENCL_VERSION_MINOR 1) SET (OPENCL_VERSION_PATCH 0) IF (APPLE) FIND_LIBRARY(OPENCL_LIBRARIES OpenCL DOC "OpenCL lib for OSX") FIND_PATH(OPENCL_INCLUDE_DIRS OpenCL/cl.h DOC "Include for OpenCL on OSX") FIND_PATH(_OPENCL_CPP_INCLUDE_DIRS OpenCL/cl.hpp DOC "Include for OpenCL CPP bindings on OSX") ELSE (APPLE) IF (WIN32) FIND_PATH(OPENCL_INCLUDE_DIRS CL/cl.h) FIND_PATH(_OPENCL_CPP_INCLUDE_DIRS CL/cl.hpp) # The AMD SDK currently installs both x86 and x86_64 libraries # This is only a hack to find out architecture IF( ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "AMD64" ) SET(OPENCL_LIB_DIR "$ENV{ATISTREAMSDKROOT}/lib/x86_64") SET(OPENCL_LIB_DIR "$ENV{ATIINTERNALSTREAMSDKROOT}/lib/x86_64") ELSE (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "AMD64") SET(OPENCL_LIB_DIR "$ENV{ATISTREAMSDKROOT}/lib/x86") SET(OPENCL_LIB_DIR "$ENV{ATIINTERNALSTREAMSDKROOT}/lib/x86") ENDIF( ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "AMD64" ) # find out if the user asked for a 64-bit build, and use the corresponding # 64 or 32 bit NVIDIA library paths to the search: STRING(REGEX MATCH "Win64" ISWIN64 ${CMAKE_GENERATOR}) IF("${ISWIN64}" STREQUAL "Win64") FIND_LIBRARY(OPENCL_LIBRARIES OpenCL.lib ${OPENCL_LIB_DIR} $ENV{CUDA_LIB_PATH} $ENV{CUDA_PATH}/lib/x64) ELSE("${ISWIN64}" STREQUAL "Win64") FIND_LIBRARY(OPENCL_LIBRARIES OpenCL.lib ${OPENCL_LIB_DIR} $ENV{CUDA_LIB_PATH} $ENV{CUDA_PATH}/lib/Win32) ENDIF("${ISWIN64}" STREQUAL "Win64") GET_FILENAME_COMPONENT(_OPENCL_INC_CAND ${OPENCL_LIB_DIR}/../../include ABSOLUTE) # On Win32 search relative to the library FIND_PATH(OPENCL_INCLUDE_DIRS CL/cl.h PATHS "${_OPENCL_INC_CAND}" $ENV{CUDA_INC_PATH} $ENV{CUDA_PATH}/include) FIND_PATH(_OPENCL_CPP_INCLUDE_DIRS CL/cl.hpp PATHS "${_OPENCL_INC_CAND}" $ENV{CUDA_INC_PATH} $ENV{CUDA_PATH}/include) ELSE (WIN32) # Unix style platforms FIND_LIBRARY(OPENCL_LIBRARIES OpenCL ENV LD_LIBRARY_PATH ) GET_FILENAME_COMPONENT(OPENCL_LIB_DIR ${OPENCL_LIBRARIES} PATH) GET_FILENAME_COMPONENT(_OPENCL_INC_CAND ${OPENCL_LIB_DIR}/../../include ABSOLUTE) # The AMD SDK currently does not place its headers # in /usr/include, therefore also search relative # to the library FIND_PATH(OPENCL_INCLUDE_DIRS CL/cl.h PATHS ${_OPENCL_INC_CAND} "/usr/local/cuda/include") FIND_PATH(_OPENCL_CPP_INCLUDE_DIRS CL/cl.hpp PATHS ${_OPENCL_INC_CAND} "/usr/local/cuda/include") ENDIF (WIN32) ENDIF (APPLE) FIND_PACKAGE_HANDLE_STANDARD_ARGS( OpenCL DEFAULT_MSG OPENCL_LIBRARIES OPENCL_INCLUDE_DIRS ) IF( _OPENCL_CPP_INCLUDE_DIRS ) SET( OPENCL_HAS_CPP_BINDINGS TRUE ) LIST( APPEND OPENCL_INCLUDE_DIRS ${_OPENCL_CPP_INCLUDE_DIRS} ) # This is often the same, so clean up LIST( REMOVE_DUPLICATES OPENCL_INCLUDE_DIRS ) ENDIF( _OPENCL_CPP_INCLUDE_DIRS ) MARK_AS_ADVANCED( OPENCL_INCLUDE_DIRS ) IF( OPENCL_INCLUDE_DIRS AND OPENCL_LIBRARIES ) SET( OPENCL_FOUND TRUE ) add_definitions( -DOPENCL=1 ) ELSE( OPENCL_INCLUDE_DIRS AND OPENCL_LIBRARIES ) SET( OPENCL_FOUND FALSE ) add_definitions( -DOPENCL=0 ) ENDIF( OPENCL_INCLUDE_DIRS AND OPENCL_LIBRARIES ) gnss-sdr-0.0.9/cmake/Modules/FindTeleorbit.cmake000066400000000000000000000014451305042567700215210ustar00rootroot00000000000000INCLUDE(FindPkgConfig) PKG_CHECK_MODULES(PC_TELEORBIT teleorbit) FIND_PATH( TELEORBIT_INCLUDE_DIRS NAMES teleorbit/api.h HINTS $ENV{TELEORBIT_DIR}/include ${PC_TELEORBIT_INCLUDEDIR} PATHS ${CMAKE_INSTALL_PREFIX}/include /usr/local/include /usr/include ) FIND_LIBRARY( TELEORBIT_LIBRARIES NAMES gnuradio-teleorbit HINTS $ENV{TELEORBIT_DIR}/lib ${PC_TELEORBIT_LIBDIR} PATHS ${CMAKE_INSTALL_PREFIX}/lib ${CMAKE_INSTALL_PREFIX}/lib64 /usr/local/lib /usr/local/lib64 /usr/lib /usr/lib64 ) INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(TELEORBIT DEFAULT_MSG TELEORBIT_LIBRARIES TELEORBIT_INCLUDE_DIRS) MARK_AS_ADVANCED(TELEORBIT_LIBRARIES TELEORBIT_INCLUDE_DIRS) gnss-sdr-0.0.9/cmake/Modules/FindUHD.cmake000066400000000000000000000032231305042567700202040ustar00rootroot00000000000000######################################################################## # Find the library for the USRP Hardware Driver ######################################################################## INCLUDE(FindPkgConfig) PKG_CHECK_MODULES(PC_UHD uhd) FIND_PATH( UHD_INCLUDE_DIRS NAMES uhd/config.hpp HINTS $ENV{UHD_DIR}/include ${PC_UHD_INCLUDEDIR} PATHS /usr/local/include /usr/include ${GNURADIO_INSTALL_PREFIX}/include ) FIND_LIBRARY( UHD_LIBRARIES NAMES uhd HINTS $ENV{UHD_DIR}/lib ${PC_UHD_LIBDIR} PATHS /usr/local/lib /usr/lib/x86_64-linux-gnu /usr/lib/i386-linux-gnu /usr/lib/arm-linux-gnueabihf /usr/lib/arm-linux-gnueabi /usr/lib/aarch64-linux-gnu /usr/lib/mipsel-linux-gnu /usr/lib/mips-linux-gnu /usr/lib/mips64el-linux-gnuabi64 /usr/lib/powerpc-linux-gnu /usr/lib/powerpc64-linux-gnu /usr/lib/powerpc64le-linux-gnu /usr/lib/powerpc-linux-gnuspe /usr/lib/hppa-linux-gnu /usr/lib/s390x-linux-gnu /usr/lib/i386-gnu /usr/lib/hppa-linux-gnu /usr/lib/x86_64-kfreebsd-gnu /usr/lib/i386-kfreebsd-gnu /usr/lib/m68k-linux-gnu /usr/lib/sh4-linux-gnu /usr/lib/sparc64-linux-gnu /usr/lib/x86_64-linux-gnux32 /usr/lib/alpha-linux-gnu /usr/lib64 /usr/lib ${GNURADIO_INSTALL_PREFIX}/lib ) INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(UHD DEFAULT_MSG UHD_LIBRARIES UHD_INCLUDE_DIRS) MARK_AS_ADVANCED(UHD_LIBRARIES UHD_INCLUDE_DIRS) gnss-sdr-0.0.9/cmake/Modules/FindVolk.cmake000066400000000000000000000033071305042567700205020ustar00rootroot00000000000000######################################################################## # Find VOLK (Vector-Optimized Library of Kernels) ######################################################################## INCLUDE(FindPkgConfig) PKG_CHECK_MODULES(PC_VOLK volk) FIND_PATH( VOLK_INCLUDE_DIRS NAMES volk/volk.h HINTS $ENV{VOLK_DIR}/include ${PC_VOLK_INCLUDEDIR} PATHS /usr/local/include /usr/include ${CMAKE_INSTALL_PREFIX}/include ) FIND_LIBRARY( VOLK_LIBRARIES NAMES volk HINTS $ENV{VOLK_DIR}/lib ${PC_VOLK_LIBDIR} PATHS /usr/local/lib /usr/local/lib64 /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/i386-linux-gnu /usr/lib/arm-linux-gnueabihf /usr/lib/arm-linux-gnueabi /usr/lib/aarch64-linux-gnu /usr/lib/mipsel-linux-gnu /usr/lib/mips-linux-gnu /usr/lib/mips64el-linux-gnuabi64 /usr/lib/powerpc-linux-gnu /usr/lib/powerpc64-linux-gnu /usr/lib/powerpc64le-linux-gnu /usr/lib/powerpc-linux-gnuspe /usr/lib/hppa-linux-gnu /usr/lib/s390x-linux-gnu /usr/lib/i386-gnu /usr/lib/hppa-linux-gnu /usr/lib/x86_64-kfreebsd-gnu /usr/lib/i386-kfreebsd-gnu /usr/lib/m68k-linux-gnu /usr/lib/sh4-linux-gnu /usr/lib/sparc64-linux-gnu /usr/lib/x86_64-linux-gnux32 /usr/lib/alpha-linux-gnu /usr/lib64 ${CMAKE_INSTALL_PREFIX}/lib ) INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(VOLK DEFAULT_MSG VOLK_LIBRARIES VOLK_INCLUDE_DIRS) MARK_AS_ADVANCED(VOLK_LIBRARIES VOLK_INCLUDE_DIRS VOLK_VERSION) gnss-sdr-0.0.9/cmake/Modules/FindVolkGnssSdr.cmake000066400000000000000000000020051305042567700220000ustar00rootroot00000000000000######################################################################## # Find VOLK (Vector-Optimized Library of Kernels) GNSS-SDR library ######################################################################## INCLUDE(FindPkgConfig) PKG_CHECK_MODULES(PC_VOLK_GNSSSDR volk_gnsssdr) FIND_PATH( VOLK_GNSSSDR_INCLUDE_DIRS NAMES volk_gnsssdr/volk_gnsssdr.h HINTS $ENV{VOLK_GNSSSDR_DIR}/include ${PC_VOLK_GNSSSDR_INCLUDEDIR} PATHS /usr/local/include /usr/include ${GNURADIO_INSTALL_PREFIX}/include ) FIND_LIBRARY( VOLK_GNSSSDR_LIBRARIES NAMES volk_gnsssdr HINTS $ENV{VOLK_GNSSSDR_DIR}/lib ${PC_VOLK_GNSSSDR_LIBDIR} PATHS /usr/local/lib /usr/local/lib64 /usr/lib /usr/lib64 ${GNURADIO_INSTALL_PREFIX}/lib ) INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(VOLK_GNSSSDR DEFAULT_MSG VOLK_GNSSSDR_LIBRARIES VOLK_GNSSSDR_INCLUDE_DIRS) MARK_AS_ADVANCED(VOLK_GNSSSDR_LIBRARIES VOLK_GNSSSDR_INCLUDE_DIRS)gnss-sdr-0.0.9/cmake/Modules/SetupPython.cmake000066400000000000000000000052411305042567700212670ustar00rootroot00000000000000######################################################################## # 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 set(Python_ADDITIONAL_VERSIONS 3.4 3.5 3.6) 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 python3) 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(GNSSSDR_PYTHON_CHECK_MODULE desc mod cmd have) message(STATUS "Python checking for ${desc}") execute_process( COMMAND ${PYTHON_EXECUTABLE} -c " ######################################### try: import ${mod} except: try: ${mod} except: exit(-1) try: assert ${cmd} except: exit(-1) #########################################" 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(GNSSSDR_PYTHON_CHECK_MODULE) gnss-sdr-0.0.9/cmake/Modules/TestForARM.cmake000066400000000000000000000102561305042567700207150ustar00rootroot00000000000000############################################################################## # check if the compiler defines the architecture as ARM and set the # version, if found. # # - Anthony Arnold ############################################################################## if (__TEST_FOR_ARM_INCLUDED) return () endif() set(__TEST_FOR_ARM_INCLUDED TRUE) # Function checks if the input string defines ARM version and sets the # output variable if found. function(check_arm_version ppdef input_string version output_var) string(REGEX MATCH "${ppdef}" _VERSION_MATCH "${input_string}") if (NOT _VERSION_MATCH STREQUAL "") set(${output_var} "${version}" PARENT_SCOPE) endif(NOT _VERSION_MATCH STREQUAL "") endfunction() message(STATUS "Checking for ARM") set (IS_ARM NO) set (ARM_VERSION "") if (CMAKE_COMPILER_IS_GNUCXX) execute_process(COMMAND echo "int main(){}" COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1} -dM -E - OUTPUT_VARIABLE TEST_FOR_ARM_RESULTS) string(REGEX MATCH "__arm" ARM_FOUND "${TEST_FOR_ARM_RESULTS}") if(ARM_FOUND STREQUAL "") string(REGEX MATCH "__aarch64" ARM_FOUND "${TEST_FOR_ARM_RESULTS}") endif(ARM_FOUND STREQUAL "") if (NOT ARM_FOUND STREQUAL "") set(IS_ARM YES) message(STATUS "ARM system detected") # detect the version check_arm_version("__ARM_ARCH_2__" ${TEST_FOR_ARM_RESULTS} "armv2" ARM_VERSION) check_arm_version("__ARM_ARCH_2A__" ${TEST_FOR_ARM_RESULTS} "armv2a" ARM_VERSION) check_arm_version("__ARM_ARCH_3__" ${TEST_FOR_ARM_RESULTS} "armv3" ARM_VERSION) check_arm_version("__ARM_ARCH_3M__" ${TEST_FOR_ARM_RESULTS} "armv3m" ARM_VERSION) check_arm_version("__ARM_ARCH_4__" ${TEST_FOR_ARM_RESULTS} "armv4" ARM_VERSION) check_arm_version("__ARM_ARCH_4T__" ${TEST_FOR_ARM_RESULTS} "armv4t" ARM_VERSION) check_arm_version("__ARM_ARCH_5__" ${TEST_FOR_ARM_RESULTS} "armv5" ARM_VERSION) check_arm_version("__ARM_ARCH_5T__" ${TEST_FOR_ARM_RESULTS} "armv5t" ARM_VERSION) check_arm_version("__ARM_ARCH_5E__" ${TEST_FOR_ARM_RESULTS} "armv5e" ARM_VERSION) check_arm_version("__ARM_ARCH_5TE__" ${TEST_FOR_ARM_RESULTS} "armv5te" ARM_VERSION) check_arm_version("__ARM_ARCH_6__" ${TEST_FOR_ARM_RESULTS} "armv6" ARM_VERSION) check_arm_version("__ARM_ARCH_6J__" ${TEST_FOR_ARM_RESULTS} "armv6j" ARM_VERSION) check_arm_version("__ARM_ARCH_6K__" ${TEST_FOR_ARM_RESULTS} "armv6k" ARM_VERSION) check_arm_version("__ARM_ARCH_6T2__" ${TEST_FOR_ARM_RESULTS} "armv6t2" ARM_VERSION) check_arm_version("__ARM_ARCH_6Z__" ${TEST_FOR_ARM_RESULTS} "armv6z" ARM_VERSION) check_arm_version("__ARM_ARCH_6ZK__" ${TEST_FOR_ARM_RESULTS} "armv6zk" ARM_VERSION) check_arm_version("__ARM_ARCH_6M__" ${TEST_FOR_ARM_RESULTS} "armv6-m" ARM_VERSION) check_arm_version("__ARM_ARCH_7__" ${TEST_FOR_ARM_RESULTS} "armv7" ARM_VERSION) check_arm_version("__ARM_ARCH_7A__" ${TEST_FOR_ARM_RESULTS} "armv7-a" ARM_VERSION) check_arm_version("__ARM_ARCH_7M__" ${TEST_FOR_ARM_RESULTS} "armv7-m" ARM_VERSION) check_arm_version("__ARM_ARCH_7R__" ${TEST_FOR_ARM_RESULTS} "armv7-r" ARM_VERSION) check_arm_version("__ARM_ARCH_7EM_" ${TEST_FOR_ARM_RESULTS} "armv7e-m" ARM_VERSION) check_arm_version("__ARM_ARCH_7VE__" ${TEST_FOR_ARM_RESULTS} "armv7ve" ARM_VERSION) check_arm_version("__ARM_ARCH_8A__" ${TEST_FOR_ARM_RESULTS} "armv8-a" ARM_VERSION) check_arm_version("__ARM_ARCH_8A" ${TEST_FOR_ARM_RESULTS} "armv8-a" ARM_VERSION) # anything else just define as arm if (ARM_VERSION STREQUAL "") message(STATUS "Couldn't detect ARM version. Setting to 'arm'") set(ARM_VERSION "arm") else (ARM_VERSION STREQUAL "") message(STATUS "ARM version ${ARM_VERSION} detected") endif (ARM_VERSION STREQUAL "") else (NOT ARM_FOUND STREQUAL "") message(STATUS "System is not ARM") endif(NOT ARM_FOUND STREQUAL "") else (CMAKE_COMPILE_IS_GNUCXX) # TODO: Other compilers message(STATUS "Not detecting ARM on non-GNUCXX compiler. Defaulting to false") message(STATUS "If you are compiling for ARM, set IS_ARM=ON manually") endif(CMAKE_COMPILER_IS_GNUCXX) set(IS_ARM ${IS_ARM} CACHE BOOL "Compiling for ARM") set(ARM_VERSION ${ARM_VERSION} CACHE STRING "ARM version") gnss-sdr-0.0.9/cmake/Modules/TestForSSE.cmake000066400000000000000000000026011305042567700207230ustar00rootroot00000000000000############################################################################### # Test for availability of SSE # # - Anthony Arnold ############################################################################### function (test_for_sse h_file result_var name) if (NOT DEFINED ${result_var}) execute_process(COMMAND echo "#include <${h_file}>" COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1} -c -x c++ - RESULT_VARIABLE COMPILE_RESULT OUTPUT_QUIET ERROR_QUIET) set(detected 0) if (COMPILE_RESULT EQUAL 0) message(STATUS "Detected ${name}") set(detected 1) endif(COMPILE_RESULT EQUAL 0) set(${result_var} ${detected} CACHE INTERNAL "${name} Available") endif (NOT DEFINED ${result_var}) endfunction(test_for_sse) message(STATUS "Testing for SIMD extensions") enable_language(C) test_for_sse("ammintrin.h" SSE4A_AVAILABLE "SSE4A") test_for_sse("nmmintrin.h" SSE4_2_AVAILABLE "SSE4.2") test_for_sse("smmintrin.h" SSE4_1_AVAILABLE "SSE4.1") test_for_sse("tmmintrin.h" SSSE3_AVAILABLE "SSSE3") test_for_sse("pmmintrin.h" SSE3_AVAILABLE "SSE3") test_for_sse("emmintrin.h" SSE2_AVAILABLE "SSE2") test_for_sse("xmmintrin.h" SSE_AVAILABLE "SSE1") test_for_sse("mmintrin.h" MMX_AVAILABLE "MMX") test_for_sse("wmmintrin.h" AES_AVAILABLE "AES") test_for_sse("immintrin.h" AVX_AVAILABLE "AVX") file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/-.o") gnss-sdr-0.0.9/cmake/Toolchains/000077500000000000000000000000001305042567700164545ustar00rootroot00000000000000gnss-sdr-0.0.9/cmake/Toolchains/oe-sdk_cross.cmake000066400000000000000000000017761305042567700220640ustar00rootroot00000000000000########################################################## # Toolchain file for Open Embedded ########################################################## set( CMAKE_SYSTEM_NAME Linux ) string(REGEX MATCH "sysroots/([a-zA-Z0-9]+)" CMAKE_SYSTEM_PROCESSOR $ENV{SDKTARGETSYSROOT}) string(REGEX REPLACE "sysroots/" "" CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR}) set( CMAKE_CXX_FLAGS $ENV{CXXFLAGS} CACHE STRING "" FORCE ) set( CMAKE_C_FLAGS $ENV{CFLAGS} CACHE STRING "" FORCE ) #same flags for C sources set( CMAKE_LDFLAGS_FLAGS ${CMAKE_CXX_FLAGS} CACHE STRING "" FORCE ) #same flags for C sources set( CMAKE_LIBRARY_PATH $ENV{OECORE_TARGET_SYSROOT}/usr/lib ) set( CMAKE_FIND_ROOT_PATH $ENV{OECORE_TARGET_SYSROOT} $ENV{OECORE_NATIVE_SYSROOT} ) set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER ) set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY ) set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY ) set ( ORC_INCLUDE_DIRS $ENV{OECORE_TARGET_SYSROOT}/usr/include/orc-0.4 ) set ( ORC_LIBRARY_DIRS $ENV{OECORE_TARGET_SYSROOT}/usr/lib ) gnss-sdr-0.0.9/cmake/Toolchains/zynq-7000.cmake000066400000000000000000000020271305042567700210440ustar00rootroot00000000000000########################################################## # Toolchain file for Zynq-7000 devices ########################################################## set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_VERSION 1) set(CMAKE_SYSROOT /home/carlesfernandez/binary) ### POINT THIS TO YOUR ROOTFS set(CMAKE_C_COMPILER /usr/bin/arm-linux-gnueabihf-gcc) set(CMAKE_CXX_COMPILER /usr/bin/arm-linux-gnueabihf-g++) set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT} ) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(ZYNQ_FLAGS "-march=armv7-a -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a7") set(CMAKE_ASM_FLAGS ${ZYNQ_FLAGS} CACHE STRING "" FORCE) set(CMAKE_C_FLAGS ${ZYNQ_FLAGS} CACHE STRING "" FORCE) set(CMAKE_CXX_FLAGS ${ZYNQ_FLAGS} CACHE STRING "" FORCE) set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/usr/lib ${CMAKE_SYSROOT}/usr/lib/arm-linux-gnueabihf) set(CMAKE_INSTALL_PREFIX ${CMAKE_SYSROOT}/usr CACHE STRING "" FORCE)gnss-sdr-0.0.9/cmake/cmake_uninstall.cmake.in000066400000000000000000000020121305042567700211240ustar00rootroot00000000000000if(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") message(FATAL_ERROR "Cannot find install manifest: @CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") endif(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) string(REGEX REPLACE "\n" ";" files "${files}") foreach(file ${files}) message(STATUS "Uninstalling $ENV{DESTDIR}${file}") if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") exec_program( "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" OUTPUT_VARIABLE rm_out RETURN_VALUE rm_retval ) if(NOT "${rm_retval}" STREQUAL 0) message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}") endif(NOT "${rm_retval}" STREQUAL 0) else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") message(STATUS "File $ENV{DESTDIR}${file} does not exist.") endif(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") endforeach(file)gnss-sdr-0.0.9/conf/000077500000000000000000000000001305042567700142165ustar00rootroot00000000000000gnss-sdr-0.0.9/conf/front-end-cal.conf000066400000000000000000000172621305042567700175260ustar00rootroot00000000000000; Default configuration file ; You can define your own front-end calibration tool configuration and invoke it by doing ; ./front-end-cal --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### INITIAL RECEIVER POSITIION ###### ; san francisco scenario ;GNSS-SDR.init_latitude_deg=40.74846557442795 ;GNSS-SDR.init_longitude_deg=-73.98593961814200 ;GNSS-SDR.init_altitude_m=329.11968943169342 ; Barcelona CTTC GNSS-SDR.init_latitude_deg=41.27719585553101 GNSS-SDR.init_longitude_deg=1.988782985790802 GNSS-SDR.init_altitude_m=10 ; Mozoncillo ;GNSS-SDR.init_latitude_deg=41.14534824586196 ;GNSS-SDR.init_longitude_deg=-4.187125019737464 ;GNSS-SDR.init_altitude_m=900 ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=2000000 ;######### SUPL RRLP GPS assistance configuration ##### ; Check http://www.mcc-mnc.com/ ; On Android: https://play.google.com/store/apps/details?id=net.its_here.cellidinfo&hl=en GNSS-SDR.SUPL_gps_enabled=true GNSS-SDR.SUPL_read_gps_assistance_xml=false GNSS-SDR.SUPL_gps_ephemeris_server=supl.google.com GNSS-SDR.SUPL_gps_ephemeris_port=7275 GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com GNSS-SDR.SUPL_gps_acquisition_port=7275 GNSS-SDR.SUPL_MCC=217 GNSS-SDR.SUPL_MNS=7 GNSS-SDR.SUPL_LAC=861 GNSS-SDR.SUPL_CI=40184 ;######### SIGNAL_SOURCE CONFIG ############ ;#implementation: Use [File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] or [Osmosdr_Signal_Source] SignalSource.implementation=Osmosdr_Signal_Source SignalSource.AGC_enabled=false ;#filename: path to file with the captured GNSS signal samples to be processed ;SignalSource.filename=/datalogger/signals/RTL-SDR/cap_-90dBm_IF15_RF40_EzCap.dat SignalSource.filename=/datalogger/signals/Agilent/New York/2msps.dat ;SignalSource.filename=/datalogger/signals/RTL-SDR/geo/pmt4_no_amp.dat ;SignalSource.filename=/datalogger/signals/RTL-SDR/geo/pmt4_no_amp_mini.dat ;SignalSource.filename=/datalogger/signals/RTL-SDR/mozoncillo/cap_mozon_ezcap.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. SignalSource.item_type=gr_complex ;#sampling_frequency: Original Signal sampling frequency in [Hz] SignalSource.sampling_frequency=2000000 ;#freq: RF front-end center frequency in [Hz] SignalSource.freq=1575420000 ;#gain: Front-end Gain in [dB] SignalSource.gain=40 SignalSource.rf_gain=40 SignalSource.if_gain=30 ;#subdevice: UHD subdevice specification (for USRP1 use A:0 or B:0) SignalSource.subdevice=B:0 ;#samples: Number of samples to be processed. Notice that 0 indicates the entire file. SignalSource.samples=0 ;#repeat: Repeat the processing file. SignalSource.repeat=false ;#dump: Dump the Signal source data to a file. SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat ;######### SIGNAL_CONDITIONER CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. ;#implementation: Use [Pass_Through] or [Signal_Conditioner] ;#[Pass_Through] disables this block and the [DataTypeAdapter], [InputFilter] and [Resampler] blocks ;#[Signal_Conditioner] enables this block. Then you have to configure [DataTypeAdapter], [InputFilter] and [Resampler] blocks SignalConditioner.implementation=Pass_Through ;######### DATA_TYPE_ADAPTER CONFIG ############ ;## Changes the type of input data. Please disable it in this version. ;#implementation: Use [Ishort_To_Complex] or [Pass_Through] DataTypeAdapter.implementation=Pass_Through ;#dump: Dump the filtered data to a file. DataTypeAdapter.dump=false ;#dump_filename: Log path and filename. DataTypeAdapter.dump_filename=../data/data_type_adapter.dat ;######### INPUT_FILTER CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. InputFilter.implementation=Freq_Xlating_Fir_Filter ;#dump: Dump the filtered data to a file. InputFilter.dump=false ;#dump_filename: Log path and filename. InputFilter.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse reponse given a set of band edges, the desired reponse on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter.band1_begin=0.0 ;InputFilter.band1_end=0.8 InputFilter.band1_end=0.85 InputFilter.band2_begin=0.90 InputFilter.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter.ampl1_begin=1.0 InputFilter.ampl1_end=1.0 InputFilter.ampl2_begin=0.0 InputFilter.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter.band1_error=1.0 InputFilter.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter.IF is the intermediate frequency (in Hz) shifted down to zero Hz InputFilter.sampling_frequency=2000000 InputFilter.IF=0 InputFilter.decimation_factor=1 ;######### RESAMPLER CONFIG ############ ;## Resamples the input data. ;#implementation: Use [Pass_Through] or [Direct_Resampler] ;#[Pass_Through] disables this block Resampler.implementation=Pass_Through ;######### ACQUISITION GLOBAL CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition.dump=false ;#filename: Log path and filename Acquisition.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition.sampled_ms=1 ;#threshold: Acquisition threshold Acquisition.threshold=0.015 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition.doppler_max=100000 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition.doppler_min=-100000 ;#doppler_step Doppler step in the grid search [Hz] Acquisition.doppler_step=500 ;#maximum dwells Acquisition.max_dwells=15 gnss-sdr-0.0.9/conf/gnss-sdr.conf000066400000000000000000000272051305042567700166330ustar00rootroot00000000000000; Default configuration file ; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=4000000 ;######### SUPL RRLP GPS assistance configuration ##### ; Check http://www.mcc-mnc.com/ ; On Android: https://play.google.com/store/apps/details?id=net.its_here.cellidinfo&hl=en GNSS-SDR.SUPL_gps_enabled=false GNSS-SDR.SUPL_read_gps_assistance_xml=true GNSS-SDR.SUPL_gps_ephemeris_server=supl.google.com GNSS-SDR.SUPL_gps_ephemeris_port=7275 GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com GNSS-SDR.SUPL_gps_acquisition_port=7275 GNSS-SDR.SUPL_MCC=244 GNSS-SDR.SUPL_MNS=5 GNSS-SDR.SUPL_LAC=0x59e2 GNSS-SDR.SUPL_CI=0x31b0 ;######### SIGNAL_SOURCE CONFIG ############ ;#implementation: Use [File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) SignalSource.implementation=File_Signal_Source ;#filename: path to file with the captured GNSS signal samples to be processed SignalSource.filename=/datalogger/signals/CTTC/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN.dat ; <- PUT YOUR FILE HERE ;#item_type: Type and resolution for each of the signal samples. SignalSource.item_type=ishort ;#sampling_frequency: Original Signal sampling frequency in [Hz] SignalSource.sampling_frequency=4000000 ;#freq: RF front-end center frequency in [Hz] SignalSource.freq=1575420000 ;#samples: Number of samples to be processed. Notice that 0 indicates the entire file. SignalSource.samples=0 ;#repeat: Repeat the processing file. SignalSource.repeat=false ;#dump: Dump the Signal source data to a file. Disable this option in this version SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat ;#enable_throttle_control: Enabling this option tells the signal source to keep the delay between samples in post processing. ; it helps to not overload the CPU, but the processing time will be longer. SignalSource.enable_throttle_control=false ;######### SIGNAL_CONDITIONER CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. ;#implementation: Use [Pass_Through] or [Signal_Conditioner] ;#[Pass_Through] disables this block and the [DataTypeAdapter], [InputFilter] and [Resampler] blocks ;#[Signal_Conditioner] enables this block. Then you have to configure [DataTypeAdapter], [InputFilter] and [Resampler] blocks SignalConditioner.implementation=Signal_Conditioner ;SignalConditioner.implementation=Pass_Through ;######### DATA_TYPE_ADAPTER CONFIG ############ ;## Changes the type of input data. ;#implementation: [Pass_Through] disables this block DataTypeAdapter.implementation=Ishort_To_Complex ;DataTypeAdapter.implementation=Pass_Through ;######### INPUT_FILTER CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. ;InputFilter.implementation=Fir_Filter ;InputFilter.implementation=Freq_Xlating_Fir_Filter InputFilter.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter.dump=false ;#dump_filename: Log path and filename. InputFilter.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of GNU Radio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter impulse response given a set of band edges, the desired response on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. InputFilter.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. InputFilter.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter.band1_begin=0.0 InputFilter.band1_end=0.44 InputFilter.band2_begin=0.55 InputFilter.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter.ampl1_begin=1.0 InputFilter.ampl1_end=1.0 InputFilter.ampl2_begin=0.0 InputFilter.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter.band1_error=1.0 InputFilter.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter.IF is the intermediate frequency (in Hz) shifted down to zero Hz InputFilter.sampling_frequency=4000000 InputFilter.IF=0 ;######### RESAMPLER CONFIG ############ ;## Resamples the input data. ;#implementation: Use [Pass_Through] or [Direct_Resampler] ;#[Pass_Through] disables this block ;#[Direct_Resampler] enables a resampler that implements a nearest neighborhood interpolation ;Resampler.implementation=Direct_Resampler Resampler.implementation=Pass_Through ;#dump: Dump the resampled data to a file. Resampler.dump=false ;#dump_filename: Log path and filename. Resampler.dump_filename=../data/resampler.dat ;#item_type: Type and resolution for each of the signal samples. Resampler.item_type=gr_complex ;#sample_freq_in: the sample frequency of the input signal Resampler.sample_freq_in=4000000 ;#sample_freq_out: the desired sample frequency of the output signal Resampler.sample_freq_out=2000000 ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available GPS L1 C/A satellite channels. Channels_1C.count=6 ;#count: Number of available Galileo E1B satellite channels. Channels_1B.count=0 ;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver Channels.in_acquisition=1 ;#if the option is disabled by default is assigned "1C" GPS L1 C/A Channel.signal=1C ;######### SPECIFIC CHANNELS CONFIG ###### ;#The following options are specific to each channel and overwrite the generic options ;######### CHANNEL 0 CONFIG ############ ;Channel0.signal=1C ;#satellite: Satellite PRN ID for this channel. Disable this option for random search ;Channel0.satellite=11 ;######### CHANNEL 1 CONFIG ############ ;Channel1.signal=1C ;Channel1.satellite=18 ;######### ACQUISITION GLOBAL CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1C.dump=false ;#filename: Log path and filename Acquisition_1C.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Acquisition_1C.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_1C.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1C.sampled_ms=1 ;#implementation: Acquisition algorithm selection for this channel Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition_Fine_Doppler ;#threshold: Acquisition threshold Acquisition_1C.threshold=0.005 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] ;Acquisition_1C.pfa=0.0001 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1C.doppler_max=10000 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1C.doppler_min=-10000 ;#doppler_step Doppler step in the grid search [Hz] Acquisition_1C.doppler_step=500 ;#maximum dwells Acquisition_1C.max_dwells=5 ;######### TRACKING GLOBAL CONFIG ############ ;#implementation: Selected tracking algorithm: Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking ;#item_type: Type and resolution for each of the signal samples. Tracking_1C.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_1C.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_1C.dump=false ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_1C.dump_filename=../data/epl_tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1C.pll_bw_hz=45.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_1C.dll_bw_hz=3.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_1C.order=3; ;######### TELEMETRY DECODER GPS CONFIG ############ ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L1 C/A TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false ;#decimation factor TelemetryDecoder_1C.decimation_factor=1; ;######### OBSERVABLES CONFIG ############ ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. Observables.implementation=GPS_L1_CA_Observables ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] Observables.dump=false ;#dump_filename: Log path and filename. Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ ;#implementation: Position Velocity and Time (PVT) implementation algorithm: PVT.implementation=GPS_L1_CA_PVT ;#averaging_depth: Number of PVT observations in the moving average algorithm PVT.averaging_depth=100 ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.flag_averaging=true ;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time (for GPS CA L1 is 1ms) [ms] PVT.output_rate_ms=10 ;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms <= display_rate_ms. PVT.display_rate_ms=500 ;# KML, GeoJSON, NMEA and RTCM output configuration ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump, ".kml" and ".geojson" to GIS-friendly formats. PVT.dump_filename=./PVT ;#nmea_dump_filename: NMEA log path and filename PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea ;#flag_nmea_tty_port: Enables or disables the NMEA log to a serial TTY port (Can be used with real hardware or virtual one) PVT.flag_nmea_tty_port=true ;#nmea_dump_devname: serial device descriptor for NMEA logging PVT.nmea_dump_devname=/dev/pts/4 ;#flag_rtcm_server: Enables or disables a TCP/IP server transmitting RTCM 3.2 messages (accepts multiple clients, port 2101 by default) PVT.flag_rtcm_server=true ;#flag_rtcm_tty_port: Enables or disables the RTCM log to a serial TTY port (Can be used with real hardware or virtual one) PVT.flag_rtcm_tty_port=false ;#rtcm_dump_devname: serial device descriptor for RTCM logging PVT.rtcm_dump_devname=/dev/pts/1 ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump=false gnss-sdr-0.0.9/conf/gnss-sdr_GPS_L1_GN3S_realtime.conf000066400000000000000000000070241305042567700223510ustar00rootroot00000000000000; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=2727933.33 ; 8183800/3 ;######### SIGNAL_SOURCE CONFIG ############ ;#implementation: Use [File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) ;#Notes for GN3S source: ; - The front-end sampling frequency is fixed to 8.1838 MSPS (8183800 Hz). ; - The baseband signal is shifted to an IF of 38400 Hz. It should be corrected with the signal conditioner block GNSS-SDR.internal_fs_hz=2727933.33 ; 8183800/3 ;######### SIGNAL_SOURCE CONFIG ############ SignalSource.implementation=GN3S_Signal_Source SignalSource.item_type=gr_complex SignalSource.sampling_frequency=8183800 SignalSource.dump=false SignalSource.dump_filename=../signal_source.dat ;######### SIGNAL_CONDITIONER CONFIG ############ SignalConditioner.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER CONFIG ############ DataTypeAdapter.implementation=Pass_Through ;######### INPUT_FILTER CONFIG ############ InputFilter.implementation=Freq_Xlating_Fir_Filter InputFilter.dump=false InputFilter.dump_filename=../data/input_filter.dat InputFilter.input_item_type=gr_complex InputFilter.output_item_type=gr_complex InputFilter.taps_item_type=float InputFilter.number_of_taps=5 InputFilter.number_of_bands=2 InputFilter.band1_begin=0.0 InputFilter.band1_end=0.45 InputFilter.band2_begin=0.55 InputFilter.band2_end=1.0 InputFilter.ampl1_begin=1.0 InputFilter.ampl1_end=1.0 InputFilter.ampl2_begin=0.0 InputFilter.ampl2_end=0.0 InputFilter.band1_error=1.0 InputFilter.band2_error=1.0 InputFilter.filter_type=bandpass InputFilter.grid_density=16 InputFilter.sampling_frequency=8183800 InputFilter.IF=38400 InputFilter.decimation_factor=3 ;######### RESAMPLER CONFIG ############ Resampler.implementation=Pass_Through Resampler.dump=false Resampler.dump_filename=../data/resampler.dat ;######### CHANNELS GLOBAL CONFIG ############ Channels_1C.count=5 Channels.in_acquisition=1 Channel.signal=1C ;######### ACQUISITION GLOBAL CONFIG ############ Acquisition_1C.dump=false Acquisition_1C.dump_filename=./acq_dump.dat Acquisition_1C.item_type=gr_complex Acquisition_1C.if=0 Acquisition_1C.sampled_ms=1 Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition_1C.threshold=0.008 Acquisition_1C.doppler_max=10000 Acquisition_1C.doppler_step=500 ;######### TRACKING GLOBAL CONFIG ############ Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking Tracking_1C.item_type=gr_complex Tracking_1C.if=0 Tracking_1C.dump=false Tracking_1C.dump_filename=../data/epl_tracking_ch_ Tracking_1C.pll_bw_hz=45.0; Tracking_1C.dll_bw_hz=2.0; Tracking_1C.order=3; ;######### TELEMETRY DECODER GPS CONFIG ############ TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false TelemetryDecoder_1C.decimation_factor=1; ;######### OBSERVABLES CONFIG ############ Observables.implementation=GPS_L1_CA_Observables Observables.dump=false. Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ PVT.implementation=GPS_L1_CA_PVT PVT.averaging_depth=100 PVT.flag_averaging=false PVT.output_rate_ms=10 PVT.display_rate_ms=500 PVT.dump_filename=./PVT PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea PVT.flag_nmea_tty_port=false; PVT.nmea_dump_devname=/dev/pts/4 PVT.dump=false PVT.flag_rtcm_server=false PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 gnss-sdr-0.0.9/conf/gnss-sdr_GPS_L1_SPIR.conf000066400000000000000000000275571305042567700205470ustar00rootroot00000000000000; Default configuration file ; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=4000000 ;######### SIGNAL_SOURCE CONFIG ############ ;#implementation: Use [File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) SignalSource.implementation=Spir_File_Signal_Source ;#filename: path to file with the captured GNSS signal samples to be processed SignalSource.filename=/dtalogger/signals/spir/data/20Secs/20Secs_L1.dat ; <- PUT YOUR FILE HERE ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. SignalSource.item_type=int ;#sampling_frequency: Original Signal sampling frequency in [Hz] SignalSource.sampling_frequency=80000000 ;#samples: Number of samples to be processed. Notice that 0 indicates the entire file. SignalSource.samples=0 ;#repeat: Repeat the processing file. Disable this option in this version SignalSource.repeat=false ;#dump: Dump the Signal source data to a file. Disable this option in this version SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat ;#enable_throttle_control: Enabling this option tells the signal source to keep the delay between samples in post processing. ; it helps to not overload the CPU, but the processing time will be longer. SignalSource.enable_throttle_control=false ;######### SIGNAL_CONDITIONER CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. ;#implementation: Use [Pass_Through] or [Signal_Conditioner] ;#[Pass_Through] disables this block and the [DataTypeAdapter], [InputFilter] and [Resampler] blocks ;#[Signal_Conditioner] enables this block. Then you have to configure [DataTypeAdapter], [InputFilter] and [Resampler] blocks SignalConditioner.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER CONFIG ############ ;## Changes the type of input data. Please disable it in this version. ;#implementation: [Pass_Through] disables this block DataTypeAdapter.implementation=Pass_Through DataTypeAdapter.item_type=float ;######### INPUT_FILTER CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. ;InputFilter.implementation=Fir_Filter InputFilter.implementation=Freq_Xlating_Fir_Filter ;InputFilter.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter.dump=false ;#dump_filename: Log path and filename. InputFilter.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse reponse given a set of band edges, the desired reponse on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter.input_item_type=float ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter.band1_begin=0.0 InputFilter.band1_end=0.45 InputFilter.band2_begin=0.55 InputFilter.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter.ampl1_begin=1.0 InputFilter.ampl1_end=1.0 InputFilter.ampl2_begin=0.0 InputFilter.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter.band1_error=1.0 InputFilter.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter.IF is the intermediate frequency (in Hz) shifted down to zero Hz InputFilter.sampling_frequency=80000000 InputFilter.IF=10164 InputFilter.decimation_factor=20 ;######### RESAMPLER CONFIG ############ ;## Resamples the input data. ;#implementation: Use [Pass_Through] or [Direct_Resampler] ;#[Pass_Through] disables this block ;#[Direct_Resampler] enables a resampler that implements a nearest neigbourhood interpolation ;Resampler.implementation=Direct_Resampler Resampler.implementation=Pass_Through ;#dump: Dump the resamplered data to a file. Resampler.dump=false ;#dump_filename: Log path and filename. Resampler.dump_filename=../data/resampler.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Resampler.item_type=gr_complex ;#sample_freq_in: the sample frequency of the input signal Resampler.sample_freq_in=80000000 ;#sample_freq_out: the desired sample frequency of the output signal Resampler.sample_freq_out=4000000 ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available GPS satellite channels. Channels_1C.count=10 ;#count: Number of available Galileo satellite channels. Channels_1B.count=0 ;#in_acquisition: Number of channels simultaneously acquiring Channels.in_acquisition=1 ;#signal: ;# "1C" GPS L1 C/A ;# "1B" Galileo E1B Channel.signal=1C ;Galileo FM3 -> PRN 19 ;Galileo FM4 -> PRN 20 ;######### CHANNEL 0 CONFIG ############ ;Channel0.signal=1B ;#satellite: Satellite PRN ID for this channel. Disable this option to random search ;Channel0.satellite=20 ;######### CHANNEL 1 CONFIG ############ ;Channel1.signal=1B ;Channel1.satellite=12 ;######### CHANNEL 2 CONFIG ############ ;Channel2.signal=1B ;#satellite: Satellite PRN ID for this channel. Disable this option to random search ;Channel2.satellite=11 ;######### CHANNEL 3 CONFIG ############ ;Channel3.signal=1B ;Channel3.satellite=19 ;######### ACQUISITION GLOBAL CONFIG ############ _1C ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1C.dump=false ;#filename: Log path and filename Acquisition_1C.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1C.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_1C.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1C.sampled_ms=1 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition_Fine_Doppler ;#threshold: Acquisition threshold Acquisition_1C.threshold=0.005 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] ;Acquisition_1C.pfa=0.0001 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1C.doppler_max=10000 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1C.doppler_min=-10000 ;#doppler_step Doppler step in the grid search [Hz] Acquisition_1C.doppler_step=500 ;#maximum dwells Acquisition_1C.max_dwells=5 ;######### ACQUISITION CHANNELS CONFIG ###### ;######### ACQUISITION CH 0 CONFIG ############ ;#repeat_satellite: Use only jointly with the satellite PRN ID option. The default value is false ;Acquisition0.repeat_satellite = true ;Acquisition1.repeat_satellite = true ;Acquisition2.repeat_satellite = true ;Acquisition3.repeat_satellite = true ;#cboc: Only for [Galileo_E1_PCPS_Ambiguous_Acquisition]. This option allows you to choose between acquiring with CBOC signal [true] or sinboc(1,1) signal [false]. ;#Use only if GNSS-SDR.internal_fs_hz is greater than or equal to 6138000 Acquisition0.cboc=false ;######### ACQUISITION CH 1 CONFIG ############ Acquisition1.cboc=false ;######### TRACKING GLOBAL CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_PLL_C_Aid_Tracking] or [GPS_L1_CA_TCP_CONNECTOR_Tracking] or [Galileo_E1_DLL_PLL_VEML_Tracking] Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking ;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version. Tracking_1C.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_1C.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_1C.dump=false ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_1C.dump_filename=../data/epl_tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1C.pll_bw_hz=20.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_1C.dll_bw_hz=2.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_1C.order=3; ;######### TELEMETRY DECODER GPS CONFIG ############ ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L1 C/A TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false ;#decimation factor TelemetryDecoder_1C.decimation_factor=1; ;######### OBSERVABLES CONFIG ############ ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. Observables.implementation=GPS_L1_CA_Observables ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] Observables.dump=false ;#dump_filename: Log path and filename. Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ ;#implementation: Position Velocity and Time (PVT) implementation algorithm: Use [GPS_L1_CA_PVT] in this version. PVT.implementation=GPS_L1_CA_PVT ;#averaging_depth: Number of PVT observations in the moving average algorithm PVT.averaging_depth=100 ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.flag_averaging=true ;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time (for GPS CA L1 is 1ms) [ms] PVT.output_rate_ms=500 ;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms<=display_rate_ms. PVT.display_rate_ms=500 ;# RINEX, KML, and NMEA output configuration ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump and ".kml" to GoogleEarth dump. PVT.dump_filename=./PVT ;#nmea_dump_filename: NMEA log path and filename PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; ;#flag_nmea_tty_port: Enable or disable the NMEA log to a serial TTY port (Can be used with real hardware or virtual one) PVT.flag_nmea_tty_port=true; ;#nmea_dump_devname: serial device descriptor for NMEA logging PVT.nmea_dump_devname=/dev/pts/4 ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump=false gnss-sdr-0.0.9/conf/gnss-sdr_GPS_L1_USRP_X300_realtime.conf000066400000000000000000000317451305042567700231510ustar00rootroot00000000000000; Configuration file for using USRP X300 as a RF front-end for GPS L1 signals. ; Set SignalSource.device_address to the IP address of your device ; and run: ; gnss-sdr --config_file=/path/to/gnss-sdr_GPS_L1_USRP_X300_realtime_new.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=4000000 ;######### SUPL RRLP GPS assistance configuration ##### ; Check http://www.mcc-mnc.com/ ; On Android: https://play.google.com/store/apps/details?id=net.its_here.cellidinfo&hl=en GNSS-SDR.SUPL_gps_enabled=false GNSS-SDR.SUPL_read_gps_assistance_xml=true GNSS-SDR.SUPL_gps_ephemeris_server=supl.google.com GNSS-SDR.SUPL_gps_ephemeris_port=7275 GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com GNSS-SDR.SUPL_gps_acquisition_port=7275 GNSS-SDR.SUPL_MCC=244 GNSS-SDR.SUPL_MNS=5 GNSS-SDR.SUPL_LAC=0x59e2 GNSS-SDR.SUPL_CI=0x31b0 ;######### SIGNAL_SOURCE CONFIG ############ ; # implementation: Use [File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) SignalSource.implementation=UHD_Signal_Source ; # When left empty, the device discovery routines will search all vailable transports on the system (ethernet, usb...) SignalSource.device_address=192.168.40.2 ; <- PUT THE IP ADDRESS OF YOUR USRP HERE ; # item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. ;SignalSource.item_type=gr_complex SignalSource.item_type=cshort ; # sampling_frequency: Original Signal sampling frequency in [Hz] SignalSource.sampling_frequency=4000000 ; # freq: RF front-end center frequency in [Hz] SignalSource.freq=1575420000 ; # gain: Front-end Gain in [dB] SignalSource.gain=40 ; # subdevice: UHD subdevice specification (for USRP1 use A:0 or B:0) SignalSource.subdevice=A:0 ; # samples: Number of samples to be processed. Notice that 0 indicates the entire file. SignalSource.samples=0 ; # repeat: Repeat the processing file. Disable this option in this version SignalSource.repeat=false ; # dump: Dump the Signal source data to a file. Disable this option in this version SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat ;#enable_throttle_control: Enabling this option tells the signal source to keep the delay between samples in post processing. ; it helps to not overload the CPU, but the processing time will be longer. SignalSource.enable_throttle_control=false ;######### SIGNAL_CONDITIONER CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. ;#implementation: Use [Pass_Through] or [Signal_Conditioner] ;#[Pass_Through] disables this block and the [DataTypeAdapter], [InputFilter] and [Resampler] blocks ;#[Signal_Conditioner] enables this block. Then you have to configure [DataTypeAdapter], [InputFilter] and [Resampler] blocks SignalConditioner.implementation=Signal_Conditioner ;SignalConditioner.implementation=Pass_Through ;######### DATA_TYPE_ADAPTER CONFIG ############ ;## Changes the type of input data. Please disable it in this version. ;#implementation: [Pass_Through] disables this block DataTypeAdapter.implementation=Pass_Through DataTypeAdapter.item_type=cshort ;DataTypeAdapter.item_type=cbyte ;######### INPUT_FILTER CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. InputFilter.implementation=Fir_Filter ;InputFilter.implementation=Freq_Xlating_Fir_Filter ;InputFilter.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter.dump=false ;#dump_filename: Log path and filename. InputFilter.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse reponse given a set of band edges, the desired reponse on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter.input_item_type=cshort ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter.number_of_taps=11 ;#number_of _bands: Number of frequency bands in the filter. InputFilter.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter.band1_begin=0.0 InputFilter.band1_end=0.48 InputFilter.band2_begin=0.52 InputFilter.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter.ampl1_begin=1.0 InputFilter.ampl1_end=1.0 InputFilter.ampl2_begin=0.0 InputFilter.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter.band1_error=1.0 InputFilter.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter.IF is the intermediate frequency (in Hz) shifted down to zero Hz InputFilter.sampling_frequency=4000000 InputFilter.IF=0 ;######### RESAMPLER CONFIG ############ ;## Resamples the input data. ;#implementation: Use [Pass_Through] or [Direct_Resampler] ;#[Pass_Through] disables this block ;#[Direct_Resampler] enables a resampler that implements a nearest neigbourhood interpolation ;Resampler.implementation=Direct_Resampler Resampler.implementation=Pass_Through ;#dump: Dump the resampled data to a file. Resampler.dump=false ;#dump_filename: Log path and filename. Resampler.dump_filename=../data/resampler.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Resampler.item_type=gr_complex ;#sample_freq_in: the sample frequency of the input signal Resampler.sample_freq_in=4000000 ;#sample_freq_out: the desired sample frequency of the output signal Resampler.sample_freq_out=4000000 ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available GPS satellite channels. Channels_1C.count=8 ;#count: Number of available Galileo satellite channels. Channels_1B.count=0 ;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver Channels.in_acquisition=1 ;#system: GPS, GLONASS, GALILEO, SBAS or COMPASS ;#if the option is disabled by default is assigned GPS ;Channel.system=GPS Channel.signal=1C ;#if the option is disabled by default is assigned "1C" GPS L1 C/A ;Channel0.signal=1C ;Channel1.signal=1C ;Channel2.signal=1C ;Channel3.signal=1C ;Channel4.signal=1C ;Channel5.signal=1C ;Channel6.signal=1C ;Channel7.signal=1C ;Channel8.signal=1C ;Channel9.signal=1C ;Channel10.signal=1C ;Channel11.signal=1C ;######### SPECIFIC CHANNELS CONFIG ###### ;#The following options are specific to each channel and overwrite the generic options ;######### CHANNEL 0 CONFIG ############ ;Channel0.system=GPS ;Channel0.signal=1C ;#satellite: Satellite PRN ID for this channel. Disable this option to random search ;Channel0.satellite=11 ;######### CHANNEL 1 CONFIG ############ ;Channel1.system=GPS ;Channel1.signal=1C ;Channel1.satellite=18 ;######### ACQUISITION GLOBAL CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1C.dump=false ;#filename: Log path and filename Acquisition_1C.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1C.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_1C.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1C.coherent_integration_time_ms=1 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition ;#threshold: Acquisition threshold. It will be ignored if pfa is defined. Acquisition_1C.threshold=0.01 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] ;Acquisition_1C.pfa=0.00001 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1C.doppler_max=8000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_1C.doppler_step=500 ;#bit_transition_flag: Enable or disable a strategy to deal with bit transitions in GPS signals: process two dwells and take maximum test statistics. Only use with implementation: [GPS_L1_CA_PCPS_Acquisition] (should not be used for Galileo_E1_PCPS_Ambiguous_Acquisition]) Acquisition_1C.bit_transition_flag=false ;#max_dwells: Maximum number of consecutive dwells to be processed. It will be ignored if bit_transition_flag=true Acquisition_1C.max_dwells=1 ;######### ACQUISITION CHANNELS CONFIG ###### ;#The following options are specific to each channel and overwrite the generic options ;######### TRACKING GLOBAL CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_PLL_C_Aid_Tracking] Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking ;#item_type: Type and resolution for each of the signal samples. Tracking_1C.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_1C.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_1C.dump=false ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_1C.dump_filename=./tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1C.pll_bw_hz=30.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_1C.dll_bw_hz=4.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_1C.order=3; ;#early_late_space_chips: correlator early-late space [chips]. Use [0.5] Tracking_1C.early_late_space_chips=0.5; ;######### TELEMETRY DECODER GPS CONFIG ############ ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L1 C/A TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false ;#decimation factor TelemetryDecoder_1C.decimation_factor=1; ;######### OBSERVABLES CONFIG ############ ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. Observables.implementation=GPS_L1_CA_Observables ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] Observables.dump=false ;#dump_filename: Log path and filename. Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ ;#implementation: Position Velocity and Time (PVT) implementation algorithm: Use [GPS_L1_CA_PVT] in this version. PVT.implementation=GPS_L1_CA_PVT ;#averaging_depth: Number of PVT observations in the moving average algorithm PVT.averaging_depth=10 ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.flag_averaging=true ;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time (for GPS CA L1 is 1ms) [ms] PVT.output_rate_ms=100 ;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms<=display_rate_ms. PVT.display_rate_ms=500 ;# KML, GeoJSON, NMEA and RTCM output configuration ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump and ".kml" to GoogleEarth dump. PVT.dump_filename=./PVT ;#nmea_dump_filename: NMEA log path and filename PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; ;#flag_nmea_tty_port: Enable or disable the NMEA log to a serial TTY port (Can be used with real hardware or virtual one) PVT.flag_nmea_tty_port=false; ;#nmea_dump_devname: serial device descriptor for NMEA logging PVT.nmea_dump_devname=/dev/pts/4 PVT.flag_rtcm_server=true PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump=false gnss-sdr-0.0.9/conf/gnss-sdr_GPS_L1_USRP_realtime.conf000066400000000000000000000335551305042567700224400ustar00rootroot00000000000000; Configuration file for using USRP 1 as a RF front-end for GPS L1 signals. ; Run: ; gnss-sdr --config_file=/path/to/gnss-sdr_GPS_L1_USRP_realtime.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=2000000 ;######### SUPL RRLP GPS assistance configuration ##### ; Check http://www.mcc-mnc.com/ ; On Android: https://play.google.com/store/apps/details?id=net.its_here.cellidinfo&hl=en GNSS-SDR.SUPL_gps_enabled=false GNSS-SDR.SUPL_read_gps_assistance_xml=true GNSS-SDR.SUPL_gps_ephemeris_server=supl.google.com GNSS-SDR.SUPL_gps_ephemeris_port=7275 GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com GNSS-SDR.SUPL_gps_acquisition_port=7275 GNSS-SDR.SUPL_MCC=244 GNSS-SDR.SUPL_MNS=5 GNSS-SDR.SUPL_LAC=0x59e2 GNSS-SDR.SUPL_CI=0x31b0 ;######### SIGNAL_SOURCE CONFIG ############ ;#implementation: Use [File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) SignalSource.implementation=UHD_Signal_Source ;#When left empty, the device discovery routines will search all available transports on the system (ethernet, usb...) ;SignalSource.device_address=192.168.40.2 ; <- PUT THE IP ADDRESS OF YOUR USRP HERE ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. SignalSource.item_type=gr_complex ;#sampling_frequency: Original Signal sampling frequency in [Hz] SignalSource.sampling_frequency=2000000 ;#freq: RF front-end center frequency in [Hz] SignalSource.freq=1575420000 ;#gain: Front-end Gain in [dB] SignalSource.gain=60 ;#subdevice: UHD subdevice specification (for USRP1 use A:0 or B:0) SignalSource.subdevice=A:0 ;#samples: Number of samples to be processed. Notice that 0 indicates the entire file. SignalSource.samples=0 ;#repeat: Repeat the processing file. Disable this option in this version SignalSource.repeat=false ;#dump: Dump the Signal source data to a file. Disable this option in this version SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat ;#enable_throttle_control: Enabling this option tells the signal source to keep the delay between samples in post processing. ; it helps to not overload the CPU, but the processing time will be longer. SignalSource.enable_throttle_control=false ;######### SIGNAL_CONDITIONER CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. ;#implementation: Use [Pass_Through] or [Signal_Conditioner] ;#[Pass_Through] disables this block and the [DataTypeAdapter], [InputFilter] and [Resampler] blocks ;#[Signal_Conditioner] enables this block. Then you have to configure [DataTypeAdapter], [InputFilter] and [Resampler] blocks ;SignalConditioner.implementation=Signal_Conditioner SignalConditioner.implementation=Pass_Through ;######### DATA_TYPE_ADAPTER CONFIG ############ ;## Changes the type of input data. Please disable it in this version. ;#implementation: [Pass_Through] disables this block DataTypeAdapter.implementation=Pass_Through ;######### INPUT_FILTER CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. ;InputFilter.implementation=Fir_Filter ;InputFilter.implementation=Freq_Xlating_Fir_Filter InputFilter.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter.dump=false ;#dump_filename: Log path and filename. InputFilter.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse reponse given a set of band edges, the desired reponse on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter.band1_begin=0.0 InputFilter.band1_end=0.45 InputFilter.band2_begin=0.55 InputFilter.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter.ampl1_begin=1.0 InputFilter.ampl1_end=1.0 InputFilter.ampl2_begin=0.0 InputFilter.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter.band1_error=1.0 InputFilter.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter.IF is the intermediate frequency (in Hz) shifted down to zero Hz InputFilter.sampling_frequency=2000000 InputFilter.IF=0 ;######### RESAMPLER CONFIG ############ ;## Resamples the input data. ;#implementation: Use [Pass_Through] or [Direct_Resampler] ;#[Pass_Through] disables this block ;#[Direct_Resampler] enables a resampler that implements a nearest neigbourhood interpolation ;Resampler.implementation=Direct_Resampler Resampler.implementation=Pass_Through ;#dump: Dump the resamplered data to a file. Resampler.dump=false ;#dump_filename: Log path and filename. Resampler.dump_filename=../data/resampler.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Resampler.item_type=gr_complex ;#sample_freq_in: the sample frequency of the input signal Resampler.sample_freq_in=8000000 ;#sample_freq_out: the desired sample frequency of the output signal Resampler.sample_freq_out=2000000 ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available GPS satellite channels. Channels_GPS.count=6 ;#count: Number of available Galileo satellite channels. Channels_Galileo.count=0 ;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver Channels.in_acquisition=1 ;#system: GPS, GLONASS, GALILEO, SBAS or COMPASS ;#if the option is disabled by default is assigned GPS Channel.system=GPS ;#signal: ;# "1C" GPS L1 C/A ;# "1P" GPS L1 P ;# "1W" GPS L1 Z-tracking and similar (AS on) ;# "1Y" GPS L1 Y ;# "1M" GPS L1 M ;# "1N" GPS L1 codeless ;# "2C" GPS L2 C/A ;# "2D" GPS L2 L1(C/A)+(P2-P1) semi-codeless ;# "2S" GPS L2 L2C (M) ;# "2L" GPS L2 L2C (L) ;# "2X" GPS L2 L2C (M+L) ;# "2P" GPS L2 P ;# "2W" GPS L2 Z-tracking and similar (AS on) ;# "2Y" GPS L2 Y ;# "2M" GPS GPS L2 M ;# "2N" GPS L2 codeless ;# "5I" GPS L5 I ;# "5Q" GPS L5 Q ;# "5X" GPS L5 I+Q ;# "1C" GLONASS G1 C/A ;# "1P" GLONASS G1 P ;# "2C" GLONASS G2 C/A (Glonass M) ;# "2P" GLONASS G2 P ;# "1A" GALILEO E1 A (PRS) ;# "1B" GALILEO E1 B (I/NAV OS/CS/SoL) ;# "1C" GALILEO E1 C (no data) ;# "1X" GALILEO E1 B+C ;# "1Z" GALILEO E1 A+B+C ;# "5I" GALILEO E5a I (F/NAV OS) ;# "5Q" GALILEO E5a Q (no data) ;# "5X" GALILEO E5a I+Q ;# "7I" GALILEO E5b I ;# "7Q" GALILEO E5b Q ;# "7X" GALILEO E5b I+Q ;# "8I" GALILEO E5 I ;# "8Q" GALILEO E5 Q ;# "8X" GALILEO E5 I+Q ;# "6A" GALILEO E6 A ;# "6B" GALILEO E6 B ;# "6C" GALILEO E6 C ;# "6X" GALILEO E6 B+C ;# "6Z" GALILEO E6 A+B+C ;# "1C" SBAS L1 C/A ;# "5I" SBAS L5 I ;# "5Q" SBAS L5 Q ;# "5X" SBAS L5 I+Q ;# "2I" COMPASS E2 I ;# "2Q" COMPASS E2 Q ;# "2X" COMPASS E2 IQ ;# "7I" COMPASS E5b I ;# "7Q" COMPASS E5b Q ;# "7X" COMPASS E5b IQ ;# "6I" COMPASS E6 I ;# "6Q" COMPASS E6 Q ;# "6X" COMPASS E6 IQ ;#if the option is disabled by default is assigned "1C" GPS L1 C/A Channel.signal=1C ;######### SPECIFIC CHANNELS CONFIG ###### ;#The following options are specific to each channel and overwrite the generic options ;######### CHANNEL 0 CONFIG ############ Channel0.system=GPS Channel0.signal=1C ;#satellite: Satellite PRN ID for this channel. Disable this option to random search Channel0.satellite=11 ;######### CHANNEL 1 CONFIG ############ Channel1.system=GPS Channel1.signal=1C Channel1.satellite=18 ;######### ACQUISITION GLOBAL CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_GPS.dump=false ;#filename: Log path and filename Acquisition_GPS.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_GPS.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_GPS.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_GPS.coherent_integration_time_ms=1 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_GPS.implementation=GPS_L1_CA_PCPS_Acquisition ;#threshold: Acquisition threshold. It will be ignored if pfa is defined. Acquisition_GPS.threshold=0.01 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] ;Acquisition_GPS.pfa=0.0001 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_GPS.doppler_max=10000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_GPS.doppler_step=500 ;#bit_transition_flag: Enable or disable a strategy to deal with bit transitions in GPS signals: process two dwells and take maximum test statistics. Only use with implementation: [GPS_L1_CA_PCPS_Acquisition] (should not be used for Galileo_E1_PCPS_Ambiguous_Acquisition]) Acquisition_GPS.bit_transition_flag=false ;#max_dwells: Maximum number of consecutive dwells to be processed. It will be ignored if bit_transition_flag=true Acquisition_GPS.max_dwells=1 ;######### ACQUISITION CHANNELS CONFIG ###### ;#The following options are specific to each channel and overwrite the generic options ;######### TRACKING GLOBAL CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_PLL_C_Aid_Tracking] Tracking_GPS.implementation=GPS_L1_CA_DLL_PLL_Tracking ;#item_type: Type and resolution for each of the signal samples. Tracking_GPS.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_GPS.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_GPS.dump=false ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_GPS.dump_filename=./tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_GPS.pll_bw_hz=50.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_GPS.dll_bw_hz=2.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_GPS.order=3; ;#early_late_space_chips: correlator early-late space [chips]. Use [0.5] Tracking_GPS.early_late_space_chips=0.5; ;######### TELEMETRY DECODER GPS CONFIG ############ ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L1 C/A TelemetryDecoder_GPS.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_GPS.dump=false ;#decimation factor TelemetryDecoder_GPS.decimation_factor=1; ;######### OBSERVABLES CONFIG ############ ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. Observables.implementation=GPS_L1_CA_Observables ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] Observables.dump=false ;#dump_filename: Log path and filename. Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ ;#implementation: Position Velocity and Time (PVT) implementation algorithm: Use [GPS_L1_CA_PVT] in this version. PVT.implementation=GPS_L1_CA_PVT ;#averaging_depth: Number of PVT observations in the moving average algorithm PVT.averaging_depth=10 ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.flag_averaging=true ;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time (for GPS CA L1 is 1ms) [ms] PVT.output_rate_ms=100 ;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms<=display_rate_ms. PVT.display_rate_ms=500 ;# KML, GeoJSON, NMEA and RTCM output configuration ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump and ".kml" to GoogleEarth dump. PVT.dump_filename=./PVT ;#nmea_dump_filename: NMEA log path and filename PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; ;#flag_nmea_tty_port: Enable or disable the NMEA log to a serial TTY port (Can be used with real hardware or virtual one) PVT.flag_nmea_tty_port=false; ;#nmea_dump_devname: serial device descriptor for NMEA logging PVT.nmea_dump_devname=/dev/pts/4 PVT.flag_rtcm_server=true PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump=false gnss-sdr-0.0.9/conf/gnss-sdr_GPS_L1_acq_QuickSync.conf000066400000000000000000000260261305042567700225150ustar00rootroot00000000000000; Default configuration file ; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=4000000 ;######### SIGNAL_SOURCE CONFIG ############ ;#implementation: Use [File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] or [Rtlsdr_Signal_Source] SignalSource.implementation=File_Signal_Source ;#filename: path to file with the captured GNSS signal samples to be processed SignalSource.filename=/datalogger/signals/CTTC/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN.dat ; <- PUT YOUR FILE HERE ;#item_type: Type and resolution for each of the signal samples. ;#Use gr_complex for 32 bits float I/Q or short for I/Q interleaved short integer. ;#If short is selected you should have to instantiate the Ishort_To_Complex data_type_adapter. SignalSource.item_type=ishort ;#sampling_frequency: Original Signal sampling frequency in [Hz] SignalSource.sampling_frequency=4000000 ;#freq: RF front-end center frequency in [Hz] SignalSource.freq=1575420000 ;#samples: Number of samples to be processed. Notice that 0 indicates the entire file. SignalSource.samples=0 ;#repeat: Repeat the processing file. Disable this option in this version SignalSource.repeat=false ;#dump: Dump the Signal source data to a file. Disable this option in this version SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat ;#enable_throttle_control: Enabling this option tells the signal source to keep the delay between samples in post processing. ; it helps to not overload the CPU, but the processing time will be longer. SignalSource.enable_throttle_control=false ;######### SIGNAL_CONDITIONER CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. ;#implementation: Use [Pass_Through] or [Signal_Conditioner] ;#[Pass_Through] disables this block and the [DataTypeAdapter], [InputFilter] and [Resampler] blocks ;#[Signal_Conditioner] enables this block. Then you have to configure [DataTypeAdapter], [InputFilter] and [Resampler] blocks SignalConditioner.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER CONFIG ############ ;## Changes the type of input data. ;#implementation: Use [Ishort_To_Complex] or [Pass_Through] DataTypeAdapter.implementation=Ishort_To_Complex ;#dump: Dump the filtered data to a file. DataTypeAdapter.dump=false ;#dump_filename: Log path and filename. DataTypeAdapter.dump_filename=../data/data_type_adapter.dat ;######### INPUT_FILTER CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. ;InputFilter.implementation=Fir_Filter ;InputFilter.implementation=Freq_Xlating_Fir_Filter InputFilter.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter.dump=false ;#dump_filename: Log path and filename. InputFilter.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse reponse given a set of band edges, the desired reponse on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter.band1_begin=0.0 ;InputFilter.band1_end=0.8 InputFilter.band1_end=0.85 InputFilter.band2_begin=0.90 InputFilter.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter.ampl1_begin=1.0 InputFilter.ampl1_end=1.0 InputFilter.ampl2_begin=0.0 InputFilter.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter.band1_error=1.0 InputFilter.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter.IF is the intermediate frequency (in Hz) shifted down to zero Hz InputFilter.sampling_frequency=4000000 InputFilter.IF=0 ;######### RESAMPLER CONFIG ############ ;## Resamples the input data. ;#implementation: Use [Pass_Through] or [Direct_Resampler] ;#[Pass_Through] disables this block ;#[Direct_Resampler] enables a resampler that implements a nearest neigbourhood interpolation ;Resampler.implementation=Direct_Resampler Resampler.implementation=Pass_Through ;#dump: Dump the resamplered data to a file. Resampler.dump=false ;#dump_filename: Log path and filename. Resampler.dump_filename=../data/resampler.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Resampler.item_type=gr_complex ;#sample_freq_in: the sample frequency of the input signal Resampler.sample_freq_in=4000000 ;#sample_freq_out: the desired sample frequency of the output signal Resampler.sample_freq_out=4000000 ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available satellite channels. Channels_1C.count=5 ;#in_acquisition: Number of channels simultaneously acquiring Channels.in_acquisition=1 ;######### CHANNEL 0 CONFIG ############ Channel0.signal=1C Channel0.satellite=1 Channel0.repeat_satellite=false ;######### CHANNEL 1 CONFIG ############ Channel1.signal=1C Channel1.satellite=11 Channel1.repeat_satellite=false ;######### CHANNEL 2 CONFIG ############ Channel2.signal=1C Channel2.satellite=17 Channel2.repeat_satellite=false ;######### CHANNEL 3 CONFIG ############ Channel3.signal=1C Channel3.satellite=20 Channel3.repeat_satellite=false ;######### CHANNEL 4 CONFIG ############ Channel4.signal=1C Channel4.satellite=32 Channel4.repeat_satellite=false ;######### ACQUISITION GLOBAL CONFIG ############_1C ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1C.dump=true ;#filename: Log path and filename ;Acquisition_1C.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1C.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_1C.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1C.coherent-integration_time_ms=4 Acquisition_1C.implementation=GPS_L1_CA_PCPS_QuickSync_Acquisition ;######### ACQUISITION CHANNELS CONFIG ###### ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] Acquisition_1C.implementation=GPS_L1_CA_PCPS_QuickSync_Acquisition ;#threshold: Acquisition threshold Acquisition_1C.threshold=0.4 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1C.doppler_max=10000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_1C.doppler_step=250 ;#repeat_satellite: Use only jointly with the satellte PRN ID option. ;######### TRACKING GLOBAL CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_PLL_C_Aid_Tracking] Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking ;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version. Tracking_1C.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_1C.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_1C.dump=false ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_1C.dump_filename=./tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1C.pll_bw_hz=50.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_1C.dll_bw_hz=4.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_1C.order=3; ;#early_late_space_chips: correlator early-late space [chips]. Use [0.5] Tracking_1C.early_late_space_chips=0.5; ;######### TELEMETRY DECODER CONFIG ############ ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L1 C/A. TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false ;######### OBSERVABLES CONFIG ############ ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. Observables.implementation=GPS_L1_CA_Observables ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] Observables.dump=false ;#dump_filename: Log path and filename. Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ ;#implementation: Position Velocity and Time (PVT) implementation algorithm: Use [GPS_L1_CA_PVT] in this version. PVT.implementation=GPS_L1_CA_PVT ;#averaging_depth: Number of PVT observations in the moving average algorithm PVT.averaging_depth=10 ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.flag_averaging=true ;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time (for GPS CA L1 is 1ms) [ms] PVT.output_rate_ms=100; ;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms<=display_rate_ms. PVT.display_rate_ms=500; ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump=false ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump and ".kml" to GoogleEarth dump. PVT.dump_filename=./PVT PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea PVT.flag_nmea_tty_port=true PVT.nmea_dump_devname=/dev/pts/4 PVT.flag_rtcm_server=false PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 gnss-sdr-0.0.9/conf/gnss-sdr_GPS_L1_gr_complex.conf000066400000000000000000000045611305042567700221170ustar00rootroot00000000000000; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=4000000 ;######### SIGNAL_SOURCE CONFIG ############ SignalSource.implementation=File_Signal_Source SignalSource.filename=/datalogger/signals/Agilent/New York/4msps.dat ; <- PUT YOUR FILE HERE SignalSource.item_type=gr_complex SignalSource.sampling_frequency=4000000 SignalSource.freq=1575420000 SignalSource.samples=250000000 SignalSource.repeat=false SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat SignalSource.enable_throttle_control=false ;######### SIGNAL_CONDITIONER CONFIG ############ SignalConditioner.implementation=Pass_Through ;######### CHANNELS GLOBAL CONFIG ############ Channels_1C.count=8 Channels.in_acquisition=1 Channel.signal=1C ;######### ACQUISITION GLOBAL CONFIG ############ Acquisition_1C.dump=false Acquisition_1C.dump_filename=./acq_dump.dat Acquisition_1C.item_type=gr_complex Acquisition_1C.if=0 Acquisition_1C.sampled_ms=1 Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition_1C.threshold=0.005 ;Acquisition_1C.pfa=0.01 Acquisition_1C.doppler_max=10000 Acquisition_1C.doppler_step=500 ;######### TRACKING GLOBAL CONFIG ############ Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking Tracking_1C.item_type=gr_complex Tracking_1C.if=0 Tracking_1C.dump=false Tracking_1C.dump_filename=../data/epl_tracking_ch_ Tracking_1C.pll_bw_hz=45.0; Tracking_1C.dll_bw_hz=2.0; Tracking_1C.order=3; ;######### TELEMETRY DECODER GPS CONFIG ############ TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false TelemetryDecoder_1C.decimation_factor=1; ;######### OBSERVABLES CONFIG ############ Observables.implementation=GPS_L1_CA_Observables Observables.dump=false Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ PVT.implementation=GPS_L1_CA_PVT PVT.averaging_depth=100 PVT.flag_averaging=false PVT.output_rate_ms=10 PVT.display_rate_ms=500 PVT.dump_filename=./PVT PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; PVT.flag_nmea_tty_port=false; PVT.nmea_dump_devname=/dev/pts/4 PVT.flag_rtcm_server=false PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 PVT.dump=false gnss-sdr-0.0.9/conf/gnss-sdr_GPS_L1_gr_complex_gpu.conf000066400000000000000000000045631305042567700227740ustar00rootroot00000000000000; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=4000000 ;######### SIGNAL_SOURCE CONFIG ############ SignalSource.implementation=File_Signal_Source SignalSource.filename=/datalogger/signals/Agilent/New York/4msps.dat ; <- PUT YOUR FILE HERE SignalSource.item_type=gr_complex SignalSource.sampling_frequency=4000000 SignalSource.freq=1575420000 SignalSource.samples=250000000 SignalSource.repeat=false SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat SignalSource.enable_throttle_control=false ;######### SIGNAL_CONDITIONER CONFIG ############ SignalConditioner.implementation=Pass_Through ;######### CHANNELS GLOBAL CONFIG ############ Channels_1C.count=8 Channels.in_acquisition=1 Channel.signal=1C ;######### ACQUISITION GLOBAL CONFIG ############ Acquisition_1C.dump=false Acquisition_1C.dump_filename=./acq_dump.dat Acquisition_1C.item_type=gr_complex Acquisition_1C.if=0 Acquisition_1C.sampled_ms=1 Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition_1C.threshold=0.005 ;Acquisition_1C.pfa=0.01 Acquisition_1C.doppler_max=10000 Acquisition_1C.doppler_step=500 ;######### TRACKING GLOBAL CONFIG ############ Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking_GPU Tracking_1C.item_type=gr_complex Tracking_1C.if=0 Tracking_1C.dump=false Tracking_1C.dump_filename=../data/epl_tracking_ch_ Tracking_1C.pll_bw_hz=45.0; Tracking_1C.dll_bw_hz=2.0; Tracking_1C.order=3; ;######### TELEMETRY DECODER GPS CONFIG ############ TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false TelemetryDecoder_1C.decimation_factor=1; ;######### OBSERVABLES CONFIG ############ Observables.implementation=GPS_L1_CA_Observables Observables.dump=false Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ PVT.implementation=GPS_L1_CA_PVT PVT.averaging_depth=100 PVT.flag_averaging=false PVT.output_rate_ms=10 PVT.display_rate_ms=500 PVT.dump_filename=./PVT PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; PVT.flag_nmea_tty_port=false; PVT.nmea_dump_devname=/dev/pts/4 PVT.flag_rtcm_server=false PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 PVT.dump=false gnss-sdr-0.0.9/conf/gnss-sdr_GPS_L1_ishort.conf000066400000000000000000000062751305042567700212740ustar00rootroot00000000000000; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=2000000 ;######### CONTROL_THREAD CONFIG ############ ControlThread.wait_for_flowgraph=false ;######### SIGNAL_SOURCE CONFIG ############ SignalSource.implementation=File_Signal_Source SignalSource.filename=/Users/carlesfernandez/Documents/workspace/code2/trunk/data/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN.dat ;/datalogger/signals/CTTC/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN.dat ; <- PUT YOUR FILE HERE SignalSource.item_type=ishort SignalSource.sampling_frequency=4000000 SignalSource.freq=1575420000 SignalSource.samples=0 SignalSource.repeat=false SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat SignalSource.enable_throttle_control=false ;######### SIGNAL_CONDITIONER CONFIG ############ SignalConditioner.implementation=Signal_Conditioner ;DataTypeAdapter.implementation=Ishort_To_Complex DataTypeAdapter.implementation=Ishort_To_Cshort InputFilter.implementation=Pass_Through ;InputFilter.input_item_type=gr_complex ;InputFilter.output_item_type=gr_complex InputFilter.item_type=cshort ;Resampler.implementation=Pass_Through ;Resampler.item_type=gr_complex Resampler.implementation=Direct_Resampler Resampler.sample_freq_in=4000000 Resampler.sample_freq_out=2000000 ;Resampler.item_type=gr_complex Resampler.item_type=cshort ;######### CHANNELS GLOBAL CONFIG ############ Channels_1C.count=8 Channels.in_acquisition=1 Channel.signal=1C ;Channel.item_type=cshort ;######### ACQUISITION GLOBAL CONFIG ############ Acquisition_1C.dump=false Acquisition_1C.dump_filename=./acq_dump.dat Acquisition_1C.item_type=cshort Acquisition_1C.if=0 Acquisition_1C.sampled_ms=1 Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition_1C.threshold=0.008 ;Acquisition_1C.pfa=0.000001 Acquisition_1C.doppler_max=10000 Acquisition_1C.doppler_step=250 Acquisition_1C.tong_init_val=2 Acquisition_1C.tong_max_val=10 Acquisition_1C.tong_max_dwells=20 ;######### TRACKING GLOBAL CONFIG ############ Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_C_Aid_Tracking Tracking_1C.item_type=cshort Tracking_1C.if=0 Tracking_1C.dump=false Tracking_1C.dump_filename=../data/epl_tracking_ch_ Tracking_1C.pll_bw_hz=40.0; Tracking_1C.dll_bw_hz=4.0; Tracking_1C.order=3; ;######### TELEMETRY DECODER GPS CONFIG ############ TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false TelemetryDecoder_1C.decimation_factor=1; ;######### OBSERVABLES CONFIG ############ Observables.implementation=GPS_L1_CA_Observables Observables.dump=false Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ PVT.implementation=GPS_L1_CA_PVT PVT.averaging_depth=100 PVT.flag_averaging=false PVT.output_rate_ms=10 PVT.display_rate_ms=500 PVT.dump_filename=./PVT PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; PVT.flag_nmea_tty_port=false; PVT.nmea_dump_devname=/dev/pts/4 PVT.flag_rtcm_server=false PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 PVT.dump=false gnss-sdr-0.0.9/conf/gnss-sdr_GPS_L1_nsr.conf000066400000000000000000000103201305042567700205500ustar00rootroot00000000000000; Sample configuration file for IFEN SX-NSR software receiver front-end ; http://www.ifen.com/products/sx-scientific-gnss-solutions/nsr-software-receiver.html ; This sample configuration is able to process directly .sream binary files ; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=2560000 ;######### SUPL RRLP GPS assistance configuration ##### ; Check http://www.mcc-mnc.com/ ; On Android: https://play.google.com/store/apps/details?id=net.its_here.cellidinfo&hl=en GNSS-SDR.SUPL_gps_enabled=false GNSS-SDR.SUPL_read_gps_assistance_xml=false GNSS-SDR.SUPL_gps_ephemeris_server=supl.google.com GNSS-SDR.SUPL_gps_ephemeris_port=7275 GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com GNSS-SDR.SUPL_gps_acquisition_port=7275 GNSS-SDR.SUPL_MCC=244 GNSS-SDR.SUPL_MNS=5 GNSS-SDR.SUPL_LAC=0x59e2 GNSS-SDR.SUPL_CI=0x31b0 ;######### SIGNAL_SOURCE CONFIG ############ SignalSource.implementation=Nsr_File_Signal_Source SignalSource.filename=/datalogger/signals/ifen/E1L1_FE0_Band0.stream ; <- PUT YOUR FILE HERE SignalSource.item_type=byte SignalSource.sampling_frequency=20480000 SignalSource.freq=1575420000 SignalSource.samples=0 SignalSource.repeat=false SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat SignalSource.enable_throttle_control=false ;######### SIGNAL_CONDITIONER CONFIG ############ SignalConditioner.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER CONFIG ############ DataTypeAdapter.implementation=Pass_Through DataTypeAdapter.item_type=float ;######### INPUT_FILTER CONFIG ############ InputFilter.implementation=Freq_Xlating_Fir_Filter InputFilter.dump=false InputFilter.dump_filename=../data/input_filter.dat InputFilter.input_item_type=float InputFilter.output_item_type=gr_complex InputFilter.taps_item_type=float InputFilter.number_of_taps=5 InputFilter.number_of_bands=2 InputFilter.band1_begin=0.0 InputFilter.band1_end=0.45 InputFilter.band2_begin=0.55 InputFilter.band2_end=1.0 InputFilter.ampl1_begin=1.0 InputFilter.ampl1_end=1.0 InputFilter.ampl2_begin=0.0 InputFilter.ampl2_end=0.0 InputFilter.band1_error=1.0 InputFilter.band2_error=1.0 InputFilter.filter_type=bandpass InputFilter.grid_density=16 InputFilter.sampling_frequency=20480000 InputFilter.IF=5499998.47412109 InputFilter.decimation_factor=8 ;######### RESAMPLER CONFIG ############ Resampler.implementation=Pass_Through Resampler.dump=false Resampler.dump_filename=../data/resampler.dat Resampler.item_type=gr_complex ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available GPS satellite channels. Channels_1C.count=8 Channels.in_acquisition=1 Channel.signal=1C ;######### GPS ACQUISITION CONFIG ############ Acquisition_1C.dump=false Acquisition_1C.dump_filename=./acq_dump.dat Acquisition_1C.item_type=gr_complex Acquisition_1C.if=0 Acquisition_1C.sampled_ms=1 Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition_1C.threshold=0.0075 ;Acquisition_1C.pfa=0.01 Acquisition_1C.doppler_max=10000 Acquisition_1C.doppler_step=500 ;######### TRACKING GPS CONFIG ############ Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking Tracking_1C.item_type=gr_complex Tracking_1C.if=0 Tracking_1C.dump=false Tracking_1C.dump_filename=../data/epl_tracking_ch_ Tracking_1C.pll_bw_hz=45.0; Tracking_1C.dll_bw_hz=2.0; Tracking_1C.order=3; ;######### TELEMETRY DECODER GPS CONFIG ############ TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false TelemetryDecoder_1C.decimation_factor=1; ;######### OBSERVABLES CONFIG ############ Observables.implementation=GPS_L1_CA_Observables Observables.dump=false Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ PVT.implementation=GPS_L1_CA_PVT PVT.averaging_depth=100 PVT.flag_averaging=false PVT.output_rate_ms=10 PVT.display_rate_ms=500 PVT.dump_filename=./PVT PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; PVT.flag_nmea_tty_port=false; PVT.nmea_dump_devname=/dev/pts/4 PVT.flag_rtcm_server=false PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 PVT.dump=true gnss-sdr-0.0.9/conf/gnss-sdr_GPS_L1_nsr_twobit_packed.conf000066400000000000000000000116171305042567700234610ustar00rootroot00000000000000; Sample configuration file for IFEN SX-NSR software receiver front-end ; http://www.ifen.com/products/sx-scientific-gnss-solutions/nsr-software-receiver.html ; This sample configuration is able to process directly .sream binary files ; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=2560000 ;######### SUPL RRLP GPS assistance configuration ##### ; Check http://www.mcc-mnc.com/ ; On Android: https://play.google.com/store/apps/details?id=net.its_here.cellidinfo&hl=en GNSS-SDR.SUPL_gps_enabled=false GNSS-SDR.SUPL_read_gps_assistance_xml=false GNSS-SDR.SUPL_gps_ephemeris_server=supl.google.com GNSS-SDR.SUPL_gps_ephemeris_port=7275 GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com GNSS-SDR.SUPL_gps_acquisition_port=7275 GNSS-SDR.SUPL_MCC=244 GNSS-SDR.SUPL_MNS=5 GNSS-SDR.SUPL_LAC=0x59e2 GNSS-SDR.SUPL_CI=0x31b0 ;######### SIGNAL_SOURCE CONFIG ############ SignalSource.implementation=Two_Bit_Packed_File_Signal_Source SignalSource.filename=/datalogger/signals/ifen/E1L1_FE0_Band0.stream ; <- PUT YOUR FILE HERE SignalSource.item_type=byte ; big_endian_items : not needed for byte inputs ; If the input were 'short' then this can either be big endian or little ; endian. If it is big endian then the second byte should be output ; first in each short. ; SignalSource.big_endian_items=false ; big_endian_bytes: true if the most signficiant two bits in the byte ; are the first two to be output. SignalSource.big_endian_bytes=false ; sample_type: one of 'real' 'iq' or 'qi' ; Data is either real or complex. ; if the data is complex there are two conventions for sample ordering: ; 1) Real first : 'iq' ; 2) Imaginary first: 'qi' ; This setting specifies which of the three cases holds for this data file SignalSource.sample_type=real SignalSource.sampling_frequency=20480000 SignalSource.freq=1575420000 SignalSource.samples=0 SignalSource.repeat=false SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat SignalSource.enable_throttle_control=false ;######### SIGNAL_CONDITIONER CONFIG ############ SignalConditioner.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER CONFIG ############ DataTypeAdapter.implementation=Pass_Through DataTypeAdapter.item_type=float ;######### INPUT_FILTER CONFIG ############ InputFilter.implementation=Freq_Xlating_Fir_Filter InputFilter.dump=false InputFilter.dump_filename=../data/input_filter.dat InputFilter.input_item_type=float InputFilter.output_item_type=gr_complex InputFilter.taps_item_type=float InputFilter.number_of_taps=5 InputFilter.number_of_bands=2 InputFilter.band1_begin=0.0 InputFilter.band1_end=0.45 InputFilter.band2_begin=0.55 InputFilter.band2_end=1.0 InputFilter.ampl1_begin=1.0 InputFilter.ampl1_end=1.0 InputFilter.ampl2_begin=0.0 InputFilter.ampl2_end=0.0 InputFilter.band1_error=1.0 InputFilter.band2_error=1.0 InputFilter.filter_type=bandpass InputFilter.grid_density=16 InputFilter.sampling_frequency=20480000 InputFilter.IF=5499998.47412109 InputFilter.decimation_factor=8 ;######### RESAMPLER CONFIG ############ Resampler.implementation=Pass_Through Resampler.dump=false Resampler.dump_filename=../data/resampler.dat Resampler.item_type=gr_complex ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available GPS satellite channels. Channels_1C.count=8 Channels.in_acquisition=1 Channel.signal=1C ;######### GPS ACQUISITION CONFIG ############ Acquisition_1C.dump=false Acquisition_1C.dump_filename=./acq_dump.dat Acquisition_1C.item_type=gr_complex Acquisition_1C.if=0 Acquisition_1C.sampled_ms=1 Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition_1C.threshold=0.0075 ;Acquisition_1C.pfa=0.01 Acquisition_1C.doppler_max=10000 Acquisition_1C.doppler_step=500 ;######### TRACKING GPS CONFIG ############ Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking Tracking_1C.item_type=gr_complex Tracking_1C.if=0 Tracking_1C.dump=false Tracking_1C.dump_filename=../data/epl_tracking_ch_ Tracking_1C.pll_bw_hz=45.0; Tracking_1C.dll_bw_hz=2.0; Tracking_1C.order=3; ;######### TELEMETRY DECODER GPS CONFIG ############ TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false TelemetryDecoder_1C.decimation_factor=1; ;######### OBSERVABLES CONFIG ############ Observables.implementation=GPS_L1_CA_Observables Observables.dump=false Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ PVT.implementation=GPS_L1_CA_PVT PVT.averaging_depth=100 PVT.flag_averaging=false PVT.output_rate_ms=10 PVT.display_rate_ms=500 PVT.dump_filename=./PVT PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; PVT.flag_nmea_tty_port=false; PVT.nmea_dump_devname=/dev/pts/4 PVT.flag_rtcm_server=false PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 PVT.dump=true gnss-sdr-0.0.9/conf/gnss-sdr_GPS_L1_rtl_tcp_realtime.conf000066400000000000000000000267741305042567700233230ustar00rootroot00000000000000; Default configuration file ; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. ;FOR USE GNSS-SDR WITH RTLSDR DONGLES USER MUST SET THE CALIBRATED SAMPLE RATE HERE ; i.e. using front-end-cal as reported here:http://www.cttc.es/publication/turning-a-television-into-a-gnss-receiver/ GNSS-SDR.internal_fs_hz=1200000 ;######### SUPL RRLP GPS assistance configuration ##### ; Check http://www.mcc-mnc.com/ ; On Android: https://play.google.com/store/apps/details?id=net.its_here.cellidinfo&hl=en GNSS-SDR.SUPL_gps_enabled=false GNSS-SDR.SUPL_read_gps_assistance_xml=false GNSS-SDR.SUPL_gps_ephemeris_server=supl.google.com GNSS-SDR.SUPL_gps_ephemeris_port=7275 GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com GNSS-SDR.SUPL_gps_acquisition_port=7275 GNSS-SDR.SUPL_MCC=244 GNSS-SDR.SUPL_MNS=5_1C GNSS-SDR.SUPL_LAC=0x59e2 GNSS-SDR.SUPL_CI=0x31b0 ;######### SIGNAL_SOURCE CONFIG ############ ;#implementation: Use [File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] [Osmosdr_Signal_Source] SignalSource.implementation=RtlTcp_Signal_Source ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. SignalSource.item_type=gr_complex ;#sampling_frequency: Original Signal sampling frequency in [Hz] ;FOR USE GNSS-SDR WITH RTLSDR DONGLES USER MUST SET THE CALIBRATED SAMPLE RATE HERE ; i.e. using front-end-cal as reported here:http://www.cttc.es/publication/turning-a-television-into-a-gnss-receiver/ SignalSource.sampling_frequency=1200000 ;#freq: RF front-end center frequency in [Hz] SignalSource.freq=1575420000 ;#gain: Front-end overall gain Gain in [dB] SignalSource.gain=40 ;#rf_gain: Front-end RF stage gain in [dB] SignalSource.rf_gain=40 ;#rf_gain: Front-end IF stage gain in [dB] SignalSource.if_gain=30 ;#AGC_enabled: Front-end AGC enabled or disabled SignalSource.AGC_enabled = false ;#samples: Number of samples to be processed. Notice that 0 indicates the entire file. SignalSource.samples=0 ;#repeat: Repeat the processing file. Disable this option in this version SignalSource.repeat=false ;#dump: Dump the Signal source data to a file. Disable this option in this version SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat ;#enable_throttle_control: Enabling this option tells the signal source to keep the delay between samples in post processing. ; it helps to not overload the CPU, but the processing time will be longer. SignalSource.enable_throttle_control=false ;#Address of the rtl_tcp server (IPv6 allowed) SignalSource.address=127.0.0.1 ;#Port of the rtl_tcp server SignalSource.port=1234 ;# Set to true if I/Q samples come swapped SignalSource.swap_iq=false ;######### SIGNAL_CONDITIONER CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. ;#implementation: Use [Pass_Through] or [Signal_Conditioner] ;#[Pass_Through] disables this block and the [DataTypeAdapter], [InputFilter] and [Resampler] blocks ;#[Signal_Conditioner] enables this block. Then you have to configure [DataTypeAdapter], [InputFilter] and [Resampler] blocks SignalConditioner.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER CONFIG ############ ;## Changes the type of input data. Please disable it in this version. ;#implementation: [Pass_Through] disables this block DataTypeAdapter.implementation=Pass_Through ;######### INPUT_FILTER CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. InputFilter.implementation=Freq_Xlating_Fir_Filter ;#dump: Dump the filtered data to a file. InputFilter.dump=false ;#dump_filename: Log path and filename. InputFilter.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse reponse given a set of band edges, the desired reponse on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter.band1_begin=0.0 InputFilter.band1_end=0.45 InputFilter.band2_begin=0.55 InputFilter.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter.ampl1_begin=1.0 InputFilter.ampl1_end=1.0 InputFilter.ampl2_begin=0.0 InputFilter.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter.band1_error=1.0 InputFilter.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter.IF is the intermediate frequency (in Hz) shifted down to zero Hz ;FOR USE GNSS-SDR WITH RTLSDR DONGLES USER MUST SET THE CALIBRATED SAMPLE RATE HERE ; i.e. using front-end-cal as reported here:http://www.cttc.es/publication/turning-a-television-into-a-gnss-receiver/ InputFilter.sampling_frequency=1200000 ;# IF deviation due to front-end LO inaccuracies [HZ] InputFilter.IF=80558 ;######### RESAMPLER CONFIG ############ ;## Resamples the input data. ;# DISABLED IN THE RTL-SDR REALTIME ;#implementation: Use [Pass_Through] or [Direct_Resampler] ;#[Pass_Through] disables this block Resampler.implementation=Pass_Through ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available GPS satellite channels. Channels_1C.count=4 ;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver Channels.in_acquisition=1 Channel.signal=1C ;######### ACQUISITION GLOBAL CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1C.dump=false ;#filename: Log path and filename Acquisition_1C.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1C.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_1C.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1C.sampled_ms=1 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition_Fine_Doppler ;#threshold: Acquisition threshold Acquisition_1C.threshold=0.015 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] ;Acquisition_1C.pfa=0.0001 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1C.doppler_max=10000 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1C.doppler_min=-10000 ;#doppler_step Doppler step in the grid search [Hz] Acquisition_1C.doppler_step=500 ;#maximum dwells Acquisition_1C.max_dwells=15 ;######### TRACKING GLOBAL CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_PLL_C_Aid_Tracking] [GPS_L1_CA_DLL_PLL_Optim_Tracking] Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking ;#item_type: Type and resolution for each of the signal samples. Tracking_1C.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_1C.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_1C.dump=false ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_1C.dump_filename=./tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1C.pll_bw_hz=40.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_1C.dll_bw_hz=2.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_1C.order=3; ;#early_late_space_chips: correlator early-late space [chips]. Use [0.5] Tracking_1C.early_late_space_chips=0.5; ;######### TELEMETRY DECODER GPS CONFIG ############ ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L1 C/A TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false ;#decimation factor TelemetryDecoder_1C.decimation_factor=1; ;######### OBSERVABLES CONFIG ############ ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. Observables.implementation=GPS_L1_CA_Observables ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] Observables.dump=false ;#dump_filename: Log path and filename. Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ ;#implementation: Position Velocity and Time (PVT) implementation algorithm: Use [GPS_L1_CA_PVT] in this version. PVT.implementation=GPS_L1_CA_PVT ;#averaging_depth: Number of PVT observations in the moving average algorithm PVT.averaging_depth=10 ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.flag_averaging=true ;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time (for GPS CA L1 is 1ms) [ms] PVT.output_rate_ms=100 ;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms<=display_rate_ms. PVT.display_rate_ms=500 ;# KML, GeoJSON, NMEA and RTCM output configuration ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump and ".kml" to GoogleEarth dump. PVT.dump_filename=./PVT ;#nmea_dump_filename: NMEA log path and filename PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; ;#flag_nmea_tty_port: Enable or disable the NMEA log to a serial TTY port (Can be used with real hardware or virtual one) PVT.flag_nmea_tty_port=false; ;#nmea_dump_devname: serial device descriptor for NMEA logging PVT.nmea_dump_devname=/dev/pts/4 PVT.flag_rtcm_server=false PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump=true gnss-sdr-0.0.9/conf/gnss-sdr_GPS_L1_rtlsdr_realtime.conf000066400000000000000000000120441305042567700231470ustar00rootroot00000000000000; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. ;FOR USE GNSS-SDR WITH RTLSDR DONGLES USER MUST SET THE CALIBRATED SAMPLE RATE HERE ; i.e. using front-end-cal as reported here:http://www.cttc.es/publication/turning-a-television-into-a-gnss-receiver/ GNSS-SDR.internal_fs_hz=1999898 ;######### SUPL RRLP GPS assistance configuration ##### ; Check http://www.mcc-mnc.com/ ; On Android: https://play.google.com/store/apps/details?id=net.its_here.cellidinfo&hl=en GNSS-SDR.SUPL_gps_enabled=false GNSS-SDR.SUPL_read_gps_assistance_xml=false GNSS-SDR.SUPL_gps_ephemeris_server=supl.google.com GNSS-SDR.SUPL_gps_ephemeris_port=7275 GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com GNSS-SDR.SUPL_gps_acquisition_port=7275 GNSS-SDR.SUPL_MCC=244 GNSS-SDR.SUPL_MNS=5 GNSS-SDR.SUPL_LAC=0x59e2 GNSS-SDR.SUPL_CI=0x31b0 ;######### SIGNAL_SOURCE CONFIG ############ SignalSource.implementation=Osmosdr_Signal_Source ;SignalSource.filename=/media/DATALOGGER_/signals/RTL-SDR/geo/pmt4.dat SignalSource.item_type=gr_complex ;FOR USE GNSS-SDR WITH RTLSDR DONGLES USER MUST SET THE CALIBRATED SAMPLE RATE HERE ; i.e. using front-end-cal as reported here:http://www.cttc.es/publication/turning-a-television-into-a-gnss-receiver/ SignalSource.sampling_frequency=2000000 SignalSource.freq=1575420000 SignalSource.gain=40 SignalSource.rf_gain=40 SignalSource.if_gain=30 SignalSource.AGC_enabled = false SignalSource.samples=0 SignalSource.repeat=false SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat SignalSource.enable_throttle_control=false ;######### SIGNAL_CONDITIONER CONFIG ############ SignalConditioner.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER CONFIG ############ DataTypeAdapter.implementation=Pass_Through ;######### INPUT_FILTER CONFIG ############ InputFilter.implementation=Freq_Xlating_Fir_Filter InputFilter.dump=false InputFilter.dump_filename=../data/input_filter.dat InputFilter.input_item_type=gr_complex InputFilter.output_item_type=gr_complex InputFilter.taps_item_type=float InputFilter.number_of_taps=5 InputFilter.number_of_bands=2 InputFilter.band1_begin=0.0 InputFilter.band1_end=0.45 InputFilter.band2_begin=0.55 InputFilter.band2_end=1.0 InputFilter.ampl1_begin=1.0 InputFilter.ampl1_end=1.0 InputFilter.ampl2_begin=0.0 InputFilter.ampl2_end=0.0 InputFilter.band1_error=1.0 InputFilter.band2_error=1.0 InputFilter.filter_type=bandpass InputFilter.grid_density=16 ;FOR USE GNSS-SDR WITH RTLSDR DONGLES USER MUST SET THE CALIBRATED SAMPLE RATE HERE ; i.e. using front-end-cal as reported here:http://www.cttc.es/publication/turning-a-television-into-a-gnss-receiver/ InputFilter.sampling_frequency=1999898 InputFilter.IF=80558 ; IF deviation due to front-end LO inaccuracies [Hz] ;######### RESAMPLER CONFIG ############ ;## Resamples the input data. ;# DISABLED IN THE RTL-SDR REALTIME ;#implementation: Use [Pass_Through] or [Direct_Resampler] ;#[Pass_Through] disables this block Resampler.implementation=Pass_Through ;######### CHANNELS GLOBAL CONFIG ############ Channels_1C.count=4 Channels.in_acquisition=1 Channel.signal=1C ;######### ACQUISITION GLOBAL CONFIG ############ Acquisition_1C.dump=false Acquisition_1C.dump_filename=./acq_dump.dat Acquisition_1C.item_type=gr_complex Acquisition_1C.if=0 Acquisition_1C.sampled_ms=1 Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition_Fine_Doppler Acquisition_1C.threshold=0.015 ;Acquisition_1C.pfa=0.0001 Acquisition_1C.doppler_max=10000 Acquisition_1C.doppler_min=-10000 Acquisition_1C.doppler_step=500 Acquisition_1C.max_dwells=15 ;######### TRACKING GLOBAL CONFIG ############ Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking Tracking_1C.item_type=gr_complex Tracking_1C.if=0 Tracking_1C.dump=false Tracking_1C.dump_filename=./tracking_ch_ Tracking_1C.pll_bw_hz=40.0; Tracking_1C.dll_bw_hz=2.0; Tracking_1C.order=3; Tracking_1C.early_late_space_chips=0.5; ;######### TELEMETRY DECODER GPS CONFIG ############ TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false TelemetryDecoder_1C.decimation_factor=1; ;######### OBSERVABLES CONFIG ############ Observables.implementation=GPS_L1_CA_Observables Observables.dump=false Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ ;#implementation: Position Velocity and Time (PVT) implementation algorithm: Use [GPS_L1_CA_PVT] in this version. PVT.implementation=GPS_L1_CA_PVT ;#averaging_depth: Number of PVT observations in the moving average algorithm PVT.averaging_depth=10 ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.flag_averaging=true PVT.output_rate_ms=100 PVT.display_rate_ms=500 PVT.dump_filename=./PVT PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; PVT.flag_nmea_tty_port=false; PVT.nmea_dump_devname=/dev/pts/4 PVT.dump=false PVT.flag_rtcm_server=false PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 gnss-sdr-0.0.9/conf/gnss-sdr_GPS_L1_two_bits_cpx.conf000066400000000000000000000100001305042567700224450ustar00rootroot00000000000000; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=3200000 ;######### SUPL RRLP GPS assistance configuration ##### ; Check http://www.mcc-mnc.com/ ; On Android: https://play.google.com/store/apps/details?id=net.its_here.cellidinfo&hl=en GNSS-SDR.SUPL_gps_enabled=false GNSS-SDR.SUPL_read_gps_assistance_xml=false GNSS-SDR.SUPL_gps_ephemeris_server=supl.google.com GNSS-SDR.SUPL_gps_ephemeris_port=7275 GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com GNSS-SDR.SUPL_gps_acquisition_port=7275 GNSS-SDR.SUPL_MCC=244 GNSS-SDR.SUPL_MNS=5 GNSS-SDR.SUPL_LAC=0x59e2 GNSS-SDR.SUPL_CI=0x31b0 ;######### SIGNAL_SOURCE CONFIG ############ SignalSource.implementation=Two_Bit_Cpx_File_Signal_Source SignalSource.filename=/datalogger/captures/ajith/test1_two_cpx_live.dat ; <- PUT YOUR FILE HERE SignalSource.item_type=byte SignalSource.sampling_frequency=19200000 SignalSource.freq=1575420000 SignalSource.samples=0 SignalSource.repeat=false SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat SignalSource.enable_throttle_control=false ;######### SIGNAL_CONDITIONER CONFIG ############ SignalConditioner.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER CONFIG ############ DataTypeAdapter.implementation=Pass_Through DataTypeAdapter.item_type=gr_complex ;######### INPUT_FILTER CONFIG ############ InputFilter.implementation=Freq_Xlating_Fir_Filter InputFilter.dump=false InputFilter.dump_filename=../data/input_filter.dat InputFilter.input_item_type=gr_complex InputFilter.output_item_type=gr_complex InputFilter.taps_item_type=float InputFilter.number_of_taps=5 InputFilter.number_of_bands=2 InputFilter.band1_begin=0.0 InputFilter.band1_end=0.45 InputFilter.band2_begin=0.55 InputFilter.band2_end=1.0 InputFilter.ampl1_begin=1.0 InputFilter.ampl1_end=1.0 InputFilter.ampl2_begin=0.0 InputFilter.ampl2_end=0.0 InputFilter.band1_error=1.0 InputFilter.band2_error=1.0 InputFilter.filter_type=bandpass InputFilter.grid_density=16 InputFilter.sampling_frequency=19200000 InputFilter.IF=4024000 InputFilter.decimation_factor=6 ;######### RESAMPLER CONFIG ############ Resampler.implementation=Pass_Through Resampler.dump=false Resampler.dump_filename=../data/resampler.dat Resampler.item_type=gr_complex ;######### CHANNELS GLOBAL CONFIG ############ Channels_1C.count=6 Channels.in_acquisition=1 Channel.signal=1C ;######### GPS ACQUISITION CONFIG ############ Acquisition_1C.dump=false Acquisition_1C.dump_filename=./acq_dump.dat Acquisition_1C.item_type=gr_complex Acquisition_1C.if=0 Acquisition_1C.sampled_ms=1 Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition_Fine_Doppler Acquisition_1C.threshold=0.007 ;Acquisition_1C.pfa=0.0001 Acquisition_1C.doppler_max=10000 Acquisition_1C.doppler_min=-10000 Acquisition_1C.doppler_step=500 Acquisition_1C.max_dwells=15 ;######### TRACKING GPS CONFIG ############ Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking Tracking_1C.item_type=gr_complex Tracking_1C.if=0 Tracking_1C.dump=true Tracking_1C.dump_filename=./tracking_ch_ Tracking_1C.pll_bw_hz=40.0; Tracking_1C.dll_bw_hz=1.5; Tracking_1C.order=3; ;######### TELEMETRY DECODER GPS CONFIG ############ TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false TelemetryDecoder_1C.decimation_factor=1; ;######### OBSERVABLES CONFIG ############ Observables.implementation=GPS_L1_CA_Observables Observables.dump=false Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ PVT.implementation=GPS_L1_CA_PVT PVT.averaging_depth=100 PVT.flag_averaging=false PVT.output_rate_ms=10 PVT.display_rate_ms=500 PVT.dump_filename=./PVT PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; PVT.flag_nmea_tty_port=false; PVT.nmea_dump_devname=/dev/pts/4 PVT.flag_rtcm_server=false PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 PVT.dump=false gnss-sdr-0.0.9/conf/gnss-sdr_GPS_L2C_USRP1_realtime.conf000066400000000000000000000151351305042567700226170ustar00rootroot00000000000000; Configuration file for using USRP1 as a RF front-end for GPS L2C signals ; Run: ; gnss-sdr --config_file=/path/to/gnss-sdr_GPS_L2C_USRP1_realtime.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=2000000 ;######### SUPL RRLP GPS assistance configuration ##### ; Check http://www.mcc-mnc.com/ ; On Android: https://play.google.com/store/apps/details?id=net.its_here.cellidinfo&hl=en GNSS-SDR.SUPL_gps_enabled=false GNSS-SDR.SUPL_read_gps_assistance_xml=true GNSS-SDR.SUPL_gps_ephemeris_server=supl.google.com GNSS-SDR.SUPL_gps_ephemeris_port=7275 GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com GNSS-SDR.SUPL_gps_acquisition_port=7275 GNSS-SDR.SUPL_MCC=244 GNSS-SDR.SUPL_MNS=5 GNSS-SDR.SUPL_LAC=0x59e2 GNSS-SDR.SUPL_CI=0x31b0 ;######### SIGNAL_SOURCE CONFIG ############ SignalSource.implementation=UHD_Signal_Source SignalSource.item_type=gr_complex SignalSource.sampling_frequency=2000000 SignalSource.freq=1227600000 SignalSource.gain=60 SignalSource.subdevice=A:0 SignalSource.samples=0 SignalSource.repeat=false SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat SignalSource.enable_throttle_control=false ;######### SIGNAL_CONDITIONER CONFIG ############ SignalConditioner.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER CONFIG ############ DataTypeAdapter.implementation=Pass_Through DataTypeAdapter.item_type=gr_complex ;######### INPUT_FILTER 0 CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. InputFilter.implementation=Freq_Xlating_Fir_Filter ;#dump: Dump the filtered data to a file. InputFilter.dump=false ;#dump_filename: Log path and filename. InputFilter.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse reponse given a set of band edges, ;#the desired reponse on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter.band1_begin=0.0 InputFilter.band1_end=0.45 InputFilter.band2_begin=0.55 InputFilter.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter.ampl1_begin=1.0 InputFilter.ampl1_end=1.0 InputFilter.ampl2_begin=0.0 InputFilter.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter.band1_error=1.0 InputFilter.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter.IF is the intermediate frequency (in Hz) shifted down to zero Hz InputFilter.sampling_frequency=20000000 InputFilter.IF=-1600000 ;# Decimation factor after the frequency tranaslating block InputFilter.decimation_factor=1 ;######### RESAMPLER CONFIG ############ Resampler.implementation=Pass_Through Resampler.dump=false Resampler.dump_filename=../data/resampler.dat Resampler.item_type=gr_complex Resampler.sample_freq_in=2000000 Resampler.sample_freq_out=2000000 ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available GPS satellite channels. Channels_2S.count=1 ;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver Channels.in_acquisition=1 Channel.signal=2S Channel0.signal=2S Channel1.signal=2S Channel2.signal=2S Channel3.signal=2S Channel4.signal=2S Channel5.signal=2S Channel6.signal=2S Channel7.signal=2S ;Channel8.signal=2S ;Channel9.signal=2S ;Channel10.signal=2S ;Channel11.signal=2S ;######### ACQUISITION GLOBAL CONFIG ############ ;# GPS L2C M Acquisition_2S.dump=false Acquisition_2S.dump_filename=./acq_dump.dat Acquisition_2S.item_type=gr_complex Acquisition_2S.if=0 Acquisition_2S.implementation=GPS_L2_M_PCPS_Acquisition Acquisition_2S.threshold=0.0013 ;Acquisition_2S.pfa=0.001 Acquisition_2S.doppler_max=10000 Acquisition_2S.doppler_min=-10000 Acquisition_2S.doppler_step=100 Acquisition_2S.max_dwells=1 Tracking_2S.implementation=GPS_L2_M_DLL_PLL_Tracking Tracking_2S.item_type=gr_complex Tracking_2S.if=0 Tracking_2S.dump=true Tracking_2S.dump_filename=./tracking_ch_ Tracking_2S.pll_bw_hz=1.5; Tracking_2S.dll_bw_hz=0.3; Tracking_2S.order=3; Tracking_2S.early_late_space_chips=0.5; ;######### TELEMETRY DECODER GPS CONFIG ############ TelemetryDecoder_2S.implementation=GPS_L2C_Telemetry_Decoder TelemetryDecoder_2S.dump=false TelemetryDecoder_2S.decimation_factor=1; ;######### OBSERVABLES CONFIG ############. Observables.implementation=Hybrid_Observables Observables.dump=false Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ PVT.implementation=Hybrid_PVT PVT.averaging_depth=10 PVT.flag_averaging=true PVT.output_rate_ms=100 PVT.display_rate_ms=500 PVT.dump_filename=./PVT PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; PVT.flag_nmea_tty_port=false; PVT.nmea_dump_devname=/dev/pts/4 PVT.flag_rtcm_server=false PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 PVT.dump=false gnss-sdr-0.0.9/conf/gnss-sdr_GPS_L2C_USRP_X300_realtime.conf000066400000000000000000000110521305042567700232420ustar00rootroot00000000000000; Configuration file for using USRP X300 as a RF front-end for GPS L2C signals ; Set SignalSource.device_address to the IP address of your device ; and run: ; gnss-sdr --config_file=/path/to/gnss-sdr_GPS_L2C_USRP_X300_realtime.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=4000000 ;######### SUPL RRLP GPS assistance configuration ##### ; Check http://www.mcc-mnc.com/ ; On Android: https://play.google.com/store/apps/details?id=net.its_here.cellidinfo&hl=en GNSS-SDR.SUPL_gps_enabled=false GNSS-SDR.SUPL_read_gps_assistance_xml=true GNSS-SDR.SUPL_gps_ephemeris_server=supl.google.com GNSS-SDR.SUPL_gps_ephemeris_port=7275 GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com GNSS-SDR.SUPL_gps_acquisition_port=7275 GNSS-SDR.SUPL_MCC=244 GNSS-SDR.SUPL_MNS=5 GNSS-SDR.SUPL_LAC=0x59e2 GNSS-SDR.SUPL_CI=0x31b0 ;######### SIGNAL_SOURCE CONFIG ############ SignalSource.implementation=UHD_Signal_Source SignalSource.device_address=192.168.50.2 ; <- PUT THE IP ADDRESS OF YOUR USRP HERE SignalSource.item_type=cshort SignalSource.sampling_frequency=4000000 SignalSource.freq=1227600000 ;### Options: internal, external, or MIMO SignalSource.clock_source=internal SignalSource.gain=35 SignalSource.subdevice=A:0 SignalSource.samples=0 SignalSource.repeat=false SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat SignalSource.enable_throttle_control=false ;######### SIGNAL_CONDITIONER CONFIG ############ SignalConditioner.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER CONFIG ############ DataTypeAdapter.implementation=Pass_Through DataTypeAdapter.item_type=cshort ;######### INPUT_FILTER CONFIG ############ InputFilter.implementation=Fir_Filter InputFilter.dump=false InputFilter.dump_filename=../data/input_filter.dat InputFilter.input_item_type=cshort InputFilter.output_item_type=gr_complex InputFilter.taps_item_type=float InputFilter.number_of_taps=11 InputFilter.number_of_bands=2 InputFilter.band1_begin=0.0 InputFilter.band1_end=0.48 InputFilter.band2_begin=0.52 InputFilter.band2_end=1.0 InputFilter.ampl1_begin=1.0 InputFilter.ampl1_end=1.0 InputFilter.ampl2_begin=0.0 InputFilter.ampl2_end=0.0 InputFilter.band1_error=1.0 InputFilter.band2_error=1.0 InputFilter.filter_type=bandpass InputFilter.grid_density=16 InputFilter.sampling_frequency=4000000 InputFilter.IF=0 ;######### RESAMPLER CONFIG ############ Resampler.implementation=Pass_Through Resampler.dump=false Resampler.dump_filename=../data/resampler.dat Resampler.item_type=gr_complex Resampler.sample_freq_in=4000000 Resampler.sample_freq_out=4000000 ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available GPS satellite channels. Channels_2S.count=1 ;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver Channels.in_acquisition=1 Channel.signal=2S Channel0.signal=2S Channel1.signal=2S Channel2.signal=2S Channel3.signal=2S Channel4.signal=2S Channel5.signal=2S Channel6.signal=2S Channel7.signal=2S ;Channel8.signal=2S ;Channel9.signal=2S ;Channel10.signal=2S ;Channel11.signal=2S ;######### ACQUISITION GLOBAL CONFIG ############ ;# GPS L2C M Acquisition_2S.dump=false Acquisition_2S.dump_filename=./acq_dump.dat Acquisition_2S.item_type=gr_complex Acquisition_2S.if=0 Acquisition_2S.implementation=GPS_L2_M_PCPS_Acquisition Acquisition_2S.threshold=0.0015 ;Acquisition_2S.pfa=0.001 Acquisition_2S.doppler_max=5000 Acquisition_2S.doppler_min=-5000 Acquisition_2S.doppler_step=60 Acquisition_2S.max_dwells=1 Tracking_2S.implementation=GPS_L2_M_DLL_PLL_Tracking Tracking_2S.item_type=gr_complex Tracking_2S.if=0 Tracking_2S.dump=true Tracking_2S.dump_filename=./tracking_ch_ Tracking_2S.pll_bw_hz=2.0; Tracking_2S.dll_bw_hz=0.25; Tracking_2S.order=2; Tracking_2S.early_late_space_chips=0.5; ;######### TELEMETRY DECODER GPS CONFIG ############ TelemetryDecoder_2S.implementation=GPS_L2C_Telemetry_Decoder TelemetryDecoder_2S.dump=true TelemetryDecoder_2S.decimation_factor=1; ;######### OBSERVABLES CONFIG ############. Observables.implementation=Hybrid_Observables Observables.dump=false Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ PVT.implementation=Hybrid_PVT PVT.averaging_depth=10 PVT.flag_averaging=true PVT.output_rate_ms=100 PVT.display_rate_ms=500 PVT.dump_filename=./PVT PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; PVT.flag_nmea_tty_port=false; PVT.nmea_dump_devname=/dev/pts/4 PVT.flag_rtcm_server=false PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 PVT.dump=false gnss-sdr-0.0.9/conf/gnss-sdr_Galileo_E1_USRP_X300_realtime.conf000066400000000000000000000050741305042567700240610ustar00rootroot00000000000000; Configuration file for using USRP X300 as a RF front-end for Galileo E1 signals. ; Set SignalSource.device_address to the IP address of your device ; and run: ; gnss-sdr --config_file=/path/to/gnss-sdr_Galileo_E1_USRP_X300_realtime.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=4000000 ;######### SIGNAL_SOURCE CONFIG ############ SignalSource.implementation=UHD_Signal_Source SignalSource.item_type=gr_complex SignalSource.device_address=192.168.40.2 ; <- PUT THE IP ADDRESS OF YOUR USRP HERE SignalSource.sampling_frequency=4000000 SignalSource.freq=1575420000 SignalSource.gain=50 SignalSource.subdevice=A:0 SignalSource.samples=0 SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat SignalSource.enable_throttle_control=false ;######### SIGNAL_CONDITIONER CONFIG ############ SignalConditioner.implementation=Pass_Through ;######### CHANNELS GLOBAL CONFIG ###### Channels_1B.count=4 Channels.in_acquisition=1 Channel.signal=1B ;######### ACQUISITION GLOBAL CONFIG ############ Acquisition_1B.dump=false Acquisition_1B.dump_filename=./acq_dump.dat Acquisition_1B.item_type=gr_complex Acquisition_1B.if=0 Acquisition_1B.sampled_ms=4 Acquisition_1B.implementation=Galileo_E1_PCPS_Ambiguous_Acquisition ;Acquisition_1B.threshold=1 Acquisition_1B.pfa=0.000008 Acquisition_1B.doppler_max=6000 Acquisition_1B.doppler_step=250 Acquisition_1B.cboc=false ;######### TRACKING GLOBAL CONFIG ############ Tracking_1B.implementation=Galileo_E1_DLL_PLL_VEML_Tracking Tracking_1B.item_type=gr_complex Tracking_1B.if=0 Tracking_1B.dump=false Tracking_1B.dump_filename=../data/veml_tracking_ch_ Tracking_1B.pll_bw_hz=20.0; Tracking_1B.dll_bw_hz=2.0; Tracking_1B.order=3; Tracking_1B.early_late_space_chips=0.15; Tracking_1B.very_early_late_space_chips=0.6; ;######### TELEMETRY DECODER CONFIG ############ TelemetryDecoder_1B.implementation=Galileo_E1B_Telemetry_Decoder TelemetryDecoder_1B.dump=false ;######### OBSERVABLES CONFIG ############ Observables.implementation=Galileo_E1B_Observables Observables.dump=false Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ PVT.implementation=GALILEO_E1_PVT PVT.averaging_depth=100 PVT.flag_averaging=false PVT.output_rate_ms=100; PVT.display_rate_ms=500; PVT.dump=false PVT.dump_filename=./PVT PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea PVT.flag_nmea_tty_port=true PVT.nmea_dump_devname=/dev/pts/4 PVT.flag_rtcm_server=true PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 gnss-sdr-0.0.9/conf/gnss-sdr_Galileo_E1_acq_QuickSync.conf000066400000000000000000000267041305042567700234340ustar00rootroot00000000000000; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=4000000 ;######### SIGNAL_SOURCE CONFIG ############ ;#implementation: Use [File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] or [Rtlsdr_Signal_Source] SignalSource.implementation=File_Signal_Source ;#filename: path to file with the captured GNSS signal samples to be processed SignalSource.filename=/datalogger/signals/CTTC/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN.dat ; <- PUT YOUR FILE HERE ;#item_type: Type and resolution for each of the signal samples. ;#Use gr_complex for 32 bits float I/Q or ishort for I/Q interleaved short integer. ;#If ishort is selected you should have to instantiate the Ishort_To_Complex data_type_adapter. SignalSource.item_type=ishort ;#sampling_frequency: Original Signal sampling frequency in [Hz] SignalSource.sampling_frequency=4000000 ;#freq: RF front-end center frequency in [Hz] SignalSource.freq=1575420000 ;#samples: Number of samples to be processed. Notice that 0 indicates the entire file. SignalSource.samples=0 ;#repeat: Repeat the processing file. Disable this option in this version SignalSource.repeat=false ;#dump: Dump the Signal source data to a file. Disable this option in this version SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat ;#enable_throttle_control: Enabling this option tells the signal source to keep the delay between samples in post processing. ; it helps to not overload the CPU, but the processing time will be longer. SignalSource.enable_throttle_control=false ;######### SIGNAL_CONDITIONER CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. ;#implementation: Use [Pass_Through] or [Signal_Conditioner] ;#[Pass_Through] disables this block and the [DataTypeAdapter], [InputFilter] and [Resampler] blocks ;#[Signal_Conditioner] enables this block. Then you have to configure [DataTypeAdapter], [InputFilter] and [Resampler] blocks SignalConditioner.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER CONFIG ############ ;## Changes the type of input data. ;#implementation: Use [Ishort_To_Complex] or [Pass_Through] DataTypeAdapter.implementation=Ishort_To_Complex ;#dump: Dump the filtered data to a file. DataTypeAdapter.dump=false ;#dump_filename: Log path and filename. DataTypeAdapter.dump_filename=../data/data_type_adapter.dat ;######### INPUT_FILTER CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. ;InputFilter.implementation=Fir_Filter ;InputFilter.implementation=Freq_Xlating_Fir_Filter InputFilter.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter.dump=false ;#dump_filename: Log path and filename. InputFilter.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse reponse given a set of band edges, the desired reponse on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands #used for gps InputFilter.band1_begin=0.0 ;InputFilter.band1_end=0.8 InputFilter.band1_end=0.85 InputFilter.band2_begin=0.90 InputFilter.band2_end=1.0 #used for galileo InputFilter.band1_begin=0.0 ;InputFilter.band1_end=0.8 InputFilter.band1_end=0.45 InputFilter.band2_begin=0.55 InputFilter.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter.ampl1_begin=1.0 InputFilter.ampl1_end=1.0 InputFilter.ampl2_begin=0.0 InputFilter.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter.band1_error=1.0 InputFilter.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter.IF is the intermediate frequency (in Hz) shifted down to zero Hz InputFilter.sampling_frequency=4000000 InputFilter.IF=0 ;######### RESAMPLER CONFIG ############ ;## Resamples the input data. ;#implementation: Use [Pass_Through] or [Direct_Resampler] ;#[Pass_Through] disables this block ;#[Direct_Resampler] enables a resampler that implements a nearest neigbourhood interpolation ;Resampler.implementation=Direct_Resampler Resampler.implementation=Pass_Through ;#dump: Dump the resamplered data to a file. Resampler.dump=false ;#dump_filename: Log path and filename. Resampler.dump_filename=../data/resampler.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Resampler.item_type=gr_complex ;#sample_freq_in: the sample frequency of the input signal Resampler.sample_freq_in=4000000 ;#sample_freq_out: the desired sample frequency of the output signal Resampler.sample_freq_out=4000000 ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available satellite channels. Channels_1B.count=4 ;#in_acquisition: Number of channels simultaneously acquiring Channels.in_acquisition=1 Channel.signal=1B ;######### ACQUISITION GLOBAL CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1B.dump=false ;#filename: Log path and filename Acquisition_1B.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1B.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_1B.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1B.coherent_integration_time_ms=4 Acquisition_1B.implementation=Galileo_E1_PCPS_QuickSync_Ambiguous_Acquisition ;#threshold: Acquisition threshold Acquisition_1B.threshold=0.05 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1B.doppler_max=15000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_1B.doppler_step=125 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms]; Acquisition_1B.coherent_integration_time_ms=8 Acquisition_1B.cboc=false ;######### TRACKING GLOBAL CONFIG ############ ;#implementation: Selected tracking algorithm [Galileo_E1_DLL_PLL_VEML_Tracking] Tracking_1B.implementation=Galileo_E1_DLL_PLL_VEML_Tracking ;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version. Tracking_1B.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_1B.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_1B.dump=true ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_1B.dump_filename=../data/veml_tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1B.pll_bw_hz=20.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_1B.dll_bw_hz=2.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_1B.order=3; ;#early_late_space_chips: correlator early-late space [chips]. Use [0.5] for GPS and [0.15] for Galileo Tracking_1B.early_late_space_chips=0.15; ;#very_early_late_space_chips: only for [Galileo_E1_DLL_PLL_VEML_Tracking], correlator very early-late space [chips]. Use [0.6] Tracking_1B.very_early_late_space_chips=0.6; ;######### TELEMETRY DECODER CONFIG ############ ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L1 C/A or [Galileo_E1B_Telemetry_Decoder] for Galileo E1B TelemetryDecoder_1B.implementation=Galileo_E1B_Telemetry_Decoder TelemetryDecoder_1B.dump=false ;######### OBSERVABLES CONFIG ############ ;#implementation: Observables.implementation=Galileo_E1B_Observables ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] Observables.dump=false ;#dump_filename: Log path and filename. Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ ;#implementation: Position Velocity and Time (PVT) implementation algorithm: PVT.implementation=GALILEO_E1_PVT ;#averaging_depth: Number of PVT observations in the moving average algorithm PVT.averaging_depth=100 ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.flag_averaging=true ;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time (for GPS CA L1 is 1ms) [ms] PVT.output_rate_ms=100; ;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms<=display_rate_ms. PVT.display_rate_ms=500; ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump=false ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump and ".kml" to GoogleEarth dump. PVT.dump_filename=./PVT ;# KML, GeoJSON, NMEA and RTCM output configuration ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump, ".kml" and ".geojson" to GIS-friendly formats. PVT.dump_filename=./PVT ;#nmea_dump_filename: NMEA log path and filename PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; ;#flag_nmea_tty_port: Enables or disables the NMEA log to a serial TTY port (Can be used with real hardware or virtual one) PVT.flag_nmea_tty_port=true; ;#nmea_dump_devname: serial device descriptor for NMEA logging PVT.nmea_dump_devname=/dev/pts/4 ;#flag_rtcm_server: Enables or disables a TCP/IP server transmitting RTCM 3.2 messages (accepts multiple clients, port 2101 by default) PVT.flag_rtcm_server=false; ;#flag_rtcm_tty_port: Enables or disables the RTCM log to a serial TTY port (Can be used with real hardware or virtual one) PVT.flag_rtcm_tty_port=false; ;#rtcm_dump_devname: serial device descriptor for RTCM logging PVT.rtcm_dump_devname=/dev/pts/1 gnss-sdr-0.0.9/conf/gnss-sdr_Galileo_E1_ishort.conf000066400000000000000000000276351305042567700222130ustar00rootroot00000000000000; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=4000000 ;######### SIGNAL_SOURCE CONFIG ############ ;#implementation: Use [File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) SignalSource.implementation=File_Signal_Source ;#filename: path to file with the captured GNSS signal samples to be processed SignalSource.filename=/Users/carlesfernandez/Documents/workspace/code2/trunk/data/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN.dat ;/datalogger/signals/CTTC/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN.dat ; <- PUT YOUR FILE HERE ;#item_type: Type and resolution for each of the signal samples. SignalSource.item_type=ishort ;#sampling_frequency: Original Signal sampling frequency in [Hz] SignalSource.sampling_frequency=4000000 ;#freq: RF front-end center frequency in [Hz] SignalSource.freq=1575420000 ;#samples: Number of samples to be processed. Notice that 0 indicates the entire file. SignalSource.samples=0 ;#repeat: Repeat the processing file. Disable this option in this version SignalSource.repeat=false ;#dump: Dump the Signal source data to a file. Disable this option in this version SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat ;#enable_throttle_control: Enabling this option tells the signal source to keep the delay between samples in post processing. ; it helps to not overload the CPU, but the processing time will be longer. SignalSource.enable_throttle_control=false ;######### SIGNAL_CONDITIONER CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. ;#implementation: Use [Pass_Through] or [Signal_Conditioner] ;#[Pass_Through] disables this block and the [DataTypeAdapter], [InputFilter] and [Resampler] blocks ;#[Signal_Conditioner] enables this block. Then you have to configure [DataTypeAdapter], [InputFilter] and [Resampler] blocks SignalConditioner.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER CONFIG ############ ;## Changes the type of input data. ;#implementation: [Pass_Through] disables this block DataTypeAdapter.implementation=Ishort_To_Complex ;######### INPUT_FILTER CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. ;InputFilter.implementation=Fir_Filter ;InputFilter.implementation=Freq_Xlating_Fir_Filter InputFilter.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter.dump=false ;#dump_filename: Log path and filename. InputFilter.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of GNU Radio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter impulse response given a set of band edges, the desired response on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. InputFilter.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. InputFilter.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter.band1_begin=0.0 InputFilter.band1_end=0.45 InputFilter.band2_begin=0.55 InputFilter.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter.ampl1_begin=1.0 InputFilter.ampl1_end=1.0 InputFilter.ampl2_begin=0.0 InputFilter.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter.band1_error=1.0 InputFilter.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter.IF is the intermediate frequency (in Hz) shifted down to zero Hz InputFilter.sampling_frequency=4000000 InputFilter.IF=0 ;######### RESAMPLER CONFIG ############ ;## Resamples the input data. ;#implementation: Use [Pass_Through] or [Direct_Resampler] ;#[Pass_Through] disables this block ;#[Direct_Resampler] enables a resampler that implements a nearest neighborhood interpolation ;Resampler.implementation=Direct_Resampler Resampler.implementation=Pass_Through ;#dump: Dump the resampled data to a file. Resampler.dump=false ;#dump_filename: Log path and filename. Resampler.dump_filename=../data/resampler.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Resampler.item_type=gr_complex ;#sample_freq_in: the sample frequency of the input signal Resampler.sample_freq_in=4000000 ;#sample_freq_out: the desired sample frequency of the output signal Resampler.sample_freq_out=4000000 ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available Galileo satellite channels. Channels_1B.count=8 ;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver Channels.in_acquisition=1 Channel.signal=1B ;######### ACQUISITION GLOBAL CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1B.dump=false ;#filename: Log path and filename Acquisition_1B.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1B.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_1B.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1B.sampled_ms=4 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1B.implementation=Galileo_E1_PCPS_Ambiguous_Acquisition ;#threshold: Acquisition threshold ;Acquisition_1B.threshold=0 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1B.pfa=0.000002 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1B.doppler_max=15000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_1B.doppler_step=125 ;######### ACQUISITION CHANNELS CONFIG ###### ;######### ACQUISITION CH 0 CONFIG ############ ;#repeat_satellite: Use only jointly with the satellite PRN ID option. The default value is false ;Acquisition_1B0.repeat_satellite = true ;Acquisition_1B1.repeat_satellite = true ;Acquisition_1B2.repeat_satellite = true ;Acquisition_1B3.repeat_satellite = true ;#cboc: Only for [Galileo_E1_PCPS_Ambiguous_Acquisition]. This option allows you to choose between acquiring with CBOC signal [true] or sinboc(1,1) signal [false]. ;#Use only if GNSS-SDR.internal_fs_hz is greater than or equal to 6138000 Acquisition_1B.cboc=false ;######### TRACKING GLOBAL CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_FLL_PLL_Tracking] or [GPS_L1_CA_TCP_CONNECTOR_Tracking] or [Galileo_E1_DLL_PLL_VEML_Tracking] Tracking_1B.implementation=Galileo_E1_DLL_PLL_VEML_Tracking ;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version. Tracking_1B.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_1B.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_1B.dump=false ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_1B.dump_filename=../data/veml_tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1B.pll_bw_hz=15.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_1B.dll_bw_hz=2.0; ;#fll_bw_hz: FLL loop filter bandwidth [Hz] Tracking_1B.fll_bw_hz=10.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_1B.order=3; ;#early_late_space_chips: correlator early-late space [chips]. Use [0.5] for GPS and [0.15] for Galileo Tracking_1B.early_late_space_chips=0.15; ;#very_early_late_space_chips: only for [Galileo_E1_DLL_PLL_VEML_Tracking], correlator very early-late space [chips]. Use [0.6] Tracking_1B.very_early_late_space_chips=0.6; ;######### TELEMETRY DECODER CONFIG ############ ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L1 C/A or [Galileo_E1B_Telemetry_Decoder] for Galileo E1B TelemetryDecoder_1B.implementation=Galileo_E1B_Telemetry_Decoder TelemetryDecoder_1B.dump=false ;######### OBSERVABLES CONFIG ############ ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. Observables.implementation=Galileo_E1B_Observables ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] Observables.dump=false ;#dump_filename: Log path and filename. Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ ;#implementation: Position Velocity and Time (PVT) implementation algorithm: Use [GPS_L1_CA_PVT] in this version. PVT.implementation=GALILEO_E1_PVT ;#averaging_depth: Number of PVT observations in the moving average algorithm PVT.averaging_depth=100 ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.flag_averaging=false ;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time (for GPS CA L1 is 1ms) [ms] PVT.output_rate_ms=100; ;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms<=display_rate_ms. PVT.display_rate_ms=500; ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump=false ;# KML, GeoJSON, NMEA and RTCM output configuration ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump, ".kml" and ".geojson" to GIS-friendly formats. PVT.dump_filename=./PVT ;#nmea_dump_filename: NMEA log path and filename PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; ;#flag_nmea_tty_port: Enables or disables the NMEA log to a serial TTY port (Can be used with real hardware or virtual one) PVT.flag_nmea_tty_port=true; ;#nmea_dump_devname: serial device descriptor for NMEA logging PVT.nmea_dump_devname=/dev/pts/4 ;#flag_rtcm_server: Enables or disables a TCP/IP server transmitting RTCM 3.2 messages (accepts multiple clients, port 2101 by default) PVT.flag_rtcm_server=true; PVT.rtcm_tcp_port=2101 PVT.rtcm_MT1045_rate_ms=5000 PVT.rtcm_MSM_rate_ms=1000 ;#flag_rtcm_tty_port: Enables or disables the RTCM log to a serial TTY port (Can be used with real hardware or virtual one) PVT.flag_rtcm_tty_port=false; ;#rtcm_dump_devname: serial device descriptor for RTCM logging PVT.rtcm_dump_devname=/dev/pts/1 gnss-sdr-0.0.9/conf/gnss-sdr_Galileo_E1_nsr.conf000066400000000000000000000077041305042567700215000ustar00rootroot00000000000000; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. ;GNSS-SDR.internal_fs_hz=6826700 GNSS-SDR.internal_fs_hz=2560000 ;GNSS-SDR.internal_fs_hz=4096000 ;GNSS-SDR.internal_fs_hz=5120000 ;######### SIGNAL_SOURCE CONFIG ############ SignalSource.implementation=Nsr_File_Signal_Source SignalSource.filename=/datalogger/signals/ifen/E1L1_FE0_Band0.stream ; <- PUT YOUR FILE HERE SignalSource.item_type=byte SignalSource.sampling_frequency=20480000 SignalSource.freq=1575420000 SignalSource.samples=0 ; 0 means the entire file SignalSource.repeat=false SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat ;#enable_throttle_control: Enabling this option tells the signal source to keep the delay between samples in post processing. ; it helps to not overload the CPU, but the processing time will be longer. SignalSource.enable_throttle_control=false ;######### SIGNAL_CONDITIONER CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. SignalConditioner.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER CONFIG ############ DataTypeAdapter.implementation=Pass_Through DataTypeAdapter.item_type=float ;######### INPUT_FILTER CONFIG ############ InputFilter.implementation=Freq_Xlating_Fir_Filter InputFilter.dump=false InputFilter.dump_filename=../data/input_filter.dat InputFilter.input_item_type=float InputFilter.output_item_type=gr_complex InputFilter.taps_item_type=float InputFilter.number_of_taps=5 InputFilter.number_of_bands=2 InputFilter.band1_begin=0.0 InputFilter.band1_end=0.45 InputFilter.band2_begin=0.55 InputFilter.band2_end=1.0 InputFilter.ampl1_begin=1.0 InputFilter.ampl1_end=1.0 InputFilter.ampl2_begin=0.0 InputFilter.ampl2_end=0.0 InputFilter.band1_error=1.0 InputFilter.band2_error=1.0 InputFilter.filter_type=bandpass InputFilter.grid_density=16 InputFilter.sampling_frequency=20480000 InputFilter.IF=5499998.47412109 InputFilter.decimation_factor=8 ;######### RESAMPLER CONFIG ############ Resampler.implementation=Pass_Through ;######### CHANNELS GLOBAL CONFIG ############ Channels_1B.count=8 Channels.in_acquisition=1 Channel.signal=1B ;######### ACQUISITION GLOBAL CONFIG ############ Acquisition_1B.dump=false Acquisition_1B.dump_filename=./acq_dump.dat Acquisition_1B.item_type=gr_complex Acquisition_1B.if=0 Acquisition_1B.sampled_ms=4 Acquisition_1B.implementation=Galileo_E1_PCPS_Ambiguous_Acquisition Acquisition_1B.pfa=0.0000008 Acquisition_1B.doppler_max=15000 Acquisition_1B.doppler_step=125 Acquisition_1B.cboc=false ; This option allows you to choose between acquiring with CBOC signal [true] or sinboc(1,1) signal [false]. Use only if GNSS-SDR.internal_fs_hz is greater than or equal to 6138000 ;######### TRACKING GLOBAL CONFIG ############ Tracking_1B.implementation=Galileo_E1_DLL_PLL_VEML_Tracking Tracking_1B.item_type=gr_complex Tracking_1B.if=0 Tracking_1B.dump=false Tracking_1B.dump_filename=../data/veml_tracking_ch_ Tracking_1B.pll_bw_hz=20.0; Tracking_1B.dll_bw_hz=2.0; Tracking_1B.order=3; Tracking_1B.early_late_space_chips=0.15; Tracking_1B.very_early_late_space_chips=0.6; ;######### TELEMETRY DECODER CONFIG ############ TelemetryDecoder_1B.implementation=Galileo_E1B_Telemetry_Decoder TelemetryDecoder_1B.dump=false ;######### OBSERVABLES CONFIG ############ Observables.implementation=Galileo_E1B_Observables Observables.dump=true Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ PVT.implementation=GALILEO_E1_PVT PVT.averaging_depth=1 PVT.flag_averaging=false PVT.output_rate_ms=100 PVT.display_rate_ms=500 PVT.dump=true PVT.dump_filename=./PVT PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea PVT.flag_nmea_tty_port=true PVT.nmea_dump_devname=/dev/pts/4 PVT.flag_rtcm_server=false PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 gnss-sdr-0.0.9/conf/gnss-sdr_Galileo_E5a.conf000066400000000000000000000317441305042567700207640ustar00rootroot00000000000000; Default configuration file ; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=32000000 ;######### SUPL RRLP GPS assistance configuration ##### ; Check http://www.mcc-mnc.com/ ; On Android: https://play.google.com/store/apps/details?id=net.its_here.cellidinfo&hl=en ;GNSS-SDR.SUPL_gps_enabled=false ;GNSS-SDR.SUPL_read_gps_assistance_xml=false ;GNSS-SDR.SUPL_gps_ephemeris_server=supl.google.com ;GNSS-SDR.SUPL_gps_ephemeris_port=7275 ;GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com ;GNSS-SDR.SUPL_gps_acquisition_port=7275 ;GNSS-SDR.SUPL_MCC=244 ;GNSS-SDR.SUPL_MNS=5 ;GNSS-SDR.SUPL_LAC=0x59e2 ;GNSS-SDR.SUPL_CI=0x31b0 ;######### SIGNAL_SOURCE CONFIG ############ ;#implementation: Use [File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) SignalSource.implementation=File_Signal_Source ;#filename: path to file with the captured GNSS signal samples to be processed SignalSource.filename=/datalogger/signals/ifen/32MS_complex.dat ; <- PUT YOUR FILE HERE ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. SignalSource.item_type=gr_complex ;#sampling_frequency: Original Signal sampling frequency in [Hz] SignalSource.sampling_frequency=32000000 ;#freq: RF front-end center frequency in [Hz] SignalSource.freq=1176450000 ;#samples: Number of samples to be processed. Notice that 0 indicates the entire file. SignalSource.samples=0 ;#repeat: Repeat the processing file. Disable this option in this version SignalSource.repeat=false ;#dump: Dump the Signal source data to a file. Disable this option in this version SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat ;#enable_throttle_control: Enabling this option tells the signal source to keep the delay between samples in post processing. ; it helps to not overload the CPU, but the processing time will be longer. SignalSource.enable_throttle_control=false ;######### SIGNAL_CONDITIONER CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. ;#implementation: Use [Pass_Through] or [Signal_Conditioner] ;#[Pass_Through] disables this block and the [DataTypeAdapter], [InputFilter] and [Resampler] blocks ;#[Signal_Conditioner] enables this block. Then you have to configure [DataTypeAdapter], [InputFilter] and [Resampler] blocks ;SignalConditioner.implementation=Signal_Conditioner SignalConditioner.implementation=Pass_Through ;######### DATA_TYPE_ADAPTER CONFIG ############ ;## Changes the type of input data. ;#implementation: [Pass_Through] disables this block DataTypeAdapter.implementation=Pass_Through ;######### INPUT_FILTER CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. ;InputFilter.implementation=Fir_Filter ;InputFilter.implementation=Freq_Xlating_Fir_Filter InputFilter.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter.dump=false ;#dump_filename: Log path and filename. InputFilter.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse reponse given a set of band edges, the desired reponse on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. InputFilter.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter.band1_begin=0.0 InputFilter.band1_end=0.45 InputFilter.band2_begin=0.55 InputFilter.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter.ampl1_begin=1.0 InputFilter.ampl1_end=1.0 InputFilter.ampl2_begin=0.0 InputFilter.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter.band1_error=1.0 InputFilter.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter.IF is the intermediate frequency (in Hz) shifted down to zero Hz InputFilter.sampling_frequency=32000000 InputFilter.IF=0 ;######### RESAMPLER CONFIG ############ ;## Resamples the input data. ;#implementation: Use [Pass_Through] or [Direct_Resampler] ;#[Pass_Through] disables this block ;#[Direct_Resampler] enables a resampler that implements a nearest neigbourhood interpolation ;Resampler.implementation=Direct_Resampler Resampler.implementation=Pass_Through ;#dump: Dump the resamplered data to a file. Resampler.dump=false ;#dump_filename: Log path and filename. Resampler.dump_filename=../data/resampler.dat ;#item_type: Type and resolution for each of the signal samples. Resampler.item_type=gr_complex ;#sample_freq_in: the sample frequency of the input signal Resampler.sample_freq_in=8000000 ;#sample_freq_out: the desired sample frequency of the output signal Resampler.sample_freq_out=4000000 ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available satellite channels. Channels_5X.count=1 ;#in_acquisition: Number of channels simultaneously acquiring Channels.in_acquisition=1 ;#system: GPS, GLONASS, Galileo, SBAS or Compass ;#if the option is disabled by default is assigned GPS Channel.signal=5X ;######### SPECIFIC CHANNELS CONFIG ###### ;#The following options are specific to each channel and overwrite the generic options ;######### CHANNEL 0 CONFIG ############ Channel0.signal=5X ;#satellite: Satellite PRN ID for this channel. Disable this option to random search Channel0.satellite=19 ;Channel0.repeat_satellite=true ;######### CHANNEL 1 CONFIG ############ ;Channel1.system=Galileo ;Channel1.signal=5Q ;Channel1.satellite=12 ;######### CHANNEL 2 CONFIG ############ ;Channel2.system=Galileo ;Channel2.signal=5Q ;Channel2.satellite=11 ;######### CHANNEL 3 CONFIG ############ ;Channel3.system=Galileo ;Channel3.signal=5Q ;Channel3.satellite=20 ;######### ACQUISITION GLOBAL CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_5X.dump=true ;#filename: Log path and filename Acquisition_5X.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_5X.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_5X.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_5X.coherent_integration_time_ms=1 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_5X.implementation=Galileo_E5a_Noncoherent_IQ_Acquisition_CAF ;#threshold: Acquisition threshold. It will be ignored if pfa is defined. Acquisition_5X.threshold=0.001 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_5X.pfa=0.0003 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_5X.doppler_max=10000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_5X.doppler_step=250 ;#bit_transition_flag: Enable or disable a strategy to deal with bit transitions in GPS signals: process two dwells and take ;maximum test statistics. Only use with implementation: [GPS_L1_CA_PCPS_Acquisition] (should not be used for Galileo_E1_PCPS_Ambiguous_Acquisition]) Acquisition_5X.bit_transition_flag=false ;#max_dwells: Maximum number of consecutive dwells to be processed. It will be ignored if bit_transition_flag=true Acquisition_5X.max_dwells=1 ;#CAF filter: **Only for E5a** Resolves doppler ambiguity averaging the specified BW in the winner code delay. If set to 0 CAF filter is desactivated. Recommended value 3000 Hz Acquisition_5X.CAF_window_hz=0 ;#Zero_padding: **Only for E5a** Avoids power loss and doppler ambiguity in bit transitions by correlating one code with twice the input data length, ensuring that at least one full code is present without transitions. ;#If set to 1 it is ON, if set to 0 it is OFF. Acquisition_5X.Zero_padding=0 ;######### TRACKING GLOBAL CONFIG ############ ;#implementation: Selected tracking algorithm: Tracking_5X.implementation=Galileo_E5a_DLL_PLL_Tracking ;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version. Tracking_5X.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_5X.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_5X.dump=true ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_5X.dump_filename=./tracking_ch_ ;#pll_bw_hz_init: **Only for E5a** PLL loop filter bandwidth during initialization [Hz] Tracking_5X.pll_bw_hz_init=20.0; ;#dll_bw_hz_init: **Only for E5a** DLL loop filter bandwidth during initialization [Hz] Tracking_5X.dll_bw_hz_init=20.0; ;#dll_ti_ms: **Only for E5a** loop filter integration time after initialization (secondary code delay search)[ms] ;Tracking_5X.ti_ms=3; Tracking_5X.ti_ms=1; ;#pll_bw_hz: PLL loop filter bandwidth [Hz] ;Tracking.pll_bw_hz=5.0; Tracking_5X.pll_bw_hz=20.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] ;Tracking.dll_bw_hz=2.0; Tracking_5X.dll_bw_hz=20.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_5X.order=2; ;#early_late_space_chips: correlator early-late space [chips]. Use [0.5] Tracking_5X.early_late_space_chips=0.5; ;######### TELEMETRY DECODER CONFIG ############ ;#implementation: TelemetryDecoder_5X.implementation=Galileo_E5a_Telemetry_Decoder TelemetryDecoder_5X.dump=false ;######### OBSERVABLES CONFIG ############ ;#implementation: ;Use [Galileo_E1B_Observables] for E5a also. Observables.implementation=Galileo_E1B_Observables ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] Observables.dump=false ;#dump_filename: Log path and filename. Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ ;#implementation: Position Velocity and Time (PVT) implementation algorithm: ;Use [GALILEO_E1_PVT] for E5a also. PVT.implementation=GALILEO_E1_PVT ;#averaging_depth: Number of PVT observations in the moving average algorithm PVT.averaging_depth=100 ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.flag_averaging=true ;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time [ms] PVT.output_rate_ms=100 ;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms<=display_rate_ms. PVT.display_rate_ms=500 ;# KML, GeoJSON, NMEA and RTCM output configuration ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump and ".kml" to GoogleEarth dump. PVT.dump_filename=./PVT ;#nmea_dump_filename: NMEA log path and filename PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; ;#flag_nmea_tty_port: Enable or disable the NMEA log to a serial TTY port (Can be used with real hardware or virtual one) PVT.flag_nmea_tty_port=true; ;#nmea_dump_devname: serial device descriptor for NMEA logging PVT.nmea_dump_devname=/dev/pts/4 PVT.flag_rtcm_server=false PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump=false gnss-sdr-0.0.9/conf/gnss-sdr_Galileo_E5a_IFEN_CTTC.conf000066400000000000000000000123461305042567700223770ustar00rootroot00000000000000; Default configuration file ; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=50000000 ;######### SUPL RRLP GPS assistance configuration ##### ; Check http://www.mcc-mnc.com/ ; On Android: https://play.google.com/store/apps/details?id=net.its_here.cellidinfo&hl=en ;GNSS-SDR.SUPL_gps_enabled=false ;GNSS-SDR.SUPL_read_gps_assistance_xml=false ;GNSS-SDR.SUPL_gps_ephemeris_server=supl.google.com ;GNSS-SDR.SUPL_gps_ephemeris_port=7275 ;GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com ;GNSS-SDR.SUPL_gps_acquisition_port=7275 ;GNSS-SDR.SUPL_MCC=244 ;GNSS-SDR.SUPL_MNS=5 ;GNSS-SDR.SUPL_LAC=0x59e2 ;GNSS-SDR.SUPL_CI=0x31b0 ;######### SIGNAL_SOURCE CONFIG ############ SignalSource.implementation=File_Signal_Source SignalSource.filename=/datalogger/signals/ifen/Galileo_E5ab_IFEN_CTTC_run1.dat ; <- PUT YOUR FILE HERE SignalSource.item_type=gr_complex SignalSource.sampling_frequency=50000000 SignalSource.freq=1176450000 SignalSource.samples=0 SignalSource.repeat=false SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat SignalSource.enable_throttle_control=false ;######### SIGNAL_CONDITIONER CONFIG ############ SignalConditioner.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER CONFIG ############ DataTypeAdapter.implementation=Pass_Through ;######### INPUT_FILTER CONFIG ############ InputFilter.implementation=Freq_Xlating_Fir_Filter InputFilter.dump=false InputFilter.dump_filename=../data/input_filter.dat InputFilter.input_item_type=gr_complex InputFilter.output_item_type=gr_complex InputFilter.taps_item_type=float InputFilter.number_of_taps=5 InputFilter.number_of_bands=2 InputFilter.band1_begin=0.0 InputFilter.band1_end=0.45 InputFilter.band2_begin=0.55 InputFilter.band2_end=1.0 InputFilter.ampl1_begin=1.0 InputFilter.ampl1_end=1.0 InputFilter.ampl2_begin=0.0 InputFilter.ampl2_end=0.0 InputFilter.band1_error=1.0 InputFilter.band2_error=1.0 InputFilter.filter_type=bandpass InputFilter.grid_density=16 InputFilter.sampling_frequency=50000000 InputFilter.IF=-15345000 InputFilter.decimation_factor=1 ;######### RESAMPLER CONFIG ############ Resampler.implementation=Pass_Through Resampler.dump=false Resampler.dump_filename=../data/resampler.dat ;######### CHANNELS GLOBAL CONFIG ############ Channels_5X.count=1 Channels.in_acquisition=1 Channel.signal=5X ;######### SPECIFIC CHANNELS CONFIG ###### ;#The following options are specific to each channel and overwrite the generic options ;######### CHANNEL 0 CONFIG ############ Channel0.signal=5X Channel0.satellite=19 ;Channel0.repeat_satellite=true ;######### CHANNEL 1 CONFIG ############ Channel1.signal=5X Channel1.satellite=12 ;######### CHANNEL 2 CONFIG ############ Channel2.signal=5X Channel2.satellite=11 ;######### CHANNEL 3 CONFIG ############ Channel3.signal=5X Channel3.satellite=20 ;######### ACQUISITION GLOBAL CONFIG ############ Acquisition_5X.dump=false Acquisition_5X.dump_filename=./acq_dump.dat Acquisition_5X.item_type=gr_complex Acquisition_5X.if=0 Acquisition_5X.coherent_integration_time_ms=1 Acquisition_5X.implementation=Galileo_E5a_Noncoherent_IQ_Acquisition_CAF Acquisition_5X.threshold=0.002 Acquisition_5X.doppler_max=10000 Acquisition_5X.doppler_step=250 Acquisition_5X.bit_transition_flag=false Acquisition_5X.max_dwells=1 Acquisition_5X.CAF_window_hz=0 ; **Only for E5a** Resolves doppler ambiguity averaging the specified BW in the winner code delay. If set to 0 CAF filter is desactivated. Recommended value 3000 Hz Acquisition_5X.Zero_padding=0 ; **Only for E5a** Avoids power loss and doppler ambiguity in bit transitions by correlating one code with twice the input data length, ensuring that at least one full code is present without transitions. If set to 1 it is ON, if set to 0 it is OFF. ;######### TRACKING GLOBAL CONFIG ############ Tracking_5X.implementation=Galileo_E5a_DLL_PLL_Tracking Tracking_5X.item_type=gr_complex Tracking_5X.if=0 Tracking_5X.dump=false Tracking_5X.dump_filename=./tracking_ch_ Tracking_5X.pll_bw_hz_init=20.0; **Only for E5a** PLL loop filter bandwidth during initialization [Hz] Tracking_5X.dll_bw_hz_init=20.0; **Only for E5a** DLL loop filter bandwidth during initialization [Hz] Tracking_5X.ti_ms=1; **Only for E5a** loop filter integration time after initialization (secondary code delay search)[ms] Tracking_5X.pll_bw_hz=20.0; Tracking_5X.dll_bw_hz=20.0; Tracking_5X.order=2; Tracking_5X.early_late_space_chips=0.5; ;######### TELEMETRY DECODER CONFIG ############ TelemetryDecoder_5X.implementation=Galileo_E5a_Telemetry_Decoder TelemetryDecoder_5X.dump=false ;######### OBSERVABLES CONFIG ############ Observables.implementation=Galileo_E1B_Observables Observables.dump=false Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ PVT.implementation=GALILEO_E1_PVT PVT.averaging_depth=100 PVT.flag_averaging=true PVT.output_rate_ms=100 PVT.dump=false PVT.dump_filename=./PVT PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea PVT.flag_nmea_tty_port=true PVT.nmea_dump_devname=/dev/pts/4 PVT.flag_rtcm_server=true PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 gnss-sdr-0.0.9/conf/gnss-sdr_Hybrid_byte.conf000066400000000000000000000323721305042567700211600ustar00rootroot00000000000000; Default configuration file ; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=20000000 ;######### SIGNAL_SOURCE CONFIG ############ ;#implementation: Use [File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) SignalSource.implementation=File_Signal_Source ;#filename: path to file with the captured GNSS signal samples to be processed SignalSource.filename=/datalogger/signals/Fraunhofer/L125_III1b_210s_L1.bin ; <- PUT YOUR FILE HERE ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. SignalSource.item_type=byte ;#sampling_frequency: Original Signal sampling frequency in [Hz] SignalSource.sampling_frequency=20000000 ;#freq: RF front-end center frequency in [Hz] SignalSource.freq=1575420000 ;#samples: Number of samples to be processed. Notice that 0 indicates the entire file. SignalSource.samples=0 ;#repeat: Repeat the processing file. Disable this option in this version SignalSource.repeat=false ;#dump: Dump the Signal source data to a file. Disable this option in this version SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat ;#enable_throttle_control: Enabling this option tells the signal source to keep the delay between samples in post processing. ; it helps to not overload the CPU, but the processing time will be longer. SignalSource.enable_throttle_control=false ;######### SIGNAL_CONDITIONER CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. ;#implementation: Use [Pass_Through] or [Signal_Conditioner] ;#[Pass_Through] disables this block and the [DataTypeAdapter], [InputFilter] and [Resampler] blocks ;#[Signal_Conditioner] enables this block. Then you have to configure [DataTypeAdapter], [InputFilter] and [Resampler] blocks SignalConditioner.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER CONFIG ############ ;## Changes the type of input data. Please disable it in this version. ;#implementation: [Pass_Through] disables this block DataTypeAdapter.implementation=Ibyte_To_Complex ;######### INPUT_FILTER CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. ;InputFilter.implementation=Fir_Filter ;InputFilter.implementation=Freq_Xlating_Fir_Filter InputFilter.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter.dump=false ;#dump_filename: Log path and filename. InputFilter.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse reponse given a set of band edges, the desired reponse on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter.band1_begin=0.0 InputFilter.band1_end=0.45 InputFilter.band2_begin=0.55 InputFilter.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter.ampl1_begin=1.0 InputFilter.ampl1_end=1.0 InputFilter.ampl2_begin=0.0 InputFilter.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter.band1_error=1.0 InputFilter.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter.IF is the intermediate frequency (in Hz) shifted down to zero Hz InputFilter.sampling_frequency=20000000 InputFilter.IF=0 ;######### RESAMPLER CONFIG ############ ;## Resamples the input data. ;#implementation: Use [Pass_Through] or [Direct_Resampler] ;#[Pass_Through] disables this block ;#[Direct_Resampler] enables a resampler that implements a nearest neigbourhood interpolation ;Resampler.implementation=Direct_Resampler Resampler.implementation=Pass_Through ;#dump: Dump the resamplered data to a file. Resampler.dump=false ;#dump_filename: Log path and filename. Resampler.dump_filename=../data/resampler.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Resampler.item_type=gr_complex ;#sample_freq_in: the sample frequency of the input signal Resampler.sample_freq_in=20000000 ;#sample_freq_out: the desired sample frequency of the output signal Resampler.sample_freq_out=20000000 ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available GPS satellite channels. Channels_1C.count=8 ;#count: Number of available Galileo satellite channels. Channels_1B.count=8 ;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver Channels.in_acquisition=1 ;#signal: ;#if the option is disabled by default is assigned "1C" GPS L1 C/A Channel1.signal=1C Channel2.signal=1C Channel3.signal=1C Channel4.signal=1C Channel5.signal=1C Channel6.signal=1C Channel7.signal=1C Channel8.signal=1B Channel9.signal=1B Channel10.signal=1B Channel11.signal=1B Channel12.signal=1B Channel13.signal=1B Channel14.signal=1B Channel15.signal=1B ;######### GPS ACQUISITION CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1C.dump=false ;#filename: Log path and filename Acquisition_1C.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1C.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_1C.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1C.sampled_ms=1 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition ;#threshold: Acquisition threshold Acquisition_1C.threshold=0.0060 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] ;Acquisition_1C.pfa=0.01 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1C.doppler_max=10000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_1C.doppler_step=500 ;######### GALILEO ACQUISITION CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1B.dump=false ;#filename: Log path and filename Acquisition_1B.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1B.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_1B.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1B.sampled_ms=4 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1B.implementation=Galileo_E1_PCPS_Ambiguous_Acquisition ;#threshold: Acquisition threshold ;Acquisition_1B.threshold=0 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1B.pfa=0.0000008 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1B.doppler_max=15000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_1B.doppler_step=125 ;######### TRACKING GPS CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_PLL_C_Aid_Tracking] or [GPS_L1_CA_TCP_CONNECTOR_Tracking] or [Galileo_E1_DLL_PLL_VEML_Tracking] Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking ;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version. Tracking_1C.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_1C.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_1C.dump=false ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_1C.dump_filename=../data/epl_tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1C.pll_bw_hz=45.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_1C.dll_bw_hz=4.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_1C.order=3; ;######### TRACKING GALILEO CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_PLL_C_Aid_Tracking] or [GPS_L1_CA_TCP_CONNECTOR_Tracking] or [Galileo_E1_DLL_PLL_VEML_Tracking] Tracking_1B.implementation=Galileo_E1_DLL_PLL_VEML_Tracking ;#item_type: Type and resolution for each of the signal samples. Tracking_1B.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_1B.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_1B.dump=false ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_1B.dump_filename=../data/veml_tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1B.pll_bw_hz=15.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_1B.dll_bw_hz=2.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_1B.order=3; ;#early_late_space_chips: correlator early-late space [chips]. Use [0.5] for GPS and [0.15] for Galileo Tracking_1B.early_late_space_chips=0.15; ;#very_early_late_space_chips: only for [Galileo_E1_DLL_PLL_VEML_Tracking], correlator very early-late space [chips]. Use [0.6] Tracking_1B.very_early_late_space_chips=0.6; ;######### TELEMETRY DECODER GPS CONFIG ############ ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L1 C/A TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false ;#decimation factor TelemetryDecoder_1C.decimation_factor=4; ;######### TELEMETRY DECODER GALILEO CONFIG ############ ;#implementation: Use [Galileo_E1B_Telemetry_Decoder] for Galileo E1B TelemetryDecoder_1B.implementation=Galileo_E1B_Telemetry_Decoder TelemetryDecoder_1B.dump=false TelemetryDecoder_1B.decimation_factor=1; ;######### OBSERVABLES CONFIG ############ ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. Observables.implementation=Hybrid_Observables ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] Observables.dump=false ;#dump_filename: Log path and filename. Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ ;#implementation: Position Velocity and Time (PVT) implementation algorithm: Use [GPS_L1_CA_PVT] in this version. PVT.implementation=Hybrid_PVT ;#averaging_depth: Number of PVT observations in the moving average algorithm PVT.averaging_depth=10 ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.flag_averaging=false ;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time (for GPS CA L1 is 1ms) [ms] PVT.output_rate_ms=100; ;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms<=display_rate_ms. PVT.display_rate_ms=500; ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump=false PVT.flag_rtcm_server=false PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump and ".kml" to GoogleEarth dump. PVT.dump_filename=./PVT gnss-sdr-0.0.9/conf/gnss-sdr_Hybrid_byte_sim.conf000066400000000000000000000333201305042567700220220ustar00rootroot00000000000000; Default configuration file ; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=4000000 ;######### SIGNAL_SOURCE CONFIG ############ ;#implementation: Use [File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) SignalSource.implementation=File_Signal_Source ;#filename: path to file with the captured GNSS signal samples to be processed SignalSource.filename=/datalogger/signals/gnss-sim/signal_out.bin ; <- PUT YOUR FILE HERE ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. SignalSource.item_type=byte ;#sampling_frequency: Original Signal sampling frequency in [Hz] SignalSource.sampling_frequency=4000000 ;#freq: RF front-end center frequency in [Hz] SignalSource.freq=1575420000 ;#samples: Number of samples to be processed. Notice that 0 indicates the entire file. SignalSource.samples=0 ;#repeat: Repeat the processing file. Disable this option in this version SignalSource.repeat=false ;#dump: Dump the Signal source data to a file. Disable this option in this version SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat ;#enable_throttle_control: Enabling this option tells the signal source to keep the delay between samples in post processing. ; it helps to not overload the CPU, but the processing time will be longer. SignalSource.enable_throttle_control=false ;######### SIGNAL_CONDITIONER CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. ;#implementation: Use [Pass_Through] or [Signal_Conditioner] ;#[Pass_Through] disables this block and the [DataTypeAdapter], [InputFilter] and [Resampler] blocks ;#[Signal_Conditioner] enables this block. Then you have to configure [DataTypeAdapter], [InputFilter] and [Resampler] blocks SignalConditioner.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER CONFIG ############ ;## Changes the type of input data. Please disable it in this version. ;#implementation: [Pass_Through] disables this block DataTypeAdapter.implementation=Ibyte_To_Cshort DataTypeAdapter.dump=false ;#dump_filename: Log path and filename. DataTypeAdapter.dump_filename=../data/DataTypeAdapter.dat ;######### INPUT_FILTER CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. ;InputFilter.implementation=Fir_Filter ;InputFilter.implementation=Freq_Xlating_Fir_Filter InputFilter.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter.dump=false ;#dump_filename: Log path and filename. InputFilter.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse reponse given a set of band edges, the desired reponse on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter.input_item_type=cshort ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter.output_item_type=cshort ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter.band1_begin=0.0 InputFilter.band1_end=0.45 InputFilter.band2_begin=0.55 InputFilter.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter.ampl1_begin=1.0 InputFilter.ampl1_end=1.0 InputFilter.ampl2_begin=0.0 InputFilter.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter.band1_error=1.0 InputFilter.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter.IF is the intermediate frequency (in Hz) shifted down to zero Hz InputFilter.sampling_frequency=4000000 InputFilter.IF=0 ;######### RESAMPLER CONFIG ############ ;## Resamples the input data. ;#implementation: Use [Pass_Through] or [Direct_Resampler] ;#[Pass_Through] disables this block ;#[Direct_Resampler] enables a resampler that implements a nearest neigbourhood interpolation ;Resampler.implementation=Direct_Resampler Resampler.implementation=Pass_Through ;#dump: Dump the resamplered data to a file. Resampler.dump=false ;#dump_filename: Log path and filename. Resampler.dump_filename=../data/resampler.dat ;#item_type: Type and resolution for each of the signal samples. Resampler.item_type=cshort ;#sample_freq_in: the sample frequency of the input signal Resampler.sample_freq_in=4000000 ;#sample_freq_out: the desired sample frequency of the output signal Resampler.sample_freq_out=4000000 ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available GPS satellite channels. Channels_1C.count=12 ;#count: Number of available Galileo satellite channels. Channels_1B.count=0 ;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver Channels.in_acquisition=1 ;#IMPORTANT: When cshort is used as input type for Acq and Trk, please set the Channel type to cshort here ;#item_type: Type and resolution for each of the signal samples. Channel.item_type=cshort ;#signal: ;#if the option is disabled by default is assigned "1C" GPS L1 C/A Channel1.signal=1C Channel2.signal=1C Channel3.signal=1C Channel4.signal=1C Channel5.signal=1C Channel6.signal=1C Channel7.signal=1C Channel8.signal=1C Channel9.signal=1C Channel10.signal=1C Channel11.signal=1C Channel12.signal=1C Channel13.signal=1B Channel14.signal=1B Channel15.signal=1B ;######### GPS ACQUISITION CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1C.dump=false ;#filename: Log path and filename Acquisition_1C.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1C.item_type=cshort ;#if: Signal intermediate frequency in [Hz] Acquisition_1C.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1C.sampled_ms=1 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition ;#use_CFAR_algorithm: If enabled, acquisition estimates the input signal power to implement CFAR detection algorithms ;#notice that this affects the Acquisition threshold range! Acquisition_1C.use_CFAR_algorithm=false; ;#threshold: Acquisition threshold Acquisition_1C.threshold=11 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] ;Acquisition_1C.pfa=0.01 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1C.doppler_max=6000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_1C.doppler_step=100 ;######### GALILEO ACQUISITION CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1B.dump=false ;#filename: Log path and filename Acquisition_1B.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1B.item_type=cshort ;#if: Signal intermediate frequency in [Hz] Acquisition_1B.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1B.sampled_ms=4 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1B.implementation=Galileo_E1_PCPS_Ambiguous_Acquisition ;#threshold: Acquisition threshold ;Acquisition_1B.threshold=0 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1B.pfa=0.0000008 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1B.doppler_max=15000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_1B.doppler_step=125 ;######### TRACKING GPS CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_PLL_C_Aid_Tracking] or [GPS_L1_CA_TCP_CONNECTOR_Tracking] or [Galileo_E1_DLL_PLL_VEML_Tracking] Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_C_Aid_Tracking ;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version. Tracking_1C.item_type=cshort ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_1C.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_1C.dump=false ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_1C.dump_filename=../data/epl_tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1C.pll_bw_hz=15.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_1C.dll_bw_hz=1.5; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_1C.order=3; ;######### TRACKING GALILEO CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_PLL_C_Aid_Tracking] or [GPS_L1_CA_TCP_CONNECTOR_Tracking] or [Galileo_E1_DLL_PLL_VEML_Tracking] Tracking_1B.implementation=Galileo_E1_DLL_PLL_VEML_Tracking ;#item_type: Type and resolution for each of the signal samples. Tracking_1B.item_type=cshort ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_1B.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_1B.dump=false ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_1B.dump_filename=../data/veml_tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1B.pll_bw_hz=15.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_1B.dll_bw_hz=2.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_1B.order=3; ;#early_late_space_chips: correlator early-late space [chips]. Use [0.5] for GPS and [0.15] for Galileo Tracking_1B.early_late_space_chips=0.15; ;#very_early_late_space_chips: only for [Galileo_E1_DLL_PLL_VEML_Tracking], correlator very early-late space [chips]. Use [0.6] Tracking_1B.very_early_late_space_chips=0.6; ;######### TELEMETRY DECODER GPS CONFIG ############ ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L1 C/A TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false ;#decimation factor TelemetryDecoder_1C.decimation_factor=1; ;######### TELEMETRY DECODER GALILEO CONFIG ############ ;#implementation: Use [Galileo_E1B_Telemetry_Decoder] for Galileo E1B TelemetryDecoder_1B.implementation=Galileo_E1B_Telemetry_Decoder TelemetryDecoder_1B.dump=false TelemetryDecoder_1B.decimation_factor=1; ;######### OBSERVABLES CONFIG ############ ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. Observables.implementation=GPS_L1_CA_Observables ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] Observables.dump=false ;#dump_filename: Log path and filename. Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ ;#implementation: Position Velocity and Time (PVT) implementation algorithm: Use [GPS_L1_CA_PVT] in this version. PVT.implementation=GPS_L1_CA_PVT ;#averaging_depth: Number of PVT observations in the moving average algorithm PVT.averaging_depth=10 ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.flag_averaging=false ;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time (for GPS CA L1 is 1ms) [ms] PVT.output_rate_ms=100; ;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms<=display_rate_ms. PVT.display_rate_ms=500; ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump=false PVT.flag_rtcm_server=false PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump and ".kml" to GoogleEarth dump. PVT.dump_filename=./PVT gnss-sdr-0.0.9/conf/gnss-sdr_Hybrid_gr_complex.conf000066400000000000000000000326031305042567700223510ustar00rootroot00000000000000; Default configuration file ; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=4092000 ;######### SIGNAL_SOURCE CONFIG ############ ;#implementation: Use [File_Signal_Source] [Nsr_File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) SignalSource.implementation=File_Signal_Source ;#filename: path to file with the captured GNSS signal samples to be processed SignalSource.filename=/datalogger/signals/sim/GPS_sim1.dat ; <- PUT YOUR FILE HERE ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. SignalSource.item_type=gr_complex ;#sampling_frequency: Original Signal sampling frequency in [Hz] SignalSource.sampling_frequency=4092000 ;#freq: RF front-end center frequency in [Hz] SignalSource.freq=1575420000 ;#samples: Number of samples to be processed. Notice that 0 indicates the entire file. SignalSource.samples=0 ;#repeat: Repeat the processing file. Disable this option in this version SignalSource.repeat=false ;#dump: Dump the Signal source data to a file. Disable this option in this version SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat ;#enable_throttle_control: Enabling this option tells the signal source to keep the delay between samples in post processing. ; it helps to not overload the CPU, but the processing time will be longer. SignalSource.enable_throttle_control=false ;######### SIGNAL_CONDITIONER CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. ;#implementation: Use [Pass_Through] or [Signal_Conditioner] ;#[Pass_Through] disables this block and the [DataTypeAdapter], [InputFilter] and [Resampler] blocks ;#[Signal_Conditioner] enables this block. Then you have to configure [DataTypeAdapter], [InputFilter] and [Resampler] blocks SignalConditioner.implementation=Pass_Through ;######### DATA_TYPE_ADAPTER CONFIG ############ ;## Changes the type of input data. ;#implementation: [Pass_Through] disables this block DataTypeAdapter.implementation=Pass_Through DataTypeAdapter.item_type=gr_complex ;######### INPUT_FILTER CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation ;# that shifts IF down to zero Hz. InputFilter.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter.dump=false ;#dump_filename: Log path and filename. InputFilter.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse ;#reponse given a set of band edges, the desired reponse on those bands, ;#and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter.band1_begin=0.0 InputFilter.band1_end=0.45 InputFilter.band2_begin=0.55 InputFilter.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter.ampl1_begin=1.0 InputFilter.ampl1_end=1.0 InputFilter.ampl2_begin=0.0 InputFilter.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter.band1_error=1.0 InputFilter.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter.grid_density=16 ;# Original sampling frequency stored in the signal file InputFilter.sampling_frequency=4092000 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter.IF is the intermediate frequency (in Hz) shifted down to zero Hz InputFilter.IF=5499998.47412109 ;# Decimation factor after the frequency tranaslating block InputFilter.decimation_factor=8 ;######### RESAMPLER CONFIG ############ ;## Resamples the input data. ;#implementation: Use [Pass_Through] or [Direct_Resampler] ;#[Pass_Through] disables this block ;#[Direct_Resampler] enables a resampler that implements a nearest neigbourhood interpolation Resampler.implementation=Pass_Through ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available GPS satellite channels. Channels_1C.count=1 ;#count: Number of available Galileo satellite channels. Channels_1B.count=0 ;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver Channels.in_acquisition=1 ;#signal: ;# "1C" GPS L1 C/A ;# "2S" GPS L2 L2C (M) ;# "1B" GALILEO E1 B (I/NAV OS/CS/SoL) ;# "5X" GALILEO E5a I+Q ;#if the option is disabled by default is assigned "1C" GPS L1 C/A Channel0.signal=1C Channel1.signal=1B Channel2.signal=1B Channel3.signal=1B Channel4.signal=1B Channel5.signal=1B Channel6.signal=1B Channel7.signal=1B Channel8.signal=1B Channel9.signal=1B Channel10.signal=1B Channel11.signal=1B Channel12.signal=1B Channel13.signal=1B Channel14.signal=1B Channel15.signal=1B ;######### GPS ACQUISITION CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1C.dump=false ;#filename: Log path and filename Acquisition_1C.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1C.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_1C.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1C.sampled_ms=1 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition_1C.use_CFAR_algorithm=false; ;#threshold: Acquisition threshold Acquisition_1C.threshold=30 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] ;Acquisition_1C.pfa=0.01 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1C.doppler_max=5000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_1C.doppler_step=100 ;######### GALILEO ACQUISITION CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1B.dump=false ;#filename: Log path and filename Acquisition_1B.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1B.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_1B.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1B.sampled_ms=4 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1B.implementation=Galileo_E1_PCPS_Ambiguous_Acquisition ;#threshold: Acquisition threshold ;Acquisition_1B.threshold=0 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1B.pfa=0.0000002 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1B.doppler_max=15000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_1B.doppler_step=125 ;######### TRACKING GPS CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_PLL_C_Aid_Tracking] or [GPS_L1_CA_TCP_CONNECTOR_Tracking] or [Galileo_E1_DLL_PLL_VEML_Tracking] Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_C_Aid_Tracking ;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version. Tracking_1C.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_1C.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_1C.dump=true ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_1C.dump_filename=../data/epl_tracking_ch_ ;# Extended correlation after telemetry bit synchronization ;# Valid values are: [1,2,4,5,10,20] (integer divisors of the GPS L1 CA bit period (20 ms) ) ;# Longer integration period require more stable front-end LO Tracking_1C.extend_correlation_ms=10 ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1C.pll_bw_hz=40; Tracking_1C.pll_bw_narrow_hz=25; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_1C.dll_bw_hz=2.0; Tracking_1C.dll_bw_narrow_hz=2.0; ;#fll_bw_hz: FLL loop filter bandwidth [Hz] Tracking_1C.fll_bw_hz=2.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_1C.order=3; ;######### TRACKING GALILEO CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_FLL_PLL_Tracking] or [GPS_L1_CA_TCP_CONNECTOR_Tracking] or [Galileo_E1_DLL_PLL_VEML_Tracking] Tracking_1B.implementation=Galileo_E1_DLL_PLL_VEML_Tracking ;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version. Tracking_1B.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_1B.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_1B.dump=false ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_1B.dump_filename=../data/veml_tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1B.pll_bw_hz=15.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_1B.dll_bw_hz=2.0; ;#fll_bw_hz: FLL loop filter bandwidth [Hz] Tracking_1B.fll_bw_hz=10.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_1B.order=3; ;#early_late_space_chips: correlator early-late space [chips]. Use [0.5] for GPS and [0.15] for Galileo Tracking_1B.early_late_space_chips=0.15; ;#very_early_late_space_chips: only for [Galileo_E1_DLL_PLL_VEML_Tracking], correlator very early-late space [chips]. Use [0.6] Tracking_1B.very_early_late_space_chips=0.6; ;######### TELEMETRY DECODER GPS CONFIG ############ ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L1 C/A TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false ;#decimation factor TelemetryDecoder_1C.decimation_factor=4; ;######### TELEMETRY DECODER GALILEO CONFIG ############ ;#implementation: Use [Galileo_E1B_Telemetry_Decoder] for Galileo E1B TelemetryDecoder_1B.implementation=Galileo_E1B_Telemetry_Decoder TelemetryDecoder_1B.dump=false TelemetryDecoder_1B_factor=4; ;######### OBSERVABLES CONFIG ############ ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. Observables.implementation=Hybrid_Observables ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] Observables.dump=false ;#dump_filename: Log path and filename. Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ ;#implementation: Position Velocity and Time (PVT) implementation algorithm: Use [GPS_L1_CA_PVT] in this version. PVT.implementation=Hybrid_PVT ;#averaging_depth: Number of PVT observations in the moving average algorithm PVT.averaging_depth=10 ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.flag_averaging=false ;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time (for GPS CA L1 is 1ms) [ms] PVT.output_rate_ms=10; ;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms<=display_rate_ms. PVT.display_rate_ms=500; ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump=false PVT.flag_rtcm_server=false PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump and ".kml" to GoogleEarth dump. PVT.dump_filename=./PVT gnss-sdr-0.0.9/conf/gnss-sdr_Hybrid_ishort.conf000066400000000000000000000332541305042567700215250ustar00rootroot00000000000000; Default configuration file ; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=4000000 ;######### SUPL RRLP GPS assistance configuration ##### ; Check http://www.mcc-mnc.com/ ; On Android: https://play.google.com/store/apps/details?id=net.its_here.cellidinfo&hl=en GNSS-SDR.SUPL_gps_enabled=false GNSS-SDR.SUPL_read_gps_assistance_xml=true GNSS-SDR.SUPL_gps_ephemeris_server=supl.google.com GNSS-SDR.SUPL_gps_ephemeris_port=7275 GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com GNSS-SDR.SUPL_gps_acquisition_port=7275 GNSS-SDR.SUPL_MCC=244 GNSS-SDR.SUPL_MNS=5 GNSS-SDR.SUPL_LAC=0x59e2 GNSS-SDR.SUPL_CI=0x31b0 ;######### SIGNAL_SOURCE CONFIG ############ ;#implementation: Use [File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) SignalSource.implementation=File_Signal_Source ;#filename: path to file with the captured GNSS signal samples to be processed SignalSource.filename=/datalogger/signals/CTTC/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN.dat ; <- PUT YOUR FILE HERE ;#item_type: Type and resolution for each of the signal samples. SignalSource.item_type=ishort ;#sampling_frequency: Original Signal sampling frequency in [Hz] SignalSource.sampling_frequency=4000000 ;#freq: RF front-end center frequency in [Hz] SignalSource.freq=1575420000 ;#samples: Number of samples to be processed. Notice that 0 indicates the entire file. SignalSource.samples=0 ;#repeat: Repeat the processing file. Disable this option in this version SignalSource.repeat=false ;#dump: Dump the Signal source data to a file. Disable this option in this version SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat ;#enable_throttle_control: Enabling this option tells the signal source to keep the delay between samples in post processing. ; it helps to not overload the CPU, but the processing time will be longer. SignalSource.enable_throttle_control=false ;######### SIGNAL_CONDITIONER CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. ;#implementation: Use [Pass_Through] or [Signal_Conditioner] ;#[Pass_Through] disables this block and the [DataTypeAdapter], [InputFilter] and [Resampler] blocks ;#[Signal_Conditioner] enables this block. Then you have to configure [DataTypeAdapter], [InputFilter] and [Resampler] blocks SignalConditioner.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER CONFIG ############ ;## Changes the type of input data. ;#implementation: [Pass_Through] disables this block DataTypeAdapter.implementation=Ishort_To_Complex ;######### INPUT_FILTER CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. ;InputFilter.implementation=Fir_Filter ;InputFilter.implementation=Freq_Xlating_Fir_Filter InputFilter.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter.dump=false ;#dump_filename: Log path and filename. InputFilter.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse reponse given a set of band edges, the desired reponse on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter.band1_begin=0.0 InputFilter.band1_end=0.45 InputFilter.band2_begin=0.55 InputFilter.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter.ampl1_begin=1.0 InputFilter.ampl1_end=1.0 InputFilter.ampl2_begin=0.0 InputFilter.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter.band1_error=1.0 InputFilter.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter.IF is the intermediate frequency (in Hz) shifted down to zero Hz InputFilter.sampling_frequency=4000000 InputFilter.IF=0 ;######### RESAMPLER CONFIG ############ ;## Resamples the input data. ;#implementation: Use [Pass_Through] or [Direct_Resampler] ;#[Pass_Through] disables this block ;#[Direct_Resampler] enables a resampler that implements a nearest neigbourhood interpolation ;Resampler.implementation=Direct_Resampler Resampler.implementation=Pass_Through ;#dump: Dump the resamplered data to a file. Resampler.dump=false ;#dump_filename: Log path and filename. Resampler.dump_filename=../data/resampler.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Resampler.item_type=gr_complex ;#sample_freq_in: the sample frequency of the input signalq Resampler.sample_freq_in=4000000 ;#sample_freq_out: the desired sample frequency of the output signal Resampler.sample_freq_out=4000000 ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available GPS satellite channels. Channels_1C.count=0 ;#count: Number of available Galileo satellite channels. Channels_1B.count=5 ;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver Channels.in_acquisition=1 ;#signal: ;# "1C" GPS L1 C/A ;# "2S" GPS L2 L2C (M) ;# "1B" GALILEO E1 B (I/NAV OS/CS/SoL) ;# "5X" GALILEO E5a I+Q Channel0.signal=1B Channel1.signal=1B Channel2.signal=1B Channel3.signal=1B Channel4.signal=1B Channel5.signal=1B Channel6.signal=1B Channel7.signal=1B ;######### GPS ACQUISITION CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1C.dump=false ;#filename: Log path and filename Acquisition_1C.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1C.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_1C.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1C.sampled_ms=1 ;#implementation: Acquisition algorithm selection for this channel: Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition ;#threshold: Acquisition threshold Acquisition_1C.threshold=0.0075 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] ;Acquisition_1C.pfa=0.01 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1C.doppler_max=10000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_1C.doppler_step=500 ;######### GALILEO ACQUISITION CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1B.dump=false ;#filename: Log path and filename Acquisition_1B.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1B.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_1B.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1B.sampled_ms=4 ;#implementation: Acquisition algorithm selection for this channel: Acquisition_1B.implementation=Galileo_E1_PCPS_Ambiguous_Acquisition ;#threshold: Acquisition threshold ;Acquisition_1B.threshold=0 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1B.pfa=0.0000008; 0.0000008 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1B.doppler_max=15000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_1B.doppler_step=125 Acquisition_1B.cboc=false; ;######### TRACKING GPS CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_PLL_C_Aid_Tracking] Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_C_Aid_Tracking ;#item_type: Type and resolution for each of the signal samples. Tracking_1C.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_1C.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_1C.dump=false ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_1C.dump_filename=../data/epl_tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1C.pll_bw_hz=50.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_1C.dll_bw_hz=5.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_1C.order=3; ;######### TRACKING GALILEO CONFIG ############ ;#implementation: Selected tracking algorithm: Tracking_1B.implementation=Galileo_E1_DLL_PLL_VEML_Tracking ;#item_type: Type and resolution for each of the signal samples. Tracking_1B.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_1B.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_1B.dump=false ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_1B.dump_filename=../data/veml_tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1B.pll_bw_hz=20.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_1B.dll_bw_hz=2.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_1B.order=3; ;#early_late_space_chips: correlator early-late space [chips]. Use [0.5] for GPS and [0.15] for Galileo Tracking_1B.early_late_space_chips=0.15; ;#very_early_late_space_chips: only for [Galileo_E1_DLL_PLL_VEML_Tracking], correlator very early-late space [chips]. Use [0.6] Tracking_1B.very_early_late_space_chips=0.6; ;######### TELEMETRY DECODER GPS CONFIG ############ ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L1 C/A TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false ;#decimation factor TelemetryDecoder_1C.decimation_factor=4; ;######### TELEMETRY DECODER GALILEO CONFIG ############ ;#implementation: Use [Galileo_E1B_Telemetry_Decoder] for Galileo E1B TelemetryDecoder_1B.implementation=Galileo_E1B_Telemetry_Decoder TelemetryDecoder_1B.dump=false TelemetryDecoder_1B.decimation_factor=1; ;######### OBSERVABLES CONFIG ############ ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. Observables.implementation=Hybrid_Observables ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] Observables.dump=false ;#dump_filename: Log path and filename. Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ ;#implementation: Position Velocity and Time (PVT) implementation algorithm: Use [GPS_L1_CA_PVT] in this version. PVT.implementation=Hybrid_PVT ;#averaging_depth: Number of PVT observations in the moving average algorithm PVT.averaging_depth=10 ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.flag_averaging=false ;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time (for GPS CA L1 is 1ms) [ms] PVT.output_rate_ms=100; ;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms<=display_rate_ms. PVT.display_rate_ms=500; ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump=false PVT.flag_rtcm_server=true PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 PVT.rtcm_tcp_port=2101 PVT.rtcm_MT1045_rate_ms=5000 ; Period (in ms) of Galileo ephemeris messages. 0 mutes this message PVT.rtcm_MT1045_rate_ms=5000 ; Period (in ms) of GPS ephemeris messages. 0 mutes this message PVT.rtcm_MT1097_rate_ms=1000 ; Period (in ms) of Galileo observables. 0 mutes this message PVT.rtcm_MT1077_rate_ms=1000 ; Period (in ms) of GPS observables. 0 mutes this message ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump and ".kml" to GoogleEarth dump. PVT.dump_filename=./PVT gnss-sdr-0.0.9/conf/gnss-sdr_Hybrid_nsr.conf000066400000000000000000000325041305042567700210140ustar00rootroot00000000000000; Default configuration file ; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. ;GNSS-SDR.internal_fs_hz=6826700 GNSS-SDR.internal_fs_hz=2560000 ;GNSS-SDR.internal_fs_hz=4096000 ;GNSS-SDR.internal_fs_hz=5120000 ;######### SIGNAL_SOURCE CONFIG ############ ;#implementation: Use [File_Signal_Source] [Nsr_File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) SignalSource.implementation=Nsr_File_Signal_Source ;#filename: path to file with the captured GNSS signal samples to be processed SignalSource.filename=/datalogger/signals/ifen/E1L1_FE0_Band0.stream ; <- PUT YOUR FILE HERE ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. SignalSource.item_type=byte ;#sampling_frequency: Original Signal sampling frequency in [Hz] SignalSource.sampling_frequency=20480000 ;#freq: RF front-end center frequency in [Hz] SignalSource.freq=1575420000 ;#samples: Number of samples to be processed. Notice that 0 indicates the entire file. SignalSource.samples=0 ;#repeat: Repeat the processing file. Disable this option in this version SignalSource.repeat=false ;#dump: Dump the Signal source data to a file. Disable this option in this version SignalSource.dump=false SignalSource.dump_filename=../data/signal_source.dat ;#enable_throttle_control: Enabling this option tells the signal source to keep the delay between samples in post processing. ; it helps to not overload the CPU, but the processing time will be longer. SignalSource.enable_throttle_control=false ;######### SIGNAL_CONDITIONER CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. ;#implementation: Use [Pass_Through] or [Signal_Conditioner] ;#[Pass_Through] disables this block and the [DataTypeAdapter], [InputFilter] and [Resampler] blocks ;#[Signal_Conditioner] enables this block. Then you have to configure [DataTypeAdapter], [InputFilter] and [Resampler] blocks SignalConditioner.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER CONFIG ############ ;## Changes the type of input data. ;#implementation: [Pass_Through] disables this block DataTypeAdapter.implementation=Pass_Through DataTypeAdapter.item_type=float ;######### INPUT_FILTER CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation ;# that shifts IF down to zero Hz. InputFilter.implementation=Freq_Xlating_Fir_Filter ;#dump: Dump the filtered data to a file. InputFilter.dump=false ;#dump_filename: Log path and filename. InputFilter.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse ;#reponse given a set of band edges, the desired reponse on those bands, ;#and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter.input_item_type=float ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter.band1_begin=0.0 InputFilter.band1_end=0.45 InputFilter.band2_begin=0.55 InputFilter.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter.ampl1_begin=1.0 InputFilter.ampl1_end=1.0 InputFilter.ampl2_begin=0.0 InputFilter.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter.band1_error=1.0 InputFilter.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter.grid_density=16 ;# Original sampling frequency stored in the signal file InputFilter.sampling_frequency=20480000 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter.IF is the intermediate frequency (in Hz) shifted down to zero Hz InputFilter.IF=5499998.47412109 ;# Decimation factor after the frequency tranaslating block InputFilter.decimation_factor=8 ;######### RESAMPLER CONFIG ############ ;## Resamples the input data. ;#implementation: Use [Pass_Through] or [Direct_Resampler] ;#[Pass_Through] disables this block ;#[Direct_Resampler] enables a resampler that implements a nearest neigbourhood interpolation Resampler.implementation=Pass_Through ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available GPS satellite channels. Channels_1C.count=8 ;#count: Number of available Galileo satellite channels. Channels_1B.count=0 ;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver Channels.in_acquisition=1 ;#signal: ;# "1C" GPS L1 C/A ;# "2S" GPS L2 L2C (M) ;# "1B" GALILEO E1 B (I/NAV OS/CS/SoL) ;# "5X" GALILEO E5a I+Q ;#if the option is disabled by default is assigned "1C" GPS L1 C/A Channel0.signal=1C Channel1.signal=1C Channel2.signal=1C Channel3.signal=1C Channel4.signal=1C Channel5.signal=1C Channel6.signal=1C Channel7.signal=1C Channel8.signal=1B Channel9.signal=1B Channel10.signal=1B Channel11.signal=1B Channel12.signal=1B Channel13.signal=1B Channel14.signal=1B Channel15.signal=1B ;######### GPS ACQUISITION CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1C.dump=false ;#filename: Log path and filename Acquisition_1C.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1C.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_1C.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1C.sampled_ms=1 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition ;#threshold: Acquisition threshold Acquisition_1C.threshold=0.0075 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] ;Acquisition_1C.pfa=0.01 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1C.doppler_max=5000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_1C.doppler_step=250 ;######### GALILEO ACQUISITION CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1B.dump=false ;#filename: Log path and filename Acquisition_1B.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1B.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_1B.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1B.sampled_ms=4 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1B.implementation=Galileo_E1_PCPS_Ambiguous_Acquisition ;#threshold: Acquisition threshold ;Acquisition_1B.threshold=0 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1B.pfa=0.0000002 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1B.doppler_max=15000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_1B.doppler_step=125 ;######### TRACKING GPS CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_PLL_C_Aid_Tracking] or [GPS_L1_CA_TCP_CONNECTOR_Tracking] or [Galileo_E1_DLL_PLL_VEML_Tracking] Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_C_Aid_Tracking ;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version. Tracking_1C.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_1C.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_1C.dump=true ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_1C.dump_filename=../data/epl_tracking_ch_ ;# Extended correlation after telemetry bit synchronization ;# Valid values are: [1,2,4,5,10,20] (integer divisors of the GPS L1 CA bit period (20 ms) ) ;# Longer integration period require more stable front-end LO Tracking_1C.extend_correlation_ms=1 ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1C.pll_bw_hz=40; Tracking_1C.pll_bw_narrow_hz=20; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_1C.dll_bw_hz=2.0; Tracking_1C.dll_bw_narrow_hz=1.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_1C.order=3; ;######### TRACKING GALILEO CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_PLL_C_Aid_Tracking] or [GPS_L1_CA_TCP_CONNECTOR_Tracking] or [Galileo_E1_DLL_PLL_VEML_Tracking] Tracking_1B.implementation=Galileo_E1_DLL_PLL_VEML_Tracking ;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version. Tracking_1B.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_1B.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_1B.dump=false ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_1B.dump_filename=../data/veml_tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1B.pll_bw_hz=15.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_1B.dll_bw_hz=2.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_1B.order=3; ;#early_late_space_chips: correlator early-late space [chips]. Use [0.5] for GPS and [0.15] for Galileo Tracking_1B.early_late_space_chips=0.15; ;#very_early_late_space_chips: only for [Galileo_E1_DLL_PLL_VEML_Tracking], correlator very early-late space [chips]. Use [0.6] Tracking_1B.very_early_late_space_chips=0.6; ;######### TELEMETRY DECODER GPS CONFIG ############ ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L1 C/A TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false ;#decimation factor TelemetryDecoder_1C.decimation_factor=4; ;######### TELEMETRY DECODER GALILEO CONFIG ############ ;#implementation: Use [Galileo_E1B_Telemetry_Decoder] for Galileo E1B TelemetryDecoder_1B.implementation=Galileo_E1B_Telemetry_Decoder TelemetryDecoder_1B.dump=false TelemetryDecoder_1B_factor=4; ;######### OBSERVABLES CONFIG ############ ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. Observables.implementation=Hybrid_Observables ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] Observables.dump=false ;#dump_filename: Log path and filename. Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ ;#implementation: Position Velocity and Time (PVT) implementation algorithm: Use [GPS_L1_CA_PVT] in this version. PVT.implementation=Hybrid_PVT ;#averaging_depth: Number of PVT observations in the moving average algorithm PVT.averaging_depth=10 ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.flag_averaging=false ;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time (for GPS CA L1 is 1ms) [ms] PVT.output_rate_ms=10; ;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms<=display_rate_ms. PVT.display_rate_ms=500; ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump=false PVT.flag_rtcm_server=false PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump and ".kml" to GoogleEarth dump. PVT.dump_filename=./PVT gnss-sdr-0.0.9/conf/gnss-sdr_multichannel_GPS_L1_Flexiband_bin_file_III_1a.conf000066400000000000000000000320061305042567700273140ustar00rootroot00000000000000; Default configuration file ; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=2500000 ;######### SUPL RRLP GPS assistance configuration ##### ; Check http://www.mcc-mnc.com/ ; On Android: https://play.google.com/store/apps/details?id=net.its_here.cellidinfo&hl=en GNSS-SDR.SUPL_gps_enabled=false GNSS-SDR.SUPL_read_gps_assistance_xml=true GNSS-SDR.SUPL_gps_ephemeris_server=supl.google.com GNSS-SDR.SUPL_gps_ephemeris_port=7275 GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com GNSS-SDR.SUPL_gps_acquisition_port=7275 GNSS-SDR.SUPL_MCC=244 GNSS-SDR.SUPL_MNS=5 GNSS-SDR.SUPL_LAC=0x59e2 GNSS-SDR.SUPL_CI=0x31b0 ;######### SIGNAL_SOURCE CONFIG ############ ;#implementation: Use [File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) SignalSource.implementation=Flexiband_Signal_Source SignalSource.flag_read_file=true SignalSource.signal_file=/datalogger/signals/Fraunhofer/L125_III1b_210s.usb ; <- PUT YOUR FILE HERE ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. SignalSource.item_type=gr_complex ;# FPGA firmware file SignalSource.firmware_file=flexiband_III-1b.bit ;#RF_channels: Number of RF channels present in the frontend device, must agree the FPGA firmware file SignalSource.RF_channels=1 ;#frontend channels gain. Not usable yet! SignalSource.gain1=0 SignalSource.gain2=0 SignalSource.gain3=0 ;#frontend channels AGC SignalSource.AGC=true ;# USB 3.0 packet buffer size (number of SuperSpeed packets) SignalSource.usb_packet_buffer=128 ;######### SIGNAL_CONDITIONER 0 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. SignalConditioner0.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER 0 CONFIG ############ DataTypeAdapter0.implementation=Pass_Through DataTypeAdapter0.item_type=gr_complex ;######### INPUT_FILTER 0 CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. InputFilter0.implementation=Freq_Xlating_Fir_Filter ;#dump: Dump the filtered data to a file. InputFilter0.dump=false ;#dump_filename: Log path and filename. InputFilter0.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse reponse given a set of band edges, ;#the desired reponse on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter0.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter0.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter0.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter0.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter0.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter0.band1_begin=0.0 InputFilter0.band1_end=0.45 InputFilter0.band2_begin=0.55 InputFilter0.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter0.ampl1_begin=1.0 InputFilter0.ampl1_end=1.0 InputFilter0.ampl2_begin=0.0 InputFilter0.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter0.band1_error=1.0 InputFilter0.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter0.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter0.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter0.IF is the intermediate frequency (in Hz) shifted down to zero Hz ;FOR USE GNSS-SDR WITH RTLSDR DONGLES USER MUST SET THE CALIBRATED SAMPLE RATE HERE ; i.e. using front-end-cal as reported here:http://www.cttc.es/publication/turning-a-television-into-a-gnss-receiver/ InputFilter0.sampling_frequency=20000000 ;# IF deviation due to front-end LO inaccuracies [HZ] InputFilter0.IF=0; ;#-205000 ;# Decimation factor after the frequency tranaslating block InputFilter0.decimation_factor=8 ;######### RESAMPLER CONFIG 0 ############ ;## Resamples the input data. Resampler0.implementation=Pass_Through ;######### SIGNAL_CONDITIONER 1 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. SignalConditioner1.implementation=Pass_Through ;######### DATA_TYPE_ADAPTER 1 CONFIG ############ DataTypeAdapter1.implementation=Pass_Through DataTypeAdapter1.item_type=gr_complex ;######### INPUT_FILTER 1 CONFIG ############ InputFilter1.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter1.dump=false ;#dump_filename: Log path and filename. InputFilter1.dump_filename=../data/input_filter.dat ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter1.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter1.output_item_type=gr_complex ;######### RESAMPLER CONFIG 1 ############ ;## Resamples the input data. Resampler1.implementation=Pass_Through ;######### SIGNAL_CONDITIONER 2 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. SignalConditioner2.implementation=Pass_Through ;######### DATA_TYPE_ADAPTER 2 CONFIG ############ DataTypeAdapter2.implementation=Pass_Through DataTypeAdapter2.item_type=gr_complex ;######### INPUT_FILTER 2 CONFIG ############ InputFilter2.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter2.dump=false ;#dump_filename: Log path and filename. InputFilter2.dump_filename=../data/input_filter.dat ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter2.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter2.output_item_type=gr_complex ;######### RESAMPLER CONFIG 2 ############ ;## Resamples the input data. Resampler2.implementation=Pass_Through ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available GPS satellite channels. Channels_1C.count=8 ;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver Channels.in_acquisition=1 ;# CHANNEL CONNECTION Channel0.RF_channel_ID=0 Channel1.RF_channel_ID=0 Channel2.RF_channel_ID=0 Channel3.RF_channel_ID=0 Channel4.RF_channel_ID=0 Channel5.RF_channel_ID=0 Channel6.RF_channel_ID=0 Channel7.RF_channel_ID=0 ;#signal: ;#if the option is disabled by default is assigned "1C" GPS L1 C/A Channel.signal=1C ;######### SPECIFIC CHANNELS CONFIG ###### ;#The following options are specific to each channel and overwrite the generic options ;######### ACQUISITION GLOBAL CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1C.dump=false ;#filename: Log path and filename Acquisition_1C.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1C.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_1C.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1C.coherent_integration_time_ms=1 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition_1C.use_CFAR_algorithm=false; ;#threshold: Acquisition threshold. It will be ignored if pfa is defined. Acquisition_1C.threshold=15 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] ;Acquisition_1C.pfa=0.0001 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1C.doppler_max=10000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_1C.doppler_step=250 ;#bit_transition_flag: Enable or disable a strategy to deal with bit transitions in GPS signals: process two dwells and take ;#maximum test statistics. Only use with implementation: [GPS_L1_CA_PCPS_Acquisition] ;#(should not be used for Galileo_E1_PCPS_Ambiguous_Acquisition]) Acquisition_1C.bit_transition_flag=false ;#max_dwells: Maximum number of consecutive dwells to be processed. It will be ignored if bit_transition_flag=true Acquisition_1C.max_dwells=1 ;######### ACQUISITION CHANNELS CONFIG ###### ;#The following options are specific to each channel and overwrite the generic options ;######### TRACKING GLOBAL CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_PLL_C_Aid_Tracking] Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_C_Aid_Tracking ;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version. Tracking_1C.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_1C.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_1C.dump=true ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_1C.dump_filename=../data/epl_tracking_ch_ Tracking_1C.extend_correlation_ms=10 ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1C.pll_bw_hz=40.0; Tracking_1C.pll_bw_narrow_hz=35; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_1C.dll_bw_hz=2.0; Tracking_1C.dll_bw_narrow_hz=2.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_1C.order=3; ;#early_late_space_chips: correlator early-late space [chips]. Use [0.5] Tracking_1C.early_late_space_chips=0.5; ;######### TELEMETRY DECODER GPS CONFIG ############ ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L1 C/A TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false ;#decimation factor TelemetryDecoder_1C.decimation_factor=1; ;######### OBSERVABLES CONFIG ############ ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. Observables.implementation=GPS_L1_CA_Observables ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] Observables.dump=false ;#dump_filename: Log path and filename. Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ ;#implementation: Position Velocity and Time (PVT) implementation algorithm: Use [GPS_L1_CA_PVT] in this version. PVT.implementation=GPS_L1_CA_PVT ;#averaging_depth: Number of PVT observations in the moving average algorithm PVT.averaging_depth=10 ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.flag_averaging=true ;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time (for GPS CA L1 is 1ms) [ms] PVT.output_rate_ms=100 ;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms<=display_rate_ms. PVT.display_rate_ms=500 ;# KML, GeoJSON, NMEA and RTCM output configuration ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump and ".kml" to GoogleEarth dump. PVT.dump_filename=./PVT ;#nmea_dump_filename: NMEA log path and filename PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; ;#flag_nmea_tty_port: Enable or disable the NMEA log to a serial TTY port (Can be used with real hardware or virtual one) PVT.flag_nmea_tty_port=false; ;#nmea_dump_devname: serial device descriptor for NMEA logging PVT.nmea_dump_devname=/dev/pts/4 PVT.flag_rtcm_server=true PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump=false gnss-sdr-0.0.9/conf/gnss-sdr_multichannel_GPS_L1_Flexiband_realtime_III_1a.conf000066400000000000000000000316621305042567700273560ustar00rootroot00000000000000; Default configuration file ; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=2500000 ;######### SUPL RRLP GPS assistance configuration ##### ; Check http://www.mcc-mnc.com/ ; On Android: https://play.google.com/store/apps/details?id=net.its_here.cellidinfo&hl=en GNSS-SDR.SUPL_gps_enabled=false GNSS-SDR.SUPL_read_gps_assistance_xml=true GNSS-SDR.SUPL_gps_ephemeris_server=supl.google.com GNSS-SDR.SUPL_gps_ephemeris_port=7275 GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com GNSS-SDR.SUPL_gps_acquisition_port=7275 GNSS-SDR.SUPL_MCC=244 GNSS-SDR.SUPL_MNS=5 GNSS-SDR.SUPL_LAC=0x59e2 GNSS-SDR.SUPL_CI=0x31b0 ;######### SIGNAL_SOURCE CONFIG ############ ;#implementation: Use [File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) SignalSource.implementation=Flexiband_Signal_Source ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. SignalSource.item_type=gr_complex ;# FPGA firmware file SignalSource.firmware_file=flexiband_III-1a.bit ;#RF_channels: Number of RF channels present in the frontend device, must agree the FPGA firmware file SignalSource.RF_channels=1 ;#frontend channels gain. Not usable yet! SignalSource.gain1=0 SignalSource.gain2=0 SignalSource.gain3=0 ;#frontend channels AGC SignalSource.AGC=true ;# USB 3.0 packet buffer size (number of SuperSpeed packets) SignalSource.usb_packet_buffer=128 ;######### SIGNAL_CONDITIONER 0 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. SignalConditioner0.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER 0 CONFIG ############ DataTypeAdapter0.implementation=Pass_Through DataTypeAdapter0.item_type=gr_complex ;######### INPUT_FILTER 0 CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. InputFilter0.implementation=Freq_Xlating_Fir_Filter ;#dump: Dump the filtered data to a file. InputFilter0.dump=false ;#dump_filename: Log path and filename. InputFilter0.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse reponse given a set of band edges, ;#the desired reponse on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter0.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter0.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter0.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter0.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter0.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter0.band1_begin=0.0 InputFilter0.band1_end=0.45 InputFilter0.band2_begin=0.55 InputFilter0.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter0.ampl1_begin=1.0 InputFilter0.ampl1_end=1.0 InputFilter0.ampl2_begin=0.0 InputFilter0.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter0.band1_error=1.0 InputFilter0.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter0.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter0.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter0.IF is the intermediate frequency (in Hz) shifted down to zero Hz ;FOR USE GNSS-SDR WITH RTLSDR DONGLES USER MUST SET THE CALIBRATED SAMPLE RATE HERE ; i.e. using front-end-cal as reported here:http://www.cttc.es/publication/turning-a-television-into-a-gnss-receiver/ InputFilter0.sampling_frequency=20000000 ;# IF deviation due to front-end LO inaccuracies [HZ] InputFilter0.IF=-205000 ;# Decimation factor after the frequency tranaslating block InputFilter0.decimation_factor=8 ;######### RESAMPLER CONFIG 0 ############ ;## Resamples the input data. Resampler0.implementation=Pass_Through ;######### SIGNAL_CONDITIONER 1 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. SignalConditioner1.implementation=Pass_Through ;######### DATA_TYPE_ADAPTER 1 CONFIG ############ DataTypeAdapter1.implementation=Pass_Through DataTypeAdapter1.item_type=gr_complex ;######### INPUT_FILTER 1 CONFIG ############ InputFilter1.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter1.dump=false ;#dump_filename: Log path and filename. InputFilter1.dump_filename=../data/input_filter.dat ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter1.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter1.output_item_type=gr_complex ;######### RESAMPLER CONFIG 1 ############ ;## Resamples the input data. Resampler1.implementation=Pass_Through ;######### SIGNAL_CONDITIONER 2 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. SignalConditioner2.implementation=Pass_Through ;######### DATA_TYPE_ADAPTER 2 CONFIG ############ DataTypeAdapter2.implementation=Pass_Through DataTypeAdapter2.item_type=gr_complex ;######### INPUT_FILTER 2 CONFIG ############ InputFilter2.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter2.dump=false ;#dump_filename: Log path and filename. InputFilter2.dump_filename=../data/input_filter.dat ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter2.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter2.output_item_type=gr_complex ;######### RESAMPLER CONFIG 2 ############ ;## Resamples the input data. Resampler2.implementation=Pass_Through ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available GPS satellite channels. Channels_1C.count=8 ;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver Channels.in_acquisition=1 ;#signal: ;# "1C" GPS L1 C/A ;# "2S" GPS L2 L2C (M) ;# "1B" GALILEO E1 B (I/NAV OS/CS/SoL) ;# "5X" GALILEO E5a I+Q ;# CHANNEL CONNECTION Channel0.RF_channel_ID=0 Channel1.RF_channel_ID=0 Channel2.RF_channel_ID=0 Channel3.RF_channel_ID=0 Channel4.RF_channel_ID=0 Channel5.RF_channel_ID=0 Channel6.RF_channel_ID=0 Channel7.RF_channel_ID=0 ;#signal: ;#if the option is disabled by default is assigned "1C" GPS L1 C/A Channel0.signal=1C Channel1.signal=1C Channel2.signal=1C Channel3.signal=1C Channel4.signal=1C Channel5.signal=1C Channel6.signal=1C Channel7.signal=1C ;######### SPECIFIC CHANNELS CONFIG ###### ;#The following options are specific to each channel and overwrite the generic options ;######### ACQUISITION GLOBAL CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1C.dump=false ;#filename: Log path and filename Acquisition_1C.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1C.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_1C.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1C.coherent_integration_time_ms=1 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition ;#threshold: Acquisition threshold. It will be ignored if pfa is defined. Acquisition_1C.threshold=0.012 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] ;Acquisition_1C.pfa=0.0001 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1C.doppler_max=10000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_1C.doppler_step=250 ;#bit_transition_flag: Enable or disable a strategy to deal with bit transitions in GPS signals: process two dwells and take ;#maximum test statistics. Only use with implementation: [GPS_L1_CA_PCPS_Acquisition] ;#(should not be used for Galileo_E1_PCPS_Ambiguous_Acquisition]) Acquisition_1C.bit_transition_flag=false ;#max_dwells: Maximum number of consecutive dwells to be processed. It will be ignored if bit_transition_flag=true Acquisition_1C.max_dwells=1 ;######### ACQUISITION CHANNELS CONFIG ###### ;#The following options are specific to each channel and overwrite the generic options ;######### TRACKING GLOBAL CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_PLL_C_Aid_Tracking] Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking ;#item_type: Type and resolution for each of the signal samples. Tracking_1C.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_1C.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_1C.dump=false ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_1C.dump_filename=./tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1C.pll_bw_hz=40.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_1C.dll_bw_hz=3.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_1C.order=3; ;#early_late_space_chips: correlator early-late space [chips]. Use [0.5] Tracking_1C.early_late_space_chips=0.5; ;######### TELEMETRY DECODER GPS CONFIG ############ ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L1 C/A TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false ;#decimation factor TelemetryDecoder_1C.decimation_factor=1; ;######### OBSERVABLES CONFIG ############ ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. Observables.implementation=GPS_L1_CA_Observables ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] Observables.dump=false ;#dump_filename: Log path and filename. Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ ;#implementation: Position Velocity and Time (PVT) implementation algorithm: Use [GPS_L1_CA_PVT] in this version. PVT.implementation=GPS_L1_CA_PVT ;#averaging_depth: Number of PVT observations in the moving average algorithm PVT.averaging_depth=10 ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.flag_averaging=true ;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time (for GPS CA L1 is 1ms) [ms] PVT.output_rate_ms=100 ;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms<=display_rate_ms. PVT.display_rate_ms=500 ;# KML, GeoJSON, NMEA and RTCM output configuration ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump and ".kml" to GoogleEarth dump. PVT.dump_filename=./PVT ;#nmea_dump_filename: NMEA log path and filename PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; ;#flag_nmea_tty_port: Enable or disable the NMEA log to a serial TTY port (Can be used with real hardware or virtual one) PVT.flag_nmea_tty_port=false; ;#nmea_dump_devname: serial device descriptor for NMEA logging PVT.nmea_dump_devname=/dev/pts/4 PVT.flag_rtcm_server=true PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump=false gnss-sdr-0.0.9/conf/gnss-sdr_multichannel_GPS_L1_Flexiband_realtime_III_1b.conf000066400000000000000000000316601305042567700273550ustar00rootroot00000000000000; Default configuration file ; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=2500000 ;######### SUPL RRLP GPS assistance configuration ##### ; Check http://www.mcc-mnc.com/ ; On Android: https://play.google.com/store/apps/details?id=net.its_here.cellidinfo&hl=en GNSS-SDR.SUPL_gps_enabled=false GNSS-SDR.SUPL_read_gps_assistance_xml=true GNSS-SDR.SUPL_gps_ephemeris_server=supl.google.com GNSS-SDR.SUPL_gps_ephemeris_port=7275 GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com GNSS-SDR.SUPL_gps_acquisition_port=7275 GNSS-SDR.SUPL_MCC=244 GNSS-SDR.SUPL_MNS=5 GNSS-SDR.SUPL_LAC=0x59e2 GNSS-SDR.SUPL_CI=0x31b0 ;######### SIGNAL_SOURCE CONFIG ############ ;#implementation: Use [File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) SignalSource.implementation=Flexiband_Signal_Source ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. SignalSource.item_type=gr_complex ;# FPGA firmware file SignalSource.firmware_file=flexiband_III-1b.bit ;#RF_channels: Number of RF channels present in the frontend device, must agree the FPGA firmware file SignalSource.RF_channels=1 ;#frontend channels gain. Not usable yet! SignalSource.gain1=0 SignalSource.gain2=0 SignalSource.gain3=0 ;#frontend channels AGC SignalSource.AGC=true ;# USB 3.0 packet buffer size (number of SuperSpeed packets) SignalSource.usb_packet_buffer=128 ;######### SIGNAL_CONDITIONER 0 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. SignalConditioner0.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER 0 CONFIG ############ DataTypeAdapter0.implementation=Pass_Through DataTypeAdapter0.item_type=gr_complex ;######### INPUT_FILTER 0 CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. InputFilter0.implementation=Freq_Xlating_Fir_Filter ;#dump: Dump the filtered data to a file. InputFilter0.dump=false ;#dump_filename: Log path and filename. InputFilter0.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse reponse given a set of band edges, ;#the desired reponse on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter0.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter0.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter0.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter0.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter0.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter0.band1_begin=0.0 InputFilter0.band1_end=0.45 InputFilter0.band2_begin=0.55 InputFilter0.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter0.ampl1_begin=1.0 InputFilter0.ampl1_end=1.0 InputFilter0.ampl2_begin=0.0 InputFilter0.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter0.band1_error=1.0 InputFilter0.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter0.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter0.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter0.IF is the intermediate frequency (in Hz) shifted down to zero Hz ;FOR USE GNSS-SDR WITH RTLSDR DONGLES USER MUST SET THE CALIBRATED SAMPLE RATE HERE ; i.e. using front-end-cal as reported here:http://www.cttc.es/publication/turning-a-television-into-a-gnss-receiver/ InputFilter0.sampling_frequency=20000000 ;# IF deviation due to front-end LO inaccuracies [HZ] InputFilter0.IF=-205000 ;# Decimation factor after the frequency tranaslating block InputFilter0.decimation_factor=8 ;######### RESAMPLER CONFIG 0 ############ ;## Resamples the input data. Resampler0.implementation=Pass_Through ;######### SIGNAL_CONDITIONER 1 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. SignalConditioner1.implementation=Pass_Through ;######### DATA_TYPE_ADAPTER 1 CONFIG ############ DataTypeAdapter1.implementation=Pass_Through DataTypeAdapter1.item_type=gr_complex ;######### INPUT_FILTER 1 CONFIG ############ InputFilter1.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter1.dump=false ;#dump_filename: Log path and filename. InputFilter1.dump_filename=../data/input_filter.dat ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter1.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter1.output_item_type=gr_complex ;######### RESAMPLER CONFIG 1 ############ ;## Resamples the input data. Resampler1.implementation=Pass_Through ;######### SIGNAL_CONDITIONER 2 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. SignalConditioner2.implementation=Pass_Through ;######### DATA_TYPE_ADAPTER 2 CONFIG ############ DataTypeAdapter2.implementation=Pass_Through DataTypeAdapter2.item_type=gr_complex ;######### INPUT_FILTER 2 CONFIG ############ InputFilter2.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter2.dump=false ;#dump_filename: Log path and filename. InputFilter2.dump_filename=../data/input_filter.dat ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter2.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter2.output_item_type=gr_complex ;######### RESAMPLER CONFIG 2 ############ ;## Resamples the input data. Resampler2.implementation=Pass_Through ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available GPS satellite channels. Channels_1C.count=8 ;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver Channels.in_acquisition=1 ;#signal: ;# "1C" GPS L1 C/A ;# "2S" GPS L2 L2C (M) ;# "1B" GALILEO E1 B (I/NAV OS/CS/SoL) ;# "5X" GALILEO E5a I+Q ;# CHANNEL CONNECTION Channel0.RF_channel_ID=0 Channel1.RF_channel_ID=0 Channel2.RF_channel_ID=0 Channel3.RF_channel_ID=0 Channel4.RF_channel_ID=0 Channel5.RF_channel_ID=0 Channel6.RF_channel_ID=0 Channel7.RF_channel_ID=0 ;#signal: ;#if the option is disabled by default is assigned "1C" GPS L1 C/A Channel0.signal=1C Channel1.signal=1C Channel2.signal=1C Channel3.signal=1C Channel4.signal=1C Channel5.signal=1C Channel6.signal=1C Channel7.signal=1C ;######### SPECIFIC CHANNELS CONFIG ###### ;#The following options are specific to each channel and overwrite the generic options ;######### ACQUISITION GLOBAL CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1C.dump=false ;#filename: Log path and filename Acquisition_1C.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1C.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_1C.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1C.coherent_integration_time_ms=1 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition ;#threshold: Acquisition threshold. It will be ignored if pfa is defined. Acquisition_1C.threshold=0.012 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] ;Acquisition_1C.pfa=0.0001 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1C.doppler_max=10000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_1C.doppler_step=250 ;#bit_transition_flag: Enable or disable a strategy to deal with bit transitions in GPS signals: process two dwells and take ;#maximum test statistics. Only use with implementation: [GPS_L1_CA_PCPS_Acquisition] ;#(should not be used for Galileo_E1_PCPS_Ambiguous_Acquisition]) Acquisition_1C.bit_transition_flag=false ;#max_dwells: Maximum number of consecutive dwells to be processed. It will be ignored if bit_transition_flag=true Acquisition_1C.max_dwells=1 ;######### ACQUISITION CHANNELS CONFIG ###### ;#The following options are specific to each channel and overwrite the generic options ;######### TRACKING GLOBAL CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_PLL_C_Aid_Tracking] Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking ;#item_type: Type and resolution for each of the signal samples. Tracking_1C.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_1C.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_1C.dump=false ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_1C.dump_filename=./tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1C.pll_bw_hz=40.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_1C.dll_bw_hz=3.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_1C.order=3; ;#early_late_space_chips: correlator early-late space [chips]. Use [0.5] Tracking_1C.early_late_space_chips=0.5; ;######### TELEMETRY DECODER GPS CONFIG ############ ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L1 C/A TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false ;#decimation factor TelemetryDecoder_1C.decimation_factor=1; ;######### OBSERVABLES CONFIG ############ ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. Observables.implementation=GPS_L1_CA_Observables ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] Observables.dump=false ;#dump_filename: Log path and filename. Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ ;#implementation: Position Velocity and Time (PVT) implementation algorithm: Use [GPS_L1_CA_PVT] in this version. PVT.implementation=GPS_L1_CA_PVT ;#averaging_depth: Number of PVT observations in the moving average algorithm PVT.averaging_depth=10 ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.flag_averaging=true ;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time (for GPS CA L1 is 1ms) [ms] PVT.output_rate_ms=100 ;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms<=display_rate_ms. PVT.display_rate_ms=500 ;# KML, GeoJSON, NMEA and RTCM output configuration ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump and ".kml" to GoogleEarth dump. PVT.dump_filename=./PVT ;#nmea_dump_filename: NMEA log path and filename PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; ;#flag_nmea_tty_port: Enable or disable the NMEA log to a serial TTY port (Can be used with real hardware or virtual one) PVT.flag_nmea_tty_port=false; ;#nmea_dump_devname: serial device descriptor for NMEA logging PVT.nmea_dump_devname=/dev/pts/4 PVT.flag_rtcm_server=true PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump=false gnss-sdr-0.0.9/conf/gnss-sdr_multichannel_GPS_L1_Flexiband_realtime_II_3b.conf000066400000000000000000000316621305042567700272500ustar00rootroot00000000000000; Default configuration file ; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=2500000 ;######### SUPL RRLP GPS assistance configuration ##### ; Check http://www.mcc-mnc.com/ ; On Android: https://play.google.com/store/apps/details?id=net.its_here.cellidinfo&hl=en GNSS-SDR.SUPL_gps_enabled=false GNSS-SDR.SUPL_read_gps_assistance_xml=true GNSS-SDR.SUPL_gps_ephemeris_server=supl.google.com GNSS-SDR.SUPL_gps_ephemeris_port=7275 GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com GNSS-SDR.SUPL_gps_acquisition_port=7275 GNSS-SDR.SUPL_MCC=244 GNSS-SDR.SUPL_MNS=5 GNSS-SDR.SUPL_LAC=0x59e2 GNSS-SDR.SUPL_CI=0x31b0 ;######### SIGNAL_SOURCE CONFIG ############ ;#implementation: Use [File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) SignalSource.implementation=Flexiband_Signal_Source ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. SignalSource.item_type=gr_complex ;# FPGA firmware file SignalSource.firmware_file=flexiband_II-3b.bit ;#RF_channels: Number of RF channels present in the frontend device, must agree the FPGA firmware file SignalSource.RF_channels=1 ;#frontend channels gain. Not usable yet! SignalSource.gain1=0 SignalSource.gain2=0 SignalSource.gain3=0 ;#frontend channels AGC SignalSource.AGC=true ;# USB 3.0 packet buffer size (number of SuperSpeed packets) SignalSource.usb_packet_buffer=128 ;######### SIGNAL_CONDITIONER 0 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. SignalConditioner0.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER 0 CONFIG ############ DataTypeAdapter0.implementation=Pass_Through DataTypeAdapter0.item_type=gr_complex ;######### INPUT_FILTER 0 CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. InputFilter0.implementation=Freq_Xlating_Fir_Filter ;#dump: Dump the filtered data to a file. InputFilter0.dump=false ;#dump_filename: Log path and filename. InputFilter0.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse reponse given a set of band edges, ;#the desired reponse on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter0.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter0.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter0.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter0.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter0.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter0.band1_begin=0.0 InputFilter0.band1_end=0.45 InputFilter0.band2_begin=0.55 InputFilter0.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter0.ampl1_begin=1.0 InputFilter0.ampl1_end=1.0 InputFilter0.ampl2_begin=0.0 InputFilter0.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter0.band1_error=1.0 InputFilter0.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter0.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter0.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter0.IF is the intermediate frequency (in Hz) shifted down to zero Hz ;FOR USE GNSS-SDR WITH RTLSDR DONGLES USER MUST SET THE CALIBRATED SAMPLE RATE HERE ; i.e. using front-end-cal as reported here:http://www.cttc.es/publication/turning-a-television-into-a-gnss-receiver/ InputFilter0.sampling_frequency=40000000 ;# IF deviation due to front-end LO inaccuracies [HZ] InputFilter0.IF=-205000 ;# Decimation factor after the frequency tranaslating block InputFilter0.decimation_factor=16 ;######### RESAMPLER CONFIG 0 ############ ;## Resamples the input data. Resampler0.implementation=Pass_Through ;######### SIGNAL_CONDITIONER 1 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. SignalConditioner1.implementation=Pass_Through ;######### DATA_TYPE_ADAPTER 1 CONFIG ############ DataTypeAdapter1.implementation=Pass_Through DataTypeAdapter1.item_type=gr_complex ;######### INPUT_FILTER 1 CONFIG ############ InputFilter1.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter1.dump=false ;#dump_filename: Log path and filename. InputFilter1.dump_filename=../data/input_filter.dat ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter1.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter1.output_item_type=gr_complex ;######### RESAMPLER CONFIG 1 ############ ;## Resamples the input data. Resampler1.implementation=Pass_Through ;######### SIGNAL_CONDITIONER 2 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. SignalConditioner2.implementation=Pass_Through ;######### DATA_TYPE_ADAPTER 2 CONFIG ############ DataTypeAdapter2.implementation=Pass_Through DataTypeAdapter2.item_type=gr_complex ;######### INPUT_FILTER 2 CONFIG ############ InputFilter2.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter2.dump=false ;#dump_filename: Log path and filename. InputFilter2.dump_filename=../data/input_filter.dat ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter2.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter2.output_item_type=gr_complex ;######### RESAMPLER CONFIG 2 ############ ;## Resamples the input data. Resampler2.implementation=Pass_Through ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available GPS satellite channels. Channels_1C.count=8 ;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver Channels.in_acquisition=1 ;# signal: ;# "1C" GPS L1 C/A ;# "2S" GPS L2 L2C (M) ;# "1B" GALILEO E1 B (I/NAV OS/CS/SoL) ;# "5X" GALILEO E5a I+Q ;# CHANNEL CONNECTION Channel0.RF_channel_ID=0 Channel1.RF_channel_ID=0 Channel2.RF_channel_ID=0 Channel3.RF_channel_ID=0 Channel4.RF_channel_ID=0 Channel5.RF_channel_ID=0 Channel6.RF_channel_ID=0 Channel7.RF_channel_ID=0 ;#signal: ;#if the option is disabled by default is assigned "1C" GPS L1 C/A Channel0.signal=1C Channel1.signal=1C Channel2.signal=1C Channel3.signal=1C Channel4.signal=1C Channel5.signal=1C Channel6.signal=1C Channel7.signal=1C ;######### SPECIFIC CHANNELS CONFIG ###### ;#The following options are specific to each channel and overwrite the generic options ;######### ACQUISITION GLOBAL CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1C.dump=false ;#filename: Log path and filename Acquisition_1C.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1C.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_1C.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1C.coherent_integration_time_ms=1 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition ;#threshold: Acquisition threshold. It will be ignored if pfa is defined. Acquisition_1C.threshold=0.012 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] ;Acquisition_1C.pfa=0.0001 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1C.doppler_max=10000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_1C.doppler_step=250 ;#bit_transition_flag: Enable or disable a strategy to deal with bit transitions in GPS signals: process two dwells and take ;#maximum test statistics. Only use with implementation: [GPS_L1_CA_PCPS_Acquisition] ;#(should not be used for Galileo_E1_PCPS_Ambiguous_Acquisition]) Acquisition_1C.bit_transition_flag=false ;#max_dwells: Maximum number of consecutive dwells to be processed. It will be ignored if bit_transition_flag=true Acquisition_1C.max_dwells=1 ;######### ACQUISITION CHANNELS CONFIG ###### ;#The following options are specific to each channel and overwrite the generic options ;######### TRACKING GLOBAL CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_PLL_C_Aid_Tracking] Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking ;#item_type: Type and resolution for each of the signal samples. Tracking_1C.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_1C.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_1C.dump=false ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_1C.dump_filename=./tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1C.pll_bw_hz=40.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_1C.dll_bw_hz=3.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_1C.order=3; ;#early_late_space_chips: correlator early-late space [chips]. Use [0.5] Tracking_1C.early_late_space_chips=0.5; ;######### TELEMETRY DECODER GPS CONFIG ############ ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L1 C/A TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false ;#decimation factor TelemetryDecoder_1C.decimation_factor=1; ;######### OBSERVABLES CONFIG ############ ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. Observables.implementation=GPS_L1_CA_Observables ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] Observables.dump=false ;#dump_filename: Log path and filename. Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ ;#implementation: Position Velocity and Time (PVT) implementation algorithm: Use [GPS_L1_CA_PVT] in this version. PVT.implementation=GPS_L1_CA_PVT ;#averaging_depth: Number of PVT observations in the moving average algorithm PVT.averaging_depth=10 ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.flag_averaging=true ;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time (for GPS CA L1 is 1ms) [ms] PVT.output_rate_ms=100 ;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms<=display_rate_ms. PVT.display_rate_ms=500 ;# KML, GeoJSON, NMEA and RTCM output configuration ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump and ".kml" to GoogleEarth dump. PVT.dump_filename=./PVT ;#nmea_dump_filename: NMEA log path and filename PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; ;#flag_nmea_tty_port: Enable or disable the NMEA log to a serial TTY port (Can be used with real hardware or virtual one) PVT.flag_nmea_tty_port=false; ;#nmea_dump_devname: serial device descriptor for NMEA logging PVT.nmea_dump_devname=/dev/pts/4 PVT.flag_rtcm_server=true PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump=false gnss-sdr-0.0.9/conf/gnss-sdr_multichannel_GPS_L1_Flexiband_realtime_I_1b.conf000066400000000000000000000315461305042567700271360ustar00rootroot00000000000000; Default configuration file ; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=5000000 ;######### SUPL RRLP GPS assistance configuration ##### ; Check http://www.mcc-mnc.com/ ; On Android: https://play.google.com/store/apps/details?id=net.its_here.cellidinfo&hl=en GNSS-SDR.SUPL_gps_enabled=false GNSS-SDR.SUPL_read_gps_assistance_xml=true GNSS-SDR.SUPL_gps_ephemeris_server=supl.google.com GNSS-SDR.SUPL_gps_ephemeris_port=7275 GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com GNSS-SDR.SUPL_gps_acquisition_port=7275 GNSS-SDR.SUPL_MCC=244 GNSS-SDR.SUPL_MNS=5 GNSS-SDR.SUPL_LAC=0x59e2 GNSS-SDR.SUPL_CI=0x31b0 ;######### SIGNAL_SOURCE CONFIG ############ ;#implementation: Use [File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) SignalSource.implementation=Flexiband_Signal_Source ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. SignalSource.item_type=gr_complex ;# FPGA firmware file SignalSource.firmware_file=flexiband_I-1b.bit ;#RF_channels: Number of RF channels present in the frontend device, must agree the FPGA firmware file SignalSource.RF_channels=1 ;#frontend channels gain. Not usable yet! SignalSource.gain1=0 SignalSource.gain2=0 SignalSource.gain3=0 ;#frontend channels AGC SignalSource.AGC=true ;# USB 3.0 packet buffer size (number of SuperSpeed packets) SignalSource.usb_packet_buffer=128 ;######### SIGNAL_CONDITIONER 0 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. SignalConditioner0.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER 0 CONFIG ############ DataTypeAdapter0.implementation=Pass_Through DataTypeAdapter0.item_type=gr_complex ;######### INPUT_FILTER 0 CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. InputFilter0.implementation=Freq_Xlating_Fir_Filter ;#dump: Dump the filtered data to a file. InputFilter0.dump=false ;#dump_filename: Log path and filename. InputFilter0.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse reponse given a set of band edges, ;#the desired reponse on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter0.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter0.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter0.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter0.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter0.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter0.band1_begin=0.0 InputFilter0.band1_end=0.45 InputFilter0.band2_begin=0.55 InputFilter0.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter0.ampl1_begin=1.0 InputFilter0.ampl1_end=1.0 InputFilter0.ampl2_begin=0.0 InputFilter0.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter0.band1_error=1.0 InputFilter0.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter0.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter0.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter0.IF is the intermediate frequency (in Hz) shifted down to zero Hz ;FOR USE GNSS-SDR WITH RTLSDR DONGLES USER MUST SET THE CALIBRATED SAMPLE RATE HERE ; i.e. using front-end-cal as reported here:http://www.cttc.es/publication/turning-a-television-into-a-gnss-receiver/ InputFilter0.sampling_frequency=40000000 ;# IF deviation due to front-end LO inaccuracies [HZ] InputFilter0.IF=-205000 ;# Decimation factor after the frequency tranaslating block InputFilter0.decimation_factor=8 ;######### RESAMPLER CONFIG 0 ############ ;## Resamples the input data. Resampler0.implementation=Pass_Through ;######### SIGNAL_CONDITIONER 1 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. SignalConditioner1.implementation=Pass_Through ;######### DATA_TYPE_ADAPTER 1 CONFIG ############ DataTypeAdapter1.implementation=Pass_Through DataTypeAdapter1.item_type=gr_complex ;######### INPUT_FILTER 1 CONFIG ############ InputFilter1.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter1.dump=false ;#dump_filename: Log path and filename. InputFilter1.dump_filename=../data/input_filter.dat ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter1.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter1.output_item_type=gr_complex ;######### RESAMPLER CONFIG 1 ############ ;## Resamples the input data. Resampler1.implementation=Pass_Through ;######### SIGNAL_CONDITIONER 2 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. SignalConditioner2.implementation=Pass_Through ;######### DATA_TYPE_ADAPTER 2 CONFIG ############ DataTypeAdapter2.implementation=Pass_Through DataTypeAdapter2.item_type=gr_complex ;######### INPUT_FILTER 2 CONFIG ############ InputFilter2.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter2.dump=false ;#dump_filename: Log path and filename. InputFilter2.dump_filename=../data/input_filter.dat ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter2.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter2.output_item_type=gr_complex ;######### RESAMPLER CONFIG 2 ############ ;## Resamples the input data. Resampler2.implementation=Pass_Through ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available GPS satellite channels. Channels_1C.count=4 ;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver Channels.in_acquisition=1 ;#signal: ;# "1C" GPS L1 C/A ;# "2S" GPS L2 L2C (M) ;# "1B" GALILEO E1 B (I/NAV OS/CS/SoL) ;# "5X" GALILEO E5a I+Q ;# CHANNEL CONNECTION Channel0.RF_channel_ID=0 Channel1.RF_channel_ID=0 Channel2.RF_channel_ID=0 Channel3.RF_channel_ID=0 ;Channel4.RF_channel_ID=0 ;Channel5.RF_channel_ID=0 ;Channel6.RF_channel_ID=0 ;Channel7.RF_channel_ID=0 ;#signal: ;#if the option is disabled by default is assigned "1C" GPS L1 C/A Channel0.signal=1C Channel1.signal=1C Channel2.signal=1C Channel3.signal=1C ;######### SPECIFIC CHANNELS CONFIG ###### ;#The following options are specific to each channel and overwrite the generic options ;######### ACQUISITION GLOBAL CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1C.dump=false ;#filename: Log path and filename Acquisition_1C.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1C.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_1C.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1C.coherent_integration_time_ms=1 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition ;#threshold: Acquisition threshold. It will be ignored if pfa is defined. Acquisition_1C.threshold=0.011 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] ;Acquisition_1C.pfa=0.0001 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1C.doppler_max=10000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_1C.doppler_step=250 ;#bit_transition_flag: Enable or disable a strategy to deal with bit transitions in GPS signals: process two dwells and take ;#maximum test statistics. Only use with implementation: [GPS_L1_CA_PCPS_Acquisition] ;#(should not be used for Galileo_E1_PCPS_Ambiguous_Acquisition]) Acquisition_1C.bit_transition_flag=false ;#max_dwells: Maximum number of consecutive dwells to be processed. It will be ignored if bit_transition_flag=true Acquisition_1C.max_dwells=1 ;######### ACQUISITION CHANNELS CONFIG ###### ;#The following options are specific to each channel and overwrite the generic options ;######### TRACKING GLOBAL CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_PLL_C_Aid_Tracking] Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking ;#item_type: Type and resolution for each of the signal samples. Tracking_1C.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_1C.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_1C.dump=false ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_1C.dump_filename=./tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1C.pll_bw_hz=40.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_1C.dll_bw_hz=3.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_1C.order=3; ;#early_late_space_chips: correlator early-late space [chips]. Use [0.5] Tracking_1C.early_late_space_chips=0.5; ;######### TELEMETRY DECODER GPS CONFIG ############ ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L1 C/A TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false ;#decimation factor TelemetryDecoder_1C.decimation_factor=1; ;######### OBSERVABLES CONFIG ############ ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. Observables.implementation=GPS_L1_CA_Observables ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] Observables.dump=false ;#dump_filename: Log path and filename. Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ ;#implementation: Position Velocity and Time (PVT) implementation algorithm: Use [GPS_L1_CA_PVT] in this version. PVT.implementation=GPS_L1_CA_PVT ;#averaging_depth: Number of PVT observations in the moving average algorithm PVT.averaging_depth=10 ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.flag_averaging=true ;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time (for GPS CA L1 is 1ms) [ms] PVT.output_rate_ms=100 ;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms<=display_rate_ms. PVT.display_rate_ms=500 ;# KML, GeoJSON, NMEA and RTCM output configuration ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump and ".kml" to GoogleEarth dump. PVT.dump_filename=./PVT ;#nmea_dump_filename: NMEA log path and filename PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; ;#flag_nmea_tty_port: Enable or disable the NMEA log to a serial TTY port (Can be used with real hardware or virtual one) PVT.flag_nmea_tty_port=false; ;#nmea_dump_devname: serial device descriptor for NMEA logging PVT.nmea_dump_devname=/dev/pts/4 PVT.flag_rtcm_server=true PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump=false gnss-sdr-0.0.9/conf/gnss-sdr_multichannel_GPS_L1_L2_Flexiband_realtime_III_1b.conf000066400000000000000000000427651305042567700277220ustar00rootroot00000000000000; Default configuration file ; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=2500000 ;######### SUPL RRLP GPS assistance configuration ##### ; Check http://www.mcc-mnc.com/ ; On Android: https://play.google.com/store/apps/details?id=net.its_here.cellidinfo&hl=en GNSS-SDR.SUPL_gps_enabled=false GNSS-SDR.SUPL_read_gps_assistance_xml=true GNSS-SDR.SUPL_gps_ephemeris_server=supl.google.com GNSS-SDR.SUPL_gps_ephemeris_port=7275 GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com GNSS-SDR.SUPL_gps_acquisition_port=7275 GNSS-SDR.SUPL_MCC=244 GNSS-SDR.SUPL_MNS=5 GNSS-SDR.SUPL_LAC=0x59e2 GNSS-SDR.SUPL_CI=0x31b0 ;######### SIGNAL_SOURCE CONFIG ############ ;#implementation: Use [File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) SignalSource.implementation=Flexiband_Signal_Source ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. SignalSource.item_type=gr_complex ;# FPGA firmware file SignalSource.firmware_file=flexiband_III-1b.bit ;#RF_channels: Number of RF channels present in the frontend device, must agree the FPGA firmware file SignalSource.RF_channels=2 ;#frontend channels gain. Not usable yet! SignalSource.gain1=0 SignalSource.gain2=0 SignalSource.gain3=0 ;#frontend channels AGC SignalSource.AGC=true ;# USB 3.0 packet buffer size (number of SuperSpeed packets) SignalSource.usb_packet_buffer=128 ;###################################################### ;######### RF CHANNEL 0 SIGNAL CONDITIONER ############ ;###################################################### ;######### SIGNAL_CONDITIONER 0 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. SignalConditioner0.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER 0 CONFIG ############ DataTypeAdapter0.implementation=Pass_Through DataTypeAdapter0.item_type=gr_complex ;######### INPUT_FILTER 0 CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. InputFilter0.implementation=Freq_Xlating_Fir_Filter ;#dump: Dump the filtered data to a file. InputFilter0.dump=false ;#dump_filename: Log path and filename. InputFilter0.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse reponse given a set of band edges, ;#the desired reponse on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter0.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter0.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter0.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter0.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter0.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter0.band1_begin=0.0 InputFilter0.band1_end=0.45 InputFilter0.band2_begin=0.55 InputFilter0.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter0.ampl1_begin=1.0 InputFilter0.ampl1_end=1.0 InputFilter0.ampl2_begin=0.0 InputFilter0.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter0.band1_error=1.0 InputFilter0.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter0.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter0.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter0.IF is the intermediate frequency (in Hz) shifted down to zero Hz ;FOR USE GNSS-SDR WITH RTLSDR DONGLES USER MUST SET THE CALIBRATED SAMPLE RATE HERE ; i.e. using front-end-cal as reported here:http://www.cttc.es/publication/turning-a-television-into-a-gnss-receiver/ InputFilter0.sampling_frequency=20000000 ;# IF deviation due to front-end LO inaccuracies [HZ] ;# WARNING: Fraunhofer front-end hardwareconfigurations can difer. Signals available on http://www.iis.fraunhofer.de/de/ff/lok/leist/test/flexiband.html are centered on 0 Hz, ALL BANDS. InputFilter0.IF=-205000 ;#InputFilter0.IF=0 ;# Decimation factor after the frequency tranaslating block InputFilter0.decimation_factor=8 ;######### RESAMPLER CONFIG 0 ############ ;## Resamples the input data. Resampler0.implementation=Pass_Through ;###################################################### ;######### RF CHANNEL 1 SIGNAL CONDITIONER ############ ;###################################################### ;######### SIGNAL_CONDITIONER 1 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. SignalConditioner1.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER 1 CONFIG ############ DataTypeAdapter1.implementation=Pass_Through DataTypeAdapter1.item_type=gr_complex ;######### INPUT_FILTER 0 CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. InputFilter1.implementation=Freq_Xlating_Fir_Filter ;#dump: Dump the filtered data to a file. InputFilter1.dump=false ;#dump_filename: Log path and filename. InputFilter1.dump_filename=../data/input_filter_ch1.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse reponse given a set of band edges, ;#the desired reponse on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter1.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter1.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter1.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter1.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter1.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter1.band1_begin=0.0 InputFilter1.band1_end=0.45 InputFilter1.band2_begin=0.55 InputFilter1.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter1.ampl1_begin=1.0 InputFilter1.ampl1_end=1.0 InputFilter1.ampl2_begin=0.0 InputFilter1.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter1.band1_error=1.0 InputFilter1.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter1.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter1.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter0.IF is the intermediate frequency (in Hz) shifted down to zero Hz ;FOR USE GNSS-SDR WITH RTLSDR DONGLES USER MUST SET THE CALIBRATED SAMPLE RATE HERE ; i.e. using front-end-cal as reported here:http://www.cttc.es/publication/turning-a-television-into-a-gnss-receiver/ InputFilter1.sampling_frequency=20000000 ;# IF deviation due to front-end LO inaccuracies [HZ] ;# WARNING: Fraunhofer front-end hardwareconfigurations can difer. Signals available on http://www.iis.fraunhofer.de/de/ff/lok/leist/test/flexiband.html are centered on 0 Hz, ALL BANDS. InputFilter1.IF=100000 ;#InputFilter1.IF=0 ;# Decimation factor after the frequency tranaslating block InputFilter1.decimation_factor=8 ;######### RESAMPLER CONFIG 1 ############ ;## Resamples the input data. Resampler1.implementation=Pass_Through ;######### SIGNAL_CONDITIONER 2 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. SignalConditioner2.implementation=Pass_Through ;######### DATA_TYPE_ADAPTER 2 CONFIG ############ DataTypeAdapter2.implementation=Pass_Through DataTypeAdapter2.item_type=gr_complex ;######### INPUT_FILTER 2 CONFIG ############ InputFilter2.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter2.dump=false ;#dump_filename: Log path and filename. InputFilter2.dump_filename=../data/input_filter.dat ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter2.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter2.output_item_type=gr_complex ;######### RESAMPLER CONFIG 2 ############ ;## Resamples the input data. Resampler2.implementation=Pass_Through ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available GPS satellite channels. Channels_1C.count=8 Channels_2S.count=8 ;#count: Number of available Galileo satellite channels. ;Channels_Galileo.count=0 ;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver Channels.in_acquisition=1 ;#signal: ;# "1C" GPS L1 C/A ;# "2S" GPS L2 L2C (M) ;# "1B" GALILEO E1 B (I/NAV OS/CS/SoL) ;# "5X" GALILEO E5a I+Q ;# CHANNEL CONNECTION Channel0.RF_channel_ID=0 Channel0.signal=1C Channel1.RF_channel_ID=0 Channel1.signal=1C Channel2.RF_channel_ID=0 Channel2.signal=1C Channel3.RF_channel_ID=0 Channel3.signal=1C Channel4.RF_channel_ID=0 Channel4.signal=1C Channel5.RF_channel_ID=0 Channel5.signal=1C Channel6.RF_channel_ID=0 Channel6.signal=1C Channel7.RF_channel_ID=0 Channel7.signal=1C Channel8.RF_channel_ID=1 Channel8.signal=2S Channel9.RF_channel_ID=1 Channel9.signal=2S Channel10.RF_channel_ID=1 Channel10.signal=2S Channel11.RF_channel_ID=1 Channel11.signal=2S Channel12.RF_channel_ID=1 Channel12.signal=2S Channel13.RF_channel_ID=1 Channel13.signal=2S Channel14.RF_channel_ID=1 Channel14.signal=2S Channel15.RF_channel_ID=1 Channel15.signal=2S Channel8.RF_channel_ID=1 Channel8.signal=2S Channel9.RF_channel_ID=1 Channel9.signal=2S Channel10.RF_channel_ID=1 Channel10.signal=2S Channel11.RF_channel_ID=1 Channel11.signal=2S Channel12.RF_channel_ID=1 Channel12.signal=2S Channel13.RF_channel_ID=1 Channel13.signal=2S Channel14.RF_channel_ID=1 Channel14.signal=2S Channel15.RF_channel_ID=1 Channel15.signal=2S ;######### SPECIFIC CHANNELS CONFIG ###### ;#The following options are specific to each channel and overwrite the generic options ;######### ACQUISITION GLOBAL CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1C.dump=false ;#filename: Log path and filename Acquisition_1C.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1C.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_1C.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1C.coherent_integration_time_ms=1 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition ;#threshold: Acquisition threshold. It will be ignored if pfa is defined. Acquisition_1C.threshold=0.008 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] ;Acquisition_1C.pfa=0.0001 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1C.doppler_max=5000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_1C.doppler_step=250 ;#bit_transition_flag: Enable or disable a strategy to deal with bit transitions in GPS signals: process two dwells and take ;#maximum test statistics. Only use with implementation: [GPS_L1_CA_PCPS_Acquisition] ;#(should not be used for Galileo_E1_PCPS_Ambiguous_Acquisition]) Acquisition_1C.bit_transition_flag=false ;#max_dwells: Maximum number of consecutive dwells to be processed. It will be ignored if bit_transition_flag=true Acquisition_1C.max_dwells=1 ;######### ACQUISITION CHANNELS CONFIG ###### ;#The following options are specific to each channel and overwrite the generic options ;######### TRACKING GLOBAL CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_PLL_C_Aid_Tracking] Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking Tracking_1C.item_type=gr_complex Tracking_1C.if=0 Tracking_1C.dump=true Tracking_1C.dump_filename=./tracking_ch_ Tracking_1C.pll_bw_hz=40.0; Tracking_1C.dll_bw_hz=3.0; Tracking_1C.order=3; Tracking_1C.early_late_space_chips=0.5; ;# GPS L2C M Acquisition_2S.dump=false Acquisition_2S.dump_filename=./acq_dump.dat Acquisition_2S.item_type=gr_complex Acquisition_2S.if=0 Acquisition_2S.implementation=GPS_L2_M_PCPS_Acquisition Acquisition_2S.threshold=0.0005 ;Acquisition_2S.pfa=0.001 Acquisition_2S.doppler_max=5000 Acquisition_2S.doppler_min=-5000 Acquisition_2S.doppler_step=30 Acquisition_2S.max_dwells=1 Tracking_2S.implementation=GPS_L2_M_DLL_PLL_Tracking Tracking_2S.item_type=gr_complex Tracking_2S.if=0 Tracking_2S.dump=true Tracking_2S.dump_filename=./tracking_ch_ Tracking_2S.pll_bw_hz=1.5; Tracking_2S.dll_bw_hz=0.3; Tracking_2S.order=3; Tracking_2S.early_late_space_chips=0.5; ;######### TELEMETRY DECODER GPS L1 CONFIG ############ ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L1 C/A TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false TelemetryDecoder_1C.decimation_factor=20; ;######### TELEMETRY DECODER GPS L2 CONFIG ############ ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L2 M TelemetryDecoder_2S.implementation=GPS_L2C_Telemetry_Decoder TelemetryDecoder_2S.dump=false TelemetryDecoder_2S.decimation_factor=1; ;######### OBSERVABLES CONFIG ############ ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A.Mixed_Observables Observables.implementation=Hybrid_Observables ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] Observables.dump=false ;#dump_filename: Log path and filename. Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ ;#implementation: Position Velocity and Time (PVT) implementation algorithm: Use [GPS_L1_CA_PVT] in this version. PVT.implementation=Hybrid_PVT ;#averaging_depth: Number of PVT observations in the moving average algorithm PVT.averaging_depth=10 ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.flag_averaging=true ;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time (for GPS CA L1 is 1ms) [ms] PVT.output_rate_ms=100 ;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms<=display_rate_ms. PVT.display_rate_ms=500 ;# KML, GeoJSON, NMEA and RTCM output configuration ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump and ".kml" to GoogleEarth dump. PVT.dump_filename=./PVT ;#nmea_dump_filename: NMEA log path and filename PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; ;#flag_nmea_tty_port: Enable or disable the NMEA log to a serial TTY port (Can be used with real hardware or virtual one) PVT.flag_nmea_tty_port=false; ;#nmea_dump_devname: serial device descriptor for NMEA logging PVT.nmea_dump_devname=/dev/pts/4 PVT.flag_rtcm_server=false PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump=false gnss-sdr-0.0.9/conf/gnss-sdr_multichannel_GPS_L1_L2_Galileo_E1B_Flexiband_bin_file_III_1b.conf000066400000000000000000000470621305042567700317450ustar00rootroot00000000000000; Default configuration file ; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=2500000 ;######### SUPL RRLP GPS assistance configuration ##### ; Check http://www.mcc-mnc.com/ ; On Android: https://play.google.com/store/apps/details?id=net.its_here.cellidinfo&hl=en GNSS-SDR.SUPL_gps_enabled=false GNSS-SDR.SUPL_read_gps_assistance_xml=true GNSS-SDR.SUPL_gps_ephemeris_server=supl.nokia.com GNSS-SDR.SUPL_gps_ephemeris_port=7275 GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com GNSS-SDR.SUPL_gps_acquisition_port=7275 GNSS-SDR.SUPL_MCC=244 GNSS-SDR.SUPL_MNS=5 GNSS-SDR.SUPL_LAC=0x59e2 GNSS-SDR.SUPL_CI=0x31b0 ;######### SIGNAL_SOURCE CONFIG ############ ;#implementation: Use [File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) SignalSource.implementation=Flexiband_Signal_Source SignalSource.flag_read_file=true SignalSource.signal_file=/datalogger/signals/Fraunhofer/L125_III1b_210s.usb ; <- PUT YOUR FILE HERE ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. SignalSource.item_type=gr_complex ;# FPGA firmware file SignalSource.firmware_file=flexiband_III-1b.bit ;#RF_channels: Number of RF channels present in the frontend device, must agree the FPGA firmware file SignalSource.RF_channels=2 ;#frontend channels gain. Not usable yet! SignalSource.gain1=0 SignalSource.gain2=0 SignalSource.gain3=0 ;#frontend channels AGC SignalSource.AGC=true ;# USB 3.0 packet buffer size (number of SuperSpeed packets) SignalSource.usb_packet_buffer=128 ;###################################################### ;######### RF CHANNEL 0 SIGNAL CONDITIONER ############ ;###################################################### ;######### SIGNAL_CONDITIONER 0 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. SignalConditioner0.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER 0 CONFIG ############ DataTypeAdapter0.implementation=Pass_Through DataTypeAdapter0.item_type=gr_complex ;######### INPUT_FILTER 0 CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. InputFilter0.implementation=Freq_Xlating_Fir_Filter ;#dump: Dump the filtered data to a file. InputFilter0.dump=false ;#dump_filename: Log path and filename. InputFilter0.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse reponse given a set of band edges, ;#the desired reponse on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter0.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter0.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter0.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter0.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter0.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter0.band1_begin=0.0 InputFilter0.band1_end=0.45 InputFilter0.band2_begin=0.55 InputFilter0.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter0.ampl1_begin=1.0 InputFilter0.ampl1_end=1.0 InputFilter0.ampl2_begin=0.0 InputFilter0.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter0.band1_error=1.0 InputFilter0.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter0.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter0.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter0.IF is the intermediate frequency (in Hz) shifted down to zero Hz ;FOR USE GNSS-SDR WITH RTLSDR DONGLES USER MUST SET THE CALIBRATED SAMPLE RATE HERE ; i.e. using front-end-cal as reported here:http://www.cttc.es/publication/turning-a-television-into-a-gnss-receiver/ InputFilter0.sampling_frequency=20000000 ;# IF deviation due to front-end LO inaccuracies [HZ] ;# WARNING: Fraunhofer front-end hardwareconfigurations can difer. Signals available on http://www.iis.fraunhofer.de/de/ff/lok/leist/test/flexiband.html are centered on 0 Hz, ALL BANDS. ;#InputFilter0.IF=-205000 InputFilter0.IF=0 ;# Decimation factor after the frequency tranaslating block InputFilter0.decimation_factor=8 ;######### RESAMPLER CONFIG 0 ############ ;## Resamples the input data. Resampler0.implementation=Pass_Through ;###################################################### ;######### RF CHANNEL 1 SIGNAL CONDITIONER ############ ;###################################################### ;######### SIGNAL_CONDITIONER 1 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. SignalConditioner1.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER 1 CONFIG ############ DataTypeAdapter1.implementation=Pass_Through DataTypeAdapter1.item_type=gr_complex ;######### INPUT_FILTER 0 CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. InputFilter1.implementation=Freq_Xlating_Fir_Filter ;#dump: Dump the filtered data to a file. InputFilter1.dump=false ;#dump_filename: Log path and filename. InputFilter1.dump_filename=../data/input_filter_ch1.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse reponse given a set of band edges, ;#the desired reponse on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter1.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter1.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter1.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter1.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter1.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter1.band1_begin=0.0 InputFilter1.band1_end=0.45 InputFilter1.band2_begin=0.55 InputFilter1.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter1.ampl1_begin=1.0 InputFilter1.ampl1_end=1.0 InputFilter1.ampl2_begin=0.0 InputFilter1.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter1.band1_error=1.0 InputFilter1.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter1.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter1.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter0.IF is the intermediate frequency (in Hz) shifted down to zero Hz ;FOR USE GNSS-SDR WITH RTLSDR DONGLES USER MUST SET THE CALIBRATED SAMPLE RATE HERE ; i.e. using front-end-cal as reported here:http://www.cttc.es/publication/turning-a-television-into-a-gnss-receiver/ InputFilter1.sampling_frequency=20000000 ;# IF deviation due to front-end LO inaccuracies [HZ] ;# WARNING: Fraunhofer front-end hardware configurations can differ. Signals available at http://www.iis.fraunhofer.de/de/ff/lok/leist/test/flexiband.html are centered on 0 Hz, ALL BANDS. ;#InputFilter1.IF=100000 InputFilter1.IF=0 ;# Decimation factor after the frequency translating block InputFilter1.decimation_factor=8 ;######### RESAMPLER CONFIG 1 ############ ;## Resamples the input data. Resampler1.implementation=Pass_Through ;######### SIGNAL_CONDITIONER 2 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. SignalConditioner2.implementation=Pass_Through ;######### DATA_TYPE_ADAPTER 2 CONFIG ############ DataTypeAdapter2.implementation=Pass_Through DataTypeAdapter2.item_type=gr_complex ;######### INPUT_FILTER 2 CONFIG ############ InputFilter2.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter2.dump=false ;#dump_filename: Log path and filename. InputFilter2.dump_filename=../data/input_filter.dat ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter2.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter2.output_item_type=gr_complex ;######### RESAMPLER CONFIG 2 ############ ;## Resamples the input data. Resampler2.implementation=Pass_Through ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available GPS satellite channels. Channels_1C.count=2 Channels_1B.count=4 Channels_2S.count=4 ;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver Channels.in_acquisition=1 ;#signal: ;# "1C" GPS L1 C/A ;# "2S" GPS L2 L2C (M) ;# "1B" GALILEO E1 B (I/NAV OS/CS/SoL) ;# "5X" GALILEO E5a I+Q ;# CHANNEL CONNECTION Channel0.RF_channel_ID=0 Channel1.RF_channel_ID=0 Channel2.RF_channel_ID=1 Channel3.RF_channel_ID=1 Channel4.RF_channel_ID=1 Channel5.RF_channel_ID=1 Channel6.RF_channel_ID=0 Channel7.RF_channel_ID=0 Channel8.RF_channel_ID=0 Channel9.RF_channel_ID=0 Channel10.RF_channel_ID=1 Channel11.RF_channel_ID=1 Channel12.RF_channel_ID=1 Channel13.RF_channel_ID=1 Channel14.RF_channel_ID=1 Channel15.RF_channel_ID=1 ;######### SPECIFIC CHANNELS CONFIG ###### ;#The following options are specific to each channel and overwrite the generic options ;######### ACQUISITION GLOBAL CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1C.dump=false ;#filename: Log path and filename Acquisition_1C.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1C.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_1C.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1C.coherent_integration_time_ms=1 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition ;#threshold: Acquisition threshold. It will be ignored if pfa is defined. Acquisition_1C.threshold=0.008 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] ;Acquisition_1C.pfa=0.0001 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1C.doppler_max=5000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_1C.doppler_step=250 ;#bit_transition_flag: Enable or disable a strategy to deal with bit transitions in GPS signals: process two dwells and take ;#maximum test statistics. Only use with implementation: [GPS_L1_CA_PCPS_Acquisition] ;#(should not be used for Galileo_E1_PCPS_Ambiguous_Acquisition]) Acquisition_1C.bit_transition_flag=false ;#max_dwells: Maximum number of consecutive dwells to be processed. It will be ignored if bit_transition_flag=true Acquisition_1C.max_dwells=1 ;######### ACQUISITION CHANNELS CONFIG ###### ;#The following options are specific to each channel and overwrite the generic options ;######### TRACKING GLOBAL CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_PLL_C_Aid_Tracking] Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking Tracking_1C.item_type=gr_complex Tracking_1C.if=0 Tracking_1C.dump=false Tracking_1C.dump_filename=../data/epl_tracking_ch_ Tracking_1C.pll_bw_hz=40.0; Tracking_1C.dll_bw_hz=1.5; Tracking_1C.order=3; Tracking_1C.early_late_space_chips=0.5; ;# GPS L2C M Acquisition_2S.dump=false Acquisition_2S.dump_filename=./acq_dump.dat Acquisition_2S.item_type=gr_complex Acquisition_2S.if=0 Acquisition_2S.implementation=GPS_L2_M_PCPS_Acquisition Acquisition_2S.threshold=0.0005 ;Acquisition_2S.pfa=0.001 Acquisition_2S.doppler_max=5000 Acquisition_2S.doppler_min=-5000 Acquisition_2S.doppler_step=30 Acquisition_2S.max_dwells=1 Tracking_2S.implementation=GPS_L2_M_DLL_PLL_Tracking Tracking_2S.item_type=gr_complex Tracking_2S.if=0 Tracking_2S.dump=true Tracking_2S.dump_filename=../data/epl_tracking_ch_ Tracking_2S.pll_bw_hz=1.5; Tracking_2S.dll_bw_hz=0.3; Tracking_2S.order=3; Tracking_2S.early_late_space_chips=0.5; ;# GALILEO E1B ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1B.dump=false ;#filename: Log path and filename Acquisition_1B.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1B.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_1B.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1B.sampled_ms=4 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1B.implementation=Galileo_E1_PCPS_Ambiguous_Acquisition ;#threshold: Acquisition threshold ;Acquisition_1B.threshold=0 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1B.pfa=0.0000005 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1B.doppler_max=5000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_1B.doppler_step=125 ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_PLL_C_Aid_Tracking] or [GPS_L1_CA_TCP_CONNECTOR_Tracking] or [Galileo_E1_DLL_PLL_VEML_Tracking] Tracking_1B.implementation=Galileo_E1_DLL_PLL_VEML_Tracking ;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version. Tracking_1B.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_1B.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_1B.dump=false ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_1B.dump_filename=./veml_tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1B.pll_bw_hz=15.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_1B.dll_bw_hz=2.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_1B.order=3; ;#early_late_space_chips: correlator early-late space [chips]. Use [0.5] for GPS and [0.15] for Galileo Tracking_1B.early_late_space_chips=0.15; ;#very_early_late_space_chips: only for [Galileo_E1_DLL_PLL_VEML_Tracking], correlator very early-late space [chips]. Use [0.6] Tracking_1B.very_early_late_space_chips=0.6; ;######### TELEMETRY DECODER GPS L1 CONFIG ############ ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L1 C/A TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false TelemetryDecoder_1C.decimation_factor=20; ;######### TELEMETRY DECODER GPS L2 CONFIG ############ ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L2 M TelemetryDecoder_2S.implementation=GPS_L2C_Telemetry_Decoder TelemetryDecoder_2S.dump=false TelemetryDecoder_2S.decimation_factor=1; ;######### TELEMETRY DECODER GALILEO E1B CONFIG ############ ;#implementation: Use [Galileo_E1B_Telemetry_Decoder] for Galileo E1B TelemetryDecoder_1B.implementation=Galileo_E1B_Telemetry_Decoder TelemetryDecoder_1B.dump=false TelemetryDecoder_1B.decimation_factor=5; ;######### OBSERVABLES CONFIG ############ ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. Observables.implementation=Hybrid_Observables ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] Observables.dump=false ;#dump_filename: Log path and filename. Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ ;#implementation: Position Velocity and Time (PVT) implementation algorithm: Use [GPS_L1_CA_PVT] in this version. PVT.implementation=Hybrid_PVT ;#averaging_depth: Number of PVT observations in the moving average algorithm PVT.averaging_depth=10 ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.flag_averaging=false ;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time (for GPS CA L1 is 1ms) [ms] PVT.output_rate_ms=100 ;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms<=display_rate_ms. PVT.display_rate_ms=100 ;# KML, GeoJSON, NMEA and RTCM output configuration ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump and ".kml" to GoogleEarth dump. PVT.dump_filename=./PVT ;#nmea_dump_filename: NMEA log path and filename PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; ;#flag_nmea_tty_port: Enable or disable the NMEA log to a serial TTY port (Can be used with real hardware or virtual one) PVT.flag_nmea_tty_port=false; ;#nmea_dump_devname: serial device descriptor for NMEA logging PVT.nmea_dump_devname=/dev/pts/4 PVT.flag_rtcm_server=false PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump=false gnss-sdr-0.0.9/conf/gnss-sdr_multichannel_GPS_L1_USRP_X300_realtime.conf000066400000000000000000000375671305042567700257240ustar00rootroot00000000000000; Default configuration file ; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=4000000 ;######### SUPL RRLP GPS assistance configuration ##### ; Check http://www.mcc-mnc.com/ ; On Android: https://play.google.com/store/apps/details?id=net.its_here.cellidinfo&hl=en GNSS-SDR.SUPL_1C_enabled=false GNSS-SDR.SUPL_read_1C_assistance_xml=true GNSS-SDR.SUPL_1C_ephemeris_server=supl.google.com GNSS-SDR.SUPL_1C_ephemeris_port=7275 GNSS-SDR.SUPL_1C_acquisition_server=supl.google.com GNSS-SDR.SUPL_1C_acquisition_port=7275 GNSS-SDR.SUPL_MCC=244 GNSS-SDR.SUPL_MNS=5 GNSS-SDR.SUPL_LAC=0x59e2 GNSS-SDR.SUPL_CI=0x31b0 ;######### SIGNAL_SOURCE CONFIG ############ ;#implementation: Use [File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) SignalSource.implementation=UHD_Signal_Source ;#When left empty, the device discovery routines will search all vailable transports on the system (ethernet, usb...) SignalSource.device_address=192.168.40.2 ; <- PUT THE IP ADDRESS OF YOUR USRP HERE ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. SignalSource.item_type=gr_complex ;#RF_channels: Number of RF channels present in the frontend device (i.e. USRP with two frontends) SignalSource.RF_channels=2 ;#sampling_frequency: Original Signal sampling frequency in [Hz] SignalSource.sampling_frequency=4000000 ;#subdevice: UHD subdevice specification (for USRP dual frontend use A:0 or B:0 or A:0 B:0) SignalSource.subdevice=A:0 B:0 ;######### RF Channels specific settings ###### ;## RF CHANNEL 0 ## ;#freq: RF front-end center frequency in [Hz] SignalSource.freq0=1575420000 ;#gain: Front-end Gain in [dB] SignalSource.gain0=50 ;#samples: Number of samples to be processed. Notice that 0 indicates no limit SignalSource.samples0=0 ;#dump: Dump the Signal source RF channel data to a file. Disable this option in this version SignalSource.dump0=false SignalSource.dump_filename0=../data/signal_source0.dat ;## RF CHANNEL 1 ## ;#freq: RF front-end center frequency in [Hz] SignalSource.freq1=1575420000 ;#gain: Front-end Gain in [dB] SignalSource.gain1=50 ;#samples: Number of samples to be processed. Notice that 0 indicates no limit SignalSource.samples1=0 ;#dump: Dump the Signal source RF channel data to a file. Disable this option in this version SignalSource.dump1=false SignalSource.dump_filename1=../data/signal_source1.dat ;######### SIGNAL_CONDITIONER 0 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. ;#implementation: Use [Pass_Through] or [Signal_Conditioner] ;#[Pass_Through] disables this block and the [DataTypeAdapter], [InputFilter] and [Resampler] blocks ;#[Signal_Conditioner] enables this block. Then you have to configure [DataTypeAdapter], [InputFilter] and [Resampler] blocks SignalConditioner0.implementation=Pass_Through ;######### DATA_TYPE_ADAPTER 0 CONFIG ############ ;## Changes the type of input data. ;#implementation: [Pass_Through] disables this block DataTypeAdapter0.implementation=Pass_Through DataTypeAdapter0.item_type=gr_complex ;######### INPUT_FILTER 0 CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation ;# that shifts IF down to zero Hz. InputFilter0.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter0.dump=false ;#dump_filename: Log path and filename. InputFilter0.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse ;#reponse given a set of band edges, the desired reponse on those bands, ;#and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter0.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter0.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter0.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter0.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter0.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter0.band1_begin=0.0 InputFilter0.band1_end=0.45 InputFilter0.band2_begin=0.55 InputFilter0.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter0.ampl1_begin=1.0 InputFilter0.ampl1_end=1.0 InputFilter0.ampl2_begin=0.0 InputFilter0.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter0.band1_error=1.0 InputFilter0.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter0.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter0.grid_density=16 ;# Original sampling frequency stored in the signal file InputFilter0.sampling_frequency=20480000 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter0.IF is the intermediate frequency (in Hz) shifted down to zero Hz InputFilter0.IF=5499998.47412109 ;# Decimation factor after the frequency tranaslating block InputFilter0.decimation_factor=8 ;######### RESAMPLER CONFIG 0 ############ ;## Resamples the input data. ;#implementation: Use [Pass_Through] or [Direct_Resampler] ;#[Pass_Through] disables this block ;#[Direct_Resampler] enables a resampler that implements a nearest neigbourhood interpolation Resampler0.implementation=Pass_Through ;######### SIGNAL_CONDITIONER 1 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. ;#implementation: Use [Pass_Through] or [Signal_Conditioner] ;#[Pass_Through] disables this block and the [DataTypeAdapter], [InputFilter] and [Resampler] blocks ;#[Signal_Conditioner] enables this block. Then you have to configure [DataTypeAdapter], [InputFilter] and [Resampler] blocks SignalConditioner1.implementation=Pass_Through ;######### INPUT_FILTER 1 CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation ;# that shifts IF down to zero Hz. InputFilter1.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter1.dump=false ;#dump_filename: Log path and filename. InputFilter1.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse ;#reponse given a set of band edges, the desired reponse on those bands, ;#and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter1.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter1.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter1.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter1.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter1.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter1.band1_begin=0.0 InputFilter1.band1_end=0.45 InputFilter1.band2_begin=0.55 InputFilter1.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter1.ampl1_begin=1.0 InputFilter1.ampl1_end=1.0 InputFilter1.ampl2_begin=0.0 InputFilter1.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter1.band1_error=1.0 InputFilter1.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter1.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter1.grid_density=16 ;# Original sampling frequency stored in the signal file InputFilter1.sampling_frequency=20480000 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter1.IF is the intermediate frequency (in Hz) shifted down to zero Hz InputFilter1.IF=5499998.47412109 ;# Decimation factor after the frequency tranaslating block InputFilter1.decimation_factor=8 ;######### RESAMPLER CONFIG 1 ############ ;## Resamples the input data. ;#implementation: Use [Pass_Through] or [Direct_Resampler] ;#[Pass_Through] disables this block ;#[Direct_Resampler] enables a resampler that implements a nearest neigbourhood interpolation Resampler1.implementation=Pass_Through ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available GPS satellite channels. Channels_1C.count=4 ;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver Channels.in_acquisition=1 ;#signal: ;# "1C" GPS L1 C/A ;# "2S" GPS L2 L2C (M) ;# "1B" GALILEO E1 B (I/NAV OS/CS/SoL) ;# "5X" GALILEO E5a I+Q ;# CHANNEL CONNECTION Channel0.RF_channel_ID=0 Channel1.RF_channel_ID=1 Channel2.RF_channel_ID=0 Channel3.RF_channel_ID=1 ;#signal: ;#if the option is disabled by default is assigned "1C" GPS L1 C/A Channel0.signal=1C Channel1.signal=1C Channel2.signal=1C Channel3.signal=1C ;######### SPECIFIC CHANNELS CONFIG ###### ;#The following options are specific to each channel and overwrite the generic options ;######### ACQUISITION GLOBAL CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1C.dump=false ;#filename: Log path and filename Acquisition_1C.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1C.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_1C.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1C.coherent_integration_time_ms=1 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition ;#threshold: Acquisition threshold. It will be ignored if pfa is defined. Acquisition_1C.threshold=0.01 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] ;Acquisition_1C.pfa=0.01 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1C.doppler_max=8000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_1C.doppler_step=500 ;#bit_transition_flag: Enable or disable a strategy to deal with bit transitions in GPS signals: process two dwells and take ;#maximum test statistics. Only use with implementation: [GPS_L1_CA_PCPS_Acquisition] ;#(should not be used for Galileo_E1_PCPS_Ambiguous_Acquisition]) Acquisition_1C.bit_transition_flag=false ;#max_dwells: Maximum number of consecutive dwells to be processed. It will be ignored if bit_transition_flag=true Acquisition_1C.max_dwells=1 ;######### ACQUISITION CHANNELS CONFIG ###### ;#The following options are specific to each channel and overwrite the generic options ;######### TRACKING GLOBAL CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_PLL_C_Aid_Tracking] Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking ;#item_type: Type and resolution for each of the signal samples. Tracking_1C.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_1C.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_1C.dump=false ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_1C.dump_filename=./tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1C.pll_bw_hz=40.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_1C.dll_bw_hz=4.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_1C.order=3; ;#early_late_space_chips: correlator early-late space [chips]. Use [0.5] Tracking_1C.early_late_space_chips=0.5; ;######### TELEMETRY DECODER GPS CONFIG ############ ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L1 C/A TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false ;#decimation factor TelemetryDecoder_1C.decimation_factor=1; ;######### OBSERVABLES CONFIG ############ ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. Observables.implementation=GPS_L1_CA_Observables ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] Observables.dump=false ;#dump_filename: Log path and filename. Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ ;#implementation: Position Velocity and Time (PVT) implementation algorithm: Use [GPS_L1_CA_PVT] in this version. PVT.implementation=GPS_L1_CA_PVT ;#averaging_depth: Number of PVT observations in the moving average algorithm PVT.averaging_depth=10 ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.flag_averaging=true ;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time (for GPS CA L1 is 1ms) [ms] PVT.output_rate_ms=100 ;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms<=display_rate_ms. PVT.display_rate_ms=500 ;# KML, GeoJSON, NMEA and RTCM output configuration ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump and ".kml" to GoogleEarth dump. PVT.dump_filename=./PVT ;#nmea_dump_filename: NMEA log path and filename PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; ;#flag_nmea_tty_port: Enable or disable the NMEA log to a serial TTY port (Can be used with real hardware or virtual one) PVT.flag_nmea_tty_port=false; ;#nmea_dump_devname: serial device descriptor for NMEA logging PVT.nmea_dump_devname=/dev/pts/4 PVT.flag_rtcm_server=true PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump=false gnss-sdr-0.0.9/conf/gnss-sdr_multichannel_GPS_L2_M_Flexiband_bin_file_III_1b.conf000066400000000000000000000371171305042567700276020ustar00rootroot00000000000000; Default configuration file ; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=5000000 ;######### SUPL RRLP GPS assistance configuration ##### ; Check http://www.mcc-mnc.com/ ; On Android: https://play.google.com/store/apps/details?id=net.its_here.cellidinfo&hl=en GNSS-SDR.SUPL_gps_enabled=false GNSS-SDR.SUPL_read_gps_assistance_xml=true GNSS-SDR.SUPL_gps_ephemeris_server=supl.google.com GNSS-SDR.SUPL_gps_ephemeris_port=7275 GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com GNSS-SDR.SUPL_gps_acquisition_port=7275 GNSS-SDR.SUPL_MCC=244 GNSS-SDR.SUPL_MNS=5 GNSS-SDR.SUPL_LAC=0x59e2 GNSS-SDR.SUPL_CI=0x31b0 ;######### SIGNAL_SOURCE CONFIG ############ ;#implementation: Use [File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) SignalSource.implementation=Flexiband_Signal_Source SignalSource.flag_read_file=true SignalSource.signal_file=/datalogger/signals/Fraunhofer/L125_III1b_210s.usb ; <- PUT YOUR FILE HERE ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. SignalSource.item_type=gr_complex ;# FPGA firmware file SignalSource.firmware_file=flexiband_III-1b.bit ;#RF_channels: Number of RF channels present in the frontend device, must agree the FPGA firmware file SignalSource.RF_channels=2 ;#frontend channels gain. Not usable yet! SignalSource.gain1=0 SignalSource.gain2=0 SignalSource.gain3=0 ;#frontend channels AGC SignalSource.AGC=true ;# USB 3.0 packet buffer size (number of SuperSpeed packets) SignalSource.usb_packet_buffer=128 ;###################################################### ;######### RF CHANNEL 0 SIGNAL CONDITIONER ############ ;###################################################### ;######### SIGNAL_CONDITIONER 0 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. SignalConditioner0.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER 0 CONFIG ############ DataTypeAdapter0.implementation=Pass_Through DataTypeAdapter0.item_type=gr_complex ;######### INPUT_FILTER 0 CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. InputFilter0.implementation=Freq_Xlating_Fir_Filter ;#dump: Dump the filtered data to a file. InputFilter0.dump=false ;#dump_filename: Log path and filename. InputFilter0.dump_filename=../data/input_filter_ch0.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse reponse given a set of band edges, ;#the desired reponse on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter0.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter0.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter0.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter0.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter0.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter0.band1_begin=0.0 InputFilter0.band1_end=0.45 InputFilter0.band2_begin=0.55 InputFilter0.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter0.ampl1_begin=1.0 InputFilter0.ampl1_end=1.0 InputFilter0.ampl2_begin=0.0 InputFilter0.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter0.band1_error=1.0 InputFilter0.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter0.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter0.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter0.IF is the intermediate frequency (in Hz) shifted down to zero Hz ;FOR USE GNSS-SDR WITH RTLSDR DONGLES USER MUST SET THE CALIBRATED SAMPLE RATE HERE ; i.e. using front-end-cal as reported here:http://www.cttc.es/publication/turning-a-television-into-a-gnss-receiver/ InputFilter0.sampling_frequency=20000000 ;# IF deviation due to front-end LO inaccuracies [HZ] ;#InputFilter0.IF=-205000 InputFilter0.IF=0 ;# Decimation factor after the frequency tranaslating block InputFilter0.decimation_factor=4 ;######### RESAMPLER CONFIG 0 ############ ;## Resamples the input data. Resampler0.implementation=Pass_Through ;###################################################### ;######### RF CHANNEL 1 SIGNAL CONDITIONER ############ ;###################################################### ;######### SIGNAL_CONDITIONER 1 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. SignalConditioner1.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER 1 CONFIG ############ DataTypeAdapter1.implementation=Pass_Through DataTypeAdapter1.item_type=gr_complex ;######### INPUT_FILTER 0 CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. InputFilter1.implementation=Freq_Xlating_Fir_Filter ;#dump: Dump the filtered data to a file. InputFilter1.dump=false ;#dump_filename: Log path and filename. InputFilter1.dump_filename=../data/input_filter_ch1.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse reponse given a set of band edges, ;#the desired reponse on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter1.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter1.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter1.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter1.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter1.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter1.band1_begin=0.0 InputFilter1.band1_end=0.45 InputFilter1.band2_begin=0.55 InputFilter1.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter1.ampl1_begin=1.0 InputFilter1.ampl1_end=1.0 InputFilter1.ampl2_begin=0.0 InputFilter1.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter1.band1_error=1.0 InputFilter1.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter1.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter1.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter0.IF is the intermediate frequency (in Hz) shifted down to zero Hz ;FOR USE GNSS-SDR WITH RTLSDR DONGLES USER MUST SET THE CALIBRATED SAMPLE RATE HERE ; i.e. using front-end-cal as reported here:http://www.cttc.es/publication/turning-a-television-into-a-gnss-receiver/ InputFilter1.sampling_frequency=20000000 ;# IF deviation due to front-end LO inaccuracies [HZ] InputFilter1.IF=0 ;# Decimation factor after the frequency tranaslating block InputFilter1.decimation_factor=4 ;######### RESAMPLER CONFIG 1 ############ ;## Resamples the input data. Resampler1.implementation=Pass_Through ;######### SIGNAL_CONDITIONER 2 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. SignalConditioner2.implementation=Pass_Through ;######### DATA_TYPE_ADAPTER 2 CONFIG ############ DataTypeAdapter2.implementation=Pass_Through DataTypeAdapter2.item_type=gr_complex ;######### INPUT_FILTER 2 CONFIG ############ InputFilter2.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter2.dump=false ;#dump_filename: Log path and filename. InputFilter2.dump_filename=../data/input_filter.dat ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter2.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter2.output_item_type=gr_complex ;######### RESAMPLER CONFIG 2 ############ ;## Resamples the input data. Resampler2.implementation=Pass_Through ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available GPS satellite channels. Channels_1C.count=1 Channels_2S.count=8 ;#GPS.prns=7,8 ;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver Channels.in_acquisition=1 ;# signal: ;# "1C" GPS L1 C/A ;# "2S" GPS L2 L2C (M) ;# "1B" GALILEO E1 B (I/NAV OS/CS/SoL) ;# "5X" GALILEO E5a I+Q ;# CHANNEL NUMBERING ORDER: GPS L1 C/A, GPS L2 L2C (M), GALILEO E1 B, GALILEO E5a ;# CHANNEL CONNECTION Channel0.RF_channel_ID=0 Channel1.RF_channel_ID=1 Channel2.RF_channel_ID=1 Channel3.RF_channel_ID=1 Channel4.RF_channel_ID=1 Channel5.RF_channel_ID=1 Channel6.RF_channel_ID=1 Channel7.RF_channel_ID=1 Channel8.RF_channel_ID=1 ;######### ACQUISITION GENERIC CONFIG ###### ;#The following options are specific to each channel and overwrite the generic options Acquisition_1C.dump=false Acquisition_1C.dump_filename=./acq_dump.dat Acquisition_1C.item_type=gr_complex Acquisition_1C.if=0 Acquisition_1C.coherent_integration_time_ms=1 Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition_1C.threshold=0.005 Acquisition_1C.doppler_max=5000 Acquisition_1C.doppler_step=250 Acquisition_1C.bit_transition_flag=false Acquisition_1C.max_dwells=1 Acquisition_2S.dump=false Acquisition_2S.dump_filename=./acq_dump.dat Acquisition_2S.item_type=gr_complex Acquisition_2S.if=0 Acquisition_2S.coherent_integration_time_ms=1 Acquisition_2S.implementation=GPS_L2_M_PCPS_Acquisition Acquisition_2S.threshold=0.0005 Acquisition_2S.doppler_max=5000 Acquisition_2S.doppler_step=100 Acquisition_2S.bit_transition_flag=false Acquisition_2S.max_dwells=1 ;# channel specific config Acquisition_2S1.dump=false Acquisition_2S1.dump_filename=./acq_dump.dat Acquisition_2S1.item_type=gr_complex Acquisition_2S1.if=0 Acquisition_2S1.coherent_integration_time_ms=1 Acquisition_2S1.implementation=GPS_L2_M_PCPS_Acquisition Acquisition_2S1.threshold=0.0005 Acquisition_2S1.doppler_max=5000 Acquisition_2S1.doppler_step=100 Acquisition_2S1.bit_transition_flag=false Acquisition_2S1.max_dwells=1 ;######### TRACKING CONFIG ############ ;######### GPS L1 C/A GENERIC TRACKING CONFIG ############ Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking Tracking_1C.item_type=gr_complex Tracking_1C.if=0 Tracking_1C.dump=true Tracking_1C.dump_filename=../data/epl_tracking_ch_ Tracking_1C.pll_bw_hz=40.0; Tracking_1C.dll_bw_hz=3.0; Tracking_1C.order=3; Tracking_1C.early_late_space_chips=0.5; ;######### GPS L2C GENERIC TRACKING CONFIG ############ Tracking_2S.implementation=GPS_L2_M_DLL_PLL_Tracking Tracking_2S.item_type=gr_complex Tracking_2S.if=0 Tracking_2S.dump=true Tracking_2S.dump_filename=../data/epl_tracking_ch_ Tracking_2S.pll_bw_hz=2.0; Tracking_2S.dll_bw_hz=0.5; Tracking_2S.order=2; Tracking_2S.early_late_space_chips=0.5; ;######### GPS L2C SPECIFIC CHANNEL TRACKING CONFIG ############ Tracking_2S1.implementation=GPS_L2_M_DLL_PLL_Tracking Tracking_2S1.item_type=gr_complex Tracking_2S1.if=0 Tracking_2S1.dump=true Tracking_2S1.dump_filename=../data/epl_tracking_ch_ Tracking_2S1.pll_bw_hz=2.0; Tracking_2S1.dll_bw_hz=0.5; Tracking_2S1.order=2; Tracking_2S1.early_late_space_chips=0.5; ;######### TELEMETRY DECODER CONFIG ############ TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false TelemetryDecoder_1C.decimation_factor=20; TelemetryDecoder_2S.implementation=GPS_L2C_Telemetry_Decoder TelemetryDecoder_2S.dump=false TelemetryDecoder_2S.decimation_factor=1; ;######### OBSERVABLES CONFIG ############ ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. Observables.implementation=Hybrid_Observables ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] Observables.dump=false ;#dump_filename: Log path and filename. Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ ;#implementation: Position Velocity and Time (PVT) implementation algorithm: Use [GPS_L1_CA_PVT] in this version. PVT.implementation=Hybrid_PVT ;#averaging_depth: Number of PVT observations in the moving average algorithm PVT.averaging_depth=10 ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.flag_averaging=true ;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time (for GPS CA L1 is 1ms) [ms] PVT.output_rate_ms=100 ;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms<=display_rate_ms. PVT.display_rate_ms=500 ;# KML, GeoJSON, NMEA and RTCM output configuration ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump and ".kml" to GoogleEarth dump. PVT.dump_filename=./PVT ;#nmea_dump_filename: NMEA log path and filename PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; ;#flag_nmea_tty_port: Enable or disable the NMEA log to a serial TTY port (Can be used with real hardware or virtual one) PVT.flag_nmea_tty_port=false; ;#nmea_dump_devname: serial device descriptor for NMEA logging PVT.nmea_dump_devname=/dev/pts/4 PVT.flag_rtcm_server=false PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump=false gnss-sdr-0.0.9/conf/gnss-sdr_multisource_Hybrid_ishort.conf000066400000000000000000000447421305042567700241640ustar00rootroot00000000000000; Default configuration file ; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. GNSS-SDR.internal_fs_hz=4000000 Receiver.sources_count=2 ;#enable_throttle_control: Enabling this option tells the signal source to keep the delay between samples in post processing. ; it helps to not overload the CPU, but the processing time will be longer. SignalSource.enable_throttle_control=false ;#repeat: Repeat the processing file. Disable this option in this version SignalSource.repeat=false ;######### SIGNAL_SOURCE 0 CONFIG ############ ;#implementation: Use [File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) SignalSource0.implementation=File_Signal_Source ;#filename: path to file with the captured GNSS signal samples to be processed SignalSource0.filename=/datalogger/signals/CTTC/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN.dat ; <- PUT YOUR FILE HERE ;#item_type: Type and resolution for each of the signal samples. SignalSource0.item_type=ishort ;#sampling_frequency: Original Signal sampling frequency in [Hz] SignalSource0.sampling_frequency=4000000 ;#freq: RF front-end center frequency in [Hz] SignalSource0.freq=1575420000 ;#samples: Number of samples to be processed. Notice that 0 indicates the entire file. SignalSource0.samples=0 ;#dump: Dump the Signal source data to a file. Disable this option in this version SignalSource0.dump=false SignalSource0.dump_filename=../data/signal_source.dat ;######### SIGNAL_SOURCE 1 CONFIG ############ ;#implementation: Use [File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) SignalSource1.implementation=File_Signal_Source ;#filename: path to file with the captured GNSS signal samples to be processed SignalSource1.filename=/datalogger/signals/CTTC/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN/2013_04_04_GNSS_SIGNAL_at_CTTC_SPAIN.dat ; <- PUT YOUR FILE HERE ;#item_type: Type and resolution for each of the signal samples. SignalSource1.item_type=ishort ;#sampling_frequency: Original Signal sampling frequency in [Hz] SignalSource1.sampling_frequency=4000000 ;#freq: RF front-end center frequency in [Hz] SignalSource1.freq=1575420000 ;#samples: Number of samples to be processed. Notice that 0 indicates the entire file. SignalSource1.samples=0 ;#dump: Dump the Signal source data to a file. Disable this option in this version SignalSource1.dump=false SignalSource1.dump_filename=../data/signal_source.dat ;######### SIGNAL_CONDITIONER 0 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. ;#implementation: Use [Pass_Through] or [Signal_Conditioner] ;#[Pass_Through] disables this block and the [DataTypeAdapter], [InputFilter] and [Resampler] blocks ;#[Signal_Conditioner] enables this block. Then you have to configure [DataTypeAdapter], [InputFilter] and [Resampler] blocks SignalConditioner0.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER 0 CONFIG ############ ;## Changes the type of input data. ;#implementation: [Pass_Through] disables this block DataTypeAdapter0.implementation=Ishort_To_Complex ;######### INPUT_FILTER 0 CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. InputFilter0.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter0.dump=false ;#dump_filename: Log path and filename. InputFilter0.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of GNU Radio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter impulse response given a set of band edges, the desired response on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter0.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter0.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter0.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter0.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter0.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter0.band1_begin=0.0 InputFilter0.band1_end=0.45 InputFilter0.band2_begin=0.55 InputFilter0.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter0.ampl1_begin=1.0 InputFilter0.ampl1_end=1.0 InputFilter0.ampl2_begin=0.0 InputFilter0.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter0.band1_error=1.0 InputFilter0.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter0.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter0.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter0.IF is the intermediate frequency (in Hz) shifted down to zero Hz InputFilter0.sampling_frequency=4000000 InputFilter0.IF=0 ;######### RESAMPLER 1 CONFIG ############ ;## Resamples the input data. ;#implementation: Use [Pass_Through] or [Direct_Resampler] ;#[Pass_Through] disables this block ;#[Direct_Resampler] enables a resampler that implements a nearest neighborhood interpolation Resampler1.implementation=Pass_Through ;#dump: Dump the resampled data to a file. Resampler1.dump=false ;#dump_filename: Log path and filename. Resampler1.dump_filename=../data/resampler.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Resampler1.item_type=gr_complex ;#sample_freq_in: the sample frequency of the input signal Resampler1.sample_freq_in=4000000 ;#sample_freq_out: the desired sample frequency of the output signal Resampler1.sample_freq_out=4000000 ;######### SIGNAL_CONDITIONER 1 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. ;#implementation: Use [Pass_Through] or [Signal_Conditioner] ;#[Pass_Through] disables this block and the [DataTypeAdapter], [InputFilter] and [Resampler] blocks ;#[Signal_Conditioner] enables this block. Then you have to configure [DataTypeAdapter], [InputFilter] and [Resampler] blocks SignalConditioner1.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER 1 CONFIG ############ ;## Changes the type of input data. Please disable it in this version. ;#implementation: [Pass_Through] disables this block DataTypeAdapter1.implementation=Ishort_To_Complex ;######### INPUT_FILTER 1 CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Pass_Through] disables this block ;#[Fir_Filter] enables a FIR Filter ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. InputFilter1.implementation=Pass_Through ;#dump: Dump the filtered data to a file. InputFilter1.dump=false ;#dump_filename: Log path and filename. InputFilter1.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of GNU Radio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter impulse response given a set of band edges, the desired response on those bands, and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter1.input_item_type=gr_complex ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter1.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter1.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter1.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter1.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter1.band1_begin=0.0 InputFilter1.band1_end=0.45 InputFilter1.band2_begin=0.55 InputFilter1.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter1.ampl1_begin=1.0 InputFilter1.ampl1_end=1.0 InputFilter1.ampl2_begin=0.0 InputFilter1.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter1.band1_error=1.0 InputFilter1.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter1.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter1.grid_density=16 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter1.IF is the intermediate frequency (in Hz) shifted down to zero Hz InputFilter1.sampling_frequency=4000000 InputFilter1.IF=0 ;######### RESAMPLER 1 CONFIG ############ ;## Resamples the input data. ;#implementation: Use [Pass_Through] or [Direct_Resampler] ;#[Pass_Through] disables this block ;#[Direct_Resampler] enables a resampler that implements a nearest neighborhood interpolation Resampler1.implementation=Pass_Through ;#dump: Dump the resampled data to a file. Resampler1.dump=false ;#dump_filename: Log path and filename. Resampler1.dump_filename=../data/resampler.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Resampler1.item_type=gr_complex ;#sample_freq_in: the sample frequency of the input signal Resampler1.sample_freq_in=4000000 ;#sample_freq_out: the desired sample frequency of the output signal Resampler1.sample_freq_out=4000000 ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available GPS satellite channels. Channels_GPS.count=2 ;#count: Number of available Galileo satellite channels. Channels_Galileo.count=2 ;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver Channels.in_acquisition=1 ;#system: GPS, GLONASS, GALILEO, SBAS or COMPASS ;#if the option is disabled by default is assigned GPS Channel.system=GPS, Galileo ;# CHANNEL CONNECTION Channel0.RF_channel_ID=0 Channel1.RF_channel_ID=0 Channel2.RF_channel_ID=1 Channel3.RF_channel_ID=1 ;#signal: ;#if the option is disabled by default is assigned "1C" GPS L1 C/A Channel.signal=1B ;######### GPS ACQUISITION CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_GPS.dump=false ;#filename: Log path and filename Acquisition_GPS.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_GPS.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_GPS.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_GPS.sampled_ms=1 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_GPS.implementation=GPS_L1_CA_PCPS_Acquisition ;#threshold: Acquisition threshold Acquisition_GPS.threshold=0.0075 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] ;Acquisition_GPS.pfa=0.01 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_GPS.doppler_max=10000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_GPS.doppler_step=500 ;######### GALILEO ACQUISITION CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_Galileo.dump=false ;#filename: Log path and filename Acquisition_Galileo.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_Galileo.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_Galileo.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_Galileo.sampled_ms=4 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_Galileo.implementation=Galileo_E1_PCPS_Ambiguous_Acquisition ;#threshold: Acquisition threshold ;Acquisition_Galileo.threshold=0 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_Galileo.pfa=0.0000008 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_Galileo.doppler_max=15000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_Galileo.doppler_step=125 ;######### TRACKING GPS CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_PLL_C_Aid_Tracking] or [GPS_L1_CA_TCP_CONNECTOR_Tracking] or [Galileo_E1_DLL_PLL_VEML_Tracking] Tracking_GPS.implementation=GPS_L1_CA_DLL_PLL_Tracking ;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version. Tracking_GPS.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_GPS.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_GPS.dump=false ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_GPS.dump_filename=../data/epl_tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_GPS.pll_bw_hz=45.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_GPS.dll_bw_hz=4.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_GPS.order=3; ;######### TRACKING GALILEO CONFIG ############ ;#implementation: Selected tracking algorithm: [Galileo_E1_DLL_PLL_VEML_Tracking] Tracking_Galileo.implementation=Galileo_E1_DLL_PLL_VEML_Tracking ;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version. Tracking_Galileo.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_Galileo.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_Galileo.dump=false ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_Galileo.dump_filename=../data/veml_tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_Galileo.pll_bw_hz=15.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_Galileo.dll_bw_hz=2.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_Galileo.order=3; ;#early_late_space_chips: correlator early-late space [chips]. Use [0.5] for GPS and [0.15] for Galileo Tracking_Galileo.early_late_space_chips=0.15; ;#very_early_late_space_chips: only for [Galileo_E1_DLL_PLL_VEML_Tracking], correlator very early-late space [chips]. Use [0.6] Tracking_Galileo.very_early_late_space_chips=0.6; ;######### TELEMETRY DECODER GPS CONFIG ############ ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L1 C/A TelemetryDecoder_GPS.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_GPS.dump=false ;#decimation factor TelemetryDecoder_GPS.decimation_factor=4; ;######### TELEMETRY DECODER GALILEO CONFIG ############ ;#implementation: Use [Galileo_E1B_Telemetry_Decoder] for Galileo E1B TelemetryDecoder_Galileo.implementation=Galileo_E1B_Telemetry_Decoder TelemetryDecoder_Galileo.dump=false ;######### OBSERVABLES CONFIG ############ ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. Observables.implementation=Hybrid_Observables ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] Observables.dump=false ;#dump_filename: Log path and filename. Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ ;#implementation: Position Velocity and Time (PVT) implementation algorithm: Use [GPS_L1_CA_PVT] in this version. PVT.implementation=Hybrid_PVT ;#averaging_depth: Number of PVT observations in the moving average algorithm PVT.averaging_depth=10 ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.flag_averaging=false ;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time (for GPS CA L1 is 1ms) [ms] PVT.output_rate_ms=100; ;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms<=display_rate_ms. PVT.display_rate_ms=500; ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump=false PVT.flag_rtcm_server=false PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump and ".kml" to GoogleEarth dump. PVT.dump_filename=./PVT gnss-sdr-0.0.9/conf/gnss-sdr_multisource_Hybrid_nsr.conf000066400000000000000000000447301305042567700234530ustar00rootroot00000000000000; Default configuration file ; You can define your own receiver and invoke it by doing ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf ; [GNSS-SDR] Receiver.sources_count=2 ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. ;GNSS-SDR.internal_fs_hz=6826700 GNSS-SDR.internal_fs_hz=2560000 ;GNSS-SDR.internal_fs_hz=4096000 ;GNSS-SDR.internal_fs_hz=5120000 ;#enable_throttle_control: Enabling this option tells the signal source to keep the delay between samples in post processing. ; it helps to not overload the CPU, but the processing time will be longer. SignalSource.enable_throttle_control=false ;#repeat: Repeat the processing file. Disable this option in this version SignalSource.repeat=false ;######### SIGNAL_SOURCE 0 CONFIG ############ ;#implementation: Use [File_Signal_Source] [Nsr_File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) SignalSource0.implementation=Nsr_File_Signal_Source ;#filename: path to file with the captured GNSS signal samples to be processed SignalSource0.filename=/datalogger/signals/ifen/E1L1_FE0_Band0.stream ; <- PUT YOUR FILE HERE ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. SignalSource0.item_type=byte ;#sampling_frequency: Original Signal sampling frequency in [Hz] SignalSource0.sampling_frequency=20480000 ;#freq: RF front-end center frequency in [Hz] SignalSource0.freq=1575420000 ;#subdevice: UHD subdevice specification (for USRP1 use A:0 or B:0) SignalSource0.subdevice=B:0 ;#samples: Number of samples to be processed. Notice that 0 indicates the entire file. SignalSource0.samples=0 ;#dump: Dump the Signal source data to a file. Disable this option in this version SignalSource0.dump=false SignalSource0.dump_filename=../data/signal_source.dat ;######### SIGNAL_SOURCE 1 CONFIG ############ ;#implementation: Use [File_Signal_Source] [Nsr_File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) SignalSource1.implementation=Nsr_File_Signal_Source ;#filename: path to file with the captured GNSS signal samples to be processed SignalSource1.filename=/datalogger/signals/ifen/E1L1_FE0_Band0.stream ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. SignalSource1.item_type=byte ;#sampling_frequency: Original Signal sampling frequency in [Hz] SignalSource1.sampling_frequency=20480000 ;#freq: RF front-end center frequency in [Hz] SignalSource1.freq=1575420000 ;#subdevice: UHD subdevice specification (for USRP1 use A:0 or B:0) SignalSource1.subdevice=B:0 ;#samples: Number of samples to be processed. Notice that 0 indicates the entire file. SignalSource1.samples=0 ;#dump: Dump the Signal source data to a file. Disable this option in this version SignalSource1.dump=false SignalSource1.dump_filename=../data/signal_source.dat ;######### SIGNAL_CONDITIONER 0 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. ;#implementation: Use [Pass_Through] or [Signal_Conditioner] ;#[Pass_Through] disables this block and the [DataTypeAdapter], [InputFilter] and [Resampler] blocks ;#[Signal_Conditioner] enables this block. Then you have to configure [DataTypeAdapter], [InputFilter] and [Resampler] blocks SignalConditioner0.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER 0 CONFIG ############ ;## Changes the type of input data. ;#implementation: [Pass_Through] disables this block DataTypeAdapter0.implementation=Pass_Through DataTypeAdapter0.item_type=float ;######### INPUT_FILTER 0 CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation ;# that shifts IF down to zero Hz. InputFilter0.implementation=Freq_Xlating_Fir_Filter ;#dump: Dump the filtered data to a file. InputFilter0.dump=false ;#dump_filename: Log path and filename. InputFilter0.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse ;#reponse given a set of band edges, the desired reponse on those bands, ;#and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter0.input_item_type=float ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter0.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter0.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter0.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter0.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter0.band1_begin=0.0 InputFilter0.band1_end=0.45 InputFilter0.band2_begin=0.55 InputFilter0.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter0.ampl1_begin=1.0 InputFilter0.ampl1_end=1.0 InputFilter0.ampl2_begin=0.0 InputFilter0.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter0.band1_error=1.0 InputFilter0.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter0.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter0.grid_density=16 ;# Original sampling frequency stored in the signal file InputFilter0.sampling_frequency=20480000 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter0.IF is the intermediate frequency (in Hz) shifted down to zero Hz InputFilter0.IF=5499998.47412109 ;# Decimation factor after the frequency tranaslating block InputFilter0.decimation_factor=8 ;######### RESAMPLER CONFIG 0 ############ ;## Resamples the input data. ;#implementation: Use [Pass_Through] or [Direct_Resampler] ;#[Pass_Through] disables this block ;#[Direct_Resampler] enables a resampler that implements a nearest neigbourhood interpolation Resampler0.implementation=Pass_Through ;######### SIGNAL_CONDITIONER 1 CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. ;#implementation: Use [Pass_Through] or [Signal_Conditioner] ;#[Pass_Through] disables this block and the [DataTypeAdapter], [InputFilter] and [Resampler] blocks ;#[Signal_Conditioner] enables this block. Then you have to configure [DataTypeAdapter], [InputFilter] and [Resampler] blocks SignalConditioner1.implementation=Signal_Conditioner ;######### DATA_TYPE_ADAPTER 1 CONFIG ############ ;## Changes the type of input data. ;#implementation: [Pass_Through] disables this block DataTypeAdapter1.implementation=Pass_Through DataTypeAdapter1.item_type=float ;######### INPUT_FILTER 1 CONFIG ############ ;## Filter the input data. Can be combined with frequency translation for IF signals ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation ;# that shifts IF down to zero Hz. InputFilter1.implementation=Freq_Xlating_Fir_Filter ;#dump: Dump the filtered data to a file. InputFilter1.dump=false ;#dump_filename: Log path and filename. InputFilter1.dump_filename=../data/input_filter.dat ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. ;#These options are based on parameters of gnuradio's function: gr_remez. ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse ;#reponse given a set of band edges, the desired reponse on those bands, ;#and the weight given to the error in those bands. ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. InputFilter1.input_item_type=float ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. InputFilter1.output_item_type=gr_complex ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. InputFilter1.taps_item_type=float ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time InputFilter1.number_of_taps=5 ;#number_of _bands: Number of frequency bands in the filter. InputFilter1.number_of_bands=2 ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) ;#The number of band_begin and band_end elements must match the number of bands InputFilter1.band1_begin=0.0 InputFilter1.band1_end=0.45 InputFilter1.band2_begin=0.55 InputFilter1.band2_end=1.0 ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. ;#The number of ampl_begin and ampl_end elements must match the number of bands InputFilter1.ampl1_begin=1.0 InputFilter1.ampl1_end=1.0 InputFilter1.ampl2_begin=0.0 InputFilter1.ampl2_end=0.0 ;#band_error: weighting applied to each band (usually 1). ;#The number of band_error elements must match the number of bands InputFilter1.band1_error=1.0 InputFilter1.band2_error=1.0 ;#filter_type: one of "bandpass", "hilbert" or "differentiator" InputFilter1.filter_type=bandpass ;#grid_density: determines how accurately the filter will be constructed. ;The minimum value is 16; higher values are slower to compute the filter. InputFilter1.grid_density=16 ;# Original sampling frequency stored in the signal file InputFilter1.sampling_frequency=20480000 ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. ;#InputFilter1.IF is the intermediate frequency (in Hz) shifted down to zero Hz InputFilter1.IF=5499998.47412109 ;# Decimation factor after the frequency tranaslating block InputFilter1.decimation_factor=8 ;######### RESAMPLER CONFIG 1 ############ ;## Resamples the input data. ;#implementation: Use [Pass_Through] or [Direct_Resampler] ;#[Pass_Through] disables this block ;#[Direct_Resampler] enables a resampler that implements a nearest neigbourhood interpolation Resampler1.implementation=Pass_Through ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available GPS satellite channels. Channels_1C.count=8 ;#count: Number of available Galileo satellite channels. Channels_1B.count=8 ;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver Channels.in_acquisition=1 ;#signal: ;# "1C" GPS L1 C/A ;# "2S" GPS L2 L2C (M) ;# "1B" GALILEO E1 B (I/NAV OS/CS/SoL) ;# "5X" GALILEO E5a I+Q ;# SOURCE CONNECTION Channel0.RF_channel_ID=0 Channel1.RF_channel_ID=0 Channel2.RF_channel_ID=0 Channel3.RF_channel_ID=0 Channel4.RF_channel_ID=0 Channel5.RF_channel_ID=0 Channel6.RF_channel_ID=0 Channel7.RF_channel_ID=0 Channel8.RF_channel_ID=1 Channel9.RF_channel_ID=1 Channel10.RF_channel_ID=1 Channel11.RF_channel_ID=1 Channel12.RF_channel_ID=1 Channel13.RF_channel_ID=1 Channel14.RF_channel_ID=1 Channel15.RF_channel_ID=1 ;#signal: ;#if the option is disabled by default is assigned "1C" GPS L1 C/A Channel0.signal=1C Channel1.signal=1C Channel2.signal=1C Channel3.signal=1C Channel4.signal=1C Channel5.signal=1C Channel6.signal=1C Channel7.signal=1B Channel8.signal=1B Channel9.signal=1B Channel10.signal=1B Channel11.signal=1B Channel12.signal=1B Channel13.signal=1B Channel14.signal=1B Channel15.signal=1B ;######### GPS ACQUISITION CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1C.dump=false ;#filename: Log path and filename Acquisition_1C.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1C.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_1C.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1C.sampled_ms=1 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition ;#threshold: Acquisition threshold Acquisition_1C.threshold=0.0075 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] ;Acquisition_1C.pfa=0.01 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1C.doppler_max=10000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_1C.doppler_step=500 ;######### GALILEO ACQUISITION CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition_1B.dump=false ;#filename: Log path and filename Acquisition_1B.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition_1B.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition_1B.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition_1B.sampled_ms=4 ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1B.implementation=Galileo_E1_PCPS_Ambiguous_Acquisition ;#threshold: Acquisition threshold ;Acquisition_1B.threshold=0 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition_1B.pfa=0.0000002 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition_1B.doppler_max=15000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_1B.doppler_step=125 ;######### TRACKING GPS CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_PLL_C_Aid_Tracking] or [GPS_L1_CA_TCP_CONNECTOR_Tracking] or [Galileo_E1_DLL_PLL_VEML_Tracking] Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking ;#item_type: Type and resolution for each of the signal samples. Tracking_1C.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_1C.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_1C.dump=false ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_1C.dump_filename=../data/epl_tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1C.pll_bw_hz=45.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_1C.dll_bw_hz=2.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_1C.order=3; ;######### TRACKING GALILEO CONFIG ############ ;#implementation: Selected tracking algorithm: [Galileo_E1_DLL_PLL_VEML_Tracking] Tracking_1B.implementation=Galileo_E1_DLL_PLL_VEML_Tracking ;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version. Tracking_1B.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking_1B.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking_1B.dump=false ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking_1B.dump_filename=../data/veml_tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1B.pll_bw_hz=15.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking_1B.dll_bw_hz=2.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking_1B.order=3; ;#early_late_space_chips: correlator early-late space [chips]. Use [0.5] for GPS and [0.15] for Galileo Tracking_1B.early_late_space_chips=0.15; ;#very_early_late_space_chips: only for [Galileo_E1_DLL_PLL_VEML_Tracking], correlator very early-late space [chips]. Use [0.6] Tracking_1B.very_early_late_space_chips=0.6; ;######### TELEMETRY DECODER GPS CONFIG ############ ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L1 C/A TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false ;#decimation factor TelemetryDecoder_1C.decimation_factor=1; ;######### TELEMETRY DECODER GALILEO CONFIG ############ ;#implementation: Use [Galileo_E1B_Telemetry_Decoder] for Galileo E1B TelemetryDecoder_1B.implementation=Galileo_E1B_Telemetry_Decoder TelemetryDecoder_1B.dump=false TelemetryDecoder_1B.decimation_factor=4; ;######### OBSERVABLES CONFIG ############ ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. Observables.implementation=Hybrid_Observables ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] Observables.dump=false ;#dump_filename: Log path and filename. Observables.dump_filename=./observables.dat ;######### PVT CONFIG ############ ;#implementation: Position Velocity and Time (PVT) implementation algorithm: Use [GPS_L1_CA_PVT] in this version. PVT.implementation=Hybrid_PVT ;#averaging_depth: Number of PVT observations in the moving average algorithm PVT.averaging_depth=10 ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.flag_averaging=false ;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time (for GPS CA L1 is 1ms) [ms] PVT.output_rate_ms=10; ;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms<=display_rate_ms. PVT.display_rate_ms=500; ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump=false PVT.flag_rtcm_server=false PVT.flag_rtcm_tty_port=false PVT.rtcm_dump_devname=/dev/pts/1 ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump and ".kml" to GoogleEarth dump. PVT.dump_filename=./PVT gnss-sdr-0.0.9/data/000077500000000000000000000000001305042567700142025ustar00rootroot00000000000000gnss-sdr-0.0.9/data/.gitignore000066400000000000000000000001061305042567700161670ustar00rootroot00000000000000# Ignore everything in this directory * # Except this file !.gitignoregnss-sdr-0.0.9/docs/000077500000000000000000000000001305042567700142215ustar00rootroot00000000000000gnss-sdr-0.0.9/docs/doxygen/000077500000000000000000000000001305042567700156765ustar00rootroot00000000000000gnss-sdr-0.0.9/docs/doxygen/Doxyfile.in000066400000000000000000002273311305042567700200210ustar00rootroot00000000000000# Doxyfile 1.8.10 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a double hash (##) is considered a comment and is placed in # front of the TAG it is preceding. # # All text after a single hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = "GNSS-SDR" # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = @VERSION@ # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = "An Open Source GNSS Software Defined Receiver" # With the PROJECT_LOGO tag one can specify an logo or icon that is # included in the documentation. The maximum height of the logo should not # exceed 55 pixels and the maximum width should not exceed 200 pixels. # Doxygen will copy the logo to the output directory. PROJECT_LOGO = @top_srcdir@/docs/doxygen/images/gnss-sdr_logo_round.png # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # 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. OUTPUT_DIRECTORY = @top_builddir@/docs # 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 # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII # characters to appear in the names of generated files. If set to NO, non-ASCII # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode # U+3044. # The default value is: NO. ALLOW_UNICODE_NAMES = YES # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = YES # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = @PROJECT_SOURCE_DIR@ # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful if your file system # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = YES # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this # tag. The format is ext=language, where ext is a file extension, and language # is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, # C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make # doxygen treat .inc files as Fortran files (default is PHP), and .f files as C # (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions # you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also makes the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = YES # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This # cache is used to resolve symbols given their name and scope. Since this can be # an expensive process and often the same symbol appears multiple times in the # code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small # doxygen will become slower. If the cache is too large, memory is wasted. The # cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range # is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 # symbols. At the end of a run doxygen will report the cache usage and suggest # the optimal cache size from a speed point of view. # Minimum value: 0, maximum value: 9, default value: 0. LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespaces are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen # will list include files with double quotes in the documentation # rather than with sharp brackets. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen # will sort the (brief and detailed) documentation of class members so that # constructors and destructors are listed first. If set to NO (the default) # the constructors will appear in the respective orders defined by # SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. # This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO # and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper type resolution of all parameters of a function it will reject a # match between the prototype and the implementation of a member function even if there is only one candidate or it is obvious which candidate to choose by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen # will still accept a match between prototype and implementation in such cases. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or macro consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and macros in the # documentation can be controlled using \showinitializer or \hideinitiHTalizer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. #SHOW_DIRECTORIES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. The create the layout file # that represents doxygen's defaults, run doxygen with the -l option. # You can optionally specify a file name after the option, if omitted # DoxygenLayout.xml will be used as the name of the layout file. LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib # extension is automatically appended if omitted. This requires the bibtex tool # to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. # For LaTeX the style of the bibliography can be controlled using # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the # search path. See also \cite for info how to create references. CITE_BIB_FILES = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_NO_PARAMDOC option can be enabled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = @top_srcdir@/src @top_srcdir@/docs/doxygen/other # 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 # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py # *.f90 *.f *.for *.vhd *.vhdl FILE_PATTERNS = *.h \ *.dox # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = @top_srcdir@/docs/html \ @top_srcdir@/docs/latex \ @top_srcdir@/cmake \ @top_srcdir@/data \ @top_srcdir@/src/core/libs/supl \ @top_srcdir@/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr \ # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = @top_srcdir@/docs/doxygen/images/ # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # 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. FILTER_PATTERNS = # 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 # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) # and it is also possible to disable source filtering for a specific pattern # using *.ext= (so without naming a filter). This option only has effect when # FILTER_SOURCE_FILES is enabled. FILTER_SOURCE_PATTERNS = #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = NO # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the # source code will show a tooltip with additional information such as prototype, # brief description and links to the definition and documentation. Since this # will make the HTML file larger and loading of large files a bit slower, you # can opt to disable this feature. # The default value is: YES. # This tag requires that the tag SOURCE_BROWSER is set to YES. SOURCE_TOOLTIPS = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. # Doxygen will adjust the colors in the stylesheet and background images # according to this color. Hue is specified as an angle on a colorwheel, # see http://en.wikipedia.org/wiki/Hue for more information. # For instance the value 0 represents red, 60 is yellow, 120 is green, # 180 is cyan, 240 is blue, 300 purple, and 360 is red again. # The allowed range is 0 to 359. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of # the colors in the HTML output. For a value of 0 the output will use # grayscales only. A value of 255 will produce the most vivid colors. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to # the luminance component of the colors in the HTML output. Values below # 100 gradually make the output lighter, whereas values above 100 make # the output darker. The value divided by 100 is the actual gamma applied, # so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, # and 100 does not change the gamma. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting # this to NO can help when comparing the output of multiple runs. HTML_TIMESTAMP = YES # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. # HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.gnss-sdr.Project # When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. DOCSET_PUBLISHER_ID = org.gnss-sdr.CTTC # The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. DOCSET_PUBLISHER_NAME = CTTC # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated # that can be used as input for Qt's qhelpgenerator to generate a # Qt Compressed Help (.qch) of the generated HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to # add. For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see # # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's # filter section matches. # # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files # will be generated, which together with the HTML files, form an Eclipse help # plugin. To install this plugin and make it available under the help contents # menu in Eclipse, the contents of the directory containing the HTML and XML # files needs to be copied into the plugins directory of eclipse. The name of # the directory within the plugins directory should be the same as # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before # the help appears. GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have # this name. ECLIPSE_DOC_ID = org.gnss-sdr.Project # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [0,1..20]) # that doxygen will group on one line in the generated HTML documentation. # Note that a value of 0 will completely suppress the enum values from appearing in the overview section. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. # USE_INLINE_TREES = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open # links to external symbols imported via tag files in a separate window. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are # not supported properly for IE 6.0, but are supported on all modern browsers. # Note that when changing this option you need to delete any form_*.png files # in the HTML output before the changes have effect. FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax # (see http://www.mathjax.org) which uses client side Javascript for the # rendering instead of using prerendered bitmaps. Use this if you do not # have LaTeX installed or if you want to formulas look prettier in the HTML # output. When enabled you also need to install MathJax separately and # configure the path to it using the MATHJAX_RELPATH option. USE_MATHJAX = @GNSSSDR_USE_MATHJAX@ # When MathJax is enabled you can set the default output format to be used for # the MathJax output. See the MathJax site (see: # http://docs.mathjax.org/en/latest/output.html) for more details. # Possible values are: HTML-CSS (which is slower, but has the best # compatibility), NativeMML (i.e. MathML) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_FORMAT = HTML-CSS # When MathJax is enabled you need to specify the location relative to the # HTML output directory using the MATHJAX_RELPATH option. The destination # directory should contain the MathJax.js script. For instance, if the mathjax # directory is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the mathjax.org site, so you can quickly see the result without installing # MathJax, but it is strongly recommended to install a local copy of MathJax # before deployment. MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site # (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_CODEFILE = # When the SEARCHENGINE tag is enabled doxygen will generate a search box # for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using # HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets # (GENERATE_DOCSET) there is already a search function so this one should # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a PHP enabled web server instead of at the web client # using Javascript. Doxygen will generate the search PHP script and index # file to put on the web server. The advantage of the server # based approach is that it scales better to large projects and allows # full text search. The disadvantages are that it is more difficult to setup # and does not have live searching capabilities. SERVER_BASED_SEARCH = NO # When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP # script for searching. Instead the search results are written to an XML file # which needs to be processed by an external indexer. Doxygen will invoke an # external search engine pointed to by the SEARCHENGINE_URL option to obtain the # search results. # # Doxygen ships with an example indexer (doxyindexer) and search engine # (doxysearch.cgi) which are based on the open source search engine library # Xapian (see: http://xapian.org/). # # See the section "External Indexing and Searching" for details. # The default value is: NO. # This tag requires that the tag SEARCHENGINE is set to YES. EXTERNAL_SEARCH = NO # The SEARCHENGINE_URL should point to a search engine hosted by a web server # which will return the search results when EXTERNAL_SEARCH is enabled. # # Doxygen ships with an example indexer (doxyindexer) and search engine # (doxysearch.cgi) which are based on the open source search engine library # Xapian (see: http://xapian.org/). See the section "External Indexing and # Searching" for details. # This tag requires that the tag SEARCHENGINE is set to YES. SEARCHENGINE_URL = # When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed # search data is written to a file for indexing by an external tool. With the # SEARCHDATA_FILE tag the name of this file can be specified. # The default file is: searchdata.xml. # This tag requires that the tag SEARCHENGINE is set to YES. SEARCHDATA_FILE = searchdata.xml # When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the # EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is # useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple # projects and redirect the results back to the right project. # This tag requires that the tag SEARCHENGINE is set to YES. EXTERNAL_SEARCH_ID = # The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen # projects other than the one defined by this configuration file, but that are # all added to the same external search index. Each project needs to have a # unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of # to a relative location where the documentation can be found. The format is: # EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ... # This tag requires that the tag SEARCHENGINE is set to YES. EXTRA_SEARCH_MAPPINGS = #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = @GENERATE_PDF_DOCUMENTATION@ # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. # Note that when enabling USE_PDFLATEX this option is only used for # generating bitmaps for formulas in the HTML output, but not in the # Makefile that is written to the output directory. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4 # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = amsmath,amssymb,amsfonts # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the # generated LaTeX document. The footer should contain everything after the last # chapter. If it is left blank doxygen will generate a standard footer. See # LATEX_HEADER for more information on how to generate a default footer and what # special commands can be used inside the footer. # # Note: Only use a user-defined footer if you know what you are doing! # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_FOOTER = # The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined # LaTeX style sheets that are included after the standard style sheets created # by doxygen. Using this option one can overrule certain style aspects. Doxygen # will copy the style sheet files to the output directory. # Note: The order of the extra style sheet files is of importance (e.g. the last # style sheet in the list overrules the setting of the previous ones in the # list). # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_EXTRA_STYLESHEET = # The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the LATEX_OUTPUT output # directory. Note that the files will be copied as-is; there are no commands or # markers available. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_EXTRA_FILES = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include # source code with syntax highlighting in the LaTeX output. # Note that which sources are shown also depends on other settings # such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. See # http://en.wikipedia.org/wiki/BibTeX and \cite for more info. # The default value is: plain. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_BIB_STYLE = plain #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition that overrules the definition found in the source code. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all references to function-like macros # that are alone on a line, have an all uppercase name, and do not end with a # semicolon, because these will confuse the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option also works with HAVE_DOT disabled, but it is recommended to # install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = @HAVE_DOT@ # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is # allowed to run in parallel. When set to 0 (the default) doxygen will # base this on the number of processors available in the system. You can set it # explicitly to a value larger than 0 to get control over the balance # between CPU load and processing speed. DOT_NUM_THREADS = 0 # By default doxygen will write a font called Helvetica to the output # directory and reference it in all dot files that doxygen generates. # When you want a differently looking font you can specify the font name # using DOT_FONTNAME. You need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = YES # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = YES # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will generate a graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, svg, gif or svg. # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = @DOXYGEN_DOT_PATH@ # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the # \mscfile command). MSCFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES gnss-sdr-0.0.9/docs/doxygen/images/000077500000000000000000000000001305042567700171435ustar00rootroot00000000000000gnss-sdr-0.0.9/docs/doxygen/images/ClassHierarchy.png000066400000000000000000003534701305042567700225710ustar00rootroot00000000000000‰PNG  IHDR þdÛj AiCCPICC ProfileH –wTSهϽ7½Ð" %ôz Ò;HQ‰I€P†„&vDF)VdTÀG‡"cE ƒ‚b× òPÆÁQDEåÝŒk ï­5óÞšýÇYßÙç·×Ùgï}׺Pü‚ÂtX€4¡XîëÁ\ËÄ÷XÀáffGøDÔü½=™™¨HƳöî.€d»Û,¿P&sÖÿ‘"7C$ EÕ6<~&å”S³Å2ÿÊô•)2†12¡ ¢¬"ãįlö§æ+»É˜—&ä¡Yμ4žŒ»PÞš%ᣌ¡\˜%àg£|e½TIšå÷(ÓÓøœL0™_Ìç&¡l‰2Eî‰ò”Ä9¼r‹ù9hžx¦g䊉Ib¦טiåèÈfúñ³Sùb1+”ÃMáˆxLÏô´ Ž0€¯o–E%Ym™h‘í­ííYÖæhù¿Ùß~Sý=ÈzûUñ&ìÏžAŒžYßlì¬/½ö$Z›³¾•U´m@åá¬Oï ò´Þœó†l^’Äâ ' ‹ììlsŸk.+è7ûŸ‚oÊ¿†9÷™ËîûV;¦?#I3eE妧¦KDÌÌ —Ïdý÷ÿãÀ9iÍÉÃ,œŸÀñ…èUQè” „‰h»…Ø A1ØvƒjpÔzÐN‚6p\WÀ p €G@ †ÁK0Þi‚ð¢Aª¤™BÖZyCAP8ÅC‰’@ùÐ&¨*ƒª¡CP=ô#tº]ƒú Ð 4ý}„˜Óa ض€Ù°;GÂËàDxœÀÛáJ¸>·Âáð,…_“@ÈÑFXñDBX$!k‘"¤©Eš¤¹H‘q䇡a˜Æã‡YŒábVaÖbJ0Õ˜c˜VLæ6f3ù‚¥bÕ±¦X'¬?v 6›-ÄV``[°—±Øaì;ÇÀâp~¸\2n5®·׌»€ëà á&ñx¼*Þï‚Ásðb|!¾ ߯¿' Zk‚!– $l$Tçý„Â4Q¨Ot"†yÄ\b)±ŽØA¼I&N“I†$R$)™´TIj"]&=&½!“É:dGrY@^O®$Ÿ _%’?P”(&OJEBÙN9J¹@y@yC¥R ¨nÔXª˜ºZO½D}J}/G“3—ó—ãÉ­“«‘k•ë—{%O”×—w—_.Ÿ'_!Jþ¦ü¸QÁ@ÁS£°V¡Fá´Â=…IEš¢•bˆbšb‰bƒâ5ÅQ%¼’’·O©@é°Ò%¥!BÓ¥yÒ¸´M´:ÚeÚ0G7¤ûÓ“éÅôè½ô e%e[å(ååå³ÊRÂ0`ø3R¥Œ“Œ»Œó4æ¹ÏãÏÛ6¯i^ÿ¼)•ù*n*|•"•f••ªLUoÕÕªmªOÔ0j&jajÙjûÕ.«Ï§ÏwžÏ_4ÿäü‡ê°º‰z¸újõÃê=ꓚ¾U—4Æ5šnšÉšåšç4Ç´hZ µZåZçµ^0•™îÌTf%³‹9¡­®í§-Ñ>¤Ý«=­c¨³Xg£N³Î]’.[7A·\·SwBOK/X/_¯Qï¡>QŸ­Ÿ¤¿G¿[ÊÀÐ Ú`‹A›Á¨¡Š¡¿aža£ác#ª‘«Ñ*£Z£;Æ8c¶qŠñ>ã[&°‰I’IÉMSØÔÞT`ºÏ´Ï kæh&4«5»Ç¢°ÜYY¬FÖ 9Ã<È|£y›ù+ =‹X‹Ý_,í,S-ë,Y)YXm´ê°úÃÚÄšk]c}džjãc³Î¦Ýæµ­©-ßv¿í};š]°Ý»N»Ïöö"û&û1=‡x‡½÷Øtv(»„}Õëèá¸ÎñŒã'{'±ÓI§ßYÎ)ΠΣ ðÔ-rÑqá¸r‘.d.Œ_xp¡ÔUÛ•ãZëúÌM×çvÄmÄÝØ=Ùý¸û+K‘G‹Ç”§“çÏ ^ˆ—¯W‘W¯·’÷bïjï§>:>‰>>¾v¾«}/øaýývúÝó×ðçú×ûO8¬ è ¤FV> 2 uÃÁÁ»‚/Ò_$\ÔBüCv…< 5 ]ús.,4¬&ìy¸Ux~xw-bEDCÄ»HÈÒÈG‹KwFÉGÅEÕGME{E—EK—X,Y³äFŒZŒ ¦={$vr©÷ÒÝK‡ãìâ ãî.3\–³ìÚrµå©ËÏ®_ÁYq*ßÿ‰©åL®ô_¹wåד»‡û’çÆ+çñ]øeü‘—„²„ÑD—Ä]‰cI®IIãOAµàu²_òä©””£)3©Ñ©Íi„´ø´ÓB%aа+]3='½/Ã4£0CºÊiÕîU¢@Ñ‘L(sYf»˜ŽþLõHŒ$›%ƒY ³j²ÞgGeŸÊQÌæôäšänËÉóÉû~5f5wug¾vþ†üÁ5îk­…Ö®\Û¹Nw]Áºáõ¾ëm mHÙðËFËeßnŠÞÔQ Q°¾`h³ïæÆB¹BQá½-Î[lÅllíÝf³­jÛ—"^ÑõbËâŠâO%Ü’ëßY}WùÝÌö„í½¥ö¥ûwàvwÜÝéºóX™bY^ÙЮà]­åÌò¢ò·»Wì¾Va[q`id´2¨²½J¯jGÕ§ê¤êšæ½ê{·íÚÇÛ׿ßmÓÅ>¼È÷Pk­AmÅaÜá¬ÃÏë¢êº¿g_DíHñ‘ÏG…G¥ÇÂuÕ;Ô×7¨7”6’ƱãqÇoýàõC{«éP3£¹ø8!9ñâÇøïž <ÙyŠ}ªé'ýŸö¶ÐZŠZ¡ÖÜÖ‰¶¤6i{L{ßé€ÓÎ-?›ÿ|ôŒö™š³ÊgKϑΜ›9Ÿw~òBÆ…ñ‹‰‡:Wt>º´äÒ®°®ÞË—¯^ñ¹r©Û½ûüU—«g®9];}}½í†ýÖ»ž–_ì~iéµïm½ép³ý–ã­Ž¾}çú]û/Þöº}åŽÿ‹úî.¾{ÿ^Ü=é}ÞýÑ©^?Ìz8ýhýcìã¢' O*žª?­ýÕø×f©½ôì ×`ϳˆg†¸C/ÿ•ù¯OÃÏ©Ï+F´FêG­GÏŒùŒÝz±ôÅðËŒ—Óã…¿)þ¶÷•Ñ«Ÿ~wû½gbÉÄðkÑë™?JÞ¨¾9úÖömçdèäÓwi獵ŠÞ«¾?öý¡ûcôÇ‘éìOøO•Ÿ?w| üòx&mfæß÷„óû2:Y~ pHYsgŸÒR9iTXtXML:com.adobe.xmp 150 150 5 1 2 ÖH @IDATxì€ßE±Ç'½^Ê¥÷J*I$@(1€€E `¥ØPlø|ø|*6@E}`A@@)ÒK€¤@RHï¹ô~©wio>ó¿¹üòÏÝåîrw¹2›üïW¶w»3;3»µª“p@ @ @ Tµ+ È"@ @ C è@ @ @ PaRaPGF@ @ @  Hô@ @ @ ¨0‚©0¨#£@ @ @ $ú@ @ @ TÁ€TÔ‘Q @ @ } @ @ * `@* êÈ(@ @ êÅC Œ/N*Š@ V­Z‘Mä@ PRLPc²+&P,@ @ (`@Š'ÝëÀö f$$"éèTígg0ÓÛÕÞ<(Õóu×ä;÷.¨o$ÓNùúP줿§“¼º?Q/I2Ôñ¹Ï/›fŸŽÝÑJd8Æ·t4˜Â?Ô·sP¸&û]@ Põ¤ˆ6ƒ b¢Û¿¿Œ;V&L˜ uêÔ±w%%¶ŠÈ&¼* ÚÜGøJêh{§ èþFå•6Âû‰3&˜pÉ4x]”¿ç‘ˆn·É4ˆŸ|N[œç‚Êíñ¼ µ½âîQÀÕjªŠ´€Ø`—Â삨,¢x™@€>²wï^¹à‚ dĈ6û÷—·@ •`@ŠÑ@ÙÙÙò¯ýKÚµk'#GŽ”ÜÜÜ|¢³Ñ#H@À‰˜zujKÚ)Vbßþ²W8ÞC”óÞ™ÞÕ©][ö©tìÀ#Ç¥®¦A:åûõ]î¾yÒÒ=hþ„!ü÷ªÿ~¥ÄIÛóP#ß‘.á(£…©ƒN´Pþö??lqn,¼r#Õ#í$ñOxÞŸWϤ_zú¤…+*LzöúÔ­›Ú xWš´<͸VO¼Ÿ5jÔHž~úiyá…dРAÒ¼yóè3ճɣV@ Pͤ ¼sçNÙ·oŸ|üã—ÓN;­1"HUEv#{÷~£ÿ›7ªsD5 ·¼ù'};¹mšFŽÔÍÕ“†|eÛö¨ÿÞ‚ýI/™Gòž *ïKêŠJ§ :•4ýↇR¨¤Á‘p7‰Wƒ€A}ñÅe×®]Æ€Ô ªGU@ ¨6@U›ºsE˜èP¿Ú½{·‰ý}*%³Wl“·l’-»÷‰®ÅK· edÿ6Òµuc•PˆŒŸ½Nf®Ú.=©½ôjßÔê°`Ív3gƒ\<¸tmÓD¶ìÜ+c4Üìµ;TJ"Ò\©ê‘}ZÉÉ=3Mâ±u×^7{½ÌZ³Cöéj3õ?³WK9½OkKï½E›dââ-RW¥ûH@]Ûf dx¯LéÙ¶‰ìPÆå¹©«¤KfC9»[ó/ÍŸU›vÉ+3×ɨm¤W»T]<±Z¾êÙðNÒ¢q=]àuCvŽlÔ_OÅ£Až$£À€…¼œ·*[^µ^º+Æ í õUº.( Æa¤ÐŒËHðBbVZá@åD }á¶r–ò8–Š ãœ=9ÆŒPÞñc"ô+÷ñ« Òäm§7Ö»¦.Ú(w[jm|~ÿLÙ«…Ì[·]î½HVmÚ©b‡²zë.ù§2(c>X+ÛvæZ¼-Û÷È„åÛdOÎ^{~uú*™²|«œÓ»…\>¤­4­WK~þÆR™¹t“ù™¹F&,Ù,g÷lfþ-Ö–_Ž[.ïiþ¸ušÇ$%Ê[7­+:4–®-(Ó“-¿½\¶îÈÑâú¼fó.«ƒEÒ?ûµ?æîݯw©úxuÔ›\mŒwÙ»rä-e¸¶hš‡œªƒ©ÚUÖ–2mu¶ìΫ“Ç³”JZ*âÍZ¾Eþ:a™lÎÞcÉçêTÜ;ÖžŽ—1gß~ysîzÉÚ¶[zµm$õòF#«‹úy8ÿÆH‹4HÛ~Õ8âšÓpüãWµ1Högî÷ìÙ‹BþÄ5*ˆ@H@Šh4'ZŒQ®¶êúã¸âÇÊ[¬¾`%õÒfËsz£ÿ³U*1zîFЦ±\svwi–·êß«}†¼4cI¤Vmi\¿®œ­Rˆ…›rdNÖ6Ñ·4Òw™ªcÅuÆ 6î–U0r`{Ë£wÇfÒ1s½Ô¯W×T²–nÚ-}5‘ƒ:˜ÚV¿.-¤]óµfLK„zºÉAï–äü!󥮕'´;söKfF]i¡j] ê¥6C μUÛä}ezðïÖª± SiI‹&õñ²º½¿l‹,ݸKãÕ•¡Ý[š¤¦~Ý:Vî& RCÀ”…é ’ÔÆ2-º²yG®LS†©cˆ²fËY±e· éÜL†ôl%”q˜£’ìR¦,Þ,ç5®¯å¯%“n’ÅëwJf“zrJ–Ò¹uÙ¥e{oñ&iÙ´–Im¨xòȺ{%SñÎݧŒ…ò+×o—iZÞúÐUó¢åm•ÑÀê²bÃN™®~[UBÕC%&'©mS4{Å™µ2Û¤0C»·wÊ®z g¹÷±™k¸@ ª‡@H@ŠÑf>ùÅdW °ªHȧO7êêýÊì\#¬ù`•½UFC¹ò´ÎÒSU”0ÈÞ•»_NhÝH†w͉K¶¨ô ×T©0Bo¨*H½Ô’ÂONZ¡„û&Ùª’’j'º47µªÎªÖ5C‰ö'ßY.Ó” ߸mœsb;ª„º9¥™wh>HDf,Ý,oÍY'3Vn“³º5“v-åÀ;i=gåVùË„j·²OÚfÔ—×æo”''gÉ•†`\þì{«äYUqj¤â…ª>v÷˜¥VîºÊ(À`üþ¾æsÿäÕfwÒ\™ˆýªo–2L‡É5æç¹÷×Iöž}¦bö »põ6c¾u]Ýâ‘ÖõcÖZyéƒ *Á©/«¶î‘ß^iR$o«jÙ?&eɘù›”YÚk²Ú#}$Ë•ùxxÒJc„:µh ¯ÎÝ$/¿¿Æ`Y­Ÿ¿MX. •±iP·–<øîyaÚ*SSÇG¦¬V±Ž¥õÐÄ,™³b«Å ò4Õ­ªÃß«C+F@ H!è 5ã@RU‡p®«”p#%`qÛwï•Wf¬•5Ê4VIÃɺ¢>°k #Ê(á~¦Úk<­„ýd•´WiEs‡A9î¢!¤‰>¿«LȘÅ[Õ°º– V‰È…j#Ò1³±|ä¤ÒPýßSÿqK·I}¥ÜOl×X.Ö÷ø³j£3eÙ6cXv)#±q×>é¥ö%u4-¥Ó­õ•¡Ø«ŒÂd•<´UIçFt˜¤(ƒ0jãN•ºÔ‘ÉšÏ'µ‘ów$ÕÆãxÌKšj“mV©Æ¹¸o¦J]:XHÆGyêi‡tÊ‹Nî¨iì_¼ºD¥!»¥_§æÊ´5—¬­9rV¿6fHþêüÍÆ,ØV–¬Ý.·Y.3TjqRL³ï ¬×œÑÅêº[ë9]%7ÍU2sJ¯V’­ÌÚý[K•˜ÐÙ¤’•EjŒþ¼©CÐ_uzWÉP&ᢡ•Xn'Õ~déºò”¦S§öZ¹fd•&4U©Ï)‘ÞYÔº¦*Óðï÷×J¿Ž¦>EN0{rS‰žJŒÃ|àˆ“©ýÆí9J|×1©L7e^pÉóÃ-Zkuž©Ò ìaŠ’Ž< øL`\Ž ®‘b“¡aa„pÔ \êèÍöœ\{Þ jU/N[mŒÒ©í۶ùfÓ!Ò·]c>R±SyPòk éÂ|½2s­å“3—£LØŹ{‹ú†=qÏPõ7Üú­»%[Õ»ªTdôŒ5ƸtW)Æó{4-c@4é‡ @ Ê@0 •£¢Œ©¯Œ·nÖP:4­§ªNÙª •©v õexïVf_ðÚÂ-ªf•ÒTt‚¢|`×–2]¸ßYž--”Az‚ãWHVäÜAí•)¨']Û6•ëvȵ¯ØªêLoMÛ +þõäB•x îÕ­m†ÌU&¢µ/ò€ oÒ°ž15¨µP©ÁÝÖw›¦áÏ9PÚõ”Á ßuÊl@¤c²E¥H 24>“]*™ÁÆ·IÃÍQI n-Ì/W9󕑆âµéÓ!CºkyóL,’Ä»ïÌãã,ãEô™òÀÃõjÛXwõj£ Ý>Û!«ƒJ‰N\˜ ê@| ¨÷“T}ìé™äëê*ÝÛeÈãï Z¶×ÎTi¤LÐfeþ`a*æ© ’œÖºCx¡òuJpH›z¦‘¶ .ÅÞØmü©¢ÐUhÜ‚TÑŒb@ †@0 i€õ“_QèTA¿<*º¹l_<¨­ü}Ò*yPí †wonÌŒAŽRÆ©CŤ{ÔX:W‰ú&jx~†2)sÖí’%j?B˜ÆJð¢rõÈ45\ÏÙ§RƒF¦ª´XUœ>:°´mÞЈíGÔžBºsf#Y«*D‹6ï‘‹úµ2fõ§¥Ûrååé«¥¥2(¤3cõNتaþv¹Ù¹ì}CeŒNVfâµxM¥ä÷šÚ_tSû‰”¤£–tVդה¹€ÀwÙV™½~—Ù£ÐZk•©9A™ÔÈ&ªºÓ *e¹ndw#â·*31O¼MÊÐ8ãA¼ÍúŒÝŽ:/ß¾WÕ¬¶J_UÇÖ©©ÙštRIÌ:µ™¬*VŸQ;šL5>ߢñ`’ ÆæMòÞa·Bª`‰úÖü »¤‰Ö{•¾ªNõò‚-VÏN*ù×´µšW†\5¢«©‡½©69'®WiŽâ7aáf9½g é‘·½°3KVàøS%€5®µJ–> @ Ž@0 éˆñÌnX8Û+VãŠ@ªêxÑ¢H«Ç—õþUwzEU¦P3Ù'SNê’a6ÚêÒEU€Zè¶¹¨Iá ò/ê—)³Õ¸u-Ü¥z–E«&uŸ® ¦/VæâÔÞ™¶R¾¤7U¢}fÖvÛN†åÂ>-äÌ~©s@25îË.µe`«_ˆç“:6‘“ÕH½20¼;IÕšZ«Ä7DËý)5è~Wˆ÷³²¥CF=9g@[ÉP5,Ü'On/ãæmg­“VëÊ×Ïîlv"»öäÊ™šh™TåKË·‘+²eíæÒ±y9¥Ce–P¿ª%gtnbe&=,Ø3Ì®»îvNצòîÄuB‡¦ò±“;ÈKÊ<ýGU°PÝ:­[sA]lP»FÒA"¾NÇ>j´SK¿§“´.Yj[òŠ–µ;‰õln»s•ÉÏ m#“ÕnfŽ2'#»e˜êo#ú"ÅÙ/¯êù%¸µìt§.ÄDfLooãOu@Àw ¬u‰:@ P“ÐyŸuÎp!4œ²`Á¹í¶ÛäÖ[o“Ð ª½ƒ!Ù®’†ªÎ”·Cm©j§‚ Û‰ Û ¥¯p*`0…cÍÇ6ÉŒJš5<23 ؽغ8£äñÊêŠê•V5ßmWi6(%Å[~“05(xƒ¾Ý{SLEÓüwªd>°qý‚ãæ.nª4¯½öš<òÈ#òÃþPz÷îm[X‡tºJ7i>j !)F£ûä¼Z1ÀªâA ]›7JPÒ¥¬„w%À s0% Ê O#솅äÓQcâqËâšd>H/£F¨8ù`nS¯æÂã6ÒƒÓár½6 Æ#Fõ½eö1¹úÖ2j@õF "Ú79É!úòÉ'eáÂ…&)"ZxUQL¨Ä‹­ýóP…rYaÒ¦ °w‡RIA§Ç)Ì?U'îÃÕßÓóäÙÓÃà:™qÝßH÷„'ïý1™fòÞã{8¦X©’9.‡ˆBϰÉò¤§›Ÿáòó¸IÃñt¿ôt=¢0 L¸ª@ƒ düøñR¯^J°ê×(j@ÍD £´;«mûU¿œßÆeݺuÁ€³ð@ <€Ù°aƒ´ÌlicrH¥ËåH3òG b` ó-ÈM7Ý6 ÅÀ+‚@ P^ 4Hî¿ÿ~ÛÌ ¼òˆt@ ʰÖ,&¾¬´Åj[1ÁŠ`@ ”1—°‘l ˆ@H@Ž6vuêèîAúómx}LÚˆ%™ð@ 8Fs‡ëÖ­«[9ëöÍn tŒéFô@ ŠE "ðv‰è0 î|Òó«¿k Ç _Iž•ÁÅ{¿ú}AÏǫܥɗñ¸và—»ˆ@e@ b´“5¿p@ TF’ŒåKŽW~ŸÇ"À¨¸ŸÇ¯Œu+¨L^î‚üâ] @åG –ŠÑFLÎá@ ¨¬@3N±Y†;·öíÓS1ó\NNŽÝ¹”$77מ=¾‡‹k @ Pž„¤èÆj[1@Š @ Pá¸äbçÎòöÛoËš5kl§¾† ÊÚµk¥_¿~2gÎéÑ£‡¬_¿^Þ{ï=:t¨½ÿý÷eþüùrÊ)§ÈàÁƒóÕ´b¼«ðfŒ @ ¨qRãš<*Õg>¨ËìÙ³eæÌ™2dÈ™6mš´mÛVüqùìg?+K–,1æcñâÅÒ§OcHx—••%½{÷–)S¦HçÎ%333ß^¤¤øP—¸×™dz¿+iÚ>@ ú! HõkÓ¨Q Ô0²³³éèÛ·¯´oß^víÚe§>ýôÓ2pà@{Gl@¶lÙb»I >\7nl~%e|gÀ¤=‰%”÷'™ž3)„ @ P³¤f·Ô>ªlK»mÛ6A­ ;:Ègœ!óæÍ3ÉȨQ£Œ™5k–`÷1lØ0á@¿ XxTµp.±pH’ „¿K†K2äS³}ûvK§I“&R¿~}cn®?Ï£°´“ùÄ} @õD êÙ®Q«@ ¨A4jÔÈ€Õ«WK‹-¤cÇŽÒ¿ù÷¿ÿ-+V¬ìDx7uêTc `7yòd1b„4hÐÀvÆJ‡ †!É,$Ÿav-ZdLÎòåËM²Ò¼ysËkìØ±¦Úu 'H»vídÀ€f{c‚K¦“žg<@ To‚©Þíµ jŠ@’)€Ñ@C3Á90ØxÀœôìÙS–.]*Ø\tÑEÒ¥K3HG-ëꫯ6û`B¥Št“isïÌ‚_ »lÙ2yæ™gÌØýä“O–|ä#&y!ü“O>ii^sÍ5V˜”—^zÉ~ýèG夓NÊ—†$ó"Ýp@ Õ`@ªG @ #S€Ôáì³Ï6¦bÆŒ¦Õºuk“xœwÞyÂV¼HA6oÞlÒ $¨a¹úL¤I“ )£>Õ«W/9ñÄ©E’ù˜>}ºÜ}÷ÝÆìÜrË-fBDŒÚÙyë¶Ûn3£wÞ“ÆYg%ãÆ“;î¸C>÷¹ÏÉ…^h—dº„ @ Pý¤ú·qÔ0ª)N¼ïß¿_&Nœ(ÿ÷ÿ'0 0¨V]wÝuò£ýȈѣGË/~ñ ùØÇ>&H>æÎ+×_½|éK_’nݺ™„‰R˜vÖzøá‡å“Ÿü¤IR€‘·Hç‹_ü¢IS0x'mìI°ÿøÓŸþdiƒD†èŠ+®°¼~õ«_ó’”°X„ø@ Pí¤Ú7qT0ª#0în U`,v¾bÞ_|Q¾ò•¯Ø¹ —\r‰À¤àþë¿þËl4®¼òJ“’ÜxãÂÙ!8$¨imݺUî½÷^)a{_˜ÎÁ¸öÚk- ’xÀü óÐCÉ·¾õ-9ÿüó¹ï¾ûÌüQ ñëÖ­·Þ*¿ÿýïÍF„]ºÂ@ Ô,b?ÄšÕÞQÛ@ ¨F¸ýŒ?gØë´ÓN³š¢Zå*Uì~Å™­Zµ2•( d§, ÔQ¹Â·M›6‚ñ8ŒÕ-Üøñã%##Ø>ø@¾ýí[äãÿ¸ICºvíjù¤&0@~È™$~ê:éÀ„œ{î¹òÜsÏY—‚à.@ ú# Hµqr52™dIß'ãÆ} E!àãKÓ¦M-LÁºuëìžÓÏŸzê)³µ@ u˜€={ö˜?ö00'Ü{Z<ãxSƒÃÆ ;haDNZ÷ÜsJ;n¶ø}ë­·ä®»î’E‹™*ØÆ-LÌ×¾ö5yùå—…-€qžÆò¨mqz{ò½=ÄŸ@ j@¨`•QóúJdzr%}Ÿ?ž@ (¤Ô; Ô¥nºé&Sºøâ‹Me Õ'ŒÍ‘pÀXÔ«W/«]’ô1êÍ7ß´ƒ 7mÚ$þóŸM¥ª{÷îvÆ~7ß|³¢Ž½Ç™gž)¨aýë_ÿ²¼‘œüóŸÿ”'žxB¾ð…/˜Z;paëÁ%§œrJ~~Ø„ –µ~ýzÛ•+½Õ9Þ@ TBRÁíè«Él z—ôû@  BÀ™N2ǘ|̘1Æd`ÛqÕUWɳÏ>k’ *D‚‘kˆ[ÑO‰ÃÌÀ\À|> [ï’Œ R$.¤ƒ´õ-¤*œ âyá׬Y3Ù½{wþ;êÂ!†Äw‰KAõ‹w@ Õ`@Ž¡]}‚eÿ} >Q'Àù{všAõ€Ýfü=“1*o¼ñ†L›6ÍÞóÎãØ‹ø@1`ü`'ª 6çqüú׿–wß}WN=õTùÔ§>%&L°ñʼn}k¸4ö`þŸÿüÇÆ§oûÛjçñm“x`dŽDõ*\µj•ýFŽiŒŸÿüçfXÎîY0?œ?‚CúÂö¾Ý•‘IæG™±-A½ ç岇ø@ P­¤ š— ùÒK/5ƒdr¨0  fÒíØ±CþçþG^ýuÓ³Æ/&ß$BqGC 9fÌŸ?ߌÁQ‘B­ cs$8TŸrrrTÚP߯˜v!H3ÜùûN:™¡: LJ>ô!‹³råJiÙ²¥`´þÎ;ïØ–º¼ÿñ4ÉÆ÷¾÷=;‡„çË.»Ì!ÒÅŽÄ ÍÝ(ÞóaÁÉ §³ãü½=ÄŸ@ jÀ¡Ù§ZW³|*ç&»Ê šà+yž9ÛcrˆWÒA <öØc¦›ίÉpq@q@ ©g`oÁŽV08l@_à;’LÇ–-[äí·ß¶®³€KªDñ‡Ñ9Ž«ØÆ—à 9Óõ«üà&%ag«Ï~ö³ù'²£†… '°sX!ö!äAYXœÁ@ž3IPÏ @ P³äÛ›UH&iòrcÂ{ˆ€.]ºøë|õVaZÂ@ PZ|œáŠúW¿úU¹ýöÛM¢À"gràN?ýt³µÀiÈK/½dç„Àà0$g¬B% —d@|Ç,?C„³@°/aÇ+òb‡«qzº9†çH3P7åPBòÁN„qñꫯcp0¤yÿý÷[°à/}AÇ^ÄŸ@ j@0 ÇØ¼Nx2>‰õž°®>áá=~\@ ()™™™¶[„>öH?`0(:t¨ýøñî™gž1)LËóÏ?o ùq! &‘»C:AÚ¾Í/ï‘|`þÃþÐ5j”Ù›dee™úùÔ°M/§ª'˜¤/HE`Z‚ùH"÷@ Ô ‚)ƒv.Œ‰(ì=YåWEŠ$@  GØ… ¢þË_þ²íx…ê§«7!á¸îºëÌ8Üã@ü£6êÏ0*¨pyàÃncöìÙùꥨP·^xáùïÿþoc:dôéÓÇgÛ]Ò˜9s¦I@ø²Õ.;jÁœ`Grà 7cÌG è¤QÅ@  @ @‰W@ T%œGŠÁ/éðCõ IFAÎãÂXðK:˜˜¤ éž<„ÀL°™Æ/ùKS+EâÁV¼œñÁIèØ‡t×ݯ°áôõ믿^0n‡)!p@ 5`@jf»G­@ !€£0‚Þ%%ñ/(Ž¿ó¼¸"õ@•kõêÕÂö»œœ>cÆ 3vàlç­víÚš¡;vonÔîeñ4«QSDU@ Š@0 Å)‚@ PÙ81_ÿÂâð&‚+;ka;ân`ÄŽ¤;—þ>ž@ jÁ€Ôœ¶Žš@ Pf8â :³’<[Äý¸†Ô#‰FÜ@ P³¤f·Ô>R#àL 8ƒQXbɰ……)ò=&#©3‹ ž@ •`@*E @ ¨ô3ƒq´óq4„Â?*ƒÀ‘ ºU¦èWÐØ«¥â°Žœ@ HGéÊÑ$,éqâ9@ ò"b´/¼ù“a1@‹ @ ”>ö"eñû2J:’ @ 8R ЙðØÍÅ·d,wuƒb”+‚@ PHŽ·ŒÃÉçšPÿ¨c Õ `@ŠÙ¢»wï–U«V §üæææÚ*\L‚Å/‚@B )¥(‹qÒÓãĬ¬,Ù»woÂ3*@uC "Z”‰“‰¯^½zvØÖÿþïÿÊ 'œ ¾Ï}2ª‡M¾‹û@ j"¾/cåþýûm=pà@¾úe~œ‚cüL2*Œ»Ît$ñƒyë­·äšk®‰ÓÔ“ÀÄ} U `@ŽÖ`jÞ¨Q#ùÈG>"œä»uëVIN¤Dgâd’Åtð–yÄŸ@ j¾pÃâ ?_ aìd¬äsâ‹9É1Õ®éLŒÍСCeðàÁ3‚’q©!ðF5@ ¨òr”&¬]§¶MtÝ»w—¦M›ÊÎ;mòLNzL¦L²LŽ9¹9º!~Š)9JÒá]  0œÈHb^Œ¨¤ˆö(PI:!ñíD{Ué÷ô ãàš5kdîܹf7‡Íãc“&M¤yóæ6ž"ù¨_¿¾…õzßgR’uÇŸxŒÃ­[·¶tbÁ'Ñyâ6*„@0 Gi,&<&N&D&Rì? |Òä Éž={dãÆÒ±cG“‚x˜£$ÞE ÁÎ/FìÛ/µjûždED ¯rA€ö€àƒÀä;À% ÄrÉ´% ¾.-ÈÉÉ1l}œ© 8S~uÈÈÈ¿ÿýïÒ¥KéÚµ«,[¶ÌŽ–-[ÚøÉXÚ©S'iÓ¦«0-Z´V­ZåK‘ b.ÀÆ…ð7Î[ƒºIT5j@-4R³Fµ¨NùTâ×Õ`,pÀÆ=“à®]»ä¡‡²U¿o}ë[Ò,£™äîÍ âì›Ã‰¯ììlcòP¹  L¢Û#¸%ˆîíî0Û·o—ÌÌLK!Ú¡@%(‹›6m²U~qß좪ôwú c"õàþÿø‡‹êSŸ2É1ãäŽ;l3TY©‹6•ôtW)3ß7ŒÈÅ_,mÛ¶µ0¤åŽ{ð€ &÷á@ ª!)F›1¡òcå çD“ÄØOÜŒ3ä'?ù‰1v4Õ ˜“ z€•ó­ãÍÖ§¯¼òŠÜyçF(^vÙeÖN´WôõÒ7BrLAðÛßþVš5k&_ûÚ×ÌÖüqU ã^½zõî»ïÊ…^hcg²®Ô U*~8¾uÛn¸Á˜ïwæ@ ª!¿.As2!:°hÑ"ùÎw¾c+u·Ür‹ 0À&Ò%K–XŠÈL¶áJŽ€\«W¯–^xA^|ñEÃⶦä©GŒ’ $§L™"ëÖ­“7ÞxÑyóæYRÑÏK‚è‘a½/£ŽÄ¸2nÜ8éÑ£‡ã¼ó±¤ªáŒÄø¼óγú¤Û´€õö:?ÞÛ¯|å+f?‚_,2ÙWâM Õ`@ŠÙ’É qÚ´iòõ¯Ýô”¿ýíoç¯ÖcPÉa…áJ‰K?^{í5[ FœÕöýë_²téÒÒ'1KŒ€ˆ¨>òÈ#ÖçÏ=÷\9óÌ3MËmrœˆ.q!Qé›Y°Íìµ×^+}úô‘Ûn»M6lØP¥˜i¼ß 2Älã|a†æv®ü`º~ô£ÉÏ~ö3c¼ˆËûp@ Õ`@ŠÑ¶I=÷Ñ£GËý×É÷¿ÿ}³ù`•*[¶lNMW:œ…(;v¬\~ùå–PÿþýåüóÏ—§Ÿ~Úð)Héð-I,A_…ž0a‚ýž~úé–69L³Z ‚Ñ`(ñŸ$ÆôyvŒbW=ve¨Bœ£îI[ž_Uq,ÊÀ¬¾ýöÛVdú‰×{ì?|ðAùÁ~`á¼^ÑŸ‰¸@ P=¤ˆve¢„ fE&ãᇖ?ýéOòë_ÿZXÆ%%#ìÞ‚ W•+ðqþãXƒªW#FŒ0Ì‹3òþûïËäÉ“í•3îײEÀû/Äï£>jÆÄìúÆ{Îa`•žŽX¡§-œy,ÛRTïÔcìk`@N8ácôÀ¦›nºI"°èú[UdB`@8½u2œ™ÔýÞ{ï•Ûo¿=ÿ;çcR½[>j@ÍF BÚŸI¢Š ŸZØÍ…Ýiî¾ûn#ˆ–œHy†áÍ›7ó®”Àd`ŠêæöÀØÿ³Ÿý¬üóŸÿ4IS½¥¸Ѽo©„ñ°aÃ,&~8v%4hI¥xvâ˜ûpÅCÀ‰m˜<ônݺåGg?n¼ñF9å”ScBäqó#T¢›äâ@Ïž=…]°ø¦q®bÉx Óuß}÷Éï~÷;™:ujþ˜ëRåJT¥(J @" H!`2â0„þ¿ÿû?;Œðoû›é(39òƒàJ:NùeeØõ KˆûBp‚øgžyF.ºè";ÄŒI£Vv‚(ÆAÌ8Al/âO™ àý›ÔÞ®¾új#!zsÎbøä'?)cÇŒµíyɸ2ÅeL'â8/_¾ÜÎbŽô{Æðfg(>T•8eÜãU¼9¿‰ñ믿n»ÙQ¿÷Þ{O~õ«_Y}¾ô¥/Ù6ÛÔ 'pÞǪBý¬Àñ'@ DNA—(jõ ì“öL’ìÉA¨ŸÂäÈñëá!È8@ì0Ct%$Âø9A…z*=þð‡-~c`Íác¨þ<õÔS¶zZtÊá[ÀÌi—gŸ}ÖloèÿIçí…ÝÓW^aê‰ìtäí” ÷#¾à…C€ôƒE \íZ©÷Œ3¾ØñÅ/~Ñì$~üãËÚµk­¼,R%û“,ÛàÁƒeåÊ•Æ<1®þô§?êáýê’K.±í‡{ì1ùÃþ`ç+96±ÀPÉ6Š@ PGÏXøI¤S­’p⊉¯K—.F€¡äç|àÏÞõ0$Ü3Q:ºg‚`¬ C‚óôªHeXpC Rï¹çùèG?jª=þ>™XbØ 3qâD³gÂÎI¤JwŸ$ŠgÏž-<ð€m7‘‘qÆNshÜË/¿lmØ·o_kÿJWŠšË1â„plžP³ê®§óÞþéç„8WÂdggËý÷ß/'žx¢´lÙ²ÒãÍwÙ¤I; ƒ±9õÔSåŠ+®°úùNj¨Xb/Âæô'¶6G­•øñ}Tñ'jƒ@0 …4%D Äa¿~ýìžU<&Èéӧ監äÌƤ¨ .ÑæDF!ÙÔø×àãÖ«¯¾jÒÏþó†'„GúÏ£=À™cv"\`íè”þêæææ3ÈnW‹¸ô¶ðvc×&ÚàñÇ—“O>9ú}1áwõ«wÞyÇÎÌÈÌÌ4bɇãMr0)œÎIô¨xþò—¿´q u—ƾ²:ÊF?a;mú;|ùÂå  ;gœq†-0`w×]2ˆï oe­c”+@ ø¤–苾ƄdƒÃqÏê?&Gt°ÿüç?›q(j0*ãžuÖY6ÉöîÝÛVó]Ÿ»Æ€VŠŠ:Á ¦p‡>xƒ K ââ#y%ÌÈ‘#»VÝ‘ŠxZ‡Eއb#~ÎTpz5gÀ€$a’íÀê5„$D"ê‡O>ù¤|ãß°t¢=’ÈyïXÃX€]=|AÎB»éaƒ6wî\c<øXÔ@ )+öfžcTetÉq”ñ]ÓF%؅мü\é/Ô?Ô,aj9äóº Áxΰfe­oelƒ(S •`@ŠhŸä˜(™qHEXyç`6V|QÏ‚`ðf„•|ˆ$'žFÙÔX/'@À–qþøÇ?ÚnKH—ÜžBŒpºœ¯Â3«ó,È=ô©l¡ÎÁ;O³Æ‚ZG½í·¿ý­¿ÿþ÷¿ó ‡ÁÖA6 àÇ3mCH»¡JtÎ9ç˜zP¥Ú&‘dÎV¬Xag!åX¼x±10%0ÿùÏä'ª%‹ä€q‡E?'¤ª€ãc jXlfÀ‰sæÃëA8ÆWú×QʨtîÜYî¸ã™?¾þŠÊ.¾sG-®@ TMjéDVÒÅl;' Ø»ž-yY¹ÄA„±Z¹`Á3fŒIJ pÏâO>Ž Œ[p²}1F漇Há±…Á9 Ûòˆà#,D «Â¬ÀC´xšù™ÄM‰༠˜i°…d噪†øÝyç¶+ê?ÍNHÒ^Ü#jÛ¶m‰ó­IœÈ¦Ïýë_7£r$z;wî´¾Ìiè0uìÀ÷½ï}~î}Ý üª„Ÿ—½°2' 0b«^Æ]6Aâ‰K†),x@ P9 H1Û%9a¢þ€äÙü P¡àwöÙgÛ*½'] /{y^T.P_+̱«ŒïÑœ§y´pá_80ìJTÛ¶m›L™2ÅlœØ«0—ü^ S“ß;ÓÆÂ[Ô²²ÏŽPœ—Á= FpáÂ…ù  8Œ6ý¼*öuïG+;ø–µìb¾óïÈsÏ=gj¯·Ýv›aF˜ªŠEMîÿQ÷@ ‚)fð‰“Jv_âüƒ¤c"Ä1)rZ4¿pÅCàhÄ*W^îœèðç£Å÷pq-áéý8î‘ZáXÉwbÚS‚Б(üêcÇqÝu×™4ï°ÐùÔ¬&oÚ´i†7L8X{ÜÃÂW‘‡’”=6esÓõ‰O|ÂT²0ÀÇÿsŸûœÙ‹¤•C[yW(¢˜@ ÔhR›Í×hŽ^y&8'²8˜Uàþýû[D'ÌðçÇ32×pÅG¼’?gè<ߤƒ8ñ_ò}Ü;Évð{oú8«ó¼Çy$¯Ç^‚š“j„üp` ÎüöØoï8>++Ëv‡³5ìýŠ>çýoøðávN[DsŽ*Þ÷ B›] FŒaÁjjÿwæ‹ús^È7Þh6wßúÖ·ä»ßý®\zé¥ùLÈÑp- ïx_õ „ cC I[J…ǤplÌ'9Ù³E&+ñ¨E¸«ˆFò¼jꌓ HMÅ¡2Ô"ÄW£+C™ªcèó` Þ´­½YAR“¸$±¹ð m×0$"ì@xýõ×s¸»k2f5­îôp@ Pù¤mÄŽ4§Ÿ~z'JY™uãç2K0*H@°YHªÄ•*¡ˆTlºwïn¶6l°±'¬CêV0hœ·ôûßÿÞÎúÁ~ ßÿþ÷¥[·n†¯3qÅ;V Ø#$!•£)}¼*¬=ð/̯¸5°4D%_!ü*.dE†ó]‹ TžÁ€DgƒaÏ~ܱ~0ÅÌ6‚) .1¡ß®àý„;“…+_|âfk^!dç'vÅò ÛýË·•7u˜ p`ëh¶çåàÌ/|á ÂNY§vZ¨dUÞæ+Ó’1>ù÷ÀO<ñ„Íþ®L3‹ÄJ„€KËi‹ôöÀ¶ã[N÷+n&Ä÷q€t•Ú€†9fâ£ý¨pxlòÛ*}ÊÇ ¤`\ìmxÄûœõ>¶»Ò~0?®ÅCœ]«x1"Ty!à}Þ% þ\^ùEº©Õ~ÎY´h‘œwÞy6Y'ǦšŒ‡ ¨²5/ÒÛ~|›|é‹_²íÒ}×¶À¬ú÷æ ì4'Mš$·Ür‹¦NœVÿÚG Ò#ÀøˆÍ!çÜýå/±ε+O H1Ñåð5Œ@áÃU,!©XÌÓsK2 T΀¤‡‹ç²CÌ!žèÿØ<ðÀ©àœîà”ÄŠƒ`ÿ|ïŸm§,ŽZû®…Žç¡ØqWØ£ça+õñ\° %C€Evκ۾}{É"–"tÈ«Šº×lõ8tèP ®âpâ"p¯8Ì Ë‰¶¤0tÊï=[ÏÂô­_¿Þ2¡ÂŽŒ ŽIô·¿ý­pxã7¿ùMÛEŒ÷É0<‡«>0.íÉÉ1ïÕ§vU·&S§N5©TA‹VË–-“×_]6nÜXâ :=£mþÎ;ïÈÌ™3mn*qBá0XìåÇaÃHËÓRºtnŸäçÍ›'™™™Ò]AݹŸ?ǵlHâëDƒ8e›S¤VRt¡ü)ÙN%M'ÂÇ—ñ§k×®¶Ó±xDÖ‘ø1V0NðkÑ¢…©áp‚úW¾ò7nœEˆñäHܪÃÚ‚ ‚4ùmpï}"®‡ø›Äœ’¸¥÷ ÂÍ¥ÇÇVðW¿ú•m Q›îÐ,9ÿüóFWP¼ó6´@y|ld¥þÌ3Ï”ûï¿ÿÉ|²~q_tÛ{ûp¥Ý`ý]÷²¼¬£ I§EuÆg˜~ÜQ‚‡w"ö 2N0xÒ¼wPø“+#ÞNDZDÕ:kÇ÷ÄO”¹sçÚäg±ÞäŒ`ÑÂØqùå—Kw]<úÉO~bv4؉ ëŒó0…§>UÚÜ´»;úƒ«þ.®G"àa„Œß‹[·n•ŒŒ ;•0ÀUôÕ«WÛwÅ™<;vì°wØ[A¼²zÎ{6,i×®4nÜXÖ®]k*¤|{ýû÷·6ñq,¹ëÇqÇâ‹—|XæŠ}ö^ìÊ8|øpiÞ¼¹mOù'[µje[t×ÇÐ#ko@À1âÞ¿Ú¿¼Ý¡¯´¼sª¢éóÑЙ‡ b5 #‡«Xø øûŠÅ½ Ü|"H2 …‹weƒ@rbàü!l6mÚT6‰WãTÀÍÇ ªÉ®.÷Þ{¯Ìš5Ë‘5kÖXí“aª1Qµ@ HœØ„°ÿÛßþ&Æ “SO=U¾÷½ïI¿~ý̨¦âÑG•Ï~ö³róÍ7Û†HÆŒcÒF6ÉÀ¡r…ôqìØ±ö Â@<ôÐCvXè)§œbölÏ=÷œ……yÀ9òòË/KïÞ½å‚ .³Î:ËòY¸p¡…á›ýéOjÌÆ9çœcÌÏ»ï¾ktç#Á€°[éÝwßmß;ªó>_Yñ§HŽ} HM’ä–Y @ÿšŸ»èÔŽDÅ\!h“ãñTL «V.ôÿ`@*®Í|¼éÔ©“­D®ZµÊ2÷ï¢âJRõrrŒ;Àíy»«4„SÔg̘‘c,pT½¶— ||'8l]±™úõ¯m60î8üùF`°·@2£Âö×¼?ë¬3MÚAX˜ 4Fn0v¹Ïg>ó;ÊàÒK/µMÇ’  Æ%—\"7Üpƒ ™0a‚<òÈ#òØc™] ÍwÜ!Ï?ÿ|þ·ûÔSOÓÁâ Œ uÜzë­2zôhÙÁQ?CíEü©4„ VMÁ‡ÃÇæSAëðÁ1r¹˜I3ó ¤˜€•a0TP;˜?¾­P’tL®G˜þ NJ`óŽlÓúío[.¾øb#°xÏQ½ð>ÏuúôéV¹+¯¼Ò¾ŽàB û;Ëù¢ì‡?üaÛL öV0ÌÛ¶m“|ä#ö¡~õÕ¯~U^xáSáò¹oÕ*Ü—¾ô%ÛD‚$þçþGž}æYyYºt©°ù¨Q£L½kÅŠv4e#{î¹Çâ÷»ßvÂÃy¹í!þT:BRD“ ãH§g Lœ¨ED ¯r@À¶rH:’,t ìá*' ÉmðàÁ¶Ò·sçΊɼšä†¾ŠK•Ø¢õOú“üãÿ?üá¶å$aøA … j"¾°Äw€ó+ß÷&_qÅ&‰Åß |$#øC#ñ¹dƒ0ÜcCâ󸧉Ÿ3 ¼ó¼“q‘¢äî͵|ðç@VCš¨]‘.åb«m§;ï¼S8Œ‡e W9$­]’LÛº¡Ø±cG 9 ¬ zdñÁ­‚²Œl A€và H!•Ók{º«úÐÊ•+ó·­¤-Â$‚+«¦œ­‚Ú‹M¸d˜â§!ª‰€!\ÝÖ•“ä±éxã7¬RHB`BXø`üññŸ¹:‰¨P¡" Èï»ï>³Wßx¤‡m‹º¨Tá`&\¢Âø†t÷ä“Ošêï?úÑ䢋.’öíÛK›6mdüøñf“‹úÖ¹çžk*•# ¹é¦›äÿ÷í¸„o|ãù¶r>vZâñ§R! H!ÍGýöÛoÛáƒn åj!Qâu9! H9[Êd!Ð|*e­„øØÃ¤ÍÏ·­ä}L°%“þ fü j~üãËé§Ÿnºçœ s&$°-¶ºê!ÀâR?¾l;¾ÿýïËõ×_/yãï #‚yÒÁX 6…Ñ7Fžm¯a ˆƒ8îç?ÿ¹©F!uüç?ÿi*\ž/ß;Záwûí· Fæìú‡êW¤1JU¯P‡Ç@JÔŰÁƈ¹XTÀPïœËöŽŠ@EŽyaRHsÀQ¯[·Î:4Ah>¦p‡€c HÅa^œœ‚)Jå†Å¾}ûšÈÈ‘#mLòï¤|r¬ž©2–ƒ˜^sÍ5FÔ sþùÏÞÔLPñ0ôùpUÚÍÝ룲œþ*®yøwàW¾˜ˆ÷.]ºÈòåËMºúö0l³ ±[Ôa` pHQxf¡„ô®»î:Û9‹<Ž´nÝZ da±™6mZ¾–ÉÕW_m~ì<Ê6¾ø»­É€l.ˆñCC…{v¸ó­µa^ÈŸCHñs•.ÊšìV€ø“?‡86~­h‚I  ð|$8vƒ Ã³Ë.ég/âO…!@…Á}ÔŒbE騕y'¸²2øðÛqgújd™g\K~Iôi¶ý„ùÙÏ~f„»ñ@,%ÃTc8ªMÕ˜«Y©wçs‡¶¶¿Škú·;ßê¦ RlÏpüIG\TÔ]M?¾~î’qX†j?—¼²û¿¤ƒÁ`LtstÒI'ù£]óû@¢®‡¨áÉ>ÀFuj§6(oX‚)at Q¿â+VßqÉ* J¼*Gœ©Hμ«S哿›ˆ¶8~ÍÈÊ$*ëׯ7uƦX )}{8CÍ•w8Gà¯ý«|ë[ß2t0üPCñù ô¹EÌòF€ù‚•v¶e廀Á W4àñ=îË_þr~„Ÿüä'f«žH?oœ 'q}üñ±(ùœÄŸxøá ë~Î,‚þñgâò=z9<—ÌßãÆµhÀ ©‘ô¸s‡aëíQtÌÒûRvè0r Eyg. h¼ª˜ôc⯠‹™má~1£D°2D€ÕEÔ £|"/Ã,j\RIÂòï|ç;òŸÿüǘôáÏ;ï<ƒè÷àÍ/\åAÀÛƒöùÕ¯~e„ªCÞfG-ma¬{Ô e‚¼¢ó<¼Ð8üØU ÉÇe—]fêK¤ÐCØedoË–Úu©":æ·v-õÓjðìŽ0Égo‹Zµ‘G¥üð'œ§GÃwéïI“÷øã’~ÞóKOÓ"ÄŸBpü`B³VeIΞÃÝßñ=‚ÉÐ;,è"ÂÃ@—ô³ñ§B`Bè-ï¡B+U…3£=¢-Žo¢rÀy ¨Jx{$'êã[ºª™;øñƒÀ¸AÞ½{w;‹€õÏ}îs¶BHß÷0U³¦Õ·Ô´ 'vÿ÷ÿ·Ù+x[ëÛpÂYûÀQ]I•é$Ó*NÞE¥wŒ~àV¾àçøùû‚’ÇÏý‹…sA‰”â~þU@IDAT]’),º—ËýyÆUd9=ïÊ~O—€p¥ïPVžå$ ]TØAáÚk¯Íï¤ÑYÓ@ª G,̈LEp*(ûȦ‚,˜r~Í8ä*ºÔ/½ô’ÌBIŒQe>Ìc W ]± ùÝï~g[|²½''ªƒ·‡)»œ#¥cE€ï5!NÆî®Ìc¸@ (|C0"±Óe0 imÃÞ×4€NÅ$“Ðqx´Ýh” ðƒŠŽCj|–I—÷pLj`Äåì‡ï ˆ3'Ç·dÕ#w˜ðı [ˆ²Eè7¿ùM[]ÇP–0aR¹Ú›qŠì8q´!s¸_´'? “発ò¬qdÙb‘}zÀj^è÷`ppx8žKªBdúFû÷¥®„Ç¥§Ox~ž–ÇçJžÛ¶Š¬Z)jÌ%Ò¶CêañO8ÿ¶¹z¿ôw>6û³û{ögO.ù>×ß.'&yOxž9ÛÛ Ñ9 Ðã{X{‘—¦§‹?žùù=aý>= ~„¥}¡È—ÍÚµk—ŸeJ†#¼·?÷8âóÎóµ—5üXðcng|À©¼]PŠp²#²ë{Ogff–7ö‘~1àC`¢¤˜€•s°`@Êàb$ž6‹$ ,Èßñ%9Ž#‰rœb2fEðÆo4#uÔ{8çàcûX>1ãÄÒQ’ ïrBÀû>s?ÚÇÕ å£f½e“2[DzbŠ"À¶ª±ööí"]º¥’…¸ÍËóˆ|ð+lÑFOù–I”ñÑëU×*#¢té8C“HŒ::x]èmaáKú¾Ð ò<¶mÛ&ÿþ÷¿nâ› Œ|3G+kq˜÷ÂÊÊâ ´ŒÏ¾ð[Œñr:ñ¼qãF;›i˜Ó,Ø`ßë»q‘¾÷_S¯à†£Ýø%¿£òÂ$m/¯ä«VºÙÙÙòÞ{ï¶\tÎã߆´ÌGEˆm+ ‚9¾mĤ‰ckÌ9sæä¯ößRUÏÜ€õÉù‚ .;î¸Ã®?üá¶2“5ámPâTµÍÌu줌Ã0‘·Ç§Ô¡iÒôPrM”áà™ó,ÜÕѸgŽ飪YØ„4l¤¢.½¶Q&¤¹Ž·S†¢efJm Z‚Ÿç·[¥*J° ƘWEZµIÙŒpuéù&6" T çñSO‡ýekT?å½QãFÒ°aC#¤‘Æ~úéö ‰ÖôWì0çÇ¢Žð矾 E@*ðÓŸþÔŒ¹ñc\˜÷.xfŒA…«G¶)6hNì‡2Ñï½lɾOü¹{÷î&½xë­·†ƒ³vH“z0ÇÃÜàRÀ ð=á:wê,úЇŒñ€IrGÙahœò2!aáûLª_yÈ iLS¸ã‹@âK;¾9^¹óqààèá–9à êWC¥øC1¹ D¥(T .{XÇ·ødŠ:úÝL¨8ÏŽoéªîIIRTDPÙ°aƒg´EŒY• /0Ç+ChîD]`|ù T«(‚c'*TªÆŽV;•dMd³JBv¨JÕÛãD&Œý‚ÈŠ¥)U+â4Sæcžªñ¼¢*XÏizÄWÂVÚtyæßš–2OþMdå lIÖ­Rµ«õ) ËÊ%j‹2+Ř`òÚ‹"ïk|˜ìTPçÂå-ŽÒü{G*áŽôàÙgŸµ3O`xƒâÄ5}û‰^xÁÔ¨–/_.O=õ”`œTâœ8â\‘„lÙ²E^{í5S¿B •+g« 5À.•(Ž*@u æÕ)ìCÄ Þ#@™}Þöùâ) ªdØ BÝÅNs0=ôÙx NvÖYgYX¾+ÊòüóÏ›Ÿ«oñž8l1vìX¹ë®»¬l”—Á"ÉdøØˆšepf‰ðáŽÊv×\Çâ’gøðá¶"Ps©œ5§| «œ%¬þ¥òI+ +V܇«X¼-È•V3Ñ¥ö­Ã“ãZÅ–¬fåæ’ˆ­^½zÉ/~ñ ¹ÿþûíôôýèG¦ƒÄ—¯ÌÖ,„*QmaBp¨O]óÕ”¤Ã¥l©»WU N•’D ±@ UªÞ*ùèÑW™õ‡‰AúëÚ]äÒ+R CFse<,h:£ÎOš£’õÝ_‹4ÍPûõ¿öF‘iï¦ò¹Fï)+ð¹ºÂß\%(½Jï5?¶ö²’Ošcµ¿…nÙ‹19ß9ŒWˆuú¶0$]ºt1Bûk_ûšÝ#¹å–[LR”F„-t‘j0–@9ƒíýÍò é¡‹ïÿûFä3@ä#‰E½Šr1/0FáH'ÝÁüÀp°;[[û6â¨_MŸ>Ý ÇQ3#=Ò¡>¨^‘?iS^î)R˜ ¥.ÎptíÚÕê‚ ŒÛôz9XlÆ€Ýëæeuÿ¸VÁ€h§“b€Žî!ŽÎí³âš"r* &q˜pÇ&&Ú#ãÛ­[·6bƒ•J¾ƯpƒóxócÕõæ›o¶•ZÔ²83ÄõÒ¿h› v*¦]ŽÈE±7Çõ4µÙpÇ·ƒ0ìtsøuDJ%è°—ÄAM«ï€Ô/险6¤èˆäkéÖSW ô—î`‚|+ßt?/³¾OöÆ^6Ÿ€ná<÷;ãŒ3¬ú3ÉAäóscânРAÂ/éPo‚ O:ú6LÀ©§žj¿¤÷Iµu÷CJB9Žò1‰ôaøáPÃáƒtî¹çưóF¤ #ƒ#Lz=)»jÁ€8#Ä®`Ì[0r7‰—½Œ?†@f@¼ãÍš5ËVü£ C»_…µDdT(´8¿p•½ûöF{T‚¦`‚‡ˆ`åðœsÎÉŸh+AÑjLŸøAØ@è\vÙeÆÞ~ûí¶bŒÁ0+µ¸˜[*Q·Ðy^®ä"qqßÓò+~ù÷–àéa S G¢¯¡v… &.Á% ®0:&Ý?ýÙ"çý! ü=­ÂÂz¤HPE„qÁá‡ôɆ«¹{xüI›:0ž9ÓâÏøå¼\ÆÓ5j”©”¹Ô¾Ã+¯¼2Îys°ŽóµÔ ̯ª:ÊÎdÁ}F> Ÿ$*¡ëdYa]UÚŽvð6âžWÙÚ§°va`L [êåß øïÚ¹ËV¸(7“aY÷Ñ¢p*‰_IÛ °´+[Ÿ£-p|H>ž{î9;€_(kIú]au>Ö÷eÝ'*û¸æ¬ú"<ùä“å÷¿ÿ½Ù† ®òÝï~WºwïnóMeioß²n'O·Ò^nÑöÊwþÎ_¸_ò½¿#Œß»¿?sM¾ãžwdUÐ{Òò÷Üã<­ÔÓùÞ]ÝO¢{ú¸àßAÏÉ11Ý?•Þ!ºÎÓášÖ«æï½ ¨H!a`¾öøž.v&~ïizêL+½Nž¾‡'¬ß'Óôt1°ççŽðHF’.?ù>î+R1 ÞðÕ¡ñcb”å¢@`çªÎŽv« m纩ŒaÀ†«®íãõ­ì}1:mâ“Ieo¯Ž×ÊÜ6H@0~†ùÀÁ”T7çmXÙÇ­d?AÝåÎ;ï´s0¶E-‹ï&ÜqF  ¿ w³°÷^…‚ü“ïJzïéãÊ7K~Éût¿â<†w¸#Ó.ø=ß@’ðO…:ü¯§åW÷Mæ}Aï zŸ ǽéi§¿wÿ¸V<%¦´½ñXõd/gv$H6|ÅW¡t9R(ç¡.~š(FTÉI¤t©—M,ʈ™e“ª¸ª;æÐv¤_™+…´¶×ad†ÁZeïsà QÎj‹3MÅÁ½Yï‡Å _Ña¨Œ L;Û$bw€Ô0}¥«¢Ë•žã}ñ?mÀ•²—vœ"-)*k¿ƒá`Õ½pÊZ†²ØD”…󶣟Ñvš3†Ã•tøòþG¹aÖ1êe<`ç¾—ä–6Ç’åc~A÷¾´ßƱäqK€¥O¡|c2QÆtmUQ}­°|ŽxŸ,g’aL/|<—9%f@¼ì†ð›ßüÆ&0DÏG4¬.Åõ€v ú¸¶v ú…§“Ï¥é/|HD‰O=àÖ÷»ß#RšûÀRD Jªe㘰 ¼12Ø&¤4eóÒ0 ðñ3ù±U‡÷ôï߿ē¡· Uõöð<ÊújõÕ]Gvë6†èV£¬"Rö‚úm@+д]GÿàžrsO_*Oç˜@œsPÙ¹jT‡+¬íü=»™p²-§Á²# Lqiœ}ú‡ê{Mó Hõù<|J“¶Ç1ŒkÕ‘wõ0«ƒÚ¯¼ÎîŸßŠu9ÃíYæ_Ábf­#ÙõeĈG”1?B7Þ6l_ÉXÓÎwXPÿ#p>˜×yNâÏ=8†‡!¨4ý“o›ŒHz[PŽ‚ýWXyR¾%ûË—W»Nj'žóÎ;O®¿þz#ÀÇ’¥vdh¶û¤ø6 œÓÛÁð׊ùxl˜kwL©sª,©¶82‡²{C;Ð&lJŸc«Ð]»vk;Õ.0£¢úÀ±Îyé2¿°]*»a8ÏÂNYµSz^ñ\ö÷;/ûœ‹—beYÄ-²´  €ÉAÐÞ‹Ñ#\y#Pj„Ýøq€ »&0á32ˆ«#š¿®Ôôý:©û¤BÚ6¡è{ŸPxWZç»ø0™áø°KRÊY j\]’ø°¥üCþ¬,cÏBŸùÌgÊL ‚ôƒSP/¾øbK—ÕÄ’8°§Mà¹J‚SIòMëšÐZ›h ?&õ‚\k O_!}ƒNDZ¼ÇŸI<Ù JçXß1ðòƒ¡Å3гß8a²×ù 7Ü`{´C? jXµ’'3A$†´ ãéÅXwtà8è ©xYŒ[äÆ÷A;žÏ90…9FÊ\¥ù,h(,Z{†œ_RVíT㌠WM ¥àø9ðqÁd‘%Sô|eBê©õFé¶È©Åò–Û¬ŽÑ_NS¹Ÿ?;(þÞŸ“þî—ÿ®0úŽr–Ä%ÒqŠ1?’¤SAaKÌ€P?¶YcbgàbrfRf‚H®F•¤ü@ì`¡Þ±'w¿¼¿t‹ÌX¹Mvæì—vÍêËÐî-e@=}TÝ”…$kÓn9oP{iÞ¤~«â€NºÉ•.ÚÒÛÇ%ÕR«ú”ÂýYqÂÏËeë{OºººVGWÚr÷ñ¬³çs·—úu9x*=–Ç.úJ™,OÍ,Á˜Éœ+ø"6?ç*´iâ\¢ày–>«ú{r÷ÉÛs×ËÒ»dd¿6Ò§Sóüòz¼tÜ“˜'1õ÷\Ý=ñSØÖ–]9{å™)YÒ´a]¹èäNRO%b0¿àNÃì×¶2¨ Œž±ZVnÙ#WÞEÕ¯+Ë×ëi§ëI›ædÝÖÝòää,Ö£…œÖ§M~MeNÓIï#¤­ÿ­,”-9Xø=ÞFoqÑ3ø‚3ß S¯ÂmëmMj&†¥Æ+,OO/‰ÙÆìÝòú̵²yç^i©õŸ½ŠÙö=û¤}‹†òaí£êŽVM„ô-/îóž=m®”Üò ÔQÇ9+·Êlý7°´RŒ÷íÛ¯ý3Eñ½©ßÃüµ;äÃ;Këf -/ªïy8Þ¼ËK2µb÷|oóéƒß ¸;–¨Á¸¤³˜IY0pA2JÛ$Ǻ‚ÚLvîÙ+¯)ök´¿5mPWêk¥®[wï•f ëɃÛI›óûÒ:¤¼»söɳÖJãudä€v¶‚¿¿Ž:&Û\pŽõõ¾‘ò;ôœ y¨íÇ:¤ÆÖÑﯖ–MÈ:¶ÒNô”ºc-™¶x£,Ôoê|ý~33Rß”ùi^…}OT,9y¡lÌ/ÞNôoúyi¾‘Í_¯[’ê¤~Î`|Riž®¾.¦#^:SÖþ®˜ÉŒâ‰ô3®Gû|‚Û#cn‘‰ëvKóÆõ¥gû # ø@gÏØŸIÛ ]ü¨Ÿém‘ò?„-j>mš7”Fõé¶çëOk"u ´hÒ@”o5æc·2…MZ%çöi)Râ¸ÆïØ²¡Þ)ñª×Ýʪé*+å£öß¼Seâeª%ëb/“"Ï‘8ó;š#ÂÑ6^6¿^‰z––/î¯~½ºÒXÇÓÕÛseþÆ=2¸]cÉP˜÷uóVŽóqÔ“}ÕªŸ—Ÿ ¼‰ '^ÑÆ-É–3•¡ÃÕ­{hEº™ö-I½<†$™a=ô¾áï SŒ*ì—Ä{˜cùv|¬£G8N¤ë÷\© K}Å¡Iƒz’­ '3×m—^ÚïÚfÔWìÕP<#/#ªB8Ö+f®Ù!­›Ô“³íª æù%ÛüôO/Ç!¿C}5=œ·Uòô´µÒ3³¡\vjJE*=ÒówT/=-ϯ +õóqƱ)(\qß‘†§G™¿TùxÖE«½ûåÕkåµE[åü^-ì{Ÿ§˜Þ?e­úÔ¹¢½ŽåÕÅÛ¤{«ÓE¥| !¯/墾þ|„_ÞŸ|ŸÄ'?Õéuô4-Œþñv¦¼·r»ômwPÎVüpîÇýÚm9òæòíÆ ¦üÍyþÝPžôñÉŸé¡Þ—ü{ ¿‡±Çß‘vuv‡áŸÖhI¿êŒA®›–Ú率n ÜD·å= /a@öèâ_‹Î¢œøay¿`Ê¥éìfçïaày]Œ=Žçj×Ù4o`ž‰ã‹È¤µ›…µ k ‹#·®7)Œ}“JUTËZM[H­y»æQÞ¤³zäUÆý´?ܹUjåî’ýM2eû®›wsØ%ÎÃ¥žÔý]_KÌ€0`áüêåõÆðç_óƒ•wÊ l”³º6“+GtU‚²Žœº=Gþ2v©L^²ÅVÝ3Õ•L]_¾a§lÌÞ£«X"'uo!mtµGdm“ÝJ‘vÕɦçæºº˜Zß´#W‰çzw·NZCºµ”ΆUÁYË·H3%R¹_´n‡´Sâwp·— báêm2oõv#ˆtn&[7±‰ªq=pó†T½½—§ž*Ë_ÚÌÉ2­í|‚[´v»­Ì]Ò³™,Þ¸[6j»´WBÓý³6í”9YÙ’£ @ïöMå„ÍR«¹ +æKÖï”n­žÙº*zü¼á©À°ÞNŒUžÔÁ°_°:[nZ.Ãu\ub;Ã’~– ”0n¦ã×@­cû–|?z³Æ/Ú ·D™—¹ú-áhï¡Øä$Æ(Ú,{¶m"íôœ­ßÌ6Åz¶ßåÝ©’•ÙúmemÙ-´ÿQ)rÍ—oq2{UjµT¿Þ­Ð1“om‹¶mº©þ;QÓ£LHÉç–Ú¾ÇÚ.V±þ)è;ñv™¯cÂëÊ||jH[ùð†÷ðÞ­¥ÞÄòâœ2XÛ jç¦õdâËT’Û]Çð~š¥Æí³Œ=ŒSÚ·éwßÕ¾ûZ*U,Õ/kóni¯XT˜G6ïÈ‘Eº@Æx±C%`»T÷‹5ÓæúôS 1å[¸&Û¾Ÿ“{´´ÅÙ:>-ݰKïkKýzéBÍÞBÛ¬çè÷ÂÖJÛc°¶ß¿–*ÑÑ*˜Û¤c/eݬíEè§}„þC»ÐV3Õoã°öúOCí_émæØ9®\½/—°iªLp-êÈÏëí÷<;s[e*-!Œ¯ú%Ðùûër+w+ÞÉÙ.’©ÌG¯ÓDº¦N‡÷ïéëûzÐëÔ©ïÙÁ†0ƒ –zò<êÕãÆŽ‘éӦɕŸº:ÿÔù¥K–ÈsÏ>#ç}ø|awË+–Ë'.¿\USS[¥Ïxÿ}óÚ«òé/~Ez5Ô1㉟I­ÕSå`}UÛ§ŒPÆrð„‰|ø R«]B˜…¼/Ú?d­ÙþùÓ¥î›÷ÊÎQß~°FÚªê'ô`ÔºÊT¤ß'ÑbÂNÄMzUÔý¡e”cÌÑ?æÒ$c8äE\­„Èn †õli̯!†¾v^OùÔiu N¸FWw'/Þlj7/|°Až}oµ1«”€¼{ÌRY¸n§ìÓIúÑ©käMU­ҴÿòN–¼U‰Ó¿½¥’¢ÆDާؽ¦DŒJöÎ\ùûä5²B‰}Ü6}~ø½5’µq‡Ì"l’i˶šß:©"Ù`’fáž·´­´]pÖoÌÝ(;´-·ïÞ' µ]¶+ÑAû¾0k}~¨Ì=01KUcöÉ -ëŸß\!3”Ç­Öç¿i;¿ «©Ôã%[åQÍsqæè¬•Ø1ž8 c†Š‰3o0h(±ÿ°öë‡&e)ƒ¶]øyL‰´7æo¶Áiœö÷§Tí b—6ròJyN±Û „ΣS×jØ•æÇê}=Ò×6š¾d³üaB–~ûMhžƒ/ÍÞ`Ø?1}­<ªy¢–5íNù«¶›÷ sÖË}Ú‹” ;O¿1½Ÿ e@¢h®’àíßAQMŸÄ¦™……(ÐG=èaíK¨dÍTŒz{…lRü‘Œ0þÀÁÁHB°þ]1B¥0K™áûÞZ!‹õß˸ù›ä!ÅhŠª¨NZºUǯ,yú]5’×…‘×µ Ÿ˜²Êú;ê]/L]%/Î^oÌàhý6ž×ç­ú}íRé QŽ2žÛvåÚ"δҶ}qÖ:#¶!ªÕ1÷¦Žã¤úÏÅÁƒpå²”`o®: F>ÉBtW¢§2¹|¿´OC?÷W¦®Ø&Qlg*C€«êY/+^m”IY½mÜ3~¹ñtÁ—¦­–çf¦°£mðŸwéïz §bù¼Î'ÿÐyãÙ÷×ÉÅw†¦ûìô5†#龪þSu ƒÐ}sÎ:›ƒ`¼WêøBÛ²†”°¾ö™ÚŽã뙺xòW¾ £_ÐG˜o`†øßѹšÿ“*Í£*|¸:7= ã+傉zhÊj§iPp)¨Ý(Wuv^g¶©fS—¥K—ZuyäyúiUÁQÇ&wÝu—¬_Ÿš³jŠDÈ*_SÿÔÖɶ=uÂÔ…ëö'êµH»Þ††ïîHß™2y²üí/–ys稴¢¬ÊÊ’?üî.ykÂÛ‘͘äA™úÞ»ª®›R¡Þ±s‡,\°ÀNƒ_ ×¥K«7oNÓ¶ggË´)St6WdË©ýÖßåà®÷å@ÇAr ó)Ê„l“Zÿü™ÿ¸nn”Ò¢8¸[·o”ƒ¹)ZÉg–ƒûsUò±YéP«Ñ¸˜ø„ÔÝ´Rz·j¨cYð¤¾ïƒ{wËÁOjaËD†ãèJ,)¼¬e3ˆmS¢Õ@$8&R&ql=Ü!Jߣ¿3{gJ]‰j2i…L\¶MWïrt¨®|¤o+]]l!ûÜ:³ÚD:¬"e+QuzÏrЮޛ­“®U[t5©­êB“O3´/=¹£m½H–èä0D‰¯·”(ê ªŸ<µ³MÚwŒ^"ï(Añ1]m†ÀÛ›ê#^Äjw]­ÌÖÒ­9rnÿ62P%oiÝgem—ÓU‚w¢âÑzǺ›ªÓ‹ÓW Á3^'û>ú1\7²»MÚ¾¹LviX¾ &¿†:ñ&'Áú̄˧Áª1ŽÉw‰®Ö®PÆój¤#ºrÌêqՇƩ·l×¶Åîã]Õ·h³ éœa«0»”x£Ö)añšjgõh.Ÿ8µ‹Mæ÷_&c”@æ…UDúÖ •Š ?eÁùë¤Õ²^ã‘§ô–i%ü“OR+™¬bãèû8üÀu«2e× ï 'õÈT¢v¿ôUiÕ¨~ Í–âxžªBxnܶ[Þ\±]nÑI†ŸÐZ&Íß ó”0…Éc5™T'j?˜£Ìþg†´‘3ûµµ|ö*~äÉ?òƒÐí®Ò,$š«•P¼ýÕŪ¿ÇÞZ¼E†wj*WŸÑ;ßû´-ô5Z•sIì‘âàŒ±Ð+’ÚÑÊ`õi­8œÖEVëBÉ/__&S•>»í›ØŒ`ó6iáf}ùİŽö]üáõÅ2^‰Ò‹TºÓ×VUµ‡XéþõËä$íç—ë&”±~4feþ U7ºjp9k@[µ›Û(÷j?¨’[l" ^»µh`}`ÉÚlÙ ãî™*u>P;騔u7Ë+ ·X¹èx¼L ø“ô›@º…«LÍC÷Þ©ß~s3\í–û&:žÓW÷(ÑŽ³¾¨jqWH}û÷êBÉ{ÊÌuR)ø,%þki#"ëÓ±¹¬Ô6jŒthÃÅr«\6°µI³¦.Ú$œ¸J†©T¥µªxÒßÛdÔ“ÜAºµm*ç­—Gt^aìƒIY¡ÒÃK¶±µLÅïšaLRˆD…ïk½J"‘ÂÓWš*ÖŸÔvo¢Ý½µÜ˜%¾S~úu…ÁŸºf§|óì.&~þ½,yeÞf“(¯Õ´flØ-ç÷keR‘¶Z¾Fº šú¦*S«YsTèV«ûõë—¿‘D§Nò7aU»OŸ>ùv0Éù¨B ™Uú0X3Éì×qA siÐXWçhÞyLBž$ éË/¿$­ô<©Ï]{­I86¬ß ÿxðAyýµÑ’Ù*Sše4“¾›„dà‰ƒlÃ’zuëÙÖÛutq©¾Jš¨T²OÕU:µuÛv)•­ú}êŠêÁÿMjäe„TZ±j±Èï/Uñéde:¶ÈÁsEÆß¯.H´(O¿Bj÷;]îÞ.ÞzRjOZö=G‹¯q»ö•†säü=º(ÑP¥°Z†ƒVÊÁ±I­*eiª[nŸqµÔ:ñl)íXTòéY”!’žtéžê¤è¸¯æ²êÃàÛD'S&áNªÎÊz“ j ÍÕ`‰çue.XñÕ(ºê•€Á¹=ñPQÐ÷-›Ö—æ:àï%au\zkš¨àZë•>ʪV®QÚRfd qÕ^Wɸ²J ‘U5öu%&ÚMJØ,VõDg‹•°‡°ÂÐxƒ¾»vJ¤ƒÆUJlâmTƒè ú·Î·ÁØ1C&)Ãè°±*éí̵¶%~¤CÛé+ógus‘ªM<úîjiÕ¸®ô75¯ Ë]îF–+6\‰‹#­&ªî€N5+þ¹ÊÔ Tµ òÂ.äÄŽMe´2%Ö„m­*~ÝT5G_€(p"ÿÊìRåKÒÛîЕ±F™5FÜ=Ó˜|°‚¨d…öàÁ-Ú×÷š*Ì jmÕQ¢ª‰µƱüp0ƒ;”y£«É|gÿÏÞyX]]ùÿ ½u`†7ôª¢" *Bb/¨‰¨I41ÝìfS7É?a³›Mv³}“é‰%‰1Åš˜Ø{ÅŠ"(½÷Þ‘ù?ç÷Λ;7ÃÌð` ïÀ¼_»¿{ïïœ[N½7ÎÌÀ,µ¾EE»Õr`ÏöÆÇX:Ü|\ªz¶[onm(4:¨mÔXt—5‘ž¢ .R=eµ¡þЙªÓþq©FIà{K‹­ÍÔ±)‡vƒ•˜ñlŽ\ôHݼs¿‡XõéÎÜ%Ü# äR Sß=up±ÑÜ2µ>™à(¹nþ¿>þ± äerƒq˜2eŠÒžËËËíÏŸù;~]86S ôèBßaò[|Q~°rzéO¡¢…ø¾a§©³öÓÈËùSͼöZ­P™¸fõ/- ¹á†°F ËYï”Õ£\«Éá¾÷¢¬¹ÇiÕEâ èßie c‘ñ†Ø+Úž1’ƒ*$´`…aT® >å8ñ {‡ŠesBÑ-´UYh†~"=õï¡bùÜpà?ÔDüfhñŸ×‹qÕãÝkB‹e/ÈeèDYMÞ -ç>-Ƨ{8pÒÙ!µÄ,#—VfÂ.01 L,ø ÒôÝùúºpÝi%šL;„-r!á4aDÏÄqK˜¬`Ø 8ÀmÒLâ¤kM`©Ê⺿4g§UÐ’î_&KU_é¦9 !ÎhàÇ¿PŒxxZšÀwŨ‚{¬ ¸K¡AòwŠ~‚0àt˜¡„Éwiš 1$€— €4ÜæfW1\çŸÐÇÎaŒÐú19_&râò¢•~ô‚­ý¯c<‰X[Q^ø]“'nZ[uŽf™úò¾>3´-ší¤)uoOúŽNÄ*Ü&·)C‹ÃiCŠÃ³²h<-×Ú³1Ä àuw¨u²!p¦z'>ëyS†u +dÍøëkC¹0,P(h”À/Upü‘u ^( ti>uQÄÃóæàÇÑ.ùÖR Œ!´Ñ1eûÌ ”à!ig­4‰1îô”¢dœG„¹1È8dg,sôÀüB'Ú,@ž÷,\·‡i ªø&ÆÐqtˆÙ"ö\ÇcãbÜ_ˆ%)¦—¹•²|–ˆáÆâPš—Ýh?}5o¬Ÿ»Áæ ®°ñ^õzCLº¦[Ì‚jÒ7§\¾‹;ߎkS©”WŽëgqi0÷·É .¢x â:O)ßJdµ@ˆ&hè€Bfxïa®,*<,«W_YØX~«¾Ö¾µü²Oîgíþ Y“þ€ÕW1WjÿÔ“ºc¹tšÐVA&F…•íËö‹Áé¥ï¦S´2ÝDÕ‘X¶du[) Ì5ËLÑôJË®ð“Æ@Üî H9F0À@ÈÚŽŸ¦@»³dZ|6„gBÇÞ2Y/ aÚG%ìk¯!¥íÝ»%GX³fÅuØæÐºÞ¾m»m—0hðððƒ˜ë¹³ª{Ã1ÜïÒ  H¬nÑì;ÃEË^“òrÍ -J†„Šk–f´Ÿ„¢^á@×þ¡Å#Ÿ–Í-fÿ9„”òÿ»×4PuE7=Íû™ ¹õ¶êZ´j'ëÉ<¹x}%T\ýÍ.ÿt¨Xðf(šu†|§ ƒŽoP+Hå¨iŸÝ0?´…ôjÁ–tw*ýÏ/É·Yþ¹wÊßö¡E[-`M9î6&=ªÊLÄ3¯•†›Á¸‹&Pü›ß’9Í=ù#Dl6&9ùN&úM{´Q•Ž4jü¬&gòܦô,˜*nJÅäC°ç£ ðŦ•t»4©77pö àì•;Â9C»‡ëÎn˜” 3Ç÷“&»•’æf£3G1ÏÎ[¯¸Œá».’{É&Óø Ñü¤b)^”ë~ð/jrGƒ'2ɧRšoͲ¯ÈošÀÐç”f™´ðô5­¦èÃô„byîyeµ1¹;wÐDNŒ´C³¹Åÿ®ýœ'× &thO{A°ÅúÅê?øÄÐNUÝNVkÇnå±MÎÔqܤ6àšU+ ‰üPgk߇íQßÁmqÕiP¥ñE#;_4Dä•~Å O‹¦oKP¹õiùºŠ)£¿AbµN“kÖt¹í<¶bGxF.Zƒïå€{ÎÝ¢É=,'«=Ä0ìÕ^‚ä[ÊúÏò³_ îÜrEÚ$·ä¬)ý‚?Æp ù¤v·P<üÿ±.=$ ÖUÆÆž­»ßµ´àKÄ4¢ÑÞ¥<þq‚If¬NT¥m:ni«ë• –  `¹rÆÃÅr# «cî|iþ)Ÿ÷é;^×D‰/«åòøÌ’-Æ|³ò}è#h_ÀôŸ*W¾_Éõéá×VÙXr×ó˽RRœ3¤»ð¡¥¢E‹ÝRvà®Ë2ïÏh Ÿ-Ý1²È"?Ü®¸Š—o²ÅEFÈBºExfÌÀºG€øÒ4.‰W{L4Á}«êFA.¤SÆŸ‘²^¼®ñç‰%[µ’#ù™°²pÓŪ´2,—uj±ðË<ÎéS/ɵêiõ£W“ö˜ÜqÙë! ¿µ•C>X§pCÆ‘wXû‹“S ‰êÿkÅwÑV#YYX·4šd£¿à’#À1×ù1Šžcð³Õh -¥‡o#kÃj¹=ÿ@3¾Â.Å„®Y¤ø YòÕ—\He5¾gž~:|ãk_ ·ÝzKxgÁ;z®ñTŠ£1Ç ƒ† O=õ¤Å~°–·¯„—JÚ]‚h>ŽrÝ×ÐÚbÞ¡ÅýŸ Ew~2´øËBE‡”&á!¡ˆàøö Nùáîþa(šsŸ¬çh"Õb<+eñ?+¥Æ„²ØTœt„å«vÞâ8Yràð7mеÆí1C‹öÝBÑÀQZµIï/{C>©»•ˆë–Ü9¿ÆâÄÀd}ÑÉ%  [cn:‹9ÄæÓú…ñÃ÷β< –5‚eZVé¯Aš¸‘± :Ĥ~‡3‡b~–4âkíw¹{¤b\[Õ^æõQ=ÚJÔ˜ÁËäÚÐ]¶C‰\`$fœÎ2Žr ˜(dPZLÐâ»ZE ÊshºGÆh§ Ì1¬˜„`Rž …W‚»ÇiÒêâžuÿ› ¨Ò‹g)Æâ¬‘=Í5bºökÙ-æò.c"Œ ÖŽÕb`Ð^®•kì„!+S¾ç•w6­ù”ŠIí(ºá¢Ã L DÛÛ4Ábq)S>0¿¥ÅlÁàQo4–U·§5)³®#zj9^¥#ŸKÔ¾î{eU¸ãÅ•ÖíÆk_€©Z©` áj0…ÌÚ(Ѻòoj@{£oÁêãP,! þյ߸»O)ßîï0ü3.Ò_Xyéê“û„Ç“ð†“îÂ+‚'ø¥ ¾ÑÄT?¸vt±1×ÄʰhËϢх.ü¡Á`؆é-hqñ)ýB§9kÂkJ‡ãR§g CfÉõÃÀ˜©ýf£?¢µ­¶îÚsƦ Çö ÷kŸ[°LßÂ=­;¶_D/ð9qD/s™ú£™úÊú0Xn=í$psް@ƒÑê—Ž[Ê€Þ ‹¸cÍWb–©Ÿ>¾Ä´üã‰YPêrjªK¸OJVŒ+QŸ£þ=ÊTYº´2]—Ö&@¦ÄôL¨>Ûü¡U€G€Uð.–U¶ôˆbW$z›UsÆè‡’Ø$’MØçUÅ_,” é„lìB¸Âåê! i¿|b‰åyþnÔŽ«Û•ŠÛø«;—ã…?,k% S?`¯¢’öʪycdÙ)!…¸—ßKÇô ÏÉÂø; G%KÏQù€Œg¬BGÌâ ª\¿Gótn/ÚЧø^úåÌ“ú„ÇÕ/ŸÕÇ*Œgïa4"a‡å‡§±whOÓeq·b¡DÝ–ÔöXú¥ÝÆm·ºóc 'Çö·ª3©¿² ¡˜õÐYüåYØ ÅQ§âСø¹J±’€UƒÍP—/›/^ö+ø—%èwhߣîZájâg†›ñó°y“Ð8QµUÎ֙жçj—ZÏçÀ”¯†“.·*˜ý@(ºë‹¡bÞìp€¥u4A&n¿ƒ>$_ÜEÚo`°YWŠ€Új5VËP?­ÅŸ1ŒÃé €M/EË*bÀ ÒFÍ~¹ˆñ,¹™>݃šG·ÔC”Æ€©Üj&+ø×–;tí¯â‡>^ /Ì!pŠ‚*YbAÆêúI)i²ß5FˆÉbÎ[ëÙi„XW€åj0'Þ›9±,Ó` Ñ% 0`Ð`( 3cÅDNÞÐùü“dÀl¼ÛÔÁ¿ï;]‚ßiÃzˆiLš ÷x~¶‹3Ä,1A°ÏÍ& ?K"ƒ€Ëž™’бß²G,‹Ò­ g(x™%yéŒLäLÆàFérm,š¿MhËÿò.Œ®3_“4Éž©{Þ&¦+`w‚ê #cuýäòŒÀZ&¦ïºIåa£êJ‹ÈNYÀhµ‘ábʽÀ„}òœ7KÔD~Æ”u3—wá Úì‡ý´èD@.~åÄgЇè;¸¥Ð—åb±XÀÔúâ,÷Š–Øñ„Ü^1[óÝv7Ƽ Ï'¦Ìô “¸Ný“:QýéÅöœ/k šú×µ2mÀ@«DùI0–T–%º?5mõ ¯>Îל‘Œ!ô™b Œ;0õW¨ëÔhÃ÷3þ)w7„jçàº]3q@¦_Á:*c˜ÜƒÊ% :½Y*–ø‚¡aÐ=€œú°`}ŽöOÿ¸álÅè¨ Mz+òGÉJ…k, ËÊÉÎî4Ük½½UÇ+'”ÙÒ¸Äæ±÷ L¿±8k€µQ¬¸¥±gãëTYóXΫ ôaŒ÷gXX’\Ò¦=_ܽ“*Çþ¤€ë«EkðÕF} /–d-×)\w»ªnXNËHs±Å@@Ç‚…õ‹¾æýí-š2VÁèÞߘYªš¥ÙÉ ¾ñƒê_¸KbùGðÀ-0Ú¥Û˜Ý(ü0p,b€”Áv¿—Ðh†P2RñR²l_§øˆ{C8õýÒâô}¶iq‹®ÝÂ+¯¼FŒúöíúõïz÷é–¯X¦åmµt¶, 0;(O2¦‡x (×<×ZÊ:Ѭ_¿>lݺ%à¶…@³~½Ê§çá]»8}ôŠÊO´ûXežøb«d¥Ø,WP (_xN1 '…Šû~¦%û¾ŠÚJ!Ñ¡¯ Mvk¶òãZ9?á|@P=+{±ˆØ²Šu‰KiؾEïhõ·¾ AÉÇdžÙ¥˜˜a0ùsðv“§OžÜ7mO¢°³d¬d’¾³É$Ë5“†O\³[n 0P10ÄÁ¶<£g§‹ßiêçÙßç4 ¹‚Ël|º…Ŀۛ5{ ðçûÏüµc樥Kêz–[®h²Á¿O½œIàÁ¤€×K›ÜÚƒôOÜ–øÖì6§mìçñ·x]³ñÄ}*ä¸v¦Çi b·D‰ËccL³óÎn Þi?¾ÿ ¸§_{þûdÎ~^nz¬¢5^A¼ÄÜ­“ûÝ9²œ9ã§fe6µ{ÿθîà?nwÖ…“¸ƒwÞ÷`d?Æ%÷â2È'n«N;þ²wã>çã [8ØãçY-ç(Fá†Óû›%“<Р7fà»|?(¯§áX<óqÚÄôñ4X¬Üj•ý>L¾3ú¬ Ž”¦:¼çJ.¬ eåhâ:“‡% Ó$aò,M#«Lò,ý8ÝÞ“œøí'‹ÂñZ¶K àyÛE#ý1|dÕÍqÇmž[{Mã ä¾ÒÏìUCˆü,¹$KPu Xžºð|¸æ™¬âÕ½ÏÃäYÒF“ÔɯçiÓZ<ðÇ‰Ž±sp}2¸Ñ¨á:F‘§=¹ð{Ðs½ìïÇ•äÝ$÷ìv‘y–®e9ä*ÓŸ5§£ãÑqáíŸoÌÆ÷2t¶ãç™|,Qv?ª´py9¼ìôâ yVY®çYùL¥çxÏ^nF?Ž×¸Odã&þÜêžUÒ ´ecû`|œçÁø®B½@®ççÔ´Ïý{Wm×öíé÷t|m’ÖšjæãýyB“ªÏ ãUM…“¬z5䬞¼)aâ¼,FP®ªýĘ;h<ݵk—¹V±‰%.WŒ³;vìld tÒjWXAXú|÷îÝÒUq#{A¼Ç–-[jÑZñ#}tÔÂFˆóÚ¹s§=-$T 9Íþ f'ÿ"-¼¿üdw[)ÏVÝJÂÎöŲ¨¨Ž`°ÈiňÚtêZŒìvíÞ#7\™Avî²2ŠÊÇ&ƒÐŽVÏŠ.%á@çD©ÔB+Ѽ»ssh+AŠok(hp„Ášñ%rÙuZqsa¼4¢îCîƒ:©*ϵ^ºV^"ÈX|{1%p2[T^'4¨œØÌ©Â–iœ«¥EOQÀ,GÉüíïg¿gIìÇëáÇô‹VÎÓóUå ÍüŒ•¦–j_vXFs ÆM‚O–1Þ®e! ŒÄÏÙÌ–à,´Ìµpæ÷@ŸŸ³Å‹ 6ZÜAæî“íÌWL÷Ês§iÒF*ÛBBê xÉUÓúu|ÓX“½Æi_b;ø.®¯ÌœóÙ›p ÐÀagidd®•&ƒeFZ˜ªùrŸzM+ Rð.®:q9äë×Ï#¾v¼äYR‡LÂäµ&ûK00ô€.ü7p=TK¿äLËÇ|o%nÒ×öL?JTù,}~f÷ÓcœºuÃûŪM;µâÕf[š•ªJºzߨ,ƒìÒUj–cÙrU¯ 'hU0–šN¾×q•ÆG‚f TƒÕVÂJå†'%µk¿g9$Ùh©Ü]6^ßÁx•¬4æe%´wUG“˜®”•}ͽ0PÀ@-0n§_ªàîµZ{ª‡§‡pÁ7´¼mÿ*ŠR„„uëÖÚ¦‚¬l5hð`³t,]²Ø„‚Ïé·]»t %HV¬X!¦¾ +–/·%zÕc%´ Ûwl©)hvJ°aIh–.²¢Ⱦk÷®°mÛ6 ,ŠÓReî6¡¦{÷bK3oþ|+»U«V&¸ìÙ»ÇbO„"/^d–•"¹SmÛ¦ý´±!«vµTú}ûöÊÃꀮ[‡]ú&æÜíÛ·…TªÜê] Ì‘$ .€8µ™œ׮ʻœ #ëa“>¨óõñ9{¼¥¥A?zö@‹%ðAܱÄ5“pzHŽé‹µ[v…_½°ÒÖcŸ04r¼ó—Óe1Ð[™žIú9÷2Ϫ¼“•0zÖÜNãZË>ÎYg+Œù¢1­øv¿fGõßi/‰Î*KOþUq–MÇl¼=¯};~óêºpõØÞ €OÞõ¼“r*óËÎËÚDšúûq{É.·ñ_'µG€gW󷵟Æh­.åÁåþ Ž’¯S÷i©WÞ¹öÌ”õ‘\8ËþvOÊ@ìJÏÌò×@\Ž_ÇmÅEéx–í‚çù{Ú¦vL(‘ÔzÓŽ=áæ—×Ú®âýµ¬7˲.Ø´1 Ô>Wiå+µÈþ^¿>ÞrášR3ïE ¶hS»Ÿ¿´6|N±W ^†ã–¤™÷t3zÕ“4écüm«%|öšðŠqAÂGúkß’€}ïëkÂÇ'¥´Xâ²ã&>O¿Råð”æ©»µÏÍOîkŠ2ÆeUwž¤«JÏØËŒÛ™?+ (`àð„ûÕÅŸS…V¼"лk{±(,ëF+2:h¥¬ví´•@ª\Lý> {lþÃ’pœ}Ò#L¦·Ø9û•¶Û>YE:²ìö~§kƒ@ñ¼ ´;v´1a·Î:›Ð¸‹¥¤­òh«`öÒR Gz¥¥¬-/¤yW+†vR Nß¾%ôNyìÐÎsêBÝö(Àý€Ò’Bï÷îÝ[ d%ñ–¼ÓÐðHú«a†:k¯…vZ‹Ì Ú•ڰ‰ ¸X㜥'Ñ*-ÔZék¶î óVl '¦ºK»x 0Y°9Ë1²n>Z'6#\¹i—ö÷h-«‰Œ¸­wš6rTß¡Szs-Êb÷u¬#eÚ¬¬DM˜ÙõÚÜpášm¶)U¹–‚í§%6E[“"Ù¤o±6¦bå‚«}ÉÆ fC•Éž%Ú?«+\-Y‰ ܳo©ðÉ^l ù¶Ö¨ß :ÌÕ¾ݵü-Á%k·‡…&;ˆþИU—XŠw±î³j ç,ÙÚR«»°ëîÃD±$%ËU²›7»÷VÛ`Ye_݆%œÙ‘}ƒ–sf§äx‰Rö«à=&ñ!j+ìòœP»¡°˜ŸrùðX¬½rX ‡â—IãËÞlœ¹I«Lc_6T[¶)Yy\°,5Š€wVm ˵Gï°l5«—¡ÆÊŲ¥ìn·(/hzri'[T€/ ¯¼­÷w‰Ñ.Õfx”û>$«ÕЦÀ щUžèGЗ6³Be²ä,õsZâ&ö·#–“îÙ®ex羽Zú¶§õ6ÜüÑSËÃóooÐÒ«òÙ€Û…KØ„Ñiˆ,‰ŒWôVª¢­²|/xc:úÎÑ‘U’°ä&M‚0hÁ˜Æ˜Ä²´åÙ¿%©Ýµ‹y¢9–©/±·ùca¤¿t×êœ6kE¥¤„¦ùK¿(ïÐÊVöb£AÆÆ+pÁ¸ÒÒÅìãAßy[Ê• jçs5·tVVÏ£¿½JË^ •Ì3Œ,§ ý:ªß±ì;;ÖÃB,ÖÜ5R{Û°× 4bCAúÇZm4ÙUtá}–¦XR÷•Ç’ØlœÈþEÔX•.“Kú$ó`ÜÎ,Qá§€j¸ùÖZQS;g >¸‡ë É$᤭–ÀÍ,Óë€0R@hÀÚQ”ôKæŠêž×$Lt•ËÂ"ð4h4Á,GˆcÿãgWØô ´oh9ÈaÅ›m|&‰UÚA–ݯa\K¥ÅzMj=4£6ojžÒÒž'öÛ.Ò>›4™Þ¦Í»Š)c¶>ÒB"52¿¥å?G•Š)“ ›ƒu3ÜUÈýo®3¤a§µ×Wh¹M;äîÐËm´c÷¯¬ <µÄ¬4³¥¿çõu¡O§ãÂí@¥ÉOìFõ öà[ôäRmÒ˜lÄ8Wý¨·úÇ5Jµ³óNÛ]IQeψß^ƶ¯˜Ü ÂËà•ÛÂå§—™øëçWZ¹b37v³‡–oK(<^<8ÿùZyC}«—׿ÎÝÞ;²G˜¬=ZjnUç´•?¾º6|ôŒÒÀFˆ¿±6<úÎÆÐOe>£2Gˆ ;ï$isÔù½¦ X˜Ø÷€ ­ýYÆè{éŒ1ÖgÔØåœ>pù©Zk^Úk‹7†;^Z-+o² zÅáí̶'ÎÓo­ wËòÞÈçAÑíjm NQ¨Ü¦1m…ÆÉ2õhÃøêJ‚;_\®Íîv…ž¢ÓÚq{ÊÐîÚ°¯wX%açæçW…¾$°Šñ¾f\_@š¼ ÑÇ¡ Ëoõ3á v’ =Om¹­6E½^ãÙb Å´Ù¹Rœ°GÈzmÞÅ\ H»|J¸û Æ+?k“Éí¢Bü`Glj»C®îmHPd/•Ç´ÒS‹·†Ñ½Û[[ï%k%ÖGæ‹ß>»,ÌMŠ¥ÌZ¤yæ‚ÅêýLùõ›çWhÃAö¨/h¥ËN.±6МèâôÉ÷1¶2å;ïB~M6±h `@¸nê“Mò%õúmˆ~’Ûÿ¨^Õ?ü—hÞèß®{hÏö¶iÜåÇ÷ /‹™\«‰uŒ6Ðݧƒ¹PMÝ'ìæèöWÖ† ÚöjmÔuºŽ7ËM­.ZrbE€ µãöûåö0Nî"Ü:[›ë±›9«ãK:†÷ï&èiÈ6¹<ŒÖ¦\«¤ÕG»x¿vÆ-ÕNÁ3'”…óF÷ ,Øž@Lÿ»Ñ̘˜O&I„¹>"&“  "ëߟ>XÖ*¥{Ïè^¦5¿ë•Õ¡‡&ï™bˆ/8¡wx|éÖðì<Åig·s¬%S‡u—jÂ(êiþJ´ô$1K¸uÕd}•v|>WöÓýÙˤ}Wyo‹ö‰™½DíæSç çèÖŠŽXž•æyóÎýáòqýÂúÛ(!è^Õm(¼® ßÓ¤A4A(Ü)¦¨DLè5b\a(ßÚ°+¬cuªbD ؉ùšªM%7 ?¿mmÓW; ‹©:[Léon0&f ³í>­w~Á˜^áCÊë mº_š8°›Åì–Ud˜vÔ~¿˜çiÚ¡ž¶°HL6Ö̧…shúÑÉ)¹ß ½;Öi¯ ¬3ÕîÓcÔŸÙ¤oòîá6 õo(®`>hêô þl²X æ6ŠdöÝáñ·ÖI æ’u™–%~vÅv#ÂVµËGÅ cþÄ”ÆwÐxÆ(aþ¤ÌOR, =~D.Bàûá7×™•åÕÅ›Â<ÑùÃÚÃZõ•E…v€À=O}ñAUÓGô0:–†þ¶Ù«MhÁò´^}®›¬67LìKÛ@‡f¢Gz¸2!„vÙUÂÇû47|xBÿ°V‚¬¬§«mC¹÷ßÛöyðõÕa›Úù•jãŒ+d…PJÆv$ß(Ü;ª§–—Öx%‹^™úãU -X4®rë")ª†KyUsÚ: Ao.Ûž^ºMÏúØÆ§Ó´ û ŒWO© ìí®Ôx:ã”’°TóÏ_T,`Í¡‰vÅX ؽ«ý†¸.üppp›“Úˆýãm„~€#úÍÑ€FeaV0Ë!A« ˆ‰ÅŸ>ÄÑ:¹0Á½ÖšÁÙÑWÂMØÏ‰yݨ d°´ëmТ*¿Ó$t y0£sW T.ULö/-Üh®#h¼ÐTâvÂþ£zw0s8i¯›<Ð&­ErÉòÍô^|g½í=TuÜ©£™Ð`ü¬æ4qƒ€.ùh·œËö¸|t“€è —*Pƒ[;gcÍè":¼´`£¹' í–0JLè àþtíÚ …VÃ+94Dc9Tî:‹ä‚ò–4õ[…{ò"ß•r-ê¯É„´–íuïܱý,¿mbVÈý¡sÛ–a®\a¨k/i*)€… ’M̸Ût GímüÐ'pDû>BŒj;á !°³úÄ~уûô!„q¬ ‹×î5âa‰zA‚4nm#‹ÛªíSËàTNо'–³9ïhwn;&ý¨O·ö!¥¾GPúÞýa¯† ºMx]+fêÄþ‰ %ïÞ8m°õÝ—nàÒ¬_Ïi \ÄFÊÅŽþX ”Ò4éAÍ­öM¶«­Ò†Y,|#l¿¼HŒ¦ð6¨kkk«¸šn–Åïôò®æ"„›Ðgß;ØÞÃ2Âø3VÔäÓ¶KËpRiçðª\±~¬RÕ£]`wt\IOR¯É²„U¸‹è²JépÅÂ"Ü[}UÆ_Ü`Çêž>¨oTýJ²4Ù3íÍ¡¢E1¦ ,! ZÐ?ºèèãcZ:ÆúÀzµOæ¥9jãìðÑG‚4l§ðˆEþDõ3_Vš¹J¨·~F_AøÃÍ·¸Çe Y-¡|þ+äb5PsÖ0=G±‚õž6¿Iê*)»:ªs–n²¹¥DÖ)†SÜOiÔw¯$€žßœã_€ ¨¬âàrF ûÑ€<–Â4{xÀDÉ€p@£ ÀÔ·ã™Æ‘]ÃÜ¢™å&’žÒäö—;¦nb,¶Kˆh£tLL>¼›Î:<#¡åaÀ_(+>Ô+6'+QÒP¶«!\PKê†+ Œ ¡1Ãß:ý ÌÇ•†cÿîÖ"’ÇÏàmtBê0±ã¶ÓJip@‹×EJ?áºàv&^˜e4‡¹~dn=·È½Ë×81LÐiáú–/ï’·Óxû®½¦¥tÚáÎÐW1 Ô£w—vVßöéÝÒ›:áÀ8O0(AA®ƒ0?øG€3Y×´a÷3¯âÍïzôêr@¾ð¬OˆÇ±<3»5ó®˜ Êrº#ÀßùúÚpÁ¨æC¿RÂ;=:C‡¸áúÒQt§ï’¦§4ôô£Þ]„r¹‚ ’/ s£éœPuÆÇ15_©©æÊÕgº,Là€Àôè×?ÝŠÐK«c1†Ñˆ©ò1w× §ÄHÑnÕ¼í9÷=Ò’-õ °öoØ-2ážx§;í¡—Ú=xî!«âèÒW°rƒâ|Ôç<Êö¶c™6ƒÚœ»PÑ+ ã…ñ ¡ÜÇ¿xÎÂz'á§Dýƒ4ÅŠcC0E—ž1^ÑÎI‹Õ‹¶P&+¢ýJ“ž=²—â·…ÇäŠ]úý@Qíi‚<±8d‡„+‚'PÙÓíò˜ÿA“»gO þ¸ÿ(` €ê1€åვ¹è?Gò&€ä£ƒo“V p€ãji^iá¸rÇþÌsÊ›¿AÚ!ù,sÁ¤@ 2NP&ƒûªíÉ`î%¯5ÊÍð–4ƒ­5²cmA ¸Hñ,;@¾¼÷É—ý5¹4`m¹é‰eaÒÀ®rYé-͹•ž€@âHÞ”kÃñZŠÔ'ì¦2äÕ‹vÑÇ¡U]+|Âë¤ÕåžÃF]” ˜@G6‡HÛ7HÚnÜzHè`yÞ×–n‘k–¿„ûMº¶Íu<#Ñw®ò«Z^"Íú‡•‹  )„ÖLþ,$°ZqÏË:ű˜½Ò2øÈäò0Xn}OËš…`¨_›]±˜ºvjCÑ·%7šÖ/8BsïB[§¡`(W ÿ07ɵܤ¤}EkcÛ¬ú!‚ ± ¬Z†` #écäµJyQðŽÜ­pØh’[ Õ6;´=Θ®g–l '¥¶šÖÿ¿ÔnP,Õ0Åì Rgú.1+ ”}ª©ßîMÅÄÑâ -–Pˆ;1¤`¬è'¦7ÂMÒfw—f†÷u¹ãS@ t_¹>³hK.œüü½gV†ÏžÙßâ<о?2w Œ¬rõÄ¢Íáô²Îð<@nUë½ç毷Xg¤`Y¦¾¢.dÎ{lœ•_8Çš‚µË—Q^®>äÿŽÆH‹z[úæ–Ì%¢ mxÚ5–'€ßõºfÑ×òíÉx5:%«¬J¯¬ÜnJWxCKc-gõ?ú\ç¨ `éR°ö°A®s¯*Æcª\ßX‚WÐÅ[“ñŠyæ.¹;2˜þůµÕj7מQéÙÍQÌsäõ¼„–<4v4f"%5< ¿•H ø÷÷¿ÿ½-MŠcUß¶r*~È"\E+í.DMù{ùÁ…GÞÆXÎwÁ‚a«öÁŠH{;’7Ä? î•­œ® Dÿb“ƒû¹"¸æA~x÷66‰S«èt³ú¤¬çžX®:¥o¸ëÕ5á5ML'ʤŽùœ{*0ݵE¼‹öh°î¹–k¼ü|ï—ïôí ì­‰dX¶¦ã›N—Ÿ;1w¼´Ê‹‘òq?M~ê0¯ç+fáÞWW‡<¼ÈV=)Už¸Žºþžer~¼¼ºÖÓ¸N¸®làÆŸ ²\®íÓ“#IÊtÝQnÚ»{µ iò…ù¹X>ïw(Àò,2f™àuÜÄ«…j]ÛW6QtåÝõ%­„Õ’Æ)và.-%[ª¼p ,b‚ëÙ¥#‹Ã“ŠyFÂV€ó$4²ªÏxÅ>ð “’S[=»àøŽF_ê›]7ÀO]éRÙ‹d•óÚOÌ,¸‡é"Ú´Ö7ô§¡Ý¤±UpÍz[±O*¿ô÷Ü'Ü­~4ÿ¡…¶$ö01\%@ì—q€˜aßw…w&É‹2€“t ËÕWnW€?ið‡H¸dáÚřЭZ-ñ¢ómÓjß¹ !ô\¨8¿ªÿ}ïÁ&¸ŽPœU'õ/Àñ`cwrÿ(KK’IŸ;ÙQ¹›`#)ªµ˜ÈáÂà áeÙ¦Äo«éùŠ£)“¥‡þòµË?iùñcK¤aWýè?Œ_ÓFõÒ³ÆÚ*ã¥Ã»™€‡åä’û„?k¡Ú1‚ι+N’fº•›Ü ¹!Þ«8µ]·…bõ¥±Š9@!Cú%£{XÐúcoãúx œ9¨›‘´abn}å²JQꨠ®N…8­ö5¿œXCçø¶rõdN¡m2v¹…\ŸÊuíî¹ý´xÃ(ÍÄâ`1¢˜ÃM;—…Ÿ?µÔÆæ“åÞKÿbì¢ïÅÀ=D½ß.L/ï›/ÁC0`„æ4\»p¿`øŽð°Òx\jGÕqº,‰XW&*Vq£ÜúÄ{§£¬ù#%¸+Ûj‡Kë8ã">O2jº¿à˜ïÁdôèÑaÉ’%áü£í¹à_å G¿nÌG„ט>,³úÐÃ…†Aƒ™†šo% mº)}[cÆ{κ1¹ œG2ºd:_ò¬©ÿº•o´ßgÌ]ºt©ÒÄ7V-kYBš9SÇ&g‚jn²bÏE 4f’eRfE¢Mj›Y¢WOLN™ËYŒ,íþVZsÜr:kÐÇ/†×–5D³2‹ÅˆÝ0i@•e=Y–{hf“侃ËÁ踞0YP _…fëª eæ6A›+‘›ñ þÕhjÑL¢Âý á&ÆA|n/Õñçp߯mqõ*'=ñ±™ãhM à]¯ c–Ïj½vB©á…kÜ«®Ós\ ÐøÂÜ^wVJËLju,ábybYeVƒAààxŽ˜5´–œã’ÀjNh¡e‘/G©sÇ–„ãµB(K3³ì/€öñ}¢)~,ä“ÍðÖ –{òs¸ï{VµÍ'ÁP‚£©£{›v¡ëÅÇ&§d!JÚzOµ×MJÉÚ“ÐgœöÜI©o£'…õƒ g„ Ü¢Àõ¾ýE f.«"ȃGÊÖ#¥Ñï*ثĽM+i…aôèW‹Î0åô3è °ïO™ê°VL:–GÚ@â¶¥Ž˜†ÚáÁ±Ðx˜+Ƥë»3 *‚/C¸?@Ë­^«@q–ç»ûËuÔ&™1F¸A(îވłåZYzœ¾ƒû(m@[~™Õ8MÂ%‚Lwc;Dè–¦ß7ŒTŸ%~:ºÅ©¿èðqÚKZ„±klpp[H„‹ÚÖ“¹åÆ©mÍ]|Dm¸}zLïÔ®u¸NíÜÛ&8½Aý¥ó sÆÌ‰lì`¢]# "²rÙqjÛÊÒW®ó´8†Òv‘•ö ÑĬ¢OW ßÄGQô¾@ëcS;Í]E Â9@¢LÜãré;ÉÜUùÝãÄ^ÍùS—´93h¤7™ïÑÚ¦R©pÙe—…Í›7Û^ ´º‡¬߃ûK¾nܸ1,]¶4Lž<9L›6Íx ž¹rÈÌ  Ðk}‡˜¢æÚ‡hO,ÜS»¾cIä»ù;RÌVuÌê@:»o´â^õ­,nKÎ R&RŸL¹fÒvF‡kLã0910hóC[½Ç_ ÙyáC >s fh»ªë@{Z& Ÿ(ü^}qý>Ï‘hìÐSp¸u%ÜŸ:E¤è)ßrèÔ#º¦<ü¦ùs@pñµðý4)cm„I;6ó ¸·˜2ÖÒϤó~âçùÀù9~ã¼uNç÷õÅ9¯dã¨eVû‡Ùéõ\Ý`jc€!å/«˜®<³¼"ÚR6ÂC .äs¦˜¿\@ð²@åÓúÐÂÇ!_¿}—vœjÂGm ž `&…2ñ¡RhÄàϳÇî¼›ýŒû<&[bš°:¸P. Œ,ÜÇ]ÏÇŸ7ô‘úAW&HÀi]×v#ùÄý1#nçäÝx+R 2ñ8Ç3îu“àC6½ÚFý‡¾È^E¹€Àô!%UÛTöö“ëêî9Þ˜»ÄüR]¹Gú¾Ÿ®¹í¬¦aÒ›*ÐÞV¯¾új(++Ón׋mìaÆ™¤®m¿©â¢1Ô\óלcŠø>x„6]ôÅŽþ«ræµ(… " 2¼ñÆá¾ûî³íß Za ÓÔÐFh\É ƒ8“%&»Ö9÷8çž.í9o&;KrÂä\5yè5›™qk«’—ò1&™¡òæ”z¤¼Òɲž¥Ëˆ×㈾óÎ;aÆ yŸ$ Ý£>jeä#زÙ`™Æt4|ëšû\ƒ¯ ]yA\øå¾½§#é2øÖ»5ÑR%e+_sçc…#iÕ|¬ I=(ËhJ:.è´½§Ÿ~:¤R©ZçÄ;0Ë<ð@X±bÅaÑ/øŽ ¾…§‡÷›GÜSñ–† ó~‚´Ê~TIǤ“žd¤ó&Ò\æîGUó±÷ì…¤Lò¯+øØÄ I»~þùçÉ'žhmg |8¨ª õ‰«d4H'"¹µG¥ãœ<¨=çý[²Ÿé‘žWækesÓA/$å&ã+­¤2_ÞKú+õÍ®ŸgÑPGæÆÄ—^z)ÜsÏ=6AîÝ»W}ºns8Ç·apvXã•òËÐNx´¾$¤åë|Ç铞›`9¾ŸkŒtÚÕ•&|#¸\´hQX³fMf~ñvU×üKzêóÔ­[7R÷ï'>^Ò468{öì0oÞ¼ðÝï~7¼ùæ›á¹çž 'N X Ó pô0@;ƒ6M½¿T‡1„^xDú’ ÀÕ¥=Üûu@(БÿÔSO…XG¨Ïd]y'(ƒ†Ÿ3í2†T^§'df’4Ä铴Ƀø¾§M?Ñ¡ò}îÙ@¥[LàvO”ûœ”¹Ÿyõ=Ò–/_¶lÙbeƒó|€çsÿý÷›$Ÿ$CìÓ´1üSéš® Ý•8Ï|cDHË'¢w&M 'þŽMè™ö“´%^˦),S“÷Ý{_øÔ§?e}ÅËËU]¯õe2y衇ÂÂ… «ø.çz¯¦{NVº%Ï}]‰ûøùAç–M’–g•—•÷ü[’g•ùëÌ+Õö£ªyð¾—ÁymòißkÂ|<òÈ#áä“OÎР¶ùä3uªMÓ5ÜI˜ã˜–Ë­`†{@ŒQ¿ög4ÞìrxVåè‚´þ4ºmeeçc…7àßás΃>JJJŒÞ·o_Ã[æ½Ç'ˆÛ<ér_ÇØªR’|«æã÷8 ]ÜxÅü²jÕª°nÝ:+Ï˵‹&üÄe‹oÊ൩|“êìíE J)æ„óÎ;/Œ;6¤R©ð—¿üÅ”“S¦L±9œ¾á‚8ïz«n*ŸÜ(뙦ƒ·ÚB <ÙÙgŸmUö1‰‹¦ŽsF#ã€ô!´!þކ`[/„ïØ±#Ìœ93ü¿ÿ÷ÿBŸ>}¬£ Sv.ðÁÆ;"i¬3¦t®½1ùýøšçhظ`aúêW¿š'Sk2áa>ܹsgøò—¿l~²ù@ò7§yAŸ\@ÀŸÇ×~/×{Gëõ¡ýñWZZjÚEhY€™‚æ_øÂŒifâi ßT›º7¦4àÍ m¼wïÞ¾1Õ1».´jZ|QZòðëìt5]WÓejz¥É<ó~¾mÛ¶ð‰O|"|þóŸ]»vm0í/õ᯦þéuö4~Ýs¤Üç—·Þz+|å+_1<ú³æpçŽ÷¦ú=ÞNž}öÙ°~ýúð7ó7ö)Xw®¿þúðë_ÿ:œp æ}·zú¦ú½µÞôpKÿ½ãŽ;ŒßÅC%PÀûáQ®ÞŒ, Sqq±™kШ ¿`5´¹4~ŸÀê[B̠Щð“…fºÕ£5¿‡åÊ•+kM7hÂDƒæëHû^Ö\û¦ÿ (î ¸0Mˆ…VX¨åS‰Ã °?w†YJöó`±bF|yÕ\nY|‹çãeÑn6j!6ÇC’9}XO[„÷Ÿ„#e,¸såog?K®3)”wnu)Ž.0ç@SæÆEÍÔÌ/ŒÿŒ=h< £q'ðü7¿ùMxßûÞzôèat‚á=óÌ3ÍUwÝ÷¿ÿýÆ;£Üx¾¢éׄqÖ ÜàXžÅ-««}ò“ŸÌ&ÉÛô¿·!¾ ^Da@k‹¦–Is:OŽGóc(— ´ùÔ…Îè×0g²©+æYêïéÛ+=,éiH QÇ•—OÀ/õåœï;ÜFîßÅ·“Ÿ[>ønÀËöº£—I}p?¼ ýzõêe+˜@+ê ˜Ð<@ÛT*eG|˜aBúõëgõç™çY¿ú'Ì`ö»Ž»ìû¹®Á/u ÎÐëÚ€Ó<´Oò9¼ï©MÉUÓÄåù·xßð”¤q\“†sþüªMy½À;4Ã=KÈQçëUè2mŠÉ¾ŸŸTjõ«Øüíýðm†êÁÆÄ8TžU ñ½§´ßǽگèò1=­ÍðžÇ˜T’ÎHhÑs.üíäè÷ã:z –΢AÔ+žsðÚœ"Òrí5ò×®]k+Å0Fa™éر£µ5êˆò€± }¬px ,_±<w/Î0’´O¾©.cKŒø˜N~:e*ê7££—G™Ô“±†~Ëy®ü¢W §G ІqÀMºoß¾a„ ™Ò}œ½æškÂ׿þõpê©§ÚÒ¼GM©j“?ñ>JÿÉO~b–§Q£F™5ê”q§„ñ§Ž·þ[è;õ'u½N'a0öÎâ×õ¯JÝßôÂOÐ/Z“&M²ÅÕ«WÛzÙK—.5­2ÌüÃ?lî-cÆŒ sçÎ /¾ø¢ùUŽ?Þ& ò㛨à8嘯Fî4óüœ~ ñÍŽoŽ/¿ü²iuXþ;Öqç+“=Úº×_ݬ øÃÂ|ÊR‹çŸ~``à[<ÏÃùÇ?y8žêš_ÜG8'Ï\yù}§µ·¿|Ò¼®uÓS¿ì6ßãœ:{½ãgq>GëÜë®™¼‰§É…÷£QŸ–Z®¸­údÕ–¬Ûn+SaÙX*á„%©Y~a`þª­áåU;Bÿ.m´º_[™M ¯ÝnõOiÏ–q–k9VV‰c?‹Ú\½CækÃHöi)ÕªVìM!ã‡Þݦݷ÷Ør³,cÎêMB‹=cÃǵZ²¼«ò¤,• ° å"½Ç†“¥Z˜åyyGEØÑ5Àtõ>á4ö>s4ªC»¦“‡O>cc{2ÐÆX•ˆ±ÈzÆ3¬pŒeÄZ07!˜\|ñÅ¡ÿþy©2ur¨K§ŽxŒñêyŽ ‡0hSþóŸÃ¿øEkG܇VNó#F„©S§š6þoÿöo­oxš†«}ó)<û8óØc™~Úi§Y¾òÊ+Ã-7߯ŒcüIïõ§{ˆ}ÀóáÇúW¥þo¾ýöÛ „O$Œ+ZñGµÊÚ}W€É³æ]wÝeZ«áÇü`S©ÔaM |{üýà&ûÚñU›¯ä]σ£ÿÕæÝC¥É•——w¨wóýÜ[ÈW^y%œqÆæ^±}ûv³vDLàþÞ˜@±drÊ)¦¹Ã7³4“9ÂåáßÏŸ8à(ž wÙéâwÉëÚà7WÞµy/.?ŸçÐàÉ'Ÿ4¦ÓO?=Ã|aU`u6–„Ä"£Åó”ú4bâäzèСV£ý qyÙ–›|â§6yÑŠ6vˆ±g³A6ýë©¥Yçk#:ö0ºö´þ¡·öyX¨ÝßVæéþhíJÏÞw½¸Òvé&4„Í gŒëg–”g´‘ÝRíýÑZÎ6 eÚ8¼ÙM~‰Š‡ç¬ -ØʵáÞV•ÒfˆŸÒ_ËT· O¼¹&<¤õX–w«öi9¥§pñ©ýÞ}ï†;_XhïònÕb}¸ð„>¶I]BŸ¢vP›/ÏšêúGþKÊ£·+„‰ùóç›Òƒ”(²0ˆûBèÀúAÿ 6’>òøã‡“N:Éæ¢Ø"çyæ.ñ໤÷wráƒ7S«{vpŽÉÒžwr·ð{´1àó!tÀÍáei ÐÊ^ö:¹ñÆm f^tÅé¿W8¯¼/àF}ë­·šë•»E„þÄO„¿þõ¯á’K.)à½n¨­’:êþ£;3yákp'Bè€9B¨À…³øï~÷;Ó˜£-@ƒŽ)ç˜41ás‚Oq}€:ø€Oç÷??çȵ§­O9Íõ(a¡‚n¸3຀‹Õ½÷ÞkÚü^Ñx tLŸ>ÝhèauÅ4ñv¨»qÏéÉzóNm ¶éªËËñSÝó|ßëûš„ö×^{Í\â^–¶—@~õ«_Ù=˜-,Ž(¸ Ì™3Ç´u‘ Ò, ]€8Ϻԗ÷Àµÿ庮M~õ-¿6y* ­K„Ãæ]ûÃúû„!Åáú‰¥aß»á¹m3NvÓÞ©ëÓËÙ\°}xäµa•¬¤ûÀé¥a‘v5|î:Û`R£IxeõŽP¦»gjó»s´[z'Y7zjÈ“´)(eîÛ \vB/ÛDu€”‡ÞÙ°¨¬“ÕãöWÖ„‘Ú5ý£“Sa’v@}ÍŽ°rã.‹!yjÉÖ0cl{†rßkkÂVmî ¨·ø§sGï‹qYB@g<Â5”± …‚sšiÚÿîÝ{ÂñÇo+aÅEÂÜäàyúuuGoû¤÷ùÄÓâªIqðç¼ÓmßëS8ÖŒŸ/¼ð‚µÞÆÚÄc!óm骫® ?ûÙϬ=’¦@s°pxž`Éo„;¡ÏàOˆËùíokü%÷ x u‡:[@ª/¢rr‚H –üù@èŸUŸWÝž0À¸²jÚp& &Låœc.‡¡bC&š,˜)´U0RÙ¨º þ³¢"i¤žÓ<«U cp@À©&¦M=ut|ðuþ^ݾôȦ®‰VÐ p:æ£&ŽopÁ ‹ÐˆÆZà~uî¹ç£‹! w–F»a‚±p¹âíËëGÞÙ¸ŽË%mÍ=Ö3‚–© ´ã=4š<4:ú÷“Gv¾^f¾Ž^Gþ¼lÿFÊÏ~–¯²7 ô#p ]hßà™~†VŽ6M{§]=Úî;ílx£.uÅßãïe¿›}§µ—ñHeû¡ŒéÛ1 ìlŽ9¸¸]Ø.ë;fû&Œ}»jóQ™ î÷"I„Su=d‰9GŽI`Øûâ¥íÔºEX¦Ù×+¨ öeªÇz -Û—‰iŒh®®Oä» /\|¸QlÑOÎ:ë,ÄQ“ÆxÁó]»vÚØ…â WÆ-˜òñ:ƒOÚvvûæ>éâgô9‚aékôIžµiƒkž6i•¥¸¼¼<¤R©Lÿã} WÞö ðÓ(0ÏÀXŠŽev r†/\óž«¢hàáa˜ßóž÷ØÁ~h¾¢^®w ÷ªÇ€÷7R€WÜàþçþÇ^ð¾Ä}—¬ßÿþ÷f…bnŽßµ ?‡Ä@Þx€sFÉ RÓ³CÖ°šäéùÃ,bÚfR`r@ÓÄjBÄ<óÌ3¦½E =ëž31ðí-¦NoòŒëJz û^’.ipÄ’ ± Ö„¿ó½{÷…»ï¾Ë®ÇgyÃȱ'õ˜|Ov£—ñ·zýxæçù¬¦—Eœî ‡LÞ#GŽ4 "B"Z´‰ÐÚA7î!@z€º× dƒ÷ãsÚôƒ9h8o¹å³¾|ë[߲ɞ?o „êç•]f>®ã2Wäë´ð6äÏòY&=´¼Ðdß¾ýb²zÙê+ ʸ`á.Ç&ôè€PB[Ç¥‘¾»`ŸðºÆ÷8§î@ükÓ¦M&ñœvýÑ@Ñ¿=m®w-³þÁ&Œû”šŠŸˆ°ì•»_l›Eê¸gåŽÍ0¸nu‘pÑE;Ç·T—ík.Sm««TgYhrhøÃÌ—œÌLbGëNà¾ÔX'`À'ˆÉ=_+b1h0X3 A‚v´ðŽ Ó4ù90ÿÓ?ý“ ôW]õ~ 2í!à>ÚÊüÇ4¡†‚¼hGüqÍ@Ï„«‚ e):n˜” Ã~ðoºé&k»—_~¹õ/[#Ú4uaBªødÇ»Xì|œ6mšå‹` ãO{/—«LÂx@Bð |‚#a†€8ÏøÚ¿Í2Ñ?‚[xxÆVÅc…U\Æyæù4Ðg4©b[jžU—ƒ\«)+Ðq¸OGàí10¬Îèô@0 Þ§£8¡9Â8ıÂÚ¥þð‡Æ¤ÀøÃÜ@˺tR´«40Ì×LLÄ\pÁö>Ì& ŠüØ$èðÚYî_}õÕ¶ ƒrÑZ|ë[ÿ$Æl™i»4È‹4œƒ˜ùŸþô§†C& ðåßaèǯù´¾L<0äs¸ø¢s+¾©Ýóãˆ{ôAã ­°&1y"ÙS>šèéàïúu]þ¼‡PH[Bp@k‡¦‘Ý_¡Út&|,hx°Z×?ýicV±~_ẖ,KH^XpØYAó4¸†æÃ±_{íµ¦!e• ‚ÝiÓ0÷|'å3°0Àtƒð“ç!X׸| à8! &·$ú÷ý™%Œ~(cÍš5¦±ÄBçV&‡¶G;æ>õ(ó3ãýËwÄõöQ]9Q‘5žò-ôhŽ0^Ъ’¯37 îÓ1´×}`€˜þQ%Ò|ëËÆ ^í-8œ8Ž>ÝÚ‡¡}:˜%dÞ#Ð|@/ÅŽ(ÿ>ZªwŒV®"þA™§Lñ$ÃÉK®Yä7°GûУÃqa°‚ÍÇÉ kligY\:U‡»ÂýCcºÐ>i¯ÐZÅÜgŒežcn# Â.i#¹fž®OÛ>tíš KøRzà>§Ù>—.¥ye} Z0?øsË ðS-’¹Úǵà ŸA ‚•A×µ3<ƒ9ñgþŽÝ¨Çù“0š „Ê€qG3Šö-º !LNhÉXa²`lhHÀÿýßÿYÃÉÁß5O0Zh¡Ñð2ñÀ|a-€!eâ€a=÷ÜóŒFC‹VæyÆŒË%I'Œ;š(êÀ{œ3I4—LÒ t|À3&¨—vž/ùÀ€#Áì„¢-D«‰ö “´Ó¼ãî0`¬ÇŸ NhÎ1‹"0Ù3ißyçF/k,,ÐWÔ/}éKVt†f:œÃÐÂôd†‚ô^,Ahåik(Þ­byú7äËD[pÊ%€ tqÿÊG<” hqiÃL|”‰0ñÕ¯~Õ4ªÔ ÆÍ2˜, àæ œÀ´£ÑCèOÐfžÕCx‡  ÏÂdÁ¤¡QÂòB &B 'm¦z0È{[äÛY„ëù—1 wÈ|´M«˜~œÂLòãXu—ÝY{lðçP"w*‡>Zí*†ž]´ø‚þºu” ¡þª€ðÞKÂI -[*¯¬{\Ç÷ºtHpÍ{ìKâ›Æùèk%¼F•u«z[W3rЃôø»½ŸT—6_÷½Lhƒr ýÒ÷â¾ãmÛŸÕåèïÂÐcY`>@è@ fÜ / ¡ýy_e~¡=£TÀ…‹2cãcϯ¸â kO´eúŠæ'”'ÌEŸýìgMÆj<\3^ñ†‡vO_£ übNÁ»€q±v:sæLSÐwé‹0FŒ·h\𶜭ÜðvÝáK‚ióŒÑ1£KžOãúºÆ]pìÀü‡‚‘ù |;ÐoéSxÉô#Æ:æ¾ÿøÿ0ȧ¥%ÓÍß-sc oHLD?§3ÄçT!û:wµjw×;Œ+ÂÇÿþïÿšæ”û ðîR˜Æ}R„Éæ­p4¯0»ÎT 5C»Îš`´æš'{\˜R&´µ8ÔW3ʲÁÌË­·Þb…3\0d*Lhî¨OCK͇¢U>éfÈŒ~èÈX{'®Ø@IDAT4ìš&w˜½ÜwFtó–d0ž18-™ÔÑHÂ@ó>‚*8‡¡%®W« /¼Ð&iÜóÐ8"xõîÓ;´—[ô‡ñ&=í:S¸‚ñ É`¶™(ƒgùÆÅšèB™ŽÒnÙþmÔëm .nQhVñ7‡éBØæÆoÖ¬YF ˜$úÂŒ ý(`ÄÖ®]¾ýíï†p¾J}ë¿þë¿ÂÇ>ö1KCýïÿþo(*q/!‚2pþáþÁ耋I .ôE´Ã´ 4áùpB{¢ !$#˜òݵÁµMkFä6Ðð&’ë:~F)»¡Ó¢Øl3žg¿Gžñ=/㈠8yeÞMÒ&m˜¼Ôdy;ó=¸py™œµùVÒ+hŽ6Þû‚·Ožçâ¼ýœºVw^ÛïÈUOÚÓh›Xúí‘y‚²³Ç*¬ÆŒCL$8‚±!U.4ë ”c}Æ:Á…ðñÝï~ׄy_᛼ùÃjLÛdÄBO¿d\¥,ÜwÎ>{Š,È¥üXA…ŸF…X È®ÏügñyvÚÂuÝ0àý…4BJ0<3×à¦Ï¼…R›kgèc(âà-QRã¶Å3ϳn59¶RçM‰Ñ#>>'Möuü^}ϱÇU„IÀý`Ñ^cÎæ¹K².½2ø#Ñr͹7&Ÿ<¨‹3Å®ÑB‹ðÁ¤ ’2L)’2Ú/˜Q„˜_!´óĉàÆCˤÀûãÆ¢‰å9[MÅ- õýþ|½—M›ø:>ÏWyžL?.5š::0tÃ%+nWt|ú¸ÿ%¸-i[ >‰óîLÎy¸p”——]68 !îwLðXFh¿ºíWf=CM¥Ráj1Ó·ÈM ë m‹¶B›@È¥ |qùoCV©<üÀ Ù¸¯ãó$u~~q¯Ü‚Á9B€–—0pJ»¦ÍÓÞ'Ëå'0Zà€–0kü!Ô TxßzP–JðŽ ƒ{ãg>óë/,ôeèAŸC¨éC»Kütæ>í ‚E`|1Ÿ£ò5 ?Uú-Ìfm¤ÐϪ#6_çÉ©ý&ì}Õ{0ý´g„ž{ ¹Å|èš{Jb/”—îS÷‘+Hú0a"/ûsòá¹—¥W ¨ƒ=Ó{Fyµ&f,ôao›~¬eõJ—QÝy½2N¿äm fk7\òŒi׸\1.yûà5Ÿ¸ïç^Úõ>ÌK´/怾@ûBØž¬þÄ{Äß}ô£5… JbõP SHÙ´}ðN]\°\"€¸pƒðC_]ºt‰ ”W€¦ow^Û|Ï1žï±|ôñ܃…WJÌ‚xúJG¼˜Ûè×¼Ë}Íó!}¡…CCx:)0QѨq3BÉ®‡×§9é¤NC&[&uðˆæÁ€{®9„áÀS®ÎM>LÂÐm.Ašà—`m„\'R©”½O: î#LÂL )D»‰±¼¼Ü\'(s˜_*Ü"\¡h³™mÒ7Ë"LЖ¡ÅO~ò³2Bp]¼o‘¾l@™Ý‹ð¸mci°pñ>±2hré£XBˆß¡¿`m¤ÿÁøC,(°º‚ %Bp“1‹ë`…ÖñÇëÍ7Ò fFËU„QÑù÷øÜ«’}OÍ*0ÝÛ³·Yð±sGåÒ‘Ž''pLÌ Á¶Ðf ‹ý§\ÂÞb øà˜)„,RX2èø7 p 3†ÛB=Ì——O?…ÎøÛ#€Î{]ês¤l⇨3‚SjÆ€»å÷5—tôžÆ}ƒöÇ÷x^\gßóg…ãÁhò¶Xˆ #D£À†ˆs„4SœÓP\²ÍÕ¸@ ù áÆ”Ž¦-E0?hË üCS £Š ­B‚îChÝÑZQs&Ÿ]˜_%î#¤ÀØÇâ¤àßÌ#ôaþÄÏæA†º¸;iù¼£{>´!ƒ‡ãŒFËÌîqLÀh҉ݡ½ IG»s›MÜþíßþÍV–A“è€{ïx̉— ýi .hzúæpD ü’‚f±x€?LÓ_þò—ÍïsÆÈqÁ½øœkôX‰ B<®ˆ$hzW¬LVvú3EÂþïô-„z\KènjŒàåò.}Ì]ðü¾%:ŒòyWíÄó¥´'ÚÇ#õG•'˜ô(‹6H{¥sM}¼NÜC€¼^¶¡a-ëGZÞËõw¨ïóòHPg _ø·Ìø‡oä{À1íåó ã nž"Œÿ¿ñ8Ÿ«ÚäÃØ1cÆe6Ö!l#˜3×ï5¡­+®¼Xs¶qçýÅ/~a±V¤ýÌgnÌÝ׆{éb¨3À\•o¡<×wî0ÐÔ1@ßdnËþ㻘wü9×Ùi¸æyj&-€ø‹›šRŒñEG‹Îj<£™»K àˆöÛóð†S.m,Ì)>îø«x£„@sÌDs†…ó7Ì«› 1&¨™²ÝêB90\0Óhvg¢`„¬.€×Ã.Ž‘ÿf+–ÏEÈ/Ђø  @0À¥Æéà ÀÓ’kú~›¶mL =n ¸F€5®Yå  :.E¬vÁ$ÏÄ -‚¬ ¬¸ÁX T¢U‡~äÍ„Ž¦ž:»uÆëC]š*8ža&»/Ѐ¸VÝÁåƒ~EƒoåÏÛ3ß =c8}YõÕ}ˆÏÀ…Až˜šáÆ[ÿDa€;#L‚'}¼c ƒôE×ôBK„Bï;ÎørŸ÷ÝõÄ˯/-x|Nü¨ÌüÛ¹ïçù¤ñ?²ðsŽÀáÒÁ2i$?¸t~èC ÿú¯ÿj0ÊÆ%Ì 0ûà ð#ミûœ´iÓÖPÌMÇxG;Ç‹¶ÏØÈR»¸öâÎÅJt(IÀ3B*±"¨SäÂ8Þ˜(7•JÙ}ï/vQø)` €1àýˆ~ƹ_×øRáa­0ФÿB´ ¾X-6€x ¯yeÀFëã㌠éÀ\“å÷ÐÈ2)0áWÄ ?h³X:–`gê0QÁ´¡…'…†Kù0JhßÑ £õ|²¶‹cìœ 8ЀÁ‡Ñb·&dþÐD"HÐû]m -y@7w±âÖ –ÁDÓR9~õk_5†– šr™°a`èÐp²²ËkÞ~X?ŸzÁ(ÍaRV„6V–BÈ"0–€o4µ÷Ðr#¤Å4ˆ5¯–X?X0 G0§ß°,2‚&ù"ð#L€{*ܱnàÎ3ÇZì0`ŒÄbas+•÷òÄR†+À}æïÖç˜<êR®Ó 8ã‚cBÈÛóßjžñ½ˆ(X•ˆIò÷k[&éùs|ÅGV×<6Îjû­õMçß¾i³ÌcÅã?n Ÿ3¸ïãqe,À-Á 'úŽÏ>~x9(»°Žã‚Š5ðÛßþ¶­òÆÞ¸^!xÐGÔY\ƒ•ú;‰¢ý“ý‘yˆ>…Phn´±*ü0p„1àýÆûè.î˜È¾IÇ€Ðhøc… ˆ—˜zDíZ*´‰»i3q`ªfg:˜&wðIƒ´>9ø=ü{Ñ„ãn… Í.Læsh&"´Thìa˜`¨—/ L]aŠÑcÂÇž{>YPæ±Þ¡aê±áæC2K¸Â`²¬*À1§o¦…„8pÍ3bp9 - <0ÑûÁ‹šu"qÃb†™&à}Ö¬Yæ6‡ B úu×_.8ÿcX’üc@ÛŒæW1¬'*¦ÙMê´O¬C0MÎü»» ãa†Ë­Eô,†ô'?§¯§‡< ! ÒäÉ“ÍÅ úã GŸ¢\„>„jw¿ÃåŠ~ˆÑ" }ŒöƒåƒUèÈÏ- ^¾XÏÚ·§zfQç×¼ÞŒ;hÇqÁ×à+–#_ú–YT„8Òrîïª`ÿ®šÒÇÏH_*ÿæôÜ¿›q¦‹7‚Š/Æ_ŠÓç\±ü!(°÷ îŒ(­f¿4;\tñE|úƒbŒþ]Q\1ÏÐÎQp1"l²È B®_Ы$–Úã@ߢ, ïVæÿ–æDŸÂ·0p¤1@¿ñ1óH—u¬äߤHtY¦ÆF2%¦³5Ì Š3>X$`J™Ô XG+ †IÞ™î¹o‡Ž ÓDy¬|s†ËAº¸†°šŒ+Yê@ÞXLbÀíá·0bMI4ø¾!XòÚd4¼ìzþq§‚‰b§hÜN°T"0R—\Y±ÍñѤILûøœºe_s¯6àõ¿œ´i\¬h«ŒS´GÚ7ã. »wï2|ÓVb¼sÏóõ#÷°Ì 3ÍyJŠòçXYè´n]‰ß'cœžàAœÐÆ™cøs@ ÁáÀ3Æ \ ™« ·eðL -÷ÇŒ?´{ú+1²{:s ®Ã,急%íëÊŠå+‹³_ I¨?[Ö@~`.ôü¼…c Ôô#þ  TŽš‡™Ÿ·™M_Ëe å/ =Z)·ˆŸsNÞcˆ Ÿ?Ê"-“>š( ,¸ô0ø£‘D¨a‚ÁLöjĈ‘Ò‚-5F‰ -˜çI^qý½œ£}lè:8^9B+˜Rpdߟ{ý]ððg³ïyYLØR0)Œx¬VÐËôA ³‡ BhƒÑ@bpËXc¡_ü½‡{îøáˆf•>Á†€~âhâa’ Ëä²2œ3QhßéN?,€¸§¸°MÝ`θkéÉW·›nºÉ„òDЀBé/äzG¼,/®±º ½‡IƒQn4ñöÌ÷óíy¼XàÀ/‹'Ð&°ö¡ýFáѽ{qÆ]ü¸°ó‹0Ó¼¢ÇJŒà¥²H‡›î?,/K'–0¿“ÅÔRvcÀ³ã‰o9šàß^cÁÂïÓ?øËN½Ás Ùã[L+ús ±WÄaMA‰’’°ˆ"·DV‰£o!Ó>XÁÎ]G½Ü¸¼Ây Ôô¥ä’õÌ»¡ S]ù>IÕôÜ{ÿô\ïø=OË„« “6n"‹0Š&’fÒÂ$„¦jܸSªì!àuñ<½Ü†:RŸ†®‹ã5^/ÇYöóøÚÓø;<ËuÏËâˆ6‘?\OpAÁZŤÎjMLÃàaAxua&Wžq=òuN9ñ·ä+ßCåãaš¿¨¸€1Ê^ï\Buù!„àÆ3…+‚<1W0á¸ãÁLa‰Áå„Åp=Â]¡mt¶â!W½òuÏ¿K+Â+‚c ' ¸¢ç[¨7–¿S›:8þäÀqf¸t¢y'oÜqçd¼ÁRĘ^"°àÒŽhÓÔ‘ö‹ðL½=«ÃfhñÑ’#ØÑîYÉ —ø(Y€oÀE<ÂÐŒ3llC8al(§ NŸì²·ÕÕËŸóž§ñ{~Í3¿ÇÑïC{ܱˆÐî¡=´@aÁŽ(Uhn±÷r’äåÔ¿íH–‘Šz=kÊ+;Mö5ïæºç´€‰B£È_M@žO.úñŒû@|^SžÙÏ<?f??š×ŽŸ\eÖ¦~qš/ž_|´neÂ*#?ç9&hŽþ„UÁ¡­?Ì9>]WÞ!O/ÃËÌç‘2YË Ì=ñ,‘‹ À8€V:ŽÉ¨mÙ^o´ÙÄŒá¢ÆŠm8 X$À‚€@‚0A°3Ì(ï± (4׉;#î aK ñ¸Ž"dc=!/,"¸ù üaÙ%†7,Æ1„(ˆøÎw¾cV0,¹ô¯km¿ípÓQ@|~¸ùæã}¯Wuyåz^›{þ´eÿ”,üÕÞ¼Äi½LO?+œ0PÀ@õ(ô™êqSŸ'‡%€0º»E.f»>:Üwªc8ª»Ÿ)O|c‘þÅPÓ;Õ=‹Mòq^~~(aœ/¸%?Ÿ0<Ã=R†»p—y¸y7¥÷ëú݇ÂUœŸã·.ø ù{‡j'uÉ·¾iãï©O¹Þ¯Í=´øhæùcÀ‡æÈxãøÉ®O.|U—6ûݺ^û7P„‡SN>Åö BX¢l÷ó繿ãik:ÒßIƒX$bqX8„ýr@ІcÃMŠÅÚ°r…B««Éq=}útÛ484„ +AÎÄJáæ…öœ¸6Êþþ÷¾®¸ò ÛÀ“¶‰û«"œ°–(¯kMß“Ïg൱Í9ùü¾\yÕ¥íøû¹úƒ?£}Gj~ñr ÇšïòÍ57Õå{ê,€0:ÜLBMƒ^]*ÕÓ:NrÕ½®yÁ\à^KPŒó\ù×õnh;ÑØúªDuÍ£¹¦ÏEÇÚÒwéü±Lp]µ%,3 ]ÐêÓŸj[n¾háuÏW~õÉÇñÏ·{}8¸yl¸ÓzYNfpIº#‰G¯å³™_Ký³sÕß=»Q¾—øbͰü`± Hœ>LÙ0äB¸éà–Ãx x<ƒƒ…†6E¼ –â9èÿþçĬD†‚pÁqmÄåpÏWY" a¡‡:P8vzÔãSùŠ—{Ùb¹»â–‡¥'Æÿ!3iF rẶíœ>ÕÔ4ý=?6#4>¥€¼b W¿ËkÇXfu@À® `ø wéÚ%Y¹¨(™ŒŽ%fÚq­éÙ¡pS¯/ÚL&‹8ßC½[Ýsò€)*++ ßøÆ7lU'VœÊGÞÕ•ÙTîgÓ*W½kƒ'"þ`ÒfÍšU«É|a$¡ q0š¸ðÔ¦¼\õ¬Ë=¾ÛË!Ÿzøu]òÉGZ§åÇÙy“.þã9éý[`ºÁq ¾×Nvùºv\yÙäË9?³uüA  6†Àc\žˆsaå= „ _iŒ1™¾íer$ €¢7+,(4èóÄ…ï•©\.d¬2Æ®ë¸ZáæÆ°XDˆ»¡-#1ñ‡@ƒ5¯X©ãçÕ)9߃‹$÷7Þx£ [¾Zžs2l¢‰½mÕTýÚàƒù…v²ƒvFû)@ TãkÓ¿ªÏ¥ð$Æ@½2€1f&"´è¢Äh=üs&v´–¸R í¿µ™|ª+Ù; ¦oΈÔ˜êÞ+ܯ;p›Ã÷­rÌæÊÉés‰; «NÁX6C@™¡ÇíNŸ‹ÿŸ½÷€¯ò¸òþ !„!‰Þ{5ÅàŽ1î-vb—ØNuº“ÝÍ›dóþ“ÝìûÙ8í“lvÓw³›âMY{“8‰Ä±ãnÜqÃ6Ŧ BüÏwî=Ò£‹$„ôÜ«{uÏÀÕóí=çCß½Ž@G`¼mmÌí(Í|.×!¤P'7;Ë‚[&+)ñ~˜ XȲ0e‚`îl°….;^Ðf‡3º°è,}/Ÿ@œaðøm°°ã]¶ÈÏ;æ]ÿDêWÐóß[[ˆ&NHËö¾ƒ¶©e6•wË;†ÅÝ.vìVã‚—ó‡N;í´°ùÃï×ÊD‘H79Б3UðÆõ¾÷½Wn¸á†à6|ÕªU)flÁÎ Æf£J48½›Eé•W^Ùèi´Ùp²€ä…|qŒIF³­+XCÉ=s©—µUÎÓZGy0œüF˜<8Ž@Û0†MÀ¶³yj;èЪ–ËôÅùh'ÒÈÆN#‹ &® L:,Œa@Œqì,M/<àÌ»ãw‡ç¶ï–ï™]û¶˜BèÚÊÓV]Ý- Š1ÏàÚÞwM¸Ð'Ú#ƒ[o½5ÎÈ¡x­â \ÿŽ7.ü–íû@?a(,`  ÓÀ7®t'MšÎáÜ"Lê\¸ÕE o^ßÿþ÷Œ[_6<ð@0Xg¼' úÓBY“R±cþÃoƒ6ÀTúœ¸ÑùžGñPv*Ž@÷D Ì7‰)§{v0ýê„c»-2Ü.îɉ†ÝD&téEàdÞ‹9>¼›–‚Ñb§š‡ÄÁ„X|Keº{\´ï-CÑô\Ä‚ö?õÔSA:AûQ™Ä³ÌãoT ±sçNáÃ"4˜“Ž -À蜫©1a‚=ÅM7ݘ¤HYð…ó ìC° 9ÁfÌÒìA° ðdLi +Ç,³ø¤»®8Ú›+4rý7’+8{;»Œ=>þÄ÷.;Ä€D«÷,ŠFîÜû{ËÎwÕÒ{1FÕ,v©ÙÝæà9c¶ÌÎÞ¤§ULà„R¼†±èîn¯Oœ%òÙÏ~6¨åq8#^ 8‘Iæ«Ë_ “!ß ¼XáÑ Æ€ï ÌïÈòåË  |衇dÉ’%áÐD¤nÿû¿ÿÜôr.L§ØŸþùA= ©¦äþç¹"ÈZú¾†„4þéŠ:ÓØ'í89‚€3ñ¾¨î7kÇ‹SsºúÕp¶`þ‰ÎAmåõ´#à ȉ1òŽ@—!`ÌÞŒP‰¹ýöÛÂò{ßûžÌœ93 £jcúø]ÖÐ U ,ÐÙå¿ÿþûÃazœ_Á˜Ŵᕡ椭ë âõê#ùH£j•âaí3ŸùLP³Ô±ÌNu«þRâ¼ò¢Žõ©O}*|oŒ.¶ ¨]ýô§? .}9ïïx×_}ø.!mÁûß-Ô®î»ï¾ i¨‰ˆ½è{pG `Üó΀ć¥SrbE ºÃŒJ LNŸ&`›r˜[XÆÚ€,#]ô²SÍúuëäÇ?þ±<üðÃÁ{S–5¹Ã͉J¶Xð›Áõ;˜Ô@Kã™ïR3 ÄA›NAÇÐü‡?üa8A¦U+¾WŸûÜçSÂó%—\"¨n¡êfåž_GÀÈûøxˆg@âÁÑ©8iC€Cç~ÿûßË?þã?6ÖÁN5Ò…V™‹Bë#œ~þóŸ‡E2’·¿ýíò­o}+¸§Ån"ʸ5ÖÉì|2¬>úc!ÚŽh<éHBH·I25¯=[®#FŒ|àÁÐf¦oZwß}w`\Šp"º¹]·w`í±«Ñ´g¿:Ž€#Ðð1.þ·é Hü˜:EG ÓØ"šë½÷ÞôîÙ¶€±ñe—]&¿ùÍoäóŸÿ|Ø™¶2–§;]YøšmÒŒ¤MĹÜÿö·¿•Ûn»-äkm¡ÜL˜xÀÖ¼Jq%ŽO¦ƒ1-ÕK£!5oê3ù‰Cª1NÝúòá£v¤&Qµ>úLï€kj°8ʤ¶#5¯?;Ž€#«ØXǵ+æ€\Å­¥v·}DsK%<ÎpÒŠ@t`Ã-*'Z/^¼8Ô]s0^ pÕJȇÁþÞ©ž˜ÞýîwU#Æ, 9ãÑG ÞžÀÂ& îã¨5agA >Ú,ÆsùCèK4ð¢¯QæƒtËÛZI·2¨‹‘σ#à8Ý ¸ç•î„MGúÒ|öé/ã8±"À ÇŽ“°ýë_‡¬Ùñ'AÝ„v§>ue_œéJô½nG 8[l#ÙàзK/½4ä²5‹ÂpߣgPÍzâ‰'ä¯ý«à¡æ#º€L!ŸsѾàéÁ g¡ÐÒè¯á‚'§Ç{,¤_qÅ‹èÎtÚ%%%ÁFâË_þr0æFE©;†–˜ 0>™€qüÚµkslçÔœLyÏë8Ž@¶"p²ãa¶ö#[Úå H¶¼ o‡# Ø‚›sðîÄiÕ,€9ÅÚ€" avœ¯½öZùÊW¾Œ°í„ôî"¡Ÿ0dôõÎ;ï ‡ëqÖE4ØÂ™s3n¹åùîw¿+óæÍ Ò cN¢ùOæžòº‡¡öŠ+Âî>qŽG€÷À»Âu0v9¨¬Ù÷ùøÜã8Ž@n!ÀxÆÇC<8ŽNÅè4ÑÅ2ö çëIÔ . tSuõ‰4&ƒCä~ ùØÇ>ÖL*ÐéFu!c>hÂsÏ='<ÈÙ3·ÉÀlAæÏŸÔÑPKû›¿ù›° &1)¡p;ÿØ‚šƒ97ƒó5êêê|j?ÜEƒç²t÷6È{’#à8]†€Í7]Ö€nV±3 Ýì…zwrè"yõêÕáà8NžÞ²e‹ÔÖÖ6.ä`:XÔ!àÊ›»ÿ7Ýt“Ìš5+¨eõPõ¬(ÍÜD%Ñê}ûöW¼gçYóeý2µ5Ô~8å‰ ‡Žâ¾Ð_ê… }ºŒ9²¥,ç8Ž€#àÄ‚s’‡øp$>,’# © ƒžíà#!±]~âŒ1‰¥â,#b}NôaºÀT؃`¤O@%ÍÊðl÷v%΃#à8Ž€#ÐQR磎Òñr"΀ø·Àp²Tža¾Pµ²g®Æœeu‡¼qŽ€#à89‡€3ñ¾²žñ’sjŽ€#Nl±Î:r…6Ì’Ÿråy;GÀÈ]˜k|¾‰ïý9–NÉH;΀4A æv·)ÖïGÀpxð¹7^<¡æ Hü˜:EG m¸ŠQ´L.iÂÃïGÀpÒ‡€K@âÅÖxñtjŽ@Zð]˜&xMâ"ñ&LüÎpGÀȜɅ·ämt’8ÒôU@ä*XMxø#à8Ž@úðÍ®x±u$^<š#V`@|L@ì´~Õœ¸#à8Ž@WÁŠ€í3 1€è$L!à HÒÆ€4Åø#à8Ž€#àä΀äÂ[ò6:Iœiú*˜ zpGÀpÒ…s/Á5âCØø°tJŽ@Úp¤ b;¤¡¡!DÚÑ”ÃïGÀpxpæ#Š3 †„_@À¦—¸á5¤)ÅïGÀpøp&$>L‰K§ä¤g@š FÂÇ&LüÎpG =8ó/®Î€Ä‹§SsÒŠ€3 Çõñ âx|<ÆpGÀÈ6œɶ7âíqÚ@ÀæàÀp6GÀpt!à›\ñ!ë H|X:%G -D™TŽ}l‚ÚU°š°ð;GÀpøˆÎÃñSÏOŠÎ€äç{÷^ç0Î|$^žM&ÉáWêMwGÀpò g@òêu{g»΀4‹Î€4ÇßGÀpÒƒ€Ï¿ñáê H|X:%G #0ú ص3 MXø#à8Ž€# 8’ oÉÛèDpæ#†Þ:ÒrGÀˆSùõù7>\‰K§äd—€4Á̤à H~ç8Ž€#àä΀äÂ[ò6:|&†Þ:ÒrGÀp²g@²ý yû\Òg@šãáOŽ€#à8éAÀ7ãÃÕø°tJŽ@F8zôhFêÉ…JPÁrÿƇ¯3 ña锌 •€äû`è HF¾r^‰#à8Ž€#+Î€Ä §sÒ@¾3Q„{öìénx£€ø½#à8Ž€#8’/É›èDˆJ@¢ñùxâ Y>¾yï³#à8™E‰»Ï7ñaî H|X:%G #øØ³OMXø#à8Ž@z0ôPÏOªÎ€äç{÷^ç0΀4½<—€4aáwŽ€#à8Ž@® à H®¼)o§#DÄ™΀øÏÂpG SøÜÒ΀ć¥Sr2‚@¾€QQ¸3 ùÊy%Ž€#àä5Ì;ѹ'¯Áˆ©ó΀Ĥ“q2 K@š†ñà8Ž€#à8¹…€ÏÞ¹õ¾¼µŽ€«_E¾½zõr<"xø­#à8Ž@z° ÀôPÏ?ªÎ€äß;÷ç8ù®‚}}.‰¢á÷Ž€#à8Ž@n à Hn¼'o¥#Ј€«`5B!΀4aáwŽ€#à8éAÀí?âÇÕø1uŠŽ€#!PÁòà8Ž€#à¤gBâEØxñtjŽ@Úp¬&ˆa@\/· ¿sGÀH>ÿƇ­3 ña锌 à*XM0» V~ç8Ž€#Øèr H¼Ø:/žNÍH;¾Ó±I@šbüÎpGÀp²g@²ý yû¦näLH·‰|9üÖpG mØü›¶ òŒ°3 yö½»¹€3MïÐ$ ŽI&~ç8Ž€#/®‚/žPs$~L¢#àdc@2TWã8Ž€#à81 à H : G “°Ûï;þ ÄÉä7ÏërG p#ôxß½3 ñâéÔ´#àÌGÄ0 GŽ Ÿ¦X¿sGÀpâCÀT°|þSg@âÃÒ)9A ßÀ¨!`AA=z4|2¾Wâ8Ž€#à8FÀNCèÌ!`"à|gB q$ ΀~uGÀH6ÿ¦‹~¾Ñu$ßÞ¸÷7çpæ£ù+lhhp HsHüÉpG FL+F’yOʼÿ 8¹†€3 MoŒI¤ GÀpt!À|ãóo|è:–NÉÈ>6Aí H~ç8Ž€#àä΀äÂ[ò6:œùˆ€¡·®‚ÕrGÀˆWÁŠO¨9?¦NÑH.n-x¸zsLüÉpG ~˜o<ć€3 ña锌!àR&¨QÁr<šðð;GÀpxh”€‹—n>Ss$Ÿß¾÷='ðÅvó׿6 Íñð'GÀpøâH\È:’NÇp2Ž@ª –3g^¡#à8y€«`Åûš‰O§æ¤Ù¾Ðn‚ÙU°š°ð;GÀpøhTÁŠŸtÞRt$o_½w<ð˜æo <Ž=æç€4‡ÅŸGÀp¬FÀ¬~=Þ8Gàx\úÑ“£ÇŽºD¨9$þä8Ž€##&ñù7>P‰K§äd P3)¸ÞŒ}í¼"GÀpò×@ˆ÷Õ;/žNÍH;Î|4‡<“æ˜ø“#à8Ž@¼8/žÎ€Ä‹§SsÒŠ€€Íá5<‚xpGÀpÒsÍ7é Ÿ4ÉÇ·î}vº.éF/Ó»â8Ž@–"à H¼/ÆxñtjŽ@ÚðwÄ6!¸ V&~ç8Ž€#/&ñ¹&>\ â#å”GÀÈFÛCÿ«Xœà“B€Áÿ8Ý ý«…W÷êS'{cc]굓ds®¸ý™lxWÔ™Éþeº.g@2¸×çtà±(QÜÀ€€‰MÆ€Ö‹:Ž@!Àošß6ÿ<$6[ÉM› ìê¥Ç:^Œ]+^<š#|ÁÝ3“‚ãÑ„‡ß9¹Ž€1¹Þ8Ûß»woáÓ«W¯@¶gO_¾D¦Æ~æg@âüF‹¸$^<š#v25ঽ#1T`“‚{ÁŠL'ádÆ|ìß¿_žyæÙ¼ysXtçó¸WXX(¿ûÝï¤j×.),ì-EE½åСC’¯Lß…9sæÈìÙ³¿™`òït ΀¤ Y§ë¤L ²ihvÚH‚“B>/NÒ®vº7Êç>÷9¹úê«eôèÑR__Ÿµ;ÐX©=ÚòyDaŒ »ç“ñí²Ë.­Bö)cV[ÛdÿfT©ŸÐ³g÷UY‡¾}ûʃ>(Ë–-“/~ñ‹R^^ÆÿtÏÐçãs}ã:u¤ó:GÀè"Âäîª]„¾Wë¤êêj™1c†ÜvÛm2lØ0ihhÈZ¤'‹Ó6Æ¡cÇŽ¥³h™úÕ1=÷è¨.Æ£ÁÒw×E2ý*((É“'ËÏþsÙ·o_`@¢8¤ó>ÝLN:Ûž´ÉÆ·âmrN€@w`NÐíã’q<ŽƒÆ#œEõ"$EEEáCGXxfsر÷>rT3’BQ©DA¯ž2¸Ûη¾¦îˆÔ>"C(½r•{É!­LEŸ””î÷اOe莆ïc&êÈD=ÝïmµÞ£ìþE·ÞnOqòL €¹°˜¶,³!>š–Í_’L¼Ëlî¿·Íh ~¿GŽ‘ƒ†Ì H¶éàÓÖ^Ê`ìÞPîxbƒ¼¥LÈ€¢žÁo—.W¥º¾AÆ—õ‘[Ï'úèØtT±MãUB]*éJ©FbšÒcåž\¹U^Þº_>²hœ25ÅÍè=¼|‹ìÜH>¸h¼ôïÛ[)¨„DÛ§¢™UpU†H×Ñ!ºW/jáC¾Ä­©q% dßßÞ½äðáÃRWW¾|WLú“îû˜/Â΀ċ§Ss2ŠóKÜ!Y›p0Îäc ‹§ç8™C€ >ŒEÑßv¶ŽM%}zË;OÔ¬VoÛ'ZU%WM¯é#Kum¯ÿ´‡$vê÷8,¥%…aé_{°Ajô¹oQ”ö-l&Õ¨;t¤1­qb©Öp¬‡hé•T÷ª; ³vXеü“éHqQa`4(ÝÚ:]¬«Ô¤¼_QÆØ[G ߀IHj2% Ð$0!x™ÂÆcãŽýòÛUò7玒3&’G^­”gÞª ãc‰2û•m*õ«Òeªå¹ {äóFIJiŸ^ò®3FÉ ë«å7/WÊ„¡ýÔ#¶¨£±Ê í¥N’_ŒàÉS¢’”ÝY¹µFNŸTžªV¬ K"w‚†ÿmŽó¤Í¿ÍSü©£$ý³u´¸—sî€ »ñØ'`ÈÍ={Ì'óÖ› Õ´qHÿB™8¨8Ô oØ­“àQ™0¨H÷+t ?«#ñŒ³ÖÍŒ©š¶pç&†8 Uûêä)ÝQ¬­;¢H eôZ¦»…“‡ëÄŸÈo4¹¢ ‘Íé7Å'&o«ßÚx²WÊG1åæƒ+iG { À¢§n° ^JБHjUÅ OTL é[ +tãä‘Ûå%½Öªd¢VÝöŽV¦ãÌ‘ýäwËvÈ/žØ(ÿýüÖPl€zɪWÆd¿³(ï+ § ’J5RHË#Õ`©QéõÁèTišÆ:‘jU¿JxÆê%WÍ¢*W‡äû®“?¼°E=k©z¨ê€ùXdo¨å«3 -ãÒÑX—€t9/çt3l‘Í kº®\;2è&|Ì‹ ,)’KçŽH-}c—¼¶³^ª§—iê©…ðŠîîÕëä×Wwä6«:ÁÂiƒUú<§šUû+óÒ[æŒ(#Õ“vìÚwP^Ò¿mª¯LÚü‰å2Xýë÷.è%åêÝ”„'Ô¨S ÈixŽé] …š^TXt©×¨›ÌÁý‹ä­ª‚×˜ÓÆ—É””Aé/k›ÖkÚ´aý ˜ùªKݧ°W˜ä“Ú¡ž“ùc˜|µm01>០‚ž×ÈR"ƒÂh«>½`¤ŒQÕ(ªP—Ï ÅõgÂØ!ýäg’Õ*…@±xÞp©ª©Òàbgn8s”ªhí–5‡dñì!2WǨbÍ7UÈ‘ð*IUQ"ÿ÷‚1r@ s&•Ële`zi%CT"ò7ga*e& Òñî6}3¨oxƶäƒ:^b _¡ôžÕñöª:•°øžt¨…?ŒÛ||ÌnœF9ÒA༘#Ð0¦+¤“6mfànÐOt£r¿JEöÊ@U+˜X^¬z î!÷艿§-•ÞÜ+«”a¸í≡Ûw>³)¸”œ5¢Ÿ<¸¶Z–oM¤á9¦PUêDüìÚòÓ¥•ò ] ÞµV'ù‡4/Œ ôúü6™7¬DƨQè[ÊôàæÓO»Š¯¨”ûVWË|¥¿Lw%_Õ´q:‰ÏÖ D˜’޼ƒh¿]æÑ½Œ#DGå¡‹…ß9cÓœñåáÙâp{‹q8 ’n|y.W†á‚S†7ÜL>@&X½Î×DïV8ôðý²°=9{êðŒäÑ•*5Q©Ì“+¤^Ï"Ak’2'ý”)!t½¿ÀÐŒ¬û“î92ë:œæ9’f€¼#žà»@IDAT¢‹ÙtЋfXhë ÈÀTGnT  ÜG¢²píÜ¡2G'Ó:ÎWF¡T.êg³zgY¹½Vö©ç—]ûêå%uù Õ›ž¯’™#÷ÒŒzUm@¯ZÏè’ÇÕwþë*½xÿiCƒnµõõ¦UòÁÃ3q œ9e°¼¬Ò”ï<ñV8¬kJCžUO1 Ç Ïâö>¶!´Ý'CÒ¯Ž€#Ð^¢Œ‰•i)ÎÒìʸF¬df˜"ÚSÖhØ5uϪJR†ë¦Êƒ+u¬Üy@³Sæ£XϪ u¥ªŽTdvÓ+s€Ïñ¾\g@âÅÓ©9iG ]ƒ``bn}˜Ç’³ž£í‡ù9 ·LÖ=˜&GÒŸ\[%EºsX£Œî$è ŒûÈr•” /K¨DwßÜQ«:ÖGeé¦}¡’¾ªveÃw¤#Ônt™îò¡¶E(V I©~0Eÿ ÊÕÁf‡&hL™JIÔ‡¿GÀp#„ñ$H³¸T†ÁÊY:åqa¹Ÿ#·¶20¤ܱùdã(y°ù Í‚ÕAšÝ“fôˆ;U%2Œ¹lº "–8%=A£‰R‚b´œÕ‘¯WS£Í×þÇÝoWø‹Q§ç¤èâ=Õ¤´®ë#Sebj…ñ0o-k·ÔÈOŸÛ"ãTຳÇÈLU…ªS¦€kDâùø:  ~$u«Qj¯‚½’ÖBj¹Öòu÷x{¹¢} ï£i›0ZëmtœE€Sv·«mGCrÑOGªÔb¯QÚ.ÌE½zy™Ø²ë€¼ºe¿T«7—ÃÊ„ŒÔO¨´â¡;ÂÎݪBÀ‰Ã3Ç”…ôÝJ[S”î½w¯–GÕ;Ì;Ï&ö]Z/u5zo ’]x‡ÑÏ ‘z*ñØòÈ»ƒÜV"ý§¶"鶈Hm§éd3¶˜£,设þæ³ý7Šh~ðbUœÔëÆi%º¨/J:«hÔÈ Ö¿ÄxÝI0"!&$"í8˜ l6ªUýt@ßÞÒ?y6ˆÑcãTu6h¨› ˜’pŸ ˜¸×¿‰ØíQ#,.Y$äµ?x¬9 ß_½p]KϧkÓ»‹¾·|B þ¾:?¦NÑH6¦­‚4.Ós@.×_ú''Jª©*Nx̲¸ÉêêªiuòüÆ=êëÌÙ_ÊÕ]åauÉËnÝ{Î)O¬©’¿(ó1B½`]|Ê” ‚±ù9£ú›’²þ}äCó‡Ê6•dTí­WO0År†ºµÄÞ„]¿óÇô×ü‰¡¶\ LªXLÄ—Íý¢ìdõ‚…t¥&0HñO:QW¾¼Wû€‹-ʸ·p¢tòEU ŸâLïHOÔ‡L¦ƒM*FÑúIOíc&Ò©—zV?ÏÜ[¼]‰k)XºÑHÍÓé´•ïßîÝ»¥ªªJ†.ýúõkö½·ßDj{»òˆyHM^^)÷«“Š+§WÈe§Žªš´m]å>¹ë…­òž³Fzáí%ßajÛž-ý-½1>YNG„Äy ÿ­Î7®™3TNP!¯«SJרÇ@<ôý÷“oʯ:mdÈŸ(•`D¤1O¦@;Jÿ‡~ýøÉM2º´HnÔ¾a\ùʈð»I3ŽGÍcÚ‹€3 íEÊó9Y‚ƒ`k ,ib‹ÍÀõîTõÔ¢›uaጡ‰»dd©îò]­é~]øÃ¨È•D˜Õœq —¹HJú÷LÄRi_¦®Ù½«Á:yb/‚š ÈÔ¦µƒ¾ÞwÞ¸P;Õ–d¨h.˜6$LîK^¯–ºóÇ®fÜ¡°°Pz÷Ö>è55Ðn>-[ˆ¶–ne¢Ì†ÅE¯­¥ýÖÒF[m$O¶§ÓÆ\êcKﻥ8ú 'Ê“©t«g×®]òýï_JJJ䢋.’éӧ˰aûà}ðጜìã`òzÈNuý½J`pfÞ÷Θt0Ö0Uj¯=?׸œe„´¡/ÒŠÞ:žÙÏšñ¦^Ç1$)xØ#ž<Ðè­ÏaüÒzª«Kg –aIÛ·—7î–§ÞÚ'3t<¥ìn= äðÀ£¡,9°_c¼bô@ê Àú*ömØÀáΗ€Í[¡Æ“ Æ`Pvös§öë Þ¿¹“±±80 D¢¥ºÿ=ß_>Ùó½Ì}ÌÉýwè=pr°k–²¦†)H ¸­,Sp ‰3EøYÔªá¸N 6‰Zž(m›a^ƒU£¢êÎL(&}AaÝöýò´ºþ=l¯ìS• Î(Y8¥"2I¡FʾáÂLJÃ{õJ, l‘Ñ–&:›[J–¦§Æ“ÖV8ÙümÑê®iƤårÿNÔ‡t¥Oš4IþùŸÿY–-[&O?ý´Ü{ï½2wî\9í´Ód„ 11‡ié7iÌí÷°~û>µG;"—M)“åê¶vƒžfÎ äÆN·ñl«J-Y©vhµ‡e†JR9”qíâÙÂôáU=ãã™7ªe¯ª—V¨„wºÃe…sŽ–¬Þ)CõlŽ-»ëe¬ÚÂÓ âG”—âvÕI‘CO«£Ž¹º!3TzÝ£jXHg^S·æƒ•a¹ä”¡¡më+käeÏF¨¤ùMõƒs¦ž´Oó?µn· ×z.˜9$ØØøjøâupnÈœ§â½Ê¬¼¦Ìž ‹ÔVîDß £Ñ®Ñï ß…èswè_WöÁ®DßëvN› O²XÚ³3y%&¥ÄηU3â™vuÒLäHGBšò4â“é¡< Éô  iÍi‡"& }ÐÔ@Îê8® Izì¾mÞ™1r€Tª gˆ !ñéo4 ÈN!w’¨!<¶ú'úîzÜu×]R\¬'´+ó3rÉ%—ÈÔ©SCùuëÖÉ£>âYŒíÛ·O.\(óæÍ é[·n•x@êë냥®®NæÌ™# , ·½{÷ÊŸÿügáZTT$µµµ2cÆ 9ÿüóC}Ð{øá‡eóæÍÒ¿©©©‘‰'Ê¢E‹ÂzK–,‘5kÖÈ€Byv©/¼ðB8p`PCxê©§äÕW_ ù:Ôi®¸â )++ m|þùç套^’>}ú4öƒï‘#ª"«V­’'žxBúöí1p ´ƒ°qãFyä‘GBÀfí¼óΓ)S¦„tÚNyvËéãþýûåÌ3Ï 85ŸÇ{,Ä“NŸÀàŒ3Î4ÁŒ«««†`IÝgŸ}¶„ü,©‡Ýzò=ZÎ:ë¬Ðfúüâ‹/ÊÚµk†Aƒ…ò¥¥¥áû÷Ê+¯Èk¯½ÚwäÈ‘ð¾é#V®\>|Pí ^è:4¤ƒuNyå§žzªŒ3&¤WVVÊÒ¥K¿1ųgÏ–ñãLJô;wÊË/¿Üø=¡HÀLy賈uЧ±cÇœxä§{öì mã{Ê÷à”SN Ïä§;vì}ä¹¼¼\fΜúJ›ÁgË–-c~“ôï4˜Ò×+VÈøïò Kå£ýhøBŸ÷ ]l¬Àl…:ÈìCe—ª‡.×s‚æ©Jô O}HüáÅ­²nW½\<µ\ªÕÓÔ×TË…ºg [¯jMÿùÔf=k¨D.œV!Ï®«–Ÿ<½I>{io¥#òÜ[5Aê;f`‘Ì70xÿûók»”)é#`ˆdx·2.ƒ”Ñ@‚óóªJf†+34uH‰Ü½|g´\wÖèÀhܽªJ.ŸT¦éEòôúݲ¼²VÎW*ã+ŠåOJ·2ï8}TƒÃûQz$0P×Î!Û÷Ô…“Ù/Ú[§¶x‰»ò½tEÝaœWl¼Ò è†uví¯»ê]rÒ@t!›îºÚKŸ9«¥v1•Eã“s[#Ù0Õ%滦¸”çèê>š?,û£yõÞ ­µ‡JŽkC„ª ìDòI ‘l!)H]R3µó™IŒ…:‹z`Ä¢Ì÷,üY„Y< y ,ÌXÀQŽ…#E¶aÍ•ü,ºI'Íò‘—thP7 B>ÖK'Žvò1½g£O L¥|¸NΔ¡ý”!Ýh%J&ʲh'À\P4,P†²µ Zä³À= cÉôÕî©Çꄹ€ ƒÑƒébánm¤.˜”íÛ·‡táéÔOúæM›¥t`i°]0fŠ6Ð?Ô‰6lØÊQ ðh±wxã7Â{¦ý¼3˜$ ´:í£=´›Å·1 ”g­tiûxe.Œ¡ÍË—/ïüŒI">¯\¹J¿ÓD`~B€+ùa¨‡¶7uÀ“N0Š0¼0ŠÐƒ‰ƒ‰áûCW¯^ú]Þ ’ úDyú“Ä÷ÝÞ/ßièq¥¾ââÄwûG?ú‘¼ùæ›rë­·Ú|gí}f™½²ÉÐ#,À_דÂ/›6H†êB¼J&z}·zÚ«kt Îx„dÛî²rǹaîPY4s¨º?,H-Ú¢NºbÓÞàLãêù#à åÐûÖCëeµ28SÔ®XÏ,š¢¥^{æhé«e°ùÀùŒ'›OÐ3;vÔ6èéè塾=ª"5Q™‰KUíò•‚T֠–8±\–EÚî‰zÐa­Ju—*ƒs‘JHPa]£íܵÿ`Œ VIÒÇÑ ñ¬ê§£•á@u¬V† õa샾^ò&ðÛäÓµßÇî·3 Ýë}zoº9 €„lïÓ¼èœI IA4ž¸ ÆHöÅ$ÄèY˜Ð-K">DrúÌxÔbבÉ3 “œ©£QB¬*m¢mB¢=‰É4Ô­‰ghi¢až¬¶ñBýСîö„è;cq{ÕUWÉu×]bÑòäc§OKô!C†È 7ÜÐRrÀæeñâÅ­¦³ ¥þ–ôYh_|ñÅᓚ‡t»ìäóI ¤ƒ»Û|Rƒ¥Ïš5Kø´X$êSŸj-YÆ/·Ýv[‹éÔÁNýG>ò‘Ó‰£÷¿ÿý­¦ÃÞxã-¦CŒÀ°5Á‰ŸÖBkZ~¤|Z `ô…/|¡µäÀüŸÿÓ:†‚âŸhµ<À ´øÝtÓM­%Œ®¾újá à‡ÔæfÛ¶m¡áûÌ÷) óC=èÖ~Qz麷º7êÂgkTEóÐK[e½à·OŸ±ã\"S½bb‘_ ï~°JKx®ªPÁ¾C™V[ Õg;u¼¿Ú½ Ñ…>jQØ@c¬20!DA`ÜaÈ W½Aò2\ÏR²aInh7ÞþÃù†©£r¶RµÁÆäè±£ÒG™þ…ñPiÛHV¥.Ì7Tׇ6?ðÊVu}®Ì±¦¯ÓþΟ˜ðmÊæSWیɧ~§«¯Î€¤ Y§ë¤ ›ÓD¾ÝduÞÓ‰.‘ým5ª“¼K&¨ Àé“=aR˜È–èéä3GèMe"Wò–4ý³T[¬&âCrãŸMUµò×åÛåÂCdÒðþj$Z§åQ­jSxZëeâ!9C Õ,˜$`0àȃšVW3Ö®oªôã±7käúYƒärUsbÜÁ&ä÷Ïo’ûÖî–Kg¿ûz¾çMZ,oSÛÎÚ©™"¡U^*,\cf«áøS÷Êo–n–éºqò’ŽScT‚1môÀpžÈ¶ý‡}k G•Òæ,$BIŸByCÏ'zZa5VÏ@ÒôZÝx!0ï×Mc$ð¤µMU´`8®Šýˆ¯Hqzkû¢¿$8Oªz™ªn½SÝžW¨[sÒW½µ[¾üÐFY©*dѾð¾RÓ¡¢nøÇúÙÒ¸Ø »›‘.9’˜½G m Œ‡bÇ©Øòœ¼7ÕcËǧ•I2TMÁ&ÂQýÔݬîü˜_Û¼W6ª ^0¢d‡qš2'0Ûv×É*Mߣ‡_ SÝ虣Ke zÄbâ$¾ŸN¾Ü£ªÀ¹ ÓGôWU…‚ph!zÖ{u²]®f¦«!ù0U¨Ô§«CW—³Õ¨“ÊMXªg™RU}¨Ô´ÚΙj÷Q­Æ¥«U皺gè‚ x|Ñv[_}8¦;Ÿûdîâ°c¹ZJO›Tqœg.ò¶'´ö>[‹7š]ŸNK¢ÈXËš®]߯Ün_@8Ê%7AÛx—+[;±ác-dÉ“’ ÁÚ Ãq£2ó'6yÃ#nzÇë§c…ŠþEò¾¹Ct¬JØc¯¶Ctüi¨Ð ˜„zeN`ØG–÷•[Ï-/nØ}D0Æ,RCHÈ-ÕI»RÕÞ{Î(yÏÂqrÝ©ÃôÀ­Y£’]¤ôQ†£‡æ»YË]:gxPm€¹a'nšJ<ØI,UµsÕ&£L]T"a€»`ú`yÿ¢ñrºž†¾J‡ÚŽ>É˳u·ð}Z×Ì!}ÕsMœ§§ `áX¨‹«D/YxÀp%zÄéÀÌ5w|™ö¹\Û!êŸ_H$y=8Ž@ë0~Áxd‹´£õ–6O±ñׯ‚橉'$­õº!sÿÊò‹§Þ”ß¿´Mí?Ôå°žõA ï6~óÁ˜q²ÃFr8JTšÆ¿0M¾ØN}wi„,’#„É[{ºG™‡GÔõî(õàrÝi#ƒ6ÌÁ³¯WÉoVí’ó§ï¶;ÕƒK­JÐož¥®(ÿ¢žcè® ’†ÕjŒ>XuŽa28ü¡õ›äÑå•A¥ê‰ÕUAz2Yõ0 Ûu‘?@m4lB…ÁÙñ“²|g¼¡F䨔l8¦'ù64¾˜™ªˆ§ÒM{SËš{JìGªTwÛB•³Ñ8›®¡MxYm\Ö+òѳFé)é}²M]lþ»žlüÂúj™¨m¥}©»Ž”miB'Þƒ#àd~Íl6ÔBSÏÅÐÍÄŽ??^ÚÒ$ù´§ý~“ɉ¡AØ@! šäe¬ã§6P†ûfÒ„@ˆ„P0Ü4åÇî"±a£ !©u铵…â4’mI–Kƒì™ìÑ>…ê“$ô騲0žcG»Cs5Þª;® ”Tb”Mmc‚j÷økØuÞtm/œéZü½vGà¤]˜¥NªØIg¶AÖ®QL.Î꧆³UÕ ºóäh¹¬W ge0¹/Õ/0”»òÔáRªþôßPõ¥Iª~5YÜ‚)À£ ’7©„áµûxEm*úª„â½g »ˆ,Pó¦ÆëaÆU 8¨kÁÈ’ å =x¾šªêQ+Õfd¨fŽWÚ}´}ÀE®^iŽj=ðý•Z0BObF<£a„ªjõæP.M#ûŒÁÅ2z—½aŒÔתw¾1*±¨*ªoèýZeNS*³ÇrQ¯ mÆKàk*áE}õLmR Ú½Té—«z+öi›Õ!ÈT¥ÁéìÀ¿üæ^)Ñ~>½¶*¨R¡NõœÞ¿¦u°‰5SUFg«ÄcsU­¬Wï…TíôY=àðŒÉƒsR£ê³f ‡„d©ª™îÒþÒqö õ ˆ£lïžY»3Øÿ1_¬Rip™Žÿ /;»&%2\vÝK¡fg@b1I¢ùŒ]§ä8iB -¦ 3U2°ÈOÒÐÐgn‰.»^¶sÝíb‡I‰;‹tò1ù©äa£ž*ü¯K·ÉÎíjˆ®¼À5ÓJ¥¢r¨¬ÐE;‰aGOÿŸIËviuoFæ¡c¢'ÏV—=C¯—Π´ãô)¯y‰Ç«–ír6¥%˜%vþ¢ui±°¡ £É} ¥ù Ðníý }éÝ»·ÔÕÕÉ#<"×\sMÈ„‚þÇp2Š?åº[¯?Y©ÑƒOïÕ³&–õ‘É*Ye1¾¢r“ÌÖùPÍ|lÝ©Su¤÷©Äo~¿yu‡Lм§ ï'{Tmé'ÏlQUЙ  úû£„2ëwÉo_Þ.çO* ãÓ¯_® ^úæ¨ûî5ºPhC\=­\*<*¿[¦47ÕÈ8=„ð€Öõ³ç¶Èg•!⼇^­TµÔÄÙC[÷Ô˯4í¶ C]Q{»ªÖzÖøÒ€ß/T*CÒ[j- ÒÆ'$ŒuË6TËݪvvåôAaüûßW¶‡+Æòœ›´O=²Cû9Ói³J¬Ïš2Hvèa³?{z“Th=³ÕÕú+ÚÎUOo–O\0NÊô¤ô庩ôJe­\6¥\*Trý ÚùÕ+¶H’Ã&`Îá`ãº3 ñ½Dg@âÃÒ)9iG€Aи+cÌàºmÛ6yóÍ7ƒ¤-„ú™S˜[RC4>zÏnãÿ;½D'8uµ«åŽ;*»*·È6¬ÈÇeä¢÷©ôí¹=y¢y©ÀÚmtRÓhˆµ¥‘F²ÂãâSÊ[þèl‘|Ô׫'­-[Öv[4Ÿß;Ž@f°ñƒ Î:M%‹N&e} ä?õ Ò÷«bÚ¨Ò v´Z\à.œu‰ª.¥¶`—èyD|ú¯]§™î‘‘Ê< YÁ5÷~eTžWéIiQO9eô€°9òÈëÕòðª*áÐÒ~ê|tÿB¹dö°0Ðl¼ÿõÀ¼M]ønÚY+_º]|ìRiÌ ºà¯g-ÍT J™.ðïTféÅuÕ2KÛ7@éÌUFé =<°R…U;ßЃVhZ™JfJååmµá¤u¤Ã¸¿å´á*™è«‡§ÖG89O$œ¨m?¤.Ñçé©ìœOƒ6X%&8ûxUû†76n8I]¤ÿËCd¹ÆŸ«e9~´:#¹xÖ° iÙ«R’ *“a`@2ó:3R‹3 ñÁì H|X:%G §``ewžùÏ~ö³RRR"‡ŽáaáÏÞ`Xì§ u"¦Š¶ñ9Q¾²Í;S¶¡>9r$H•öíÛúRSSÓAJ^ÌpâB Á„$¤¦Â‰MÚ]è—%U:Y›[n¤¬Hƪ¤„0HUFG©:Ö~U_ ‰ ŸCʬ`˪èRe³U=j°.Ô‰gϧ”Cmkž{mì<8§©.Þ¨zë3^ý–¬Þ™wL.Ó¼E›!8Ý ôV{·~ª²E¾…ƒ¯þ®Sõ®•zx,R‘²> U1ÒB>þ$C°QѶàª|—ªsÓ>R‡®0¸QG*ŒÌm*^lä¢RñÙ þØ<Ô º’]p$+^ƒ7Âh,¢ù0¦#@5¡¾}û†z¸÷f÷¶Ø¸ô#\Š#Ð`8Gˆ¥7‘\˜Š%ã 癢J`¸U$$§‡T*P¥êIS†«ú–2Ûu>ch‰2 #sÆè-å~*AÂc±¥ú@ð(…$˜:P¥T@i Ì ÁTIYÄc_V¯ÌÇe2.š54H ƒ4&‡~Ð>BÂh\UAidò™+N<÷¾¼Mö¨×Á]8!0=ËÕÄB0¼×rÆ8%Œ“jÓñâæ}IφÅáZ©¶2sF%›¥¶ŠïÃép®Rw éš{»#V'ê“3 'BÈÓ,C ];ùL†½Ôp©ÇÁƒ¥¸¸X'Æ#’:tºÄ$Ý3Ø¢¬]»VöìÙ#3gΠϵµµRQQTƆ.UUU²~ýz9å”SdÈ!²fÍšÆó AªóÜÅ}¡~˜°c˜3Lï,N^ÞpN¤¯Õ ñ†£zxj͡ƃIñä´a_Ó9AH7*uáÀø ã²DÕ©¨#7Õ^d‹æ½ñ´Ò ºT©Ì "Ù˜7v€üáÕ²j“²ëøú¸–¹P½na¼½GÏÚ©ªJ¶Lß¡gU”pööi"t§.¼ Î^"¯¨Ôb”ªaU+ý¥êªüÝz47jh/Fd‹ÒÄ}.€o)Îf–£Ç1õê¥ÌÎvUÕÚª*RËÕëÕŒ!‰óŒZ<©v&‹ÔÐüUõ‚™Ø¢˜À˜2f Ü¿¶Z~ûü–`ÿâ›{ÃqÊèa¡Ï%ÊäX_ö).;Ô® ŽG 5œi w²&¿t1 =t ú¶0æš®úNÞ7ÞxCþøÇ?&ì'`0^yå¹ð eÅŠ2zôhÙ¸q£ìÞ½;0'N”×^{MPsžåï|§ôë×/ì:v¦?-í~,=ì ç“ÁÂó:ù„€ýæìKßuŒ+Wu§žRÔ† •a¸~zyP§‚þ°Ò>rý´² ¦Äó´a%z¶GaP…B%©ŠG¦è½F™ÜÒ~èÌá2]mE@,PÛÎB2q¦z“¢Ý¯lÚ˜ƒYj«1MÏ+Òcƒ·*Î5Ò¦„Eü¢ ¥Áxœú°¹yF¹ÞÚ;,ê/W[“þêj‰20 '”‘j8^£g-]=e`8Ljr¸Õ½jJ™ºÐ-æQp‰þžYƒd¯¶ó¨r5Wê™']¾]žQZSÔŽãc§ .„7‘¹ãÊÕjÏ‚7­C ýÕSa­Ì 猬è+>{¤<·~·<§ÆéejŒþásF…x$8ØÎ˜+bê¡Æùœ£D[ ‰KÆÛX¿ ¡…müáEBFëŽÔÛoéŽoÕûÔ­8Ùo{Á€nºh·· Ñ|6Ùs”††)Âý÷ßÔ˜nÀx 9ýôÓƒ”¡²²2HKxÆé!J3DœàOt²i ŸÔ|-‘æ!Ý™–Pò8G €ýVñÌGˆû÷2~è•D HT¦¯?glãýtÝÙçcáìéCÃ"š¥è1'”…˜9ºLU°úu,l4½zö’+æ ÷üÁ…ÃäÌ)”?Öxh*io7ÕzÛi£‡¨Ôã†H{ÊÕ¾âjM? ^ª°±ú*Ô#ÚnÎMºöÌ1t°i¹FÏ(BeÌʼw‘:Ñ…<ç…`h=^³n½`b¾tæÔ!$7†c´¿£Ê‚!>jaÉ.+“ÑSñG4æãfA´oúl.Ú›eêÀƒÍOlÞd*4g?sH¦êîîõ$µ»{7½Ž@÷@Ààtô&uœŽ::JÕ%Œ·W®\Ô—PCëñÇ—M›6…û3Î8C^|ñÅ~Î9çȬY³dÙ²eAÕ éádð3<¢Œqêïß¿?0A©yÈkq'êk{󈎧;Ýû­š­TWÿ^l!Ú£ã@ƒJ ¶°oëô)T[ŽÈ‚¿­¼m¥õí­g/™Tá$´›¬ ´‹TzcÌÏÖ/î‘Ú$›Écc°ª°ƒA:cÌGc† ÝØw€w`ß UÝXµ¡1Âo:Œ€K@: tº“Yäž\ £SÑñ%màÖo“iv|ÉÎÇ@I‹ÿgŸ}V`6f̘!ãÆ *X¨e1)aïñä“OÊÞ½{¥´´T&Mš$=ö˜L:UÊËËCž–vRSÛínsQC¥ ÉÊ¡Cª´å€ÖÈ‘#eÚ´i¡.Ã'•fçQp Ž@þ À.÷Ò¥KåöÛo—Áƒ†?ÎßT8GH%½t5Í¿?0¼æ™sŒçõ ‹r\Ñ2&pF‡öý×k»eçcUÅ©¯æM,†±Ç`¡ŽËz$ Û)K ýfäÍy!È0\'PÎÒÉÞØž$Ý($ ´S›Ü,6*” éV.´éL¢ÔÄÔ•hV¢ V'­&/øÐî„a}¢f$Où`3 ½Oí³õ3›ÚžU ÔþÞn>±Ñ„ƒû>صý”:–“úí]vŒ‚—Š"à H ¿w²Ú´ ¶'˜)¢õFï,õ9n±éÀæc›žQr¡ªaÁ\ÀŒ5*LHD0@ß­Fêgžyf° yúé§eçÎ2}úôàÕ‹6µ&ºgR±>Ø=j[0;<ð@`\&Ož,³gÏ–¡C‡ÊsÏ='ïÿûåÛßþvP ùÃþ“‹/¾X,X¤.6Qݸ1qzŽ@wF€ßÏÀz‡2÷0 0þ]ý[¢MÓ§÷’·]Ð3¸ÀÅvÂÚd’š n¤ãt&BbŒ8ѼÈÓÔ¦Ô禔l½³ñ”r‘†oذ¡Kšjíè’Ê»Y¥Î€t³êÝéþØ„—鞚؛ú„ù˜4!šW»¢ýœ0a‚|àø¡~à€º¡T›$0#ä_µr•  Fžºƒ‡Š Ê’^]]-;vìh\0@‡… ù­O´{lJ~þóŸËºuëäºë®“¹sç†|¤#yë­·‚ú×yçp€6^ºî¹çñùà?Ú瓈ypÚ€ýî‘xÂôßxãAzÙ~ ž³»#ÀÆÓ7¿ùͰ1dß—LõÙÆôL×›©þe²g@2‰¶×åt½L|0H ð&õãÿXÎ=÷Ü þôðÃËêի哟üdJÜqDzxñâ êDcL:Ùݰ¸·þbwá9‹|vÀF°8yûÛß’Gy$¤ÃXÀ œuÖYrà 7ȸqãB3Û#µ@‚Ã@¾+®¸"0 0ViLn0&¨ m!y饗B½wÞyg0„×»ÞèRwÀgŸ}vP #ýË_þ²|á _ÌyŒ~g1ñòŽ@> ÀïÆ{ùÐ_ïcûˆ~/¢÷í§Ðœ:†2V_š˜kEœɵ7æíÍ{2¹µº`B°§`QNÀžé]\Ô$8``eÂCLP¥úÒ—¾$?ûÙÏä§?ýiP½úå/)ïxÇ;‚>ð”)S¹>ú¨üú׿ ÁÝwß-o{ÛÛ‚ Õ¥—^lH¶nÝ*·Ýv›,Z´H6oÞ,7Ýt“÷ï|'Ðä|ŽŸüä'áø¿ÿû¿­‡¡X²dIØ…‰Aú‚[_$$ýû÷—믿^Æò¬|èC’ýèGòÃþ00!œ(ϤåWL_'“°‰ÁoI!õŸÔM6>ÑxÊðœ:&YÞÔüo4¨ßÊÚoØÒ(k›-ئýõ¯•íÛ·‡M Ü‚-òEôŒ¦å1š©ÏÔiuX™h›è²)ƒ·?TM-Dé`Æ×@“ô‚ JŒKŒÝ–×Êfó•¾3ñ0 —t·Û”êhƒ‡xp/XñàèTŒ `ƒnF*ÓJlpg²BÒ£ÁÔKYê°8î£ÏÔSC^ëqâ`(Œ½ä³:éC”mņÍÊ ÇÙI¨Š¬ ¹rµ6Ó>öÉðçE:¸K@:‡Ÿ—v2Š€M"]9èZ2Ùq›pËÊÊÂJÝ,þ1ú&ÎLì6QàZÅééLÊ-Œ\ Ö'$(¨m!áùÞ÷¾v ?ÿùÏú÷Þ{¯Üu×]Aí‹2Ø ÜrË-ñùÖ·¾%ßøÆ7‰ë¤Qþꫯ–î H[L BšGÀh–Æ7âìwŠ3 T.y&žßÒN~ë=ôPP±ä÷‰ä“ ¿üå/9À;ã’S~û¨[>õÔSA¥’ßìùºy1bÄY¾|¹°qqê©§†4Îúð‡?,8»@ý”g64 O=´»ìÎZ“(XûQçDª ó€ô”…ÿo~ó›À±‘múFÀ«mbLC²K›±[#•Oràᦂ6ÿþ÷¿—«®º*lQ6<‰Aƒ@Û¨±µYÔXé·µ-dÊ¡?´›Éö[ ˜rϘ?Ñîìø›`ÿ³£-Þ GÀh6 ·#k¬YxmðÞS ›¥ÅY©Ñ;vl°=ùú׿.©[]v 1.gâF2äj;V†Ý@$©xa?„Îù!,>,"PŸxýõ×ÃäÍŽ!ª ¾“  ÔÀ~ñ‹_)‰õó¢‹. ê Lô«µ}û÷£uËëWGÀèìøó»Ç–‹4›8›` úÁ~T$/¿ürYµjUXd#(** ñË.»,Œö[…Ϋ¯¾˜˜“ÿøÿéÐ…Éá·Îï‰+Ž,ømÄ̙3'8Ä@b Œ9©ã¥Û¸@{¯`„sp!S:’Þ?ýéO±Á¾ ú0”ù×ý×`߯˜Ç˜H€Ázá…0¨ÊZÀu8åP %X`–¨÷âÑøðàÚDÀ0l3“'¶ g@Ú“gr²&·Ö&¸t·0Zwôžz™PãnW”“-vxÅ¹à‚ äïþîïäÏþsè27“ Ôv—PåB=ë#ùH˜Ð±Õ6lXp¹ËÁ…LÖxºBÝ é ºÝLòŸùÌgä}ï{_ª ¶eRvBO;í´À P—µ›xF¨bypx@Êé'‹k¤HP£ÂV‹±,ðùý°É ¿¹Òf¼"?ù`XˆSŽE9¿k~ïäEÍÕ*$©HY6nÜÔ`‚ø}§JV)£ÒR°qWÝÔÿàƒʯ~õ«0fÀô`ÓDƒÏ!C/{HbôµÑk®¹&²j6xô , tÍNþÀD 4è¸æ0f"ù`œ#@ƒüNŒ€ãtbŒÚ›Ãö"åù.D :èÙDÖ…ÍÉXÕôÕúŽíèüãÃ$Ï.à?ýÓ?É®]»Âs{¥0Lä¨J°‹I°ÃÙ„aQÁ"º,N`~ˆ°XaÇ’]J&ÔÔ‹* ’h ,´Z[Dóú½#à´ØH`6`LŠÉ¢š(åŠd’K 8±`Nà ÃØ2^G°ðGÕŠ üüö‘2.àp†Ä62ŠR7L {òØF’R>H^ùý¿l ³8Æì0h 3Ƙ¤°¦6Škoc4ðìãCÛ¡c4‘  ù¡Ï03ÔO ¶9"RþÐ'ÃR’ü±  ÷6²xR;pvåÙl@€I…O>zë/“,:Î,.Ðq>_U ðüÂy,4Ð….ê]ÔlbnmÆ6U ;KäSŸúTðjS‚ÔÕ,v ™ä1p‡6‹Œï~÷»ÁØ)^°Øí$ šÅN&®w Ön -í@†ŒþÇpN$Hž|òÉ ¾Ä"š?l*°Ñ`ÏB; ~çØB`F’Œ¶)ÇXÀ⟠âñ$Å‚Ÿß=› ¨@!õ@¥‹ß1˜l8øýóûFÊ@›°3I€.ã$3Ñ` ~¤ÔƒÌÌÊ•+ã3kÖ¬°Á”F‚º«ªª‚Ñ8íÇÃVéí†IA*ÂF vhŠú~u7NYìYØ61¸ò1F€±‹ƒO‘Ø@5,Ò‘È`F=a¬Kn~ bœbì"ñ‰tÊPQcB*-à  ¦ÍìE胇ö!osoûPéX.g@:†›—rº |œ,LŠðÊ+¯ »^ð肉=%,>0.e¢ÅX=ª¯ÍâÁ“5ÁâØmdBgwF»ÿöoÿ$&LæLøxÙa"g×ò¾ûî »¢,lr‡;¨ìÄ"á}ù¤*x¨¯«.®‘l ­´<ÔñeÞíxî¡¿U˜ ¶AaϤEÓ‰O}&Žß0¿e‹ˆ3)(÷©tQÉÂÞÊQ–ñf6›} ea†–[ Ä‘ny,ž+õGÛíh`lDBŒÄæ¤=x ³~Z|´¬ß·ŒïÃC<8ŽNÅÈLù2YÐO›Ù©ûþ÷¿N^Gå‰~ô£ ªäeR}â‰'äk_ûZØäŒT,ÎWéÌÒ‚1Ü›©1 LØû·Îa×óœsÎ ‹˜ üé3acÀŽÄƒÆð¨mDß žg8¯„KÒ£yB¤ÿq“BÀ~CE}Š‚jãƒ-¢[[RÆÒŽ»§ö”e45ޏ–âI'ž`upOœ©5oå‡,?ùÈcÏ–'JÇhqÆ[‹·gËcϤ/\¸°Ù˜G$¼QÆ…|Ú‡€aܾܞ«-œi Os²èä’…Í‹µIÖW˜w¿ûÝAe€]Eüâc˜ÎŽ$’vôЫf'†‚“ÊÑ“65Ô6¾úկʘ1cÛHR Ð-0a£Ãô‚SÍÑåæl&T!8E\Ø‘`Lj6 îðãÿ8œ‚4…@9ú¡¦¨–՝ހ#Ð ø=EUœì7ÖIGHovŸˆ8®X4O4±µø™&5&Úƒ•­Öy¢RSË×Zí‰OÍc¸D™ òس¥[Ý~=1`æ!œ‰G§âd&ÔI&#gA%Lè,úù¤Nœ,F/^ܸ£ØNx½BU#Š:ãìZœÑ…逹øíoÔ©ð¦sCL ª]¸¾|Ï{ÞôÃy~ùå—ƒú'¥ÛÂÃèø|ÞÊ‚o‘7¡» ]Úï7[úf퉶1Ú6Ò-O4>î{êh6%+°ve¢ q÷©«è9Vñ#ï Hü˜:EG m0æë@H ƒÔ83¾´:ÑZ9KçãÞhbóÓcÁÁe?þxØu… ABrÏ=÷4zÌÂ6&†û‚Ñ ú'ZÅùÕp:†€ÿžÚ‡[K8µ×>jžËæG¢ó8Òy ‚#Q˜<òql¹ßÍÕZz6ÙF1k+.ZÙ ê…'\ëbä­àú·¨(¨Z`4jF¨VÕam²x{ö«#àtoRÇ€îÝÛüèãñ½gg@âÃÒ)9iG€ -]“š-å`mµkÚ;Öá hkÛ…[êC{âÈcùÐÕFòÁ§µ€A©Þ‘•µ8{6ºézVŸ_ýžRG­Åƒi©ù»3FÞ·¸8~\»†|¢ç H>½mïkÎ#`“§M²éè®ÍcKF’é¨3iÖímÛ‰°2ÃO¤*à›ÎwØÞ6{>G Whí÷ÙZ<ýl+-WqðvgÝWòq;F¸‰L'åd&Ñt,^&‡þq†î-ñ6å“vó·j8{2Ø !)R•-܃1‡Fi5¯ÅŸGÀpî‹€3 Ý÷ÝzϺ!¶àMוS»9YœÓ9ø*zfF7„3£]âa'‚+_'»§ë=f´c^™#!ø½Ø¸zõjá`ÒK.¹$œJnM€¹ç P<Ùa›eçqlÞ¼Y–,YÎöÁ%w”–•õ«#p"|Ì>BíOw¤ýXyNG Ë`ò哎AºãÆ“}ìc²uëÖàé)õt9ˆ]Ø0†±1bDð°Å³GÀ8y`4nºé¦ M¬¨¨h$Àéè7ß|³¬\¹20 –À˜Fü“O>)0 Ž àsbGPk¹Œ3 -ãⱎ@V"` Ö¨Ás ….»óœ0>mÚ´°@¶ú8è;&À™3MÊÊÊæ'²i*éwŽ@~#`ã(\pÁa£„ƒH£á¼óΓ-[¶4JE¬ nµ‰çwG°øhY¿wÌ!à Hæ°öšN#`“fÜ»0Ðegž…1gip…ɉ»žNãÀ†#ô~ýú›{§9Þ5o¾#Q8o§¥3Õewv@IDATw°]ãC`üâ÷Å•ÃJíôt‹Ïhƒ½²œGÀ¾K9ß‘,é€3 Yò"¼Ž@{H× ˆ—&Åxi:räˆ3í}!'™÷“gŸ“,îÙG@° z~S`.ÌîÃâmÌL·2~uÚ‹ß/ñ à H<8:G #0‘ÚdJ…6ÁÆQ9´`BÌ]l4†#à8é@ 5ÕEÆ1˜ûÔÐZ|j>vZB ι¶%úù×3;í}vr}&Wß ·ÛpG Wð¹7¾7ç H|X:%G cø ˜1¨½"GÀpG@Uü Â8¿΀ĉ¦Ór2€Ì‡3 Ú«pGÀp’¨´c#΀Ħ“rGÀpGÀèžøæ_|ïÕø°tJŽ@ÚÀÄ% i‡Ù+pGÀp4"à HÁuÒŽ@ºð]˜t!ëtGÀpã° ÀãS<¦#8ÒÔ¼Œ#Ð…¸¤ Á÷ªGÀpòßü‹ïÕ;–NÉÈ>f j¯ÈpGÀpbFÀ˜urŽ@ºp HºvúŽ€#à8Ž@s\«9}r¤³zyG  p H€îU:Ž€#à8Ž@,8 ŒNÄÈÎ|dk¯ÉpGÀ@úáx¿ñ’sjŽ€# œ ÉÊ^‡#àäÑñЉv¥ýÇß{Œ?!-ÜøGÀÈ(΀dn¯Ìè6‘F'ÜÎQôÒŽ€#àä6Œ‹Ñ`Ïv%Íî;÷ÍËDËû½#Ð>÷¶†ÌÉÇ» ÖÉcæ%.GÀÁ.ÞGÀÈ"<ØØš#GŽ„û†††pp+¤oŒÏ6ŽÚµ‘@Vݨ¤F™¦fŸ¬j_þ4ƾ;ùÓãôöÔ% éÅש;iA »'Ì´tÙ‰:Ž€#Јc B˜Š¥K—ʳÏ>+sçΕɓ'Ë믿.'N”]»vIÏž=¥oß¾ò—¿üE&L˜ çœsŽlÙ²Eyä™2eŠœ{î¹Ò¯_¿ÀŒtfÙژܚé@º“*¬!I‘ú4ã7iE µ÷œÖJ»)qg@ºé‹õnu_|ì¾ïÖ{æ8'‡ÀöíÛå±Ç“ùóçËŽ;SòÄOÈÚµkeèС²gÏž@&f塇’ªª*4hPÈ¿aÙ5kÖÉUšÌ‹[c4Ú“§åÊ#LÆáz‘úZ‘ÞE"Eý2Æ|Ðöfý‚ñ‰†3AÐI媢„³ó¾ÙÙÄœj•3 9õº¼±Ž@è¤æ˜8Ž€#O$‰l}}}rŒ5J† î{õê%wÝu—\tÑErÖYgÉáÇeõêÕ2sæL©¨¨—_~YvîÜ)sæÌ‘‘#Gž4t6þ¶gAÍsÜ‚¾µš%ºP_¿LdåÃ"uûD E&/™v¶H¡2#ù¸M0Ô½Utp½m{ “Êp$ë\ÊËË[SSá© fè êÅi ÌNŸ>}¤wïÞAµ IKiiixYƤÒlþ&uan\ó¬ÈS?)Ÿ¨Ÿ!"‡‰<óŸ* Qfäô«ùŽ•c=z6“TG?]Âkg³´ÆíO°Æ$®Çµ5ɘ$òf×_{ÙÕªÜm3 ¹ûî¼åyŒ€3 yüò½ëŽ€#„ØwHuuµ ùàƒºÕe—]Ò*++ƒúc€šLCmm­ìß¿_öíÓż™–B”áˆÞ×ÕÕÉŠ+dÙ²eA• ¦•/ŒÛ‘¾Ð¶E‹IQQQ²œzê©Á>…z¢tޝÓèšÒ¯Ld„ª‡¨Q ˆª`5¨*ÖðÙÊŒ 7Bãrš{÷î•ýÚŸ‚ÂezJqqq _«ýÜ­ÌQYY™”””„8$GHx¦”8p`ÀŒ `S­LU©–)í_"ÇvmÙ·[zô,Ð:õŸö¯G¿Ò£l˜ò½Ò˜@™ö'™ cP‚¤Dãõÿ±š*鱯JJ‡ÉÎý¥°WO©P&-0"–/µ| ëº΀t·7êýqGÀpòÁƒË5×\T¬ÆŽ+<³¨Æõª°°U,6oÞ,S§N jW[·n ù±™>}z@Š¹Ê Áàjå£LÃúõëåÎ;Ë/¿\.½ôÒ þóƒ õ¼÷½ï•ñãÇ u!iùæ7¿) . mE"¥gõ6]“R„‘ÓtÑ®«ö5KDj« É„3E&œâ)#ÕC¤./½ô¢<ñøãR¹m›õ)Ò~Í‹.¾DFŒ!Ï=÷¬Ü{ÏäškËù\ªÙ¾½RîøéOåÔyó¥ÿ€þòÌSOÉ»n¾%ê“aýúuò³ý‡\÷þÊ‚ ÊdüæËrìÅÿÒ6h¢ b31|¡{Ç—¤ç)çés”ƒ !$ûaŒˆÆU•²^¿»\ê.ü¥üî­ÃR v9·\·XúõïŸ`jB9+²æßÞ›‡xp$Š#l´AÐ&ÇŒTî•8Ž€#%ØXÈoV0Oé"Wìä³(?óÌ3ƒd/Y0 H?0P'}Þ¼y¡\aaa(sï½÷†<0«Oš4)0 \ 6Ö¾òÊ+™¸ð 哟üdP¯BêÁ‰È~ðùô§?-§Ÿ~z(‡ Fî ,;î¸Cþýßÿ]>üá[”Ö™DG‹úƒõª¶ƒ§*R%¢’$¡lRj³LÛtÇO~$³ÕêfR†cwõnY|ÝuáºN=ƒ=­øLS†kذ᪶vD¥{TT#u*Ú¡ÆüH†,4nÛ*å∦Ǻ_Ë1eŽžóÿIÞ*YÙ¾Az<ú=9Vø 96f†ô("ÇvoSæD¹>šÞ_¥*-!;¸_¥'Ê@• 9¢ÜËÖé½w«œ=b¼‘饬ï€: دl]hùµsñÐmˆ²¬Ý¶“Þ1G »!` Hwë—÷Çpö ]¼?óÌ3rË-·È/ù˰0_²dIp·Ë•|ëÖ­“Ûo¿=xÆ‚Qxøá‡ƒûÝûî»/T…zÖ·¿ýmùêW¿á‡þöξ®êÈÿ#7¹I¶$˲å&¹ãÞ L ½w!„$¤ÿɦíf7›MødS7…lz²›JH–J轃Û¸.¸w[r“å"7ýç;O#]?$WYV™c¿wï=uÎï>sæL9»wˇ>ô!c$péëCöï|ç;rýõס?üaË{ß}÷YÙoûÛÆ “ò裚ŠeIúçþg¡î_+³€ ˜3Q^­WvÜ÷ïÕ…»2å%ªŠ¥‹yB•TÕ©_|Á­[>ôa¹ù·È‡n½UÞû¾÷˲¥Kd©~Ú(“Õ«w_Yºd©ÑFqèÌÌl¯×¶¦²…ºV«„¤U±ÎYÙªÒ¦ËÄÖÊ ìß*•£o“Œ+?+­.ÿ¬dÜø"SÿŸd¬xD*KWÉþ×’Êÿ>K*¿×_*q‹T¾rŸT*³QY¾Iö?ò ‘ïKåo?/•o?/•yƒ¤­Tȸ’—ebÙ›ÒAE*û×(ÎþŠÈŠE~|‰T>ûg©„!!4©ƒ3¡)¢âûXH±ÇZK”E …; FŠ»ýøÃLú€¤µ*$H4P“6l˜Ù„@þM7ÝdêR‹-2‰É÷¿ÿ}“r°ø†1ùÒ—¾dLGvv¶I,®¼òJ¹úê«M ›ˆ_üâ¦ruÙe—ÉÛo¿m Fî<Ã{î¹òñÜŒÑxàcB>ö±™šc660._ûÚ×LUëòË/¯fBÞµ¸u•¦¬<‘'‹ÌN¥ jˆ¾PÕ±f=$2ø4‘!'ËF•r,}g¡LTiÏ0õòeŒC'µ¹à|¥ùHxÖ¬^#9¹9B¿fª!þØ1cÙ¯’žJŒØ+[3•T.âIPõÚŸÜWì”Ê6¤RÝgìÜ,•…çª}È2Éxéê&¸¿ÈØOJÆÌ¿KåÝ×Je×UÚ±XZý韕^•©}«ißVN[Ù_¹Wö/Ÿ%ûUš3JU¸^¸W2žP‰Êi)]"¿û TvÌ’Œ)W§˜­jBx“'.ÄÜ[ØRXFM@ @ Ѐ` Ž }l/XÈc ã°lÙ2c,P«"`(NèÛ·¯ BõÅ/~ÑÔ•ˆG2Á5KÕŒà)‹°Vm*xÙžãË_þ²¬X±BþíßþMnUIÃ¥—^jð¤£vU¬vlKî¹çS׺ýöÛ­Mâ±K¹êª«Ô&ãrÊ)§˜í‹Úw1 dvŠ>Õhý,ž)òò]"9}D¦ÿU¯Ýeçž}²­|»ÀC7aùòåÂù(:u4 ÆîÝÚ/eªN;]^xþ9™¡ö"C‡ U[‘öÊ`¤³V…~%âQÍêM*{—Œ7_ÐSÝUýªð£R9üj7ò%uøU.–‰¬Ôö.;/uö‰ÞžhûHˆP¿R¿xFmÀqE€IŠÉ3}=®Få@ 427oÞlž«ŠŠŠÌîƒë{ßû^cBžÓƒù`œÑ }pƒmï ^ª0`'s;sæÌ‘K.¹Ä¤"ªMÅu×]g³PóºöÚkípC\좊E^œKòôÓOËW¾òóFå4/[¶ÌT²ŠuOðøª‡ªÅ¶ŠL~›È•Ÿ×Lºà/S»”åo‹R©vjG1F½ZÝòÁ©èyysî)Ðs>Î;ÿYµr¥šg)V=”)jÕºµ5ú×Te<Öè™)ÔNdž£rý 7ÚA†¯ª7/\óÕƒ Që]¨ÌÔºÅj¯E»¨G®* …Ñ»öQËþÎêáêdµ÷øºÈCŸUfDéÊT,MÊè¬gy«-ˆÚxÈ+_QÚ5mìûEÎû¸´ê9@öwR{¶ú HåE·iwI«×¾©ufKå~"2î|e¡ô¹Dˆë >ÿž@šUÓÁ€4«×i)ÒRÞtô3†‹Bl2ªCo<\¹„{ÜÐ’‡àLé0¨Q¡:Eèß¿¿åÃ`½sg]TkÀ…¯ÛH Ö…zÖ´iÓÌýÓŸþtµÛ^Òðl…Ê×¶mÛLJR+¥¤/0@Ø<øàƒÆà@Á鳇w}¥h·Eø>UaÚ«Ÿªàåè×du'•SÕFd¿æU/YÒ É2Wý»£gdw—Œ®…"T’Íÿ*J´dtSÕ­VmSíW½¿ÔÉûv¼OÍ«å`@š×ûŒÞ@ -¤·Ýv›Ü|óÍò«_ýJÖäeU-âÄó¿üå/v⸀?ùä“&y˜9s¦Xþ½ï}ÏÔ£p«‹]Îñð€A7jVœ3Â=jWŸüä'åŽ;îÂÂB“„ -ùë_ÿ*HZ°¹ë®»ŒÁ€áøüç?ov$ÔéÒ¤(¥¥¥Æ˜° =@úAFø 6úYtë9rχEVãóªâ´i¦Ú]|‘\URVæá‹ÓÌÛꢺ ÆŠ>›äGë¡*Œõa¦PÏ"''§«ª°í³SÐaTHÏÏïn´bBß1^Ïà ®ý”4%L™š m§•JIöu,°63·ïT3‘LÙÙEmD´±6Zªq•zÀà¶ Ò!KÛî>@vìÜ!­+U¦¡õ’ž‘U¨RµM)+Oõ‡:Õfdëv=4½ÂĬ„úIšÁ€4÷½ha„¤…½ðèn €€ïF³h¾øâ‹Í Fä¨Cª²—bÌmWìª0 ÌQ¾ªX­S·À,ø1~§özêy‘öÛ˜‹¼¼\Y±|…ªpeHkUãÂëÌFn^7“ˆ”––˜*ÖN­) ÆôH޶©¼Ú©d ›êÏSûò¬Y½JÏÜ+:w’Ýš“ƒÓ³gÉTc÷µj_ÒAóqþH™Jj´ióÌ•¡õá1 FzéËn=´°BŸ{ôÆÂ€¼û]Õ¼µ¸;r‚9rÌ¢D pÂä„¿‚  s#ÁþTìü#q©ŒjP, ù¤vÿsªU²0ÿ¯ÿú/‹g¡M@ºqÇï°…7ùsaV8õiÂo~óA’Ây ¨oõéÓ§úÔuNZ­§C6*¨ˆamHEÈO ÎZµJ£&*ÓÑNÕš.ÒS Õã®pý< ÒªNJ‡QêÕ«·-Þ1Äo§}ï¨je0,è÷h›0­9÷CûMÄuR) yPQ'h«T© åé'y6m‹óBˆ#Ÿ©’rÏ«2-ƒ[_0GвwÏ^Áë–«œqÚº—o›™’²´R†§K—®Vkm›r020,ÔC;ÜÓ&Ø7–1÷ÖßÛ¤þ°Œš@ @ `QÈ"õ£dð>ö I/TžÇ“,rÝsić4Áƒ/>¹ž©Ò”Ê3Ï&=ggÞjK#î`í%Ën¾d™†¸7†¬!j!mÒB^tt³y!àgóêUô&#GÀ™ƒä¸Hœ/‰O¦ÑB]é,èÓë#ÎËPé½{÷–÷¿ÿýÆ` ñÀEï¼yól×þÎ;ï´}$!¸èuæÀépڬ⺾œ é  ³D\-!½^&ëÁÚò|ÞgÍ}@Étêògî=xýÉ´šúÞ¾×QÛÕëóúkËqM`@šî» Ê[ >ûÀÜ!ˆ.@ ð.}|LOÔŽP{BuÈ=nYBÕ—«%%ãyÃQÓ‘,›Þ÷ôçdÞä}2_òÞó¤Ç¥?{>®éiéÏɼ‡s¬å§#ÉÓØè9ÚcÞ`@ã[ š@ @ Q"ÀB”3"þ C‚ C2xÒ\’’Lû¦ƒ@0 õû®‚©_<£¶@ A`R‹@sF€q©Á½95ÆE Ó˜—“trïyšóû:ž}sl‘.–Ç醫;†Ã:Z @ ÃDMn\›JÓaVÙš»#Mr&ϯǻ›´ãŒÐñn«%Ô HKxËÑÇf‡@ ‚Íî•F‡@ cç[pº8Ìî_Y6Ôb3AJ‹¿m,ó t૤¤Ä~. !þx0‡ó[k,Øœˆéáàs0º‚9:‘4RZò ×H_Iõ„€/4ñ,õÍo~SºëÁzœ A8ÖEO=‘ج«I.èý¾1tZ~̘1CŠŠŠì “$}Çã·‘¬³6ždzcÀ¨¡iHâ¤mr¤ˆEþ@ @ 8.° cg›Cõps;gÎY±bEèý´^)ï¬:¬ðà¹&•SÜ9Se„ ÒµkWcBŽ'¬,’N’i ÓûÆ×ʱ` Hã{ŸAQ pHØuˆ@sD€æ¬¬,1b„¹¸Ý¹sgèÞ7ð‹faÉ<ƒjÁ‚²}ûöF!}ÂWÇÓ¦M“%K–؉÷I¦ ¾aÚ$pšý²eˬMâa”e^ß´6d}ô÷Ó“&M²3nÀãH±¤!ßX´#Gú~ŒÍEñ@ Æ8ŒÏ9q;//Ï®~Õ „´àÆX\òÊÊÊä‰'ž0GçŸ~µ܉†Æÿû+÷Ë–-[ª™Ó}û•)`!\ ­ôwÕŠƒ!Œ?^ÆŸ ËW®’ÖµÔGÛ•Jí4×¹ìaø°ÍºýöÛåî»ï–qãÆªGÊ„r ?Æ(œ(øC@sD£sNçš››k.x›c?kŸ`@À~íÚµæmêÚk¯•óÎ;Ï$ÐÜX×mZë‰õÊÔ´O{ö±K_kêaE2í¶n #ÓJý²w_„9™ö3jI;¬Ê›H&~íÚµ“ÒÒRSܸqc5x¤¿‹`@šÈK2}1Ÿü£vZý *Éûã‡Ò±×œìDZ×5@sE•ŒYè°ài*c\syŽwyy¹½WqB*Ò˜CyÅ~)ß¹;%¨"¦íº.ÚIûz _y)Ù¶G²;´•̶)Õ,ÇdÇžJ)Ù´K ºvжLó<ÍåÚ±CG“Œ¡‰„’¿Õ# Á€)b‘¿Ù!ÐÆî}ƒ‰™{n ´7»Lt(Ž;Éqî¸7 € ŒaïÞ½ÕªWIhLó´ºjÕ‹o­‘¿Ï-‘üŽm¤Š:`£¥_Sóž¨áøy@ ÕÛ*CpÕä¾Ê`äÈν̑"íÛ©±¸¨¯Ü¤kÀäÏ/“7–l²Í³=÷ž¡yr½ªV=­6Ø—` T€r@ØW5·2ÇòÁn5éUÙZ°q§¬Ø°ÝÚ˜¿ºÌ¤/îÑë€JšéCH@šé‹næ¾HvÏRǺ;¯ñ Çö2QìÜå›åMjTÖM&©aaÞª­ê¡c›ä¢/Z²]E·¹ºã’!3Tÿs­JMò4~xŸ.Ò[õLÙÅÙ¦âÚ9ZϪÍ;-mT¿®Ò½‹úÇ×Á±›î¬tªrlNy ïFjz—N™êÚozßh#´Î…kʤ‡ú%_µq‡lPo#µþÁ…Ùf«²[EÁs—o’%ª«Z”¯~½ÕCÇ6˜ÇçÚ½}Œ_æ-C]‚u’á:Æj£x @ ð.`"¶è|˜§R†”Ñ¥2*u(ÕùÔ÷üZ«¨#O¥T‚ñ²ƒ¯ÛZ!4¯Tx«:u`ŽüYm4îTÆc«zÕZ¤sùéCºY[«Ë÷šW¬‘jà>rÑ&¹ûuf8Îéè«wìUÏZ°=•²UiØUÅ‘ Ù¾›Ã ±S§s?j^¿~i¥«º²ëA;â]`4âˆ`@ñË ÒŽ/5’švˆ;Võ ƒ,0Ȥ|Š×Ô¿HÔžV‘oàðˆ1 Ggy~^‰,ÖÉýºÈ\f®,“Oœ],•¹¸ïõU2GuEGj¾ÇÕ«ÇëË·Èmç´W½þÙË6ËO^\%_`çj·B˜ˆMår׌uÒ?'Ó¼l¼£ŒÆëZÿ§Î,’¢îuà-‘»g­—¡Ý:˜QÝ‚’’§bá“zw1„qÔûSӋûKâ‹çóäóáÕ¹@ ÃC€E>´kFwWOUœ›•Фsè'¶2U'ÏsÅøB™®RíêÅj\QW\ÐÉ6aN’ož®ÞÑ9;·SG¹Bm5ŠÔX|«JC>>YÊ»¨Ë^­úš …2_7ùv+‘¯›ƒÿ<¥Pòp竪ÆWŒê®óxj™ 竽ê\Ì«ùÙí寓ûÈêMÛ%OíP°;¹{ÆÚ¿d½hþ_Á€4ÿw=¬ Ô¸TWêQÅÛ¾‡Ž. 20¿r´c·ŠyÏ‘+“wÓݘJªã¤þ9ÒCÜÊuÇä…¥[L<\¦ҳ˶ÊÍã{Èà äí•[dº2Û+öÚ0›©£ß«*ùX¢ÌËUÃó´Î4aÞ¯h‡ÀŽ "ä1½³åÜÑ=eþª-ò_O-—R•„tÓðå%›etŽróÔb@§»=»T*r¬Lm×GÔ!@ 8¾Y2ypþÙÙpãC`ff†,Ô9÷RýÔ¶h¥ó+Æåcõðª锢v¢úij˜N ž^Ý:ÙÇ"ô &ÄÃDÕ~ðÀœL]æèfâ[ª1Fµ˜‹y†1é¦^¸u@ŽŽÄIµ-¤0©’”ˆ@ 4R³cª?Éûd™K™»“̇Çy¾ºÊzúÁ®ùÊh 6ýw•ztRÕ+òå½jSSDHoë`u5Õ´`@šê› º= NHBÒ©dÜRïþæ•UrŽê›NU)ÇŒÅåá·JLlŒÇŒÊ\àaƒ°Q¥Ë6”«®i“¤0`5(WÝúí‘G´Ì@•¤¨­Li.IïNO;eLàSÖmÙey)ƒáÝT[t|@ ' ›Úªæ·äÜAÉE;÷Ï“z>PÅ:UWUÆê™1U†r^&Uñ©ÙÓ¶0—SÚT·½1-äùFCOõÆuóÔ")ÑÍDæe\üv®ò˜•¨ªªi§±êQÛõy¼*¦I^‚i’¯-ˆn  ú´Q™ŒÎ<ìÖ{¤>€¡{Ša®øH,P{ jĆCtlEžQ¼n<¿ T–lÞ%ÿ®z¨„’ûÔyÓs}êþ…òÌ[ä2u½ËÀTVÅ´PÏ&u ìj`z ¢lÒ´ê=ÕñªšõÄ¢ÍZÇ*u¨H±Ù¨ïàƒr}×õ@ 9,œmñÌ‚¶jq}äµ4l [x×±úNv!y…©ç ¦ê:0.Ù›ÚÊãá»°K¦Õd³ìéõ±ÉÈù"u…šªÒ*ª«@‹¤‰½° ·é ÐI™‡É=;I–u{見ûÝ;š/p⊕™¸â¤ðÂÑ7·ƒ10}»·“›'Ê“o—È=3×JžªfÝ:¥·î”dÊ•TL*ìd.‘z¼_Ok]¸~»lPiFa×ö&6fÈBÍk¢Ò€z¡½zÏâ¹³ÒF8OO€Åù*u7XœßIFôìltá.éª×l¿šºòûs½T~œ*ÁsãvõJ•©sÞª<ì!^í#Ûë\ǃŽÖÃÈ~9Ò¿ KÓ÷J¶æ%ÐOã>šßÙT±x>{d9í¤ý¦ºÕ;OÕ°tÌj£ƒT_5ûè{úÛˆä+P±ïGÎ*6?ä{ôÌÕjÀޤåô“º“,w¾¸\ëÜ-¢¿8Œ°M=œQ?éÁm…$9ך'=2ñìK"ê€ÛãNcÇÚFŠàÔ‚À‰OÖy° •ü1º¼µÑw°tòS6YÞã(ç÷éé^çÁÒÉCHÖÏsm®¢ÝM7éÔÉ'’u4Åtúâ}¬þd:÷‡Â¨¶ô$F‡J¯†dùã^[“íNz:éå=xîkK§d ʤ‡d:iuåÁ%úÊ•+¥S§NÒ½{÷Ú¦ ï§¶²éí5Ô3´xßf,Ú¨ž×Ê™ý»ÊEãzÙtp¨à]ÓVÉÅ#ºË˜ª“νL:@—‚²Oòx|M¹T:óóÿ<·\NÕ6™kqi¿t½ž”®sy»6­åþé«S6Sú ‡jíÖ¤×WÕXu¼%2ÛØüevê&ä_¦­T–6'ǰ®)ÎÖ]z$TLÕ×ô¾ß½hz}ŠF‰^/Z·J1 N`V÷iÝ \òyðÝ ¦ƧNêÆµTÝUƒùtdbG(=d`^Eõ!:æ ãäµeòü’­2¶°³ú+ß'«T sÅ肚ºRMXþcý‚Æš½¦6ïgMÌ‘Ý%'§ÚJ6öthvkð9øw§ØÓæš^ƒGm¥~÷ŽDmª¼—åêå}!žLK¦Sg²^Ïçå6Ýë9^åÓûàí¥_ëj?™ïPmº·q(Žw:tÔÕ§ñPéGB#yÓCmqÉ<‡J'oz~£†}üñÇå•W^‘‹.ºHÆŽ+}ûö•ÌL=CJia³ÈóZüåsž!çê}ëUMùm•øOغ³Ú³jÆëÕ‰KÅÞ”Í$$Ǽ–Ú¸SºéÆÁƒŽ ›},ô3Õ© ¯ÉjÓmu®¦]$LxÖ<é•“š§q»ûç7ÖË žYÊt”-Js-j×vˆ¯ÖáõAuR÷lü¹„f—¶›àäœïPƒ‰:¢ÉÖ¹ÿ,=ôMËõ:??øv©ÚŒì—O+²u€f3º½\SºÖ¬jšÕAk ÐDHløO0È“™’<2Ýç*ÒÈcùªê ÍËTçÓ¯z¼=˜˜óFõ”êšpµžÒAàsGHUÅò@Ýõ˜Ð}ôQÛYãž¶ &ÈÀþ 6È´iÓlblÛ¶­]GŽ)C‡µæ7oÞ,¯½úšìªØe“#'ª0@Fe“ÉöíÛeÆŒ²uëV›D+**¤wïÞ2bÄ¡>žßzë-Y»v­tìØQvíÚ%2|øpËÏŽàüùóeݺuÒ®];;41++K ¡}ûö6/^¼XÖ¬YcõA?“õ!C„|ÒV¬Xa&Ú-..–.]ºXzII‰¬ZµÊè·ý‚ÆÜÜ\ë}¤}‹ÚÈÏÏ—nݺU÷qýúõF ŒíÞ}{­nò0¡rÒ<锣ü¾}û¬¯=zô°tÔO_y¤Ó7v@‘JÔãϤS?}¡ÞÒÒRk‡\Á̤———W/Þ  ú;tè`鼟-[¶T—‡NúÏ;!P|@\×®]¥sçÎÕ}$|ÉMàË;à™>’NßCÊfgg[:}ôtòS´y:õA#õxy0 ~žÉü~<¾{:ô‚§“,¡üÒø xú–~ÛžÎ3éÐàéôß³c@Ðàéô:<: tï3u$ÓiÃé#¾¶@Yµå!Ýó$ëö2\==×ÒîëÂÆq8Tºç;š+øS?¿·[n¹EN;í4yùå—åG?ú‘ôéÓG¦L™"'t’äåé‚·ê7³¿²F"4mÖGýeY5«7n—Õe»å’!¹²\ç¬Eë¶U3 dÀã£ÛglÖó:^˜·A•ì”áªZÌÏá • *µX˾ôÎF;ˆ°‹.òOVohÀ<5w½¡„œ%2^%*ØhîTj¤o¯Ù&ÛdÈ+ 7ê!âgzµ“•ʼ¢všœ‚Êó™'åKÕ@X¥4OWw÷¨Fo(ÓÃõàÃÓô`â=úwúêâÍ’©ç¨ÔïWô2¥†LulP¢‹T£wÀT³çjÛxÏ‚™aoÊ!¦üö‚ö†@rŽf`KÒ<ίžnYÓò§çñ¼\Óó'Ûe"a©À E¤U·h#½þä3ú²ÃûvµO²Ýä}M›i ÚMf<È=ß’%KdÙ²e–‹EîàÁƒ«KìØ±ÃâYl±ìÙ³gu:ñsßœk‹?[eee¶è‚A nl³gÏ6ƒÅäÆ:1Lšdm°xfAööÛoËÌ™3…9 õÑ£G#Á‚sÞ¼yòúë¯KNN޵ÃÂ&zXÔÁÀ°cHý,™ÄÉã ýûÇ?þa“7ôRï5×\SÍ€Ð÷ûï¿ßòS4_uÕU¶§£¨DÜ{ï½¶P„fÊ—]v™ÕGaÒþïÿþOÀжYì_|ñÅòž÷¼ÇpÚ´i“üù϶rÐÌóÔ©Såꫯ¶:Y8ß}÷Ý,êÁ€4zŸyäyâ‰'¤¨¨È˜©SN9EÞ÷¾÷&ô™´xÀ0„>-Ÿþô§‰á÷øüóÏ[0ôlþéŸþÉp„ÈY³fÉwÜaïvÛ¶mÖÒa ¼£ï~÷»FÌu|ö³ŸµwI:LàøCÃõ‘Õ«W[úYge¿ÌÿøÇ†%ï†ð#ùˆ\rÉ%–f?ýéO úÌ3i7Üpƒ-¸ é7¿ùÑIy0CÒÉ=¼Ã‡zHŠ‹‹é?~¼aDŸÁˆep¤<˜Ã Ýzë­†}#ÒÁF€ßÉM7Ý$ýû÷'YæÌ™#ûÛß, Xò;qfFù¾ûî³räç·}ÁØ.6ÏK—.•‡~Ø~³ü­@Ãé§Ÿ.'N´ß¿#6è+ŒKì€ó[€IáwóôÓOW3óü–yÏçœsŽ1¢ÔÇïfæß#«gžy¦aÄßÒ /¼`O]»æh;e†-è}õÕW­Ÿ´O~08ÿüó«1zíµ×ä7Þ°xþVøýó;g—žàH9ÒùíñžØÐ €Á3Ï1-\¸ÐúýÔCû`HX´h‘¥;ã ɘF;þø{;W~C¼+Þåé›4¼‡Ç{L¾øÅ/Úß¿'ÆOèhÛ¦­•?Q_Hœ©˜§‹ï,uYË‚|g©ú“U ÷òÌS0®Þüäœuò¤:X¹@™³x‹ôÎn'gê¥Êüö¥•’«ö™¸¡‡¡øÕK«ä³ÊˆôP›ÊY«ÊÌ9LOe,Î=©›1%ÌÛ(h#¨]eUÙztéØÖ¤@(|¾÷½ïY{¼#ï—‚¾hÌSµ«ÁùÍsT]迸¬LÖ¨Db°º¦gÀ|²]›V²I ÆßÐó¬Î”#WNêcjO›´üveóVo5O‘ÚOúªÄ¨–_þø"™¥gq½gd¦j´’ú}ÿéý$§S;uî²S¥­L ï‘C ³LllqŽäèófU ë•¥ÌÊè&]Y­Þ*×+“S¡ê_m•ž*-9]]æSI?«úÖC»I¯¼N²YÕ¬P}&/´'§Y~¿å»÷Ê uCÿ6«ÇLä¨xÅôÀ]jôó˜¦s ¤é¼« ´!P¦Fi[tà袃¸Õݬƒ_nV¦yè`>CN‘>@øÄ˜ØS ‹âTm¤ùàBþRõÎY Zu§†!ŒâXÒÉÒ6,„µ«iTçí¤JX±ê<éyH㢢"ûÔ–NÌ6ŸôàåY°òI¤`Â’L]2yxìÄ×H_˜éÚé`xê©§Ö–lã ±“Ï'=Pžtvòù¤ÒÁ&ŽO]wT×{¢ Ò¤O~ò“u·…:"µh¿~ðƒµ%ÛXÉBþUaª+ð;DjVW€¹‚ÑçS[#˜L>u¤Z|ê ¨§ÂÐ$ØG®¿þzcŒMŸ>Ýp‡¹G’„´Ædùòå¦Rèå’u5Ä=¿hßhƒÑ@ý*K¥öOÌ^«jûd‡.Ú—•(S¢ ð2'B+‹yì8zt©Ú8Ð9+_¥å›t.Sæo«2 ÝÔ«džÎ•„l•dh:’æzjÒ;µ+SÛÐBÞÔ¸Q3ìø' ¤—ª»\VÑîÇÏìg ÈËóKl°=uh¾íðÜùòJé£z¦ˆr ^šÁÑ'd}É<Ü'ƒÓ£õëç—Ëfe¬Úëé²W‡«'Ž FHOÕ[õ¼ÉòµÝ³ëÇ.ç‹{&þôÐ’ÒO$Žs]ïàHÒ}éWÊ&˧·Q_éÔCÝuÕï4$wÂÁÜÛ÷ôô:Ž56ø½×U’îÓÛ¯ÏthHLJú ÞOîkË“žîýñüÉtâj É2G“^[™úŽ;4õÝâñp~Å @IDAT«¯®¾ ÁöãYUCCú2lØ0“P4¨ZšÇo€¿•ºê8~T×Ô ´ÏÛ"µ­ÈTIsí"=¯ U«^Yme¾JENß½O[¤b©yµC;u‡«‹zÎÕš<8_Ýäî‘eêñQ+³ ´\e,Ö–ï‘ujG2@ É7éÆÞ UošRÜÕ$ØÀãªÕT-nAa±¹t‚Åë—1:óVÇ“f9RÆìÜ’‡túD€f/o‰/fIò³æ@:ÂF åvê³—Odor·Á€4¹WŸh8¹têeæf¶’wTï A/ueK`0AµJ^`qåºxß©nt‘0hðÁ°ÍV$&xã0©‚é–j:ИwÝíÙ¯«~êì£m\4"_wkt'Gë|aÑ&¹Æ™ËÁ”çF;NNß©b[D¿¸îeÄ?:í1ˆá[)R”Š=û¥l§î*i>÷ÌaDW}1DîÐ WÃ>8½HÎêßEF÷ë*Y:wØZ£sØ•á€Q@Å麑ݪæ'ImÖ!ÝÀ³#jPëÔÒ„o:¹·¼¾x“ÌW)IŽªD3<åµ /Xçεzü sXï•Ãòl¶è9\7Ii îÅ\ºM_#Œê•-EªÂ…zsêÍ£ºU«{õÓùøšáª.ªuÆôé"ƒ´M‚3= ¯y¯ž`^ª»—¨×Ž×]œSú¨÷Í÷êÂR¹Wwhn«:ݪËùàœõò§WWÉçΤ@†ÌRæ†6ÇèÉå}Õànµ2O¼³Iƪ˜¸—ntÀ…9@2ÒN+¤$‹UÇu|ß.rÚÀvò;ÝÊi_*×逷Mé|háf¹e\ SFèÑy¥²°t§\ R‘Zÿ=om”¾Z>ÐØññÁ£¹éË·ý oqzS”òÆâØœ˜7­@  ŒÝ>~J2x4õ×Wì¯ÒAIæ›/)PUW©DÄêMÀ]íKSӘ·—r讪(ãù‘ÐW7ÔøpN‡ 2—H?oÌ6Xh\XU7y°¹tBo›ïa:8Ì7Xx(Ð6/SCxC•yàãa²2JÉàL6"gŒè‘L:à˜«›r¤)¿½ ½ÁX¯¢àÅjüvJ?óöÒÁå‘ùe½ê’öÓó4<`BZëîb㥚÷º1=dŠÚiÀ,-Ýaçm`¬>kåV9Y™‘³ôdUÆÊýì…•²\ÅÉH92•©­^j?K_¯:ªupì¨ú­œ‚Ú½“îé¨Y¤í¢Â…‡Œ“ò;ÈéÃRng(ÓP¦íØáKª;Û¿K¦ù@ï ˜·”¹A—vªæÝ¨»B/.Ûj~Îk” ŠÝ–ʈò´]DÁĤúÌtÐÄÇBë[|@ ÐpÆÃ¼M¥Ï©E÷Ág6ÍL<­.ng¯,“ݪö”£g©ôÀÊRœxc²z4Ѽp$²”Ô×.ÕC2 «œ3*µƒ Àß<½D â7È@µ éjj[) Q¢XÕU2&î@ …ñà¤q¦1Ÿ«ê†y«¶Ew2ÞfFýBõéÌá*íWIC‰ª0£žÅ¦s,|´GÙÔ¶iܧщG‹LK•­¡)™nÕ&ê°¼Z¡×ù.šy­±ª¯šùš ©Ò|'iMæoj÷©-ͦFuÐ4 ƒ0üž¿v›ª&’ ²û¨*V5lã £=ºPǸÆ€†ÁŽû¹+¶ªú>Y¢'¯¢"e.ùtñ$[Ô?9a±ê¢nWQq·ìö¦‚En¸fª¾€ ˆ´ÝÚfÊ,ŽAIÔDF˜U3ò1ÎE<ÿ¼nr‘VWPá‡é·ÒÿjX·~Ó•¶ì1†Êm]j+ @ º@ÝøPÌeëZt'ã™sü&¤§2£TUxPav5óauñ¥¼Ì›^&«q~“¸¦Ç¥ÊÖdH¦sÀ³>¤?{Éô¼Ï\è‡Ñ¨ÏÉ:’ùšê}H@šê› º.šN-àkþèWªjÔÓzðÑÍcºËyc{)#‘bÚÍX-¿W—¼ç,7ÉF™2,Ô‘ˆ\=ª»<ôv©”<µX²ÕxÎË´Wõ§ÓçÉÿêi¬xq¹tSu®éj[rvÿ®f0W¢ê[¥ºàGŠâ5+)ˆ·éQ U5WCKÝÄû† ç¡<4;ÕõTÑLó¶°Oaó’3·\uŒ|) RmxýÄR}Iå8Æ.UêÄ|rbpV©¦† ‚ ‰£sû¶ò‰É…2L½VÀHXˆO˜gú¥è’vÒ<Ÿ<¹°ÚÇu‘ÛU=nTªšSNgµQÏVØ‚0‚qxÒGNËùkÊÌhî:]ÐïÛÕµŽ*!¹uR¡ôPI‹‡j<þ1­¯„©'å«úS[5xW÷º:È^4’ÓŠS„q9_õ]¹BãH­—Ý Ûèy鬒š['õ´toËIúóÞq=ÍPQ9ca¡Ýá]‹~Ž™EÄW @ P¾Øfqý÷WWJ¾j\ ›z>ïPÌç˜Ò¾Ü÷²ä­bgz1¯g‹ºä_ª^*±ëÄS×"-÷ zѼnb¡ôWÏ[^g 5óoU³ÖÅi„&ïyãºÒ¸ÞGPÓ€ø@ÁéÅ™™©QÓ=$ÿpqåÇ'= [ÊǃNª»uÀš½r»yØÑ'WJÕh»l¯J>æš—,ò#æ“` p#˜ ^>€_¨†ê|<Œ,Êõ[°G×<è™­.U'ËØþyÕœrÊДáºG:60B=<=yõ¼É8îÁ•À©»œü!@ °8]Æs¢øìuz’¹j °½•\X£¾Œº²ïâc×è¶Š0” À©ç8Jñù“Ó×l— G¥¤úÔÿ€T„ 4Ÿ³¨‡xçMPKvF…{ò‘F¯›xý¯x´—ª—z¼4Zãʸª@¹j%üiúZ9EÏñùÛËíÖ~·Sm§O—?{y•|æŒ~Æ€à}kT¯¬j{M¯¯^HØDôºRD*J+ôm*&¥†~Mn4!Fó*‚†F¿ç0Ètß}÷Iÿþýe×®]ÕƒA’žÔXâ»#©?rÍhÙú·m!5ˆè0ªˆ}qÑûó—VÉ+›÷Ée}:Ër=yuÛî=Ò~B¾lž—ež9ÈË@ÆÀb§œê3™µWUqÕ¥šp(¨Á$##ÕnI–Æ@”,›|NÞ“9ýÙ*¨úª-Žx$.ìÞ¤h_»7ʬY³äôÓOo‡[¥ÓÏ@  ‰³ó\†tSïT¹z*ÀH.¸vPIý|µ™¨^q3?oÕVsø2F]ÌcÓÁ"ÿµwJY`öY¨ö“½Õs¢j# !@ù­¦„°BÕ‡_Ó3?JÕÞr€º´'^,WmÜ.óV—©ÆB¦¬ÑÅ?vœcõL~]ÝørnÖ$Í›—•ióú‚Õ[åµ%)‡+c0AÓÚèbú¢R£›?v¢ÙÚ§Ót퇙K6ã3O;ì¿r‹ ï£çoéYbÐÃá…=³Û©E7=É=CÞX¾E:*cñš–&˜%g2èG™Ú^r¦×õ¦ 36¢w¶ŒV<ȳHñÂN¾ÒºxC¹æÝ+ûçÈÕ´€©bš¶u5’ H#yAFÃ#À™Eryy¹Ìž=[JKuÙ½ÛÅÚ¨©Yh×ì´/µþöExj¹N;WöÊ”Ë [©MH¹LБ¥2ek6ËËKS'“SžêfH11ÄRoªNógÒˆ#Ùâ´IOOÏŸÊ[{]––jŒïÚ·hûJ•åÖƒ·áϵ]Á¶]»vRVV& .4¬‰‹@ €@…2Ì0H1p?oÃ9C½.²€¾ëõµ2¼ £äëB~•º¡SÏëÙ¹ú<}éySϲ:Kí&™ ïž½ÁÊ\¡gn0—r*:8yù?=_ ÌÁdš–Ãå{Õ½ýVMûÃÌõrªºÃ‡Ù˜¡.{9\xHwÕtÐ:ÿ6·Dm++å’ ½dÑÚ2ùý´Õ2F]ã(ÓðU¢ÝñÊ„ÌÓ2O.Ý*—êéëô€ÁÔ6“þ\0¦§©=Ó?æLT qå÷k«¤«j9ŒTâ©ù¥²A]áŸ;²@§”DƒùÚ—o,—ßÍX'_U¦ ÍŠGg­•W–—ÉYà£ÌËo_]#7)ÃvŠ2;%e»äôì¯3ûe3¶BXôúù˜2d©sJŒ o4!Fó*‚†F€ûÎ;¥°°P>ûÙÏʰaÃìùpׇK«ÿÉëxbÏw¨:œ¡Hæ3†Aéö«§Õöìi'ê ³úÕºuëdûöí²mÛ¶j&éDÑí@ 4tÛ͈aŽD ¸k;¹hl¡”íØ-ßxx‘dë‚þªÉ}äí›å;O/WUæ]jסÒÍ;8·½\<¶§:Ci'í_Z&/éyV§é™[0 º–·°@í(ª÷É[Õ~s°žP^RV!ÒƒwOQ'0¸ÆÏÖŒ“ôpßñò´Ì*yLÏùÀ©yf¹¾|‘¬S7¾ƒ¿©çvíÐëØ~]ÌžcÆŠ2yä­; +KiìË)åz¦¶œŠŽ‡ËË´þqjú„ü;¬ggØ#ËÔ¼gh7“Žpb®JKÞQFê•\ŒUiƳÊÈ ¹€ÉZ¶^O?o¯*âZšç–l‘+Fä˹£{šÄeÇî¥ò¼Ò‹Tˆ“Õ»´k%«úÒK%B¿xyµ×•b@R87ž7¯š"‰˜ %hHXàïÛ·Ïl²²²lQß±cMECÒÒœÛÊÎΖöíÛËÞ½5^¸šs£o@ ‡‡r°ó@RÁ¹{ZK–.¾Q)"à䥽.Äm/O Ⴞ¿JP¥"éý´•åR¡êST”¨o»JRr´ž¥ª†µF ¦½K¦¤&¨\Áô` N@zÑMU·rµMÔŸ8· f†“Õ·ë§«¦ÏV·úhvõPÃyœÀ V¡õôP¦Èi鬶“»Íz‘høòß뛣’úªE¥s·F>Ï ­¶¹¨×-Û+¬OEù©5 ôÑÿ§ÞÙdL Ò*æäu‚ã•ÚòÔ¯ÔRÇW0 ã='þ°Û´Áõ_¥Ù~@‹dâùœˆ-Ø¥@Çòå˶~ýú©šØ6¥IU¸T¥iëÖ­’ŸŸo’î d¶‹/–={öHqq±=Ã\Ùà¥SCv‡öhãsìj ‹û…ë‰x—Ñf ÀÁ€pcr32gÑ€MdHPQ¶g½¶UfÀægÐ[)QU*ÒYԣƤkrU}nm¶‰,ú‰Ç¶FOoÄŒJWòU¥iù®mV'mhšz1V‡y!`ì¦ú&«Sl<Ö*3CýÙªJEAÒ`F` ÐJH­§žçªÇg®“Oé-#úåÈCêÆµ/r£îE1Ô¯v¯·ô/œô ΠBK–uzßQÛËl«ëÊT"]˯•†—sdH‘”*ܾƒi/!H81ॉE1 ~÷~E܉Z$;óóæÍ“|Љɓ'KEE…Ùª 2DæÏŸ/½{÷6»Š%K–ÈÔ©S¥k×®òúë¯ËúõªÏzê©G_RuÛ¨CŽÇ¬aø"@ Ì-ëÔ9K¯ì}¶øß¢ÒŠVUó ³Î*MÛ©jOò Ëv›êišÏV{‘GÞXc‹ÿGl’)}³¥›2s—ë¹Uš—J«Èz*TTý†º#u8IÁ©sæãJ ­ÕÚ&f‹ªRmߥÒ=£d¸žªþÒŠm‚!:âÏÎß(Ã{u–^j$1ùÆl^ZQ=kŸ¬W'4¸Ím­Ìñ/ªúÔIZ’èØ¥×Åj°Ž]˺òÔù^m”™(ݹO^Ò³½ s;˜eQÙ;×d öû“{çlPzSéÏé¹d׎Ì7†h›¨C»÷”¥àUÅ\¥(k\ß±h\ï#¨i@XL³Ho¥’ ˆG³ÈöòÇrõ¶±xóÍ7夓N’ÁƒËêÕ«Í~âïÿ»\xá…&AAªpÚi§™q7Ì‹{˜ éùàÊë<º(Cpü𬉝-Íóy=þ|"™;§!®@ G†@õX®Sîr5PƒÎÆ8œÕ¿‹ugš4a´.è3ªªG’pÁ@u]« qB–JÞ74e‹Y>ƒóÚ[¹Ezvõœ9¬»I*8WäÒA]-­[v{yÿä^òâÂòÈÜõæqëÔA)û,•^\?$'%ÅÐ6hë|5ðF*CŸÇ÷β+ÃpõÀu“ºÔ}mÙ™¥gŒôê’©^¨º¨ªS+¬FëEºà÷­¾ÁÝ;JžªrÑ—ª¶u¡žÉõªzÕÂ}„ž#v¹J`^ÕzNR£ø©r¤T%œ‰‚¡ù{Gv3ƒû×MûqÝ®ª’†[_‘ËõL®ç—Èë*EAjtý¨|5@ïfø`D±ö52B—Nmå*í[®^S!å)³êá¨/à¼ϵúwq”µr”ÀE±¦@õ¤K,î‘`¸‹àN:£DÜ?þñcB`<-ZdÒ$ÅÅÅ2}útYºt©œ|òÉÆ|Ѓ1éÝu<ÒËÀè8M.)òk]eŽ´ítZâ9@ q Àæ!£J­èX©ò)·£ª]9¹/܈-ÞÏ]¥[¤ àN÷ê“ûÙ›özwë,ï›ÚY™N:߯çleH/µw8_ ÖÙí7ÏQU{‰£ôœ+>ÞÎ0•v *ìbîu9Uu*B‘î×·{VuãÔ}Œ–ónž;&EO*{†Í5ZÓQÙÊÒz<œ5*uÈ–·wê°KògÎô; ›Õ ssá¸Þr†230Uä1ŒÞ@þÅz[ÿ`À £O~ }êìê“ûš‘;ýufƒÆ†õÍ‘¡}rªiOï[ú¼N™£ ^mÞ¢Ÿv ¡Ác¨$ŠÍäâ:yO_yö?Äúî;õb?íÒÎÑ:t¨£ÇŠ+dÓ¦M’““c’‘iÓ¦ÉÀ¥oß¾æÅkæÌ™‚ª ‹Ù'é¯îdhF†¶PéâÙjÄ¥W¯^fw‚X’©­ÞúÆ&ê @ h>ètW·猀g€ù $A€ºQxÄJ†ŸR),üÛê‚?=¤·‘|®­\åªqÅÕ¤çK&s¦Ú¢x Ø‘xHo©Š‡dšÇ%™ãšž7ý9™·¾îeÞ¯A ¾¨‰zf‚@ò+yO÷ÒŸë£Ë^'; EEEòÈ#Øbüøñ¶Ð‡©@- u+ŒÔaDpm;bÄcæÌ™#%%%2zôh“˜@“Û\xÝÄ%™$c‚¤fæÙgŸ5F¦·2EÅÅf_òØcÉ×¾ö5ùîw¿km>úè£Ò§O9÷Üs&êOÖK;@ š&>70‡üèG?2 ;›QɹäX{¦ûx&MÐéCÕ¥Z™Zub„Mû&ÙÐU4ÆÞØS`ÞYj?q¿žÑ‘§‹ø·ÏÕ…w*C© Æ#ìÔéè©4ž=Pý ޼­•9¡Žšr©zÜ8ÝÂIw\œN®éùx¦µtz8¸×hU-ÈV§šH·²šMTbôU¥ªg(K9‚Óî}©î[UY/s¬WúÏFä–-[äé§ž–óÎ;飼 䨡‹‚@ý"Øa:rss«%›7o–‚‚cHvàÖ-Î1!ÏxÄ+’ $'È=ƒRŒnݺ™dÊ} ¥]Îêøãÿh /¼@FŽež¶ÈÇ!‚„—^zI&Nœhñk×®•7ÞxÃ&¦3σ3Ô¹lÙ2ùÌg>cLÏÿ÷Sñå/Y^yåùÓŸþdLÒ<` Ä¿øE³õ@Lþûßÿ^ž|òI³‰€q‚ Á†-N|GjòéOÚúV^^.?ýéO-抴;ï¼S°#ÉËË3æ§K—.‚*Ö÷¿ÿ}•ŒŒ”‹.ºÈ˜è„ ¡ý¯ýë‚—®›o¾¹Zâ’Š@ 4/˜ßýs´= äh‘‹rÍvî ìò_rÉ%vc0|øpûxÚ7Þhi|Õ×B;É€à†; ˜n¸ÁvØúÀ> o¿ý¶Œ5ʌБz\vÙeÆ Á0]pÁ2wî\c FÎ?ÿ|6l˜¹ì---•/}éKrÓM7òÔSO™ªqHI`rŠ•Ùø—ùSñZµj•I}üü˜žþð‡C†Ä¨Gò©O}J¾ñoȘ1cL*D»G»+BÙ@ 'æ5ìù †EHªÚ0¾3_’Ïç.®®Eàó¢—ñ¹Õ{äñþìéħ×Mžd}Ü'ŸI§<›lÏ=÷œ©"£Æ íÌ›ž—|¼=§™¼„ôgâ¼/NÚ´IÜYgu€Š³¢t‘Æf›–¨/x¦>W]¦Ý¦ ¬è7¸pï¸)ý5¦öGZ2òÀqCñ&Å=Á®ÿþvïêY >X’€T†€äƒ Ã]ÐÙD¥Œ@9Î yøá‡fª2\HJ0hÿ¾ H=TW®\i’ìG0nG*ƒ4èw¿û @^7Æñgœq†<ÿüóV7m7•Õ‰¯@ `qÉ'9—0æóñxÆyOçÞã±aòü,V äIÆ{:ª<ÌI^·ç£n>”!Žtžý¼+/Os$sæ¬Y³l~¢=òzžäÕëç Í0 N#Ï4Yºt©÷ŒûxEd“ »E$õl\yæ™Æ`/ÀºÌ¡8=AÃÉ:u¢ò;cÆ ›k‘\Œ7Îæìq/”Õbʆ”oЀãl Hý)]ÌK§Ùï½?Hÿ©»J ì]ëàú믷 8¼Pbk CC¿˜Ó^}õU;{Ëi`£ÛÇ¢¢"7W™6Á}÷ÝgLÉUW]eýgŽ…vÎçòÍChÀ=ó;í2·­NŸß¾Ž…Þ€4$ž(ý‹«3P“L«/êhÃËѺ°¿ûî»ÍÉ·¾õ-ÛaqÛ˜¬’4B‹?;½?ÿùÏM¥êsŸûœ1Øz0 c¤Î€ˆD¦ƒñ0Æ÷0<¨aQ†AžÁÚªW000Émm»ô&™÷@ MŸ_^|ñEc2¦L™bóçFa7ˆäüž{î‘©S§3òÕ¯~UPýeÁÍâœÅ> Ã=÷ÞcLÂ[o½%Ø9â\I:’xåÔEÞý×5fæƒ8s›tl¤=ôÐC¶!çt±ǽϥu!Ž{aߨ`pßK;H8Øu¢Œñ0-ì`! Ùºu«Å±³å?åa~È뺬ÄXù¸ø:ß@ Íæ _è3G°«ƒ8$Ì0ÌHF˜C` ^Å‚$Å9êÃHXìSökÖ¬±y7óÌ/¤îùÈGäâ‹/®†×òï¼óŽ-à}®IJÿYØŸ>?Qϯ\YüÓ& Þ&±Ÿ„¡ <’[n¹ÅæE¼]>«gcá-†Udœ±PÞý†‘€)ƒynÔãm<žk¾z—D]ŒþºÍf2½¹ßÒÜßpô¯É àƒ;ƒãòåËmÀc—/ž§~ò“ŸÈ'>ñ ;‹ƒñ¶ï¦ÐIÊœ!ð¡}ÈM[˜<`10زSÅBxÉ¢~Dãï}ï{m‡{FDÔçœsŽÕÅÆüùóªŽÔAdÐÇ~$B @óBÀçz…jªSœòÚk¯™- ÿœœÛ8CÊ£ƒ‚¤ÆÕa˜l+ØØ‚a¾À™ {æ.¤ïnÏÈ|Ćù©`îAŠù‰Å=÷00Hæ)m…܆ÒçDèæž~@ub·X¬ŽWP+þå/iL›{ÌsÌ¿0Rh a>Lª?C?ssL nðQ?£<*É´CãÚ´Ÿ ÐBZ×dzs¿¬æþ†£Mä É ƒÀ®AÞO]¿~½1 Š ^H/ ¦„ôÁÎw‚x0 ú… òÄáÚq6ž±¾ñõoØ®»?HZhã=ïyOõî bvÎÁp½Hõ^arhI…SÔ„]Ò’N‡_@ MߨB2À¢éÒc>gM¡†‹5j¾ ,°y‚M5¼*ÂT0‡¡öD9æ9¤îxX$?L ròrö*L¿S§'H*H˜ïºë.SKfŽZ¦nëa˜7ñ “€}e˜©Ï?Éy £u&æ8¤,ôIÄW\aêb¿ýíoå±Ç3O”Ä# úü·¿ýÍæ=hBꃄãôÓO·ó¶~üãM¤Q'  ˜g8Ød®M:ây›ó5$ ÍùíFßš>(A4†æĺ¨¹Èš8LLwWì¶Ý!vYÐM%ÀTÀ”¤§S‡O.²Fºû\ì?Þ÷¾÷™®*¶üàm †)bw ›vš˜T˜`ÜE±æLK–,1cuh dˆ‹@ д`Ìg^`AŽÛYvûÙ|B¢Á¼‚ª›WØ}°ù…ñ6Òz$ßùÎwìžò¸sgžB=‰Í/â™û`*¨÷î´G½ÔA`ÁŽT&ƒº©ÃÓ1G’Â|È|çeêBœy Û 6Ín»í¶êÍ3 ÙQ£O´ôƒ9 »l2¹‡VgÐP€ÑÜÞ“ÏÛF[iËÂ… Mjäs&ýÃm0e=´´93óq N0 > j\_c,·]Ó_ýêWf‡”ÝôkïøáÒ¡cÛaá B$”¥Ò ÎtÇ.Á™ ÿ8åöÛßþ¶Ü~ûíÆ@ÀðàµI e ™“þóŸ7)ŠURõ… F„xÐbgŠÀ ëíVe‹K @GÀç(º-Fç,¶™'X€X˜ûâÜ"ô ;Ädð:õÁ0øÜáy`LøÔ`~øxðº’qž†ÊŒ´ÑùI ’/ “@ðþ¡–T'fNsé¾eL|%Û…ér­æ@Ê!aAâã*[E}Œ¹5‚絇ò H yÑÑͦ…» ÇÑÓõx8v©ðöáq”‡©@务Ÿþô§ÆpàÝ„öi‡“Øñ¾uçwšêô,Z¼H^zñ%cP`rÜ#ˆÓct&úâtÇ5@ y Àܑܔ¢WÉ9,½—É´ºî“e’yŽ&žy×¹‡ éí$ŸëºOÖy°<>'úœëåÒŸ=¾%]kV4-©×Ñ×@  PÛÀåq x.îNvÅÓ‰C'Õ Ó=OzõP†Ý+$$âÄ‚ì±Kƒƒ% ^¸xfÒÁx ‹Ÿ“mÓ^ +å­Ç5@ ¹ À˜ï!¹÷¸¸Ö0déó#ØÔ×’0 ¤%½íèk“C 9ÀC|rOOKï\2ÝËyœ?{ćN,6!Òá¡CBÔ°ðÝcã‘!ùÒEîÉ:©×Ûòk:}ñ@ ÐtHócOêššöÚÚ«-®1bx¼h äx!õ6 |JÞ7Æ8£­¶<éqéÏÔç:± ŠH5ðÇΧ®@^eüÞóû³_=>®@ @C ÐÒù ñѶ ÈÑ"åš<>0¡ÊäÞ6ÒU–š|' ŽÇá!ÿÁʸŽkÒ@ñpëŽ|@ ß`JŸ Ž4¾ñ÷4(¬o‚©oD£¾&ƒ€Š„;AÌx—JH›L‡¡`ˆ ÌþÝW,_ag8æˆÔ %@à(¨k¾<Òø£l>Š5a‚iÂ//H?6P9ÂW9®ð8|ãjÎÛˆP?Àl`'‚ ‰ÛޏšWý´µ@ œßkc2êŠ?4F›`@÷û êŽ>prF§#á,ŒX ×/ààŒz[QQ‘yÔ¢vǾ~[ŠÚ@ g2Ø\zæ™gìÔpÎ!0¾———ËÓO?mg_pp®â{öÙgídñÉ“'[^¯Ëóĵå  HËy×ÑÓ4°÷@Ò¿ÉÉÉ1õ+X §uŒH?`ô8UÖíBޱÊ(@ p‚p¦Æñšø»ßýNœ$®ÅeûþçJ’Ùµk—üìg?“ñãÇË„ b>8Aﯱ4 HcyAGƒ#Àb8++ËÚ…AýŠ5Bý!3£‡-X£’ ^ýá5@ ÐÐøŽ;öeË–UÏ£NGAA¼öÚk6î{W¼+€0øf”וÌ÷-`@ZÆ{Ž^Ö‚€/Œñ‚Åî|¨_ÕR=D9„Ӓ½ŒÕ”QE 'Æt6ë`$°¡Lâë{õꕌ¶ûV­ZU«â¾+1"ZÁ€´¸WN"À‚˜OH>’¨Ôÿ}ìrÕ?¦Qc ' gB\mæ‚àñ>§z¼Óé}éñž×–ƒ@0 -ç]GO‚@,N$@ i0oÖ&Õ&¾®954[ðcŠemÁD×@ @ @ á¤á°Ž–@ @ @0 -þ'@ @  ‡@0 ‡u´@ @ ´x‚iñ? @ @ h8‚i8¬£¥@ @ @ Å# H‹ÿ @ @ @Ã! HÃa-@ @ -`@ZüO @ @ `@ëh)@ @ hñÒâ@ @ @ ÐpÒpXGK@ @ 4K*++…Ozð¸ôôôçôrñܼhÓ¼»½ @ @ 8žÀLdddXÉ{"ˆOÆqïñ\“i–_-`@ZÄkŽN@ @ p|pæƒÚ“÷ÞZ2.y_W~/׿‹@0 Í÷ÝFÏ@ @ 8î¬_¿^^yåiݺµœzꩲjÕ*ÉÊÊ’¶mÛJII‰ôéÓGfÏž-›6m’3Î8C233å…^½{÷Zþüüüz£1]ÂR/»jY•”§^êlá•ÒÂÑý@ @ ޤêÔOjyy†yòÉ'å†n°æ“u.=Îpx~—°ÔïùëšÎx¤?V%‘©6‚© •ˆ @ @ 8${öì‘-[¶Èĉ¥G²k×.{þãÿhW˜ììlY¶l™ [ž~úiéÛ·¯1'œ>}ºLš4É$#ûöí“7ÞxC&Ož\]§3 Õz“ÎHF¾d˜’ñãÇ4µ-†Ó†äsyy¹Ì›7OfΜ)+W®”V­ZñfÍyë­·dàÀR\\l’–Ñ£G3Dµ-ø«ß3ûöмù¼ÈìD:çÿ!³ÿ!2ü‘1g‹´Ò%tUÞ$M^O2®¶~%ã’÷^þ€8g†<ñ€+¬Ä0!UuA‰Z«¯‡`@ê ɨ'@ ‚€/¹N:U^~ùeéÞ½»•£nUPP ………f‚TdÚ´i²sçN¹ð Q@:‚ÝFé Þy|QÏéɽ÷Þk¶%¾Ÿ~ú馆:Ø/ùK“´\qŦ†] ¶'ä9ï¼óªÕ¾¼¾ZÛ/+Yø”HvHÛLe8Z§¤"Ë^é;L¤[o(ÒOFµt%YO’îd|ýßÃJ(’ I¦¥JêQ-ÕI櫾O«#Y¾:OýÝRXFM@ @ ´RËo1ÛŽœœY°`I4`4Úµk''t’}` :uêôÿÛ;óà*«4¿_€„„°ŠhB€°E¡Q‹UºÝhY”‚QQ‘©ÑQÛÁÝRlÑr¥ÆqFªÆ‘¦ÄAQÔe€¢Gh7hQÔÁFDö-$$÷›çyoÞN”fBÈÔçP÷ÞÜo9ß9¿äóð¼ï{¼ê º&Ì),,4º"tLÖ®]k6lðð)~gÞH§N¼‚«kÑe¡ÃÁäõ Øo¼acÆŒ±X“&M\œBø«kQØÜqÇžoÂ_þ6{öl»þúë­]»v.ªˆ°ðΆðè‹äøO˜ÕohV~Ä,=Ó¬hÄG;ÿ#̽VóÚ´i“mÆëHÙÌ©•;/œÃ„…­^½Ú5ndEE=}îeÈ›¡+tàà¸4ü¾¬¦Ypjºú˜8Õpu"Ìãœ^g[Æö –øl¹E"ƒc¶ÆYf=-íôÎ DHeKÃÝ“ç’'ãƒ{ÍV/±(»•­¯Ÿk›¶n·³ºwµo•>üþʲ¿ši 5ÃQ½ˆ€ˆ€ˆ€ˆ@Ý"P±Hݽ{· ‚iÓ¦y˜ü÷Üs]wÝu^ŠwêÔ©ž§Ñ³gOÛ¹s§1|jܸq~ž‚„Åý÷ßo—^z©‡QqÑΤö‡~Ø– >^ýu{ÿý÷í‘G±:¸h™;w®mß¾ÝEÀ³Ï>k·Ýv›‡eyC=zôðþyÿSO=ewÝu—~úé¾à¯òKóy¥™µïnvhœ!B`Áܸa\‰r‹àŠP||øá6çµÙ¶wÏ^?<6pÐ`9z´mÝú͘þ/–1ò›¿›dyyùV1µbÅrÛ´q£ 2ÄÞ?ßú_x‘‡Š±o&ò/Zð®5hšmÝ;w°Œ• ,úÇ;-ÎÇ£1 +ÅU[azôh‰ñÓ BºT™B©'â²Ã-šl–ÓÉ~èzýþ³MÖ¦en… ~NÅAˆ¥vPƒ?K€Ô Lu%" " " u@ªsÀ§›o¾ÙÅÂøñãÝ¥xòÉ'NCß¾}}QNwcÔ¨Q.J¸@g˜Ô-·Üb½zõr‡"„,Ý}÷Ý.èÐÝxå•WàyØüÞ~ûm{â‰'Üa˜3gއa]~ùå.&–.]ê.÷ayß7ß|ÓÇÀ ]0LF Q@·‚B„cfJê\’¿»àíàÛ=f­;™e66Ûµ +4ж ¨èõúìW­Y³l;î|6³åË?¶™¿›n­! –Öö´vö9œŸOàj´o†ó è¢sC1Ò Aº5H§²H:dÑŽQýL$Ï3¶ ŽIœpã[å%EÑGó-zc²Å}jñiÿiÙ·ÿ ;£ÐÒÚšÕk`ñþ¹ý¤YŒçYˆä¯œÕ¤Ì »çX£Ü¦œ†%¶ƒÉ¬…¸)F-Êë¡gafø¡F[’bv©ÎD@D@D@D@ê æ|°Ñ½`¾ë˜ÂƹøoÑ¢…/Æ)òóómذa~žÉã ¹b˜Kò2o„Ÿ¬ŽEåÝwßuG€a]o½õ–;Ö \hÐùxðÁ}.üùì!p˜?iÒ$£0yæ™gÜ ñ‡á¡`W_}5ˆžÀÎã\ð{XS¸¨B¸ `Õ«ï>5ûb)Vé°v~kñží~eÆýùºu¶kç.»rÄHë‡çvëÞÝFŽm·Þ1 ¢¾•”r¿“†Ö‰÷Ä3)~ø¼úõêû3ɦ^ýzx⟇;ñš4¢àágC¼:œeim;ZZÁ9»ÀŒúàÀ–øèm³ßÂyyœE3F™ýC‘% :ââ=/œnÑ”KqìWf³ÿsYbqã\k¼eµå.¾Î2w|m‰ï¾4›y·EO7›6Æljo‹—χ˃D|>œŽP 7 ªîD@D@D@D .àâŸaWÌÑ`cÂ7]†IQ`p“B:¥¥XÄ£1L‹ûˆpñÏ+f1׃eu·lÙây" ¡¢ÈatT˜GŠ æv¼ú꫆Åät>ƒBƒ‚誫®²™3g+t…Æ1Ñaõ¬ð¼pÎ?±ø?ºè>½+rA®2;‹ó#˜ÛïFY<÷Q³­ë­¤¬Ü¶`×÷üü|=㽜#Ëÿ<Ø~ÑÿËHϰCwŸóûºã±ò+<üŒs" ^E¬R9%¸ðç‹"¤µÆ[¾²Äú•¯Zhv&rQZµ‡ såT³‡ÖXü7ÿnÑn\ûÙR‹?[fÑ’{ñËø+‹oGWçQ–¶y7$EdeÀœÀt»6™­˜gÑ's,žðÏ–˜„ëš÷1û7™í9%<Ÿ ¨fEˆB°œ¬ÞD@D@D@D@Ž—@p øÉ$ïk¯½Ös:(èù wbc©\Šº¼ž-,üC? Ib[¶l™‹ æ€p3Ã3fx˜ó>˜³ÁÄî%K–xõ,–óå5ÜmýÑGE¾ÅVw<((€Øúõëçù%]6>‹. Å Š•*-ˆ.þÛÀiÀª~Õ;f¿~êè$§¿cåçµâ8²Æ2‘"’ÿ÷Û¶Ùï1¾½{÷X7äP@$â„™—ç¯Å‹âÙp1ꥹóð/wxir“ðyÔ}€[Ä·™#àJà“o?^5ÙÒŠ@ÍeX¼mƒE?qéA‹ss X0ÞËîxðuõbvZ‹×<…0«5mn–Õ ýÀÍùæ?Íz µè¢eµ°xçf‹fÁAù~£Eœ;[Íê“IbÕ»ˆ€ˆ€ˆ€ˆ@5äççÛc=æaS³fͲxÀnºé&»õÖ[=ƒ"cÿþÞs ©á‚›â„¹!Û°ˆÿÎûæ¹õë×[vv¶/Ò™¤Íª[5Ü‘ˆU­˜S‘™™éIî~3Þ˜ãÁ̓3ŽÓ [á.D8Xù³B,ùár87 Ábõ)$s¾×ê<ÏÛ½å ;9¼Ž!U¥puÞÿÃ2Ïïè„p4Š­ú³êÖ­»­]³ÚÏÕƒD¡Ä¹'ïƒ/Qñ¼4½rí|Ãýq:~ìŸE­Î´x×÷}0Ù¢Û¼”­ß˜ýëP„†¡'è ˆîÆAÑ5M·¨Y ê‹"¤®+Çø]ì ßRü|76ÏGΆë]!‚Ê9IMä$U·" " " "p* æý(5Ëïk®¹Æó.ÚtÓ„ ¶Už^zé%w23úB<8©\ØC±Ø(d ±h_ׄIê .ôDõK.¹Ä˜óÁû¹»:«f]qÅî¼¼øâ‹pözØKûžsr$*… &ƒ§6VâbèE@•FQ@1ÀÒ»_ÿ’¾±ÏÁ¢< }Ì™—{€\xƒ¥7G‚yN3[<n~ȽOÚ"$lØ/‰Ü—íîp0ÔŒó+-=bÍss­Oß~6ëå—ðÈÈ(N"ˆ ¾(ªÏr„v.9l ›åà„Ç“&1`¬Õ;® Œ¸î[ö%Öô²´/—C4 "ÖÄ'ÌXjw΄ä=Å¥>˜ MÑÁ­5)´ÎËã—ƒÊïû(K^W ±Èôt&žœœy¤&" " " " ÇO üÏ=ïxçwläÈ‘î\0É|øðáöÔÓOÛ¢E‹ìO¨ÅF"ÕéŽÏqáœæg0\‰Ž1Âüq¸'û=¤‹9!LZg‚:Å w8Ÿ YÜ<ϬÎþ¿ìwröùl®ÅŸ¯°Ä·ëp=òHšáA­ ´NR“r’Àª[¨ ¸ ï½÷ÜñàælAP„¼.¦ö„Åó/¼¬˜—’ÔétС £ÁP)†X±ºÕ¼yóìÞ{ïµûî»Ï_'Ì5¡Â|î/Â>Ö¡:Ëô2l‹çCŽ ŸÉ X|>K³Q÷Áðm;’³—üÖì’7 ”=Jz}k6øú¤Kà÷˜uìÔÙF#Ñ}6„Î3(=ÌçpÜåå +>TlŇ‹m÷®pxh)@p ‡¥OŸóí£ÞGûf83í7âg½<Óþ~êÓÖ,;ǶÁ±iÓªµ‹«`–@žF‘VQY 5‹»ñ¡½–ØŒ±7ɵ¸Ã¨Êé IDAT#ÄÇë÷ Üî,‹ö~eñàøð ž~ñäs`â…´¸ܳ/¶xÓ—–XµÇ¢«›[Üû2ˆÌsê¯,¦ð€h‰Çý“¥µÎçÓðO…ØòÏä‘~—9a„ê@D@D@D@ê.ØÃ½wïÞ>ynDÈP" ’ Áâ¾;vôÅþÊ•+= œ¡S¬fEgƒn7¤áf†tKBˆ?&ÅÝÕÙ'Û•W^iS¦Lñ½?Ø÷óÏ?o¯½öšï ÂEÿÇì÷³O:%tG†êN‚w€7Vêzá…lâĉžÔŽûgXhóË8é9¨~5ÐÝ;‹ôb¿áXmáF0¼ž;ƒ±vHçøãDì;¸S1Œ*7·…]vÅp;%‚Cë dü |^­¶Õö4°i‰¼—ͪŹtèo;∣ƒ,-;·g·tñÃý=¢g[4zŠEG=¡Ò³,Ú…‘AÒ¹yØ%½*xœd‰3‹Pk§‡‘EÝû™aãÂI‰ïOŠ †uMœc¶öÈëü.HJ¿}6J™â£†›H Uw" " " "P—pws†C1߃ 2ïáÎ;ïôü VžÚ³g—Ãýú믽t.Ê Aƒ¼j]æ0Gãâ‹/>E§„%vYJ—Î ÷ù¸ýöÛ]¼Ðå`‰]~gŽ×¹a!ß¹÷¡û‘ÚX¾—"‰áb ðSADù®³ƒÉ‚ø8òÅ*³.ç™­Ãâ<îNcZhÌ¡ÀµtgèzôèQ„®n.¦BHEÅU—.]ü3yc2m0ÊôºØÂ➼肜 !ÇcÁ%âõtRÊ{]Œ*VC¡;À㣠éÖßÊ;÷Áž‚# ñºü¯‘ÃQŽç`óÁ2$Ëã2¤ö£"v{vN!„Õ´x/»(8¯ž†;¼Ï"$Ѿ«ïðž†dt—?Ňj" " " " ÿׂ Â8ÅCš¸ݹH¸f¸çèxp±Îs|QP(°qN1qÙe—¹èà1V³bR; ‘Ð(2zè!›>}ºWÀbès9X’—ϧY¼x±ï Âg°úŠî˜«B…¢†Ïü3ñáಛ«s´Öy¨á{Ù¼Š'âÈ>¸ Ϲ+î+Ç|¶£07,)AU,Ì‹Ièt?(²($¸v§fhÙ²¥§ˆñ¡bÜ$ˆ²l€1ÁÆQ”ÀAá½È1á÷#øžÀÞ!Ü5 ä¥ëÊÌH·fȯ9t¸Äö¡ÏF( œ€ SQW† W¬–“ÛÒöaL¥kŒbdRqáýB´Äè3¦£C!ƒ&pï–MÆFŠyyù.9çšlr@j’¦ú:D ˆ~r‘ÍWjã•b‚áV?ÕÂb¾M›6GOóE EEj ×ÒQ`©ß¥K—ú†„:tGø¢[ÂÊWÜÿcêÔ©‘—ðå¸èÎ0 œ-ô•Ú¿ÿŒë}Õ0'»p4’½Û›mûƬaf UJi#øÜ½´d¿;Y|•b¡-ýYåå̉m?+‚qO!Àêa¼§¬ ‹~.üñs ÎQ •¡V:Ä]£†~¾øÀˆŽÒ¤hA_@¨qe &ø£ÿÃ÷£/*YaÌÁa_ÜŸ$¾ËJŠñÌKàÙåG ˜X«\^Ã\• e(¤…ë!GàŸ$9áãAÈþÕT“©)’êGD@D@D@ê B¸¨ V/1‹Å0§ž;z Îñ^6wðÉï?w,<‡×ÓÝ`µ-VËâ^ ,ùûé§ŸâLlÌIaXÝ^Ãê\!´égŇß7މsi€2´=àNàÇÃø(@XZ—/öÏ90d) âƒ%y)¼x-ïã^%¬ŠÕ¼y®wÊ1ñ:މװQP%çJwˆ2 )Z·i[…c¸nRÌ•÷%Ǿ’h½ßfà•ú;H§K±ÆD¿½‡}ýøëõ1È›ȉÐÓ½" " " " ¾ð ‹ÚÊ8xüçÎ…kÃâ;|ççO ýø" d  ¾¸XÒ ©|?ï9ž±ø¸*§a«üsòhÅ©ä*ŸýV~^pBR.Ç5›ý¥ Â(ªÜϸVÆV¹¿Ÿ;æW¼…{ù5µbXàzmMü,RÕ‡ˆ€ˆ€ˆ€œÂNÖB´ºÈÂ"=UTpŒ ‰ªÜÂ5ážÊçö;…Gh©?‡c•>)€*s B8þS×Tê¦Ú_k¬oê®”©W{@ǸQäptJD@D@D@ê2.ÞÙ¾\HÓ8Žõx­a cL?Æ …ErÌ?VÓƒ ‚£r¿©ÇS®|݉~¯±¾ÄèCb¿|Ñ)!ï êª;^ ê’Ó}" " " "p àÂ=8 ?Ös O]S;þM„ÒÈǸ옧$@މG'E@D@D@D îàÿv³*w çžÅÅÅU‹ê•º=cþMPxìØ±ÃË-ç©:T$@ªCM÷ˆ€ˆ€ˆ€ˆÀ)J „ÚpOŠçž{ÎV­Zå»v‡¦StÚšÖ_ w­_³f3æhžþ_¸µÊi *Ht@D@D@D@ê&Š þÏ6Ãlè;“³ÄmÈá"T­n”{—Lœ8Ñ7˜ô «C¤Ðt‹ˆ€ˆ€ˆ€œªX-Š›øž±cw §êœ5¯ã#@’‘‘a999¾“=sƒ‚09¾’WI€üohéZ8Å pQÉÿåæævÜ‚{kœH¼ÿ)Ž«NMbƒ•°7nlYØ9!Õ ¬4yiuêOG“c ãÁäs&¢Ëý86«ºv6ˆŠ T ºö ùŠ€ˆ€ˆ€ˆÀI"Àÿ£ÖÿSŸ$¸ÿÏ»¥è¨ŽðÓ–HèSD@D@D@D@Dà¤H;éOÐD@D@D@D@D@D ‚€ˆþD@D@D@D@D@j€H­¡ÖƒD@D@D@D@D@$@ô7 " " " " "Pk$@j µ$" " " " " ¢¿Z# Rk¨õ  ý ˆ€ˆ€ˆ€ˆ€ˆ€Ô ZC­‰€ˆ€ˆ€ˆ€ˆ€H€èo@D@D@D@D@D ÖH€Ôj=HD@D@D@D@Dà–†L†IsÌIEND®B`‚gnss-sdr-0.0.9/docs/doxygen/images/GeneralBlockDiagram.png000066400000000000000000002653451305042567700235050ustar00rootroot00000000000000‰PNG  IHDR ñïOœtEXtSoftwareAdobe ImageReadyqÉe<$iTXtXML:com.adobe.xmp ŽxæÁgWIDATxÚì|Åú÷O/é½ !$$ÔPBïH) Ò, ör¯×.¢¢^ËõEÿz-W½Š ‘*½B¯„$¤÷Þ““ÓÏygöO &x¾b>sfgžyvvvö·³³³3ÑbŒFcee¥N§C¸ªªJ­V#P]]]__@]]]mm-ØŠ€V«Ez“É„Œƒ‘ååå6‹Yhhh¨©©A@£Ñ #H‰ô¬hfÖ° –YÑ*•ŠY`EÃ"­-èõzaÞyd±qžY@H\(>0 -qñ¼ó°€, O˜óðÍÆy”n³û¬‘ù¢ñ‘ˆ±±˜ëšç‹æçwŸwÅ1çñ—ÝôØÁ¬hÞy¤AÊæwßÚù²²2vô›»¦ÍE0çy 6 Í; ×rÞºá!ÀŠnÆyëfƒz³±ÐôØñÎã'ï¼MÃc®£á!#|hzÖüeͳ†ÇŽkx,cӆǟ5MwŸ?v¼óvjxl¯am}Þ]µá5=køS¾™³†ox(ºiÍóÎ³ÞÆÚB3 ¯ù³†¯ùfö¥™†gí<Û}$æk¾™†×Œó|wÍ[¸ñ†ÇŸ°¬»æÏš¦ Õ|k»kø³Æf÷ùšç;[äEos­†‡\,@´"Ñbplܸ±´´áÍ›7§¥¥!°k×®Ó§O#päÈ‘ ””´}ûvŠŠŠ~ÿýwœ38‘~ùå4nDþüóÏÅÅÅlÚ´‰Y@®S§N!pîܹ½{÷"••µaÃp†üøã8U`aaø››‹­;wî<þ<ñññD !!aÛ¶mdffÂ>³°~ýzœ–è>`Î댌 à'² pôèQA 99™Y€“¿ýöNTäýá‡ðaø€³[·lÙÂ;òäIΜ9³{÷nÒÓÓaŸ·‡Ñ hæ<¼bΣè .0 ¬hX@e2çQ½¬c…:DÑè¼°1üî3 pþСC¤¤¤0çQó¨pP(*»ŒÌù­[·^ºt‰}âÄ ° ÌyX`õVXXÈ;dDOŠHìE~~>;ú/^D`ÿþýÇGàìÙ³ìØeggc+è á3ÊE·víZüd˜óØSæü±cǘó0Ç@¿þú+ØýuëÖ¡CdÇ®¤¤ÄÚy8Ìjà³Àï>œG¹p¦˜ópñ¬áñ»Ï, áíٳǺá¡høŒ#Žœ5<„ÑðòòòXѬá¡Í³†‡Ÿüñ‡øŒìpÎ0ça5›;vàp³cÇ,X7`Ðlàkº|Ë‹‹ãgÇÍ@YHÏÎvì˜ó999¬hæ<,°† hKÌyØg$vÖÀ T k60…¬áñg ßðØîÃy4²Ë0|@³øÐ´á1 hù¼ó¬á°†Ç[€ÿÖ 9vΜGÃcmžß}¾áá¸c¯YѰÉÎì RZŸwpž;ÖlPó8è8ïP4Î\Öið»çYÍó û‚CÆ,°n Öã!À:[¾»Æ±cÝ5ju×ÖÇ;ËœGÑ ÖݵuÃcÎÃæËÄÁï~óÎ7=vMço›ZàGøÀІ¼¾æ›:o]´õ!¸ªó°ÀŠFvV4ôÿÒùkí¾ó­jx,£µ…¦ ÏÚùk5Ö õÖÌYÃ;Ï7›fÎd¼–óMžµóÖ ¯%guÑ×:vÈÅœÇ_V4Ö\õØ!£M³¹êî[;Þùk;Þyë†ÇŸ5Í;¾hümIÃÍfžuF›³ÆÚy›ÝoZóüÑoaÃãozʳ¢ÿ²áYw¶MžõygÓl®Úðšq¾™†Ç;o]4;k®Õðh«=âR™-$==÷ K—.¥ª ‚ :ÝCh5WWWªŠö¶‚nݺ͜9³i<îÐjm"qÑ4òZ#ˆ|˜g7RMÓÃ&Š»n³WåªeYËð¿,‹ÚADçܹs7n¤zh7h« ® DÄb1SWW·zõê‹/ÖÔÔ :ôwÞ‘H$ˆ_³fÍöíÛ¥R©‡‡ÇSO=5`À€’’’%K–<÷ÜsãÇG‚={ö¯½ö²Àç³gÏÂ%6ŽýðÃÏŸ?_ÀM¾yóÍ7¿ùæ›°°0üüöÛoÿýï{{{CMúùùÁ8‹'‚ :¸Ä ªŠöABUÐr²²²âããxà>æ‘G„úôÓO!DV¬Xñþûï¿øâ‹ï½÷Þ®]» å±iÓ&¤Y·nÚô™3gž}öYXpqq©¬¬¼téRDDÄÇ\QQñôÓO?öØcP'½zõ‚Š ‡ÆR«Õ¸á€êׯR>øàƒ£G^µj•J¥Z¹rå“O>ùŸÿü§¬¬ŒÍ ´öaŠjÙ²e#GŽ„Œó÷÷ÿä“O Ŭ÷¥¶¶i ãà0DL=þøãHùÄOœ?þÞ{ï>}:ÊBè0– »½…{ çŸ?322ºw†’ûõ×_-Z„wss£¦BÑá®÷ î·©H`uD|||†Îÿ<~üxii)T»!øòË/óòò – ?¾øâ‹ÈÈHDBâœ={víڵ˗/‡Nrvv~å•WÖ¬Yƒ†ÎÆ¡¥ªªª\]]èÙ³§€{¶Aƒ²vww‡€ƒÛ±c‡X,~ýõ×YÑPowÞy'$„QÓÆ!È€Ö êÑ£‹ …«§‡Èñ„¢!’`¼k×®ÑÑÑ………سÈÅF¶x äÒÓÓW¯^ýî»ïB„AœÁB@@@WŽ>}ú$&&bß!©©At4pÍJMM]²d U ¬‡3ÿóÂ… @üp+ÓˆÔjµ¡¡¡|²qãÆýöÛoõõõ#|ðÁìÙ³:uÂ'`¯~öS&“mذA¥R•••!×!CÆŽûòË/4ˆÏU„¢!h¸‡­'W) ¸QTTÄ"þö·¿!;~ä‘GP\mm-~²gˆÐ[¯¾úê·ß~«Óé‰Ò¡Ÿ~ýõט˜˜É“'óÍ7¿ÿþû¢E‹ž€ÆÞ¦&‚ :}ûöíÕ«Õ ¬ŽHNNΉ'æÍ›Ç«ëiìlÉ(è(^-µZíáá!‘H Vºté²jÕ*è•û￟ÍÖj òöîÝ{ñâÅ›7oÞµk×ÿû_Dzyy5Õ....l¥™–W'Nœøñdz÷u—/_Ž-›;wnAAÁÛo¿ýÉ'Ÿ3 Ÿ{]ÈÆÀvî܉0„×¥K—°/H`3xV^^îééIí„ ¢âÈAõÐnÐãØVàäädýÔ,66¶¨¨ˆ-Z¾ùæ›Y³fA øûûÿöÛo|²Ÿ~úiøðá^lé”éÓ§÷ë×Ëz²¼ÀÂMưaÃÞ{ï=ñè£"Z'..Ž=¿p ô! ³M×j6 t¨Ÿ€€€&ggg¶\ Öøñã—,Y²zõêgžy†-LàCddä AƒˆsòèÑ£ Ï>ûì!C ±.^¼˜ŸŸ/—ËÙcG·¢é… Lí„ ¢ræÌ¶–,Ñ>ÐV+ðâàvëÖíñÇä‘Gî¾ûnè’Í›7¿ûî»2™ J‘)))={öÜ»w/ÔÌâÅ‹ÓÓÓÙâoȸjÕª-[¶TVV2;LèX/”Æo¿ýöÈ‘#׬Yóä“O.[¶lÁ‚3gÎDâM›6½ôÒKÐ=Ð7»vízíµ×t:ƒƒÃòåËÙä-^TY¯é Ñhø0âaÙQ{5rÞ¼yÛ¶m{â‰' ‘òóÏ??qâ„–cìØ±7nDÑÓ¦McÙ±_ðÊÍÍmûöíø[SSsüøqµ &P;!‚è€àšE/!µ'â•+WR-´ÂÂÂC‡±©èŒþýû÷íÛ7//å…^`òÂÛÛÜÜ\ÈŽ;î¸cÅŠ‰D*•õêÕ )•J%dStt4[Ô[{÷î­P(ܓǨ¨¨.]º Œ” ËåÈ8xðà®]»B¨AHAo=ZÀMc‡æƒÒrrrrwwGFëÙ]ðî±Çv...ØŠŒm‚ÃOl‚þƒq6…" ±ƒ!!!0SÎÎÎ(΄††N™2FXvxŽpll¬¯¯/v Öî¹çž‡zˆ^Q!‚è˜àJáááAõÐnÐ:X­XçÏŸŸ:u*UAѹ¸xñb^^n•©*ÚzDØ 9¨‚ ˆN‡“““õ,ÂÞÐV+(++KKK1bUAAÍ@3fZZ­...¦z ‚ :YYYG¥zh7èa+â z ‚ :Z­V¥RQ=´ôˆ°ÔÖÖ±¯ÐAA\ zDØ ***NžÐ#ÂV Ñhêê꬗J'‚ ‚h ="lùùù›7o¦z ‚ :ÕÕÕ¸ŠQ=´4‚Õ ôz½F£qvv¦ª ‚ :'OžLKK[´hU ¬‡Éd2 2™Œª‚ ‚ ˆf G„­ ##ã›o¾±‡åšššœœ·–iff&”œÑhLOO×ét¬\¶xInnnuuµ€›«XRR‚@eee^^õõõÈÈ, =Ó‚YYY‘0^WW'àžr–——3 EEEÖ²³³!¸Q(LñE766 ¸êjkk(((¨¨¨pëÚ ¸Õ+xç‘ôz=œÇ_„‘ñZÎÃ+P4³€ôØw8˜óØÄœGbV´õî³oÞy aø`cγݷvžÝDFØîÃêwE3ç‘‹ ;¬hëÝgÎÞyphØîWUU]õØÁyvìP4î/™8£Õj­жq.±¢aEóÎ㯵óHÜÇî#﵎2²¢ù†‡›ÝçǾØ8ýEFÖðøÝ‡qÖlø†‡ì¬è«6<ølS46ñ ¯é±cÎ[Í7À µ8Ì,`š6<¤gÇŽY°ixÌyœ­¬èk5: xˆ¢áü®]»P4Âðu‘¼…“'O²Ý‡ó§Nb s2²žk÷îÝØ}Ô!22E‚šg½9v™ÕüÅ‹Q™ì*rèÐ!æ<|Ör ÞXÍcwØ…Î3 ü±ÃOæ<º~ddEã ë9àŒÍ±CÍ3ç“’’Ør!h qqq¼\Ðq#ÀŽ*„9÷XÍÃò2ç™ì>sU WÑêP4"»6£øÝgPíÌyëšÇβK&Ò£Ò°û0ÅjÞÚyÖlpèYÍc÷a–Y°nxhópÖl°ìšdÝð˜놇¢aÍfÛ¶ml÷QìâÄ7¼ЊXÃC«€}~÷mê–I$f5ŽÃz÷QóÌy¸Íš Ž*oºl÷QÛMÏvìÐlXÃã-À¼bŠE³fß5°ÃŠÆ±cP|Öq`/Xшa—dT2pØwfÁ¦áÁa†‡‡Ã×´á¡¶Ù»ýh6¬æ¡Ø ‹æÁ,°c‡¿Ög Ú<«yì>k6°cÓðÐNE³6Ï$uÃc»oí<;vpž5œGѼó¬áá¢Àš vÿÌ™3Ö˜ó|ÃcW Ôë®á<;ú6àôG¯H—òvƒvÐî»wïNUAAÜ ¸-Q*•6ï¼3!ëääDõC#XÜ~ùå—v:Ø +AAÜ gΜas¬‘H$4‡¸=¡¬VPWWW\\Ü«W/ª ‚ ¢Ãb2™ðW$úÓÊéÓ§¡ºî½÷^ªX·yyyr¹Ü××—á‹P(¼V.6[U–V«ÅY'•J­ËBŽ¿ÌÎRÒ!#‚è°ÔÔÔ “wtt´Ž¬®®V©T]ºt¡úièS9­ 77÷ĉsçÎmsËgÏžõòòbkÕªUÛ·oÇO£Ñ(‹ÿõ¯=z'ÆÓO?ͧoll|çwNž<)“ɺvíú÷¿ÿ½{÷îÏ>ûìØ±cï¼óNH¨… FGG¿þúëH¼råÊÞ½{ßsÏ=)))}ôQUUUCCC¿~ý^{í5‡+V¤§§»»»³(^|ñÅþýû³RÞÿýcÇŽ­_¿žÝ=óÌ3ø Ç ±üýýW¯^­P(–/_¾fÍD"Á¶mÛ> Ǩ©AÜDöìÙãçç7räHëHwªœvƒæ`µÜ tëÖÍ–ïºë®ádzpZZÚÔ©S?ùä“?üðŸÿügXXXNNŽÍò»ûÛß²²²¾øâ‹/¿ü2 à¾ûîƒþ<ûnnnÐI,̆‹ëêêâââ ­ «ØÚz¯¿þ: –••©ÕêçŸê É6mÚ4cÆŒ)S¦üç?ÿÉÌÌìÑ£ôÓo¿ýV^^^YYùûï¿?òÈ#R©´¨¨hñâÅŽŽŽB¡0-- JŽÚ AÄÍ]tÓG„T9$°:"lÉc{Xž4ica0¦OŸÎÔn8š&fÓ³Ø -> îW Œ ƒ ÌªªªFŒ¡Õj·nÝêàà€0Ò¸¸¸°/a6>>ÂèÌ™3H =7jÔ¨˜˜¨:H±|PÀ-gwìØ1‘HtúôiÈ&è*¦ó4Mmm­R©üè£Æ±ßyç¨=8óÓO?={–Ú AÄÍ7çìVÙšäää¼¼¼;ê‡V‡#€Ã–!ƒøWóL&STTÔ€¬Xë2¤¢¢âÀl,­®®nÏž=o½õƒþî»ï"##¡¢££?ùäˆÂ%K–`ne>øàƒÇ{Ìßßÿý÷ß/++›ö°<}útª^‚ ¢M˜3gt†MäÍzDQÐÐРR©rrrt:܃ðâç¶K¯ÀË,&›l”?Éc3÷ùIîZ+ØKi(ÅÙÙE_ÇZH)))e>>>îƒ+………ˆìÅÔÔÔÞ½{7o“V+pç°‡eÈa38ªd‚ â¶`Å:2,,Ìßßÿ¦øÃ^îsä` ‰½BÈ&HÕÖÖòʉŸç~­Ùî‚?OoçÓ³+6ŽåäääááÝÆ 6¬§Ï·sçÎÅÅÅAΘ1ƒ-Ïu‡Q±ÕÕÕÍí‘V+(((8{ö,êºÍ-8py̘1TÉAÄ ²~ýz(ƒñãÇ[G² n¢WÖó® ƒØ»óL-±×y™u-e-­V ­1ÿ™ëV )dÄuÿôéÓ#GŽpƒ,©LÌefföëׯéH! ¬ëÍ•³‡åY³f5s‚ ¢U×\°l";Ô·ye /›ÚÄÚu«À²²2__ßaÆUVV¦§§_¼x1""ÂËË [{õê•””„4b±¸¢¢ ¼½½I`µ~ö°Ì–¬m“•Ј΅^o4™h©¢MîEb1ݧ®ºà“OSÕÕ&ètº[f)ÇìììíÛ·Oœ81<<|ðàÁl=­#F`+dUQQjR«Õ–””ÀjJKKQË£GnsËëׯ‡^Æ¥J¾­ÈÏ/HH8¨TâvMHµAÜÜ|^ŸQ£ÆÛé Jt.pMñóó5j”ud‡=Šûý÷ß###ƒƒƒ;o 4•••ÐLÇ Aâç¥K—òóóõz=›†­lY%¤¯¨¨hbË\m¾6¯›™3gÒðÕmHuu5î…ú÷S Š‹,’ËÄ m±—gLìXÜOÿY®+ñ@t%žã¯ùÊÜÑÿæþOÉYf;p¿l†Öaÿ])EÀ•BǪCƒ£ªÖèOœÔiµX1b„B¡°‰„P(,,7n\›WSSsæÌ™sçÎyyy…‡‡÷êÕ Ò¤åM‘IÒg3g†Ÿ¼…xë4ÖOm~¶dT«ÕÐU111±±±7nÌÉÉéÙ³g×®]322êêêjkkÙSBwwwv½†Ïõõõ$°Ú†nö°l§/Sýº(9(¥r…Í·Ád&ƒúF"u‚ªÇ‰Ïº ¾¸^ š¯D¢K2ý9u Ëb2¯ôGbÑ«MÇÏDWÌZ[#:.b‰H&•Б"W©bŸC¾Vh¯âââ°°0½^ߪ²ØÚ¡J¥KJJ`'>>¾K—.¡¡¡[¾¾¾-7ƒÙ’ †ù€’I+ömAAƒË%{ ›˜¨üùk9×Ñh,++«¬¬ ‚ :t¨³³3v ¢ EC{5440…M¬\ʃ¸–”$Õºñ†ÜÜÜ~ýúµ¹åõë×{{{Ó[„·!ì]™Ë*È2B%ýñ‡ø¸¸T¡H8zTÏ…‹Gž;“qôhÖcOLD²ì¬’ Î>ýÔ±T¹yãÉÇÓß^=[&—ªê_~eÓ}÷00ĨWðáîGWŒùä“ýaa¾÷ÌÃk8Ô=Ø3 Àí¥—6:9[äœ^o|ò‰ñ%%uZ­~Öœ!“’Ø—¸}GâûïÏ%i©;w&=ùôD‹£ôY­Ž+Õ¡œéðÿcûöí¸¦ 4È:2”ãZYâââjkk[+S 6 ?øe?¡6 9Ò8 ´p]sss»Ö[\làê»ï¾ƒ2ƒDƒ˜˜˜!C†¬]»\öTÎÝÝýþûïollüé§Ÿéäätçw®Y³hΜ9(®  àÛo¿]¸pa÷îÝ 6OZ@jjê¹s碣£QÐUð 2%bûþ4[T‚%†K¼òk~IzX­XçÏŸ·‡À1b}ì™åÿý.në–óo½5rê…7öõV5hƒÀBó0W×hLúé 8¯7m:—z©äÔɬá#£ŒÓæÍçÓÒʶïx VŽÉ|héÈãdzÖ|²ÐàîÁÝ»'&rOýZá—fsŸœ7…öðygǣɊˆˆ˜={ö©S§~øá‡+V$%%Á2|†*ºpáÂîÝ»aäúüG‰eee†® åÄž²¼¬×”g1-1K«„pØÃòÍZüèHƒ"Q uõ¦†G¢™¿üâ>ˆšóçóëëÔ gSqJ_¸P –ˆÄÙÙ3Y …ìÉ''ýºî4dÓ AÁJ…ôƒ÷wþíïè"…z½1¸»—‡‡ÓÊ×·|÷ý±H,¶ô2™ÄÙYŽ­°&’Ê%R±Ød¶‘NȾxáŸÖž3:\&“Ò‹iÑ鈌ŒlYSSSXXx-u‹#ðèõz(OOO&ª­×Ín~%*öÑGGGWWW„¥R).µÐ:ˆ„êòññ9räˆN§[°`̘1#** ²¬[·nˆLNNîÛ·oNNöë:Æ®Æ ƒÆ‚bƒ0[[[Û³gOljhh`ÙZ£:Œ}çGÀ=u¥u°Ú•J};ƒ6·¼}ûvà¡C‡R%ßÎãW5µµu??7ËÔ+“ÑÇÏS Š“ ²²+¾øòtO~~57ñ]¼iS‚··Ó€þ_~y ¸¨L.·œÈo½u×~7zTOGG¹Y`Ö¨õ+óÅ×­;¨PZ *’'³ŸyvŒàßÿ^$•ŠtZ£:­!*:pÚô>¯½¾é‘GÆ2eFD'">>ÞÝÝBÄ:2šÃÅ 2Å53Ç«¥ÕjüñG÷Yè'žx"<<W[¨È2ü…zÕ×ÛÛR†=§Ã~ ,ȯ‹/º¸¸Èd².]º\·Àp½¼¼Ž?>jÔ¨´´4&à_RR‚0Ä?"XWWg4Q:܃ lf.ûÝ›ªÕê?ü077·%‰Q§Ÿ~ú)´d‡j²ÅÅÅûöí³‡eH~ĺí1¹y8zx8dd– 2HyäpÊŽíÇFóàÁ!Ÿÿ{ùÿ}öð›oÎqr’76Ô<˜–›Wùõâ««·n9¯THôzc×n^Ï=7éÕ×6WU©pWey‘P$|ó­Y?­=~îlŽT*V7ê'Œøþ‡ÇÖþ¸â§ŸW8»ºëuF¡åöK*IÂÿõ*ݼ{G)ÒÏ>Û§KéØDç‚M‡²‰¬¬¬ÌÎζGqƒ ½u%àf¸CÜ<ðÀ¯¾újß¾}+** –¬G¼(,,„0`3¢Ö®]‹Ë16õïßýû÷#ãï…R©œ2e äÔ±cÇ Ý|}}5 D €|äÇä¬h~íñöXp½_¿~¯¼òJbbbó)!Q_~ùeìd3Óñn !!!vúLfDD´?u ··¾B‡"]´pÈ?ßÛqôHÒÞ=gŸzê“Ñ, T*@ Ç?ƒÁrK÷Ë/§‚‚<þûý£ï°ø«¯îûþ‡cEEµ¸ lTi¦Nî·s×EDR£JØeÞüÁ7'ÈåR‘X˜Ÿ_uôpRüÁä¸ýIeeF“91±àԉĽ»33J"1î'µ:Cc£×VÎŒ‹»TW¯¡ƒC‹áÇ7}J˜••uüøñŽæ*{ûÊÉÏÏoÉ’%ëׯ?zô(~ò_ÎÑëõ={öôððøúë¯SSS¿ùæ›}ûö988ÔÕÕuíÚ‚áÈ‘#ÑÑÑjµÚh4Þ 3NNN(×ËË+66?ÓÒÒÊËË% ®þì™`CCCYY¯zì;Ð×B¼råÊö(¨¦÷Þ{ÏÅÅåZ“™Pe/¼ðBïÞ½}ôÑŽÖØg)›..rãÄÇÇcÇ[ò:+q+QVVn6eùùI¯L‚2ö ïâæ¢Ø¼%áØ±ìeˆß5kˆªA µÔ@WH0£Þ   Éè1áÁÁh’Þ^NuµšnÝ<ä2ÉÀÝÄÑÀ˜nFƒiü¸p­Vß»w€‡§"¼—ŸƒRÚ¿×·„„üä䢤‹…xz8…öðA8)ÉòÓÕUi)E«Özy9…Gø8;;öèáéíí<0&˜f¸wh„ô¼|Y×®Q2Mü çÏŸÇÕÊÝÝÝ:200°™G„aaa72ëZTVV–””ອ™Xõõõ¡¡¡2™ *ÊÍÍ š&<<Ü`0h4 c qúôé“““-µbÅ (•J…­ÎÎθt0 ¦¦&88»lóZ›Æ-:è Aö—Þ œÁßŠŠŠýû÷C·Á¥Q£F±Ѳ³³á[TbðàÁW]4ÿrÑæv··¨¨è7Þ1bÄâÅ‹›\oÊ^yå• &Ì;·6Ùôôô¸¸¸eË–µ¹åcÇŽ¹ºº^uZ"q “”tÑhØÓ·ŸƒÀô¿+¥@(»²š‘Ù²z‚P,J {¸­"Pzy…*“þr‘œß’ÌZËË­•B`R D2Ù 0¹ÕB³Þ²&–P)à ³Ä¯Z~š¹Åƒ‚ØÂ "Γ–V‡F$ЪõñGœbcïut”S}W]¦ŠD«Õ^ë{ÏüñÇÔ©SíñUÜK—.;wòîZ+@£À16þĆ0غlá~YQlb/÷ét:𠌭…]Cb‡­Ê ‘8+++""bذa-w{Ïž= °?nÜ8È;6ØÆ E$ š9sfÇšäðÑG½ùæ›ï½÷ÞßÿþwÞ¹üüü—_~ùÞ{ïÅ1î˜M¶[·n³fͲ‡e6IÜvã–×g¸ïäüé ½¢œ {,[Ñ%é¢+’KÀ/XÅßh2õ£»¼ìº%š3¨cK¿s[5WV l´öà0Xi;æ‡Ñòï²}ýŸË":–5ɨˆæ¸êeôüùó)))K—.íhÞ²§ÐLü°“u<Ä~Z¿í%àflijŒmÈСC þøa¿ôôô‚‚~V{hhhózôæ &;::®^½ú_ÿúÖªU«ð3##cåʕ˖-³Ç—þÚ ¹\n§Õª.\¸€JèÑ£õ ·8ù++kšÞ¹I$Òòò“Q_Z¬½w_ˆÛN”{yIdr!i,¢²²²”J¥Í»SC† ±Óê„7í×î™NeMU*Õ©S§ŒF#þº¹¹ýå²M7íi=tßsÏ=÷ÓO?½ð 3fÌøù矟~ú阘˜Ž|h¡:´dÉ’6·\\\ìîîNë–$-íRFú^YS%Åbaz†Žj‰hY·)(+7„t—÷éë@ ëÍpöìY???e2™ Ãõ½ëw#°U£ì1»«åzC`õAÖ#¿ò3äÅÕ¿´´”Õ~FEE5]ʵ£,Æ‚ —.]ºeË{¬Þ¶øúúÚ|œ¼­˜\xZ§Õ§ ·~)þêõúŠŠ üe+Â_·`MJJbz "b %+ŠÝü÷M ´páÂŽ¶"ÃUqæ°‡åììl…BAKaÝš—Dœäf‘e²ÉJH‰$WIᦫ[f¯#e°LlgsØ-a 6sS¬¤Ü¼uûj¡%^Ä}ß÷rbñeƒ—ç­³_Wlš 6ÝÅòå»3=¦ÎèrC ˆæ)--…°^N]À-4vSÆ&Æ’ŸŸ/‹!³p½“ÉdM‡µ®úÐ:²é0ØU-@Ài4‡Ñh„›:u*[8ôúèÑ£.ÓÌ©T:|øð–¬'Ð!^èµÇk v’AGŽY´hQ›[F˃¸&uÛ\&¥%E•›6ŸklÔMœÝ78ýRaqqí¨1èŠ *““‹&L잣¨ jïÞ”yó‡Èå’†:õö§&NŒv÷pÐku»÷\˜<©÷‘#iŽŽò˜Á¸?1]HÈEo/§Ÿ9%¼Ò×Ì™3Àh4U.0Y|˜OžH?u2gÈî1ƒCþ¼‰ ˆÎÍ¡C‡üüüFŽiéèèØÌšv¥k×®]ºt©¨¨(+++))AÀ`0@¬X¾ÙÅ}š6òļcÍV°9Ø£O{1Зžžž‘‘‘>>>×zq²å¸»»O›6mïÞ½ééé±±±-ü K‡XæN2™ÀÅÅ%<<Ü–çÌ™C=Âm£®Ä™éEO?³nÔ¨P??×§žúuõê™……Õ»÷¤ŒÓ=CZFÙ×_ž0©·@ [÷ÛÙ÷ÞÛÖÓ7vXdCCÍ#Ë×>ùøø7Þœ§Õª>ÿüÐØ1á¿o8»iS™3¯zûø@Š E¨ވYºd8ûà ƒR¶wêñãY#FE „¦ËwDòß;öûïg'MŠ|ñÅ ï½7g@LÇ"ˆ[†™3g6ìÁ|ffæ=÷ÜsS\‚?Þ½{£s°‡†uë­à¥/§¬0ÄÐd2™L*•B;" T*Ý8Ú|ª´é„ BBBZ.hIºVàÉaËõh6ùÄ-Šì‹/ÛóÙç ªÍQQª :n½·š¨IjY+RܨªK8—û SÖ­;;¬7º‚N?|øâСÝÑyâÎÃÃ10Ðmõêmÿúx©TfyD¨ÕéccCîp:·Â:&ƒÉx±IOkpqU¼õÖ¬Ð^ç/$§ˆ ¥C· )LØ #¹ººv•~~~Ö‘&“‰H±¿¼ºb­´ØW–ÙXW»=ƒÆ²ù¼# ¬6#??wwÝuW›[>xð tý˜1c¨’oq,*J›Ÿ_={öË’T&}ÿ=ÅÆßîߟºpÁè=rr*¡™ Ãöï;ëè$_¾|Ô¬™Ÿåå‹„BÄ/^±,¨(¯«(ÏÓé £F†}öÙBܶíÝ›ò믧 ‚6n:Ÿ™YúÆë[ÓÒJwîHœ9«_c£nÂľö_Zýö6™L"q“§TJßxc毊ìÞÝK£ÕºúíYZ­å‘ŸÌ²ö±‰k]Ü>}ذÐȨ¾þÓïì×­«ÇéÓ¹î&£ÉÁÑéÍU3}}]„B·—³“³\ Ð>ôÐè»îê'‹!ÈŽÏž7ïËE‹ÿsïü¯öìJìÖÍãĉœ{牟_}uX £ _~=][§þð£=wÍúìÈ‘Ìÿ-Ù@DçgÓ¦MÇŽ³‰ îì+¹w.„7ý ¾’’’5kÖ¼ôÒKvzúÖ†äåå>}zöìÙmn¹ªªJ"‘¸¸¸P‹¼õ8wî¬Bv0¢·ÓÿÖÁâÖ RÕ746j½}Ü,?›¬’`4™Eb‘ž–Ïo!‰Q,]g‚H2›þ´–7{hù´³@¯7êt— Êdb©T¢×tZ£Y(ŠEr¹Äò-;ËÎ&Þ’L.Cë£{­NqG,LMQ«TÆ1N^V>öLü‰ÌÌL›¥222Š‹‹mÖnà±ßÇžo[è¶µtã°‡å_¥ƒèLXŽÞÑIá謴„MÜ¡øŸLBX,²Z,ÔlykÆ¢„—#!ÈØ¤½+Üì.û E…|aØô§‹5P$‰%ÜëŠúè AÜb\õÃkz½ž} ™h§"ª‚–S[[›ššjË[¶l9räÕðm'³LWF¡ÌV9ì§ÙF“Ù¤¹’Ñ&Íåÿ¯IÌŸŠ0“º"ˆ[;vœ>}Ú&2""bÒ¤IT9í`µ‚ÊÊÊ'NØc­Ñ¨¨(¥RI5|KbY¹Å²:ƒngˆÖéo’¾Äõâçç×tÎIAAAEEEÇÿì/ ¬Û‘îÝ»ÛÉ2Uo§Æ`0Ö׫šI$ÒÚÚFÌXW£7è‚I´‘Hèâ"âÖž%ˆë¡ÿþM#ËË˳²²H`‘Àêˆh4šúúz{¼æºk×.ww÷ÁƒS%wR’“³²»»Él>/ 5Z4ÓÙs*zG´¡PP]mŒêíÖKñ§™ìÑb:äááa³ìxªœÛK`™l.J•¼¼¼}ûö­X±¢Í-ûúúvü—(‰fhllˆ W÷ —˜ ÖŸÍÅb@a6É-sÐEBnÆù•o> åsa6Paâ.¥HÖ\y¶h2šDb‘Ùtù“"‘ÈÌÍR·¬z³Ñ(´Jcƒ%‹‰.Ô‘X˜pN¥j¤µõ‰6¦¢¢¢¾¾ÞNÏaˆÖ ,ôò¸lØu"€D"Ñh]ÝœÕ BËUÀnJË,P(nðë!!!]ºt±‡w4fÛé/ŠAbËEbþM@H+QYI¥L&uóp tšFRÉäˆêÔzœYr¥¥AtƒÑ¬°„Íz­Þ`(-oÚz£NmP:È4Jd4—Z¥‘É$½±®Ncº¢Õ¼}œ5±X$•Km'­ %È¢PˆéyS'B,¾ù èšQ£F5ÌÉÉÉÈÈ Õ!ŽDüžSr‘“ÀΓ-»¸Dî^Ü~ö…¡F¯ëÛeÔè7vÙi±õøøxWW×>}úP‹ìô\^§JTW£zíõÍ5Õj¨§˜˜à§ŸöÙg»CB¼g΄ è/¿Ukô,¤o¾µ¾¬´îÿ>[$Ë÷íKú¿Ï~÷ÝO/÷””Ì_×~ó­™ ~=÷žA „õÕ«7Ý}÷ÀCñiüq!0Ð]¯7::Ê>ýdþ'ŸÆõŽ ˜:} À¬µj²òÔäÜ·ÞÞöùg ]•ô¼©s@J˜¸aΟ?ïââb£¥bbbH•Ó!–J¥T»ºÈ»›ìü!X¡Hh¶g×/ˆÍšÊúÕ ÚIKKÛ½{÷“O>Ií†øË3ëåW7yy:~øÁ=•• Ï<».3=¿¤¤ÖÍÝY PB`U×jjª¬ª²2)±P«3$$äѨÖïÚ•ôÑG»ß^½¸A¥ÍÊ*‡­Âš7Vm12¬[P—¼üªúz â-ºøþ1&ƒÚd2Kdòìì ?_—?]œEÒ“ÇS__¹µ¸¤ŽŽAÜVëõz…kºV«¥e;„À‰Db‰ÿ„ípK%²«mËwþÄ–Ù07ë‚ ìááµ–Ö%:%"qyieFZé[¿<"–J}üÜÿýïû]三8x0ÅÁ-Qt8>}Р @¶}Û…Aƒºtñüí·3FôÆ+F§§—Ä8íåådy¨3FFúûúº¼öÚ¦ïþû8²H$”Ë¥IÉ…G'54h½½œÄ„Êdb±íjì&wwÇ>¼gÕ›Û4Zƒ3‚¸m¸ãŽ;šF&''§§§Ûé*vƒpß–080™,SJÙ_ëÇåÜ Tn]f!›È*°ô§è…Bö=_I[\ëÛC`ñ{$èôë±´Í.È9ìáß… ¯ºö.Ñ Ö×iÐÈ2Ë·kÌg%´º†ššÆ¢¢tµµÜZíºß7œ‹âè :wI¥ªDGáêæôÐÒÑÏÿã·gŸ™ •¢§0k4úåËÇ­\¹ñן*`“›útžX$ÆiD„?ÖU,™Œa½ÕjË /zèD·¹¹¹J¥ÒÇÇÇ:2::Úë8¶ˆ'µZ]VVVQQÑØØ¨×ë¡¥– §F­V‹­&Qu¹W^½ãã-/q@cÉ,wœb&ÂðUáâââëëëì쌋øµLÝE\Ú?..nÙ²emn¹¸¸ØÝÝÖ­‚)(ØS"%œÏ:4R 4¯ùDõP*¤sæ ¾ïþ‰¸éŠÄêFM^nQaQµVgHO/ »v&Éä­FÝ7|ìØ^¯¼º¹ÿ®è p;'“ W­šõøã?ÖÖª| Öh0.Y:áÞ{Ç j‡ŽK`6 ERÜDfÙ`vŒ“žfKÄíÆÙ³g¡'ld‡¦·„œœœýû÷³q ©TªP(X°‘'ašÑU—ÇN®H1³hl0 ¡át:]uuuIIIrrrCCªeÒ¤I7øÆ ¬¶ÇÏÏoܸqö°ú‡þ‚×|¼{öìjµ^ Ð=÷Üd¤‡ð‹E ZFÚ³ÇܹƒZö_©T¬Ñ¶l:®×Z>ó Ñꌛ7Ök4uõšñãÃ#zw˜ ‚ËŸÃ1Ó+iq[1cÆŒ¦Òª+==}þüù7K`ÕÔÔxyy‰D"è6ÂÄõ—&ˆ!ôQlü‰ˆb1,oÓ}±ynÈK+~Aöè1:¸¡R©ÜÜÜH`u,œ9ìa977rÊš*ùÁ¬›9k ¿¿k\\šX"üé§e~¾óæÅ¸{8ZF›Ɖ"Œseµ*"ÜO ¨C†Q#{èµcÝ¢£!°Äéwß>p)µÆž}f¢‹@Ð8oÞ`ggY` ë¢ECJ/+o@F‰D¬Õè|`xüáôòJ•^ohç;ܲ.d”³³‚¾»B· PŽŽŽÖ‘¡¡¡~~~7Ë%¥RìîîÞˆûB­*]•^¯ç¥’õ¨•õƒ?~ÞÕµ–µÌâ7±\ì‰!$CÑÞÞÞ•••í6I‹VëdÐÉ“'ï¹çž6·œàééIëX–Õ?‡ í9dh7;J/0©c‡…[6X–ÌÑ}‚Üj¡–gy&#×ûȦÏdyÞg L:ˆ°Ðž¡=» LšIwô‡bC2¹\4kv,Â^>ƒGZ§ìé6x(‹ZVj0é¹€Y"MœÌe§A,‚¸mعs§¿¿¿ÍjXn7­Sä€Öqqq±~üg=™Ýk©tUƒÖF¬•ƒ ƒÙh/¦çÚmDŸV+ÀÝ@PP=,ßyçT½· •£ç{Ù:l°R²<ÌÓþ9»îB@k•FÃLV–/§¶²/øßœw‹ÔÓÒ¡ ˆÛŠiÓ¦5nuöìÙÌÌL{Œ´Jf]uEqë·ÿŒl~:$4›VÅ’!Ì6ñ‘?Ù»‡, ßôÄÀj^ö°\__¶E_Ë!‚ n‡¦Õüýý EôV$åäääææ ¸eBCCájCCC~~~=’““ýüü\]]¡¥ JƒÁššÊÆ¢ §¢££óòòºwïŽMÈŽô¸Xßt%¢†ØrŠ‹‹÷îÝkË»wï>}ú4Õ0AqãüòË/l*°"##;š«‚R©tëÖ­;wî,((8{öìo¼‘––ÖØØøÝwßƯ¿þúÃ?d‹/üñÇ)))ǎæ§§CK]ºtIÀM³ùꫯ\\\Î;÷ý÷ß#eGØ5ÁjÃz½Þ–§L™ÒqÖF#‚ :5&Lh*2’’’rss§M›ÖÖét3f̘5kôÖóÏ?æÌ™É“'³Ç|nnn‰‰‰;vì˜3g›­¥Ñh¦Nº|ùrµZ V[[;oÞ¼×_‚ Jkþüù^^^Hs› ,©äò7›Lîer‰X"Š®è£ÑÔ¿$ÈaË6ïzAÄuc³ÃÉÉÉN³\Ú@‹H$[·nÍÌÌ„ZR©T±±±\nŠ•T*}衇þøã°µ¾ñwË–-ùùùìË? .Ä5tÅŠ‹-zê©§† #b§Ú¿HÔWQy®N¯5 Ì®Nž®¾:½¦¢¦´Q]oæ¶:9ºº;{vÀ•{ªªªrrrpŒÛÜòºuëp>Œ;–ú‚ âÙ°aƒ¯¯ïðáí#ƒ9ìWhZZZFFFŸ>}üüüZ»¢)®øî»wï†NŠŠŠJNNf› ´BCC'MšôÕW_¹¹¹‰D"£Ñ4xð`,…BÁ»JIIéÚµ+¨¯¯Gš›>ë&,±H\UWþÏïÿÖŧ»T"«¬->â®Ñ‹¿Ø°Z«W;;¸jõšÁ½ÇN2Û`4t´& QŒCh5nܸöYX– ‚¸åéׯŸR©´‰ÌÌÌ,))±Q]mH]]äÑ©S§ °ÂÂÂ"""¼½½[¨´ ‡bbbæÌ™-õÁ@¥ñ8Ù3ÁÙ³g'$$ìÚµ É °zõê…ë¦Z­fë]9sfûöíŸ~úé矾víÚ‡z¨±±ñ¶XP«Ó8*Ÿ·ÒÝÅ;-÷š_^Ù ÔÕÃ3_ î¥Ñ5v@u%à>ölóqò¶­z‚ ¢M i©×ë¡H®•…é~í¨Ö¢P( { ê`'???///>>¾K—.={ö„ºê#˦îÕÖÖöíÛ𫯾Zºt)¿ºlŠÅâ|B ÉärùúõëÓÓÓ â'Mšôûï¿ÏŸ?¿[·n?üð+¯¼}6`Àöñ¶X¨,Q£F•”yÆÙÁ51ýd€W“ÒÙd2NØ™Y˜‚@¿^ÃÜœ<:à4¬†††ÒÒR{|1pÆ ÐX#Gޤ~ ‚¸AöìÙãååÕ¿ëÈpŽf.p{÷î½îBè”””°O ²2PE™™™—.]‚3‘‘‘...WUoH%ñ$“ÉØ×l.\XQQáîîþüóÏ#ò±Çspp¨¯¯÷÷÷ÿú믡®Š­Œ…âÜÜÜž}öYìoMM ®¤«W¯F$´×M? 7A`‰EâúÆÚ“Id2ÅñĽ#úÞ!—9M¦’ªB£Ùh6 z‡ÄpÞ;œÀ***Ú¿¿=NƒŽ¹< AÑé€Ú€ ±‰,..®®®¾ÖJ ÎÎÎS§N½î,·iJJ [ ”- ‘¥u­ñ3&ˆ$~ Rh5h)è'OOOè$a/"ÆÃÃ¥±¾#žMÌBé‘«#¬2zs–Á¨÷q¸úÓî.Þ#ûNúÏ–÷ÕZ•B¦¸{Ü’^A}µzN¯EšØd{rØÃ²ž<A·!6cWŒÒÒÒ¬¬,û-…Å>¨,“É ƒBBB‚ƒƒqiã?à›ÝL^&x½Å>öÌF¡¬¿KÈdzËÅD![ái¬rnÆ[„¨³e!½Aïéê'K+jеz­Zۨѩ!°:l“Õh4uuu-y–ÜZöîÝ ýCýAqƒœ:uÊÕÕÕfD ‡ý uqq5jTß¾}ýüüšN±oáÊb±¸¾¾~Û¶mãÆƒ\v÷íÛ7`À\yµZíÏ?ÿA°¬ÒÔ#¯§›ovQj]CP(ò÷îæãî¯×ëØØ˜=`ÓèڜѣGS@´ìô³œù–Ø‘e?ÌtP ¢¹ë®»šFž:u ÂkéÒ¥Üy¶2Vccã¬Y³Ž? õÀÄÇÇ?þøãýû÷‡xå•WöîÝ;vìØ×^{M$½øâ‹áÓÎm$°D¢úºÚÿ÷Ë+ÐUr©\«ÓÌ·ôXâ¾óéǺE5ªUå5ÅËf¾€ðÚík3N…E¹°Ëåô–'æ­º~êÿÖ½þÁÓ?ckrÖÙøs;z‡Ä\È8ž]”&—*¼ƒ„èâÓ‚)-/ñÿÖ­ í) õÝ„!³kê+¿ØðÖGÏ® ò K¸tìtòÁû¦?óïõoûyJ¥Š‚²ìñ13&ƒÄvª,{XNKKƒå.]ºP¿@4+H„%źċF‘XÜÙww›ŽJmÌ…L!˜èÐD[RZZ*“ÉÜÝÝ­# ÕñÕ< esr–/_þí·ßÖÖÖz{{÷ë×O.—cëôéÓóóó'OžÜ»wo‰DâééyÓmo;%èôZŸÜÿ‘«“ÑdØubý䨻ïÿ0êç½ÿ>—”yJ¥©?q1îG¾ðtõÑèÔo|±|×ÑßNÎŽnëö~ùû?4› 꺉Cfß1|îçëßôtõž7q¹JÝã ™R£mìÐëõ‡ÿm¶T¸Ù`Ô¯Ûó¥£ÂyÝž/þ¶ø}“Ù¤Õk&#î~—Üõ¼{@FÁÅþ÷o=ƒúô„{TVvvö‘#G-ZÔæ–/]º„&B‹øËΧ @Ÿ\ëêf6:õžM"CáÈ^Å2…’F±¢mÙ·o_@@À˜1c¬# ÊMôª%“˜ ƒ‡‡Ç£> ͤÑh‚‚‚Þ~ûm­VË>}c4Õjõøñã‘R¥R=ôÐC´j‚&R·™À²d³,^Uòý¶É$r'×)Ãæ!&1㔋£{M}UAiÖ±÷KÜÛ'l°‡‹wCctUlß Y)áÁýÆžYY]²çøï]ý,ïÍL“ž=6BA9IÄ2±X"•HsKÒ¿Þôt˜D,?d6ÒLн§ $3îôV;&õD"‘Þ WkUÁþ=ƒüCs‹ÓCºDØ©²ÜÜÜúôécËwÞy'õDK‰„N®î.^fcçÞ£I nt iEö`Á‚M#Oœ8›y;½ ÿ—à2IñÄõc"ë—Æl–W`Y2#‡€›•ÅË#~RëȦú‰…ÍVh8ÚMc]÷B£–…V•2n?eJ®ž„åÕ%9ÅéeUÅyP]¨M6íŒe•U‘ØÌMáZ0å±ýüÊ„AwIÅRëV&U\È8µñÀ·}Bwõë!—* ØÌ³X$‘ˆÄœö’οã±ÏsÌÀéñå ïBn}W3¶JdR©Ì~•åÎaËWÎ%ˆ«Ÿ{&4vüíì{!èh‹ÖÄ-C]]D"±™ÓÒ«W¯›øœ$""¢ªªª¨¨âMHÇ•[ÌWELu±°àÊÒíM•¯É¬Åûœÿ²Œ}±‡må³GGGó‹ËwPe0Üœ½îµÈÙÑÍ`ÔCëàï¨þwÌó ôÐêoŸJÌ8Üç÷}ßh´H£ÓkÏ]:=Ñh4è ÚÀÈØ¨ñ¿îù"¬k÷ÙÁ+7µFƒGÀ¤!s|=+kK¼ƒf[z¥-[QJDp¿þ½†¯Ûóe¿žC¹1,¤‰B¦Ì,H.*Ï ò E2;UV^^ÞéÓ§gÏžÝæ–8àãã3nÜ8ê‚ ˆdÛ¶m6¯O¹q43Âd0p=µßÅôéÓQDmm-[UËaà€Â_¨"0]ÁZBñ¦øÑ/^Y–2à„@@*•²0Ø#¥Réèèèââ‚¿íy®ÿS9F“Q­k”Jå4b…ŎΠƒxBÀϳKvá¥e³^8r~Ϫÿ<Ý#&«0ÕIé:~ð][ý 0 4ºÆ;†ÍÝwrcU]¹Ð"’Xå™&ƒ‡‹·_ß@™Dv").1ãÔ?ÿûjP«×Œ0M.SÔzN=}Ä‚½'6Ô6T¡NëU5_o|×ÉÁ5¯4slÌ>Ýí4 Èår6¼ÙæÌ›7z‚ ¢M˜1c†¸É«0 ÙÙÙ³fͺj¦Qì®9¸9éàª[­Ç¢øŸü&ë”Ö(äac`ç(\ÀÂλ»x-Ÿý²Ræh2YŽBôÜ5æ~¹DÆÄÍÄ¡w7jtzÝŠ»_=Ÿv<¿4klÌ]ýzÆ¢Îb£'ŒµF%‰^ZòÿT•Žûøà´‘ $" ›ƒ¥Ñªu:mH`Äs‹ÞUkQ_^¾Ý{AæÂ²T"{}Ùçs<³àj¨4‘hÊð{½ƒõz;¾JàËaËóhÙvzE‘ ‚¸­`‹sÚDúøøH¥ÒfrÝtuÂë¤[ã(\À2 ÌP6Áþ=õ•YþÜâUFîÍ&/W¡›ŸÞ  ŃzÜ{Œ€{ñPϽ{ˆ#e2½Üü}D"¦Éü<»LfÕ£ ³”r‡¾aC/Wº@¨7ê¡kQõ,¯g48г[kF“Ñ€4öœ3[\\œ””4qâÄ6·¼mÛ6oooöfAAÜ[¶lñóó>|¸udUN‡X6Éßð§'q7Va¦“„–Åtjkqjüß»åBK–+oB z›"¸/ꨯ%s W»ÒêÛoy1ƒÁÐØØhË3f̸e4;Aqs‰U(6‘—.]*,,¤É¾]`Ýžtå°‡eö1KªaÂê&‚V0 â:¹êH›ýM•ÓnÐE½TVVž9sÆ–·nÝzäȪaÂJ` "î ÖçS:x¹ŽîTéh‰‘Hf³e«ÂÁƒ¿Ü'9w—‹MR9ú_Kz wÛ…x$S²~Y “[ÂNÜ?gKb©LÀfÄÊ•\Ž‘Øb?aø “Ó$ˆ›À¶mÛNžõ52…ƒo@— 'd$ŸîÝwȸªòÒêÊ’êò¢ªŠB™ÜQ£®ëçàäâäâáíçsúÐþÌ”“n^ÃÆßåèâšp,Þ %w¯*¯©(É ëC‡” Ú™îÝ»;99ÙDæåå•——ÛãF\½/§*hU“]¸p¡=,ûûû_ëµUâÖAز–YŒæÃGUßÿPõÕ*öî­+.ÔY¦5ZF¥þbD Š*7#é×îN8±ËÁI•–òó¿_õôë õÃ'ÿ¨­®ûí?«³. ‰xáä¾ß¾~·¡®jËï›Íf¹\¿óÇṳ̈cÖ§%?wtï‘=¿víupûOÚž—•·í;…£KmUÙ¿|$‰åJǽ›¿ÊËLÜ¿õçƒ;¾ïÞk@UYÁ×ï? ?7}ÿÞ¿W/‡3eEÙ{6})àÕ‚hO"##»uëfY[[[TTD•ÓnÐV+hhh€ü‡ÌjsËÛ·o÷ðð:t(Uò-ŒÙ$PkþzJ"j4f…Bd6 õùúÃG‚ƒd½zÊ££©á.œÜ=ïá7SΞ8söá]?õ:ñŽ»ïÖ¨é‰#rÒ.æ¤þíÒÞýcÿßkKŠóÒJGË“Hü'BiI¥ ©T^]UÚP_Ý-¤÷¢Çÿi6™r3.(”N±c‡ûø——äLû T&:¸]¢il8uhËO¿Û-4hØ„I¼ðÐùãûC{ÎM?á#“+è¸Dû‡kŠÍ·Ý¢9¨rH`uDJJJ:d›´Ö-ŽHx0®¾ºÊ(—ÿÅxŽH$P«M, ±ÏL RS5ÉÉÿŸ½ëŒ¢Jÿ3³;Û7›M6½÷IHB ô^"UŠ`¨ 6<õô¼¿žwžÞ©×ôîTTî<±¢Þ JGz„Bzï}“lŸ™ÿ73!†$@Ù4æg\fßμyïÍ›÷ýÞ÷¾÷}¦'Ûœœq‘[Ïð˜inÔf¥žžûà—’v—UQ$áàäiÔ#$Žºtæ¸Zã*ã"WÊ•*{`QB¡˜ ¦€aøC˜˜_ÆÙKÖ 4½ã×I²âÑßqžPÌfÄlb¼¡˜ “ÃPÌ oÅq‘ÚM×Êl)Tª¶–«•Z´æÅ¤C_ „b\Ä,<"‘¨»={}}}KKK`` ß><Árð÷÷ï®tí„……ñÍ;â¡×S³ç(•Ê;úJF›šˆ´t#° VA …ˆ“îí%©«§ ´=ï/‹‘s*öf£ÞÁÙ3=ù¸“›OÖ•ÓÓÌÓ6Y¾ý×ßÃÆLn¨©hѶŠÅ²Ó‡Ñæ“’´ÇbnVÚ«Û´ *gš¶b–ôã÷!‘«Ÿ\»÷«=?îü nê’‹“4k°´R©Œ†¶ÂìËgO¬­Ò—dÏX°¹ û²ƒÆezÂ:àgÁ‘ùõA<'NìžXRR’ŸŸÏ¬¡B°0ÆjV0Ü+ Uè—ZPe2™laž””dooÅ÷È †¶óúý•¶ÒàUÄ^%ø‹D2ó¶š®èæžHŠHVjÒ¢µÏÇLŒ ‹Úõéß6>ÿ/·þzë^2êÚœÜ}ÇL˜R^˜µí­§ÔŽn'ö}:cñ£^~>>Ÿýó7©|ƒÂSNïÅ0¡L¡Úñá[©ç¦ÔÕ”Œ™0;•ëQ!K%¾°oÇ߯]>YWU7e¡hر½¤Éh;uâ‰Áµå†X­üÃçÁc@qéÒ%•JÜ91Žß8C‚`Y­V¹UD7Òþ@‡'Pk37Ë©{Jý?yòäã?Þï%ìQËãþ}-hÌé¨p©¯H.pá:+Ír¯ž/ah›Õºêñ?(ìÔ-Mˆ›÷¨õϽ­R;núÕ{Y—0ù‡Ž!ÌHª'â§6ÕWÌ[¾¥¡®BßfY²îùÂìt³Ùœ ò™¿üi!ŽËR'†š²ØÉ ݼüLFc`ØX“qv÷[ÿìßP ³˜e#Id ‰ÆÕ»¼èzÜ´}ƒÂ ²rÓïÅR¹®Ùüõ:ŠâŸ'ÆÆÆîqoZ[[F£¾ñ¸;‚åêêê7¶Cô6º7còÁ„¾¡À¡¢’Äü‚îuuÏÛÛ{ùòå¶(Þ„ ø¾ÈãÆÌ†V©+rø™:õN¼ÇÞÁÑje×ðPÄÁÉ™"™B=qüJŒ& ¥¿pÿÐpxé<|ý¹ !1p>œ _•*;¸œ ï€`ŸÀ`àsð‚ŠÄR‰T B¡P¥v`^Y±SÙ3+˜ÄÕÃÛÍËR øTÚÛÃUðÐ/±XÂ,<óçÏ——·nÝ:¾}Ÿ`¹¸ÙîÞ-­Z³Éìì(·È-ÞUwí¹ïwÊ¡Kn@³€Æ¥š÷­««;räÈòåËU*ÕýB°˜r…ÐÕÕÕvvvCóeT³°EÎ555"‘ÈÁÁ´òèwh4šî‰vvvƒkßÌ­Â'Gz€-Q, ‘#I€~Y;î䆦ªƒra7TŒÓQ$í`fZ1îÖìor¨,x ÎÎÎ'Nœ DRWW———7yòä~ÏùÇ„1nêÔ©ü¸Àã¶s@:0Pìåi iݨ€Ùž-`b,ò¬eµêtº°°0¾)FvíÚ\ª‹´òa1ŠÇ)Ÿ¸cŽq’½ËzßÏ3Ë_;sæ ?(ðàÁc Q]]=”7nóè3öíÛ—œœÜ%1$$dª¯8˜Íææææ†††¶¶6μh–ÑhDØnK„pgÏ'7±€øªÓé¸sàZnóàPØ·1Ì–¥|||¸åÂAYX…gáÂ…ÐÐÐ~Ï9&&F,óƒ< ̺ h¥¥¥ Ø|}}û Ÿ¸+n£8€A­€öÃ†ÎæÕÃ~~~J¥²KbYYY}}}ll¬nÊÅ¥¹[;ihU¸d×®]©©©@÷¡OBÉŸxâ àIß|ó lÛ¶ :äêÕ«Z}ÿý÷ÁÁÁ­­­p>œ L@*•nܸñàÁƒžžžK—.­¬¬Ü¾}{bb¢L&\¬áG°Öì}ìØ±ƒÒ×X؈8òc=<˜]Á(Ú%ükqqñ‘#G¼¼¼"""`\¡Õ›À;0‹ÄˆAo†C™\d1#B!Ãj¬Væ€$˜P 1›(‰L@‘ÌWÈÕÊŠ?ÚÊúv $ɘÂ1E !Ì̯¸˜½aò‡lAbâ¬mHGÎÈN‚Ë!‘9fyüÁÉ&£UˆCþaé{[ååå]½z¨ ´I߬S ‚¼½¾Plø U€?h ÆþC:4 IÜëÃ…Ç×=Q«Õÿ°ÁºvíZRRRTT´’‡‡GïµÐ¡`Ó¦MKHH°X,o¾ùæÑ£G§OŸ^^^t¿®®îäÉ“ ÷ÃÃ몪\]]kkkáëÚµkM&ÂzØš2eÊ;ï¼3jÔ( ^îîîП ú+6, «{¤Vð0;zƒg ÄÙõ8::N˜0¡Ç™ã(˜N„¸ÇG…5ÃnôcD5Ædìæ L(ÄîjÚ©ÓéäryºÀ-ÍÔÔÔ€l“J¥ Ìüýý¹0˜€ÍŸî]Áß¾¯·åe^€+0|Ü¢Ägïú$=å¨\a/·S¯xôw“áð®m µeJ•ãòG~››qîØ¾O*GH?íAG¯>ÿ³Úɦ¨qÓ–Ú©rÒÏ,Y÷<¦Ý_¼<*^íäúÅ{ÿ÷Øÿ}äâ¡ÙÿÍ2RŽ)ìÔR™rù£¯^=ÿ£½fì”YÀ«Ê s¾ù×ïäJ{Âbö ŠJXù̱=;ò³’Q ›öÀºÑ±“úL\@ê'''_¿~Ú3vrr꽿JM­ZmuyžÙltи{úÕV–ÛÙ;‰$ÊJÕ—W¶jë ‹I$–™ mήž·Wõ1â¶úôéÓPÎΉ‘,l×9AZUTTûj¥Ñh€å@[Óâti·ïœ ¾f rú!çõ ²âµ}ûö·Þz r欵¸Mý ”!%88¨ÕªU«žþù©S§®Y³†Ó¥ñ«ÃAff¦¯¯o`` í4[¥¥¥@«ñ‹_ô{ÎPrézü‰‰0}1—Ø ºß#’$Õ $aîŒ;r,˜'UUUŽH×…´Õ*“ɽ}|0 Cxðp@¿K½ª/)5wÀðªQLô õõûp\Øó^èÀ--- Ÿ@ªu¬¤€`«®®‰Å¹ÙVʤ5ˆIµ½…x1£›§{b r|ß ³/?ùÊà­ÿø¯Ož<øMSCÕÌEN˜5ïï¯lÊN;[Y’ Ó³—ÞÞþÃçe]l¨-;ãÕϘ F©LzäûÃÆLÚðܯ³Ó >þëS<ÿ^vÚ¹ÙKqíò©é 6\8þ}EIvFÊ‘E‰kj+‹¦Ì[;íEï¿öô•³šªIÒÂ)„šê«TöNOýn›AdE’›~þòÙ}¿}wonÆ¥´‹?…FNêqÃÇŽ#È[Nb% Ô †hh4hŸªªªsçÎÁ  ¦7³_‘¹p|çÅ“ßGŒUQœ?sÐ>/ÿ°„•‰×._ßõ雑ãç”d\K=9füüˆ±3ݼèÛ­n¡ŒÕQ›N Ä{|Ö8ŽÃ“5f³¹ƒj@áad6 îîîÝÝAA9K¦>lÐJp;¸5@©@(C[]ºtÉÞÞÞÍÍ-((¨ÃLê>PX õж[¶l™9s&È>î'ÈvÙ²e{÷îýïÿ ™#¬¡Uvv6Ì à'à‘@°àŽ>>>ÀíÔj5œÓÖÖÆ¬~t—††h\x¨QQQ6 ·]&s¶È¹Ë<£3ÚÚZ"‰[4mLJŽ¢e1jëÏ’„åŽ+ëzÎåÜ…Ú¶RȈ ,7ç¯vÒÈJ^ØóXÌ´Ngí6Ò„…ñ) zI°êëë[[[;'Z,–.>‡¸]]@ÂÌ&-éA}EP¨é VÛ©ÅðÆÏ\´1ùÔ^…CÊ齕%9µ…ž¾Á2…rÿ7ï~ö7B£&EO˜yè»ç¤Å0!Œ'ñ3—I¥Êë©§NOŒô£âü qq9ÇžpS`B®®®Ü^¿ÛLà—.]ºhÑ¢o¿ýöêÕ«pÐq2×ý6oÞüÚk¯ÁˆKàU .|ì±Ç :Pè´Àÿõ¯½üòËGŽâ;~üxÎ@ž'Xý äsæÌIKK+))Q#<<(m¿ëà1ô…§S˜ ÍïQy ³+Çp1BSƒéóš]ÑB¼7¯¼¼Jçµ›ïˆãW0 PæòVëH«a4™Dâãc¢]TÚ qþ¼bܸU2Y¯ñA,ýôÓO³gÏî²ÎuæÌ™pAE …££c0 cëj«+c̆º½ðFèuF⪱®F-øsó ˆˆ›I’–ô”ÓÖn|þEÙ—îù¸±®R(;8{øEf“La޲R$A´4Õ7B1$*~~FòO©±éWï‹Ä¢î ‚îu›æºvíZ^^žD"á<Ëår` \Ë 4U“\Ê< ô6#Mrúð÷Ueå-M5³oösh§®¬ ª¬0kÙÆß´i“¡(Âd ï8ÄBàî ó§ÜŠ`€ÿÁãóööîòз’ŒðÜçÏŸ/r355H'ä@·JítÇÍÍ zTrròmKÛ—/_ž’’²}ûöx€#‚ÀnQyzzÂO¿ùÍoV­Z4îÒ¥KJ¥$2ÜDçŽ;BCC~øaµZýÑGÁ9JǬþ<ËéÓ§çææBÇ‚ÇTz̘1ÐÖýx‹ÂÂÂcÇŽ=ýôÓý^xεÿ-'?4tÐzÐH/ ÁêáÅ9mEF˜¡4¶Ç ¾…†Òz“VŒ‰MÉÆvìí0#$Ð…îÃgÌêïï¹ÿüE1ùß¼)„B$bìÌ3?}Ê©ý³|ìzj’›W”oPDê¹Cº–ÆÝ_üÅÓ?|ÎÒ‡ôm-5Nîj{@è8“±M,–™ŒúЈ± -=vÂû¯=ÖP]9þÇÿ½g2è–?ò›OÞ~vîƒOFŽ›CXÌç}Åpñð÷ ŠÊºzº¡¶\®°oª¯®«j¦­Œ¹ªT¦ gÔ·ˆ%òÔó‡rÒÏ>öÒßíÕ._ô³É –ôÑ„D5àUÐ&~~~À89.ÒÜÔЛ‘¶ZÃÆL™·ü)™Lÿ Eˆh̾¯ÿn áÀéßÕlŸ{·Byy9ÈÄ.‹SÅÙÎí"§j²··ç¨§¯¯og}Ä­:'¤“$9uêT(0§)|æ™g€«E[°`p)ø¶ÔÚÚ:yòäW_}ÕËËËÅÅ¥¹¹¹¢¢®…>ÜØØ9@âĉu: –Cò‘I°8å¨Q£ YÓÓÓ+++ëëëãââàMè¯ü!«ÄÄD[”¼Góvøà¥R dÒŸ}öY’$ÿö·¿DDDüðÃ/¼ðPÉ­[·^¼x1!!a(lüY„ÝWÃJiiizz:çûµ€gl£U¼²²²ÚÚÚ>1}$åô‘ÿúìÖ×KNú(Åž/·¶4Õ„ùëßøèÍ[ÿðdQN&¼¼[_:7ó²R…\»rîü±})ÒÒÜøþkOWçÊäÈÅ“/Ÿ9,‘¡‡u1èõ»>ýû¶·žØþ÷—¡´Åy×~ܹ]a‡\¿zqëÿð›ÿ÷ñÛpfvzÊû¯3;„"¦úM µ2rbÿ×;>xƒágfóž/?hÕ6öÉp‚ˆššš~T_ñ‚hmm5 ]ÃÂÂæÎ;ÄKŽãxQQQ}}}bb¢ƒƒ”yÅŠ§NBXw¯^QQ!—Ë5H$‚IÂÉ“'!å‰'ž7n\Ÿ…;O°ú•••W®\9qâôŸ}÷Ýw¶(”*//ïn¯‘¦††ƒÿ}où#¿]¶ñ•+gêum×S, ¥xKžþýg“ç%žþq‡Éh(Ⱦ´kûV i‚þYš-‘!Y©IY©§Ò.ü$–"U¥¹Õeù‚¡¤Ð‰‘¤C_jkñÚÇ.W/Ö·i«Êrë«[÷íøÇü•O?õÛOLF]æå“FCKÒ;.Û)•#Åyi„ÙDX+ç~¼zñpmE†a¹Y,fÊ{åÁƒLçøÏ#û÷ïOIIé’hgg×»ŸZcz½(”P($8“£££ÙlFQúíîÝ»øá‡ææfàaJ¥òå—_¦(êã?~ã7z¿3ƒ'Xý˜˜˜Ñ£GkµÚ¤¤$è|w«KäöèÚ¢`K–,™Okܸqîîîð`€GFFöž3iXô{©êêꀳ+Š»ÝÚÊøAAчŸ|³8÷jÖ•SNìzäùw1Ù«¢o¥iZ¯o­*ÏK¿øÓâ5/B§[øô÷Ÿ½­vtS98W••_OMRÚ9å\.ÉË…4måbŠÝ­Ì`&Ñïo$çøÌßrÒÎúnkIA†o`kèJ£‚B6ÕWe]9™“~. |œ‹‡DÜìƒÿ}Z WÏ*+ÌRk\ë«K§Î_ÇÕ«oµãÁc„f˜0Ñïã™Çƒ@ èN5|}}û×7¤-@’¤‡‡Hj M .ljj:|øðc=ÆE}>tèÔ+999::Z.—©‚D ^@¶üýý¹ÀC§.÷ã´ÞÓÓøï¨Q£t:Ý™3g.^¼h±ôjÿnuuõÑ£Gû½<}ÄʦM›"""£¢¢ÒÒÒ222&Ož¼xñb—_|ä2°.n_!I’Cª.Âû³ó‰ÅâØØXww÷ôôô¢¢"WWW˜Òqƒ<à¶¶6xT\ð)8Ž·¶¶êõú;÷›CßÊÓÒÒ’””dooïããëÍü’$ßàÑÞ½ù„\a7u±_hŒ§_˜X"]ýøkß}òæû¯m–)US篵³×øDP”5<:~ÞŠ'q\l¢u³–lrñp±S=zä‡á„Œ”Ÿ>þË©|éú—4.î·ØëÚsíjjjjkkªBùÌJ q¹Çgd1!3nÜóå_Þy%E$’,^û"IZ4.^Þžó–?õͶW ¨jGxôT¥Ê‘¢(ðü•[Zµõ µe‘ãgFO˜ b⬇Z›]¼ö|ùWxP¡Q“>üd?nÕáÁcØ¡±±ñ^,ÜMðHiŠv­62g] ݽ]»v­´´tÁ‚ƒÅœ(Š©Ê)™n£jâDê¬Y³æÎ "æí:N£Ñ<÷ÜsZ. ÿ^xËÊh4ÞFCÁIg(\;`ˈÂûy qssR\PP““ƒÎœ9s8ÃϦ¦¦cÇŽq!#8ÊÅ1-@<ÔÎkyð•Óqî};.óá´ÈÈÈÎ'C?(,,¢'wä _á€ëvPŒúúz™Lœ˜ëì½u/d¼Ëcзm …b™0#+}‘° ˜yâ7ïtf™\„ {¡£‚ñq°öéß“ëT†`¢_)íW?ñè–SXÆ©®€·õÈ®7%”ÊÌýÞaè¯pw8€ò744ÔÕÖ@Qâcïñé@\Ü=ù}}›Qi'§ÙíÖa‘ú6&fêØÉ@õe Nãܶµ ®ž¾/þå3`fál»fjÂJÚ ­ñ×\pæ½²+ÁPæ¿.ÉÌó`ŒJ»Õ¨qc‘’AŒo¡¡¡}T-„ÅB¡ô‰Å ã.£t'ˆ{]W‚ŒÈÀèQcèëôG©Tº¸¸ Vk•””TVVÚÙÙXäDFºw¶×£œ<nÔ%”!ç’”#L=>Á­Z¯×kµZ???hž` ¡:Ÿ——ìØLGà©T _ ö­ã"Pr ª–– Gqqq3Ÿà±q1½¹39ò½A,w&Xgff&ô’Æq”ޝбòóóá^@³€»`‚ž§›¸ˆqeeœ?Ià“"çOðÞA"p)øU&Ãè‘Ìb"¤ˆ$íò>óÏ90Ñ͈vßQ»9‘!"¦î/6ÕÌÈȉ¥½J ‰—è^›vwÚÅFŠQ÷¢˜L.ïpÂj½áf0“3“ñ¦k¡Œd;9ãRÚ=öŸÚ˜ÙábÐ_¼pQ*Wv°LàVeeÅR‰±¦šºÕ J(DKKÍþ"e°„7ã1X0 Ðoû&`¤r…RØBUŸÄFÐ<&I%&ÄïɄԨÓZjŠØÝ5 7àßíªp9£¡U(0Ý~˜Ý½{7p©‰'vNôa1XM­Ñh–.]zíÚµªªªúúzNÔŠY€˜ã´ ]‚zC|;·C‡æ>A’¯âbEƒ V«ÕÓ¦Mȸ °œ´´4 XðŒÇØÁd2Y|||ÇÓâàMöššÚÅ.œØó €SÁãŽÞ{×d---ÕÕÕ}3_¸Ýt„]ZvvvŽ…ÏÞÌ¥`¦TY’m6§&¬?·UÛttÏ‚FǯÙòÈ÷ï?Wßÿ™ÂN-€ª±®¸ú©ÆÕsõ“ÏÑVäý×KJòÒ³R“=üìøéñ5K¯]¾`2è}£¯ù¥Éh°]¶— Y³gÏ:ØyѾm´R!ŽÔUU}ÿÙŸ€Ù¸xø}û¯ßeûÎͼЦm|äù–fþ÷߯nùí§™—Ž禆Eïon¬./Ì",f;•ãÒ /_JÚûù»/üâ÷Ÿe¤üä½týËGwÿÛ kY´æE“±-=å§ðèißl{uÞò-A£Çüæ;?}+|Ì”Ÿ~ø—³‡ÿƒ6ådœspö(É»:~úƒ¾ÁѳÑÑÙ3ãÓ7§Ì_5éÇï¶þðÅŸŸþý”ñvý§û;Ð »²Þ¢Õ0Æ`ŽÁ…N§»— Å<ú§OŸþàƒW®|hÊ”)ýžùÑ£G5MtttçÄPC“¤Ú³aø~Ü© „¨Ìüùó###ïÊñ+Lþ.\¸ÐïåbÌ™3gâĉ½ÔTdÆ¢õ¡±ï¾ºæ›½ |¨±¶Â78ÌlDôzÆ?§A§¥˜]íõÅP ‰k*Š·¾þŸŨy‚#âÍÆ6à-MˆT®š0k>œP”seûß_øôÏ;ú?¼×!Aýýýïʤª˜›qÞÝ'hÌ„xGg—Çþo«›wH^慥랷SÛÅM™›–üS@xœW@Ä‘ï?aV$Qæ/ö7w/§ù+7“„¹$?C"SŠ%Ro£³‡ÚÑÕ7ÐY"•ËêkWNzúO˜1Ke¯x`Õ“õÕ%Ú¦Ú9>‘}õtIn¹L¡p ”]ÏϼX]šËZBàMuåÕeyFC›»OÍ3!#F]4è< û÷ï‡yÙ®]»l‘9°+;;».‰ÕÕÕׯ_ç[ž×`ÙÝ{^oÀ¢ß Ó‡˜(†¤]86~ÆÜµ¿xæÀ·»öîø›“«o^Æ•És˜8S™)ǽ4®ÞÚ† ¹±˜šqÆ•9ªqñJ|òM’$>ÿçó5åùÀ»ªÊò‚#uÒh0xù…›Œzn-’Y¯»±Á o 5®àzjUi•X‚\JúÑÁÉÝÎ^ÓÖ¢7}®X"9|'k?)œ8gyÂCë§Ì_!–ˆ€Ì%¬Ü´î™g—?òÒõÔÓü¸ÀcD†/>áÁ¡C‡€îÀAIIÉÎ;û=ÿäääÜÜÜ.‰cÆŒY¶lßø†>•±Z­yyyîîî}ö×III›7oî÷rj4š»Š\AXIs–;ºxÖTÅN^#– 6¿ø~æåÓ6sÑ#*Æl_³î¹¿äf¦ÌXôhxôDÒB&>õg‚`øÍÌ%›‹¸z¸‹Å¯å¦Â×°1ñf£eã/ÿiÐká'™\…õÚën…÷ žµdÓçÿ|^ˆ‹}ƒ¢Â¢Çi\}v~ò‡·_Úœiñš½ü]<‹9"n|ÜÔ%2¥ÊÞÑíð®Þû}‰H$Y¾ñ±Täæ„‹¤@º€?Ḅ¸ÈÙÍ/ dÌ¢Ä_~þÞ¯¤R…D¦LÜòÇ’¼kÎV+’°òÉê²|±D®Pª¿ÝöºLao6 7/ÿQ(*Ó·!N®þJ•”ªÃcä¡¡¡!22’o‡¡€´´´   •J¥Õj‹ŠŠú=½^ß=öZKK‹Á``Ý+ò ­À=ý®¸ºzõjii)ô³ØØXÿ{V½f³Ù;>nƒŒŒô”BÚstà `fR@›¬ë›g–É€Bq;©qüg¯k]Þ~ l×$ábÆ^rfÜb¡Œ£,\ }óí, ]wzY‰ô-pîüÅœ&µ«ßm|5ˆÄˆ®ÍH¤J­„òcf °¹¡I®´“ÈpÆáÎxmà΄|¬Ìò“ÂX©q"æŠ uDX¿©(Ö~üdЛŒ£ÚQ͘¤[™Ÿ8p9dÐD}IŠ9 Zþn㘆¤(KUÒ²¹1 »›ì1SR.8¨/)ncäÞÔ@]IÕÏ™kXy#/·†ff`dŽŒ’wíNš“mÔë©Ø±7÷4 1‰3ç&¬–Ë{véc×É“'§N*“Éø6tp’·°°&ÿðD¸Íq¶¾éÅ‹óòòÖ¯_ßã¯xàøJ¼ëÎ()))çˆØU¿D¸äüÂÙ¢´)))œ§ƒ»y?orJιÙì⡈K‡‹NNutƒ)ÞHéìÖœ†1zà^,–"„‹É–U98v8['‰ŸÏì\ÍŸ ÏU½á¶ å,ºÚ/Áq‰È^Ò‘ Âz{¢f¦nʼ£¡Úϲòä‡ÇÈDss3Žã<»*º ÖëÍ™3gfÏž ¥ßÙUvv¶B¡ðòòêœ?~üx¾ñn®4òªd2™€¯œ;w¢¢¢f̘Ñ_ñË‹‹¿þúk[”Ù`0t pßÌá.j¹~$7\`ï‹g.Â%û’þ7j¶“ÚÝz, (šÊ.\Ü nä?RIa!† ø±ƒÇ0BSS“««+ßC f³Ùj›Í8ܦÑ.ƒ=<<øfç ÖQ\\œžžK*•úøø ÀKJJ.^¼¸zõê~ÏùÂ… À®z4uW©T÷®6ÛwYïèè5p>…Bÿvñà1@Q”Ñht`œóB iúÔ©SóçÏ·…oÅcÇŽ¥îFZÅâV—pŽAžòæ¾&X&“ ¨U~~¾P(òÑÅÕ‡í “Él´¥¶Gun?ôF~w.÷# ƒÅbá—‡0 {üñÇm”yBBBwk›ÅÅÅ=n0dgÅB±XÌ?—ûš`UWW§¦¦666j4š˜˜˜Ô{;³°EÎÍÍÍй•J¥J.Š ¦V¾»óàqFË»ŠÄÅc``µZ¿úê«Y³fÙbÞT©»=»““ê{@9ô0*+I’W¯^MJJjii ƒ~9ÀVUUU?ýô“-r>~ü8°FÛ•ÇÅz¯ÁâÁã~DMM o€54‘——§×ëm‘óþýû“““»$º»»5ŠoöÃp"³999iiiÑÑуâ2Цi‚ l‘sBB‚‚ðpˆdm-ßÝyð¸ÑÜÜ·ÃŽã6ò›0~üøî^9@†VTTÌž=›oyž`u…³³sdddpp°í–ÒnÃë5ã “([tM|wçÁã~ƒN§ƒÉÛ‡¨çÑ`¶eË–ÛXߣ´êAÞ++Š¢L&“Åb!IÒjµÂWÆÓ›ÆD§H$‚J Í¥ÏaF°ldÕK466–””ØÂÖÁƒ5M—ýK°ê›+ùÇŠŒˆ(÷ä™®—hnnñBˆï5CîñÓtyy¹˜E¿g¾ÿ~—]B;²¸ áãVk€êa2 ÀŸZ[[kkká)højeepAØOš×tÜÇ´` =œs£ Ÿ‰D­V»ººÊd2H—J¥ƒå^•·w» ´µµåççÛ‚`ÅÇÇÛtTÛ9gä_àŸàˆà(‚ZGŠW&8À]WEÌ&º¦ÆHçhÞ Ôb{µÐÖO¦…6òÞÇãÞ 777[(±ºïl())©««7nÜ­Ê£T*m­ 2Pk`rõõõz½ø§…VLˆSGu°% Oœ¾ªƒfqåì8pš-Ž“Ìf3Ü¢¸¸îBüýßÁÁÚÙ×××F~ó‡Á&›––MÌæÆIw_¶ÈÙ±¨:Ã]ã«Õ5PVJÀ{ÈÞ„­®´ddQ˜`ØO€É%æqqb‘»;EŠ–”ž÷”Ø{"45ë‚è7:gÍŸ/@hÛέ›ššx»æ!ú6cØŠ+l$àÂÃÃ{ÔÔÖÖކ𻲲G«Õ&''744…R«Õ>>>À¨:V÷èèB¡zz}ÐÎŒ[ïX@äl¦K ¸ueeå¥K—BBBÆŒs_¬ªª*ÎÃPó9 tH·-8ÖÁƒbO˜0ÁF%·WjÌf½Î U)ùqmXOz+«ˆÜÚ‰*×`z˜Çy¤¬Q||txµH"½K-M’´X¤öޤ‡§ Å¡¶•" ‚ˆ l§Ä"I¤K!"x 9†õóÏ?Ÿ;w®-öl=zT£ÑDGGwNŒ`1(•5›Í{÷îuss‹‹‹JÄ1'nð·ŽÝ†Ó’Éd@¼à€c [ׯ_‡7bâĉ÷#Á‚††úgggS<**j訯ÖשS§6oÞÜï9ûûûÛ4ÚL¢@1A‹®‘'XÃÖ‹ÊUöJGûá©»éL°£^ÖǵN”FáBzØ®”ÒаU°1`BÒe€—Exô“'O¶EÎJ¥²»Oöšššæææ°°°¯ikk«^¯çôI\ŸìÐ3!·ÐTÝë4¦¸5D¸µ™Å€Õz¬ÆÆÆÔÔTèöööÀ»mä3ýibòغÇË$J±HÚÔZçíÌjô•¦­mɨʣ3jkkù9C*•ÊF6OñññÝ«ªª …`ËÉNDzz:T*®P(¤,Äb1·¾3Ùê>8t¤t_Äì²hŸV«•³Çâ(]+ às¨Ñhî;‚•_íNo/`WvJÕ 6\Ë ‰C\H/[ì°8~ü¸Z­Ž‰‰±]áÝ5¾E•×ÇOFxðàq@«ÕÞf×ÁÈû'Ÿ|ÒFNö“““ÐtñÃbp&T4 õubbT¯×WTT âxüÄí¦±! $L À'§ílçÞ™P&I’ba¹ UœšŠ;ò‘Édîîî@æ€bZpsŒ iµ˜ŒPQæ?³j ô‰ Hø³Éxµ hšbæâÐ4Úz¨6n•é¨ 'S™vÇØýRʰŸ˜Å„˜@€ „\À<!ŽÃ#‘HDð¿D"–Je¸À†{ñŠŠŠŽ;öôÓO÷{ÎðŽuw ׿ðt (®Ìâ5<îp†A8d!77744ÔÛ±,€âTƒ‚àvrŸYå{%Xf‹É`ÐŒƒQoÐõmfC«É¨7›šB0Ð8Já|ÒB þø”0ÚAŒ‰1)aØ“JLyBImäšÛN`½ÁTá€fœY) ãrŒVF…C-ª§1‚j!i *@€oÉì$r;±ÜN*WÈeR™þ‘ʱ{Þ@çïï¿víZ[<†.ÞJl/çÀ+×Oòƒ„%R„³;‚±ÃbA„8û•f¿š™¯ðÉ3ˆH‚à8{Œ""2—›˜Q‘ʘO’drãd)ÖîYÒA™k c®—pƒ6s9ŽX)&ÎÁEL>ƒ± Qx£C™`•––z{{Û‚`Íš5«{b~~~AAÁÃ?<觨vRŽq^Šº¸cèp|Õ}ѰãÌ«Žœ‘n~€±u¾jè, €&‹±IÛÜPÓØXפ×)3Fp«YDJ‚ËEG©@¦HEB ÎÒg¦J(Ò¥Ù:²kÿ—³Wˆo?lrK…(wMûÿí ÊÑEXÌFsA_ih"õ&¢’˜ŒÂ¤„H*pШÝ4£ øz×|Ëvñ˜“““íììlº4îçÎ`}³RÎÏhyŒXH[këÎOßo®¯‚¡C…“æ¬Ê¿ž\[^3\‰T1}áÆ¢ì˱“Êíì’ôãÎÌ”ã"±”°˜f,ÜX[UB¦9K6ÀtìÐÎí"±, 4nߎ¿‰%r˜lû‡ÄÀHS”s™lPttì ˜¦%‘HåR™Ýì¥g]9é6&¶ª´òâ‰æ.{RˆãƒeiVWWÇ«¯†20 [µj•2ÏÍÍnÝÅ”9&&&**jÍ.·`hgÚ„ ÃÀˆ³·«¦®ª´¤¬±ºµ­žÀH±\è Gý\p;‘P,”㸠Ç0”¦‘ŸNì'rc—tÚïs›6¹csÝê´w‰0\,+{F1ÆþB¸HY3aÔé´5M•éåfúºÂIèè®ôõõqsuï½W^^ž–õz½­çº:zãBAaŵ1!Sø¡ÇH…ÕŠˆ%²i ëÓ.ÎL9š¸å¯R¹rß×ï,]ÿ’Jí c´_9wpôØ™J•¼úùYÉþa±ÑÌF½ƒ³ÇÉC_椙¹hI!Çvœ à‹ÖüÊb6ˆÄŒ"\ãê½÷«¿¬~â-/ÿQ;>ø¿ˆ‰qÓ–žþñ«ï?}câìU¾}?l̇¾ûÀÁÉS*Ç-æAkŠÚÚZ???¾K á¾jݺuëâÅ‹mñ˜@Z9;;w!X$I1LÝúÇ=1w&XÅ%Ei)Y¤V¬¤ÝÕR_o¥HÓ9Øe;N EÑ$546Ó¬ö‘)^Ç.vR…8üÉ$ âŽ!a%uz­6£î\Æu¡:-&~´·W¯öz{{?øàƒ¶(öÌ™3 qÜ|‹ª®ókx)ÞÚ¶`@ …^þÞ 5!Õe¹þ¡þF=“KUinKS­B©ö ‹¥ŒQ'« ŵep’Zãî qwv÷/ÎK£­”‹G€Båˆãb½®¹¬ðšÙ¨óõ ôhG'O¿QjG¹P(2ê[›ë+ ‹Iíä?kzNƹ÷_ÛW=ðÐÓ„e0Û¦müÂ!Žºº:‹Å&½dÑ¢EÝ322òóómTìììÌÌ̘˜77·{_›æÖþ:Û]uIìν:/‚•’’\Ü š R;b¦èV„"ibXõáööf‰Ãá¨dör e k54žÛwÙ0Ëzçå9nO©-Š˜›› 9ÛÂÝ\gŒ ™z!ãð²OðãÚÐï²ð¦a«á8d0Kú(r·ûl¸á®‹I³s7ÆJ³ýËÝ]K‘g& 0Ã?mÚz’´´Ûvr– ì¤ji®ƒ/pÜ)4jRÖ•3©Ü?4Úb6Á©fƒ®µ¹ÎdÒ™M+³)‡q”AL+An…9—IЏ”´wÆ¢2wùã|zîÓ¯~*– ¦ VSS“H$²©w=÷¥Ri#_µµµÐº¬‡……ÙT© œþâÅ‹@ã4¯¯o```‡‹ÇŽˆ7·gT0;"I²#¨3·Áaw "ì¢*Nèº8pÑu¸h†Ã€`UUU:znªÏjg¥ÆLZÉaî9º³–‹²ES*t¶Ó‰à²Ò¢Þ¬¢¢¢³gÏ®_¿¾ß‹TPPsM[¬`ï¨ïOl3šuR±á1d¡ÚFr×Í!Á_‘«»Hˆ£?w޻ʉ݊+ÄKm†±±#9.Ó¯€îX$BÂj4˜•*)I0ç[)æ–8Μ `]Ž3×bŒA7—3¤ã"„dŒ)™B7²RýÐ¥æÃ?µFŒ’úøˆ\\ñv¦…ô–iAÙ˜M1$ÁͤD¦œ»ìQµ“”­¡¶™°ÙMKˆÀÊä?}Qü¬9f#Ô1êÛ‚âÆ¦œÚk2êç¯Øréô^‹Ù¿(q½ÅÌØË³Œ& 3W+m±pݤ9³CF;±ÿ +µI"Qø…D+Tä Ž—@°@°ñ.F‡ô‹ŽaÏ=÷œìΜ9ãêêÚÅ‹©‚…MkÄ9Y€îWWWwõêU¸Pºààà;V®ºtéRVVÖ† €'egg—””̘1ãÃ?ŒŽŽž9s&0'HÙ½{wbbâåË—!s±X ‰ööö<òîÙ³ç±Çƒ›RCcMív«¾¾AfÕ\«>«5;+|¸ aýwÑ4»¹o.`ܰ¶Ç8²:KsQSqQóÕ„Ó{s9p 9Y°`ÁTßÛ5ØÓ) ¬¦ Äg ?º Jÿëzpë9@I‰¥¨È"“¡NNB?_qhˆØÅ—Èhï$&0 9¾ï«ô‹GômZ©B9ÑNítþØN;{Æ›ü̱“fµúüÝß9¹z/Xý8Ìú®^8qòà—@Lœ\}W<ú»“>=všopØ×þ18b‚Åd¦RVa1›·¼\SQæðŽÅkžÏ¼töø¾ípO'·%ëþO¡TÝ… í¹A(+’—g†P*1hqHØÉgö¢¡R¹ÆÕh%Ž q‘hÛ[[p±ÇÅóV<-•)¿Úú"œ;i¡³›Ïþo¶&þŸÉ ›µh“›g «W°w@„ÉØêèâiïè¦Ö¸úîý¿þº Ì~Á1nx²sõ€1è4.V ˆÆÕO"UèÛ( j\|üŽ$ó(QôưtóÓÃXgõŒ•~·‹0fëu÷ŸP Å0´3ÁrtäÃ6 í©>M ö`‹XF‹-êN¯—Àd~õêÕ=^ÒÖÖ¶oß¾>;>µµµœ11ç:ØBCCƒV«…ôÛk°à¾UUUÿùÏüýýjjj®_¿>uêÔÓ§OWTTL›6c`PÂÅ‹_¹r%((hܸqœgJÈ>áÌ”””¨¨¨yóæ ‚@!tPÒNåµe9r‰Ò^ææ(u“‹T "Bx¥­¬ÑkÕ>KsJI.7ãÿš„™¼•Л›› ÕÍÆZƒ± !@hÉ{¹7О…- ¾­ &`vqôL¾v„'XƒÒ­m0X ³Õl¶Þv A z>ax$I¤¢‚(/'Ξ×9i„>Þ¸• ~gó$Æ¿LœõPì¤ÿúÓcmú½‡oÈ®Ïþ4vÊ‚Åk6^9“ü¿í¯Ž©mªÉÏJ®.ÏŸ·âñúêÊß¾÷Èóïºxøýïã?d^:ÑP[¡okÚùÉÛIŒ›:gçö¿«œÛZ›Îüøuìä{¸°ª¬àÐw[W=þ‡€ÐÐï?{73åøÔ„efS¯˜LÖô:Z,¶RÔMµ‰P£ÑŠ‹P±5›éÒR ÐͤÓm@1ÝÝñÈÑŠDn¿ÚuÇÙ·<÷‡Ï ¢}ç OývIXÙ€0.£s|ÜÊÎYx˜C" VoòÁ]­y¶×?<G[!g•Úií/Þ„G¼êÁ / f#âèì±ù×ÿd´V˜ qËk3ÖÜaljn¦r²ÌHÇvf´ý±Â£¯¬dtoR©‘›§q!ZUE˜LÖ’"e¥¹ó¹µN‹…‚q­¬¬T&ƒ`«®®îâd’Ç„íœ^r§º$úúúÞFÊ€œ?~Ÿµžp!𞜜n>A\†²¦uôèÑÛçWÍš5kÏž=‘‘‘œ/¨)„]>òòò6jÔ( O@§ÜÜܼ½½9‚€_\\üÌ3Ï?~|æÌ™CÄë\ÕJSBLì,$­f“¡­ÆPVAç  È–Ld'ÅRÜN*TJ…r\(í6C9× 7üŽÉy§ú¤‚BnrØ€¶§£]…ÜÂBL¤Þ@¶ ‘h3šÛtæVšBDˆTŒ*H¬E ­½c‡À£SSS>÷ûc8þ¼F£¶nëç=nÔÜo¼Çkƒ4˜‚DDo½Ó8…ŒVnld×òPà °ëëI‰U*„h¯]…ˆ%b\$âb¹Ò^*Éç_K9¹_S«Pa'œ±pMyQNÁõË- >A>~&#’øÔk Ú³ÓÏ~µõ‘HüÚGûq†1q€¬æ.{âèîO¯ù¥ÜNý’§ohШЫÎ;8{8¹ù½3ÑdÖÍtÊ%½LNv‘2ªÕ’BÁM-@H] |HoèÕlòä²…’CcЍ•„|˜…Nö‘"VŠ!L±KpÌQ·v/ÇxûÊ)ä Ä1V0—0:$dÈjÚX%·8ðÜ´7-ùCa€*Íë2D„tÈ­µÕJ‘ÖÎÛ¯Ú¦£ ÝIŽ•rW1 ¾¥×uuµb1‚ÊÏÏO¥Rñ/Ýžr¡è´iÓl´D4ÅÝÝòaq{’t/ËÊ ðÍf3t<`rÀ„€uX-÷†îÔJ(þç?ÿ™2e G’ …««kVVôj8†JÁ‚B~ýõ×'Ož4™LQQQ>úèåË—¡%ÃÃÿýöÛëׯC"ü4Ô rc_† × ˆ#ŒC$m¶­ú¶FºžF)F]Œ1ÄÅR‰H¬K$0~°!ŠÃtF3æ“=c†Œq¾z“>»g¶…ve{ŒÅƒ•õþŸÜ±ÕJ2{im,e¶F3i2:¡‡¯LÎV ®@iE¥"\ƒj„¸¨Ý¡«Õ¢™¨«½ÐdY ,k‰0߃©¥°"3À3‚à–^ÑÎ.øâ¥ê^¬­£MMDZš‘õrIëâä$ •Œ “xxáii¦Ë%½°Æòn{YBÀ¸N&kËíÝ\=Xãê]SQ W¨ýÃÆê[›X~ƒ4ÔÖ˜Lz³Q5Y¯Óž<ðÝ’µëÚA³9*~f^fòO»·‹%2xwÚZÆ®œ,+¼–vñ§Ð¨ÿ°Ößw&@R6s–Reß=ä3ZRbNK7²¼‰P77<!ŠeZ¬-® 1†¥ƒ‰®JŠŠ0ŽÕáNõÅVÙÙ·Æra1¼Å]U"iDà„SWöðkÀõ¾;cva±P(°ˆIx¨4 @,–rü›¾[r¹á ™ñ³/$r’A×:qÖC™—Ž:ôEä¸9uUÅ2¹jãó£z÷6ÓÖ[T누ÝSË0š¹n?1—À,ÓŠð᳇jjj¸¨yýŽ­Y4M½™°¸9‹Å²˜;w.$¶¶¶ïÚµ«°°011àh´ââbggg X‰D«Õ»zë­·äryIIÉk¯½VVVæêê:è–X}1g£oÞ8Î8 €ÊàŒ#vÖq;Ò¾!³]Û„P,#bíµXªÄ}R@tÚ'ÖTûƒ¶Ï´#ÏvÕ7LBÙõ?géKÈP–Šqº|fÙc ­7ôôvxŠ·ö˰SWW———×e_F¿`ÿþýÐW¦OŸ>|bdÂÇ?¼FY)&ม ±} Ánô(©½ZÀ¬WÑÖö.|÷ZNx;€úˆÄRj|GË•ê¶VD,q ×Ú\75a­_°Ÿ•ò+Ê™+bmþýá]Â=-*~z}M©Häàâá´8ñ…ì«§¦àb‰\¡²S9IdØÊÍ¿»vå´‡¯ÿÒu¿>ø¿÷q\äæCõÇî9¥R°ìAUÄh©ÂNØÎ«:^â»E::{%>õг»fÛŸ^=òý‡J•fÒìU¬zÄldvP~¹õÐȉ‰[¶h,§ï¾vå\Nú…çþ¸]ã,ËÉ\øÕû¿ñò¥qõÞðÜë©äÃ7^<±o»P$žž°nþʵ"W E¹©Sç¯N|걂ìÊ÷_{ʨ7Š%Rš':û¬Åb …111ð9cÆŒ––…B¡R©"##SSÿŸ½ó€ªXÿþöšM6ɦ÷ÞC%@Bo‚ôª‚ (VìíÚËß×v½ ¢W±"¢Ò”* %„ !Hï½·íõ}vÖÜ‘Àîf³y¾Ÿe9;9ç™9Ï™3ó;3sf²ArØrttôóó›6Åþêây·ÑºIÆq/\ù”BNϘÉs D.¥ðììÜÿéÈwëŸTæ.X©Ð¿xóF­e±iJ9eêü{ÕjJw'%yÒ,rcë Ò(Z5EÒM‰51iìD™”7j\ÌðT¸ÿX*<6™`îr­ÎÅ…éâʺêÛ+Z­F*ÑAª"ãÆ^É9igït|ÿ¦Š¢‹ ½¦Î_#wÄßÝ¡_–pæÒ%þ¶ËÅ݇ÇçuvPD®¾l.OßJ¡JÅ:¸A£“Æ_:ëézè·¥ùÙ ¹lþ}/â<¸ã‹Æºª‚‹§#R\…31òÏÐh´5kÖ˜i Vjj*‡ÃéXPPPSSZÄ ½ÚˆŒB†zV_j-\HFtÝÿý2™lêÔ©Úkùòå ¼üýý—.]j\0‡ŒÊ"Ý…*• !«GøIY R×Q®?êdð=âù0‡e /6.aÞŸg·¡À²n™e²2Ý¥áE³«z™%3>ýµVI~ÒˆD RI ¢oØÁšòên¤Å¤›éŠ ©æ-¥Ñè<>•Ã¥4ÕW‹Üàþ¥Nœ}ßÌ¥÷‚d²(iûhÕ¥WÆLIél×üöÃçÚÊBð½ÀžRZPÛÝÑ*pÁ¹ñí¨,¥µ±ÆÅÃO©O_øàŒÅwKÅú¡sΈ1yÖÒ§B"ÒŽجVaÞEn2ëŽ=š””äêêjrã^^^שï¯-«l…@B&µ'… ¨%N6HG*ü‰ü¼nÓ”±÷ÓxìPX¶Cgggmmmdd¤É-oݺÕÅÅe„ –9‘”ø™»Žo,¯ÍðŠÀËŠô6;Ê¥6ÖÜPy`û&&›S”{zå3Ÿœ<ôóåŒã: E&í Š>yî›?{óo¬-•Ë¥w?ún^æáï×½;&+}ÏØ©Ëœ\<jË÷üü­V­.+Ê G÷|{)ëˆJ©‘Iº¢'ªÕ*ÏÎÙM?zZÚ?¶·6 \´ZÌJÈ?rÇL¯7‘a'#GŽìlÝŽËinn>sæŒ9Ö˜1cÌÔ]윇GMúýøÆ§îú/+b«€Êáñí®|µ¥¡ŠÅáÝûäήNI)³…Nn Šxt!ȯÀðлý¹gÿt÷ ž:“ɤ¬XûÁÙ´]µeãfÞ3lDª\¦Yòà›- •ž eÆ]B'ûä DZ­–'ê´ê‘ãæj5j¹”B§³æ-Édãø+ä¦Ô?• %¿™š”‚‚‚úNÚ^YY µXRR:–Õa>ùÝæ\³2gܪ>]X×Rá)òÇ+‹Ø$†Õ éñÉ)tšþUd•BßêîíãèC¹:wE&¡„„E„S }ða²Ù“f/&]” ¹ÞBÂèT:]?Èþ !nÞÞ¾AK ãÛôý¤úÁŸÔ«s_EÄ'^ A~Ð~üñÇK–,1Gµr݆€îîîÆÆÆ:_2RŠrssb™:nXŠÆr±› q²Ç\ ´ž¯€w4L4LëH1L,þ?I¡Ñè4:­çž×Âfy`\×H¯í¿7ü2­³¤RiMM9.ÃÞ½{322,™ÕÜœ|ÃÇí<ú_,æ›YzQ%‘è…”Z}u*v©Dÿ‘ˆÉè1½H’Kõ­Æ°Ðµ¾÷PÔÕ±êÄ‚XoAsÍü$TJ½Yã¸+8ÕÒ¯:ÅLoº?~ñÔdz.•ž‰åÝ ,¼Iä'A½MXÚ dz +8÷k‡S{RñÖT€غukjjª§§§Éçææ ‚^‹ð$$$ÄÇÇø‰ mCr¹¾e2lH À6™È ÂA<‘Ž/£Æº¶j;4Œ,c³Ù Þx@QÁ7Ûl“Ö¬Â‚Î–Ãæ x:ŠNÀ*T Õõ¥jµê¾™O€`JI˜èQÛ\ çÚ«¡¥º¨*/*0Ãâʃ¶å”T_©l(IKó‹­Æd°XLöÉ ‡FDŽ‹ Mî·¥&Lò޳ð§Ù©wƒÆŠ Îfrdt ƒÎ(¬ÌåqìNZ•‘{$1b íjékÊ2äÿÑ£G׬Yciß·9×] š;þo÷¼óï'wcù‡Îìì·‘•sL‹ŸŸßâÅ‹ÍqzÍVbIæŒ[uìüÎÝÇ¿… ,ò¬¿Lv°§s•Úº¼Á^•ê4!·•͹•wÔ_›¥­/²˜ .<|àptt¤Ÿ¿™Û=w*•.W:ú))T¥ŸƒâAK•”²Å~¯—¡Ôj5æÊbá‹áƒI`šI`M›6íºÍZEEE+V¬@ç¥R«bCF,¿ãq*…úÝžÿœÏ?œ”W’ÉesÓ²ök4šÌ+é‰cÿ8½­¹½~DÔ8¡Ç¶#ßÂ_½Â@B––eœºkú# Ì *ó¾ÜñntðpØÙ$à;T5”N>+%~Z\èÈu?¿Ö%í0Lùª˜?ñ¾÷¿¶º¡XkgSQå%‘Ð]*ëV¨äWÊrtÍ`ÁðЯQ›b4&“)Ìq ßóùüÛY&óvxdá»ï~÷àÈè)îξxKX5Z]p0Û×G®ÓÉlàlèt:“Eï÷J¡Z¯/{‰<›5[,©4õJVMêpç#xr¹i&kg²Ø”þ¿r¨Ój‡'$ŒP÷™3Ô“‰kðÜÍZíW_}µhÑ"sLÓPYYÉår{ÍŸ`ù((°nïiL§e3ÙNö. È£ƒ‹ª.½”Æ`0^^ù&“uêâá}'~™0üN(ºÄíž"_•FURuixTª€/”+¤úeœ™¬Ó¹‡k›Ê§^$–vrX<>ÇN¦È•²qñ3þóó+¾îAžá`¶®¹ŠAg*UrPQBÓ̱K_ùâA?às—{¸ø<»ü=ƒµó؇Ïþ>zØ”†ÖêŒÜ# ÿìùÂ`ŸÐ[·9FYYYzzúý÷ßoòËÐØØ8€Í¶¡¾Ã& _ôãþž[þ ÞÖþÔK£°y,Û9Ÿ[Z‡Ýà w©Síøö\ Íá›hþ—[ZfQ§ïUa²Ùtøàí0ØéììT«Õæ°|îÜ9ww÷^‹ G·[îò7Þ¸A­__ÜÁ¥;Ü žJ¡ ð¼\ü5ý•B­•æ7ÌÃÅW©TÎâö¯0Ç.À3,Ô?† ‹<ÜÍɃ̰À 3Âý‡],>—‘w´³»íÎÔe>îr…ÄÛ- Ô/ÚYèv"ç@^I¦»³OrìD‘h,0²ÉÕÙÌú¸BAïâèŠÍÉ^$…c]ý[:ë[ªjš*Ôu·^`]çDt½#$Ö׎ÿÏMSL&S$999™ü2™cœãÍ8ü·£_*ÕÊ0¿8¼+nÚÚ.·ÆÉ™e‰>+ }tqq>n®ö4šÖìçN¥65êËR7÷>Ù‰JmiQ*U~[\ &غšššððpÓéQQ~~~½322>œpÝCŠŠŠBBBÌ4+Õ}¾A£ÎÅ‹Ïï«pbùê(šd“ ¢X¡”5†þýJ™€J©’“‰*¸l¾L!Ýô+5*¤TŠ>DR-7¬¦ÓL:S¡RpXß\6O­V©Ô*6‹CÚÉè4†Nß#©d2˜Ps†îE.‡¯1tÿAJ”*…aJ :<àÁ6—̹;È•×_‡V§¥t2+î¸{Œ›«Ç^†ÊÊJ‡ãææ6€i(­¹ôö׫^[ým wÞý^Ìpr<bwkM2ˆÕ—”Ô£Gó#"<<<(æYO£æåJ¡ìŠÆïhÔ‚|±Dš’˜ˆ«ØjµšLC`rË­­­,«×˜‰D"—˯{ÈÞ½{ï¸ãlâ2å­|ÛÅŽ~(ºB)¿6w¨Z®‚Ð bB*Ã7ì#WȈ¢½¥R+z¾¶fÐ@ ·àOR½r¢PagµazR0!zËJÈ8Po`J­Q]]s[.!ѽE1Œ¸#°ƒXÚ%‘uKd]§®úKEEÅ/¿übŽËpþüùÂÂÂÍ AÞÑK§®ýàÇGÅÒN¼1¤*¥F‡ê1dš†úúzs?pà@VVV¯@>Ÿÿwê 13"’ÉÐ/!NÏô³„i5L:C¥V1èL•FilTc1ô^dœ‚„XgÙÙÙõzëÕTÌŸ?ßrÃôÑwTf¿÷ÃÃï<¼ï ù nüøPƒ®ûALÔn}—d6 K–,éÛ0’«¸¸xÙ²eè|ÛX†ù)gòŽVåÑitFíí:êJyN|Øè“%„æsZC‡à‘ÌÝU¥ :˜ÈÁmbÒ,&[;pk}‰ ˜Ãr[[›ù^Qì-~ÿÅO|¾ýåGþÞrõ«''OŽˆˆô¦èÔèÄ$ËÓÓÓL³@©T*2 zÏ@sŒ!Fþ¶Ø°xžÒ/üœv~¿J¥ôv tsöåÔÒјž}@®<³C"뾺h4•râÂAŠŽâ)òswòqvp3¶f æ[‹ðÀgÏžµ ÅMg¼¼òëìü´íG>ÇÛAŒ47w&hÀ!ÀˆiÐjµŸ}öYEE…9ŒïÞ½»o"‰jœ¡ÉtR +1›:*f¢B!ÓR´‹Î’Å›Yúi«þšŸÉ`M~gT`¼Z­ViT2…D§HE¤4‡åÅ‹[Ï»Žö.o¬ÙôüúyBhòˆÅx“ àâ"àp˜8U:bBÈ:0æ°"C§µá¡5©ú!ÀØ‚‹˜ª¢RGŽi¦¸§NrttŒŒüŸR:Þ€ÜLºÖÖÖÊÊJ±X ª££ƒŒ aš‰|“y‹`›lP¯ÑSl©T*Ðaíííú7à4µZ ßZpè-{{{‹åêêêãã’ËòCøo$°üýüGNoË9‘¯ëâ ˜Îl:ŸJ»æòL7Èõê,¦:ýëu»DÛÊóÔNœ2šÏ½©™HjjjÒÒÒxà“§M$™i6“s÷ô§ý=#ÞßôèÜq«§¾KIdˆT†;wf'%úù¸R´øb5sæL3½?®T*Aô lkkMcŽ—oRWÕÖÖæçç744€lÅ#ÈúÓ ƒ˜L¦QWQ®u‘÷Jdô[O¿‰´"J Î< •JA½ÕÕÕeeeA¡¡¡–¬jÿáÒ&&&—^©nkWR¤ššËaò˜46“ÎÉ¢ï^Ó+-Îêô–aµkºJ«Ó(5 ¥Z®ÐJ)\9•§tñ&EEùûrØ7Û—ÇÃÃÃi‹‹Då˜ØA^ÑÿÞ¼ö|AÚà ßq²wò±ut¾>N|>»Sj`óæÍS¦Lññ1ýk¡×U±¸¸¸¨¨hùòyüرc•••ÞÞÞ±±± rHsT/-¥1p;š$h)²Â#H7’««««¾¾¾´´tÔ¨QæpøõÓsÓC)uím5UµMÍ-ÝmÒŽ‰¬KÅ ²:MËfPØ *ÓÐûI§QIÿ¨~:<â7Ã?c,ºÿÝ|QE¥üµµ‡„¢ôXZG?™–^Áêôý¸­J­Sh¨J M©ÒÉhL½ˆãàÊú騽Ü9,^E¤±9ÖæÌÈȰ···¶®ñ£R+7íûàÄ…=+f>?1iÁ/+ÏËpr<b§ïKGl‘¶6 ,6‡I1÷ðs%/Wª£LŠA·Û²f×骪ª\]]¹\®Éçåå ÿ›?dïÞ½wÜq‡™Þ'kmm59|øp///Š~¶5qe?fAtà؆ӴÌ%¾ùÆIª£ƒ³cŒ^ju uut¶µv´·tuwv(•*µŠª’éà£QR´**BcЙt^úwá¢äÒË/•N…ŸúîF*ig¢’f¦Þ¹Ò£mL%´A<鿵úaZCˆF­Qi(j*]GgQ “O£3)t&ÕžÇ: EB'>ÏápÙ·74Ä/hð5kÖ˜ü2(Š¾Í¹V“ÁZ5ç•QÑS?Ûúâ©‹û^ðŽHè…&b›Ð¨ß|{R?MCŒ¦i@† r¹üvln@ee%H·^K"‘@]ãää4 jR(ÖÖÖBìíííììHk…QfõÝ ÜðuÚ^cªŒ?{nÀá VÄbqggg{{{KKËèÑ£-vÖŒ[*jè|ž|DŽ.ùA¡Tè…—\&—+”JýG¥T)d*…\¥ß”+UJ5|ÔJÃ`4µ^¾æÅºÚ’eYÔk5‡€(é4:Ã0­;‹Îd3Xl&“Ídsx, ¶ÙlSÿÞ‹Ëãr9Ž0¹³|||fÏžmŽË0~üøAZ@DXÿì_ïzû©gΟøðœÔUÖ0¡‚˜œînx ÂÑWˆ)5Ç?ü°bÅ sÌM5kÖ¬¾—.]¨.B8Y¨¡ÝÝÝAë455ÕÕÕ‘¶%êl=Pm3™LÒÔDÚœH’Õs¬UÏ.E2îJGVz¹†R©å*»ü ã ìÈÀy«X§&Ù,|„ŽÿàgC'Ê5Yjôq‘–8¼‰y­ª&ž¥\më2ŽU·8$˜Ãr^^ŸÏ7Óæ†Åd?²ðIIó¿ØñÚ‘s[×Ì+&8KOĶ*CJ` H À1XÈà ¢¢´‹««kÏÀøøøè蛽–TúB¡(!…®®®––Ò‡C&_ ¯ §c¸ª0z´W›µˆt0 ,òö$£æAÒÙÙÙÁmÞÑÑaÉæ,¿TÕ0?Âÿh$½B¥‚,[\\|ìØ±|Ðä–«ªª@\REóOX÷ôÞ½'¿ÿàÇÇcƒF­˜õ¢›“7sˆÍ´6,¿g”~-Bœ¦1Y]HMNNvtt4‡ñœœ77·^‹´ ìYçýE&¯2ª(¢ˆö2Ê&²ÏV«ž­Y=ÛºHsyѸ¿°iùÞæò›ò«™úòfΜieVÊ}© ³7í}ÿ™u³Sãï\2õ ¾æÄ*Ã;Îàè†Ó4 ¦XPò›ir¦¹sçö ¼páBqqñ²eˬæ±E׫=‰è$&“itÑÍé%àÌ4w+ ,óboÀ–+++Iÿ´-x‰ïôØ’÷ç6>ðãþÖ~8mæ˜{çMxÉ`Ù~qI3t^ã4%<ÜÝAhxõ˜fö! ×^ÁFlÐëׯ%`rã SzÍùl¦™†L(¹nðsЫTTTœ9sféÒ¥&·œ-‰lC`¼Ý‚_ºÿ«‚ŠóÛ|ñÁL¹$)b<ƒÎ´Õ¼¡Ñh:ÛåÝtµ+Æ¿…F¥qØv2E÷`,7…BJ©ëh“š;ñ ¥«SÁ³Ób†±ñÛF»ï¾ûÌ4ïåáÇ¡BIIIùß<,4ÓÄñ„–––îînŸïˆD5ø€;ÁLäæÍ›g›ýþ‰¯¬ú:¯ôÌþS?îIÿv|âÜÔ„9l[\ÇÐÍͳ¨0¤«›Ž Ælí®ÛŸ¹aþè'yl{­n0u´Q©Ôo¿û5eìˆÈÈ ¥RiîèJ  æÛ”ziiiHHHßU™oŸéÓ§÷U9.\(//7_uÆ·oßg oˆ¿TŽ«ˆ ˜Ãr{{;Ü À&ý4 >E•9»Ó¿;xæ—Q“&&-°±I³@y¢ººáó:¥¸êÒ‡¿?þÞ¨)ÎBW­v%þè±ìĤñ qH9õÚ”5ˆm ¬ßÿ}ùòåæX\.·ï&WWWã𦾨շû‘tåN:åééýjéÔjµ$²¢3<Õ”“Çòž ü|;Xí,’(°úA}}}^^ÞÔ©SMnùرc ÝRSSmØ{¡~ñÏ.¯¨/8˜±åÿ¾}ÀÏ#|ú¨eaþ T[©I°Rüçâ†Nò :‘,ƒ,‡†…öƒ1åˆÕB$‚9,ÿöÛo}»= üÝ!>>>iiigÏžåpn¥“JrP?Faò¨¢¢¢¤¤¬AJBBBn¾5 ÄÓÉ“'¡NŒˆˆH$p.III………`yÚ´ià4ˆ´i||<¨®ÊÊÊ1cƘi¾VX}à0Óë i†HSª¿GøšùouIÚŽfîØøû›6o̰™cãfÙó1ƒÙþD¡À§ReV¿çž{ð "&}$£NŸ>ÝÅÅ,}ÁcÇŽí»ªÛ•+Wªªª Òë’˜˜åóùdnÏþZ§¬¬ìüù󤩉´‡ //¯èèh×ÜÜ|óëøñãqqq °Ö­[íÎ;ï\¿~}SSSrr2¯¼¼¼O>ùäÍ7ß„=A¦¦¦¢ÀôÜXþßK†T_µ=ßiîøîL]™uåè‘Ìí{N|ê;lBâüØdŽ9ÍV¡Q©Lk6ó}÷Ýw)))ÁÁÁxS ,Ð4fš¼úºo ‚äºñ@_·)ˆª“'Oêt:ÐX!!! ˆ‚liiéW[$4¨(GGLJ~X«Õ:88À÷åË—'MšTPPDêMˆËj_šAÕÚÚÚ***LnyÏž=6ßEØ:>2z |šÛkgïÞ´ÿ­V“>.5þN_÷PTZ6(°h :¡œCÕàöì5m#‚Ü ¶lÙ2cÆŒÛÑ4ÇÎ;ÝÝÝ{­»dÀŒE:îéé7KÏQö}§¼º±ôÀ9J¥òÙgŸåp8]]] ¤† –——ß±±±ð×[ëÍDeÀ5.**2‡ÀJNN1>dëâèµpÒà &=t©ôì‰ìÝïÿð¨Ï!>>>L&3>>¾  À××jL{{{‡†††>úH¥RÁŸ/^ܯ¾HXVD]]™{Žˆˆ€Ì„î…€'LŽ™¹R–Wrúì¥Ãë·jµª¢>?#ïà‘Ìm¿üù‰³½{|xJd@R¨_›ÉEGY9  .“T.Œ‰Ÿ5kÖ­½¾Ž ×…,öl¦7'zµ]šššÊËË­_`QzÌz š‰L.JfÕ Ö)ªP`Ý"p™%‰9šs:f‡ŽNþ§šì Ønn¯Ë/ÏÊÌ?rêâ~Vãâä=,d̰Ð1"›\Ç`1Ù\6¿SÜ6¿yóæ±cÇâ4 ˆ Vll¬™Þƒ;sæŒP( ïg=Ë)++;xðàO|¸«« nØóÒ¥Kt:*Exâ‚¿B9iÒ¤œœ@àíí}äȹ\eÅ„ NŸ>íááÛ~° )9yòd`` ›ÍNOOW«Õ¾¾¾iZZZTT<åŸ8q¾A B{ìØ±¤¤¤ÎÎÎsçÎÁéDDD„……Aš“““³²²à|!m~~~pœWii)¤ÌÛ‘ÂQxùòeðFƒ£x<^vv6¤Ž-//‡@HX&.ÊÈÈ .‚”wwwé©©]ss3ÂQikk+$ ` \»?Àb±§N ‘2Œ8qMœ8\ô÷÷‡ò¼áìì à"///xp( p\—S§NÁn|>®x¼ ‰‡HcbbT*¤.kPPœ;ø €@ð\”ÈÈHˆDv]]Ý… àì`7ØaôèÑpAsssáÄ!Ánnnp-à‚æååS ‚Ÿp8d!ð'œ8ýä“OÞ¾)©Tº}ûöùóçãðƒ~¡Õj7mÚ4iÒ$ŸÁ{EEE®®®½œš™Ún__ßÚÚÚªªªŽŽŽÆÆF¨ø 1 ƒi6ôsÓhÔÿ…r½¾E£ 3B¦Å‚T -Ê"È,öfZ˜– €ûmΜ9æ°ÿüs°0a„¹sçÏbß¾}PSÂÎÑÑÑIII›7o^µjT~û÷ïÿã? akÖ¬ÊïâÅ‹ðW°³xñâ#F|ûí·`Á‚£Gîììüî»ïJKK¡>~衇ìííAÀ"‘ÈÕÕ4hHHÈÀ¦‡‡Ç<á$æ?ÿü“´‘@ÊãââÔjõ–-[Ο?Õ-˜ƒgΜùõ×_¡&¾ë®»bbbàO°ø~ÂþÎÎÎàÌ'NÔ××çææ‚Mp/D .úúë¯á(°fÍï}ù³X¬^ï¼Ã§YÅ/Æ3@–‚îÙÆ¦4@¢HŸ¦±uŠh,8–|Œk€„b°®{,Ôn(§~üñGsX.))©««C Þ õ6!iÞê9¯½ºú›÷ß¾v釩ñsx\Á…ⓟoû×kÿ]þÜúùlztóÎÜV\uQ®”¢ßnO—¹RŠ]ÑC Hyä¨ï›››¡vz=<<ÄÖúõë¡úÿå—_@ZÁž6lýêä‹/¾7nÜ©S§>ûì3mµT¢Ï<ó ($(²@rXù׿þEÞ|íµ×œœœ Z½z5TZ “^ýu° ^~ùe`öùçŸS=öX˜7oD ñÖÖÖnÛ¶bǺäËo¼ÑÕÕ5þ|HyWŽðßÿþwãÆãÇÿè£  œàÀ£G¦§§¿÷Þ{`Nä‰'ž€êó©§ž‚³™B 4úûûÃéÀI)Šwß}"eÇ~òÉ'°?lC} êçÁljjJKKû¿ÿû?Ðvl6Ž5¾¢óþûï‡X ðsÓ¦M ì ¼ €ÄƒŠMMMåž„¨Ÿ|òÉøøx8}ø µ;œ³H?”Ïo¾ù&X&ãC‚‚‚ž~úihÖœ—À9 ¤{òù|¸úÖœlȽ _ALC:ÝÜÜ@‹ƒÖ÷óó  $Ý| d.hkȤ¥Ê ×óÅ'ò~—nBsX†bÝkEwéë òS­QvŠÛZ:êJªóªŠO×\Þ/Þ¤R)8l¾£½«aW¨«£·«“·ƒÎôýˆÜ(:­XÚ!z 7zõú±cÇ ÖÏÉÉ!-.  vÙ³gÏâÅ‹_}õU)))‡†:¦µµuöìÙ {~øa(=@Žìß¿ÿĉðˆº¬MŸ>Œ¸ºº‚N‚ªhß¾} @£Œ;ÄVFF†L&› Bòóó!.ˆhÆŒ –¼½½A«ªªµUèˆTi9  „mHÆŽ;BCC_yåØ6žÈHÛ¬Y³à¯P‚ÍìììÜÜÜÊÊJ¡P z®¡¡"Ý»wï’%K@ôÙ\¶l$š ” hDˆD8ÇÝÝþÓOú—$H„Ä9r¤°°0""‚b× RéÞ{ï%Ó1ìܹ¶Ãª««¹\.(N*• ¦¶oßj綾^‚Ýà'È©E‹Ê„zš ¾³°œ ü€<·¿øâ‹`äСC}'A°*,XÐwÜÒÙ³g¶‹pÈU%è‚›GhÀ–¯Ûœ‹XÞb9;¸Ã'Ìïêlº¹£®©½¦¾¥²¼öÊÁŒŸ»$íjŠÏ8Ù»Øòu ðŠ DžÐ°r‹Ëã:º[н8}út}}½T*ýã?@—€$zôÑG?øàƒ´´´ßÿýóÏ?AUãÓO?ýý÷ß1‚Œ &/Çî’îînã;ÿP¹‚ppp ;À7ˆ0؇”` 8dgРc`²ƒÁ \›V€4 €J³³³ÕB*l­V+‘HÀ$/::z×®]_}õh²É“'åi&±··ãÂ0p”X,†"¶ÝÜÜ@Ç€¬ùðÃA/‚…7ÂI}ôÑG \@P‚°ƒŸß~û-è<j ¼ å$… OOOHhD80áo½õ–qJtP–à@râp:pìæÍ›Af‚ô÷÷…Q¯_¿4(Ëo¾ù¾!FˆzëÖ­)$† ÙcɉÀO2)¤ŸŒ‰DÖ<8Å0Œ N¼×!!!ø`cÁ9tÁÍ@P˜ÃrzzúÅ‹ÑÃ:áîì™÷Î7«¿Ùõö¾S›r ÓA–étÚ¡ì:ýÛŽžõ­U˜‹zñÅ_Üÿýøá‡êêê~ûí·7ß|Ó××B v¯¨¨   æÍ›G1,ÙFÖ!D >¼¡¡ôY^^Þ]wÝmd.+¢9ˆä’ËåÃÄ{°'”f Z~þùçI“&½Bö$“”Bõ¼cÇ0û믿&%%ÊÉÏÏÏÍÍ!råÊÐ ªÀ(;={£Œ©‚cItð ö'Nœ rÊ”)>>>.\Õòâ‹/¯[·®«« tÏ«¯¾êåå?A)B\'Ož|øá‡—-[ú"…$$Rµwï^P?©©©mmm`R Ï›ÐNœ8Ò Ò á°¨ÕqãÆ=öØcàUÐy` ^rr2È²æææ²²²ýë_111üqSSìŽ"£°IúÁ!ß &<i°ðûhýä88°W èEé‹-XVûðÍ2S ÖܹsÍïÈ Ô 4º³ƒ|¯¾ªR+»$mÝ-ÕÅõ…ùeY'söʸРÎòJ2<]‚}b=#Ýýœ…nNöî,&{(ø*Ð+ª¬æ2晞€(qvvž={¶Q"<úè£P÷CÈ;ï¼ZdåÊ•£F¢æ‡'=2Vtipuu…êßÅÅå7Þøì³Ï@Í<øàƒÃ† 1biÈ‰ŽŽ†¿òx<2ɧ££ã¿ÿýo2›7o™åÏ–-[ˆ)(â@jðùüO?ýôÝwßݳgO\\$Òp÷Ýw¿ð ±±±`vX¸pá믿¾sçNˆBŒç’˜˜’ 6`O23sDD$céÒ¥ eV¬X)Y½z5è¡Y³f‚„rõ‘òDœûªU«àO q6lØ #óæCš?úè#—p²BØ|"rùòånnn÷ÝwŸq á^}òÉ'ýüü@ÉÁé€~?€! ºàOª§žz  ?ArAÔk×®§Á)ÛÙÙEFF’^ضÁ{à[aàÿððð”ü N#{’““SZZ ï8Ë€ZKñ õî@MO‚X ‰¼»±µºKÜZßZY^—_QWPY_ ‘uÙqõo5 øŽ"?ÐÁ>ü]ƒì¸öl6—jsÍÚq0cËûïÀüp3¾9òFÆ9ÊßíO^¹º™ùÁÿqϾ/ÆÃþ=Éëô}+òŒ“‘Ÿ`Ę­£AÒüFb¬ªªùõÚk¯µµµTáE~Áá½´NVVÖóÏ?àÀ^£ž{í )'ïö_7%}çCì Ë@iÝsÏ= A›Zm¶éé:#uuuíííƒb±glÁrÀÓRAA9欂§@x3b@l>G襟¯?Ž’ò—ê’uU5WÕVÖ6¶UŸÈÙ³ãÈ]Òv>×ÁÇ-”–§È¾½ÝC¼D Æ ŸËÇ-¤SܪT)†H‹ÝmÒ³Êûí·AÜx2™ 覯ÿiϾ4½*lØ¡_ꪯ…¾?{†ôÜöðð yî¹çÔjõË/¿lVß7‘NNN }úö ôÚ³×¹ÿc‚³³sRRÒ[o½¥P(V¬XaÍê Ø¶mx¬W"= à=e1°«À#<ÍŸ?ßä–Åb1ÜíVÞ©XNÛ-íì–v4µV—Ôä•TçÖ6WHå]J­Õx ºBC|bý=#\=œÜíyŽVÞ[Ñ ¹RöÖÆûžºë?.ŽXÖ÷²Ô ™V¯,€Ü>PóFR®ÍAj…3ô¢¡¡Íf÷zqª   ¦¦ŸäQ` µ:uàWG¬•ZÙÔVÛØVÕÐZUÓTZ^w¥¶©L¡”ñ¹;‘³ƒ»¯{h¨ï0P]B ‡eíJý㟞œ1úžˆ€$¼²b1JKKAx3]Ëêhkk«¬¬4ÇTX[·nuqq™0a:¹iQ®•È»«ŠKk/W77¶V7·×¶w·0ètW'?÷p·`/—^®NÞÖ¦Ý9ô‰Z£ºgÆ3xÄìÝ»×ÕÕuĈèŠÇ`õƒŽŽŽÜÜ\s¬ÔÔTëosF¬ëÙˆJ³ã:D$ÛÔje§¸µ­«©²¡¨°2;#ïüÔhT°¯ÐÞ%Ø;:Â?ÉË5P$ô°·sرó1A£~Ø÷¾núS¸À6‚˜ƒ   ¾kPVUU577'&&¢,TJc ‚Ø*Z­¶©½¦¦©´®¹¼¢.¿¤:¯½»‰Éd;Û»»:zxEDŽôqásnâ’Ⱥžÿdþ ÷~nœ.AsséÒ¥ÊÊJ\8–5"‹Aþ˜Üò¾}ûœœœ’““ÑɈYQ(e ­U•ÙeµWêšÊ›Ú«%òn¡s°Ol€g¤¿gxw´×Á)yÿ‡G@ÛÝ5í)¼(brÒÓÓcbbÐvöƒ†††´´´Ì@sËã+„ˆ`³¸~að!?e IKG}msÙåÒ³g.üãÔZ–Çx†Ç„Œowg?.›oŽ”$EL8˜ñ3 ,1dEÅ^---]]]èË€-XýàægðCÁˆF«©¬/¬¨Ë/«½\X™ÓÔVÃáð½Dþžá±!£C|†ñ¹ö¦ŠK"ë~üƒ)¯¬þ&Ð §=DK••URR²téRt ,«C©TJ$s,É|âÄ ‡ØØXt2b=È’Šú‹Å'Kk.×5—uK:œÜ@i…ù%„úʼnÜoÓþ{ß?æéâ¿bæ³èj1-.\°··Çƪ»ûAeeeZZÚ<`rË,«¿"#ˆ¹á°ùáþ ðÑ?]¨MmÕåµù™WŽl9ø±R)·ã9{Ç šߎö®·`ÿŽ1wýwÇ«³RV8ÝÒá‚ü jµº—À’H$r¹ÜÙÙýc°«( ±XŒ¹AZ«ò˳ *²/•K;½\Âüâ#&À7“Ñ GV½5zúè{M~]Š ææôéÓùùù«V­BW À²:Ì7ëÂ… vvvÁÁÁèddpAf‚È.8ž[|ºª¡H&—„ø =9&p”›³Ï?¾ãèWGÎíÜðÂ~œ ALHYY—Ëõððèu·ö\KAeE”””¤§§¯\¹Òä–<èää4|øpt22x‘+¥Õ%çó»|¤KÒ&ˆâBÇ&ÇN÷scЯ¿xœDÖõÀÿ¥>}×ÇI‘Ñb*¶oßîîî>vìØžJ¥R­Vóx<ô ,«£»»»©©É¸Š;‚ GkgÃùü´œÂWÊ3íyŽ1!Éc†ÝÔ·¥jËÿdåûø©Ýè41+gΜ)**Z±bºÖâºÍ¹bÈҋŧOäì*©ÉÓjµ‰Râf†û'ÒhtãkÞÿЂ·’c§£»Ä$466²X¬^ï¼K¥R…BaŽáX·Kyyù©S§î¹ç“[Þ±c‡H$7n:±Y¥¥”Td?¿+¯ô4m—1qÂðÞ®AT*õHæöŸ®ûü…#,&… ·ÏÖ­[ÝÝÝSSS{ê Ðh8Þ–õÑÚÚZQQ+e"Èí T+Î]:|òžËåYξãæN¹øÃ×zE,ÉÝĨT*R½^É:þ|IIÉ’%KÐ?(°†MMML&[n‘!E·´ýÔ…ýG2·wŠ[EB¼’ŒžÜ懞AÛD,3 ‡Ó3—ÊAe½TWWÃÀܹsMnyÛ¶m...ãÇG'#CòÚ+GÏÿvðôæ.IûC ÞžpàÀ¹sçÐÃȇAgükå—‘=_øÉ³}ÝCÞÜxï«ÿ½;¿< ƒ 7Ï®]»Îœ9Ó+Ð××Õ•%Á¬~P]]••5oÞ<“[noog0½šsdhÒÙÝúÒ†ÅAÞÑÏܳ¾[Ú±õÏOfnðŒº{ÆÓX= È?SVVÆãñÜÝÝ{–””ÔÕÕõš»Aeã\·9A†,Ry÷kÿ]·Äk«¿±ç;‰e;~yèÌ/‰÷ÎzÇf!È-PPPPSS3yòdt ,«££££¶¶6**Êä–wïÞíììA†Z­–b˜¬¡g`fffIIɲeËÐ?(°†W0@Ó"•‹¿þý­Íügñä‡ZðŽÏ}‚ ::: F¯Þ@”H$^^øŽ­…À.ÂþÉ _~ùÅ–sssû6ç"r›ð8vk—~ðþÚ_>ôÕýo%_(:‰>A†‡ÊÎÎî( Q]YlÁê­­­åååIII&·L®B߉w1 g/záÓET õž;ž¹çŽçØ8ò±iÄb1ƒÁàpþ'Ÿƒä‚'ùE‹¡P` !ÚÛÛáfè 1y>Ü´–Ëæy¹=¿â3‘Ð}‚Ø*׃ÕÐÐuMDDúÇ2`a?¨¯¯?tè9,9r¤os.‚ &$9fús_uåæäý§ *ë Ñ'ˆ­ò믿¦§§÷ twwGu…ËJÑétä±Àä̘1cĈèa1+3ÆÜœÜ)n›5ö¾—6,ɯ8>Al’É“'ÇÇÇ÷ ÌËËÛ³g:Çb`¡U Ñh¨Tj¯æ\AÌÁ;߬ DÑÁÉßïþ¿§ï^2}‚ ***šššðaÞb`ÞZ[[³²²ÌayûöíÇG#ˆxæžõ—Ë2%ÒÎÕs_iÃâ’ê\ô bc@ròdïwfýýýQ]¡À²Rº»»‹‹‹Íayâĉæx9A¾pÙü7üî§ÿvuôZ=ï•7¿¾_,íD· ¶©^%%%'Nœ@ç À²F@þ›i\‡ììl‰DÛðØÑÜÜ çÏŸ///‡üüüK—.ÁFeeåÙ³ga£©©‰•J¥à@¸p=O\D®ÝÅ‹áXØÿ“¨ÁDm¼v/I¼X,&Ù†$ö«ÜÓBÏkçHàZ“¨Á½,3N®xžd<¸¸$ñ`6”J%Éx$ÛÀ>$ññ<\;H±@®>œ¾1ã58NªgÖ5^;H<¹v}3ä8 ¸vp9 ÛÄÃÎ$Û\¹r…$Î…$.ÑB]yÇÒÉO¿÷ÃwV¬ÏëÓmÏ_Èέ««'×.7I<±ÐóÚ—Àó5¤üQ3žñôá¨^‰‡lCnXØö'r‹1ã³ IAl˜ææf3 #F® ¶`õ¹\ÞÕÕåêꊮ@›áí¯Wº:y/úÄ£ïO~ïñÞ®èAnlÁêUUU;vì@? ˆ-±fÁ[é9»¥rñ¤‹~>øtb«tvv’qx ,«#((håÊ•è±%\½gŒ^þù¶—æOxèJÙ¹š¦ô b“¥¥¥¡,vöò‚.ÇCW ˆ-!SHÿpÚc‹ß;“wˆN£?0ïuô b{™L&ºÂ2` V?(//ß²e úAl .›?gÜê_~2!i^VþQÐ[èÄ&™]Aeux{{Ïœ9ý€ ¶ÇÔQKZ;›$r‰§( óòtb{œ?þ×_E?X ì"Dѳãès‹OOœw¾àø³÷¬G‡ 6†\.W*•öööè Ë€-Xý ¼¼|óæÍè±IfŽ]!–vTÔ¦gïê·¢CƒÃáô ,kÄÑÑ1..ý€ ¶Yý°x ã÷ŸüA©Reàš¸ˆ­qæÌ™üý€Ë …ÑÑÑè±URâf³˜öžÃ±,œñ±5"""¦L™‚~@eTUUíܹý€ ¶Š¯{H˜tkg]eC±\!E‡ ¶„ƒƒƒ‡‡ú–5Âf³ÑbäÆÏáóœê›ËÊëóш-qáÂl#°$ tÁÍãfý€ 6L\èWP^[^QWៈAl© c±Xè‹-Xý ¾¾þÏ?ÿD? ˆ #ˆâÃR¸JnÉiôbKxxxDFF¢P`Y#jµZ*Åabã$FNÔj)ÅUш-QPPpøðaôƒÅÀ.Â~àcý€ ¶MBø8'{g¾º±%X,®¥kI°«´¶¶fff¢ĶÚ9Gލ¨ËÇ….["00pôèÑèXÖHWWWqq1úAlž„° 5Í•õ-è Äf¨¬¬ÌÊÊB?X ì"ìÐbóDÄS)Úòº+ž.xË#6Bwwwcc#úÁb` V?‹Å¥¥¥è±yü<Â|aYÍetb3DGGÏœ9ý€ËퟞžŽ~@›ÇÍÉÛÉÁ£¶¹]Ø ÍÍÍ%%%è‹]„ý À××ý€ Câ~÷¯o)G? 6CEE¬àà`t…eÀ¬~ V«% úA†ÑA#Ûjdr1º± †¾lÙ2ô ,k¤²²rëÖ­è D$5µUK(°¡«««¡¡ý`1°‹°øùù-\¸ý€ ¶\ ‰ÛŠª.H’Òê<±¬ó‡½ï³™œ¶®¦PßaK¦®Eÿ ƒ—üüüÂÂÂ+V +,gÒC1r±èÔòׯ2*…B§S*ŠVK‘Ê)÷ß¹ú•UÑ?ÈàEg€FÞ+ ŽîÅÅÅ_~ù%úAl˜ߨØDµ†B£ë²™.›bϧÌN½ƒ j #Fe¥xzzN›6 ý€ 6 #˜8G£Ñ·``ÛÝÙÝË5ƒ jrsswïÞ~@eðù|ô‚Ø6†/pv°]E)(£cg9;¸£gAMttôŒ3Ð(°¬‘ÒÒÒï¾ûý€ ¶M Wdd@‚Ú °t: ƒA õ‹E· ƒ.—+ Ñ(°¬''§ÄÄDô‚Ø<³Ç­T©õ-ÅÕÑy\Âô 2ØÉÉÉÙ±cúÁbà4 ýÀÑúAlž¸Ð±>îmõÅCäçîŒK8 ƒ___lÁ²$؂ժ««ÿýwô‚Ø<ž.ñ¡£ÕjŠRM™4b1:±D"Q` ¾«Ë*a±XØ‚… C„;SWÑhƒ8½Øø¡…Á.Â~àfý€ C¨À$wg>Wî#/oŠŠŠŠ‹/¶¶¶òx¼ðððèèhãjSPP––1nÜ8ÒÒÒòǨÕêiÓ¦yzz’À¶¶¶¬¬¬êêj80$$$..LõŒ¢¬¬ìüùóíííñññ¡¡¡èö›G(zyy¡P`Y#MMMPL¤¦¦¢+Äök#ËÔä%Õ %v<ôÆ?²wïÞ/¾ø¢²²R.—ƒHȦ>ú(**ÊßßßÏÏBjjj>ÿüs•JBЬK—.­_¿>33S,Óh4''§©S§>þøã...$ŠíÛ·ÿý÷¥¥¥J¥’Ífûøø¬ZµjÑ¢ET*ý3ø@? À²F <9¡Äj‘ÉdåååZæö+]“ã+Ht¦©ÔJ ŸˆN§c0™,ËúÝ~åÊÐFÕÕÕ ¡ÂÂÂàYˆ!ww÷¥K—Âp98NEEEZZÚ½÷Þ{µúa0Œkµ577òÉ'Ç÷ööžŸrJ«ÕªTª¿êM*•9r„l÷4`g°Àd2IÈ2PZ ÛT`8„—ñP];hŒ«!7Ä(Va–[°úAô‚ ÈÿÈZC+TÏö¶ÄÄÄ÷ß4qˆ:ìŠb°U^^n|ÁàææÆf³KJJ È‚¡¡¡¯¿þ:ª 쀖:{öììÙ³Á,ì0kÖÿgï<£*Ö6¼-›Í¦÷Þ I B¯¡·€Eé"X‘ ¨(]QQADAAzï¡Þ+é=›M¶ï}wGÎÝ›¤˜÷÷æ?œ33gΔgÚ7#]\\œeô4G•••ùùù4(`µFI$’ŠŠ j©ŠŠŠªq¡žÔ„@W ¨¼¼¼K—.uîÜ™ b,ëÑ£‡ŸŸ_ttôš5k&NœØ§O•îÉă ºqãÆåË——/_>~üøöíÛ{kE“ºù Њ¦ÃÓÓŸ"DéRéHùÿbî«è)F533sÿþý4ÓPQ=bsþ>ŽÍú—tµ=|ÒÍ–Ëå………÷ïßÏѪ¸¸˜©´QŸÛÛÛ:/^įºƒXsæÌñòòºsçβeËÞÿý-[¶À+ÆAHHÈôéÓù|þÁƒçÍ›7þüÓ§OëÎ?R5©¢¢¢””šOLk«¦¦F$á¯T*%sä(føKî9u…V„¢jí©&eRw‰î?Q,õ´(r¸ÉårÑÂ_ü7ŒŒ˜••Jè-Ñs¨¨ž·^&’‰e|!_­R«”*ž€§hŽzÖ\H\=.›ÃQHäš­pz\8àpP qXJcTLðA­TÁM-'Srù\µŠ¥Êá¡J¡éÂî?ÿÍ —œœ¼jÕªòòr}}}Ôí+V¬°±±!µ:°ÿþ.\ˆ¿zõ*¹Ã<lmm}èСÐÐШ¨¨˜˜˜ÈÈÈ?þ˜˜nBm?kÖ¬¶mÛ°nß¾}îÜ9ü}ã7Þzë-fÙUãÊÎÎNMMÅÒ¤x Å£ªªJªU~~~IIIuu5a)™Lx"܃ÜOˆ§0×(~‰ˆXfñuÿÌÒ»"d  .B$”1,í J„E‚@p¦¦¦¶¶¶&&&¸) nΞ„H 3ÕóCWzÜÊÜŠÈ¿îʪezú¼ ‰ML¢FåÅhŽy¶ñ³í8¾ãݽw€Y]^ïZUX•š¢oÈ¿‘ ~YzZY¸ZÄŸŒ˜ g½<<ƒ½rïåÄU)”cA§ÉÄ¥Õù±ycÚ?÷Œ…z["‘äåå{èEãŸèT3P9;99 0à—_~Eá'Tźóþþþ¾¾¾&L8~üø_ýuñâE Ú¢E‹ˆ10Ô½ƒ êÕ«WttôÞ½{Ïž=»uëVtz‡ FsrsÔ±cGš­°Ð;WVV⢢¢£¯ŠŠ……….ܰuÄ”@ÝâÔÈ”_­ÎM­b¬{ͰëÁ„#ù Þ’>¢ZPPìC™GÜÌÌÌ ---ÝÝÝkÅЈRRRP¤ç̙Ӥ˂‚²²ÊZÛd^!ñÍÌŒíìèb5ªÖ ¶J¦¸õÛM·î^Á^±G£Ó®¦š9šåFåôý ê–Ë.%]H’TJNÇ»tq1´6*L(èñfÇNW6†ú÷wêè|ï@¤¯Mçi] bóol ³p·¼ý{xÇ ììcŽÆÜÜ~Ó³¯WiZ ‡ËQ²žsÀBí <úî»ïP÷^¾|ôCZÝš­Cpp0ðˆ´Ä>~K;w®S§N/½ô˜iöìÙpùý÷߇……åææ³~ûí·ììl²úªk×®žžž¨ÕñÔ¥K—@]µ–Ì?u‰ÅbD»°°°¨¨¸)‰Ð iÆ294‘ÆÆÆVZÙÛÛÛØØ<1ˆ -û­°KÒÓÓÑ A† §yyyá ²CD­#fÀé©t¤P°QäȶaòsTdÜ Å¹?22ROk.ÙÛÛÛÔ´‰1P¤QšÆ 5ëfØIÙI¡”øÂ5ZlµD¢â|į]ŸL 99÷£"Ãx<‹õ"š‡kÔ­{?cc#Z©µ`øŠË)Í.C–qï厚ªí¨ü9µâ'4²Ô,ß!¾YYFVÆ~!mãŽÇ›xžžÏÓçéé Í &Ÿ[’R”q=­8¥ØÊÓª(¹ÈÔÑÔµ««T,õÑöºsÕeb®>¥~!’ýU.òóóIý_«Ÿ öjÓ¦¿¿ÿ­[·tç.ðÏßÿÕò°aÃPuãf`` ‘‘zòb­Ž?ƒ‰ÿ øŒ+))!ÝæÖбÌÊÊB$ïÝ»—ššŠÀë%1xkÆW+>ŸæÉÜÜͨO‡ðjÌŽËǤ¸¸¸äääI“&Ѳߺ+""âÎ;øü *ä bà„á§Ö¹ÒÄM×D /C­ÐoÀ?‘ïŽèjÄÇÇ —7–X<ž®–†ÃeqÙ5î¶ÙƆ€­®½ç°ÕâunM Þû¤ÍËË«*øÃɺL©â¾€Å˜Í’gû•ûu¡€ÕòA,ŽB¢P+Tl=®¼F^UT¥Vªp¡iõÙ¬šJ °R®pêèT”X{,†Ççi—)h*µ¶ Dµ"«‘K*jʳËõMô¹<þ©YWÊeKË%š%\—ÿ¼f!A|||€wïÞ=sæL÷îÝÑe=wî0ÂÓÓ•jÝJ¸gÏžø)&&†¹ãíí „mœ8qbÈ!À”ǃ·@¨ŸÑô¸»»‡……¡îÑ£®oj¶k×®ÝS\[QQqêÔ©#GŽ æb±˜@HqvÓÊÑÑÑÒÒ=s²Š¦  àË/¿‘ÇUÀ,P#YowìØ±Î;=IôÈ1 …£¿ué—TWW“¾9Rêyh–4H(á­ÐajĽ݀h¦i­ôŒÞ!r拸îMc½\Méêaº\=n·Ý#÷Ef…gÙ·Ù $._ù>”Ía»ussïé^SV­o¢Ïòƒ&u†3bÁ¦ î(eJSS•B-­’òôyæ®æzzÝgôˆ>w<ÖÐʨ˴®ðM¥P]ûéKÅòÙÖ¾­½Rþ¼-ÆêÓ§Hijzõj{{{°Bvv6.^zé%2¼Ä˜à!î]]]ƒƒƒXd8‡¥5LÚ«W/ÐÕ÷ß¿ÿ~ÀÊýû÷&cÇŽ%‹7FŽyíÚµèèè ˜››çççuíÚõi­pÇ»œ?~÷îÝx 2d~5"ºtéâååemmM ¢2B3 C{J–Ù̘1cĈ€Hø~ïÞ½¼¼¼’’°)R€5mÚ42ú¨„P‚S§N¥e¿²:±±±¸ppp@„ŒÊ’QÐgâ´¬Zý-²0‹˜¨¬¬D ¹wÐ…jäA#­h¦¡¢znÖ1u4ë7¿¿\¢±ª€ª”ªÀñäÕr€˜I^#÷æ§Vª%"‰Kg·în¸ƒ;¾ǸéÞScº…ìì>³§Bª0´4´ñ³ÕŒWÁC•¹?lùpø á …êù£+íÂ’%K~ýõ׈ˆˆŒŒ ´€ ðAß¾}‰À©?™­?ƒ>{ö,PŒ,ñ3ÍŸ?Ëõë×Áð¡sçÎ&L`ø ,õùçŸïÚµ+!!ì¯ÆFqvv~ò•õË/¿œ>}ººº "@DT»wïÞˆ%ê~øñGCƒÔ˜7oÞĉI'¿]»vãÇONN Eš$&&€bwîÜyùå—'Ož\kð¡åçç×È ÕÓ,d CCC;;»²²2p ™YÇW'çÄYH®þ=ÅÑ)]éî.¬ªªªÔ $²…/âááQPPÐøÈ\ffæ7^{í5šo¨¨žzð—«Çý3Ò Qpô8,5‹Ü!ð¤é’É• ‘ŸÈMÆ+PãžËçcZ¨UÕÏÿÔ5ïU«V<ÀLh-,,˜_û÷ïïââ‚ö‚ÙKäååõÕW_¡gËXc‡ƒ?þ˜Xyàóù€6P—nÁÁÁ;vÌÉÉA½ ¯œœœžÊ!9.\*‡È®@@Õ¤I“zõêÕ¸åÅ={öìØ±ƒ¥]²6kÖ¬Z+ÍqÓW«1cÆ?~üÀiii………[¶l‰ŠŠz>’CšM´¢E¾ua,ÒÉ@™‘ËåÈß wdôôôtüDx y}¾Vdk!™ñe0«™M®)©e¯¹@”ˆErD¨D"!Æj´" Ct;¬¬¬pÁX“o<8¸§gRQ=—R«þ©‘8<ŽÆ.¨TÁÓ×SÈà£PI­±; Ó8àrþÙC#S⟸‰ÿØ<6—Çoéèßð—¶AhâK­jÕÞuºAmL–.µND@±{÷n@ ×@ÀiÓ¦=ºÉè7oÞܸq#ie¦NЧriccóÆoôë×o×®]‡FãE†ô/^ܳgÏÿððpº‹°5–.f™Œµú§Ó¦…àKee%3¡Î e‘ý¨zDìcéŠ }±64ÊúÿÅéÄ[æ,b\”…'ÖM§L4ð—`в/ÙÍÁøÜü“ØëÖTTTÏ“¸zÜÒŒ’èCÑ ©ÜÀÔ hb'©X–}'Ûo¨WŸ2ÎÒÓª(±0'*GO – ݾ,³ÔÊÛÚÚÛº4½$7:×1Ð)bw8¤¥Pš;›·¨±ó®R¿h)‰æ 111;;[$¡š%ë¾ATŽŽŽº•¼®Š‹‹p¯Û-'u81g]\\_§‘••EL˜êš!$CM¨ù ­­­=<<ÀF-µSˆfeÓ¦M;vì Í\÷îÝ?üðÃæíWTTôõ×_———ã©áÇ¿÷Þ{MíîîþÉ'ŸýøãéééK–,ùÏþ£{8ãCäZkPª“YuÇŸÈ]dzª˜µYÄÚ'a 8ÙdÁœ9ȬßÒÍmuË^-ºb·ÈR*]sð(?è!2Ä^ œTP o¬_šYêÞÃÝ!ÐQ.QÍ ¢G ­ Af5’ü¸|S3¥\Õã^òj9a±Y/]•••8qâìÙ³iii¤Î'U:*g0VÏž=_{íµzǨðÔ† à¾^þ@­ +88xĈ ™ŒÚ»w/ˆ´ µÒô“Û·oÒ­[·fbbºÚ¶mñjìØ±óæÍ³²²jγ[·n‰‰A«¾ü裚y†^1 ~ùå—ááá ´5kÖ ¶C‡}èOc­-é­°ÙÒ…$f/(YÀX›˜1*³jÙP`ŠDݿ̠WÝ9Ǻӑ-£¢¢¢zqkC>/+Œ—BK7}útGGÇ¥§ŸŸß_|±råÊ«W¯âÕ¾úê+cc㇞+ŒŽŽÆ‹5Šög °îb5µâª¡ã†<|ZÀä Í4TTÏéK»ÄJÓ9Ti-ªœ8š“žµ;e8š ÿi±Y;¤lµfÐKã^;¦®i×ù\Ío¬¼héµlÙ²ÄÄD²·VW™À¨+..nùòåK–,© Lç¹î ëÁD©Ü¹sçóÏ?_ºtiŸ>}jÅ¡t£ÁÒžf‰D‹/n|TéäÉ“[¶l!³. «yóæÕ p Hð% †™Ì´$ ÙtæÌÚ®];`Sóm\999­X±âÓO?½~ýzAAÁºuëÖ¯_ÿp6›ššÒ&칬æCXëWqqqJJJ÷îÝi¾¡¢zþ¤”+­}¬cŧsxì;{îðô“Î'V‹Æ÷ËMG€½Ü{º;9Ë%r==#£Ü¨\·înñù3!~5²1öæ'Ëp ?_°………ß~û-Ø‚™Lª V@‰Ñv€1R••dqwwoäð14d2„¬3KÈq~yyyß}÷³³sãvˆMlâ Y²‚¿ˆ9K ‘9tè··÷”)Sò!!!áû￯®®FÆ7{öìºtUZZzþüù‹/ÆÇÇôpŒ aJÜA3wùòe@’………¿¿ÿ Aƒ ÐÌû¶¶¶¬E‹ÅÄÄ  Ú°aÚ5kÂf‹V´¤¿X€õ¬}‘´´´XÚ Œè?±• µB©9nƒ­±®‹ÈÆ¿ 5þò8l#“+µ‡p°ô4×*¾ž¦cÅÿð‹J…*ƒ-—k:Ù<.›ËE?š¥T¨ä iix(“‘ušÇå þr5ÝlÍJ%‚þ‡hQY©Tj¹\G´ýv¶vS9ª3MÌà\ŽÆC„®@ å+ízèÖsY$MȶüœÑA°™õxlíûþÓ fk”d† Ô,V]7õùÆ"Så¤=ÕuIäè´³ÄÏZ’;µÜP=1©*;“ÀW:ÜÞŽU™'rêä,45ðàssÛMÐ’[O3gs¡¹0rd©yƼ{»‘í¶†\z‚§Ïë<µ+¨«º´úôòSJ…ÆiÇׂpÿEX†R¹yó¦.]ùøøŒ5ŠlÌÉÉ9sæÌ­[·Èê(pRddäéÓ§§OŸÞ]žð+þ‰¤R)êÞ³gÏÆÅÅZ¥ázÿþý ,h(JˆC`` <166&tURRrçÎÀ*s²ã 7ÿøã°N½C;t•‘‘º¢[·n«îÉ?x¯íÛ·­âí,--œœP³¤¦¦:G‚¥…À/üÍÏÏ¿råʾ}û·Áƒ3›±I^²ì}Þ¼yx…ÐÐPÄùí·ßné7œ!ôºÃ~T°ž¾ß?ܤ€D¨fÃÂK³r«üL}½ŒÀ:`©È؊ؤJ{kA· s##^Nžä~nMç@38®+Ò²*|MnG•gݯÖž¨öõ6²·Õ‡›¶mL^9ù5Ñåb±²K ¹·‡ai¹<%½¢Ÿ)Àät/¶¼—‚ÈΕ  8þ¦¶Vú`, Þ͈2+K¾·‡Ñèò”41º[hdRU€¿ £ƒçîlx ½Y‚Ð½Ü ;šëó8ÉéU5U{?à`a±´¸TæçúëYjBnˆ¼Dª4òJeý‘×v¤_²ùzl¼rC¾¸ð .qQ#QjÈH§ªdë“îbET§ÀSmj]º|F¿yÂRH.]\œ$b‰ÐLXUT%˼úy»tuE¨o¨¨ê4¹3>ÕC *‡ÓwN°T$áékî«Õ!«Gþ³îJóqU/]3˜¹9MûöíW¯^íêêʸ:tèŠ+N:6…À @aôèÑu÷µ! %AAAcÆŒa–põíÛwäÈ‘K—.šuZÀ£«W¯N˜04S7Jdï@­tï#DøŒ¸Éår2È” òCXu=9zô(‚Š1vPk \¿> ¯@WB¡°S§Nýúõ ð÷÷?qâÎ@W6l@R€·îÝ»wáÂü­©©‰ŠŠZ¼x1‚ž={vsL‰vèÐá­·ÞZ»v-®ÿüóÏ^½zµmÛ¶ec´Ïì1wϨ84 š¯ŠŠ tS2¡Ñ”ªÔë6%ý}2W"U­ÿ1ù¯#9&F¼?Ýß¼3m|è­’OÖÄI$ÊÌûÕï}y5¼ÄÌ„WP$ým_ÚÚß÷g]»]’_,ÉÊ«Fžš!þ}ÿ}>÷nlŲ¯ró%@±•nÞ-«ÉÞ©T¨ÀsÕ5Ê_ÿÈ(+—íØ—“PQ!’ݺ[¶pel^‘T Ï©ªV~ñCâoe¡J¬)òŠ${Ü?v6¿ X"•©ŽŸ+¸^j à|÷kÚÁ“¹h.öË]óC"hãÆ²·þs7=KŒøÇ&‰þ:–£=Íö™‘"úü«„ÏÖ%|µ9ET¥@¢!’`J$ï¯dÊêcg >þ"nÕw‰Ÿ­‹?q¡PŸÏùý¯ìûy5p£ëî9“·â›ÄU’ŸÎ32äž¿Zt9¬ § ‹_yøt¾\®ZÿSÊÒõ +7$~º6þÔÅ‚²rùŠoEUr$)¾Ô®÷oß+ǸY²6~ɺøÇsñ™h¹{ÂÒ˜ e³ Œ ”r¥ÐRÈásÈÍ<=cw”|Wi¡ÕÚy@=!_c K©"¶¯È¯ÏÇ‘bÍ*Ƭ¬,²®omllP›S¢¹ ½Yúzi»YÓÝ—-ðEÝŒfþèÙ¼¥ó}ß›ê¾îS;Áï£Áv¶7ØñWV^¡D.Ú<þæD·Uÿñ_½Ð¿O+ͺ‰rÕ/»2¦wYð®÷Gïyð–WY…\]kØD;(‚ÇgLp]4Ëçë¥|=vJz•‘!ïÒõâ®Ì««1 •ûX-ù M· ‹½­?ÅEsx.pÃ"J’+×~Úö­Inß,m—_$=w¥ÈHȳ0ÕÛ²+DÂùgRñ™¾¶T®þ~kZ·Žæ gyI¤Ê}Gs¤25àF©Ts9l™Lu+²L©T݉.÷t3|k²kÈ@»­{2ã“E·£ÊË+ä\©>÷ïy€Ñ×F;¾:ÊáÈéüˆèŠ´¬ê¤´*®:ÑFäHbEà¶èøÊ—C¦¼ì<ýUçž],JÊdÎùyW¾8ûzD©ƒàÍI®®NÂÊ*ù¯¹À\N矂Èà‡æB©&Ù»IÛ./ ¥+]rª««ÿ9[©l×®]ÝM‚‡‡‡!8®ªªc5äg½ç°T<== `Á‰D’žžÞø§¬{“ÇãuêÔ 3v‚ju¢=uêTRRÜ ÐW_}U÷§üüüO>ùäÚµk)Óüùó7nÜØ¿Ʋ|FFÆÍ›7ÉÐ×!CþoÀÛÀ`àÀ?üðÃ|€gÑ]½zõã?.,,l2ñì´iÓÀ¯ˆ3 kÑgÆÆÆÒÞz‹d ²Pñtàó‘@âÄz;™KfŽ7×Å]TÌ 6ÄxGŽ!6â3b@‹a0,Ä!;™ E—œˆ­vbìŽÜ$F³âņäåå5cÆ ¦Ü&''«÷EÞ~ûíU«VYXXÀŸððð/¾ø‚ÝÖ¸ºwï ŸgİEo †2ÒûÄÔ²5X€›Ó§Oß¹s9²k×®½{÷FÎÈÌÌZ59š…Ü ˜m/Ä6=ⓘ˜ˆ\{éÒ%áäìŽh°¹µÇv œš%G3ô­ùìÂãqšÝàdç0[©Tk›p–Dª|s’׬ïºX(Ðçj–´sØÌýMÐàrIÏ€FdÆã²£+Ó2ªñàœš£gyÚÍÊÚuñÀ¾^†¼Ð°’• ýíôãEw¢ËÍLôJÊe™÷kŠKeÖ–üº b àK9œ !¶ µvÑÜ™ó—ÇôìlAæÂžÁ t ØŸÏ÷ýõÌÏ¿JfÏ{ËËĈÇfFý´¼ÿ8\ö®ýÙá‘e™÷«Ä];˜í9xÿÿz'Vy¥¢ªZak­_-QÊåjgG!P ßQW;#’hk7%ãÃÁä— …\Õ¯¹ü°-ÍÕɧ¤RÍ…‰æBEk¨‡$höóò"Ï‚ˆÙ'zP÷4d.?±È@—æG¥²9HQ«¿mll¬{‚nιjµþCK¡©¨µ¢'ãjŒîÝ»‡Š¿ººº¢ÅÑýiçÎhSˆ]øeË–Õ;é† ‚ÇÑJ67âógŸ}†í&š³&—®Ã·‘#Gž;w hÛÈNÌZê ­!Z#` ‚ÌANÈŽ` 72߆ ˆýÍ7ß,_¾Ÿ|Ë–-@Aƒåææ¶¼¼¼²²²fÍšEÎ@@ñ`¥*++7nÜHÎ!OOOߺuëŠ+’““á ~"ƒâ©ŒŒ ÀP\\Ü{ï½rJHHl­\¹¹êêÕ« ½+W®„„„ , ØöíÛ= Êðµk×XÀµ'NÌœ9“ÏçÿñÇ $àÞâòåˈ$Êjdd$¼m×®ú%ȵè©Ôkg‹ h£Ó@ŽzJ¥Lv'FäÄb10«¨¨¨} D¥TÖªU*uÏ.ßlIIN¯rw9÷÷ɼeùþñ·üjxÉ€žVå•òçrû÷²ÑÓDªŒ y³ßð˜³äž—»ᛎ¦Á=­%%pJ©]—mm¥ï`#Øw4ç­Én ßó>{¹ðç?2l¬ôÕ*u|²¨Ggó” ®MMôZ=»Xuë`nf¬·fSòÎï‚΄öéfùÒ;…R½yGú¥°âÉcjZzðÓ‘3y )U~^F©™â«7Jæ¿ã[’sw5?Òaéú„‘ƒí8Ïb5 ФHŸÕ‹ý*EŠcçó7nK]¹Èp#Wªôõ9Ä«Ù_Ù»«Å€>Ö\6ÛÍYÈã±5;(5 Þ9Úý•šÅÔ˜gbÈËέqs ø¬wË2@%8ÆwDÚjW‹Ù …»î3c#=ø,àsoÜ)­‘(»w2¿y×쇭i¤û7ƒj%ÝrHZ\¹D¡¨V¨ŸñäP°” É3óÍ\tA†¸ÈÜsÔGKÃbf-˜A¬G’Jµ< E%σƒƒmll˜ûh€Ð™'Ó‹h’ê¥+´YÑÑÑpƒö¥I cåçç¯_¿îÚµ«9K×ÑÚúùù¡ ÍÎÎFûÕ|ÀBó‡vª¥ÆN©;`!O±,3fÌÀׂXZZ,ò¯¾ú*:">>>`)äK =2ÍþýûK¦NNNðGOO¬Fð?,, YpÒ¤IdO/ó¡ñ+)<­padd„€lmmဠ+**@]}ôѱcÇ@c $BÁÊYq‰âN˜0!((%yîܹ¤Ãø#VææÏŸgd5%^$×µk×z‹«vŸd‰È“Ðcbbà?îhf„B” dz ¤¾ÀàÔѬZžÈ䪠vf#Ø}ù}¢¾>7'_òöWÖœÛþÌ:}± B$÷ñ43ÌþÜ•B>Ÿƒ¦·S{³ñ£¯Ü,A#Mì)Ȥš)<޾Æ,šyT2ÿ™åõÕæ”–ÇàZ$VLãdeÁ7Âá›_’”–Ë'Žs66ä€rU¹HºQºá—ÔÜÉ»SÝÛû›‚ò ¥'.䃖ÈÌã?ãs< ÆùyOëüíÏ)fz¥å²ƒìºt0ˆ.‡ËêeÈ`»ó׊Ä5Ϙ¥i~?OÜò¤LfnÆ·2×'ýqà>ÒçèÙ|;‰1¯¦Fåäh€¯ ªÒLž¢“\%VÜ‹­À§T)Õžn†@%}>g蛟wgàs­ð-漡ALJ«ºy·´¦Féájˆ¼CòBY…üNt…±pF6râÔáoNr›>ïhŒœáW‰TÕÂÑ •¡wM ­ÑLLMºZt–©dϺõ)•Z%´2446lýQEýibbÂ$8Z‡œœœ†F•Èq®`r zéO%Îè-3GÖ’˜èZþ‰D躓•0½{÷Ö}pß¾}………ø©oß¾hYjy›˜˜ˆFíôéÓèi“¥/h¤š<¯ðµ×^»qãÆÅ‹ñÔŸþ¹råÊÆÝ£™ëÒ¥ ÉxûöíæP˜¨U#GMS=ÀŒWVVA¬­­AZÈš®®® ¤€{¤ZÁ Й̠‘H$[·níØ±#™LNN^·nÊîLž<™äl8&B€•ÇãÁº¦xñxAAÁ¦M›ÿeçÌ™;yò$ø¦M›6È‘QQQP±˜BJ/ü!çŒ"†ÄLjÅMd²-[¶\¹rEH÷`ÑÆ{`ºµBAÍB¦VÌ>[¥ªÞ5Œ5a´ã€ÞÖÅ[P…Hàgºb¡_vNµ±±ž£­\Õ9ЬC[S8ÆoMr›0Ú  ³è}0–T¦ZÃßömM}½Ñ6VüÇ/'¯:9ÍLxàžaýmƒÌ ‹¥Ks=™\ýù|?¾f`L©d:×-=È-½¨J³¦_OK zxýU›¥14ÀbÍœäŠ7T ¶oy…kK}`@pìp–š%®ÖTO«ùƒ ÏL»¥Rž>ÿ°ÍžC÷ïÆTØYëƒqÑ%þàmÏ]²¿ß–æd/xº»JÅ jofo#@=L,~A]:XÜ­ŒIá[L}ÙÙÌ„wÑßùõ•rÜÚßß+1M¼ïH®\¡ÞßÖÕÉ@*U œ Óç yÚ‰Ýö~&=;[ôìl©ÐÌ sÿ3ËûòõbÍ{¹ ß±s †áZ4‚ •ä Õ,–à¯Ñ¬m¬'ŒžÀV?s„j¼çxÔ´...dv‚ìþ OJJBå\×ñË/¿Œ~2™×l=ô©/ÿRyyyh/ÈZaĜǬ*†233sssÑšØÛÛ{zzêM…††’Å!hÅt™ íã/¿üräÈ‘ÒÒR<ˆ6‹L~ýõ×€§Ù³gëúSKð¾Ý¼yæµk×J“ö€ P±HLb±mqsÞº[·n]»v¥ÜÓê yÔŒ/ ÐAñ›œYÎÎÎ 'ä6’Y@¾¾¾ÈjøiÒ¤I‹/Ë{xxàŸ O>ù„Œ1ëÐmll®^½Š ;;»—^z ¨ *))!CYðavï¼ó8ióæÍ¤$#×VTTìܹ™òÂ… ¬ZƒFˆ3¼BÞÍÏÏwww‡Wˆþ"þÈ—x7Þxã×_%‡C³ÞÓ«[º.]ºôæ›oæ8p j”Àfª™WRªÁU6Vúšá(™Š­Ù2pý¼M4›µCÝ|=®>ÿÛH¨]MõpßÈÇlc"ë¯ùz(ÀÛ¤ÀQWg!›¥1¡ùÐú‰PÀCðO®m§MŒxÚAy·<.ÛÆR_ ‚Ìl3M(Bë­&¡àâifªgaÆ×˜$Uhö¥#Âä'Í#—­YuôL­Å–ËÕ^nF+úkì2pÙR™ Têh'øüC_…RÊÁP&hÉ‹$%D-•«>|ÛiE¾BM’¬‘Â7 h;rÒ¤UY¥Ô×:d°-IFx…ÖÁßT"S~>¿ YVå 5x·§‚–H”Ûšvë`.®Qˆ«qmÒ%ÐŒ`nóK¥s8 Z£±´g6?'/òì,% -•••‘z;;;û§Ÿ~Z¾|y]Kå@TõO»GDD"-2fc©ê ¢ñÒ]ÞŽFýs´G]´bîªÐº‘Ùø†Î¶‘‘ZÜGÛwêÔ)`кuëÚµk×P”À=AAAh áXXX“€ååå…ˆåä䳥Л®ÐV¢l¦ùxªGÐ÷h¦;d)ÐUŸ>}¶mÛ ÖþöÛoÁ+ýû÷TíÛ·¯¸¸xÿþýøØ4>Z÷Ó§O¿rå ¨yŽ ÙiH†ÀÝè¾ £(Â+äf”O²êÎ;ÈjQQQÀù¶mÛ’¹9dÙŽ;Ž3AÃ[ä­•+WΛ7oÕªU(ÈÁ$s3›Y \ 2dïÞ½÷îÝËÊÊÚ´iSûöíX±ÎãŸ`&²Eþ“áë†äèè8bÄr ,0`îpZ²þˆR׎$©uÇTÐT£~ÀOjÆò$þ?a—ZË Ô:Ö) fÉ5–wþç¾iî<Ød®Ôyœø©ëXý¿Pþg Scñ¥òÿ‰'º?11|¶„×Wk&þª5YU­˜SãŽLö¿;@8cF3ñÿA?¢*E•XóóÖH@Ë´XÆÖBU¥ègrí.„©fT•XInÂ@BAXÄk0q•fÙÐ?ìÕBºb"HEõt„~5Y™ŠJ^0G\\ÜÓÔÎýÕ½üøñ[·n1?¡á@Ë¢ëý|b%ËÕÕU×ÅÞ½{ëŽxýðÃx_xˆvaÆŒhh~ûí·ŸþyÑ¢Eð?==íTyyyƒC<^=HK„æ¯ÉW§ÚØØÀ1P4»ÍLøü×_ÑìÚêF°/Û8 ‰^{íµ~ýúáŸï¿ÿþÑ£G·lÙ‚O>{öl`5é bPêæÎËçó‘í€çÌòFb(ù(=þüC‡!;«±cÇ‚ÏðìË/¿|øða°ËÀ‘í^è.iʾ}û§ÂÃÇŠ+kkëàà`p²r`` ‚ƒÿ 9bÉ ?!òÇŽáÕFŽIl …B0Þ~Ëuº ê•V4Ó<7ª»Öîß,–¥kÌ©^X¡òœ0aªeô´É*UChhh||<:áÆ C…¯K$Ohü€ÃÉÎÎFÈRzrTÎ7N:E̸“vÍÅÅ¥S§NÌS¹¹¹aaax#4 ºËÛ2™™™¤!ÐýŒ‰‰±‘…Å *Æ"¼½½½úð ,EEEÁÙäÉ“Š-\ÂÄ'++«¦¦¦ñ¶ÍâFL•⥚™ hk¡$Uk,2¯@ ai'Ô$ 9e ŒEì#àcƒW —ønPêÈJðiÓ¦!Ó1<5nÜ8<Ç2<Ž;d_0އhEÆ¢à8ìÍ7ß”h{ý1FE‚`ie˜2e Ùg;sæL+ccch¬¢¢âëž·ðúë¯ñÅÍǤI“ZãKFŠŠŠà[iiiã{ýð fffd´Íh󉳮}|ªVXºLCæàÈM…V¸C,áê^°´[óˆ³ZöN?P u=d~Õ W÷ñº¦SꆂGà-3öV¯{2+‹›ùú–––t… U½B·•ê·ß~[XX( ‰=gõù7ÂÃÃwïÞ=zôèW^yå‰-";ŸäÒ5‘MèdìØ±ºVÚýõWD’¬^¯eû^‘e'¸iddÄÜÏÊÊ" E²ÈЮ];¤†H$B²€ÒÐù¯×¼500@¬Ð`5Ç<y²ü¦™©‘””4eÊšW[#`éO“wþ¥‡­PfZÑLCEEEU¯À+NNN[¶l¹}û6¸ ÐÀ} Tòééé6lˆŠŠúôÓO­­­Ÿ@|8Z5Ôèà'²¹éêêjnn^QQAv>Õj˜³ºÇ£CBÌÈB]) 2=ÒHdX:{¿šy¸H­ÍïÍ‘¯¯¯‹‹ Í¥OLOÙ@$r_GdæžlôÕÉÄMÆžžÞÓ²p“‘‘±gÏši¨¨¨¨R—.]¾ûî»5kÖôë×€EÌú°ÌÙ¡b?wîÜÒ¥KsssŸ@d=âBLÈ,¦õ£lÞ¼ùÖ­[ŒûÁƒÏ›7à (Jw$ fhhˆûð ÆÜ÷öö&€uíÚµº³%,­ÍR2Bl5U„ŸÉ[sÌ.y¼E󷙘˜èNnR=nñžbØÄNUJJ ”=ÿÂÂB+++ÜG>CYœlúEi$€ëççÇO~Ð ™žâ?U“Uå°aÃú÷ïyöìÙK—.ååå¡oŒ®2±ÃæØ¸qã’%Kê=²ðQ ,„f…‰ƒ††¬y///'P‚øäççoÚ´É××—™µ>|øÁƒïÞ½ËÒÚ_`|#ÛÌÓÓÓ+++Ñ1ëÜ{õêekk —·oßþé§ŸfÍš¥»uñøñãûöí#wØHlsrrHÃgnnÞ¤ýU¼KII ’hþ|+>GZZÚ¸qãh}þ ¨FŒ‘¢‹ƒ\‚®ÀîÝ»'L˜pãÆ ”ÃÉ“'“Aæýû÷£`xzzÊårccc\ xÔ{ Íc•µV4ÓPQQQ5§†'–-'MštôèÑ¿ÿþ‚›èZ8Î;‡Ÿê® TBÍÊ Aƒt—ÕÔÔ K¿yóæ«W¯’…VÀü“1Áƒ;ˆh ×À/æYÜGÓƒûR©4&&øHºN:õ믿F›õÛo¿ÅÆÆ"PGGÇŠŠŠëׯã5É^+ø?dÈF"|çÎ2†PtM˜Ö+´Œ………$%›¿o ؤÏTÏ `¾‘í:tè°jÕ*òr$îªt¨ðëøñã_~ùeä*\“CŸ|„Ñk‰ŠŠBÏŒæ***ªfÖó|ðA—.]V¯^}ÿþ}²‰O,;v¬_¿~oak­ÅR’–-[6wîܸ¸8².E&“]¾|™,Èßß}x4Féééh˜˜¥î;w>xð š§ÐÐÐiÓ¦™šš’ûÓ§OGãµk×.8¾víÚÍ›7ñŽdûK»kÀ€K–,!ëºêUUU$Æ®A¥M¾ZQQQAAÜ#õš™ öZÑ<ùBK;-xïÞ½5kÖ ‹wìØ‘»b?S>!ô~âãã‘ãÝÝÝѨµëðɨnq¥¢¢¢¢ÊÎΣUA–––ýû÷¯‹M={öœ={öÒ¥K‰Q HjjjZZZPPÐãc»z› ›áÇ£AaÎöA4*++™¹6gggcccÐRFFPÆÉɉÜúà'ÜLHH¸téÒèÑ£É}¼Ëüùó}}}ÁX‰‰‰äà82ŠÔxå•W&MšÔøDRÀ÷ð×ä«%%%‘éKGGÇæÏ« ÚÜAƒÑûBò·¡¡!²±ß¯[ja–§§' ð3£RWŽZÑLCEEEÅÝÎ;wîØ±C àš˜èUÔuÙ«W¯ÀÀÀ°°0¸‚ˆÅbÀÊã¬F„ÖÄÀÀí4]UTT0 äææ†ž|IIIAA¸‡,++«aÆmܸüþûï}úôaKáÎÈ‘#{÷î ô9|øð±cÇÈŠa%±Â؈|CÒ!Ýà¿­­m“ñˆˆ@ähÛ¶m·­+|j+ûIê)ï"D~BV­•ŸŸŸîøðŸØP!˜Efë¡îÝ»?•á+R ÂÃÃi¦¡¢¢¢b¤P(@'d“ Ù~ÔéKccc€ SÏ“•ÚO%ÎFFFÌFuį k|o‡¬âºté’îƒãÇ÷ööÆ#¯ü±VKdff†,XàêꊷC×ä*~²“1::~zyyÕ ¦µìCK÷ð¼E¦•`\šc_À"FÒˆQu2]MW!ë °bÅŠ•+W^¿~œ¾k×®O>ù½eË–72™ýøTUU•––F3 #2ËF,<‘þpCK)C<¬Ö›b5m­G­z÷î ƒçaaaºÕ¾Í;ï¼£§Õ¶oß^÷YssóöíÛƒ7oÞl< _~ù寿þ"£ ï¾ûnsTݺu+==,n hþKedd4ªG¨fa cýìцè;00«IB™={¶©©iHHHPPA.;;»iÓ¦Ù™B‹|ÿÈ×B›(Œ¹jÕÌã²è ±U/ܼ¶š«©iŸÂb56[ÿ^ÄŽEÏA¤zzEžÃ …­?¼?‰D¢ÿU’\nKÍ4 æ¯¨¨`êmhhø8ËßßmЕ+WÐô ·?wî\g„…æ)11qÛ¶m¸³qãF™Löæ›oÖêówëÖíðáÃpíÚ5üZïÞ=´€[µ"‰öÖ[o‘cèH( E¬¦¦>“ÓS‚ƒƒ™…öÍ#(..¦9¶u–••±Ò†¬Loz$aà’‰‰ )"ಚ@ @ äÉIºÓÒº§<’Úþ—••![7¾Ÿ¹³°°†¦šy–BÍOÏwÚ^8ÀB[#QqŒZÖyB¯¯ •+‘/”O‰hI}ø´Î#`³Tr…RM›¦z'Y[[“+BYYYè6뚃"xá'ƺ¾¾~Kí^‚®˜£iH·ßÞÞþq"?zôè7nà¥4@OOO& ÷ßï²oß>¼Å¦M›RRRæÌ™£Ûý`!bùùù =zô¨årrò?þxþüyÒÆ?~Ö¬YMÒtöìÙÛ·o#Ítw>6Gí´¢9¶u>dïÞ½ñQÁòæææÀ,2 ¬~ Ó.ÖB%f¢°Ö8°.„ýë¶ÍŒc£;–——ôïß¿qû¹(-¡¡¡M‡ÍêÚ}HiI—FNEx¾…„577ãqŸëÓ“Õ½3ÊäjûLpt€Y|K¡µpCõtäââBNG&Ó…qqqÿZÎîÝ»—””D†sPK˜šš62'@º¾u}HKKcŽj …àžÇôRh‚‚‚ÀXyyy¿ÿþû²e˘Ÿð²‹-‹ìÙ³o}êÔ©èèè±cǂÜYÚ™ÄìܹM ~Õ¬ôôô'N:tˆØ²Ç»L›6mîܹ$Yê¥+†ºŠŠŠvïÞMÌ®š9£Â/RVVV÷»P=MÀ‚|||o233êøHdt8¢¯Cµ`ëév©u =è¶ý555‰¤ººšô·,,,€NNNMZ`Z53CÛÛÙÙÓ ž ¼½}œœ?|ZÙ Ý[7oZXZzyy‘ùî§0ŠÀa z4'P=ùúúZ[[ƒÈáƒèŠoÛ¶íÓO?E‡œqûã?VUU‘]o <ÅlЫ‹u;Õ@x‹ª›ŒÉd2Ð Ýcz)@ðÆo€œ¤RéÑ£G{õê5xð`æWôÉ.\ˆFaË–-hsrr6mÚl"ö†ðq#»?€åîˆ m¨R©Äë¿ûî»cÆŒa4l¼-ûí·ßbbbÐàz{{7g9|]ÀJMM¥€Õê‹ä'_­((?%%%eZ!»£DÛqÈ%Ìyd”‹Øa`‹A.]öj)‡Õ%'Ý b­Jù@(¥(‡øKÔ㯱±±™™xÑF«æ[¶…oxÙÍyS=1˜û /.‰Ð#{KKËAƒM:•kr¢ÞîÝ»—x;sæÌ‡°¤Í®­°tIËM+RN@-•••åZá%Ø[‡€5pÌ"[$8ÿ/B`õZ­Û›a=8lœá§ºÄr.®‰;"„¢Bv7Ó äæC¼8J8ú"d¦œŠŠQaa!º†¤SþTö·RQ=õÎØ±c@( €RTTÔ½{÷ÈÁɨŸqAè ÿD3º n°eÒžøý÷ß“.:GƒBØ‚8µøûû?¾“v½óÎ;x‘øøx0âêÕ«×®][ë @Ÿ•+WÂÍÉ“'¯_¿ˆ$gãQÒö!þˆ0êôç]]]»wïÐüÕcwïÞýöÛo‘nðjôèÑLjwA]UUÕШ!U«,]!h¥»ˆC,/ÌÂc‹A¦¹OÌ„¢×Ǫ•çjÝ×͵üB©C©Æ™²Ä?É}ÝéË/zÎU]effVWW“õ ô´JªSÀ…9sæ¬Y³$A‹L œ1¦€Ú=pÆ{ï½×¸ÑKBfD¨Æ‰ŸäŸ(n¨ŠçÏŸO<=V¡i[´hÑG}:¹víÚªU«V¬XaddT ƒ‚‚:vìXPP˜˜‡Þxqq1š<'±+„ÆnüøñC‡õôôl©¹ì¤¤¤åË—£†AêuêÔiîܹ7F’’’œœ}X²d‰îò2&¶vZ‘‘92‚‰D¸öóó«»°9Õ ‚K¤¸~èJØ¡CšQŸmÀú7"cË­3±Ð8{öììÙ³i¾¡bTRR‚ž%2-jvt[{÷îMÓ„ê…UHHˆ¯¯ïáÇoݺuÿþýÊÊJfk!ˆÄÓÓsРAǯw%«™™×ÔÔÔêQ€kxÊÝݽÿþ#FŒh2lmm2ðOᑆƊz˹¹¹¤ko_\;räH¼Ëúõëá-«¢¢âÓO?ÅS}h:PÀj*))¹}û6Mªzó†T*¥é@EEÕj•‘‘NÓ቉N¶@žZÑt ª+.—K穨¨Z³ªªªŠŠŠh:PÀjª®®.))¡Ë°¨êŠÚÁ¢¢¢jåj§M‡'&:EØegg=z”¦U])•Jjñ„ŠŠª5«¨¨(55•¦ÃÁjÚhEÓJWàªÛ·o šTTT­yŒ€Eº<1QC£-L&‹Åæææ4)¨t•““# iÆ ¢¢jýBº˜á‰‰N¶@{÷î¥é@UKŽŽŽ”®¨¨¨Z¹Äb1µ•M«•ÊÝÝ}âĉ4¨êjÇŽÙÙÙ4¨¨¨Z­¢££?NÓVk—Ë …4¨ê*>>¾²²’¦U«U§NÆOÓVkTzzú®]»h:PÕÇãphi¢¢¢jÅí=‡ƒšŠ¦¬Ö([[Ûàà`šTõŠ.¥¢¢jͺyóæÎ;i:<¹Ž÷³þr¥ªL,/iN)±0ä›òõõ5iE3 U]©T* XTTT­YAAA¾¾¾4ž˜ž±,àTi•,.§òøÝüÍçÒVþðå¡Äí—2OGž¹W¸óJÖWG“–HX,i_Øýû¥56ô¬¬¬Ý»w³´ÖDNŸ>ÍÒž@wìØ14®b±øøñã•••¸>{ölNN~ ÇÅ-­pwùòe✱´HŸ h\ˆD"¼ü¬y¤<ÒÉÉÉ$h8@ˆÌ·«©©ÁƒHCxE‚&‘‡QQQÄDƒ¼>ùvHy¼,Ü#éðú7=ŠûäÛî½{÷XÚ^Läñ .ÊÊÊg|}„®›ñà@7ãݾ}›Dÿ¼téùväõyxE2Þ‚¤<^?33“ø€ÏM"O¾Rž|;’ñðÅ42þâšÉxÌ·c2Ržd<øL"ð¥je<&òˆ'‰<| G2>À“ñà éF6FÁóZåŽÉxˆùvHa’ñæH@¤?¾óúˆ<1ÈŒ‡Ç¾ ZׇºÉ6øúIII$㘌HyD A#ÏÓÇ“¥{ŒpÌDž|;&Ï#o“ŒÇ¼>².$‡ŸÀ ‰üµk×H¶A®_¿^«Ò@*á)<‹t Aã¥I7ã!ÑÈ·c2âF¾² âŒd'Y>Jƒ|;8Æûâ"""‚äy"’mtËSãÁOy|VR_!µ™ŒÇ¼>‰<¾ÞO!hdPC±É,Ñ¢È7þx-÷M–‚Fæ†z¸_P!]w4)ÀÉ´¯•«•Çû(”ÿ÷”X¢R(Ôú|ŸËV=ê%ø< w8"wÙ+~xš¨‰>úè£Y³fyzzÒ¤ ¢¢¢¢bµÈÖ™èÂMgÒ_íî4½Ÿ³›£h˜® ¥R3bdi¤Yü4ÐßvíѤ¬âê*‰âçóéÃí¦÷sñ´rØšeU ]1Oð9ÆB.Ÿ÷è銥Çêæmîic¸û*=š—ê‘ÉÆÆF  û'¨¨¨¨¨þQsG°.ƾW¸ø¥6fF¼–ÎÙñx¬Kq%bŠø<Ž£¹àþ.dÖïá¡’­1XºêPÂŒ~®î6†4Pý{Éd2>ŸOÓŠŠŠŠª€u+µtïõœOFûZšè=ñ¸,±D)SªM 4«¾žºí-0ßï¡Y¶fúCÚÛÒL@EEEEEEõhÕôab®h÷Õì†{>4]±4†²XB}®™°UБ©_*–Ó@õHtãÆêêjšTTTTTͬ¡™3‚Ý\¬„ÿr^O©Òü×zìÆ[éUTSÀ¢z4Ú³g9IŠŠŠŠŠªiÀRif9mLŸîª©Ç!sC¾D¦¤9€ê‘HOOÚÁ¢¢¢¢¢j.`‰%J—õ\6>¯¯TÑ“/©èªTTTTTºjÂШH¢0àqŸKû‰6+§¬æR|±×ÂHÏÆDßXÀãq9ÔZ$ÕCHñüñRQQQQ=^ÀÒç>Ì¡R²@Tݽ,²ŠjXjuI•L³‹Í2p ô- ºz˜Û›S³FT͕ǣé@EEEEEÔ„™†ˆôòÛ©åï tSï¾ûnMM͈#(`QQQQQ=*5=ó§R³Œ¼«I%Ü̇Z«TõÓUiiZ2§ŠŠªÒÒRWWgÒÞ¨TêÔÔLǼ¼¼ââb§¯¯ÆU©Tš™™9::fggWUUý–JellܦWQQInn®\®Y+£§§çééal,DÐEEeI³³ƒR©A%™Lž““ãêꊋ´´T©TÆøceeiffžžžŽk}}¾Z­™0ÂOmÚ´144¨÷-‘Í'‡ÒÁî佂Sšoˆ€GW¯^mß¾}jj*À×C† ²lݺuøðáo¿ý¶M·nÝ~ùå—aƱð)¹ZÁÍ’%K¾ýö[PQ‡7 _NNNþù'rêÌ™3 „5nÜ8d›ÿ!¯V¸€ËÏ?ÿ>­®\¹Ïù|þ×_ ŸATÈl …øµoß¾°°° .€Þp±víZOOO2rvñâÅÙ³g¿õÖ[|ðÁC'r5æNEEEEÕ,ÀR(ÕàªsQ…öæßOë`k*hhŠ€…ììÙ3¿5eÊäŸþyôèQhqª«%S§NÞ¶í·ƒøíÀ~4±YY™ÎÎÎ –þýûOž|xÚ´iÿý7Áë¡C‡Â1àfñâÅeeeà0•ö“€™zõêÕ¶m[|A@ |çjô,CÓ§O÷ööÞ»woffæK/½DV¯ãë»»»¿óÎ;~ø!òŸ‡µ¸¸˜™Ph°oß~ccãÿ²w&ÐQTé¯îªÞÒÕ¤³ÑM6 K4¬q˜@" àFŒË<f|Æx|Åqá¹á2ø΀ðtÄÃãÀ(²#0‰&BX²ot'ô^5_÷…6f@ ™Eáÿ;À©º¹uëÖ­ ÷GÝ[_±!™LŽŠ**ÚIãëìÙù¢(®Zµº³³“FÜÞ½MO×®V)tj¾ÙæŽÐ¡ëÐ=-..~饗H”i—‡|åðáÃkÖ¬™0a©ÏÞ½{m6ۻロ™™ùØc•””PûÓ"UZ¿~}uu5ÝÇýû÷Ó½NLL¬¨¨¨©©ÉÍÍ=xðàŒ3Ƚººº¨ð7ß|síÚµñññ›6mbs‚Œ¹sç~ñÅùùù”™ŒjãÆ$U¤zt÷™f‘-íÙ³çСCtÇIÂ.\X__O'Ú¼yóðáÃM&“Ñh|ê©§¨aaaï¿ÿ>%ö¥5ÒÓÓÑ%\G°¶~Y÷e•5\ þ"'s7b$J%ÏæN×øñÙ$:Ï>ûìúõïf„”’$+•\Hˆ:4T$ï1h(Ôpe+dBa¢H»þ”à4 ¥s[8Å5j÷îb‡ÃC…O:­¹¹™ÆÝÅ‹Ÿc«˜ÙeµZ&’f±Ã©IâBCõ´M?Òé´T½ëô£šÚ6‹hkkËÎÎ;v,ÛMHHÈËËs¹\………o¼ñ¹uú)ùÍŠ+Èu(=##ƒ8pà¤I“^xáòÒš9sæ"S:iÐòåËŸþyÊ3oÞ<*–Ž¥”ãÇÓátŠàÙÉŠ6lØ@îEjE‡Ó‰ž|òIJ7néËC„òÐÆôéÓ©Q5RSSÙ[„Ï=÷œÙlÞ¹s' )àüùóûÒV«•ª„eX=#¹{}Òÿýñ¬Ý!=u_²^Ç“ŽÜÈÂr—eË–ïÚµóOútóæ­¿ûÝ{kÖ¬ÍÊ»lÙ2ÛÒÒÒ6lø`̘”óìÙ ÷ß?qëÖ¢¡CS9ÿRå¯ss' 2”'I’Ünw^Þ£yy?_°`ÑæÍ›fÌx80Eèüì³?Ïš•ÿÌ3O/]úÚÙ³gçÏÿÕ¤I÷Ñxl2™rr²Oœ(­¬¬¸ûîÑS¦L#-c´žyfANN՟繂‚ÙƒqÅŠßô1$]æŽc N¯wFf,ºèÎâÅ‹,XަÀõx‚%Éòë;O™Cµ¿¼7‘…€ê´9®„„þ/¿üÊâÅÿ3|x†F£¾VVY–4ÍøñãcbbØäNrrR ] Ñ™Íæ²²²?üáÃ+ÞùÅ/fÒýs‘Ãòó ž~ú¿ûÛÕlJQ’dQ'L˜ ÕjÉÉ<Åbþ§´¯t;%ôЃææfDrpuÁúý¾sQ¢¦ 'ñ\]™J˜9óñÝ»‹-ZDE]kêÄëõÆ‚‚ü˜˜èîédHcÆdú§¥¥­\¹ü&õïoá®Ì!.Y²dâÄ ¯¿þ:ùX™Ÿ?«û!wÿð›¦Gbtú èùI”J%ÚãÛ!áÏå-ZùÙ‰²Ô» N5² ¶÷Ö[ËNœ8QVöWµZÕ-£Ü=•Ûí®©©kiiohh©¯onn¶Ò,FçWTHò4ož‰Lp ÓjUo¿ý›íÛ·;wŽÆ6Êïtºý‡³rZZþ)_lèpÆE„p²6Ós©ÛK‰xWÿö÷Àwþã}ÙÚ;ŽÕNNQñ o¯–“å°eé<ϳ ²ŽØX󫯾úÈ#y˜ð̨jµ:¸«Ñhl¶ŽGyX¯×ÓEÖ’˜˜¸eËv- T ÿw—Å;ךּ瞜’’?R66'èóq£FX¸pÑÒ¥¯ÊT54ÔO›6……ip¹\)))EEÛÙ’vž„>ëÇ/…2gsøÌ&ÝÚuëJKËèBX‡ VPP@Õ(..Þ½{7U>PCŸÉdZ¸p!]ã‘#G>þøcEJ ™7o‹¶|ùò€q*XQsæÌ¡Ò:::V®\Ɇ\Ó3yòdÇ|õêÕUUUì¹å¿ë®»üqÚÞ±cÇáÇ)Âl6Ïš5‹jrôèÑ]»v±›t N÷ÄO„‡‡“˜nÛ¶R˜³ÒŸS¦L0`€Ýnÿ裼^/«-mŒ7.==6>ùä“ÆÆÆÀíó_Ý Aƒ²²²¸À×iª««é~O““CVTT?~œò³ç—T76‡[__ìØ± .Ó-3f UéÒ¥Kt t"J§CH[©)úõëG)'OžìììäQh)=!mŸ:uªµµ•µ¥S!l…;Õ³®®Žò³«¦§K£]ººššV>AñññTsjɆ†*Aqrzj+:–œÒÙ!´«@§ {D÷%xiìíHüƒà²6°ÿy¯Þ{6)Jÿ]1½[FB£ Ž.—Ûd s8\´\íK_SSKx¸I¥Âäkoo ží¶µµ9Îàc,iL¥áІêÐP#{.@#Ws³¥ÑšF5–N'õù<­­íQQQ,^ý(Xš‹™e³Ùì4 b_ž2¡}}ѾùHÍ’Ÿ§Y©ÎW‚^ÒèKÒÀb ѥѬ苅NM‰ìK,r€@P.3‹Eãý•g~2EÖ%Š"]ÎùóçérX~j jºLÊvæÌ›ÍÆ{61Jê@é.\ ¢˜_ÒáF£qÈ!´K6SYYy%è«DmÈÂoZ­Ö¯¾úŠ…´`1b•x¥à³`HO2áÇÓ)èXJojj¢2i;°Z.™Šâ_ $çc§¦:Ó¥Mœ8‘®±¬¬ìСCW„ØG'>}:¹ÙØž={˜V2w™:u*5õ„7²x°Õ´’‹ªôᇒèPN¦¡™™™,d¹`yy9õ ö†U)??ŸÒ©ü}ûö±7¨Jt]sçÎ5 'NœX·nÕ„µ6U °°Úœt“Ì•zkXúÑÌ™3éê(åÅ_$—ºò†¬“.!77—2¬Zµª´´”™.µFhhèk¯½†·|+Xþµí;NÍÌJ´„k¼½b@0žo7‚îÅ>bÈäæª»=`QÚ»Âü†MÄuO§sÑ/¶ÖªG9T~0ûQ_4(œW’_ÜòÍÃ?‰½‘ÜðýÏeè·Ç+u:½¢Úׇ×ã‚ËzI—¿Fëûw»§÷àªÙè\ìtò÷ëêcì+²+%Ï­Ýw>Å,®p}y ßm]ÀkÔ ¬Óý{x¥ß®6~QÓÔáxtl×Åÿ«±Ý!ªÑWižsz¤÷>=ç•| §¤¨¬bÀ –FÅ»¼>´EwØ¢®F«keÉ™ÔXÃe%¡Mp‚eÓ¶u"u·Fü˶>ùKã¾ò¦)ÃûeŽB›àæK¯åy%×Þé |·ýg`¨)NÕuýÿóQFõâ™0y €^–ŠWŠZ¡Éî Eîö,çêÚ\+KNÏÎĬþ€^pyÕvB”îð©64‡$qz ¦Wß™ˆp è›`=a.«µ]lqüí-X2* qº’èè“`é5ü„¡Qªá¾¨v_zÌÊV—GBÿ@ï‹ø¡ÑwÓ¡Zr,AànÛoªy½\btˆ%L{ðt+úú$X¼R1ÿÞä«ãå-å§êºxá¶~”•#¶ÚÝèèB÷“¨.œ<ðh•õ÷û«“£Å‡2cÃE!ø½¿Û OV(èèWyH5*9ü×¥EÕÿ[T¾ùpÓ- ‚ÒPàæSú?~|Ë«GU£=!R‡þ€^ ¯ý…gk—{Û—u§ºF%›âL:“^­×òZ/ðJ­Z¡ànÍC“G¶ÚÝ+öT-ȽèÐEð,ÆÅVÇç--v—Í᥼j^鑸£:|‚Bq :– pŸ—·ž¼ÐþËû’Ñ?иnޏÝ£cãØ¶O’íN¿f½SræÐ™¶¬Ôï­ø Ããç­‰ã€^rs/ òJEXˆ*\¯ÊWr²Ñçó¯Çº¥|Sછ.Õ[wßaBçÀ¿B°‚¤ô# êOËš”·Päwÿ[ƒ2÷Á “2ú ¼ÿRÁ"¦î¿§´ñb«C¸U‚ó<·ûd£V¥—‰ž€ƒ`ÅGêÓÿí]§Ú]·€cÑ%´ÚÜ{K›ž—€n€`™w˜~6ÚòæÎʦv7 ÊtVM°«æ÷[ŧï¿3:&Tƒn€>Ù…Üç@ *[¶©ûé È{Óc :^òqR¯ŠT(¸›ªËÍæ¿*$… %w°ÒºéÈÅGZÆÆä ~‚ÅB’nù²îL}göà¨ì´(­Æÿ,ëM‹)ÕÂí•U¼â?Ë£TRá²À+|¾^j;¯Ó-pàü¹–Ks' ˆ@èvü`‹Qkun=RÛlsÅE„ M3êuÝ^2”/›â»3‰]ÞòZûÉóUM³Æ' Ž5\7¶–?hEëö£uŽ´ü45âò7»]Èw QS*8öæc³Í½ÿ›–¯ÎYYÄÇÆÆ©ðÚ ~€‚Åh²¹J/v”×tÖY1¡š¤h1Ò  ׫Buªp½Z’åêæ®ŠZ{‡ÃKbÔØáìryû…iïL¥š”œl\ò³Á*^ᓾϮڻAÕ“d3zøñ7MméEUœÕIEND®B`‚gnss-sdr-0.0.9/docs/doxygen/images/SignalConditioner.png000066400000000000000000000317241305042567700232730ustar00rootroot00000000000000‰PNG  IHDR(~EêF AiCCPICC ProfileH –wTSهϽ7½Ð" %ôz Ò;HQ‰I€P†„&vDF)VdTÀG‡"cE ƒ‚b× òPÆÁQDEåÝŒk ï­5óÞšýÇYßÙç·×Ùgï}׺Pü‚ÂtX€4¡XîëÁ\ËÄ÷XÀáffGøDÔü½=™™¨HƳöî.€d»Û,¿P&sÖÿ‘"7C$ EÕ6<~&å”S³Å2ÿÊô•)2†12¡ ¢¬"ãįlö§æ+»É˜—&ä¡Yμ4žŒ»PÞš%ᣌ¡\˜%àg£|e½TIšå÷(ÓÓøœL0™_Ìç&¡l‰2Eî‰ò”Ä9¼r‹ù9hžx¦g䊉Ib¦טiåèÈfúñ³Sùb1+”ÃMáˆxLÏô´ Ž0€¯o–E%Ym™h‘í­ííYÖæhù¿Ùß~Sý=ÈzûUñ&ìÏžAŒžYßlì¬/½ö$Z›³¾•U´m@åá¬Oï ò´Þœó†l^’Äâ ' ‹ììlsŸk.+è7ûŸ‚oÊ¿†9÷™ËîûV;¦?#I3eE妧¦KDÌÌ —Ïdý÷ÿãÀ9iÍÉÃ,œŸÀñ…èUQè” „‰h»…Ø A1ØvƒjpÔzÐN‚6p\WÀ p €G@ †ÁK0Þi‚ð¢Aª¤™BÖZyCAP8ÅC‰’@ùÐ&¨*ƒª¡CP=ô#tº]ƒú Ð 4ý}„˜Óa ض€Ù°;GÂËàDxœÀÛáJ¸>·Âáð,…_“@ÈÑFXñDBX$!k‘"¤©Eš¤¹H‘q䇡a˜Æã‡YŒábVaÖbJ0Õ˜c˜VLæ6f3ù‚¥bÕ±¦X'¬?v 6›-ÄV``[°—±Øaì;ÇÀâp~¸\2n5®·׌»€ëà á&ñx¼*Þï‚Ásðb|!¾ ߯¿' Zk‚!– $l$Tçý„Â4Q¨Ot"†yÄ\b)±ŽØA¼I&N“I†$R$)™´TIj"]&=&½!“É:dGrY@^O®$Ÿ _%’?P”(&OJEBÙN9J¹@y@yC¥R ¨nÔXª˜ºZO½D}J}/G“3—ó—ãÉ­“«‘k•ë—{%O”×—w—_.Ÿ'_!Jþ¦ü¸QÁ@ÁS£°V¡Fá´Â=…IEš¢•bˆbšb‰bƒâ5ÅQ%¼’’·O©@é°Ò%¥!BÓ¥yÒ¸´M´:ÚeÚ0G7¤ûÓ“éÅôè½ô e%e[å(ååå³ÊRÂ0`ø3R¥Œ“Œ»Œó4æ¹ÏãÏÛ6¯i^ÿ¼)•ù*n*|•"•f••ªLUoÕÕªmªOÔ0j&jajÙjûÕ.«Ï§ÏwžÏ_4ÿäü‡ê°º‰z¸újõÃê=ꓚ¾U—4Æ5šnšÉšåšç4Ç´hZ µZåZçµ^0•™îÌTf%³‹9¡­®í§-Ñ>¤Ý«=­c¨³Xg£N³Î]’.[7A·\·SwBOK/X/_¯Qï¡>QŸ­Ÿ¤¿G¿[ÊÀÐ Ú`‹A›Á¨¡Š¡¿aža£ác#ª‘«Ñ*£Z£;Æ8c¶qŠñ>ã[&°‰I’IÉMSØÔÞT`ºÏ´Ï kæh&4«5»Ç¢°ÜYY¬FÖ 9Ã<È|£y›ù+ =‹X‹Ý_,í,S-ë,Y)YXm´ê°úÃÚÄšk]c}džjãc³Î¦Ýæµ­©-ßv¿í};š]°Ý»N»Ïöö"û&û1=‡x‡½÷Øtv(»„}Õëèá¸ÎñŒã'{'±ÓI§ßYÎ)ΠΣ ðÔ-rÑqá¸r‘.d.Œ_xp¡ÔUÛ•ãZëúÌM×çvÄmÄÝØ=Ùý¸û+K‘G‹Ç”§“çÏ ^ˆ—¯W‘W¯·’÷bïjï§>:>‰>>¾v¾«}/øaýývúÝó×ðçú×ûO8¬ è ¤FV> 2 uÃÁÁ»‚/Ò_$\ÔBüCv…< 5 ]ús.,4¬&ìy¸Ux~xw-bEDCÄ»HÈÒÈG‹KwFÉGÅEÕGME{E—EK—X,Y³äFŒZŒ ¦={$vr©÷ÒÝK‡ãìâ ãî.3\–³ìÚrµå©ËÏ®_ÁYq*ßÿ‰©åL®ô_¹wåד»‡û’çÆ+çñ]øeü‘—„²„ÑD—Ä]‰cI®IIãOAµàu²_òä©””£)3©Ñ©Íi„´ø´ÓB%aа+]3='½/Ã4£0CºÊiÕîU¢@Ñ‘L(sYf»˜ŽþLõHŒ$›%ƒY ³j²ÞgGeŸÊQÌæôäšänËÉóÉû~5f5wug¾vþ†üÁ5îk­…Ö®\Û¹Nw]Áºáõ¾ëm mHÙðËFËeßnŠÞÔQ Q°¾`h³ïæÆB¹BQá½-Î[lÅllíÝf³­jÛ—"^ÑõbËâŠâO%Ü’ëßY}WùÝÌö„í½¥ö¥ûwàvwÜÝéºóX™bY^ÙЮà]­åÌò¢ò·»Wì¾Va[q`id´2¨²½J¯jGÕ§ê¤êšæ½ê{·íÚÇÛ׿ßmÓÅ>¼È÷Pk­AmÅaÜá¬ÃÏë¢êº¿g_DíHñ‘ÏG…G¥ÇÂuÕ;Ô×7¨7”6’ƱãqÇoýàõC{«éP3£¹ø8!9ñâÇøïž <ÙyŠ}ªé'ýŸö¶ÐZŠZ¡ÖÜÖ‰¶¤6i{L{ßé€ÓÎ-?›ÿ|ôŒö™š³ÊgKϑΜ›9Ÿw~òBÆ…ñ‹‰‡:Wt>º´äÒ®°®ÞË—¯^ñ¹r©Û½ûüU—«g®9];}}½í†ýÖ»ž–_ì~iéµïm½ép³ý–ã­Ž¾}çú]û/Þöº}åŽÿ‹úî.¾{ÿ^Ü=é}ÞýÑ©^?Ìz8ýhýcìã¢' O*žª?­ýÕø×f©½ôì ×`ϳˆg†¸C/ÿ•ù¯OÃÏ©Ï+F´FêG­GÏŒùŒÝz±ôÅðËŒ—Óã…¿)þ¶÷•Ñ«Ÿ~wû½gbÉÄðkÑë™?JÞ¨¾9úÖömçdèäÓwi獵ŠÞ«¾?öý¡ûcôÇ‘éìOøO•Ÿ?w| üòx&mfæß÷„óû2:Y~ pHYsgŸÒRÕiTXtXML:com.adobe.xmp 5 2 1 °ã2Ý'XIDATxíœSÅöǽKV 4éMš‚¢ô‘^¤Hñ‰¢"EDŠ Š‘& *ÍBSAšKQ”òDlH}Ò{þó›eÂM6Ù”Íî&7¿³Ÿì-SîÌwn2çΜ97C‰PH€H€H€H Œ¤ £²°($@$@$@$  PAá@$@$@$v¨ „]“°@$@$@$@TPx „*(a×$, Þ$@$@$@aG€ JØ5 D$@$@$@…÷ @Ø ‚vM‘ ¤$;wî”Å‹GR‘YV  Hq±±±R±bÅ¿n(/Q#(PNÖ¯_Êú3/  °ô“vx˜¨ÜAõêÕ“1cÆØêfbeH€H€H T†ª¬R5ŸˆAIUR¼8 @Š ‚’b¨y!    PAñ—ã‘ ¤*()†š"  ð—I1 @Š ‚’b¨y!    PAñ—ã‘ ¤*()†š"  ð—I1ž-\»vM~ýõWùí·ßäúõëAÕéäÉ“rèÐ!¹zõjPéÃ!ÑÅ‹åÀréÒ%¿Šƒø¨³Ãáð+~$E:~ü¸àC!/TP«=Xšd"púôi0`€äÌ™Sbbb¤hÑ¢’#Gyúé§åܹsΫ®^½Z .,ëÖ­sžÃÎåË—å™gž‘’%KJ¾|ùäöÛo—Ì™3K›6mäÇt‰ûÁè<ìrÞÌŸ?_‡ÿý÷ßæ”sûùçŸë°&Mš8ÏYwºté"UªT±ž hîܹrÏ=÷È-·Ü"%J”¬Y³JÆ eóæÍó™9s¦TªTIÇGóäÉ#7–~øÁ%>‚Êvá—0üóÏ?:ùA !¾õS¦LiÞ¼¹Œ5JΜ9£ãYÿÝqÇòÔSO‰i#kZOûxw—‰ëÞž(oß¾}u;æÏŸ_ðAýpÎz?àú¶'\Œ{*9W§N]-O §H‘"R«V-yå•WüV ­œ¸Ov!q®îížõH9xêoÙ²¥|óÍ7úG¿FòË/¿ÈÊ•+eâĉòûï¿Ë‡~¨ „N㯿þréðtݬY3A‡7pà@©[·®î¨M~èp6nÜ(eË–Õyœ?^ç1aÂiÑ¢…T¯^Ý¥²&ÜÓÎôéÓõ(ŪU«dÏž=Rºti—´½ñ¤Ø¸DòrЧOyûí·¥S§NòüóÏË­·Þ*kÖ¬‘÷ß_êׯ/Ÿ}ö™Þ"9˜õèÑCfÏž-;v”gŸ}Vwà;vì3fè:½û’™øà†Ïˆ#4gpãêŠ0Óù#ãº`¹wï^Ý&S§NÕmrï½÷ÞÈAt|(:Å‹«ò‡v™3gŽôïß_+]&A¡B…ä?þÐé¬#E z衇ô(ÔÚµkë$›6m’×^{M6lØ ïbÅŠéó¦½ümO(h¨î(Ãî’+W.}Êœ={V>þøcyî¹çd÷îÝ¥’BQI@}I"F† âÀ‡BP=æ%Ó¦MKL=±ë05å£Ã–-[¦•‚àŒÛ¯_?‡ip(%ÄyÎì9rÄ¡žz52§j”@硞„JÁp¨Îц¥$èð?ÿüÓå<òÊ!ƒcÞ¼yŽ 8T玃‡~Ø|•O?ýT_óÕW_MôðáÃŽìÙ³;Ôè3LòèøJsž3;ªuÜwß}5 ã8vì˜>­F<œuN—.cûöí&ºÞ*ÅJ‡¿ñÆúXuâúX).ñp ÍMuî¥Ð8ÃÕˆ•£{÷îÎc³³páB—%1§œ[Oí‰6Ï›7¯ã»ï¾sÆ3;8‡0Ä1h{*…B—'..Îdáq›$¸ÿþûiÒ¤q(¥Ìczž$oìÒWrŠ'*ÕÒ誴ê€u…1¥ã.£GÖÃúxz÷$°UyçwDuŒb†æ­ñ”"¡Ÿæñ„Ž'm«¼õÖ[²oß>Á5ü<)cÚ¨uëÖÒ®];QŠŠžZò'­¯8Ç—R¥Jé)÷¸˜R˜2eŠ`Š£3í@ü *èQ÷øÙ²eÓññ¤?~üx—`L‘`$ £/W®\q ó÷#È#¥ ¥lÛ¶M>ùäÍ¡|ùò ²Æ9L#!âZ%Ðö´¦ fSoªrŽ:“Ó@$ ‚ɭDzûE jÕª¢FdРAz*àÔ©SÎtèLÑñ¸O¥˜˜ºýI·nÝÌ©[ضàõæ°ç° :xLEŒ7.͆5žÙ‡}”“,Y²èiL-a¨?©Eâûï¿×Jz"÷˜l[–.]*P¸`DŒ)°Äê|çw ¦ÊPo«¨ ™5k–žžB½ƒLÁd̘1}O°ù™t¦¼‰ÕÍ„™¸&m íiÒ»ýú믵ͦª($hƒ­euÎ;·À¦£wïÞºÓM›6­-¨W¯ž¶M„7Ù¿¿‚A©U`§à>BP±bEQÓÖh2lØ0Y²d‰Qزe‹¨é—psû‡ŸþY`{©\¹²îœ`ïѶm[-¨-Fq 02õGPˆ{ÝÓ"usá¶#GP¸¼)îé¬ÇP¤`#ƒ•F¡Ô #@‰uúCÃÁz}Ûi0ŠÅØ] ´»„©i%g»ã£y0îÅõaPM!h%@%Z[>Êê CH°uíÚµzÕ +ß|óMiР( Ý)¹cÁh :ËL™2¹ÁèÖ:ƒ@(A<ð€K<¤ÃÈ®?iÒ$=ŠãáÆ‘Ûn»M 4éСƒ¼øâ‹zªCÙc˜Óo(¦ ü³|Ú›2eò@8–m{Êåþè£t'‘€`y{êàƒÉˤAÝ|Õ qÇp0i±õ·=ÓEž¡‚ "Ø)XAµk×.ç1–tcSûöíõŠ+gwH ÊPA‰²æêBÑÀÈ>tÜP°¢å…^Ð+8ÜùÀnðÁƒµ ‡ LjY…ƒé“ÄFa0‚i \ÃúälòÂó¢E‹t‡hí¼P>\S&/½ô’‰ð«^ ˜ºñ&¨Ï‚ ôh ¦o ¨sb‚p,»ö4m[(fX…3yòdÁR å@KR3O×CÝÀÓgX.îI†8†ƒ{_íiâ?ñÄR­Z5sèu »e¼ì%˹¡ aå…¢‘@Úh¬4ë]þóŸÿhƒO÷ZãiÃíPB¼=åÃ~Â*ð§‚©#|)cN_2fÌòѳgÏ#Xæ [øÿÀȃù¼üò˺ÜXêk”!_×ñx’÷4câc Ó`‚© ” ‹7á1˜¡³ö&5Bç‹|¡"0R…’‚i³PŠ)obu3a5kÖôzéÄÚÓk¢0ª#Y(*ˆVTP¢µå£¨ÞxÊÇ(‡'gd˜F€ooö°§€¯øÇðd“¿P,| l°†—Y° Žá+¾FС[?j‰³öÓ%IŒÁÖÁ“O (Gjù¯ž’€;Lo`´v1PžÜŠ ŽO-gtv9†¡,F*àƒÅ_øA»a5S(#]øÀ š'Åç†8Öé6÷2$Öžîqƒ=6«ª‚MÏt$é8Åé-Èòû$йsgQ>P´—Rt¼°ÁÈ `ÑBAyì±Ç¼ægnx¢Åp=žœá¨ ”òõ¡Güµ“À1 '­ lÊçIà©ÓC°Q1Þe¡P¸è˜´Ê‹ö–kŽÍ¶W¯^ZÙèÚµ«^Ó´iS­”Á#,”8«S~;Lt=Ò³|ùr åEO·À†«žà™K“a7“˜˜) c›ãn¯¥ÏÔ«¥ H‚Vá<” P ìŽPŒ¦`ê ^[!Âýk"Ž/ñÔžÖ4_~ù¥˜%îÖóX¥ž¾×°EÁÇÓy_éNO@ý`DŒØÅùLÄ·QAáˆMÙA8Ò§O¯h©/®Þª‡pÖÔ“c/*›‡êÜjjÇ™ŽÃ”Cu¬eçá0ÎÝT«ãÀš»(ÃZíØ ×‡£6¥|8Ô´Š罉RR´78rƒ£6SvO[ÕÁ{ËF—Sùøp(wõ.y(›ÇÖ­[¤SÓJµÇ¡VÓ8ã«ÎÛ¡Œ?j$È%¾qÔæÉ"‚=Êûúë¯ëtÆI™µ(—šr¨)9‡²qÉ¡rÔ†¼Ž=êhÕª•vPgÊ ”)}aV ¤=‘Î8j3ùºoÕt›ÎÞ0ðä¬ÔT“f¦F±t|þ# Ø¥¯Lƒ «/PDÈСCu9ñK!``Jö0‚Ät†¯÷kàë‚e»xÚ‡íŠRxÜ£DÄ1¦2à” Ó(Mò%J9Ò®á1íàîïÅWÚp‡mÏO?ý¤‹x×]w – SH Ò Ø¥¯ŒÌ_×H¿{XþT#€©óΜ` +ÞVw“_j¥Áê|üÍZWù›.ÜãA! ÆOK¸×‹å#;àã‚Z‘u   › ‚b³euH€H€HÀ¨ Ø¡Y  °*(6kPV‡H€H€ì@€ ŠZ‘u   › ‚b³euH€H€HÀ¨ Ø¡Y  °*(6kPV‡H€H€ì@€ ŠZ‘u   › ‚b³euH€H€HÀ¨ Ø¡Y  °*(6kPV‡H€H€ì@ *_ˆ7³îÙ³ÇíÇ:¸À‹ßRë¥v¼¯ÜÃF‡¼¯lÔ˜aT•Ô¼¯Âƒ×¢D¥‚ådßC’3ŒW0 ˆ<'ŽÒ…N-…÷UäÝ3þ”˜÷•?”'P©}_ZÞÔˆ• @ç)#i 6H æ¼f2Èxam2åì¶¼¯üg)1y_EJKEV9Ãá¾ wb´A ÷bùH€H€H PA‰ÂFg•I€H€H Ü PA ÷bùH€H€H PA‰ÂFg•I€H€H Ü PA ÷bùH€H€H PA‰ÂFg•I€H€H Ü PA ÷bùH€H€H PA‰ÂFg•I€H€H Ü PA ÷bùH€H€H PA‰ÂFg•I€H€H Ü D­«û”j˜m>–ׇ?ê¼\–¬9$¦dy¤×KR²luçyì\¹rYú¶ˆ‘ÂÅS×é°¡=kÉ/?ëÏ æŸñ˜ÎÄÁö蟇äÉv¥¬§\ö‡LZ)žk%OŽz_*ÖxÀö×áýò\×ÊòÌø¥’&mZ;°‰3,mÚtRúžºr‹ÞRåÞfú|χ ˹3§œqÌNƒ¦Ýå±gÞ2‡Ü’ €OTP|"JZ„ë×®I¶ì¹dâû»uF§O“-kËÈ~ eøä/ä®òµœøæ«e’1Sù黯äï?þ+n½Cž›ð‰\UŠ dü3ͤbÍ&Ò¨e}œ%Û-zë)¸ñ/o"2eÉA}têÄ_2X)cgn•¼ÿºMŸË™§€4ë0HfM|B&¾÷ƒdȘIŸŸùÚ¹§ÖCR®JCùaû—¥dÚ'¿ê°Ë—.Ⱥe³åÚË;+H–¬ÙåÊå‹ÒwØ,)á¦xA)£ @ 8Å­ ã¦M—NräÌ«?·ÆÜ%±Ý‡ÉÝUï—§¿à’ãºå³åÁ6ý•ÒR[6~6_‡Ý’+ŸäÉ_XÒ§Ï(Y•RbŽ¡@<¥Ó7þ¥S×7ir)e‚­9‡ðæžä¿lÁk:|ëúäÀžmÒmàëúÿÒ¤I㬔›–]‡H¦ÌY廸Ϝqrç-$ ßîòA($@$@$*(Ð aܲ•ê˾Ýqâp8t®§N‘]Û×H­FJ­ûÛ9_— 6{¾éÓg>CÞ‘Þ}Yþ8ô“Ìy} t~âUÉ™ç_îQÇÿýé9óÏ )Q¦šó܉£¿ ¦†¬Ÿ+—/9ùC$@$@þà?”’!Îw×L“\¾tQBd‘¯Ôˆ ”–Üy Jõ±‚é(0îv*îE 6{>8¾³\ ©Û¤³ ëUKŠ¿[ê?ÜÍ%Ú¥‹çePÇ úÜ…s§åÒ¥óÒ¶çHɧ¦Œ@±1SDæÜ‰+¥X‰»Í!·$@$@$à“Ÿˆ’'ŒI )¡•\öjE^}>V_¶(WÍ÷© ›Î[­Úõ-Ÿ/™*í”.¦t¬’!cf=Ê‚s°G)¦”˜té]o¡§Ç.’2•êY“qŸH€H€&àÚ»œœ ‚%°yÍB)^ºŠN~`Ïv9väW0b®^-ƒ“Eï(+«M‘®')Û /l:™Ý8™ù†]Kæ,ñö-Ö¸iÕJSfëyî“ À¥‹äâ…³’3w~ °•‚røðamÓQ¬X±À U&°3Á—‚©‘/–N“m>’ÑÓ¿ÖçÖ¯˜#Uëµ”jõ[écü+_­±6Xݹy•s¯3ðÆN°éÜó åñ…ógäìi×¥Æé”‚e zCy­”ÊëÔ©S’-[6ɘ1cJ]RNûSú·þ·L^´O²ß’Gº7Î'•k7•§Æ.t–áôÿŽKŸfEdúò?UœÜâ¾Ì»àmÅ¥¶²ijªVheÈQþolOI¯¶îK¾±”½NãzÊñƒ·‡9ó·î+Q^^žg=%3&ô—µËfºœÃ¦ {~[Fô­¯îÝæòp»'Õ ´Z¹mÝm¨3þ§ï½&¾®ç^'“Ø,]Ÿ;y|¶øæötéÒK¡¢%u}š¶ÊDËmjÜWVþ°ÛýÍ:÷ÖôÏ¿¶\¯ðûuÿ.Y2{´¶¡ÃŠÃ[cJIÃæ©Õ†½­Ñeç–Ï”;ƒ–ÒiÀ½À®ùø½‚0¶Ç ÒªËóæ´ÞNÜZvn^)/ÏÚ¦FlËù¼Ç=Ýg&Co÷kÖì9e†Z‰øó®Í2²C]oóä¿UM}×”îOO–l9r¹„ñ ù ØJAÙ¾}»ÄÆÆJÕªUeÀ€ÒªU+Éš5kòSôq…SÇÿ”ŽõâË‘U-9.sO=yö•OÔù.µ4÷’lúâ}8ú—\`—RIuHWÍó¨ ›Îå"Ép€¥Ðî‚z ~õS÷Ós¼fÍéÑ£‡<úè£Ò«W/©T©R²—J-–mcköáSg‡ZŠ^¹NS}}sÞñû¿ð®î4®_¿.¿ÿ²Gu. •š÷µ_®î6m‡´W¯\’ë×®ÊýªCBYóñtÙ¾ñy~â } %Ó]®]»¢•¦ýÇ»™Ñ7tVÈrõêe¹vcßDöçz¾–®_½zE/…‡B¹võª|·õsyë¥.ÚŸP%µL>\%5î++ Ø9Ô}„•zãæì°&Õû¹òÔÛIÃÛ©{²™L†Äë‚Ñá¯ôÕSÀ°k3‚Õ†Xý‡+¬V4‚û÷צϸ((çÎþ#?l[#(ƒÊXG÷y{¸Ïn^状ïƒÿ(«¤M¿Vߔʊ‘“Gÿ1ê;4{Ò“ê»5ÇœæÖBàÛo¿•¾}ûê߯¶mÛJöì Gß-ÑÚµ•‚‚lÀÙ¶m›<þøãÒ³gO­°`¿fÍš Uäê ZË¢¸ø/—§ÿœ<ª^å±H?×ñc{ ×Ó6÷nW¶)yäÛÍ+ôBLíÙ¹ÑE‰„m¬:´ÿ{ÈrUïSÊvÂ×d$v{-ä€zuI`$nM“VYVÆ¿ZÔC1^9òÚ6²rádûkš`÷ËU¨.eKòåË߸Ü͇~œ0ÞÁlß{ï=¾C‡IÊÇŸr¯ÇX5eÈoŽì¬ßšS@/¼¹ZûIñš0DŸÌ/øXeþúsz«õœû~0K×ñ‚ÊÝ;ÖJãÖñvîy†Ãq8ÞWàâÎîìéÒ­QžÈŒ˜§l¡:êÕ†ÓÇõ‘ùSžÓ÷Ó¹³ÿ“rj¥Y+5Ò‡‰bén…®Ê4ÞÊ~]ýÆÁÆ*%ÊVÓv+å«5òºRÍßÓ¾·û q×-Ÿ¥?îél¼è~Êyœ#g>µ"ì{ýÞ1딩3B”ïÀþnìØ±Ò©S')T¨PHi¤QÚOüÄWH³MžÌ|Ù ø{U ÅÃV mÁÐNø{}Ä‹[»DæMyVaÁ쌴©žV†(ÿÅ•Å;ž0T=K½›§v£öÊÉÑ+&šš¯=§Òo&nؼ§´Po$6…‹çÏjC8wúÔ1™>¾úñÉ/O*Ÿ+ÿœü[G=uâ/etYYÆÎÜêTprª7ϘÐW9—;¯æ•_2Yê-|ä/TLö*6Îyò€75§†Ï€“×Jqåš!ÔS<.9‡û*‘â9ƒð•ÿKMëÀ¿–S'Àû*q>Ŧ !·);©@ !u¢(ü—œ÷U¨úÊÔn[ ¤6Ì@®«v8+‚UùFõ¢À6Ê‹¢U0Ra´ut"P¦©!ч¨VoÄk©që–(ŸeôŠØ#Xä…wç˜<°í>\{…Ä ãßÂŒÔäRJ‰9gÊAŸ†„½¶è<"ÑxÔ^­`¯ÚÀSqeûC!P F(iú™×©G´[èZÊk'–ÜAAñ%xÓ1¼qºÝ”¸¯¡Þ~ gI¿ìûÎ%ØÂÞþ’ßÃùÆgü\˜Ï™N$ÈÛœ ÏC‚[  ¤àJR ‘þ+¥@áÀò¼êJ¹˜©¦oöíŽKôÍÅÝÈ_(FΪ· CþV>.`ˆ6èå%j”$6Hƒ1Úí%+8K´}ãÇ2¨c¼BsâèoʱÒíÒ±Ÿ« €3²‡pòà¡x1<^$À“)é3 À¢1: @„ ‚’ ˆ7yV­×RªÕ¿é@§|µÆúåfpzTåÞfºDWÔf/]Ä»_.ËOê}*SGu“ýÆéÑ‘¿Y¯ÖòŸ”«Q”›kÍ·¨·ÜžÅ((I­}$• Ó“ K€ J°ä‚H‡M_¼/Õ2_«dÊœE*ÕVÊ…²!1 ÊÈ~ñK áz¹xéªÚ§@“¶t²uJɩѰ‹r‚€šÊÉÑäå‚Z^ ¡Ï€PPd$@$@Á ‚ µ ÓÀèœÕ ß…‚ìžµÀ™ë¢¸x'mÎn;Þ|ŒT­ÛBæ¯WNz+O£þ–0/ŠKè éË£T…ÚòÁ×®ï^Àõ4í¦?þ\›qH€H€HÀ.3öF†çI€H€H€R”TCÏ “ x#@Åž'  H5TPR =/L$@$@$àodxžH€H€H ÕPAI5ô¼0 €7TP¼‘áy   T#@%ÕÐóÂ$@$@$@ÞPAñF†çI€H€H€R@Ôz’=~äd¾¸6ÕÀó¡'pþÔ!‘‚1¡Ï8€y_+B¢ò¾Š†Š°b†Ã}îÈ¢RA)]ºt¸· Ë ü1’šm›š×ÓøI€÷•Ÿ - ©|_TÖTŠ• JÁ‚ „’ï«PÒd^†ï+C‚Ûh#@”hkqÖ—H€H€"€”h$‘H€H€¢”hkqÖ—H€H€"€”h$‘H€H€¢”hkqÖ—H€H€"€”h$‘H€H€¢”hkqÖ—H€H€"€”h$‘H€H€¢”hkqÖ—H€H€"€”h$‘H€H€¢”hkqÖ—H€H€"€”h$‘H€H€¢”hkqÖ—H€H€"€”h$‘H€H€¢”hkqÖ—H€H€"€”h$‘H€H€¢@úH«ðúõëeèС‘Vl–—H€H€R„úÉzõê¥Èµ’ó"¥ ÄÆÆ&' æM$@$@OʉúË4%߬ €­ÐÅVÍÉÊ €=PA±G;²$@$@$`+TPlÕœ¬ ؃{´#kA$@$@¶"@ÅVÍÉÊ €=PA±G;²$@$@$`+TPlÕœ¬ ؃{´#kA$@$@¶"@ÅVÍÉÊ €=ü?„h’Í:ÏIEND®B`‚gnss-sdr-0.0.9/docs/doxygen/images/gnss-sdr_logo.png000066400000000000000000000213251305042567700224340ustar00rootroot00000000000000‰PNG  IHDRŒN …Y@ pHYs  šœ OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFIDATxÚŒPÁ ƒ0 ´º Ä 1€þQ€ò)/Ô7ê¨Ke€,w“܇‘›&r(>û|¶xïŸëJ¨ñKD—®;* *å½/‹­¹Ì³ËR+T*„À±å¬s. áÚ÷™’ˆË’†l8ƒ§ªªàµmð‹#óç¶­ß!ܦ©FÜÓÜ;sK¶Ö6ZóÌLÞç9¿d9$3¼³liN>"Hßï%ÿ¢œüÿÿŒ’1ƒ0 E¿8S8DÅ@• ®˜²Q uOÖrƒ F& ª Ê`ÙŽüòýÑCD1ÖZ6Êõ®E›æˆ1¢õ0ŽžuÓ)•â{èž§è™EXCü{­! v¶³-h­¹ÄTÒSH*û€÷4õmBø.‹÷þ(_²}æ™ýúÃV*Ås%H>ª*¬ë«i¤7}@DÎ9Ž7ÿÿ¬U±nƒ0½0Wtå7¬ºDHéØ d©2˜Vª2…NÍ/D] å˜k’ÙklAgv~>ÀN5DUÔæÄðN6¾{ï¹û·}š&ë5¦EQ 80ÖãÛŸÃÒ}€‡ù!Á4 áJaaG„”7¶M¹µm¸óý˜R¤à"Š~_â}»5§;$·9ȳŒ @)•eÙýlf¤ó!³îìNæc: ‡sŽÚ4­X/¸OSàœmñ’3Ãk Ó'JÝñ¸w[_Eñ±ÛéžAp!—¦aø¶Ùh+8 !¤¬ëº,K$…æk’Ä”Âÿ…Òœ™VU¥Ó‘RêZŠyŽã“ˆQô²Z™o¿ÿÿ¬W½Oã0—¹¬ý?êÜh‰Â‚Zš®œ;º DÃtˆËƉ 1„n9¦N‰Ž±J¤®ºzèl¹sÕ=7üå:´”7%þˆc¿÷û0i­¡HŽy¶6âÆd2q[–eÐé8Õ±)}õ}Ã=À6"IÓ5²ð6²ámjéûÉ Šç"Šîno?e¥/A§sÿð¾ º]­êÕhXUHª1›ÍÚm§ÑÇñîÎŽÉGÔëÍçóW fM•¿ X‡w¨,Ë8ŽíцrŒ,œ™ÿ“#ožÏyš$D¤”r[J‰–ÅbáˆþIÐeØoµÎ{½½fóÅIZ몿q$ØîÕZãx£aŸ¿m¢íxD-©×ë瘟ƒv;IÓÑh´]« ³Ì©[ó²çŸŸ_n&J;`k^¡væu邼aàªf¾‚ÀUÜfŠOóÓéôÛááJÉ úÇœó´ a7ÊV%ÌÅsŠy yOíE–Ñ@ùÇZùB,RÒ´”ªbS=/´8‚0ô<Œ‘$ ‹äº.ΤTµV­ /Æ"MÆXÛ4ƒ:¶ÞhmYF¬éÌQ|*öô$ÅG"‘ð‰iŸ˜ÿ´¶Fr ‚Î,‹ã§cìäääÔ¶)qRª*Ëò8È­”ËF«Å÷ ~RÐDQD|èŒ$I———÷V›{ "–×®º®ëºN:wœ©©©¥b‘ m.Ÿ§·ìÙwsqqÚ ÃUÂSÞ S®üØÊ~ !G ðµc%M ¶ÞhÛ'ß¶·÷ö÷C˜1Æ..Àìn— ÷˜N“¼º¾¾&êîï©Ç |?7‡D'JI.I’„ö ?,NÙØða=Ñ7a­Vƒ¶Zo4)ÙF¹‡{Û¦™L&#äÓëÑìôÞXÅP#fÌC?ìÝÌLp˜eYüðO¹™ET…Žm÷û}AÚ¦9ŸÉüØÛÃù¶iÎÍΆæKǶEQ,iÚ`0ˆð„ôÿ€,clèy„(h§;½ ]„¥\]ñ7&“É`̧DzÙd!›U…ÃÂ<šonnøÆ$'v ÄÆV³Iî•4 à[ë;¼B*‚ATdáØ­VøÃÍhµ0ár:Æž\®Tø‘¿ÏΠ{A€áË=Þþóßšq¯½M$þ±ÄÇJ½îë¢>Ô*å2Í&I6öÏŽa¤T•F~Ôu´â·‰x¼¤iª¢,W*´¬;†áSl£:‚¿ŽAˆcR((ß;1‚>B¼"<ŒÅb¹|Þ²,xiâôz¨ûÁ̧þ ž¼N›ˆÇŸÍCÏÃ?+º®ÛÝ®eYª¢Pÿ "‹ÏÒ~¿¯*ÊB6»R¯‡îpD¥cÛQb=AaZó¹œ89ɳ'JÔñm>“y‹ÕªÕSÛîØ6d$|àóåÜqèçD<>ª(Qè0IßŽŽŽ¾nnòã¶šÍÐ&ƒëº®ë•ô%úø6==M½bk¾Ù¾ïî­_¸Gg¥^/ /…ãñú2ô¯q\â2/@ƒ··ÛíNGþÄO¯_ßacGËÉ÷ù§ƒÁ ¶Ž_AJ¼`jmÛF–$T«”ËÓt<‹À”‡ùïó¸lÖîtŠ…B¥\Îd2étëP˜¹5‰çÇú°¿ÿa_>;ämÛf4ÇŽÝ!óض ”Ðï÷éÏøÜf, Ön£±Ûhü:RKÇGc3K­BH‚ (OfmuU÷ ˜ ©´_¶·ñƒÖÿßöm½}›‰™|P²1'ú|‚뺻±¼‹UMkYv•²m»^¯KÍÁÇɚܰûUìðÖ‡2"Mã(qì¹dóbÞ`½_Ë— 社*o×’¯ŒõvVäg9ß°µ½-vaT@òs1ošIjrÌ0t©9üÅl ˜™Ð¼ãTkµ[Qß¿ì]OLgXŽÌøj˜C.1à£EÌö°"VŠRLìTZÓPi’VЍi¢m6Á˜z· ©RT‰8ü)+Jm÷»6åR0¸=a·sœPGŠÔ®Ñ(·õD´9±‡WŸ¿of<6$E)Oœd<Øó¾÷ï÷~ï¥fgg‡Å‡Š‰1‡&“•|fù|þòà éå©[Á5Wß{*¶ ÂΑüé×_~™››Œéýë×_íèøù§Ÿþ[(¤×Ö~ÝÞþó+¯p'ýðC.—ã8.—˵´´;v à·d2 9F·Ë@C xöì™EþýᇧNÂ[=yòI±XlØïWUÕ"ÿ¼~ýÜ›onoo?~ü8—Ë}÷í·g_ýH%–ÜʃPjÊZÂÂZ¼‹jŒP·ò¸Ý`C$ ' *ªøþ8R§ù·]]]j±ÈëL˜õ÷õiV,ˆË)Š‚%‰¯¿sss/µol%=zôõeoYèçÈ’ÂeãžE Þ@Ä£,‰ ýAèëë{Íå¢ H²{j„W;;öߌÿ£X51¨‰}õõõm)J"ßÈfUbúš,ß$I ŽŽ €¸Ò#«Õ Ówïnd³X²ÚíöÉ{÷Š ò’I-‰™´9mN'ÒQôpm@#pô†L¢%Iª¯¯'PB±ˆÇ± ã†ÇM†ÃdoB–å³ûn,¼ü–Äó<Ù³2xÏüÂÂY·›ßÙŒüÆ`(¨Q4V´ÑÓÝÝ©T àI’[â ªêw™Ìz&“+LJWW×Éöö¿´·ïÇIü†ßmd³ËKKPÍ`³_o Ïóá©)Ö7ÂÔæF6‹Åz®7‚ënÔ …À./-Aj'Šâ!Ñ¢(³³³­»ÝÎ××777c¢{åÊÊ Éxos:‡üþJá´šb±øÎÛo³¾‹ $šÅ,–À¤é㮚·ât胇!&I’tux˜2½ HE!É]Š¢|J}•LRÅ»EFFGMnÌ8Œ Ê‹whÿ¸vìØ€bÌ T¶U7™›]\\$ϙө«¤|>OnÏihh0“(SïbżC+{«Šî¦§Ê‹èaœš‚#ÛUx °BxjJÏ –()‹Mß¿oívûÍ‘ÍÛ*Y1¶wóhëo5²(FG+Ò陟‘¦ûª)¨SOÓ5Åb‘çùŠž/|«‰u»JoÂz𪕄bL„Éd2ä21•X$’ûþ{6Ö’Oã„ÓYuWöóÔìììh.áàv·yü˜Ï?|øP“!F.3ÐS’Ûãi´Z!ÿùqsSó«²54•Ÿ^|*ã‡Ny=œEUÕ…B&ç5uFÿf„œ|¤VGÔD£Qj„Ö" ‹‹lb³2jÄ•U’&`ª©êJö=—¢ÙgуËú(ön¢(^¼ˆOœŒCTÇfí•*rœ™<@µÓÌÙ×Ô‰5 È²\©Èáp°3ßÑH¤ºc{º»›âMBQ¬iC¨¡±`ÒP&“qž8²ÛíÉT*›ËÅ Ô„$I$I’´«ÕŠÜø#ËrgGÇyŸÏ$ñÐëõâ{7²Yä ÕRiÉýՈϒõ²aC­¼˜GaY¤ÃX\^Z"y-”/zçòeŒ v»}5þl~ž}ïÒß,‚ ½ñh÷Üds9Ü,ª¢Ö¼OðÊÊ ühªZ¡tßÊK#¤‰P6äq»I ûl~žuPªª†B¡=pkw Á@`1Zù°ßo’ìõzë¹3>®ªj`9{J*>™˜Ð«&ÃaÒ“Ô××a™¾ŽRÛ" §ï–.¹ …B˜}°û,ôòUøÛœÎ[ããÆ!g2Æ@8oj2óÄ. `ñe4Z{sd„ÅOÿÚÙ©gžBƒ†>™˜ RS\üüsÍ"GÏ|ýý¤†`v 5$ŠâÕkצgfÆ‚A4Žl¶³££ìnãÉpIs_Ø àoY[_¯³ÙlÉTŠc„Ø‹>ºÍéì=w®Š½¬+_%“¤Å¶¶4óoŽ˜bmåDiŠL\Žã¼»KõAy˜[ÒiºÃ04¨p~aÁÚØh0²î.ÞÈfUU5“ïµ¶¶Âá“e¹ŽÛmÄiΔÂ}ñ¨Š¢xç£~"wè˜,±YÀ´±4 µN¦ ¤ònꬑzk``m}"Å:1 §í~÷KòLJ-•“¬¦Ó—/]ÒÛŸ[(`ü`dJþW,.//“žùA"Á¦ ÒBãMMøúk­8ËËRâ%Ã¹È ”Âóü[¸l,Ôü’#€æÜçó·Ç3=3CþøúûÙÃtg|œÝäy>žHàeTŠAp2¹hooGwøþ}*B+ŠrÞçC(ŠbYLvm×4Í÷ÌÈZ[6m‡^8Ëd—eùÀG ¤Ñju”Ê•¡¡oVWÙa˜Dbqºk™Éçó$ød³ÙjÙ\î<µ¿DêÊÐ×a¿ŸtzÜb‘ a53£‹»&+˲AêðŽŠA™lRCªªb«WExW-;Õ­÷ÿ0 c„Ly«ëÂ%)'Ÿÿ¢¬ù…4…—‹ZrzëöíÕtC¨Êãv“þÜëõâã ¨;¨ª:7; »P°F†©z“U¦¢(8Îg´§º!¿ŸâýÜO%“ïúý¨I’>¾{—m ÿÖh$BjQUÕ/£QhEѸÎ8áyþA"ÿwè‰Ú,ÄóÝÝmü­¨ÃeÌZQåÒà žqóº§@ªª¢çä*碰<2ƒ£Ä»Óh™ûúûÿ~á‚m‘Ýt=Ú¥6*—å‘)i¯:ù`lŒJŽ(‚ƒž“®OÓ——–¦¦§©xf@Ž;RRù<øƒ`P³^êV“Íæhm¥žìJ|‡_)üHIe‹DVÓé²]ãüèÌ™3Þ7Þ¨zVîHIÕ8ƧOŸêuŽ75544lÊúÿ MWo¡n$IEND®B`‚gnss-sdr-0.0.9/docs/doxygen/images/gnss-sdr_logo_round.png000066400000000000000000000154711305042567700236500ustar00rootroot00000000000000‰PNG  IHDRHAЇEN pHYs  šœ OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFdIDATxÚŒA ‚PDÇahÍΡ"$O``KétÒ¾ éV×n^ ?¹ˆ ·f˜qý`÷Q·²”…áÞu­ÆàQ×¾çÇ lï^U’¦yÆñÙ4¦m·^–¦À)Š€yšVÓf+ç8¾ä9pðýmSÒ²,×¢èú>K’×0HrþúðÍÿÿ"NŸµ¥%ÑÇ’¾}óFVF¦­¥ÙÙP}6nüû÷ïÕk× ÜðÐP„™ÚZZ555ÿÿýc``WTD˜YW[kia¡¬¤„l&"\$ÄÅ¿ÿnjb!×ïÿÿœ’1‚@E=–,W@ ž[¬äÄp,X<V‡H#ݳXCÐ¬šø«—ùù™™Ì|̵m{­k!Ä!M 6¯Ú„áÀ¾ëޝgÞ˜Y°–XIù {ž†[×Ýûþ=¦ÊòRUû$ŽYÌG[yžkØF‘¡›°m`áûÀ.ŽuQ+Ð4yHàTg¥4/ƒ`¨ùǾh:ùKÿÿ"Ó6\«W­zýúµ§——"$âîÿÿÿ ?~üÿÿÿ®..¿ÿ¶¶²*/+CSƒ®MCM Âøöõ뵫Wáâš8CRQAáþƒþ~~ïÞ½ûðá ‹­íÄɓ޾yóåëWyyytGþüùóóçÏ)ÉÉî‚ Œ©S§"'=tGFGGÿÿÿ_KSóÿÿÿF††ðø€0"ÃÃáŠ!yåòe[[Û  ³çÎ100<öLRJÊÅÅ¢ÀÂÂKHÖ×Õýÿÿ_HPðÿÿÿbbbâíÿÿÿ"†“£#öÜ·oßùóçW,[öÿÿÿ²ÒÒÿÿÿ÷õõ}úø9¡cÑIì÷îÞååá135åããƒg°šêjd•(©äé³g8øôù3CvV;;ìY³Ä%$¤I{;»_¿~-^²dÏž=ׯ][½zõ½û÷988¨”ÉÌ8ôÕ™~#°©îïß¿)ÉÉG}õê•„„„¼¼<33óóçÏŸ?. `aa1cÆ NN¦ü' ôôääΜ>,X^^®  €,rüØ1y99}=={úTP@àׯ_põÎŽŽÈ&ô÷ö 5PZ@h@HHèåóç |||oß¼a``066~ñâÅóçÏÚÚÛYXXXYYáêß¼}+‰Zʼyó†ØÔxêÔ))Xó@IA¡¢¼Âþúõ«¨ˆÈ½»w‘ûûûa&“sçΛ@òrrÔaUÜâÅ‹¢"#?|ø°oï^ 1±ÿÿÿ?xðÀÕÙYZJjÏž=˜±€YHúgNŸ–“•Ý»w/rÍ·ÿþâ¢"x; lÛ¶M^Nîô©S$ç3ظq£¤¤¤£½ý‹çÏá‚=’–’Z»f „ûôéS;[[iéu0¬€„²ñÛ·oK/þóç##4üÿØÔÜŒœ^EAÌÄ@G@W˾ÁÈBª†cÇŽ]8ž‘‘ñ?ƒ¾¾¾µµ5 šÿ¶nÛflh(&**$ `ceåîæffjª¥©)",¬§«»yÓ&b !lÙÛ·oUUTädeËKK_¿z¼{÷®²’Ò¼¹sß¼~]VZ*++«¦¢òæÍŠ,Û±}»¼œfÍ+!.ÞP_,"/'‡ß‹ø,Û³g¼œÜÜ9sÐÄ]MaDd0kÆ yùû÷“lÙïß¿¥¥¤&Oœˆ¨‘W®ôôô´47740ðöòÚµs'¦®I“&IJHüùý›´²ÑÌÌŒŸ—w÷Þ½ §OŸö÷óãáá 9xð ##£¦¦æþýûÿúuâäII))dNŽŽ?~ü8vü8±©ñéÓ§R’’ÿþýÿÿÿ¡ƒåde+`õ“¤„Äýû÷¡}¢ˆ9YYHC~üø!-%õøñcbƒ16:ÚÏÇ–‘–îîê‚°=*!.ެ211ÞU‚OOϨÈHb-Ú³{÷ÿÿÿcccM`UþúõëŒ0›¡Š m­­(ݯ½{áƒ,ûû÷/|ˆAXP’ºŠ äå ¬,-%%$¾|þŒ<¼a‚ÑAÂiYGG¤õñ÷Ï~~ˆ ?ßõë×á 7HûšÁïÜáæâB3Þ~!Д›>m###ÇYXX>~üøÿÿ ˆ;{û‡ÀÕKJI112b¦;¢Jýüúõ‹APPðïß¿ïÞ½ãçççååMLH```øòõëâÅ‹CBC=ò+W0Û˜ÖãLúââÁH=]ÝŽööÿÿÿ?|øPRBBEYYYQ­qééîŽ,òîÝ;EŒ9¾æw_oïÿÿÿ-Z$‡Ôj«­©1Càƒ4[ C­pÐÓÝMlùÿÿgg'|¨Í@__EYÂ~üø1²JeeToýÿÿ_^N®µóA lT”—?+R••” #m:ZZË–-ûÿÿÿŠåËåde­--Ñ4îÚ¹S [ⳬ££9«**$%$øùÍLMu´µE„…¦Ã†€¬ŒL+êð-QUŒ®ŽŽ¡²È­[·¶mݪ¤¨ØÔÔ„U‹¡žŽ™•§´”ÚHÙÿÿÿçΙ#'+ûïß?4q-MMEHl³ÀÌÄDNV>ö ffÈeÄ”I“dedLQ*9–ýÿÿþ¼y*ÊÊ¢""©ÉÉ{wï†(šF††‰ b""*JJ æÏ'h ÔõëÖ-Z¸ðÄÉ“ÿÿÿçææþòå‹¡A\||PpðÈnZ6j^`×Úƒš:³xÄÜ9wîZo¯Çã¡Ñh"‘H&—‹¢¢Øááálvhhhppp{{{}}½Û㡦¤¤Fý7ßí …BQ$&T*ÓÓÓWÍìŠeàë¯wefÂñxqÉïjj¾ZÒÒf³½ºgÈåò1¬áô髃CUeeLt4Ìã¡0¼+3³¯¯ïGGµ"`W:;ccb@Dähuõôô´Ê2’ .Ú·Ïérù±œššª®ªÂPE¡ðÏçÏÿtÀ†¾ýv[B† BàbG‡/3‡Ã¡×ëoõ÷×¼óŽÇy xòÝw—掠¥%’ p S$&¯9°†?¹\‚~UV¶`irr²^¥úÙ+¯B!Žaá,Å"‘4>>>..B(Ä1LÀçGDþÞ½—?ûl9îJKKa‚!è£3gÖXUe%yBÚ.\˜¯ïêì”ÆÇƒŠ i;v| R™L¦ÙÙÙž/¾ˆ“Hx\î*ÉŽ †ŠŠ ™T Cs²³?zäßiKs3Çq «­©Y`<§¬,/§Àî]»þ11Aj:;;…†¢¹¹¹Zf.…–””ðqœ‚ûèo\¿.ŽŠb2Ÿøm$+ÊË7DrRÒ¼¬Z±­­-3#Ãét®[·N$‘ÊgOŸ`f²X eÚá8ÛÔd2™^ÍÊR«Õ’-[HË‚hjj*..öz½çΞ5-v%ýsfæþПHÈÁ=—˵:Ep^^^vn®szšü{’Êàà`îõzÉRˆB¡lظ Óƒ‚‚ô:ݨÑ8»Ý~ûömÇÃãñXìÂb±Øž=£P( ÆFV€KÒ{+)‚ëŽyø°··÷Vÿ¿Ÿ¤Ñ¶)mííwîܹùÕW‰ •J}ïý÷v{ç•+)Û·‹"#er9FÓh4:­ö™Í¦P(TõõKNSôôôh´Z Ç·§¤ø ãæÍ›AÕ¬?nl g±äRé—×®‘š™™™Â‚‚p+Y¡›—ìvûŸ óó£ÅbIlì‰äèÑ£‹Å×ÎÝÝÝ‘¡huuµŸ®öôÈ¥RˆÇkll\ͬ8i³åíÝšŸ—ç|>Þä°Û òó1ÝL‹§"z¯^Eaáó¾ë½ÊŠ Ax x¬¶Öw—ËUXP„…ådgONM­òzÐ`ØšÀa³•Jå €\¸@…(‚l&ˆ÷Nžt8sK‡”Êp+9)‰,DæäñãLJßz‹ˆˆàr82™L¯×ûwý†RÉb2är?¿Ä Cê´Ú%%ß?}-Ÿkn¦ÓésKíê:V[;òè‘Çã '$È6mØÐ¦Vo±À’m»~ãÆ Á$“ÉNœ8á¸6›mQÑÝ»wéÐÒÚùüâbõM«Õº¯°P¯×‡„„¯«ûÅ"bñþýûùôÓ'OžŒŒŒ8NÂÀåtÒ@-—ÉrrrLæújmm­ª¬tº\qIsK 0ï=®U£Ù¡VG(‚ȤÒË—/û76™L‰[·ÂôóŒŒgÒ—\ºtI‹"ˆP èðÝ­I£Iìb‘CQ†ËJKL ͯ×ûÆ¡C0¡(úß]Ùððð/ËÊp #¿Øú啼«ŒFóÚþý<$Jß¹ó£3g4‹-oõ÷ÇI$>_,Íu¨ý}} §OïHMEÇ0ˆÇÛ_TtïÞ½•„´Ê¼¢ÑhT··ÿýóÏ ³ÙL¥R™L&6lܸ~ýz*•J¥Ri4ÚÄÄ…B™q¹Ìf³kffÖëe2™111©©©ûŠ‹Ùáá/:ajµXFFFž#ޝ{~êv»é _ Àq‚ ‹õ’ þ¿g‚_{ ì%°µ• k¤c.È“hIEND®B`‚gnss-sdr-0.0.9/docs/doxygen/images/overview.png000066400000000000000000010731371305042567700215330ustar00rootroot00000000000000‰PNG  IHDR¼Ýˆýš· pHYsgŸÒR:iCCPPhotoshop ICC profilexÚ­Ž½JÃP@Ï ‚E¡V âàp'QPL[Å)ý¡‚µ:$Ùš4T)MÂÍõ§áèÖÁÅÝ'prtŸÀ7Pœ:8DÈà ‚g:ßáããòµ¦Q‚a¤U§U“ŽëÉé' ̲@•Ýn&v»½ÅQÈ>_Ïv£ÖäỏÒÀ¨ôÂ4aƒ hcÀô‰q˜ê¸Sñû™¿E?ó7 ¨×ñ˜}ÇõÀ(¦Ÿù2`êðRÔãd¤Nû'ZV,Ë’v/öCy4Ju8Lå^Ä*‰UW‡= û€ùl±ÓªÉÕòÎÎöÿŒãz2³÷C 󖜩óoFõ÷9¿1^‚ƒ[˜šämë nÖaî:o+e(mÂýø ïPoƒ/ cHRMz%€ƒùÿ€èRX:—o×ZtŸIDATxÚìœyxUºÆUÕkÒ „=ì‹( ›HDç"8↎8: nŒËÈ8£Ž×GFGDEÜQQ6YY”]”-@ $@Èžîô^õÝ?:iÖaî½ßóTºëÔ©sN½ýoyÏ©("’ 8ù©‘2©"ïÍ|Yî¼g¢ˆˆ\?b´LûûLQ5“ÌyëŸ""2hÐ éÐ¥‡ôìÞUìÜ!÷Nz^þ0ñAyròÝ2ò†¡""2ïý7¤Øí“ºÈ‡¯þE(éÙ6^ŠËu$ ‹<0q‚ ¹a”Œý¯Á""ÈmcÇ {f²˜ãZ {6n–Äö½åBˆ""e£BULUUPÎR{ ìø1ÖíÏah¿žä9Ô ¾øzû÷gðÙg_ðÙß²xÉRæÍû°RåtÃ_¯ÓLV’š´!%¥=Š¢ðÌÜygÝÆ¨·ðð×ÛÒ¯ïŽjsáL„®ë""rãíSåÎ{ŸÃ‰Õ-ññ‰Ò³GO™=ëM1tCîùÝTùå»ôÅõ:µ¢œIb7ÛM'ȈFùWß."bœôžÒÒR)**Šœ?þøƒr¡E­:ŸÖ­]CÙÑ-Œþ¯n,]ò ?mÛÀöÍ<ÿ—'éܾ9O Û¶-£UËÆ”ÕëïqÇkX@,t:”Þ-4Z;s0€—_~™·Þz ]×#õu]§k×®X­Vvô<­ëù`LËjíN[öã…1ïÌú€¹s>%m`?~Ú‘IÓ¦-xð¡yvÚó|öÅ·H% 1îΛپu?[¶lB×Cõ6°8g³\Ê£ÓÿFAÆJÚ6·Ò±W< O<ñãǧU›6tìÜ€+ÓÒØ¹{7/¾ø"Æ>Áßwjü0lVµvË-ñ`ŸßÏÄÇðÁû èß?ÿ¸ŸÏÅÎ7°bù22¶pÇÝ÷°2}+B9;tæÓ?¯·•¸Ž³gûŠ]ú4´’ÔÔFT3ƒ©©qø|>ôήŸvðã¶m¬ÍÈ ÚngêEÚxeÞzŽ– Ãþ<1àÛënû¸Ç…±ÁïÌú@n;Vúõ —_z…ˆˆ >옲²²(**" qÉ%—`³Ùصk^¯¿ßOß¾}#}nݺ©Q¾aÃ, †aÔ:F³ÙL×®]Ï21®t÷§ eäˆQ*’¢sXDP…ÌÌL Ã7¦($%%Ñ®];\7 gÐÍø¢oŸ|¿6Pÿ£Z¶lIË–áP/¥[¾þàcº]ÒAAEÐù׺ÕØÌ$´jÊ¿†Œæà[ë°aÌ~ï}–~ó'Ld`ÚUÜ{×­d¸¼k®<äW“––6?À;óg°÷íÏùpÉR>[¼ˆÉ£ogUÙA ¡AÈÏ‚w\\áù²­:ÞÄÀ ëf"¶oßN0Äï§Í‹§ÓIzz:íÚµ‹ÔÛµu?íÜÍÀ«³yëvʽ^Fº ‘‹H»ÝÎp¹\ôëׂ‚‚ÀO?ý4o~¹g¿XŒfìNQ e‡²X3çk,<†±ÿ$ÕÊÆ ù~¥®}»¢ªJà>][87ì8élÞ’ÕŒšvÒÁLw=/¿»ø”^½zõE­™š¦E¾§§§Ó¿LXíÑ”»Ë#×z÷îÝn`ÕªU\zé¥ÄÅÅUkK×u4M£íà+˜0ï=&ǧ"ÚSoNî|üâ‹3øæ›qujãÿ8BçNò$&&Ò¹"[<µO‚ââBT#þLËÖ~ŽÍjBQTÌfŠ¢„˜ª€!„ô𹈂¡\Ñcšfªw-ûæ›ßy€­",6a®3¾¿°ÐÅ{f©y\\DS à //¯†¦ŸJ…0¸TgUMÙ»¾gþ7›‰‰Ád6a2™1DGS5B¡Á`nðÜv˰ˆú×/¸ÈÍÍ$ÊnÃdÒ°GY)+óžU¶?£z6›¨¨(vîËbî{ïðàĉ‘k•!b¥¸\5à@ „Ŭ…QœNgu€U=D´ÝIöžlŽççÒu4³•rWE…% š6k†ª)<”ñ=#Þ}ÎÀý÷ÌOyì÷cªG$ºN´Ã×û €Nuï½–Éá …9oNbý²¥L˜:â¬ú*,tŸQ=ŸÏ@î½ô¾¼7Á*,]£FªÕ9s&III¹Ù²iÎy ͤ<ÂV8ô²ñ»õè!Õ¬`ˆ‚0°EÙpxt%Ã0QøÃ=×ÕIƒÿôÀX|ê,œªi˜N˜ŠO½pkµóË.Q¯3fòäÉ<úè£4nܘ£GÖZïÉ©¨Àÿþ‘ C³Öd9⩵¾ ÀÇw_CŒÓÛíUÅSîE×Á0‚XÌ&öhL&…ؤ¦•3áœ$Ú‹¯°°FùìwßeÔ¨QµÞóɦ;k”ÝÜó3ÀuÞ~ýõ×™ýÎ,¬ö(öìÞøqá>?NRRR•ˆÁN»v1ÄZÌøìu,ÑNTEÇ„Š_5À¨à±wüõW ±X,58€Q£FѸqcrssQUÐ~Hi£â÷¡CyIÝÇùþÜsÏñÒK/10í*D„¾}úD®U/™™^:¶7¡b&P^Ž-&_™WgNáñÏTw~"R¶yó^'ªŠHxº"á%¢ªæ*äºBy¹—:œs˜¶nÝ:úõëwÒëN§“=~®¸ª4 ÎÊñÏ>ûÇ mª}1(æÌ™CÿþýiÞ¼9Ó§OgÊ”)‘0mĈìÝ»7B(ªB»”©\ѳ ¿}ŤÑ(¥wA,7ýÓßYpWU•`(„aÞðRŒ¢¢ë†aðȤ{ ‡/º¡c2Ÿ]ˆ¦tJcƼõ¬\›MAl}úôa{yGòW2}Nü÷^ž½œ<Ç•Ä:¬¬[·îdÑæYõ«ë:}û^9Ïu ®õ°ÛíÜvÛm´jÕ MÓ"àVr•à8ÌMyü÷_P÷²rËçÄÆÇòéÜ{Ë-Ü91™‹?©eEC({4" i4hz€Ò¢|î¹s8öí ïX6»wnc옫0©ê?drr2Ma×¶ïIHiÄò% iÒ¤I8ƒZ½k0“Áï!{Ë—,[03²Õ.g³D%hšFJJ2"BÓÆ-q?HrŠJ^öÜy0[UÁ q?~JíÏ]í¼Gïá|òÍl45ì”oøÍnÕ›½¹„9ox¸a¤·¦‰X»v‡Óå.UÅn³¢ªª¢Q”prŽ"Ã0h””L÷KšŸ±‰81X¯L-#S4Àl²D®…9€ìZLDà9+ñÑG1\uÕe<þøT~«öô>*{n-SyáIÉžJ¹ñÆI4ožŒ®ðú¼€•Õ+w0hˆ›F± X°È`×î«ük¥Ê{noMõã¾ÕtKM;áÁ~øTQD÷Ëg3õít®í×öéÏ%×=ƬgŠ"/]Ü‘Kz4&??ÿô:o² „ª;ßÖ­[Ó¼yóº/zþ²jÓGµ–÷ê8¬6 ZñÙ,ü·•Êü™/’ô 2÷T\‹å‰é|·è5†\{ñZqÓëµ’çÙVkŸµhòÆeU“ŸsEDÊ^œñ'§f ºõDT ] b¹‡2ñ¹]ˆÜ5‹9¼ÿ ½RŽxl(Ì(¼¹jcyجª”KÅg  ’õ˫Іä¥5P F~…-/dûöÞ$$$D4¸IãF‰ ¯¨8bÀýÃ/3-ÓsÙ‘jãhРÁY¯nÔÐàÒƒ;1‚vìщää£ ¿„R— ¿OÇÐuLŠJ«6éÒ½VÑÁ*zvÃ(¦„C+ÎçÌ™s’¥£v;h?)“_qø«|¯œ|XþýU®UÒ½ªmNÉ+Êfù†÷yý¡{h ÇŸàW¼P£çöíÛ×IQLoWNz0„Ùf°AV›•ظX¼.‡“Ò’"<9ÕRåý¬¨µáY·ÞZû/Zá­Ó·|•—Ý)÷xKi×”‚’Ü p6×víGÓJ*ï/üŠQCªØîÜê1²ÃÑªÊ ŒN£„æôí1€ƒ®l^}m Q•«ZV6ñ-(¼¼¦­·X,uÃ@÷(.)"19GL›Ã{÷@ËTb8p•–`µF‘Wp,NŸ>‘‡Î‰®×b¶¡©&¼~wÜ5›?e`Ñœ¸›²Y³rrrXùýbF~ Ã81N®™Ç/þn—·§á²q}—êv^ z°ª¿sÑî³ ;áó{¸¶Ï]X,v¾\óoöø-É“"¯ÿq}» ÇjµòíÃÃp˜ÒRl´Ž7Søh‡² ª†¡“˜˜X-Š9i¼ìòûÝsÚñ4mÚ”¶mÛÖQƒ/" }\Ö!¼`êö–€·„þÝG¢AV|ÿý:ÞÊkŸNá–!Fî¹½“¿.¸‚XˆÉJltŠK«;­Ä†ñ@ㆇITU•‚‚ÂHÖær¹ðûýaÒ«‚|¯ÓÒÔ´iÓþXO‘qLJp]ÿ^˜Ì ϸპwð»wº·»œ-{²ïð✉ˆÀ«Ç’IîÅZç嬊êE‡äXB›w-!)¾ÑÑQx<áå°µ‹Wͧóðá ë1ˆ¼2&ñÓ½{wçä€UUQ«ÕZì9¯qpqÑ1P`Òè?ó×…Ÿ\þÅšWÃÞ½ååhª¯ßÍm×ö­vTÆ®{mdãÏ‹É:òË–ÕPР¬´!÷ þ~¦.]º`6›A$r¯a„³×S­Ç‰é¨Õ¿õîLnu ³ß™Íós_âèúœ:Ù`“ÉDll,n·›`0H||<ŸÏG||<~¿ŸòòrâââÐu—ËEll,Š¢PRR‚ÃáÀl6‹UM  ôÅÅÅhšFLL Ûw®§UJgbbbp¹\èºN\\VS,Û÷¬f@ŸkÉÎÎÆëõG0¤yóæ9r¡´´”˜˜TUôg2™())©‘*ŸpffæÙ¬ë:Oÿy"ËV¬fÝw;±¨J½:¹`0XmûÒé¸ä…ËÞ¤W§ag>E• ÔH•5M«#Ÿ<á©À5L„¦i<ÿì 6­ÛuÎàž†Áõ×_ÏöíÛ™0añññ'=zu†#*¡¦¦œ„ ;Ybs¦²sçÎ:Ý•'d°;ÇËÆC~¶£³Íãã«Âr26í¤{ßátëyo¾3›}û÷œ},¨(µU ø´´4>ú裈׮ê½.\X­½Î /ºÚ,Ñ‘¶%´¨Öî¢ÕÓÙ™µ®Î p¦Ëö§ Ó‚þ ‰„P€œGÐT•ñç)#¿à rIçv„*V`ÏFrm°XU¬6…«۪ 1ya32dÈ222"Þ{Á‚tíÚ•ÔÔTTUeøðêÎøgù÷ï²ëÀz®¼¶ ŠÁ£(°lÑ&ì —´½ŠN­úÕà`0x~4Ø(Éfá‡ïP\”‹Ý®Ñ½û™ú<ñN3˜p'GsSXTD¡«ø´ôÇ-|~¯·ü 4i ¿LûÜÜ\ÚµkÇ!CNº‚=¸÷8¼e&¿Žß§‡¹j] &ÅÕ½n;/&¬K—.çGƒC¢KŒÃNÞƒùé§o †<\Ú}(»v}MÇ&bØuiìÁqÖ4r§Ÿòúu×]GNN=ô¯¼ò ƒ `ùòåˆV«õ¤šty“IÕÏ'\\‰SDƒÝÞV›ÆÝãÆ³fÍ猸ùn|¡{³2øú› †¾›@0Ä´»ª·ÁLŸ>EQªÅžŠ¢Ôyš^H‰„iÉÉmYøñ¸‚åtéÚ•ÜãÙÜ8r¿ŸOæ¾H¯îWó—§ÿÆ£OM"±Ar½q§œn&û÷ﯕ/ÈÍÍ=é}ñññW7m•»éO' tëÖí¤Îût›p"oY¿Žwlï©l^»–»&ŽÃ¤©‘sè(ŠjcÙ²uäìÝÇÚMéü_’­[VRVæÂj±pûªAºuë†ÓGyy>t5€¢¨†U…øäÕM„Óª±&}=·ß0ŒÑðÂÔi¸‹ÊxýL~à¯,ýr?oÊ ëoF\tÄÆÆ²jÕªzkî’$7MF´ /íÌ•}R±˜¬äÏ¥ÌÂí-cÏî}¨f3˜t‚J ¦“³ZU¦ýñ>†Ý4ž¸æ8X`aÉßòÊôS¸}GrC´q^\\eª[Ÿ;>ÛcÅŽAJbâbT žXE#hsº‰Ž©M1B>BA=òLåËÎåý¯„„„_ý³@ eee5ÞÛ¶m›ˆˆ„B¡H™Ëå:oýj v‡MÌšEÌ&»D›­ˆÓ/íÚ¶“í;I»ÔTùÍð!bV-2rÔèȽ笎…µlà«oÑ4-ÌzUqn‰‰‰ƒA¬V+mÚ´aõêÕäççGB»ªõë”Ò{MQ8£Ü^'ý8¢ÌÍt!„00Ó½—]ró_¼„û)cJUÅf³a—]vIII(ŠR±Yöï߉ΰ¿D  IW±…h[Ø´éÔ–¬}Ù¨šUlV3?mþù?àª@kšFË–-)**Âåra‡#B¬G8íâbE©ñâÊY ¨fŠ· «I-—ïݵ WPU=¤£Š•ÃÙ;Q«ð,ÿqûý~Ìf3¡Pˆ¬¬,L&ªªb ==B,KWÎEB@£hAŠæXa9N›NbJÍZ´å§[PÍV£Ådܸ=9œ{øô+'Êúõëyøá‡™2e kÖ¬¹ Wîž0aB„¿…›ï»ï>{ì1æÏŸ_gìD¹í«à´£hQô(Pdffaøì´ò$ 4’'s$çì4xÆŒ\Ú¹-†j%sß~%&òÝwk)öìûi3<òȯðøñãY¾|9_~ù%›7ofåÊ•¬^½·ÛÍSO=ÀÒ¥KÏ+À*/öYMÇθlhs6nÞ‚Ûç¢U³ìÞ½ a ŠB0XÌ‘ìBÆ'ÕÌäNpå Ü{÷î%Æé ¹qx ê¦M›~U€ Ã@UUrrrHII ÿƒ&]Çdº8­Ý™ˆû￟~ø™3gâõz9ž_ÀÛo¿ÍÚµkUp+@JJJØ>†Bøýþ3Zþ9yrÒ½‘ï›w=i½[Çþ²“iÊS>y¢á?MÐÚ(ù´ù§¼)ÿä@î±Óÿc‘sÍäN”éÏ=]¯³ÿP‰òòëï 1 $ã“7dĈ{ÇÝ!Ïýãß2çí$^Efúµ’±5Gf¿ôˆ¤/_ ú]}A~„ÿaï¼££º®ýÿ¹÷NÑhÔ… ŠèÅt ˜¦ƒqüˆýìØ“ƒq\q7‰»!ŽÃó `âP ¶¦$¦wƒÁ6Å"Èt!ĨŽ4j£M»÷üþæ2B¢ ŒóÖo¯¥µæŽn9³ï9ûìóÝ{OÈÿ¹I@‰Â)þñÉ\!„EçŽ [‰_´ëÔUôîÕK¤·í-&ÿê~1õébâÄGÅA#…BÔx<EEÅbèСbñ’Äæ/V‰‰üZX£bÄü¥MÓ›5èÍwl«“…8|" FaIHË×íB‘2S EŠ)“mo „bíúíúu={÷Ú´ºe=Wü_9*r˜÷(µÑ©«ê8°íd#Ú5¾õžC™£„U«×èÇ»vïgãÖ|üñ"„ЇüàñI-‘$#IÉéH’ÄKñr½¤E—~=‚§×<¯XÁÜ_¡Ý³p¦kìo& !T‘Ÿ—'RRREZJªøú›-"çtޏkä ±qýßÅÎÿ¸éC*>±™0"„"™ÄÄ3„Ã/{~II‰°Ûí:Wåkc‡Šg½¿/Ú¸Õûo OåªUkhס3/>ó–.YŠÝ^Âî/7±gÏfÎeçÞ¼1 ‰)|ùå6ÊËœlܸù¦¾ôrG~5šGÏâà›¯SU…Ë~NǦM›Æc=†$I´hÑ‚FaµZõÚ‰ÇZWñBZ.áÉ×Ëïíùã›…­[v’’’ÂØ‡îgݺ͔”ÚéÖ½/½ð;ž~ò9RS[`/)¦¿^Œùù½|~† ¬(7Ãæb4ñòò÷øç“SéÕÜG]ühš†Édbé²e,X°€”ÔT<^/3ÞŸ\›]烪_W&³ ¤9"¬ TH?®U0W<~ óËøëGŸsà»íäœ9ަyÑ´Jü. Kd€Xk$Ÿ¯Ù‚"'pGÿžìÞ½sÄMänö»ÑÜU¤ÆH´opi$4²â“D`âôÉ“hªŸ|[ŠAÁçó#›Œ”Ø‚`ʃ³Öó ð‹y_ñù¨ä¿Ù¦o÷ãÚܯ¿Þ'Æûµ6d¤ÈhÖZüù>n·GlÛº]lÚ¾S”–V !„6t˜X¹r¥øbÍñðø±"//ï¦Ù«¸¸D‘—&fÜ%޼ÜBDX,B!ï^wÉkNØêãÊÔÄíS—‹ÿøÃšknÂO× @lؼU¼òÒTѵS{ñÐ/Œÿ¥¸}à(±wã*1nÊTqÊæ3Þ}G¿î÷ÏN={ô\ '啤oß¾7ÞG$BôÑï[Ö {ý`+Ͼ5OáÅç²´ ÍpéÐGà TçÎÉÊʺ~4L„WN^ ?s挞<ív»)//§¤¤Dÿs8ô鳇ÃÓéÄårQSSS§¶B–eV¬X¡“~¼;ço¼úÌ$¾X¿—¹›ö +Ú(!žÒ²`döÛS˜þá?°œ &ƒ×b#‚dƒÖú²VΞ=‹Ãá йsg½=++ ŸÏW‡#òÛo¿Åh4â÷ûéÓ§O-àÞl6#„ gÏžu¾7 z6ßïçàÁƒF¢££u»ªª*Ž?Ž¢(¤¥¥éü6› »Ý®3b‡˜¤Ž=ŠÇã©ÓÆ+ÉÒÂƧ¶ÐÃ@×­\—Ë…Ýn¯åØ ZµjÅöíÛÙ¸z%ÍÚ¶Å‹bM¤uÚË$}#¤qãÆ´mÛ6H:Ú»wÞÞEó> ÒÀÈAN¢Ð_æ´“[UDûFÍù¹Á`¾~åN}ë=’ã¬$7kÅ™Ç8|®§9’u’éo½Ò *›ŸŠøý~†À»¨¢‹%™ÖÀ/™ÀìE‹ùÚ]D¼ÉÌoþ…½‹òçÇçÉY(¯øy‚—ž FøOªªªh‘܇ኂÕjeëÖ­8]¹ï¿ÿ>wEÃɉÃ0™L¼:ý}ŠÏúI)255•íÛ·Ó»wo=¡;<„ÿ}Y!¿`gŒ£ñ;çm–nXÇ-¤WÞdèFdä<ÔšO)¯øý³ ³õIŸyƒfQõÿÚO».½¯Ø°×_iÓ¦éÇóæÍ£cÇŽ@°¤?dË~JwËÈÈàÔ©S$ÆÅ⨨äÍ7ßäŽ;î`̘1ô=OrôñÇ3bøpRÓÒêÜ«ÿþlؼ‰Yöc hÙ;5ƒÁì¹!Ëp±…¸œb/^Ì„ .Ù Brüøqºwï~] 4¨¦ÁJüò˺/699»Ý®‡jÛ•z)""‚&MšèçüêW¿ºä3öìÙƒ$IÜsB¡g+“‡ XmT£ƒ¢ÝIBE‚€ª 4U“PU•Á}F±mÛ¶K*7œpíÚµ×¥ÜAƒªP5;Š£¯Ô5­‚kÉe hyÅóòòòH 둲,3xð૎х&µž•’ÊÎþÀŠÍßbPB¤ž2U i~Ô€Š?à®Ñý‰‹J¸òš:,2;yòäkV¬ÓédíÚÅ€BlL$UNï5A÷Ý׸zˆ27'›˜ätΜ+B–eöíÛwU|“^¯sDÎexö¥9ÜÖ½ gr³)ÌÍ%66K¤ÇÌtQ5$ þö(ï½ue®ÉÜÜ\Jûjr "“[à/Ï×Óû/^LbB)mÛ&ñò+k8züO m—tã•zÂò¦ˆH¢"(”ƒ‰'!Büp9r$#FŒàwÞaû†÷5f*~¿ŸnýZ¹ïl8¤pKoÑÇqWV›€¤h¸ÝÊ¥4NBÓTÀ&ü¸ª+®ìH„•f-X° ÖÿRRë– 8 NaTj÷¿~4—^þB,¢Ã Tì夠 Ÿø ƒ bôèºÕŸß|³·ß~!#Çü¿ªbа¹/“ÑZ?*öÔ¤1æ`11xý~ªNTUÂh”±XLHZ5 a¶^•’‹Y\TTwæ6q{êgÐÛ¾q;Žäeu¾°×ÒªØe˖ѼY3T!˜8q"[¶l©µR …†n‡ÛécßÁâM(÷”Ò»]Oe"""Ç][¹ãy÷†64|‹‹+Ç[µjUoÁI}.]è%7‘q»@‘ ÆÖ؆µO–åZ“©©©Œ?M¤ó¶533“#FÔ¹vÇ®S€F÷.MÈùêÛNÀ?sã˜1gŸ|ò ÅQÙñíY":õgÖÌYG ¤8j #GŽäСC7 àÕW_ NšfIç’üÚÑFÿ\d?yî¹çe™ŒŒ zè!4M«‡ã×L¯Ûf—ؘݙS)¯¶à,*ä¡8^QÍÀaÍP¿P[¹&£ä”„¨ªª ªÚKRB/Nù5qñÈ<¼›Ó'³(-/ÇjµÔÛãÂåĉºÞ¯_?š¦µCrÛ‰ Ö™Fìy™>uo½0›+†gL`Ûö/±X,Œ5ªA*ýàƒKU|ºyš¦%c2Él]µã™û°=It´_Ïðß±£N¢õ^«)¯Þ‹%2MTMãÞûGQ†DTœ‚³4 ³RUÛ,b·c±D É2‘f™üÂ|Þ˜>‡|[.‰Éƒ°¢¦‘—oã¶NM.ņa¤sæÌáÅ_¤Q\oJ+òè6e’nnê‹Á5” ¤Äf¢L<5v&‰qNÀŒ{ú·zÜRVàäã[‘4!_p  ç‡äÈ™Yô¸½1¿B»ö­hÓ¦5ÅÅy|öÙ^›œÎÊÏó()5ÕVî]£úÝÐ -†ìر#ªªbwœ«,¼ÚÕÏ弅ɯÑ¢Ûp¢-°qí6Œ¼—a£Ûó\¼”•ù(+™üz—¿jD ²ïž‘‘‘¤§§×:ÇîØVoÿønÐLŸ^Oô÷FK´ 9ÞÁyãú1ù¼³§Hm"c´ÊäŸ;£O,»>™Ã?7/¦øèv¯š× Ó¦Ý{ÙˆJ}dÍአ™…Ðv’ Šþþ÷‚7‘ehס+’¬ $!IHB ’àÌѬ y²ªòâcoãñxh+¹p£¡ !¨@2›sšðמ­vî_^oÉÿúÝsùÙ€úKÖ‡É0N§ - :Ç™…êD¹;šøÈ à®ÐÝ., l÷…šÚâïǃ !ùäW—¤ÐêÑ£Gƒ«†dŸK Ë1Ør ±Û”W9q¹ÜxU?"™h[oºö@É©`©ÐºuëP±¡‡ö=ýo×Ï‹ýþ•Ý;èÿKL솚|aŽm¢W‡»è×e ¾ÙM À`Èáž.R˜ÍEñTêÇ›7o®Ãvr]Ê5h.¼^+F¬ ‰hš†íÔIíºÜFÀçÃYéÅj6`TÂOOÕ{Ó?üPÿ¼|ùr~¸¶)(«* zVï˜ÉýCƒœåEŽ3üy>åN{û–W~†¦£²%6’â.L8‰ûFy××ÃðJöø€^îÒ¿¿»³ 99 »Ýަ $¡!$¹–bCzCy" ³þ²éš/?~<Ë–-»"¶àr¹.ƒ"éŠ ITdë÷|Èð>py*زw÷}êš zu¼ $¯/èƒî}õ^†µˆ$ËE‹%³ð°“ÿœùEПVÌøa#ÝÚ »Ð! fÌû–áë5SyâLQ;v¤eË– Rîu(SSS)ª„àv\¡!*Îk¨$Æ6曬µti}'±QIø>Ê* hýÉxÖœrÓ2Ö€Yv &²'¬BR}HB#9.{y0/%98*[·jÍéìÓÁP\ÇÄÄ`0ˆŽŽ&77—M›6ñøãëÐéu÷܈IŽ¢sÜ×$¦=]+õxÈ!—¼&è3íÆ¼âpTp2w?mÒ{áò8±FĜМ7“ž@J‚ð=¶ö_Xˆ„ °òDÎ¾Ïø~ÿwŒw=ú?A _­ï6PYUERRÉÉÉú>7\¹e5¥%ʪèó̲7> Æ«s‹Ã›ï¿ÿþ†(7èU<Y’ñúkk*xú¿ÆPQ}÷sç]Mæ•ùøÕ1ôèÿDƒz¾côìÙ“'NÔŠ^—+v±Lš8‹€;ú÷%{ÛwW­X€#GŽèŸ§L™‚ÉdBQ‰ˆˆ@’$°Z­zQtTT9*..Ž˜˜=\*˜ŽŒŒ$!!£ÁˆÙl¦u‹ŽøÕ|‰‰ Áh«Á@bb"f³Y–k=/>>ž»ÚÕðÒC=ÈÙôg¦O{—”ꯈ‹‹ÓŸM||<lÞ¼¹Áôõöܽ÷Sì´Ñºuûëºi8*©/‡Ã¹ÊÊ‚[tíÚµVx¤¾UóæÍ9|ø0555¬Þù?Ü7øyvì[IzJ{|ø˜ûùSL¸çOµžaµÄòõÁ ´o ‡CœãÆÓ÷'®¨¨¨7F6jÔ¨k*¸jåÍÌâÇ’øøxÆÍf»*6¨&IAð½¤üé)Á—ÿüØ%”;‹k—“ÿ/ü†)'T¢Û åºU¯ªpü\%q­ P!4If|Ï»‰´šþ«WÌÄSYEמ·_±QáCêR“¡sB.]¨ÎWˆ ÇAii)‰‰‰µ®éÓù¼~7½;ŽFÕH’„ÉdÑŸºgR|3’š7H9 -•ü>Ùë¥M‚ŒûÄqÄé3$žÍ¦`Ûjjœ8ìÅÄÅ)¸««”+;֡ᤪ*ï¼3ËñwRw'ùÁÏŽä;k]³sçNú÷ïϱcÇ$‰®]»’˜˜ÈŽ;êL*FÅÌ—?cÕ†yì/œÅúžã@ñlÏ&­Q+:g Ð÷ñiPÏk`ñvP¹ß»›ÒâbâÌ 6œ¸D+}{uä»}_°è£éô¹s0%e•TT_™t3„ƒ*ŠržJü>€_CQ‚Ÿ/Ž „zI(õiÊ”)ìÚµ‹Ï?ÿœÊÊÊ‹b` º?@ý,š&š@ h…¥ÙdÙÝ`ºXn•Þ`³ MÜÖ¾æøX*ªœ<Åùdî?BÇ©d´H!r¯f·ÀueßïôéÓzUÍ믿õñA†maùòË/ó裲oß>}â9}ú4‡fÁ‚ÌŸ?¿^`ý™ 3nê|pCP1—ËÏ_?ZÂä ¿A^Å‘G‡.mùí3ï’g+dÚkSH T²ÿ›ÌÞ¨3fèQâŠö‡?üY³f髼[! ]Y–._Íc“'±hé"6¬^džõ ÉÏÍgÔè_Ó¤i*åŽ*’Zöå¿§M徟ÿÇoz-Y×™““SïähµZ/‹aÔwŸ«Á Ú·oß åJB±nåzÚuH§M›¦´ê2¯ÓÉʵK¨vWSãr±pÙnxÿuï#ø|N„ð1vìX>ýôSþ¯K‘ÝÍ™c»€¿ IÛ4ïÍdðÈD¢Q¬šÑ d¢Hø½^R›t öÜŒô$ÌZ€O–®æÔ¡Ý¢Ò)ÏÉÁËæ%Ëi“Þ•N‘’ˆ¤oMJJºå?\Ó4úôéƒËå"++릘K¤Ùl¢qr|[䮉²Æc/²#$’Ÿ˜h ~UE¨ ’ì½`sccÍhøK²¹£K/ÙÌñYŒfâ[¶báœÅì\ø.O½ñ;TopE3{öì[®Ü矞ï¾ûŽ£GÞ4»¬M›D¢¨ÂëÆMF˦8+«1[¦ K„¾R´€J àAÕXpr«Äëõb0‚™@ç›.I>ŸOç ŸŒªtDGD“”lÅ^TAZ³fž#àõÒ:£-~M + j@мE\>?FEã«/÷ü{º…¸CD·nÝtÔkÈ!lذcÇŽ±|ùrÆ×àZ:]Á”ØÜø£-ŠPsš¤¥RU⣢ƒ„† ‰N"ZYò•Ïž’=zàv»‰ŠŠâ<_þ—™™yÞ#€hS ‚j|˜M$Ÿ…¦éñH²—Ó¢²R{1²IÛv­ù>ó2ÿ¦¢ª*±±±Lžªð+ž´ s=4ošÇm¸ú -|‰zqLêr»9ÝÌî ø|>ŒF£þ]¾ÕrU-°Z­Ì;—íÛ·sìØ1víÚÅìÙ³ñz½·¤Ñá©>_°â(Ô–Æ—'Ÿ~€é³æcs8/y^ß¾ÁLÑïN¯Õ téÝ«‡þù½E+„BÌúð¯HÚ0xèèZÇIIɵŽßzã­ÿs|Ž!ÕEY­—ås¼!2lôý7õǬ^:Oœw;ÅoùBˆù€ÄŒçÆ !„زz‘Ä¢¹€p”U¡™ûæ/þÇþþ{çEµ¶ñßÌöôÞ! % t‘& UPЍX@EQDñDQÄ‚^ z¹ E@Ql ½È¤w! é=›dûÎùþØd!RÄëõý'›Ù³3gfž9óÖç­N–©‹äãûÅÔW‡‹M›·¹ïÐן} Âê7sÝ-Åê>I@;•"À[¢q?1oÆ¢I«B!¢#ƒ Úõê¾Ó€()3‹ÛÖ @H²ZFaPSmL×Ûê‰/>›!¡a±Ù úÝÑV¼ôÎtˆÖíÚß2ä~ÿÅ ±kÇf±dùBç_G,ûb¾Bˆ¹ ¿?®\!¦L™"¶lLB±xþ,1cÚÿ‰¹3ÿO8Låâбñü?Æ !„x{â«¢$?Sdœ9&V~ÿ£ØÿÛn!„S¬üiµˆ¿­ƒxú™ç„B,œïbxýxʇbÛ¦õÂdsŠô´‘š|TÌøäCa.ÎÉÇ ³Õ.þWä¦õpþ[þ–›-W4%îèiƒ‚˜=ýŸ%ùTiœ¢ª±ºpÙ5e©Ò¨_|ñE^yå•K‚ÿv@ew"kT7}.Oþx?­­Îƒ‚¬tÔž^¨=½˜Þ«•t<í{q¥•÷íç U ‰ŽçÉa÷Uj Aá¾xxy†Åi#<8˜ /¾BQq.ƒ?H¼òê`ŠóƒöH_lV;V«oooºu¿÷¿òb @£ñà¶Û;“ŸŸCnvN%)E¥-¬Rˆ ðàtF üu›)¶Þ¤V†BaäÒ}ÈŸ lRuŠá…cÒ- ¯çWú¿Þ™3çвm<>5!¡uÈÉÎ&--™²R-›·fç¡cÄÔoFaq …å-ë°3QœµÖŸÍãY»úGš·h¢˜PãtÚùé§ŸyîùñÿÕ+¯Î4l66lx:U4êÓ…†-ãûúKþuª%ßµØÃ£çK]{ôèÁúõ®ÚÉ“'3qâDL&IIIÄÄİwï^Z´hAÛ¶m)..& €ŠŠ Ö­[ÇÀçkìR—ýõ‰ï\¯:!³ñH}›ù·ÚP%mÛ¶¢¢¢É23Ža,uàççM…ÑŠ )gOê-S–yˆüÌLòòr(Ô´&õô L&ºt###‹W_ûu¢ëìÌÈQ -:´âÄñ4ŽoLyy¹;ú¿e툈Çê4ÁÉãhÙ¦ªÒ2ê‡`[²”¦´”¬-!¦C “„0ñt2ñññȲLEEÉÉÉȲ̲eË9r¤ÛñذaCöìÙÔ)SÈËËã“O>¡GÕ“NIB%äÊ•VA%_n¶ /nÍâÿºDýõWÞµkד’’‚V«¦EB8o¾; ­¤fÎÜéìøõW‚‚‚P©ÍÜÖ¶'­[5ÃnÄÄÖ#'7Ÿƒ÷óùÜÙè=uøùú£VëØ¼~+ 6¤IËX*ÊÐªÕ «ÐéHZŸDûöíéÒ¥ËÑåRèØ§½ÇŽB±W`-)ÆZdæÔ¾ÿ Û´‰ºNîéh U ¬ù6Ö-Ëã‰Ýç£z)§Ï‚§áü‹NqÚ8tø0-[ž§-//ÅËËE’“}ްð:õp©nCgîBqš™ÜÝŸø¦Í©*ÎBðÝ[b=º•#qüó‹õý•·U«*ÊM8œvìN=4ŒÈ:œ8zºÞ¨U^ÅÁÌY³ñôô@%ÉØ…KI6E‡)?Ÿvm;°òÇå$§%£óÖ˜çOƒ°@$¯Œ¹)”W”Rf,û/¼\2§÷ï'ù±g(,7"œNÚEúÓTØ©(h\_ET¤Žàz!HÏmBþ%ñÒ9ÔkPÿÒ=ª´Õ€ àå勬ßsŠõ«×ñѤç.JÌp}^>ÚÅzÔýƒõmÙ†Z#£6PËã.!ô¶ÛˆÜ¶áCçÍË+DQt:- `µZÑjµ(Š‚ÑhD£Ñàëë‹ÅÅ…H’\©{ÙÜdD Â××—œÜ\T²ŒZ­A¥VápXШÕX,´:=N§BPPPµÉtêÔ‰;vü¹á+«ô/<¼õ8+d¾û¬ -š– ç8œÃ¶Í?Ñ¡C»ÊŸ«5£úwZþf‹YK~¦Yƒºuj‡Z­­¶‡/ÙÇ#}ZWû̓ϽI_{ÏäжA(*'*½7¡!!<=bØMÑÿ¿Zµ•ûÞÁ-åÝWæôoiж»‹5;$Š÷u⓹ËÝ¿)³ÚñÒºÖÌÖÃØ2—»‡?Ëê…3Ùq •έbÑ«àç]'iYÇ@Ph]„ôìÙ›òôìJ.w¿]nXG¯!7ƒsþ§óÊcNœ8!ÂÃÃÅóÏ?/„bÔ¨Q¢iÓ¦™ Oµÿß7\øúú @<õÊåC¬›¸ÎÛ-–îÝ»‹¿å¿¤×aJЏ(µàšä­·jµ]X…M8ìåÂîP~#‰[!U= j“Ù³gÓ»woL&YYY4hЀôôtê֭˹sçÐét„„„¸·9s†ºuë"Ë2©©©Ô¯_ßý]AA&“‰ºuëVއ‡©©©ÄÄĸÿ–––RXXH½zõÜãÏž=‹¯¯/¤¥¥í®v©mŽZ­–ÐÐÐjÇŒÅét’žž^mŽÙÙÙ8N¢¢¢ªŠŠB«Õ’ššJlllµs*//'&&ƽ-%%…àà`7ÑDtt´ûœ***ÈÉÉ©vÌÚæƒ‚´´4÷ø‹I;E¥Z”J½\–ª¾‘©Še)n Þ|óÍ*[!¹‚\?›rÙ¶÷†ˆ==ù¤Ç=œ=| $u5Ýÿ+Šâ.ê«bïðòòB’¤j.!³ÙŒÑht§28p•JE÷ž½°ZLXÌf,V(N¢cë¡’eÒSÏbw Tª¿vdéÏ"QQQnŽLD;D^øC†>J›N’½(±–bשQ…µK¿â›ÏçSšYH¯Ž·3êÉQtíìò8ÝvÞ™ó9;÷o!;#›5Óæ‘ض YùE”iôÌ^¶ÌíiP½õÖ[ÝuÂBæ~6›ÆÍZbµ;¨(+¡¢¬œõ›6³uÓFâ5âìÙTJJŠÈHK%9ùe%ìþm}úôÁTQQÙwYq^–Ñj4¼ýöÛT˜L„††2oÞ<AAAÌ™3I’ðõõeæÌ™  3gÎt·¼˜5k‘‘‘”••1oÞŠeO¬%&цÍß"ùФ L”/Ó§Ë$$D_5x/&q¾X æÕW_eÅŠ„……ñúë¯Ó¯_?Ž9‚$IìÜ¹Ó à›YCS»×%+ï/Û–WѨðóóáIï‰ZV!©*µ„Pd$ „"‰"'v» ÅîÀf·a·;=f$Zµ„„ÀEwÛ­ÝݨT®Ã]Hÿõ{äBг߳bßhéÖ­œzõQV&èÚì~äFõùlú*zhG\„žq£ïÀŠɇ&Þ4à–xãóBš4i“O>I—.]?~{»\‚—ïÕ³V¯ÉHï-9q¦ƒ‡7Öm"ó\&žž^Ȳ„"œ iQi´8'zo*Ê̘Ë-Ȩ¸£G/l3:B– ãËÙ ùpO„ÃÌ(°¨ª¾X.G„ôø ^WM©•“|zÑõ«±ª^¬ún lŸ^ÕØ×Ü”þiþý÷ßsêÔ)† {I’(ÌÏE£ÕòÙgŸ1hÐ :D£FP©T—e>xúé1LœðóoáŸï¼‰Ãát¹-µ‚½G`ÇŠÚC‹¯Ê‡â²NÎDšFb8y2õêÁûÚk oø…øøÍnèþìv{àýôÓO™8qb¿)--¥Q£Fµ¶p»XúôéÃèÑ£™4iR-#<3æ3÷«pÆŒ Ï–}}ø5yiVXùá4rSNS§]7Îíú™”´ü‚"ˆo=ø¦oW#µu½\¼x1'N$""Y–y|Ô8öH`íöC¼üÔP†NDDùùùnµáøñã5¶œ«’9sf0gÎ ¼¸ÿÞî|óý„”;ýp(%ÈH¼tß06ü¶‘ø&Ùµ+ œå:Äw'#ekÉ•Á[RbÂj·ƒR£UýxDeÜÏ8Eeۺʯ¡¸†¸Š~Ý=|„pñ‹"I(N'&͛տ® úôé½ ={ö¬ýÕjΜ9ã\‰ƒ$''§pcccùôÓOÝ7 ,̘ñÈÖþìúî'ž˜úÉY®m÷Œ|áüïtÑVÜ2àV‘ßÔ$Æ #%%…ˆˆ222ˆ Õ±oÿAú¼Ÿ“yšùŸ¿nxyyÕj@_ª3”óÍ÷®¶Sj­Š c»0yJ. £[s,s0=›ŽÅâéK÷vj„&oCë·¨yò™ð(5#†¼þ86¬–+»UÌf3K–,©õuwøða222p:n7ÍÒ¥KñòòbÞŽSX*ÀXþ ÒƒÅ Çv®dÕªU¼úê«Lúâ(þ~®*­AÆÃ'”æ+è=dÃ!ç‚ÎU ¿x™€À·E=kÖFž}¶ëU@êÆ³`=úè\ŠŠ¬<ôÐí•«Ÿž¯¿N¡aÃPâââèÞ½;6mgÖÔÉÜÞc æŠRޤqB[¾_¼^ÍÔ¯g°bÑv²RFýÛ»ý.›¤ªú%..ŽC‡Õ \/}í[~Žìõ=gαyÿ›(œ7ò2Ë—Qn)@cPá%+„µhÆÊyôÀÝ÷Z°-dŠËƒ×fw Öhq:ŽŸ¯ñíûѨë~\¹œ‰ÿJâûŸ¾eÅòÏézÇ]Ü?ôAdÀ®(dd¤¡Ói‰Ž©ÇöÍk‰mOqq){öì¢Ï]=¯ª&þã?¾¼7 ²Ì<22’ÌLWÑa¿~ýظq#=جà ¹9àgޤ£7¨ñöñ¡}û´oßEÈäeeàé¡E£ £¸ÐV§Fï%£Ó@~Î\I¸’I’ŒÀ†¢¨QË2eF+“ƒAM¶±Œ‚C)Œ;=ÛÑj|)5KxùÔ|Œ? ÂvaÜyýêZ8¨«r.oM‘Ï@Œ¿Ïeu.÷8uBã¯ÂÏ{ß%àMOËeêÌÓ]YÙE†zqdîÞ€«ÍÓ?Æ­•ß•,†ßmÇo¬¬ìÖy¼Ó§ËDÔÕиA ÷kýz"lá¿L&»Oí~ó+V0dÈ¢££q8—ô8¯’ÆqÃ0–±ZlH€¤R¡8huœÂJi‰NƒJvâ€`.ÓÓ0‹¨¨`öíõD(Š‹‹))ý¥ö•÷&š 7lO&“ _ßK;·OŸ>^8o$+ )2fà~ÕûÞw"éŠà¥Ê€ÅÇ­ñÇÅ=Ç·KûÓþþ9<{oc^}g2¯Œ|'ÞøNwÞOÒKˆˆiËÖ,â…÷–&Nœ‚UwÛ àà®.cXöÝzslÿ¯4nÑÏà†ØŒÙ4j|Ky M?~Ùù9ãÞ¾¡w,»Ïoÿ”üÎ5ûlo¿ýv·Ý«W¯Z÷sâÔÍ%Éwƒ÷“9o#«$w^­E–P‰ÊŠT•„$,$©ºóÙåY8oÂݵÄõ½Šç†'¢Õh¯k²çΫ¼áá—‚4È7?Ÿ0ŠJ³®jß÷v}ÞÝ´ôÊo’ómÄOú'ëW¯‡˜õà –í¹ÿ¼³á‘×h׹ʥT dðî»÷ðô+9„ÖmŒæÐoàt l°Çô>Aäg§#ë¼4~•ñ#S§>tÉlë7îw]C///ÊË˯8.«ï»hŒÙ5~WU{x£Øc¯¼Ù'¡’–Šrîyb v‡Ê*Lxûx»TV¡A‘ª+Ï®¢KI(a:9²}+%…ù¨4jÕˆ x1üñGêK'HÇÉŽÕQØÊ‰®½syöQ/bZ –YŸdfé—„ &qfͺæý÷ß)Ä„BQiKÖ¼ÍÃw¿y—B"»à4Q¡ÉÌ;õ».bϾ=EÕ¶…†¾HnîçÕ€~‰ôÃ`f}9”Ùoõ½ðQŠ€2à\­¿Õéügg!—bdDûŒqÈ*™«Ëµ¡àé-ã“[{¯jï”mX‚ÔøÝš5k4hjµºVßû ^½FPîT£øG±ì‹%ùb³*èõ®6Í»p¢ÑiQµÚT³É§—•¬C¥vPT˜OPP8²Æ µ¯ 5 ”epaí;ï¼sþVyjxçƒ ôäÅÎuÝç÷=íÇÒÒ©»'éÞü¸ÕLDD@5}`Ñ¢E >¼Æ¬îê³éÇœJí¡jI’ÉÌ;E~q:~QÈÒµ«<¹¹_q:m? ¢#j äòì#}/Ú^øµ³¸oÝÚE‰dë¾ùti]=4^lÌ¥QL;òŠÒª+;Š@‚«¡j–Àzµ~_ÕÞ/66–'N¸ÛgýÑâ6Øžyê.œB  ˆÂËKK ú(ûw¤à…wöH$lv;’ZB%©°ØÌxyúòÑ«SÐid;›Íʶ_¶óäóOPRR†-ó(O=o¼»î|ÜÚ`0`6›×d7nÜXcrÎÂ… 1bÄUï'È/’¯~yŸGûN"§°ö0¤‚ï7ý›‡îšˆÅVñ»æÅìe¯Ñ¯óèjÛžÚDÛ&w¡(Κ$!ð>½™²†w^9hsn/ ê¸8"Âë“qÙä—Ël‚€½_QxÛ£HŠóª"111X­V5jtkÁûÂè»@Ö Ù-8NrrŠ ò£ÌXŽ¿¯©²€N£ÓQRZîêú'ƒ—·«ÅŠ 8/¨Š@#iÑûyãp:˜2í{ôzëšìúõ믻5âeƒ j=#ßoþ?šÔë@—VPRž‡ÓyÞíͬ‰$4èL‹¸®˜,eµ‚wÛîUÄFTÏ“øyûL*L¥<Ð{‚û)ºj~ÖÐý_’Ûªz–KÜ@ßH K31è¼ðöõ¸¢'áBðÚüêžô>Ù½_C{Acë«‘U«VqÏ=÷N§#::úÖ‚÷=èÒãj“o¾ù¦Æ$œo¾ù¦F½÷fŸƒ¯W©Y‡8“q€Ü¢Túßñ^~T˜K9’¾C=E·£¤,¿šIÆXž_©»êøèñÞ mâ…Å&xog1ŸÜæÃÏçLzë8•oåöXC?ßOÚÙ@BHzLN;ŠÆƒ]GWqßmý1žØ…!óºÂ³XÂâ±ùDPÞ ²Õˆl·ðÒK/1{ölL&ÓuûþýûiÕªv»ý²Þ†?½Kàò6(8AØÝ9—“¡C‡^Ó±jócVµºÿ#EAIY.~Þ¡´‰ïCßN£p*JË p8íô¼}8)p8ìøz±mÿ·û×!=ç8ï/¨®§N¿ÃŽjï+¡S”ž™g,d™ÿɵ2¯w Æ\6ƒ®Òrʼn٘‹Ê\J€ÃJçºmœ6l~Q”6íG^—ç1Æõd£ ¢1?ìÈ¥8°+Ž_À²-…veo~¹^]X´|Mµ¹$''ÓºukÚ´iCBBÍ›7§M›6´jÕŠcÇŽ¸uÜ?·áZ¤°(›ÙBxd]ёөGhsû£Ìš<µ¶ö碶̦k• ãì&ññ bíÎùtn9˜;Z &¿øAþQŒ:“ÓçöìW/Àé‡]­Á'Õj{¨êÃÙê.¼ÝGWÑ>a߬ÿˆ»:Žt© On¢]³¾øz…àpZ‘$hs{gœ ?ß`êÖoŽ$KÄ5k†©BA«ÕÎ<À¬Y³èÒ¥ GŽgøA :”¬ÂBÎIæÍÉïÑ¥K<<<øùçŸéׯÞÞ×þÂŽ¿1 œ¯$Jåj*KðÒ?^D8ô»·?/-ëÖo!,,˜ƒé…œÜ\æZÌÅÍIû»˜…¼JRRRhÕªÕŸ¼š$;¿z*¦ÃaC¯õ¤~”k¾NÅÝi'Ð/cùÕ'ò„¹òGÚ6¹›¼ât‚ƒƒÑªõÜÖôn÷[áðŠ8tA›V«ÃjµT‹FÆ7mAvv6ÿþ÷¿±Z­(ŠBZj {÷ædŠë©ß(žÂÂBÂÂÂHOO§¸¸˜ôôt4hP­’â÷È…í†nšÎ›ZšÁÌÉï’YJ\“º¼ñƇ$Ÿ9 'dËÆÍHA¿[ù¸ÖðpmÛ…:ô•>Wݸ›ý922’¬¬,6ï]FïÛÇj7¹ç¢×yb±VT›WvÁil+ÑaM¯xUIS¾NÞBXP=‚ƒƒÉË˻켶lÙ‚Z­¦S§N×u~Us‰Ål6_S¯ë† ’œœ|sWÞß(>úx6B€Ížë:pýfÞrä_ÉjS7.4þ®ôùâmV«•>}úÜÐyVeY !èÙn8þ>adœ_W¬ÿˆ~wáA X±aм—;_vÎ¥wû'xwÞ`ž4Õå¼Òï†NzzzµœÞßsí.þl4ÿðªík2Ø$ tÚ[Ûß 55õ¦í»K—. 2„~øÄÄÄKø.›ÍÆ!Cøä“O.¹©ÕÆÙÍH’Äñ³;ÝÛèýZcs Ï´kÁeëåáOŸ#9prÿú–Þ¼¼<7ëÐ-7ØŒ6²Ó¥‡ Eåj}(dJ*,$gg"¡ÂC/㥲Ch]„Nð8=ö"ƒE± ‚Ò’"Vÿ0 ?OÔ 6›…¦ í¯{²µµƒœ<ù]^šuõìßz_Pß\mÛ¸qãÈÈÈ`ôèÑÌ›7¾}ûMZZS¦LaÑ¢E9r„zõêU&Û{Э[7>|E~¬üÓ4йܢ³ÄÕ½’²\æÿð:¶r….êºÇu»«9`æˆñ<§ÅOËw2a¤Ë ‹n@vÁò‹ÏѦÉ]^eÞÆÍtþi¼ ù¥xøâ0YIKOC£Ñ Ñ{ p¢5åñê¤y4lɬi¯0ôÁç˜ôÆ(< v+vµI€¢X™óé?±9l– ´Z-fÛõ¹²>øà ëÖ­cß¾}çW!//¦NJTX¯ 늧N¡çˆYÄ'Ô¡Y{_æ¾5ô”“4oÞ‘Ñãæ¹1ÓxîŘòü?xetõŽD  nݺdff²víZzôèáNøY°Àµfff’RiÄ8žyæfÍšEpp04nܘ'NÔüŠ“dBb)-ÏcÊâGép/K§ýHzZ.-ÛEPœ_A¡QáìÉ"BüµtíÍîYägÙX±~ +7¯fé{®° ¿¨j“[%AAA·tõ­f°dfd¦¢¼‚ÀÐòò PéÔhõZž5‘´¬4~úásL¦ 4*I£Ð½ÛpNžØÄ°¡Ï²zãNzõºƒ±¯O¤EóFü²/›`o¹GiÛùÎë6ØÖ®]‹^¯¿dû¸qãèüàÕ§ÊzÐÌÓ½š÷éÓ‡'žx‚Ï?ÿœ°°0¾øâ z÷îMXX9999r„'N0dÈ$I¢¬¬Œ={ö`6›¹çž{Ü*Cii)¾¾¾lÞ¼™¨¨(233/Œyñõ‡hÔÚ÷²sÝšt’¯foºâ9_1Ÿ·ŠõFõ:¿Õ[5ð¦œJ#,È€G€?'v'qß±lÛ³‡pJ“É„_P0YÙXÌ.—‹Ýaaù׿ðл1îÙEü€‡)3–q`ïo 2AaCŽ=Â´× ÞÚˆö®W¹ƒ­k×®TTTpðàAV¯^MÏž=ݯѫï”[Þúõëc4iÚ´é­÷6„DD“›sŠX?o·ë¾ƒØ{h?²JK@H8Mâ;Y?†íÛW’Qf¦¢¢”± ¸»oÊË*P5m®]¹ð0^™ô>f•…ó—°å—ù¸ ¯O´Zí ƒN§»&2¾·ß®¾ÒoÙ²…ÿ5ÉÌ̼"!øæm8rxÙéç8u4™ÂÜ6oÛMfV)ÏŒüsfÏæø©­üôÓB²ÎåÐ÷®¹«ë@ÊJaÁf73gî|µr;Ÿ.]ÃäO>"õÐÚ†8‘T7d²{öì!11‘””²²²HLL¤¼¼œñãÇÀôéÓyíµ×ÐëõŒ?“ÉDbb"»wïÆl6»Ç¿üò˰lÙ2‘e™ñãÇc·ÛILL$)) ƒÁÀ¸qã(//gܸqèt:6lØ@bb"V«•ñãÇ#Ë2ãÆcÁ‚1~üxÊËËILL䨱cœ={–ÄÄD***?~<þþþ|ðÁ¼þúë¬^½šÄÄDl6ãÇ'..Ž &°dÉüüüxùå—Ýû²ÙlìÝ»—ÄÄDÌf3ãÇÇÃÃ×_™3gȨQ£ÜãsssIMM­v}üýý3f o½õ>>>ծϱcÇ0ÕÆ3wî\^~ùeT*ãÇÇjµº¯V«e̘1xx\[²ÕéÓ§o¬Î»#i~zôzo<<õ„‡…1ýÓÙÜÙ½=E¥¹|¹ð{$»‘cÇb±™0™LhU»•iSòÚkÏq6ÓȺ¤ Ü7â)–½ûþ~<6gÝý®?HñW§Ó‰¢¸ùeY®•íÏ,Æ 8°ï'Ž>Ì=ýz‘‘UB€Ÿááá$Ÿg ‹W¢ím ÈÊ3Qž²L‹/qþ&Z ~FaƇï»úã?2`À€ÿyàZ­Vwõ­ÃápG===)//¿å®¨«o9|ûé› xr‡w¥È\Ⱦÿ!28’‡FqXpªØAåJåBQ’dG’DUÏu$ ”J¢ÙÅ{ƒ,) T(ØpÚ-„FÞ^3xÿ–[·úVEÓÒÒøüóÏ/Ñ©ÿÌ¢}›†Œ(Æh C–+0›­èõ@…„ „í ¶|Fyqõš5qÑà:Ùuþ²]ƒ$ÙˆiY‡MI[P©Õáå቟¯'I¶ÿ Þ?BžþyÆŽËK/½Ä;ï¼ã&ðB Ë2÷Þ{/Û·ow—WyRÎ;GBB6l¨lDèR%&L˜@ß¾}ùøãiÙ²%o¾ùæŸBÍ€F’Ðk}‰ !·( »u^žl…j<‚Çbðüœâ¢4ÊŒ€Ýæ‡ÆƒÒ’2„Õ2jI…â´  ½µçø±“¨tZ¼½õ¨%5åÎRvmÞÿ7xÿðÕIQ8|ø0ƒ º¤Z’$, Z­Ö­*Øl6ìv;z½ž²²2RRR®É»•àÕJZ'f¿Çš ©4Ó:8"WìÓ€¼¢\ʼnÅf"Ðσ‰Ø:P«$$$N²M¦sÿ¶¤¥œ£4¯ˆº˜‘ð!‹æɺ¤u5{þ–›'’$Ñ¢E xàÐh4È²Ì /¼€ÍfÃÛÛ»Zâ‘V«ÅËË ƒÁ@»víÜûøS>˜•ÞK ™¨Ð@V¿wM àÓA÷WQtšˆð0äJÕÀ×׆õÂQ{©Ñ™ÐYPÙ‘¬hümh‚ÀÛÀáCÈÈÏå×U0ê‰1Ôîçý[n.xÁÕ‚à믿F£Ñ (Š‹ªJ£Án·#„Àn·óè£òÕW_!Ijµš–-[þ©ÏM–àá÷³p:œ8zƒ Z„²,ñØÛ’«§ÍÄþ¯ú`ðò&?/{™‹e_­YRát œN V› ‡dÅFhh$Ù™¹8öÚ]eˇÃA·nÝèÕ«—»Óc‹-0›ÍîÆ‰îWoy‹°gÏœN'+V¬`Μ9a ±‡‘S˜CX ?6«ƒb“‘¨¨H,&'áZŠ4¥ØTÅ8œ´:5Â)ƒC¦MTwt2i©H²«¸¡NL4‹.½ñà1ccÆŒ!==ýªJÚõz=ÑÑÑ<õÔSÌ;÷/ àÓ§OÍœ9sX¶l%%%¹uZ‡Ã,ËØl6T*•ÛßëããCNNÇŽÃn·Ó£G¶nÝŠÙlÆ`0ü©ÎQwÅ£8eph˜Öõ !u|Q{Kd+¡M¯—8º}³™ð°©ÈÒ¿pÚhôŒ%FdYF­QW¾y zõìÅÏ?l q³ºd¦§QVQN“¦ñìÝwàÆƒwÖ¬Y,œ?‡& bhÑéN6oÚD»fõ)UôlܸÇÂé³9ôíǪmGÙ³ïyÉ»èÔý.ú÷ïÙ×ퟵFíjdĈ,\¸Ðýqq1¾¾¾×´jVlW“ÇðGJyÜùz÷T€K¦ h8p` !þ>¤ŸË¡}ç»È:wƒÇösw>¬^µŽúõШI»µÎ@Ê™#Ô«ß];’hÒ¤ ™YYx{k‰ŒŒUÌÍo“Ê…Ò¥K7tj¡^KÆ<ýø%Ý'«ÂžuBбcGvîÜYm»Ýngâĉ!„àwÞ!88¸Z’Óétw£ü[ª_T£ø[þ–k”æQñþÇÿ'RJ„صçˆ8d¨1öUQ"„X—ô“8»û'ˆC^Æ’ѱQ•øÇëÿ'læ !»Zõ‰þ½PˆÊÞRP]!„§Ž€i)ÆNzO!ij#î€ð÷÷—¯Gݶ"áÎûÅ”O>¶¼câè¾Ý“f-ÆÂ,ñôã ð/Mœ&Ö­þ^ˆ²3â…§F×3!ÄS>„ @¼öÒ(qg‡¶îï„bÒ«cÅK#ïà!R \Û¼Ô®“ùyÃ1!„"„¢ÿ{D¥;QL[²^L~ã}ñ@¿ÎB!|¼ "ÔO/Zµl)@-b¢ÂnéÍÌÉ/¾d[^æ9±tù·B!Ξ:.„âçŸW‰U?¯ºîãe¤œ«Ùýÿ÷«gRÒÿ'I‘ù··áoùo”ÿgï¼ã£¨¶8þ™­É¦W $téA:" ÒATP±€ØPÐ6DÁ§‚Ò¬¨X±¢"EŠH“Þ!Þ{¶ïÌ}l²I( ‚OÏçÙ¹{÷Îßž9ý”˼ÿÒ¿ô·”y}Tþh¾}ÂT!„†²÷a¡!â¶=|çÝ—¸~ÄxQ«F„ÄÝ[‰és @\Ó´¹o®û @ íÚÜ'.ÄEG‹Åâ}oË÷ÍéôxE‹Þã²Ya÷Y¶n‹ˆ€xsΠѵï°+öÈŠ«ÝLìÚõ›øüíW„B|ôÅ×bÍÏÄ’%KÄ©S'„BÌxõuñóO?ˆ6=F !„x÷ƒ íÛå›ç«%ËÅë6ŠE&6¯_%–­X-žú„8¾y­8vp°;ÝB!fÏ}S,ûî¯Ü7n‚Äæ­;ÄÉät±èãÏħ_~#î¹oü?JÞ®Þ=zˆ.:ˆ÷—ü$„â•éÏ E Å"Ìž.zôè!Ú¶h"Ün—Bˆ‘·/L~@|ûÕÇâhJ¡H/´‹ØØX!„m[·óyå¼_~üBôèÑC!D«ÖmE=Ä˯ÌÂeŒ"Z4o.¶<å½I/>/À,Ò ¬¢v|-‘“•!âë6=z\/2rŠD Å"nèÙC¼·à%1ãÕ¹WnãLQâP²G¡‰Œ”S¢{玾 6oÙ"nÒ_¢cÿ{Ä꾪pþƒ¯×ˆÕß})ÑìDˆQÞs7 ¼]ÞºS4¬[[DÔo'¾ýt¡0)Þsóß]&™p·ÄMZˆÌ“^¥¦^ÛNbÔˆáÿ(ðJâ_ûË¿ô7¥c.ÂN+„ ²„L•{ð¶lâ/ $$~ܲÁµQþ†…—1véqOªä¼B†ßþEEõH|öÑëÎyDe…¤…¯ã+Òÿí¾©lÚ´•N:R3®&3_šÉ-·Üâu–õu%  Ís™û4øtÝ&v”£˜$ *ZQqšÓÊv‚›®ë€þÿ!|Nð&4¼–9/=Í5MZS;!Â÷‹Þ°~é99x4Fƒ#²jEV$Nœ8Éý÷OðºœxÁ­!àOõz¸r¤±aó6†ºŤY ‡ÕFNN.yy©€ u놈‡Øa»¼’˜Ç^Ì„åIÌðúMM~ÇlUÞäѸwiÊÿ5®Rl$‰´´T¾ÿ~)»àé'÷Ë)LaÊÓO ):Ì~&tF#ï̚Ϯ=»hÒät¹ËqãS7¡-Z×F¯øávidfåqëÈ;þ–›H`PnÕÉÉ“I”–ä SÌ Ó£¨z"Úô¢wãB7ŽâÖÙ—ÍÛûÍ­ÄG‡ð`]¿J¤…!Í«Q”‘qÕ¯_6ðž™v²qýr>ýbª»¼Ä¥†$ɘMì…$Å™%h¨n±qq¤'ž€ëº‚ͳ Hš†Ãã +5døÛnVqA>ÙÙxl…ÈhB ¹ ºPqQžDçv!”:sà@åâç…ª  ›ÍæK+ ñ;vð7Ú¬DËöàn‡¨ÍY¼5bêV"WI>†€ÐxŸ}vñµjrMãÚ8íNw3©©É¬]»«=›n¼ ?K_®ZGffaáD…Rš}ˆÐHêÖŒóÞ5¡rï½ýè?ð&Ü.’$“”x”›ù›r IRj&²¬!©eâAv…ÁO>NÞ;óðëC@Ë ®ÿ<§‚°mÛ6Ú¶mËÌ™3yòÉ'}³~ñÅèt:BBB¨W¯!!!èt:"##ùñÇ‘e™zõênFþõÜ/»Á†ß¶#õQåŠoþê7–Œéù Þ³„ÏiÓže㦠¼ýö‡Œ½ïaz\ß—ÔÔTŠŠŠð3y+“+ª“P¥€&±f·,Co?†äÎeÿß8º/ ±nÍO9~Š{îš@aA{÷í¤Fl §N&ýMee}ç¬ þ1Ø• Bc¹÷õ¹ôwRnÕ-ô¥*A‘z®¯.#Îh¸8nÜ8„>à9rðöç6¡©œÊHf⣢iÑqõ±ø[HIÏà7ß';'Ÿ¬¬Þ˜¿1wÞΈáÃq»]$%%]±æsx³t:rÓRhycw:@iVû“~‚è ù„¹‘œB‚t°ú¹\ÿ~üñG"##Ñëõ¼õÎ;<óÌ3<2q"íÚ_KN^û÷ïÇápøùðÃI£† yóŒ‰'[?LÎú/ÙU$aóæ•s¬wóν´h\÷Ÿa*[üé2lŽB6ªA‡ö=éÞíÖ®[ÅâÏ>%//Y‘¨W¿zEÏK/¼ŒÎdYÛUÊ[o¾ÉɉDUÁíÖ˜þܳ\ß½ùö®mÑE§CVüÈÍÍaù÷?ðÄOR³f­¿çE°þç $ãxŽÜ\\¥%ØKl~þš…ùÑ&N¦ïõÔ4sdY.+~Êæù\²Ùøó:wí‚[³£—+¦ñ,[¶„Î;€Ðp¾þús† ¹ùô7 q÷jO/ø„®òœ‚õ“»ŸµÞOÆ ³qóLJþoÁ[Aæ-)- ## Í£ÐñºîÔ¨C­„†äÒ¸Q}š5iŒE–p‹B¶mø‘C;7rh÷ð”¢I6݊ɤШc7V¬YCÚ©,ÂÂÃ9xèn»ÈðPúöä-ëó÷R×Ð) 7º9+ÍíŒüðêêY$B*á :YÆ#ËÄD+Ô®Œ‚‚¤Aç®]¼ÀýÝã~À€A„„„ê­¤Y\Õ§(ÊV0mÜH~ݾ•0³Ä­ïoÃ^”Stï¨.ÍjбvYY…ÿÿ2¯ƒÁHõêÕQ…‡'&?ˆ^/<´f½²äÆi×ð 0ûóÊ«óÑTN¨¤¦ãdr:E%vT³DfF§vï$*2„ü’"4M¥y㦌þ¸y‚ ¯}L¦5Ž1ŸDg2¢7ùáð f.n£Õ¨ÿÿ¯$Iø[üÙµë7Vüð%n§BAA:žÌô"¢b9•t”“'O2ö®{¸¡÷ ´mÛ·ÓF“&½:xbÊTýeæÏÍ+/Í!¯àwÞy;¦‘•‘‰æ*!95‹  `¬¥Ö¿Ýfy<Ü'F“Ž#{c6ùá0ûsm; â„ëxô'ùš·=jíŽP‹Ý¨š„N¾.ïÁèCâñ“¼ùAS'ŒªJ·fîÃÞ΃ÿýj«’­ÈŠ(ç>ŸÛuyÈ’Ä?,§{Ÿ›ØþÓ7´é9˜÷>ø¾XÂûo- fhžxj#Ïç¼Ä s^§K^ÔªQƒ0?Ñ€/-`í'oQûºÞH’ÄwŒdáÓ qsŽØÃàøzÉRþóÐxjµïÍþË™óú,$C€WY=3Ä,==S¤§gŠÂÂb‘••%233ENNŽHOOÉÉÉ"33S俿Ђ‚|QP'òóËþæeŠÂ‚l‘—›) òs…ÕZ"22REvV†ÈËÉE…"%%Qäç犌ôTqâĉ¿eÞÆ…Éä/L†a4аÐh¡'\ln.²Ö5?¿TWÜsïÐ ŸQ…&„ð\Ô÷hšS´ê4L¼<#Þ˜Þqú!„¸½owѵso1þ™×Dÿ¡ãÅ·ï¿äûìÊ– Íã%6‡P]6±î»%—e/V~¹ÈÞ©€ðWzsÄñÔ,±cír%^ï ¡jB8\šˆ ®Ú¹c'aM>\!–üÌ×zsàYçîüùô¸‹]´¦i•Úÿ}üèæÍ›„$™}›9eÊ!„vO;QPp³p©—þ;Uõô¤«/÷ë.Fß~¯DPÍâ©9‹„=ï”ØòãWBQ\Z*z5®!®iÖ^`¬):óÏFÿ—þ Ÿ»Ž5ªB* ^ýõÿû™÷ÊÏy~ò}£„ÅPáXÍj¡" ðÿ'ýäÉ“$$$°xñbn¾ùæÿK%¤¨¨ˆ¤¤$ŠŠŠp»Ý¾ª:å¯Ýn7ÅÅÅX­Ö³þÙívl6[…¿å¯NçYó]hÿ_‹Å€x÷ÝwÏr,µoÓ‚­;v³ió/´oQ——_{›'ÿ3…É/|ÀÌÿx°r÷m"¢i'6mXOÇN]xyúd&=õ_Ÿ¡`õÒè5èvÖíI#Z_ÀãŽã»•8œ-X¿ø î{p/=ÿ}oGã¸ð³í¼W3åååÆ¿tuPyƒÅ?JÏ=÷œ¯~[ES‹ª :4$C•QWU`í¹º‡x³óË›nÙ²…ÒÒRÀôÞê;¾cåã·nÝJJJJ…qåc‡¯’Mùø½{÷ràÀ³¾³¼ 篿þZa®ãÇûÆ9¾¨¨¨Ò5¦¥¥UºÆŒŒ Ÿ;¼MdòóóÏZãÎ;9yòd…y·nÝ €Ýn?küáÇٿÿYk,))¹è5&%%ùæú#T9pªð·3;q5»uÅWó_œÇÃvU; $‰Õ«W“@rr2qqqäää`³Ù¨Y³¦ïXbb"ááá’””DÍš59uêµjÕ¢´´”¬¬,j׮ퟔ”„Éd"**ÊwìĉÄÇÇ£iIIIÆgffâv»‰õ;~ü8±±±FNž<éëwG^^¥¥¥ÖxâÄ ¢¢¢°X,¾µ•¯µ¸¸˜ÜÜÜ ×yòäI‚ƒƒ ñ+ÿ»ÝNZZuêÔñOIIÁ`0œuMqqqȲLRRR…ùsss±ÙlÄÅÅUI@@@•klÚ´i…î— ¨², 4IV|Ñ¡‚Ó‘¢¿g¨.áÄ(›Xê(áxA&.\4ÒûÓ?¬f¥á¥9x[´hÁ®]»ÈÊÊ¢¤¤MÓ* 0‘e“ÉDll,¿þú+íÛ·'9é$?®üÙhÆéYhÖBR’R¨²uû~ÞZðê¿Ïô¿ˆÆŒããüšK£[Ÿ~d¹­…)>ÉðAƒNŸ$Mx^a(<nì71_¿‡S“9pòáÕb ¤»!œšê+N}ÅÀûñÇS£F $IÂÏÏ€€€ åì…¨ªJII ¥¥¥¾àø.]º°víZâãk‘œ’Alõh4 55 EÑáq;}œã_úkhðàÁäççûîÛøG'rßìYLœò'OEg4›xŠÆ ["›ÛÈÒ>cÇOk¨ʨ¡Ã¸cäí„E„3wîoïIL@…Y¹øU‹aïø‡(9–B~Cïy‚ž×·®À~ÿr™Wç±²cë6>üê{Ú¶íHFâ!ž|l©'ö³açab‚7lÈ+/=Oý„šäÛxûÝELŸ>I’8u* Mu‘”œLJr2BSñ¸½rè¿ÀýkéàÁƒgºùrÕ÷|°èMz~ÉÙ™¼<ì>j5¬ÎšC#Iâáý¸¥[o>Zø!õ¯kKË £ØbѱܓMÍqèo ÇG¾Æ[‚Μ@ïz!T 3†$½Ûí¾rà5…T£Wß¾Ô 7òíò¥¿0zöêA`d-jEú³üÇ ¬XµŠûÆ?¢/¿åð‘#Œ3†)S¦T9çîÝ»™={6‡ƒ;w2wî\Ün76l`Á‚¨ªÊš5kxë­·BðÃ?°hÑ"Ün7Ë—/çã?`ñâÅ|öÙg¾'Ä7ß|x»¾¯Zµ €… ²víZœN'o¿ý67nÄår1oÞ<¶lÙ‚Ýnçµ×^cÇŽ”––2kÖ,Ž9B~~>³gÏ&==ôôtfÍšå+={öll6û÷ïgþüù8Ö®]Ë‚ Xµj~ø!Š¢°xñb>ùä-ZÄ÷ߪª,Z´ˆÕ«W£iï¾û.ëׯÇív³`Á6oÞŒÓédΜ9lÛ¶ ›ÍÆk¯½ÆÈËËcöìÙ=z”ÜÜ\fÏžÍÉ“'ÉÌÌdÖ¬Y¤¤¤ššÊ¬Y³ÈÏÏ÷)”ÕªU`æÌ™HH˜ z:ÂÑ_¶Z«& ¾ý‚ñ݆Ҫz]Z^Û iÜ>`ÎH>›ù:ÛWo#À,Q²ÅÉ£-gÓÁü6=—ñP›£l|7’ÔÃ1ìMÏ"5WO€, x£BVö_*6H’D¿~ý9r$Í›7Çn·ûìåË$ EQÐétX,rssY¾|9/½ôëÖ­«T6æý÷?àÖ‘#Y½v#§Ž¤óµÍ ‹¬†%¼&Ri‰é¹œ8v„î={ýË2« !Õ«W'//={ö ª*5jÔ Q£FdggŸïïïO›6m°Z­Œ~é)6‹§µSZX&P‰ à ²„æP±ç§S˜’GÒ¾£œØ½¯Þþƒ°yíaÒò¬‡Rà4£J5rC:æâ·Iè3œG÷÷´6x<6mÚTéÂh4]w~Ì©¤¼üÚëL{ènZ\׉瞛Éu­šrã€~ìüm7C†ßú/J« éÓ§3vìXz÷îÉdB’$Ün7GŽaíÚµtéÒ²³³èÖ­›é<òÈ#ÄUG÷PoŽ,ÝFHL0aáDÕ‰ÁZh'åX")‡ösòÈ1Ò%R˜‘…É`¤i†´jÜ‚çf>IƆ¥è:ˆ=züáGZ¥^Y®þ/UM+V¬ð5ç>óŸ$IŸ®tW-’b»‹''ÞO›VÍ+ÌQ\€Ž;ž¾ÈÈ(ÆŒC»öí/ ¸Öodô˜Çhvk'âZ7!X²ðÔu½*îþh7›wß}—:uêTúk5 >Ï×_E]»†)WZJeýz¿‹oß¾}«<¿eË®½öÚJÏâñx ++ë,±áÑGeÖ¬Y—ìÊvìÜIëV­ÐÈUø‡ÿòB{´ ÓØ±c+„`ri)¨Å<‰#7…ï Oûhj¶lH½¨@™:ˆÉ÷-楷‡_VðBÂ%›­}ûöÄÅű}ûvž{î9’““éÙ³'o½õÉÉÉØl6üýý}ãË]ä—ƒZµlY&Tu¢PUwþˆ\Ö¬­¼˜¢È ÊdIòºþðv5T% YÓð´ëЄ†„·sª&% MSq{ÜôêØÿOkÂëׯ¯ÒÚ——÷—@öé§_`Æa¨ª„¢”2çÕ~HH¼û‘‚·“¨š—Þ¦]žŒ‘ÌÌBbb‚/霉‰‰ÄÇÇÓ¼ys–,Yâ;^XXH›6mØ´iÙÙÙ>‡Rûöí/›®q!µ=Nç°i.„Ð„àø‰lúe:E^/#!¬yÛÎkMxP5æñ j*ž²P;Uõ`2Z˜ðàX\v'šÞâ9B½$Sç=S^»Ü`áÍWV˜«’‘–˾ÂìfвScÌæ Ú·áç•;èÒ»%`C–/O•ËÑý211‘7Ò¤IZ´hAõêÕÙ³g;vìà¶ÛnC¯×MjjêYòï•($£Ð4•ìĽlÞ}‚Œ<;’ª‚$¡ÓÉ8 É:$Iñ–5ÕŠN‡êÖÐ8]ÞSH 2§—_žA§p˰ž8= .÷Ÿ—G«â¼çRæ.5ýðÃf~ýõ0L¸‰F~2.Ö¯]J‡îÍ0šô$&¦ðUr*Ä7ßì¼,k0úõk~Yl¼Š¢0zôh¾û.z½ž£G"$iÙX­V_wúr7nœCÏš5‹W_}µ‚ãBIUUÅ[H–%~ŸX^QXç•Ø¹'‘e_¯AÜM¨èt z<(ƒ·—¡Á€ÍáÀh2àrjh.:“EƒüÒ‚CÐé%: =ûvç¡{{c¼¬AAA,[¶¬RŽtÙÅI’xé¥FÌœù’äb;`(û+Ó²eÁeW#¶m;ù‡?»nÝ:_,Âï¯íÝwßeðàÁtïÞ9 ?æ±ñcÉ/,äšúõøõ×íL¸ï.€ û¼téÒ à?ÓdxN“ªªÆ?òÐ8vò8+¾ÿMu\sÒ• þêV#7'î½z²âÛUÔ®GAA–<ªŠlБ’–Att$iÉDW‹=è(*F½ š ÕB¸7:=ÔŽ‹&+·àOß´ªb}5M£°°°Òsõâc8r"IVÎ;ÿæï>¡SÿÛ|½€«€0ûöÉ4mz=‹>ü¡ƒâÈ/-fÜ„/°åå³fÝ”2%Jåj¤–-[rë­•;iFŽÉÚµk½öÛí›éß§)ù¥´kZ믿Þ7®F¾¸è}ûöýÎF[d?þ8uëÖåàÁƒ¼þúëHÀä'¦p )ïà{jÌý"âý@ºð¿\ŽlK€?MZ4Go¶pû]#é;°c¼¯"/ð¸=D†‡ávªDE‡Q·~=$I¡V횸]nŒ#š¦‚ð–›×4¯+1;/»óÏ+-›7o®’#Ve|ÏÉÉaæŒ/¨Z{ÝÅ[ï¾ÃÂÏWS»oÚàg&þ±Õ‚XþÕXÖ¬› x®Zà^ é ~¼ýÆ<â-žxia…sgêMš4ñ½~ä‘GΚçå—_æž{îáµ×^óÖz‚3¦”ZD¨9™3î¤#íd!:éŸÒ:/Àåv’’LÊÉSȲâ­dNy™!eÆlo^—Ó…Gh¬ýa-áQaè%ÙèUÒp#Ë ——Ã…ûºÀÿQ…M’$*òKܼ8cÅ%Öó*ÃîxY›Ã‰P=ü©ÿþDGGsüøqŸúO=X!)))DDDTy÷îÝ{ΨGÃ}Öñ%¿~K©ËM㸺L>(ÙÆ5Mj¢3û÷ ´ ¯ÐàDR6šÂ#ÃÑ„Ž¼Ü4YA–tH:BC CÑéQ=.T!¡“õÔ¨Kë×R£f ›³Ab4¢èM¼?ç=Ün Ó%yÝnw¥± ç$ SØá#G% ƒ^‡Óí!<<œo¾ù†!C†œ~Z vÎù¦<ý$]»¶Bèvm#œª¤Ã¹¤áaÝŽDD‘_”ÁŽƒ»Tˆ‰F’uÄÆG‘|2UUQUíÜàÕëܱ!""âÂlì’Äwßï`ìØ®¼÷þ¯ ëW‡¥«Ž ¹ ]õv|¼dnK™IVËbé'ãuŸ7NB§3ž¼Y9E€@h§½É¢Ì,¡ÐÐPð ^Ï™&ÊûÉ^·pYc;!ÊÝÆÂ°Ú ÕþÔÆÇÇÇW)6FìçP §M›Fxx8¹¹¹¬6nܘ¤¤$–-[Æ€ª°hxå2³?8À áÑ@g*wC–`ðŠ¢ÒÜn76›­Òsf³Ù#")z5iÊC=®bFÞqw1¬œÎŒm8Óìõ{28¾³ ?ït1wö#¼½ !ÙÖæ 2–ÈÈ<8h—`ç—u©ÜÐi!­:ùÏÔ±çobb:ƒ?àöy[§[”Ç5”ß\¯WD)¹$q†ŒRžè,!_×aU ›$I˜Íæs‚×h4ÒªU+_*ÏÅýv-#úW,úÜã™K G3o¿ý6÷ÜsOÅëU<•êöâ\tœíí´†QX\ÊðáÙ3gááá”2jÄÍ”””°råJ yà*xÎÎŒmxíµ×ª\¥ÓéDÒØ–&ñwrm»Näæ>IzÎ.2²¿&>4”Õ¿Y9u*›zê) nÎîƒûДúÑãrRtt4Lhè_ÛgíL±aãÆtìØ± à‚A§',ô&tŸÅžÔÇY´DF@’tDFÖ@’ÌÜ1&’9¯ ÄêÀº—´ÃAÜ0~ZžÇ–-U[ª|Áè[·ñ ì’ä$“tyÇ·a«EPh¹'×£ŽÃ? šÙ/ÞǾ#tìÐ…{Ç=ŽÅJaa/Šª\{Õ4 —ËE‹¦±^°Ÿƒ>ÿüó*csßxã ºvíêS0¬V+²,óòË/3¨ßõ {úGü-ào›Õkãõ„üXñú]¼÷Þ{¼0íij÷9ýì •)*„  Л¼¥±lÅàpxEŸ¬Ì Ö-|€¥K—r×]wÑ®ž=k~“×çß­çæ~]/!ltHÒí¼ôÒ0ªW¡¨ÈFp°Uí„‚ë®»Ž… âg Fj0”UïL¦y§Žh‰Ðûãh E±<Ü)‚ž£§pM¬9Ûq––’YÀø‘½/h&“Égq83½²oÍj÷pǰGy÷Ëñ˜ÍAMöêK>Ýtz7²¤'0Ä@£ˆ&ìMý•üüºôÍèÙÈ)°²äË_Ï/6deg…¢€Óe'ÈLf¾ƒÆu#±tìÈ(¥Kãši'Àb!2,Œ±±ÜÔ»#óßþšÃwàq{hÓ¶+Ãuæþ‡¦Ð¶]T4tœ;Æà\•ï¿ÿ~¦OŸÀÊ•+éׯB†ÊWŸ.äÝמÇãÈ£V¸J¾SOÝ(-(¤M¯ÛèׯãÇǨ¨,Z:sT]öü¶‡H} ýDï~ýI+løöC^|s§N¬§qã8ŽéÛ·/¯¾ú*¥¥¥4mšÈîÝ{®ç GˆÏضí mÛÆ“™YDtt ë×ÇzUG«Žø„xZ·jÍÊ£"j7#)±d âà®§Ÿfãç_ðõ‰æ=1Ä]kp8ܸ=FÝ·û’Ûf4-†Ÿ—ã—[Êë˜UzýÜÀ衲péƒÁxõ9"Ée^XAýÑT¯QƒÌÌÌf#ßÿ¼…Ø?4Šùyµ“ë{™ˆŽò?¿Ì«ia¡áèõ:4M (z>Xø&qq5ÉÍÊæƒoç2úîùxÑÜ<ânNÖ#I2Y™üwöBT·Ó†Ùì‡ÓUÂw?NHp(”Å ÿ*..>Kl$©,­ÈĈÑw9HÂV B†È(ÈLÕ¨]EQÈH9A1Qdè>¤?N8áqA †Ü{7ä¶Æ£‹Ao8IËú-q:ç4ÇU¥ì]·2Š ­…%È@â‰Dâ0ìî'+î_–F³®CI;¦1變6ý¥oNâУ۩ùÙ]çï™1¼mÛ¶­’óÞÑgo~ý~†ŠáŒ^qSCh;¶`ÇÖ¬öb,\{ˆÈh r4š›Ä`*+*.A¨*’,—uf—è}ã $IB’%† MQaÝ{ö'';›FMÛùº·§gd ¸œN¢«{»5fçäÒ¨q„¤§'ÓðšHPþøm;WlÃà[ø8”‡RØ»÷[®mÚ È) ¿“ôþø%mB²q]ÇN¼>û-bª'®rMãZØínöïI!44ŒæÍ5üÍäç’–ÆÖMQ˜ÍòùÁ{CÏ6—ik5.Eažª¶Êœš¦že**ç•™"BjâtÙÎùÝç~âW¤ße‹¤gç³qmE‘ÖÇsËÓ¡Œ<2yí]ûè[£iÖ<ºrç)8NzôèA~~> ØGÏ[UæÃ{øœ Å o@W’…¤UînŒŒôYâãã«ôl:îÏâØ±|L: KrùmÇT¯Þ«Ý…Ý)‘ž–È£ª*»w눌¤$;ùeƒ™àPU\IÛ¥y|ž‹óúùùa=à TX’}Qs› þçïù¨×=oQ’þ؆Õ_¾VaëÛžGÒþõ¨Š…´ÃXûí"µaÐðñ(²ƒß~ÛÅÏKÓ¼v*Íšw¬tÎÏVMg@—/ÙÝÒ¥µîU²ºM¬ôü™åžâã㫜§Ôºáo‚¬¿€ÎŒÚÿ=x C…cƒº=|qò´5‹ß…Õ~ 4@ 7ßü¿ý–º“À.Ð¥óý¢—Ù¶ñ[Ò‹ryæþ˜ÌrY\q ’t'‡ Š‘F{ÓˆV½Æ0þå¸}ÜtN:Jõº-©^£¯~±š‹¨|}c¾rÉ÷:eÐìsÚÛ}öä ®(&þ6à½é¦›*J*lŽbƒk\”Hrèä/46!!(ŠY¼ø~Z¶¬†$AL|knð9V¼»ˆS™&F<<E“hÒ ’Á·ŒÂnÕÊ‹b)&“7NúÍgïÁ™»EWŒµx/7¬fdžXùÅ©ÙG.h#úuG€_(ÅÖ‹Oäì›ðÝYµ?LA7á(Z^юݺ.PTÊÍ­W@ë@æ/Âø[î„ÕKàúAÐ øÎ;´õ(ø]FÂÁƒ×ñÓέô:ž½ê¨‰ú·`]Æiåçý©ã3ªj³˜ì©<Ül6û~—³nÃ7ýð~œá¡ ‚#"hÙå&T·Š„tRYx²ìkú,•ézš¦!ã§Íæ¡aóÖèô Ëß‹:#Ø•)CE¨¤ðáÕ±©‚@³L¾U°÷û"&¿MN ºœ¸&tïÉo'Â’E–‘ £Ù„ÝåD¨³Ÿ‘%o¿Á†M'{ÿ Lz#ù9Elùy37é‹No@’dÌŠá,ùòPU…öÎ `hsM_2ò9ž²½b¦VõFe*çÙ¾íÆç±ø“W˜ŽÑàWVòú ^knþ„VáZýÃ)¶æòÕú¹ôï<¡ÒϹ£=.[å±õê•ÿ*ʬùÅé[ÏÎyaü ”;…W¬XÌe¶W´…»ƒb8¶îœÀý½Øp¥6Ùû‹ôà4›„ªz®ÛMÆêÍÜN ƒÁˆ,+¨.Ö¢BÒ%åð Šžž7äéÙSˆŠkˆ¬(Xé=ðz4MÂã*Åårãüæz¦¹åÂÍRÒ9•­ ¾`I¦^\â«7ÆßÈž£ëÙst¡Ag»_Km… ~ô&~ÚöFÃ…×ÂMÉ:„þwùWnWFÖsrÕ6Ö‚,'6žwþä¬Óvßjáµ üciVª)èŸf +ÉÆYÿ¼ãƒÎ(]^§÷Šr^Mó€P0”d`V4ò23Ñ륥. Ö|<’$ !KHš@ÛdìùÙÛPÕÊJ›zm‡ ^ÁèïNg¤´´¢µ¡E‹äää\ÔBÏÛðG«DÚ%4«×Õ˹Š2‰ cŦ·ñ¨nš×ëFhP 6G1.·ƒžmoÃé²STšËÄ_¸©Ó½ägVùÃÉ͵c6àr;*€×â‚ãÌ Bz…Î3m¹z<µº¡³Ÿ~’øeôîŠ1GNm¥}¯âúþò'}AR´—Š¿ÔÝóNQØøF2{>‰¤]XyŸSèÚk¯åĉW¼‹>Ùö—~éÅ·œóVÕ èÂĆóSv~2­¯é}¸½žº¤Œü¼ó3‚b¨ך;Ž¥ 8‹¿PN¥ïçàÉÍT ¯C«†½NÇU¸Áå©8ê""¸'ÓOWšÙôò´Óhª'Óêasº“Á fÞ;PŠNÀøÖ|¹%…ƯU¼öôœã>]á¶¾ÓØ¹¶j%ÏãŽ9c?-‡Ñ·ÀZ {µFØ«5ºè=:Sl83«âЉ zöÙg«äÈçÊ\ý³”[˜Š¿9ˆ¾×ÝG»&ý Š¡ $ “Ñ‚@‘w‚‚âLoŒ…ÎDH`4‡NþŠ%XON~ÒYœyÎâŠÉ’áF‰|«‡Úá:6§;pOo+Ƭ—™6²+m|žä•Ù‘$d„¢'<ª!ÿpBju ÃY‚¤yðKÙIø–· Ýù–“›A<þá謹¨Á1Œ˜»w`5$Ï7qÙÿãJr]çý;Ð3ÏƲeßw„FQ=¢þaæ9Q¢ò@¬ »Uãáfœ(Vi®§f€ŽÏʧ{¬™S‰ éÍ€æ U¡æ@tÖ<–ozƒëZ CÈ:l±­°Å¶òr[‡j¡€ f/àîs;á|²sò+è’$ƒ¢(ì WLKKCQ!µZµjW^aûÓT–/.cM‚ª6Y–+(Wš¬öBƒ«Ó ¾%Ö<‚bk¥¶|B£IÉ:Dåì¸O”ðÍ)'‡ Üx€wYI/ñ”]#Èn²Û¤º‘4•˜ð@Pb¯Ü*È~G²CšqÈÙˆõÇ´ñ*ÇD3Ö5±)#–Cžf¢ÄÖ­[GXX5jÔ 44”¸¸8BBBˆ‰‰!((ˆ5kÖT‰kÖ¬!77—¢¢B(ëÈ.„†«,¾EQ” Å[ΕtÕ‚×M&øfÉ×defÓ80žÎCÆsÛ]÷òИ¡¾Ê9—’ªªÛ „8gÁ‘+En“ëšáHÒ¶3äç4×éD¿Nãyú;ì9¶ž–:ÓºÉÅçGÙ^ÇO­jÈ-Lè7±ìç7hP«í›ô',È0aæ2RNž UëÚÕ®C~N.¡‰‚< E'ûý3fÌðÕzXùÃzjV ¿(ƒöÝóá§Ÿpǰ>„„„P·n]L&sçÎý{)lª,Zö1ß.[JÏ=uÛ­tmÓ–›\|´ý7òŠÓ.9pÏeË-ït5Ò¶+0+f¿ê…%Y<:ò}ŠJ²™¾pˆ¯lÖ…R —?S ¹…iOý §ÛÁ€.÷S¿f[ Š3É+òæ—é2=Öå…ÉcùòùXül´j~ZîÍÈÈ 55•Aƒù8jž×Q§a}Ú¶ïŠfÏçŽa}¼òqv6›7o&99™äää*«Õ_Uœ·< -)é&“‰[zdÇî­ÜZ¢X¾a=MÚ_ÃŽy›/›ý¢ª&‚Bˆ*ëo]iúeÏ7ôíXÑ„¥È§·¼sË›¹&¡#ÍîÁ+¬¹p[mY ýR{’$“Ó øáw*3Ÿýçt¾Z¼”æaõ¬>­ª0qÒ|czôèADD‹/fß¾}^»½,Ó´iSn¹åzôèATTT¥M¯Jð !xç“w¸wÔ=hª‡¨¨höîÝKXp4>ý =zµáù Ñ.ïBÏÕDÐÏχÃApp°Ïi‚ËåÂjµ‚ÓéÄn·‚Ãáð·Ûí8NBBB(--ÅãñLII ªªìs‚”ûõ%Iò½.·3¢×ë}F|UUiÙ¸ Ÿ¯žÁèÓ0`òÓLaa!þþþ7¦]“ëÙ~ð[nè8šÂÂB‚ƒƒBTÐöKJJ Áív³açtk?„õÛ¿æú6wà¦Ô×844›ÍFaAÏ¿ø2V«—ËEpp0Íš5cÆ ¾ëÓ4    ×—ŸŸOŸ>}>|8………èt:, 999øûûéïUÛP%p=‚ÑÝÂ3¼þîëûtåÅé3IÍKçhν¶ð/[è¹ZY•{|ÎtTœã[þZáûû×ùùù>.òG_«ªŠÓéô*lß —CÃn·ûäò`¿Xß:ËŸï’ôìceŠRÅë¨ìšlÎb ),Î&» I’|ß[Þíç÷פišïGq!×qæk—Ë…‡ÃÁþýû}ë¹*‚Ñ«|:é$æÎx—G¼‹è†ÑT aÞgóØðÍ_ÿ‹;W×w_ÚÑy¡¯›5kvÖ¹?SífÇŽ>óSv~mõ#·0Õ×pMBGJ¬ù¿ ¿`‚¢)øË¹²×‘¡qeV·ïøùö œÓÿÞ¡s1{ö{ VÖëªXøÁÞ7“½mŒ¯‹óþ 9o]†‹¡ßƒcÎâûH¨ÑŒV z¶Ô”ÝWX‡%ŠÄÔÝÞâ'çÚ­ôB¯31´Çc”\¹à˜»îº‹o¾ùæïbm‘®ÐB/gÕÅò¹ÇŽË7zSkZµjE·nÝþôÜã†Í%:´–ï}©­€àÀÈJA¹yÏùàg ¤¨4—Ï|‘üâ+fâ¿…©ìJQ˲.à—‹\.yyy¾V¡mÛ¶­47®œ³.X°€!C†™™‰Çã©RöË)Hæxê.‚NWŸþíÐgÛ±uF\@(äÂe£i*Š¢¿"ý~Ϥ#GŽ\Ñï÷‰ .A²›Såpj>ŠÁ³¿‚>ÂŒ]óàç‘p ‰¬nü%+ÍÌþôî7Mõ ªÍíF¯SùòË…Hn;’,Q»vý?½Ð;wV)6\ìM¬ hƒo¾ùÆÎß×8ðx<(ŠB^^‡ƒûî»iÓ¦MHHUx`ׇ(¶æùÄ“‡V_½Y…u{TûŽgžu-gΩÈ:îø ¯x†û†Ì!» 銂§~ýúW‡Â¦j’·u©*Ði Âñh*’Ð8¼ï—‡\Ä[,$È¥ˆ:õHÝ}˜Mùäå€hšMsóî‚—°çbÒWÝòR)l²,£oÚ™ü‹¨ð”µf6 [T8–ÀðáÙ4i­ZµbĈÜzë­tïÞ·ß~›¹sç²fÍdYæÍ7ßäèÑ£¾Äüü|_«ƒJ­!Å™(²Â‚/`üðù<~ûG$flç`Ñ{ÆM~|ûŠæW8Ö·ñK$'{AúÁòÿpÿÐ9€tÅ Û·^Q±Ááp#TMõ©Ó„ E””`v9ˆ2ÉT PpH…x<. G@q>o¼ñ ·‡ËæMMQUV®ú‡ÃŽËûö’Û}v'Åòê-Bó&ºØ­ÞE»¬Å»ÍûýN»÷¸Í•þ :uêÄÌ™3™3gv»^xÿþ÷¿8NÈñãÇ™YñÑá MÞÁàî^¢Ü™í[¯(çÍK9IhíZxd™üÌ,lV+²¤!éÍZô.Ë=wßJ‰KÇc÷FñÄÇUcÃúµDW«†Ëæ$3+“aCâp8¼¶Aåωս{÷¦k×®<ù䓌[±3Ì;ï¼Có-ùä·Ä‡Âc÷<Ëî])ÉÏá†á gÎÔ;©S7žîyÔÃÛ°1´GìYæ•+WÒ«W/~üñGÞzë-W ¢nݺÌ;—[n¹…åË—ãçç‡ÝnçÈ‘#,Z´è‚¯%#ç“GÆ˧0~Ø^}ý)âê„Ð*–Ú B‰€ˆ¸^|tCƵåõÇ$hü×lÙ·”Uó»®çj¢3 ^QðV ñ'?íóÞù’‘#‡` Äå.EHv$IOý¸(®½®= µc=ú?̘>õë?£W¿k¹oÜí¤JäÝw>'¾VÜ'Å%6B¦? Þn¸Gy„[o½•“'OV87bÄdY&5 öç úßó4ý÷ù6ŸQ§ƒ·Ò¢ý·yg‰$_~ù%;wæÓO?=Ë>Z\\Lll,:t`ذaÜ{ï½QPPÀáÇiРÁ_OAq&ºL €þ£OÛ˜s’ ¼åFöбgM2fqóØftj9Œšám¯:àÌ™3çꯦHè :&?4€?ø’>ƒoÆ`Òa2y|ÊLŽ;Fl\Mâk²å—O).)æ‰'f“ŸŸÃïþ—þ7ÞBHt8ó??¢hJL'ÉJ]qô²›Ê6®^IIá…Ë'm#Lg›´ÆcÿþýøB,›6mê3 !øé§Ÿ|kùðÃÙ¿?z½!-[¶d×®]u=;·>ï¸[®»zóªW¯~u(lÇshT7‚â"MÁ·>ë¯ÍBÒkÌ~õú ÃSO݇Gr£ª2Œ½{Å¥Ø]vï^ÂEÒš5ì:zˆÆÚÓ¸i BôÍ/ÉBkÖ¬Ye+«uL9ÛÙõV­ZÅÓO?ͳÏ>ËСC™2e Ó§Og÷îÝ!èß¿?ªª2pà@ß ûúë¯ËæfÒÃO³×!TU凫0™ŒÄV§¸ €gŸOdD07¼‹f:Ó´][òín„Þħ/?{I6jÓ¦MøûûóØcQZZÊĉ1 ¬_¿ž‰'ât:™4i:ŽÇœ?üððp&Mšä_RR˜8q"6›I“&ÀSO=ÅìÙ³ ©0>))‰ääd&NœHii)“&M"44”¹sç2uêTüüü˜4iv»‰'òóÏ?£ª*'NÄb±0wî\7nÌöíÛ™3g5jÔ`þüù$$$0þ|š5kÆ’%Kxÿý÷ñ÷÷gþüùDDD0gΊ‹‹ cΜ9„……1oÞ¡IÃZymÎ\º]׿P é_/á±eëybü ë‹Uò ©áá!¤¥¥âv¹Qnnô0CFfX×:¬øi7§=ǭݺ ËûŽìÿÓœ÷ÿ$IúSœhäÈ‘¾úÅ5ý´~39½N¡Zt,¹¹¸Ünš4©ÃÖÛZµo†ÝáA‘A–5@ 4Mu¡SdÜx4Y'!i*²¢CxÀ©Wѹ%"¢VÎyëÖ®NP EQ2hŽ$‘ŸÃà™ÓØóërÞz󿽇µ MÕHKMÅãt#i‚e¿eqC϶Üо_»«µˆæ5ëR#&ŒÎÃná_:7•×yóx<¸úÏ•´tT‹Ž¥ °€åß~ŠŸŸ?±5bˆŽ çÄñ\ê^Cl0<óì³lüy=Aaìþ-…Ÿ×cÕÊ}¨Ø $¿ÀʸiùÏs/Ò«×0ê6iÅŽSGØ´c71áxãí%U+l³„""=;µcé7ßñôäûùú›oj!¥ùÙ|ºàF>8TÇíAQõd¬_ΈQƒY¹j5Šìaå—ß’P#Ža‚m+~‚éSÿEh%äñxX¼x1Ï>û,%%%tèÐáŠÇÈþ!­ß¨Òªe ®¹¦©iÔŠMÀž›‹1@"ëOÐ FŸÉÝ KgËÖÍ„†[¨[/ÐpÙÙ¶< F‰·¦¿‰&T<ªIRš@Ž“ÈÉÜÀS5xýýÌèpâgö';;“¾½»‘•„õà/¼ü‹¢¼š¶èLî‰=¼þŸéÜñ胚yåÙgñ(~úif[׬§]ýêìÎШÖçašg¦UøÂ¬¬,¢¢¢þE.Þæ$6›‘#G¢iÚUY<åBÈÏäÏñý›Ùw(níÛ²iÓZ:µm‹ìïOÌäÇV ºD-?Àã+f"IV„P$o&³ÇcGÓ´²‚ÞÂÛ¬GÓ¼O•JD*x=ŽBüƒCp8íè…š5c1ï^‚ÓDL°Jª^âíϖЩC;\c$ÿaž˜=Ÿo–-äD†Æ²ï¾$gÇZÂý$Žd8>jé‡Ao¨h:jÓ¦ ÉÉÉÿ"¯ã¥<ÆWQ_´›ŸŸßU›Î_é-´iÝ‹øZ'PhÔ€»¸È <ªÙ¨Ìh²™‚Br¢:ЕYõŠKB3!é]HB ¡! ¯8äRUƒ·Yç^NÄtìÎ`B‹¾÷¹ÞσGÜ|AúG Kÿ¨Ľzõú[àæ;cðËÇåö>MJlJYý:¥,mÌÛ!èÒ¦1;VgûžýÔ‰n‰GçDFB/ɸÝn4ƒ†ìV¹¾OO>xïCB#Â0ô˜Œ&~ݺ³rðþUt9Ë‘^M¤in·£ÑˆÝnÇh4úâ}˳}5MC§óÞ‚Ï>ûŒ#F°råJŸ<¬(ŠOs»Ý8N, N§óªr†øéYûÍ4ô.<Xü(¶+è„üTÔ" ŨGöÈÜxí”:ÍX 6ÍŽ°9 :TI‡ÃíÀ *8ð`·Û©^£.f‹À¨ &&*¢j;ï_AÍ›7ÿÇpÑ)S¦˜˜È‚ 0›ÍȲì¬$IüüóÏÔ¯_ŸæÍ›Ó¦M¾øâ Z¶lIË–-©^½:»víª`A˜:u*‹…çž{£ÑXe/æ+r½eý1\:4UÆ® AïÒ¡ÝxlN‚>Æáòø:¦*2è}:ãǧ]»v$&&âv»>Ü[ ò©§žÂápзoß«¼e«Ç† Èþ„…þˆ"4³ZPèCTtšäÂåráö¨x4?„UÅawã(váv¸qZm¸K=h6áñ`0‹ 6,¹@weÁûO!EQÐëõ(Š‚Á` [·nH’Äœ9s9r$}ôƒ‡Ãqö#8 €yóæ¡iN§“aÆqüøqZ´ðæÜɲŒÉd:«Óý•& ½æ¦ý~d椢˜œEæ› ÛІ"ëYVð3š1xJ ñ 1à¡Ç¤`6b Ã/DCRüü-¸Û$óÑ*'5þ¼W䯖yÏfΜé“ù;tè€Ëåò%m–Ww?S–e—ËEÇŽÏ™wuˆJª0°ù=+‘~µ°¹ÃpXÄר‰^Õ!Ð Y‘±ÙóEÂä/c¶ЛeüÌ:cЬðËÆ_Y=í$~ÎÕ¼öÚ¼Á{%E !&“‰ÐÐPmÚ´aéÒ¥äääœÕdF–eJJJ¨]»6.—ëêþq"é©(¥NŒŠQUQÍÍT&áqÛÉÎÊE¸4<ª‡¨¨(Š‹‹Pt üœ¸ V4’ʼnËRŠT€ªzÊæ.ÿOü Þ+É}:Žüü|RRR°ÙlL:• ø²£ËSèCBBe™”””*Sêm6T*‚üeצ½v[E³Â= šÑIξæ@Ó©èŒ £"I²w=¥nJSî\=öt[8³ŽT#/ÎxŽäŒÝ¤¥ï#5u/©)g§Ùëþ…Õ_G²,SZZŠN§#++Ëç¬9x𠊢 Ë2Š¢Á` ""‚ÂÂÂ*E???üü¼ ¿úê«+v]v™SQ% ³^‡Nö–¯h^/™ÈŠûÒ³°ÛŠñ¨.tf ɨ ËŠ:!¡èASá?O>ËÜ×ÞÃËÛëZõàÎÁ{%DY–}MÈËß[,– ¶ßòÀœ°°0›6mÂh4ú:ðTf¾($ØÁ–÷®!35—À &ƒ‰ÔìR"BÍ5‰ŒBÕ±:‹hxíŒ&Hš¾]BÖdÅ& d§Iòö¼Öá–a·²qÃF²³òþþjЖÇö:ˆN§# I’|ñ n·Û\MÓxå•WØ·o3fÌà–[náÅ_DUU† Âwß}wU@UþÕðÇ/ £% ƒ‚_`$¦ÐXüþ‚"0Ö$:*‡Í…‡@BâeBBÈ5‚àÆ‚à†àwMµbc6| ÅEyÔ©GûŽÍÿ±áøñãüòË/œ8qÂWÃ5((ˆÚµkÓ¶m[5jôïÔ©Syå•W˜1c&“‰5kÖpÛm·Q­Zµ³âw˹±ªªlÞ¼™E‹‘™™Irr2cÆŒaáÂ…|ñÅH’ô§c/¹Ì«w`Í*áá_[â(’Y4t/î¯Å§]S±ŒL8R‡»¥á´ú‘››ƒ¿_œì ÊNQPN§EQšÊÉv‡Ù¶m;Á!¡ìؾ„Ú —¼6l qãÆäç磪*íÚµ£]»v•Ž=vìÁÁÁX­V_šÿG ó¦? 4MãÁ¤fÍš(ŠrVüBýúõ9vì?ýô‹…àà`–,Y‚¿¿?¹¹¹¤¤¤OXXØ%­)üg© ÓMÿ/CÈËÎBg6âr $dö ¢"ïBs~„Ó©¢9—SPô V¯eHªEÙûOÒËh.$I§²9q,‘ºõpòä©ËÞèèj¼½ð ‹J˜úä$^œ>‘#n!%-ƒáAfà A|¿l :·¿ÐjtéÚéÿ¸åé6gʪ+V¬Àf³ÑµkW>ýôSžxâ òòòðx<\ýõ8^ýu7–$‰eË–1pà@"""Ð4±cÇ^Uiöæ`ævÛCíšõpÚ ‘¬*‹{Ùqê IIy…onŠÂQ,0˜®£eã'9º÷{ÜnÛíAÓœHè‘„Œêñ In$w Š€,dªW«EZR&~¡gs|q‰ž?Ùy…tëÚ…Ë—r$ÃÆ‘íëÌ!<•ÎÁ-«ÈÍLãÓï6Ó»{†¾‘ǧ>Ë÷ß.?ç¼[·nå•W^ùÛ‚xæÌ™Lž<I’xê©§xî¹çβ!øôÓO9rd¥sÔ¨Qƒ¤¤$ï#µÌÍ|5ɽ+V¬¢o߀±Ì(+•ÙeMlßþf£ ‡ÍIXxñuš²aíj:wïØÙ´v ¥¥¥ô¾ñ°zõôº¡3«~ø…ÐP,„‡G D\ð&&&ž§«×éAò¦¹ääærÖcõJWü«ÈãñðÌ3Ïð /T8îv»}&2UU+ü-vXXYYY¾ÚgžÿG›/çä3žz€‡›Ì¾][É<£gí?‘t:]¥ÔóòòP…yóæ‘““SiЩS§*ôüý¸—˜ó¼üòˤ¥¥qäÈâãã©U«‹ðzƒ’’’HLL$66–Úµkóøãÿc6ZUUŸ¸p¦¼Z.—[–å ÕÊ[H †«´íÛ´æ×í;|ïZ¾”ž7õ¡Wû.üxF-³öíÛÿáÚf©û¶Q£IÛJ‹é_úÃT«v=ñØ]ýEˆ.6|¿DÜ5âFa‘Т»˜õ΢ŒAŠ„V7ФcGEÁUB!zõé'„"ýà&üb}cmv›6b”÷üŽ5¢Lˆ9%B¸­Åb؈ÛD•àýyÕ·¢eëv¾÷Ÿ,þZ!ÄÖõ?ˆ6mÚøŽ/ÿê“s^\v‘õ‚6¡w·"þšfÿ¢á@y¦K!D@@ÀEÏS¥Ì[ŸÍÚÿ‹$IÔ«]‹RÀ½ã f\<Û·oÇË ý‡Ð´¶·´~dBsŒ¡Õyæ™§|ƺqÕˆôC’$:tïIZºW¡³”=6_^øÏÿ÷žŸ|7+×ýB±ÃœòÞ¼iH’„%ªOMy’÷>ßì•¡_x†»6#<¾_}÷+{ÙÈ]÷=ÌÃSŸñ­»K^WìúˆŸÎ;æÐ‘cåfù^ÿYúuû.¾ÿ~ù™é3âj=€¯…ìÅNtÿ*ÿ^Ô¶a”ēϾ*^}õѾy‚pÚJ…­Ô*íÝ!ñÈž»~\*ÂBCÄÛ})^}õqüànˆz×4Qïã±K¯þ¢Zýfbñw뎃: @ôz›Øs(QŒÔÓ·O}†ß%1pôqjïa1¤Oç —„ÅüK#çGy]ƒéìwxTÅ×Ç?·lM6½’BïéÒ‘"(b;VlØQQ±¼Š+Š ¢bCªôÞ¥$$Þ7eÛ½wÞ?6Yˆ€‚? çyxÂÎÞ½wfîÌwΜ9ç{B8;¬õR¡(ªÄ¥×Þ%¾ax@i>ÓòøCwÑûɲrÜr«Í~ò³Z’OúÚ¬½ER»žG~{‚çŸ!r2ÓÄ‹–S^˜—õ§îë*/k·ü*f½;ë˜ï wÅþ>/+C¬X·é¤žU’Ÿ+–,_yÚu?þ ¿+Ì:$¾Zøý¹ò/ùw À躠KãX:vîFIiwM™ÁáÃGØ›jÌ•qz#IL~œqãÆrïÝ·PYýýô—ž¦Åyݹqüõ|6ç]lañ Пñ×]Ás32å¹WjÝO’$Æ^܃U¥Å´jÚ˜˜ø„Às/ØŸë®ÃÛø%ªMàÿ†q$ðà…'G5©¬Û¸·«Š¡ç·<ò,·“ö¯§_Û:ìÝ›JÿÜ¿rËÂ8¦’šÈð>-qóÞƒKÇ^$IÄ&5Á«™™õÌüøãÒ@$x¿ü§Â?Áè‘è @NF&“Hªßø?·ÐoXñ#wÜóCûuãµÙó$‰‚‚:÷Í¢/Þ'¡Y{"U‰yß­ðŸx½H’Ī•+‘$ý»µà­×§#I2Ã{wâ™—ßD’$Òömaêks¸aü ~—‘ÂfRÈÏËG¶ãõú‰yž™ü`à}~9û-Bb¹þ–Û)ÍIgÝîT$I¢¢Ü‰$I\Ò¯-?.^æ/«¬äž»ïA’$Ê œL{ïC$I¢Wï>ìJ©æÑ>&Oz€èˆP–.߈$I<9énî|ôu>ýh6ƒúõ£A‹.\qÉ%qU×!q(5I¶rÉãЊóyë“/޽÷9ùh¼'!wÞtp„Gм’òÌJS”•.ÂBCÄíw?tÒ¿¹ÿö›E°#DdçŸ[ªÿib§lë~Ñp×à¬Vëð^¿íiùÆÝçÞÑPjìdŽsKÐ99'çäœü5rZÞÌ¢Ú êxáØšîAUÌÇãÄ]Pc>†#ŽÌçä¾—"'7“b#*:â˜cá“‹Ñá§492Tþã /›‡ú{\vUA:¨ªÉ‚Âì,:¨Ü4bð¿©Ùç$`É= ·&ÈuÐ%WòÒÿ=Š×UNiy)f5‚®Ý;¢"ךd5ÿ Õ–ahÈò9†‰†h€ÊÆ [¹êº[¨¨táöxpgcµH¸Ün´jr €èè(.¾xW]5Ž®Ýºa6Õæ|÷½·yÑhÂÃÕ詸>ÿág–{ëaÂo»Ve‡Js¸¹aý»·Ž´½ÊYÌ{+6‘Ö²vñâåƒÏ ­ÿ2ðÖh­‘‰xAdŸ“²Š ÝÌäÇ£{Çæµ4!üÎÜ9oñúÌ×PÍ& CC‡gbR̠ɆNBb]¦Íx UQ ,<˜;ö0ì‹‘?ðz½ÊN‚C<YÖp{¼ TIÅëõb6›¬v3n·NxXÒ9•á/Y¹f=½ztÅn Á£é`è(BBVBõz<“jÅbUe0›1¼6“…C‡ó¸íg0Í|€çŸìÌ¥—­á/$×oÀÁiÿ¸^¹kÖO¸‚Â$YRÈÎ/åëÛû` # åwUÚ÷oÀÈf> WA6–Ikˆ‰N87¦ÿK¦†šm¢·<›-œk)*6âc£ùiÉOÇ/H¤¥¥b‹  £‚ ‹]ÓHØD,ªdÆ«¹‘— /¶l¦Aݦ¤HÃí®¤¤¸”Èè( C`6[hÑ¢1ó¿ØÊíwÜÀ A}¹pX{EG åÎ2ìÁA AyE9é™yL¸ýîsoû¯†_Ÿ†$ƒfT€a Ëtdb££)*ÉÁj &<4Ã% «ÍDqY)C¥ÈãæÎ·^fÅ·0õÖú˜G8¸¡³ˆAÌ>xàèeýhCÄÙkK5¡rUUv»½]Q ¥çïñ@¦J¨OEQ$fe³ôþ¡2ÊÚêœ×‹Ýß>ŽÐ  âp ÅÔ9g€ø7oÍÀÊÌ̤¢²G°—Ë…×ëAQ%vnßH÷>CQL“YΠsgÁŽí»©r;éÚ¥ #Iþo{¨ƒ¬ÒBì^ „DpP0ÞŠr@A²·í[7§RSˆáH+yùDFûCœÎb–.þŠè¸B>˜ó8º×‡Iâà$7j‰ÃLaa!Îb' %“_X~îMÿÄlV±ZðáñøˆG6™©¬¨ e³”—• ¨©)û‰Š ©^tÝ´¸xu:6eÁ½wÓ?2˜„º2à%¹gƒŠ«ø0ûÈš~´­øðáÃdeeÑ¥K—cÎV­ZE›6m䆧"ŸÏ‡ÛíF–e\.V«5À—¬ë:!!!ÇýíWÀykÁšÐ·£¨Ye(yæ äDpÝk?þaÝôÜôXàó¡Ã™¼ðÃjÒóÜ@û·oÍMJªÇøñ7Ò²e3úìÍÓfÕªÕ˜dòr^ 6n\Eaa!%%ÅlÛñ õêÇðî¬g±˜â¹êêkÉ:t˜˜¨>ûäbâ(.)Äçu…¢š8œžÝfGPAii>EÅÅ””¸iӲŕ>¶nÞJ‹-p–‘š²‡CY¿’r@‹Ç£‚pS¯~'HAUT¼^ƒ.ÝZ’’CëÖ]x÷÷¹aüµ+j¯¯øí°²á XívtÍÀåª@Tº0I2‡³áñT „ö¸$:ôïÅl¡¨¤e/Ï ]¸Ä³,ãÉóÛÀNJp÷DY«Ÿ£G(,Ù¼yó1ä™'N¤N:ôìÙ³––*„ ÿþ,Y²¤Vº‡z(|Ô0 \.6›§žzŠ»ï¾›¸¸8Š‹‹™:u*Ï?ÿ<;wæÝwߥU«VµÎ2šËYȱ‰¸=®c³Šš¿÷´z¸nbIù.ÖÿºŸ.-šœrÿFSƒ$Á5×\Åœ9sèÝ»'VE%2ÔŠÕ†Jù%eØ­&ì3Š ¸ØCöáJ5êˆÇíC°Y©¬ª$88¯« ‹b&>!I–qUVѺMk*+*¨¬ FQ ÂÂêPTT„Ëë%<6Š HÛ]EZêALªÄ¸«î#66UUÐ}‚={pûí7b2CyY9ucÉÍ+Àd–ùü³¹Œ»zš¦Õâ 9'gW<^œ¬4TÅ„0Àb7ã©ô še,& £²Šæ. ªQª"åj +ŠqDÅб҇5ÈGT¤‚ÝePµÇƒd¨úÚ»¼|pÏ\ýÒ º«^-k×®EA½zõÈÈÈॗ^âÖ[oeúôéÀ}úé§B0xð`–,YR«Î=ô111mV’$ÒÓÓ™:uj€¬+22EQX¼x1ãÆ#77÷/í[`pÝpn[žÊÜsÀûïÞ”ÔT‚ƒ‚ vàvy‰ObÐÃ0 xòɧٹc;ç÷íÌë¯Íd̘Ñ¡°nÝzzœß•øØ6oٌݬ`¶#IЪU+öïÛMPP?ó‡¤q8;“àà`|†›=]Wðú$‚ƒCÉÉÉÅŒ,AaA1mÚwÀjµQ/¹>>O1iûöPRRB\l^¯™¬Ã‡ #88˜˜èDÊJ*©(OçÖÛn%¹~rÀN·gÏ^òòréӧϹp6@A$ITÛ<=¨’ÉfÆç*Â4ëÒQ×Ý‚ V¬`×Wó1W¹Éµ¨4HLF?‚Åì#Îf""D¡RÒ1y­2QqVÒ²|8ß~¦½Œ¬K 9ðݼٟQ{æÌ™4kÖŒ½{÷RPP@YYsçÎåÑGÅ0 š491`Õ$t®¡¨ÿòË/¹å–[Ð4ÄÄDRSSñy½têØ‰ÜÜÜRÔï t-ÊÆ—Œ$ d!’ÿäC– LÑf“S3×J˜,&""cq¹½Ø¬æsï$'ôjøñÇÅ”—¹ÉÍ?Dp°MóÒ¤i2Š õ““ñ¸|áIÆáfï¾4,f3N§“ü¼2BÃB‰¥°0I23pà@6oÚÀÿ=ó»~ÝITx(ºaJnn>®J‰ ‘d>ûâ–.]B||<UÄÅÅ“P—¼¼‚ìV*«Êðº4‚Áx½|n —«‚r—«ÙŠ®é”W”£i©{ ‰bÐQ¤gd²lÙRn¼ñ:23ÓéÕ«×¹p–´1 ƒUk71pØÆÞ=‘.— &7;ãã+s¢ù*1\>´r>Oº+?ü”gVƒHÅBƒ/Í’Ì´éàÀ^džl‚’4W—ž/Qä´2iB×ñI:fùøè>•ËW{0øø4ÀYZFhh•®J*++ˆŽŠE•M””–Œ0ü4³‘QQ˜M*š®#^Ÿ³ª’_XˆÕb&,,ŒÒâRl6;²,ã,w²ÿ@“žzêüô§ð:bzðúÜôa 1A ŠIÇ0‡rKs7ý{ô8åc²§~ÚA™%ŠûiÄ&&xÿWƒœÜLvîÜEƒ† ˆ‰ŽBUÌDGÈ4kÞ‡ŽÝû0~Ü0Þ=õkVsðÀ:–­\L¤#ž`»»EåPÆÌŠ atMB× ²³r cý¦=Øív76“–Z€Ë[…j²àö¸¨r–FIi!& 3"4 õêÇѳO ºõoCv~OŠªa±“Õš+Æ\Ŷm[hݺ5&s(&E¡~½zT”;É<ô+_Ìûž6mÛ¢ë¾soþì¯é†N9˜/§¿C‡‘}ð•:Ñ<^„¦ax}èBG1›p•ÁÂé/ÑÖ ›‡ZE‡™ˆ0‰°03²"!t0ƒÃ¡™`¡ØéFöV²rÖLλöZ¬’=z[7o&'3ƒo¾œÏSÏ¿„Çíæ±äüó{±à«ïé; Û¶nÇf¼5“K†ãóù_±äçElܺèèìv%%%4lÔE?þÄÔçŸ§Ž³œW^zž ““•…ávÓ®m;~\²ˆú-šž jû›U++îG‡Ûž§AãžžrÞÚª3uÓ*®Mr3vä€,fþ¶­¾H¢Qמ€ÎÈ”g¤jÒösÃíߢñ.\øÙÙÙ# “ªŸNx˜†&Ì4mTŸüÜâëÖÁëóº¿ÝûR ²ÈDEÄ ²$aVš&Ó£w_~øþòróyówI¬[ ‡ Mó!+àpqíÕדS@½:±”»œx=¨"ƒÍÄ5h·¬”‹/I‘§œÐP;ºnàñxˆ©M›ä\sÉd³‰’’BB‚1É&rò ˆŒŠÄÌô—ß¡OŸÞôíߓdzÎi¼gYV®\I¯^}‘% « «’Knºž–tÅb6SQÄòŸbÞµ—x“ŒÅ¬¥¨D†Bpˆ‹RI¬k¥N˜„/>„¤FVfβó寽L¹¤+»¾øŽŠl/w:Qe2ÒQ9D»ý¯9XÕihdY>é ÿ}ôj¿Y•—_}•zõqÉEC@pªt‡BI¡ûý³HjØŸÛ@1I(²SØ0—g0°i$êÇRUáÄ%Ùø±0ˆÛ¿9[ÂIqn:1Oî'.6ìÜ€û§ïѼ™·à®»î"!¡Ñ1A¨ŠNFF6v»M“ %7/ŸøØ¶nÙF¿~ƒ‹³¼ÛM¥ÛMA~1—\2šâ’BÊœ%8K؃íH¿–ïÙ¹“ðˆ¢BURR·p -‹Aƒ"›MlX¶·ÉÄíw>榒Ǭ[·>Ÿ‰Èà`Lf$Èá@×<äåæž¾›ìœ<úôíG~~ÓÒ‘-š6oÇâŸWòìsO³wïòó ÎïY–Õ«×pþù=dTÉŠ¬KÈE•qUÊØÔR.mZ›§’˜pØ`™ˆp3±±Ž`‰ð 1õbh0~n³ŠÛ%ðz<~ðÔª8°s¯wÊt!ü)¶å³™¨C£´JëXY³ò4¯AR\,ÉIñÄD…rZ>µùù Ÿúqõ[`‘|(ŠËeYA–%dEF‘@³…“xð3Z[eÜ.Þ8‘èðˆÜظfÜhŠ9¼Ç½÷ÜËÿM{‰_¾[@a4³0èâ1|ðÙúuïÈ%ÆW¿ 3_þ‡÷]øÍ· »hø)Õåðþݬø5ƒ±#†úͬ ¿eð°ßcâÝyyúË§Üæ‰'òòË/ÿ¾Æ»uë6***°X­¸].*+«0™Ì é À¤šPÕ¤¢È2š¦c2›PÕŸ(¯¨ N:DGG“›—ƒÕjA×4TÕŒËåFVd¼ª,šæÃíòáp8°XÍ””–"!Q¿~23Ò±Z¬~MƆFU• ø'¤ÛíÆá¦ÌéÄàóú†$+ÄÇÇSæ,£k—®$''ãr¹NØIeee«|¾ÿDY·n-ƒ.¸W…á÷¹U4ta T¿/Õ*a¸u<†‹´{›Rí"J±¡˜ dEGµøX¾1šËgg€·0p_»ÝNee¥ÿƒÊMn\iéD7lrÌÖþLŠ¡éȪØç~½ˆ¾ýzï°2ù¹×5ôÚµiTíàv€'Üz#i™,\ô㮽gÏbܸq̘ú<ýê{<ùàm<ò¯òÊ Opÿ·‘_RÎ}DMà¿NÛ«Þ‰$ÄGS÷üXÿùTnw o<ŸûžÆ½7 cê‹/1ýµ·ð Á»o¿Í]7ßÌ“ÓßåÁ»n NˆÌÐkïfÖ«/v6\r5?}ù’d''uõº §O‹$š÷Ä+ÏN©µ’$ o•“™ÌË/¿‚^˜ÎÕO½ÉÇÓŸ=R?-=®ã¾+ºòk®ÂKÏ=‚‚Øf]Èß·áucq„2bÌ•Ìûð=6¬ZÁo¿Ëì>fdßVÌ_ºI’˜8á*žzíC‚ÞýZÈcøŽ¥àÓ4Mèº^ýŸBBèÂ0 ¡ëþ¿š¦ ]3„0„0t!tM†n]ÓEM¡ahÂ0´êßBÚQìíBÔª‚ñ›¿"P—?’®]»žã®û“²zõjáp„‰è¨8'Bƒ#…E fÂl² UUäú1IÑ_hZ_¡u»—wþÇÐN'Su¬V!„wÜr½0„“}N„€¸}ƒB!n}ôE!„C‡BqíÀ#c®ã +…„ø¼tk¦BˆŒ´ѽׅ¢Yð@â¤v½†ˆøð sî-ä?_ºuëÆÚµkÏuÄŸ%K–0`ÀzöìÁµ×^ÇàÁƒIHH8Ævê·½êW¼J¨5E½ „r”¾÷çù¹ZµjEDDN§“mÛ¶ý%}™²‡ø†Í1Éuø ‰uÑ4Uõ·lã¶Ýœ×®åQÖ ‚è0;[¶n£Cûvdf¤“T/™½©é„™ˆ‹¯Ý,çrøþó×Îï™Þââb¶lÙÂüùóùúë¯ÉÎ>’áO–e, ªªÖJï~ô¿?dÃ0Žùî·ÿþ—ÛÈš”õ5‡W5ÿŽ.SEQ0™L¨ªzRM&B¼^/¥¥¥dffRRRBEEEàùááá 0€[o½•¾}ûžT}>Ï>û,3fÌ ¨¨‡ÃA‡èر#:u"22Òoþ²X°Z­Ç´åxÿ¯ù¬ªjà½Ö|NŽŒ—î]:2{ÁRšTgh¹yÊë¼õø„À¢nWÙŸ]Nt˜ €VlfHÖiGYö6î¿ÿ.^xᾜõ?e”ñÃ+“9TæAIB/Ë<')6ŒÏ—í¦K ÿ¢Õ}øõ¬ùö½êšX™3ãQZ¸¶Iñ¸Ë‹±:ü¶sŸ¦cª61}:w—_y¶˜qcphÏ&ê6ïä7­-þœ®. ª¢{p±ñ äd>Ve8“¦†“üSCii©ÄÇ|®#ÏÉR Ä[o½%  ÂÃà úõë'¾þúëZ×]wÕ¢Sç®Â£ ñÁÛ¯‰V­Z !„¸þúë…BÜvÓõ¢ãy]…Q]¶o×F1oþbñÕ¼Å#® \wýõ׋Ҍ}bæGŸ‰+¾-[¶k·í <çÊ+.·Üõ€˜³`‘Dÿ¾½ÅžÌˆ‹.$Þž=_|ÿÅÇ"£ 8pÏ¡ûŠëo¾U!Ä%#†‹‰÷=$ÖíN×^s•øié:qýõ7!„è×»‡xâÿ^»×Š9Ÿ}ëÿ½¡‰>½Ïc¯¾îœ©ádåÁ ÄàŸ;`;'çäìHddd`‡ñw]|’À‚„„DÞ\æ~ù9± ërå%#ði^$a äp8¶¼s{žãÈÔ©SN;þ^’$>üðCÒÓÓýÞ’DëÖ­Y¿~=EEE²)S¦°fÍ6mÚ([ºt)kÖ¬aêÔ©²ÌÌLÖ®]Ë!CeYYYlÛ¶ ‹Å(Û¹s'ÙÙÙÏ={ödݺuµÊyäÖ¬YÚ5ke›7ofÍš5¼òÊ+²¼¼<Ö­[GÇŽeÙÙÙìÚµ+ðY’$¶oß^ëþ£FbÍš5dffÊÞxã Ö¬YÃÏ?ÿ(Û³gkÖ¬á®»î ”²aÃe)))¤¦¦>·lÙ’õë×SXX(»÷Þ{Y³f [¶l ”-[¶Œ5kÖðÚk¯ÊrssY»v-}ûö=a›, Û¶m „K’ÄðáÃY³f ²Y³f±f;ÿþû@Yjj*kÖ¬áæ›o”°iÓ&bbbe{÷îåÀÏÍš5;flLš4‰5kÖ°sçÎcÚ4mÚ´@YFFk×®eРAµÞÝÖ­[ô•’$±cÇŽZõïÖ­ëÖ­#+++P6yòdÖ¬YúuëŽÓ§O?¦ pÂ~4™LÇôã…^ÈÚµk9|ø0’$Q\\ÌöíßàáóbEF–d>«ÌâÅ¢ÈW aoóD>Õ+yyÍb®¸ê:¤j¯,NROûÏh¼ï½÷ÙÙÙx<***())¡¨¨›ÍFPP¡¡¡8l6f³™ØØX Ð4-ð§Ó‰Ó餪ª I’ "))‰ÐÐP|>C‡¥}ûöôèуo¼‘„„l&‰Ýi9ÄF†%8„Oç~Ê-7^ËÌ·Þc죑}ü W_9†¯¾YÈW\Îóæ1pèpÊËJÎ1ª“!ˆŠŠ¢uëÖÇýÞÀïZj’%¤ežÑ4 U®`‘ªÉ’jf‹0ª]Èüg·ˆl¬V7k®«â]ó[ÆI’˜_A•ÕŠ"IlÛ±•Ä8tɇª„ ª‚P:Å5¡£ÉŒðyÑ4’$Îjþ“ÀkË—/'??ŸÅ‹Ó0 ªªªðù|躎®ëØíöÀ—,˧.VMó§W…   Ìf3º®SYYIbb"ƒæÃ?äÍ7ßdÅŠDÅÄqÑ¡ÄG†Ñ¸]Ú$¾L=zwdÕÆTtkÉŠ]éØ|•tnß’9ó>弞ýQu F]Áè—0÷ý×q¹½çfê9ùWIrr2õë×gïÞ½4mzl¸µæó¢šÌH6•å%EYC±EF%†.(Í/&?'—Ô}›IÛ—Ban>[¥¢°”èð:´mG‡V­èÑ­;‡|!C7üÖÅ?× t/Š0óÅßòÓþ_éví¥)V¬’{h{íÃÆæß±íf³Ž¬©˜$³ ŠSñÊ”géÕ§gõ!êñ½qþÀûá‡Ò»woÒ3ÒQ$‰ÄºIäd&$4DQI&É ($„²Ò2|šF£† 9˜–FR½zÈ8Dx°•à°(|š†Ý¢RQYE~~>5¢ªÂ‰Åî ¼¬˜%K—óÀðÆoЬY³s3윜“ÌËøøxš7o~Âk¢›7fñž^~ùYßx Ë^HaÆAî¿s2eF9ö¼"ÎOlÀUwÜÅž-ÛÉÈÜOjf‘f! ¢yqÆk4¿à¦=ô0<÷ûóÓhÓ'å%äW’ºn{·¯gûêm¤ïÙf ÷½ù :¶£nD&· ÝîaÖ‹opÉ„›X·h ² oÜ?‰gûÜO‚cm#C)ÖTJU3r“VüzPåŽ?¢ªêGl¶"4-UUjYvÿÙ#½î*220ý…שS7‚û|”ÿ{æ® WŽ¿—.õ,ä¸,\=êB®¸jûöíãà>þl>H&ÅŒ¬Up0óqáê6ïÈ–ëùæ³ß“\=z(E2¹íæ;¸êÊ‹BðóÏ?ŸòÖ«ÆíH’$4M d8e9VF×õZšwÍvæèò×%!Dà>G—†¦i†qÂòšgʲü»å>Ÿ/qÚd2Òàhš†"àNut›Ž.¯©{MùÑît¿m«ªª'lÓÉ´õèº×<Ó0ŒZu¬yæñú½æ}Ýï'zfÍõ'Ó¿í¯—³“éÇãõð—õãɶ©¦5Ò¸qc’’’صk-[¶üíd ¼²‚¢üBŠ…›`{C‚Ér1¯Ï|™"|ì?œBÞ׫ˆ¬Ï+3¦3``? ²ó™ûýרæpBmA|úö¼{ÁEtiÚ”v²…C†—.Í[òÓ–õôˆˆ'U£â0hºÍƒ$‚1y< YA¶’¶³ýr(*ÑØ¼Ð̼‡¾ÃfÒ°«Èr/ª¤­lßSŒ;¸„ÐvÙ™¹ ›s?–ðnDË—Ò¾Ù\Ú|2²^¯6žüÇ4ÞyóæÖŸUsˆqçw2cƌگŽ÷»Í›7Ó³gÏÀ92YddÙ?aŽžtGû‰ÖøõjšVˇôhÀ¨™tG›Pj€÷xå5÷® ³¬™DG—×Ìé”×<³¦­Çµã•×ø3ŸJ›jê^$'SÇš÷r<à­¹GÍûø½~<ú™§[—ãõWÍ;ÿ£þúí¨¹ÿÉŒ“mÓñÆÌÑugýúõµø###™ÅÅÅSYYIUU^¯MÓp:„††Nh- AAA„„„Mxx8Øív’’’hÛ¶mà™›7o&77—   “ª£,Ë<÷Üs<÷ÜsÌyóyœ„a’4®;ŠÙð뺉‰‰`Ý’E´;åj…)ÛhÕ²)_ÎÿŠf¿ÇU7Là©G'1÷«$&Ö%5í ÎâB&Þ}ç<âÎÉ©Š,Ë,Z´ˆƒÒªU+ñññ$%%ŽÙlFÛí&//ììlrss)++cåÊ•Lž<¹H—••Õš^¯—:u̳›<™'Ÿz Ùlgöá ÜÔ²7Ý4ŽFíZa’Jòòq—PTXDAf:Îüb*K*pW”QQU/°c±áÊ=2‚¸ø¢¢£‰NˆÅJpH«MöàóøHÛò+óž‘Wø„¡Í;â)8Ë-ÚÈÊt±;ÕK±{‡Jí¤e…â³æ’غœöíôo{wn í1Lú¿—ؼe) #„|ÜÃñÿ„WÃäÉ“yê©§Îúoj$33“_ý«ÕzÒ¿ñx<þë% 㨌µ~7!l‹ ÃÀd2´-“É„ÏçCUÕ€f# ¹úÚsrNNUIIHH`Ö¬YÜx㔕•‘™™Izz:ÅÅÅ”——vff³™ÐÐPbbbHNN¦^½z˜L&®½öZ^|ñE\.õêÕcÚ´iŒ5*ð¬úõ드œÌž={Ž9 ¹ûÞ{˜öÔTd»‰;o½‡ùK~ I·6T¸*(Ë+¢´¸­¢O¥áÑQM&B¡DD“\·.±‘1ÄÇÆ’”TGx(±u≎ĦZ¨_¯ðûÙ:n¾}o¿>Ó¿°äïÄpW">lušº«’CÏ'¦}C†Þ~;¥ù)P¤àqUb3‘ÿë&¿‹ž½:#¡"„Äñœ’ŽÞË.êÇâ )¸ËòÙ} —úu"8¿mSnzr&Ï>4ºñ1(q-ø~î›x<\.Íš4¢ÜååÍG&ÒtäUtnÚˆ`«J…Û¿ò¸=¬ âÂxsÁviNïvõØ”ZF|\8iiéÌ{ÿ5îf™©ûñ¹Š1Ùüáz[W-§}Ï>üß´¸íú‹ùòýטþù2v®YЦ÷ÐQÕÚl9!!þf|þéw\zù…tërkÖm8aZ–³¼’$²©áÛo¿åòË/¯þzNÎÉéJhh(S§N%<<ü”Ìro¿ý6}ûöeàÀtëÖ-ð}Dˆ‰Å+wQè,æƒO¿¥c¼ yëî\{Ã5䮳Z­ ¤šŒÌ™™™“BØl6ºtérL=î¹ç¦M›æW„EF®ö 0„@>j>ÿ6›ô™È«(„ ¼¼œV­Ï£gï>.Ȥ°Â ,?æÝÏ£û½·a Ãb2*+´Œ©ÏÎ K¹oØåܸ¨ºq~ÌáÚ£O½ÀÓ¡qXE%3°yýjVoÜÁ¸‹ú©LE±‡aRLÜsýhÌf3f³™œ¼Þ›õ.ÆCu„±xñbúö9ŸûS˜}‹ÙÌ/Ë~æ×Ôà ìâ?Åœÿó2³‹©ræÑ¾sìE•:½]„„ºM»<´íÞ›ï¿ýšÈ:  åú»AŽ$úÑûérþylݾ‡ò’,Ž`¾ùj> 4 ªNC~ý¹%~êÀo¾ù†ÂÂÂãnkΆø|>–-[vJ@’’òŸHÄ™™™Îlj$©ÿyp4 ƒÇ¿MÓÏø½- III :ô”Ì W\qE-÷h)«ÐhÕªYö0çµ§ñi^W%}2‘#.¦²²ê„í¬ÉaW#5¢nݺìܹ“V­Z°>Ç”Uƒ¬ô›¿5r&æ$I“™±/P¶+u/W½Œ%sç°}ýFœÅx ¹æÒ±\ùöôìÜ[ró0$ ù$Hñÿ3S¦LáñÇÿË4ÞSu'S¥Ö©ï¿U^~ù¾þú*À×_~èQƒTQZìÄj7c³†¢.*Ê« ¦´¤¡ùغã0}û¶D–kƒæüî Á«¯*´n]ïŒß9&&†Ù³gŸðþÀæÎK~~>íÛ·§N:DFF‰ÝnxFx½^*++)(( ¨¨ˆôôtV­ZÅĉÚvrr2Ï?ÿŸÑ£GsèÐ!–.]Jyy9cÆŒ!99™ÐÐÐ ž,Ëx<rssYºt)YYY4mÚ”¦M›’ŸŸøCïËg·ÛY¾|9mÛ¶%8øŸ³xÖíŸ&­…P iUȲC'p.òXAlL8Öm'íP&V‹EUQªCëL&’Ð1›T„jF‘e$IF5 TUF–L¨&õHæ UEQdIF5©XªSRUdÙï®c®Ž*q9=ÔDHºèRíº{|ž6ô¯Ô&GŒÁ¨Q£¨[·îIoqqñï†þ“åÙg§ñÝw7åÜ|óX ˆ&MZ2td pÎÂå/:Wî”#Ä—@7_?(T®½¶P(€@ˆ7ÿq}QTTAnn!qq¡ûºîÞ½›½{÷2{ölRSSÑuüüü þVzôèÁرcY³f Æ ã“O>Áår¡( n·»Öµ‰‰‰<øàƒ <˜6mÚüçÌLµ€×‚¼¢ì6›?u•0bgñÒ_Ø´aaá$ÉRµO¡¢*HB ´ß¿Ñ¿²×øÿÙXUkdžЄ…Âøg ÃÀ¨þ'ªs²¸]‚à 3W^9G„W•IaøÓÊÈŠŒW×þºÏ×_ÍàÁƒOiûrÍ5×àt:ÿÕƒíõÿ›Ãˆ«oæ¡GŸç£ÙÓ¹~Ô8.¸ö–-\Íÿ=}}†¾È·óo¦~Òý\xiwž<’/ÏçÑÇ/¥n|Œy‰Å &çäìK~~>wÞy'Ë–-Ãf³Ûí&''‡ÜÜ\4M#<<œÄÄD¨¨¨`ݺuØíöZJGxx8Û·o¯U¶ÿ~6lØp\ÐÍÊÊúo/ "'•Ý9e,^¾G° ]wa®ÎsVX\†Íjó›YQ°ÙMݰf«Š,ü «ª*’,#˜­t]EFÇÃoRÐt ¿IÁçó®¬k††¦yÁýDÄfpy|¼7{.ŸOC6`Ä 6˜T]—ð¸*ÝGÀÿXqB°téÒSÚ¾¼ÿþûÜwß}”••ýã•$I<ÿüó|÷ÝC@!}úŒ|LxøFÀà£Ù÷‡yïËç¸|xgvn|±ºÿîõÎ{þ¿xÁ¤d<¸Ÿúõãÿró‚ÕjÅá8ùãEQ¸çž{7nýû÷Çl6ÞgÊ¯ÛØ—‘Gb:¬ß¸‰}éÙŒêÛš« 4t(Ó.̪½ù¬[½ê˜ûæää0`@í´õ¿ÇÕ0oÞ¼ßõD:¤Q£F"33“„„D,øŠž][±jÝ.ÂÃ()Éá·‘g'š÷§gj$Blvê„J§DHèB§¢Ê¦é„†„àòºiܤ1šî¥(¯Ÿ¦¡J2EeÅDFDUÛZ5‚lAÂÀåñ I~{mHpªÅLIq)ŽìAgdV'É”éÒ«ª$óý×ßlw ðÛq%IAV¤€]X’m(ŠÇ6låÕgo­`Èà9•Ã5!!!!§ìs+)&¶o\M³¶1ŸÁÅ&2:†O>šÍÈÑc¨û|ÂpÐñ¼ûÙ²ù àŸ{ðXPPNýúuþZJUÉÏÏ?¥3Y–iݺ5;wC€²q+“c³Ó¶M+ª*+±Óo¨MÓxiÖìÞ±ãÙÛÛ·o¯å½’’B^^Þ1.f;vì¨åó{<éß¿?]»v%,,Œ={ö””„®ë”””0sæL¿»"áÓm@•Ÿ&Á0ѼU#Ú´lƒÛíæ›o¾ €å—_~ À¦-¿b–¬A~h,wV )â ?µ6@¹ÓIØŠKJéѧ'Y1!©ùyäeP”WŒOóѪM[Ö­]…ÅLpP>Ÿ†aè˜L&Ê«*Pa(Š ¯O£ÂUVîƒÕ… ¬¤ŒR§Y’1t—¦±zé/†Àf³cÿš@ ÿ¡Â@Q ½IR qX±˜M¸«ÜÈÒñ•ÿïâÅ‹Oéú±cÇât:O~5—$ì\˧ —ðîЋ)ÌË 2þ)-ÉÌ}n`À˜›˜3gŸ|ò‡îã¾Çžbä…CNµ'xòå;€JîpP@›Örÿ]€T RA"œ»&ÂøéëÖ€‡Ï>p!ÉN¶l~pŸÛ÷Ÿæ8<-L×uFŽIaaaˆ|§asDòúwR¿m›E°i÷!#ìxÊ‹¸ý¡'Ø·?í¸ã7$$„”””ZÀ[¿~}ÚµkǪU«hРA­ëßÿ}¾øâ‹ß­ë’%KX¶lÙï*+ª$áCÃb…îz³oßvöìßËž]{N¼øHC¸I¨GÖÁ\$Ó™_÷ÕßN$’¬NVF&¥¥e”âǧ $UÃå«D‘$6¬[‡Eµa^$IAþ•ÖAuŽ0 tǬèº_[õ¸]¨V3n·FÇVu))¯¤°°Ï@Ót„ð»l I(²„Ï0P$­º~BTÛ“5…óΫ‡³¢Ýg tñ7°òžj…,˼þúë<øàƒ”––žì¬¢S×î,ڙǻo½ÉœO¾`ÁüOñxÿÜvÖ]UAý¤XF^zwÿФÆM˜3ë5Üœ®dþ£O7`Â8fÜÕ©ØkL+Gg"8ZK;ºÿ+ñù|µüb]%Üöèó~o" ·ÒðûèîÛŸ¸®†G¢„³³³4hÐ1‹B ßÃéšþh‡èÒ À‹Ç ëRÖ€£ì¡&ê&&²y÷VlVº0ðxüóB11ص5‡‡J·Y»z3f³¯×{¶€ ‹Ë©t ê7ˆ"5=·æÁdÇu„ìÃ@Æ$+~íRCè€@’’QM" dIA7t¿+˜0ŽxF ˆŽ£ °³ª¢XCHˆ#ãà^ÚvkE£ÆùáÛï(É/B«­‰F1tI–A""#(­*§Oïø|þïÏý·ð,zì±Çˆ=%Í$&&&À,u²RäôróepÑÅÿiЭ‘˯¿›Ã»7pÿÄ{Žl5[í^³œÙ¤(Žj»ê¹D+§# Àd21kÖ,7nŒaÔ©S‡øøxìvdÇCFF&iiiØl68ÀÍ7ßÌ”)S¨ªª ˜6oÞ\‹Ï$== 6wšÊ!¼€A‡6]),Í¡{÷n8p€ 6 ÒÞ`2òbhнM_Vn^Ùn…*/íZ·fÏÞ”û¼Èº·¦CI­Ú5eçêTÚthÌŽ-)@HµR`œYà•$‰ð°`‚­Á\3vÛ6¬GUZ TEÁ§ùÁÐíõ€$¡* ²ì÷@Є¿Nº¦j€0t™Ê*6›«Å„Ë¥áõº"YQ1>ÍËÀžu0›+qÞNçÆÑ(ÍbAH¸|UH’ŒYñç4Ò…Ãï»k˜ª,ð¸]˜Mþ.l0S¦L9¥È5!#FŒ8-ÞÈÈH~øá:wî|ÆÛÂ{ï½ÇèÑ£ÏzŸ-þþ[¼ÍæP^|æ¸%~þ|:ïNMÂïŽvNNUÖ¬YCbb"}ô‡ éo¥aÆtíÚI’°Ûí$&&²qãF-ZD=°Z­Ç¸ 5nܘøøø¡ÿñœñï„ÎkŸˆÏ»—˜Ð8–üô#%þ9¤*üi',A*‰‘ââ[#L»v¬çª1cxï³Àú;`Ú¬~s<”Ì6JbóŠCìüµ€óºv`ã†-`Ø76›6Ünן^U5sÛ¯>»æÜà;]SÃ믿N‹-NÉÔ0iÒ¤“75ÔØd­VÊÊÊÐ4-@¬s¦Ä0 6nÜÈ­·ÞJAAÁŸé‘ã–þòË^zõêTÓ(àö¸‰­cgáG_0büh–Î[@‹G—QŒ,+èšÍUް„cV!/çB7Ñ´} Ö~7ŸW\Bq®NUyÉqiÎÉÝ»°ÏçC’$–/_Nݺuy`Ò£DÅÇÓ*>‚E[ö1zØ Vü²‚fÍZ°÷׈Š"{ö%–/_Nttt`ûž““ÃÀk='==õëןèU2Ûöåa’MTUìåÙgï`Ò¤W1Û¬šîÓx°VðJø<å„ÙChÚ"ÅkrßµwñìûÓ9z›¼+% TÕ„Õ£Ò°N2ûïe˶- >I˜HKM!%% Ÿïôôs#ó,ÙÆNUã­[·.>ß©› ²²²5j—]v‹-"##㌵£¢¢‚©S§’ŸŸOBBß|ó ¿üò Ï>û,………'yp#‘›[J\\ýcÊ—,ÙÃþýEŒ)±±¡<ûÜsÜþèxŸ8‰¾C»°àÝWÙ·cÓž™D¿>=pº!!XÆ©[ ‹ˆà`v1Êa^Yð3^X@±«€×ž|œÎÝ/à±z2å­¯ÿfÚ$Y–YµjÕ)¹'ʲ̊+ÈÎÎ`èС\s_û*--eðà 0¼nBlAŒ¹¸!΢B¬2ëÖ­¥[—îD;d*=ǎᨨ(¾ûî»Z„8Mš4!!!íÛ·Ÿv…ÀÀ„•ªŠ*`Ò¤W‘e ÝåæáG®ä©gæbµáõ鄯…±ekºšŒ]Qxqîû hÓÅ;–"©„Vøâ­x´"‚£|t‰lJyéaDÀeÏaÅ/éH’çÌÚxÏÉŸ“ÉtJ¯‚!C†PYYyZÏs:¼ýöÛ¸\.–-[ÆùçŸFµßš,²:u¢S§NäååQ¯^=fÍšÅúõëùøãùõ×_Oy'“›[F\\ñqL2#j–òó\uÿCÎ1¸ñ—hÔ Î ãúýúmØdеïEµÊ>ݨóóçÓ¤ÿì8ìØ±#×_ý)ýf„ `éÒ¥ˆÏòòrš7iÄžÛØ—º‡Žºà,·Ó«ÿ`ö§¢ÀYA·n½(->6]»Ùl>&8(33“W_}•Fý©6Ì¢6ßÉSÏÌÅlñ'¨|pÒå<öøl‚-0å©‘<øÀ7„Zš¡ZBØž­2’†ñuÈÕlX}60)(Љ}{Ý”–•¢J‘$7ÙÍ’70¸‚®ЪåE„G†bO~üÏïÆ {1$ÕŸ¹é8+MuôZ­|Æ5ÿGmWjxI€ßåëøÊ’øÍöT7e²aèȲ‚¡ëþ ¢5œtM§g÷VÿÓ/„8%W–e^zé%ž~úiJJJNEáÉ'Ÿülþ§›žþdê{èÐ!.¸à.¸à<OÀAþðáçŋÑoÈ|õéXÿÐy"Œå–ѧsû?¼çØ‘@çäÔvk5R^^Nrr2999ùܲu+¶lßE£Æ Y²lÝ:wåëo2úÒKk¤¤¤€"‘}Œ©ÁívÓ¾}ûÀ!ÝÑR¿~ýÓªûÑBtÍ„¤) †3mú’bï ). wQ†wy‰Þ}½j1 ‚‚’lY—AÏØ(¶§î%'? “Y¢uǺ4nL~ÆN¼ûZÐôÞ|Üi_OQ$»~Õ8”»ŸÍß!õà/x%EBèªjÁãñlÅëÕPUÇKP½VjIMó§©ñ§ý)+sb±X0™”ßè>'>]–%™*w²dñ»„ ªjFQL!ðx<0bŸÏGXX0^Ã膎¦ëQéuýÏïÓO?MÓ¦M‰ŽŽ>i nÕªBâbc9× M7ÈÎΦ°°áÇ“““ƒaÔMLÄ0ÎNð¬(df"==ÌÌLî¾ûnöïßOhhhuι«Oþ^’Á¨+.8‰+£¨4WpñEýNv:þaN'.®.IIIDEEñÚk¯Ñ½{÷ã^lSùx“™† žÔ·ìÑ8a6;Or!—…/gÜɳNÀåòÏ¡‹/¾˜5kÖ`6›‰‹‹C×uŠŠŠ¸ô²ËH;AïÞ}ÈÎ>Ì5W%44”ÈÈH$I"''‡Í›73|øpÀÏ”öÕW_Õb"kذá19×n¼ñFzöìÉwÜq }hP4Ð5¬¦PÂÂÚlkGÝØ!´h–Lxh)s~b÷þ¼óñNTuY?¥Ð¡}Sž|i?‘qÁÈÀ’-UŒ;o»Òc“U~þ!›öÝâXúM]E¬£h¦—àÐÃ;b()uƒ¨¤qcAth=ûvþ“Àë×MB h˜Í„0°XÌÕQdþP`EQý‘kª ! ¤´„ˆðÈ#aŠÂïw{̤£Uç#[“&ÍiÓ<‘ðÈpf¼úaáö@þ0³Ù\ËIÇ~Ž›Ýîç+«Ö°½^/²ü¿'š™0k>y[Þ#¬N‰ ¯Ãí­D6ɘ (Ùý>ÖÈBê_Je¥ËJäÀê@QÍ(Õ[MÓ(--&7'‹¥¿ìÂâàðáLdTE è5Ô“2 d0W;wk>ÍO5©ªÈòÿž@åT"× Ã Y³fÜpà ôîÖ€‚ÔÍ$4‰æÕÇï¢Yû>X‚yîÑë¹ùŽi<2¾3݆]Gi~.ªäãê{^¦ashò† èÕ«‡ƒÐÐP?ê ¬ ?¿?îCÏ箫îåÒ‹»Ó²{ î¿òžÿboÝ?‘º-ÉÞ¿ Åçd콯yÂ6¬X±‚~ýúQ^^N›6m 9‹  8+±úgG’€C¿(7·ÜÒ·šLpóÍ{±Z­Çõá ÅãñÔfö’d¢b 0Â#!?Ç N=™‚‚²"‹„ò2ðº ìI†²bƒØ™Â\‹EFHà…â<ƒ˜D™üì³× ¹¹¹ôëW{‡RÃÕp¼Ô?'µP`ÆbŠ"2´7Éq—Ó³s2J>`ñšÙ‘‡¬XÌáÕUZµT !ô=Yò`µÁ¯»lz ²dкL»ó²è7´';ZÉI¥MÇv|ýA¡aN2šùia!‘n“ˆMÔ¶šP%ߟ^?³˜ EÅ9ÄDÅa:¢:bÌãñÉTŠ‰Í‹?¤wŸÎ¬øúz7矲¶ïѸ^$›V/¢_Òe~÷¡‘}(…É×ÜSÍé+áòT1zÄh.wB÷ñÅ'ï³yó^ŸùÙù…Ž"ˤj vîÜÁ;o¼Š¦û8øBF^2 C—ü§šÂ@‘þœÓüé’ ×hïóæÍ«"™œœÌK/½T+]UUÆŒCaa!}ûö%ÈnçAƒvñyà¡i¯àó€Gƒ.Ýb1Ãχ|ägCXx\àO•ÿ^‘‘‘üòË/<õÔSÜrË-DGE¡géI&$ÊK!<4/Œ¼ýª\0óË/q8 ¤¦Ï‚dÀ„'^&, }<†€Â<và'*ª‹ Ê‹ýœ11Ñ$&&Ò²eKTU¥mÛ¶´mÛ–1c.­¶¯ªhÚ™äB6þÀ$ !11’|øø0 ðYôêÕ›õë×SVVFQQß|ó 0©6víÙÌêÝ‹ˆ‹åêËÆQçüWùä'xö­'˜öÈ$†]Ò›üªö¬OeïúÕô¸ìz"í¼þÈžÿácÞ¼ç%ú_{?ïM¹“îƒÆ±{——ý~áü‘×±wÍZwiOtú|ÿÁ|wMxˆ^>ƒŒžw 9b1—dž™Þˆçã?¦ÿþ²ýû÷SPPpšYal$Å¢iò5tlͺ½³øà»·1©‚ÌH’]Õ»÷Ú{yŽl²ºÀª¢Ð€Âüó¾üžâ¢6dþÊw÷Þˆ$ɼ0ý-²22èÒ¹6›­:ݵ¯š‹V¦²ÒC»vñgBQ bò¤;Ñt#`Rؼik7íF•¡Uëv”Wù0YràÀŸò­TÃNv´Ó¸Éd¢²²òGòéÓ§NgùùÚ‡Ë*xúšAôû0[}@ƒF‰DÅÖ'¿¸˜ªÜt:ö¹¡7Œæ…Ûî£ÝÅwÓ nš¦B§NX¸p!K—.åÀÁƒ(j;æ¿p“ÞŸÅg3§ÓoÜÌ}a2C/ŸÈ]#“˜0éq4ŸÊþC•<üÀíd[øåƒ('žüMŸÒïšç™zmK†¿“1wMâûO¿F.ÏࢉOU±Â/¿üÂ/¿üÂÖ­[©¨¨¨>Å.œ¨ªrF÷tYÿÿÂÀ£ç©§FVïDR·n२¨ŸO'.ÎÅÅ ­[7¬þ• 2´¯Í»• cfâ3.Á힌¦iØÌËäŠ[cÇVƒ«ï|€€&]iÓs\àé·>õ!7 ºò^ðÜ4izà»víý6äø7¬ç ¼Y‘qI²/~Ž&Ï´Æ\âdãën‚®áÏ Ô$d=ZêԩÕW^ɇ~xÊÑkɉ/0î¢A¬Ùñ|—Y±`1[}è?“—Ÿ C`·ƒÛY2Ð nÝš IP^^„Žaè(ªLbÝØêŒäy4iVFóf…„E„Ÿã£´<M+§R3!2^ŸQI°Ã~jÊÙoSÿlذIQ6U¹šÚQ–äj’ctŸAEUªjC7\D†GQVV†!Àb1W›$JJ‹ý)”]^‚Cƒ±Ù¬T¹<ø<^ ɯ©…8ìh>C”£&•ÇãÁb± !STTD„‡Wó?HxÜn$I¦²²Œðð0$É„ÓYA‡ŽI˜ã<å•W2wîÜ¿dÚ/€¢&‡ÕñxzeYæ™gžáö ·²péFtíØm‹I¶áôe`SbŽó<ÝUÌõ×^M~~>;wîdذaºÆK3?$8øäÒÌë†E²r²FÔ²Ò2&ß+…EÅø|>öìÙCÏž=©¬¬ä•W^aþü«'Û¶¤]»3åÖÄüâ’Á=ÿÆÀÇäÉoÔÞΛþxý¦†£Sÿ|òÓÓ¼üàb‚Âÿ¦¹‡¸zMÎJX¼¬ÈÌý>î?ÚoÚ$¼a‰Ô›wYþ²ïÌZ7hЀzõê±{÷î“v»¬‘q—¼ÌÒMK°+*B²x! ¡!„„TYFÓµ€ÉKBB7<þ ˜1„Ž*ÕV~pF2‘$Ík¢a+/ÉõÜØÍvª\`ÏGTT‘aìßçd×ö*ÒÉ/<€Ëµöô5ÞæÍëQ\RR=÷ü¾ZBHËʑٮéϬk&tÃMT¤Y–«É+4$ÀWéa&ÿišäƽº0›ªí·²Œ0ü‹IBà7ÊÇÅÕ¬(žêNÔ±š$Ž`Gµ†^EX¨8tÿj1b!!!§¤!0€è˜8®1ð¸×D†ÖaáÊ™tksâZš¦AïÞ½)/÷GÕÜrí¥']¯Ï…ÛSIHðÉoÿŠKJ‘e‹ÅB»ví¨¨¨ø¦…“A¿‹£ÊÉÅÌ'´žáå–Óõ PU3Ÿüø×]ô³v3`Àyä¬V+!Á³ßFÚIîäBBBX¹re-~„?PÒiÛ0錘K‘;àa¢Ö¿GΓ±žžÉ¨N:Ìž=› .8âµ’’’¾}ûhÒ¤É)ßïë¿Çí)dÚŒ‰XT+ß.ü–|€ÇßÃ¥c.¦}›†@VÎ!2231ÉuvT°rùFŒ@AAHìö`Ú·oÏ/¿¬"*ÖÁ´ç¢¨f !Ð%f,¸ÊB|$„×Áãö’sè0­[G2õÙ%„5Ùƒ¬èØl§–¶ò„r8ì8NQm>'µå«¯¾:¥œkB7nü»ìGe•…ÈÕ)–ÄY⤈‹¬Ïªm_Ò"ø¯÷}ýù»EÈí?ÁY|2FÃ1|u‡È?~ò*o=ϱ\ AÜúH&\qá‘PU 6;TU€×fØíàóAi„„ÕX,þ-«Ù •NXþƒª=s/àÚ›¯8E³”ÁÏëÞç–Ñ3(*ÍÂ-ðÝчjå匾ìÊ“¾oLL ^SNvù[Æ/!+w¸œ Œuhö8³ŸÏw !{Æ OH„þ‡Þ`3É [òö›‹ªCÁ„ S±XbY°`- ¾ZS=OðŸÂ“0O½óÎÏ9'I2¼Î¯èI¡aÕ1~Å!'Û -EcL³F|öIŠ*#Iñ¤¦•Ò¾}lVƒŠr3••99¶?¼çä̘fΜIóæÍOn›WÍÕ0mÚ4¿Iå¸Ú¬EV‰ K¤°äÐY©w¥«Œüâ Z6ìyÖÀ½¶Dà§ô›Œ<î#'ña‘஋2S ê$ËdgÔk,“Ÿ^Ad¬Œ¦AY¡APˆŒ#|.(.òŸ Ô6Ùhø½ WïÒ|x=ðüã¹å§øiÑ6â#£h?ä<>™2™ÄV=phüðÝ|n˜x_}ò)#ÇÝʪ¹qÿ̹}‹²"j'{=Y ‚žíFSTúwNw#¡EbræáŽmŠâ:µ,)tëÖ­VÙÁƒÙºuëiq5äç÷—÷ÀÓOœÙûÞ³ §ÃÕ0lذ?d'Ðåjf~v— œtVØ/=> 1M‰£¸,çLY)+s±hÑîc&ó3Ï|Ã/¿ìgܸžthc£yµ©Ïd…‡®¿• 7¯fÖŠüß=7c I`æ[±á»E|ûå<ž}OLœH‡ö‘-‚f=.dîs·pÿóoRïO#õóÏÛÂ…,G2pàM˜Í&Þÿvd9„Á5¾ Á2}Çã,w ôºt ±I2¹®FIžÁÃÏ·ÅUŸšK©®½ÿE,hÜô öl6Hh ³sw‹íFˆm<ù䈓²Wÿ´æ5Ú·{úŒ.t†a‚Åb9ƒ<²>G ‘?¢¨óµ(UÅ'ýËão4iÒ„ÄÄDvîÜYËûç¿"µ€÷ñi ¶‡øÌ’?PB®&$—$ É CȲ‚ì7ÅÒ<ÅŸ®$äjÇãèlÀ²„$ü+½,פqÔDKÂÝÐ@HíÕ)呪­iÕ$ëT§…B¢²ª‚‡n{³Ùò?íT“ÉÄ«¯¾zÒJAbbâòñ––çsãÈiìLý…º±ÍΊ[U»¦ýùö—™tosñiipÇY†èÝûøZÍ9TYüýbjâ4Ê î|ìKÞá,ƒ«ï}€› [ àÖVÈL7¸þ®—ŽRj ®½o&ùF`'1p`Û€©Aˆ÷€·üÁ´ê݉ÌOÜÆ;ŸÎäÎkï¦ÛÐÑì߸‘‡_˜È‚W_bì÷óÂ]wÐï (q îßLûnCXüÅ V}÷5+ò]d4´nÍ´’EÁE]tÒDèE¥YôîxÏ0–¯ý„ç™%Ã),=L»¦ýÙsp-‰±M¥³†ÝµG>ëñÇ×åå•wB,þÈÁ$à<ÞòÂúe#ñ{!Ôåççù‡Ÿ†ÈÀŸ C¢äÓï ¿oTµúddàI˜ÊiÙòÚ´hÎw«Þ".>ôOõ›#ØŽT8ý^|R×9d>›z3mÚ´=-à• Oô©Ùeãããyûí·¹ð k™êիǯ¿þzÒg!ÿZàU H²†¯Êƒ=.‰Îƒ†àõèšEH¿öŠìGOYFÆÑädH¨~>E W›„Pª-~T‡Ç‰£bÉŸ:¨:•§nè€`13dú`$5‹Àf²°ö‡>H5MèBPYáDœ€fãÆÇ-7æP•ÕË<|7«„‹ºFóÚ”RÂÌÄÅ*4l¨ðÎ 'Ï(¦C{;{;ød^%Ÿ•3û“*F¢MC–£¬®!„’’J‡öGøGÏ” „ 22ò­ådÌV³…+g2²ïD|Ú™Óâ+]¥tl~¯6+OFÓ}ƒáZ—¸8?ÍáÈ‘÷óÕWwqúiXbøpþ®¾d Ï?t3ð[2Ÿð_E¡¨(IÒp:‹¢{Ó×s~»QxOóɲ‚ÕDDhš¶30V}ö";vm£]—ŒŸt-×¾Ÿ§GßþÝõç²{H jí;v¹õl¼UUUÔ­[·VÙX·nÝt^]/à BÂk ¦¤ÒÇO b¶XˆˆŒÉoKEÖ%!ÉH5† ¹GÅuV–$ôê”M3Ÿ” ËH’Šæs#a`èÕÙQ ’äçiЫ#× ¡ƒ0BG×,Øã!©l%ñ!á3't=Ù²=D檻ÃX·ÃÇØ)¡¬\àâÑbYðq)çî› ¸gj8훘62E/7"º¡BÿþöJ4jo!¹…™ltñ/.Eѽû0Ò €ÏÍÍeذa'45¼ýöÛLŸ>ý„^ '²ååàž·–ÈÓ³Fñè _’U‚|ì³%‡Õÿ>Ê* ñù<8‚"Päÿåyì!„øŽ^½îföGן&è ^ýàKî¸æ®¾ä÷5TGÿ.”}ÿ%¡C‡VkΧgv±XÜìÞ=ÃðxB|¿êS®ú^gÞïkÈB'!º1~7P¸¸÷¬–`JËó©r;).˭ެ˜ƒ™òÞ*ÝðÄmOòä;°ü‡¥tA½j&‡FNÃRxà”~YZZzLDMÅ9p»4*M^%%´Pðy©ª¬À]U‰,Ëx½>ÌfÕo‡5$4CC®&À¶Ûí¸Ýn¼^/aa¡èºŽÉdÆ0 ***0 ÕdBUMØmV,&3sf/ m÷^&M½Š’rBCC0„ 2:–‰×ÝCÇîmé?´¯?ìÏjC ! 3>“$&o†ª¢ E‘N87¶oßÎu×]Çûï¿_xU‰—-"¡•ÙŸ3ùÆx2idìóñæ“…´lafꃴ©gÁ‡`ÇJ7xe^z¨€3[V»‰ Wª3æú%’H~øáGš7;9f}Ã0¸æškŽ!‹>y–É)LㆋŸ'§0 ÃÐølñ Ü3î}çíûSv`EV ²†¢›ý¹ò¶§,£wÇËñx«þgƒ6>&’=©™tmwªÖàÍ9ßqÇ5·œ„™Â¯A†=¨Ä¨t!ÿv³ÉFTx"¥ÎüßÕhWoû’nm.&» •]®ókîrªÜå'Çn#n&ï°dÇÜò(ÎA‡®}ÿàz¢‘¸àò{ß}Ê  P·n]f̘Áˆ#eû÷ïçÀ§Í½ûO—Z!Ãã®8ˆˆ¿Ç$£GÔEÒ4ªœåDÅÄ"©:Îr"Âð98xàuëESá¬DRÌF5 ºa šüæ·ÛƒÃ„ËíAQTdYÂçÓ% ³Ù„×룪¢œ ›ŠÓé%ØnA5‡‚ìÅd2!K2Îòr¿=J„G„ãñz†@VMøòSðy\(’B•³”—Þü«õøäüóÏgåÊ•IÇ.[¶ì”¦²³³IJJ:åLÿo;6ˆ‹lÀkÞ&»àW~„JW™ßcä´§¡ :,‰9?Ÿº qh¿ 3¯Ã+¯¼RMVtô˜!)—ü-WG·…³|:yýîGq•žö; cõêÕµ( CCC™9s&S§N%""â?¼µ4^W¥†Su£H2Bø0¹ÁðÛi‹JóˆQrÑòrÉÌv”F°î"}õF-úw0I–QMþ[*ªš™ð(+Åùe|;w1†¡‘A”WVÄe·]ƒ«¨ŒÍ‹QîVѼ.*KÊvõ%¸<>5nÄÈLË!eo Uånî}ìvªª*‘$I2á)¯Àl³¢y5ªþ€våÊ• 6ŒvíÚñôÓOŸµN áÅ_<épHY–™5kÖ)›NFÎ+N§C³ èÐ œ•E˜T Ž p¾X< U5Ó8©m÷¦Ä™{R€,!QXzˆAÝnðO|̓@0ï§ÿ£O§+i–Ü…gÞzgœ®[9”÷+Å%6*+J·Î†¦SUY†ÓYHTX"åå%ÈÜ~j ÉJƒ™CQ2‚¼Ý“‚A(Å)™º@‘$I§ÆÝKÈ.ÜÙ.|ºN— ú ÉŠß&,K(’ÂŽM¿¢ª õÚwC‘ed$„Pñxº!“’’Ž„LBýDê'"!HMË$,,Ch8 ²ðù¼è€"K˜åwÝÉ,Ë1„ÌgCZ¶lù»¤ÖÇ35ÜtÓM§”˜ðtŧy(-/`@—«e…¥‡°˜ìD„Ʊ+m5výHld">ÍKç–C©ÝJ—󸚭Oósg\>èJœ¹ÄG5dõö¯9pxVK:#ÈJQYÎqOËÌÍ )þÌ&+.OÅï¶ÕYY„$I|½bÃzÞJIyÞ©-^>7ûîü…NwÔgÓŒ-g„*qÆ&Îk9„Òòü£4QÁŽ”å\=âæ¼=ü¯Øì≬GÔº÷°¦QÔù K0†ÙNö'±¦!Ϋbbb"Ó§Oç’KŽìRRRؾ}û2xâà=¿Ç‚‚(Š›êmÐ1 <´" ~"¿§W5ý¢PA6x}>̪ŸèFÈ`“bFÓ|è†døƒ( ª¬:(Jµ{˜TÈïå ˆn 004 Õ¬bè:ŠÉŠeÇ'Å¡à÷¶ðzÝÈ' ñz½Ì˜1ã/éÔµkמWƒ$ITUUýyf%<>%‡‰¨Çð^7×ú¶ ä0²¬`³:°[däì&=gUn'Yùû ²…Ѩnê×iCTx]ÜÞ*šÔë@ÃD¿Ûãsáñ¹²…`V­¬Ý¹ÒŠ<åî£]“Þ´lx>á!±•å Ÿ„÷„× ±IØ,Á¿ ¼^Ÿ›’ò\êÆ6GUÌÇ]«ÕÊ;wᎸ\ôßy]©ÁD=Úñ;ïèÝå>Þ›EÚþý¿¼™èÒªöA«ÝBdHr ÒΜ© _hjU¡»Àš³WB[J[_Œ¤û°¤¼q?ÊûIÊeOÅY]eeeµÌ àÏ«vº\ ÿ:àøà´mC[µjÅþ?˜gn‹/ñÆoœ4³¾$I|øá‡Ì˜1㌚Τ†ŽË]ŽË]N°=œV5[å–Öº®†s@–d‚íáØ-òJ2È-<@~q¹¿¢ë^c›Ñ½íEÄG5Äa ÒåD‘Bìx}.Rmå@Öçï£qRG’ë´¦ab[ìÖ0Cƒ„öd¦a5ý®»{›‘ÊÛKÛÆ}Np mÝ>Ï­dB3;?äùX°Ë‰Pdâƒ2+t¦žN§Ù‡Ù6&†ù]tK "§\£n¬™5i.:ÅšÙ”ï#6¾Í÷ûæ“jAUÌ”UÊ̪•9?NaÌ€OÜYE(&„jÆ0ÙP<˜‹Ó1•ea-HÅRtOd}\±-ÐÛ£Û©¨rQ•ù+¡¡¡8›ôÅÙÄÈvÄtð×,ôÔ«W¯VÙþ³  Çáãý×6ô,²zýV4McÙ²eÇ?ÿž{J¾¼ÿ:-@1nhdäìbë¾Å†ŽÝŠÉd¥{›‹hÖ¸5çõlβï·óÎüû©t—š@|TC:µH‰3¯–Ý748š›ŸiÅ{O¤PXrø¸æ§OŸ¸WÚ”Ré6¨ò ʼ‚p³?7`„]r\:É¿[ ·Ê”º «tCU *uꆪ¼¸"‡q“ž";¿©:éŒä©! «bâpÎ.bCãÁ0„N¹0‰nB¥%˜ðú-¸í‰™4åÿ0ÌAÙŸñ[ñTø9q…qÒ`7|øp8@FFÆÿô½Ö«WiÓ¦Õʾr¼d—ÿY÷ß,½{÷þËže2™xå•WNè;|¼EáÀ$&&þ§WÓ½•e³OÇÚ‹¯‹¢²l’ã[²}ÿ2² Rh˜Ø‘Òò"â¢ê£( ³ ³ÉÊ7+Þ¤¤<›Ë/˜Ä%ý&þ.éY‘8\ª¡ P‰Û~.dÑÄz {-“·Çðñ.'‹³¼<ß3Œ•™U¸|«ò=\ÜÀÎ`“„d”iT–{puº çÁ»\9‚"9¸wjÝŽ² »¿£g³ ðúÜ…E²·ê„‡xub#¹kÚ"5>±¶¨ë:¼º„iŸï>á5²"³cñ{<ýèÄã&'ŠŠâ¥—^BADD†áÏkèp8GUU|>™ÊÊJ|>Š¢——‡ÃáàŽ;î   €ÂÂB:uêTëÞ¥¥¥ 6ì4SÿœÞ3c‹ÒH©æä×CÃÏ„$ùÓi?£N:Y{RSSOɬ!I?üðC† ©ØðœW¼š—e?¦mãÞôîx9%ÕAyE™¨ªU1cRU¬æ`,æ dYÆaç©w/cÒus(¯*®`bW Cå@ðÍ¢Kc ÜÇÂÑѬð %˜û›@3h_/ <…ù¯/õùýÞh•?L“³çÀjZ5µ\ýEΜ3åw²²3e=;\JYµGCÚá­tj>„’r?ßFtt4wß}7<ò d Á¤ZØŸ¹‰ÂÒÆŽÍbPb»†ºõüD5Ö ™È8¸Ï ¹±Lvº 2^¢ª Ê d“Lb2d§ bêJäd( (ªÌ‡ÏÝH›F~—,ËÌ;—ôôtÆŽËO<ÁáÇ1™-Üqûí¼ñ¼ûÞ'¼þÑ®¼jÞòrZvè‚óð~î|èqrgÞS÷îÝ Çáp°mÛ66lXËijsçNZ´hÍfûËú¿aÆ̛7ï¿¡ñ !ün^°më&ºv銦i˜‚l êÒ“á½/à¡I÷òܪbÞšû"r«Øžº’rßR¤mãÀÒØ„åO'Þû+¤&Rç·ŒL¿§ñnÞ¼™~ýúár¹Î¡ëIŒ§èð$‚íáÈÚþ»À‹x½U„9bÔí C'·0èðD®šI|dC¢Ã“°[(ŠéìN6ÅÄ¡ü½TU‰«Š‰i+i–ì' × I’ÈÈNÅí©$6²¥åH’DLx1ÕŒ`!vüzÄAÓàñ ¹â–;øüÝÍäû¸åÞ+yoêóØLE´é6€ïgÎáò{âçï=´msd\FFD0xðà@àΘ1c(**B–e–.]ÈHacÆ\Ážô, ΤIråð X´|-¸*¸þ®‡™ýÆ+Œ¾b,åUx<n¹åúõë‡Ýn'%%å H›ÍF—.]þÒ±ó[â5ðÎû zv¥ª²ŒýÛwƒ0_|þݺ÷dñÏKyñž{ö%^xóEVoXƒ#&”™O=DƒÈ€‚ãºpêDè’$±nÝ:†zxOR:µÂêm_RåvQ¼âã 醎¢˜QdÃБe…¼âtFô¹€üâ ,f –Oç–Q3È->xÖø(B1„GÈŒBƒ£i”Ø··‚”ŒM´kÚ]רW§VKe…Çu14t¨øúÄ'É5k Ó>z™¢|hw^ƒ ¯¦¼õ†› H~Œ ÎjwqÅæßDy–””‚=úõëÇøñã¹ì²Ëh×®#GÇl6#„ }çŽ!hݱ;Š¢ Ë2×Üx+lß¾O>ù„iÓ¦áõzÑ4   c4ÏÿòáÚ™35†ßÖ%t¦gòðC1ó7QU«Õ†ËUEHh8“&=ÀwL`Ï®_éÕ»Ûwífö‚Ù,Zñ=¯½2ƒí/ÂÐ PeÎdÀé_eøTÜÉjÀºfPŸ“ß75Œ5ŠW_}•ùK§q÷ïòõŠ´mÒï„¿Y·óv¹–ò0j醯¡¼=ôíx%W=V·ÙEnQú¯{¥«»-,0¦÷\ËО7óüã¸làCÂø©áô%..ŽæÍ›³aÃ*++ÿ§ï¬^½z¼ôÒKŒ=ºÖ®%((ˆÎ;ÿåoJJÊ?[ãÕ UVøaÅ"&?÷T”ñõÇŸÒç‚a|>w.áááÌ›÷)a‘dg3dÐ<<ù!n›x;iy™ŒÎý•›/½…W;άæ‡ðIY•ÿÑà „8åŠyóæB÷îÝ‰ŠŠ"--5kÖPQQAݺuéÞ½;ìÝ»—õë×S^^N«V­èܹ3V«•Ý»w³qãF\.íÚµ£cÇŽH’Äîݻټy3º®Ó¾}{:t耦ilÞ¼™={ö „ S§N´mÛ·Û͆ صkaaatêÔ‰¦M›RQQÁºuëØ·oáááôèуúõëSTTĺuë8pàQQQôìÙ“ºuë’͆ 8tè±±±ôêÕ‹¸¸8233Yµj¥¥¥$%%ѵk×Zm---¥yóætîÜ™ÐÐP¶oßÎÖ­[q:tèÐ6mÚPXXHTTo¾ù&`åþ„Á ›X³~[·n%((ˆ®]»Ò¤I*++Y¸p ·ér={ö¤~ýú¤¦¦rèÐ!¶oßNdd$ݺu#7?‹ËÝÇå÷4¡[òt©’Þ½{“@nn.Ë—/§¸¸˜˜˜Î?ÿ|bccIOOgõêÕÓ¸qc:uêDTT)))¬[·.ÀÌÕ¹sgVïüŒÖ‰—ðóÒ…¸]^‰ÅìMÛÈÈ>÷°~ÃzvíÚ…Ãá`÷îÝË-[¶°uëVl6­Zµ¢}ûöx½^6mÚÄŽ;æ¼óΣuëÖ”––²qãFrrrøðÃøá‡hÑ¢›6m"%%…ˆˆzôèArr2yyy¬\¹’üü|"""8ÿüóIHH ++‹•+WRPP@rr2=zô ""¢V[›4iB×®] !%%…õë×SRRB«V­8ï¼ó bË–-ìÙ³‡üü|^}õÕ€íü„Zk×®¥U«VØíÿ½äºJãþ}’¬pÉè ™ÿÅ7,þá+ Î3¯O§Ráñò𤇘õÅûÈf‰9Óß!4¨ºOCVÕ¿ÌzðWj¼={ödüøñ$''ÿcŠ¿õ =jÔh¼5QˆK7ÎaìÇùqÍ;´9A„¦ûpyÊOŠÿÀn åýo¢ÂUÂ-£fàÓÎŒ—IxH yíü¾¬&ÕÂkÞeÌÀ)*;Bz¦4ÞúõëÓ£G>ùä“¿¥‹b“&MHHH`ûöí'ívyNã­™€„æóñÑûóЪ]{õãÃùo2pD_f¿÷óç~C›¦]¹dØ¥€"iÕö¥¯ ñêÕ«;vì?¢®‡AƒÕa©šG¹&è¤øŽþ|tž½³-?ýô‹å¸ Æèþ÷±rëg(²JLxùÇáRˆ KdÙ¦9´o:àŸUå.ã¶K_åªÇšb·:(«83À»+õ÷¸‰òJdâú]ßÒ,¹k-Ðý/ÉþýûY¿~ý_ º'ùÓ3G–eL&AŽ`T»JpP·]õ0Nx’”My´iÚ !üQ@Šô§±þ£AžŠ}÷ï$wß}7cÇŽåË/¿¤C‡(ŠB³fÍøòË/¹òÊ+™:u*S§NeìØ±¼üòËÿóú•e£½:ŒaÎOb6ëÂç¬,ä`ö¸ñIÞó…;dÉÆÏHC‚¢Ø¶it}š‡Ü¢4NêÈU’““éÒ¥ ûöí;¼gZ™®ÉÅöqF8£[ãê€ÚµkW\q]ºtá¼óÎ ÐhŽ5ŠO?ý”I“&qÍ5×ðùçŸ3qâÄ3bÎBÜ–NkûX·~÷÷Ž›ÍGß=vÌ÷†¡Ó£Í%ÕA¼,Áöp–nú”5Ûðýê·0›NßÏTÁªm_píðgˆLf뾟é×iÜqÙÞþ+’’’BVVÖ–«A朜·Q£FÿȺ7hЀŸþ™¥K—²cÇ.\È–-[˜1c·ß~;O?ý4ÿ÷ÿÇM7ÝÄ /¼pJ‹Q³fÍhÒ¤ .¤°°'Ÿ|’«¯¾šáÇc³Ù‡/§j“”$‰!=näµy·òÔ­?°`ù+Ǥ¦oœÔ‰5Û¿‚“ßòªbzuÍÃû¹tÀx}®?1 Z6èAAÉ!cš²`ùtTÅŒÅlÿOÏ‘FQ¿~ý¿…½õ!ÇÝ÷{Ù@2$„ì÷^@˜0tÃ00Ën JŠK)¬ráò¨²Š& l²BPT0J˜ ÝjÂÀ@è²» K¹=,CxdŠöd¡Ò¤aSš4ïE||TuÎL†!š¦!I! î¸å‚l‚>}»ù³Ë2&¡ É.w­ÚtýÛh¼§ÊÕ°|ùr²r 8[ç\†a0öòQ˜ÑàwÞaìØ±<ðÀ!˜:u*©©©|ûí·<ýôÓH’„$I\wÝuÜÿýúÇÆÆ¢i¡¡¡¤¥¥×6¼wï^ÒÓÓiÞ¼9ºÕÜ7&&†%K–вeË@ÙIi’B¯—‘S˜FTXbµ_î+ä¦Ì ²$Yge>~ôîß!4BÐ:öbÞxçåßݱyÜ÷Ýû¥¥¥Çü^’eÊ«Š ¶‡ãöV’‘³‹øÈ†Ô‹oyÌÂð_MÓˆ‰‰©•/î?¼>¨ªägWòj~0$! ðú $! ¶à°«Cóƒ ªRYᦨ0=_CVCÅ+*0Ë6<º¹D"˃𔢠ÁÌ·gŠæóVO4 CT§w×u„¤“›S@:±t9¯%ååå˜I•ªrÊòßÇžñÎ;¾$IüòËJœµ˜’Bã¬ÔÉâÉ\1ƒä&¿¿Œ9’ªªª(&%%D‹-PU•Ü\hk³fÍðù|L›6–/_N³f͘={6ÉÉɤ§§SQQA¿~ýBpå•WR¯^=ž}öY&NœHNŽŸ´æý÷ßçùçŸgÏž=äççóæ›o²~ýzÆÊí,*˦[ë‹Q WÎ$%s÷Œ}Ÿîáýožbñ†÷©_·%ù®rÎ}wü}sÀ_m$$äJKKQd›ÕÍÌ“ïŒdÊÍßr8o9…i¤Ú•ƒ'Ÿõè¸Ф§§³yóæÿ,WÃq×ë5°*Â'!0Ð… ³¤àÅ ¤¤·«’üâ2""‘d?ež"„.ˆ­cãP‘‰¨`ªJBò[¸òøRà«rbŽ eækïäˆÆ>d!Ó¢û0 ² ç Çºà¥¦àö8É-(@A ©&L† ¯ÏO ~¦Ü~΄Œ?ž½{÷þ.WC||ÍäªI7ðÈ ßŒÛ+(L/F‚‡^À§¯l ´ÐEßQMè: ³žY‡#.ˆzIAÄ5­Ãò»)+r“s¨Y’¸ëžԉŽÃ0t"Be…©+hÓ¨7EeÙ4K²èâÖ˜~7&66öz­[Qˆ»Ü…¦yQmv–,ý…NºárU†Ç[ ÈI#&&Y‘Ñu X‚LÜõÀã ÜŸe+V“y8‹G gá—ßÑíüN¬\µC˜XøÕËH²¸¨(æ}þ&2&d Þ{oß}÷º.j!p»\hz9 uZPZZͪ +ŠÏ‡*@5›ðy½ÿ³N|ùå—k4I’Ä믿~LJë£%33“ü‘–-[’––F# ¯0‘Ô4†Cé%Œi˜È0G"ÛWü@Ÿá×Ò¤eGd»±‰*:uëIÙ¡]Tx u¤ïÃù¿Ç?â‘'oeÏ~ñͳ8°g3MweÙO?ß´¥…`1[þ°-S¦LaÊ”)LŸ>3fPXXˆÓé<æðëèò   î½÷^, ëÖ­£W¯^6‚Ÿô:..Ž)S¦0wî\†γÏ>‹Çã €t\îÇ™ámòúÜÈ’Ì“·|×çF‡ÃÁÞ£YöÕ¯ôî—DÊÖ<ÚöH¦ªa9yœÅnº ¨Ï_§S7œçï]ÊtfÎë[iÖ.žÏf¬aÜÝ]™ÿλÕLEUýº¶âÒ˯cÁןPR^âßÖK&³ !@Q@Sd!AìÝŸ‰lO eËzä棞#?¿Š¡ýÚ±'-²ò¦N¹ŸœÂBA&~MÙCßó»Ñ±ÇhÜ•nâc)¯,#16šû¼‰Ní;°{ÛêwïC¶ËŽÕD°µ[iª¨Â§+¸}ºñ÷±™ WƒaX,RSS‘eŸOãžÇžåÀ^ƒëî{â<èÐËïc[^!ˆ±pÍC¯VŸNqW+­0vÉX²„ØBìI$Öõª\~‹Ÿµ°ÌòZõë×øøxæÌ™ÃÝwßMãÆyöÙgéÒ¥K-°•$)`Ÿ«ªªâ¡‡¢eË–,X°€Ûo¿€ ðÊ+¯°zõêZDôÑÑѵ2mÔ|WcÎÊÊ:£ñû’$“޾qûhâýîeIMª9a“‚hø|ÁQAŒ¾¡†fpÉõm)*ô0ø2ÿB:òº¶T–¹4¦9?~UQÍs.(,=Tkñ8'¿¯ñ&&&þåkàý~Ù† hÂ…Íf#$(Œ‰÷aù¢EÌÿf>³?™CA^!š¬cVMHH„F„a³„1åÙU‡¸wÒÿ‘š’ÂÝ÷Ü‚ÛS‚Õn¦}›¦´oÓŒ‚’Ê++>l< Ô#3#E‹æa5™ $Æt`ÛŽÕäåW°cÇ^¢¢ÃÙüãB"BCÉ,qÓë èÔE “q¸˜¬<7ùš‰þ“N5™L¨ñþ„_ye:ªk7õ‚ÎN$!‘Ó¬âܶæÎK›6mhܸ1†aPXXȤI“øé§ŸHLL¤U«VTUU‘——ÇÚµk«·öJT}>_x† Baa!7ß|sàû[o½•°°0’’’èÕ«ü1†a@wõêÕLž<™¥K—Ö: ;“RVVÆsÏáL0Œî¢––zJÙFΉŸ:õÅ_¬EùŸÞ^›±wÏ~4¨‹,[S·sɘ˜4ñ!æ|ü >üc¯¾˜ˆXÀocu–’•“‡s?§ŸnÜ~×U:THAAnŸ^Í^oBè>tC'&*–ŸþðÈHò²³pWUâBŸg ´=‡˜)Ì/`ü W³}ÛvF¼”rç>œnL%„YT ÃG¥ÝŠÚ$Š&Ö¿–!„`éÒ¥§ô›Â¿EÝãââÈÏÏ?¦|РAµ"ÜŽ–£S¹_zé¥\zé¥ÏãÆãª«®b„ |ÿý÷lÚ´‰7Þx€°°°€-yĈìÝ»—½{÷²dÉ’³ª9ʲLvNÖ]hÏÉ©‰Ûí¦sçÎÿIž8oIY%õ4ÆÐuœ•nâb£Xµd ƒõç‘§Þä’QݨrK¼ðì3ÄÅÕGG û ¼BgôÈ 1²Šjãõ7çлï¥$Ö‰!Ä…×kàözH8+J)¯¨À¬ªÌšý×\ÿ¸ž¨ØÒ¦´ÔÅ€W£yKiÞ¬^†#¤)q±m  B6k؃#™?gc:´E+öüm:õÙgŸ­Fÿe©Ï×^{yÄDRZJpppÀ,QãÙpNþýÒ°aCzõêÅîÝ»Ïi¼­¯‚¬HȦ ¢í6\.™‡6Å3O=À|ÊØËº²­u3nŸp+é|4ç]œÅEÄÅEÒ”¡_HaA!Ž 3]ºŽdÊ“÷Ó¤E’a¡  ‡Ã‚¦i¤¤¤ðð¤{hüz3†ŒÇSŠÏçÃírñɳ¸bôµèÂxÐŒRT%Š?ùŠûyŽÇ}˜O?þ”f¼ÌÚïÐíºËþúðÃ3cÆŒD>)UUk±Fý]ëxNþ]’ššÊºuëhÕªÕ9à­‘·ßz‡.Ý;r~·Ô‹¦´<› ‡ ¥{ÿ éÛíÎïÙ“Í;öpÙ•×PúÆëXMvš6lÁú «ÈÊÈfϾ|öåbà{æqF_>„² Ã+a ²0jäM|òéë¸\+–/çÇŸV™˜Äc“ï&;+«Õáö”cµ„1á·ÜtÛtëÔŽQ£/áÁûogÙ’EDG$0zHRöÿ}ÀCÁâÅ‹ÿ@Q”¿=ð*ŠRKƒÎËËcçÎgåY5‡ž^¯÷rHFii)»víúS÷))) PKþ¥~ýú$''³gÏž¿”×Äl6ÿ}wÀ Ô«Ž$4FŽMƒädyð.‚-VÖmÜDß¾=ùä³/hÖ$™º êsÓ ½Øºc ¯O‹m»·3ç‹Ù\8¤+ […Ûí¡ªÔC“†IĆקn“–ÄÄEpÏÄÉ4n”DnA!†á¥èp.šæ>ŸŽÍ¬¢y‚ «Ó–¾ýú1þÇ™ùå74¨Á†D«,£a´Ê³s^GF¡Nbøßj{]C„^£­éº8`ª)«I·â‘‘$)p8u4ØÔ„Ъª8ý¯92™Lµ>Ÿìýk>K’¸î·Ï<úþGó)ü/ÛtèÐ!>ýôÓZ÷«yæÑm:Ñ3ÿ蚺uëR¿~}¶mÛ†ÓéüËû:::šÐÐЀ&x¼ûŸl»çÏŸ_Køí»¬);wYóùèwy*ã'--ÂÂÂZ¦§¿B!úõ×_9ï¼óظqãßx ³Ó± '®Ò`žzäAì6+šW£Mëf˜L6f¾þwÞq¿¬Xî…O¿^L|ëA¤\Ïå#.$6¢9Óg>Mïó{¢ )°sÿFn»õaV.ù™ôœ=ìÞ±“E!8ØFA~1ù€Î‡ï-aýÆMô»úvF]y=Ú&BÎvÂ##˜=ãꆨ¼øúÇ ëÝöÿÙ;óðªÊkÿötÆää„B€8€ È èe¸-ˆ"^ôJÁ>T­Å"Š…+µþT´âXEŠâ€­b¯T-  ŠPTy @d8Ï´§õûã$G‚¢¿¶¿[ô|Ÿ'Oδ߽߽ßýÝë]ïZßEÛ½† é*aѺ ËíØ°«¡C‡¢i/½ômÚ´!‹qÅWàº.+W®`ÕªU<öØcضþlÚ´ilݺ]×Yºt)—\r Š¢0tèP¦NšzH‚®ëÜwß}ôë×€‹/¾€wß}7=­›}:[¶lÁï÷§I¡¹O\p3fÌH÷É0 ¦M›ÆE]ô}ª®®füøñ-ú4þ|^ýõû¼á†8tè^¯—%K–ðúë¯3þüýž:u*;vì ''‡… ‡¹ãŽ;€TdÆ-·ÜÒâ\Ïž=;züqmܸ‘3f´8®Y³f±zõjD„wÞy€Ñ£G“L&éÝ»7<ð@‹sÝ¿Üâ\/[¶ Ã0¨®®fܸq-ÎõÂ… yñÅ[ôûæ›ofïÞ½´nÝ:-Š~ñÅ£i#GŽä׿þu‹>Í;7ap|ŸÖ­[ÇÝwßÝ¢O3gÎdí򵧯§ž={òÐC}ëøÑ4 ü7ˆ Èš5ÿïgß$„þÂÜ…téÜŽ¬–iÑ*œ‹ªÃömÛT9.8˜—þü"……¼¿r%¡ò#¬¬¬¡C^;~9ñJ¾øb{{%O¼8ǵùòóM´?勤iâ8©êŽec;.ªªáó{¸ò²ëˆ˜&3ýýÛ¹TÕº„ZY²d€—P›t0ˆi®!ǣѯo"‘8~²™¸yâÌ ïSýøŠ Nnsü¿k®¹†—_~ùGuÎ+«“ÔÕGÈÍŽãñ©(¶‚×$™´ˆFëñ=¸NÊÊÖT×u‰ÇøÂ^”˜¯ÇÁ6\œ¸‹(‚ÇðL˜ ¸$âÙ¡\,Ó¡¶“ÀcI&c8ŠMV Dì(­[ŸÎ‘ªrª†È¥±á(PˆdÒ"ÌâpY…ÔÖÖ"¶E›vTGªqm›6áÖ©©ÆëÕ‡sPÕðßgñžÙµˆ OÛÆg€cÅ0tº&ì*ÞÍÈË.eÍ'1êÒËøëâ¿rÿ$ 3tï>¡lzôùw Ûµ%Ûà™G'ddqñ„18‰$ɤ…ŠŠcÛØMš ŠЮmÏÏ[F«¼6ôëÞ™‹;lØYËúµ£ªqK¸àâ+y莩<3ç)rü .îÆá:›¡÷?Ίïý­6ò“Á‰f%Ç‹ºû]óôøïìÉàð½z=D£œqz‘ÈQ²¼Ùˆ’ k@Ót¢õ(šŽßë#a%±,‹ ¦«OàÉ6H$-´¸5th׎ªªJ‚~?®kãõmÇ@qQ]¢&Ð4º.8¶‹‚ÃHsÅN b¡b`%ë0| V<"(˜¨Š‰×çÅ«‚c¨¨ªƒ¢Yh.(> Ÿ×Á£k8fÕwbâýÆp2¿îâ× ‚Y²>T4\úÓdÌ$–ˆòÖ›o«o`ä°a¼ñÖ ¯~•Óàž{žâü^½8\^mªøê*©,ÿ‚™“o%K󢸠¸.*‚â áìžúý|þþjs¸²’a?9gÿ´”5[FЯÈ)b÷'«yfúuT5ÚtkdìEÝXS¦ý€1üéîßpï/~ë…ý1V2ÍàÄ0M“††TUMÇ˲¸÷Þ{Ñ4-]-÷ŸÑ ÎàĈ6Fñ*‡#Äjë‰ÇTTÕã&¢µudgg£ˆ†iÇ0\ŸæÁ´@Ô,ÛDMÚ©rË9¥qS§1YG#LÀöS\|€+'ÝF‡€=Û‹¹}ú­¼õö'ìäìÙ³™>}zftgFŸ>}ÒÊiÇfΛ-gwß}wÚg;dÈ>úè£ÌÉû 9\UFgO‡ƒ ª#uxƒ~LÕÂÖ4êë±m]¢(†ÏïC³#ПEL¼ /¦/º…n¸ª€8ˆâ¢®â (:( i "*)!ZA!õ^Q@TUQšÄó\1ÀqìT[® Š ¦Þà:&š®b™6š*?ñšuxíplG%O‹Fñ^®ýÙeÜ9v$÷½þgž›únøÃξðRþøûÙ$Zuá`é&rs[BõáýÌŸ¿… 7NUc=CÏëÍö9ÿúù¯Öó:œ7o¯æ™0vôp}øAvíÛÇÐÖÐ1{Ë Û;âÐ\¤ú‰ÙRº'Þ{‹E_ì@;z5íN?±ØÆ­·ÞÊ”)S2£;ƒ´+aÛ¶méÕøf7ÉR”}>cÇŽåÙgŸÅ¶íL\ñ÷€œl…_ÿŸ5„ÏN(;À‘£*Y9ª($M—ºú8Ùˆ¸ ((€í˜¨J !â"MU S©à¬¤0¨kŒâ-›X±pu .^ÔDÓGOøA‘¦m[S×EQU4EÅv“¨ŠFRÓ Ø¶ïüŒ.gžÏëÃu]TMmJÃWpEÁ›çaÆÏiÝþÄýý§ª Ÿ ضm¦iÒ»wïïm™Åµ“ŸˆEá±ÇcíÚµøý~JJJØ»w/çwsæÌ¡¨¨ˆh4J0üÞçǸ¸&ÀÈqdÙ+× Œå­G³ýਢZ¸®Fnn.º®rêé§q`ÿ>TE£ººDZPu·‰x›(XÑ0“÷?¸ŒW_J_}°ñ½é9æLrÎH«¶ñ=8®‹ª( ©iµCǶPuÍpñyòˆ­öÐ÷¼¾,]ú.YYÙTGj((hM»v…ØŽM^nŽã°{×.Ö®[û÷Y¼?$Lž<ù;•Â289ÐlmŠ&LàÚk¯¥uëÖ”––RQQÁ„ >|8o¿ýv ÉÉcËlÛFUÕ1§o¼ñ;wî$‹‘ŸŸONN­ZµbРA²qãFŠŠŠÒ¤ë8N‹í…뺨ªÊÈ‘#¹ãŽ;ðûýD"öîÝËĉùíoËW\A¯^½NØÆŽª pð:A\ofÜ }‡¶Dª¯Â«ªD“Ï£F£lÚÔš‹jx-—¨j‘Ûúª++ñÄU’xm“zlU!Ëâø YY†àÇï1È jø|_U@ARŽ׃mi¨š‚eðx3i£«*Vƒ†ãØD£õTW5PY}ˆ¢¢"˜âPUq˜¤î¢}³þà‰7Cº?4Oñ7oÞÌK/½Ä§Ÿ~ŠaôìÙ“={ö`š&Ï?ÿ<Žã´Üo~ýõ׋ÅصkW:’¡ù7jSˆR2™¤{÷îìÞ½;ý½aÜvÛmôèуO?ý”P(D$aÊ”)Üyç$“IÇÁëõ¢ª*Û·oçÍ7ßäã?& ‘ŸŸO"‘ ™L2~üxºvíš¹˜ß4ýn²|QRKnàúBD*+Pœ§‰I’‚öÔÔ©8õ èÞy­)--Fq ˆD4ÄÖ)ìMy¹ >¢ ©*ñDGpõ, FNÎXIUÓ×AQUt†c9¸6¨ºŠ¸*Šn#q UõQüj9Žã’—× ÛÔ©©?D~¨-÷(9ÁZƒN«Ü\öÚûã&Þ ~Xp]—=z "ôë×/m5¢i;wîdõêÕŒ=¿ßÏÌ™3yê©§8p ›7o& ¥CÃŽÍdƒ–!cÇþ·mŸÏGII —^z)õõõŒ5Š{E‹QUUŬY³èÚµ+6làºë®`À€év:tè.øù}É]þÜ JÓ Ë² 󉯓œqI_+?{E©=h‘4Lt' ÛNRY_ŨÇÎáË%û8º&Žx R×€-ItWK3º™41M‹¤[ Ð ÍïÃuL‚!?ñXÏ Š‹îÕP5-µèŠ‹¦zH*I´DV,ž3š†×ïö`Y)†¢@¶C]u‚ŠH%ŠH†x3øáàØxÛc§êͯúÓ¯T™;vìH^^EEE8p€P(„ªªÄãñ´uÚL®Ç‹¼·°Ä%ã¿~ýz?þ8áp!//Çœüü|–/_žÞþØc=QÛ| Šª }x£uìZªaq”6m ¨Eç÷r~îŠÄ‰š>ÞžV‚?¤¢è&‚†fèMÑ*’ft¨¬ŽP| ƒ<¶-¨aÇËX1t˲ñú<ض‹ÏëÁ´lÄqpm-;‰Õ`à7å :›7|‰ªdPƒlÞøü¸>H&R‚û=»uÏo?²·É¢¬¯¯'77Ã0¨¨¨ 3zôh‰DÚ×»råJâñ8Á`˲ðù|ìØ±£…%|,)†eYéÏýnóæÍbýg\ ͳ tÝ æh9ž Pñ*ê«jÈËón@aI$ÁUKºãZðá3G)_i¢ø5¬¤…ª(†¢¸i'†Çë¥>%Ç£·4ÝëÅuMOY¹šª"ª‚ª«`hH"Ž¢ûÐô(ªƉÅPðxu1@Kà•”´©|Ùˆ+èß‘°•!Þ ~°Ä›L&Sñçñ8C‡eß¾}D£QÞyçz÷îMyy9óæÍcÒ¤Iüâ¿ sçÎüîwMƒ5 Çq¾‘HUU¥¦¦†É“'óì³Ï¦-憆†ÌÉÿ'Ü Ç\ñÑ´8½m{DйîÕ^ìÿ4‡Vâµ¼¼öÅ4**^Û"ahtjÓK©¯k@QÄnz(*‚mÛäå·ÆŽ%©Eéñ³gÎEqSñ¸©kè".¨š†‚ข(*ºfc'<èZ€#×R_×@Þ ~àhú&ë´Ù "躎ªªiWC$I“r³hý±:¼Í‘Š¢——ÇöíÛÓ™nÍÒ†·Ür ÷Þ{/ñxükelš·m1;çž{.çž{næ6™¼3‡{ÿÅc G 7ŽÞÈžÝc\×ÄMUS £Š‚ªض…‚‚ª*8®ƒ ºãºø¢GñÆJѳ ÐâÕ8â¢:`Mn]CU4ÅÁã1°-Ý£ƒi£ ⪪4¹R=‹-åÉÙÏ ä’ˆÕRtzG:w>ƒ¥ËÞÄïËÎêÖ…_þjj†x3øá¹šÃÀ>ùä¼^/ýúõÃ4ÍtØÙ7éá6[²ÍnÛ¶ÓþÞf+¹™xMÓLûUU¥¼¼œG}”Q£F‘H$ƒìÚµ‹éÓ§c~¿¿ÅÃ@UU¢Ñ(o¼ñãÆ#·øM-Ñ:(Ü3&H‡SN¥¶ªžD"NAakbqjëêi×:S5¨8ZJÛvíÐl›²Š Z·m¡ª.¯$¯MMw¨,¯¦UV+<Ù‡: ÆP|ä· O€ÕP(íÑÔÓ±1t×UÐCÍBÍU1 Põ†×ÄdáO,EGâ±8ªæ§¬ô;wíÁï ƒ+ 9ßYG5C¼œ´ˆD"LŸ>^x!-^“““Cmmª|T,Ãï÷sÉ%—PPPÀûï¿O0l±hvìëãËÒS`Mcß¾}¼÷Þ{qÿý÷ãõz)--eß¾}é0²X,F"‘ÀçóÑ­[7ž~úiÌW\Àˆ#Ò…<3h EùjqMÕT¼ºFƒë`Å\¬„ƒª¤4c,-ÎU÷÷býÂrìêºê¢ç¸tër¥»J +m1”Fô€ƒªúñx=ÔU'åæà);HÜÚö;Âé?‰›š‘¸nÊbF””ö‚"ˆë¦Ò}³ÐÈåýY=ô0=4“T–\Jë¡©M¯ ¶~¹þä#ÞùóçSRRBqq1‡óÏ?Ÿ.]ºpÚi§‘››‹ßïO[!ß6ý„T5Óºº:JKKÙ½{7ëÖ­£¶¶–3Ï<¯×ËwÞ™õ'åª0kÖ¬´ˆxsòC<géÒ¥<÷Üs¼ùæ›Äãqú÷ïÏ‘#GƒiBmNŽø¦v›ÉóX ‡‹.ºˆyóæ‘H$(++Ãq:tèÀþýû™4i³gÏÆu]|>EEE¼òÊ+ 8øªÜÌæÍ›¿Fø4ݯu‡mî;0òÏ<ùR8õòZìF?š¡1oðf¼>¦ÞÀ™W«|¹TEm„€?„×#xr-FÏñì š×‹LÒþô³Ð•ÂÖE4Tn¢:r˜hÂEШüB¨ÛšHQe“ûHÓ4\qñ^,ËDQTÇF×m,ÓÂësÉÊiÍ3&óðƒÄ£ë$ígwíŽëºì/.EUT’–CÏsÎdã—_œ<Ä;gÎ&NœÈý÷ßOÛ¶m9tèË–-£  €Ž;RXXH~~>¹¹¹„B! Ã@Ó´tæ‘ã8ضMCCµµµTWWsäÈ8@YY†aPXXˆã8\sÍ5<òÈ#L›6-3òOBŒ5Š¥K—rýõ×£ëzšÌFŒA^^¤±±‘™3grß}÷‘››Ë‘#GÐud2¥é‡Ñ4ÆÆFTUÅ0Œtªqsвa”——³eËÇaÈ!Ì™3Ã0ÒéÃÍdzöÙgsðàÁVs3wéÒ%sÑNU7PCéÆ ºœ‚‘_CÙ–(gömÏáu$¤×ß %á!r(ÇBÓ,âU´ üŸç(Õþ€¢¹x5°l‡HåÃôÄb±MEõà:Ц © ã+˲š\T š®#n“b™êAWu\CA7tTMDZ]›3Ýš­#iAºãÆcûöíiÿî±Ùo^x!kÖ¬I¿ÏàxŸ=ä·‰‘½öZ×fã:I …º=^ÇeÊôÿDDŶ’(K5.ü7Š%\ä4à÷V¢(^Ì·¦0îj ]Û5Qô­$,‡~}ÆòñêÃx$‹xßs‰%Òá”ahê9蚊¦é$’ 4MGl7% I*žØ%¡æáØI4o%•U‹èÞí\n¸QÅ4¾Ug#@ @×5,Ë¥°mÛoŸ±ý«©“=ýôÓ 6Œº†4„úÆ…mò©¨ª¦®®ž¶…m©«­Áë PWWKçNØ·¯˜ŽÎ äÀ~‚YÙhºA"ÅëmŒb&¢äååá fÓXS…¢{1<®ãðå—_¦S<38ùÈWUU† ªU«¾6…Ÿ3gÇO×ûî›?µý† èÝ»÷ßM­Zµ"‰|í8öìÙC}}=Ý»wO[Ó||m=á`µ±*”„Çc£¡q ø ÷þfÅW‰Å.àLPÛü@ `4ù^- xY¼ìl4ÕOmÝaWuÈÉÉÆ¶DÀchÔ×Õ¡(_ix ¡¬¶$ÍlSçßÝËî-hVAKíCÂ@mÓ1V D'ñ–––~÷…zò>†½‘,àŒV~&ß>ûgÏç’¡CiWÐê;·ÏËËcÅŠÜ~ûí™QÒZJÒŠ<6´,//êêêoÝÞ², à  €]»vQYYɶmÛÈËËcРA,^¼˜’’¦L™rÂ5…f¢½êª«xî¹ç‡Ã_Ó8þ83ø‘»VþÕ¨OŸ>Ì;Ç“–â;v‹ÛfÎ!7œÃ#>ÀMwÍÂRýÜwלӭóן0M‹q>ŸÂÂBÂá0«V­"gFÁIŒoŠßmÖÖ-))iZ±>±¿MÓ4Ö¯_ÏÑ£GY¾|9¦iÒ£Göïߢ(D£Q:wîœV9û¶Àk¯½ÆºuëÒ¥Ã=®LͶ Ž0õ’A?ض-""Éd²ÅûÁqœôï\××uÓŸ;Ž“þûiÇqœÛgðí蚇Hj: ""9C®úùD±¥gÏs¤gßRº{›¬Ù´Uñû²äñ»oWD®=\BùíDDäüóÏ—3ÚåËg»Kdüøñm¨’IS¦J~›¶""Ò÷œ®råØkå‰y ED¤²¼D>ô4XDDF^ýsQ ª­ë/€ÔÄ­ôq]3~œD@&M![×$ ÈecÆËôñ—‰¢éòùšÏäá'Ÿ–’]‹WÉõW]"WŒù0øR1£5rNÏòoÿþSÉodð¿†V ËÖö5ÕÎÉ’Öˆêk% ÊêåKdÌ/o–;§üR9; 1›ÈXÒn"H[ú^zƒRWS&m»^*§‡‘ÃUQ;f„\zù0¹ñÖ‡DDäù'fJ—³z‰’0mQu#Õ–ýU»¯­ZŸ&^@Þ\0§é;C~3ùgÒûœ~Mß»Èâ—^–ÃGË÷ß)€Œ£ôè`Èþ²¯Yñ):­³ ùþ1â]òÊólßKÞ|ñ÷’ßå\yæÈÓÿóFú ·®[-Š¢ÊÙ={IF¤:¥"T¼ãÓo‹ìHvv6c¯ý%︚³ºv¥{^s^ßþülÌ`*+RÛÔ8AÞzy.Ž(xqx}ÕFÚå‡i0M>øàjâTGª—ZËLjŸöå£¶ðÆ¢¿R©Åu-.%è÷³uóF{e1Š{wl`çÎ=(ÚÓ7Ø·K>[³ƒÅKÞàO>Nm4‰ÕXÃĉ7’p`ñâÅ,xñŠwíBQŽ”aîs¤ªì 7þêWlÞ±‡9wþ·Î¸ €ï.iâ5yÚŒt{õ ›Ãû÷2±i;€›'ÝÈg·²bù›,^¼„²’=¼ûî Ê«£üeÁ ¼üÚ"Þ[½†Gy”½»¶ðꢥ<ñð¬|5ˆÍßV¯å‘GR q[¶§]þüä ºd Ue(ŠBMõQ6oÝÊܧŸÁª¯æ­¿}È©mCÜö›2~ÑŒ7ƒ ¾øí{ªR3¨Ëþ"5ÓyòÉ'eÒÝ-€ì,¯NO?ùàc!ÐF™;wžòÖ3Êø&‰ˆÈÚÅ/Ë­÷Ï@>ÿüc¹õ·¿K·wË?ÚîO ÏÏ™)³Jýö¢¾g§gró~ÿß2aâMR²g«àk-#‡]˜ÞÿÍ—w—ƒÑÔëm›ÖI¯ FÈ€þýÅ6ãÈÕ—÷— {¢©ÙáŸR¾Æ†ªòtÛ/+OκSîxp¡²ï‹Í¢œ.?»ì'.8%3 ~@ø¿ìu˜ÅÖÆm£ënÉîÆÝ q%A wîîÜ/pq—àîB„»g³IÖÝÇgº»¾?fwÈF v}Ÿ'Ù™š–êîÓo:u¤Õ¬íhG;ÚñçÀÅÞyp§GTŒ0…Š¢ @œÍí¿;ûO˜pØïv¬sO9J|úÝòÝÚ¯˜q¦xã“oöéOÝq‹¸æÖ;÷ùœŠ¢D>_{Þ â˼UíCú^ðÁî±=ÒÓq?üàCájhïúån¿mܸùW÷ñ…ó5ì Œ O|ùÝœ½÷ãÅ—Ú…äŸæ½ÚxýžF¾Z¼¿»™’Ò2 CgÑ¢…<÷ð¬Y¼[q@I’Ðwúüõ’:|i©)\3ó©Hû³?DBr$Iâ¤#F3gÎ74Õ5îv¼ŽÝ I9éÉ4{Ã)úž¸ûRÂûn^õªÕ®2àõ!I/Íú‚ÖÜ'Ï=vÝû »[?2R“èÙ«gäãŽ:?ò9:£7ÇH§N]‘,Qd¥&ašaŸÍ­«íÖ/GF7$I¢Oï¼üá<,-)3»ö'59‰#G¶F=ýìÌošá…‡žpnøœVf_è_7ÔOŸ~\ؾýù×<úÈC‘{úíw?@ÀÅ\ˆO|õÅg¼ñÚK¸}~–¯^Íc?ÁŠEsX°x —_z ù;JÁC>ÂqÓC–¼>?¥Û6sÁùPë0t`/®ºq&wÝv3y‹—Eú²vå.½âj ˆTxô¡Xº0€ÏË÷sóx衘÷Ãw\rÙ•m®áþ™wðö{FŽWYXÀy3Îckq?|ûKåñÎaûð=wÞʇŸ~òrùÍwðÎûðá{ïàm®aÆùâ†p·ôc×c·ãŸùŒ¿ÔoA(:fe““KPÒÝwÝ̪mµ¬ø)-.k®¸ŒYï~ €Q³ŽºÂ ¾[¼†\DñÊoHŽ '–|wÂѼóÕÒ:å¶+§“·®˜9ÑTTT†ƶ¬æŽ¯£¤¦žùËÂ/\lb:ÇL;g\£ŸÁÈnQü÷¹×yäy\}ö‘‘K8ëÜˉ’uø#† E²ÅУg7šÌ+Ï>B­×BmÙv&}:ÿ¹å êý*c† ;ÑBfv.Ý;uà•gî£Ó€qáÅÒâ2îxäq¶mßAcm5ÉÑ6Ž›r89z1nX_J]:£†¥º1ÊÙð0V.]DEUW]}[VÎcE~5ÓM}M-“Ç¢rÓbžå} w²uý*;åš–smáÎÇžæó/¿Š\SÁŽBd3H·ì4Þzö~šƒ‚“?0©oô3}êdÙNc“‹ùï?ÇÊ Û¸îÑwpƦ°eãz*ê\\yÕ•{øØ‹|õî Xè;j$':œ×Þþ€ã§MaâĉTÔ{qù|¼óòS<ùøcLœ6ƒCÆœ’ÊœoˆT„M¶¹xâÙœ7u$=ÇŸLzzZä·÷?þ„!CæÐQËßÌfʤ‰˜’•=;ÑwèX®½êB¼ÅyÔš‰$'ÆðõןRY×ÈYgÏ >9Gr.×_{5w?ò4eeå‘sLœx N,XÂĉILëH·Î˜yç}Tm^€¦ÊøôŸ«Øú¼.ÊK+IψâÈI?|0÷ÿçeAÛÏ;™i'œÁ…œG¬p³`ÑJÎ8ýìȾ|ð!#†bØàÿjáKMÅí pþe×a ·qþ·òÁ—ó9|ê‘44ÔPâ…IãÃòsډdz}G!cÆM&»CÓ@(ěȸÉGйGð9’âyîñ[¸ñš«Y¿z C>˜”¸p‰žÜœlr:¤sïãÿ û ±ÌzñQêCV”–«š '+ƒ³Î»€=²)oñŒiô¸?r o¿þr$ëè “ˆK 'GÙºu3“ÆŽà…‡obCQØF׃ÔmÍçé÷¾gpŸ.¬þázwïL¯ݘ~þ•{=v;þYZVd÷F´ô FŒ=ŒÞóosÁÇvKÖn¦²¼tŸ¯3;;‡CGñÉGïµKÌ?Eksð4QÑè%-ö«‘í Áíã@_¿vü½×œxÛÑŽv´£D¼rû=hG;ÚÑŽ?í5×Úñ‡À4pÝ*Â^ BiÿÄM`‚@ '¥þG@´ü×â%SV^Á7«6“Ó£;Ö¯ãˆaýÉHMßCa"K iÏköÏšBì9·¨i$ËžO¶×´x;§íkWÂÿü"LæÎý‘ñã'î"æ/ÖÊk‹ ER_GˆëoÌB¦Ð‘%•ûÞþœ5Á²2³pj†®cqØõ®z20™–¥Ñ«ït!PÛSJþ£L ûM¼¢5KÿêÜÿèK(¡zâÓ²1BAÆŽʼn'¼Ë!Ã~¬fë ßBÀÒNÇÜyÛ¶çiÇß’^€¶9”5FŒÇ1ÇÍСC#… w&äÈÐ)2iâ3L’Š.çþwVv%`Âý2x@/LÝDRTT‹I@Øp7Öl®Ãƒ%6žäô4m\ÀýG‡³E%‘ÿþ£O;\ûmj$ ašXl*]{dpò‘Çã ètÊíÆs/¼‚ÂÐ2µlEkAÀ½s'á4 $YÙé¶ Ûßx³;v&*!“†úzš\V¯\ÆO?-h“PÜbÑøÐßúŽ€‚ÁØû¿a@¯Nü!„ÅAhûrî>~<Ñq¹;íàgí¶2^4£¸q}‡ë›?bh˱$”v!û7š {÷¾Œ>üxΛ>‘ lSç“çòÈ#7íqû¢â¬\¾ $:6SØ ýèºÕjb±X©ª®aÄA½X±bŠ¢ i5ÕõôíןáÃGí¤‡$­å³$)´¤RnaqÑBÕz¸`QävÆŸ.\’DRrÍ!¢b,8qX,õu 8í2’°b¢ãvûÑõ>ïÏezb¢b=jú€Žóí;4uíÅïæí6óú;áê?&—ž (^!3#GgÄ »(;דY¼zK?¸—¸Í 0~ºžu7£Ž;¿]ÀþMo+zöîƒ!;™ùÀ#`q 6gö^̘À7œKfÇlÁЬS]Un‘‚‚úº:ææ-£C‡,RSR †¼tî ;Wn‘$¨©nÄ>¬v…¸˜$ ‹7“h-Ud5ME× üA/éi9íú/‚»®U‹ÁÕ܈§¦Å¢€øA˜2 Ànu +Iɩآ£º¼ ãÇòã 70kÎæÝº<®­%pÅ5çqϽ÷ýÍ& ÕN$é:²d X]Çð#vDZ’Ö¿aeáà½1îœE·!ÃÑl6¾yíh'Þ¿5˜x»vÎfÕöL5?H}] ®e¯¦I’ð¥U5øýÕBLl:VÀ”A‡$P•å+Và÷73hÐP¬[›ãmØ<—¹?~Ie™I\tÙ¹I Ú‹` Ķ‚"rs² CجV4‹«KBb|ûÓþ“Ñ£ï¶m.b@ÿAT×W댢º¶¿?Dc] Ž( «iE7ý„B:ž€‰­Á‡_˜`zÑzY ~¬JÆ! ÜPÍSõ&«V¯ùÛi»·<ÿ9‰±1M$AEÁFŽºú8aÇ_5Uà ~L‹Òn}û·ï”#cö-OP°C#à)Ç¢˜t£erD›©“‚ü‚|b‰·†S²a˜`VéA«! ÜeµH¦ÄŽâMdfv ¹9†`Ó†ÍôìÕ÷gI*›×;P5°­ þ ª¢‘œ”H  R’“)*)C7BíOúÏUï™ÍëVcµJ,[ö»JQȆժ!!awHD;“1m¬$À‹*)„܆s«ßz›!év$Ó ãÀ8º|RRTZ¿–³È‚µS´–ú&œL§5¡ÿ®f•_ ãRÑC ’²ÅÆ™ƒ3[\í~;%`ÃzÄb "q )™Êõ·ã/ ÞËeï$ŠŒ7Ž>ýçDPHØlFÀNiEÓâ[¤éçŒ^²$Qða $$„0Ãf„€ IVi2CX LËã&Ê™@ÈåÁÝÐØ†Èëj›X½jþ Äíÿ÷0·|Nïî=©¨.Ã0$¬¦‰ÓéÀçóaÑ4ìvGû“þ `µÚHLÍÁïóÑØìÆÝDÑ4B@M]B !‡l êB8t™¨ž½è2ô ¶¼ð"q]e˜D§hX´ýcãP5KËDüϱÛûý~ü~K‚§²,cF„Œu]'>>UÝóëôý·\_Lj|’,!Y¬øV•R7°'‰Ñ1¿ª½ à¢í?/ÅhÛkxøÓo¹vêaíBöO%^Y–ÉËË£K—.466aš!LS )©ñvÞ{ûElN+AŸŒ)‡¸äÂ3(ܺáÇ£iZä8Á`¸h'õÍ~|!Š©†GEA²Z1õ°Ó½Çp“ššŠ/à'>ÚIjjj›> ì7€—_¿•îÝû°iS)ÝzŒ&!&¿·Žº&üÄÄÄ„Ï/IX,íq"„Os#𦒑Z`â÷IŠv"Щ¨¬Ä°Ô—N(`RÝPÎÙ×_Êšo¾¥w”ødMÔ°[ü•Á×uM»ØBÃZé—_~ɘ1cp:/!%%%äçç3qâÄ2Qèºñ?ŽÅãñ ªjäXŠ¢ì•tÿ/GâÊKF0 ÛÜÉoRB85–Ç‹­>¿¤ñ:%óʦl WJtl» ý‰7 ñüó/‘““͘ñ#P‰˜h;ŸÉÅçLåü3§`è&š&QVVʆ5spFÙÙ˜_Ï¢ù%œ|ò)ÄÆ%âv¹yàÉgA±…38é»ÓAyE).ÃN”f'+UFw»pĦàМh+šiP¿uÇNo³Žª8ñ4k,[¼‰ƒ†à 4#K*¹Ö>d…BÈŠxYµb5••.ÆM8r?÷ÛñÛ µ ¶~$­<> 9(ÂQhò«,(šŽ0¢@PWV…ƒ÷ÞMYÑvJœM†M&Ù)ãwëR“­JBÄ´ ¤»š8:ê¨H”\Ø.vcÌÎÎFaȲŒiš(ŠB `Ö¬YÄÅÅM]]ÙÙÙøý~ÊÊÊ8õÔS1M“`0H||<%%%dff Y¶lñññpÒI'±mÛ6:uê´±í>Àh{‡‚:݇t¤¶¾–䄤ýÒ˜šèæåœzp;ñþ#‰WÓ4ºvíÂðáè®,§OŸÞôë;ˆ„x;’ˆŽ³yûÝ·¨®©%&6š††z ¦ŽÍ^ó¸=¤&ÆÒän¢nG5ñ4—{Ðéߥ;~‡+7c’eA­¡RY^jš(–V›šÌª•K))Ý‚¢ú±Û¬Z½»-–„øTÖ­ßDR’“(g"§BçΙôîÝ‘¯¾œË„‰cµÚÚƒ2þDâMJJ':&—ÛEÓ0B°y@6±cÐØP‰Í® ÄÓgʆŒŦ ëHKˆÃð`M°“`Q 5›È‰¨x ¡m.fĵ1=µš³ÆŒæM›èÙ³'²,óÚk¯áp8"š©‚7ÞxƒÜÜ\¢££9óÌ3‘e™çŸžóÏ?Ÿë¯¿žÍ›7óÙgŸ¡ëzDk–e™œœ„8&Mš!yI’(,,Ü£lùMˆ]VЄ†i"Ë*±Ÿ!Ñ“‡Ä´7¿çÔƒ{¶‹Û?‘xu=ÈÕW_Íá‡ÊEÌÀ4$¢cãHLÍDSbãc蜛Mqq ¡PÓ„¤„\*Ë‚dev¢²ª‚ìì.TTV’–šLvÇx,šL0(ˆuğ–­ÉÌÌä aóã÷_’ž•AtTR¦LsU5}ö‹ô'::†çŸEF‡4ŠKJÐd%%|ÿýWÔÕGoc˦²s3©*«EQMÒ2² CØlöö'þ'¢¶¶‚ºÚZš"£Ø£ÑC!tÃ$Úž€dÚ, 7}1‹ ç³1o%A½ÍKV’ã°£âǪEaT‘R,XãU,Ž ±%-3 ‚ÂÓƒÁ óæÍÃjµ$ UUñz½?S–$ѽ{wÆŒC(Â0 ÊËË#Û<øàƒw\¸Â„ªª477£i}ôãÇÀÒR»u5vìX²²²þtßâÔh;Þ†ñí;7üêÜ[U-8¶°mËçG– B¾F”P3ÍÕ¬]Ká– ˜!HNv" ?^o—§Ž„ø*Ë+éÓ§'†¡SXXJaaå•5uÛï§_Ÿƒ„•Úš&ú JBB:6›‹faÐÁ#hp5³yóº­E¢¤¬Ù?Ìc[A![¶nfÛŽr„dÃåñãn6IMMÁÝÜLrZ,={wãÜsÎ$&&¦ýiÿâeÁ†‚Š"[0½A,B`‘ö`ÁP'\qóž}™²O~@/ÝHFrþÂbl*DYìV ³ÉÀô˜8âU$Õ iÙª«SÛØŸêêjv{x€]³f §žzj›mš››>|8IIIòü%² …BÄÆÆ ™3g·Ýv[»ò×_ÕjEQ”ý$Ýßž5]7YT\Ù.fÿ×4²ÜVˆn¼ñ&õõÕ¬\5˃)dbcc†tV¯* dêtîÜ›`ÐKEyvMÅj³ÑØÐDÁ¶md¥e€$°ÚlÔÕÖ°~ÍFÍ«¯½À!'âñù©-ÛNRbù[·¢Z4|MM446‘Ù¡Cxêæ ’‹Ýå"-=â¢TE á£_ß®oA7Y8ìNšš›HKÏŠ¼(’$±råJ Ôþôÿ0„M6ké;£Z¼ÍMDE¥ô7£{]”T2qÊa,ýðm,>I5iôøÐŠ*ÈH°`•1šÃ.afÀD¶ÈØ2SìlY:®CÇ´9«Ûí&11‘5kÖpòÉ'#I³fÍj³Í7ß|Cuu5çŸ>ß}÷“&Mjã.¶³ÙÂ0Œˆv›——GSSwß}73gÎŒhć~8C† áÒK/å©§žÚÝT'ƒ)µ:ëîD¶BA(ò&Bï“™šÀ‹ÿÀÄþíæ†ñʲÄêÕkÈÍÍÅÐö¨­[ éÙ³3´âqª*467PUUˆÝn§[×^l_Á—_|Å”£'-5+W`š²;0,p0ª"#!ãñz±GË$§Ç4Ýœxâ‰¨Š‚®‡èÖ­+•••ôM"!>ŽÊòJÒc“éÜ9,\.W3o¼ö6NG U••$¥$ÐÜØ@}ŸßO‡¬Þ”””STØDN¶ ·»‰ï¾ÿÓ4åðÊñàÁƒÛ3ÿÿ ðš©Ú±Õ¢ðëT˜[13o¾–þ#&PY·…¯g>‰ìi$ I 7‰ùŸ|Àä8lr»CÇ"[!0P­Î ¿ÝÂgÜõŽ ¨[·n¥GdggóÎ;ïìñøá‡¼óÎ;I!š¦¡(J$QO«‡‚‚7ß|›ÍÆ“O>ISSo¾ùsµÓoŸœœ±Û`èQNBþÒÎÄ+«”.,¦sL,ûÞ¾´ªŽ£Æ¶ Ú?ÉÆ»(o%ë×nÁ У{7âãcøøÃ©¬ª 3+³eA ¼( i’¼IRpDÇðîûŸ’žžNZz'Ö®YKjJ6»ûîžÉú ë)--çÔãOCVd<Šå5e Û¸è‚S¢s§®l)ØÌà¡ÃY¹jåÏSE·›5k×Q\THÿþýyýÍ×™4iÉ© ¼ñæë=eUUU,X°€n=:qÈÄ#p5¸Ñ2Ь¢i–ö§þg$Gt µ 5d÷ëÍÉW^@î°~ìX›OEc†OfêUWñÍK/â++aËæMtŠ‹Â¡û±© 6›UI ] Xe(u‚{Îì6t%„à¾ûîcþüù<ôÐC¼õV¸ˆæ–‚ÒÒ3xõµ×è˜M\|B¸¶a’˜È¦Í›ùàÙ7o—_~9†äoÝÊ˯¼BtL õ<÷ì³L;î8âbc9ìˆ#;~<=ô‰ÉI|ñå—<÷Üó|þÙ§{¼w >¸á„l`ú,÷X°+*˜~~<ì#~„ì8 ´m ²côvAûb¯Iržþïˤ¦$³mÇ$ FŽJ ä!!.ŽøøDŒ»Ó†ßïÇëõâè464âr¹ … )1‰ºú:âãcIHH!%9‰+/¿CЬ˯%5- I’h¬¯£_ß”•WpÆY—››KCCq 1Øí1x<&M:Œ%Kó°Y¬X,*zHg¹ zФº¶«Õ‚¡膎ßç§¼²„úú:=t*qñi<÷Ü3<úØm\ŽÚñŽêš.ƒpé`Ê:õÍŒf/¦/@(Ô„p ü.?vGˆ¢õ…¬~ëmzÄËÄ[$:‚ôI—è××Ifr‚Ý­S½ÆÅÚå^‚åAŽþq‰¹=‘ÑAR#ÜeC(gy”Ž©©XcH¦ aqX¨ªªBÓ’ÒijnÂáp (*µ5µÈ²L\\²,a p»]DG9ihh@×C$§$‡ý“›<ÈŠ„ªjøB:têÌàÃÙ=§ž‰´ÓRÊqw¼‰œ”…$$¶nßÊêÿÌ8 û{þìr¬¿ãÉËÏj¶¿öž$G3e#„Š®ëè&ž|ò5>þä[† ‹Û墺ªŠ¾}{2mÚ1ôéÛ‡ææm””lÇ4}ûugùòE8£¢1L‰Ì¬ >ÿô *Ê«>v$v«ÓЉKêÂ;~˜‘Oee5Y™4º•ĤDªª*0M‰'þó_r³;¡©¦)HLMÂt1nÔ0d•dd¤â÷ÈìAm]1ÑNÞûà Û"þÔQÁ%÷ÝIc(€ð0u?f(ˆ¡†ÀD ÉM~…_|L¿«¦b!Dl”ŠfÈòÏ–QU“°ZeœÑ ºMðåröã/`"#&´ØL¿üòKŽž6•‹®¹šùëèÕ­ï/ö³¸hÕ5ÕŒŸrù[7Ó­kÊJ‹ÉÌêHÁ¶|úDE㌶ãtĵÒ;B˜lÙ²…=ú´¼3»[ ¤6ÙÆÞq]/ƒ~ÓÂB¯ž}íÃüøðµ¿è!¸ý>œšM@7™EÏÇ—´ Ú?ÉÔ€,øá‡Ù¨šJff&ŠbCÁEמ‡Óo@wìŽhfÏþ‘¨¸8œ±ë6.!ÚšH¿Þ=ñû½l\³‘„è4,’PPÇåò YzõÍå‡ÙséÒ%P)(( §C ¥%;pû¼¤Æ:š>¢ Ý <3ÙÙ=Y¶èJ—RìZ²†¦YB¬øi-g­+çÝwßaà€’’’B”CÂf±³aã*b¢bñ¹Û}xÿL(×O>žo¿–žã¨ ô 0Š*aý7?Ò1ÄiQ±K&NM"J âp:f˜Lab±J8m&he¯¾¿€‰„²S’}‡ÓɃ·ÝJmCÝûôççÞ Ú†É–íÛéÒ¥3õõõh #GaÅòeœpâ‰{ûÇoiI #GŽ k> ‰è¡’,a³Jø]U,ZPªY©®(§G—46 R“²±j¡›ôÌL„iR^VL0äE…Ý¡âpZ5ƒ)†SRV‚×ÛÄÝqÄ:(*¯ÂfSPTˆŠR1‰!Vr²µ¼˜¨XݰrðÁ§È7ŸƲU«¹è I±L]‹Üœ4£©©¶³zåfÆO8˜„øš]MÄÅÇsò)'¶?ñ?o#V§Êû·ÝKR× ®yæIJÊ‹P  |¦BEþê—­¢ST»*aUd¢œQ«CEµ(EB2$„ b¢ Ú)SoQè•leóÒÙtr‚8dò$™. ¦®šë®¹¡C\bæZâÒRÑ}AüTïàèãNç{ïbÖWàò6c±ZHJJ¤¨xåÅUª=|õÉ{DÇ'a·[q5»°X¬ÈŠ‚aè,Y¶žÂå<÷Âí6Þ?K¸$ Yr¢(V«FÀäѯޢ¨¶kH£¼´˜ÙÿyŒÞš‡M'™§LjœIF¢FJšB§T¨@¢J´Ö‹ YÌ€ÌN(«…+%…Ë¿Y‰BkÉ Ÿ§ì­ÏyçïBLÓÜk~…½Mõ%É„#1o¿çî¼åšßt>™ý#÷/ð‘™`CV@V5TÍÆ–í[9²_òì8${T,KwÔSòé\×¥ œmÏfÕxåû\÷cy»°ýSl¼ãÆŽ¦´¬»ÍJ  ׿ 4WÈä/ /pé~dYÂfµÒ¥C.…E[‘c¢±Ûdv^˜ød‚!W³‡úFo¿7‹ú†z45œ@G2Àn—ÙQVŒSõ#‰h¼AâÕkÈJKÃb šü~$apÔ1GòÙŸ2vä‘(•â¢bN8ïÊÊK)ض‘=»á´GQÝèEµ%g„Bnšƒ!4M£¡¡¦ý‘ÿ‰p8ÄÄ$"„‰ßëÇê°qÙaSqÈDΞCrL,£6¬šM‚«NŠÓJœS'íTÐ4¿¶U¤0áêO°+õ‡÷á»­‚™ÃbÑ—–¶ÚÆÚþž>·~—$i¿óvHèÂÆýO¼H·žÝ0r2—Þø8QNÁý·]u@÷gê!ãÚ£ˆ#ž\L·0õ ºðѵC[›e¶m¨;’ìAN2SÒP½EØ­$IBÁ€Ø„vAûbÒ8ô°C6l(Ï<ó4‰ ‰á=…¦¦L3@(BIج±¤¦d0gÞwÄÅ'á°§—„?ÀÄdéÒå(’Š?Àf³ ª*¯×‡ÏçC±(,˜³wΗŸéo¢©º„‚«‰uZIKKâ›og hh¨dγ¹îš+¹ïÿn㉇`ʤñœ>ýXškêùæëo©¬*¤º|3³¿~‹ ›V㌉å©ÿ>‡ qãM7¶?ñ?^¯—ÚºbjkKirÕbxØ'ËZJ”Mm0HÝN”"çtJVIЇ¬t±±%bRêïÄ„«çasš„ÑÌ(@pÛâ&¤ŒxV~ú&²ùÇÏ`$ÃωÇ‹*A¬C猓Žàȉc †Bh$ZZVV?p"ÙSX݈$[0ÍðBœÐƒ˜/f „ú)>øVÎÐÎâǤãù>þ8~Ê8ë>Yÿ·“‹Ù_J¿¾}ùôÛ¹4–äs͵×pÅWpî©'rêYaO¹ß~IVV6›vì›V_RѰßý¹êʶçÒ÷ºmiþÞúä«ý>GUY!?ñò¯›Þzótݤ®¾–üü ÃKcC=Ng4åUCáU]]×1tƒŠòâ㓈‰N¦CN:nO3ÄM7ßÀ3ÿ}‘Ù³¿¦®®žwß}—…;HMIE‘dŠË ILÉ"Ñ–ˆ²$SVQÎÝ÷ÎÄô4óòÛo‘–2 ìߟ‘£Æ2oÞœþù”•–2rÔ¼>?§“†ºF„".6ƒ¼¼Å`Ñxé…WY¶|9Ù9ÛM ¢©ÁéˆÇj '‚ÑT —ˇ"I(ª SáöÖsÿ¸¢¤FR“,$%*D;Tœ6›SžCêisÐ,V ]G–àÐÃå‹/¾Œø ×5™·Öðg”dè3úT.<ûhÞxwcGöæ¤ÓOÁl¢w·ì6.mŠÏ­áé¯VQ/ÇàˆŽE–4ÍÀ[SÅY#:rÎaƒ©‚ü÷\(vÕì &¥B^yåUŽ߇”܃ØT\EÏŽ©Tm_ÆAÇ\ÎùÓ&qÝÿÝŽUUøqÞŠ‹vpÆé§pÿÌÿã™WߦhÛV¦;ß~™Ë®½›§ŸzˆA#aÑÇÒiàhøï«l_ú5«7oçþGŸáñÇcíŠe,˜ÿ#“&ŽÇ¯K,˜7§ H’D§.ÝØ¶e1sú󸳝rìèÓ³;Çœpç9ŒÛÞǸN1<ýÊ;Ì|ð1Ÿ0aê :”ôŽùä£÷¹èÊëX³b) ÌãêKf°pU>†’̲Â/•wÿꫯIJNÆ4Lšš[¢¾Â©ÃÙš$EEUU5õ£i²$¡jzHÇçó‘ššJ\\ H’ *: Ws3V«ÝБe¿×¢Èx}^bcâƒø|>âbcQ5ââbĦM›HOO§±¡¥ÅvÒu|>?’¡ŽÒâéóz1„‰idIÂæp 9dâ!L:•yóæí•|E¡_¿~üøãíìù`±hhRÁ Þ2µ ‚*¡ëM“0MÅ´pùdgôq`ÉQeUÑQ5HÏJEš’‡ÅCÐÓ9î™gžÉ«¯¾ €/hb·È4ÕW›ö‡^ ¢X,ÔúB4¸¼d§Äòù7óé’@ïîq8-mêÿæ¯_ÅS/¼FÃ0ë 8îìkp®¡F‰ãÙfòú¬·¸pƹ<úÌ 84™†ªþïÞ‡¹üòkèÚ¹ã?R&Öþð £Î½ÿïtN<÷:tWL bÛšš›ùüã÷¹áê+òÜpÎQ<úØã¼òÆ;mÈñþ;náÆ»þÃã7ŸÅ•w?…‚$‡D­7lß¿ÿ‘G¸ñšk¸ì’39x‰=ª1©¸ñ’}ÜMm˜Í+¯½Î±3îঠ‰{ˆ¾Ì^¸e§Ìs‡ugö¢ÍH’ÄòÙßóê’õlüòmVl,àËÙó98ìNxÝÕWñÎÛo°ð§%tìÒ•'ÿï|Fžp#ƒúä"„`Àˆi¬^øñ/Ûx{õêÕj Û’Z=K’k¸†%TUEQÜnw$Ç©iš$&&F.Æb±`m)ïŽá·"IjøwIBе·ø@&"Ë ¦i´háîõìÕ MÕÈÎÎ!𓘂’QK¨ª‚×ëÁf·b>Ÿ—¨èx4U¥¾¾B0/j|òɯ ÈСCÛ™ó7"Ò Q¦ªu‡- Ÿ?Dl¼ YÖÐ}Šiç¥9UÜóx6Í"\‚¨@n'ç1lø8ΛqÇ{"qqq‘c·æW¶[A1 ‰¼]N•¹ø²Û‰IO"9>»à˜©G’™”ˆnøØ5™ù¨£Ï¦zûj Ó`þ'Ñ!5 =dP¿¡†ÊK(.ØŒC K i]ÂOŒ"Ñlžâaª|*ÿwãU¼ðòktï˜ÆG_}ÏÇF(º ¾~Ÿk®¿…›n¾‰ûþ&Å?ûMœJ h'ž{h‚žZ*¶mÀW³{r.6Ùä´3Ïà¿ÜI¬5|OÓ»ônsœ×Þù€>ý’éSÆòñ¬É8ιÙHRל=…×^xþMbí¢yŒ˜8€®:åU4TsñeW‘ç ÉÓØæ¸ñQ1(’Ä£·_Îd7`o¼üX Ï(tÊŒA×ó.eâÄ ÜýÀc|ýÞKÌûbO¿òÞÆ:¡ ¨ª®Bh¶È`‘ÛkâÏ'¿LÓB¡ëzä»išÂ0ŒÈßðïA!„!„0„®·¶…„0„0t!LSÓ0[þ ašº0 ½eû 0M]a¶œÕhùéE›?{Þfß1tèPÑŽßI’DjJ‘˜"RE”#^Xˆ*ÑBQ!I’h±ˆz×x!Œ‰B÷îí½Eɦ'ÿç®ÇÜK» í±ýôë®úJqÎ9ŠžyT!ÄÙ]&òV—‰±ƒr„B:êg9KÍ&„âøC aºÅº’ Bˆ1ÆD¶9yÚ‘B!î~þqÚI'‹ÁÝRÅ›o¼.R²:· ÜßÍügi%Þýé¿íÄûÛ&U«PT‡9B²©©⤓NŸ}öÙNìõ®ÐÍÁÂã,|þ·E 2pþïÈF«B±³²±sÛž®_!¢;¯>p»BˆÉåˆ*—‡êþÍáÜmûð߸tæ³â÷>ÉIñ¢¡®ZX㻈ӧ"„¢¬) FôÌB±tÕúvk'Þ¿?Ú‰÷÷!Þ˜˜qå•Wˆyóæíu¦d¦¢QÔ¹ÎBl¦.D¨ áþvò?~„ø—,Yò§ÝƒÖë.))un!„¾@xX™7wî¶ÿ¹­©¦,ò¹¾9 ªËK„BTÖÔ·™É-[¶¬]ØÚ‰·xÛñ[úÍGxñÅÅÈ‘# zôè!~úé§Èoßÿ½HJJ’$‰cŽ9F¬_ß®-þ/aé·Ÿˆ‘“ŽüÅmã“„h.݇".=åP‘Óo˜ˆ‹ûÍŠÂO¿%nºãž½n³ø‡OÅ˯$î»å*ñÖçß0ñ¶—ßý±nÝ:V®\É[o½ÅÂ… ñx<‘ß4MÃjµ¶‰¦-V¢%ÚjOÿZsÈî¼Ý_ê.Ë(Š‚,ËmþíÚÖº`«iÚ^ÿ¶~nýÞš3·¹¹™ºº:ÊËË©©©issss™1c_|1çž{îûxÈ!‡´ÙoþüùrÈ!,X°€`0@‡1b#FŒ ;;›ØØXœN'š¦a³Ùözm­Ÿ[+R´ö»õßþDËýÓñÁ páO’ÅG/?IŸ¨ÙºŽš†N?r<ù5n–®ßƈ® ,\» €›Î<žº†Z®®$-9š§f}LV~465â÷¹±;Â5+š<¤Å8¸õÊóùbÁ:Ö¬\ÌÚ¹Òo\¸´SEe)éiá" þpzMs#΄¤HàÍàCN‚ó±¥d³±´‘Æ’MàÓ7ŸÆ‘žÙîã9 ™6aDØ7»ÿdlÛ¾#ûàIô:–ÿÜ{Ën×Þ. n¼ñFxà.ºè"N=õTŽ;î8Î<óÌö›ó?„1cÆ0{öì=þfš&ÕÕÕ455áv» 455aš&¦ibFäóÎß[ÿ¶zùý~B¡Á``0ù¼§¿­ÿLÓÄï÷£ëz8`©åoë¿=µ·–¢ßS_výü{Ò‹…èèhú÷ïϤI“˜6mÝ»wÿÅ}¦Ÿw ?­ÞÁžþ/ϼö:‹6U£¹‹X¿fºôàÍw^æ®ûäè©–.š‡wUEâÞWßã¾×TF L¥¸²‘a]ãY´i ’$ñãßqíÝÏsÓŒ£ðºÝã ®¾–#ŽžÂš•‹‰JLf䤩Ķ3ëåw±'esï¥Gñö¬¯Ã„h±’d(>‹—®äŠ‹6qò™çré…3xé±ëIë},K¿~™1F¶S¢»F>KR4U¥\pî¹} ‡¸æškÚlSR°N 2H\}íÍB!?F\xéÂl(·Üuh®Þ.zõì!n¼ýAñØwˆº&CœsÎ9B!N>éD±f]¸qæCâ®.BˆÈo§œp¬˜vÂ)‘ó|ùéÇbà ÁâœsÎ ¾ýHdee‰ãŽ?I£IDÇ%ˆ#§Lì¿iÉ|ñÎG_ˆY/=#úôé#JëÜâž;nã'.Î9çl®ãÆŽ[Ö.‹Öå‹Y¯>/úÔæüçœ{•x㹇DŸ¾ýÄOË×·Ûx÷ãÆk¿ íhÇïŒÛo¿]⡇úKοyÍñÜK¯!„pÕ•‹{|ä—w0„B"dS˜" B]„‚Í" ˆVOB³eØÜ·…àæ½F®ýÛC]Î9ç^zé¥öÒŽvüÎ(--å³Ï>ãâ‹/þŸîg…a`WTÞ}õ}*=õL™:…N™„t/šbÿ9S‡Ôšüþáj'Þ=àØcåã?>`˜h 5 ƒ¬]»–P(Äðá說¢¬¬ŒP(ÄÁ ÀÆñûý(ŠBÿþýXºt)ªª’˜˜Hvv6‹-Âb±Ð³gOK–,A’¤H¤ÛífË–-ƒÁÈ9KKK©®®nsÎõë× ±ÙlôêÕ €eË–¡( iiiddd´9g=p:‘¾íÝçñxؼys›sQWW‡atÐA@¸ÜºaDEEÑ­[7/^Œ¦itìØ‘äääH›¢( <Y–1 ƒU«Vµ¹ÕÕÕ”–– 6l›6mÂçó¡ª*ýúõksM©©©dffîõ>.]º!Däþ¸\.òóóÛ\ÓŽ;hhhÀ4M† ÀêÕ«1M“˜˜ºtéÒæšrrrHLLlsM­÷B×uV¯^®ë‘þïI6¶lÙ‚ÇãisM­²‘@NNN›kêܹs$ÂoWÙØ“<–””PSSÓæœ6l ìQ÷tw•ïãžä±¸¸˜ššü?Íz(„¬iÈÀÛ¯Ì┫/å²eè”ÃYüÖç|ýì3l[²C˜H¢EaÛGâm75ìõõõâ@Íß~ø¡HLLÛ¶m/¼ðBÄw´°°Päåå‰éÓ§GÚ***ĪU«„ªª‘¶õë׋²²²È÷þýû‹E‹‰ªªªHÛ< òòòÄŠ+"m?ýô“ÈËËwÝuW¤­´´T,\¸PŒ3¦Í9׬Yù®ªªXµj•(..Ž´Mžî|M+V¬yyyâ¶Ûn‹´UWW‹Å‹‹^½zEÚvìØ!6nÜùž™™)–,Y"ª««#mçœsŽÈËËk³Ý§Ÿ~*òòòÄk¯½ÖæXyyyâØcmóœV¬X!bccÛ\SIIIä{ß¾}ÅâÅ‹Eeee¤íª«®yyybÕªU‘¶¼¼<‘——'ž{î¹H[II‰X´hQÄå®õœ«W¯Ž|o•ÇÏ9qâÄÝîãý÷ß/òòòÄܹs#mË–-yyyâŽ;UUU‰E‹‰aÆEÚþ·у“8ZœûøýâŦmâê…ŸŠÛV.Ôls„JF’Bˆ€¶9ì-˜¦ÝÔ°¸ì²ËxòÉ'÷{¿ï¿ÿžÉ“'³eËjkkIK 'nÙ¾};ªªKll,Û¶mCUÃ¥•TUÅ4MŠ‹‹1 ƒÎ;-©kk …B‘¶êêjü~?Bˆˆ6\\\ €ÝnhŽÛ¶mCÓ4ˆŠŠŠ´)ŠB‡P]×)++Ã0 :uêÑöÂÅõH[ë9%I¢C‡{=gAA‹…¤¤¤ˆ6¹}ûvdY&;;I’TVV¢ëzäšinnÆ0 rsÕ!Zû¥ªjDÿ¥û˜‘‘¦i‘ûhšf¤ÿn·›úúú=Þǯ©¨¨(\>Èá ))©Í}Üõš$I"''g¯×ÔÐЀËåÚã5išFzzú¯^Szz:‹e×´'Ù¨««ÃãñìQ6,Ënò¸'ÙÈÊÊj#;Ÿ³U6öõ>îIQ%2ÓÚmÆØò/œÁ"\†Ã"¬M “pâ«ðÏ’,³sV:“¶ùn[×b øE}´%}Lx† BÜ}ëÝDH‡Áæd]þF$›‚3! ¿«ž ݆sÛñGñü½Ò³k7LSG’@B’þ妆üü|>øàdY¦©©‰ÒÒR¼^/¦ib·Û‰‰‰!&&†¨¨(l6ªª’’’BUU@ŸÏ‡Ë墹¹ǃ×ë%11‘˜˜¢££±Ûí$%%qá…²råJÎ:ë,fÍš…¬¨¼ôü³œ3cu .j«*\Ä&w¤¹º¸´$aÐX]BBFg¶åo!3»3®Úrªš:°/Ñ> ¶ã]×9äCöìÂ×BœºÂ4L,ëîÛè:²"aJ È„“Ø´aЖõ³…y[yД&à]¹Ñ „Œ`Ga)§Ýp5ç>ù 6{º ›·n@¶[pÄÄ¡Y£‘ý.euçí{ WtW]~†a (Ê¿ÛÆÛ¿üqÆ@SS.—+’Em‚ZÝZåN'ÉÉÉȲL(â„NàÍ7ßdݺuø|>ž|â Þ|ó5¾úæ+Ž?þBn¸à,VmYËy—\Ì]÷<Äé§ÂÅÌ`ð°1Üzû]|ðÖÓôè…a"Õaá ÃNDøÛßÒvüã°dÉ’È»ÂÈO ÁÊõë5þP:è«Ù…éo wÏÞŒ1š!ý2 o“ö¨5·jÉŠ’D¸²µ©Dwç %„! 4IÒøÀWLÀ ¦U%$ÁŠ%?‘Ô) »-›Ó†¢˜ÄÑtˆ‰Ã³m3ß>÷2O<ð@Dëý×ïŒ3¸üòËùøã)**"***B”]×ÃЊ‚ÝnDI’q€oÕz%IŠDQ9$IÂçóaš&cÇŽeذa$''ãr¹Ø²e W/Á«DSZPÀØÃã„)ã9á„iÔ7ê8í ¶oåÚ«.ã½¾¦ÑåÂU¹ S¶rÈaH·Ê =òdÝ×þ–¶ã‡ü‘»îºkJ‰¤K<ýÚk¬n(eƵ7aGE*CÍèþõ•5oÛÄö‚Ílgû–­4”m³“™’ÆÀ>}™8a}zõ¦sל=Ú3„0‘Zò‹‡ÓÜšþªÝŽ$I|êªÁ¥‰ ZÀ¢ l*·nÂTd>¿ûQ7MCÕ5$U£¨ÌyçS^wøØì¥Èë¹ …ðz½Œ;6Ò&Ër$D×jµb±XÚL ÚŒ‚-‚!„  ƒ Ãh#8¥¥¥|óÍ7\~ùå I2¹9©¬¬FBgûö­‚&FЇÕ…ôSVVΓÿyŸ»™è¸‚>o€&‹$Ðþ޶ã«ÕJVVÖžÍf‹jãÅOfñÄç±à‡o™½à;<õ<ùÜ4˜ ¤ç¤Ñ¯kŠ« ñ{} ÉéÉÜÄE“êš"Ö¯XÉŸ¿ÅŠ…‹¨¯¬ ±¬ŠØèx:e¦0rØúôìÍàƒÈÉÉA³X$9BºïÕmÆòÒQMÄà«wÞfÐA£Pܲ:æâžó—N™LEY²Ä…—/È9ÇŸÊÚµéׯ ïxÿ!Ã1qñÄ£ã R’©©©§ªºšÄ¸lÉ)”VT¢û½ÈŠJ\|6M¡¬ª†‡…¸„d ¶ï =%™è˜ªkª†ŽÍî$11Ò’R²³;RPPY| ÛydŠKJ#ý(**ù¹Suõ(ªJIËâGm}[³B;é¶ãŸŠƒ>˜›o¾y/6=•/?ù’›ÿûZÐJeS3Gœs ¥[×óÐ}wròy‘žÏr¨ªkââk®ãØÛ{ñmá^xôefñ)±YÑ|;o%Ÿð%i9™L>âHT› 2*eÕEn+äé9Ÿ±|þb6._‹Ïå¦ëðÁ¼^³¬1d˜Q’™†Æ&T‡•7n~˜ëþû8‰A5ëX&y®Å7ŠÜd“¥R¹#áú+> &¹+ï½w2ÁY¶ *–ñZlN>þxúöî‹S PÞØLÏ®¹DÅ8™qñµ¼üñÜvéHf¿÷2Ñ=Gr5qéÅ’Û¥'7\v.¯}>Ÿ‡ïº ÃÓÀaǞ̑ÓNdÁwŸsÒy—°èó·èœÃ’¹?2ð Á {8ݻۙ1cÍÍÍíoW;Ú±hš¶÷wVRycÖ›Ìÿ(sæ}Ï ÓŽÃgHC5¯\‹/F&âEŠ%x¸åÿn¦°¡œþ#‡0zäPfœp#<‚Å_}ÍÚªR–~>‡GŸ|’«®»Y³^çî—ž&qX?ú ÂøÓÏ@hYÑDÛíDyLp¸yulR"Áj/”eà-ˆ‡ŠE ±¡¶™#Láë¢XµŽ7¾ø–ÿ{$ý†Lá©ÿºÉÌ}š²c˜ -ñþãm¼çž;ƒ#Ž<œû#ã§MeUa-éö¶=)]úú£º¦§ªrå]÷±cýj wòÔSOeíeœsÂD–¬ÝA·.ÙT68uÊáÄuëÇÇo¾È¡'P]ßDMÑ&;gâ¨`ûç`µZ#‰QZ³Zɲ±3·–ºQUõÛ Ãhc·nÍ–µk{kÙ¤Û[Ë8µjì­¦”Ûw.ýÔzü]Û[·Bìµ}¯5 íó5µžsOפëz›rV­}i} öÔǽõ¥ÕdDú¾ó9¤/{º_­ÉmöÔþ[dcO2°·û¸sfµ]û¾·kÚY6ZÛ[ñí·ßrÿý÷ïua;³cGþî3¤„x:k1ÄÇIJNiäÑs¯áœÿÌdlT%‰¹Å[h¹xÒ* Yç÷Ð׿$£W.ÿ}ïC÷ìÅä‘ÃèÓ §\vpÛ©póc“2´'Ö€% t4݉ð»Q´ÜîÛWûXöÓ*PãxùŽQH!6ÚJT¼“Q}>Æh ¿h&iÀtŒÀ:R>’µ[*ùö[+[·À°mâÿnÍ`ÆEãGï?žxÏ8ãtÎ9ótÖ”‘‘à §c5‡CÆ$!)™ÅËVqÐà~nÛÁŠ˘tظj¨nò‘š˜@|¬“ÊÚl6;>wñ‰ÉX-ß÷-#Gâ‡9?rÒÉ'óöÛïpâôiääv¦²²’òòò_s)ics~î¹ç?~<:u¢¾¾ž¹sçR\\LJJ £F"''‡ŠŠ æÎKEE999 :”¬¬,Š‹‹™?>ÕÕÕtíÚ•‘#GCAAK–,¡®®Žž={2bÄbbbX³f Ë–-Ããñзo_>ø`ìv;+W®dÙ²e!èׯƒ Âb±°|ùr–/_Žªª :”>}úX³f +W®Än·3lØ0úöíKss3‹-bóæÍDGG3|øpzõêE}}= ,`ûöíÄÅÅ1zôhºtéBMM óæÍ£¸¸˜ŒŒ ÆGRR555m®u̘1$%%‘ŸŸÏâÅ‹©¯¯§sçÎŒ5ŠÄÄDV¬XÁÊ•+illdðàÁôïߟøøx–-[Æ¢E‹p:ôìÙ“ƒ:ˆP(Äš5kX²d ‡ƒñãÇ“™™I(bÁ‚äççϘ1cèÖ­¬ZµŠ;v““ÃØ±cINNfûöíüðÃèºNff&cÆŒ!66–eË–±zõj<Æ £gÏž8N–-[Æòå˱Z­ 8!C†àr¹X¹r%+V¬ 66–ƒ>˜~ýúQ__O^^ùùù$%%qðÁÓ½{wjkkY°`;vì --±cÇ’ššJ]]óæÍ£´´”¬¬¬HûöíÛY°`õõõäää0zôh’’’ؼy3 .¤©©‰îÝ»3|øpâããY·n‹/Æãñ0pà@ @tt4«W¯féÒ¥„B!Ì!CÐuU«V±fÍ„tÐA 4ˆ@ À’%KX·n6›øøx®¼òJÊËË÷¸¸¶bÅ ÆŒÓ&Mê!S§0ü„ãèuô$æ¾ù£‡àƒ¯¿äôó.¤Ä]Ë ìÎlýòkfuO¼>‹‚¢Mîœ{÷÷èËïy÷t¿vnß[÷¥}ú¾k{kòòò˜0a.—+"ó›6mbíÚµ<óÌ3mµ[ŸÃa§M§¸¢ž~øŸ»«.£ÅÅ!&UU•tJÎ@ÑtˆeÁìr0jØX6à"Ñ”¨ …»¦âñºp:âØV^HJL͸0 ‰$«*±øõŸØüy Å z‹ƒ%ˆiXR¯¥†NÏë¯ÿDRò4‹‰GØÕ}Ïÿ[Ë3ûòÝ7s0z]È“/?ÛÕÌ„‰#¹öú›ˆ²Gvõ,ûçoAA×_=£G¦ªªŠÄÄD†NRRR$Ò¨•ÐvÎOº³CëÔ¨UÀvNvÝê  Ù²e +V¬   €k¯½–áÇ“ŸŸOYYÙ>õ5::š 0~âDžxüqúõíE¯~¥é<õÌKs̆4„9«òñÕTòãÜ8äÐÃY¶pQ±ÉL՗茞¼ýüD¥tÀjsÐ#ÓI×Acð4Õ·Ûq@P…˜˜MMMÔ××SRR‰š”e™¨¨(rss‰Çb±ÐÔÔÔFsÝ•P# LJzèîëj-Ûžpöé$@§Žýè2i<%µ%h~ g¬“?H(BU%L$Ð,&Øìv¬V;2&``øuTLžF^î&7Á 5µT—”㮩¢¦º”5‹VQ¶y#/ÜZÆÖ·SUÙDauˆ@ÈÀë—¨¢‚SÏ=–'^zÄØ^¨A“Fµ7f`3ÏÉgHÏ5òh”AP(œxâq躉ªîÙì­ñžwÞy¼ð ‘ïëÖ­£°°¯×K}}=ÔÔÔÐÔÔ„×ë$«BÐÔÔDLL ªªb±X°Ûí8NHLL$99™¨¨(bcc4hñññ477óá‡Ò­[7B¡Ð>ïüùó9ú˜©œqÚ)œvâñô6³N9“ÛÖ0aü¡øBŽÕ›V—ðÑ[ÏðâÛ_óÞ›/âH̤W‡DVl­Äæ*GKéHme VÓËk|EyñŽviÇ~#>>žóÎ;ñãÇ“žžNbb"©©©deeáp8e]×inn¦¸¸˜ÊÊJ\.EEErçwÒÔÔ„ƒ–Ñu½ ©=z÷µ›•€?ÀÛ~Èrwù7²}é*FO?’ŒqÕÖàs{©*¯¤¾²œ†Ê*šªê 4{ðx›ðúýFP&*.†èÄxì11$f¤‘˜D‡Ù8Sb‰‰‹Ánw"[$ Ü5 |÷ö,ÿò'Œ AŠ~Z‡0S)/ RWk#?ß`ÅúuäþûÊB|Ä•]ÀƒšÒÓB’¾O"UºN;ƒƒ†öA–i ¤ø—ïÞFÛ}ÁwÞÉí·ß~@ç\°`Á~-®Y,JJJèÙ«?-˜Ç€^ÝxñÍ8tÜHò–,ãÜK¯ãŽ[®£Cr3ïÉY^Ïàþ½°9­4U”“Þ•XÕƒb‰aô˜ÑÜóØ³Œê‘Èà‰ÇÑ\WÕÎ"íØo¼øâ‹Œ5Ššš&L˜@NNqqqmL;›ªªªØ¼y3‹/ŽøÍÇÄÄðÉ'Ÿ0cÆ jkk#û}ñÅ<òÈ#»½›±±±–$‰‡¶ÌÆ•FùÒÍ44ÔE”#›j%1+kt8´Âçñp‡hjh¤²´o]%~·—êªJš«êp×5ÒX×€ßëÃfšÈª†Ãé$%&žŒ´L:¤gaµJ<ûƳ¤:œ¬ËûŽæ¢9ºmèõ) Spârtâ™Yÿåãå¯ •¨k¢c²BµGcäÈ1\ÍõLš<¶Íbb;ñî#nºé&î»ï¾ýÞ/ òÕW_‘˜˜¸ÏäÛº‚Üj[k]…BX­`;šÅb! µú(=ö%%?û±Ï™3‡™3gîN¼1±457A@°½±†I#ÆÝ)[r ¾F7 5¸k›0¼n‹ ™´´4’R¢ÈÎìHjB2¹¹¹Ä%ÄCçî±j2RS‰vF±«k×ÎØ±}½Œà¼SOæ?]«ºMè¦ATæn¾ù>î{é޾új:Ü“Š5›‘‚ f Dï®=xîÖ(Ý^ è¡î-QÎî‘k{ŠÚÚ›—üDϱSþ†ð“ÂÙƒz÷îÆ ë÷™lιð*^zæÑ_ÜnÖsòÓFƒ§ÿsÓío¾Isssdôý£1{öl¦M›ÆÖ­[)--Ýçýv¶-÷›`0Yi½¾VFKaÔÝŽe´lÛNºí6Ú}…ÃáàöÛogæÌ™ÄÅÅ!„ ¹¹™ŠŠ $I"77—Áƒá èD9ì’›“Ms³ Ÿß€ßïd×ÛqqqmÌ }ûöåÇÜý=h•g«DnrÛ¶mdþ‚¬Z±‚Î]ºÓá ·Snx­ÅjÙcÛ©3¯¼ðN9õŽ;aÇwB³uà®™ñÈK'3à˜ \öîkdõïŽ$Ëd Bb@£F÷]y97^{[Ë‚¬úKÙÉö@1zìX]:Ÿz4¶ôî<öÈÃ4”læŒ+îâóf! ƒœž=p¹ši¬,G/¼ö7nàùGoã‚kîß;ºt(Þ-ó˜vÎ%<òpËÔB„W7ãSR$‰ ¯¾•g½›ÜÌd¦_vÝx QN~k2É4àÖî»ëblv6«…k®¾‚ŠP"³žü?R’©öÇ1,µ‘r=\]ô–óŽfU•´Ôt^~æ Þ|óMN;í´?EØ[L’öôl6[ÄU©íø=PZZÊâÅ‹÷yÖeµZ™7oƒ `úôémYæî»þƒáßNiaKÖï µó.=÷4Fò‹Çž8q" mÚbbb7nÜ/!`è:cFfÌèшT‰V/•VïŽÖ¶VŒ›‡qâ‰'±rå ÆNÇwsæ3ù¨ÞLœr4 ËÀƒI蜋Ï%HŠ‹!Éj#'1KO:Ž!)¹ôâ "JÒ/žkWSƒ$IlÉûšÇ\ˆ£¶ˆ{ò¢z*É+†_y¿«™qÓO£C´…»}–ž“"^³^|„fK.<ã„ ™<ßÈ#O=»’¬‘rÙßvã¾û€{îžÉ±'žÑæ<;ÿ-+ÚÆ;_ΡxÝüðÑß&NÇË/¿Ê»ï¾Þ®0Ÿ—ÞxŸÛ.¸ˆôÖc|ý™Ä³ÞeöìÙ$&$PY[KqE Núüg¢5“Ùþ<è¥ÿNˆ‹‹ãÎ;ïÇëmÏB‚œœtÎ8ã´}ö~Ù?íMŠ”‹ßÔ××óè£ Ù¶mÛnò+L“ /¹„Y)äo+áñÄëv³qÃ:Šbì¤$%îõصµµddd´éË?üÀäÉ“ù_]bBðì+Ïþ¬ˆ]{ ÿwÔéXSbpÆeR¿e¹éÙ<ôÈCwòñ-×0ò>¼ÊÿŠDè²Àv oyy9O>ù$Ó¦MÃëõîÓ>‹…²²²H¦þ*:vÌá§Ÿ®çŒ3Înç]4N>ùN®»î?ˆ†7oÞÀõ¯ÈNÖcþg`ýúõÜÿýœ}öÙûL¼Á`””þ U˜ª«=@>Oâ*q…ÄDª‹7ÐLSƒ—ô´jkªIJî€ÇW˪eÛÈêLVÇTE¢©9@l”ŠU$þ®÷LÅç þÏöîâ‹/æ˜cŽaôèÑäää””DJJ ÑÑÑØl¶Hd›Ï磩©‰êêjª««Y·n•••Üwß}·°¢¢"¬Ö¶ `cÇŽåî»ïþŸUÔöFȽzõBUÕH¤ßþ JmŸþ¿­Pÿ ¸Ýî°>ó Ù—v…¢(¸\®HJÉ>r¸éÿeæí'0õЛ‰Nˆãµ×.áŒó_å¤ãúbµÇ³¥¨§s-MÕµ¸ ;ŸCqCNI^è²zõæ°“Gc§=Qü@ Àã?Nll,)))TTTðÑGñÝwß‘ŸŸÇã‰T¨5jS§NåØc¥¨¨(”ÔŠîÝ»ãóùv#·¿›y­5,û÷0 ¶!Þ…«fÿìO*K3„$‡«É­†‹È²"(ŠÜ2„~ö+Ý©³²„0Eä³!L`‘”ˆ®bš&H Ly'U_Fˆ–0^Z]§äŸ]¨ I˜-±á¢E³Öoìý Áߊc=–’’6o޼Ϛ¶Åb¡²²2RPðŸY–(*ªÃë àóYÙ²¥’-[6³lÑ&Lº>ÝÒ¹üÂ1œsÎ \2c$—Þ7×ïÂò®ºp7Þ÷6::Ùº¥‚w¿™ÏE3ÆRæ’øáÉè=h‚ڿͽBÐ¥K*ª*ý-úš••Åõ×_ÕjåðÃgÆŒÜ|óÍ‘Ìh­¹DêëëÙ´i7ÜpÍÍÍ\|ñŸÝîˆü8°MžÛ”?ýôSŽ9昿L¨–»Wâ5 Ã4µŠ0‘e®â)I=¹Ña•ºñsG¾¤ðô¯…U…®3/I€ ¦"!L“ 0Z¶ÿ™ÈM!·Ö¨‹øÀ¦¦r!0ÍðyD¸nG¸-ä ?üž4Ê?ÅÅÅûeÞÐ4ººº$ñfddSZú8\p8°šÃ¿Óô‘·°uš)>ül(†é#ÿè1¦‡a“Fbf½x`ürä8 ™AϦéRÿF/¬•ñãg2wî@躯ñññuÔQ¬Y³†Í›7#In·;2£Û)))\vÙe$%%ñÜsÏ1yòäȶÙÙÙ‘*Ä­Ø´iÓ(þ-h ²N.!˜&müä,…¯¿Ÿƒ¬È¨ŠŠªiáúžª†"Ëh²EEVTT%œTÑ TÕ‚„„ÅbEQTEAQUTEAV4MC“E$«“,‡IÞjµPW×!dLdŠ–ê¢mGè6UFÿ"¬]»–›nº‰'Ÿ|’úú}KPcF¤Äö? áìiÂiñÒZtKx¤¥H¢*9¨E‘?Šâ$\‡ÃÄZ Q[´é¿›'ˆDRRü ìÒV«•²²2ÊËËIKK£²²ò5=!v»ÄÄD>úè#†Q>6nÜÈ AƒÚ¬yìjzøw¯ ¦!@-uí%tÝÀé´ávû™5ë]jëÜDGǪ¬"IIn 7È*-¥”6ü\XB!=âe „Ù’zN`šB70…‰ÞòWA0 3aâÆOMSƒ )\'4üâIÒÏ1;E½ü…¨ªªbþüùØl¶}ÞÇï÷ïµþÔ?™L=ùFôïÀ× wphW‰kƒ[có–ÝË£¾ÅigÏõ7?É%3'Õé&µo¢$?üÏ>ù1EOí%ïÿ SÃqÇÇ¢E‹xúé§>|8éé餧§“Mtt4Á`’’Š‹‹q¹\,\¸îÝ»óÊ+¯ŸŸObbØÅlþüùL˜0¡ ñN™2…‡zhçý×oCs3º¡#+YVpØ4Ô×ñòKóñø›pØíXmVtÃ6(¨zØŒ KÈŠ ’„HÈHRدÍ4L$YŠ;-öØ0ñJ ÉH (²Œ!ÉȦ‰&+-fÍ"X²d-ß|ó#cGgòá¨olŒ( R«æ+ÂZðÿ‚ÀˆVøg.þUHб#LAbJ,½zEq×ýoq渌NÃ8fè5yÁÖÏÿ¾};àtZ±h>ŠvÔлS2KòV±xݳо˜ö§!˜˜Èí·ßNll,v»ºº: p»ÝX,²²²"YÆFŒA `ÇŽm´ã=EríMãÝ9Ï¿†xý5Å„ô ñQN6ï(fÑÊLÙŠ¢JhŠ…P0¬iÈJøI¦ B ( %LÂÈHŠ-‹h¦i¢Jrx‘N’ÑCzxQL˜aU˜-±À0ÂÉ›M$$Óˆ|B':ÆÎÊÕ›øqÞB†íÃȃûâòxQ{‹IT‹í/¿¡“'OfóæÍ”””ì³mYQ¼^ï?Æ«Áf³òÍ7‹ñù$'±qã&,–Ï8ï̃ðé‚ÁC³ê0*KÐM¬’ ßCçôð…`p϶æç£hf¨†-« ¸äŠC™ûÝü¿á‹i2rdwRScþ½Ý9QN+,V=ò0î€É±Seá’•2reuõ<ûìduèÈ©ÓÃOòÌ:tØ­ÁöíÛ¹ä’KøïÿÛ¦½¨¨ˆW^y…³Ï>{¯Jʾºiî¼^/6›PHÇf³"„Œ„Ñ2‹þuÎápì×ZRÛÅ5Ó :ÊÎ-¼Clt²BVühª†)ª(h U„íºšUmñi“P4P5 ÌpG5UÁ œeKVLÃD&¶Ø8Ã$¼863 @׆¦À0L S„Ë–ü2–-ÛÎAý3Ð3 Ÿ?€$T¬íBxÀ~çjX·n½zõú‡o,Ó§ӧϘ{æLÂ¥®ÿˆá¨£®ä‹/®ùÓg^±±±»%%ÿÅžÆÄpÙe—qýõד!`«ÕÆÊM…¤:eŠJJ\|üÕl’32п7Ý| ’ϼï>ÀÜCþÙqãÆÑØØØ¦­²²’§Ÿ~z7â‹‹ã wïÞ :t·c-\¸1cÆüî÷ëøã ¦¦‰¹s¿£CV"%¥uôê;„ë–ÿêþá(Û‰F¼6ÍB”ÝFÅöÜÑõè¡ ŠPÑ%z85š,ËønYÆfµ‰)Ix=^</²E’±'ÄàihÆ0 $5\ÖD‘$Löˆ ƒ`Ъ„M‹ ¯mûÜLES±[£’@’JKid MU‘ä°ïÄç¥e|ýÍRîºù4<žªú×/¶Ì;—)S¦°lÙ²}ŽjÕxÿ)$¨®öµ@"á²Vâm­¸Ýò{4Ð@xñÌØZþ*@4B4î-™ôßAìvËŸ~VMÓxðÁwsãú%8N¾ýö[¾ýö[²³³9úè£#$ž’™Íä¾i„;†E]É&ºtÉeáÂELšt8_¾õ8Åfö¨XìªEÿR)®V/Š=™î~mÆ£iÚ>…I+ŠÒ&Ðûï¿ÀÝ÷ßï65hš†e] ð|¸< ø|ôØŸÔ´ a²tÁB$I¦¾¦¯ßGTTÂ!Ý"&6—Û„ 99_ @}m=«…€dàÁC¨­¬¡º¦ŠPHgèè¡„tƒúºÊ‹ÃÉ9&¦a€$¡ÈÐ’¤!+ª$«C ~o3Ь…ÝÍþb„B!Ün÷~M‰u]'..nURÓSyî¹—9ñøi‚¿{’®ë`ØRXEŸî~ãre:ç^ú$ƒ{åòüåÄ(&>qO¿¿œo^ûŒO¿¹•W^}Ÿã§ÅMw<ÍùgBɆµœvÑ9@wßô ×Üy>vË?gPú³ÐÔÔÄ¥—^º_©I­V+)))œsÎ9ø|>îºë®ð±ë¹÷¦KñBXT™ñ£‡#8„ÉQSŽ%ðã„PíqÙsÑ¢Eyä‘m‚*Ž8âî¿ÿþ½ Ü¿âçwb±XÈÏÏgâĉ,Y²„äädî¹çžù:l6¼;%ïéѳ :uG…ÈÏϧ°°p·óÞ~Û-f€ú°eÓvB?&º° ;ø<^\®F¢£í„L[Lý†ôç”3N¢¡±‰‘cFS[SÅÆ¨ª®Äåvƒºaà÷y@„k“©V+%ÅeÔÕ7!)*H‚Šª*6mڌաa˜!,š¿û¢â2@ ¨*‹óóí_R^ÚZ5¡5BÂ0@7Ìðw$LtÓ G·,„AHØ-ýU||<}ûö%Ü÷ÈÌÌÜ?­Rµ1¨go~ð>ü¿£pôè7I‡Åaã‡#$)lRÒ,û”ênÏ&SUSO—niŒ׃™7Ïbé‡ßqêUÓ9ï˜;°Ù¬l^–G¿~ˆ‰v`µ(,[–(ÜzÏtj]í,úÌ ûóÏï÷3räH¶lÙ‚'Â’$ ¯ÏOÈÓˆêˆeÃÆ-ä-˜‹ðàòøY·n#š"픺-Ö­[·ÛâñÞÞ¯¿þzŸjfggãñx2d›6m"**Šøøx† Ñdãbãyëwyé™Û9á”é >…Ë–3wîÜÝH·u¦ÖêнGü~/¦ˆþCžÍ.6^“ G'3-·ËG|B<@ˆÍ¶Ðo@/6¬_‡‚Ь(”7UÒ½WwÊK*% ÉCATEA’MRÓ’ €)#ËÙÙYƒ¡p½&C'%# S7fØÝLÓ,dfuÄ4Œ°û™$GªëJ(ˆW3UÕ0Œp& î3Á0ª.þúï!C†ðüóÏSSS³Ïv^]×q:ûEnÑ šÓÊ»}BŸ]©¯oø]"jÊò×auFóÞÏ3jò‘¬Ü\CѺ¹à’kö9ÅàN–<^xêÜ–ñ=˜p¾Òb÷Õ¹ðÄ-í‚ÉÈ€ÉÀSZÌAítHí,ú?Ÿ§ž»ox…Ã&LbëÚeô:žkÖ±bÑ"ºté´Wù ƒ»Í—-[Æù矿[æÀiÓ¦µ!ý½á¬³ÎúÕmš9õ”3À pîðÖWñkGnÍýQT\HÏ>=(ÈÏ'üƒ‰W×uü>;v`ÙòlQNÌ`±)ÉT–rÒ§¢ALaÒÔØHIi¥…¥)<õ•% !@áÈ2I–0ô’dEFàèØ±Ñ1±lX¿#"§[gj+ªðz}aÂi""š®$‡µÙ°ö~i[+œ†tƒø‰ ’B’ÿ7ROdeeíWȰ¦iÔÖÖî—¹Áa³itMsòØ£pÅÕ×ÓÔP÷›ûžœ™ƒj³a%DIYï¿ò$'N;ü )À/Ù÷¥G^vÂý_#^ï¾ù"ãÇÂóï¼Ï5çž„S òÖ§_³esþ^÷>|ønÇü~?;vì^ˆÕbùe{øþ˜ðÜÁ°"f‰ÒX¿q1ñQ©$§'³iëd,%­ ­ñ¦â£‰N9]qׯ%ücd°ÍÛd±‚aB§ì„*cÕ,4¸©[¿E‹æ•g_CRÍ"ERdIá鿤 +­¹¡½Šª ab MQ)-,Á¯àp8IN²Ò\WJ·œ–¯õ¡¨­¡À`J KJ8¬X2hõû çƒ|^’Ò¨­­Ã4$dë_/œŸ}öÇs Û¶m£¸¸xŸö±Ùl”••íñJ’DM»#ŽªÂm~'ùÐ4 O] ~¯ #àÛ‹‰R%Ž=©=•ã¿ ’$a±XÚdàJËÀ†µ«xýçqÕñÄÓÿÅ0L6mÜ܆­Vk?Ý=zì¶xl·ÛéÖ­ÛŸr-ºOgIá.?é"žxç†öBiQ ž†"j5{Ha÷UP1…ÎÒ…[tPw6¬-" °¹íWm¼¦a¢È ‰ÉNt*ª* úýÈvª%ì¿«È Š"‡ U µ¸…a a´&µiùß4Ãé㤖ºl®€®]º" gŒu«+©¬(Æ0$\.õµu¨²Ò÷ÖÒ1©ud2EX«:N§ Ÿ¿‘`È@7‚¸=î¿\`ív{dö°ÏA–÷;„2è÷²ní:\†Ê w݇¿¡æwéÿ–-›X·v-ã¦_LNNWÿø=›6mbSþÖv6ú¡®®Žââbâãã‰oqûÔ‘·Û$Ëø¼^‚„tUU¥k×®\yå•ôëׯÍ;±k ¢!C†°eË–ZgSV”Ýfb{ò¥†„C†çÞž{±vó:<>?ƒûõÃÍbC˜*²@Ud¶äNÀ ð#„Ê/Múö7pªÍ¡ê›<ø}^âbœ TLIB‘<ªET$Ñ2RËEV1LMzØ,’gS•`0H\t !a4tšêCL9vMun®rŽ<öxìQN^þÏ3¨-9EA騚Š0 TUÅjµ¢XìdeÅÐÜDS2ªõ¯ èܹ3gŸ}ö~¹ñ„B¡H™”ýÀÚºÚ° ÒïX **µu?›,U£²²õM4d´y¿_N“Ÿ]ÙÚ±ßZ¢®sçw²iÓ&æÎKvv6†aЭ[7âããQ”°‹hSS………455Eê }ûí·mªXäåå1uêÔ6¾¼¿fRØ»’ò³56€:yèdš¼!ºtîÈ믿±»­¯Ân 1¢Ï 6o«Æ’•+éÚ1‹ÝÉÚ-ëÁ…äscHªvk\¹¬€ž½sÈßT®[÷j:Ûßbºmׄ‰À$2zu¢qF;Â$)% U•¨ª*Eèá ’,#£`2ŠdSF «-¦E Ÿ" "K 6§‡#‡ÍIC“ÚåùÈŠŒn@(f³—çO#=- ÃЩ¯©¡cN¥eedwî„ÛåfYÞêË+Iˆvò›ÈVM û ÿÕèÔ©Ó~ïx5´’ïüùó9ì°ÃöËQ~_QYYIçÎÿc·EIžâšÞÂ4~Ÿé\t’ÊÇu 1²Ed(4 ¢££ùúë¯),,¤S§N 8§Ó‰®ë-755•:PQQA^^‹/¦¼¼œn¸²²2EaÙ²eœ~úémˆ÷›o¾aìØ±û­) !!I*ï¿ÿ ÕÅóØ\ìÂm&Ò¸l¯¾úÊ.6`«ÍF\”úZ?¾ ÆK_½É©‡Â' ? (d *JC0¸Ï *‹K)÷y#‹ø‰Øí†éEÓöæ"¼¿fˆ6Ä›‹×§¢©·_=•Úºš–4IA7LT5oЇE³`˜²ö¯õ… TEFèa›¬LBA„À0MÁ€Ñâ8¤GzЬ C-þ·³9=dâò‹p$[Ys %ÛÑuƒÜ•¬˜8†î…u=$£ÈÿÑQÉÉÉ¡Û'ÝÌ4wËп¯X½z5S§NýCȱ¾¾žÞ½{ÿ ÄkУ{*]:'þnv´¨DµFigÐDVVýúõ#àõz)++ûÅgKïÞ½™9s&V«I’ؼy3¤¦¦îÔð[rd ¡3}úQhªk¯Íì¾"`„°Ûl-E7­XT0°" •aÃúáñ4b‰‹eÛ–¥n‹ðãákZ±~%QÑN†öĪëijÛ}uÕ˪õävI£¬¬BEñ£iºnî—Iq¯Äk·;Ñ,_ø„X4«Öb61 ñññ¸Ý.¬ ¦i`˜ǃÓé$ÔñùýÄÄFEì°Á@@0€¦©øü~,ŠDrRÂTiÍ0%L«5ìð¬( ªª„ú’Nª£Ë€ŽjQÀP@jñ” 1:Õâg…G4ÿú8þO>ù„iÓ¦í×âÚ¿¥æZ;þ^ïå—_Îí·ßΆ èÔ¹ )ÉITTVåtàõùˆv:±Úl¸=~²$³µ €¡C‡r 'DˆºOŸ>» Þééé\qÅ¿©6«Ì}}Ï-ÿw÷Üõ!©±Iôé‘Llt‚²ìŽ¹ìØ¶EIRÑuñ›”„6Ä;uúuí÷Ѫ¹îº˜ðkÄ[UUu@Ä[SSCrr2uuu¿ûµ¤¥¥ñÞ{ïqæ™gRRRòü„÷´Ÿ…µk·Ñ¯ßpÀÎ.gÑl‚Í”VÖÒµkóg˨ G dp5¹‰OŠæ›÷Þã°é'°~ùzT5@Jf.±q±¬X²ˆž½û’”‹ÛÛž:ò·¢¦¦†³Î:‹ &7ï;ì èՓʺ2î¼óAîºïA„¬rp¯î¤ôÀ}Áå—_Àœ9s"Ç4hÐn¦·ÜÜ\.¼ðÂßÔ?_q÷Þõ“&„‰Î?¬GÕê¦ AFr4]âãHËÈÄbÑ)+iæ“yï3¼c­lU£A’ ‰íµ•èeN9fßÏþÚ`ˆ¹?.bì„1A‚­E-é~'âmÇoǸqãxë­·¨ªªÚç}dYÞ'§ñݧ\‚÷Þ{c=–|ð€§=¿4}<çœs¸á†ÈÉÉᢋ.bÇŽûáK)óüó?²~} »*Vk>ú½zeÒcø©¼ñèU ?âl¾ÿú .½þRž¾ÿžšõ§ŒœÀ¬¼9ÜÍ;Äe$ãv°töGœyű\sÁƒ¨Á:¢œN¿ôV¾þäm¼fB·sÑaÿnYTe¿2fÙívf͚ŵ×^‰fk•³@0ÈKÏ>Í+/½Â¶¼zN>þX2²séÓ•>ã$7-žÆúZV­Y·ÛÝÐÐ@rrrùü=2ñ麽Ål<{Þ:$ÝÏ]wÌàÿîxÍjǨtÊjTש¬Í_ØP !è5<‡­–«F”͆U³P\_FE¡‹f`k}>~ÓÊA°¹¤C$SRÖHs£Š, ~‹U¬xgØív:tè°_$ …HJJ: ómÚ´‰‡zˆµk×Òµk×ßµ¢²¢(qá…ÒµkWŽ;î8N>ùd¦L™Bqqñ>°Äœ9yçûØ=X"•Ÿ~ZÏ?ÜJTÔ Ž>ý ÒzŒåËw^@Ók¹óÌ©Œšr*ã’â¸èáyí¿/ÒÜH¾zã N»ìl>zåš8Wc-’»-«Oß6ƒÁ¦qä!ñÑ—Mÿj9ŒŽŽæž{îÙk©ž=ÁápðÊ+¯ðØc‘––ÉØ•ݙ٠WpÝ•W1lÜ.|ì>þf>_|ô.+Ì!dšÜtóÿqä¡»gèZ¸p!gœqF›YÙ§Ÿ~ʘ1c~SâsI’Ð4`0ˆÐýàÿîx‘ .>ŒuË Y¸l3{ƒwä§kQ”h,² ]† /}ñ}Ï}ý¦@˜!,X‰“èÛµý»Æbó©­ÛÀ‘cGáÒ²p%4SUÚêFÛN¼ÿ3ƒ‘éÿ¾š,|~¿Ÿ²²2ÆŽKUUÕï:¼«F¾mÛ6|ðAÒÒÒ8ãŒ38ãŒ3;v쯖„1MAØMl׺:–,¹“pí±Bjkj8÷†8þÌðûÀá€æ&8鲋¨*…Ô¬ñ”î09ï–gIJƒS¯<˜Íy&7Üó ÈàqCB4ÔAYµÉ §'ö¯ÖÖÖrÏ=÷PTT´ÏûDEE¡ë:×]w™™™\uÕU‘ߺvíÁÚ5k8÷‚ Ðõ ÛŠ+èÛ£½n¸‹Eå§yóöHº.ýãt:Ûïï¡ñ !vÊù #K! ^xzB òнgsÝM¯ðÓ/O=u—^ú%²Ý‰î1PT?’ÝÆ7 $^ÖhÖb°ë‚€&á3¬¬Û Ð±»LÞ*/¦®Óÿ r§÷ ïÐ~¬Yþ}äœ?›¤vâý+1{ölŽ;î8¶nݺϙ¡LÓüM«¼Š¢pôÑG3}út~øá‡rLßWTVVrÿý÷“˜˜È7ÞÈØ±c9âˆ#¨¨¨ØO—عà£,A0þÚ° û[xº²ä翪 zÈŒ´iVhjüYó¨.o5c€»bÿÅr(Ë2n·{¿Òz½^Î=÷\êêê•ÆwyžÉ©é\yù¥XñôížE½ÛG´"ؼ­ˆG}”ŠÊ=›×RRRvKŠÓ§OfÏžý;ÎΤpþn®)×Ýô ç7…%KVré¥ßsýu#xÿƒÔø2P5Íš€[Äp̸ñ|¾v JX,¨Š‚‘¬‘m’›¦ÓØT„áo ¬TãÅÇÿÃÍ7?ЦÙZ°§ÓÁ Ï¿Èþ†·ïD¼áæeõ‘¼¶ábÃá“;O DäG"!õájëzØF-@ Gj£…÷;íþ¾ë4CBjY)ü¹zZ¸fqKݶŽÑʸsv%$‰ØhII±ü~Žøû¯ñ¶ þ¾Âb±P\\LZZÚŸ×ëõ²páB¦M›Æ­·ÞЦi¿kˆã®EMM W]uéééœ~úéÜu×]„B¡ýv$o}ʲê$9Œ_ñLÙ× ±©,õÓŽý×"÷OÕV.¿é^j·,`ÉÚ|Ö,_ÇÌ»oaÓO·I¿¸+ÆŽ»["ôØØØ=&?ÐÙš¦i-3̰„ÍÎk¯~ƒÝbãÚ'ñàýUŒ4ŽCÆ'²ü§~ÄÄg“`O§>àã‚Q©RlÄGÛÐ,2 HÊ^O’<”äŒÕÔ¯HÇße):}HïžÙ,[²–ŽbY¿~²œ…@>pâ5 ƒ¢¢Úpùv®•¶ë}°Sy)BØ´„·Þ¼Ÿ_ø³h÷½çç+vQÛŶø™„…)ˆnµ”ž÷û<-Äû×`êÔ©lÞ¼™;vìó†Õj¥²²ò7/À»ï¾Iy÷æ›oþaÄ»3***8úè£9üðÙš)ö%7Åÿ6éúý~žxâ ÉÉÉœtÒI{ÍSƒ«¡:R8ö×ðÔcS Ô} ™¦ –˜–Ò[P\\ÌUW]ÅÓO?Mcc#111ôéÓ‡‘£Ç‹Å28|ž@€¸´Ž,\´˜uëÖáv»‰å¿ÿý/ÅÅŨªJEEÙÙÙm®mîܹvØa»iع¹¹¿Á¼"¡ ™$l– bbz“u0Ù“‡·ÁOvÎ'ÄuØÎËÏ7Q×PEttš*Ó »8~À J FkÖ­¥˜’ó"vd ¿YC|òRœQ ‰ 6ºåŒ¦wŸ¾4T Êžú[l¼­ md$‰5MAUTü-#šf W©¥°Y 5E£aТ}nß¾ƒ.]º vÓTw&Ûoº®fPf8Öp®]Ççó… l¶h¶ºn ©*"l×Àf³…1‹¿–t‹ŠŠxë­·˜1cÆ>¯(‡B!bccIOO ¿`Ï++¯`Ó¦ML˜0¾}ûRPP@||üZ‡Îãõár¹Ø²e ]ºt¡W¯^lÞ¼™²²RºvþƒÎ*ñOÃáà±Ç£¹¹™o¼‘¨¨(êëë÷ø|¯¿e&'Ýò*×¾yË =s<ï®­GÓ†ìÓöº,Ó±êÓs#¯‚“N:‰ÄÄDbbbhll¤±±ÇCss3’$a·ÛIMM¥{÷îL:•¦¦&êëëñù|›E‹Ñ·o_jkk÷zþºº:’’’öÓËA€JUr`³eÓø˜tË9‚ÜÜ>ÿV6n‰%uxCÐParåu™¼ùªÕ®2TRoÙŒCñáG!$ûÙ¸¬‘ôôh4Qäó—‡fõ %R^!(¯úˆ¤¤w5¼+Θ{´$^!Zì¹á* ‡Ý0¨(/bàÀlÛ¾UQp¹\¨ªJJJ MMÄÅÇE0Än·‘žžŽÇãAû•—¾5ã˜$IX4™ÄÄD¶o/ W¯~T×Vâq±Ù­”””àp:ñy½4440xð`¶äç“””ˆßçG×uÃ&’¿8‡k~~>Ï=÷W_}õ>o `ذaLžv‡ŸpÑþ /Èéc“HLÍâ°Ãã7Þ`Ĉ\qõôxz¤:ôï «]¥jÍW\tÁ ¬V+]tï¿ÿ>={öüݽ*ÚÐ?‡w1M“;vàv»5,;))‘äÄXœÖ}˜3ÓSö}Î!ËP/íÑæZ__ßf@p:m*J!hhh ¡¡avÚ;vD²öµbܸqÜ{ï½@8ì}áÂ…àZ…¤¹º„MJ&ÚÙŸ„„atÉ<Œ~½“Ú|æ-MQišbEQ4,r€ä4•Yo“šbèð8Þ{µ56¯RǤî#øxÕK—.eâĉÌ;—´´4ªª6µ ‚€¾+ý½¤74xx챯“üü2ŠŠŠHLLüGÛ‹ÓÒÒöhBiå‚0`À€ý>®E–0…„CéNBÊP2“gP¯‘8“—°|ã ¬^SŽ3*›%žÖª&’p *LE}]4Ïýg·ß×'ï«%:ÍÊ‹¾áˆ³¬r…[_üöÎ:̪rû㟧çLwÁÐ1twƒ„Š(êϽ¶èµ½v]»±@T énf˜Î33§cÇï3s©ñÂzžyffŸ}v¼ûÝßw½ë]ëû]EË>-¹hðú´oÍo½Gáví ×îr¹¨««£_¿~lܸQ”ŽÙx8Ù"'¢¥¤Äpà —!òò¼¬X±‚‘#GþOïþäÝsæÌa„ ‡y´ú~%š5‹¥IIi“s:]r›³¡à)ÖÌ[‡®DeTôˆ§ B „ š¦“Ù4žè5Ue±3‘mùÕŒ8ÃÊ®e™,þ£¯Qå×ï =-ä:FŽÍaãÚZ6¯1E•c¶¨Ãë—âþ¦ÿV« “QÀd”1›L˜LfL&3Æú¿%YÆjµžžÎâ9Oç›ÕF£„Õf&5%™]+_']ü•h«ŽÑdÁb± “‘Ñ„´¬L²›6#3« YYÍ0™m@rJ:‹—nfêå3ðû˜Ì&,&3‹«Õþm±"Iö¨(¢¢¢ˆŽ¶c6›±Z,ج¶p.ßßl………Z\SU•ÄÄDÒÒÒ() '¡ŒÙ¼«ú “% A ²öçwY½vJÉ6æ~ðï,þ™o»ŠË!„ÈôÏï÷c·ÛiÒ¤É~c…{¬eÑmèh¾xï¢bÉßöï=}+Ã.|ˆëÏéÄ;Ï¾Ê ·ßdž­ù¬[º“ùÀó{›Í†$Iøý~Ú·oOuu5Ç’óŸ¼a¹ú¸}¼ó`PŠ€bjkÝÌ< ƒ4mÚt¯Ïu RDÐâ’DLf«]Äd‰K‰M‰Š±G‹a DÐÁd±E‹Ddž÷WB—Þß>α´ŒŒŒ}äÜ7mÚÄĉÿ`º 4 –˜f¤ÅC¯Ü«èÞ1†9 ¯céò¹¹¹‡ý½ââbÞ}÷]Î;ï¼½’×ív;%%%{­ö'$$ð¯ý £ÑÈ%—\‚Í…שsÃ# i ) ñ/ÔÔ:ড§S˜¯ñÖokz¡ª\ÃlùáóŸP#ݺ…W›ˆ=~ÿ¿å—Þ|/h*X£§£ëàõÂ…·ßŠßu5/ý2–€ªÊ4¤ý8ïyyy|ôÑGl߾͛73jÔ(²³³éß[¶Ô²ti EE5Gõ%>âø‡2¿?‹e< p÷ÝçS]íæý÷—"Þ1 ’Ÿ_ŽÏ·ääd¢££ÉÉÉ!** ó: ‚À%]ÆE^‚,šINÿ»àRr»õ$oÝ šäö`犟ˆËìBÅ–ùt1™²‹pû-„ti—]Ar».¼úòÇx !ÉL~7÷}ô gö˘sÏgÛ⨒+î}ŽÁÂîôУg´lÙr/ð=œÂ޽=C t‘ØØ\’“&ѧãX¢–òÖ—o¢©6ÌÆúœú”Ó½Szd])ìøh4išFM­ £ à—™6³‚™WtæË_ë(õÔ‘ÞÙEÓÌ®”Un"·s ‰éµ¤¥fr—ô ¸++¨Ö‚Ê_ÞÈâ‰É̦Íh–Ó‚™uQÙ¸q¹ísAHMoʶï’ׂNÝFà÷{±Ú¢Ñ™èx?±±F›„ò‡Ã jˆØø6oÚJŒ-ŸÛÍfE  †°Û-\yÙ.¿ü*šµjή$öÌHKOcêEçS´k;qI)|6ûk*+«©*úQ¼W®\yDß[³f 3gÎä·ß~Û‹ò¥—^âØ«š-;;›ýë_\~ùå\rÉ%Ü8ëbt •`µÏ AŸ†=V$)9,¿Ô´…ˆâ?½ÄT‘¼!&Ÿw6‚)†Ç{ŒóÏ?ŸáÇ3ï‡Åè$¦‡Sþpõ—« ·kħ‰ŒPQ1qu5à÷At¬Hi¾Ž=Z .YÄl3|M’Þ¯]»v\y啬\¹’P(Ä;ï¼Ãĉ¹ýö{¨¨xó믛O:à]´ègn¹e÷Ýw!_¼‹É“Ç2ß~»ŠÉ“Ç sçnâ‚ .¥¢¢‚¶mÛrÇw Ë2š¦Ò,;É߯|•r÷zââšñýsùï¼×xú¦ÇhÖ®[VýƵ÷þ›W’øÔ4ZvHéÆ_Ù´a)×Í|”¯¾û…˜ï?cÓwŸ1𼛩É_O@4’%%&…f­zÒ´i ¾|ût+´úü:¼çüoV7$_-bÐ{”Úc=zôØ‹8êŒ3ÎàñÇ?ü¹„.enCZÂxõ"-dö÷#鱈ân¨ÕË…iº&G×÷Û O3 &m Ã¯+4BAIÉf~bÄWGeÆ– *ë×Õræ¤XB!ð…|ˆ¢Œ$þ韽‡‰@ÀW/=n% …ÐÑ%À,‰¤t½”¢’<Úõ‚ÍdB• B!bs.fsY%CN›„ ¨ÔúkE‹ÅŽª0™lƒ¢íÑADIâ•—Ÿ§´t;3g^⥛)+.dýºå‚ˆª(È’D\| ѱÑ(A»ñÛÒÍ(j°¾ˆ‚Uf7s8X­VŠ‹‹©¨¨ˆl÷ù|”––îµ­¤¤„­[·RTT„ÝnG’Mü_ÿLÆ\zJ@§cÿ6,øbÓÿýï=ø^ƒ•5s_#>=øôÖTnšË°ÉwÒyðJŠJÙš·’íÛ· ™={6Á`¤l¸jøHš¶iƒ³²‚ÜN]±§·¢Ïcy`ÊDFN¿O ¬ÝTÁâgrÙu÷ƒ%N=ÒØ¾#ļ/¿'E’¨vnâ²;âã·¿dÕoðýÖø|>*++Ù²e   ¨¨ˆ>ø€²²Rª«=€¿ÿèæÒÊÒ‰On¾dÉNt} °páõóUÈx½Áú¿ÜnÉÉɘÍf²³³ëC)[ò—âômå­g?¥ßÀnòâßbÐùcxð²»yÉ,üäiž>Es¿£÷èi”lø‰ß¿ûœÑÞÎSe²ssb›PU¼“Ç>€Ÿæ}‰'¾]ú·cÆ /Ó£sû%M²Sé1ü‚µ°ùâúô 4#(Qñl¹ö'dã/·GQQÑ>Dÿ‡«1¸ÛK5’‘z}»ŸŽ&ÿÂÜ_ßÃ"%¬Ï?n˜©7x¶Ù€¢(û,ꇔ gOöÍ[‰OŒÃ )//E#ºŽÇ'R°£+…îzB¢Ö†Úš2dQìvEÅHÒ_àjhX¨ª¯OÃh4 ë:¥¥¥õ)bA$IDÓ ¬¨ˆçž{Œâã™gßÁÃ%“ÇOnÇnœ6zÍZ·âü³F"džøÏ‹@<Á Êða#E UÕpºœ¨ºŠ  Ütó¿u.»ôJŠ •GšEv“fXÌfŠŠŠ3v¹»–‘Ž¢‰¤ee!‰Rdz¤joŒwÈ!,Y²„âââCÆ#eYŽìΟ†Óïg׺…b3è{Ú8Þ~æ]«ÕFfF5€Éh¢wŸžTWÕa2É„‚Aúö‚lIKMÇjµ ``ðÐÁȲ‘@ÐRhѪ’hÂl2b ýL& š¢PPTÄ#È/Χi“ðÂÂ#=«.\~èr»1j".WÝzt²sˆ@4NŒ$O›ÍFeeåat¦pVƒ®)œ7cÛ7ŸGÓfV~üº€Y¯}ȶõEL¹êRœ5ab«œè7j2Žª2¢Ìª¦áv»ÉÈÈàóÏ?g̘1‚@y>üëéÿPàôi²m³‡ ®ºÑ=FÃŽ%\rýÕ¸œpÎÙkÐ4t.üðe>×?ò,µÕpßËOá¨ôSRàç¬óÎC¾à<$C8ô£ª*ƒ¤¤$æÎ»ßúû£iƒÌ?9ì€ShMeË®¥œ=òt1H^§!÷ÜsS¦LÁl>öB®º(¡Ë&]ΦlØLìÛ~"Ô]ük³ŒRW·7MgEEo¿ýöa¯Ý˜LZÖ¯Ì^ð‚nAÓÔHQ•  {°¼€ˆˆ ¨Jˆ¦"ŠÆHÈÒ ùæ«å˜MfÂp–`2ƒÇíÇ`0“ÕDÄbŠ#%­)~ŸZ.<¯=Û¶îB³Åc°úÙ¾!‘}ðy}G¼èa¾³ÙŒ¢(ÄÅÅ‚©æ”Èb4$³ÝÆ !ã±FEQçtb49æLìQvT-„A6àö¸8ýŒ  QÂé©aÒ9SWã" ¡è*qñшºD@S±L4oÖ¼¾#jhšFv“æü¸\nÚå&S[Wƒª¨ 00ÏA Ä` ùü‡íòm›7ocÆŒaëÖ­7x7mÚ„M«âíûf:¿Õ¶®žÀéÇ9Ä™Z¡hþý,æ¹üÂ3hÞ&矞¡C‡RUUEfj_>[½ÚóAâÙó@D¦&¸XcsôúÅÔõ æId¦‡ô{öìÉœ9sÈÍÍ¥¦¦†„„Ôc¼²ô? ¼IñÙlعˆK.Âï¿/l¿ï¾û¸ï¾ûHJÉàì™Ï‡@¥ª×TŒµEˆjŃpý¥·”””}òx”´?Êä篠cä š*" "ª®" "š–@QtY I’Ã$^šŒ^_•›˜h‹Tß ‚ˆÙ"!Ьf¢Úw bíìÚUHFZ$¹‡3DëÜNXÍɬY[Buu5_|RÍÕWHG¼‚ `³ÙØ™—,…ˆqw&ƒPÏË`4D1œ¼ïq…ÿƃ¸]u x=^DQ —À  !<Gum$±C*˪ÂÙ’„ E>ƒÝä: é …Å…èºŽA– )J8,RÏŒ¦ª ññ‡%¹sL¦ÂõÓÂÃÍcu¹\Üzãµü|þ’×™|ÚÅTו ö¥âp8˜8qbäÜçœ}V£«ÈLF+ïͽŸóFMDQƒôÒ´HÕR¿~ýŽKñJØãÕþ§@× ›xü‹¸ùÂ7¹ó¦ÿà÷û …Bäääpÿý÷3qâDn½ã~â“ÁdiÜêqd¹£‘x©JàØ~¢‹žìždÏ¾Ž¼ ÞÅX³ëˆïoÇŽäææîn9r$>øàa«Îë ´ÈO—®é”W2ùüsyù¿oпW¾úb1çž?¯W!==Å¿.¡}n;¾ùògëBa¾ K”ŠÑ`@Õ4’¨ªr!KF¼¾r6oô£é*~w-iIIøÝеS;–/_BVfJHcÛ¶b¾š½‘ÔÔ$âÌTÕÅ#5ˆˆd¦GÓ4+îOàÇ>||²‚¡`dAÑ4mÿÏû  ë:²$EÈvô=w¿ûkz=[C0]G×5’S’ÿÖ—(55•AƒÖâA  --í ƒ†Íƒ¢ª‡Xö¿Ãa' …‚‘ïÉàõ×A·q€b³šëWlôì>Ž…ç|d‚?àæüQwRã*G’¤È‚å¼yó"\}ºçòîmW!»æÍ›7Ó»W/jë§Ä¡„.š6ÿýVPì¼ä²>¿ŽÊ~W¡ G–2´hÑ"úõë·×;q¤’ÇãC– ävÈ!WOÁë)ᬠÃh›ÛŠMËhÙ2ƒysç3n\’R ÄÅÅ¡©«ðý· yïýgyõµ7iÑ¢9 qX,Ѭ]·–ìì>lX»ÙÆ<«ÍNÞ¶ÙÙ6 vѦuGœu>,Q~\»Tš4MÁçóàöÕ ¶ÃwÐö „çdý“"c‡ýâkëСÿþ÷¿#uë±`0xH¡Ë¸è##Ði¬©jI’‘$#à;έÅ¿BRZ“Cb¡?ÄlÚ~Èì]¸çÖ6ÄÅÇîó™×ãá¶ûÖ" G¯=ËJ ùà+ÚÃþîÏ+>`üÀkð‡vó5H’„ÛíŽ0òµmÛŽ¶mÛ5ú˜¿üò çž{n½(c#€ý8 ¦ŠÍ8[ &dKDöY†Cuuõ>lu‹-âôÓO?$Gž¾›Ž¦‡xëd‡“¤¤xþŸˆŽŠãî»Þ&66K§=‰ÙhÁës‘˜BH b²dsö9w`³Ùùþû¼z†D‰ ?ˆ(‰¶Ç×ë¨ (ŠåD±u[--[9Ù°ÉGLŒÈÎíÕTUæ Éuˆ¢ôXÁuØŽÇ?\âĬbÊÎÎfóæÍ.EŸÏ·OÊÍž–žÔ’:Oå1»fM׈³§ ‹†¿¡ÅŒTgsöÌW9Zc‹=ò·M'®Wß}>+ܱ‘Ó®~£’¡`8¿9à R ²t̶ð~&S8Ú`ÿïqƒA†Ço¿ 8ü°”„¦DG%áñ;ÿ*ÑC#ˆ'§ÙŸ^CÑøG•Ã'—oÑ¢Å>3@MÓŽ¨ˆB%¢¢-a¾tâcÂtµq"š¦ÓÔNË‹µ‚.¡f5Ä‚ @lL:k«_ÖÂ)²¢€®i‚\Þ ó‹·j›B­C ¢,…Š27º–Lzfví›RZRŽ( äí4a±˜N&à=ñlöìÙœuÖYìܹ³ÑzWF£‘üüüH.ç~7±ëw.¢iZî1»öĸlDñïyù5U!è稑·|"¦ƂN‰\úí'üúëbä zž~9?|õ 3ºƒ7ÿó<§s÷^1•ìÄiÝ&Óo@\.7¿ú qqÑ´iÓŽlàšÛî$[Ï}øöÍ¢ÛÿJ*»NØ>-ùj(v+RÐ…~sŸ>}p:{Ïq¢¢èÙ³ça«{÷ÖlÚôÑ?'DNÙÑ4×—|¹ÑhID6…umÑ"©™"{˜cÀ+›(b4‹hzxÿã_`‰œO Á€ñgÓ¶ûHj* …TÌ$§‚ÇU‹²’˜Õž˜&½©ª,¡¶ª‚Ac’Ó¦®š2žºïZ¾Ÿû"7\{øŽŒ˜I$<¾:ªëŠOð^-ŠI'nÕ'GÖ¯ö£¹Ö¹sg–.]zÒâÄ)à=ÊÖ­[7~øáƒ“ÔüÙÛk„Ø¥£®”„Ø,ŒË1»ö¦iÙœ¿ä¨3\µDÿé§3‚p³fÍß+¼Ÿ,0óìÑ,üî#î¸ê®9½Û~|“EäöóúrõiXûÝî¼ /Ïßz5ÚY(Ù´„?æ=Ë7o½@P­­oSˆ‹3ן+–±cï¢Y³ëøãRRS£Ð4¨®ÒiÛ¾-=F]Ê–0°WÞ}y)IÉé¬Yú;WÜt§ã&LfÃê”–èôyg]þßíÔyg‘ÂÍ÷= éõjʱ@t}Yó¡_­¤¸,$I>boù¸z½~'šÉN0®ÉawóæÍû¨ ¼äÙN…޲%$$зoßýjLpZÜHyw»5«9š`èØ,~‰¢H»r¿ZXGf*o½5ï¾›¿‰bX{ý‘G¾¤eËœúj/pÖè gM=—Õ É“xñ…gióÛ*ìMúpÃÌ»øàé»HÌ¸ø×Ó_pÛÕS8ꮾù"~\¼•={b2Á7³·Ò"Ï8òò*x챯™8.èàqëØì1 š0šrØ$M·§6 8ž •å±L¾æjªÊ4Zæfã© ßNœ]Æn ‘Åbà‡~DÓj2¤ pèE­µ[ò7ÜCUuÅÑIIÂl6CIIÉQct«ì{91ë¿À—Ñù°¾·xñb† ²WL÷믿fàÀ;ö)àý²¹¢Æ‚W("11ñû íq!ßþö_º´qLTܾ¶,§çIx|uGå˜ QŒÙa~>ºþ%dž{ëóÈ'9†³k«ÎбçeaŸy;åù[ÉnÚŒ_ýÊðs¯%9« y% /|ü;­:%óðÍråwP[­ AßÞÙtîÙ€Áƒ[a46 غnëÌÌ,‘™Ó/¥u·ìZóŽaÓ/_“Ÿ·‹É—_Ç’ï¾á´s.äë¥ßÐìE|ñÁOtï;µ+–ò»8ëâ›Ñt@@aøð®{î¡Ó¥²[ÚQCGÒ™ŸŸÏƒ>Ƚ÷ÞËúõë),,<:³âÇV° _F'¯®®nŸ…æSo½í*Þɇ_¾QE)\"„uÎÐA¬/¢Ð%Iö«4äû õ?{ªu‡Kû¨Ÿ–…륒ðr|]D×µÈ>ÐÀþnCž¯¦kõ_ÑÑ4 Y”¹îÒ™kƒ~õÕWŒ?žíÛ·7ºÃ‹¢ˆ×ë=dg¬p좪¶˜¸èj]GýÚ5M£o‡ e3êŽqK‰@ƒWü^ŸØb’ðºtRÓ´–ºª‘œÕ¿ ½ú ÚMwO{ówhœwÕíÔVïqÎh”‚}¶}0fê=l[ô.Y™Mé7t4µU*·¿p÷_u1o~õ½Rš±½|'cÇ_I·¡gÒ$§-¿~ó&†NGQuŽÌ¡”±ÅÙ *î£Þ²Ã† Ãår1eÊvíÚuÔ<^É[C06 Íh9,沎;î#ƒ•““ÃSO=uÒo䉄A6œË)#I’(G&dÉ€(Iˆ‚ˆ(H’„(ˆH¢ˆ$‰õÇÃßüÿ„µ{„óèdYWÉE4ØÂ”¢þ-Iõ×Q-býqô‘"’d@@81Óqa&“©ÑåÅg½‘µÛ~®ŒŽ¾õh?†x䤙z:Ž­¿2â‚Û‰ËlÏ/_ýHÏî¹|;û;®ú׳̺ýeÞ^´“ën}“{_|‰P] Û·leÒŒg0áÂd:Ò™‡Ï?Z$}wçÎÄÇÇsÅWuâxQñ£š¢ë;½{÷Þ'«!--ë®»î”Ç–HÓëéõz¶¬Ýì‚ BEDCÐ~•ĬT¬¶¸z.]Q@ÐU­^ÿLUt]CU²Bº®"èa!\VÏËÐP¬j >¯IÑPÃÞ° ‡Ï£‰á$êúê¸0<ø±Q`QUéàÓ9/Õóü}DO?ùì°¦w²,ïC"rÀp€·†ÅkfsÓ”7)©Ú~Ô¯¿´j¢(J­«ü8uCkVñÁ+O¢k†QvŸJèµþ²Yäá«ã÷y±‰¼õГ ì>WÁkO’žœDQYu­$¤Fñù; (*/=þÏÞþ]\¼€e‹ÂDËû=¯]¾}È;u8Ü<þøldÙŒU2þå–+**æ—ßñç̹Còù§î+¸ªk\qõ ¸\G–½¢‹òa“Q †}Þ̓嬟\1^=L©(¨ÂõÝ:j=áÈ’ˆËã'+;‡”ÌLþ@½Ë\Bˆ<ý0ñ° ˆèB}(¡&uAC¬?DÂz¸˜†S ²,á­s°cÇNL²´çŽ ±p´¢Ö ZýgûÚž §«6Îæ‰Ëÿ…@¸b&€Ž©>]Ú‡† :1ˆÔ¢€„€¿¾xYCdžH *1H8Ñ0„Ó³ëïÜÆ¤»¯fø³ß™uýY {ÚͼÅsÏ`Âàëz¬WDƼ–-»þ 9.û˜*ï¶J%ÿnLKñÀ=osÑÝmÈŽéÕˆýãö‹LËjÂç/$צ)¼?÷)ÚµlIç–{}- œòÖ»‡°¤ÏÁô¨¨dÎ;ï?¬Ûº„_|ü‚íÉ+]øó÷ÜðÆ[T”í¯_í‹‘[6Ñ‚¿yÿпÔwëÖ­ôîÝ{¯*µ¹sç2dÈS‹k¡€ê‚¼0‹ Êa=" ]¯ÇM—>Ch×5‹ ×Gȯ" räeÄ+:º R=l—]@¯¯7ÿ r÷ƒ®‡9䕊ÁM‡n=qVV±eÓF,#:æ0À  «zX«¨¾¬R<@{FÆn Q0¢âC ¸æÞ8n½·’¦è,ÚÜ‚ÝPMZk@‰HÑ&Ö.Rxíõ*”b`âeq4k¾‡nÅåèÖÏ‚ÙNæ~æ«„²Ø±£ˆ±§™öÑ™:233ýÐ +¶0¢×%ÉtÔ‹| þx›ëÎ{™ÊÚ¢ãñjLU^"wÏú KÂDnú¿fñœ€•W?ú†X»Éc.¨ßæ©ÿ±ØQŠ©ùá ú9(ŠBqq1Ë×þLV|—¿ E‰Òb¨*m\詺,±™Ä‘ñJèè’1xxe¾K–,aÔ¨Q{¯Ñhäd¶ÈS×T -B zÑT?ª×MÀãÀ묠E»\&M»‚„”TB>A0 J".§ ÉdDAã«(Šˆ‚ A”#Ûu tш E‚þA4¡ 2º`ÜÃã ¿?ˆ(P‚ –˜húJBB ¥[WP¹c5•;wP[¼ gy!u8+‹pVî?Nz0éèøLŸ~MßÓã¨)×Èß`òù©ÌûÄÃåS iÚD¢¸º5æ.Q¼ÿ|Õ% g¶³Ð¡oË¿v’žn ¦X¼r"¾÷åaIv‡B!âââÿЛ%†µÛ~!ÊHÚÇÃ5MS¹~ò«ÌùåTíÄÉ1Õu'º®óúË¿õÅçÖ‡Ÿà²s§0iL—zàßÓ=´*®8&÷!&ƒ —§ú(·˜ÌbýÚGx-Äh1NœW3E#»Ê‘ü®ÃúžÇãÙg€éÑ£;vì8jê³ ÆpÜ5¨èt>–”즸ÜnÕ5¨Z˜tM#&6š`0X/¹CÄ •D9<…÷`ۭ뎮é‘)Ðnc±aLE×tl6[¤|T<Þ‰i錽d¥ùy,ÿî  ˆ¢PCŒÙ´ÿ₱cÇRRR²O®¬üò©“ùßzyø‘xº ÚÂ3weÒ·×zº3‹¨˜$¹­Œ’?~óÓº·•6ñï[²¹nB1g_ÏòÅ:ö4±èwÿ^P••µWù«Ýn?°ŸTOˆ²gH¤1!Þ¹§óñwqéPVwÀÙ#±²ê<bÒIŒÉ ÆUÆÑ@<»ûîظ±„p%ZéIâîÿ<Æ£·= ì<€§ªØQHÔÀîùºC¡ G` ¼¼ ³É†ÇWCP !p‹d#&ƒ£y4©Ù"7Ÿ=ž>#Î!³Mv,ŸÇ†•?‘Ù®?çN½ò×hÕ/­#‡ËêÖµk×}bÍf³™fÍš^Ð "h&t]£I§”SVRPŸÁ ÉáLQ@Ã`-KHb=w¯d@–eTœˆ¢€€X_ÅC$AAdK„9~u9ât!¬,,€,†‰‰uÀ(é ÐÉ)M8÷ÚÛ¨,-gÉWïcÃyffÃþÁaôèÑ<÷Üs\sÍ5û|öý·áqûÌ*Ò±ðÌ,Q˜xö* ˆxýe&ò× $båÅǪ1!òÎ+5øëãÁÆ=¢âgŸ7š3fì•»h0¸€f2™Ø´i­Zµ:¼AS˜4üÞ™{/‡Ü€ÓS…$ÔlQéÔrÏ}<ƒ[.z‡’Êí{g5ëÿºƒw¾<ÿ/€®Æo+¶pÇÕ×Öƒî”j³HdwÚÛ‘YMM ¿ÿÞEQyùåOA•ñ<‡•™b6Úeßþö& “h[ª¦RX»”†°«Áº #˜bøîãçIŠ‹¦Ç ±œwí4vmûk +è*iógQ2ú~ŒŽüÃúnÏž=÷Éjðù|lÚ´‰¶mÛžìÀ«Rƒ%´Ûò6aDDÑ4Ò22T‚®…%–ëuÎÄzÉ]±ž”¼áµ~•ZÕ4M©çÑT-rzMSÑ•šª£©j˜_W4 *ês{u•PHUG4ìQQ¸ÝÎzoüÀÿÅ‹ï¼A4žü ƒm«½´îhÁ è¼ò¦‹Ç®Œá¥GkY°ÂÁÿÛ„NÌ-Ä'JÄÇ‹ÜÿPuuðÚƒ5 EIýb…ˆÀ'uX1[UU#ä:G4ÔZf÷ S«¡¼:çRšµ<ßÊšBî½ü î~i,i‰Íù»ew4]Ëus$ô•:ϼù㇟Ec œ¤×â[»î¨ÞC­«‚ìÔö‡ˆ×ê$ÅeñüÇWÓ2»cû_AJ|Êøƒžý>‡šJ=££“ܪ?Þ*VRçøkÏL5GÓìÍs¨ê=íˆô×V¬X±Oÿþ3iÎÉ ¼ºŽÓåÅT¨u{ÃD¥ºÖ–d F!EÃãõƒÇë¥Öé¤ÎëÂ à ø0EY(©¬Àãñ¦ª˜-Ü75NeeTUWc2›‘$ ‹)šoçüÀŽmyøÝ^ô  º‚¤éüüÃ2Þ|ñ3‚~GM ÁP`0D @UÃÓCIPQ´  ù‘åw°ýÅOeÞ~¨š»ïtðß{«x`V£ñÑ«-è°“s®ÌÇ[­òÃg.ò¶øy÷™Z*ó4¼ó¯ÛEi^®#m¼ô ƒŒÝ‰ulÚ°ó°âµ~¿¯Ì‹#ŠZŠNw·^ô.os[výA´-ñ¨eeM!÷_5—^=“ô¤VhÚß)¯¤£¨Úo:Ý:4›Ÿ,µvp4«ë+k H‰orPÐMMÌáÉw§ò¯iáöÕ6Ú3ܽŸþ§ÿ4Æ ’øÛ+ì¼ð= Î# ï,[¶Œè轋.ÆŒsÒz»{…DA=\˜`4ñ‡BH²ŒA–q»] ‚ ‹ ˆ¦ª&]¬XÖÕ:ILLDUÃáAq¹Ü˜ÍfDY— B˜2QpÕVóô{ÿ¡¦²š€×‚€ªkC CGôfÒä3(ܾ £Õ zX N×C€A{Š.gÙh@×5éÀÄ4wÜqGýt?@ßá ˆ7ç†?ó»Ýûž{Ùn±ª¾ÚÃSñÿžØýÿîÿå+MHUÕƒ.¾5úÊù ïyIñÙü罩Lt=) MñýEÁÂòê<þïüWxó«ѳýXbÒ˜ñ`2™øý÷µÈòÑ.Rq»½¬Y»…êQ<øêºÅbÃã©Cet]cöK8wäY,\¸ò°ÎjÙ–ï—- ÔÁ3±QZZºW>tyu>-²º8ÙQJ|÷=;˜+ÎzŠÊšÂ½$Ëÿl.·›?ÿŠ£bïÁÐf³QWW[O¾Ûòvîd|»Ž¸¼‡¦-Õ%±k?§º÷4Lµ…G,ýÓ ¢±Wè"àd6yÏ‘2¤„0Iª¢ « H2ºªa¶1Édƒ€(™H2«x5;²QÀépb6™ê㫺’$b4‘$ ¿?.¢¯Ž½.F%Þ™{7×O~²ªûäå1nÜ«(ÊÑõŒ%IDÄj9–9çS^}ð˜óê­ Öc&Õu%$Ĥ“šx?ë„Ã~þRÛ5hiÃ1¸DDçÓO/¦¼¼<ÒîeU;‘0e·šíÌzíl®;ÿ• ›îi7Ý<Y±ÍÞÛçÍû–ë.»Œââ½ó°…A](­¨F>Dß E§‘ùÅ-”Œ{ÙUñ—$Þ÷—ÕP\\Ì#<ÂÌ™3OnàUUMðú 45€¦¦C(¢®p3M³‚ìܘ9wžÂdPL/,‚-ÝÔ‰”kªîhõ?šP¯¬ ˆ²ŽßëÇd2t;øïÓ¡…³ÏèÙ=A¦PV\†ÅfÁbµ°àË B ֣Ʉ® 躀ð †TŒr˜ïP…Ëç=šæt: ÜÌf36l M›6Gõ:T5„(Jœ=b&Q–X>Yð$o-çº USðøê„Ãê לó"ßüú"UµÅLŸðå›Ã³&‹…ÇÑ/7EMS1ˆFÊÊwâ:„X(ÀQSŠÓ]Eiùvz厧®®ê°SMnÕEHþZ8‚Rs§“H; ‚@H îëíjšJH pÕ¤gغuK£ûÚþÌëQ^é Ê±ïç]]C‰J"û“äO~ýˆÓþl=zôÀåÚ{v²k×.î¿ÿþSÀ Á ‚,ÊøƒADÙ&šÐÑñû½˜¬&ª*ƒxŽÚ l±8J ˆO5’¿³4A#)Tbc­¨ºÆŽÍ[X·d6»MPu&N²‡‚¤¤$k¥ÎQƒÕlC6Ë(j˜¯!!1ž]ye‚†[­aŽ! ^“$ j"~·Q>ø*÷o¿ý¶ßiÏÑ´Ÿ~ú‰qãÆ±bÅŠF 6äñ+SÕuîJuDZBSÖmÿ•—D›&Ýéßy"š®â=Œ¤xAp8KéÖf™)­yýËÛ‰²Ä0nà j]•Ç6,ˆÄǤãôVt cD¥zéú¯8kØÍÔ8o@ÐŒ6:ÝÝM† 3!üÅ‚«Ù^¿@¶·e$·¤¢²üëÁø¦¤þð0¾ŒNŸþ¦ê<8 ¹áû“s:¾êÿià•$‘(›“Ɉ¦©ÐE#}(Ùœ;àDÎHB–c©óãÓðZµi‰¢ª ëá]SB†T9@rr£ÎJÁçó¡ë d Hˆ¤d6çª;:„Ért Iñ¸}¤e¤!ê"®:7Ó®¹ˆê'6ÎŽ ’hÀã(Æ' ØL*¢(e;ìXÓÑ6EQðz½‡ãUeŸÅ‡ca¢ Rî( 9>›É£n#16ƒ¥æR\±êÚ2u?‹VÙݨuUÖ“­ ‡ i”TngD¯KH‰o¢՟³jËFôºv9½)«Î?ê\²dÀf‰¡²"ŸØ¨äƒîk2˜Ñu “Ñ GD¥©‹ÜMr0ÖŠNÅøK¨eɈÉ`AQ÷^Õ×u·¿¾‹¶-»Wtb+Òçßj¶S6ü6ŒŽüâ}<”ýñÇœ~úé{å±7ŽGyäð†B ÁNëRT‚ª“òb‹ (+q€$! PSS†,›TšÉßQ.–¨/‚¨Ú%1œ„¤$s˜ùL’)+sRVU?2ášcA çìÊ¢ B8Ü!:N—›¨¨XÌ&#ºªô±Ù-(ŠŠ$¾`pÖYgó‹‹#77÷°Òe—«áh˜¦«TÔ“žKÓ´ö$ƦãöÖòùÏT¼e3iIÍéÜjÙDëÀž˜ TÔЪIWº´Œ€Àë_ÜE\tÉ-éÙþ4ÎrBŠŸ¿ZgÈ¢·îÐÀk²áxˆ‰J"9¾É º’¿–êža.ßü—AÀh´ Õ;'{Zbl&²ÁDIÅq(£Õu”¨Ddo ±«>BTC”œv抭k ŽŠ—»§­\¹’É“'ï¼§<Þ†m0E,f3!M!Ö¤€è4\„p»="ÄÆFáõ¸ñyØ£MXͦ°¶¦!I2Š®¢ë`04ðù}xýJ=¹ŽˆŽÙb ˽èᇠ4ÄðTA †B»Ã¨ªN0"h5á †0™¬ÄÅE¡**a†I@ðÀ+¥Ã‡ç‡~8æ Ú½{w^}õU*++íí©ªº&ÕqõzêºpªP¿Îg 1QI¨šÂƼßX½å'dI&=©9v[[ F’d¼~!Å!²;àR¬æX$Ibîâ7)([G³Ì.´mÚƒÔ„f8½Õ(Jà°X’ ø‚n\ÞjààEÑÖjÝTÔЦiïý¹(P®ªVÙa21¶…xµóC(šNv”ˆ×8„nAÛÆÚ–]KÛïJž‚®jŽFPCÄl˜‡­pý¯¢rÀ5È®Š£Ë=Y,–} «V­â–[naõêÕ'7ðFÙbhß¶'ƒTÓêÈ´0Ë>:’$¡«zØ•Â4’²$#ˆºÎ,©*&Y óñ "FT&4U ÇåêÓDI@ÕÂÇDQÑD UÐë«Ü"o‚®#Šáý4$ADUUÌæƒ×‚ Ž[£fff²iÓ¦}äNød‡Ãq\ sˆôÈ´<3¹5™É­1È&l–BJ€Õ[àñÕQU[H³œœŒŽ4ËèLzR l–XÜ^¾€¯?ìátk;„^¹£ˆµ'³£h-?-ÿ€‚²ÍDY£éÚf$Í2: ù¹X`ŒÔ¹««MŒÍdùÆo )~u;o¿Y…!3mfõF6d:®¡‰B‰Ø4Fæ\ï™Üyíe‡¼.“ɺOèÇeï2=ëñ£êÕj¦(‚±™Ø –·ús‚ñÙø“[SÝc ®ÖC@בݕ‡Í¯{¸Ö¥K—}×<kÖ¬9åñ¦gæpÕuüÏÞèñµ/¾ø‚ &°cÇ õ³ÙLaa!íÛ·?aÛ/¤"`Ü<³K½§,b·ÆcM8=UlÙõ›óG@ :*‘`ÈG|L:m›ö&ÊGH —ILT]ÛŽ >:•W9?.{ŸâÊm$Ʀ è™;†Ôø!ï~µßÎRªj‹Â|Ï©Ð3­TÖbMx®”Ó(óm¹•qM,Ì/òsz ÙÑ2y.…/¶{še¦gº™oó|”¹B(¢ˆ “I"Ç*P5tŒª>¬sW’‘´·§F³ÌN¸<Ž#{8‚€jŠF3˜‘}µDoú–®õXç?N’n¥¦ó™»C]Æã,'¿¿t2Y–Jîú?xÿ×í¢‹.:.çi(JãW¿4×þi¦ëNÏîô¬¬”6d¥´A ’‰([Š¢¨|3;‹×P\±•²ê<âcÒÉJiMr\2SZ3¸ûyxýNDAÄnK ¿d¿­Ã¦¼ß±ší´jÒƒæˆN ÖU‘„R”ÇÒ]^6K Å[Ì_!À¼"…~-M<¾´Žñ9&ÞÛæ!Á P¥ œÞÄ‚Òø<ÏÏÓËjœjbJ‡hXî"ð1"ÍĆ:…˺04"4Zã*'16k¯mùeèÔrèCS‚ˆ.Éè¢ÍhAÀPWб¦cMæò  éøÒ;HjIaëñ,*0Þeª¢ ܈÷1÷ld@“É„ªîž1ôíÛ÷ˆùINï?Äjkk}úauªP(D||üÿL{ëºNPñã¨GG%•HóÌ.d#“I”©sW±nûB<¾ZjœeTÔÚŽ6M{Ó+w};M@UC‚ÄÖ‚å¬ÙöE;Ù”gÀnÊ&#©Eå[XAúðúXÍvTåÀ ¯.?,+à×à’ Lú ”ÿœ—ÊyŸW²´,@iM¯®seû(¾Øîåç¢-”*h:TøTžþÃIê°zµ×=W˜½!¼&ŠÔ<$§wÄô IF%~Ü0‹O»‹šêm ˆˆ¾Ìå›1¸Ë1Ô!{h+JT2Š5]2ŒoŠ7£ž¦½”ñH~' •!3ã˜øÀ]¼ñìãÌŸ??\)ú7Úï¿ÿΤI“¨©©Ù228™í¤ÞÏ>ûì¸y¼M›6å /<¬¼Ü@ ð—¹þ)R‚„”ÝàÍ2:E@*ʃÙE«œeæ²µ`9‰±™?ísú1¸ûùü×>›A]Ï¥¼¬ŠÏ|ß…®«Œì}1Fƒ…:wÕž£N«ìî”UçGòy÷%à±&, q¸‚;м9*‘íÅA^G¬EÄÔ©a‰¶Ë»Ä k:΀†Ú)œñs™ÑÑ2·ïØJô¦yaf½ØmXxÔUP¨) ®h9V¿ AS VúWn#øó“Øâ2Ô º9wN_tÙâ 1èAP÷PÉïÿ¾|Cß»ï¾ûðù|û3_³f _|ñ^À;oÞ< tJúçÙ,XÀ¥—^zÜΗ’’Baaa£K†5MÃb±œÔ¤! ãöÕâöÕЪIZ5é$ÉÄG§QYSȲ ßàpÔ°hõ§Ä™š3õô³«lqö6æ-á×Õ³IŒMgH÷ó‘@ÐK»fýëé,wóoüÙ~¥.ì5Ë,.ôÓ"ÙD¾SÁîP4¥eAú¤™i:Þ Æo¥ú¤›iwˆ6i¬µ´eD§3ëÁVGÐõðßõDýè:Ë6|Cl¯K¨sW@=ÙªïþM|óáÅkQFDäƒ,4ÆÅÅ"‹ÂBtMã_·ÝÊUWNgÛ¶m<Ž”U:Â<ÙÚG0 ÄÄÄ`6›‘eÇI—4™LX­VEÁçóQWW·‡½W˜NIÿœÀ»eË–ãv®9sæ0qâÄÃZ\3‘œœÌ)ÛÛTU¡²&¬ØÜ"«›‰'‘bÏå¹³Ðu:w%ãÍࢱ÷"KÖn_ȶ‚åØmñ\8æ>¾ÿýMº¶I0tèÜQ3:’ÍÀSKjh›j¢}´Äk;ü J6ðÕ7Idòœ*†¥‰2 ÷P*6ꡃ‚@­³M EÁnK`tß©´ÈìŒÝÏSï_JVJ,&;þ€ç| Q2/þTÉì^ž‰—yf—ôX#±f‹dàîªé›a"Ö(PäVI67¾Ø@ ¸<‚Êî`ÃŽ_éÒz8ÎÃÐ_KJJfàðѸ’AdÅŸ0à̳)ͯÅl6³~éÏ¢N³&é$d·C1›Í¬ûãLf‘.ýGðëx:þÚ9mûo“&M>|8/½ô:u"&&¦~ TQ%2; /rJ‘Ù]MM «V­bÀ€¬ZµŠ¢¢"Z´h±ÏâqóæÍ™1cÆ)àýg˜Ô‹RRj Q¢c K·#1úOÒå¡C‡òÉ'ŸPZÚxîÒcÍÕð¿f±Ñ)hº†?n³òê|¢m ŒpÉñYlÎÿƒy‹_eH÷ó9kØÍÈ¢‘™ÏáŒA×Ò¿ó$ªëŠ#}) êdØ5ˆæé|vA H8®µKà×Á,Bmâ P§@´ ne·XoœH ôà FƒI2ÚÃóÞ’¿”žíǹS±}9=&žÍëÞ‰9©5žm_0ëƒO)¨‚—n¼O] é]FâXÿ Ï~1›Ï¿pâóèªV" 1bIJ³³™?>ÅÅÅTVVRUU…Ç㉄ŒF#6›ÄÄD’’’ÈÌ̤wïÞ 0 ²ßïÇb±ìnø; †No} Ižžó7Þ1ÊŸ “è5•ž‹ÉÔ M·!þW8Ži4&“‰”””}bZ‡RRRN!j#­iZ.epº«÷yΕ5E$Ĥ3uüØÌ1|ôý#˜ŒÞ¾¿¾û7¯|~#ç ¿@%ÚÇêLM~iÏâˆPý‘°âPÿÛøSýÿ{,Ì]:Wž}pv9ƒl$!&=¢ -"ö¨Dê<•GÜMÚµæ¹Y³PÜnV-~TÊÂ5^ZÐËc_¾Á¸–1Ë&ÊJUj*KÈÌ8°¶ŸÏç£]»v¸\.E¡²²’œœrrš…µ% Yi_ ᘯÉh$TŸBYVV†ª†yºEQdÉ’%L™2‡cwÜú«¯¾bàÀ§׎·iš†(ŠlÙ¾»_xŽ$2¢cxøqžzêf>ýô+&5‹¢Ù¨W+„¾AƒÁ ÕÕÕÄÇÇ7:Üp2e5 KŽËfÃæ/)«ÎÃl´í—é+¤©uWÒ»Ãé´iÚ›{_Ç€.g£j]¨uW°9ïwt=·ÏÍÅ#zCHˆÙ­tm³Ä`LûÍEÖÑ1Ê&¢m‰Tו°£h5þ€w¨4Â)\[kãŽÇîÂYf{XШ¤ h\óÄKl]©ñÞ’µˆ@~N÷ÞmøÃýÒfùö㘬á0BLL ·ß~;ˆÍÉÉÙí¡Ê*ì¨ÆW¸…¿¯§m¶•íÛ±hÙzê&LšÂ¬;oÚíÝœyæ™(ŠÂÖ­[ùî»ïöšÕ5Ä|{öìyXa¹¿Š9ÿùÏ4hÐɼºOU âóúyöÙg˜>ý †µíB‡nÝøìë»¶.¢Uç³HÎNcÉÉþ‹nÍZ£©:‚tâï?üÀĉÙ¶mEEE|!TUmtÄÉnƒ™²ª¯Fq^]ÆÔ‹§`´%†´ädžzê)žxâ Î;ï<.¾øâÈu•–3ÿó¯Þ³º§³˜Áö‚"Z·nÍ+ßFZ¼…Ö­š³e뎈3±råJŠ‹‹yñÅyà(.Þ]1·k×.† r\ûÎÈ‘#Oà àjáy‰®k¸Üu<ûÌ3Èk®½ÏÅ%çO¡wÇ\&ÊÅÞÃm÷~ùêC@'HFžº…º®ŸÔJÃÇ4Ô ë:%%%lÞ¾“‹Î™Âï‹"k"“§L&&&ž7ßxÁC†°bårΜ0M¹ÿÙÇùmÕî»e&g÷ÅB¨þB…H£VVVVØ ¡£ž²ÆÆêTRâ›ß„¿„Óú˜Ìd°Pë®Àh0ïáKT8 ˜2úî|a=¼‹kéÁu翊Û{ìfUµ…˜Œ6\õç(©ÜFÇ–ƒHOjÁ¬W'rû´øNïC{K¢DFSpÖÖ+[çtλér F°ÀQ …ùðè ·á @»Î­¸úÞ©”CZvø{î(•AöWÊàt:©©©á«¯¾bÈ!dff‡¦…YeYŽÈ}9 X°`III‘Å´ŠŠ 233÷Ú… 2zôèS‹kÕTÂia ÙκZvìÂçõg5QW\A“ô&lÛ¶ §«–ùßÃåWÌà£Ï>fø°¡<òÜ3ÌýíK÷íÏ‚¿ÀjNƒÔçõþ3`·¤¤„¹sç2qâÄFß y÷“Í̦(j]åDYbª,b1Û)®ÜV/u¿·wWYSÀÃ×þÄÔ{[óøõ‹¸û¥q\wþ+xê«ç޶$Þú_Y2PP¶Aù÷ëçpÛ%RÓùt]×iÓ² ÷L<íÀ|å:x¼’’’Ú5Uá¾§®®v¿}òÚk¯%;;›;wò믿²iÓ&ª««ñù|oVÓ´H:Y›6mèС7ÜpC$œa9¬k¯½v¯|úãµ ö?¼‚D”æSTXDl\Íš5«çô³Å»ï¼Ã%S/奞æÊ+¯t6oÛÀ‹?MóæM˜ûÎ×Ä׿ Š.ß « ÿ˜]¿~=?ü0S§Nm4ð*Šò?E’s<¬k›,Û0ˆ³§â8hÉ’é ^liÕv¾f÷½rZ `Ŧù´Êî~ÈB‹Ã~Ñ$A%€/žÊ[Í1$Ĥ³lÃ7ÜtÁTÕ5zÖÓµk7ºvívðŠÌĉ™3çáCäìt÷ù]»v!I:t C‡þ\±Y\\¼OluèС<üðç€÷¯ZP†·ß~™­Ú†Ù¶ââÑ5 {t µ5¶nÙ‚×çcÃÆ \:í –®[ųÇ0flÞå]ÒcrPUUבprÌ?ËÀ¶±$è{‚olll„­ßçóá÷ûE‹Å‚ÙlFÓ4¼^/@I’°Z­FTUÅëõ ‘e«ÕŠÁ`ˆè¿…êÕ§?ßSJB¬öa4êiÍôïzëvþ„"x1 ‘˘˜PÇyNV«5òü<ªªb2™°X,{=¿æÍ›SUUÅk¯½Æõ×_yNš¦EžŸ ø|¾HìuÏç×pí‚ DÚ²¡o7Ü«ÕjP=6<ï?÷ɆB‹ôôô}€“›—ý[@×uT44à‘çžä·^äÌ!C=z"÷<ø¿.ø•çžzœ~ƒ‡²jåJÎ?ž„ÄdþýØ=¬Ú²‰²Ú2^zúyÚgtK÷ˆú!UcÔRSS­ø{´Â 6lh4õ]TT7n¤°°Õ«Wc±XèÑ£íÛ·Çëõ²bÅ Ö­[‡Ýn§W¯^´iÓ‡ÃÁòåËÙ¾};v»¾}ûF^¸E‹QTTDFFÝ»w';;›²²2.\Hyy9ÙÙÙôíÛ—¤¤$ ùõ×_©ªª¢Y³fôíÛ—¸¸8¶oßÎüAuu5­[·¦wïÞØívÖ­[DzeËP…V­ZѳgOÌf3kÖ¬aùòåèºN—.]èС²,³råJV­Z…$ItïÞŽ;¢( Ë–-cíÚµ˜ÍfzôèA‡¨««ã÷ßgÇŽDEEÑ«W/Z·nÃáà矦¸¸˜uëÖñè£b³Eññ÷’& áç?>§_ÏatíÚ•´´4Ö¯_Ϻuë(--e`ßìrýȰ³sçN–.]Цideeѯ_?bccYµj«×¬Æ£æ3làv•ldDÿsY¹r+V¬@ºtéBçÎÑ4U«V±jÕ* Cäž<«W¯fíÚµX­VzöìIûöí©­­eÉ’%86å-aò9—ÒªU+væoå÷e ñ×™ˆŠ6ѯ_?²³³>|8>ú( .$##ƒþýû“œœLqq1‹/¦¼¼œ¦M›Ò·o_غu++V¬ ¦¦†œœúôéCmm-S§Nàºë®#!!Î;c³ÙX»v-Ë—/' Ñ¥Kºté‚(ЬY³†+ •ݺu£sçÎÖ¬Yúuëöz~‡¥K—²iÓ&âããéܹ3íÛ·Çáp°téR¶oßN||<ƒ&##ƒšš¢¢¢özÊËˉeÔ¨QÇðN?ýt¾úê«¿w]G ¼š¢!È"÷={ùk×qñ¤‹(ÜUANëætëщ„Ä$¾ž7§ÃÍĉ“xúÙG(p”1ÿ×¹<õäÓ ë0!$íUýs¬ìxïï¿ÿ¾W¬Ñ£àûïùXþ Ûÿ|¯‡³½±çE‘Ë.»ŒyóæQPPÀ’µ_0eô]<úö…œ3â¶½Ä8Žc5ÇðÎÜ»™4ì4M=èµÛmñ|ù˳”nâú)¯Rã,;j÷¤¨A4Mà ‡½ö%kçà ¸8}à5xýÎÈëgœÁºuëØ¾}û? 6ðä“O2eÊÆŽ™}üÕçôWžßŸíÇdÖ¬YÇÝó=Q€÷ˆÓÉ)ìŸÞ{í=ôê6kB YÍ’i’‘Ä]wü‹¶]»òø /òɧïóÚgoñÂì×éÔ%—õßo`xûQHhÿƒ\ÈË—/çŠ+® ))éˆf ?Çs{ÃJuƒ6^ÃÏálßsÛán?Ô±÷¼ö=m@—I¬Þú#YÉ­‰³§ì÷^ý76s4’(° þwº«éÚf$‚(Pá(Økßýí°í¾– ;“–Ø,²-%¾)™Émp{kúsÍÍÍ%%%…)S¦DBA‡síõ^÷·ý@!¹S1Þ#´@ ÄE^JÞÖ•l,ÜÉ53¯%!¥ FU¤dÓ&R‡t¦´<µßþŽÉŽáÖ§>ˆÿƒ ZSSÃÚµkÿ1|£&“‰6mÚìóòü9S 1^î±0·ÛÍöíÛ÷{®˜¨$fÿô$§õNaùf¬æ}uõTM!.: Y6XþgËHnM0䣴j;Y)mN½xçÓ·Ø‘·“6ͺsçõÿÆf‹CÕÂõç’ð¿Ý Ç”ކI’D\\Ü~w÷ògþ;ﳪ¶˜øè4Zfuãݹ÷Ò¿óYûɱ²šìXŒ6|~×!étWqÆ ëùqÙÛ4Ù>BhóWÌl²‘™Ü*¢¢ìõÕ’U¯Ü|²¯ÇsrÞwƒý%§³!îfµX1Û­ÌF:µéÇãw¾ÀG/~ÌCw¼ˆÍ~©%‘úųÿmä9r$›7on4 ú‰h‚ DVØEQDÓÂ%· Û÷Â×uvj5”Åk¨u•“›¹ßý,æh‚ðvŽÙ¦i/®üŽ(ëÑ©f³š¢‰Ùƒ£aÕ–HOnÑ(9ûÿUËËËãšk®9¼Gû°Fcl½WÄ)ûnNN)))H’ĸqãxñÅÔÔTš4i‚(Š4iÒ„´´´âš³RÚòõ¢˜0ä Ê6îwŸ¶9}Ø’¿´ÑÇôú눵1gìok?„$QÆp“‘Ôæ¤îk¥¥¥<ÿüó§€÷è¶¾œQ8¹ô»ï¾£M›6deeýã®}çμúê«\wÝuÌ;—6mÚP]]ÍÝwßÍK/½Ä† xþùç¹ûî»#y­§Õ8KÉJiK“Ôvü²òÃýîc·Äî“¡p0óHMMM$±þPöç …ýÙŸãÊ¿f‘Ñ}§óö7w‘™Ôšø˜}=q¿î°¨7ìü•([<¯yk£äfI±Y |7š®2ÿ·ÿÒ§Óu%'õ{2jÔ¨“ºˆâðe‹‰‰¡uëÖÿÈ]Q²²²˜?>S¦Láý÷ßÇårqýõ×ÓªU+JJJxûí·q:¾GQ#1â5kÖpõÕW3lØ0n¼ñF~øá‡è+ŠrDWiõ\~¯1sŸÏ!?ÕuÅØ,±:^·¶£X¿}ßþö™É­ÿR›®Ø<Ÿá½.A@ =±%‚ âxPÔ“Ûã;…–SÀ{Êi={öäí·ß>®›GËZ¶lÉu×]Çܹsؼy3]t±±±L:•‡zˆôôtÆÏo¼ÑèÊ<€·ß~Axï½÷˜1c ,àÙgŸ%??£ÑÈ´iÓeEQ¿ ÓÎx„»^G÷¶£±ÛâÿäMk´oÖ“ÁÒ¨ãÉ’ »-Ž.­{QUwät²d`sþR%ˆ¦©|òÃ#Ø,1œÖwúIÿž,Z´è¤Ö]Û'̯‚ª«4ÐÔ šŽ¢ hè¸kƒT¸|ŠÑ`BŒ :&ˆv ! Bš‚ü:º$*^AÀ©‰¸Ýš$F–°'Xpýº–   ‚ç_|QÐUUÓ@ÕÐ5…€ßÇSOÝMt”¤¤D=€A”ÑT{L,É)©'D£fdd°qãÆÃ¦ã¢hÌÔnóæÍ‘¿ï¿ÿ~ ËÏÏlß´iSäxû»î†°Bƒ—;tèPÒÒÒö:³fÍÈÏÏ'##ƒË.»Œ·Þz ‹Åáhønc­¤r»œK«&Ýyöë¸â¬ÿàñÕíT²»³­`9 ±‡lo§§ŠIÃn&ò£ª¡ƒî{°65,tm3E ÖŽ¼’uTÕRV‡(œÜ>OŸÅ)àݳ3 ªá¥ :è +:V««Œ ›ñú‚”ÕÔâªóRç0ƒ^ éDŘã£ÑcL„ÐQ5³ªår¢G[@5à1ˆ94¢ñc6˜ÿí|œN7è:¢æ[Õ5]ÓÐ4…’ÂRƒ÷Ò&k0‹ÉÎ Ÿ\ËÕg?‹Ñ`áþW&’Д ÇÞ£®”“Ý, -[¶<¼»_>Ð4t Q×Ñ5 MÕP5 I„Œø( Bž€j—ÊÚ**4äêj” $&ØñTT’`7âÔ,¢ µsÌ>ÍͪD{¬™ÅK–b2…AGÓ5t]ECEÐt4UI¥{×lÚ°‘ÜvÍÐutD ðÀp¢x ӧÙ2ëZˆæCþ}:“k$xÿÉ{1Þ2˜&MšðÈ#pÝu×1xð`~þùgš6mJ‡˜:u*·Ür ;wfÆ $&&’˜˜È+¯¼Âûï¿ÏSO=ÅW\Ýn§¼¼œ_~ù…×_= þF#C‡eÇŽtïÞA"d>š¦Ñ¾}{n¸á^xáf̘q^”ÊÔÓbÆC¸æÜ—=¢&\UWD\t*w¼0‚+F|Ä€ ýøœc¿;tÆFR†Ÿ^\»ðªšÂºí¿pí¹/ "Ox9[gxÏ‹êÕ„“x»wïÎm·Ýv xwwM ™Ž^_¹#„uÓÐ@ÐÂLbŠŠ¦éø7 2ã£H³[ðú|T¹j0›@ Ö•j%`ÒD$£N`Ý6*ÓspË:)²Œ(©¬¨"%5Y@TÑ5]SÂòïšÎÙgO$&ZÀç÷#Kr˜+B@Ã×t‚ôåÜÜ\n»í¶ˆ×ÖØ0ƒÏãÄí<6äЂ( zu> á÷ûùå—_°ÙlÌš5+€Š¢Ð£GF…ÉdbÒ¤I‘)£Õj¥wïÞôîÝ›?ü/¿ü’)S¦0|øpvìØ¦iH’ñn;wîÌ|À|€ ”””ššŠ®ëÜsÏ=‚ÀŒ3ŽhÕÛåup×ôÏyúƒé ëqv["Fƒ™âãåÏîÅlA+ˆßý×hG=N¢(D@?5±)ÅÛ‘DY2•ÄóÏ izúw™Dema„3âd·JIý±²}ÜDUQë+”ô0꺦ÕOût]E×T@Ãb1¢ªªäåçSV]I…££,£K2‚( †dÙ(ù‰ƒÈëƼj1º$Pç¬AG]@Uh!ÚÚÚzVCÓUjÕ¤eÄÒºu[B¡ !%„ªƒ¦ ¨šŽª(áÄ `éééŒ3æ$ F£“ÉT.:f«I1˜DL¦ðo]Ù b1ùÑ6»ˆ(‰¨*Hrø3I1šD4 ¬Qá¿lÑámSãbȵµa›ͩPk`ukPBHHH8 •Åb‰H¾4ünݺu„ßuÖ¬YÜtÓMÐÖuôôô½ŽwÕUWQXXxÄqïªÚ"¦„ÊÚ"¾_ú&ºW>4‘q§`6›Y¿ãW F1" j±Ð4‹Í«éõncÙ b0ɘ-2’$ J’,b±êYÅ  &F_Û‚ Ç.ªj‹°Z¢¹å©XLvÎq;oÍ)ÐÝþùæ›têå1ˆñŠè( †Ætt44ALj€(IÔÖ9qºÜ,ým!ý‡ Çý,&$t“Aó“š™I^a%QrØ%‘(«ˆ×ë#55‘•k¶c²óDz•$&Æ!*ªªÓ}Ð@z÷k·¿€É.! £(:¾:7ÖÖFün/‚  …iöDA@UTýÄ‘IIIÙT÷o;vìફ®âþûïg`ÿ \pÓüŸˆî/ÂíVI¶¹÷í/yå±—HLµ±yõ&ÚµnʶMké1d£&çÕ‡ÞE²)ÝVȶß?á­?~ç²Ñg2~òU$duäów_¦×È‹øøÞˆ5bŽIJJB–e.¸àÞ}÷]&Nœ¸ßüÚö°@ÞSQÙãñеkWª««#\«¡P“ÉDZZ—]vwÜqG„û`ìØ±ÔÖÖ ÀäÉ“™={v¤ãH,ò’Û|C{\À‚?Þ¦Ef4K×Efr+nyïâhr;Dãè¸^zžÖ‚% òQÃGgñÆs«Él‚NM™hssB !M 5N¤¸ÔGfÓR“;òÞÜûX½u­›$²dÝþX?éçŽK?ÁëwRZµc¿'³56ü¤^%àÂéðoÇl6ã i$ W“2‡¯×‡ÅbQ¦_¿~ø} #’,àu;‰áÝæóæ[Ÿc¶Àí·ÞH»Ü,Ì™oƒé¢]nSrÛdcŽ"ÚEn»ÖüôÃ÷$¦§²hÞg¬]šŽ9ʨ ëœ9~$«×o iët ºŒ¦jȪ„&kˆ¢„ *(Êß“¹sçN>ùä“0­Y³†?ü™3gF<¾ýNS=¶mÛÆ¥—^Ê{o¼Âͳ¾$77Š9ŸüAzŒ§Gàò1£è:`4…;JˆIL¥´¬’V݆³üǯ¹bêpꜵ”¯_ǹ·¿@uU>÷ßü*9­:3pèÎÔ†•›™6åfZ¦Ä²¡¼¶Q‘Å'Ÿ|’Ûn»ììl}ôQÎ;ï¼°ç÷'Yš=½UUiÛ¶->ŸÔÔTúõëÇÀ™ú诇X‘ÊšB¢m‰´ÈêFBLÉ­HKlÅUW^‚%GÏsº°bþv¾~k=S®ìÄŸ XüÍVnxpsß]d(ÎsaÖ‚`Ó¨¦ ~¿‚פ¶j)Y­2HKlÆŽ¢í éÑš—þõu²*NÙÞ–––Ƶ×^{ x#SE“ÕäÅ_[ŒK‘f «È²LÀ 6&š¢ DÑ1<ÕÕ4³Å‚Ådå…_áÊ©ðãÂ%<ñôË|ôÎã\yÍ,¾:î¸g5÷ßuÍZÄSWSÍ ÝÈÈLáÒKÏ@WM<òøs¬_µ†¤´4$Q'T9j >¿gM›UÃ`4Rt šŽ,© WJ²Ó錬ØC¸ÌöÃ?ä²Ë.£¨¨èÀK7~?·ß~;Á`“ÉÈ3.ᜫ X±5Uñ4I0pûo³mÇ.º÷ïÉüO> ÿ óxóùG¸ã™§˜tÖuüß½OãÑࣇ/çžW^aÎg“’Ñ—Wç¥73õœ¹á‘'YñëzÊ?}õáMӸ袋=z4“&Mâî»ïÆår1}úôCŠŽ3†… RSSƒªªÜ}÷Ý,^¼˜„„JJJ0™L|ÿý÷üúë¯ôêÕ+òÝââbúôéùßëõb³ÙŽÚ3jžÙ…f™Ãa3]§ªÂÉŒ{ûàr‰˜ à ª\qw?^~èwFÛžÄd3OÝô=Æ YifÚvM¡jgŽR'‡g³ha)¹¹±ìØZKÛ´†÷—Øä¬FïSO=ERR¿üò £Fâ¾ûîÛo¨aÏø® <ñÄ,[¶ ·ÛÍ믿ÎðáÃY°`‚ ðå—_aÕ‹ÅÂu×]Çœ9s"1ã_|‘.]ºD޹bÅ |Ôž‰ª)áÅú{ð8ƒÄ§ÛHIÂb1pú”\J ]Œ¿°=&¸jüœ1­cÏnMnßlZµ£ïØÖŒ>¯¶Ä(N;³%™­’8kzg¼®p–ˆ?è¡Ü‘Ï©Œ…S¡†#^QDEDA@ERÌ\vÑ…Üwû­`Án¤°—+É&£ IÑt•¬ôD¾ün3͸›¯¹„Ÿ~z‡Ï?{“’r_Ïy‘¹s¾bõê¹ Ð5¤’”CÀéa@¿žX¤xî»çQ¾ýi!½ûgÉÒż÷î ü°`>ÕZˆbÅLyt_´æ½HmÙI›Ù@ ¨©áºÀL&‰‰‰GPÙÈÅÁlÌŠÿafTUUqûí·GõŒ3Έ¤ÅíéÁ †½€xϯÙl¦²²2 Ï?ÿ|]eÅoßÓ¡Ko5€d”%ƒÁ@Ñ®"¦]r+&«ˆâws׬§xíµÇ)+«D6ÈTTÖñíü·¨v8D…²j?#GO#11‘;ӽŽ7_ŸÃO¿LÐàÓ9ßâ¨ñ1ó®›™téHj¶дc,U>/«68 EwÅm%ÊŸOlÈ…t‚nƒAªªªHHH8äô¼ÁŒFËÏ%àu£áUdǶM‡ìè©©©X­V/^L¿~ý˜3gNDÙ·AIàÓO?Ý+æ»ç}jšQXž5kŸ~ú)3fÌàÌ3Ïdܸq|ýõ×<þøãÜ{ï½\vÙe,Y²„ 6DÀÝëõb2™ŽéKi4Jü¾pªÿ¯¥4Å$šA;…¢G` ŠÆ§€·Þ>ûf1“ÆôÁ]ã@’SùùûLºè4¦; Àå KhU«ÙŒŽÎÛo¿K¯Þ]©¬© o{>ªæ¢¸¨˜¨–’JH®¯z²`µš¹üò«éÓ·;ùy;yå¥÷èØ®=ÎÈô+FSWÀYàwç"||öŸ'¨ñùèÖ4cǶôîÞPV[CY•åžx:‹fN„‚á~ø3Ï<“mÛ¶4Æ»§•–Wòʽç£OAcíª±S\\²—wº?kÖ¬Ó¦MCE<ð@_ýu^~ùeTUå‚ .ˆòžÞ¯$IoÿÆoŒ(ZÌž=›Å‹“››KNN­[·æ‰'žàÕW_CEbccq»Ýû„7ަ¥7ç¾^߇‹oþ¢‡\çª9éÕŽÄÚµkÇ×_} x,:ÊÐ ‚b@” øü VsÞ…#uÚé¬Z¿‰êÊbdQB%ˆQ6ñÊKO‘Õ•óÎ?‡÷~y‹+¯½œáC»S\êFÕƒ"ýA ²ÄÚ5[XñÛB™-ÒùvÞ[ìÊß…§¨5ƒ7D )Ü0c0ï¿ý3JH Z´Ó±wSlQ& ¶mÄÕcL McãèD ÚPv(€Ûë!È2EÅǾŒôPפª*Ë–-ãÙgŸ¥°°ÓN;¡Cü±§vZ€ À™gž‰®ëôë×ÔÔÝCÞé§ŸNïÞ½#ÀÙ¿«( ýúõcýúõ‘̸qãPUI’"$ì_ý5F£1¢€qL" šNqiá)ôû-..îï '¨À{Ú°î¬]µ §ËI÷.ͱ˜Lƒ6®ó0lPg²^y“+§Næ–Ûï !)=DU”—صãzöŠË³“rG-•4-„‚ ²!|ºÚñãâì(YŠ?à'?¯IЙÊj/±qÑDÙÜìÚ¥pîEÓINNBQ ñÔÖ±~[={õFò–áÚ(Òd¼f ² ¢O€Ñ„ ذayyyû¤`èÖp½ûKóyê©§öÙ&çŸþ^Ûžy晽>7ø|>dYæ…^ફ® m#GŽä»ï¾cñâÅôïߟï¾û.’Rv¬@÷”¦ë:Á`ð¤­`Û§w/^]HjJ–(Û¶– ù VÊ* …x,ú‚–-;sÇ-wƒ„ššF¥£’yßΡ¤¢’€ßGBrl˜eLWÀƒA‚¡U5UDÇÆ—¿Gu±‰)¼ôÊ{$$Ú))«Àã­ãÉ›_eõúÍ$$Æ CÌûæ^xáCšfç TY$Z Ñ5V§6¯ˆO9aµººúºÇÊA@–et]Çåra±XÈÎÎæßÿþ7«W¯FÞ~ûmt]gĈ'59öÉd .Œ¬œ^ 7' §×IË&M‰·±}{!kV/#oGu…f9m4¤ãÏ<ž|ƒ9– ƒÁŠ×ë ƒlŽ¢CûqlÙ²“ü-;1™£Ð´p•“RE˜èlö<ß—nà©gÞ'-5޲’jžúàm.›zª¦pÆpÇÝšœ†(J˜Ì6<~7=ObÙï¿¢ž24|ðÁG5õ?­ªÞ[o½ŸÏGAAß|ó èºÎË/¿ñ‚NÙÉa]x>i€×d¶`4p»=X­VR’“ÈiÖ”Ô´D^{éMFNQA Í[·äãÏ¿aÇŽmCA5\^m·ñö»ó7ölQ!®¹únÒÒðyýȲL(B’$EA …øvîw 2‚¨óÁˆÙjfÎ7ïV, &sM÷ Õ¡jALF3Ï¿üzN"3§}ûõ!<1€wË–-¼øâ‹ÄÄÄœz»þäùhʹç>§ N>|øI=Ðîãݼy;æRU^†NQ4rþE1õâéœ7ùLQQT8\ìØ:‡éW^Îô‹/åÇß¾§²ªEó³øÍ¼ÿá'¤¥&SYUI|‚À€>ãÉ+]ByY5!d jjjP…ñãÇðÛ¢?øzöW¬Û¾”ü @ll4óæÏfô¨ñ¨ºP0̸^úŸq.•e¥L»t 7o ®ºš8]ÔÄ¿½AV¸RªNtû3Éù‰f ‹s§ìËNvéŸ}Ðᇠ¸÷ž‡xíå§P¿ê#Çv†NbB,ü—_> §ÓÍsÏ<ÃÍÿº‹k¦_Åëï½Kþ®" èAUI)ñq±Ø£­üñó*6實´¸ ]ÓHIJ@Ó¼>/YéY(ªFM]5ëw¬d×ömˆ’ŽÙd&"‰:UÕEÄÅ% ‰1|þÅ\zõmŒ6™·\Ç«ÿ}•­ÚcÓýädçœ :aÂŠŠŠ[â𞲓ÉêêêX°`Æ ;¼]»vÝÆö¼"Z·mŽR«¡(RS’jn\N/¿ò:Ó.»”ßÿ0AÍÈ9'ñÂË/PU^Í΂åÄZR#¥u[Ù¾m'ÒÒ’¸åæ'Y·j%Ó¯8‰“š0j๘¬—_v?zµuT]Ã`0àúILhŠ×WËYœËâ_V0kÖLt</¿þüÓ/žÂà¾](-­Âj91’Ù ÿ1ï?Í«V­:dIö‘ÚžyÈÇÛDQDQ–-[Fqqñ_:Viié =SX¿~=³fÍ:îᆨ¨#ñtte^o-ßÎûžçŸ–‘#Ç0tpG⣩«ó"Š’¤Ó¦esbbl˜££éœ‘…Á$ðÌ3/qñ¥“Ù¶m3eÐÂ…È‚Hzf gŸ}5ŽšjÖ­ßÊã&.1Ž`@aÓ†í¸]nTEE2I,ùu1·ßöo>úä#®¹é~Nß=˜ªÊJÌÑ6~[ð3ãÏ8q£:‰‹‹>!tÅŠ\y啼ûî»TUUBÊ£hš¦ñÖ[o±sçNìvû19Ç·ß~ËàÁƒÿ.5æØØXœÎ¿VÅøàƒFJ·OD;_õ±°†ÈårýíÅûorJ #GžF”ED2Œ¥S§\ª+*]ùk"7 I2N—›K/¢ŸñÇk).*¤tä ,q6*«Â”ˆPQ™uïã¨ZˆPHAQ¼ûæÇ¬ÙôZö i뎴ÏmNƒŒ„×ëáê«®gÀ¨‰¬X¹Ž;g=HË®]ILIıu#¥›×0ÿ§ùñÓgH œ ‚ɇƒ5kÖ`4÷’5oà<Ø3ÍLUÃÄ- Ü Äàá0ühöäJhønö= …öÚgÇßó a†}tΆs4¿áÿ=ãt çüóñÕ=åääD2%çœÙ'))‰¦M›F²Rþj[ïyüCµµÁ`@’$Z¶lyÀ¶>œûþóÂåžecûç‘ÜÓŸÏÙpü³Î:‹Çü¸¾›ÉÉÉTTTœsûV®Ù̸ëjðzøýNÿð›×¯#3#ƒÇÿó<çL< Q6  ¡øÅÏÂÅ+ÉH‹¦uóþüßõ·òÝ‚¹”—WP^YAt´MUù×=·Ò,µ-r;S[à±ÿÜIyq1/¾ö2?ñ4>vUÕ5誂ÙMlz;&5žk®¾Ššê$OS´*Öx;n—«Éδ«îeP3è9á2†=ó„^!2xxyíµ×Ø´iš¦ñ / …¸ñÆÑu¦M›2mÚ4222¸ä’K$‰ñãÇÓ¹sgbbb"$à·Þz+6›ªª*ž{î¹HúUYY?ÿü3 .DUU^ýuªªªxøá‡q8Øívî¼óNbbb˜>}:’$ѧOFŽIZZÓ§OGE¦NJvv6Á`|€Ç{ ¯×Ëúõë™={6ªªòÖ[oQXXÈ»ï¾Ë¶mÛÐugŸ}]×ù¿ÿû?A Y³f\|ñÅdffFîiìØ±tëÖm¯{ºýöÛ1›Í”——óâ‹/¢ë:/½ôåååüôÓO,Z´UUyã7(//çÉ'Ÿ¤¬¬Œ¨¨(î¾ûn, ×\s ‚ ЩS'&NœHFFÓ¦MC’$Î<óLrss‘e™;Ûn»víÚqÑE!Š"çw­[·&***r]wÝu@€Í›7óî»ï¢i¯¼ò eeeÌ;—eË–¡ª*¯¾ú*555<øàƒÔÕÕ‘””Ä 7Ü@bb"—^z)’$Ñ¿†JJJ W^yeDÎ(99ŸÏÇÃ? À³Ï>‹Ãá`ùòåÌ›7—ËE(ÂçóE¼{Y–yôÑG‘e™k¯½AhÕªS¦L!++‹‹/¾I’˜4iíÚµÃl6GT>î½÷^A`×®]¼ùæ›h𯫝¾Jii)_~ù%+W®DUU^yå\.÷Üsn·›´´4®¹æ’““#í:hÐ  DRR3fÌ@®½öZöº§§Ÿ~šÚÚÚ}úOQQ¯¿þ:ùùù(ŠÂÊ•+ûl4++ëÄ 5¸ÝòvæMT´³YÄf‹B`ðÀ>œ=é,j«üºð'úõê‚]ŒÁšØžO¿þ”ÜVIL=–´Ä*kó)A‚¡ º®QX˜Çú­«ÈmÕ…ëo½žÝÛãóùiÖ,×_}‚ŠŠª°7“C¯~“éݧRNo Z%ÛµEðURX`Ñ¢ßI²ÊxëÊq±<òe5§U¿ƒßëbÜÙÿí ºgšL›6m"¹ª={ö²9º®Ó¢E‹Hn||<²,3pà@Ù&Š"gžy&ƒêêj>øàTU¥{÷îõÏÊ͆ P…NÂB™ :fIII 2$rNI’èÚµ+cÇŽÂ%›²,3jÔ(š7oÀË/¿Œ®ë‘2ᤤ$~þùgE!77—ÜÜ\–-[†Ãá@×õHipƒP«V­=ztäøƒDŽ×pO zmeee|òÉ'¨ªJ="ÓÀ7¢( ;vàË/¿$ ¡‹l8g‡3fÌ^÷4hР¿ï“O>‰ œuÖYˆ¢ÙgèС*ÊøøxA`„ TTTпæÍ›‡¢(tëÖ €’’vî܉ªª‘ï½óÎ;ȲL“&M>|ø^mÝ­[7Æ9¾$IŒ7ŽäääøišQá0›Í,]ºQÉÉÉ!''‡%K–PWW‡,Ëôï߯ûnÓ¦Í^m-Ë2C† ‰´cBB@„ nûöí|õÕW(ŠB—.]èÒ¥ yyyìÚµ UU#÷ùßÿþ‡ÃA“&M"U„ ý³gÏž{Ý“(ŠŒ?ž¸¸¸½îiÏkýsÿY¸p!.—ëoI%ËÌÌäœsÎ=14ýO-°vͶoÚJ¬ÝŽ=ÚˆÁ(b4hÕª%O=ý4#† fóö­ävÈ¥YN÷]z»lQ|5g!iqvúônKq¹›ä83÷?z/U®:TUAWD5HVvvíÚ(I}ðôE×Pƒ YY™ôí9†ø¤dúN¹•dÏF ê"ÀöålÏ/¢K׮̞ýùëWâõ¹1âÈÉLdÌYçrË-ûW¦MMMh‡m[½z5;w>€ý±gŸ}–K/½4¢}¼mOeŽ“Éîxb2bÄà‰ÌûþΜ4ùß~Gß>øé§¤$§Ð£g~úù'ìQvD 2“SØVZH÷N­ùåç•X¬²³2q¹ÜÔÖ9éÙ­!-ˆ®ªH²„ª‰‰NÃé.5]¨FbÐQÐõ ¢nFÁ¨ƒ¢jÈr€ &!鈠 M@……¨€C(D],D¹ETtI$ÊžŽÉ|Àu×>¯$ˆD™,Øí$ICS,f Î:'û`ç®BÕ‡¯ÊÅ÷ÎÏEÎÊ:êêÜ8jÔÔÔâr»©©©EU*+œx\.êœ>œN/µÕµ8jœ8½JKw ©TÔæ#ifJËJq:«PT/šæÇ§Õá\T»J„RHÁQ] âö8©¬,$r¡(ÁÃóx«ÊJ©ÜU ’ŠÉlBTÿŸ½ó“ª<ûÿçÔi;³}X–]¤ˆEŠ`‰ØMˆ%F%±$Æ×£1–Øb‹Æ$c,!F𨂠FQDDbA)Kg)ÛÛìÔÓîß³3?V°$oÌa¾×µ×ÌÎ9ç9gæ<çûÜÏ÷¹‹…å8ÐÞÚÂêuyiÎydê׳rÅû¬jŽóÈVf¯Õyzþ?pÒq>\ºšC†–3tŸ*ÊJêPN8÷LRñ8®ã"ží²|ÅG¼þÜKŒ5’¹o-G)ˆ0i¿}imÛBãöFî¸ë>¦2“ÆïËÛËV⯨ƊÛ`†Ÿö3þåÏH$Ì=wÝNueѧ>h_ÖC“·x¿zÈ&Y?òÈ#éèèà¹çžÛ¥›Ñ’%KøÖ·¾ÅÔ©S™1c®ëöñ­Í[¼ÿ>\qã"®>?„ª‘tt1ý>âÝ=„Â~tËNƒëb*~Rn SÆC ¹xQñ'ñ§¸q|-HÊ@ÑÁ0L¬t EÓ×I£¨ Š¢ây’«”®dvGU•ÞWUQ\4EÏxííM jf­MqÁËÈ©…Åufø‹[¼ª¢bú|øtÕ³AQˆ„ä’)zz:©©©eôÈQlßÞ@ZâT•fŸäÇ$}™[ŸdýG±½¡™YÞIáÓØÖ]ºÁÖövÖ°”tÊŠ;ˆ£áGØ^ßHIq kÖocËæ®¹ü¶nÝÄö-ÛùéÕ×3å L¨éOCK;ƒ«úá&<Æ-%U9ÇŠc”òÓNäÙ¿>‘g”<¾TUåCáæ›oæý÷ßgàÀˆ®ëæfG"¨Q£Ø¼y3gœq'tR>Çò—)±TWñîß_LJËs^dÙšÕ ylæc—rÈ¡‡’¶â¼µàun¼ñZ ‹ƒ€/€æ™|*†[ˆg&ñ|Ýh^¦©chzo`‡ &šªa覩â35LCÅojèš‚Ï40uÓÐ1 C×P]UQu‡‚º"’)å¹( ÅËHÍyŸ=8ïL¼*(ªªê¨ªŠ®ë¸®G ০f¯¿>wÿñè†DW’úè Ž:h×½¼™d¬› ¡Ó·™~Þ%4n^ÃÔ£&±iCcGŽâ¿ÿ€æ¢i*ª¦°êKÙkìÞ„‹Ëé‰&ùùÏoàâóHw[#ÓN:•i'N㈺þø}aÝeE³‡£¸¤|@çÖ×Ö²¥~5_?ìëùޛǂ xï½÷8è ƒrYÙ¨ª“sû|><Ïã°ÃcÆ y¹áK„åÙ3mqQ™xèTÆ CCÓ6Î:ÿ\6mÛμ¿¿më8~ W^ûs¶µôˆvâ¤ÚHEcXŽ…§ÄÀáz ÇO\×Ás<ÒxX8nÆ DÁCÄñØ!BOAU¼\m>%C´âç"¶j¦ Ïsq< ]Uqmõs&E;¯k[(J&ôPÓT\±IÛ ,;…?àcõªz†ŒMÕÆ§{Éóh¡·Ì~DwŸjc–V X ‚ýè‰uò»‡_e¡‡±ií ö}OýáIJËËyíù'¹ôʟѼq gs ‡ÖðÀŒ‡™pÐ~ ßç@n»ö*N[MÂIcJÑ}®EG{ gþøj* Ã4­ûˆc'È‚…‹Xðæ‚Oý’Gyd¾gç‘Ô)SøùÏžsÛ•t°ãg¶m3}út:::ò?Þ—5 A§¡q [ê—â¹ \«ƒ€šÆMuãCHÅ£hž…86¶%b(”W(. PR¤QV꣬0@a±Ge¡âH€²…Ò’BtÕÅÕT  ) Šjã¤]ll×ëýsq<×qp;CÖvÇ5QÒ íZšMKÛF"á2b1T Ïí ª¨×õøö‘“(ñil­ÿ¢u ˜x$oþ}=q¡þãÙ‹²÷°½Øºv *a[;t+°±7Ïù”æpüñ'ðÁ¼Ù¼³ðCK¯º™±ãÇ1qü¤¾àºuëhlldòäÉy7>o_­Ž]ØÜ±gÖú2ëÁí©ïe׼ϲd¢ø¨¨Tij1;N0"ž²I&DüI²xùå—9î¸ãúH_ªÖ¹‡ïå·-áÝ%ïá+Ü(Žã#à÷ð<›”[DÚ6ÐH"‘\A×^ÒÔzïA† •^>LPšì`h­Ãü·Ÿ!Õ£µ{ 0¤x8®&@&ž@¼LpϵOAU\KpUS×Pl‡tæ¿ü¥åÕ”—gî¡´¬ŸÏÌdnT ½­·½Cÿþ>•xwû¤±<ðÀ—J¼y|õ¡( ëׯçöÛogÆ TWWS__Ïš5k¸á†rqwt-Ëãß 1ØüÑC´®_…èx x`ƒábÛ¡p„ÂpE…p¸žh'±¨CWO†n€š¥—~5«½B¨z9eáþDõ(qÝOOÇz§ö`èɸ‹¢¦ß‡ª[$ã) ŸŽxà9ZÔ´Pµ°ñ/ .™À²½FîC2žd[Ó6**ª(**¦¤¬˜T,‰¨ë3Î ŸÝžx³IHòØ=,SÈx%XVÆOÒ4ÍLý¾Þ´@ ÅÚçÙîµXmÛÆ0 ÒéŒs¾¢(ÔÕÕ1cÆ .¹ä’>%ê³Çe¥‰ì±»’²R„¦i¤R)4MÃ0 ,ËÂó¼\ÚÇÿ„[ÚWoð4Õ@ hh) Ñm$ º«RÑ/Bkc7-iA“ö–z\)ÀSm*«*q“èi%„§[àù‘ ‹aUâºIV®ZÉÀÚ:·¬Æ_\IóKèhЇ•¶¿Ï‡'®dîM­ËD)O¡ÆJð"m ¡@„ö¶FŠ‹+IÅ:Q5?ÍÛêxAƒBŸGœ=—x¿LÿÝ<þópÓ4™8q"‹-bùòå¬^½šáÇSQQëºÜrË-¹T“;>(Š‚ëº¹¼·ñZX¿~=sæÌ¡££ƒîînLÓ䢋."PTT”Ëò6lذ̤VÓrD¼+dÓ3þõ¯eÍš5,]º”ššjkkihhà©§žâ¿øE¾_îü´"žKÖ Ëóé(JŒ€^F2Ý+vŠyº·EkÇq+P•8>×!Ù%ê%éWÕŸ¶¦†g‚"ˆ ‚‡nrè¡lß¾ $ŒÙé2⪬.ÕÔðÜLîlUW°R6º¡£j*ŽåC40•¼`'[þ\‰§xtE;¨6ˆEï¼EQq)ž“Æ/ë× 8[»¶g,ð=‘x—/_Ζ-[òýy7BÖŠ3f ,àôÓOç7¿ù óæÍcÈ!L›6 Ó4sƒîŽ‹hIÔ½uëVžxâ fΜIKK ‘H„ÒÒÒœÕro GÁ €“nåò÷¿Nª+‰¨™ EÀ,0IÇÓhª–±ÀQð°Qìfiœ—~ÔÝT¡Ñ‹’H †¸xÍöˆˆ6ÝIá:Þž­ñæ±{IGÙj“'OF×ujkksÁK–,aÿý÷Çq,ËÂçóá÷û9øàƒ1 ƒAƒñî»ïætáp8ŒmÛ;#k‘fõä‚‚jkkùö·¿ÍOºòí·ßÎ¥—^Š®ëŒ;6—²,ÆG*•"äoh{$—ŽSÀ&ÖÞŽ¨.n* ‘b•Ó•jDÌR”tŒ®èvj/d¿ñƒ™÷HAc³KY¿º»z2þaŠB0ä£÷—ÐopFöã¾}–£è&âöæÇ%ä¶R¸ž‹®éX®‹Šà÷û±Ò*öòa;.>Ó¤¸¤ŒîŽž©áö¤ öl°¥½‰’âQòÄ›Çè÷ûsš­ßïÏ‘äðáÃyä‘G¨««Ëùm—––r衇R__OGG>Ÿ]×Ñ4­é~Úz€ˆFiooçúë¯ç¬³Î¢££ƒaƱxñbêëësÙïfΜɠAƒ¸úê«q'W÷,/)|±AU!'ñb&‰ö4¾J•Ão¯bÉZh_Ãó‡ð%R5]€—2D4HÛ šhª‚ßç§ÛëMÁM:Äãqö5¿f°Ú¿×jæÚÕÇëìÀð8iÝÔQÔŒšªª½Ñl Šfcu«øË<ž=s+𦑴¸ŽC<ÃIùi_ÞEÌ— O°iã&ü~_žxóØýÒ5ß,iÎ:ë,\×åå—_æ'?ù µµµlܸ1§ýþ+úªªª¹â¥üã)--í“ÓaðàÁ >œúúú\ÁÉÿd*ÉÝÃäýÿù <ñ¨ÜŸ5ëUªF²¾‚ö5[ÑŒû*IV:.]ahZØE÷Ç –£âÓÁu=B¡"-¨€Ð‡ hhØŒk+ˆ­Q¢{üþÀ÷0L?.à86* @€d*ަª â:¤ ƒâ”´?A¤Ÿ "$iÊÊËèßo0«ÿAÙI-ô4†é~c_.¼h«V¬%‘Læ‰7=ÄbÚA&0`@.¹ùŽDûIW®Oê­»²|³û:½YúÇÉ/XÑÓÓC2™Ì¹§åñ¯kŠ*4néÄŽFó.$IiÎô˜ísx1FqË1#AÌŽvÄ0PU•žîžÌB]o{ñX‚áÇóöÛï’N'qÕ ª, ü(Žm+hš‚é70C!zmo\G! Q´’ 1Iu†P4p½4o¿µÅ  ès/_…C òÃffQW_{Ígæù;ÇîÏóÐuyóæá÷ûs–±¢(455qÞyçÑÕÕ•óûÕuÛ¶sd›]\ûd›;t–Ì]×ÍùWVVò§?ý)¿hö¯ómo˜.(¢’ˆF û15Á EhßÜFye„¨¥qŽ›`N—‡Ô=IOW ª¡ãÚ.šªd¬ÍÆ>Oniyü o¯µKï﮸°e{å%¤%A‡aGÒÜÔN²Åcõ­,y2J¨P‡ª†ââ÷™twFÑ ##y‚¸B(¢©©™Ê²!¡9*ŽÚI<%et‘T;‰+]¤Ô.t’’JIµ ÛNÄ"•n¡|hIæ:?‹Pµ¬„EÞâÍcÏÁŽ¡Â†a°fÍ***˜:u*?ü0§œr ‹/fΜ9¼ôÒK|÷»ßåÔSOeøðáŒ1‚믿žÂÂBTU݉|UUÅï÷ÓÕÕÅØ±cÑuåË—gVº“É]’uÿ„µ›q)<4#€ƒÎ®nŠÊB :¤ˆ)? ó‡…›pƒQ ’…,z`;‹ïõÀgÒC  ©tª×œìµœ!ÖÓCYYN‘Çǯˆ¡ù¸áoSIuÛ¸ž“©4¡)™C\P4q=ÐUp2‹~Fa-³Î^†idä«x¢Ÿ)yå‰7=†aÐÕÕE¿~ýèééaÖ¬YÔÕÕ¡ª*~ø!ßÿþ÷¹âŠ+rÁ,_¾œòòò>šïŽ s–eÑ¿ÌÊ•+Òé4Á`ÇqþiâíèèØi!.›ƒbOƒ«ÑTAÔ4n@GO%Ñ ø-zÚ¢´¿â·O¯@53 ›1¥EŒPÒÒ2Úۛ𠌬w„‚*¤U´P kW.¥fÄ(tÕG(XÀ]cßÅ04TM#²¡ T@<GUT4UÃõ\¬´M(ÂJ§\7€†-´¶n@Q TMPsIÓ³¦»ŠãX—å‰7=SrÈ’¯®ëD":::xñÅ©¬¬dóæÍŒ7ŽÎÎNxà¶oߎ¦i>¹LÓ$‘H‡7n+V¬ ¡¡!ç£[VVFss3º®ã÷ûÿ©|½¯¾úêNû>õÔS{äýÒÕ.º£Q’ñ4Ð[œÖMå¶oÚ– ÿª «:º_#™²ˆÇãÄâñOï¾VèÞN݈a,xk!¦aâyC†UgR?º.®ëeb6ü~l'‚¢¨( ™Ú†®#@cs#á°ŸG}”€?ˆ+.†bB¯¬ ŠæÑÝåâK‚®ç‰7=;º|…B!‰Ë—/§¦¦†mÛ¶‰D…B¹ŒeÙüÁ`t:ÍÔ©SY½z5 .Äï÷cš&𦠅X³f ·Ýv·ß~{&ÑÊ?áÕpê©§æoPÖPŒ§8ü침b6t³‚tª ¿ß‡ªÚ ¾Þ2;ŠªdT‰ÞÜ»yX€Ì½ÖT Ë×j¤~é_ØØÐȤ‰ãùhÉ2D„- [0}**)ËBE%X ™L¢ëâã:((¦ë8ôëߟ‚‚2.¿üF 5Œ¢¥GÃð‘J¦QµŒLb9IÎþþEyâÍc÷Å'ƒ²AÖå+ë·›J¥PUÃ0(,,¤»»›`0˜Ûײ¬q*ŠB2™¤ªªŠùóçãóù0 ŸÏG:¦»»›t:Í믿Nee%MMM´µµõ%“|ÔÚ†­h–û(-5).­bíê8ûí_I4åòÖqaÇEËäÒp<Ãd¯áC3„­(¤¬4†n`ôºjº"8n¦¢…aš @æèZFV0tªƒØ¼e §Ÿñm{lží ê&|5Ö<ñæñÕ´zsãfÓ<ŠH.!@QQFc 9oƒ¬n›uÛÑ"ζü$q755¡( étMÓX³f Æ cæÌ™xà´´´ …X»vmŸñ"’;ov@Èúç±3TÍϲ§Ogå‡o’¶``M O7wГ„!‹ˆõDiéöXQˆx¶¶(ýÊüu“MMQÊ‹ýø&[¶G)ñéV†XßÐÍÚ§Š?ù26®\ÀدÕѸ¡‡ÎD×o@ ØhŠFÚÊ,°…ä’©Œ› (ØV CU1´¥‹þÕ£°íŒï©i¶mo$ðsÄSyÿýPTaÙ‡+úôµ<ñæ±Ûo6»Ø3Ï<ÃqLJßïÏY¸UUU¹ìd¦iöy²–hÖ-LQ”]z1dÿÏF©Õ×׋ÅèèèÀu]ÇaîܹlÞ¼™úúz¦M›Ö§mÃ0xõÕWéß¿?£GÎ{=|¶&„§…­…4ŽAÑ@!†£¡˜> ÅWŠkÇT%‚mà‘ÀQŠðÔžÒƒ áÚ%($ØÖØÅðD’вr<ÑÙÔ´œ"=Â^Nƒj&Æ@¨ËrC7p<…¤›"ì!î–Ûþ<ª–ññÖ0Ñ|ÉX’‹Î¿”žX×õ0ü>ìDúsg:yâÍã++-¸®‹®ë<÷Üs <˜ÓN;»ï¾×u9çœs¸ì²Ë¨©©Á¶m"‘±X,';d‰xÇPâìÿŸ$H]×)))aöìÙ444P]]ÍÌ™3Ù´iSN/^ºt)ÇwŽã`Û6–e1`À®¹æV¯^Ïç㡇ÊËŸ1š†I¤°Ë0ü8áLÀB8FA#\؆ª[h©ÂÁ(þp!†jP RÒ1 â`„?B°¸‡ÁäÉã¢ÒÒÚBi$B° €xmêãh@×H§Ò¨Š‚U •N"¨šŠëªë`é…(f_ÙR‰_?ü`*+ûÑÝÕC*'Ž퉢ˆ ªF"‘äó¤þ<ñæñ4Ž2jiiiÎ¥«¹¹™Ç{ŒiÓ¦ñüóÏãº.×^{-O=õt}ôÑ^øúd¾†lh±eY¬X±‚ßþö·†ÁªU«0M“r×]w弫«‹}:õõõÌ;—£>š¢¢" .ì“ìóH7[Y"k666ò?ÿó?<þøãlذÓ4éì줺ºšgŸ}–[o½•»îº‹+®¸‚¡C‡Çq]Ã0°m›K.¹„—_~™cŽ9&weñª1ì´B:G¤˜ƒ¯ŒP=nšÏá•h~SEQ„‚ºñ 4lÐã¸N)ª(LºN§e•ÅÊ××tÑ¡(:AÓ/¢ac+Õ5ƒP_¸ˆYg-ÄôãYBÚN£)*¡HˆD"®i€ŠãØØi›‚‚0ŽØôП’ÊB"UT ,O„ææfâÑ8ªáHŸi°äÃ¥ôûô*ÃÿÄ{ýõ׋ÅX¿~=#GŽdÿý÷gÈ!TWW³÷Þ{窽~Ú”mÇíD"Á–-[X°`Ë–-céÒ¥TTTPUUÅÅ_Laaa¾×Åàóer–––™´T*…Ïçã–[n!°dÉÎ;ï<úõëÇ­·ÞÚGÏý,Ë3›'»¯çy6mÚDWWëׯ'™L2xðà\E‰¶¶6b±W\qS§Nå¶Ûn£¹¹™ŠŠ EÁqÆŽË{ï½—«Œ‘Ç'¼D)ãÎÈIGNáƒGâVi¤ÝH8hJ%¨ˆ‡QÃïGSu|Z >="¨¢ )Š^AÀ$Tì£ÆWJ©¿dÜ¡zH«>^¡é8ŽÅ¨1#QPq3–® Š¢fb}•ÞزÑt AÐUÆÆ&t]§'Þ͆5Q?¥%TUV“,JÓ´­‰dB££³M7¿Z¯¢(™QG×iii!Nç2IuvvÒÙÙù/=¨#FŒ`ôèÑœ}öÙ”””à÷û3f +V¬È÷ú¯ Æ«ª*ñçMÓdÕªUlݺ•ŽŽ¦NJ4Å4ÍœÿnÖe,;CÚù*ŠÂðáÃY·n]n`÷ù|,X°Ïó(,,Äó<æÏŸÏ=÷ÜôiÓˆF£ƒA¢Ñ(ñxœK/½”­[·ä<-V¬XA]]]þæ}Ú,ÆŸ 'ÕF{k+ý'[ø>TŸ‚¢ºÄ8Q•¸ÓR‡r±<‹x"Še…©.~+õVÚ%é4ë £(DZ}Ûõ¬c4GŸø 6.k`pM --mšÎªU«ñù2(l×BáÉDUSPÛqðl0€ëÚ”WT‚dä*M‚èxnQC´·6QX žL}jßú¯&ÞÓN;gžy†eË–FÙ²e ÔÔÔ0`À*++)))¡°°`0ˆ®ë9íÎó<\×%•JÑÝÝM{{;­­­466²víZ:;;©ªª¢¼¼œêêj.¸à‚|ÿ ï'ýfGŽÉÈ‘#hkk£¬¬Œ)S¦ÐÙÙɇ~H(bÓ¦MTTTÐÑÑA$É•ÊZ¸"ÂÚµk1 #—w·¸¸˜xø`NÉ/°õ…‘ QPí§½ÞA (ô\ņ¶ãzåªè)íDøô"ŒÞß.*D/Áª•ALµŠÂ‚&4J)) â+*Akùšµ$¢UlÞ°=£%»6ûŒªêxxxn& C×tÇÉå<ß㿪š 'tR«2+¸®Ë=÷ÜÃ+¯¼ÂOùdöÛo? “ù쓲…¢(<ýôÓüþ÷¿ÏyEd UU™={6>øàgJd{4ñtó×K× n@Æ–¹ ¬L¤0̪5ËèWPÅ”Éùý‰ó˜|ð¡,_½;õ6G“äþo,$™°8pÜר²¾‘æ–Y|mß÷ñ‚&Š%´4G)) m÷£⣥+ 4ðÒéD Ã$z#Ьt <ȵ ©¬,7S–ËÄçSؾ±‘þƒ*éêî¦(\€ç¹(I ¾z5×Î:å›,\ò1—ÿCnºç®¹øBýãMNüÖ)tD»9øðãXøò“|í¨Ó‰7Ö³|åÇ”‡êX»ªžO8’Ʀæ¼ð¯½þ:S&Åø}óÂK¯1ã{øö)'’ =8ßã¿‚Ð4 áÖ[oå;ßùO>ùd߇Ø0˜ú(›6mbÓ¦MÔÔÔôI÷¨ª*eee\pÁ}4×––ÊÊÊvò€ØqÝ ëUñÉD:gœqÆ.¯wÕªUL›6-'eä±3’nŠé瞎áù±ÄCS\D\ U3°-‹ý&œ‚ízxhì{À7PÁ0ÂŒušZ€8i´ÃÍ%žJ¶SŒQË–u=(ŠÎ†¡kPu#ö:—”ebh(™’A à9nFëUÁAñB8¶ÊÖÖ?¡¨pÔQ‡S=x~ŸÉÖ-[AQ(.."‹ã÷ûˆõ¤ñûͯñ W]{%?øþ˜xØTNœv#FŒdÊ ßåú¯á†›oâƒ`þ¼¹\wñ(),bÒ”qÜsßÃÌÁ|ãè© w$Kߛϙçþˆ¶ÖV:;ƒŒÝï@~pÖéqð$N>ç\9üT˜´Ï<óÌÿʱ}Ù²eì»ï¾ù'ç?94÷’—ßïgþüù}äMÓð<`0˜Óï¸Ë’ê;þŸ%Ñh4JQQFoN×OžsÇȳìgªª²dÉF½Ëë½óÎ;1bD®f;cˆYÉ1g "+gÿI#{©I<ÀOÆ}Ë!“•!›0Ýh\~ÅéÜrÓm,Z0 cÍšu45¶rì7~ØÛzŒþ’$PdÜߣ(4Ô.1X±b9MMÍRV^ÆÈ1#Ál'É3}Ó§ŸòsêW®å¶›ŒiT”—³rÕj CÇó„ƒ&E´ë"E#pÝÏ&^EþË ?þx~ô£Q[[˺µk¨:Œ­[6SPP€( ‹Ñ‹R\TŒfúÐÎhœ~å¥ttÅhooa¯aÃX»ve˜>é´M{{;uµCزm;V2NUU›õwÜqG¾×E¥Çqxê©§8öØc)**ê£õ«ªJmm-6løÂíA&Uc0ÄçóýS oþö·¿QVVÆÄ‰wÚvÔQGñÊ+¯üS™Ëö4Ì~s5N<-*=]QT=C¹…A?§|ãÈH—^2v€&P4„dW(å í½„m=@wÝ;‡ÚºAx¢%ð$ëh†GÀèM‚ãâz‰X(¿bA@™t´¥)*„“OTö’¿ øzÏçöþy€ËKsžåØ£'Ú×íù¯~u]§¡¡Óçï´Uzb ˆ%z§š:ÑX] X®PY^ÊÖmÛAÈe›òû}D£=½?>˜†ÞÛ˜>?mí_Ø·3ÿN«WÓ4¦OŸžK~䤀¬äðE7û— ÊÈ&ËÉjÇÙE¶Os*++Y¹r%'NIJ¬>‹¾¯¼ò ®ëæÝÈ>'2â3îQûÑ€ÿï ûþÊ¿µµCùÕoïeÔÐAÜpýmøŠË¹ýÚ p¬tF·Éc·GVgÍúõî8ý_´hÇ{ìç¶áyo½õ«V­¢±±‘7ß|“îînV®\‰ªªÜrË-¹üŸ59<è ƒ¸÷Þ{s×õÉ„;yK7>Æå«~÷¹û©*×PQ\€nøøócb;éT O”ë¹òøï¶|?I¤---Lš4)ç·ûi3›l0ÃC=D  ³³“gžy†'Ÿ|’Å‹s÷Ýw3oÞ<~ö³Ÿå4> ýúõcÔ¨Q¬X±"ç+œïgyì²ßþ·i¼#GŽäg?û&L §§‡h4ºË⃖eѯ²’¦Ö6*ËJ(,*¦'ž"òçü0?i)ŠB8¦¨¨ˆeË–qÕUW±råÊ|/Øàyo¼ñžçqøá‡|îÕªUxžÇ€øàƒ6lmmmŒ=šû￟ïÿûƒÁOµZ³ý³±±‘^x‹.º(vœG»@ÏñfñÀäRðeÃ5³ñùeee sÕ²€eY¤R):;;ikk£»»›xòÐÿúò6}üs>\Ë ¿¿‡Ys_¥¬p×%¶­_Æ€º}r×ùEˆÉ#ݶm‹ã8⺮xž÷¹ûg÷K¥RbÛ¶ˆHîøaYÖç¶³ãk¶­<>^§Ò½ú- W–û~u›’°E.»ðl)/+—-­rúé§Ëüž@æÌ~S¦O?]ÜT—ò›û–—žý³üøÇ—IÍ:‘X§Üú»?Ê” ãå¸#¦È…WÞ"õKß@&LŸ;õ·Ž>B Ã/¯½óÄaòõ#¦È/¹Ffüú&™vʉ²Ïþ¤}å?ääœ/çï{™cŽ?JPM±Oö=BŠJ*¤«³]øÉrÆgˆˆÈ±G"ý‘ !¦aHgÚ“3O;Qúõ«”5›¶GóÄ›GyüŸïÔ£—Þ™wï«&ß>~ªTô«”õ[Zwø¼÷µpPŸÏ/|M®¿ç)dÓÒ•2aÚô>Û',és¼ˆÈ W_)§œrŠÔí=NöÉmì¡»äÉÙ¯ Ï?2KN»ð2)ygþK2tÿ#DD$–HÊ9g~WŽ;æùù=÷9W¬³Yö¼<öûÛå²+n@–¾3WnúÕrÈă¤ÿ€A²tõæh~©5<òø¿RäøûœÙŒÛwoEáÃuÛxúÅWÙ{è06lièsĬGŸ…î-,~åYEaܡDZæãð¬Œ$žGk{GŸcæ.\MeÕ >ŸÝtûØ©¶lÙDqY¿LNŽÊ¡´4lä;'dÖ&8œŽ®nÚ€ñ‡˺%¯¡( ¼œ‡g>Fg[3|ô£ã ž U°jñ‹|÷‚«ùõ/o ¹µ]UxsÑ?< ’µÖó/Y¼ãÆ$ý«ªäW÷ÍØiÛãß¿Ógååât·Ê¯½q—ípÀÿÚ€ÙÝ$åÿÞA8Ý#¦®Ë>uuâý ÇÿîÞßÉ{oΑ‹®½å_¾† k—ʶ¶tÞ"Ê#.;ïLd؈1»Ü^]–Xïûk/9[n¹ëž/û’þ5©á“¦ÿ²b)ï?Hâ]™iÁu7ÿZ U‘Ê~ýåã Ûå„N–ÕÉÑßž.óž™)€L?ïGò΋gÓ¶çÚ®««@¬h“2í´³Å‰6 •Õu""RQZ$ýÎè.gœ+#kúg®£²B¾'£ýùïïÊÉÇ&å%AiëIŠˆÈ‡LÌL!^}O~sëUÈ ¯½#{ÕÕIyy©œ0ýb €‚!¹ñÂs27e`?6b?ùËó¯Kmm­ˆ“ïþÏ ²ï¨ÌuÎøÝÝ¢i†LüúqR[@:[[å”;o¼\ùÇê­2¬®NÊ"!™rÔɹï:fÔ©ª(×óäЃE3r¿k°|¨œsú7eï#䉿ÍË?=yä±ûàO¼÷ßw·Œžx¨œ:íùhsWnÛ-7]/§žüM¹ú¦_góíä²3¤xÓíwÈ~ûî#ŠÆNÚËŽmß|Dzß~ûɨ!%¹í×ÿôR3áP™vüQòȃ@V,š#£ÇŒ•ß|Ÿrûm·Ê°Áå´o,ë;ÜÚþäyF çÞÛ­+ä¾'_Ûa».ÉuoÈŒ™³sŸþÍ rï?xg¡\ô£KTû:ùéõ¿–7g?!÷=úDŸs îü]O;é[,*‘å«× 7\}¥Œ›zŠŒ¯õ‹ˆÈÕ—],€<ùì‹{¢(³_|é ï½­±Uþüøã;}>{öìÜû—^zIÞÿ`©ôtl—ÿ‰¶ÿÝØ¶µa‡ëËÜÛ9/½,-­}ö›5k–ˆˆ´55æ©*O¼"ápX9â¨i""0}¢d\‚¥¬0,?úñ•¢©Šì=|˜\uó]‡%ѸIN>ç<¹ïWK(à—c’7g?&€„Ãá>m‹ˆ¼ü—?‰Ï4eн%Öº!c÷Z„~ŸOUÇusûˆˆÈ·O8BBÁœyñÍräÄQ²®éÿwæÆ ÷=1[.<7#À?ðøK äνnÉßåÖßÍ’òpX<בãŽúº|ã[ÇÈm÷þUŠÃA19ù{?ÍwÚ±‡Ë ƒ%K²»EÙ¼¶^.ºáN9ÿœÓg^_&Á‚pŸï—#ýÃÄrDjkªÅï3dÞârÞ÷¾-fIµTF|2zôùÕý3÷ÈÞ È–õòñGȃ3‘'ý£<öô3""2ÿ­·åÑ'Ÿ@®úÙ2kFFæšõÈÃòËßÜ·ËÁV ÷—o11÷ùŽí=ú§?È/ó{™ûÒl¹þ–_ˆˆÈó/¼(kW,‘xÒ–çÿö7¹õæ›EÄ–þðw=ýŠ‚(Š‚ ©ÊDð›0žŽŽ.‘LÏ«6ç;ÃnED¢ùŸ!<úŒ¶Ï¯Ç—‡žÿÇÞyÇÇQœ}ü»íúI§Þ­b[.’» nÜè½WS$@¨ ¡„JèBïÍØ4WÜ{or‘mõvº¢k»;ï' ¼!r¿î£Û½Ù™ÙÝÙgóÌS~¼Ë°4Ö71Œø.)ÉñTÛ uõD;òw§LJNÆírþ"®H$ÃjýyùØ{[š C¤gd`ûÌ»¥¹‰V_€Œ¬,œvÛ¿­Á€Ÿæ–V’=’Ü®¯E§£¶®E³’•‘Öu”¶¶àõµ‘–‘ŽÃ–pÅM H ~d:…ÿpúŰâ,òórymæBÌû”TO2’$±eû^}øòóó8㢫ùè£ùè£X¾zm·Zvl^ÇsÏ=˲eËYþÕ³fJCS¯½ú ïÏüô@ÎÛo¼Æwý•Ù_ÌëÜûáG3Y´x¿÷&/½þ~¼ž…syàþ{xèï³dõF>yý©Î„³fÞyü›¯¿Ê#>ÆWËVwî›ûùl,YÎW ¿ä¹_`ù¢ùÜ}ç<úÄÓlÞþí ϛû—z”¯–Çëkª«æ“O>aç¾jV¯\Æ«¯¾Æ¾êºö# ^õU>˜õ§ž|ù|üE÷ë¸rÉîýëüý±'ذ-ÞöÛ¯¼Èïÿ{VmÙÝÞçY<óìs,_ºŠÙ³f±rÝV0bÌüävbëF^yõUvíoOÚ 1óƒ÷øë]wñì /³­²€'n½™= ¸þÖ?wëǾ[yá…ç™7‹çÍá“Ùñœ„ËÏgÎüù,ûê žxòivnZÇý»ï¹Ù_Ϊý›ÉËË£|Ôæ}ù/¿ü*ÞP<²âUçŸBùÜû÷ÇxùåWøb~×8$ï½õýëÝÌþbn—{¿pé >úð=^~óCæ}þ·ÿùÏ<÷â?¨kô&žþÿ¼þÄ_ãñléÿ´ìÙ'ÎÐ1‡ýw;ªB’$Ê&œÁþm$¹Ý ?å{©Ø²–²žy\zÍßþßÍõÙ8..ºî–ëi-|÷u$I"µ°×ü’†›*ãò]ùñ1ÑV|6—ËÅÈISS ü²áGáûqVí-bp¡K€Üih%©6ñöìB!.9a|çþŽÏ¢Mû»Tqù™G@<ôÔkbñüYɹCEõ®JáìŸ}9Güö´é{ö]ñà=€¸àŠëŽ·\#ñÈKŸŠÙï¿,1â°cÄÜ9_ ¹½Í—^[ (rÅ~žxQ˜BˆÝ›Åý{@üã¥WÄ1SÆÆ]9xSTí[ »Ózˆ­Ûw‹ûÿx¥Äîx@ì©Ü)\r¼NÀ/Î:a’Äy—Ý šÅ1£û @L;öDqýu׈—ßx·Û%Û¶q¥x衇ÄË/¿&ŽŸ>QâÁ§ßU{ãn²;S¼øüs"lj°gÿøÇ[¹½†ˆ…s¿CûäÅýí>]Ù¥Þ'ÇÏaÜԣĕW^!žùu¡Büþü¸…òóçˆS§ €øôËeâþ.qÜéW j_+9Y<òø¢(U€Øº³Z,^ð™¸ÿžûÄãÞ'J‹² *jýbá[/ @\u㟺ôã÷%ñ›«ï+—|¿ï–¸Uõ‘£ θè÷¢ÉuU{Ľ÷Ü#{ôiqÙqGÎÑÓ.F¸MX@Xœ™bÖg_Š“§Äûjé*ñêãq·›þòørfÜj÷Ä‹nŸ~:[bЄÃÅ—_|.Ôö{ÿÌ«o‰!½âcwÞÿ˜ˆéqôðˆ“Ϲ@üöw¿ï~üù¿äžÀ/ ü#îRU:`ŒBˆåÅÝäÓ+ï}.¦ŒÖ¹Ûs°ð·úÅà’øØ/+ë/Q>ê0a !²<¶Î²‡w¶hnOvàG‘ºn75ij÷߯¯¼Lxœš@²ˆýM>±eé—]ÊJ κì6±wÖx»“Žá_ôÊr ÐÄAC ‡ŒŸ¾þj—cïüûÛbï–UùŽÄÀò2ˆkÿúT—ëòÉ;q¹™UÜO X.2²òÄÌyKEõŽu—ßö7!ôˆHµÐíÜöíÜ)&îÑmÿ†ÝÕbþGqÃÏ´ÌB1°__ˆ??þªW~Úy¢¥*.÷2Šúˆñãž´LqÿS]]Ÿü {EQzÜ[dôA#ã×Å•#ê›ZÅÁý2ºµýéê]¢±rƒDjf¡(ïo{ú©—!„A vŠØ³ksü5E!ÄQÇå÷Ý÷< 2ÜGŠ˜0ö`‘œ’&^üð ÑR±MâÐÏøAýN ~UF¼[+€‰Oj6ÎEèaNœ6‚›6“™_B¿úž—; `ÇôÏëRÃå¿¿ž›ÊŸÅ gž,ªGIÍH¥¬4Ì Ÿ1—¨=•ÉS¦sÖ‰SYöU\óúû«ogúa#¨oðÒ³gÖ­^ÍòeË™2u2¿¹î.&Ά=ø1Ÿ÷êÏÕ¿¿ŠûjÉL‹/É·úƒäæÆéÓ^î}ôYú À3O>ÎUW\EÀwN9V›¥ ãÉ[î¼ôÔ4ŒÇ”ÉS7â –/øŒ3O9ž¿½ø~—óP>œ+®¸‚]Uõd¦ÇM?ÂÑáP =DˆëùÓÍ7òÎgq-n~NûvïàÉGà7ÿ€>¥½(-)ŽßûU«X²d)S§Ná7×ÝÅô‰#XSÑÀ…Ï@U,ô3‘Ã?‚a¥%¼÷Òäd^|ëãÄœ÷–[éíØmB°mmüY®®ñ颕 öu—_Ô±“þ]¸èŠî÷sîÛ¢L=æÆéÍM·ÞNJ^AÖí u]SøÆy]{ó˜‚ïÌà{ÝÝÏqÝÝÏ}/‘ùgûïzèÙ¯ë»ñ‰'ÿ=zõeÆŒdæõ`ÊáG‘S2« ªƒ3fP˜Ÿœ=vïm|þÕ Ž=ùlÞó%ÖõÌ]÷>“OŸ¢aƒq¤$3cÆ òû ¢g¯¾{BsqÔ‰§pöÉÇ&nr üoÀŸ ¼ $@ $@ üª o"o $@ $@¿j¨ÿéüH›§[Ì„¥T ü¯"n“-!I‚h4„ÅÒ}YÝÄD´;îËBétúúiäX H¨oGHq)%(«âë¿ÜIn"‘0¦F‘Á@! ‹ÒâõÔ“šîÁnK¦jC;‘Ž~k‹îd9é¹äd笔Þ}úгg ýû÷¥´w.à$ ÜùÑ‹¼xîE¤4G9dÌnxùe2ŠbFÀ´‘$Å´¡›:BTUMáŸN»‚!I(À–m[¹è•%ô2+m`H ÄM]$!P-­± »wqJ¿N<¸«;íÚ,u¨íÛÇ@t5XÛvT°hÇ>V†ØJÊðVmã´,•a¥%1]ÇætáI¤EO ÿ ÂÛan`š'NewŸI‡…CóÕbš*Ö$« †Ž¦¥ÑârÝ5çÓ§W¾{±èkû©‚èxùtÖ»<õäãääå‰F±Ø,´…C¸ì.$C&ªÇHr»Qd™h,†¤H´…Ã8ìvlv^o+@€ÒÞ½™qÎE444°nýz\.'Ç ¦¦ ¯¯‰‚üššZ‰D¢SV>Uµ|ë¹7ŒösûW|ÍÎã S K â›À¯•ð~ý|,\¼œñDVÀa•GUÍNÌ #I:VL]B§ÓÇ㢹ÙG,&°Ú¬(² UQ°ZTUF’„UUðz}¨š‚ES„(š„ÕÑ#ÌXŒp¬=¶´âà¬ÛofÇ{o’½s-7_<ÉëãýOw":뀃Ч'½KûSسN»Ã0:Io?Á{¦]’~¸p9w/ØÇ þ¥‘(RÜBIÈȲ ¬8Ø¿i-÷8ˆ²>ýÚG˜@î0Äþñé_ÎÇ|û9ÊÆå6%LLl•¦]{Y°qâ{5d${¶ $ð_ ¼ÿq©+Ë ½KKY½e >õ/")+•Ý»wa³Zfo«—âž4ù¬X·¹ð~¿tè¢å5M,ö*ö4²|õvÒÒÓÐ S”¸‘¦aŽ„0M˜(Š!ÚÉ¢,iÒØÔ 5œ|ÂiØL4eÏžJ4‹JZj:†a‘‘ÁŠ+IOÏìFv;Ì*‘66m^Jeå&dY"bV’\yH’LF¦Yh C7q:]ØmN¶nÙFccžÏç×<ÈŠŒ„IR’‡pT0qÂaHZbÉ,_?4M!-#‹Ö–VbQ;ii¨š†·Õ‡.bXlÉÛBÄbQjk¦„f‹"$?ÝDFTH(H²@Sãþf0 ’@³¸0£*’a"#cuº1ý‚´^8ëÞëYöÚKø—¯eêTåW¦a$ã­kdã¦5¼ûÅBnmhÆÀ„>l(+V®JܼŸ°xõ:þ¾`ýKˈ¶…âv¹f\)¢¨PÙb ¥Š§o:0Ûõ¶²øÿð]Ô74SP¶œBd=Š6M%b€§Æ@2ã™ÛþŸ¼:øð#¼Ò¡ûóâ?^'j¥±¶Š˜$Õ †é'Õ“ŠK‹bD¼ø¼u´47þpÓ®IµÙíý­¤y\¸]ñTÇVK2ªE7ñ‹F£ÔÕÖqºœ¤¸“©Ý[Crrv»êý5¤HéN’, ik ‘žž†Åb¡¹¹ ¿¿´´4rròéß¿?éßÒ§8‰¶Y´¶4s×_îeØð±œxü|ñùW¼þÚãdggR\RDYyO;»Cfïžý´Ãää¡*‹Fñ¤xˆD#qk0²²2 x½>**ö2hÀP2²2£:_=LÃÄï÷aEµJøBͨ†•¬ÜZý-躊'9•I"’”ì¦-¤z_#mþ(©©vÜn7šæ „ÃAt#Ša˜èF ¡š¦ ‘(–˜‰«Dkk3%úqÒÕ—³î½ØûÚ‡ŒO·QÚ; kšY&ûÈ<üÛÃé4é¶x#Ò³37áí 582z`„ l*I uþ(#R"üñÄ£:iªÜA=ÿ $4ÒæÇ*æ°b†%dCBuX±É2j  ·bm/D’öuÛ $À¯‡ðˆ“O;‰¿?ó»v¸!lD}UȲNsK .»L¬)€ްsçnüÑ(n‹…îQÌvBùuH˜M›6ámm$+=›¦ZM^\7ŠìC  ŠÂD–-ägeŽD¨¯õ’™_H(ÔF}³ŸÜâžìÚµ‹Ú"N‡wŠýû÷bÓœØm.\îLš›êIvÙX¾d1ᶇ < _‡ÃQT+ᨛÍuZÍfÛöFŒžÊo.¹Š¯}Ķ 4¬.wÑX=UÕ dçS±k'ýúõeëömX, ¨¬ØI’ËIC}=Ng2v‡”DXå~Õ4—³=! aÃDVÂH¡þ&/V«à lÞ’„"ÉÔíÕã¶´‡[& Q[ßLL71u… j‘°X% Å¢)ØlV¢ºÀŽ0þ¸:ýP¶mØÀ†?¤§GÆå1)J²AÌ«Fv¶…}ùRm„ãòsñ‡vQI•»¨…dt:4ýF …Bñí ˆP(„a¤§§‰D:÷›B¤#’ÝnGÓ´©ëM–{¤çeÓj$9þ^$ S³jÞÄŒ©Øò¿õœöÈGÌ}ü6Dk±ÙíÄ$Õ4 df±y©Ìür;w) '+çûàHàAxMÓÄ4Íe“–‘‘ÅÖõ+yô…÷xèÁ'((ÈF‘M $ Ó@EÁ4mö.ÙÌ޽͔õÊî"œL$Ì.‚ËårÑêkF1ÒsSiÓ#X6dYÂ1¬B È*†iÄ…¯f`Õ2“ÒPdP,\ÉnÀ$%=™Œ¼,v‰H4ÄÚå«IIM!b˜ šä¤¡ª†Áe}Ø´i#C")雿ÐíQ#L榎>j ÅE½Ø¹ç]ʹQ5'Ë—½Ãf2~Ü(ò² 0ŒÉn…=rA2IOK#Å“Bjj*™™™„B!ÒÒÒÈÍÍ%'7‡}ûkÑ4 ‡=á‘Àÿlv+…ØÉ8IèºNL×ñùüX,áp ·Ûƒ@àóù µ…1ôä$‚~?‘XYŠbÓL Ù@@"†¢ZÑc&€¢ÊØ,Pï÷cINå”kGRn6uuµlúøCŠÃQ “œd¤˜¸<@0VG¶Fz‰ƒ¦&?¥7Srrxz÷þnäJÊ·žo³ù×uI’åoü`F{t˜¯ëBt’ÏŸº®‡1 ÈËVEQp:´¶¶RUUEFFÑh´K?ì¯ahšö£Éîì'ï¤âÑ›(ÊO’…gÒÜÄVEˆûš\ËIcë¬V–yMª’s˜|÷Çô0´ýš þ5?Н%½ÓfçÈ«îùÖßExä« \üÎ*n>¸ˆƒ•'äø%^Y–‰F£\qÅ•¬[·–>}úЯ_ÊÊʰ;l¨ŠŒf‰{%G£dY GL S¥_Qwÿù÷47×át¹†ŽldÙ‚M<)NÒS<„šö0oÿ$9F$$+;§ÃC4 Š,S\Ü‹åkÛYMU‘d;6ÕáÁêJFÑd’RÜèQdÆÍ¢‘ºa€0‰šÅæ@“Œh=A‰š(N7hˆ™Q•Ôäl‚¡ºIOKÃÛØ€ª©$%%ÓØÀ”»Ir@¢-¤¤G)Î4Âz3høý!|¾ éét=L,ÚŠÍâdWMž”T0†iÕ£´µµ¡¨ áp›ÝÆÚµë0¤§e‚$¡iÖúâL _"}û*ãÏ»¦uj ÃÀbÑ%Ö¦* ](S`˜&ua?Š¢`±*¸¬Nbz”ÖÖzLCSlX-6Ü)NdTÂÁÞh#OŸÌàC&Skú‰„ülxû}Ô]Ûé‘–†U3°§ÊXí&º/Šœ*UàÎvên#°g£Ò{ðánhk Û\ø[µuuu¼ð Üpà ”——³aÆo%¶¨¬¬dРA8N}ôQŽ8â, ¦i~+éý—ã⣃”«ªŠÝnGUUZ[[IJJÂëõâ÷ûq»Ý¸\®ï¬ç@íogìöïé㯣õ¥{9õ̃‰†MtÓDþÖxêñ .a’\v‡ïž,¹ýÒž\C†ÇÃO®nÕ¬\>~¦,sßš*®ŒDsаÄÜ@¿Â+„Àf³qöÙçðè#mLš4…ŒŒ4Ö¯_K¿²>¤g¦‹D˜5óc¶lÙ†Ûí@“aÓc˜:$%{hmõ’’šÁù]HLÐPßHÅöMÔºäää i*[·l¡¤W&.·ƒ5«× GÜdeå‘““…Å2ßXß@CC=iéÌ_ð9¶06»‡ÛC]}#V-n5US[MvN6ÑHŒ`[ÍêÀç Gâ³ôŒT'¦áGQtêjkhñÖÓ·¼E’I’UÅŠ¡‡)íSD8¦ÿÀÌ]°˜E‹–PR\Ü1@׃TUîC•e ‹JHNÍa°{×.23SèY4ˆ@À‹¦™¸ÜêÐuƒƒÇ‹®ëhšLïÞeø|=¤/V«…ÌôöìÞˆ3ÉAuU K–¬á̳g`±hßúâH _>äoÂøø–+šÃ†0A2M0Lb4’0PT…h$ŒÀÄfw`Q¢Ñ(má0v»„aÈ Û°X¢(’ŽßïÇçoÀ™Ê°écé{Ð(šüA¶Tn!3ÅEÅ‚U„vo¤wF (:é6ƒÞ’! œ~ÐM°$Arª‚¯YC‹ø9Î*a$@T…änA®:••Åõ×_ªª\sÍ5yä‘|üñÇ]Ènù­¯¯çw¿ûmmm<ðÀœp Ý4§Š¢PYYÉu×]Ç#Ÿœœ†ʹçžK àÊ+¯ää“Oæè£¦²²’›nº‰[o½•Q£FqÚi§ÑÒÒÂ]wÝŹçžKFFF§9Y8'ó‹§ÓÉÇ̽÷ÞËüùóp»Ý„B!l6³gÏæ’K.aïÞ½<ûì³È²Ìûï¿Omm-ï¾û.Ÿ}ö555Üpà ÿtT¤gzhM‚hXS ¯ÜtèpE,†))HâkÞo :öo‡beÆÀ"êB:³|2å-$¥¤'ïø%Þ¸P59rv»gžy–ÌÌLœNUûö’ž–ŠËáf×®}|9w>©)éía³d$ ÒÓÓhmÝÊλ8|úT,š†ªÊD"Qt#l~ëÖ­¨ªF4"ð6¬j®@˜`rS=Úæ­~uu X™õËëQT ‹Å‚¬È„Ba4‹‚¦B[(DM° €P°…_- F4 Ÿ®ÓTeÅét²kgûöîdÂÄqÔUW³¿ª–ÃÇ0wÞ¸]&2‰7^}ƒ““‘Ž#9¥Ëµ ‡ÃºÁî½»xú™)¦©¨ªL}} Í8lɺB}]ãÆeÆŒ47×P±c¦ˆ’“…Õ⤾®†Ý{ö0â ô(, ®¶§ÓÁĉihhäaûŽM<þøßÉÊÊNŒî~µ$ —+›%«Õ…¦Êx}~RÒ’‰Å¢ØÝ C'‰b±Ù„ÚÚ@Vq¹œDB>öîۇݥ!ËR ÊsÔQd–d¡K&‘Öz/ÛV­Ãço¦ °˜Ö-•TÎ[FEÅ¡è8 Z@‰ ̰3†ˆ‚;Ù‚?ÝŠ¥V'ä•¢’™á>ðí6ÉßE²t]'//… 2nÜ8.»ì2}ôÑN"«( @€>úˆÛo¿O>ù„úúúîSYFÁ;ï¼Ã[o½…ÇãáÉ'Ÿ¤®®ŽY³f1~üxjjj¸òÊ+9è ƒ8ãŒ38çœsضm“&MbÊ”)¬]»¶“ˆv˜MèºN4eìp8…B¼ùæ›,X°€§Ÿ~š /¼°}ò®ÑÜÜÌ´iÓ8í´Óøë_ÿÊñÇOrr2çœs—\r ¹¹¹†,ËãoÓh¨$ÿÿSÔÿ”r ÞŽ+%•q)ÏW†ymý>.“š%ñP'À/ðv<ÈàŒ3NçöÛÿLff‡r’$»ÝÃæ"9Ùƒ©ÇgÕhó‡±Yìäeç‹FñùZÙ²u‡´´²³³±ÛTÕ40|ØÁ¬^³ E5<¨œËW#L¨«o ¨(žœbèÁD"A<餥¦Q[SCSS#6››Í‚ÕêD’5\Š®ëñ¸»VÁ±Ç‰Ýn! cµXˆ„# )ŒžËØ1ãÑ œœÞ " G8㬳 ZØ¿w^r! MȪҲF I’‘e¿/€®X­VLvïÚ‹fQp8ì´´xQU+ÙY.¢‘6ZZ¡]· „Ñ A^^>MMMìÛ» «ÅÅj%31£Q|þ‘¨NCc-áH}ûqæY'••ýKŸ $ðk€@+Z±9$„Oኀ¬(è2H*†)P$ I–Ðu‚Š_’À0‘$ƒˆ!qúo.£pì**+Ø·g'Ẍ–VÌÖþ`+Ù}Š1[[ÙþÙúY¸‰`•uœ »UB‹™˜uQbtS2±zTœi*Á¨Nqº…­ï¿ÇŠio0âÄS0…„dê |7e …BlÞ¼™SO=•·ß~›O<‘rñÅw.ó_sÍ5\ýõ¤§§#„ ¥¥å['¯¿þ:Ó§OçÈ#¤OŸ>LŸ>c=–Þ½{w“~ÏËË#//€X,Ö©Éí¨×4MB¡P§½®$I¼ùæ›<ÿüóœp {챌=šòòòN 0€ÝnGQ‚Á ’$1gΪ««Ùºuk§ Ư/Vñ×÷yP,ò÷ogKÐFeMcÜ_#ø9ÞîѲã‚÷kø9äI¤¦¦’‘•M̈n©cܘ! TˆÛíÄ¢ œ.+†_nSU]’ìÉÆÐu¬ªŒ´t3€ªÄƒ…äfátR=V’’’Pe“ì,Y9°bùJvî܆ÍnA‚æ¦l6+yùù(²L$Ab‘A(ØB'-=h$ÂçŸA4e䨃ˆ„#X¬64‹›•«V±bù Ž<òHªªªØºu<†+VìñêIåÝ÷Þ'%5†¦Z T†Mr’‡Ê½ûIKu!cåªåx[ýÈ’†$ÅmÔªB§6Ûí¶pýõWR]+¡jÐâÝOŸ¾¥Ô×ï'=ÝJIÏb>ûô# DNN+–¯¡pXo^~åm^{õ5>šùa­N†7_Á$T‰;‘:ì)¤83†Š®˜€‰¡G55#f¢1,Š h´•cèz0HA^N.ƒFd×ÖµlZ± -¢£šbmA”˜N«ÆSXˆÕY3ç3²¬&N«†M1± dÍŠÝb‚]"¦1Þ²*#P2.·o3D#&©ŠÉ‚§dðQ‡£YÝ躌:šôíÚ½ºº:B¡>ŸN8k®¹†K.¹„þýû3nÜ8n¼ñFN<ñDŠ‹‹Ù¹s'߸f‹/桇ââ‹/FÓ4 8ûì³ñù|²¢£üÿ¿8Ó1®# ƒªªX,üq^{íµN[^€ .¸€¥K—Ƶ›íö»^¯I’HJJÂétR^^ÎÆ9ú裙7o999ÿŸ? Ú_e¢ý©5¼:ýœœ\†Gøxg¯-]ËïRÜ8Üîăž@?Âkšú?†a¢(q󨪕Áƒ‡áp8 ¼D"QL=FQQ~²,°Û=Dcqo  ѱZ¬ü))Å%ÅÌ›÷Ynú”`ãÆMôìUÈÆ 먬ÜËÄC&²~Ýš›ZèÙ³Á`nWC‡eðlݺ‰ºÚÚx;²IšjÙ$iC–d„l ¨ÜëC’`ô¨ahêª\n'‘H€Ý»j))*¦oi‘}z—Ò³¸„p4ÂÔiSÑc:þ€ŸãO8 °¸'©éùÞÁååeTìØBrr*³g½Õ® ¨þV§USˆ„"HB&âr'³¯r+ªÁå° °‹AvN.6«“hX¦WÏÁ$¹²Aôë×Y68ï¼s¸éÆ›IËHéö%ÏlÙ²…þýû3gÎ9äÄÈOà—J} ‡ÝI[¨…¶p‹Û†&+˜†I´-Œ$ÀkÅétà †ñ·µa@!·gF6ò‘åì۳峾D4°b€n ›&†¦ÐŠÙ£=²²Y:ïK<Â$ÕfE#ŠE’°«› l6Iè©ÊCX²*c³«Ø:V‡L@XÉOWغ`)ï?ü7Nºö$UAß ®®ŽŠŠ ÷Þ{/kÖ¬aÒ¤I\wÝuvØaLš4©Sc tštÔ¦¦&^~ùe–,YÒ¹ÿŒ3Î ==‰'2oÞ¼n“âï›$ø[,ëBbW®\I}}= ,è,súé§#I—_~9<òMMM¤§§ ;ë“$‰^½z±k×.dYæ´ÓNcÞ¼y?h446z ùÀbUˆ„M„¤# é{F„PtdÕ‚"©DcF<Þr'þ)ù¯Ô¾®§½¦®ãv9©mV E¢8|7~>„W–áãgQ¹g/9¹¹¸\NÒRS°ÙܨšŠÍªQ\Ü“'‚9sæ2xP¹¹Yƒ\.Ь°g÷’’¤¤&ÓÐPO$%3# ˆDc,[¶žhD'Ùã`Ïî6oœER’‡E‹–jk###“÷Þý˜ºº:LzF&Iî$â¬8ìv’’’X³z €H$J«¯YRp%9:|0n·ƒh$‚i ’RRpÚì„ÚÚX»b²,«2hjl Wï>x²zàó¶²|õL!>|˜«Öm¢OŸ>¤¤åRU]ašdå™í¢-.9C¡6L!p¸œxR’ihhÄŒJ”öL$aÕŠ•TîÛ˰¡Ã°Ú<(² »ÃCåî:V®ZÇÁcÇào±iÃú”ö#௣®¦ùEìÙ»@ •^½“°Û-¤g¤Æƒ§Kò·Ü»¸O˜9$ðˆԅlYE w›BT iU#òá…dô‘S)s½ DQ­4Õ¶âñË2{õ椅ì_»…•‹æÒRSG²d¡©µ•¬}(-îÃÒY3IE'ÓnÇ£XŒ(ن˻ŽÃ¦à´ªH¦À›Hª„!L@(»[Áã‘ bèšN~:lûÇóÔŸv™ùý1… ýÑDA4ÅjG[Y¶l³fÍê²´ÿé§Ÿât:©««cÒ¤Iæ1n·nÝÚåj]rÉ%Œ1 3d˜ÅbaÞ¼y 0€'Ÿ|’‹/¾¸‹lhhhè<þ@s‡@ À®]»:³X,Ìœ9“§Ÿ~šO>ù„»îº‹3f 1M·ÛÍÃ?Ìï~÷;Ž<òH¦M›¿‹fÜF9ààt:8óÌ3q¹\¼ð ?x4ü»{˜iwñòÝ·0 '¸œ1Sĉ«"“êqã Ãl—É$…š@·ë“9â¾OÉLMA˜äŽ hÒO4ÍŠÝîFaâI!°gÏ4h(‡LœÂæÍ[°h~_ EUˆÅ$öí݉Åj¡®®–}{÷2`àv;d禰fÍ ÆŸ€„‚ªZ‰F¹y½Ø¸i±ˆI^^!{*w²«²T®6…”Ôd2³Ò‰¶ÅSŽú[[Ñ â±§Ñ³W Á`‹Æåt‰„©©©Áïóãr»ðx<466áNJB’d„?h_Z¬[·Ž¶ Ÿ¦Æf,VK/½”` „ÍbÃbµ‚¸\.t]GQUl6+Š"‹EˆÅ"457‘äv# …H$ ’„ÃaIÂn³cŠxð}EìÝ» •ì¬4öíß˶íÛY¿~={vïaäèQyÔ4T-¡ÙMà—®Ø•Phõù…‚\ò—tü¡4FÛˆú£ÄüašD˜†=;Q¡ëáf,†lš3†iÆ@Äy’©› ›øBt›ÌÀ£'³yñRVüÅvIªŠM2±ªа Ë—’‡*aQAÕdEÂŒšÈ±xh+I–14 l&N—J›ÇÀÝ"á@vN Ìbé{o2êøÓñÌJ…þzâóµÒÜØBãþfÜ.ÅÅ…ÔÖT“ššÂ A¨¯«Ãåv¢ÇÀíp2tð„! E¢a6¡ë1Bá)©élذžÜ¬l²³ INub·ZQUÓL''#Ÿ?@«·‘Úšýdä$A]€Ö]~l'šª 0Œ(ª¦ÓcH¦ImMŠ¢RXƒËjåÖ[ï䜳Ϥwa3gÈÂ¥_±¥b :QôÈêe«ð¤xHMMgëÖÍô(ì¢(Ä¢1šZ9û¬qÄx[üìÛWC,ÆétbµZPUU…chЦzºÃfµ¡ëõ 5X­ -Íõ>ÜnUiŸ¨˜‰ÑžÀ¯…ùât»ˆFÜýÛ«HùS!ÝòÊŽÏŽÆíà‹¢©21=Š©ë˜z a#žS D|ÛŠU%5i¬ÞdžysÑ÷í£—M*Ç% E6±`b“L<6—f`·ÊØ*V»‚, dEÆ4’!-í‘]…‰Å"³KØ\Ö¶±˜ªNnš™wÜJIÿþdöLTÒ‘PÑ„Œ0²ò5iR…wÞ|‹šÚZ’lv²ÓSѬv‘0bá’EœuÆY,›?¯×‹¦ªdddâóúØ_S‹'%•â’bjªk¨ª†Íf¡-ÔÆa“'³mó&*vîbÃúuLž2_«Õ«W3jô(ü>?ù¬^½šm[·r܉'i QYYICCcÇ#ÍãaמÝlX¿)S&ÓÐØ„ÓaaÐØÐ„Ýa§¶¦†ôÌLþÆÜIIØ,;wí"Ž Ú-” èC$ªãNJêt¸?`4t5áR@î0KP@ú÷íÃÒ;ò¸ðá·XßœFï,†ÀŒ©˜²‰GiÃÚk3ÞÙ‡¥u;gƒú•}'ý~º+uš³}úômT?x+“Æg « ÓD‚žŠÄ=’‰´"LŶ&jGEkß§Iv%2e&ÀÏŠðÊŠDUõ>²2³ …B44Äã>¶¶¶’ž‘AFz’¬ 6ž“FL±aÝ2w i鹌^LIq>ûö׳lùJX³j1ƒž‹Ãæaæ»oÕ£ô,î ‚ˑ„¦ASc=ª¢ ‡p:454`ê1Ò23i ±Y¨"H476Ò³g>‘¨ÎÊU =~ÞÚzM•¸ÓÓHr8‰„ãÑ$ɤ5ØDØWÇÄqe´úªp§Z<´€úúýÄ"šk- Br³yË ‹ú²yËnÊ{–°úËùxý­Ü{ÏYc׎ šBTU¶RÜc(B(ø1\™=ñ‡Ú6†°¥Òf8‰F ¢¦…ÕûÙYÕ²‹fä2 …²s3Qijòj‹ (*ˆ:@`±Ùñû|!ˆQ2³r …"D£&cFcÌÁ£ãºÝHŒö~á]¾Zl\v‡ÄýW_‹~e„‰ÇÅŸŒl³ÑPãG±¸3¾)¦¦0¦ˆ;™)ŠŠ¿5ÀžÕ«Øµl ɱ™²ŒCRP,4lJ‹,p« IN·C`³JXl26›JÜ'VjvОÄ@ÄŠMF·ÈxR4¢1‰h8J4.x÷ìà­»þÊ¥/¼„‚ÔIÜ$EÂ䀄BpðرDÂìv•€¿•úº 2Š(**fïÎ}¬_¹Éb!95¬¬lì6óæÍÇátÒ·¼†Áå¶ãNrðéìYôíWFùÀA˜Hx<©dd8íô3ÉÊÊ"ØÖFù€x½-¤¦¦c·ÛÉËÍcÔ¨Ñ¨Š‚='´´t aDñùýX¬6›2•ž½{‘`ùòemµáp8èYZŠEÓxö¹g1|(Y¹yøýŽA]}=)Iɤ$yX¸pŠÕÆÈ‘cºLpþŸó#,;/þá<®XÅ¥/.$¯x$.-Ôž!NšÈN’ÐRò§ù¶>ö § Nã7GŒ$+;÷{5¸]š&´ßÇT‚X{ƒ­G/bá(BRâd¸}[-6ÒŒ¬Xúá`[‚ð&ÀÏðºN0B’%D8A7bX-¶¸ ªi`ê’*ˆÅ ª««8áÄéŒ?™½•MX-§2Rm¤¦ö _¿¸0‰FÏ #=‹ªª*’’S G"˜dee ¤(¦Pq:œX-¬vmÁ ¹yy¬[³œH,L=A2Pd MSiñ6qúg––†×ÛÂÆq³¾½²¯²ŽÅ‹1pÐz–óÙg_ÐØTËIg cüø ìÜUÁk¯½'5•£> OªŸ¯Y–q9H’ŒÕbÃétàpØp%¹ ¹]ø£aÁ6¬všÅ$l´°³f->K’š¢`KUðØâfzLÇf‹`wÛp8­¸Ý™8Ü!4M ~o m±I»vVbµ8éÓ§ ¿ZL^N:Å%E,^²”’’žäçç±£b¡Pˆ#†“š’É’¥Khö61pp¿oM/š@¿½®Ô…Á( n£¹¶íkafQYøþ{Ì{÷<9œõ»K)1€š–zt Y‰Ûë C¨´[ 7Õ²á³9´íØEžÓŠÃ¢b±T)†[÷! ‹jÁmSpYcØm:›…$»†Ã¥"l Yd¤˜‰)dLYAQd0"(ŠwzXˆªš·•hÛ$Õ‰Ðe2rRØþÖ¼[šÇ 7ÝaB›A3$4Së4F•$‰ìÜœöD™“OI)˜B ›&:¶DIíñkôÛë®mŸìêHr<Á…,K 5ª“H#Av<²{äu^G{r܉,3?+éK@qiIg„!¹…y}í$P˜&ðØ­L9úHd)ÞašÂ$3|â$²³sèSÚÓŒ¢Éjû±2H‚žÊ¿¯þÿ¯_é7b(F æÉ¼ÇíŸî¥ßЃñh! à ’DÌlÃ"Yܯ7;L 翽‹úºy”e:š®pä˜2Š óïHÑNvXˆ†ºzR ²é›áÞ$ÓT$ÂG&ÀÏŽðš@8Ô‹‹Å0 X,H¸$YB``w9QTHuzÈÊt0bø@üþR’Shiñ¡¨2º¡£ibz=j¢Ç"”ö,&PY¹“ú:ýúö¥z Mdfe šjE×  ,+ƒ!dŊפ±±M³Ó·o-Z«¯¾ÎÀiX»ƒÏ¿\Œ¬Ä_Õs«PæIÈ(š…w>ú”õÛwsüqÇð»+‹,d¼­bQƒ˜”öˆ$+(šFÊ "A?S'ަ©©‘²QCÉ÷‡¨­m gï^Ô5øY…ì«õòå¼w(*̦gQv«JNVN»í§7íäóâ³Näâ³`ÙŠ¥ÜðÊZjÕ\ÊJò1;’¢cšѨŽCV(ÉÍ%„ʲ°•yŸ5âÕô·`•b(f=ŸtÙnL‹ ÃjGÍ)e’7ÊIÉ2Š&#ǔޠñI‚¢¨XmÚZˆ%VàHà§Wœüð( ]7:…§¯5Àš5Xµj¹¹¹H’„ß$)ÙEAA 5ø}AŠŠŠÙ½g»‹H8‚ÕbÃh&ÙãÄïÒ£G»víÂj³“•ž† ‚iB8Ån·E%(((`û¶ø‹ÊbµGÈÈH£ÙÛ‚,Ë„C4‹•¡C‡³më6UfïÞ½˜¦ ??ÆÆ†NçNÁ/âÂÚîp°aÍJTYÂåÉD–é kÑ»or ú3wÎ<–—ãJvóÉìO™tÈDdSgö{sÖ¹çðÞìO©jháþ{þŽiDY¿q’ ìÚYI«7H¸-„'9‰p8Lk«Y–ñ¶´h âp¹©Ú·—£:‚C&Œ¥rÏN\'Á@»Ó…Ó•„n-nwÜlA:Iî$bF”êúZ|~’“³X¶x%6lBVT¦O›Ì¹3Îe÷î]””$¢4$ðëÀâÅ‹;vl{2 UU‡£!°XTLÙ‚ˆ™˜FÜ©,>!h² §d%j˜DñÓ3ÕIÿ¤$ìR«6¡`H¬Ö(©·Õ‚ÝaÁáp9Mìv°Ûìv‡MÅe“°Z¡’Þ»_n×8÷†™4…-82S0cµ8[5šÌÇN=”÷fA´]?¸uíl½è,¬›é1¬?—Ìü‹;·¨üÛaþW`b¶'þ}ùÝÏxãí8öø#hjlÀçõQTX„*Ù©­ÚGSc5·Ýz=.«W'ÿgç‚R»*ýŸ|É ‹+ñ‘N^N69ŠiŠöP´;#Æ?ÓÙ1 ‰ÿ&ÐP0Näð^ÆÍ¹žþÁ4 ‰šJ?í–4X%ð;’˜úø\Jˆ&êøiáÿÁ„·C3ÐÚêÃï âóùùjÑ"æÏ_ÀŽí[ÉË+ ¤¤„ŒŒ4¦L=E1‘eƒX,JUU-±X<¹„?ÐBE–ÔNMÕj¥¦¶–‚ü\BA?7m Ñ·O"‘x…˜¡¨¨ž½Jøàƒ÷¨ª®Ân·sÂñ'ãr¹ÑuƒââbbQ“7ß|“o­­^bqo:ÆOïÞ½ˆé1B¡0M‹Ç§5VM¥ÅëÃ2q9œ¸­2’¡cJ&È1TE!ÓIöxص{'o¿ûBHX%™` @¯ewòiå÷ÄfÕhh¬C˜:³gªÕkÉÊÌÃåpRW[ÕjÁ“’BŸ>}±Z,~Ü.'&‚d‡` ˆi ÁV¬VAŠ'™ÚšZNv›;*(-íCC]#5Õuü |<ëS¼?cÇŽç©'Ÿå¤“Neò”I÷oÛÖ-ôí×?AxøU`Ñ¢Eí„TÍ‚0ÍÎXÓB€,¬È’‚ªIÄb&áX »U#É“Œ0e‚áª,Ì6UeZ†“d݇î„d4\. «ÍÀnUpÚ5œ›T, kŠ Y5Èrª´9‹9ì¦%lÜïÇîp‹…Ðc‚xªxü×Ã<š™}×D²'´û–|Æ­c¦S2u$7ÍžØ0c k¢ÿý2—gü¿ô6iy=‰ELÒù=ؼ³E„i¬¯"##…Â’6¬_ÃY'M#ÙéE’T Wð'äåqÓIj·™Ž_ëu›6óѪÌßá¥Ñ°`w¦•æÁ® 0I2d5žèB&¾ú§(ÈšB jÐÜÜLÐÛÀ‘CûqááCÈPÏí ÞqWÝ|g·ýo¾œãFzP’J˜rÒÅ|úæÜúÛ3¹í‘W¸ú¶g¹ýêc°»Ò…cŽ=ŠÞ€ý-Ké;â0\¹L9xï¾ÿA|B¾v£õúõyìb­ÝCX~jëîùo<ÇÄSÏgÜIç²àÍç»üvù'ñè³oóîç9î°²¡îg™xê|ü™|õÎ?~ò{ÝXUAF~o,)åDš7tI?øìº[¶leÿþ}¤¤¤Ò«g 99Ù´µù G"Sàõ¶òØcOÑØX,)¦‰,ËX,ÖøKIQ°Z,q“*š¦a³Ú°Z­lß±C×±ÛíX¬¶î¨ÀépaµÚ‰-Û¶³nÃFRSÓIJN£  ŸÂâ"2Ò3âËjRÜFíÐɇ°{×N, »ÃOWl³‚¤°wï^\N7¹¹¹ÄbѸ£ˆˆ;ã¥h6Ò‹fAí³qESGÃx¬6LÓ$+¿Œ‹/ëƒ:†Å4ttÃÀÛäEäé ihª•¦f?…E¥ääšE#艷ŋ,KD P Š·¥•¨)Ð,Þ}Õñ\<†¢¨´…[¶V „InŽ“HÔGs«ÄW‹×“E]S€ÓϽ—+¾¬ûÁ3ÉÉÎeûŽ-46Õ“œœÄᇎªÅmÎn¿ývz÷î÷Vÿ±Ú!ÈÏÏç°ÃcT»` ü7 ËR\vØ’pØHD£:¦—7º ìv Þ¦ ¡(2¾æV¢z<;dØ4°È¿æ+æÂƒ=”ãGu¸0Ò Ò¬*6UERM5®ÑÓ4°Ú4$YÆJ”¬Bn|ÍË=3çâ¶$‘dµà ‡Àhš†ÜžÒ ±¾¶Cšv’]C‡ÌQ“yVÌÿøežúóœqÕµñDâåÊýYB1ÜN'w$?ñ"åú“ŸßM‹ Ö!›úö-d×ÎJ–/[FYY ]CBB75Y´Åýš„~b±š¦ý@î7j“”n¤z`ÿ~ *ëÏÍ]Ž1{Ñ:¶×7SÕÄâÌÁæt‚,ˆ}(¡rSì&ÛQZ@JÖ°NV-¾N°–À+>~…«n¾“¤^£iݱ˜åóg2{ázJŠ ÈHvP»¿©=Ú‡Âgo=IÏ!˜:j N»›3ŸÄÛŸÌáƒ÷ß'9»ˆ«¯¸—ª¶¹wÐ._ûï@¿Á#¹òŠ«Ö¿+Ù}ôÏ×rù-÷1íøÓ(M·óðSÏqÁõwqÑÔ2št4½S’eaþWËyòù7ñn_É’u{‰‘#§²ðÓ7˜8¤„Õ{Z¸úš«yïågÙUëeÝ–]\sÞ4>_º€cÎú OÜw9Y™¤g¦ÓXO7¾vË–¼÷½ô>“&Nàí×_¢Þâ›8þ¸¬Gnv—~ÿãÁ»xú¥8Á¿âÂã(þðþpéÑÌþj #†eÅÊÕñI{}[ç¼ÉäSC^¥(¡vW5pË#ÏòûÃ㨓&OCo­GódVN9åöVÕrÕõä¤#ël3ÔZÏôi‡R<e%óæ»ïÆ•­ÍÍLV̪ݭØvBm¡xÛM~¾ù§ÿæz¬®öÈT#†–w ?zΙ––Š¢(8ޏÃB{ [IЧ–$‰cŽ9I’Ðõªª IÑh´‹Ý˜,ËžÍBˆNsEQ:³ô8N #nÛ¤( ±X EQ°X,Äb±øË$aÇŽ!HII!##ƒÔT.WYˆ6P_@AÊËËéÓ§eee 4ˆŒŒ Ãè”}qªŠ)¡+‚ÑGžÌ„#-@’ú“fýú)!É&H:U#Ý•ÄÈ¡)+Éãåf 43jä0òÓ]$[!*ÉTlÝÄÛÛ°kÇ=äääNg¸oC[Ó~œé\÷—û¹üœ“yð–kø|[+ëÍâãæ¨ó®`ôág°xæË„Zö’]8œWf}ÅôE¤X­ôšz«g¿„iÄÈOõà(Éö s:³ÞI’Iï‚,rÁ+ßÎǯ=Î¥×ßÅÆÝ5L;ü[ût͵×0ü7`HIÚ7§gq+„ÅC=‚,‡L]Å.½þ6~{îÉä'­á¬³Îbô)×3÷É+âÓJ{ "ØÀéÓFñøOÄß›…YÌzëiÞþdWÝr»õ÷üå·gó§?\Ic[©~+ —¯ç®G^æúKNaúÈ~\|Þ©TÕVsÛ WuöáÅ—ãšM‡E£ ´?×]{ ™ùIŒ8ä(9ˆ/—­eßÈïÙŸ3Ï9 ‡t¼ë¢HÌšõ‘@-«÷´€ÅErjç]ò[šZZñz«q¥æÛùdΦ2ަšÊöVSh¨kàÊ‹Oæ¡§ÞbËúÍ<üø#lÝàºn&öòô oP_Õ€Ù7ºƒouà¬+ÿÀ½O>Á†­{yôùè•oeöW[Hé1€>ú„Ûo¼œGž›OgÍeÙ¯ðÖûŸ‘Ê~z—å­7?ẫâZáý»¶VaÖï²bõFü¾FÞxãM–|u"¦ðv>‹¿œÉü¥«È,ÊM¸ŠUËç²s ¡@¤ìöÓlãþ›.àš;Ÿ%äocóŽ8áþÍOÉ×j?õ$‚máîréÇfZ ‡£í„Ué$¸Ý5ÁívMRœÈ~Ñêp¨èˆ`šf;1ÚGÑžØ"N¨¥ö$RçvGÛ’$u¶£(JgÆ201MP©“d*І,+]ú Ú×AãÌãZ•Ž¥DA<œ‘ÔîhÐá B{ßM3>@dIFª¢ÄI«ˆgpŠóxû ó¾N%·_Ÿx›Í†¬¨3žIA–$LÓˆ÷[ŠkãuÆJTEA×u„h+‘H¼ÍŽ ‰Åbù· Ñ£Gcš&Ë–-KHÒþkè0i 6:dY"‹!°YíH@4#1QÍ¢`´“]U–1¢ ÇLTIB³Yð‡|üáw¥ÜùPDK1Ó†aF!dbøuä47„ ù-4KGpL`ÀÐ!dfx~ð I‡ÌéŒx€Ñþì«ír$ $¤_²:P€aè É(ŠÌæŠ}ìܳ·Ë‰Ûn%++¼ìôN91L$Y JS¡ª6¾NÐÞ%)NFœyoüýÆn¿=õ׿ÑsmÍ›9ó’Âäø#Žá÷w=ÁØ9LVBé”Kxê®ë˜2v$–Ì!|üîuü渉¼»&DÝž¯åÜQcú³Õ,`ÇÒO9ïäÃÙP§rûõ3ãÒ«¹ñæëyù™G6᎙<YÏïo{ˆ;ÿz¾ö·xzŽáo·\LaŸÁ¼õÙRNœ<’½{0äˆ 9g\.·=ù!O=|7G6‘ŽãýWO<äÿfTïÞÉŠµk©®k ¿G¥07“ˆ¿‘¯–¯ÆN˜€U•عy{jÉÍïI¿>E´6Ö°dÙ *vW’WȨÑcÉÏN jOËW­aM-={÷g⡇âøUâÎm›˜3w­ÁcÆM`ÌAÃøð½·°»S˜|X\Ãùå_PWWÏ©§ŸŽ·n_,XL0ãÜóÎDÎû’%ËVžÓƒI“¦P”ŸÎò¥_áF8xi©Ä¢a,\hzèx¶oÝÀ¾ªzÆ?3Ò‡Ÿ|Jm³ŸQÇâoõ’™_Hi~_-]JvA!e¥]µÓæ:>³ÀÇÑ'œIªÛÂâóX³aùŽ™>u –vŸÌê½»˜ýÙ Ú5v<ý{l®céšdQ^Ú“íײlÕjvVV1aâ!2~l·kµlÑ|Ö¬[OZn!úô¢ªªšá#†³wçVê[Bzè!TîÜLÅž9ˆŒT7+—.dkE%}û•ÑêmÆ™”Á¨¬Öÿ£ ïO"Û_Ú]×Ñu½sI°“dB­pîЀ !°Z­]~ªj]Úê ÔÙ‹ È;#'°¤Ú4¿&¢±X UÕ:‰fçËë€EGµ½>ý-NG¹Ž¶â¶{JçLª£­_ „7Ÿ–,YÂØ±cq:ã& Á¶±¨Ž"Ç@D¢1$$YF˜:âYÚº"==~ýúPØ«€9ƒéS’ÉQǯÀ´ÉP,2 ašj\ÈÊq¤d^Œv_§FH¬U›\ïd¿¢‹V¤Kˆ³'?TŽ)M%”?‘5sÞarÎQcxiæ*„ˆñβpý|ìAVÍ}ᓎ§°÷8æ/üŒÂ,CK³yú-<~ë¥qÂ;þ`‚Ž^,šýbgýüñB~{Ç+óë°we¹ILúÍýüýÆÃ‘Ô¾„ç}ê]>»y'ö§jÏ6zø)Ò³2Yºà3bJ}ø&o¥$`Cš·")ÛÑ¢éDÃДSIË´¡c‘*?ïuêG}”Ë/¿œ‡~˜ßþö·ÿ5¹ÞøûÊüXǼÅÛ›¹á·Ы|ÓÃòm}Ε|òù'ÌÛPÃo÷52ìãh«ÝÌÀƒÇßl¼ÿÉœtâÉ\T»‘úÝ[é?j2Þsk—ú/ÿËÓô:žüœ<Ž8æV._ÆÕ½ÆŒ“Žà½7þNª¢1tÄúŸÂßïû#ç1Ž‹˦þ¸¼öÆ› 9xt#EShC˜1dÙ†Àú‘³Ä×ï?¯×Ë;ï¼Ã;ï¼Ãºu먮®fÀ€üõ¯åðÃç“O>áÊ+¯dÇŽ0aÂ.¸à&L˜L $ðÑT½—÷g}NZv.Ç1ý_®§¥©ÍéÁ&‚¼ôÚ[8SÒ9帣‰[yê™ç¨Ø[Ë1GMg_e%…}Ë™0rØü\·oÞÀºÍÛ™väQªw3sÎBÆAÆüKõÅÚ¼Ô4xéQXÄúÕËY¾z'O£WaÞò´ü 5cÿ“455±gÏêëë ø|>ÚÚÚˆD"„B!bí‰Ub±X³šs•ŽU†oû~àö÷•?°¾Rïiݱ­( ²,w~Üþ)~û¶Ï·õ÷Àÿß„,ËdeeqÄGü¨{þ½Ùeˆ¯âÄyÜ€­saÇÑ‘¬ëûËþËÞçóÑØØÈîÝ»©¯¯§®®Ž––jjj¨ªªbݺuÔÔÔt“––F=(**âˆ#ŽàØcåüóÏÿÖú?üp?üð.ûÖ­[ÇÍ7ßÌW_}ÅÎ;Ù¿üÜ…>}ú0dÈzôèAvv6yyy”••‘ŸŸË•XjOà׃™¾Ã‚ù_ÑÓ·_9—^úì™5ËðÁÇŸRÓØÂè1c9÷¬ÓqjPQQA jtÎ’_xöæ/\Lna 'Ÿ~ƒúóökÿ É#-=…õk×]PÂ¥žËçï¾Á”Nàž‡_àŒgçÎôœÊ‚s˜2ñP"îyüyzäòÙ§Ÿ¢$ÇGykvóÒëï²aË6JûdÆy–Ü5QKý¾JÞùà}Ö®[‡Õ•ÆðƒFpöi'S[¹÷gÍ!#'‡í›Öƒj犫¯Á¡À£=AjzM5ûhl 2íÈ5´o>ÿ¼ï f-YE™GcÇŽ ² Šذr}ò•5õ 9šSO9·]eóÊ%Ìüb.·l£¤w?N>ã,J2ô*ÊgSGw wÝu7MfGEƒGÇ£,¬Zþ|ø -¾‡N™Æ±GN¥~ï6Þýd.¹9TîÞ‰/å˜Π_ïvíÜÊï}Àº[èQXÄɧŸMyŸ’t¿Þ~~Ž^!›6mâã?æ³Ï>cåÊ•øýþ.e’““ÉÏϧÿþQ^^NVVÅÅŤ§§cµZ±Ùl?[{ê ÷6äß¶ïÇlw8{š¦‰a˜¦Ùíû?Ûþ¡¿}ß÷ŽÏ¿}sßùýûŽûWÎã_¹&ðõR½ÅbÁn·cµZq¹\¤¤¤àp8ÈÊÊ¢  €ÌÌÌÎñ˜’’BRRÒÏ"þ®®ë´´´°yóföìÙÃÚµkÙ»w/•••ìß¿Ÿ¶¶¶nÏÚÏ ß5)üæçŸývàÄIUÕNÿ‹ï›ðý;¾wdËëØßñ]Q”ÎÏÛßõýÇüþÍ2ßÕ·sþ·X,hš†ªªÿ;>ÿ)¼xߟ9÷Ú[°{Ò8ø aLÄÅ×ÿ‡‰Ë/>‹{n¾’î|ˆù+VñâÝ7ñÜÛ³ùtñ&¦Œî$I$çåï·]ÆÙçŸÏ´“Ïã©ûÿL‚ ‹€·‚Cæ±b¯ƒÆŒ£Oß~œ{Á¥L=(¡áMàׇçž{Žûî»-[¶pÌ1Ç0zôhFÅ 7ÜÀ 7Üð«<ïï\ŠO Ÿªª’‘‘Á„ ˜0açœsNâ¢üÂqàd÷À ï·íûÿLbc±X·IgÇv4%‹‰D:?¡Pˆ@ @8Æï÷ÓÜÜLkk+{ö졪ª ¯×‹®ëç‘’’Bvv6YYY1qâDÆOqqñºöÌtòór:b,N-ÂÍ×ýÓ‘ÃE—ÿž—Þý‚³O;’ûKKX»n=#N¸ˆç¯: €Õ«W¢X= ï“ÇÊmUlÙºOFÓ.åowÝÀ°’z•ÄÖ†Mq¦å "K2ñîvÂ<ø§xزŠ]•hšÆž=ñ‡v›•¦hÜYríæmœ;ýÞxún¶.ŸÅºuëX³cƒ{åwžOnJ!à²ß^…C‹à úPԸ߆¥óIOË ¥¥™Ô’Q|ÈDT‹‚îm 59¶¶xû#ÄüfŽÅhóyؾ·ŽËN> .ÿ#—œ6GïèφÉ8‰Ï^”ýã¤óÚ«¯¥©.ûW¶Ùp·;`^ùÛ é]VNZJÁ˜Ì%—\ÆsoÏfú¤‘ô)ˆk³ÿô—[)ΉŸ¿Û–DA~Ç9ÖQÛØLVïR¤« -ëËO?Å?ž{Š5^ze''4¼ ü:4¼O<ñ—^z)«V­bÈ!‰‘@ $@'ü~?‹-bÖ¬Y¬Zµª“(L:•£Ž:ŠóÏ?›Íö?u]ž½ï&.¸öN²KúR³sKçþ½ëçS8hbç$è¿2ùâ?êñàOÞ~^~ùe***xþùçBpÁ››Ë\¸8 $@ ü¬ÑÒÒÂ]wÝŽ÷ÞKAA‹-¢   qaþdµã¿ÀD¢=L«.0tYUPÔo7Ô10£ †$0UÐ$•n èØü·ÐâáMà‡!’••…×ëâÎ-x<žÄÅI H ÿ1¶kH‚…¯£‘ïß_ü×ß|Ÿ,ðôÊ%»O1š)cִЯGnûË-ô-é DÁ4A¶v2]ñ âûï"¼‰hé ü X,n¹å–Îí›nºé?Fv+**())aÑ¢E]2÷­Zµª›sÉôéÓ;˜ŽrøÃº•{çwºº[›—]vY·r³gÏîRNAAAA—2III]2 ¼÷Þ{Ýê:ãŒ3ºµyöÙgw+÷Ê+¯t;OÇÓ¥Lnnn—ßæÏŸß­®K.¹¤[›Ç{l·r}ôQ—ºÚÚÚ:|:>ÝÚüðûÕuíµ×vkó˜cŽéVnéÒ¥]êòù|ÝÊ 0 []?þx·r·Ýv[·rÇïVnÏž=]ÚܱcG·2S¦LéV×Í7ßܭܳÏ>ûOdžªª´µµuisáÂ…Ýê:ï¼óºµyÞyçu+7kÖ¬zŸ º9<¾ñÆÝêºâŠ+ºµ9eÊ”nåÖ¬YÓ¥ÍÆÆÆne†Þ­®x [¹{î¹§[¹t+×Ý¢£ÌÆ»•9ôÐC»Õuíµ×v+÷òË/w+WZZúOïÓ_|ñƒdÕ%—\Ò­ÜÓO?Ýmlu)ãñxº=O+V¬èV×)§œÒ­Í3Î8£[¹×_½›ÜHOOÿ§òqΜ9ÝêêX<°Í .¸ [¹™3gv©+cµZÿ©¬zçwºÕÕwúÀ6O>ùä.e† ÒyŸøq01ˆDÌ@‹ ´v²û»K¯B’$ÿí ¿í7ÜWû7.y»Îææ¼Â•Ï>Ím ?çœWžâï_|ŒœâæO¾äxfňaŽÆSK’ÔUüo@BÛÀB=ˆD"ÔÕÕýÇÚüüóÏ;‰Ãý÷ßÏ´iÓhjj¢¹¹™­[·~=é‚””ú÷ïO8FÛífÇŽTWWwÉîÔ³gOrss ƒ)­7mÚD(ȩ̂ª*åååX­Vb±N§“ÚÚÚNbÓQWjj*ýúõëlÓår±mÛ6êê꺔ëÝ»7YYY´µµuFƒØ¸qc—6­V+eee¨ªŠ®ë8Njjj¨¨¨èRWzz:}ûö% !„Àét²uëVº”+))!//`0ØYç¦M›ˆD"mÚívÊÊÊ:³:ضm[—º²²²(--% "Iv»Í›7ÓÜÜÜ¥\¯^½ÈÉÉ! ¢i‘H„M›6‹Å:Û´Ùl”••¡´§Åþ®óÌÉÉ¡´´¿ß$IØl6¶lÙÒ¥M€>}ú––F(êlsãÆèºÞÙ¦Ë墼¼¼3i…Ë墲²’ÊÊÊ.mæååÑ«W¯Î6- 7nìÜî@YYn·›H$‚ÕjÅçó±yóæi<Ñ£GÀwŽ MÓ(++ë÷iûöí]ÚÌÌ̤OŸ>ƒAœN'Û¶m£¾¾¾ÛxÌÎÎþÞûd·Û)//ks §ÓIuu5;wîìRWvv6¥¥¥Îû´yófZZZº\³¾}û’ššJ(Âb± …ظqc—IžÛí¦¼¼œh4ÚyßöìÙÃÞ½{»´™ŸŸOII @ 3zÁÆ;ûÐñÒ,//ÇápF±Ùlx½ÞN§×'eee]îÓöíÛ©©©éÒfqq1ùùùrC’$6mÚÔùL|×}ª¯¯gûöí]êúæØp:lß¾½›Ü(**¢   ³M€M›6ÑÖÖörÃn·ÓÔÔĶmÛºœçrÀn·³uëÖΉÇwÉ Ã0Ø´iápø;åãwç¿:£Ñ(›6m"~§¬ú®ñ˜••EŸ>}:ÇBÇy655‰DÐ4ÒÒR¦L™‚Û ??Q#bDp«q‡´ÓO?›×^û·¼óƒ=Œ0º,Ø´q-¦,“UXL]Mö$’*&Yiéôt°gÛZn>ýò¬³>šEzZÆc¶¨þ{ }& ÿ Ðu¦¦&jkk‰D"ìÛ·ÆÆFb±@€ÆÆFÂáp'9è&ÎŽ;^ûöíÃ4M »Ì²¿™-¯#M¨Íf#55•äädTUíŒjµZÉÈÈ 33óŸfÕûàƒ8öØcxøá‡9âˆ#Ø»woœœ9]¤¤xˆ„ÛhhhÂãñ`èQüÁ0OÁ@—;§ÃNKsþ`ié¸6¼ÍÍÚB(²Œ!ž”T\M DtAzj* µiõHIMÅfµÄ㦶z‰Æôïíš@ $ÀÏ ‘HÇÃÈ‘#Ôq_;YéF ŒÀ4LPUdIÓDV`"BB2H`˜"~pÇ»RHñR˜¤öw‰„„Ä×´DûÇD #!›/d’8 LWVx@žÃoI‰óuºïïŒþ#@è ÚmLÓD‘$LCGHU±ðÁÛïrìI'páÃ÷0ùœÓ‰Dv§ƒˆn°qýZ4·›¤Œš›êq¥$!I²dC–eÌXÕJßÌ\HÜyÝÕ|úüë¼þôó}ì‘€NLב± ÉBtÍ€› ¼ÿƒØ´iï¾û.Û¶m#PPP@VVdgg“‘‘Arr2n·MÓp8Øl¶.1\&ês`¸šo.#¨Aùf¢€ÒûÍPZ†a‡ ƒèºN  µµ•ÆÆFjkk;îWVV"Ë2ƒ bÊ”)Œ=ºSãU__€Û“Jýž-Üqç½ô0Œ­Örã-·ðìƒwÓªfóÅÛpîé—QPZ¾Êm$¹=Ä;‡NšÀ³O?EßÒžìªñrí5×PÂâsyöÅWп¿äfTï }úy† É–m»øËŸoæ½×ÿaKÅ_³ ݚ͟þx5m­Í膙„ $@?s!Ðuôôôíç@Ò(LÓѬ_+kÖ¬Ù×öûÛHMI!#5 g²´9Ù¹Ø-öÖ'˜]"ˆxß%Iê$¹Ý(¬H¦IB ºYIŠ«K¥¯ë¨Eþžó50PÛÏÙÄ4 Õ‚¡›äæNµóÌaÚ芆a‘Q‹ÅBØÔÙ±uáXwz(ªÍ‚"[% ŠEtD4Š1ÉIË&וA6ðá{oqÓ%sÝUWsç 7µOTÚl6G‚ðþ/?À'žx"999(ŠÂ¾}û0 ƒ”” HOO'==äädRSSIJJÂjµv~:kš†¢(¨ªÚÜþPH‚ Ã@×ut]ïÌVF‰D"„ÃaÍÍÍx½^š››illdß¾}455uÚÓfdd°aÞ}öYRSSY¸p!ápMÓèY˜Ï—_ÄÃOâü#sûÝ’›×Óâ¢z÷Ö/ù˜¤Ô2¦{$9™v*wïaóŽj™<»¥ªr'·Wáô¸ÙW±C¦Man »¶mbýžf¢ ¸<žxêE^zêAæ.[Ojj*Í õ|òÑÇÜñè LÞ‡ŠÊ*%¡åM ø¹£W¯^<òÈ#Ü}÷Ýlذ¡ÓdçŸ!fÄ0cÙ‚¤È À_øøãM ž:•)ÇMÿ!°%¹ð}x½­øjiÞ[Ec]=>o+5u4ÖÔÓÜÔŒ a‘¤öD4i¤§§“Ÿ›G~N.Iž$ {Ò³¨ˆ´Ô42RÓ°Û-?„Ä̓qÒ+K¤X–äÎ2´›ˆSijLÊRüû7ÞåBD1 Å¢‚*ó§[oå/·ÝÆ­ï¼CÙá£i´a6¤02H«ÝA0fÃÚÕ‚>Üé)XvTÙ‚î J`±)¨v E’±aEÕl6+N——*3ÚË'ó¾äôi‡³tî—Œ=ÓŒ!ËÊ÷Ðôï'¼‰Ä¿Âër¹9r$¥¥¥¸\®ÎXƒÀÃá0>ŸÝ»w  ƒ„B¡Î`ß¡Pˆp8L$é<æ›™¤$ÁÄ7SÈvd˱X,Øl6ìv;.— »ÝÞùÝápàt:ÉÈÈ °°°K†H$B  FñûýTVV2gÎ6oÞÌÀÉÉÉaûî}<öð=Ì|ç θø¤¥eqâ£Ù²n3}?’çžÀ‹¯|ÀÀeÌzÿVnØÎ”#güAåÜs×ìØSŸI‡qÖ§"L“@s=>ò»öÕrÄñ§0nèÑÜó·Ç˜|è$†›Êï÷;æ.˜ËäéÇpÕoÃC<*ަ¼g>¶Pb &@ üÞ—j>h2ÉD³jH’LmC#¥Ãqò±2Є,,Ø$•U[׳eåFôp”‘ÃGÒ{äöD½È4Õ‚ª(H€Œ‚IN´Ñk£¹¡M#Õ -,[2úÚ:j«ªÙ»{7¡@€@£os ‹ª’ìrÓ»goòò³IIM&33‹Ì´t²33HOÏ$;;›´´T\ÉN¬’ÚiR!IR;!n¿r×ka˜& šÕ Àó2yâx½è >ôï£!"ì “l±asØQ“eDÔ`_å^ê£!„,Ñ»¸ˆ¼ü"44ÖðÈy—P±pž$7fȤJØTš¤ŽFE#„bQdEA‘,ŠÊ‰‡Kù€Qí|Ckçëqý3(ü˜H¾ ï/¦irÞyç1yòdzõêE8þUœ—,ˆÁªU«ðx<\xá…@Ü«~Ò¤ITWW'n~ $@? ‘H‡ÃÁÁüƒ}0âv¶ *õM ™8–³n¼ŠãΜ •yKçòÌc0|Úd’2R°;ì4ìßϺ/rÅo¯§w¿~øÛ¨ 1#B¶5™Ú¼ôØSÌþdµµ¸“RÈHÏฎ縫.$ÉžFm´™¦ýµá(ªEA³«dç厇jÑŒ"YÈÃE ˆ áZª÷ïǾúZªë©÷6SW¹—Úí{¨¯«£¥¥™¶`I5°«2iɇÔÌ\z¤;ù|î"ÆL8³­™š†Jz•bÆ"q/æÔt6®YÊÇŸ|Fé€awôtŒP€ÙsÒ»ß zg9˜³x%}ÊÓ+/…ysçáôdàk®eí†-x2r9|ò$öìÙM~Q iž$ª*+˜;ÿ+üÁ9=zsÚÉGòÚóϲuw §žyÅyihKgèˆÇþgNn $@ $ð]°X,?Êá8îH'Sþý¢2Œ›6 *Ë6¬aë¦üõÑ'‰ ÉeÃò±2ð9'ŒæÃ™ïqZv&X5¤hˆAŽLî¾ùfž¸ã’mI¼ôÙG6n<5€ xì‰8ؑΩW_Ê+÷=Êo½ÀÝ7\͹—\ΰƒrÏ/³ôÓ¼öÕLMeÜȱ2õH¶ìÞÌÐÑqÅu×sÓM× İÉVú<ŒQSÅy¼›¡ƒGÐF˜€£"c1PU"è‘(‘p¿×K[0@UÌ@‘.˜v/h€)ãP¤˜É¨†DLø‰ Ó4 #*!BV¬nƒd«ÀöÛ¨ÞaÍœUŒ˜<‡f«y+÷cë;–2·—¥I¶a±`}=}òTd«ŠÏfÒð‰l«ÞC[Û^’’&ñØCé<ôàs4ÊÎãOMcè€T¢‘ªâ¦ß­ñMÞ_TÍBÈïeÕʵx2rb~vWlcצÍÌ›?ŸôÂþ<ùÌÓÃÑhÁ©”a¦lÁ“祡qrF ¾z Þæ%ôRÊž_’œŸËiS‡ÓÚÒJaîÜŽX„ rÏZýYlÚ 3là«8¬ùའ8lú0 ØNi¿[Ë›ð¶ù5^UE„™·p>šÛÍòek˜;w9ºæ„ÓϦrõBŽ9å|ZjÙµmÕ5µ\õÇû9÷èq|ñáÜû·GXUÑÈëo¿âßÏ3O?ƒ¿¥‰Çz€wÞÿgr ‘ —ùs’äI§®¶ŠçœÉî†O¼ö>ë¸èŒã9áÂk9¨4n¾“N;‡ý»v–ϤÃã¿?Á¥3ÎfղżôÜÓ¼üÖ‡(𕦆z*+÷²mó6.]Áê›°j&³>þ’ú¦ ÉÉîN ïž={ˆÅb]¢Kü»¡i>ŸH$B,£µµˆ§¥4 £ÓæYAKK Bü~·ò^¯ýÿØ;ë89ª´ ?¥­3=î™LÜCˆ‡„ Áuq·Åv±]X`aqwww @ hâî2®=ÓÞ]öýQÝ™Ø%ØÎËoHOOuWÕ­ª{Ï}ïyÏÑub±Á`°Ãö)δ®ëi纶¶¶Û§öiš&áp˜H$‚a¶Ol‡1M¿ßðƒs²,‹ÖÖV à ‰ü`û`0˜–ªÛöœ¢Ñ(Á`0½}ª RÛ·?FMÓˆÇãÚÀ4Ítl{N©í·=§Ô1¶ß>¤¹Þ©íÛŸS(êpŒÛ»®©íwt]c±X‡}þ”뺽ë”âЧ¾£ýuÝÞujNÛÞ{Ûn¿m»c8þÁ9¥ŽqÛ{£ý½ÔþÚ¥Ú}ÛvÔ4m»í …Ò÷ï¶Û'‰ô{mmm;m—X,ÖaûÔµKçöîÇmÏ3Õ.Û{fR×.õ;{ƶ÷Ì´¿v?çþÚöKm¿íµ ƒ;|fRçôSïÇí=3;j÷Ôö;:§õ3Û»NÛ;§ö÷ï¶ÏXûvo/µ¶¶¦¯S$Áív£(JºÞd{Q\\̲eË8ÿüó™yãmw^ýÞyóuƉ7¯€ú-\vËõÜòâk¬±,xñV†©l¬å¹ÏÞç»™_àqx”_Æ›«çqÂ_N§µ¥€ þ Ÿ—þïÿ0*,KEvxAÑ0å0’C• „˜Ž'–I™#—Ì„ŒÒ(Ðð]€¹Ïlá­­ä޳gqÆ^ÏsØ'Ù·÷ŒË½ŽkOø‚¥ïe±ä“B¾z)›YOHÔ-Ì@¯Ì@lÎÿ"‹G¯™G}õpúïv)±Jˆ®øo¿zšÕ±6ZU•E_¿Ï«Ï=ÉÊå[˜÷Ý6®°iC3£¢@£Ðá/ûáäCvç É}{-`·ÝbH²³]þvç¶3Ãû'ˆx,Š&(<úø“¨ŠŒñ—#hjñãöd ùû5ד›“ƒ Xø[Z0-Q€Úhœ—^y§* ‡ùö«¯9êÄÓQUEQQd ]Óhn®ÇÜÜóàdx=ÄcQbñ¢(°lÞ7ü—Ó8öô IÄ£XÀÑÇ ¶dËASÑ5æªu4ZÈ.žé%dI"‰Æ9æÈ£Ðµ8»êÇßróQd‘)ûLk[€ÜüB¾ýö[î»ï>ü~?^x!C‡¥¹¹ùmCQñx<\wÝuŒ3†ýöۿߪڕ±)ÇŸ”Ø|ê½HNO-™µçµß>%Ù–Ú>õÞ¶Û§œ›¶Ý¾ý’\*ÛÝ~{°‹Úï3uìí¿#µ}ª˜c{Û§¾?µ}êýím¿½6ØÞ1n¯ RÛ·ßgûvOSû6Ûöû윶wvv]·×f?纪ªºÓvßѽ´£6HïÎÚ=õíÛ,µ½,Ëéïß^»oï·½·wŒíÛeÛcÜÙ>-ËÚá>Û÷ÎÚqÛóL×ήÝöž™ö÷tês)Sším¿íýµ³vܶ]Ú£(ŠÛ½Îý¸í3¶³ûqgÏÌöžë;§ŸóŒmï™ù±ëúSúŒŒ –/_ŽÓé¤{÷îicí%4Úÿ-‘HtV¯^Í­·ÞÊÝwßÍÈ‘#™3gN‡ÏûÛZé= 9e%¼ûêë\2z,Õ±&†´nQææ·ŸaÓÚu²Bi~œtñåäææR¨!ØÜF×¼RBÑÙÅ,i¬gÉÊ9Üwý]”ˆN°âéývëÂ_/¹ŒñS÷'œvñyLñ9¾X8—á»O$Öˆ:L2sŠxéÃOxöÁ{éýÏ=ÈrfrÏ{oQÞg0-ĸé‘iKÄXh¶röý7rnü&PÌ\2‡žý‹'°$ Cˆ`ÆuÂ*5²xæ Þ{îsŒP1^$Dd\¨B²ÛELw#‰ÄhyΞ¬_ÚÆÒoïäðÃÂï¾ÿ y»aè¹$b:È!<!Z1¿'CT9ëü ì»·ÌÇÞÍwœsOëGCTæóOæSØ¥;†ÓAA÷¼¹¥4%,«z•×Þ|KÔ:|('±‡z=º÷Æ4-°TÄÑèí,ZûFee%ï½÷çž{.'Nä„N`Ÿ}öIÏÈS™†öV¼¿×hß9TUÅårQYYÉ;ï¼C¿~ý8óÌ3]W´–ê`W¬XAAA„Ãa²s pÈ"‘h UU¶µ¢i:™Ù9x]NšZüääd‹ÆPe‰†æºv­ µ©Ͳ?ãpº‰[‘$Á$Ž’™á% SŸCc}=¦¨RRT@Ֆ͘’B^N6¡@_V&‰xhh¨'#§·C¥¡¾Iî¤vtFgtÆï'R 85±h?™üU ©ñž’¯l¯ýþs¢¤¤„›o¾™’’N8áêêê¶»¦i8zõêEqqñN¿sõêÕôíÛ—ÿûß\vÙe4ÔWsÄÙ§3xŸ‰Læu&v8§]v9´zZëq+nJ ËÁÁ2±D C3““']Ó1 ÓK,<ª*&G'`Ei ÐbqLSGV @<ÇdtÓÓ´'d‚€,)Hª€!jX¦…„ˆª¨H²Œ$JÈ¢„(‰H‚Œˆ€œäºŠ€„‰†ˆ„Ó˜õòŸéŒÎèŒ?I†ªª”••¥íÇ«ªªÒšê¡PˆÆÆFt]O)ÛçÔxÒ¾¿Mý´ÏrçääàõzÉËË#''‡‚‚ºvíJïÞ½ikk£¹¹ù´6UUihhÀår¥3¿;ËðVVVþ(àíÓ§­­­dee1pÀ¦p…¥ í5€^~“½ý Þt+rK9éÂKØï´¿à-Ì'‚†Ž†aÄ‘,Á°Hc¦}ž‚*`è¢f ŠBÂÀÒ,,ÃĈ‡!ÅŒ'ˆF"„Ã!âñ‰pˆ˜¿p0@,£­ÅO[«ŸH8D¬5FÛÄCo«AÓÄc1B¡ u­mtï:ˆ².]ˆ´µ0r¿cž×¤ñøpö÷<}ãÙ|ô±—Ë/8‰›n¹—\ƒ÷ÞúŠù«?i Eù¼óÊó ;³e-7¿0ƒW^~‰\~!£† Âí”xùå7¸úŸ7R·q)WÜþYÙÙddxE³évFgtƯݺuãÎ;ïä7Þàµ×^ã„NØîØ‘²©±c[ÇÎTŸ›¢˜¤~RFH)c¤T477sæ™g²páB^xáÀ–KE `èСäää¤y¿Û‹ììlæÌ™ÃóÏ?Oii)—\r yyy;ÜÞçó‘••ÅôéÓ™zÀ\yÅÕ|ÐW|2ç<òO޼â,Ö/ZÆ·ÿ[®¤aC%Z\ADA’A”•¤õ°…(&õêU Å© ¨*ªËÃíÆåqáò¸Q½n\7.·Yu ºœø|™¸=Yøº ¢ØÛëÂT§Š$«˜ÄÄ8ºf`¡¶ ‘P]Óˆ…Ch‘m6Âm!b¡0±p„X$J<%£ÅÄÂaÚš"aé….î~ùbžzëŸ|ôꛌ7Žºo¾ÍÄ¡d"à$q:° ¡ ¡ldc2--TÕ¯áê£'PTù~q%jFQ1Hs|%[šç°¥êKÜJ# [Üó°Á=2ÉrÅhjÓXòýRÞýæcλèï˜J‘°ME‘D0“Ã?/ùÕIiøƒÇÌ™3ÙgŸ}hllÜéƒûKŶ€÷׌åË—S__ŸÚ¿dˆ¢ˆÓéä‰'ž`øðá 6 ¿ß7#ÓЉD¨ª,ÑÚê'žÐ©èÞ#bݦJúôíC4ÐJÜ’ÉÏñQWSMFvŠhÒÒ¤¼KkW¯À”\”—°,†#äåd!H†nÒÔÔHnn ë±H PN<.•–?.¯U‘ ´úaàßѱ£())áž{î¡°°Aƒñá‡R]]Ëå"77—Ë•¦1¤@p{ŠÂV¯­¿·¾¦i¢ë:ñx¿ßO8Æãñ0`Àz÷îÍ“O>É©§žJYYY.®¢(ÔÖÖ¢ª*¹¹¹hš¶Ý㯨¨à©§žâŸÿü'«V­¢OŸ>;=g_¦ÓN?;ï¼S7e‰@[„£Ž;ŽÏ¾û‚‰'EÏ‘#))/Ç“‘¬Ê¨n'†e’ˆGÑã1¢ñp-ž   †‰†ÃDBbÁ0±`-#ŒGHÄc$¢1b‘FB S+ ¶"b‚% ɲ¬âq9ÉðfãreárºÈpÛÆNY>>¼nNÕÓí$3;‹¼‚|ÅNT©Xdz²Ýq3¯¿?“¨àåãïáuü÷àiÎìOð‡öÛÒ/ÚÁ¼ÿú³ÌürûN=œ©ûŽûÁß§L™ÂäÉ“éÛ·/MMMÊNö“O>aÿý÷Dz,xà&Nœ¸KŒ'dYfÍš5ôìÙ3ÝiG#a{V)ɺFT×p8]8œÐÒÔ@~^.-é¶×©¯!H2¡@«ý@bó®n{^ÙÔØ¸µ£–%Ú[3‡ƒPhëï‚hû˜ëZ‚6-$+$b1:ÁngtFgüâ‘ÊÄ–••¡ª*µµµÄb±48M$D"ú÷ïOvvv‡DŠšÐÞª¾}q[ûåç_7•noEoFú8,ËJˉ…B¡í.akšF~~~úõŽB’¤…jº®ÿ”ÙÚ#b.Ÿ‹ß‹x$Á¬Ï>å7_çÕïï¢5 ‰"Ë.Õ‰ÓéÀátâöxð¸Ýdfdâq»q:û|¸œ.² Ë(\€¢¨¸Ünœ.Š*“EA~>n— ,0 IRðeåü÷ר4må‰xëEI"H Ó´è×§wÞzÇs<×\{}øRFÜ{7gž!J¤%âÇÐ5,Ù‰'¯Amu-=ù ÷<|4-¡VºL¿QC9ìžËñ•–àöeâñyQ 3ªAØ„˜†Ûå$++ƒ<_…N{Íë7ñ̳'¯WY¶M&þfãÞ÷ß~‘WߟÍÃo}ÇY‡Œb耞Ü~Û¿9û’ëyè¶k9ïìÓy÷ƒÉ/­àècOಠÎBkkäÄSÎ`Ùª•h–°‘#¸âªk螟Á]wÝEq¿¡oKÕFú DSk˜Â’.ÜvÇ=Œ4”²oÒ¯ww¾ûb÷?ön¯—EßOI·¾:u^~þyToÇŸtGvM—sù?nâ£Ï¾ GŸœzöyœtäAí.fI#‡ñÙ÷kñeçðàSÏñÈ}w°aKµ›Wн|òÁëÍÍÍéÌgÏž=:t(»ï¾;x`‰T¤¤ÀLÓD7 =Á’%+2j,¡º•Ìüâ[Jºt%¿ ˆC1wÎw4ùƒ «*Å…yÄÚ|Ì™™™Ìš5‹ÌÌL†ºCZêU«Øÿý¹ð )**úicC»×‚lŸ·lYXX¨.…ý¦íÏ~ÓößÚ–iÓ~¡‰G jÿ’¥+B‡Raû/{ÿ†a0tèî¼ñú+<úè£<ýôSœuÁE\÷ï˜=ûzvŒ‰ÎƒO=ÃɪyßpäyçpÑ“·Q¡fg‘YPˆ33 Ad='áözÉÊóPš™C)ü¡&n¿ü Þ{ð1N>þ¦þ|òÞ2$•ŸKcøY€—䅻鼣8ûP[³îÙr¾Cì›êá†ë®fåœÏ¹ü³ùøãOùäýW9ñ¤xÿãÏh¬¯ãå瞦!o>q'cFàÊëÿÁÍ×ÙË |¿ê•spä‚Ëoä„cåÎKÎæáô¿]Ìæ «yá…xôÅ·yôáÛ„LÂJ 3?ýA¨× Ú­ýzDÍ)æÚË.â“·^æä£æÍã/àçîIžK7Þñ{L˜Ì„IÇqìÁSé]~õ:7^s/¼ø"¦Ãç~L‰OäÃOWÓ»(1ãÆÓe0Í[sÓßNdéê d8efð¼?ÖP„»§[×.Ãqz÷éGFF÷ÝwO?ýôŸ®“ÏÈÈ`РAD"ÇNgðÿMç‹ÅØo¿ýp¹\„ÃáÎѵ3:£3~WÑ¥Kž|òIêëëùë_ÿºKVº$Iê`Q___ÏÆéÒ¥ ---éB´BA '+“ÅßÏçœsÏæ°cOçã”C÷âé+xã•§yýÉ[‰ŒbHI69¥]èÝ£+ñ–Öÿø˜³²²øê«¯(//gâĉ;¼²,“H$hllüÉ€wGãE*£mYVƒÙz½v}…¸„Ú>a“’µKMRpAÒÛÚ?'CELÓDQ.¸à&MšÈ¿nº“¯¾YÀc&€¤ÓX[…äõ±Ç^“8ìͧpäºøèá—yíÐyø‘L½êBy$¢q$C&/·ˆlÙ‹‘Pc›.ãÃOfðÕ3éQÔ…óO=“7n»Åí‚t¦Ÿÿôÿ(àmi²9“']u/7œs0Ý‹³8q¿Ýùàøsxþ‘»8þ¬¿ñî»ïl©§ÿà‘<÷ìS½Ÿ/§¿ ÀUž„"ƨ(Döñ@KK3±äòo(¾ô,Z¸ˆ¾=zrú“yüõOx÷í·ð7µ2nïƒxúÑ»;œO]mUUö¿[*mÁì,¯ý÷O¿˜É˜ñSÚÝhÏ=÷4yE>LÀÒíJÒº†pzöçñfpоƒøûu÷w¸©gÏx§yˆYN§q}9%eå<òü[”RÅÕ@8`ƒÕ,`£÷ÍÍ—žÄ·=Óáfo¨¯%Ê:[üì³Ï~,œó9ÿ} ÃFeì>\tÑEÜpà JÀ;zôh–,Y¼yóhkk£¡¡a—)5´×víŒ?v$ òóóÈÉÉKf „ÎFéŒd¯m/ÛVVnF×?Ì3¯ë:.—‹üü|¼^oZ5ç—Ç ÈÍÍ¥¹¹™P(„®ë!BºˆyGiôÇùôë%|ñÖŒ3–#†òïkÆs÷¿o¤ß°)¨Šˆ‹1ýƒ÷X»r1cÆMdøîƒðû>ð5 ·ÛÓéÜ鱕––òÖ[oñðÃãõzyï½÷¨¨¨øÙûk¿l;‰;›ÚoÛþõ¶EØ¿%ÐÝö8Ú‹iš 0ˆ^|ŠU‹´QRRŠìt0gá<züQn>ìT,,º Àa—œAùîƒW®#TíD ‡©[»us±aÁü•5ägç2yÊ$N9éž¿ævª K-Ó aE UP‘Bõ΢µ?Ilذ=zðé§Ÿ²÷Þ{ï²ýü–EkUUU¬_¿~—¸­¥TV®\IAAùùù´†?xôêÕ›3ϼ€XìsŽ>ú ¥³Q:°,›oþ„k®y”aÃú¥]¾~ïQPPÀk¯½F8æÔSOÝ¡Þ쮊ÒÒRn½õVrss9å”SvèLfš™>/±H™Œ /¦¡‹'Pd Ó´3 – áµ³M¶VBa›ÿºm¤8¼wÜq^x!¥¥¥ŠÖ²³³yë­·ÈÎÎf„ ;¼žÿIÑZff&§Ÿ~:wÞyçÿôS“*@T39i’ó !yÙâ E‹óå·_0Á<Ö®^‡¿%ˆi@†×Iyi1£‡bžã¸û ²ó Ú%’”Q@°À2“û‘~‘ @§ïŸ%ºuëÀ¢E‹v)àý-âwÞáCàÞ{ïå€è` ùK^§ÓÉŒ3Øk¯½¨¨¨è¼ðˆÇȲƒý÷Å™gÔ&à\@,ùã‚€ (É×™Émƒ@V»×^¶fŠƒ€;ù»”ü¬Ä“ÿjtdº“ûpb{¿wfý3jˆD;µ¢íŒŽ‘rPûꫯØ{ï½)++ÃápljÇã躞ÖfÇ H–I0ж8mS(–ˆÇÓJ ^¯§ƒS›ËåBEêëëùüóÏ …Bdeeýàšµ¶¶2vìXDQL[ï´¥”~iùÌ?ý41) ¶ï·¶™Ÿ8T…Q#‡3jäðÿ`)Åø¥€n‡'¿3þ!n·›êêê?ݹ¹ÝîôkEQ~beíÖ™§¼æ;i ÆðR³q W^ó£öœÀg_~Ë ¹(r‚+®½…píû\úÏÏxð¡8z¯#XÍeÕœ×8öÙ·Igí¢—¹ûæëQ2Ürë§,^ñ0 ¿úŠYs6’ˆôÚ—¹ä{4Þzk1‡œ5…Š\Oôz7à ú¶ܰ7ÇL{„gÞ¿±$˜îŒÎøýǦM›8ᄸôÒKY¹r%ï½÷áp˜D"A0L›¥h’$‘‘‘‘VlØvy<¥Î’#KßÌÌL<‡EQèÞ½;gœqF:«Ý^ƒ7Õw·7°ØQqóæÍ›=z4³gϦÿþtÄöô–Û¿/¦iv0´ú5§º;ž ™†MNå!’röÁoEäË·=ûKbÛlü³¡^’em÷/VûïµH³žÛ¶¼[EHž °ÍámÚþ¹ŠÛû¬ l÷{RÍ&I?}Nât:iiùó-ÛVTTð·¿ýÚÚZ²²²…B»ä!ÇãŒ;–âââz±wÆï/LÓÄápàt:;t´™™™¶ÔKÁÎêúxú‘ûè;´'çœ}çœ>”yßÌá®»>æ±§ž`ÓŠe ÒÏ?~nûíÍžBo¿?'_q4û®¯åÆ¿ÿ•e-*{Œ(eÕ²«ùâ“™zÚ¼òì±Ìûn#M =2½+ ÈÍqS‘[‚öÍ<ùòù´&DzxÏe¯C'áÀˆ€wצ;³Þ™Mÿo#UжiÓ&Ea¿ýö#77—… òÅ_ …(**Âáp¤ûT]×q»Ý¸\®tVÕ²¬´ãf(BÓ´´Kš$IÄãqšššèÓ§ûì³………lÞ¼™X,¶Ý¬lVV~ø!999L™2e‡ã a8rss;/æ.L¾mƒÜþ½ß*¡´C4¥:_ÌN,E‘ÕäI$+±$+ R'’þw™‹íµ…[¥µÆ¥Â0eê£À6;xÏJ‚`,QLo ‘ªŠ´lžˆ `ævà·„Ùn¦bYI2ºÀÖŠAÀ´,ì·LËL#U˶l˲]±:€ê­U¶å_Ç#Hhq\7ã†OAþ‰ 7Uúg‹^½zqÛm·ñí·ßFÓ¶Æ¿4àÕ4#Fàp8:T)wÆï;ÊË»rë­·±tégtéRŠahÉçA" ðÑG&ß}÷F‚Üü|6|´˜{nïM·Ý3¢ŒÆ Å¬Oçc:³¿ž…¬ªôXÆjÞžñ ­n¹äçyˆ442cºŸ™3–‘_T‘ûõäÑ¿ÀL$Xµú+âšAÏ^%øÜ2WÞðº{ŒíË¡ „Èôe²Ï‰cY¿®’㎻ޞªwæí¢W$Š"Н¾z!Š"4¥_¢¯,**âã?æž{îá˜cŽáÔSOeÿými®ÖÖV@:Ë»mÆïÇ@’ÃáÀçó‘‘‘A,cΜ9\ýõÔ××sË-·••…ßïï€+<+V¬ ¼¼·Û½CÀÛ¯_?î¿ÿ~&L˜ÀÒ¥K8p`çEý ygóbUU1-UV°R³ "`u›)´ÞžW#"&`âPx¼^4ÃD7t›§!Iˆ¢dƒRKH'OAD“Ò¦‰H˜&Brÿ6ìøv¦D¶‚M¶fi­ÔL‹Tn×ÐtØ4­­YlË>&Ã01-3QSàÔ~mÓ¶%KÄ2mM>Y”°,3íY-ˆBúüäÔ^“óö ÑJŸOzB!ŠÈ²ò³rÂÚäÏ•Y(**¢ªª*m©¼+2…'½äÒŒ0 ¨®®çâ‹GsÄÇ íz1»çØú»µÍëí½÷cC¶Îªwº]'’ýmÃA0ØÌ©§>IS“ŸââÂÎ&ù¢´´”ûî»úúz6lØÀƉF£¬_¿þ¿Ñ©±+FÓyyyy¼óÎ;ÔÕÕ1räHî¸ãºwïÞa¥/µÊ£(ÊNûn]×;X+ŠÒyA;oò&24ûG! D-+%0Mš0`X³½·×Mcc3ëÖmaõªõlذK0‘e%-Ûa-Ð,$+6ÓÀ;öksk–ذ—·f]@…ägl +ˆBÚ=$å&’þ[;­;IN9À$·DA@%D+ ä)i{˜úQ AQ´ðx<ôêÕ‹ŠŠnÄ¡`Ë4±ÄäÀg&3¼Éã±Ä­àwÛ‡³=hµ:S?¼ýöÛzè¡ÜsÏ=L›6m—­©ªÊ§Ÿ~J=èÞ½{'­áºn`Љ`êÜ}×tº€êV;¶›«qàAT®œÉ—ß×rì 'pÿ¿ï#§gwŽ=|*×_7#÷Ìþú3ëÓïim‹P49û¤cùæ»™„£ëW×àËÊËbÄêš‚ŒÜ³?ª`2ñ@”W^ŸM]À`àÀ ¦NÞ ˆv‚ßßfšL"¡'Ç¥ÎÖøåž3ââbB¡çŸ>~¿ŸŠŠ úôéÞ{îIaa!¢(¢iZÚ9-墶­Í°$IiW6EQe9½R¹nÝ:>ÿüsêëëYµjÙÙÙ 6 EQ~ =ÖÚÚʸqãðz½;-Z …B2mÚ4 ðù|´ðÚݳ)Š‚ˆŽ¦A{”)JÉŒ«^§ UQñ·´±pñr/YFk«‡ªâñx@W†Q·R@¥VA°pJèØ âVJ-VΫ$Šv¶4ézÒ1§¼ØWËJ[;Sm&ºng S Þβšv‚7 ìSßm¿iíø¾V’ñÕ7 ‡Ãdfz:b7†FnFq-B4Á@ÄÂÂ4L$KDlqêv$,,4ðsR¦%´3è0#—eùG5 ÿÀ;gμ^/ è¼È/'s'Ÿ ÇMDª7~ÎQG¿È»¯/fÍ¢eœuÙ¡¼ûÖ‹ÌYQ…¼d3ÅùpìIc¹ôò7yìö·8ãÌ Ä'M˾ç–[î  oBÕU|ôár ªÀ‘ábøîEÌùf-{Ž޽‘™É‰§žÎÕç]É­:ûMH¤ó²tÆŸ*b±–eñ׿þ•¶¶6 iiiáÛo¿¥ººšÆÆFZZZhmmMÓ RiiŒ‘Ìꦲ³YYYäçç“““C^^]»veÚ´ii@[SSÃ]wݵÝDP(bÀ€;5 jjj¢gÏž\{íµŒ1â'k"‘è0uÆŸðš& kV úq¹¼ˆX–"+¸]*¦eQYßÂÚMµTÕ¶†q8]¸N2<ÙX$â); QÐ%K·$òýœE@DLÓB³4,1™E% ËÀ0mZ$J覆$ÊÄ5!™™m_œ&¤ÿ#I°È¦‰ešˆ¢„i¤è ©¡2œ-ËJS¬$ÿÖLrwm¼›üvÁ^RE‘ o¦a1÷ÛÌžõ±Hœœ\ýú÷f·¡ƒ),, ‘ˆŠ&0“ÙdA’ü_,›clY1CÝèä÷&L`ùòå,Z´ˆ¬¬,êëëw TJúÄwÒ~¿™%ŸÏ‡Çãé0èãtºÈÍu¹@+ϼúOžxè¾ùâAʺe3ebon¾ûxŽ9à8þO¸åÆw(?x<Ï=ó°Žî{…Uuo¿r„çqçCßrÐCÙ{Ïc)ÈîË#÷?Â轆 GȪ]S\œC×27ßòN§‡¿]t °œcþr&¢(σˆ äÑY˜ökLtbØRq +¿Vˆ¢H4eÓ¦M†AyyWFI$ÁëÍÀßÜ„a ¸].²s²©¯«AR=8 –iàv¹ˆÅøý͸ݱQÍ"7ËKMM-Õ55ØÙ;+t’e™ææfdYÆçóíPÉGÓ4œN']ºtùÉçxòÉ'sÇwü&Úóñ+^°Ð­8 â–À–º «üÔ75ƒ!âr8‘$Éá Û©’†–•äðÚ…#¶=„(Ù%c)îª$JÉl¯…i™H‚ˆ$éL­€€ š(‚• –E7–i]%)RLŠÚ ˆvf6Y,f'e °ôt¦V’HfAlWGf¥‹Ôì,¯Ži˜É ²Í ¶-ËLØAIJÔôgìj`«ŠŠ#Ûž¬\±–…ß/"âÍÈ GYÝËò(ÌËIJ$4Ó1-Q±|<Æðdc ò»ÿµp»ÝôîÝ›ææfb±Ø.‘%KUï¹çž* ¿G8#”—WpÅ—/£G˜f<ÝWué"ñÞ{|ðÁU¤nQQd‰††&¾ÿn-’(ðÕŒù¢€,9y÷9¼õê·ÉS‚õõœ7{Qš¶tï3ÓbIY¾f&¢´UòÊkÞFEì«VÎ;ïzA ¸(“5Ë6³Ú‚Og.í¼x»t©lÞ\‡ ¼ýöUØúÆFgÃüLY–)--EEü~?¡Ph‡T»ü‚"¾úì¿ë9^yå.9û`tg.SöÊÚuëxò±G¹îî§á­÷? ³¸јÁè!ýéÙwϲ˜¦HˆiÉ A°3Ä ]£¡:ƒaóÈÈÉDÓ4û :—æìøðÃÓ\®û￟}÷Ý—ªªª]’EŒÅb´"wU˜¦‰$)””#‰UUÕh†‰ô;5¼Ðuìœ\²³|´µ¶ÐÜìGþ*œS} ¸‰‡ü\sÝë8\^NöØ‹êº69ð8¾ùâª[LŽ ìì\~½ˆÞ˜@aQYY¹¶C‹bb™Þ¬ ¾˜1‹†z[š('7‡‚â\‰„-3¦™dgfS[]Ã=7Ü™œ¹æ’“ŸƒnÆÁ·×IÂ2øøÃ™ø›Û@o¦›ÌŒL|¯mÈÁVm_{Ö&‚i[îY‚… ZéYšd”–†(“œuY$" ú,§¤ —–@YTq( ËB:«Ö:>D©ë®»‡ƒ™3gÒ·o_úôé³Óâ‡ÿng"]KyðßÿäŽÇž§¬Ç ¸ÿ^Êó½´NÞ¬âM•6uoª[5Î9ÿ.8ûj*+ܧ$8âÐÛøÇ½ç2¼ß(@aÁ—/ñ¯›ÞgÁ÷A>ûøsn½ãxž}üMÖm®ä„ƒoå˹×rü©ã¸÷ÞOyï©é{Ò8”lž-+¸ñŸ7àêÒ)ÔÌâU ´2ór1ü›™3¿†C;["‚e<¼‚ÊõuÔµ¶Q–ãéÄñëÜù’D"‘HëÝîªhlläóÏ?G–ejkk‰Ç㈢H"‘H/ñ·Ï¾¦¨‹QÂ2 ÚB1Ê+zÒTWìòàv*ÔÖ4×­nw”†æ6FŒMsC=9Ù™ÛZHè&Ù¹ùvßÿ³}@€#Fàv»ÓÙÔíE$!''‡îÝ»3jÔ¨Ÿ5Ñ8pà4±jÿ™õëדŸŸO0LEÕÖÖ’™™Éúõë™ýº ɶԙ(JIÎ’ ¢Ö)§|ðÁX–ÅÒ¥KilldÓ¦M¿8èEQ˜?>999 JßÑY³d3o¿õ –%râ±C 4·rØa§ÏÀžÜüÏ£„0aT—ªÐIwèŒ?c69EgØšØùiáöå£7­¦¿=¹ôæ‡Yìà±W>åÕWîeÔ€>duÎ+ßÁqÇÇE×ßOfd5Wßþ&¿êBMÿy«%‘H„ž={ühýÅŽœÀv»í¶}úôaÑ¢Eÿu›ÇÙ´i%%%ôêÕ‹‘#GÒÐÐ@SS³gϦ¬¬ŒX,ÆÒ¥K1bš¦±lÙ²m’@ùùE”÷ ¶¶’ 5[¸à¬ëÈräRheÉ¢ù?Ì`ZÛá?>6ФÜLC  Ó·oOª+kh…paiÞüN‹Ö"Ñ(¡PMŸÏEyi>Ë—o¡±®‡ÛA«¿Y”‰ÇÀ—›K"lе[Ë—/`ìøñèq@(D$ÃÐMtÍ®Ê 4¶±^[G°­ I–1-#¡c˜:Š* &Á®™t9“%š¦I"ž@%0 4ÍDDÁ–…–H`±UÖ,ˆØY`QDP$Ün–a!Š"†¡jnCÓuÜ^Û»ÛVmH2’“E*¦-< –fk'×HrnD!É9Nr-ËÄ2ìI¢]Øfh ĤéF$š ´8›îeyI~"èz M×pµ+àëÌòê´¶¶bÆ. ·,[Syg^ìÿõ>Lz˜‹¯ú'¯¼;ƒ©GÇ?¯ú?ÞxíeêýŒ9ŠX$ˆaþ>.|K} CÆíϹ§Ï­O¼Î{½ÏÃWœÁ«¹ä⿱ÇcèÚoëWÌå‚SŽ ÉÊäß×]»Ý%³_>¢ [ÜùÀ©Øôè?¨XË¡=ùâ»ëìÉ#³Q2³¸òÊ“=3½‡÷ãþáýÛ\qíáºO{^žÉA‡i— Hê|J¦LžJt>¤Ñ[;S6lÜÈ-×]IV–È‘'ŸÊ%—ý“SN8‘ÑÓŽ'¸i)§_úoî¸ãÎ8ó$ _7®¸äïd« Zƒ?ÿYr8lÚ´ UU)))I/Ío=zôàÁä–[n`Ù²ei9³źuë8ï¼óþ«dJ*ªªª¨®®Æ4MZ[[YµjUZ‚Õ΋TUU¥y¼Ó§Oß.§ÕEš[[¨mjE-$Y¢2ÐJLµ8eʉ,X¾„f­‰úhµõ8E ÚêO€ˆn ¥ ‚$!ˆ"z’NÙ1Ë«a26 J E¨¨èÆÊe_1vÜ0–.^I(`'ñ?r†×²% Q2°ÐPéÚ¥§cáxˆ¼üòóóÚpºœ,Scî·ßâöd2óýÏ’Š6`•$ I–I$â¨3a §Í0Ð Q’E» ËH¡Yi®l{_[ØB7Œ­qVb«Ñ„(`hQ#Δƒ§RÚ¥ K€ «ÖðÍì¯q©êütë݃#NšˆÏ—Í;¯¼Åú5ëÉÉñÙ ;Y4—–*#i‚”,Ú³l›2g³‰ÄíÆ­7ºaYˆB’Ê` `ˆè ¼,†– ¡)Œ ÚbQIÄcÄÔˆ½ïÿñ¨¯¯gÆŒ¬_¿ž¡C‡RRRò‹«(¤¼ÝGŒAAAÁ.Ti%‘–¦F ÃD’Ìýb/¼ø"…ÅeÔ54qà´ˆ…ƒ?©:yW‡$ËÄ"!ZÛ˜†AeµAv™‘AÕæMœxÎß8먩ôéZF—>=ºß.-:Ø^{’ttÜúܵwP3¶Iqt(«Ýæ÷öic;åí':£3:c›©h¸•²>Ã)ì®áöúX´p›7obÚÔñ8*‚øÂm~‚ GŸx]×@ñ¢ÿѪfNNO<ñÅÅÅôï߇ҕÛ.åÿ”Ć$٫¿àݶoܶí§§é†‰nØ6Ù†i÷NQ (w}ðÙë@ª–ÖP[ßÈÞƒpº4Ô6PW_‡‰.ŠX’€¡é`H;hK°IŠ 5•­ôïkàrK|ÿýbõïËÒåkHÄÄ4ýâ÷̧ßyÑš`"J ª2š®Ñ¥KyùnŒFÅß/Â0MTUÝDlàçöº±,Õe“˜…¤r‚­•kÙÛ[¢jsXu4&†’¬ H"†¡frùÁ¬¤-¯íª&Š"¦a È¶š‚¡k6B-Ó°Uܪ¬gÒÚÜŒ¥ë¸2¼dåæÓ²Ï¤>„›<{ßS8‰Iû  e¬ßÔ†ÛiaZ©¡ÓÞ¿`¥n^+™áM™V*ÑkÚåzíT!H~‡¶°ÐíR=+A·î¥dåäPW׊ž°ULÓ$"ÊžÎñ[:æ”SNࡇÚ%¦)À;räH€]ªÒ`™&† C¡07ÙáFOè4ÖÕãË*F’_…kÑX”ÂÂR†D<$#§€R݃Ë寣XH¾bf~ò1—]ü74ÓöG˜êwFgtÆ à,Ë¢ººšììl𛛉F£)IiRUu 'bø12}>,Ë"³ûAq ±D"‰öŒí‚]Ã0((( ±±‘ÆÆF222~ UU¥®®‡Ã±Så…µkײ÷Þ{sä‘G2lذ?Õu‰K.MGMž›ù‡Œ;”Þå}yoî{Ȩ@qa!e]J‰lÙ¼‰&2– FÂøÁdÞDÁBF”t$Têk£#mäæ°e}+ëÖodØðîÌýz† ¡¨ZBK{üa¯(è$â"¦i‘áó›í¥ª¾ ¯3a`ȶ㙡ˆ¢„$)ºan™¢bÿÝŒbRçÖ–²L AdÓ00t E‘DÓ0ÚQlG3 ð Ôlë_NJ²œva³¹»"‚( 'tzôêML‹ …±LEq¨\Åô1œdxE\NB¡ N§Hi.äãv»ñdzY±h)kV¯ÁépÚ€]”’3Û<ÃÄ>WIHdû=)YÐfY†n"ɦ%ëäe3¸9†Á›i!‰N,Ë…E"®âÎtuÖ¬AÏôD"±Ë( )­I—Ë…ÓéÜe†ž  Ã5×ÿ Ë2i\úW"I"Z"A°µõwÕþuuŒÜk?FOÜÕzzÝ‹>‚íBxÌá‡mkdS«Åù—\@m]ýÏâÈýþ"%sö{ŽNEgü6QSSÃá‡ÎÈÿýßÿÑÐЀÏçcìØ± <˜‚‚$É–F£Äãq4MÃ0Œ}jÊyM–eEÁår¥¥Î‰7ndΜ9,Y²„X,ÆÈ‘#yçw¨©©ùe!‹Q^^NAAÁé íÁú¯©& ŠB»×¦)#àBÀ´Z™4q*»ïÖ“ÅËV€ ŸŸƒÏ—É÷ßϼyó~ÒX$i*ºè$j¶âReÞþò-ÆôÛƒÓ¦ÂÓï?…¥Bu°žÆï[Ñ’›‘Å ®=P ••[¨Š7#«nDK$¡é˜¢„"X¡¤W¤Ý®‰˜Nq¹—-ëk5»Xµ¼Ž±{ïÆw_.ÃÐD,KA4$ÙD×~~;;Î_ðšÄŒáD +*ã‰;ÈÊÊÄ27‰DéÑ«'}ô#žH ñù|¨•Ɔ Ó´%;Lø~Î<š›pª0E[?ײlž¬`!bò0L[Vlã Q´/¶®ƒ`Iö $Ø…evVÕΦš†–…"˘†I°5H¯~½ÉÌÏfü^ã))+å™Gž¤vK5JÌâ‹ÏW× dÕælÎ_X…á ˾L²,ÓÒÜBå–-dx¼ì¾û,2221 Ã6AÐ4DQÄårb&³a‚ àt¸ˆF¢(ª‚®éˆ¢HMM ­-~\²‡x4LÉ€<œN•¦º ‚,#ˆq›ë‹E4FR3èD¼pØa‡aYµµµ¬Y³†uëÖýâ 7¥ÒðÅ_0xð`Øhïàk†A~~>Ñh”P(„$ý]FÁÎJ§^[&†aâr¹p8øý~$Iú¦ä/¼ÔToâo—¼Ç—ßa ú=…aXˆf„»nßL_Ði’Ò¿^H’DKK ’$qá…RXXˆ®ë|ýõ×¼ôÒK,Y²„M›6QYY‰Ãá ¤¤„‚‚²³³q¹\i]XÓ4 ‡Ã´´´ÐØØH]]±XŒÒÒRH¿~ý8p {ì±999ø|¾ôÊÞ¶j=---L™2EQvªMìt:illdݺuÄãqFŒÑA—wW%RìLST²²à¼“÷gøžã¸ìê»Y²j1%ƒñcÆóÅ'óÑGli²¼SÀ«( ’,c$(¢äpÓ5àÛ•ßÐÒPÍɇœÀk3ÞÈı2L°4k!Zׯ$aèxPÒg ªê¤®±Ž†Æ&Àv¤iaÑH —Ó•M!–-[ÃØ=ñÅçs¦n¡Ÿ=1ß•càN) ª¨àR¨7¢nᔆèGeM=uÍT¯_͆K°L1i‘ º‘T-,ËÀÂÀ‘tdKÄâX–…"+èÉY–  ˜ØK½¶Ü—N‰[IŽ®Êæ&!ËËí jŠC›ˆ-Á¦Xˆ²ÂŠek,“ÙÓ?Ç0 <>/I!fÃÀ´ ‰8  â ³0MƒO?øÔÐI. H & C·­Ñæó¦„¡Y²5Š%ÅÂíu‹F±ëÝD²‚*+„i%‹àT%ZÛÂÄc:NQA$‡ˆ,«hhñXg§]lÚ´ MÓvI†7¥Ò°xñbJJJp8»ð ‚@qq1çœs'N䍣ޢ¡¡áq-rssùôÓOY¸p!W\qÅæ¸w*Ë. .Ô‹ëî~œ°ßæÇýÞ"#^½÷Ö­\ÄÐÑûvv ñ«†Ói×ì<øàƒäçç3xð`JJJ6lpŠ¢`š¦ÇÓF¦iþ€ß™RLHýȲŒÃá@QDQ$S]]ÍòåË©®®féÒ¥ÄãqN?ýôÜZMÓÈÎÎN&ÆvœU,..fúôéÜpà ¬\¹’¾}ûîÒöJ²išì½÷~xÜ.,\̽ϼGßo–4´ðå‡ËøòÃd»H,Ã@P$LËHÇ#Z ˜I Tû-Y´PT‰¡#véh45… ¡¡±…¶P˜ÕÍ•l|ûMNœvÏŸÅ–Ú-¸0EK‘‘˜f±jãÛLËÐ)+*£° ŸP,šuë0Ì’(a˜¡°FqivÍHV5!–™«=fs¾›‡ ´"˜$Dl I+é?ÎÂoÂ÷•w’ÔAuÑÀ¥€.‚f%ÈóœtðpÛFN1 A´Ð5 M×QDË´’7½Ž(‚¢*ˆ‚ˆ‰…®iëNE–IÄm‰.—ÓÃéÀíq‰Eˆ'â¶{†a¦-ˆÁLkó™†ý:OÆ‘eQ²i‰˜†¦ÙË †%7@e‡Ó‘VzÀ´eÙ–Í$C@’„$¨•e)9ël¼mH²œv“$±]›‰É\D¤d6:‹ÙªX€†ª¸pdä!H ¸U dIL[ºFªêü=,XÀ¥—^J[[\p»ï¾ûtþ›0M“ÜÜ\œNç¯Vxeyyy¸Ýî_¹Øë¿?n§Ó‰ÏçûC÷OÉÆºF4 Ñ»ŒÖò_uÚa]‹ï=êÎèŒ ŸÏÇW_}E}}=¥¥¥Ì;—¬¬,ü~?ݺu£°°ÜÜ\Ün7^¯÷geìR«^@€¦¦&jkkY¿~=K–,!’‘‘Áœ9søî»ï8è ƒ¨««lûù%K–àv»éÑ£Çk<Eéð·DŠ?¼KïÖBØÏ?ÿØ–ŠhÉToÙ‡ŒdÀ ÞÌút ó¾^KiN– ’"âvKX²N$– à7i¨ [„­q@ WˆÆE>Ÿ½H `"©YöÈÇç’° ‘y«g2qÈ4õaÆÂ™ˆªŠŒ‰¡X†ah¶o¥$QÓÖÀ¦ÆJLä$«‚’BIaó–-´li¤wß|dL]ÇZ@R¨«oÅ×0tØnÌ»E•!¡µë[%EJÞÔ¤èwxÅÁq'ÝäÛÚÀÎj ÚÛÝ IP&Ë ‚`sh%IJkè꺞–Ù;l»“ ˆ‚€aÚRcv1¥ÅQ‘%‰”:Wz©4¥›üŸ(Šˆ’˜v4%AØÖJ4m¹0’n©2UŒf%ÉöɵË&[[-ÿHž»•ô”k÷y°ìïµHëôbYi nI»à¤1I#‹ÔDCJ‚yѶFþææf>ûì3ÀÖ[t8»¤SŠÇãìµ×^§¾wu¤ž¥]ÉÞUÀ0u-JKKñûýöä÷AgÐ|ìI[ò÷m®‹ŠTU$à·-ÓÝ^Ohqhm6‘U‘¬\{¢ÛÚh'2dB“ Ÿh;¯Kˆ‚ÄCrEG’®KŽÁ‰˜ÝUeå€iBkˆ*8ÐÖbâõ‰8\Éþ¡3:ã7˲tëÖóÏ?Ÿx<ŽÇã! ѰrÅ2¾þêÖ¬ßH·îÝÉô¨¬Û°™D<ÇëELê[pºœ´5ÕQ×ÐŒ'#‹âü|zõîɰ‘# ¶µ!È2» ĸqãØgŸ}…Bˆ¢ÈŠ+…B²ƒÙÙÙ|þùç”––2lذÞåË—sÐAqÉ%—PXXø«·]ªAöPݨðÔÓˈÅ>%7ËÍ©gí‹…ƒçžI}m3àLâŠ""^gž@ÓEvF1ŠêÀëõàtª"aÚÂA´¸Ž`ªšL &ÆÆ&?A3 ,^û:cvÅ¡{Ì[_½‹¥f"9㈠ƒ¸F{ÄRí'ÈÔ‚4·1- YRÉÊÉ£{awFŽóí‚ïPE°âa“úêTÙbø°A̳”ƒ{‹%X·¦2éWà ýfJ;¥4Ȳú ìBøá÷H;ýu‡dƒJ¡c6{{¯Óï‰?̳þ§4å'¾×Û›!ïÚ}hšF¿~ýÒE¿Æ>MÓäCá®»î¢OŸ>ÑÜÜü»ÏÞµ¶¶²÷Þ{³bÅ N=õT*++™6m'žx"‚ °yóæäó´«°™¯)y²ï  Ç./¼ðÆõdÚ´ÁüXzöìGii&šÖFE/xüÒ+¸ç®»xksŒ¶ùßpó?¯â ÓOâíGžàÀ“/¢©f#UÍ…J˜ú¨ÀÐ!}i¨ÜÀÅw\ŵçÜFNnzÛztÅI8bìþ“ùúã/(êÒËVrèɇòÔuGS ¸äú+yãñg²×±¬ÿ6rNWZÖÌÃQ6”IcpÉiGòúÚf>ºÿq4ï J»uÖuv±ë¦…ºNYYYš÷º-ÅKELÓL«'téRÆ[¯¿HmKœ;où]}#¢BI¦LÑÈQ\ö·Ë¸ï¡ÇÉÈððæ›o`:²¹è²s@‹0nâd¾˜þ §žr*ÇŸq>u"-ÍMéäƒ äååm·O‘e™@ @VV²¼cX£( ‘H„Í›7ÿ&€7ÝkY:šÑÄ"-m n¿m6–ÙLiI.—ýíTÜÿð‹´¶Z8Ý"!‰xZÄëŒj¶fHËÆRF»TŸC)*Ì¡"3 ËÒ$x#Ey2ÿ<ó$>Y2—„dñ‡ £Ãq¢á±¸n×lXØ´O$T‡Ý4Y³q3µþVt9€/³„>]Êѵk7m¢5uM*}º3õÈ¡¬^\Mf¦‹qvgËÆ 4Ô5¿I»ËugüÞcŸ}öÁ²,V¯^MMM •••»„Ø.Š"MMM¶2‡Çó«,Õ·µµQ^^Î|ÀgœÏçãÖ[oeÍš5¿{Ð(--å /¤´´—ËÅ3Ï<Ã_|ÇãaðàÁwÜq‚@mm-†aüÂç$2C‡žÇÁe·Ýzaš?VÀ% ˹lÚÔÀüùëØ´©žyó61pàWdyšé;äPf<»˜é_¯çŒKþÍk·Ý‰iÉôq(çž}2£Çÿ…7¸‘VÃÅÕw]I¼1ÁS÷ÞÃ{OßÍä£N§@ …c¨ÑV<¥ã2&—šuó‰DÂ$batMgää‘|þtagOÆL·¯Íàƒ§®`ðpÙ¿Î¥¹n»ô¾ü"ÀC¯Í+7ßÁ›/>Á%wЍîìþ‡#¥n°« |dY¦K—.ì¹çžÔÕÕQ\\Ì”)Sèׯ&LÀårmxŠ‚@ ¢ï a80ð×6PÖ»; ´­ßÀϾ@¾ä ãÿÂ)ç\ÀæMsillDУ|öîË<ÿÚtn¼åVž~ðnžÏ/ä¤#÷¥®®ñG7 1pà@rsswê™Íœ9sxá…(--åâ‹/¶‹ë“D»Ø×J­< ~ ¡¾™{î~Џz—séß÷¥®©'HÄD¼È² d`Y&Šl‹ÇÐQp{³Ñ"º!¡%¨l #6ÅEÍIXµq)³¿YÇ!#öâ­/§Ób—î %…>|ÙYdúœ¦NB×‰Ç LÝÀ”Š ·5à˳ÐM? V××!Wr1 kwd± ƒø Evуï¾^AKƒ‡Æú:M’Žõ-PuÞÎøÃDªøaWd S* ³fÍbÈ! 2d§žì¿t¬X±‚{ï½— 0fÌž|òIŠŠŠ¨­­ý}*7´k7 mA:vìXöØcÊÊÊE‘wÞy‡÷ß·ÛÍäÉ“Ùwß}‘$‰ÚÚÚ_àZÚ|øž= 9øàÝ2¤þIŸ›:õrd9ÈZ°«‰søtÆ|p÷wŒ™4…=ü*¹yðýgß“YØ jpåÅSÞ Çÿãš7†xùŽ'‘=¼™Ù\ùøWøk×rÚ…2|ÜT†ïÑy³¾§÷Ðál\2šZã8‰ž}úÑ}íjj×YìuÌÕ肃µk,†O<ˆi§_ƒb„¹õ’‡pgçrúͨñÓÚà”+/fÔäÃQ³d~Z×Ù!üFJ¦†õë×S[[»Ëö ÓKðÍÍÍ,X°UUéׯ iµ…ö±nýÎ>ûB° –l¬çáGÀát …LÝÐñ·Y±r%±pˆÌ‹/´k`,‹¸¦3~ŸiTUVñüëo#aPYYó“Š”ÇGQÀ·óù|TWWóÜsÏpòÉ'ÿ†€×žXtk3@F· U@`Ý–:þñçЭ»õïÊ‘GŽdcU#/¿ò5áP·ÓK$ç¸c'3iÏž<ðà»Ì_V‚Š,+84Kˆ¡ &²d")dÚt‹§f¿Ï)ûÎòµ+ùnÃÏ>ûŒ––Ž;î8?üpZ[[©­­Ý2+²,%ÁqG€lYˆÊû Ü 5&å}‡¦ÿ¾ÿ_N q‹ ’›=§Üáó9Å}9è»ê»±Þ¤¢ÿP1“ÒÞÃ(í=,9qƒŠî}ˆ…,òËz X”v¦‰)¸Ø÷˜³7›H¹…>ê«LrKÊñæŠ|· Q:ã÷) YŸÏGEEÅ.í4Mãý÷ß'//Ïæç¶µ¡ë:ùùùÌŸ?¿ßÿº™ 8mëmUQe…úê-,[µž1cÇâ²tü--,œ?Ÿ.Ý‚ADÁbá‚—w§ki’,ãonJßO=ÖÜÜ\`ç* ’$u «ýšz¼Û»–?48²SŸ– VÜÂ.aßz¼+××rÍ oa™:ÃõäÐcF²ac O>þ!/¼ø /¼8‹n]Tn¾q±˜Ì=wL«&átø°Œ&tÝÂÒrÙ) zUžøè}¦íq çá9_’‘W+® †d‹ȶé*±¸F¦7BaQ.N—Mö¡Ç m½¨¬jáλú±eé,>÷kúíWÂi§DïŠÑœwþ)TWm$;+‡ÓÅÆëØmÈ êêxöéù5JX:ï¯{‹ÿè,¦c’œY%%<þØbþÿ]ÇšïJ>¯aâr¹~SåU«Vñàƒ2oÞ<öØcî½÷^ºvíŠßï'þŠÃ~˜:t(#FŒ ¢¢‚X,ÆÍ7ßÌêÕ«ÉÊÊbܸqvØa´¶¶¦‹N‚Áàÿì}ßñ[†¢(„ÃáP~Êó("%ù\ô·¿ÒkØdn¿æ|Ž=æHî 2³ó(ïÖƒ‡zŒsÏ=ƒGïý7C&‘»lÙEÝ8d¿ 46·ü¬cÍÌÌä³Ï>#33“aÆípunÕªUì¿ÿþ\xá…ý.Û=e¼°=·Ï„MøE–¬©gþUï!ö™²;{ìÙƒ¥‹7ñÆ› ¹âêÙXLÙ«;‡ôdÙ¢_'S-Ç“% ÉHrŠìB-ñ²¶Ê wA)çìK7¯CÍ)Â%d!Yn QBÄ´¥XEô@n£[A„i-þBLà _Ť)Õ,ù¨˜ + |×ñÆSa²¸”PSŒÙ³êijlFVÚÈÊv 70gÎH’Š]‡Àæöî:*߯­‡k™& m$’Hàr:Ò‰gû†¶up±lå!)öŸg]:ª*˜‚FJaA°Ò>¿XÈöñmóé+x Û€N¡ÝëCSa›ÏÚ’a;eö¦ÂOúöíË£>Šßïÿ•,\«—Íáµ'ŸD‹ÿõKÀÄåv" ǰ~Î\q+,ó Ó)[Ø¿Ubg+2–e"¹¼äææ±hÑ<¾þr6[*›»gwtAbÜÄ}Yºp?õ,åƒ9êØãxæ¦ ùä³Ù{Ìá--lïÑkoZÑ>|>sçÎ¥K—.Lœ8q‡€7•ámiiùÉ€÷×vfûaÁ´+ uIIÝ”43ùâ› ŸÌœ‰Å~“`ìä"¾ý<Â÷Ÿ—²j©›.Ý4®üG7ò3 øzf& ³Q áqäç{ÉÈtb8ÈÖÃì¹ûîl‘B8ÜNÄDŒp¼x"‚¬€Ó­àPUª«Bä—ÖcˆmlY>ü¢:Æïe±êÛÝ)rt¡ÿ+‘¤CY;¿‚Ý»ÇÐô²l 'E"Äõî*J Ô5nF‘[‰Fü´…¶`Z»®O“<³f`™"ºf;›X[!/‚`´oì´H:µÔ¹T¹}ÄÙ˜¦~,ØžŒÐ¶ÇÝPþ`ÐÚXþÈÝo ±…­ß½-¦îpøI»ãdXIS”Äí²·†i" Bòlz“õ?ݹî¾ûî|òÉ'|ûí·igž]ÑëºN=~u}Àm£²²’‹.ºˆÅ‹‹ÅˆÅb\uÕUŒ1‚Õ«Wÿi²ž)«ÏE‹qØa‡ñÈ#ÐÔÔ„ßïg¿ýö###ƒ¦¦&,ËBUÕ]\LØÈØ £i¬œÊ/gøRÈ·K^"аϧ¿÷öDÀ´îҌȟ7ìÊââRºuëöƒ dUU‰Dâ?¢ ¤,swE¿š IYË]QØšz&w4É …Bì±ÇÜ}÷Ýüßÿý“'OfÀ€äääàõz1MMÓð·´réÿ Ãë& ñÜË/PßÐHnn–¡sýõÿ¢±©ofŠ·<úZ‡8@/Á”ß&«‹ÀõWÔ0ÀדMù)^]Æüwj)éâÂíÍÁ—™OfFÞœ,róKP¤R`F"‹H™Dk¨Ú†ÍÔÕV£Š».ó.ÿÈ‚E0ØJvV&Š¢bËÃÊÈ’„aXX–¾MÔJ;¦¤aG©ÏdbSí¸ÃRm»í%QQ #IªªîôÆNéý¦¾ä‡î.;MÛº¾¢€e‰Xˆ6´,KK¿iÚ©}!y¾©NE¤¤æ®išÉ"ûMÓD×u‡²ÕeÒícYQ$‘H š®cšBú2ýogs***X³f ‰Db—¸­I’Duu5™™™dddü¦´†öꫯfæÌ™x½^Ž:ê(6nÜø§\âÅb8Þzë-ÆǰaÃ8餓ҙବ,-ZÄ+¯¼Â%—\¾«òÏØºÆ_òJÒÔ!Ž @ó.8æÎøùá%‰òÐCwóÑGÅé>×ápðÎ;ïpíµ×2~üxššš~Ö3›™™Á«¯½Á†ªf²²²~ñ• ·ËÅš u$ îzðé]¢OhxU“¿u(‚(ÿ »‰DPU•ë®».­Y¾fÍæÎ˺uëhjj²Ç9EAUUTUµíow2y0 ƒD"A"‘@Ó44MCUU èÑ£½zõbÿý÷çàƒ¦¦¦&hÂHvvöNWçdY&ÓÜÜLssóNçž{.=ô•••”••ýªw§( 82º¡¡ëYäàqf¢ÊE¸]Å8ExÜ]ÈËìN¶¯ì,'ùÙ^$!BÔXO >º¦žÿ •š:?`S¦PVPÄ׳7ðíÂzròJq:TIÈÉ”P$‰–ÍgJÿQô° ¾\½€œŒ,LT,AS¡¹¾šù_ç1õ ™––¯Ý¯1aø¦¯™ÎÔ!=ùzf¢×E]‹„ÕÜB3`b&’bâv9%Á4ÉËÉ¢O>TtïG ¥Y™Y¿àµlš²,KIÀn—›-•Uøý~²²²Ð´>_™™^ÚÚZP·ÛÍÒ¥Ëe™¢â"Ùv_“…D"Ž"+Iã»3ÐÍ--tíÚ‡C%¡%’ SDÓ4´6Úš†‰ÛãFVDQÂ4ŸÜm;í4˜–I"¡`a™ ¨N¼/š®Å‹ºng&ˆ¦eÒÚÚ†,IÔÖÕ¢( ‡“x<‚ÍCt¨œ.'Y>MtíZNcS­­­äçå q:¨ª‚ÇëEU$ID¥ÿù ï[o½Åa‡À=÷ÜôiÓØ²eË/ÜÁˆi•†Ñ£GSPXÄWŸJsc3ʯQ¿fnh”wëÍ€»‘HĉD"”••qæ™g¢ª*ÅÅÅ477#N—›µ«W²nõ2DQâ„-,úFy× ¢Ñ–e …(//çüóÏGUUÇV³ËvDü£tl¿ÿéŒß>¢88àHÆŽD @E233©­­%‰üìûLâ‘[ª}ä?0¨˜ð.p'ßkW-{¥œ7ワúê ”uë¿Ýå|I’ˆÇãlÚ´)=!>|8Çß&ñ´u¬M%†Ú?ÛZ§ ž¶7æµW¤Ø<FŽ™V—ØQ躎Ãá 77ÇÓ!q²iÓ&¦M›ÆòåË»XúÁÜU½à`+•3iH%«ˆŠˆ¤ËHäâõä#˹¸Åd8+ðet'?¯+y¾\²³Áá­&›KUÕ–n¨¥%$Ö°tÛ´J’$DA"ÓYÊœ¯-f†VAN=i]ʼýÎbV®€Ü¼r$Q5ˆi&ðeváã•ß3¶{O¦ ÍGËæ“›• VËa¡Ç2)ÏKP]ù%ß¼—ËAã¦òäûOsàqc¨©÷cÉMì1² ²ÃK}C+[6é„# Š*"‹2‘`€ü"‘}÷Œn5±fÍ»´êŸ +*¨÷ÝÀÛîâXØnx3¼È²”,î1Q•–?¢d§ã C§g¯žX¦I0Âép``Fq8Ä ,Ë$;;›DB#‹S\\”î`¡0­­~|>¹¹yx½²¿[å©RV½¿Ì ”òŠ6ƒ,_¡ Ÿçžz€Å‹—àt¹9ü¨cØkâ$­!$ÑÂ05dYA‘TU!ŽÐ¥K4MÇ0 òóó$‰æ–r²³q:DÂrrsH$äåä’›“K,%??QH$4ŠŠ™rƒë,ñx<éתªî2>•,ˬ[·Ž‰'2ýg™½AäÁ—浪,DÙvÈÒˆƒ¢‚¡ƒiËcߊÑHªÝiÈJÊ©Ï~­'l#I]ÛÚ÷©*´…àKN%ˣгÿP6nÜÈgŸ}ÆyçG<çŠ+®`êÔ©ôèу¦ÚM¼öΧuå³ôèiÛàþPmY :íc‰…ícÅäù8Àá°Ý¾4=y~X‚½¡¤€(lÝË>ág$3|0÷›0ï¿x1œ}¼ àNêêêxçw8å”S¸êª«˜Ÿ§Ë X4×Õ“á,$ýñÕ)R¿~%Ó_y ÁÒ(î5I–ë*G5–žùW<Ù 1¡‚#=…'n:•£¯û€.Î Ÿô§Ýp*O\v#s—læñq÷¹×à(ìÍ‘gž@cõOØ#ÖdÕ¯„ ØTŸuëÖ1~üx";ã{Øa‡ñÍ7ßP\\Lvv6ªª¦©R(‘äãwƯ>_&••ÍwÜ}x½nlÊŠ˜|ÿý¾ûî"&LÃÕW_MeeegƒýA#333Ý7Ž5j‡Z¼†aàp8~Cí]9‰]ËÀLˆˆ²··§R‚ÃQB¦«7…9C(ÊëFaQN×zÂñW‰˜5Ì_¶ŠµkC(ŽŸý5åݺóä=³ñeåàÈ+¶f‘XÔDüdA½^/ , ‰PRRB,C’$ )++£ºº:YQmý'v5{'ÞýeÚr«ûO[å …Âú¸ãŽ£)**bÉaOãÄ_ÂåÚÜ\ù7UeéŒ_ðΛ7òòr&Ož¼CÀÛ¯_?î¿ÿ~&L˜ÀÒ¥K8pà.>ºvln²(¨ˆ‚ ·³7N¥^÷@²}=éZ8ˆ²²L¾Zš_3wí×lÙ\G,* +N‡‹ ¯ÇÆ)©N;Řü·ýs!%ÿngLKl·½Ë¦mZ` …Å2–éâµDj%ŠJCœ{q>²;ÁË·ÒÒØ‡çC_rÅå=Y»ª•/>3iÐ>HN|Z%±z·æ'¨«PÔ0…YtëRˆâl¤©)€ªf£8¢ql_"a‘—žû–†7…ÅnFMràK µUÒÖ'7;ó·ËðŠ"¦ ؼ»ÇüAã™ÈöYÉEÑæJ&´@+yù¼þÔ]4¬û’ý¦@E÷Þxö–|3‹ÝGŽàé›î §°{x‚†aóTËËË©¬ó3räHæÏŸÏ=÷ÜÃÈ‘#9ì°ÃÈËËÃétÒ­[ÅvåyvŠZkšX>1Y}É-êEY…J(>šIwã±[ÿ‰;#“⮃0lM[6rù×óÝ[Ó™ÿåkt0š›^œAi¼ú؛Ԅ1ÄíßÁ€11hHO‚mÖO¾¼^/]1°~II Çgúôé\|ñÅŒ5 §ÓɨQ£èÛ·/MMm‚Hyy6öò´+¹º¤¢iÆïv0¶y‹ÐIiø¯Ö_€<óÌ ¼ðÂwL™²G5‚®]ûymAUel=O=¹½ƒÜ\ ·[¥¨('ù·hrس) n·ŸO¦¤¤‡ÃÃáèÀ)Ý~ÖØÇ7ß|Cmm-‡reeeÄb1šššÐbÁäR¾‰ì„Udæk¯½L;ábͰà›Y´¢ 1¾ý<¬˜¿¹³g3þГ)·9³¿§¹®ÅåfȘI4l\Æú5ë¨8”ò®]inn¡ Èîƒý~ÜYXz$n—EíæM¬_¹ˆ¼²¾ Ù-këpz³p{è M«æSWÓ€¬x˜xØ$6-YÉÂ9óØóÀÉÏ‚–Ö?æòSŒkRÞtŸ¸ ŠŸwxU+ ÕÌÃé.ÁåíF¦{ ù¾AôèVAQ‘@L_Ìæš…,ÿfþ` YÎG•óðzX–l'Ç,“”AEǽØÔÓTº¬=öÚÞ1‰‚HBÓ GB¸=n ]G5rŠ,4ÝÅkÏ%¨ª©æ˜£zrÌQ±7ßRG/e/î89‡›g¾Kf0ŸSNÀ3V±vEÜ|"Í:U¾JDQbýšùya2³Uš[Qš—ÅaõÃå 4‰ØœëÜ"'ÁV“D|×Ñ€˲@FÇ··êð.^²†–6|Þdg b <^'ÅIk[[‡,¤}Ãmm`I’ÈÈÈ  ÇmšƒËE†/›%‹æóÑs×s̱G3tÜÑÌÿæ+š7~@M}5ö¾„òž»lkF–E2|,_üsÞ¿¾ý‡2qßãHD5æÏyõ×1bß¿Sܵ±`AˆÇcä3çÛÏxë­çˆ†„Ã1¢‘–†®,âöºñº<ôëÝ£O8¯/‡`›AÉÌð¡*N6mÜ@¦ÏGn^~+–©“Ð4ÉV«ø©Y'EQhh¨bÞœïpªœN'šÍ­u 8~ý‹D°“Çh i:N·È H?ò0±÷Þ{óâ‹/î²fÉ’%Ü}÷Ýö]ò+¹\.–.]Ê×_ À°aÃèÞ½ûgðÌ›7D"A¯^½ÒÛ[½p8,_¾ü2geee8e‹!“Oá‚›o f³…˜^i°3ú‚`ëN›†™þ¾mµ•…´æ²Õ¡SNqÛ¶vβˆ7Ÿ3•L)HL³p»Ý´µµ1oÞ¼Ççñx2¨?ÙÅ=9äÂGÉËó&) ¢dËÞ¥ö™’-2 ³Xµ•>ÞÔ!¤¶ßÞ€‘>-ËB;žwZC:ýšœUû<ÅíàÉi¨mã¦3÷À%Ȫ“P(”î+‚Á kÖ¬ùÁq 0ˆX,BvvœÂÂ| C'‘ÐÙ¼¹™o¾¹Š‚‚bl‹àßSd3ëÛY44·rô´ÃùåUþgÖy˜1c:S§Þ»>ÂÁÔ©Ù²¥…~ýJ’ã‘…$‰D"q¾ýv=£FuÇëu¥kAÁâ‹/6“Ó•+§3¼yyydffRRRB=¶»š”Í’ÅËùnÎ×ÞÏ-9â°}‰$²Ùëħ‰mžÏ‹Ï>Æõ/?Af ®9÷¯d—£: ì߇ٟÁȉûòþÓ÷²ÿ‰g§yÝr}û9G_ú/t= —ÞÂÇo=ÆAœÃë·>†§ 1bè´¿³î󇩋dqøñ'qËùSÒgçüãvž¹ýJï¹ ?z‘ŠA“iXü!½ö=ãOÃ-ßÁü‹¹ðŠó‘2riXò3Þx—ýO>‹¦-[±ÏqXªÌ§·Á!S†à}$z 9ÚŠ`$R§¿Ë ï§Ÿ~Jff&ÇßaáZvv6sæÌ᫯¾¢´´”‹/¾x—Ó¾ûn.cÆŒB|äåôÄ)÷'Û7ŒÂüÝèÙ¥ŒÂ<‹¦ð\VWÎfý¦:BA;©#‹"¦en£8µµý­v²«ÂNL¶¼‚`[9·´ÔÓ«OWŽ;þpª«7U€ßß–¤^ÊDÂa,C¦¥ÍO˜õéÚµx3\B ÌX&“5éÖ®¥Ýhm«§¹¹Q”ˆEdd˜ ›A~qœx(‚bŠX–€7q»=x<êýèšE(âö[¡w¯~»âRÿ#§µüü|f~2ƒÅ‹—rúigÚŠ >–`_I1Lƒp$B<ã¡äÐC¥[·î´¶ùI$4Ô×P\RÎþÇÿß|ó2 ¾šŽÇ+4 >å Jºö%ÐÖl/h uUäuéÎÈ.cÓü7˜þæíèF„¨ácä>STÚ‹p ‚‰h&e¾Lƒüü²²s©­©#‰ãr:±DÑ¡`&tZê›Éê–…¢:l‘$Ý Ky9Ï?ûwßqEÅ%DÂòr ¹þÆ[)©èE¼Ù$ˆdff¡¨ ¦¹U¡A°y{¢ˆ(B8J«0„‚:Ë–­aͪyÄ"­$tƒž=SWÌàÝbIо¡…h2AøííeÌ“O>ù«îsÆŒL:€SO=•}÷Ý—ªªªín[ZZÊ­·ÞJnn.§žzê½æEQD–efÍš…Çãaøðáôïߟ[n¹…‰'2ïëO˜¹¤·,âç"ŒqÜe·3 O·_t MþãŽ8Ÿ}¦ìɬw_bÌÁÇP¹l‘¨AÈ_Åü¯?Â4Mz?€ÎÚ—gn€y_Ï&¿û0Ž?ó>zú6ªü`YL>êzìE~A>—ŸóW6T6’H$ÈÏÏgõêÕ >œQ£Fñá‡RWWÇÞãGså ÷ …ÉÉóRÜEäµ{ïgî·³ÉïÒ‡¿ýûÖ|ýÏ>x7&§ýã.Ì–¾_¸œ³/?Ž×ï§×KÖy¬Y½Ñéãâ›oeþsY·j)õ ™ª+›ÁC‡“[Ú‡ÁÃzðÀÕR_ßÊÀq‡sòù‡óØMw1l¿3(õjÌ›3Wà«ßA¡û =éÛ¿þ8¦eQÚ{(w¢`;¯M˜0‹Î=IõðÑGaGq ,`ÅŠŒ7Ž 6àñx5j¡Pœk¯½‚ .(b¯½öÃv棾‡š?¿Gç$xÑ™áý/ÃdË–V¦MÛk®9žaÃò‘¤RlŠ‚Îܹ ¸í¶<ó̹lå/:ðû›9ó̧¹ï¾ã((èHi8øà‡˜2å,ƒç_yŠü^{°ÛÐ^4 B®\ÄèçΣ%×I¬°?ñœrBc õØKv"Gšm™ªßA„B! „(Š;¥§øý~ºvíÊ!C9rä¯sçZ2Ћ\ß`rÜC))ØÞ=úQ˜§Q×ú3çLuc#±˜EtàrØÅøfÊèÊ:&’&¿"ÉŒvÒ*ÀJ~F¤#…ªãÊ;D¢atN>å$ røò‹¯ÉÊÊeÃú¥(ŠL=¨¯«§±©žüü\ rY¹b>ãÆD’vãùçÞÑ ¿@aæ[á”ãoi£­-‚(ªH’@F¦ ¦Â¬ºöp3zt¦V‰eIÈ’T Ó4hmõ£¨ºAT"8»îž’,ŸLh%³66Z×Ün/¹‚ˆËåÂåvSY¹…+V0qâÞˆ–ˆCU±LƒÜ¼,dÕÖ´u{|„~Z[ýö2Ez ; EÉ$¿¸§KB‘DÚü~Z››ì¢5ÃÀ´ \./^_ÝÇž„€ŒÓ™ X³r9’(àv¹É/*B¢í[l‹Å% ˰õàLËÄM¡Ž¤V •Ä›ÑhŒž=zSTTNCƒ­Å8|d/róòÐã ÜN'¦ãª+þÊüï¿£ ?MÓ’üä”ZEUUgŸsgœu!ºáxm­mxÜLËÀˆëÔ7µÒlÁá !a˜æÖ,"¶ ÀÿrL™2…––æÎ Ø¢ð;£4¤~v&DžÒD3fLz©kÆ ,\¸Ýwß=9è‰è:˜Z‚.={‘HÄhZõ7Ýû>çÝñ {ô†®ºÃúïÍßoœÌ§@ HEEuuu¦)$k×®åûï¿§_¿~Äãqû™Dzô† gäa—ñòg¯¢OÜü$ëk<ùéË8»n|«ê(s7sýù7a…D$m#ýFá¦7¡e¥Åã·þ‹ÍÕ-Œœr<7üõ4Î?é@.xé~V¾÷!‹g>Âòï{rô•2f¼úð«\ì!L;ë^ž¾é\B‚=&žÀŠÕ³‰GƒL8è0JºbýÒ¹„5ƒW€º-ë ë(È+J_+Ã0ôèуêêjª««ÉËËcܸq¸\.^¯—ºº:\®ÌäµKÉø¤ì¦ß@M–å$í«ðþ7ÑÖeÈrFŽÔ©"3ï6ë[LÓæ)n­µØú“µÍÍÍÛ]1²,Ev’“YÄÛŸßÃÚÊù8þ<†UÏàK‚K š›[Ò«5þjA KÐÁJÐÔääŠGß×eߣ&EaÜA±,þŸ½ó޳¢:ßøwêíwïöKï "E°`{‹ÑXcbzL~jL³ÅhªÆ–ÄDÓ5ö¨±·XA¤÷²Ëöv÷ö:í÷Çܽ»HQPt_>ûaËÜ™93gÎ<ç9ïû<üxìqtµCù D¸óѹD£PRa©Ðc—¶°øm“«~õ0>¬YfòØfL)øóÛ›io4|ÁtNõÙ ,'ð…ãéjw¼в0aê¹ø‹À´=£5îx ŠAUàîçæÑÕ=!p‡ˆÍ:ž%gÞ@Åçãßü6Rª‡‚ ¯` "ͧüœøÐÙÈÉЧ¢_‹¢ˆ¦iùÉÊ®BÓ4œN'UUUìÜ<ø<ó5ì8Æ›@UE–®Èk¼±òm¶6µcáÂ)ã•t Ü­~×WØ.¸¯›–…iæÒ$-#—¹ãu0 ûZM™2šîàVšš×“Éj„Â! $“IêëimmÂãñÑÚÒF"gР!lÛ¶#Ç”±bÅ6 Mfü”0…ÑØzRYËtÒ¼-J2!£gt]Æ´ÀÒ„"ADÝBqHdŠ$‘%C*§°  éd]ßýéCœÖú$Àú$FTU&ŽÐÔÔb;T:©T’ââbŽ;î8"‘(²,!Ë™L–uë6pøŒ™H²€CuÓ¸y7ßòCbñnœ.•x<Éé§}K.ÿ*™Œ†ß_ÀŠe‹¸çÎÛ©©­Åãö°lå2fÌ<Нãûtwõ +’,ð‹ŸßN¨»ƒ¡ÃFÐÕÕA0äúÝÌ Á£Qe•æ¦m¤3q¦: ÓÀ6†mJßv+6Hgâ¬Û°–£ |E€EO°›Aƒ‡ò¯Gž±Í.•pO”D2âLæ;Þ‘GG4& á O$p8X–A°;ÈqÇÍgò”Ù¤ÓÕ…žÊÐ Q^>”J‡ƒTÚ`æU„C=öLN°r«ÄBßðý!9eŸõeŸÏ—·Þ_×B×uª««ñx<躎(I¸xíÉh˜ûècOà’«ÌÍ_:Ž!cÆÍzx±-˃?ÿ97\|%Ép;—\wë–„™8ïrŽ<´”ï^tgë×¼þÏ[¹zÑ´·Ä™Þ¨2’¦õKè ¸j$£µ‹'lI»RÞ}÷]LÓdôèÑd³Yš››4h'N$êÈ=¤&ÍÛàÆ¼Ä½7~Ÿï~iM[¶rõïþLìѹüÄ+0R]Ì8í Î<û0¶µù¿¯ÎeǞ䙧дq!·^ö ¶¬ÝÀµ¿ýo<û8:A¼…å„;ì³lÌñŒŸPÃmWÌcܤCÙÖäË?~寿Ì/ÿoüå/¼þæ«Ìž=™­›6³æ½wènëFõV1ûÔ¯ò‹ÆpþÉòÄßžã·^¶ÃK¨¬¬Œ––¢Ñ(………ˆ¢HCCÙl–¡C‡’H$p¹ÆÞk¡äܱâ ºk–IUéžyónVmy“«¿ø ™l’x2D(ÑLSS™L†É“'SXXHgg'‰D"§\”·HDL‘í8$Zúý,Bç«úÿ½7'$£&É(¨¶SEéj³å Í$²ÊH—ý•_×ÝÞ Œî~‹`¢$Ún¦‚ˆ˜‰ã5PÑ?)\ùÃø.íGVPƒiÆtx!äÓ îõzyã7Ìš5k¶Þ;v,wÜq¿úÕ¯X±b'NܯçæPŠ9tÔ9L=dÈëywÍ+¬Þ°Ã’ðº 1LÝÐöjŒ0L˰pyœ@,tÚÄ2mXúÞ—–i"I"µƒË<¨Ÿ¿ˆT2Éúõ멪,D457â+™~Ø$dÅ®½êî¢* §ƒŠªYÔo‰’Nuð;1­ Å…Åô„”—+ŒSB(˜@œèº†(tuɦjU ¦p»œ¨tÚªV"È),¹‹Êwÿ ßïðæ²>y,{ èèhaÖ¬ÙyäQ¤Ói¼O~»tÊvL"'»URRÌÏ~ös2™4±h MËâ.ðróϦi(²UU0 H$ŠËí¢'ØEIißþÞ͈¢ˆÛídþ™q<¡ž$Ù.äJF“\páå‚…Ãé$“N#š zzº £0ç¨9þ¤ÓèîéA7-DÁˆB®NÄçôâñ¸é v óõa†i‡óÉà *vÒxV³;èÌ™GpÜ § ªNâ‰8Éd‚lVCU*+«HD#D£‰Á`S¦ÍàÞÉSóÀF–$Y"½Q’A„œ¼ˆ |®¹¡X,ƪU«X¿~=•••¸Ýî}nýkš&™L†c=–!C†ðÊsÑÔbsSšã¿ükœN–e’NʼnhpÕ/ÿ‹,Id3)–½aÚ)ßb¶Ó…¦gpˆ.¦ÿbñ0‹WF¸ä'ÿÀвœôÕßàp8ѵ ™L–ùßžK¯bž hlÚ¡££,‹d2ÉqÇÇSO=E0ÄëõòöÛosÉ%—`æì§;»ºèê‰àk÷JHœý{Q]ËêÎ0nÞW9ôT/X&©DQ–ZPÅë¯D¸â†¿Ûû‘¾ˆ$ z–H<Ëá'\‚adiË\öƒ?là<‹I"žÉòÛŸC–²™$‰„Θ٧°þýU“ÏáKSÏÃ4-®œyAîšv®¼eñÈ‹.¸öÏÀªU :»Ãô„BȲ„ee1 ƒ±cÇòÚk¯1vìX²Ù,o¼ñ_|ñN¼å2À«HýVÈâÓ t-¼®Ñd·=x>çp-3'œËëo>O6«!I•••<õÔS<úè£ùÏùý~ÆÏQsfJ¥±ø,Ìq,AÂѽ™DÍ–ݶ )ÅpùQ{öç3i=ù2%CQ¢mŸhzƒßïgéÒ¥ 4ˆN8a—€W×uœ¶n(`+âìï()0n„DKäQVn|—®®$n‡‡(¡znüï3ç°zkú±¹fN Kè—¿+¢`-’`¡eôÞR ]Ó1 «_*¤€,‹€Ä‹Ï¾躖Ëw—°X…$Ê6Þ° V/ÖÖðÅDäœR–DVËbÝŒï#‰âT=d2YÜn/~%©T’H¼“ªŠZd*ÆÔPXPʦÍ[R7 E5‘dï¼]Ï+/lÄíòâxd“ö¯&©(ûoïRnè´´¶âPX¦i+ô¥Î»¤äfÆ ö×'²‘2²,#˲ %§ìÄ4t4ͦâ£Ñ¨ 0ÛÝÍãq–=K$“bñ>vUœ&¦ªâFE²ºI´½Ó4hïlYÉ·§W~ LÓ Õ4ò?ÛbfN"w$¡¯ëå‹»HE,ËÄ4 Û>Q–‘Ã4ÙÖPŸô$Q²÷ÛÒÜW*ô²·6‹™ÍfsKðöRœÏï%PPŒidm éóùzçw8ñĸ÷Þ{5j---ûü8†aPYYI[[_¼ì›\z…IpËË+’]ÜÝKÑHöDz»§ÈRPVXÇŸú6%Θ{5]á&Ðò£Vß~$ ³ý#2Ìmqì]?#O‘H$0 ƒÓN;-Ÿ—6qâD"‘†a Êî»ãVâá­©M’`§ëx²û¯w5×NaÌ5úíÐÁ¥ziì\ËKÏ?ÀŽû ªäD7²}ŸÓúí³WêÑêwìô.FšÜçÌŒÅÈI ÎYÿGW(Š(yi¸SN9€L&ÃØ±c‰F£(ð;ØÂDHi88î”iRV4ˆ+ŸdíÖwøþÅE³L›6ñãÇsçwR__ÏàÁƒñz½Û}¶²²’ºº:ªªªih «ŽÏŽœ¤ "X&rÂNí“ãÝ˜Š‹ÍWü‡ªnÀTœtý¨= {æ@³ïÃá@Q”ÝS·¶¶2iÒ$î½÷^&MšD]]Ý~?·,,ØðG:;;QÕ"ÌT–XªA–Éd²(Š EQI%"¤RIÊJk$©t'²¢O躎ªª$âq|žE"«%p¨N\.†)ÐÕÝ… *1M“H¼Q”q»Ü¤RiÅ( hH¥²˜¦ªª¸\nLÍ@7"øünÜÎÒë,!ˆûµ'‰Äb*«]qô! ¶‚) ˜\N•T2K¸'DAÀ˨‘#E“T<Íê5¨R¶Ž5ø=Ãyá¹­lÛÖM2‘E½”—Á ›M’ަ1­ý§œ±[À+É2éŒÍF•—`ö&ôîîAÞ͸žgŠé+%ÉfP- Iú¡:Ã21ÇzˆÈÈùóèÝâv³i›vïb©%Wž£qEID¶úP+7{òUí}šw}f}³±~ÍΗ³ H’ˆÇ-÷/ƒßîôM_ªˆ¬Èùkaëöš477S^QdO>§Ñ_iÁΓÞ÷È_$IbíÚµ”••áv»Id³ˆN{¢E¡ þ‚!ˆŠ]t`Jî=à!‰åÏG–åíª{• ÈM,Ñ(N÷-”ÒDW9W)ÙƒÉ>ìd-ÈÆbyIC°'}ý«âãñx^eâ`fxêÎ42âSv-ƒÊ’a<¿àôDÚ¹òÌßÒn¢¸¸‡ÃßïÏËéºÎÙgŸÍ¿øE† @{{;š¦ð¹yêù×yýùÇiÚ2ˆtrß*Ù†ít* ÑhIÚ·ïAÈ&Û¶nÂ垾뉦 àn¡ã¨ïáj[ÍàG¾JÛ±×cªÄlœ­ä‰D˜>}:~¿— >½iŸÏGmm-Ó§O? ç Fظ®‹’²Ö𳟇C§ µ±Aƒ†rç¿fô¨Ñ¨³šÍºÁ|ùòkp»ü:mÿ{ýyN=å$† ŽÛ㡪º”·Þ~››¶2qÒDÚÛ‚,{+%E…œsΉ ·Üô{EåÎß=@&“â½÷–SRZÌ?þñ7Ž;öX¦L™”#þD&NœÈï~÷;Þ_±š+¿òmžzòežyj%.µI61-ÓÐõ,·D¸'B¸ÍIÝð±héDŸ³„òòrÚ;ÚhmiÅáp eudQà¼óObÖMlYhòÒ²mWRà/fH]!>Ÿ“®®V ÃC[»±³}€oßKfö¬‰£á@|¢qÆg`Y›7o¦¹¹™­[·îó @¯½í«¯¾Êœ9s¨««Û«¥tÓ2(ð”’ÌÄZ>Ï04üÛ0–Rä¯@Ó3Ÿƒžfb»Y@ûvãàÇáw|Î¦Ö ô`/ Xûà< üˆçibëëØÒhâ§ø”æÚá@,kY–EUÉžxý×t‡›¹òŒßÐÜŠ¼ 0išfÞU³±±q»¿uõDøõí?Ãír`æ>Ok¨¬¬âÏþ±XŒ›¾ÿ½]ªÕ|¬±ýÌÛhko'™LîôŠÈ‰n´@5Mgü†ªÿþ˜Øˆ£‰Ž>%Òr@ÙÞX,ƤI“x|×Ò„¢(¢ë:‘H„žžÀ~ŸT‹¢… $0Mƒⱇßäoy–ŒfÛ¤~øTž}~‰Dšgÿ»=›!™”HÄ;Ȥ¡²j>±œŽŽ—q¨NJËÊ(*,`[ý6V, âóùxýµ÷(((âµ×W é¾A´¶·séå×#Ë^‚Á0º–eÞ±syð¯orÇÏ`uuƒiiéÀápRRXÂ]w¿´á§€ùÙõ‹O`ÀšiGf£—EÙ_bá¢(ÒÝÝM*•Úk9“IPRXK[÷–ƒ$š–×]ˆ×SH4Ñ,)Ÿ“^Vγÿ…Ë®MqãOû@kÚNår9U~ñd²ßó½÷á-Vxôî[øÅ·[˜6ë”0ü°(`ÝòWøÖÏýœråMd¢ŸN¶¹z¨Êwν”Ÿ^ÙÌ7¾÷# y¿3à+ã…·þJ0ÒÊå§þ‚¶î-9íè½x¡Ê2Á`p¿©-kºI8#‘H°­±™öööýv]>r‘i D;i:ý7T½ü3äxÁÃ.Æj8`y½¶Æ}'Š¢Ðõ÷ﺺ:þð‡?pë­·°fÍÆŽ»_Ï-“1‰ÇhšŒ¢Ht÷„sZÐv1úÓÿy+/+êÉæôÑíð÷—5bš:–e ¢¤ÓÕ³ss-‘†ÆX’â#‘ÒH¦t, zº¶""É„„(†s;…gŸ~Ç6,²À4 –‡¶æF£-Í]X9C A0‰¥¢`I;êøb!`bY‚àæ¥V‹×°y}75@.¯Œe˜º—«Øv¼b$LQTr+ó2–)`B×ìÕÜLfÿÕl ÞO,@íGM›6qÏ=÷ÐÖÖÆgœÁÈ‘#w»lµ·,¦iL˜0¢¢"2™½«©l‚Úò14´®¢­k3_º¡T×Û²,Q¥Ø_E&›BúÜ^§ËÁÈ×8Hx÷­¹JQ¡gŸìÇ[,2lH!ŠÒ 9áÆD’d†Ô2tˆ“dwšuï/Â] ›ŽSX6Y´h®ß’“ºQq(ŠÃâ€DO˜m›W“Lf(«?àA@¤¸ÄO2¡‘N§P‰ÆM+‰ÅR•”bh¦$‘Auù  hÚ²Qu3fÂTB¡ E•e¸غnª·š¡u*£F–àó9) ¢(Ói£;Ü̉3¯¤'Ú¶×`÷sM߈"ΞzÚŽû!å¯þ‚’wÿL÷Œ+Qƒ[Óë÷ûyöÙgóJQ4êOjôÃv­Îþ™³Æ’H,¤—)ýèãpÿÉG_ʤ•“‰íçï³ (!ä·ïݰ÷ûíYí½_q2M U•Ð,ª¢¢if? Àœã­`§œŠ’sC´i˜Xä\QEÒé,¢(âpì¿÷ÍÀ“=ŸúhhhàÎ;ïä‘G!ïP0²¯@^&“aÖ¬YTVVîÒ¡íÃ÷cRVXK,ÙʯQè¯8(¯yZKRZXK*ë@ˆÏDèY@vrÎWŽägþHšRÆ(áo?;Ÿ®`3†#Ú¶?ßõs,U ¼R`ÁÓ¿æWŸ ›n%PÏýáF~ùï“IupÍ™µ¼öÚxò¡?ðøC½™”ç]4™µ/ý†k–qÒ™£øýÍ—ÐÞÙͦ%OóÄ#Åïìä7_=šoáB‰4£ÆyÉÀE˲(.¨âÙ·ïÅã* ¼¨ÃȳÞëë)ˆ¨Á:޹G×fJߺ‹lñÐ"”íñxX»v-ùt“ÅÆ9î¸ãX½z5–e1a„0©²•¦Ün.×Gÿr»û¾ú~vâñ|`_»Ü¯úýØŸõxœ¹¿©ùmööËãq¢( .§IRp:¹¶ºrÇsàr+8]J?°kƒqIT‘$°•&\.Ç~»€w ð•î+û×u}¿­Ù³U“ÒÒR\.×ÇšùG]6î2ZŠè§D§rO#«¥¨,NSÇzZ:7¢*ÎOõùŠ¢΄ù/¼°ŠÇ{P:  põÓï _@`Ûº¥¼üøý¼óÂ?yõéÇØ²~o=óÿùÛlÚ°†@©ˆ‘‰Ð°~%²C¤´J$iãÑ?ÜÆkÏ>’HWÓFŠ«E"›Xôú‹t47Ò\¿š®¶m”V‹Dº ö)+YøüƒþBñ#¶ÙnÛÓO/ç‘G–`ç¿Öå€Û^6µ,rNÏôtB<$l'íAÁév¡¥ºI$2›–ñøoæµÿ¾¨º—ÇA[ýFðcʤ±|ï ó8ÿº¿2¬ª€h$†(ʸG~o W>EI †ãg^Nw¸i`°ý¸!8‚õ´žr+j¸…¢¥ÿD÷•í÷Æ×ëÅétîvìîexw—ç;ŸÝHiˆO}ÌŸ?˲hll¤¾¾žúúúýR´&Ë2Ë–-£ªªŠÊÊʽNkÈd“Œ:“Õ[Þä­eròì«è mÛ¯Õ§ûœ44ªŠ‡RQ2”mmkT>†¬–þž©‹lÖàÇ?~’êê·0?C§ªn^}%«W7÷æ_Rââ˜#S^>þÝ+Ôe1ë´i8„ϾðÿãV¾tÁÕhR1§ÎŸÎþ-£F?À“þŠÿ½ðçõ&KcÑ{Ëxì?¿fC$:",|ä·|óÌ?òß-ä‡ÿw"_8îj¦ÁÚçîB®<޳.¾‚¶õÏñÒ#aÎûöõá½wѼ-AI‰›lÖʱY eu~rÃËTÞ‚aèýÚæâå——³~}çw_¿ß‹\|áD †| §2Q“Æzøþ]ÿ&›‚HÜä¦/@–lB.Ô Óÿ/$cžv$E%öß2)˜8ãht¾ø½ëɦÁ4aêQ§á ØÛèYزÜäŠÛš;L®ÿí_éÞb2lÖùÜwæù´l±8÷k?@U`ãjYI†‚7üóR–¬¼“lÖ^i‘e'ï¾»žK/½úD&›déº9ú¨ŸÎ$RöQX‚ˆë 8íK¬y9Ö ¢dÛÇí§ˆD"Ìœ9dzÛt7¯×Kss3o¿ý67nä´ÓNÃï÷Ü´À;ñ銮®®ýÆð ‚€Ãáà7Þ`îܹ :t¯/t…›9æ°‹xúß±µy%2Zê ºÞ±d#k§²lÃ+$3±>–OM@”§žº›©µ>Ò½n¸áWŒSÉ™gÎ`Þ¼Q””ŒŠxoÁ=|ó†0ý}MlÇ,ho©'ØÞDÐÝæ°Ó®`ÖƒyøÞ;ùÉås™3ÿ2^ß¼”ï]ü# ª])¾ó­ï°êÕ%L›u,uSNá{ÿÀíŸÇ—þ7o šŽ­«˜xìWøö-ßf^¹yWÝϬåüø‹s9þŒ£xÑFÎøJ)ƒÍÞX T‡ÂÝ¿;š¡'½/x(â»ß½…±c«8óÌ™uÔªªF‚­OqíoS¤róY†h‰¢ dݼþøRLÅËœ“Ž@2aá‹oééAõ3wþl"íÏ<üFM;’CL:ÿ{òQ"i‹Ó/93¯?óáî(gÍÐa–¿³–Žæ-hºÅ°I³qYÖ¯Xˆê-cÒá³0²¡¸EN&CƒP(εߙÉiç]´~àþ%>þ⤇ú¶÷™>ã|Æ9‚æ¶ÍŸj­ç^‰ÂT*•·LÏd2$ ü~ÿÉEÝ£ÐÐH—¿þEŠßû;mÇý5ԸߎÇ7n‰Db—Û•””°qãFn¹åÖ¯_?x?ï€WÓ5¢±ðnäHzÿÛQSvg¿ßÅÇ·ÿl^Ûv$’_bÜãáèƒ;û`xïïòNrÖNPßÇ­½ÁßPè<Û»ÿßLDQ"à/üÜÛ’.X°€ /¼l6Ë7ÞÈŒ3èììÜçÇE‘p8L&“ùØ Ú4 ¼®“FË ÿÌÅóo%«§*‹èŒ–dܰÙ,]÷¯¼ûWÎ>æÿèè©çÓUl)æ@Pr>â†ÎÁ.øÒsíi„Ãi$IÞaè¶šL?åRŽ:÷R–½crÓ½ gaå“ëîÀ¶h]úžÉ·~v˜Ê@Y%è×@g¸}жÉäË?ÿ7¾›5 0-XµØä¯Kb&»-~ÿüY8pêÅÐÓeê铸²Ñ-º»Ô ±~gÚÃo{ }.$¶Ò‡`0‰(n×6A)ðÁ}7ý€YçþˆóOÂu_¹·OF‘vü|*j‡ñøwPßáþü”…‹Zyü—w°|Ù»üèŸQW s=›¸ðªïðÃk¿Èõ×ÝÅß6l ¨ÄÇÐCN ¼ÂƒWѸÿ—ßbÆü«±"«øëÏpéu·!ë`˜Vþå Š"áH±sŠ vM ɼù“V5ƒP¸ûS?Æ ‚ÀàÁƒ9á„hj²S/~ýë_óÊ+¯|(«ùI…m#:æüë_ÂÜŠ);ÌýÌE¡££EQ(,,Ü¥Jƒ¢(ÛÕgÜ.ޱOok{#÷?t'n—ÇvLú§](䡜(æŒòF94 Ä^<Ñbl—3ÑègîŸ;+84sËk½¹[yàkæOÉv<w4û}NØ À¦Ï!NÄü÷}cc?{?ËBzÁëö†V? Ê[“7«òNtäÚß÷iÛR¸T'SI¾¾~ñ÷PUÇ纓& êëëíɘ¦í˲Èf³L™2…ÒÒÒíò†÷ž! 1qÄQ$31þþßsùé¿$m?ˆ®¼@{°žSç~“§ß¼›uõ ¨*A:›8È{”@Ÿ]ÜG:¢™”I&ªÂ=öátB"b’Èá2‡bá¾ñ£µ¡7µ Ö³)“àÈ~Õ ñÜçT‚mÖvÇÞ³¶eö¨mªŒtœ÷^y˜ú7b¤L™i§óÞâ·0Í[7¬bÄ!“yó—×ò·FòØ¿ãÈs¯`ô„qÜ}ý­ .uã,™'ÌãõgAPÒ,}çeæñ«¼ý¿Ðu C‹Ó¼y%_9Çœ}8¯ß½˜¦uë¤,ˆ Æ­‹ôÑܽ’ŸßÀw/ «ÖÎÝ?E¡i¦irÇwpÖYgpÛm·1bĶlÙò©ì‚©“)ªÃ%ÜÍˈŽ>)Ù³_ŽxüñÇ)--eþüùtwwït»5kÖpê©§òƒü€¢¢¢8x{óTÕ‘;ú‚÷ÊZô2ž|àA@°l +a¢½E‚,`¦a )r?ØÙkåkÿ(š¹!Û°A¡õ¶¶÷˜¢eö9–Y¹cB¯l% ä˜ «¯Òžó@ײòºx‚ " ¶Ýp¯%±,Iˆ¢„aZ}€9gÝ&æÀ»I¿â«W¤Øæ@x? oŸˆH¯tˆ®+Ȳ €tÙ´ÃᤓN`ãÆ-X–µËÙû¾¼³fÍÂåríµJß`¤™éãOÁ©ºùËÓ?àK§ÜL4ü”¥|ØeƛâUOsÞq?$I|FõÒ©¢\AeD»Á4Å}pý@–@×m6÷ãFA8=ÅdÒ©=j[6“Bu¨¬ƒdO_»Òüò‰ãVíñ:‚¬ç|ý¬d\³,‹3Ï<“ï]ýššš¹öÚkÙ´q=µ5Õ»ýœ$IÄIÚÛ;P”œÅ˜³%V¢í˜²c¿Ùˆ¸Ýn6oÞŒ¦i¸\®]n×ËðÖ××ÞÀÛ‡½LÃ@×ì|IQÊcÀ<+«ë:‚`Ûú"Ú Ñ¢_ €•Ãy¹ýeu]7p:Ü–£¸˜º`o(lÏÌÚt²EŸ–œŒ€LÞ°!‡4-,LÁFÆö¹Iy6 ,KÇB´Å’ó̭Рµú•cWÍ_þ>í“ñ^鉴1vè,Šü•üቫ9ÿ¸ëqªR™øA‘®’LG˜8âH:CÛ¸ÿ©ïñsï¡;ÜòÜrÖxKXû×3QW+ÛBJX¾l9¿úãb®ýÞ$& ŸŠe…?ÖY¶¦MÎ8¼œésŽç£§r$?õXÎK,`Ó?ÎÀá”>Ðr Iø ExùíeÔ7uÐ ¡“eҤƌª¥º²σï¥E‹êh+,Aúž»>pÔÝñyÝ;m›Å®,ã¨y—ïdo{Ãü9hjJsÞy‹©­-B×,R™[»ÿÇ?º‘cj¶³ï>Ð1zÔ~ü£±²ÓÅ1§Ì#Üý¸£ëïâ/ŸKU¥È¥?úÛ‡®v9Ý"ÖlF ¾Ç¯~þS‚¡Ø>Õ–þ¨ —ý¬E®iEEEx½^4m×Ǫ¨¨à…^ࡇ¢  €|ššš$øy¼¦i‘ʘˆ¢ ZHýØ\Qó*È‚(€l"˜BŽÑµéQ ›J¢e³¸ý^Ê+«),,Åér`†nƒãl²—9Þ9ían÷®É’_ª³$@ʱ¶de™6C+hyPlåÁ„7$X»Ÿ=ïŒéŽA´T‡—êÁY¶íW£1‚ím„Ã!DQBQ%záDDAB×>¬T6Kmô®ç ½0Ø=¥¹ØQ袢¢ n;œp C¸m;y-÷O/±,&& äþR^©P].³dy’ ÆÔÕ)¬Zž¢“ ‡B$c `!#b>U µHc""âB@vŒ§Òݤ±¬+C)2ƒ)$B!Æ&z»ˆÔ°™EEqdYÄ0Œý¦Ò°xñbjkk©©©Ù'i ½ûŽ'CxK¹êìßñ‡Ç¿ÃèºÃ9îðËhíÚd§ }ʙϮP#ó»‡âæO\Í—Ïø5ÁHëgl8´ŸÑ£Ž™ LÞûSWÿI2˜pØ$Î>þ\좫}ÂîÉtHqÄÜÉ1wr?jCj¨o^ý„â@’Ã&Màg·|Û1)š;ŽA_™J¨IÃsøDÔÚ¡9ÖtŸO?ù覻cPÓø|N;í† +Ç­ñÜ;¿§ 2†#gžDWè“•"Ëd2¸\Nfy2'žyÝmûŒz|"•ƒ6²þ¥&Ò©ä'ÓHËB÷”ì·ü]°Uf̘ñ¡ùÌ.—‹p8Ì’%K€Ý¸ Äçð©$±­«0}H¢„ ÚÄN°L K°ìâQÀ4t‰8¥Uƒ©<œêQcñ вš=ã²L´lÆt9»AQ”r@ÕÚ¹Ÿµ°³,$;uÁê³çÁà`'ù"`æØZ¡ÿ.váJ"Ûçäî [–‰ªÊ˜d ›ýU\ ÉHÕ¦k„º»élo§£µ ˲pûüˆŠ„i‚ ÛiÈ–i€eæ ÖúÇÉŒ ±>:Ã4|øpÞÿý=àŸ  ƒ<\ -«ZL®þ®Ã†ÔsåwKøæ7ý\tb#J±›ïÿÀÇÿý¬•w6 %¸MgmƒÁw®hàÌË*8îh']«S4¶üäÁjÞüc›""Á­Yþ÷FŠÿ.­ã‰{ºùÞ5A^y{wü°¹”rßaü/ÉQ O¼E\d±¡)‹ï _"eTðo~ S÷pêü³ò…ûð:NÞ|óMŽ:ê(FŒ±Ïoþ¹2uºCÍ|ëü?ðþú—¹áóùæù¿ÇåðŽu|ª¯ ˆt†™9ñtJ k¸û‘¯qÉü[1L](üØùÓUÍO~ò[šZm¦òÍg[9ûx‰ÝX#@`_ ¤øéDUD¾váøånsç—Ú u`i:F(µÊ~¼û'LËÀ²,F šj§æ Äþ4cX¢Hªz"R*´ß•H$5jÉdòCð·5poo¿!@ÖqZ¢¨`¢#Š6P,Ë4Ð2:…¥ =Žª¡#P%éDMבT"c[Ê R>U¡·x-“N#H²ªìt™¥÷• ŠX¶ç2‚ec@qGËêe,ì—Š ÚI½$©Õôö°ÛQ0,cDZl襪 ím툢HYy)Ù¬¢çœÌ¦ÀO ¡…EŒ=ôLÓ iãf¶­ZI¨½]4q¨N$ ,KQDDÄDÇŒ<øMÄcX%åXÖGŸÏ;—§žzj;€ˆS6¹ïÖN^ êuŒƒÍÚH^z(ÆùßlãÇ¿«Æ'›üûþ0‹ÞÖ艘,}/Íô“|œ~Q€s¾àcåKþöHŠ C)¬â¢ß æÇ_wpÞiüáåZN9gW\XÉs‹êèܘäÑ—büßœBš·¦qú%âQƒ•«2Ôy%ˆdvÒ1Mz‹„œûM‚G‰š¦í|¶B’dÚƒ[©.É_}–Ÿ¾ŽT&Îå§ÿ’x2D&ûéÕ‘žh;5¥#¹ø”ŸñàÓ?à„W0´f=Ñö\Ñê@ØQÁНsóÍÏäs×ݯpæÙ“8rî±ì(·u @¸—xÒà†;naâè±ÜøŸä@®žûŸã`çHf67âšx}²hŸ 5-$Iœ¹¶€Ç‘/¬–D™Ž`–e2¤r‰täÓ ÎMpyE’Ѻ!PRî$·ùžtÚÄã uõ ;¼È²@<–À[àï«‘þ„#[PCÙÛ÷ Ç;IUNد²dªªÒÒÒ‚ªª”””ì2­aË–-uÔQ\vÙeÔÕÕ S€×î\ª„S$ ѲÈjåuã>aþâBDU%›¶µu,ÍB3 $‡ IuÚDlŽî-j3-Ë΋íŸe—#—]›_Í·Ózs\-9Ÿl×t‰ý$¾úòmmå„^vVØ~×Ëò – ›,3G ÷ncƒU,úØ`¡ÏïY°„¾Ü^,4C§¸¬M7ràÄÎ)s³ZÓ²À°HÇ5Á ¼¶†Êº:nzÖ ³q3 ëWjkC48œ~LQµÓDz÷¡gq©ê1Agœqßýîwyå•W˜7oÞ‡<`žÝŒ‰‘(œtò6²X”¡P„È)ÿ©'ŠE1£q2kê²€x]+&þ{„*\€ ¬d~wu?¿ÚÂÀ“µ†áàûÏ5ÓŽŽ„H .þð£v:1PH`"#°T¬3œ.™eË–¤v¹lURRÂ’%K8á„ö(í¡·hmÚ´i”••í“¢µÝ]yË2iíÚÌ©s¿…ÇéçÁ§¯Ã²L¾ræDâ]$ÓÑO%ã+-…eY|ÿ¿pÿSÿÇâ5Ïr噿e[Ûêñþ|q8ܬYs]øK:{BÜöÛù”í;μ«;”¹x*Á¯®¿5º·ÒçföQ#‚ïèC‰¿µøt°¤55~–-kã‚ þ‚$õ hZU-¡¦¦‡ê¡¡íu"ñ.Š ªˆ%‚ûqjaß[—êÅç)IJLb‰ñT˜h¢›D2LZKÑRéIÖSçõ|À—A`È| ¾‘GsæÙ'sÛÍ¿ÆW>‡¿’n»Šo_p%ç_{#‹½—†ö(ß»ùÇÄŸ@×ÚXwxñ4.AŽwÑ9ç[¨û9u$ðÐCQVVÆ™gžIWW×.ÇyAö¡1!à QÔ‘d A0$Ѳ‰†ÆF664áÈåÏêHH’í…l™&¢$æ30…~Yý¬™¯³—J±OƒVèV-ÁÌuN›¶r;íÿ< y¥ƒ¾ƒm§!¹d,É>'$QÊoÛ»OQʱÐ9)´Þ}ô> Bû âö2m}ß vAŸ("" ˜¢M‹V.Ý¢lè!ÔMšƒ–HѰìmÌxCÆÎõµ ›Nç4?úÈ5xð`jkkyùå—?àHaQëU¨¢ f@ßîB‘áƒUV¯L‘5íLÄ¡µjKD–e¨@ÆÄÄDÄ (N‘Áµ ¾.‘@©L¼[ 3d``QU R[+cè2%­Q:%ŠD…& ÃÇ» 6k¬ gwÚZ“.ÚùÍm×óíoý€-›šv \O?ýt:::غu+ŠòѼ¹-Ë"“É0kÖ,TUÝÏ€·¯ïfµél‚s½Ÿ»ˆÇ^ýõ­«8ÿ¸ëT:ŽÖîÍvû”É"‚@sçF.<éÚº·pÝ]GsÖ1ßgÂð#iëÞŒ$~Þ=mtF®J‘‘в&V3jpi?¦ô@±ºn ¾yãwùæÅç2fØä›+îe¿J¡TŒÇQ¤íg¿¢ò‡?Â.ž‹óI¹Õ‡BAjk‡ðÍoÞ„ d¶[2M]×QÙÖº —ÇCuMì»{`š_ng«6¿ÉÚ­ $•T&aÛt— ¡¦|…¾rªJ†ãP=ˆ¢ÈàAƒXôòVB¡‚ôÁg t]£»eÅ£sݽ§¢~÷Í/3É+pã¿ÖpôÌJ=.¡:<úˆ…ÌOëZ¦Ã‡” S¸â1ºf~Á4÷{w¹\444`YNç®mÐGŒÁŸþô'Ž:ê(Ö­[ÇèÑ£àçšáD@DËêH²Œ`èè– ¦" H®²ÍÒš:©T‡C%PZ‚$Ù^Õ’¬ØbâyÝ/‡ÃaçÿšB bN%! EA@m=ZL±//W²‹={—MuÃ@Å ¯Ò ŠN@Ä4MDÑ.¼³òŠ 9ÎA1DPD—Ó‰fèhÍVe0µ<›Œ)öAé\ΰ(J¨-kØj †ÑË;#Z&‚eas È"™L†H8Œ¥™9€o!²-Ù"¦Q}2¦ #I6øO:üïßÐ &ðÈ#pûí·è¶iLµ‚§ï²²'Ü ü\ôE߸®{Ÿ¬£¢J$™øÕ—[xlYŠ7žL6arìyn¿¬‰ šÌ‘‡;¸øM¼ðÜpþrK'nJbáäy•üæž~ôÝV²ðÄeB‘QÜwM‹·˜|éR዇ïR_¬°öÍZ¾|J«M vxq ˜–AWgÛ¶mûHìíG»ý£wòv CD2Ù$él‚Ù‡œÃ9ó®cSÓ{üüÁóV3™“gQ”Å:>Ui¢(ж£È~zåÓ¬oXÈ 8™ O¼‘ƒ¦ÒÖ½å (È;l—iRð!I]=ªÊªèÓÊÝß`·˜M «¸ë¯Orï?AÇVjù8ýHºpO›„{Ú1tÿéw(e%œú…~ìõŸ€Y–…¦i‚¶CÚ“(Š$Ra†ÖL"‘Š|ìkkYEþ*bÉþ·ü!67/cÌyèùL1‡p¬“T&¾Ã'3Z*ïºè ‰dô˜-¶½î&›WY\ûÏ715µ›ÈŠI¨θö~.½í~:MÞ]`rÆ?@’ a£‰ü Î3Ó ¨Á»õ- —?NëI7!è}ÿ‹g2*++)**Ú­™Äë…„ÙÏÀkšñXe;- ÓTA¶@0,òˆ#lk؆ßï'­e@°lÉ.QÀíqÓÖÚ†ÓéÀát J§p8œˆ¢ˆeZ(ªB&›E@ ºº U•I$’¤Ói›!l`iè†-@&K#ÊÉD’T*E:ÉÓL&‹ÓéD‘eÜ^^¯]×í,_I"«Ácy‚-ë7pøÑS˜3o6²¤¢é:Ь "çÛ/Šàt¹Xþþ2žý÷sd’‡>Žés%P\Š ØEx—È¿"DKÀÈ;ª ’‚˜‰¢keÁ@Óì¯X4…$¦öxb|ÿý÷S]]Ík¯½ÆÑGý¡Û{ $² ƒ—^ˆ²I‡ûi^—¦e*ežz0Ììs 8òtñdÁBs‹üã7]Üúp„Hr<ýÆ^>òDb!ƒQC\J!Õƒ]ƒ:--YLA`âL/÷|¯[þ¢­{,ï>&æ9dŽ“‘>•DØ ¡[ñ“¢µr*ùþw®ÁÔÜœuæù46îÛ|0AP…… RWWÇ!CË»}±W2Úƒ[ñ¸|õì;ð¹‹Y¼æ¿¼µìUŒãÌ£¾‹(Jt…›¶3zù$CeºBú*¸á+ϲqÛ~ú‡S˜7ýbŽžz!-s:ÖŸÏ—‹eYø<‚@wO„ª²ÁðZ@)ï¼÷O½¼ˆßýô§Ø"aÖ>ë­v®l%W|ƒÄ¢—=ú7 ÏùÒ'zwÿ|‹„cøÜETÝkó˲‹µË óüÂûY²æ9æÏùg}5áh;-E2#™þøRg²ÑœLY¯õ²¬@:fÒžÛ½¢B*‘ÛFþÄ:8–¬¢TQóôµ¤KGÐtö](¡Æœ¶üþp8œ×PDv=™I&“1mÚ4ÊËËñz½ ÄçðZ˜–€¡›`–‰a™X†Ž¨ÊˆN A7°µxEI$ãõz2b0–i!Ivªƒeš˜¹ØQ#‡çŒ¤üò¿n™ÈŠdÓì³Ï4M“¬¦#ˆªÃÓéDÎÉ€õÎÒz¿74§ªâq»mvZèKC0MÖý²,,]GêM­0,E¾rÝWélé@‘%ü>7ÉDÁ²U9gnÑÏþ×@?m*nO!¦nR7¼EÐ3–™s›“ìÔ{3¬0%4-'&ä|Ö,-ÇÈš d°ré¢("J:¢dìñ{£ªªŠÉ“'så•W²yóæÜ«Ïæ“d|;{¶ásòã+ž$ïâ×ÿ¸¯»3¾¯«®Pã^³¾½ÏâbPŸzó(BQ$ü>¯JW<T°sÚ}~Û±±±™_þàç9°[°¿ø5<‡Ÿ‹£õ.XõL8™Ý+ðîëðQVÖ«Ÿm±3Wp§ê¡¾e¢(Q¨!ß3_+—þVY2ŒÇ_ûÛÚVó•3ï`ÎäóÇÚéìÙ–Ö{Ú§-ËÄã/¢¸ mßD¯ü…e¢¸ïõw- D™LIeÿ»Wû:šO½QKP°ÛËðVWWÛ5™]O&;;;3f ÷Ýw‡zè¼ý&ð½ù®‚ˆh ¨ªÓÈh:‚KCIJ ,ÝDT‡„*:±$d:B$”Dq8ðz](’ˆ$Úžé=±Ùlœ€ßƒÛ Š¡ª‡‘D<ž«²1tQI¥ìe·ÛÓéÈ[ÌÆã $IÂãq öÕ4ªŠ¢*˜†i?ä9W31—+,ËN—‹x$D<Ã@ÉEgW YdË40 K7 ‡ê '܉’vâp¨TÖÙŒm&ƒž±Èš¢$a:è"vå(‚S‚Ðm@,‰ùÑÄ+¬Hvª‡¢*’iîÕ;}Á‚¸\.î½÷^¾öµ¯1²î®ºj †qUÞÑh_Åì]|¿'Ÿû(l’iÔÖÞÌ„ñSèììÜO,@:Æ0ŒO)Š©Lœ–Î «™ÂðÚC) ÔOyæÍ{Y³õmjËGqØøùÔUŽ#£¥ˆ'C¹ äo‡$)#-X–ÉOü %…µ,]ûÿ}û÷Œ:›g_‰(H„cí¹GSøˆû5™!²$#I¢í–3›È8N'¢)``j™To‡ÛhfèiÞŠží °¨],¢¨f(’,êê¢}Ã*†Œ¨¢;ªá+­E‘†… ¸ÉêÙ~ Lè³ÎI™õ²ºö´D,–@‘eœ.—S¬ô]Y–m#Á6+°L I–1 ƒl6ƒ¬Èè†IûÖ6­Z–5PdU«:Èd =¬YRIECŒ>teÕÃ)ð{E‰d2‰ÓíDQU"á0©D¯Ïƒ(˹b=«#+JΦÎB7Œ>{bÕ‰’hÛ€‘Ë9–±™kÍ0ˆ§’”•UqëmÿÀérïñ}óÍ7™;wîg&)ß4MÞyçÒéô^åæ~T†÷Å_dĈŒ1â#½L>ñëb™8U7…þJ:‚õ¬Ùº€ÖÎt…›9è0¦=žŠ’:âÉÑ\Uú'‚MÓÀãàq°bãk,Zý4XpÒì¯2¼f2Ý‘R騇²¿½+Cƒ–¦(ŠTWWsÒI'S(æ;?:Ÿe+rÑÉ7 ·~,Zà+eÑÊgÐôs¦œG8Ö™¿>…þJ~ÿØ·9ø0Ž™öE‚‘¶ýì±J¨wã{D&``j¨YIÿwÃ΢¸ š¿?÷Ê‹ê8vú%ôD?üšH’DQQ§|[CëøÏaxéÚº·îóÜôÞË‹òòry䉗_~9mmmûÚ|46×Ä’T2%Ã(X÷¥ïÜKtÔ±§} )GJGl û EEEwÜqœ{î¹»$EFŽÉoû[~õ«_°bÅ &Nœ8€?Û¥ÓZ2¡#I:ŠlëòJ’­j euDÁ‹–n"X2–º`¡YÄŒN¨~%µe#'ÆšekéÞð&áÆuV Ljl⨣Eö¸`Å Z–.ƒª)”ƒÇ¥ rŸbC¯ñüv¦’¨N§Ð²&¢d…HÄ5jªKQT‘lFC–ìtˆL&¨€×㥩±™`(ȺáèšA&«ãt›™,ï.©Çáp¡ª"’¢ñÎ[ë8ñ¸1¸]T§“•«Wa™‡L>„-›·ÐÙÙÅÔÃ&³i}7ýí¾>FAUùÒ•0jüHBá0YMÃ.–“me AA¶ E@7íA¥W1“)ô»ûŠöö0æÌ™C&“aĈ 2„ïÿûœrÊ)e/5 ƒh4J2™Üo€§W–lÆŒȲü‰¦3ìÑ‹RÉji:‚õŒ2ƒqCgRà-ÅíôÒк†>ÿs’©1¦i0¬v cêCU\$ÓQR™Ø~gƒEQ"•Ž‘JǨ*Î9󮥼h0mÝ[yàéëHgúÊ™4òFžJ"!ž å'·ýïÓÁ"oYVÎQ¢ñ %5d´$‘x^iº½&t$Q"mÛÙ•û=Å,\ùCª&qÌ´‹è 5îW©8Sq!%{(}û>ÄL%Þ‰§~!¦¬Ò5ûkhZÄLì€\ë]>‘x²‡ê¦ºl$Éx>²¤’ÕÒ´vÖsÚ¼³™:öÖ¯_»_ 1?jºAï½îí[åYØëçÅ21\ W!kÿ‹ã+ª‡®YW±õâãÖ£DÛì¾ü §:ZZZe‡Ã±Ëí²Ù,.—k;fx >?!ïší’QQÊÉzåÄpÙÄ4³ºÁ”°Û¹FR‰$錄ZX‹îʲ`ÁZº»¨“p–$ü%#é l{+ɸ‡Â1Çâö•ê ñÒâe¤ã)dYÚ©ID¯6™…E,æÐ©=n$ñx‡ °jÁ;üyá&dÅ Xh;YÖ€/÷ \n7±h ,ˆ…³Œ]Á¤C‡L™9UU‹X$‰¨81-EQðzlIEQ(+/E–º;»¨4‘hO§S¦ 4@2Â4­>¹²^£8K'ØÝ…ïDu(XH(¢Œ¢(hºF8Å<‹!¹õÖ[illäõ×_?¨—p^xá…Û…—–‰%;Ñ ªQÂÛ(\ñ$žÆ÷ˆ ŸKÏäó‰Ž<%ÚŽ`j¨¡ÆOäöt:Í Aƒ(++Û­CfWW£Gææ›ofÔ¨QÔÔÔ  ÀÏ;àE§CÂåRÝ0‘$;-@4D2š`‰8= K·¯êÄÊêèY KTéIŠdåÅš]ÏkHÈ‚L\,%Ô¦£Q†à‡dJ$• caqÄœÃrr^}K—BNÓÖÈÿÎÆ€’dŸz8’D”tIâ°¹s9tö¬<+dkGäÒ"° éª]×iilA’$2é4e5C¤QX–…O°ÄÜlÛ´‰RI$•L†4hº¡ÓÕÕM @Zš[™6sG;Ë4DÃ0I§’ÄcIDIF”T[›×²Pn¢=Ä‚íH2  ¨*˜–F*Á4-,CÃ4²{w¿ñopÏ=÷|&lu]ßîÑpAp8¼òÊ+Œ5Š‘#G) ±u@*ÏË$U–¥¢¤ŽÃ'ÌÇíôáPÜhz†¦Ž ¼·îÒ™ª¢KFÈdST– ehõx*K†âut&N2Ã4u>N±\ž¥îi`âˆ#™2ú8 ¼%‚Èš­ yåÝ ‰áx·ÓË!£Ždhõª›x2D"Ý þÔ ²²J$Þª8)ð–K†(ð•{oÉl˜ªâ$«%ÑŒ >W€ÅkŸcXÍF™A0Ür®‡€¬§kö×p·RúΓDÆJÇœo!'ºù4$Z«Š“ÆöµH¢DÀ_A<Ùó¡ýQžyëN>òRþgÑ´4Ÿ©°Le4_9–¤àÛòþõ/bJ –â":ê:ŽüJ¬1Cî½fŸRc™P(ÄܹsQU•p8¼Ëí‰ÅÅÅ 6ŒéÓ§ ÀÀ Ù¬NwO Órâp:$ M7ìåvAE´LZÖ-%‰£JDIIJLL 4Í"“²Èh:FîE(Jª*¢(v—®ÙBà6x‘PY’UÓÒ°PŶHì^ÈJS°0 Q‘d†®“ÉdÈhºnbYövô³¥D Y–p8”“Ü«Íkš6³kZ¹ßå–z(,ÁBÀDÀÔudQBE[=ûÜ ÓÌ/Q©ŠŒ, ’ˆi˜¢Œ(Zø\ %ÁÖ+dÅž1[–…®i8{—ÒðôÓOsÏ=÷ÐÝÝý™è¤§v–e±råJº»»ihhØç ·7‡wñâÅ&Mšô¼»gZãÉ0qì—D·„ÃÆŸ×¬vªž¼ST$¤µ{3-›héÚŒeZxKriTÅIMÙHªJGà÷– H †i Y-…¦4#A1Lžh;Ń)/‚½dïqúźXµù-ÖÕ¿‹aX|Ehº‰ÇåcÌ©T– C–²Z†t6NVÏä qt(’J, X_9ñTYRɰ÷ýË4uÜN?ñd˜d*Š,«d k·¾Ã”ÑÇå,ª?Z{-ËÂá°Çù½ «F‚È ×SZÿ?ŒQsˆ ö4€äÜë6jš†®ë´;^º#­dõ ªìøÐqÀç)á÷›CÇÌcXÍdRéØÁû[ˆ†Óáð"¥Âø¶¼…£{+Xr²‡Tõ$"£O 6|.J¤ÕÖÍDÁ­Ÿj»=fÉRVV–ï7»~nL›ør8ÐßàµCL+Ž`ª˜Ãê LËÄ´ à²ð«.dYÌÙúÚ&‚K À¶î•Ä>‡2Ë4 Ã4EI’‘%ô°,5''fö‰SõZ›6à4,ËNµ Lâäót ,Ë’0±,»â^’eLl`AÐí¼c#M¯‘„Í[&HV/3#ƒh[¦` ˜º…‰ª:°3o8i;¨YXH¹KIA±º›ÑEÂÒÒd’)Á´Í8rò4½j©d ‡sï^@_þò—9á„(..þÌtT]׉D"†±_ŠÖzCǃ¢(û^Âç ä„!Ml§YZ䯤È_É„ásl6L”p¨nÜ?¢(‰wÑn¡¥s#ÑD7=Ñ6‚‘Ò™n§Ÿâ‚j¾2¼î"¼®üÞR }帜^gmQ~ÝÐè÷ï{b‰b ›mª-Mm¹]©È ¼Å€EkW«·, +ÔHKç&â©0ÅÕT×Q䯠¨ ’ò¢A¸~R™©LÝÐöÛjˆ,)†X2„Ç ;ÔŒ*;?–)¯aèú+ˆ'Ct…7ìÞYþN‡—‰#$ûh²[Š¢ ª~uãéÞºÕéØËR: ·\FvÕ øo?«Í=œ ÐÉrÒqÉEÒÒòñÒ"$I¡;ÔˆÛU°[ã˲(-¬åùwîgtÝtæL9Ÿžý]ð·ŸXSq`¸‹ µ§G°Gp Îöõ Ф*'*IlÄQ„ÇÏG‰w"höê€”Ž ¥# Àý`¸ÝnV®\‰Ûífذa»¬Á9r$wß}wÞ˜iÕªUŒ?~ ~žï˜ñÓxò…mWç Œ'žx‚ÎÎNþýïfÚÔÚÚÊÓO?M}}=Ó§O§¦¦fŸ³¯½.M‡z(¥¥¥»Íˆþ“#_ŒÖ~O1~O10*VÙª¸%%§š¢“LG艶±¥é}‚‘VL˰[‘lNÀ_×3¸œ>Š ª) ÔðWð–ârú‘D[Ï[Ó³¤³ z¢¹ÜVµå#©)Á”Ñóp(.7²¤¢ëY‚‘VÞ[÷ÁdYAe’é(ñT¯+@mù(ªJ‡SZX‹Ëá2Ù$ÉL ÃÐöø‰¢„c8U7=ѶU°`˜:¥ZœNõ­+™9é RÙCª&ì‘”¡(ŠÔ‡uꌟÝÅÕ¶µyÊvÕTü$:Š$`šʘ;ED$g.Ó°Ðu Yèˆè8d€G"1qºrÛè&ñ´‰×+çH è‰8D¢“B—ª.‘Ÿý«žÅ ÈêÇcâA$•ŽO…T1–ÌnäÒ¼îB–®{†Ö•\tÊÍ#ÍOš¢AÄ”]Nza-)W1z4†3´‚5¯ †[0\> G¢žÁpúI :”øÐĆÏAÌ&21›”¤T)î½@Ÿ‰q¨  €E‹QYYÉäÉ“w x?è´¶?Òãâ ¼qðÆ­·Þʉ'žˆßïÿÌ´iõêÕ\uÕUÜwß}Œ?~¿ÞL&ìY³•†ƒ!,Ë"«¥Éî$Òï)Áï)Ù­’%UqáT=È’‚nh$3Q’©(mÁ­„¢í„côDZ‰§lmQ·³¯»·Ã‡,«ˆ¢ŒËá¥$PMi Ñ)#ËŠÕø=%¦†aèv1ª¬âq (N2ÙáX[[VÐÜF[p+‘x7.‡—B^W’¨àuQ[1’’@ ¢ ‘É&Éêi £7«¯=ÐnfpÉá„cD“݈¢œËÞ»Èè)†TM ë$ ·0iäѤwbg»{Ð Ã|"ß|-C¶ ÈÌ…1™Ÿ¼bp¥gF§G·KâÈAn¾pˆ›Û^± S£)ªsýTª,±µ%ÉÕ‹£¿3”Í-qfü¹›k'xh ëœ8Ê‹OÙÖytKŠŸà»ÿíæ¸:Õ Èüc]’óFyhŒê´¤ ÈññÁ˜$J„c]ˆ‚Hyñ2Ùä.¥,É4µo`ÆÄÓm»øý±Ê#ˆX¢ˆ%È JX’Š)Û©~b6…mÅÑÓ€”Š‚¥#fSÈÉn¤H;²ÃEõä9Œ‰¯!TT†¬é´%M*Ü¢ã‹U.‰lBçüZ'7½ÒS•øÊhá´I]@f|±JC ’2)vI¼º<Š!IÜ6§½ÒEU±Ê§ùQ]"o5¦YÜ '9?>û&I ‘D>w!EþÊ\ùŽQä¯â•Å¥3´Sç~“`´Õ–âì]Þœ*.,QÆ’,IAÂ%SGÊ$3q¤L1“@Ô’ˆÙ$b&†”Š §ÃH‰ ‚eb8 0œ §KRA1>²Zâu‡cª^°LD-`d( °fÍj9ã"Œœ’Ìwt·ÝvgŸ}6MM}“«Ïa$“I† FYYÙnÉ ÛZÂívãóù†ÚÀ;k¼ýöÛÄb1Î8ãŒÏT»Î8ã ,Ë¢­­7²yóæ}z{‹Ö–,YÂØ±c3fÌv@{ >Åðز0¬~¬jvûû¦*.jÊFí8ÁDÙ";$%W;`åÞÖÖ/ ³§¬–F‘ˆ‚H:'ž #I åÅC¨.ÎèºÃ øJ‘%ÕÎÃ7µœ££BIi’$â”=¬¯_HWGp´“WÞý…þªJ†3|Ðd*Ї È’©(‰TÓúp]dÓ2¨,ÆÒu/ðð‹·p⬯ðUÐnÚÓù1Cà”A2oÅ4Ýœe\‰ÊgâREÊœ"‚i1¸¯C¤Æ-QW¨"‹ðNsšWÅq¨"³*Tn›WLPYÁ0Ñ·›3ücm¿CbN­ƒêch±Â—BYžXçô1~F–(¬îÈðäš?˜àWœG£"–Ó‡©zì“Ìé°cY–e+ X‚e‚e ˜½ÿÛ_˜:J6Ð]O5ÑV±D=cI=¨g@KãVÝLÚ¶˜é’ŠòÚ/)6u$Y¦8P€¤¥QÂ-–ü•@KμÅ4LÝ‚€©¸Ñ½¥èžb W!Ù@5¦ê±Á¬`׎`š¦Ž`dí/sçj)Cú@¡\°3ÅÌ™3¸é曹æšk¸üò˹ôÒKY½zõç~i>sÄG ( ‘Hd—Û9NºººØ´iÉd’Ã?|;]Þ¼qÄ3Ï<ƒÃá`Ô¨QŸÉöÕ××£iÚ~uZ[¼x1%%%Lžw#O¡´°–D*B*Ç0¶W-è7qäÔ/òþú—i¯S$¢Y“º€ÈàZo¾H¹72†],|h¹‡á´I‰KÄ«ÌæFTѶD÷("%¤uݱ,8i¨ˆW·b3Ë´ð:%«²YâxƤ. ðÍ) µ~™§t‰j£¥qÎŽfì´\檠±)÷;ÉNsÿK2–ìÀEä‚jš›—aA€VPExê…DýùHJ#¦ôÕ‰^©Í¾מԆ†Î:ë,îºë.šššøÚ×¾FCCƒ]\ý1&‹ÖtÃÛÙ$n_œƒ¦iù"íÝ©4TVVòÜsÏqóÍ7|fœHbð~îbéÒ¥Œ9ò3×®åË—sÍ5×Fùú׿ΤI“èééÙ÷È4)..Æáp ¤3 ÄN_ÌšžAÓ3y›f·Ó¿8–DYRp:=Ô FIÑÈd šÚ׳zíû¤2 ÖÕ¿KcûFªJ†1´zFÌaúø“Ifbdµ4—Ó4ظí}–oxp¼‹Ö®zJ•6îD†ÕNÆ4 z¢mxÝ*Ї°zË›?ã2úçq~ì6ƒü2ZåñÆ4gqñð†$ß;ÔϪ®,Nð³¥#Å{=뢶‚Ïׯ¸ðªO¬RèS¸ê°~³ ²WŒvÓ’0Y¤P²æö`G ›5IèeÃÉ&öž½-“h¤¢‚*¬Td à¶,âMK™T45Ö·.$IBÌ*y-a›‘Ý;`VRRÊþó¯½ú ²¬ ìå~$YfäˆaŒ>”~òc2Ù½“Û³MË2aÂ$.¹ôRb±Øå,†Ó餲²MÓƒ´¶¶ÒÒÒBWWñxœh4JWW†a›S¥Óit]ßî8½N‡ÃžPÊ2eeex<eeeTWWSYYIqq1‚ ÐÖÖF&“ɹ¿ÚáñxX²d ‡±cÇî’¬Pe»”‡l6;0° Þ8£¡¡±cÇ~æÚÕÕÕÅË/¿ À%—\‚ÓéÜçÇè=öXÊÊÊ>ó¼±ÿÂ0íô ÍÈ ;I¥T—¥¨ ÉH3sâüõ™ë9aÆÅ ®O[÷VÖlYÀú†Eè†E·M7) ”1qÄ\& Ÿm³»¦ŽßSD(ÚÉ+ïþúÖUø=ExÝ…Œª›N<âÍ÷ÿͬC΢£§QøøNXª$ÐÉòئ$¿<¦”IÕ ­QGÖÄSá ¶@!ÍÌZˆt' £‡T*¤ U¡P&kZ¤-ÐÒÛb:¦(RâIjûOþOD’é=ÑVêªÆïTaC–Û×bX:ã†ÍÚn"³ïÎC@OGihnçôkgú¬"bá~c ˆPRaOSºÛAV@Q TÕ–´sÆKé8ÜäNA×û¶÷úAu€(ÙÛ#@, ™4ôbDI†hž½ë§´7nÀW\ó‘¯Çã¡©©‰;qãÆ1yòdjkk9äC˜7oN§s;0ÚK&ýl°{õõA@ÌiÙýÕuT*EWW,X°€•+W²qãF.¿ürªªªòÀ6°páBª««9üðÃw x׬YÃüùó¹úê«©¬¬¬ïçŒµÉ ìcõyŽ ö(ec‚nG¶†ha&2ÒvÎǶ™[ŽYù„ê‰^¯÷3w„{–eY躞gÈfþ±{1’¨ÐÒ¹‚Šâ!”Ö²vëB¾ 4=àŠÑ ª X(²“€¯Ó‚¦öõ,Zõ,[›—ðWPVXËÐê‰Ì›þ%’éXnWÏ¿óG2ZŠgÞºÍÍË8ç˜kp9½„¢èFv¯-†5ÃIäÙ3Ëù÷Ú8/nµð©"—M.`R¡Ì_ïÂí”øÎ´6vfXОeeP£-mò£9%<¾.Î5trÁX/ßœ(ñàÚ8«º5dQ`xÌ H\Û?Kêªâ¤­{ º®QU2œŒ¶ã$¶Ð_ÁëK"žQDghÿÈqŠ¢„eš„ºZéj-"5óc[Q©À?qKß_…OÎ2戳©2ŠåKßã÷|ƒ_|óz¶5SVVÈ›/ý—qG_@­OeåâWuøTÂ!…âêdt›~y ·\u-ë753jD9Ï=þC&Å—®þ#Æ "Ôeæ¯H4a eÓHòž¥ˆy<6lØ€ÏçÃívó§?ý ÇCYYEEEøý~TUEQ”< u8(Šb³æ¢h›IåŒt]GÓ4²ÙlkšF&“!ÒÙÙIWWÙl–9sæN§Y»v-#GŽÌ[Y–‰D"Àvÿèex›ššïàý\"^LÓÀÛ#‡Vß\¿Œ?=úw¦2‘KŽ=š$­¥Q?Z4M0ÞIqyŠZeɶ݄: ñI ÞÏ‚ðÎbÞ¼yX–źuëhkk£©©i·ƒÚÞ¿”D‚Á n··Û=Ö0û,R™ƒ*ƲèýWéìÙFuÙH±ÎQMÏвÍÜNÓÆžÀôñ'áT=ø=%´voâµ%ÑÜB0ÜÂꉸŽ;üRÎ>æû¼»úYî}워v·-fúøù1ù\º#ͤұ¼ÑNo”xÞßä‡ÝYw3æGFÖ7…ù{¿Ÿ¿³mû£&àªÍ}lé]oîXHtwKh§û.tÂóaüt EÞûç\•tGZðyŠlKáDÏéT:F2aìЙ$Ò‘Þ/<ï>÷ þðÊãÔ:á7?È}¿ø g]þ ²ñN¼%ÃùÆ­?¡£+Â¥ÿw›^ü'K‰¸|Õ 7šŽö13·}Þ’!|ç·°zÅ&N»ìf†D¤ç£³é½,lee%étšP(´]n*•BUUÎ?ÿ|æÎ‹,Ë(Š‚,Ëy°Û?t]G×õ|zC†W’$dYÞ!9›Í’ÍÚª*š¦aEEE¼õÖ[;(1$ FEIIÉnUŠŠŠX°`<ðUUU\ýõ”–– P€÷³¦i!æ,{A@$Ö5læ©×^ä½ +qùyõ¹gT.rÙIÕxœ 1»×ΆQ‹ŠpVâ.¬"\(ÆðFb –%€ N…aÄ}ëcEöØu:ü÷¿ÿå°ÃcêÔ©D£Ñ‹>û$ÒÙ85e£xËhêXOeÉ06n[B(Ú†$)˜æ®'W½lX*'•‰#‰ ã‡ÍbüðY”‘Õ’<ôÂ-<øÌu(²ƒš²Q\{ñ¿øÇs?eÊèã9iöWùýãߦ±}GNý‡=™®pºž!N#˜Iîz윎½uYÛ÷ñ5 §§‡uk×îu‘ª$)d²IŠ ªEë­“%•æÎ ú+1h*‰^3†½ I´¥çdIA¤< ‘â²èB7¶/*Œõ˜L9þ†ŽŸÄO/¸‚dÚ⬫~Ê+×\Ê_nû=sOø7fÏç¢KO£¹>δ9§ce-|åÃ9ëŠ3uÞ‘ÄÂsŠ^üçýÌ9á &Î>Ë/;ú iŽ8ñŠŠýdÒ;ÞY]‡C¥ª²w r»b/Y–)..fÚ´ituuqöÙg3jÔ(¦NÊèÑ£)**¢¾¾>^5MË}ÞÂ4-ŠŠJ0,áh UUD ·ËI$Âë€i’LgI&b$S)œ.UuàPeñº±½RIï÷–eQXXÈàÁƒó}CUUN;í4»T^>|8¯¿þ:<ò?ÿùϧÀûY‹í0MÖ¶v$Aäé§'«ë\ù•¯sÒ‘Ç‘IdxíÍÿqä”#™<¶ŠÛnþ._ɼ9c9ã¬ùûC÷³~s_»â‹\tÑÕø<}¶„‚i‚!b)Ÿiﯾú*'œp‚Í Ý}7Gy$mmûÞòS–e¶nÝÊèÑ£÷›Öï@|~'k>O1…þJ:{¶1gÊy¼ðÎY³õmfr6áXçí¯÷å‰wÐm§ÀWÂŒ‰gÚ.t/Ë6¼B2¡¡m?ýÃ)T– ãúKF’~ñ× E‰KO½ ˆÄ»èìèøT^·óöžú+Ðô›ž,Xù-…ßSLw¸åCÞ"²¬âwcZ-õt†¶Š´Òn"š"n‡+€Cu£*NÙÇ%ÉÔ3Ü ÿBœ B4h":˹ìÄé‘$غfžöU?ÕλvƒŽ›iÇžŽª‚÷Ðé:¤àö¤20cþ—™~Ê—q8!ÑádÆ ç!ìð´µuð—¿?„Ç_¼ÝŠ–(Šø|>2™ ‘H„?ÿùÏ€Î0oÞ<|>~¿94‡Óƒ• sÒÜ”r?ùêY¼ÿÎ;DBAîù×£¬Ù´«¿|aËÍü#¦Qß•bÎáÓÑpP]dq÷on`Es’ë~p=uå~¢‰íï›ÓéÄápð›ßü†ýë_ùÔ³L&ÃСCÉd2´¶¶îÒ|ÂãñÐÐÐÿyæÌ™¢ëúgj¼é-|õÕW9í´Óxê©§áÏ à5Mp¤]×íœ H’Š.‚¤(Ä£1|i‹KO<Ÿ~í[’Ä‹¯=ÄæêR2Ù:›wV †Ê±ShJH<»´“ß?óu¶Ö·2rÜhÎ>õÎ;öt†”×䪄’{úy ½RïRØþÃ0¨¬¬ÄívæÀøL»-UqÒÚ½Uu1¬v Ñx7’øq@­',`çE&ÒbÉ*Šë8ý¨ïR\PMO¤•›^ãêßÎÂç.bü°#8zÚ…tëyè…›9ï¸ë^;™Ö®-HÒgã• "‰T˜H¼“Á•cÑôÌOgã4¶­fÒÈcÈdw\·ø¸]>©8Ͼu/kÖ®bpÅ8þ*ê*G1eô1h††¦§Ñ´ ¦el—^&…> Þl'™Šï” ‘3â¯wü†’Êa”V–`¦5œÞb¶n\‡«¨Ž¯|íx^öm^zìÏ„# æ%õ›;:bu“gÓ[ÿaýÆz¦9ƒ/½ÍWÝÀ Úr‰Ó ‹¢¢BŽ›wî‚òíÆ¼Þ1ööÛo§¢¢‚Q£F‹Å‡Ãx½^~øašššv’F'ÐÕÞ¤#Nå¶ŸßÀé³ÇR4ò0¾tÖ¹ÜôãqÌ:ìPNœ7‹“§ŒfcS7‡—@ €[5¹òÛ?`ìô£¸h’ɉûÿñ0CJ\D}÷&“ÉÍf¹ì²ËøÂ¾@Gn¢æóùxûí·ñù|Lœ8‘x|çnƒº®£ª*#FŒ ¢¢â3?æŒ9r 5ï³x ÓB7M¹œ¯H,ˆeÁ†ÍxïÝÅœ>ÿ Ü›6,góæÍ\|É¥d³¾|ùåXh™,C*øË_þÂè1£©®¬ehíŽ?ò nùé:ƒAîýןX½9†³d-‘º[ä°'S[QŽÓ«“ȶaX( ˾ŒââbŽ>úh"‘.—‹L&³Àˆ­ÒpüñÇSTT4 Ò0û<2Z’Ê⡬¯_DCëJÆ ™É’µÏÑÑÓ€ª8w›Ö°;mÛ(ç4x%%èLÓ +ÔˆeYŒ:›cûíÝõ¼½üQžþß](²ƒÙ‡œÍ³oßK*ãÊ3…ÏSBw¸I<¸_ ÅESÇz±JµèPhPdík)ôW1¦nFÞžÚ², ªd8«·ü—–ÜKO(Ȍ鳸ìÔŸ³tÐ"Ò™D>:ÝG̸’,êh$•Há ÌÀïô’ŒG‰F"¸Ë]x `òQ³‰»Y¿¾ó¿<ß\½PO'‰X ÒZ$+I¸»•¿þêNܕÙ:»œú5Ö—”ôÙÞ®7æÿæóùvI:¤S1 «GòËÛ¥½­ÿ¼½U G£œáH$¤²3 ¯Çm§Cè:úã½D#aÒ:,Zt¡îBÑøNë5zS)zÏÓï÷³páBjjj˜5k±Xl—Ìg6›%.ïgµ®çs xóª ‚€$ ¬Þ°‘ŸÜ~c&Œâ;_ÿª f<ÃüãçcaÑÕÕÆðáÃ>|8~ñË[)¯(çâ‹.LÎ=÷°^ãu¦6™ÓÏ>ƒ×_}•ŒdaI2k6mb䔑Ì;ýPf2•ñ¥câ„â, ²æ¾TÁ€)S¦ðꫯ²páB‰Á`p¿ô%Ã0¨««Ëç¤ Ä@ìËHg ªGUÉpš;6pظSxqáŸXµù3íBz¢í{ÕoÉ(JhZ§êÁÄØá%/ ÐlàÈC/ ´°–×—þ‹·—?Æ·¿p?ŠìäÇ÷ŠC‘¹éªçH¤ÂÄ=;¸,áq°µeNÕKI š®Ðöîsn§Žà6JÕx=…„¢m€@yñ`^Zô ÷?ñ=®:çN¾{ÁŸ¹çæj±.ºBÍdµô~¹&¦a‘MšyÖ71n~¯Eýºu˜’›¢¢B¿ù_®¹ä9Ž=ÿzFNš…èª Øf1|üL"ÑWimjfÉ«oQ1|§ =’ù_8‚§þò,ÿ¼ïN:óÂûpÈ”$‰l6KCC@‡ÃAOO‰D®³0 ‚Á²â 'صÝg[ú ™Ä¢; J´µ¶ B^ÙÁëõRXXˆeY4662uêÔíÒ)DQ$•J‘Édvë:7xð`~øan¿ývÜn7ï¼óÆ œï'dû&½;LQéèèà·ßfä¨Q¼õÖ[Ì™5—Û®þ!º–aÕë $‰îP¥+WPWWGqQ…ÅE <„çþû4©tšÁC†QS]Í¿y˜’âBŽ9æxV¯Zަ›üþ¯òÌ‹ÏRQ]…ÎÉÇÍcé³OPá-Æå­D,L±÷œuÁ@@€¼û!jkkÙ²e š¦},w¡]Íü%IbÍš5”——SVV6 M6û<IÅë.¤¹s#3'©Œ4MMK1̽[v´0q:<‚@2¥ÀW†¶Û~n˜:íÁ­Œ<#§|µõ øçó7ré©7qÜá_àŠ›'‘Jǹéªg1M“žhÛAÇøZ¦FmÅèÒì¿›lk[ͰÚÉd²IÊ‹‡ðþº—¸ï±oñÍó~Ï‘S¾@8ÑIG϶}pÝ/]¬ÿÏ?iÞ:’Tb׊ [Ö®ÜÀ—Ø ì—Â_P€(Šüþ×+Pd9ÿ·`×6zñå†úÙüþö'J"Ñxšîëðœ7oŠNššš8ï¼ó¸è¢‹¸ûî»innÆår!étšH$’Weðx<¸\.œN'Š¢ä•ú“ ÙlMÓH§Ó¤R)’Édèât:1 #Ÿ§ûä“O’H$hnnγ¿±XŒ)S¦v™ÎЬÇb1b±Ø@êÚàýäcW^cc+–/gâĉˆ¢HAAg}6‹ß]ÈšÕ«8ýôùTUÕ²µ~ ƒ}jª«Éj-ͬX±ŒL&ÃúõkYöÞ{ \˨áC6báîn43Éóo¼ÀI„)“*Ó&Oåßýê¢*J<%€lÛ·÷›@ ¢-Bfÿ Û_±Oã?ÿù§Ÿ~:¿ûÝï8ùä“illÜç€WUUÞ{ï=¦M›Æ Aƒï@ìóHfbÔVŒá…÷³±q SÇž@(ÚÎæÆ¥ÔTŒ&“ݳT˲p:¼€@<F–²Zê#²‚ ÐÑÓ@ÀWÆmß|••›þÇÅ?Íõ—=JO¤•ËoËɳ¯àÌ£¿G4Þµ× ü€¿?H¢YRT1võ·ÓÏÚú…$31Æ ™I¡¿‚þs ^W!?ûÚ‹lk_ƒnd÷™ô¡eYlÝÖÌ-7ý¿Ï»GŽféC‡àºk¯¡¹¹™‡ÿù/¶nÙ´×Ë‚(’IEsK ¢™ýȵ½š·G}tˆETUÍ–9ŽüýèUé•%ëÿ™þº¼½_™L†LÆVÑ4m»kÖÞÞž¯½‹Å˜8q"²,ïðjš†Ë墲²¯×»Ëâ¶¼ûyFn† # vZcK5UÕ4nkàoÿ;W\þeæŸz:¯½ú ÷ÜswÜy¯—qãÆñË_þ"ïæòìÓÿ¡³«‹›o¾1“á7ßD–e.øâ¥XÙ4‚j;u½½ü]nûéU¬]·’Pw7“™Äcÿ“™‡L§ØW ‚»?•b³¸âw{ Ãí¢ì·Y¹,ËlÞ¼™‘#G¨4 Ä~‰L6ɰêC¨)ÅÆmK;d&†©óÞºç7ü:{öÜø@et#K,DUœ$ÓÑ=þ|k×fŠ *¹õë/ñØ«¿$‘ŠrïuKyèÅ[øË3×süŒË)òW’HE>õŸ.Õ˦¦¥DâÝ” !Ý9T=‘6ê*Ç3¼f2·>p.£ë¦3gÊù4u¬ß/l¶ªªƒÁ•ŽURRÂO<Áí¿ø%'ÂyçG}}ýÇ:·}ìMÓ$N“N§ø=×u¿ß°Û"­¦¦&¦NÊK/½Äøñã¤ÏYˆŸÄA ËB7 ,Ó¢7ÝL,QàÕ% ùÞoþA*¸éÖëøý~Í 7þ‚¢"’ÙÑhˆQ#†rç¯~Imí`$IáÏy€n¾¯¯I’8çÜs¹æškyæ©ÇyñÙ§ùú×¾ÅÓŽàŸ<ÄýÿyˆÑGŒE(øÅý·1÷°#ø÷½³ìµüóŽG˜?ç\ ýƒ1pçS+,À,ÁBÀÚkôØ»=z4¿þõ¯ùÖ·¾EIIIž]Ø×.]×;v,ååå,Y²„ÆÆF‰ï¾û.ï¿ÿ>===ttt°|ùr,ËbñâÅd³Y6lØ@}}=©TŠE‹°lÙ2ºººèêêbÙ²e,Z´ˆT*E}}=›7oFÓ4/^ŒeY,_¾œŽŽzzzxÿý÷x÷ÝwI$466²víZt]gÑ¢E†ÁÚµkimm%óÞ{ï°xñbâñ8ÍÍͬ^½Ã0X´hš¦±nÝ:¶mÛF"‘ÈoÿÞ{ï‰DhmmeåÊ•˜¦É¢E‹Èf³lܸq‡6-_¾œžžºººX¹r%–e±hÑ"2™ ›7ofóæÍd2-Z„eY¬X±‚öövB¡K—.`É’%$“IêëëÙ¸q#Ùl–E‹aš&+W®¤µµ•H$’?Ç%K–‹Åhnnfݺuhš–¿«W¯¦¹¹™x<ÎâÅ‹óm ‡Ã´µµåÛ´xñbt]gÆ lÛ¶d2¹ËûÚ{ŸÒé4[¶lÉ·©wÿË—/§½½îîîîkï}Êd2,\¸0_üèv»éèè`É’%„b]D:¡«§…w߃i4Šâäá'îÇ26oÞ¼]ßEq»¾´zõêí®{C}7l¥«§™%‹—’Ífó×½·o‚À’%KèééaãÆ444N§ó÷uÅŠttt²zÃÊS9rʹéÞ ˜1é|Ž2zö×lÞ¶’5«6`Y+W®¤¥¥…h4Ê’%Kò×=ÓÒÒªU«0 #Ý׬YCSSÓv÷iéÒ¥„ÃaÚÛÛY±bÅvmÚ´iÓNïS0¤³³s‡û´uëV6mÚD&“aÍêMlØö.Öl!×èêêê{ž½KWw-í[ñ+uÜò§swXÌ>ä\ÞxûyZ[[‰F£ùí{ŸïÎÎNÖ¬Y“þt]gíÚµ455‘H$òmzÿý÷‰F£´´´°zõêüó¤iëׯ§¡¡a‡6uwwÓÙÙÉÊ•+Å‹ç¯ÁÖ­[I§Ó,\¸‡ÃÁwÞ™³î¾ûîüØ’L&Ù¶m[þ|ðù ‡Ãùç¯wŒhjjÊ·iñâņÁªU«v¸¯K–,É·iÕªUÛ6l ±±‘T*•ß~w÷uóæÍlÙ²%ß÷zϱ÷ô¿¯©Tj»ûÚûÞsìÝ~óæÍüë_ÿbÍš5í{ªª˜M|NC°,+ PYË0m)‰líjâ¹ÍÖ±rñ{ÔolaÊÄIÜtã œpâé`i (<òÄ#Üÿ}¼óæ|íkßàºë~ÌÆõëˆDb”•—(*âå_¢¦¬”SÎ<‡úkX¼v9K×,çÁ‡ÿHqYªìfîGsÑy_bBÝX\Š'ÀM„ÜßvÁQTTTpôÑGó¯ýë3×Qu]gáÂ…¤Óéýƾš¦Iyy9ÑhUU1M“L&CAAÁ`¢¢"âñ8¢(âr¹…B …ðz½†A:& ),,Üðôn‡ó9o‰D‚ÂÂÂüö©T Ó4ñz½ôôôP\\L$Ááp Ë2Ñh”ââb‚Á ~¿Ÿl6‹®ëø|¾í¶ïu;êݾ§§'Ž™L¿ßOOOEEEÄb1dYÆáp‰DòÛ{<Ûð •Ú®M‰DAp¹\„ÃaJJJ…By&>™LRXXHww7@€t:½]›ŠŠŠòнנ¨¨ˆ`0HAA™Lf»6õžcoþ_<Ïoï÷ûó¶¤ýïÓÛTTTDOO>Ÿ/ vw_{ÛÔ{ŽÉdr»kJ¥°,+_{·w:ȲL,£¤¤·ÛÍñÇ,˼üò˃AB¡CjGó«¿\Á„‘³8÷¸køënBqXÌ=äb™ ¦iæÛÔÝݽrˆÓé$‰PRRBOOUåu¼³âQVmx—o_t Mñù|;½îñx‡Ã‘gãvvŸ<‘H„ÁUc¸çáo£¨ ‚`Žvqáübé*.·ºÓûÔû쨪ºÝußÕ}ê½îN§3ß—zûÞŸ¿Þç©·ïíü>¥¨(¯â¯OÞÌŒ)'P]2ŽT:–¿OCâ¥wþIG°êŠaD£aÎ=ñjÖo~Ÿ@ 0ŸOêõz‰F£Œ1‚ñãÇsøá‡óÐCñþûïo÷ü}°M………ÄãqEÉ_ƒ>;#AÈ_ƒÞ1¥ÿó7sæL®¼òJx`û|Ü)S¦°`ÁÞ{ï=TUEÅüó´«çogcDï}ÚÝó·³1Âëõ¢ëzþ>õïg»º¯½mêß÷R©ÔnïëÛÔ{Ž^¯7?®Æãq’ÉänëáÇs÷Ýwsûí·°zõjÆ÷™x#FŒ`ôèÑ<óÌ3hbŸà5M Ë$ ƒD:Ì›ÿ{ 09üÐCló‡×ßÁí ÐÙ¤¬¤€³Î?p°ôý·øÞµ×ÐÒÖŽ$Ë5û(~ñ³Ûq©2KW-ãí勹õ׿ ¸´˜šÚ*Š ¹üÂË9t⡸}(‚Š (ä2(?Cù ŸeÀÛ;8uvÚý»«ÄˆøT,Ÿ‰"UUUœ|òÉ8Nž|òɼv©ËáekË ¶µ¯áøÃ/'•‰óÏndÆøÓ9xÚ¥%8T7íÁzÞ\ú0§ÌùªâÄ0>¾ÊˆiÔ”æ¿oßǺú8U/c‡Îäðñó Ç;?•”€SõÐÐºŠÆŽµ5õÂòw‹ ªøßÒ‡ÙÚ²œo§ù­]š~H’DQQGq‡z(>ø ›7oþDÚ•Íf)//gÒ¤IÌ›7-[¶äÙÏÆÆÆ}^ÄûYºº:|ðAnºé&Ö¯_ϨQ£ïçð~"O‰ €W@Æ-rÂ1g“N¥yâÉGxéåg6d0çœu*ã&ÔðïGžàÞy÷ÐÐÒ†Ë㧺v0E2=Ánj†æßÏþ‹ç^}Öî "·Ür'}U•¨²LÓòv½ç0‹{pÄ(Zû¼† y6q öتªºGš—©LœI#ŽbÉÚçxùÝ¿pî¼k9lìI4wn`ˆ¹{”+›ÕR” &à/§'ÒJMù¨}xEQ¢¹s=Çϸ¯+À{kŸç­eRä¯dxí¢‰à§î^xKXµù¸œ>Üïv€WU\ljZJ4¤ÀWÎøa³IeâESU•p8œOóÐ47ÒÙÙ9v÷ Âá0µµµ\qÅÔÔÔPRR2pQ>Gñ Þí+2MÓ°eLL“O<‘sOŸ$K¼¹àM,]@RÒɸ2T­`ÌðI¼÷ÎÛ„»:A²xòÑ¿sâi§pà ×3´f^±@·ÿ3°«QøÀƒ7úWÒJ’4à³#•JQRRÂÔ©S.Æ^F2™äÍ7ßÄápìQAWO´c§_»«Ÿe[û¦;‰?<þ]^Zø'Ìú2Á±ºí ˲p; xËÅ:VsÈ«=ìô =Û8|Âi¬«_ÈÂU¯1uì&Æ ù©»ЬRߺ’Œ–âÈ©ÐÛÞ"à+åíeòæ²G8~ÆåŒ:›ŽàV¨Ïà0aÓ§O¸ €÷ÀÞÞ—ƒ(Š(Š‚Ãé@À` 3ïTŽ™w* “Öâ¬Ù°‚÷–/dÌø*ÆŸÀô©³(PŠmÝ[Ý·¬\œ ƒˆ‰„a#ßÈ{ÐÆÜ¹sYµj+V¬ °°0o'9ûæ9Ü•L’išX–µ]N\ï¶½)%½šØ½À˲¬íÒMú&µævL”aû¬:ü“ŽL&³Wʺ‘ePÅ8–mx…ÿ¼ñ;¾rÖÌŸóuÞYñÁzŠ›ÿgï¼Ãä(®®ÿ«N“gs^…U\åˆH€‰ r09ç`ó‘lÀØ&Ì‹“mc“1"# „Ê9¬V›óîäéPß³;H›‡ÌœçVÌôt×TWWŸº}î¹¶óíIœîŠk ­;ÑԽƽ+ÒÂñÓþ[ª—òî’G[y(.ÝCâ[Y ýgðæ±róô*ª¤(¯‚¶Îº/ͺ‡­ÕËIZq¦ï{Ãû@s{u†ìþÈÐcKÖ§OŸLgüñ½`=äWUTE ¾ÂO5ÜZ6ã†OæÂÓ®å§çßÊŒýŽ%[/GÃqº©»HI4‘¢¸Ð3d÷¯×Kee%½{÷þ·Ú’eð¥ÉAQˆÇã\wÝuL›6?þñißÌo¼‘·Þz EQøàƒ¸êª«°mEQxüñÇ™4i·Ür ¦i¢( š¦qûí·3iÒ$î¿ÿþÿ²ûÏ¢±­Š£¼œ¼ì2>ùüEõÞ‡l!‹V½J~v9Žüvž­‰d„²‚A4´l§©½Mý×ú‹&­8Ù"Ž:ðJvÔ¶°m÷ ü¾ÜïOäFsÑкƒµ[çQQ6’H´ý‹E’,>›w-ã“Ï_ ¼pðw*åœÁÆ ãÍ7ߤ¤¤!kÖ¬ÉtJ†ð~! ‡Æv§›jJ®á³ÿÕˆÅblݺ•ššLÓÌ¥ÿÚÚÚØo¿ý3f |ðo¼ñÓ¦M`×®]\|ñÅX–E<gýúõD"f̘Á¶mÛX´h†apÀÐÔÔÄ„ ÈÉÉaÑ¢E¬ZµŠÊÊÊÌÂP„B{W?•ÏÖÏaÑêW8îÿG(ÚÊsïþ†ÒüþÈoaƒ˜HF©(A~v[«WàuÿÅÓ¯ ½³ž¤y1Õ PÄ÷ã:”R’íÏgÃŽÅ p ¥#I˜ÑôgùYåÌ_ñ<­;9éИ8üHÛª2ø¦iâv»ÓÿŸ)<‘!¼?æ›y õc¼yó:t(§žz*UUUg:å?€«1Ÿ/eß÷ÆoðÁ ¥Ä0 š››¹îºëhii!7nO=õ ,àç?ÿ9Ÿ~ú)yyy”——óÀ°víZþüç?³|ùòÌÂ¥¶c!¥äÄé׳`å ¬Þò!÷{¤”,èNû6 q–mÒ»xñd¤»oÿu~á–mâ2¼ °/c+gÐj¢(·Yþ@þ¯öþÕðy‚¬Ýö [w/güÃh5¦ïn—µ«GÛÑ5áߣÈtÿYÔÕÕ1jÔ(yä.\˜‘6do|ÿVåirÐýØ<ƒÿ ÊÊÊØ¼y3ÇwŠ¢pÞyç!„À¶mn»í6‰W^y%Š¢ÐÕÕÅí·ßNUU+V¬ ++‹_ü⨪Ê+¯¼Â¢E‹xá…ðù|<öØcÿÒŠ]{'Á:ßHÀLÓ$ ‡¿Q»lÛ6Žã¤÷Óóú·Žq+ŽÏ“ͱSƇ˞¢ºa'L»–-»>cãÎÅd þabÉ0åE•ìª_OmÓVtÍý/k_iÁ|þ7†+˜¿â9ÖlǘS5®{à` ̓Ëðþß P)Ñ57›ª–0iÔ±èš+-UÐ5±D˜…«^"aÆÈ –0c¿siÝCÛ›Á ‰D‚@ ÀèÑ£™4i'Ó)›AßuÔQH)Y¹r%C‡e×®]™Nù 77—;v0`À^~ùe®¸â ZZZèêêÂçóq×]wQVVF"‘@Ó4öÙg®¿þz®¾újî¾ûnV¯^MMM ¼ð üæ7¿áÊ+¯äÙgŸÝk!ó¯‚EQhnnæž{îaâĉ¸ÝnÜn7}úôaß}÷åè£fæÌ™TTTàv»Q…^½zqÎ9ç0þ|TUMk•{Hæ¿¿œ® ‘ŒâódqÄäKxíãßSÛ¼…³º“—?Ëš­óÉÏ.CþM¯e%)/HQnvÔ®ÂçÉþ—µ®©m‡Oº€óŽ9ŸP$‰¦ ú”¸8÷¨»ðûrIþ$¯9Ò¡¤`¯Ï¿]s1zð!„£hše'ygÑãŒp¦•à€1ÇÓÒ^ƒ™ÛÞªªbY´¶¶~ã¢7ƒ9á•ÿ‹€í8Ä“ñ¤EÒI9'ØrÏ—Ä‘_}è&IIpºß•R¦¿gK™Ú_÷Ë!UÌ"‰CT:Dl‡PÂ&žÜ³E©í’@HJ°mÛv°,)Á‘‰ÆˆDb©¿=¯Hô«ï}ùùâÆéì ¥«ðÄã‰Ôñ™Ž}Ó«'º”Á—oæV:*—‰ðþg““Ãܹsyá…¨¬¬¤°°×^{ H¸»\.¼^/÷Þ{/¸\.–-[†ßïg̘1lÙ²…×^{òòr6lØÀÊ•+4h.—‹åË—£ëú·Šœ~9ÂúuÿvÎ9ç „`¿ýö#ðÖ[oljÇãìÚµ‹•+WrÛm·¥uÄ8ŽÃîÝ»9çœsxøá‡BлwoÞ}÷]Eù»Nÿj$Í8šªsÞ1¿ã­…ðÉçã׿Òµ¯óî§OP^TùwB±vú÷Ks{ ‰dä_Ú¶¦¶jŽ;äöv k·u2iô±Œ8e/7„ÿ¤t(+È3so¥+Ü Ӯ£±µ xÝABáÞüä!&>–Å«_áÀ±'!GfÕ~ÌèÓ§‹/æ°Ã#??ŸM›6e:åG„oeK³!jK ÅIlJ:w,P!%–TR$VJ@±Lâ]&Ñp”˜i’@7LÛÁr!04[¤njšêÂåV0Ü  á6*8Ý”Úrlp@µ$š•¢´¶tŠŠÐDª|š®5m"›HÜ!±±LUQpénds=Y] ¨ªB<–dŸq£¸ã®Gxà&§(ï ‹¥îRJ¤é¤&MéHD÷o•ŽƒÄFjC¸¥ž‰Lâúë/eǶ­Ì˜qIÓì¶l’(R¢úíBˆM²”D"aÊ{UPX\šÝؽ{7¯¼ò UUULš4‰>}ú‰DþåDZl›Ò’„4I&’?¸dHÙ½¾3<^š[Û1“Éjq ¥¤¸¸˜çž{€—^z‰ë®»ŽX,FQQ̘1ƒ3fPUU…”’Ã?UU¹á†R’““Ã9çœÃc=Ö½øsÒdòùçŸç£>"+++-—(((àCaŸ}öI§‡ÜîItc±G}4ï¿ÿ>·ß~ûß%Ñ]tüãyýõ×™5kVz¿B&OžÌäÉ“yþùçY¹r%'œp;vì`Μ9Ìš5+½_)å^¶ŠÿŽÈeKG Wœü(o/z”_S¦LÙKºÐC~ÇŽËöíÛùøã™:u*‡z(o¿ýv:ÑnOÂþhÔ6maâð£8hÌI\uϾ2átŽ8ðRnûó 7õgT”¤µ£EÙ{¾h51eü)lܹGZDã! ŠÙ¸ªš+n8žýŽÌ!þnì‰@àóy棫±më;÷A^±—gYÎ!#.à¶ßÞ̶m[¿U Šò*øã«×PZ8ˆ#&_Ì®úõäJH˜n}ü.<ö^¯y…E«_âú³ŸcwÃÆ¯ôQ?Nlݺ•©S§rüñÇgŠídï7ó]§[Ð0r¤ƒ-%Š#¾ÌŒ»CM©²Á(€#v·Q½”$l§û¦*‚,·F¶+U(ØÂFéØDbqË"Ò‰c:ªÙ…;¢p»Ø¹x1Š"èÝ¿ɤ‰¡*äåQAç®]$ªaÈ:*.á (*I4b ‹ &0-‰?àã£>fãÆ ääaÙ6J·ÎK¤<Ž#IŘmÒ.2ñ퉮)š›8þøcH&.Ê~÷£©© UUqCE¤ÝMœÓªIÆ}âë~Q5Ê4Í[)M3™¤°°Ê!Ã2tí?@Âkø`uE¿4iüÎûê&1?ýéOyçw(((àºë®ã¬³ÎJosÉ%—ðÊ+¯ð›ßü†²²²tTWJIUU7Üp?ýéOÓÛ_{íµ<ûì³<ôÐCäääpùå—§?ëèè ¸¸˜ùóçSVV–~ÿì³ÏfΜ9Üzë­ôíÛ—ý÷ÿ¢Â×Ýwß͵×^ËsÏ=ÇÉ'Ÿ @$á´ÓNãµ×^ãðÃç§?ý)wß}7O=õ^x!/½ô3gÎdåÊ•<ðÀ|ðÁ :”—_~™ÊÊÊôïî!¾|0áp˜ýöÛ#F°téRÀDV#„B<!ïâú³ž£®y¿zìhŽ>èJ\†—ß=uçsÙ"šÛ«Q•Ôuásé 7±|ûüùõÿA¸öì»(Ï›Fߊ>T)&ú¿'€ù%> ®Ãçó}CikÑ[ØŽEq^?¶×¬ä‘—®äœÙw‘,Æ´’hªÁc¯^Í~#f3iÔ1üíý;9mæ/1t»7eÈn{ÍkRÊLµÎ)¾Õ¬mÛ¦é „Št4¤£uGkní©ýEftZÌ+‘2ŽcÆ@$H"H"0S/™@V*R¢‚…E"‘ ½³‹æ¶:#­´µÕîj¥ÐoPà–<ŸWCW%q3Ni¿Þ÷-%i%@q0eJ7™h~ƒ /IþŽíx׬"´t]kj©]± ÙÂm¸‘Ò&‘´Yµz7ñ¨…Žec[q'ŠmÛØÂ™Àé&òR‚´¤L¤~›0Ò"‰Ñ·o§ž|$Ÿ¯YLaaaz"ï韤-ˆÛ &:ÇQ±mÐöxL›˜{âè£FJÉîÝ»9r$;vìÈtÊMMMlÚ´ ˲˜2eJšìöŒÓÃ; —ËE(bÅŠ©t÷b¤'9dOœqÆé·U«V}åF$„øJDúÈ#ÄãñH$X¶lYúý9sæpË-·ðÀ¤Éî#<‚ßï§W¯^H)yûí·™6mÛ¶mã§?ý)×\s 3gÎ`ôèÑ<ñÄH)¹îºë2dçž{nº=/Çqðù|¼õÖ[D"N:餽ÿ‘IZQií¬CÓ ®=óY*ÊFñágORÙw_¬|¿¾y#mu è5ŽH¬“?¼po/| ÓŠ’—­S’ïg·ٶ{å÷Ü’+Uf>'XL~v9 W½ÆÆK¨ì;ÓJð«ÇgSß¼Gn\CЛËgëÞâ‰7®ãý¥OPZ0€Ý™ºÏéœyäm$’Q"±Žtà"ƒ |>­­­|ðÁ¼ôÒK„B¡L§d"¼_ ñÚ–…¥*(=EäÞŒ9ý8Q²W)DO暦wdDZ‰Æb„#a¤ÉdETMû"‚ç@À@(˲º³k¤cáuëE%KÒãÍ+M(ªE2i☠(q-‰W“ø}*µu;q¢Q #lTÕaGÕ6/Zˆ?üBOK*24imn¦0/›A}ØZ_‡±S’R«EU(tt´1ûèCéèlBUtFM{kà ªªª¦3À”®¡ˆî²…išØ]Ñ×¢ººúŸŽðêºN[[¡PˆAƒQPP@<§¹¹‰ÀíñÒZ»…ª­ù”ô‚Ç MIÖ}¾ŠÊñ(ȃ–fAg«ƒPš&h­¯¥­¥•@^E%E À€Í+Ö’”#& !ÚI³[/@Õb¡0u»¶áÏ+¦w¿b’Q‰¢ „Ëtصm3ì\ÌDG¸)*-ÃãáÀªEËÈëÕþƒòhn0ÉÎVRÊ£‘…V^^~¿]×Ù°a;vì _¿~i²7~üx®ºê*"‘Gy$Àß-&‘º†S. _}þº¨t{{;ñx¿ßO~~~úý?üáŒ?žË.» €Çœ‹/¾˜Ç<-¯X¼x1·Ür óçÏÇår1wî\¦Nº—ŒAÁgœÁøñã™4in·›|0Mv{~k¯^½¸ãŽ;8ÿüó™;w.‡~ø”ôBJæÐnFJɬÉSÓ‹ÖÎ:Vmþ€?{ŠgæÞJÒŠcš1"ño.cO#ë`óî%,Œ¿D Äp›$Àªà˜’@®‹ºím„#6•ù† гym eýs)*ñÒÒÅðêý›W5¢x\ô«Ì%ÒKɽøbL‡;t´FA^‘Wòºõ×ÝR®Ž–(ѨI¸ÓDä§*¡ç)Ì[ñ/üéxZ;;(ÊÉ!³fëÇœzØ-\xìÿðø«×ðü{·S˜Û‡Ê¾û2zð! ­˜„ªj´uÖw— &ÕÍàkQPPÀ›o¾É¯ýk %Áª¬¬ÌtL†ð~h8FKS¥Ùx½:šR ÌîD,)e·¶ TE »\ ‹ …ˆ'˜É$±xMQšF<ÚIKs ½û F5ªÚM…L?ÆrÌ$‘hŒ@n6ÙÙn\7ó®eþ¢õTU7¢ÈN.8û;t?Âáuu-Øx<*%%%46„é 5ST˜C"Ú™ Èv~wÁ189#8ÿú_søñCøÅ?§|ÄáüäøÉüìʈ·lÃåvñèܧùàɸç™E”eÁŸïÿ%7ýu!}ÒÒÕ‚KSÇóá8ªªòë_ÿš#<’šš¦NʰaÃ8묳8ꨣ(--åꫯþ iý¦„®ž÷öL:ëù]×B°téRZ[[ …BÌŸ?Ÿ9sæàr¹¨¨¨`öìÙéèîÇÌM7Ý|¡ž={všì^xá…<ñļð ¼ÿþû|òÉ'}ôÑLš4‰—_~Ã0Òí:t(—^z)>ú(çœsãÆûŠlaìØ±äçç³`Á?üðÿ³k¥§[:j1p ‡Oºukøùƒ3I$ÁÐ!žh¢¡u.RBIAIß^xdÝçá¡y'ðîï>à³-1ÆŽ*dãÚ6¦;ê-Íl^QOÌ1¸ðºqÌ}v=[×iL=º?ëæïà±—wrù]S¡¹î_ð¨äº9÷š‰ÜxÖ»è¶EQ©JQeotMëŒðñ{Íyú(6|¸M[ChšB" Ó¨ÀcdS׾޳néÇÒÏ[(͇ ÏCQn>ª¢!D‚¶®z–mx›ÞEC¹î¬gÑUñd„p¬DZEÛ2$7ƒoÃ0ˆÅ¾°Ðûz)M?jÂëuAA+D¬Ã!O‚¢ãñ0<:ª.pµ5 t´u!‘t…:±m‡ÂÂ2¤“@J·ËÕ=c;~‚YAliáH¡¤¢Ã©9ËÁq$n¯›‚âl¢Ñ—]v ¦•`ÆÔý‰4o&ÒZƒíHîüíCÜ}÷ãL9p—]t*m]ÜußKÌ™ó>šaâÖ ¨`ÿý&°Ï>ƒ0¨”Ö–v’ý*Ð47æaqŸq(BèTWïfùçËX½j-Û¶î"ÜåÍ—^Àc<‡ahº†áÖ°%ÝÑn@*D;»8â“ ‡›pùÜÓÖÖŠ¢ t-EèUE©¤4Í–…Š@QB¤Ê# %å$ñcËýôÓOÉÊÊâ‘GùÚÏ7mÚÄ!CxõÕW9âˆ#¨®®þNÇ***béÒ¥,Y²„2cÆ ¦OŸÎÀAƒ ¸p ½ñ4‘íe,þäFŒÌš¥ŸóÎ[¯±fõç ?¯¦ñÒÚvþçÜqìì(fò!û‘UÒ‹™GîOGÔUmfð~G4«yãϤ$(yéÏãð“fÑÒÒÌÛ/¾ÀæMŸ1jß©l_ßÀ¨ ƒXýšN"\Ã#¿¼€CÏÿ5²~ ¹õ|F} 3!îÂ2¡­¹qbÇò·yãÅWX:g.}GHÛæ¥ÜôÐ2ò\~}óy<÷êœJÞ“ÍŸ)%7ß|3Ñh*Á3//—ËEyy9?þ8>Ÿªª*î¾ûnE¡  €ÎÎN:;;5j*E½bÅ Ž8âŽ9æ˜ô18àN8áÞzë-vîÜÉàÁƒ÷jCYYŽãÐÞÞþmt»Ýß9ðßE(Ô7oCSuî¹zo.ªª£*ª¢áH¯ÏM]c5¯=0£N*äÖÿF¿Ñåì3ÚMU]œ“{ô æ>·‰Ê±ÅT­kbÅ’zV|¸|¦_Iaï,¼.…¹YÍöϪq•æ°ïØBÎÝÁ‚×·MÚ ™KûŽF<>UÚø‚nBõ],|guk[)«, £©EÕñúuºB-Lp*¿úÕûì¬Ú‰i¦î®úulÛ½’Õ[—2qøÑLp:mut„š¾Dþ3’… ¾=Ö¯_ÏQGÅ5×\CQQQ¦C2„÷«P…@slœ¤‰”&ªf¡+1ìH+–å¡#®2zÜA\vù%ÜtÓulݺ"w ªâP[»¯'›œ¼’f÷jJ€”6Ø¡H¤bw;¤UM%‰…º² ÿãíyÔiÜõÀƒüâúÿG߆~¬XµŠmÛ«Ùºu»k7pî9GóàýæÙ¿½ÌEESs;›6m¦¾¡–{œx<×üì\4­ Û²¨Úµ ]÷0dHÜÁ,š0Ü‚í›×RÙ¯çœv2½+Ê dÙ½»‰·ßšË²e˨«i$3 fgáõzimmã ©“™0~_-ZÈAÓ&ÑÔ֌夢»ÒR6(ªƒÀL‘_MÂQR GAøqE*Ün÷7’ €šššt´­±±‘;vPW÷ݼ?«ªª0 ƒ?üh4ŠÙ½Àغe3>A^q¦Î:žYÇä€ãΠµ޾¤ ÿóÒlZÁ›Ñ‡ÿ÷—ìv;Z¼Øxóc¢`¹y`Û0õ¤óin‚£ÏEQûŸD[3ù“ÓéØá0ûÒ»¹¨Xqh¨q`ÌAL?ûrj·8\tóïqLØÑàð‡gž ­ ¼]†aÀþKs xN9Äm8ëª;H4n!^öÝ'tÙí Òƒ“O>9­•mooç·¿ý-/¾ø"¿ÿýïy饗xå•W(--MG¿ŽôöD~¿—RÒÞÞNYY , _¿~¬[·ŽK/½”;vpØa‡ñä“O2qâD^}õUöÛo?–.]Ê…^Hnn.#FŒàÝwߥ±±‘¢¢"þú׿2uêTrrr¸ì²Ëðù|<ðÀ„B!æÎËàÁƒ÷²9x÷Ýw)//gܸq{ý†žÏ«ªªhmmeÀ€ß»kH"Q•T@W¤õ+Ÿ¬›ÖTó“+Ç0yv!3NßÇ–E`›6¾  Ç‘ô]FG[œé'V‚#¹òÞÈtÄ©ÙÒ B弟ïÇ£¡_4šHGœöö8îƒmK~:$ŸÎö$¹'GtÚ›£œöÓ x=â¨~´5Gpûûáóëä—ø(ý @W¨ƒú–4µíJ÷wßÒô-Áá“ÎÇ‘’ÖŽÚÿ¸„$ƒÿ>èºN,£ºº:Cx3„÷ë!b(`Û¨X– i&Ðt¶#i©ÝÂ矽ÏÃü‰ÉãÆóÛ{î WEâ¡.ò<’"IÒŽ h ÒvPT BvOÒêÒ]ÁéNS‡œ|Ù\ªv52ÿÃWùüóU0é( Āᓸä’S9ùÄYø<~Ö®ÛÀM7]ÀEŸÂ±'^@uU BÑØgì}ðÆŽJW¸‰Š%Ámðû¼4µÕ­Ùͱ•¾•C(­èORÖm­féâ%lY»†‰&pÕ%3ãð©˜É‹®`Ó–m,_±ŠÙ3§²iûv‚#öGé3]:ä V¨;ÜŒ.@•éèØBà4‰“Ò9+›„“üÂÛ8¦M›†mÛlذ†††½ðw‰\Z–•ŽÒíyMiKm:Zh¨Hg»ƒ¦BË—¸u¸››'"‰=ÜÑzlD[꿈Ð7D÷X8*ÐÚ¸÷¾Ú[lÓ¡vGÏõ–zÊÑÚ˜º.B©ýé*4uﻫíKmêøÂ¥!îDŠ’*ùQAcc#³gÏæÓO?å¸ãŽã¥—^R)î¼óN8à.¹ä¶oßΓO>Éõ×_ÿwõÕ=ºÙ¯;w=DxOGŽáÇó³ŸýŒË/¿œh4ʼyó˜8q"¹¹¹yä‘<ûì³lÚ´‰ÊÊJxàöÛo?¦OŸÎ²eË6l$“I~ó›ßpË-·ð裦ï¾\ÀäÌ3Ïäõ×_çƒ> ''çkÛÿì³Ï¢ë:Çüs²×Bí b¡$ñÐÞ‹ŽxÌÚã< :Z¢{=´T_EC ¢¡ÄûÔZ÷¶lkÜ[H %‰…¾xtíJíJ ¥$¶Ps¾ùZ6­äW®Ó 2ø®ÈÏÏgþüù¼ýöÛpçwR\\œé˜ áÝûf„£ Q0Í$ªª Et…;(,È¢¬Èà''ŀоìÞ¶†,—Cß!£hêì@M’ò52•¸¥‘Ò¬’ÊÞÑ4-•Ìf;8B’Ÿ—M[k;O?ó6/¾ò--øÝ.b‰¥åy¬^·€†Æòò¼dóuD‰„ãAÚB!—É‚ž#ÈA5êêvÑÞ£«3Ž¢J òhjmåå×òú«ï1ntW\y6ËVÏgÅÒ ,ût[¶m£®¶‘¬ì 6Mí¼ðÚþúÌ+pY;ÞÜ"Î9ïtf6‘£Q]ßÎO®ºŠþºB=ÐSWÛLHÍ"‘›G< ^.nUâ²Ú ÈnÇÄŽ$Pìª"HØ ¶©àdSþo¢d2Uí.˜[LA)(êëq©PÁÃíÅ2ÿymZVVEEEƒÁ´•O-¤ôoRJ4MÛ«&}OdôË͵µ•®®.EùFR¹çþá‹D·/ãÖ[oåƒ>àœsÎañâÅäçç³eËN?ýtÜn77Þx#·Ýv†að«_ýŠÏ?ÿœûî»ÓN; MÓÒmûë_ÿÊYgEee%uuu”””|m9áG}”Gy„G}”^½zý Ç·e9.…œ7Qãÿþ)Rn¡—WÁ²2^ÿøý~šššxûí·¸á†2„7Cx÷†Ûã†Â -µõ(Š )“©HŽpÈÎÊEÚ;wÕ1|üZCí¬\²–ç^šÃ˯œÍc=ÆÁÓ¦²mû Ý…ª(8Jª2Z*ꥀtÐT…¬¼,jêÙgìaôê[Á1³à ýdz»¾–ŽöÌDœ˜™àˆãÎæ‚óÎâ¼óO¦©¡]ÓRRÕÆ¥jض +¢½³UQ‘RÅëñàö V~¾‘K.º•>u³“%KVòáó¸äÒ³9þ¸™4iýúöÆíÕ©©©ewM+7ìæÅWßbûö]˜fÆàí7ÞæÉ??ÁŸŸxœÉ†ðúOav„p«ÌË¢ ¬Œ¡cF““Ÿ‹$,“ŽH„PÄMS«C(Rua»tÍ Ðp0ý]˜žœÌÈÜ~øaº’׃>È”)S¨¯¯ÿ“]‰å¨œrÊIlùìAž[®¥<˜X”Ër¨,ÊcЈ}‰Çÿ¹ÊRn·›C=”… ²jÕ*Ž<òH.¾øbJJJxõÕWyõÕWI&“ 4ˆÓO?=‘3MEÁãñ°víZ>ÿüs>úè#ž}öY¢Ñ(Á`SN9e¯õ7I!z’ʾ ŸÏÇ{ï½Çøñ㩬¬dÉ’%äääðôÓOóøãsóÍ7#ºÓ3gÎÄï÷ÓÙÙɬY³(..æ­·Þ¢µµ•“N:‰;wÒ·oß½Ž¿ç1ïºë.®»î:î½÷^.¸à‚¿Û®ï+¢Ñ(‡ÓÐz4«ÿÖ‰¦kÿçmÚá8Œ.9‹}&Œ¦¥¥93Ñeðï'<šF"‘ØkAA†ðî…³/ø9†aðèn¡­©P°-³»€‚ƒízU á±ûžfÜ„®¾ñDH n¾á^Ÿû7Ýp^r…¥e´´4a()…—t„ †KG*¡P˜²òB¶nÏôCOæª+®áúŸ_E^Á`jY»z#;vÖnnà­7æpììƒ(-.£¡©„•@ ‰D·Ë¢((¶ŽÄ´­TE Ü}ÔQŒ½3gžJSs‚#G²xá§8vCÑIFÃ˜ŽÆòõ[)).ÀçuѧO>……¹|ðh<^Ÿ'@Ò´ÉÉñ£«.æ½ÿUëÖàs,‚ÅlÞ²Ÿmaôè(í͵Œ~Þüº W0›Ï=/ãÆeûö´‡;°,—ᥩ±Cd½€ƒ‰ÄŠ8´w´âÑ$Í5°xÕ..ZÁàŠ>…Rw17\y!.¿Æºõp{]$Û«1"ô *]%D]èRP$𦠹]d¹4<…~r3ö:{!77—ƒ:ˆÎÎN<OÆJæ?€­­”’±cDzxñâ¿»-¤¢¢³gÏÞËöç}à¹çžã¹çžÛ볞ãŸvÚiœvÚi_©é!©>ú(·ß~;'žx"BN=õT~ûÛßR^^ž?¹¹¹ôë×C=” &PXXÈŠ+èÕ«×W¤O?ý4—_~9ñxœgžy†c=ö+ýòåßA|ÿ¡ª*¦iÒÖÖ–!¼Âûõ¨«k ¥µl¯‡Ò²¾„¢mÌ}o9ÁF€$N<ž ‰ øÜÌ{ù½™:{5U5Ü{ç-,þ|+—/áð§pç]wÓkâ`·§ì¸ºMÉMCØA}}5y…~Ö®}—²²~èºBk{+±hœÝuõØREqy±, ËqPí´¶µ¡©*9¹9tÄ»pŒFé7¸œCzÑÖÅ‘\tÉl.¹ôX±8;ªêø³14„™Ä±lb¡1 ‘xô--Àö9t5kdyû2BLžTʉ'C–/DÌ¢¾© —?õ{Jвx饷p¹³™vè!øƒ%ØI7a hB“¦cbš ’|ªã*¦C‘_‚‘IÒèÁ¸qã˜7oK–,!‰ÐÜÜœIbù7cOÏÜo»íwÙÿ7}ömö¹'ñÌÍÍåÃ?RÖuÓ§OgÓ¦MTTT0kÖ,<ð@L¯^½Ø²e ÷Üsƒæ˜cŽaüøñ¼óÎ;|ôÑGœþù¬]»6M˜÷Ô.ïÙ®ÌÌ ƒúôéÃsÏ=Ç=÷܃ËåbÑ¢Eôïß?Ó1ÂûZ;¢¼ðÆ"&ŒDõ®Ü•)MÂíRIÆã$6¹¹ÙÔÖ¶Ð^_MKK-#†ÄÈíGÓšíÜ÷د¸ìâ Ðû$ w_ÝöK›>•ó/¿„H¨‹¸H (©Æ©2T ’` ´¶´àH‰6RÚøüÍͼárŒ5˜P¨œì< X–Mgg*AFS5lËJé4-·Ë ³+J§ec:¹9ÙÄc¿½ë¼ýÖ|\ì3a$ÇÌžÅÄ £hl¨ÁðºØT]‹öæbVTï¦üŒc9íˆTä'fEH$cn7½ÊðùÊÕÔìÞIEEœI;tW‹SchŠ EÏBÅæ“˸÷þ_0zòÌ>óL¬„ †‘_3Ymݺ•d2ù•ü¸ÉùžIuÇsLÚ73þ|>ûì3^{í5‰Åbdeeqê©§RTTDNN<ðƒ Jï3]PG¦mhšÝ 2Èà«è‰ðvtt o†ð~ z—äsöñÓñ¸5ËBÚIZ›› ØŽƒ×¥Q^^ÂyŠD"Œ®ùÉÏÍæƒ·^a[U ÷ÝûG/~Ÿêúeæpà”é|¼p¿¼í~÷»ßqÊégÓܺ Ó±PPA,é`›Žmc;Ál?^sç~ÂwÜǶ­»ÉËÏ'm¦rð FŽÆö-ë¹ù—7’_T@8ÁåòašQÉ”ަªMŲ, ÝE2™dà€Aüîîyøá§©¬ìGQ±GªlÞ¼•_ÿú..¹ètŽ9æP+‚Èô17ðTö‰$H\š‚tl,'‚´•C2dèTUÁ’‚ƒ…¦ƒ¦j€›O¯æy%Ë×â54òó¼ŒSI{sù9^do^{íµ4¹ï¾ûþ©Âü÷’Þ/;<@*ñnÆŒé¤Ço—å _ŽpgÈnüð‘L&ñù|ôïߟ@ €ÛíÎtJ†ðî Ÿ×‡§"­ަ ©^$6RšXñ8‰x‚¦Æ..½äR>ž·€öÎv–­^CmM#gy»éÛ ‹W¬£w±¼¾~ö™p‡~$uµ;¹éºk8åÌŸÐw@ uEÃÒ HSK#÷þê/¬^³™ìœ Ù9W–‡ÑõlêšØ¾}Ó™LV^„Á&‰@ ªnÍÐ ‡;H$x¼^ lÜ´™ .:“ŽöÞÿ0†Vbx6¬XÏçÉìcgÑÔPG"‘DQU|>?›·mbÝúu|à4²³Špd"TC"I HEš°Yúù:þôÄ|ðÁ|„"1lãG¥5áàC¤wï^|¾vzAAÆ©¡^¯7ýoÃ02«ò!¾É÷ÇH˜¿+<OFÏ›A?ÔÖÖ2fÌ^yåFŽ™é áý*î{àþçîåÆÁygŸN¤³ ¡HlÇ]àqùpA0 1|ø@~{÷£ì3a £FÄíRéŒIÞšû>Ç9²²rvVoæ¯O>Gk‡¤¬¼ŒO—¯âå×ßâ‹Ïäü Ï£½³“X2Ž”ñx„¬ì|–,YΚe 3i ¹ÙÙèº ¯WbÛQwÕPSÓ@,Çë7ÂÆ6A. à®®†¬,?~¿ŸX,†ü~±X”†ún¹õ N:e&7^{'Ÿ›?þ>~¯‹ªÛ1Ms¯Gè^¯< ‹/¤OŸÞ <Eupd*ZMí„`Ãæõü鯯ðÞ‹¨Ú½ƒQ#+¹ðÂ39ô°ÃxâOdþ¼4tÇfÕ¢eŒÑ‹±CûeFæ6l÷Ýw»ví¢   ý8*ƒ‡®®.æÌ™“éŒïUUñz½Ò›AßsX–…Ë墰°0ÓÂûõ8î˜YÔ8;›®®nw€d2–’$8ÒD(6u 1†VŽâäfs×ýrÊ)³Ñ ?>ú ƒ*SV1ÛŒóâK3iòan‹9o¼ÆçžJgWŒššüä„9ÿâK˜2ýPvïÜíXXÉN–6‡çžŸÃ™§œ/§ˆÑㆰ{w+õ;7rÊ™grÇ¿‘H&hmÓÑE*Šâàñ b1‹-›ëèݧ˜a#ú´rhoéÂNXôë=ˆ|‚G 0?a,ÙAƒ5«W1bØH¤TðxÜ82uc³m3iáv¹ˆDÛijÒ©<V¯\α'žD}c#y…ylÜ´…OmÛVî¹ûQ>[¼[o½ŒcgA]CõõÍ(‚nïQIï>eTï®çÿý¿»X¶t=Á A4ÃeèŒ5˜K¯<‡Å‹Wòæk’4cdg{Š‹ª;p’‚ŠÞý6d(B8Äb&š¦!—áB×4š››9`Ò!”W’mÛ7ò§§^ä¥Wæ±mãz*3å É <”@v-­-ÔUïÄ0t’]QvlÙJKK‡NëÍÿ»ì %N2Fu)("ãÃûu7ŸÜÜ\¿Rñ+ƒ ¾Ï‹‰‰'òì³Ïfô‚?`Ì™3ç{¥ãž={v:™2ƒoÛ¶1öHÿ{¥ÐÈøðÃ1M“H$Bcc#ï½÷¶msøá‡gï?ÂÙç^Ș}bPÿR| K• ±±ž#fËÍ¿¼žßÞq/—^r.M•P»«˶Y³f5ÕÕ»p{¦ODØ´a=“ö@¤«—ÏÃ{¾ËÍ7_C[}O>÷å½z3¾h"Ÿ-]Ã#>ÉmwüŠaCSÓPGCc-ª¢rúé³8í´™H)©ÚU…t°L;U bó–m\zѵÄâ–@Á–6n¯®«,˜ÿ …9X–dͲùô€ÏëÁ¶ÀJ:ÔìÞ H\†‡æXŠ˜¤²´7¬]OqQ)Ç}&›6oàw÷ÿ‚׿|Dõ®Ýì3~§žsÎ>ÓŠÓ´u=ÛW~FÝîÝää xlòsŠyøñg‰Å[i¨Ûˆ!âfÂ6ŠJVÀ¦23ÓØ3iíþûïgÖ¬Y™¤µ ~„wçÎ\vÙeÜpà ?Èßп~õ«_qçwòÙgŸQTTDWW×âü©ªJ~~>C† aâĉ¼úê«lÞ¼ù{Ѷp8Ì®]»2 ÿÿ%:;;)//çÌ3Ϥ¼¼œ¼¼¼ÿÊßYVVÆ!C¨¯¯gÆŒlذáGþ¿áu©6¹ž8f´ŽˆEhiøý~}Ó|öég ìSĺÏWRT\DФ³½çž™;n¿–x"A$CÑ ´¤”Žp Ã塽¥ ¯Ç‡Û§qø±Ç€áåácÌ„ávètF «äÝ·ßeé’%œÙ¹”—–SWÛ€ƒªêØŽåØØÉdw•$‰nèt…Ö,_ .›þ+Ñu=UœBÔ×5£«nŽ>z£Gæ¨#fpÅå?¥jÓ6Ðü Ò÷Þ·KeWÍN EGÑ „# j>Fˇ —qÝ訪®&//}÷ÛŸó.¾·ßEãöuä‚ô«¨`èÐä•”P¿­š¥s_gÓæuHÍdT¹{.œE°dã>’}š†"4­ÛÊd„ï‰=Wä=²Û¶ÉÍÍÅ0Œ´-@{{;‰DUUq]×ÉËËKÛJI)ÓÆã=ÉZ–eðûý{•¸ …B„Ãa4MK[Tåå奢ý{³µµ˲P%AÈÍ;°ÌJ$´··§oP–e‘••…×ëÝë˜]]]D£Ñ½¬°òòòÒUÀ¤”8ŽCkkkúsÛ¶q»ÝdggïuÌX,FGGG:ŠaÛ6ÙÙÙ¸Ýî½ÚßÑÑA<O÷YÏ~Ï}Ù¶Mkkkú=˲ðù|ƒÁ½Ú‰DèêêÚë˜_wžÚÚÚH&“{§/÷Ù×§`0ˆÏçÛë˜áp˜P(ôÏSKK ¶m§Ï“Ëå"''g¯c&“IÚÚÚþáyúò1òòòPU5½/)%---Äb1‰Ä7óËcöm²²²ðx<w<~Ý1÷ŽãìÕöžÏ»ººˆD"·¿¤”´¶¶âõz‰D"éï•””¤%ß4®srr¾2Æ:;;‰Åbw\ÿ½1¶gE£Q:;;ÿáûò\ðuãúïÍŠ¢¤ßF£466¦+ô9ŽCnn.º®ÿ¯ç‚o;ƾ<ìy¾ƒÁ @à[ÏñxœŽŽŽ½ÆØ·™ E!??¯sþmç‚o{ž¾<hš–&¢=ÛY–Ekkkº–eá÷û wþùºó4vìXÆŽ˸qãþk••ÜxãÜ~ûí\uÕUiœ!¼ÿA8F’DJá(Xvé˜ærâ‰Ç£é:†ááP„£ŽœIÜ–´·ÅˆÅ#<øÐãÜxóõŒ1ˆ%KWa&“Ä¢Qb1“¬lº«yíÝ…ä žBG¨•x×Fjšºè[VÀ³/¾Íú3ç]|.?t;ë6TSW[‡×ïÆðã(²Hhlêdø¨ ªj—qݵwðÂ3OQØ«?Òvh®«â§×ÿ?®¼â,¶lÙÊÖ-Uää¹yõͧ¨©iÂ¥ää¹iin!R1 º®ô©´·Û\tÝoY½dÂãfüþ“9û„“P’1­-´5ï ¬¬”²¬ ^%ŽˆC¤¦¦“¿>úZ¢‹¾å½™ûÎjªw³ËŸÇ+1›â|›~ŸVÑç;(ÊñRPÏ!'\À±“2L·Ó¦Mc×®]455 ñz½Œ?žÊÊJöÚöÅ_dÚ´itttX³fÍW4Zº®S__O4ŶmŠŠŠ¸êª«xì±ÇöÚîÊ+¯äöÛo§©© MÓ¾1ÙañâÅ 2„H$BVVŸ|ò xà^ÛTTT°jÕ*:::p‡¢¢"Ž?þxÞ~ûí½¶»é¦›¸îºëhnnÆåraš&}úôùÊ1·mÛ†Ïç#“——Ç3Ï<ÃÅ_¼×6x sçÎMêÈÉÉaÒ¤I¬]»v¯í}ôQN9å”4Á©¯¯gøðá_9f]]Žã`š&ÜqÇÜvÛm{mó“Ÿü„ÇœÆÆFE!Я_¿¯$¾ùæ›Lš4‰ÎÎN‚Á K—.ýJŸy½^vïÞM8N÷ÙE]Ä“O>¹×v—\r wß}÷?ûŒ¾}û8ùä“yýõ×÷úü׿þ5W_}5ÍÍÍhš†®ë5g`Æ ”••‘——Gqq1›7ofÚ´iÿ°í|0Ë–-Ûk»û￟³Ï>›––\.‰D‚ŠŠŠ¯³¦¦!Éd’‚‚î½÷^nºé¦¯Ìo¼ñFzŒeeeýùÀçó±k×®¯Œëo;ì·ß~ƒAúöí›Ö¼÷êÕë+ùßf.ÈËËcëÖ­„B¡o=ô,úËÊʾÓ\0jÔ(.\H[[À·š < <ø;ÍGy$ûÛßhhhøÖsÏ磪ªêk矦¦&‰–eQPPÀo~óî¼óÎoœz’IKJJ0Ms¯í~ Iº·Ýv·ß~;ÙÙÙÜ{ï½")eðwŸ¡¯Y»™ùó–RãÇç6úü¨š‚® T=µâêY)ªª °°Ë¯¼š¾½ËÚ«Ö2²w #”áóØÐ|þlªvÖ³|åZ,[¡_ïr†UöçÁGaÑ ëWNe¿bÖnÜNÐïG°½1LBu¶óLJ~͹gŸú¿>™ÅÅÅL:•gŸ}ö5W­ZÅÇÌÕW_¹"3Èà{†x€+®¸âG[𥼼œÉ“'óüóÏgÃ9lÚ; F÷X·ÌšîJo“LÆ0 ww 6–m¡i®½ö•LÄ1\®/¶Û–•G¢_èúm+š‚Šë+Û›f ]÷|±­m¦*Ë* R:{E¹Ý6‹RòÉ' ‰Åâ:ýÔûhH )SB!TG"( H@JÑmݪàB¤>G ¤#@±I(‘zO:ñÅÓšî/#m™ E*J÷~AJµçÿ)RAU!%R[H=©LB¤þ#%8Žª(Êw’ò„¾bÛrP’6nÕ…[×Q5MWq¹u5ÕXC7@H¤tp.ößúô.'‹3ïãy88|¶l)ãÆŒbÚôé|ðñÇlÚ¸‰¤Ç`¸Ëo§×¬a,­nçÑw— ×rß#1iÂ~¸4?§Î:KÏ;†¥«×qÃÏÁÄÑã9ûÒ ‰I‹„^·ËtˆÅ’¸Tö¦.¤cqýLšl۲Ǒ(Š@S5„„¤e‚L ‚iš8I‹¼Â|ÚÛš¹ýæß°jõn¼Þ:¢S¦¡(1öËnE×Õç! ¢MÕX¾b=»ªëq{\¸„@ÚQŽFV¯eÎ" %Á‚%kèÛ·þýûR]×N™¢’èêdSãÌ„™™y2È ƒï~¬„×¶íÿÚä¦ öF{§ÉCÏìdêø(µ ÈËïÃØáãX±~uÕ5Tô®`Ìøq,[µ‘Í›·â÷ûØgÜx„€ÏW-' !¥ WycÇŽcå²õTUïBÓ4TEÁ¶t—Æþ“ö!ÚeóÆm4u´ãv{™8a?ÂÑ(ëV¬A×1+†mYTTô¥²r0+—o`ý†Mx=^&MšH0èŲm›4yU”Ó”ÒF›áC{£…Ö¶í(ضDQÀF – Ц8¶"»I«â ‰íXË…4ªÛÄq'Q"n`‰$Šª  Ý2*–c"•ùU“b»é(£ IÇQÂAWU’v©©¨¶‚"$B8Ž’ܼ P<ßéü~««ØëõЧO)ÙY>T¼>Ç6±mp`£*bÞEùy€ ??—ÛMsKŸ¯X‡*ímmÇ¡ÿÀ!,_¶ŠÑÓ¦‘¿ï¾¼óòË$ÜQ¦MÂCßEŸòrV®øœ‘ûŒeî›ïòÊK¯’ŸŸÏ ÇœÈÆ k¹êÒ‹8ûÜ3½ÏDv쬦ºm'þ`6…%¥Ä£±ÔIÇÆJ8ØŽì^E8€‚cÙXI+µ|2õÐ…À•íã“•;Xþî{(Ž K…ƒ§ìÓ&2¨O.>]§®© E3èÛ§œæ–fæ}ò í]ø}A ]’‡èˆÅ8ãòË(é[Éϯ¸œUóßâì“g3ï³õäf› ­èEs[+Lž@m}3GsÆÀ1T”z33OdðoÅžå’{´™tGcöt$èׯGuÔ^ºÈ­eüW-n,‹H$BQq)CÂæ-5tt¶ãóx0\š¡tâÖÊKó8°MWP1cö! §rAICC¥å%ôê]ŽeYn·‹Ööµ5a ”÷-DÛeQܯ.¿CÛ¦¥ã«)¯<„œ’1XÉ(†KgÓÖUx¼.Ng.Ÿ-_Á9çžOG[; >þ˜#gÎðácX¾r%Û¶meü„ñ(šàóUŸ3zôHLÓbÎ{ïräQ‡a òþüyL;`*~ æ|ø>CGg@ßA,Xð)……%”––òÌ3ÏröY§R9dп‘ðú\øn\n i™$¢!|>BK‰Ç3ŽPª®âH›d"‚Çë"™4?y¿ûýƒL¿Y947tòæ+o0ùÀýÑ]ÍM ¬Ø“&g¿&sÔ¬<û· µ‡YY»œÖHŒ‰g²vÝjú–õeÜø‘<ðè­¸tƒk.?—w^{Å/âü+¯  °˜PW'f4Œ 8H¤ Ý¥­ÔDí$m4M%•WµTÒ‡¢ª$ãqv4EÙ¸¹Š ;±, ·á¥©¶–þ%^ s<44„èÝ»Œ]õmüñ‰ç01¼^ á8456 »\̘y$î@€Ÿ_q%»·l¤¨°Ÿ'Ÿw,Ä¥Âñ‡îGÔV°L‡•K×sÑþ„&Mî¿í—ô;ù„ï‰ÈdífAß=IN=$÷›ì¬Y³˜5kVšì !Ð4-ýï/“çLæ ~¨p{Üääd‘ˆÅ0ÝYYA —›ÜÜ<6¬ÛR`:Úµ”ö*Çí$ãIlÇÆqÀmxPP‘²-bÑ(7½HT• ß‡i˜H3Ž×ë§÷ÀJTŸXD ç ¢ÔSH0«/á.¯7‹†¦VÖ¯¯føˆ„‚dÂ'?‹®®Âá0y¹…„#aÊ{—“›EV–@ÀËÓ‹`PÕÓ»ÂMnA²ó@: C†åðëØ¦‰%- ÝÃäÉéêŒãÒ$Éh OÀË‘'Š®Úx4 ³½“ÜŠ —ßyFG iEj^L)7v}úö&;˃GL›z 9yVI« [vâòؘØOÇ“@ñJ d£tÔ¨Ei ˆÇ¥ÒžÓ%C|.Ìh ±è.Ü^º®3eÊJJs¿óùÕ¾íÄèöx¼8 8)-L3厠¨–m#£1 Ý Ž3qìN>ã<–,[Ê!įͥ¤ @kûnF˸1ci©­fò¾û1oÞBjË‹è ‡1m›h$F8–¤_ß¾4}ü>;@8cRQƈÙ´îsJú–ÑJrí¹WsìÉGqÀQ‡QߨŒ´RGJ¤ã¤Jÿ*J·¾ÄIg  ZI„“ØÉ05;·2bèbU[)𻨯o%jã€}`ò¾£Ù°µ‰-;[ØðöB’É0º :µ»ëÉÎÍ碋.bKU-?ûÙ5x”£F¡«µ”H,Nß ­]Œ\L²©–ÎÎNòÇÊ€Á“¸óâóÑì_ÝL|§“iY'3keA_ÑÝ“˜Ú¶ã8{¹ „ÃavîÜI$¡¡¡¶¶6Ç! ’——G0$++‹~ýúíE{ÜCz4|™rÕü`¯,TÝEÌŠ²lõJFUޤ¬w‡ÎšI{S+Wl£²r >¯ŸXÌB×4êjÉÍâut†ÛÈÍ+"žŒÑÙÙAn~ Ô×ÕÓ·¢9ÙA‘.:¹Ed»ØúÜ Í =o6ž<šv·â7T\^IW¨†Ñ‡ô§,$ÞÕÁ¨‘hnm'™”Œ?P¨“º†jr³sè[QBÒLÒÐÐŒÏgàØ‘ˆ˜ø|ɸT¼~‡." ¤ GÆ0t(È×°œÚÛ ¤“d@‘ŽjøéLÆpn9” žœjwoÇïñÒ«´ˆ^Åhª†“姤8 „ÄQ,Æî;ŠqF!°M›^S¦§:út8¶p°} ‡Ï<۱ɖn.?õ$¤p°TÁ‰'ƒ´%ŽtÈÏñãõ|w?óoEx UâVlDRAA y áFU‚Ã4“8Ž…ÇëAH$#蚇ßþÏ,ût9²–•àO=Ã…çF¤«ƒHW„aÃÒÖQÇò%kðåb¢‘kH>xì·üê†ÙDôN¿ì ,YÎÓO?¸Ø%\¸Ö­§b@šëé_âcÀ¾ƒxñõwùdÞÇ\téŏРhmmG“ËJéJ¤LE|©È´­¤„Öýzñ§fé¼O8vöLvlÛBc} ÍajšÃ >ŒÓàO½Ëêµ[ð*f¢¨ÚÕÆÀÊ ~ñ«_óú[sÄÌ£\è§Âe²¶®ÝD$æÐ+ÏË®¦vöÖ›)£Kxýãõ¸GOeê´ãغx!En•º.ɶ-5$äw‹D£ÑLÉÄ 2ÈàkÑ“Uoš&@Û¶yþùç¹÷Þ{Y½z5ýû÷ç€`àÀ’ŸŸOQQº®cÛ6---lÞ¼™ÖÖVÖ­[ÇâÅ‹éèè`Ú´iœ~úé{챘¦‰eYiBÜc%•Aßw¨ª@×ÜD£1ú•rò1Ç툢Zªª‘•Kù~¥˜Ò$¡i*†K¡_ß>444Æs0C÷з"+itgS4¼ÓIÒŽ¢{h ;bÓk¥ðˆ ŠBgÂAD!¯¨ Ô‘HˆÒâÞè J«Ç¥7bd—å¢' "¡ŠbPRÔ !"¡$‘h”¬@>>ŸËJI8!ÒÑ:à p!SÙm)9§ã€(ª‚@àH‰Låe9o·äSˆ”7n¦ìòz—õÆ4-’ɪ®tk‰AQ$RÚ8–D*R^UâÙ]×Àtl!¶ƒ%$5%CUØ6¶L¦þD:IR-ù7^Ùr§ëª"IZ!4UKu¤ã é:ª¦’H$BÁårãH‡®Žf>p*$;?‹?>þ$M™@iy>m-!„”´¶…ñæô&/«ŽmëX|ÓÓì»ï~±=?žýA·¤qëSt´Ösí× è‚W_ŸƒV6ް™ÀŸ¬aÁòíô-(böÔÙ´£Šë¯ÿ9GÏ:šC9’¦P;nÃÅæM›q»Ü!…DÕTâñ$ùù…<ý—ÇYôỌ6Šx,ÁÎ]x|$â›)+φÛYóùz„H ÅhjheÈðJ.½âî{ð¦LžÄ¸^ùLRHÄ‘øT»6Ä®D’òò’I(ÉrÓ+'Á£sV0ã¤+)Ìò²aår–¯Yƒ»°ˆcgC^^>ã&Œý_ŸHÓ4I&“_kS”Ad ¥ÄívÓÔÔÄäÉ“Y»v-¿øÅ/X¾|ùW¢µ{zÆîéÍër¹¾B^kkkyøá‡ùÉO~¬Y³xä‘GÈÏÏO'ƒ ~(hkm§jËVzÏœÀüÿÆö†VN9ö$Ö¬_ź-[˜=ã(vlÛÉÆ­Û™uè vnÝÆË/½ÈˆÑÙ1s M\õÓ+9æ˜Ù>s:?¿ñZÆË©'œÂõ×]G¿ý9÷âó¶†n$ƒn„é ›&¦ËF1L¤£àŠ)˜.Ñl/Ya„N"GEKH‚ÒƒP%–'õ[¤ìR×›¦áö¸‰ãHTU£çr•ÒFU%H‡”àSIó;E¡{VŠŒ* ‰” ¨©\3E¤H¨&@ÕÕ4YV„Š#%ªªàØ6Ž”)BA)I*‹ª›\Ž#»Ûé e7ÑÆJÏAt“nHçºõ¸?|W|+[²¶¦êvî à bh*±xêLEQS¶jªÇ¤tp‰m'hinbùе”÷ê˺ kX»v¿¹ý&|†›¥a[]ä¶l§~íR>X¹#'WÒìøXÝ•Ã}Ïͧ0ßOõ†¥DwoGzriŽ…(Œ9Š™‡Ï jçÒF÷—C¨‘€ÒFiŸ¾øÜ^>[¶¯×Í‘³g‘STŒËÀŠ[¡°fãzŠò ØoŸ ìØ±“ž{3¥«³â‚¶ìl¤º®‘–¶NÎ8çB]mTíØŽajë9b &LæîbÛæÕŒ-ËÇР=&Ð\*ùº‚® 6vIBI,¯LFÈ‹‡:óhö?â±.ê««i¬©¡¬bù9YŒ9˜'Ÿ~–c<œc:âu",XÀAĶmÛèß¿ÿj’ÉØ’eÁàfÞÖÆ 7ÜÀc=Æoû[®½öZâñ”d¬GÚ „è¾ ¥kOAŠž(q‰íù»g†ßÿþ÷üìg?ã™gžáä“OÞ‹@ÿPQRRÂ!‡ÂÓO?Dÿåèèrx쥺ŸM_š‘M\U‰Ä;ƒh´µ…Ñ5>¯‹h(„¢(ø|â‰8¦e¡é:.·A8Ò‰×çÂPuÃåB ‡P$‚T4T]'a&q.T¬„‰m[)¢§H B*8ݶcBIÙr EG"¹ùûšëKôÐY‘&¼Šš&ºmÆ¥'ªÙ}œÔàHeÂüÕëXˆžïÊ½Š“|щÄIeÓ¼µGïDH‰C*„,„ÖM‚-„Òí)`;éÐ+Ò"»`šîÿ.§÷ÛÙ’ é  ©XÄ’q!P5½{4QÔÔIIY{u‡Å1ãF³cwϼø,W\v»ª¨­kcd¯ ΦOxoe5ee%(]ô*-D-É/nù3V°”œ e:ŒžtŸò&Õµµ€DcÅšm4Çu‚AƒÖÆöaŸÑéީP¿­G“Lš¼?Í-<ùܫ̘2‘IS¦P‹““d`ï^œÁuÄm•¯ú §Ÿ2ƒ¶Î;wÖóÙÒ•,_µ†é‡Ê©§œÁïîý=UädgQ\ÐÁÃFó§'_æ©'ŸbÚRFŒ(¡¡+TÝôÊvHÚ·×E{TÒÞ#?Û ¥±ŠÁ}¹èº»ðºý„:;°£1ºZ:ÉÉ)aä ÞD:Z¹ç®ßãòø(.,ù_ŸÉ‡~˜ÜÜÜÙÍ ƒ þ3B°jÕ*@º˜@OÔ¶ç&ÕsÓú¦ä×/ks{Hq2™R¤”\uÕULŸ>}¯*‡dð}‡¢(ÄM Õë!Ò^â?¦rÿ‰ òØøùVT]A×]8ŽƒåØ¤#BEEEØ`:Gè.!À¶l°¡’0³ƒôëU†Œ¡  Û2±ðº})¿[Rø)ð&R±Hj-e†T©¤4°Š@Há¤Ò¬¤ìöµP$'å©Û]Q ¦IæTÙ#’Ú-u©«ì¶“=ûÕ4ÆT&|ÃFޤµ#ÂË/¾ÈyçžÃa‡ú­ObOÙÌ{ï½—«®ºê7Éd"¼dðïG,#§K÷”YþgÈhÏͧǫ¶µµ•É“'SRRÂG}”žŸ~ÈIl™ïѨÃïÿ°œòþŽzã$uLi“Œ›XJ—' Çvpœ8 :¶Ý] A8h.‰ârÀÅV»%©DùÒ‡ဲ‡×¾!T’ÉDw”UA: H%ý_éÖô$‡*Ýz׎˜$MÒÇßÅȾ¤×ƒeGPlªá¨8Ššº- [“(ÄÑ×tVÊ”TtUÊ”ÄAé.r‘ÚH …ªƒt<EÁF‚ô¡Xh ñdêÉúžÅ"„pÒäZì Þ3úÛ3w@jþpœ”'oIé0ÜîàwŠð~+ÂÛÙÒ@¨¹ÏŸ²×@¢(jªÃDJgáØ¶mw‡Âe*Ì­¨¸ã­4o^ËŽ»É*.ä³UU\tÂ8¬¤‰aøY±®š÷¯àØK®dÄØýyâÁGxëã%äfá÷» utÐÒ"¯ Û¶16ª¦£» Ú‰‡Bt$Û8ý„cè;` ¿¹ýÂÑ9ÌØÿ@Ž×jA&ÃÝ æÊ&¿ï ìxˆ5 —ÑP½“¶PkºðgåRèxÝ~ê››q4ìü|vn«¦O‘—ÊP„B,icYq©b;q ¡¤$ŽÑSpé*†$P\Ìè}ÆÐ¿_ÚÚ»X¿bù^•d­Ú‚?ÇËÐ>¨BÃå ’]VÄÔC¦Ó§Ï·Ô~ðÁLŸ>ÚÚÚ¯-oš!¼dÁ×EFö´û²T¡'2«ªjÚѡljáëlÌ®¼òJî¿ÿ~~ùË_rË-·ìµ22„÷ÇtÀ7¯dåöŒ>pù¥n’ (ÌÝ€› ‡¼|ÐUðy!i‚f@ÕNX¿*Žîv#ôt ²[›¶üßãÚ£»è_ȺßâK©Y{~Ox¢Q®=¢‰{+O.Žpî©…v=¦t£k–­¡ÚB‘ÄõTe4¿PqkI!è {¤='ÝhG:©H.¢{q,Вм* HÕLU]s [Q¶îè5AS¨ŽD8Á„qikkgwM®îÊrNw•¸/W·‚t47Eìà ¥ ‘ˆãvé2ýHÜžï&iøV„7ƒï7<Oºnù›Aÿ÷døëìÄêêê˜?>'N¤¢¢Çq‡ÃlÚ´‰W_}•§žzŠÚÚZ ùíoËYgük¢Ç›ÁpÍŸ³uÝg¬\ð8u»W ¡u+Q%ªæB!Ü“R¤d €……pI4W·|!šòø—ÝU(àõºÉÏÏ#î #‡x2Åd5%•ü%ØŽƒ¢:_Z™vï¯'*ª¦’ɺb`dõã¿|„†ËyöÙû)RTècÛŽ]dåçÒÒÜLSk#:`x³ˆD;Ññ!1±°QQq°SZÛnÖ+Pñêf ›€ bF4T$©v MÃe LL„ R*T” gÔØ~<ôø½üúÖ;ùÃRTXHÀÄãñÐÒÒBqI]]x}^|>–eÈÎÎÁãñ¤¢ºvŠoܸGÚ¼ýÖ\Ê{}§äüP¦TÎ?ÿùωÇã?X²›AìM<¿L¿\íßA"÷ÜÿîÝ»y÷ÝwY¸p!+V¬À4M***(--¥¤¤¿ßOEEguwÜqGz–e‘H$°¬T¦µÏçû»¿+ƒ ¾Pñ ñ£¹$:à1 Ó­G°Œª­ƒ¦à(Êir9:2© .<~7^~„¢ÇH&M¬¤ žt¨©kâ¼ènY>oÀ@Ñ\Äc Â]X ÐU UX8( u¤TS‰lŠŽ@¨&IÓ´âw›(Q7º§¤HPP$R:r$Ÿ~¾œP{+>á&é‰sèc6½„¸Ù™8R¢ëzÊ1AJUÅqR%‡MÃ6“H ºÛÀJ¦´ÆºË@J‰•4ÑU•ÔWº¢‘tâ¸r ”Ÿ7~7õ[ºÐU£Û9JKËPT•PWŒƒ*ù|Í*âñûM˜€¢dççâqëD;c8¶‚ÛçES5„”©àv»Se¿#2„÷Œ^xÛo¿êêêLgdÁ÷Œ¸î5Bðî»ïâ÷û™4iÒ^Û®^½šììlúôé“®~‹ÅðûýtuuQUUÅðáÿ– þ½ã;Ýö?=‰h©ò¦)‰Â×}¿ç½Þ½{sþùçsþùçÐÕÕÅÚµk¿Òî¯ÜLºÝ¤”†eYi?^UUÿפWî©YT–,YÀ¾ûî»—œ¢ªªŠH$°aÃH$8ŽƒÇãaþüùÔÕÕqâ‰'¢ªjºO2…12øÚ… $R˜(BÃ,EEúL´ˆŽ‚ „†‚ƒCEñ‹$É z dÓõ Ú«;0ŒŠjc›6ªž%‰”:ÒÉ%Žã´€é'ÒÁîÄ–q<ƒ‚bñ$´w$hšDè€ Ž ÂˆªH-U J$ÜHOiH"6-Ž'ÛMk¨‰1ý†±}÷vêÚë)QûñÙCU¼vç"|F6ÒN’°cÂ…#%vwÄW×44M'™°‰ËmÅ@(¨ªÀ¶l,,@ a àh&VT  #4‹þý5z¦“À¶L‚þl²³ƒhº‚Ï›Mcc=fg”@À¥šxTõ´ˆ8B÷S étuÔ"  –eZÂûcB{{;ƒ&‰ …ðûý™NÉ ƒï¾\ÅlÁ‚¼óÎ;ôêÕ‹ÊÊJ^}õU^}õU.¾øbB¡ÍÍÍÌ›7H$Â#ûÈÛLÄz‚hüS\š 7Žâ`+*¶Œ£F·¨¦Ž¢¶áGæ’•tDGc%:ÉÊÚŒ­n¡½µ ÏÅ0L#†í$º¦©$,RÍìÔÂÐðã øˆÇâÒ`í–Ïiwaè: ÉL?s<Ç4„X8b»Êž¸¶"’†Ë@Ú¤ÔD ÅE*l+åN¡jŽå Í8ŽÀ¶À“­’ìÌûëz6nÙ€pR LG:lÛ¶¯×*|8I‹âÁ½ µw¡…Áñ'Ij.©a'"Ô4v¡)Â6ž’,Bîz}úpä‘GòöÛoïU ¢‡ÐZ–…®ëÄãqEÁåríQݵk·Ür .$‹1aÂvîÜIWW¹¹¹˜¦‰ª¦²·{*«Ù¶]×±, Ó4Óm-..Æ0 Ç!///¼Ö•N$,Y²„?üŽŽŽtt;“››KVV‡r×\s ùùùéßaš&Š¢t?ZÝ;۳吏zŠQ£F ùÃþÀþûïOII uuux½^âñ8G}4ùË_xóÍ7úh¤”D"JKK¹çž{€/,ÙÜnwf`fð)¯”éŠ`{w6¦¡(¿7ÉNKGî@G8Ȥ†Ë ¢È$¾lƒ`píM4wmCít#ÉB³-TÕ"©I„ÅpøsJ°E‚pg#Éäë$µ×0$†$Ú® !Š*Ü4Õ6c›^„[ e0Òí²mÓ¶pnüþ<4¯‚Ww1ï…èpBh.•VÃÈQûÐ{Â0L+–@:"m…&°“ºKGÊT$×A ©©ŠiŽí¤BXŽÄ¶Ut—ƒ®ZX¦JÒ¯WCi|6g [ª¢¨h©Ø¸í`vïòL¡`x=H’íè>I°²Ù.ð*nìˆ`GC­Mô).ű-ÜŽ]seodÁ÷ê†ÙM ‰D:z™H$öÒ³öüí!Œ=„óý÷ßgçÎøý~ÆGeeezßñx]×Ó‹ß'žx‚»îº‹aÆ‘››‹¢(”——ÓÔÔD{{{Zvàóùº³Ë%ªÚS ^üÓÉd=•Ù„˜¦I,cýúõèºN[[BòóóéÛ·/999ìÞ½›mÛ¶awÝuW]u}ûöåŽ;î`æÌ™{-V¬XÁêÕ«1M“¾}û2mÚ4 UJ½‡' Ünwºo ÃHG¹-˶m\.Éd2“<—Á?¾vEŠÐ‰žeéõ§ƒåH¼9¥ŠJgç.\ªáˆDш81J Šð+ÕUMH¯†OÕqÅãXª L"MwÔKLU‘þ(“~ÖŸ!‡û1“I>ýS ËoD7·ƒj8Dâž°¼¢ÞÔV×£Zš­â(ÝöŽƒ¢ª¸tƒ¶ö6,©“«åÓÔÜÎAÇìÏÖ͛ٴ® ¿žCýŽZêë¶ah^l$‰X¯ß‡ª bá8–e£é^¿ÕÓŒ‚—ÇC<GJ·_®GEZDÕpcETñ(ªÏË@MdÓ«¼Û±1 ƒ}–””–€íf˖͘ÑF0ˆôø°›-"vožŽÄš1“íäæ°U‡„maÚV:)6Cx3È ƒ ¾Øó)L‰ýGÑŞȩã8L›6-½Ó4yÿý÷Yºt)¥¥¥Lž<™AƒñÒK/qÖYgQTTDnn.ëÖ­H[MÓÒ¯‡ ïIP¿îIÑžn ß…ô&“I²³³ùøãÓÄzìØ±rÈ!deeñÇ?þ‘åË—S\\ŒmÛäææâv»Ñu‹/¾Çq¸îºëP…¡C‡2eÊÆ¤¢ÎŠ*뺞þM=:e¯×›nËåJ÷iÏç™ènßj,Kº D¤$ )Ÿ\‰ahd¹pLÓÎ%fE)­ 1ó¦ ŠÆ¸ˆÖ¸ùôñ–¼¼¯êFØ:1w˜šÄŒ˜(T—Åo¡a"Ã*ï\»–·nQÈÏ+FX¶“‹á’avWLKéh5]Gp’¡ H~AÈ-+E,ƒ ª¦à(6sß};. àÇŽ…(èÓ—ò‘X‰x*‚-dw4×BU5¤ìy‚“búBù¢ºšt$Jw!tùql¤¢ áB$ÁÖ⨧+ÀÚ7wÑÐX‡ã8ضƒešÄãqlÛÂ0 |>/‰H1-N[Á\ý"ÍÌx/V¬pSš]¤ýÆO´ÓÑ‚Pê)Ð?ó„;Cx3È ƒ ¾/7Û/•õí!ž‡rÓ§ORÞiÓ¦±víZ† ’Ž{<žtÔxOÂúÏ”âüß´;ë–Y!‡Ã¬Zµ*í°àv»)++KGƒC¡Pº°E^^^šðÞÿýL™2%-™PUõËgÁ¿’=®!)‘ŽHš4uEQâQLBø²Ü´îtóÌ9;É-vé°É åòa&“‹ÍÁ^ênâšäýd+‹Ã·wÒ…GhDcqÐÁ!ŒTÚ‘š–DêÉIÒ4±M USª‚"%iÅ…šÒð*ª ‰ÐÚÒJ~qnŸ›,o!mÑz¿;HÕ‚6ÖÎÝ×ëÆ6“$bQ\.BQH$R]!†Û…®y‰G“8ŽƒÛí%i&RÖeŠ‚iÚ¤,$–°p© 9 ËB7 4Û!¯4Ÿ¢~%¨šŠ¢ ’fœ¦Æ&ÀAˆ¤e¡5âf”õUÔ!j¢X!¢Ñ,ºZãÔ¶8–iÙt…à 8h¯Å{†ðfAüáËÍþö·¿±víZJJJÒVc=DYJ™Žî*ŠB[[RJ***‡Ã$“Ét¤H'‹Åb1„¸\®½4»=dvOéÅ?"Ð=\J™&¾~¿Ùíùi𩤓ž„¹žG”=û4h7Þx#ÅÅÅÌš5+32øÏ/<ÓoAÑlÙ]a'fS˜S†’h&€‘À±š«“H'Š* S@£Y‡&4bXŽ5 njlŒ¹AW‘2I2Äl“—Ÿ‹žðÐTů°-‰-„ì^@z]$M Û±Q¥ÀÆ]ÙkQ'(-+Åpiij#`(.̦¬w;v4Òë¢OŸÞôsõA˜:B#•D'R®H‰eÛèjŠT;Ž…è>„ª¨{,¤%BØ&$Í$B‹ãq ¬ŠOÁ’.šv5ÓÞÐŒ$Uª8µX ‰“TPuPc.”°»3†H†I^, ÝhC‹ba•.% D1è®ò›!¼dAÿm7Þ¯‘ìÞ½;­™í!Ä=. ‡h4J[[ûî»/'Ÿ|2ÕÕÕ¼ýöÛLœ8]×Y´h~¿?mCÖ³o—Ë•–TôìÛårÑÒÒBWWW: ¯çï^±/‘à=µÁ{~ÖCvá‹„7·Ûã8Äb±½ð¶mÛ2 ƒÿ8R”N¦Š1Ð#iHT]! 64¼¹áÆ$Ší¡!(J€d“Cœ6JK{#±ií¨§Î´©ÅÄÚE×ÛKåðBj6´`geÓ±ÛÄrv£U, ˆÛ© n–E0ÀíqS[U›"{jŠxÛrÏë¼MäæéwR½}¡^²(ÌöÒQÓÊîÎZ<^A‚”>ØëvcÛ&Édª|°¢ˆî*±X )%>Ÿx<ô¸²XHG¢;2U¨ÂD*f´¿HU^óz €£¤…¢ „¢ªHia&H  DÅ©ÂGöºÝ[T!¾û« áÍ ƒ 2ø¾Þ|»#¶{JZZZ°,+]@¢Ç{̘1ì·ß~äççóÌ3ϰeËòòòعs'çŸ>óæÍ#™LòÄOðì³Ï‡©­­ÅårÑÜÜÌŽ;(++KGˆ{HiOÁ†ÝoOTù»÷=‹q¨ªJWW Œ5Љ'F™7oµµµ7š þã°mH&“ÝO3Äl²g( 04…öö&‚ùÙ”–—S¿» ½;j»b8^D4N¤n nòÜ…äçªXªMÄŠQ>YeÒ¥eŠ5¤“B£³Æá­ÖÒ´9†_¸‘R!JAa>›]Ûwãò¤¤Àù¢MRÊ” ªn— ´×Eé %:82Žvã+óâ)ÈÃ÷£ˆ›‘T%³nû¿”CÊâLU5L¿Õ­Ö°<&–m¡ë.Eà86Žeâ`£ºSžÂxrIºbð‘ ¢] `¡tÏ]Žm£jâï,5¾4g(©…6ضÃ?£ÐÊÞ 2È ƒï)z /ì)3Ð4--Y°,‹ŠŠ ²³³±,‹÷ߟ¶¶6úöí‹ã8tvvrÄGPWWGMM Ü|óÍŒ5ŠrôÑG3tèP¼^/¿ûÝïX¿~=Gq ,`ùòåhšFnnn:êûmõÀ{&ƆA4Ų,Ün7>ŸÇCGGýúõcðàÁ¬]»–?ýéO¸\.\.Š¢Ç3 ƒÿ(TÜî±Tz|x¿ÄÉ„£¢(>Ú:"t(1ÊJÊ1cqê:jPÑ1½„ñgfãÍ|þr+Ÿ=½›Î„Ûò¡%üì|·“s°Uðø4²ü¹tÔEP<Õ«&q¹ *JûÒÖÜFsc n·{¯‚-Ò‘ÈžH§ì!ë~¿Ýpax4òúú4j µu-l\¿tÁ¨ƒ] 8ÌÀ’!¬(8¶ƒáØŽcuË„‚ª§’æÌ¤ Rb¸])™’ˆŽ-Q”îv`£¹ÚNR û ’-6ŸiË)Uìž';BAÊ=H«ìiÿß›W¶Óó[ÿ9‡• áÍ ƒ 2øãË$SUU"‘ñxŸÏGKK ;wî$™Lâ÷û)**Âï÷“““C[[ýë_I$L˜0uëÖ‘——G,㥗^"//aÆ1bÄŽ;î8rrrرc§Ÿ~:ÇwÑh”_|‘;wþW¶^†aL&innÆçó1eÊLÓdãÆ†Ç㡦¦†ææf‰Dº"[,ûÎQäz4Éü®5À‘ŠA,El„m8F˜6ºêÅÀêëP„BAQ).¿mK u¶áÎÖ©[GwRe|-!±½8¨¸’HGEJ“–ΤËFØr9x Rv~ÕÕÕhšŽËãE¦ª½ @H„Ô2âu*Ž ‰X’N§…B²V-YEK´Uw£*mk,ÖÖDZ£ šª’´¨ŠÕ]Y.åF¡¨¤ƒPZ÷ÂÕÁ²í”_ow¡ ÛË–[A×U„PSÉlº‰"ÜD볉妶0¨?ãÆ$;+5‡ ](jªJRÇ‘{¸ÆÈ=é¯l’H,ÊÈáÃp»Œ áÍ ƒ 2ø1 GGë8¡P]× éG±---TWW§£¬~¿Ÿ#<’Õ«Wã86l`Ë–-üêW¿¢´´”k®¹†û￟Q£F1tèPFŽÉ]wÝE8N'©ƒÁ½¢¼=:^ÇqÐ4-]µMÓ4’É$ápÓ44hçž{. ,àí·ßÆãñ ë:¡P(]aMUU‚Á áp˜h4ŠmÛ(Šòoµ;ûì³ùË_þò­·5jTfàýX B¨l™C—–DÑ:ŽŠ bi‚˜!Qí”e˜ÐªHik¦½¾]sYS„éÒpÛºjáó»€áñ„Þ$šØEÏG:‚pgˆPó.ÂR ©\Ò“ª¬Ö³ðêi*–Æòš`‚ªt¢ÈŠ¡bx|ä—c¡Ñéäÿ³wæñUTgÿÎrç®ÉÍFV ¬aQe±h”ªTkQÁ¥nˆ´ÖjµÕºâZéÛ V­¢U+ZpAP±Š¢âŠ("¸A°&dÏÍ]g;ï“{MX´ú¶¶};¿Ï'ŸÜ;3çÌ™3wÎ<ç9¿ç÷H^ OBC²ÁôÓ´5Fûº¡PÃÔI¥ ü>?†©cè&²ì\“ÇëÅëÕH$;9¼ÉTÂ1~‘1 ËIKÜÙÁ`0#;–6Œ³²²èèè µµMÓˆÅb5ˆŽŽŽÌõý£ù¼?ü0?ü°ûcr±ÿóeÑm•ÒC æ T)Œœ” á‘@˜È’’Co°-Õ+!ËÒATEÁ4m,SG’Ç”“%²l ËT±H¼’"““–àSlt$,Ò2 ’”Nf’$PL É‘´o B@@ÞL¼­•M±(=Kû¡H‘HÄ™”* ‰X‚Þ}zÑ»O/ ÃDUÄ,’,;Z¿é¬Š’„¦yÐuUQ%3Aíd#l-jƒÇãÁ4œÌˆ’"c&ÑŽ,z÷îËìÙçñÀ~¥9ðù‰';zDÿ~e¼óî‡}3£×5x]¸páâÿ‘!ÜÍYÕé‘ÍËËœ¨ï¦¦&öîÝ›á¿÷Þ{é°´wU’¤ŒZB×Ljés(ŠB<G–e&MšDuu5µµµ̱ér999hš†acV’$ZZZعs'‡~8O<ñƒ "™LòðÃó“Ÿü¤[69.¾ H0w`{à ¨üZØO"}z;üÞÍŸغJa±DʰÑMHe[5ìÝÂëSÐdǬx¤/(ªi†Ž$Ùv’<(* °-IJObåŒÆ.Tƒ´—è¬G–¡±9N±o7·žáaýG5\³h'z•“e[4G[±Œ=’šmµ475“—›OsS µ5µø¼>llô”áÄ`c›Ž‡U’$<šª‘L&±…M($™Ja[vF7Û²-$œqÂç÷"£’L&Ñ4Õ£Ê b™6¦a““€×@UüI MŽ~p"E^Øâш'!èÕ°,Iö! ›„ÙNvv‰›xÂ… .þÓ–å:ášö֦îðx<¯kÚíúèz¼Ó43ÆfZíAUÕŒ‘›ÞžŽÔöx<™v¥©]Û™®?m®Y³ÇC(Ê´)­êVxhii¡±±‘P(D~~>ƒföìÙL˜0X,F$!c›7oFQZZZ¾´ïº¶¹k¤=Ui_.þîI# ´rÌäz¶¼v3ѦÍhž¶¨ñx5è#˜¤ª½j¡ÈÑŽ9yùäûtìŽá hH² Ö‘$ÈB–mâ±(¾@ÙRˆ%t” †GQˆE"ÎJ‡%ˆÅb,)#F0À2œô¿^¿Ë41,8@2ž Pø‘$›3/ùˆC¦0vT!Û>jfO2JYY1–%óÑû›_@"šj¦w¯1ôí9‹86&–åèÚJ’“xB–eYE‘U<™”™‚ÎgÉ‚Ψ5'óœmbK& åCõJfMѰm•=[1ì6À–¼¤Xèfá‚lJKû°uk ÙYa.˜y*ÓϘNͶþòÈ_X»n-’-#«#¥ÁçÀäËÜ\ƒ×… .þ=^¨] GÓ43Ø}“Kttt2ÜØ®º¶áp˜d2™ñ–¦Sïkìvó\@Wç%›DÛ÷˜®Çí{ ûnKÓÀá§•Âá0gœq“'O¦°°ÜÜ\dY&‘Hd®9 ²fÍ6mÚÄ–-[صkš¦Ñ«W¯ž7ÝÆd2‰ßï?`¶}“g¸pñ÷@’À¶’d$̽UT¯[Jv~9¹94îÚ‹'à%+'DS}þ@€@ÐÏÞ½Dór CìØ±‚‚BTÉK]ýŠ‹sQ<;÷ÔQ\\„¬HÔïÙMIa)¦a±·±‰^å½1M“ºº½”õìIÊÐinn¦¤¸„x¿†ªúHÄS AV0L4G "c›Ó[’R>MAæCoCòæâ³äúóñIY€ŒÜijZºªúèhKQÕZƒ¬H´4µñÌÓK©­ÙÎgŸ}NÍö­ø<B¡ɄްdP:Ç7YEü”\ƒ×… .¾Ec7íÔ4––.»ì2/^Œªªx½^Ž;î8n¼ñF†žY>L—“$‰cŽ9†ùóçg<¯iCU‘‘0K§ãÝ7Åð¾Òbi£9ý9í™Ý·Ì¾Æó¾žÓ®»º®ÓÔÔÄá‡Îí·ßNyy9­­­˜¦‰×ëÅãñÐØØÈ›o¾ÉG}„¢(ôìÙ“h4ÊöíÛYµj‡z(çœsN·Ìq–eu3þß~ûmæÌ™Ã‡~˜ñL_rÉ%ÜqÇÿ§ô£.þ‹ŸQ@é\]I¦R˜¶À4LLËB×MdÍȦ@ÑM4¯ÀÐm fb‚d*×—D·$Œ,¼¶‚”’ )cf\!•²°…@·/«®;õXIâ)¤˜‰œ´‘ °u[X˜˜$̆ †)@ÈD£1Ú[ZüCÉ —Ñ$KÔ×ÕSVÞYج[¹žˆ°P|A’Q…þ@_Ta!‹šªGÂR¬Î1ÄáìJ’D0Û‘+SeÞ`6  l¡ $ÕÆ6SH ªi ØìBɇŽagEPC^Œ”I¤# @ï>etDb‚!‰'¾nÊð󿝉EœÉ¬%ÙýâÆ8ì*víÞŽm®ÁëÂ… ÿîH`©ªÊm·ÝÆ 7ÜÀC=Äc=–9æƒ>àî»ïfÁ‚œqÆÜÿýÛ¶;v,Ë—/çì³Ï΄Éd’òòr D*•bÇŽ477g¼¨û­ûÂ]ÿw=ö`žá}=¨iC¹¡¡“O>™x€h4Šªª¤R)ÚÛÛ©­­å‰'ž ©©‰P(D]]º®“““æM›øðé®®fÚ´i™@7˲2é½^/555œsÎ9¼óÎ;\wÝu,Z´¨›'øúë¯G–eþò—¿pî¹ç~¥çÛ…‹OL%ll,–naš–ib[†nJ¤‘0¼º¡c$R Ó4 ÅÒ–†ik¨¦ÃÒÐã@(AJM’’(–†d*XI KObYqV;q#FÌNÒ’¨GÕlKÂNÊè¡ËèfÝŠ$0 ‹æ¦&Jã1$%I~~Å%ý‰GMüÞñÃ-6}^Q¤ÚΠKL=ÃK2ÚŽm¨|ÜbmËtêž¡¨²"aêÎs®zlgâ-¬´h’°L (ªÝ‡À@Ë’ª ðúÍíìݶ—æÆ½ÜóÇ?0÷·s0t½3ÛšŒªz:©U ë)„ÍãA u¶G +Žn¯#U&0 ƒ@(×5x]¸páâß]¶î¿ÿ~®½öZž}öYN:é$ ÃÈðNGÍ}÷ÝÇ}÷ÝÇòåËÉÎÎæç?ÿ9wÞygƸ<ì°ÃX´h\p&LȤ ~á…ƒƒÁn\ÜDÛÓÆÀ<¾éíH’ă>H<'‰H$2T†õë׳gÏJKKQ…={öd”„œp Œ3†Õ«W3aÂ@FöìüóÏgÅŠ¼òÊ+ >pR§=ËBnºé&„\wÝuœxâ‰üÃúÀÅÁ3*[ÉÂ/‚<>Ôla¯FÒ—ƒí5èsDCí ¦ŒªAÜêß—Mݧí4ímA x! £µ{Ðòâœx{oÊϧ}»—åWl%°'lJÙ |ñšß‡–mm*ýÜ|ãB=MjW™ŸY¶ 3y’,©X¶•‘(ÌŒ7ÂF–LÃáxÎ5¯Ê÷O9íJñºï7Àîݻٸq#7ndË–-™Œ@>ŸEQƒD£Q$ÉÉIFI¥R™¬I]=$é—GWOʼ.éJZ=ýrLëc&“I²²²0M“d2Ù-P¥_¿~ 0€!C†0tèP÷ºpñ/@zI ªªŠ#F0vìXÀ K'[e]×Bð½ï}Ã0˜6m£GfÞ¼yÄãqjjj3f ëׯçÏþ3¿ûÝ””`šf7ží—-_åùì8§tJ™¦ÙslÛ6@€úúz¦L™Â¤I“ضm[†RQ__Ϻuë2²hš¦ÑÔÔD^^ìÚµ‹ÖÖVn¾ùffÍš•©÷“O>¡¶¶–ÆÆF®»î:&MšD]]@FA"mÔw½–O<‘yóæñÜsÏ1sæÌŒWÝõòºøJï®B±ID BÃŽß ¿/‡­«ZØ[µricÈ´$‰ˆ¦Šä1¦Ìö9õÄR:²°-A܈‘U1ô$ñV‹D‹ £½ƒ¸ÝBÒ41â2ÑŽ(z ˆ„¬“0L¢‘¢öN„H±’©F¢) Ô"Þnø{hmm!ž€H£à­ª†w”ST>˜Š!Å—dS·§™ö¶$–âÙD•$Usâbq„¦$H%u¼^ ËJa&²$¡š×ƒ¢xÐõ$ðy}è†ã…UdÛ¦áLH²„D"™D‘ |^ø½Ä¢IrsÃüñî;¹ïOOPVRŽmG‘T‰D,‰-$ŠKЉDÚÙ±}†åP,,r³òÉÉÍ¡¾a#‡ç˜ÊS²\ƒ÷Ÿªª*î¹ç„3räH***=z4“'OF’$ à “J¥Ðu=Œr àŽº¾”Ò/•@ IÓFikkcÕªU|úé§lݺ•††.ºè"&OžìÞh.¾…g4@ á̦aUU3Ö´!·yófÖ®]ˬY³Xµj3gÎä…^à„N`ÅŠÌš5‹uëÖ‘••E0Ìpw à ‘HdÆ tp\W®íßet[\\ŒeYìÝ»w¿ 1I’H&“dggSUUÅöíÛ3ú½Ñh4ãHà)ŠÂîݻٶmcÆŒaáÂ…vØamš³û,{÷îeܸqÝ’A¤Õ º~?P0› _ù›7Ml]¦ä…œ1NƵa§—1Mí챉µ'訋ãñú° ‰²íÁãñ£I A¯ŽêËŧ„Q4°‘=2²*áóûñH²§ŸªÐtü¾(^˜ŽF?ìGÑ,TUàñ¨hÞ”„Ï«¢†dLˤ¨è8˜A¤#†Ï÷9þúE”–çÐÒ¡ê³:¶om¦oŸ~ô0h¨oĶlGAJ(õ“•¶Š*wfOsÆ!aw¦–eTŠ,I†é$Ìðz1tÝñê¦S#°;銢tz~-GGز1 ƒ@0€ÀI‡žL&ØY[¤Ȩè¦Iaq%Åùìܵ“ƦF<’‡ý §RìÙ½¿–EÊ4Ø]¿]O`IþæÏµkð~Ö®]Ëš5k9r$¯¿þ:;vì ÿþôêÕ‹¼¼<²²²((( “———ñÔØ¶sÃÓ˲2žÙôßxtû¾Hö}a¦Ýþéÿªªâñx2REir$¡±±‘¦¦&ÚÛÛiii¡¡¡íÛ·óÙgŸe~äŸþ¹kðºpñ-À0 <’$Ñ«W/êêêØ¾};%%%ã,m”¦ ߢ¢"Î:ë,N>ùdÊËË=z4ƒÎ€¥é ’$e<ïכw ÃȬD¥ÏÑ5H­«‡´k œ¢(¤R)¶mÛ–9ÇÆ§´!ÝÒÒBnn.š¦e‚Ô:::hhh SQQÁñÇÏŒ3ÈÎÎîfä¦Ûâõz‘$‰%K–pöÙg³dɦNJ*•bêÔ©ïrWà®xã7((( ²²ÒýѹøZ–XJ‘T1MLƒT¼E“ñùQaZx<:F*…Œ$ P1¥ ( :€а ËIÈld‘Ä:¶œ$n÷%ìù5ù¡þ}o`èO §"XF ’m" ™$²Ç" Ѱw í”÷i& ¡ªJÿþe•ضµ–H{ËÕãÛÆãÕH&S™D1–ma&šêq4yuÇc++2Õã!™H` »3 ްíNÃÖî\‘rzÍЖ@7 <Uõ (*ÍM­!¡Hã›&#É8\\¿’ÒB¶Uo#ëàÈqãI¦’lXÿ1}úö¡°¨„æ†F|>Y²ÐÛtè ®ÁûOB$¡  €«®ºŠ††FúôíKN8›hG„M›6‘ÔMvîÜɺu²öƒ÷‰' r²CÔÖÖRTÚU– ƒd…‚X¦AG,ŽittD)-+CUdR‰uõd‡ÃD#­(Þ ¡€Ãäçå"K©d‚={öÈ STÇÎ;d囯4 ñºi‘J$Hê&cÇNiq1~¯7ÈÄI“ˆ´4áËÊaÒÖÚΓO=E<wo² ßÒ Š¢pÞyçqÿý÷³páBŽ8∌6md¦Wj€LÊ`ÇÃÏ~ö3Z[[Y¸p!>ŸŸÏGÿþýÉÊÊ¢¥¥…¶¶6,Ë¢¡¡!&L`̘1f2§Õ××S]]ÍÖ­[©­­%‹aÛv†r¡iŽà|ÚÓ*IRFQBQ|>_f_ÚH•eÃ0ðûýÒ§O***¥f÷§”öš„b†ÙQ_K}cŠž=‘㣺êcQŒ g]JÕözοŽêíudçäËïIÏâ"Zê¶ãÍ-fHþ¸`!?ýél^|i³g]Èû¼Ë´óJÝú<±ü}õóÉ®|ï¸ï0ÿžeÜòLjT¿É©çþ„çV¬Âo´ñ»ßÿ–wÖ|ÎÕ7Þʦ7ž¥bÔ‘«wÝ»€ï}g,+ÞÙÀu¿8aÇL`Î#ËQ·>Í__xç^[‚"»/.¾ tMó+„ÀçóqÕUW1gÎ6oÞLEEE7ŽoWžmZb+mXž~úé<ñÄÜvÛmŒ7Ž… òÞ{ïÑÞÞN^^3fÌàä“OÆçóe<¡iãðïáí¦R)TUÍ´%²víÚo´”ns׬ƒñi»rçÎK~~> ,èÖ_Ö¿’$±`ÁÞzë-–,YrÀz]¸øòw=Øè˜ºI¾}2vüP˜BÃŽJhŠ„Ï6 e‚,ØÛDFE‘d&’ ¶ma"P;ü² ¯Ÿä$zP$ÉD’l Yò!É*¦]€"ëHí=¼Ðc ‰¢€°-„°Q<Š£!kÙO~¿<Ɔ'’—5”·V¾‚ijd÷¢qWÞ€ŒW0-0­( ݃Q; ]ïÇ›ƒaÄ<šÇYÒMdÅáçz< ~ÍO"CH¿?D2CBBõx0M ]O€d¢*~4¯„¢˜$b*Šœ‹/ØHÜxݬBzÌéß‚\bÑ8¡œlrss¨ÛSOͶ-™þ¯òróñª ¡¹¨ŠŠa@8;—X,J(K2¡»ï?ù9A¸ÿA†:Ûo½•—W¼Ìüyóˆ‹<ž¹÷XMÕüêºß±ìµ¹çþ{yxÞ ÜóÈS\þÓ™4·EQ™Pn>Åe45ÔñÒ'í\1çŽUÊ;¯¾Îgë7B&œ›O, ’Hàñ—+dn½ù6ÊFEß°ÉøË¯çôÓOeÖ¬Y,~f9çžy-‘¥üðì³iÜú!»¶}ŽäËå–¹ó9ù˜±4_x>wßû0Ͼ¸œ5WqÙõs¸ð‚_ lg™3''ç_Þ·¥¥¥nF$ÿï'ÍûjàVVV²hÑ"&MšÄ-·ÜÂE]ÔÍÓÛµLW¾ï°aÃ?~†‡ý Û7oäÚË/E åqÉ/¯¤¥¾–†Ö(ÇÌþ)‡v ÃbTnÙÙ¹ø¼Ma/¥}rÙåX±|7ݱ„qÇÈ SŽ¡iW ο_¸ûîù›?ù]¨ü⊫ÙðÑûÜÿÈ"–>»œüü¶múœŸ®¦Wÿ‘\üã<êvmeüäc±ãÉ“?ƬEæ´þˆâ,™›·0eÊ ^ÖŸºÆVšë())eéÒ¥´··gøpÿ CÀ0 —Gìâ¿ÆðM‡ùùùÜ~ûíL:•—_~™‹.ºè žÏ} ·aÆñöÛo³}ûvúöíÛÍàîÝwßeÛ¶mŒ=z¿ö¬­©TŠÏ?ÿœñãÇsÙe—eŒd7pÍÅ×× ;ëZxì¯Û(G‰Gd|Á0ƒ†ãóø) T  ËxT…‚‚<@ÂË‘óu&}B I  !l I–Ȫæa[Í6ª«?gØàa„szÐÚÔ‚žŠ’FÓ¼Äc1RzŠD"‰2á¬lúôìƒ%L$EжKçãª$;w7°c×jÁl"Ñ(’d3° z ' ‘Ó4’±U·àÑ4BYAš›šÉÉÍ¡¥¥Ã0(--¢wŸžØ¶¶ä¸ršç²b¡y%:"‚êÍ»ÑõÊûQ\TŠ¡[Ȳ +¦±9J4º ŸæÅ¼^x,NII1¦iÑØØˆ¦iØ«YÉdŠÂ„³²i‹´Jø¼‚d"ÉV†(+ñ~³ñW²ÜŸúñ§?ý‰^x»îº‹;vüCê´mÍëÅÛéI1tݙʶ-0u[àDtªÎ€:ùGyBóóóyòÉ' ‡Ã\qÅîváâ[BÚ‹›ÎŒ°téR Àˆ#êÅìJG˜7owÝu¯¿þ:åååÿðöuõ,§ÇŸ´AÎ÷ÏÂóÏ?ÏŒ3xæ™g8þøãÿ®2UUUÔÖÖòÝï~·›l£»räâÛ@CC#gL?›h´MËBض'KHtQ6°ÚDzbjÚŽ&­GQ°˜¦…$px²¶À¶M§žNòª€m#©È Ø©D#¥½²èñ…ü¾«~¹ýö;XúÌ"T%×I"a g@犎,žÔJ(ŠŒiÙX¦…¦©x4•dÜĶl$U`[Qî¾÷>;ìÐoÒœ×Ãû/@¯Þå<8ï6lÛË䣎¢gY «Þù€dGœ%!Ž;óBrU¹7_ÈîÅ€>eä3æ°ÃHÄ¢¸2ê.\üç"½lØUû?øA·ý]'Çiïm2™$ ðÎ;ï …2YÿWÃÛ4Mb±›7oæCÁï÷wkÇûï¿Ïðáà ‡Ã€Ã V…ªª*V¬XÁ™gžI=H$ø|¾¯Í›íjäWVVRQQÁ|ÀñÇ®ëÝ<×òx4ˆAƒu üs© .¾-öàµU/»±®¾ú×\}õ¯ÿmÚãNÿP=R‰;wv;¥%¥©M lúôëOYi1m­ÄqLÓÂÊãJ®±ëÂÅÿ#Ã7-5xк“·*Ë2¡Pˆ{¼¼È!‡ÂÃ?œÉ~6xð`Ž8â~þóŸ“H$Ý é¯‹t‹k®¹†¹sç2vìX^{íµŒz|¡Zq°þJÿ¹¯ .ºun|9Z[[‰ÇãôêÕ‹†††nÂèßm--ô2ŠÙ£â;'!̃‡ aü‘lY¿šÙgOgð!õÝïóöêù`í‡$tÁèƒ÷ |ùº´VoQQš¦ÑÚÚêÞd.þ ã‡zˆn¸üü|fÏž¡2t ûºõ¦y® .ä¹çžãœsÎá™gž¡££Y–©©©aܸq4662tèPÎ:ë,V¬XÁ”)S(++cúôéTWW³xñb‡‡×EÞ웜é2§Ÿ~:ëÖ­cÑ¢ELŸ>G}”SN9!Ä?•NáÂ…‹ÿÇc©ËáýjÔÖÖòÄO°mÛ6¶nÝŠÇã¡wïÞ”””PPP@QQÙÙÙdeeá÷û÷Ëc/„À²¬LBŠ4Ǭkøƒ¥û캌—N6Ñõ¯k0‡mÛÄãqâñ8±XŒöövš››Ù»w/ÔÕÕÑÜÜL~~>TVVºÁb.\ü#­Y ûëΦi¦ivËCÿuê¶:3-¥ÖD£Q²²¾úu˺*:X–…®ëhš¶_[ÿžÉxÚp7MÓ43²jiX]²B}Ýú]¸pñ_×àý¡¥¥…úúzš››Ù¹s'ííí´··ÓÖÖF,Û/$´«Wã@A*iC¸kÚÌ®A%^¯—p8LNN¡PˆÒÒRŠ‹‹)(( ¸¸ØRváâ?ÜàMéIs:Cz"œö¨~/o: dºNÓ41 ŸÏG2™Ä4Mü~æ¼é1*ÁMQ<O&›[WJÁ×iϾ“ÿtbǃ®ë¨ªŠ,ËX–ÕM›Ø…‹o ÑLH. ”BdÏZc“¿¯/{ü‹gĨJ÷w³‘J2!ô°âÙg¸cþÝœpÚ¹ò'3ùõOÏdî=‹yþ¾7¾߯<–˜,³àñ§èWØÉƒ7tTÏW¯VT½ÿ?¹úzJ+†³ðOó÷™š(Ê7™ü âñ$€ÿ {X¹/Ã[O>ÄQ3.dÜ §ðÞß–rÚ”)´ xìÉ%å:&¥žJ¢y÷¤Ó“I$Uã:cDGÓJJˉÎXдe3~ôKŽ8ú8n½öª/ÊuN¨ù;[v€ê%àÓ:BD„ .\¸páÂÅ ìV1ªW@"//OtZL⦻ŠÕo¼"ѳÿ`1ã´©ç]q‹Xúôbˆñ')~ëQyÜñbg}“xùÉ…—ßö{±öõE(è€è7ø0±êåwEQgÝí‘6qö±‡ @L;íTQ–ë€xoýFñâ3gÚP“#qÒìkEÝÆ*ˆ>ã¿+ÚZvgŽÉÍÍÍ|ŽtDÅYß› 1îðñ"ìq¶ŸñMÝ.yÝÛ+ÄÈaCÅÙ3)nºîjˆ¢~‡ !„ÈÑœ2‡ ½‹² ÖoÞ%~Íl)“Ž:RâØs~)¶ú‰ÄÙ—]!„㙀ˆw4‹ãF÷€8ãÌ³ÄøQ ^zí-ñö‹OŠþýˆ›n›'.˜~‚ÄÝ Ìû­„¢xÄiçüT¬\´È9Ïôs…°-‘Óy=gœqªÈ ÈNŸ­ûHTvž'+'Kä8m~|Å:ñÆSw @œ{ñÏÅÜ[nÇŸtŠØ¼½>â­¹páÂ… .þëÄxmýžÌêÂu—ü§€‹.»Š®ÀÓ>Ƙñ“˜{ÓõœuÒTrósyõ•—¸úw («@kS ‡M>ž£Ç;Ò¿¼î6Ÿ8Úñ;Ê!šöðÊë‚'‡o¼™ÙçÍ`ûîFò{0ÿ¡•4vÆÖÄÛ£˜¦³ºÛ#?YvVl=ú|ZZZ;0ª¢vJ˜öÔŸ!#‡PŸÓízúÓøø³Ï0l£GUΠWy)—_vgÍpÚõÉ'U”–÷àû'MãŠË¯`õ›o±cûÇÛ­;™Ïr¼aëwñÆG5HÁnœ3‡k¯¾– GŽcïž®¿æ ¶nÝÂèÑÃ)/s®o.çýÌQrðfòÛÛ~Cqi.å½{aê Ú CÅ\wýÍœr‚“TfãçÛ(ïç¨Ôl­ðÜ3q¶¿¿†Â!øõ/~Æ)Çؼôü2~pþOÝ 5?bÑþPЕöÀÆ8qáÂ…‹ÿ`H!}~%1zæØÝvýþþÅüþþE<¹è¯¼óáÇlßÓ@ï'Ã×YçœÃ‹/½ÄîÖŸUÕ0´¢ »w°råJJz9¤Ï-™gž{‘Dr/M M¼ðÞ;´Fã÷Ä^S°}ËF^~íM†3qç#lÛ²™•+W2`Ð(V®\I~Q9}KY¹r%áÅ‚¹¬\¹’PN1w?ºŒHL'–ÐtÈ$ÎÍ.gÚô3Ù¹®÷>üüÝ—ÿÿøØKœzþ Ömø˜~#¦Q³éS6Öì$¥'ØVí°eýË),ÈfÏõó)É0{Æ\ÂU†_y“ã„ifåÊ•õì À²•+1…MI¿‘¤„`ó§xãµWñ†Â¼´j5!Mâ‡3Îdé²¥TWWñ“ëïáè©ç‘ÊC¬y7Ï­xƒÏ6|Ì‘‡ŽdåÊ•äæ zƒ!ظa-o½õ§þäZþüô öÎᬋY~ÁQX¹r%=û aPÿRοà|^zål-LuÍNôéÉ·Fixü?d\Þ²$g>_úëº×ÖÖÖíûò'@œzî¥Â¶¿ØëèÑXæûǼ%N9å±tÕ»b纷 9ª²[]íímB7­î«¦!LKˆ{ï¼½Ó~ÓA¯Á4 ÑÐÜšùio)ÝØï¸d".¢ñø–P¬î×kgŸzª8mú ±«¾A$ {¿"éÚ-ÓmííÝöY–Õ¥?Ú…a˜nK,~ õÑÑíÖ¶®H$¾(óÜ_ïs–:9B,]ú¼˜uæbú¹3…)jˆdÊø¿ K4víÏH»ˆÅ™ïÏ>v¯Ä؉' !„Øüñâ”SNw.xäK®£{$tº ¥©IÄâÉý¶Ç¢ÝÚbš¦è—çüfköêÝú½±©É]táÂ… ÿRÄ:ÚņõëEõÖš¯]¶#‘HDX¶½Ÿ ‰DD2™üOïžoÒ 9nsoñ0,ÛBØ;xä¹wyyÕj$I"«÷P–,yš"Õ Æøl[=+þöUŸ¬aÕo³mãz~ô£ÙÌ»ë¦Lƒ$Iüꦻ(-,bÙ²e¬ú`=E³¬Cƒmè™àŽ'Ÿ^Â)G;eîùóbŽR‚¬zøÑì™<òÐCî³ðüÒÅ™òçÍþ1Ñö&Œˆ$Iüõɧøá œÏK—3ÿúË$‰™—]Åïoù ¹9aþ´èo¬_÷’$QÐÏ<³„`g}mÜëK–ðô“OPV˜Ë)!IU[j8at1’$qóUW"I‡~çxžyú©L[b‰8ß;z’$QÖo(w?òŠúE€ÚÙ'ND’$.¸ìjþç–« ggqû]áãµk$‰PaîüÃ\4IBæóágÕhuŸ>ýt*z!I{s=«ßy€ì¬,²| /ZÌ“} è_DV<\ñ‹_2nhO$IâÞžá¾ÿ¹I’¸óÞ¥`;A{£&žYg$IbÒw§ñyõVÞ|í%fΜÅüyó?ÚéƒÛîü ›ª«hÞ[Ë_Ÿz‰h{;Ë–-cwk”O>p~3=zW0Þÿ IÞü>¬ù`m¦þS§ŸAQ®“üÙUŸt»¯cÊ‚H’ÄÔ3Îå¢ Î⺛ï`Òç~ÿÀ#Ì»ù*§~+¯>»„ˆ¡‹ý^_†$I” Ü9s8Öøà“j×kâÂ… .þ%„²9júõùÚeCYYdee!ï<ïõùÉÊÊÂëõþÇ÷Ï·fðê©$©ú*.½ôRz à¢ßeX_‡‡":ímœ6k6\8›½ 8éÄ)äö$P¨†Çzž9|òÙ›Z4ö;Ìœ9“ƒ°nÃz† Fy¿A„Ã945ÖÑÞqÂM“X4Êù?šÍy…¹*ÉÎó´&m^\³™ÑŠ<°/­ß‹%•c:×é ‘2¹hö¸èÒ+ñiêw×°zÝZ~õÓ »Å'Ö78û† JŸþƒÉÏË£-ÒD¤½ €¢ÒrÊ{÷%/¬ â bÑ$NO©<õäSL9n<}ûáÜNàèã§Qyü $ÀIkŒ2€šÝ;H)ÎÒD^nªêDQ¿²â¯\4óBrÂ_ˆ{á­Ë8jÜa|§ò~øÏ÷ìÏñSŽq&Å}˜öý©øüAz÷ïÝ™vÃï÷:}ZTÖ‡òò¾h€ÞÞA<êô¨?¯?Kž\̈áÿHÅ»Ý׫ç=ÀÕW^É9Ó¦‘jÝË-×_Å}‹ž£Wg Ø½}7Þpf]8“c&aÊ´éd” Ž™UÄí·ÜÄU—ü„°_ã/^ÀØ‘#Ü÷¿å¹Î¤ê‘§ßø‡Õùô£w‘í÷²vc»³„ “×{ ö—”¹ý² IÙ%?ï¶ýý翘¨—ôuø|w\qAfÛ¬K~ö_s¯ÌXG2ˆË¯ýí~û¸ÕqR ëŒ; Û3}´èé×Zçû/¿@8;ÌÐ Ÿð½UËÈÍÎâ¹×6º‡ ÿ®ø¶( †¡‹H§Ë<‰ ÐÚÜ ÖoØÐ6 „Ѷ±uëV§„BìÚ¹C|úùFÇ…‰ˆÖöˆ0L£³^]Û‘HDD£_,u'bâã DÍŽÝÝên¬ß#v×íí\RˆDRß§ÝFg]±nÛõd\|úɱµfÇ~×±£¶FlÙºm¿íÍ uâ£õëEsëÔ„Ö¶v‰D„Ýe!‰kŸ²õ{vˆõë׋öŽXŠFû— ömKõ–mbß#ÚšÄæÍ›E,s½¶hDD$ÒÑmò…°,§’)=Ó¾H$"lÓGy˜1j”Xùú›bÞµ—@\ý‡Gs47ˆí;vdÊtDã]>G»·sÇv±y[°;÷×74:툶‰­[·Š¶Ö6a™fæÜJBã^±ysµHèi*ƒsLšæEE$†aí×7ñX‡Ø°~ølÓæýè›6~&6î·]ˆÛkEõ–/îí¶-UbíºD"eºëiÿE;¤HbûîqלŸd(Zé¿k~wŸBˆŠb'’zذ¡‡M>IDbñnÇž~á%â±ùs»m[úè1²@jžB[;v˜ÄèQ‡ ¨"a ñܽNtó/~s}·ö}ôò2ˆP®í½ðéåâØ £EIÏž×ß1ï€í>áÑÚÖ.é“ï´wôaçóˆŽXJÜqùùÎöqãE¿’qè“E]S›v¶[!®™íDµWæý¦Ûu½¶ú#Qyè îç<âXa !Šs½ûõc׿gV®Í»k…„7;/Sþg7ÜÙ-J<ó—ÕK<û·×„·Ë¶‹.»®;Õî®k Ž:ñtgY·q—ðt[×,ÄŠeîWïUóÑ]; N¾ðGâî[çtÛ¿è¹ÕîâÂÅ¿!¥á[ ZSUYY_®˜“׃œ¼ûm†séÎÍ|/ëÙ‹²´ ?+‹@ç箂éûЧû!FŒ¹_ÝE%-ã´[=àv×ϰá#x½Ê¼œ×£˜¼Åݯ¹3B²+t¾¢’^•ôê¶-;;û+ûý`m ç÷ œßµ¯%²»œ×ëó“‘ϓԃöíï®EODÙ´y+S/¸‚ŸÝ|÷çÈëA8ï«ï @¯^½»íOã †é×/|в¹…ävõÉw;Æ´oü#G>À‰Aƒ‡¸?{—wûÞ·}Ýyó- ÃÄçw´,£B ìùÙH’̆·_bs}+ƒŸÄÏ?“x´#•äõ7_£´G˜=í4[‚¼Îu¶;ï¹7·Ò!!àçZd—‡ˆµ7‘W܇Òrƒ3Ï?—~+ý,yáê›LB9¡/m߯s=RS5çœö=rzŽâ¦k®á²‹/¦¼w/ª×½¾_ûLCgõûk1®’±Ž³Î?>¥~–¼ð6ïoØÉ¯þ甂 6UmæÕúZÖ½÷«ÞYÃð½YóÉ^6‰¤áŒŠL0Ëyv¯¿í÷̹ú—<µ`.¯®«êvÎT*É{ë>¢´¤”úÖ„Üuù4~ö‡¥!xù©»ùîôK‰7|Âãk>Ŧžp'NC{¤S6ØðñG=3ò¢™ë.¿€[þð£ÇÍöM«(<™¹ZÌ•?žÑ}¹6茡5[«‰Æ ZwceÆ@¯æ¼³î{â~4}<’$ñá»h=æ>Yÿ)Ï>x«ÖqÏ£ÏRµÛ¤¢ÔÕ>wáâß2nÒ ÿGhþÐ7æ ¹pñŸˆÃ<ŠÊÊJü~e}PYYIkSœæ¨Aee%f*ƨ‰Ç³æå©I~óë_ñàÃSÔg'M9‡Œ¡²²’D[G¦Îßßy?'L`HY/V.‰KÏ<™‰‡&îÁ¤‰ãèÙ#È_=MiÅ$*++ÙU·ü²TVVRÑ¿_·ö…òzPYYIa¯\sû|*++ylÑ£œ?}*•••DÛÛxèѼ·êùní+è5œŽ=޾}Š)+ñø¢%”šHee%1¶~ö!K–.áù¿½€?TÀ-¿»›3NžÂœëneâÄ1œ|Úyäô›@ee%>¯JQi9•••”åpúì_±úõîçìQ6”#Íàaé¬t(¹=L-(¾\*++‰é —þæ·. # /*! \mainpage \image html gnss-sdr_logo.png \image latex gnss-sdr_logo.png "GNSS-SDR logo" width=2.5cm Welcome to GNSS-SDR! GNSS-SDR is an open-source GNSS software receiver freely available to the research community. This project provides a common framework for GNSS signal processing which can operate in a variety of computer platforms. This tool is intended to foster collaboration, increase awareness, and reduce development costs in the field of GNSS receiver design and customized use of GNSS signals. For details about GNSS-SDR and using it, please see the main project page or browse the code at the Sourceforge project page. You could be also interested in subscribing to the mailing list. \section toc Contents \li \ref overview \li \ref build \li \ref using_gnss-sdr \li \ref control_plane \li \ref signal_processing \li \ref license \li \ref publications \li \ref now_what More details on GNSS-SDR signal processing blocks: \li \ref signal_source \li \ref signal_conditioner \li \ref channel
  • \ref acquisition
  • \ref tracking
  • \ref decoding
\li \ref observables \li \ref pvt \section overview Overview GNSS-SDR provides an interface to different suitable RF front-ends and implements all the receiver chain up to the navigation solution. Its design allows any kind of customization, including interchangeability of signal sources, signal processing algorithms, interoperability with other systems, output formats, and offers interfaces to all the intermediate signals, parameters and variables. The goal is to write efficient and truly reusable code, easy to read and maintain, with fewer bugs, and producing highly optimized executables in a variety of hardware platforms and operating systems. In that sense, the challenge consists of defining a gentle balance within level of abstraction and performance. GNSS-SDR runs in a personal computer and provides interfaces through USB and Ethernet buses to a variety of either commercially available or custom-made RF front-ends, adapting the processing algorithms to different sampling frequencies, intermediate frequencies and sample resolutions. This makes possible rapid prototyping of specific receivers intended, for instance, to geodetic applications, observation of the ionospheric impact on navigation signals, GNSS reflectometry, signal quality monitoring, or carrier-phase based navigation techniques. \image html overview.png \image latex overview.png "Overview" width=12cm As signal inputs, it accepts: \li Raw data file captured with a data grabber (digitized at some intermediate frequency or directly at baseband). \li Any suitable RF configuration that can be driven by the Universal Software Radio Peripheral Hardware Driver (UHD). This includes all current and future Ettus Research products. The USRP1 + DBSRX 2.2 daughterboard is an example of working configuration for GPS L1 C/A and Galileo E1B and E1C signals. \li The GN3S v2 USB dongle (GN3S v3 might work with small modifications). \li Experimentally, with some USB DVB-T dongles based on the Realtek RTL2832U chipset. \li For mathematical representations of the targeted signals, check out the \ref the_signal_model page. As outputs, it provides: \li Dump of intermediate signals (configurable by the user) \li The processing is logged at a system temporary folder (usually, /tmp) \li Observables in form of RINEX file (experimental) \li Navigation message data in form of RINEX file \li Position, Velocity and Time solution in KML format and NMEA \section build Building GNSS-SDR In principle, GNSS-SDR can be built in any Unix-like system. In practice, it depends on being able to install all the required dependencies. See the building guide page for details about the project's dependencies and build process. Mainly, it consists on installing GNU Radio plus some few more libraries: \li Gflags, a library that implements commandline flags processing, \li Glog, a library that implements application-level logging, \li Armadillo, a C++ linear algebra library, \li Googletest, Google's framework for writing C++ tests (requires definition of the GTEST_DIR variable), and, optionally, \li Gperftools, which provides fast, multi-threaded malloc() and performance analysis tools. After all dependencies are installed, clone the GNSS-SDR repository: \verbatim $ git clone git://git.code.sf.net/p/gnss-sdr/cttc gnss-sdr \endverbatim This will create a folder named gnss-sdr with the following structure: \verbatim |-gnss-sdr |---build <- where gnss-sdr is built |---cmake <- CMake-related files |---conf <- Configuration files. Each file represents one receiver. |---data <- Populate this folder with your captured data. |---docs <- Contains documentation-related files |---install <- Executables |---src <- Source code folder |-----algorithms |-------PVT |-------acquisition |-------channel |-------conditioner |-------data_type_adapter |-------input_filter |-------libs |-------observables |-------resampler |-------signal_source |-------telemetry_decoder |-------tracking |-----core |-------interfaces |-------libs |-------receiver |-------system_parameters |-----main |-----tests |-----utils <- some utilities (e.g. Matlab scripts) \endverbatim You are now ready to build GNSS-SDR by using CMake as building tool: \verbatim $ cd gnss-sdr/build $ cmake ../ $ make \endverbatim If everything goes well, three new executables will be created at gnss-sdr/install, namely gnss-sdr, volk_gnsssdr_profile and run_tests. You can run them from that folder, but if you prefer to install gnss-sdr on your system and have it available anywhere else, do: \verbatim $ sudo make install \endverbatim This will make a copy of the conf/ folder into /usr/local/share/gnss-sdr/conf for your reference. We suggest to create a working directory at your preferred location and store your own configuration and data files there. You can create the documentation by doing: \verbatim $ make doc \endverbatim from the gnss-sdr/build folder. In both cases, Doxygen will generate HTML documentation that can be retrieved pointing your browser of preference to gnss-sdr/docs/html/index.html. There are two more extra targets available. From the gnss-sdr/build folder: \verbatim $ make doc-clean \endverbatim will remove the content of previously-generated documentation and, if a LaTeX installation is detected in your system, \verbatim $ make pdfmanual \endverbatim will create a PDF manual at gnss-sdr/docs/GNSS-SDR_manual.pdf. Please note that the PDF generation requires some fonts to be installed on the host system. In Ubuntu 12.10, those fonts do not come by default. You can install them by doing: \verbatim $ sudo apt-get install texlive-fonts-recommended \endverbatim and then run cmake ../ and make pdfmanual again. \subsection debug_and_release Debug and Release builds By default, CMake will build the Release version, meaning that the compiler will generate a faster, optimized executable. This is the recommended build type when using a RF front-end and you need to attain real time. If working with a file (and thus without real-time constraints), you may want to obtain more information about the internals of the receiver, as well as more fine-grained logging. This can be done by building the Debug version, by doing: \verbatim $ cd gnss-sdr/build $ cmake -DCMAKE_BUILD_TYPE=Debug ../ $ make $ sudo make install \endverbatim \subsection updating_gnss-sdr Updating GNSS-SDR If you checked out GNSS-SDR some days ago, it is possible that some developer had updated files at the Git repository. You can update your local copy by doing: \verbatim $ git checkout next $ git pull origin next \endverbatim Before rebuiling the source code, it is safe (and recommended) to remove the remainders of old builds: \verbatim $ cd gnss-sdr/build $ sudo make uninstall $ rm -rf * \endverbatim You can also check The Git Book for more information about Git usage. \section using_gnss-sdr Using GNSS-SDR With GNSS-SDR, you can define you own receiver, work with captured raw data or from a RF front-end, dump into files intermediate signals, or tune every single algorithm used in the \ref signal_processing. All the configuration is done in a single file. Those configuration files reside at the gnss-sdr/conf folder. By default, the executable gnss-sdr will read the configuration available at gnss-sdr/conf/gnss-sdr.conf. You can edit that file to fit your needs, or even better, define a new my_receiver.conf file with your own configuration. This new receiver can be done by invoking gnss-sdr with the --config_file flag pointing to your configuration file: \verbatim $ gnss-sdr --config_file=../conf/my_receiver.conf \endverbatim You can see a guide of available implementations at gnss-sdr/conf/master.conf. That folder contains other working examples as well. If you have a working configuration and want to share it will others, please email it to the GNSS-SDR developers mailing list and we will be happy to upload it to the server. You can use a single configuration file for processing different data files, specifying the file to be processed with the --signal_source flag: \verbatim $ gnss-sdr --config_file=../conf/my_receiver.conf --signal_source=../data/my_captured_data.dat \endverbatim This will override the SignalSource.filename specified in the configuration file. You can get a complete list of available commandline flags by doing: \verbatim $ gnss-sdr --help \endverbatim For general usage of commandline flags, see how to use Google Commandline Flags. \section control_plane Control plane GNSS-SDR's main method initializes the logging library, processes the command line flags, if any, provided by the user and instantiates a ControlThread object. Its constructor reads the configuration file, creates a control queue and creates a flowgraph according to the configuration. Then, the program's main method calls the run() method of the instantiated object, an action that connects the flowgraph and starts running it. After that, and until a stop message is received, it reads control messages sent by the receiver's modules through a safe-thread queue and processes them. Finally, when a stop message is received, the main method executes the destructor of the ControlThread object, which deallocates memory, does other cleanup and exits the program. The GNSSFlowgraph class is responsible for preparing the graph of blocks according to the configuration, running it, modifying it during run-time and stopping it. Blocks are identified by its role. This class knows which roles it has to instantiate and how to connect them. It relies on the configuration to get the correct instances of the roles it needs and then it applies the connections between GNU Radio blocks to make the graph ready to be started. The complexity related to managing the blocks and the data stream is handled by GNU Radio's gr::top_block class. GNSSFlowgraph wraps the gr::top_block instance so we can take advantage of the \ref gnss_block_factory, the configuration system and the processing blocks. This class is also responsible for applying changes to the configuration of the flowgraph during run-time, dynamically reconfiguring channels: it selects the strategy for selecting satellites. This can range from a sequential search over all the satellites' ID to smarter approaches that determine what are the satellites most likely in-view based on rough estimations of the receiver position in order to avoid searching satellites in the other side of the Earth. The Control Plane is in charge of creating a flowgraph according to the configuration and then managing the modules. Configuration allows users to define in an easy way their own custom receiver by specifying the flowgraph (type of signal source, number of channels, algorithms to be used for each channel and each module, strategies for satellite selection, type of output format, etc.). Since it is difficult to foresee what future module implementations will be needed in terms of configuration, we used a very simple approach that can be extended without a major impact in the code. This can be achieved by simply mapping the names of the variables in the modules with the names of the parameters in the configuration. \subsection configuration Configuration Properties are passed around within the program using the ConfigurationInterface class. There are two implementations of this interface: FileConfiguration and InMemoryConfiguration. FileConfiguration reads the properties (pairs of property name and value) from a file and stores them internally. InMemoryConfiguration does not read from a file; it remains empty after instantiation and property values and names are set using the set property method. FileConfiguration is intended to be used in the actual GNSS-SDR application whereas InMemoryConfiguration is intended to be used in tests to avoid file-dependency in the file system. Classes that need to read configuration parameters will receive instances of ConfigurationInterface from where they will fetch the values. For instance, parameters related to SignalSource should look like this: \verbatim SignalSource.parameter1=value1 SignalSource.parameter2=value2 \endverbatim The name of these parameters can be anything but one reserved word: implementation. This parameter indicates in its value the name of the class that has to be instantiated by the factory for that role. For instance, if our signal source is providing data already at baseband and thus we want to use the implementation Pass_Through for module SignalConditioner, the corresponding line in the configuration file would be \verbatim SignalConditioner.implementation=Pass_Through \endverbatim Since the configuration is just a set of property names and values without any meaning or syntax, the system is very versatile and easily extendable. Adding new properties to the system only implies modifications in the classes that will make use of these properties. In addition, the configuration files are not checked against any strict syntax so it is always in a correct status (as long as it contains pairs of property names and values in INI format). \subsection gnss_block_factory GNSS block factory Hence, the application defines a simple accessor class to fetch the configuration pairs of values and passes them to a factory class called GNSSBlockFactory. This factory decides, according to the configuration, which class needs to be instantiated and which parameters should be passed to the constructor. Hence, the factory encapsulates the complexity of blocks' instantiation. With that approach, adding a new block that requires new parameters will be as simple as adding the block class and modifying the factory to be able to instantiate it. This loose coupling between the blocks' implementations and the syntax of the configuration enables extending the application capacities in a high degree. It also allows to produce fully customized receivers, for instance a testbed for acquisition algorithms, and to place observers at any point of the receiver chain. \section signal_processing Signal Processing plane GNU Radio's class gr::basic_block is the abstract base class for all signal processing blocks, a bare abstraction of an entity that has a name and a set of inputs and outputs. It is never instantiated directly; rather, this is the abstract parent class of both gr::hier_block2, which is a recursive container that adds or removes processing or hierarchical blocks to the internal graph, and gr::block, which is the abstract base class for all the processing blocks. \image html ClassHierarchy.png \image latex ClassHierarchy.png "Class hierarchy of signal processing blocks" width=12cm A signal processing flow is constructed by creating a tree of hierarchical blocks, which at any level may also contain terminal nodes that actually implement signal processing functions. Class gr::top_block is the top-level hierarchical block representing a flowgraph. It defines GNU Radio runtime functions used during the execution of the program: run(), start(), stop(), wait(), etc. A a subclass called GNSSBlockInterface is the common interface for all the GNSS-SDR modules. It defines pure virtual methods, that are required to be implemented by a derived class. Subclassing GNSSBlockInterface, we defined interfaces for the GNSS receiver blocks depicted in the figure above. This hierarchy provides the definition of different algorithms and different implementations, which will be instantiated according to the configuration. This strategy allows multiple implementations sharing a common interface, achieving the objective of decoupling interfaces from implementations: it defines a family of algorithms, encapsulates each one, and makes them interchangeable. Hence, we let the algorithm vary independently from the program that uses it. \subsection signal_source Signal Source The input of a software receiver are the raw bits that come out from the front-end's analog-to-digital converter (ADC). Those bits can be read from a file stored in the hard disk or directly in real-time from a hardware device through USB or Ethernet buses. The Signal Source module is in charge of implementing the hardware driver, that is, the portion of the code that communicates with the RF front-end and receives the samples coming from the ADC. This communication is usually performed through USB or Ethernet buses. Since real-time processing requires a highly optimized implementation of the whole receiver, this module also allows to read samples from a file stored in a hard disk, and thus processing without time constraints. Relevant parameters of those samples are the intermediate frequency (or baseband I&Q components), the sampling rate and number of bits per sample, that must be specified by the user in the configuration file. This module also performs bit-depth adaptation, since most of the existing RF front-ends provide samples quantized with 2 or 3 bits, while operations inside the processor are performed on 32- or 64-bit words, depending on its architecture. Although there are implementations of the most intensive computational processes (mainly correlation) that take advantage of specific data types and architectures for the sake of efficiency, the approach is processor-specific and hardly portable. We suggest to keep signal samples in standard data types and letting the compiler select the best library version (implemented using SIMD or any other processor-specific technology) of the required routines for a given processor. Example: FileSignalSource The user can configure the receiver for reading from a file, setting in the configuration file the data file location, sample format, and the sampling frequency and intermediate frequency at what the signal was originally captured. \verbatim ;######### SIGNAL_SOURCE CONFIG ############ SignalSource.implementation=File_Signal_Source SignalSource.filename=/home/user/gnss-sdr/data/my_capture.dat SignalSource.item_type=gr_complex SignalSource.sampling_frequency=4000000 ; Sampling frequency in [Hz] SignalSource.freq=1575420000 ; RF front-end center frequency in [Hz] \endverbatim Example: UhdSignalSource The user may prefer to use a UHD-compatible RF front-end and try real-time processing. For instance, for a USRP1 + DBSRX daughterboard, use: \verbatim ;######### SIGNAL_SOURCE CONFIG ############ SignalSource.implementation=UHD_Signal_Source SignalSource.item_type=gr_complex SignalSource.sampling_frequency=4000000 ; Sampling frequency in [Hz] SignalSource.freq=1575420000 ; RF front-end center frequency in [Hz] SignalSource.gain=60 ; Front-end gain in dB SignalSource.subdevice=B:0 ; UHD subdevice specification (for USRP1 use A:0 or B:0) \endverbatim Other examples are available at gnss-sdr/conf. \subsection signal_conditioner Signal Conditioner The signal conditioner is in charge of resampling the signal and delivering a reference sample rate to the downstream processing blocks, acting as a facade between the signal source and the synchronization channels, providing a simplified interface to the input signal. In case of multiband front-ends, this module would be in charge of providing a separated data stream for each band. \subsection channel Channel A channel encapsulates all signal processing devoted to a single satellite. Thus, it is a large composite object which encapsulates the \ref acquisition, \ref tracking and \ref decoding modules. As a composite object, it can be treated as a single entity, meaning that it can be easily replicated. Since the number of channels is selectable by the user in the configuration file, this approach helps improving the scalability and maintainability of the receiver. This module is also in charge of managing the interplay between acquisition and tracking. Acquisition can be initialized in several ways, depending on the prior information available (called cold start when the receiver has no information about its position nor the satellites almanac; warm start when a rough location and the approximate time of day are available, and the receiver has a recently recorded almanac broadcast; or hot start when the receiver was tracking a satellite and the signal line of sight broke for a short period of time, but the ephemeris and almanac data is still valid, or this information is provided by other means), and an acquisition process can finish deciding that the satellite is not present, that longer integration is needed in order to confirm the presence of the satellite, or declaring the satellite present. In the latter case, acquisition process should stop and trigger the tracking module with coarse estimations of the synchronization parameters. The mathematical abstraction used to design this logic is known as finite state machine (FSM), that is a behavior model composed of a finite number of states, transitions between those states, and actions. For the implementation, we used the Boost.Statechart library, which provides desirable features such as support for asynchronous state machines, multi-threading, type-safety, error handling and compile-time validation. The abstract class ChannelInterface represents an interface to a channel GNSS block. Check Channel for an actual implementation. \subsubsection acquisition Acquisition The first task of a GNSS receiver is to detect the presence or absence of in-view satellites. This is done by the acquisition system process, which also provides a coarse estimation of two signal parameters: the frequency shift with respect to the nominal IF frequency, and a delay term which allows the receiver to create a local code aligned with the incoming code. AcquisitionInterface is the common interface for all the acquisition algorithms and their corresponding implementations. Algorithms' interface, that may vary depending on the use of information external to the receiver, such as in Assisted GNSS, is defined in classes referred to as adapters. These adapters wrap the GNU Radio blocks interface into a compatible interface expected by AcquisitionInterface. This allows the use of existing GNU Radio blocks derived from gr::block, and ensures that newly developed implementations will also be reusable in other GNU Radio-based applications. Moreover, it adds still another layer of abstraction, since each given acquisition algorithm can have different implementations (for instance using different numerical libraries). In such a way, implementations can be continuously improved without having any impact neither on the algorithm interface nor the general acquisition interface. Check GpsL1CaPcpsAcquisition and GalileoE1PcpsAmbiguousAcquisition for examples of adapters from a Parallel Code Phase Search (PCPS) acquisition block, and pcps_acquisition_cc for an example of a block implementation. The source code of all the available acquisition algorithms is located at: \verbatim |-gnss-sdr |---src |-----algorithms |-------acquisition |---------adapters <- Adapters of the processing blocks to an AcquisitionInterface |---------gnuradio_blocks <- Signal processing blocks implementation \endverbatim The user can select a given implementation for the algorithm to be used in each receiver channel, as well as their parameters, in the configuration file: \verbatim ;######### ACQUISITION GLOBAL CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] Acquisition.dump=false ;#filename: Log path and filename Acquisition.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition.item_type=gr_complex ;#if: Signal intermediate frequency in [Hz] Acquisition.if=0 ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] Acquisition.sampled_ms=1 ;#implementation: Acquisition algorithm selection for this channel: Acquisition.implementation=GPS_L1_CA_PCPS_Acquisition ;#threshold: Acquisition threshold Acquisition.threshold=0.005 ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. ;Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] Acquisition.pfa=0.0001 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition.doppler_max=10000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition.doppler_step=500 ;######### ACQUISITION CHANNELS CONFIG ###### ;#The following options are specific to each channel and overwrite the generic options ;######### ACQUISITION CH 0 CONFIG ############ ;Acquisition0.implementation=GPS_L1_CA_PCPS_Acquisition ;Acquisition0.threshold=0.005 ;Acquisition0.pfa=0.001 ;Acquisition0.doppler_max=10000 ;Acquisition0.doppler_step=250 ;#repeat_satellite: Use only jointly with the satellite PRN ID option. The default value is false ;Acquisition0.repeat_satellite = false ;######### ACQUISITION CH 1 CONFIG ############ ;Acquisition1.implementation=GPS_L1_CA_PCPS_Acquisition ;Acquisition1.threshold=0.005 ;Acquisition1.pfa=0.001 ;Acquisition1.doppler_max=10000 ;Acquisition1.doppler_step=250 ;Acquisition1.repeat_satellite = false \endverbatim \subsubsection tracking Tracking When a satellite is declared present, the parameters estimated by the acquisition module are then fed to the receiver tracking module, which represents the second stage of the signal processing unit, aiming to perform a local search for accurate estimates of code delay and carrier phase, and following their eventual variations. Again, a class hierarchy consisting of a TrackingInterface class and subclasses implementing algorithms provides a way of testing different approaches, with full access to their parameters. Check GpsL1CaDllPllTracking or GalileoE1DllPllVemlTracking for examples of adapters, and Gps_L1_Ca_Dll_Pll_Tracking_cc for an example of a signal processing block implementation. There are also available some useful classes and functions for signal tracking; take a look at Correlator, lock_detectors.h, tracking_discriminators.h or tracking_2nd_DLL_filter.h. The source code of all the available tracking algorithms is located at: \verbatim |-gnss-sdr |---src |-----algorithms |-------tracking |---------adapters <- Adapters of the processing blocks to a TrackingInterface |---------gnuradio_blocks <- Signal processing blocks implementation |---------libs <- libraries of tracking objects (e.g. correlators, discriminators, and so on) \endverbatim The user can select a given implementation for the algorithm to be used in all the tracking blocks, as well as its parameters, in the configuration file: \verbatim ;######### TRACKING GLOBAL CONFIG ############ ;#implementation: Selected tracking algorithm Tracking.implementation=GPS_L1_CA_DLL_PLL_Tracking ;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version. Tracking.item_type=gr_complex ;#sampling_frequency: Signal Intermediate Frequency in [Hz] Tracking.if=0 ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] Tracking.dump=false ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. Tracking.dump_filename=./tracking_ch_ ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking.pll_bw_hz=50.0; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] Tracking.dll_bw_hz=2.0; ;#fll_bw_hz: FLL loop filter bandwidth [Hz] Tracking.fll_bw_hz=10.0; ;#order: PLL/DLL loop filter order [2] or [3] Tracking.order=3; ;#early_late_space_chips: correlator early-late space [chips]. Use [0.5] Tracking.early_late_space_chips=0.5; \endverbatim \subsubsection decoding Decoding of the navigation message Most of GNSS signal links are modulated by a navigation message containing the time the message was transmitted, orbital parameters of satellites (also known as ephemeris) and an almanac (information about the general system health, rough orbits of all satellites in the network as well as data related to error correction). Navigation data bits are structured in words, pages, subframes, frames and superframes. Sometimes, bits corresponding to a single parameter are spread over different words, and values extracted from different frames are required for proper decoding. Some words are for synchronization purposes, others for error control an others contain actual information. There are also error control mechanisms, from parity checks to forward error correction (FEC) encoding and interleaving, depending on the system. All this decoding complexity is managed by a finite state machine implemented with the Boost.Statechart library. The common interface is TelemetryDecoderInterface. Check GpsL1CaTelemetryDecoder for an example of the GPS L1 NAV message decoding adapter, and gps_l1_ca_telemetry_decoder_cc for an actual implementation of a signal processing block. Configuration example: \verbatim ;######### TELEMETRY DECODER CONFIG ############ TelemetryDecoder.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder.dump=false \endverbatim See the \ref reference_docs for more information about the signal format. \subsection observables Observables GNSS systems provide different kinds of observations. The most commonly used are the code observations, also called pseudoranges. The pseudo comes from the fact that on the receiver side the clock error is unknown and thus the measurement is not a pure range observation. High accuracy applications also use the carrier phase observations, which are based on measuring the difference between the carrier phase transmitted by the GNSS satellites and the phase of the carrier generated in the receiver. Both observables are computed from the outputs of the tracking module and the decoding of the navigation message. This module collects all the data provided by every tracked channel, aligns all received data into a coherent set, and computes the observables. The common interface is ObservablesInterface. Configuration example: \verbatim ;######### OBSERVABLES CONFIG ############ ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. Observables.implementation=GPS_L1_CA_Observables ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] Observables.dump=false ;#dump_filename: Log path and filename. Observables.dump_filename=./observables.dat \endverbatim \subsection pvt Computation of Position, Velocity and Time Although data processing for obtaining high-accuracy PVT solutions is out of the scope of GNSS-SDR, we provide a module that can compute a simple least square solution and leaves room for more sophisticated positioning methods. The integration with libraries and software tools that are able to deal with multi-constellation data such as GPSTk or gLAB appears as a viable solution for high performance, completely customizable GNSS receivers. The common interface is PvtInterface. For instance, in order to use the implementation GpsL1CaPvt, add to the configuration file: \verbatim ;######### PVT CONFIG ############ PVT.implementation=GPS_L1_CA_PVT ;#nmea_dump_filename: NMEA log path and filename PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; ;#flag_nmea_tty_port: Enable or disable the NMEA log to a serial TTY port (Can be used with real hardware or virtual one) PVT.flag_nmea_tty_port=true; ;#nmea_dump_devname: serial device descriptor for NMEA logging PVT.nmea_dump_devname=/dev/pts/4 ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump=false \endverbatim This implementation allows tuning of the following parameters: \verbatim PVT.averaging_depth=10 ; Number of PVT observations in the moving average algorithm PVT.flag_averaging=true ; Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] PVT.output_rate_ms=100 ; Period in [ms] between two PVT outputs PVT.display_rate_ms=500 ; Position console print (std::out) interval [ms]. PVT.dump=false ; Enable or disable the PVT internal binary data file logging [true] or [false] PVT.dump_filename=./PVT ; Log path and filename without extension. \endverbatim \section license About the software license GNSS-SDR is released under the General Public License (GPL) v3, thus securing practical usability, inspection, and continuous improvement by the research community, allowing the discussion based on tangible code and the analysis of results obtained with real signals. The GPL implies that: \li Copies may be distributed free of charge or for money, but the source code has to be shipped or provided free of charge (or at cost price) on demand. The receiver of the source code has the same rights meaning he can share copies free of charge or resell. \li The licensed material may be analyzed or modified. \li Modified material may be distributed under the same licensing terms but do not have to be distributed. That means that modifications only have to be made available to the public if distribution happens. So it is perfectly fine to take the GNSS-SDR source code, modify it heavily and use it in a not distributed application / library. This is how companies like Google can run their own patched versions of Linux for example. But what this also means is that non-GPL code cannot use GPL code. This means that you cannot modify / use GNSS-SDR, blend it with non-GPL code, and make money with the resulting software. You cannot distribute the resulting software under a non-disclosure agreement or contract. Distributors under the GPL also grant a license for any of their patents practiced by the software, to practice those patents in GPL software. You can sell a device that runs with GNSS-SDR, but if you distribute the code, it has to remain under GPL. \section publications Publications and Credits If you use GNSS-SDR to produce a research paper or Thesis, we would appreciate if you reference any of these articles to credit the GNSS-SDR project: \li \anchor Navitec2012 C. Fernández-Prades, J. Arribas, L. Esteve, D. Pubill, P. Closas, An Open Source Galileo E1 Software Receiver, in Proc. of the 6th ESA Workshop on Satellite Navigation Technologies (NAVITEC 2012), ESTEC, Noordwijk, The Netherlands, Dec. 2012. \li J. Arribas, GNSS Array-based Acquisition: Theory and Implementation, PhD Thesis, Universitat Politècnica de Catalunya, Barcelona, Spain, June 2012. \li C. Fernández-Prades, J. Arribas, P. Closas, C. Avilés, and L. Esteve, GNSS-SDR: an open source tool for researchers and developers, in Proc. of the ION GNSS 2011 Conference, Portland, Oregon, Sept. 19-23, 2011. \li C. Fernández-Prades, C. Avilés, L. Esteve, J. Arribas, and P. Closas, Design patterns for GNSS software receivers, in Proc. of the 5th ESA Workshop on Satellite Navigation Technologies (NAVITEC'2010), ESTEC, Noordwijk, The Netherlands, Dec. 2010. DOI:10.1109/NAVITEC.2010.5707981 For LaTeX users, these are the BibTeX cites for your convenience: \verbatim @INPROCEEDINGS{GNSS-SDR12 author = {C.~{Fern\'{a}ndez--Prades} and J.~Arribas and L.~Esteve and D.~Pubill and P.~Closas}, title = {An Open Source {G}alileo {E1} Software Receiver}, booktitle = {Proc. of the 6th ESA Workshop on Satellite Navigation Technologies (NAVITEC'2012)}, year = {2012}, address = {ESTEC, Noordwijk, The Netherlands}, month = {Dec.} } \endverbatim \verbatim @PHDTHESIS{Arribas12, author = {J.~Arribas}, title = {{GNSS} Array-based Acquisition: Theory and Implementation}, school = {Universitat Polit\`{e}cnica de Catalunya}, year = {2012}, address = {Barcelona, Spain}, month = {June} } \endverbatim \verbatim @INPROCEEDINGS{GNSS-SDR11, AUTHOR = {C.~{Fern\'{a}ndez--Prades} and J.~Arribas and P.~Closas and C.~Avil\'{e}s and L.~Esteve}, TITLE = {{GNSS-SDR}: An Open Source Tool For Researchers and Developers}, BOOKTITLE = {Proc. of the ION GNSS 2011 Conference}, YEAR = {2011}, address = {Portland, Oregon}, month = {Sept.} } \endverbatim \verbatim @INPROCEEDINGS{GNSS-SDR10, AUTHOR = {C.~{Fern\'{a}ndez--Prades} and C.~Avil\'{e}s and L.~Esteve and J.~Arribas and P.~Closas}, TITLE = {Design patterns for {GNSS} software receivers}, BOOKTITLE = {Proc. of the 5th ESA Workshop on Satellite Navigation Technologies (NAVITEC'2010)}, YEAR = {2010}, address = {ESTEC, Noordwijk, The Netherlands}, month = {Dec.}, note = {DOI:10.1109/NAVITEC.2010.5707981} } \endverbatim \section now_what Ok, now what? In order to start using GNSS-SDR, you may want to populate gnss-sdr/data folder (or anywhere else on your system) with raw data files. By "raw data" we mean the output of a Radio Frequency front-end's Analog-to_Digital converter. GNSS-SDR needs signal samples already in baseband or in passband, at a suitable intemediate frequency (on the order of MHz). Prepare your configuration file, and then you are ready for going to the gnss-sdr/install folder, running ./gnss-sdr, and see how the file is processed. Please ask the Developer Team for a signal sample if you need one, and they will do their best ;-) Another interesting option is working in real-time with a RF front-end. We provide drivers for UHD-compatible hardware (see \ref signal_source), for the GN3S v2 USB dongle and for some DVB-T USB dongles. Start with a low number of channels and then increase it in order to test how many channels your processor can handle in real-time. You can find more information at the GNSS-SDR Documentation page or directly asking to the GNSS-SDR Developers mailing list. You are also very welcome to contribute to the project, there are many ways to participate in GNSS-SDR. If you need some special feature not yet implemented, the Developer Team would love to be hired for developing it. Please do not hesitate to contact them. Enjoy GNSS-SDR! The Developer Team. */ gnss-sdr-0.0.9/docs/doxygen/other/reference_docs.dox000066400000000000000000000357711305042567700225160ustar00rootroot00000000000000# Copyright (C) 2012-2013 (see AUTHORS file for a list of contributors) # # 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 . # /*! \page reference_docs Reference Documents \section icd Interface Control Documents \subsection gps GPS All the current GPS Interface Control Documents can be downloaded from GPS.gov, the official U.S. Government webpage for GPS. \li GPS L1 and L2C: Global Positioning System Directorate, Interface Specification IS-GPS-200 Revision H. September, 2013. \li GPS L1C (available with first Block III launch): Global Positioning System Directorate, Interface Specification IS-GPS-800 Revision D. September, 2013. \li GPS L5 (first Block IIF satellite launched on May, 2010): Global Positioning System Directorate, Interface Specification IS-GPS-705 Revision D. September, 2013. \subsection glonass GLONASS Official GLONASS webpage: Information-analytical centre official website. \li Standard Accuracy (ST) signals at L1 and L2: Russian Institute of Space Device Engineering, Global Navigation Satellite System GLONASS. Interface Control Document. Navigational radiosignal in bands L1, L2. Edition 5.1, Moscow, Russia, 2008 \subsection galileo Galileo Check the Galileo website of the European Commission and the Galileo website of the European Space Agency. There is a website with Galileo constellation status information from the International GNSS Service. \li Galileo E5, E6, and E1: European GNSS (Galileo) Open Service. Signal In Space Interface Control Document. Ref: OS SIS ICD, Issue 1.2, European Commission, Nov. 2015. \li European GNSS (Galileo) Open Service Signal-In-Space Operational Status Definition, European Commission, Sept. 2015. The European Commission is granting free access to the technical information on the future Galileo open service signal, i.e. the specifications manufacturers and developers need to process data received from satellites. This document informs receiver manufacturers, application developers and service providers on how to use the future Galileo system and what they can expect in terms of performance. \subsection beidou BeiDou Official webpage at beidou.gov.cn \li BeiDou Navigation Satellite System Signal In Space Interface Control Document. Open Service Signal (Version 2.0). China Satellite Navigation Office, December 2013. \li BeiDou Navigation Satellite System Open Service Performance Standard. (Version 1.0). China Satellite Navigation Office, December 2013. \subsection sbas Satellite Based Augmentation Systems (SBAS) \li Minimum Operational Performance Standards for Global Positioning System/Wide Area Augmentation System Airborne Equipment, DO-229D, RTCA, Washington, DC, Dec. 13, 2006. The 'RTCA MOPS DO229D - appendix A' is the reference standard for WAAS/EGNOS application development. RTCA is an advisory committee of the US federal government, and issues standards for civil airborne equipment, among other duties. One such standard is MOPS 229D (Minimum Operational Performance Standards for Global Positioning System/Wide Area Augmentation System Airborne Equipment version D), which describes the implementation of satellite-based augmentation services (SBAS) for receivers designed for civil aviation use. An annex to DO229D contains the specifications for the SBAS signal and message. The RTCA provides regular updates to these standards. MOPS 229D is available for a fee from the RTCA website. \li Global Positioning System Wide Area Augmentation System (WAAS) Performance Standard, 1st Edition, Department of Transportation and Federal Aviation Administration, Oct. 31, 2008. This document defines the levels of performance the U.S. Government makes available to users of the GPS SPS augmented by the Wide Area Augmentation System. \li EGNOS Open Service (OS) Service Definition Document. Ref: EGN-SDD OS, Revision 2.2, European GNSS Agency (GSA), Feb. 12, 2015. This is a complementary document to the RTCA DO229D, mentioned above. It describes the scope of services provided by the EGNOS Open Service to be used by end-users or Application Specific Service Providers. It details the general conditions relating to the use of the EGNOS service, a technical description of the Signal-in-Space (SIS), the reference receiver, environmental conditions, the service performance achieved and aspects relating to service provision. \li EGNOS Safety of Life Service Definition Document. Ref: EGN-SDD SoL, Revision 3.0, European GNSS Agency (GSA), Sep. 22, 2015. The EGNOS Safety of Life (SoL) Service is provided openly and is freely accessible without any direct charge and is tailored to safety-critical transport applications in various domains, in particular for aviation applications. The service is thus compliant with the aviation APV-I (Approach with Vertical Guidance) requirements, as defined by ICAO in Annex 10, but may support also applications in other SoL domains. \li EGNOS Data Access Service (EDAS) Service Definition Document, Rf: EGN-SDD EDAS, V2.1, European GNSS Agency (GSA), Dec. 19, 2014. More information about EGNOS can be found through the EGNOS Portal. \section standards Other Standards \subsection rinex RINEX The final output of a navigation receiver is usually its position, speed or other related physical quantities. However, the calculation of those quantities are based on a series of measurements from one or more satellite constellations. Although receivers calculate positions in real time, in many cases it is interesting to store intermediate measures for later post-processing. RINEX is the standard format that allows the management and disposal of the measures generated by a receiver, as well as their off-line processing by a multitude of applications. \li The most common version at present is RINEX: The Receiver Independent Exchange Format Version 2.11, which enables storage of measurements from pseudorange, carrier-phase and Doppler systems for GPS or GLONASS, along with data from EGNOS and WAAS satellite based augmentation systems (SBAS). \li The most recent version is RINEX: The Receiver Independent Exchange Format Version 3.01 published in June, 2009. It includes Galileo and improves the handling of multi-constellation data files. \li There is also available the RINEX Extensions to Handle Clock Information, published in September, 2010. \subsection nmea NMEA The National Marine Electronics Association released the NMEA 0183 Interface Standard, which defines electrical signal requirements, data transmission protocol and time, and specific sentence formats for a 4800-baud serial data bus. The standard is available for purchase. \subsection kml KML KML is an XML language focused on geographic visualization, including annotation of maps and images. Geographic visualization includes not only the presentation of graphical data on the globe, but also the control of the user's navigation in the sense of where to go and where to look. Google submitted KML (formerly Keyhole Markup Language) to the Open Geospatial Consortium (OGC) to be evolved within the OGC consensus process with the following goal: KML Version 2.2 has been adopted as an OGC implementation standard. \li Open Geospatial Consortium, Inc., OGC KML Version 2.2.0, April 2008. \subsection cxx C++ Standards In 1998, the C++ standards committee (the ISO/IEC JTC1/SC22/WG21 working group) standardized C++ and published the international standard ISO/IEC 14882:1998 (informally known as C++98). A technical corrigendum was approved in 2003, and the standard was published again as the ISO/IEC 14882:2003. Published ISO and IEC standards can be purchased from a member body of ISO or IEC. Free copies of the C++ standard Committee Drafts were made public before the official standard was released. In 2005, a technical report, called the Library Technical Report 1 (often known as TR1 for short), was released. While not an official part of the standard, it specified a number of extensions to the standard library, which were expected to be included in the next version of C++. The linked document is officially a draft, but that is due only to procedural issues; the content did not change. Scott Meyers provides more TR1 information. Some ISO/IEC standards are publicly available, for instance: ISO/IEC TR 18015:2006 Technical Report on C++ Performance. The standard for the next version of the language (previously known as C++0x) was finally published with the name of C++11 in September, 2011, as the ISO/IEC 14882:2011 Standard. GCC, the GNU Compiler Collection, provides partial C++11 support. Bjarne Stroustrup maintains a C++11 FAQ. \li The most recent public draft of the Standard for Programming Language C++ was published in Feb. 2011. \subsection protocols Positioning protocols in wireless communication networks Cellular industry location standards first appeared in the late 1990s, with the 3rd generation partnership project (3GPP) radio resource location services protocol (RRLP) technical specification 44.031 positioning protocol for GSM networks. Today, RRLP is the de facto standardized protocol to carry GNSS assistance data to GNSS-enabled mobile devices, and the term "3GPP specification" now covers all GSM (including GPRS and EDGE), W-CDMA and LTE (including LTE-A) specifications. Precisely, the label "LTE-A" is applied to networks compliant with LTE Release 10 and beyond, which fulfill the requirements issued by the International Telecommunication Union Radiocommunication Sector (ITU-R) in the global standard for international mobile telecommunications (IMT Advanced, also referred to as 4G) access technologies. Control plane protocols: \li Radio Resource LCS Protocol (RRLP): 3GPP Technical Specification 44.031. \li LTE Positioning Protocol (LPP): 3GPP Technical Specification 36.355. User plane protocols: \li Open Mobile Alliance (OMA), Secure User Plane Location Architecture Version 1 (SUPL 1.0), June 2007. \li Open Mobile Alliance (OMA), Secure User Plane Location Architecture Version 2 (SUPL 2.0), April 2012. LTE Release 9 introduced extension hooks in LPP messages, so that the bodies external to 3GPP could extend the LPP feature set. OMA LPP extensions (LPPe), supported in SUPL 3.0, build on top of the 3GPP LPP reusing its procedures and data types. Check the OMA Location Working Group (WG) webpage for updated information about LPP Extensions (LPPe) Specification. \li The OMA Mobile Location Protocol (MLP) V3.1 is an application-level protocol for getting the position of mobile stations (mobile phones, wireless personal digital assistants, etc.) independent of underlying network technology. The MLP serves as the interface between a Location Server and a Location Services (LCS) Client. This specification defines the core set of operations that a Location Server should be able to perform. */gnss-sdr-0.0.9/docs/doxygen/other/signal_model.dox000066400000000000000000000624571305042567700222060ustar00rootroot00000000000000# Copyright (C) 2012-2013 (see AUTHORS file for a list of contributors) # # 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 . # /*! \page the_signal_model Signal model \section gnss_signal_model GNSS signal model This page describes signals transmitted by GNSS space vehicles. Signal models are mathematical representations of the electromagnetic waves that are exciting the receiver's antenna. The current induced by those waves is then amplified, filtered and downconverted to a suitable frequency (can be at some intermediate frequency or directly to baseband), and then converted to 0s and 1s by the Analog-to-Digital Converter (ADC). That is the job of the Radio Frequency front-end, which at its output delivers a stream of digital samples. Those samples constitute the input of a software receiver, so for GNSS-SDR the signal models described below can be seen as the rules of the game. GNSS' space vehicles are modern versions of lighthouses, but with better visibility. Each satellite is a reference point, and if we know our distance to several reference points, we can compute our location, just as mariners do when they see a couple of lighthouses. For each in-view satellite \f$i\f$ of system \f$s\f$, we can write: \f{equation}{\label{eq:pseudorange} \rho_i = \sqrt{ \left(x^{\text{Tx}}_i - x \right)^2 + \left(y^{\text{Tx}}_i - y \right)^2 + \left(z^{\text{Tx}}_i - z \right)^2}+c\Delta t^{(s)}+\sigma_{e}, \f} where \f$\left(x^{\text{Tx}}_i, y^{\text{Tx}}_i, z^{\text{Tx}}_i\right)\f$ is the satellite's position (known from the navigation message), \f$(x,y,z)\f$ the receiver's position, and \f$\sigma_e\f$ gathers other sources of error. Since the receiver needs to estimate its own 3D position (three spatial unknowns) and its clock deviation with respect to the satellites' time basis, at least \f$3+N_s\f$ satellites must be seen by the receiver at the same time, where \f$N_s\f$ is the number of different navigation systems available (in-view) at a given time. Each received satellite signal, once synchronized and demodulated at the receiver, defines one equation such as the one defined above, forming a set of nonlinear equations that can be solved algebraically by means of the Bancroft algorithm or numerically, resorting to multidimensional Newton-Raphson and weighted least square methods. When a priori information is added we resort to Bayesian estimation, a problem that can be solved recursively by a Kalman filter or any of its variants. The problem can be further expanded by adding other unknowns (for instance, parameters of ionospheric and tropospheric models), sources of information from other systems, mapping information, and even motion models of the receiver. In the design of multi-constellation GNSS receivers, the vector of unknowns can also include the receiver clock offset with respect to each system in order to take advantage of a higher number of in-view satellites and using them jointly in the navigation solution, therefore increasing accuracy. The analytic representation of a signal received from a GNSS satellite can be generically expressed as \f{equation}{\label{eq:analytic} r(t)=\alpha(t) s_{T} \left(t-\tau(t)\right)e^{-j2 \pi f_d(t) }e^{j 2 \pi f_c t}+n(t)~, \f} where \f$\alpha(t)\f$ is the amplitude, \f$s_{T}(t)\f$ is the complex baseband transmitted signal, \f$\tau(t)\f$ is the time-varying delay, \f$f_d(t)=f_c \tau(t)\f$ is the Doppler shift, \f$f_c\f$ is the carrier frequency, and \f$n(t)\f$ is a noise term. These signals arrive to the Earth's surface at extremely low power (e.g. \f$-158.5\f$ dBW for GPS L1 C/A-code, \f$-157\f$ dBW for Galileo E1), well below the noise floor. In order to estimate its distances to satellites, the receiver must correlate time-aligned replicas of the corresponding pseudorandom code with the incoming signal, in a process called despreading that provides processing gain only to the signal of interest. After a coarse and fine estimation stages of the synchronization parameters (usually known as acquisition and tracking, respectively), signal processing output is in form of observables: i) the pseudorange (code) measurement, equivalent to the difference of the time of reception (expressed in the time frame of the receiver) and the time of transmission (expressed in the time frame of the satellite) of a distinct satellite signal; and optionally ii) the carrier-phase measurement, actually being a measurement on the beat frequency between the received carrier of the satellite signal and a receiver-generated reference frequency. Carrier phase measurements are ambiguous, in the sense that the integer number of carrier wavelengths between satellite and the receiver's antenna is unknown. Techniques such as Least-square AMBiguity Decorrelation Approach (LAMBDA) or Multi Carrier Ambiguity Resolution (MCAR) can be applied to resolve such ambiguity and provide an accurate estimation of the distance between the satellite and the receiver. Then, depending on the required accuracy, the navigation solution can range from pseudorange-only, computationally low demanding, and limited accuracy least squares methods to sophisticated combinations of code and phase observables at different frequencies for high demanding applications such as surveying, geodesy, and geophysics. Next sections provide brief descriptions of the space segment of different GNSSs and their broadcast signal structures accessible by civilians. \subsection gps_signal Global Positioning System (GPS) signal in space The Global Positioning System (GPS) is a space-based radio-navigation system owned by the United States Government (USG) and operated by the United States Air Force (USAF). GPS provides positioning and timing services to military and civilian users on a continuous, worldwide basis. Two GPS services are provided: the Precise Positioning Service (PPS), available primarily to the military of the United States and its allies, and the Standard Positioning Service (SPS) open to civilian users. \li GPS L1. Defined at Interface Specification IS-GPS-200 Revision F, this band is centered at \f$f_{\text{GPS L1}}=1575.42\f$ MHz. The complex baseband transmitted signal can be written as \f{equation}{ s^{\text{(GPS L1)}}_{T}(t)=e_{L1I}(t) + j e_{L1Q}(t)~, \f} with \f{align}{ e_{L1I}(t) =& \sum_{l=-\infty}^{\infty} D_{\text{NAV}}\Big[ [l]_{204600}\Big] \oplus C_{\text{P(Y)}}\Big[ |l|_{L_{\text{P(Y)}}} \Big] p(t - lT_{c,\text{P(Y)}})~,\label{eq:L1CAI}\\ e_{L1Q}(t) =& \sum_{l=-\infty}^{\infty} D_{\text{NAV}}\Big[ [l]_{20460} \Big] \oplus C_{\text{C/A}} \Big[ |l|_{1023} \Big] p(t - lT_{c,\text{C/A}})~,\label{eq:L1CA} \f} where \f$\oplus\f$ is the exclusive-or operation (modulo-2 addition), \f$|l|_{L}\f$ means \f$l\f$ modulo \f$L\f$, \f$[l]_{L}\f$ means the integer part of \f$\frac{l}{L}\f$, \f$D_{\text{NAV}}\f$ is the GPS navigation message bit sequence, transmitted at \f$50\f$ bps, \f$T_{c,\text{P(Y)}}=\frac{1}{10.23}\f$ \f$\mu\f$s, \f$T_{c,\text{C/A}}=\frac{1}{1.023}\f$ \f$\mu\f$s, \f$L_{\text{P(Y)}}=6.1871 \cdot 10^{12}\f$, and \f$p(t)\f$ is a rectangular pulse of a chip-period duration centered at \f$t=0\f$ and filtered at the transmitter. According to the chip rate, the binary phase-shift keying modulations in the equations above are denoted as BPSK(10) and BPSK(1), respectively. The precision P codes (named Y codes whenever the anti-spoofing mode is activated, encrypting the code and thus denying non-U.S. military users) are sequences of \f$7\f$ days in length. Regarding the modernization plans for GPS, it is worthwhile to mention that there is a new civilian-use signal planned, called L1C and defined at Interface Specification IS-GPS-800 Revision B, to be broadcast on the same L1 frequency that currently contains the C/A signal. The L1C will be available with first Block III launch, currently scheduled for 2013. The implementation will provide C/A code to ensure backward compatibility. \li GPS L2C. Defined at Interface Specification IS-GPS-200 Revision F, is only available on Block IIR-M and subsequent satellite blocks. Centered at \f$f_{\text{GPS L2}}=1227.60\f$ MHz, the signal structure is the same than in (\ref{eq:GPSL1}), with the precision code in the In-phase component, just as in (\ref{eq:L1CAI}) but with an optional presence of the navigation message \f$D_{\text{NAV}}\f$. For the Quadrature-phase component, three options are defined: \f{align}{ e_{L2CQ}(t) =& \sum_{l=-\infty}^{\infty} D_{\text{CNAV}} \Big[ [l]_{10230} \Big] \oplus \left( C_{\text{CL}} \Big[ |l|_{L_{\text{CL}}} \Big] p_{\text{\tiny{1/2}}} \left( t - lT_{c,L2C} \right) + \right.\\ {} &+ \left. C_{\text{CM}} \Big[ |l|_{L_{\text{CM}}} \Big] p_{\text{\tiny{1/2}}}\left(t - \left(l+\frac{3}{4}\right)T_{c,L2C}\right) \right),\\ e_{L2CQ}(t) =& \sum_{l=-\infty}^{\infty} D_{\text{NAV}} \Big[ [l]_{20460} \Big] \oplus C_{\text{C/A}} \Big[ |l|_{1023} \Big] p \left(t - lT_{c,\text{C/A}}\right) \text{, or}\\ e_{L2CQ}(t)=& \sum_{l=-\infty}^{\infty}C_{\text{C/A}} \Big[ |l|_{1023} \Big] p(t - lT_{c,\text{C/A}})~, \f} where \f$T_{c,L2C}=\frac{1}{511.5}\f$ ms and \f$p_{\text{\tiny{1/2}}}(t)\f$ is a rectangular pulse of half chip-period duration, thus time-multiplexing both codes. The civilian long code \f$C_{\text{CL}}\f$ is \f$L_{\text{CL}}=767250\f$ chips long, repeating every \f$1.5\f$ s, while the civilian moderate code \f$C_{\text{CM}}\f$ is \f$L_{\text{CL}}=10230\f$ chips long and its repeats every \f$20\f$ ms. The CNAV data is an upgraded version of the original NAV navigation message, containing higher precision representation and nominally more accurate data than the NAV data. It is transmitted at \f$25\f$ bps with forward error correction (FEC) encoding, resulting in \f$50\f$ sps. \li GPS L5. The GPS L5 link, defined at Interface Specification IS-GPS-705 Revision B, is only available in Block IIF (first satellite launched on May, 2010) and subsequent satellite blocks. Centered at \f$f_{\text{GPS L5}}=1176.45\f$ MHz, this signal in space can be written as: \f{equation}{ s^{\text{(GPS L5)}}_{T}(t)=e_{L5I}(t) +j e_{L5Q}(t)~, \f} \f{align}{ e_{L5I}(t) =& \sum_{m=-\infty}^{+\infty} C_{nh_{10}} \Big[ |m|_{10}\Big] \oplus \ D_{\text{CNAV}}\Big[ [m]_{10}\Big] \oplus \\ \nonumber {} & \oplus \sum_{l=1}^{102300} C_{L5I}\Big[|l|_{10230}\Big] p(t - m T_{c,nh} - lT_{c,L5}) ~, \\ \nonumber e_{L5Q}(t) =& \sum_{m=-\infty}^{+\infty} C_{nh_{20}} \Big[ |m|_{20}\Big] \oplus \sum_{l=1}^{102300}C_{L5Q}\Big[|l|_{10230}\Big] \cdot \\ {} & \cdot p(t - m T_{c,nh} - lT_{c,L5})~, \f} where \f$T_{c,nh}=1\f$ ms and \f$T_{c,L5}=\frac{1}{10.23}\f$ \f$\mu\f$s, thus defining a BPSK(10) modulation. Both L5I and L5Q contain synchronization sequences. \end{itemize} \subsection glonass_signal GLONASS signal in space The nominal baseline constellation of the Russian Federation's Global Navigation Satellite System (GLONASS) comprises \f$24\f$ GLONASS-M satellites that are uniformly deployed in three roughly circular orbital planes at an inclination of \f$64.8^o\f$ to the equator. The altitude of the orbit is \f$19,100\f$ km. The orbit period of each satellite is \f$11\f$ hours, \f$15\f$ minutes, and \f$45\f$ seconds. The orbital planes are separated by \f$120^o\f$ right ascension of the ascending node. Eight satellites are equally spaced in each plane with \f$45^o\f$ argument of latitude. Moreover, the orbital planes have an argument of latitude displacement of \f$15^o\f$ relative to each other. GLONASS civil signal-in-space is defined at Interface Control Document. Navigational radiosignal in bands L1, L2. Edition 5.1. This system makes use of a frequency-division multiple access (FDMA) signal structure, transmitting in two bands: \f$f^{(k)}_{GLO L1}=1602+k \cdot 0.5625\f$ MHz and \f$f^{(k)}_{GLO L2}=1246+k \cdot 0.4375\f$ MHz, where \f$k\in \left\{ -7,-6,\cdots,5,6\right\}\f$ is the channel number. Satellites in opposite points of an orbit plane transmit signals on equal frequencies, as these satellites will never be in view simultaneously by a ground-based user. \li GLONASS L1. Two kind of signals are transmitted: a standard precision (SP) and an obfuscated high precision (HP) signal. The complex baseband transmitted signal can be written as \f{equation}{ s^{\text{(GLO L1)}}_{T}(t)=e_{L1I}(t) + j e_{L1Q}(t)~, \f} with BPSK(5) and BPSK(0.5) modulations: \f{align}{ e_{L1I}(t) =& \sum_{l=-\infty}^{\infty} D_{\text{GNAV}}\Big[ [l]_{102200}\Big] \oplus C_{\text{HP}} \Big[ |l|_{L_{\text{HP}}} \Big] p(t - lT_{c,\text{HP}})~,\\ e_{L1Q}(t) =& \sum_{l=-\infty}^{\infty} D_{\text{GNAV}}\Big[ [l]_{10220} \Big] \oplus C_{\text{SP}} \Big[ |l|_{511} \Big] p(t - lT_{c,\text{SP}})~, \f} where \f$T_{c,\text{HP}}=\frac{1}{5.11}\f$ \f$\mu\f$s, \f$T_{c,\text{SP}}=\frac{1}{0.511}\f$ \f$\mu\f$s, and \f$L_{\text{HP}}=3.3554\cdot 10^7\f$. The navigation message \f$D_{\text{GNAV}}\f$ is transmitted at \f$50\f$ bps. Details of its content and structure, as well as the generation of the \f$C_{\text{SP}}\f$ code, can be found at the ICD. The usage of the HP signal should be agreed with the Russian Federation Defense Ministry, and no more details have been disclosed. \li GLONASS L2. Beginning with the second generation of satellites, called GLONASS-M and first launched in 2001, a second civil signal is available using the same SP code than the one in the L1 band. The use of FDMA techniques, in which the same code is used to broadcast navigation signals on different frequencies, and the placement of civil GLONASS transmissions on frequencies close to \f$1600\f$ MHz, well above the GPS L1 band, have complicated the design of combined GLONASS/GPS receivers, particularly low-cost equipment for mass-market applications. Future plans of modernization are intended to increase compatibility and interoperability with other GNSS, and include the addition of a code-division multiple access (CDMA) structure, and possibly binary offset carrier (BOC) modulation, beginning with the third civil signal in the L3 band (\f$1197.648 - 1212.255\f$ MHz). Russia is implementing the new signals on the next-generation GLONASS-K satellites, with a first prototype successfully launched into orbit on February 26, 2011. \subsection galileo_signal Galileo signal in space The nominal Galileo constellation comprises a total of \f$27\f$ operational satellites (plus \f$3\f$ active spares), that are evenly distributed among three orbital planes inclined at \f$56^o\f$ relative to the equator. There are nine operational satellites per orbital plane, occupying evenly distributed orbital slots. Three additional spare satellites (one per orbital plane) complement the nominal constellation configuration. The Galileo satellites are placed in quasi-circular Earth orbits with a nominal semi-major axis of about \f$30,000\f$ km and an approximate revolution period of \f$14\f$ hours. The Control segment full infrastructure will be composed of \f$30-40\f$ sensor stations, \f$3\f$ control centers, \f$9\f$ Mission Uplink stations, and \f$5\f$ TT\&C stations. Galileo's Open Service is defined at Signal In Space Interface Control Document. Ref: OS SIS ICD, Issue 1.1, where the following signal structures are specified: \li Galileo E1. This band, centered at \f$f_{\text{Gal E1}}=1575.420\f$ MHz and with a reference bandwidth of \f$24.5520\f$ MHz, uses the so-called composite binary offset carrier CBOC(6,1,\f$\frac{1}{11}\f$) modulation, defined in baseband as: \f{align}{ s^{\text{(Gal E1)}}_{T}(t)=&\frac{1}{\sqrt{2}} \Big( e_{E1B}(t)\left( \alpha sc_A(t)+ \beta sc_B(t) \right)+ \\ {}& - e_{E1C}(t) \left( \alpha sc_A(t)- \beta sc_B(t) \right) \Big)~,\label{eq:CBOC} \f} where the subcarriers \f$sc(t)\f$ are defined as \f{align}{ sc_A(t)=& \; \text{sign}\Big(\sin(2\pi f_{s,E1A}t) \Big)~,\\ sc_B(t)=& \; \text{sign} \Big( \sin( 2 \pi f_{s, E1B}t) \Big)~, \f} and \f$f_{s,E1A}=1.023\f$ MHz, \f$f_{s, E1B}=6.138\f$ MHz are the subcarrier rates, \f$\alpha=\sqrt{\frac{10}{11}}\f$, and \f$\beta=\sqrt{\frac{1}{11}}\f$. Channel B contains the I/NAV type of navigation message, \f$D_{\text{I/NAV}}\f$, intended for Safety-of-Life (SoL) services: \f{align}{ e_{E1B}(t) &= \sum_{l=-\infty}^{+\infty} D_{\text{I/NAV}} \Big[ [l]_{4092}\Big] \oplus C_{E1B}\Big[|l|_{4092}\Big] p(t - lT_{c,E1B}). \f} In case of channel \f$C\f$, it is a pilot (dataless) channel with a secondary code, forming a tiered code: \f{align}{ \nonumber e_{E1C}(t)&= \sum_{m=-\infty}^{+\infty}C_{E1Cs}\Big[|m|_{25}\Big] \oplus \sum_{l=1}^{4092}C_{E1Cp}\Big[ l \Big] \cdot \\ {}& \; \; \cdot p(t-mT_{c,E1Cs}-lT_{c,E1Cp})~,\label{eq:E1C} \f} with \f$T_{c,E1B}=T_{c,E1Cp}=\frac{1}{1.023}\f$ \f$\mu\f$s and \f$T_{c,E1Cs}=4\f$ ms. The \f$C_{E1B}\f$ and \f$C_{E1Cp}\f$ primary codes are pseudorandom memory code sequences defined at Annex C.7 and C.8 of OS SIS ICD. The binary sequence of the secondary code \f$C_{E1Cs}\f$ is 0011100000001010110110010. This band also contains another component, Galileo E1A, intended for the Public Regulated Service (PRS). It uses a BOC(15,2.5) modulation with cosine-shaped subcarrier \f$f_{s,E1A}=15.345\f$ MHz and \f$T_{c, E1A}=\frac{1}{2.5575}\f$ \f$\mu\f$s. The PRS spreading codes and the structure of the navigation message have not been made public. \li Galileo E6. Intended for the Commercial Service and centered at \f$f_{\text{Gal E6}}=1278.750\f$ MHz, this band provides pilot and data components \f{equation}{ s_{T}^{\text{(Gal E6)}}(t) = \frac{1}{\sqrt{2}}\left(e_{E6B}(t)-e_{E6C}(t)\right){~}, \f} \f{align}{ \nonumber e_{E6B}(t) =& \sum_{m=-\infty}^{+\infty} D_{\text{C/NAV}} \Big[ [l]_{5115}\Big] \oplus C_{E6B}\Big[|l|_{L_{E6B}}\Big] \cdot \\ {}& \cdot p(t - lT_{c,E6}),\\ \nonumber e_{E6C}(t) =& \sum_{m=-\infty}^{+\infty}C_{E6Cs}\Big[|m|_{100}\Big] \oplus \sum_{l=1}^{L_{E6C}}C_{E6Cp}\Big[ l \Big] \cdot \\ {}& \cdot p(t-mT_{c,E6s} -lT_{c,E6p}), \f} where \f$D_{\text{C/NAV}}\f$ is the C/NAV navigation data stream, which is modulated with the encrypted ranging code \f$C_{E6B}\f$ with chip period \f$T_{c,E6}=\frac{1}{5.115}\f$ \f$\mu\f$s, thus being a BPSK(5) modulation. Codes \f$C_{E6B}\f$ and primary codes \f$C_{E6Cs}\f$ and their respective lengths, \f$L_{E6B}\f$ and \f$L_{E6C}\f$, have not been published. The secondary codes for the pilot component, \f$C_{E6Cs}\f$, are available at the OS SIS ICD. The receiver reference bandwidth for this signal is \f$40.920\f$ MHz. This band also contains another component, Galileo E6A, intended for PRS. \li Galileo E5. Centered at \f$f_{\text{Gal E5}}=1191.795\f$ MHz and with a total bandwidth of \f$51.150\f$ MHz, its signal structure deserves some analysis. The AltBOC modulation can be generically expressed as \f{equation}{\label{AltBOC} s^{\text{AltBOC}}(t)=x_1(t)v^{*}(t)+x_2(t)v(t)~, \f} where \f$v(t)=\frac{1}{\sqrt{2}}\left( \text{sign}\left( \cos (2 \pi f_s t)\right)+j \text{sign}\left( \sin (2 \pi f_s t)\right)\right)\f$ is the single side-band subcarrier, \f$f_s\f$ is the subcarrier frequency, \f$(\cdot)^{*}\f$ stands for the conjugate operation, and \f$x_1(t)\f$ and \f$x_2(t)\f$ are QPSK signals. The resulting waveform does not exhibit constant envelope. In case of Galileo, the need for high efficiency of the satellites' onboard High Power Amplifier (HPA) has pushed a modification on the signal in order to make it envelope-constant and thus use the HPA at saturation. This can be done by adding some inter-modulation products to the expression above, coming up with the following definition: \f{align}{ \nonumber s^{\text{(Gal E5)}}_{T}(t)= & e_{E5a}(t) ssc_s^{*}(t)+ e_{E5b}(t) ssc_s(t) + \\ {} & +\bar{e}_{E5a}(t)ssc_p^{*}(t)+\bar{e}_{E5b}(t)ssc_p(t)~,\label{GalE5} \f} where the single and product side-band signal subcarriers are \f{align}{ ssc_s(t)=& sc_s(t) +jsc_s\left(t-\frac{T_s}{4}\right) ~,\label{sscs}\\ ssc_p(t)=& sc_p(t) +jsc_p\left(t-\frac{T_s}{4}\right) ~,\label{sscp} \f} and \f{align}{ e_{E5a}(t)=&e_{E5aI}(t)+je_{E5aQ}(t),\label{E5a}\\ e_{E5b}(t)=&e_{E5bI}(t)+je_{E5bQ}(t),\\ \bar{e}_{E5a}(t)&=\bar{e}_{E5aI}(t)+j\bar{e}_{E5aQ}(t),\\ \bar{e}_{E5b}(t)&=\bar{e}_{E5bI}(t)+j\bar{e}_{E5bQ}(t),\\ \bar{e}_{E5aI}(t)=& e_{E5aQ}(t)e_{E5bI}(t)e_{E5bQ}(t),\\ \bar{e}_{E5aQ}(t)=& e_{E5aI}(t)e_{E5bI}(t)e_{E5bQ}(t),\\ \bar{e}_{E5bI}(t)=& e_{E5bQ}(t)e_{E5aI}(t)e_{E5aQ}(t),\\ \bar{e}_{E5bQ}(t)=&e_{E5bI}(t)e_{E5aI}(t)e_{E5aQ}(t). \f} The signal components are defined as \f{align}{ e_{E5aI}(t)=& \sum_{m=-\infty}^{+\infty}C_{E5aIs}\Big[|m|_{20}\Big] \oplus \sum_{l=1}^{10230}C_{E5aIp}\Big[ l \Big] \oplus \\ {}& \oplus D_{\text{F/NAV}} \Big[ [l]_{204600}\Big] p(t-mT_{c,E5s}-lT_{c,E5p}),\\ e_{E5aQ}(t)=& \sum_{m=-\infty}^{+\infty}C_{E5aQs}\Big[|m|_{100}\Big] \oplus \sum_{l=1}^{10230}C_{E5aQp}\Big[ l \Big] \cdot \\ {}& \cdot p(t-mT_{c,E5s}-lT_{c,E5p}),\\ e_{E5bI}(t)=& \sum_{m=-\infty}^{+\infty}C_{E5bIs}\Big[|m|_{4}\Big] \oplus \sum_{l=1}^{10230}C_{E5aIp}\Big[ l \Big] \oplus \\ {}& \oplus D_{\text{I/NAV}} \Big[ [l]_{40920}\Big] p(t-mT_{c,E5s}-lT_{c,E5p}),\\ e_{E5bQ}(t)=& \sum_{m=-\infty}^{+\infty}C_{E5bQs}\Big[|m|_{100}\Big] \oplus \sum_{l=1}^{10230}C_{E5bQp}\Big[ l \Big] \cdot \\ {}& \cdot p(t-mT_{c,E5s}-lT_{c,E5p}), \f} where \f$T_{c,E5s}=1 \f$ ms and \f$T_{c,E5p}=\frac{1}{10.23}\f$ \f$\mu\f$s. Channel A contains the F/NAV type of navigation message, \f$D_{\text{F/NAV}}\f$, intended for the Open Service. The I/NAV message structures for the E5bI and E1B signals use the same page layout. Only page sequencing is different, with page swapping between both components in order to allow a fast reception of data by a dual frequency receiver. The single subcarrier \f$sc_s(t)\f$ and the product subcarrier \f$sc_p(t)\f$ are defined as: \f{align}{ sc_s(t)=& \frac{\sqrt{2}}{4}\text{sign} \left( \cos \left( 2 \pi f_s t - \frac{\pi}{4}\right) \right)+\\ \nonumber {}&+ \frac{1}{2}\text{sign} \Big( \cos \left( 2 \pi f_s t \right) \Big)+\\ {} &+\frac{\sqrt{2}}{4}\text{sign} \left( \cos \left( 2 \pi f_s t + \frac{\pi}{4}\right) \right)~, \f} \f{align}{ sc_p(t)=& -\frac{\sqrt{2}}{4}\text{sign} \left( \cos \left( 2 \pi f_s t - \frac{\pi}{4}\right) \right)+\\ \nonumber {}&+ \frac{1}{2}\text{sign} \Big( \cos \left( 2 \pi f_s t \right) \Big)+\\ {} &-\frac{\sqrt{2}}{4}\text{sign} \left( \cos \left( 2 \pi f_s t + \frac{\pi}{4}\right) \right)~, \f} with a subcarrier frequency of \f$f_s=15.345\f$ MHz, thus defining an AltBOC(15,10) modulation. The QPSK(10) signal \f$e_{E5a}(t)\f$ defined above is shifted to \f$f_{\text{Gal E5a}}\doteq f_{\text{Gal E5}}-f_s=1176.450\f$ MHz, while \f$e_{E5b}(t)\f$ is shifted to \f$f_{\text{Gal E5b}}\doteq f_{\text{Gal E5}}+f_s=1207.140\f$ MHz. Thus, we can bandpass filter around \f$f_{\text{Gal E5a}}\f$ and get a good approximation of a QPSK(10) signal, with very low energy components of \f$e_{E5b}(t)\f$, \f$ \bar{e}_{E5a}(t)\f$, and \f$ \bar{e}_{E5b}(t)\f$: \f{equation}{ s_{T}^{\text{(Gal E5a)}}(t) \simeq e_{E5aI}(t)+je_{E5aQ}(t). \f} The same applies to \f$e_{E5b}(t)\f$, allowing an independent reception of two QPSK(10) signals and thus requiring considerably less bandwidth than the processing of the whole E5 band. \subsection reference_paper Reference This text is an except of the following paper: \li C. Fernández-Prades, L. Lo Presti, E. Falleti, Satellite Radiolocalization From GPS to GNSS and Beyond: Novel Technologies and Applications for Civil Mass-Market. Proceedings of the IEEE. Vol 99, No. 11, pp. 1882-1904. November, 2011. DOI: 10.1109/JPROC.2011.2158032 */gnss-sdr-0.0.9/docs/manpage/000077500000000000000000000000001305042567700156315ustar00rootroot00000000000000gnss-sdr-0.0.9/docs/manpage/front-end-cal-manpage000066400000000000000000000060261305042567700216170ustar00rootroot00000000000000.\" Manpage for front\-end\-cal. .\" Contact javier.arribas@cttc.es to correct errors or typos. .TH front\-end\-cal 1 "15 Dec 2014" "0.0.1" "front\-end\-cal man page" .SH NAME \fBfront\-end\-cal\fR \- RF front\-end center frequency and sampling rate calibration tool. .SH SYNOPSIS \fBfront\-end\-cal \-config_file=\fR\fI\fR [OPTION]... .SH DESCRIPTION \fBfront\-end\-cal\fR is a calibration tool for some DVB\-T receivers based on the Taiwan's Realtek RTL2832U chipset, sold in form of USB dongles that allow users to watch over\-the\-air DVB\-T European broadcast television on their personal computers, to be used as GNSS front\-ends. \.TP Normally, those devices send partially\-decoded MPEG transport frames over the USB, but exploiting an undocumented mode of operation of the demodulator chip, the user is able to obtain raw I&Q samples, stream them through USB to a personal computer and then use \fBgnss\-sdr\fR, turning the DVB\-T receiver into a GNSS receiver and delivering position in real\-time. \.TP The crystal oscillator that ships with the RTL2832U family devices exhibits limited accuracy to be used as a GNSS receiver front\-end without previous calibration. \fBfront\-end\-cal\fR implements the algorithm proposed in [1], and it requires Internet access since it retrieves Assisted GPS data from SUPL servers. \.TP \fBfront\-end\-cal\fR is able to work with raw data files or, if there is computational power enough, in real time with suitable radio frequency front\-ends. The whole receiver is defined in a single configuration file, and therefore users can define theirs. .SH OPTIONS \fBfront\-end\-cal\fR takes the following options: .TP \fB\-config_file=\fR\fI\fR Set the configuration file. .TP \fB\-signal_source=\fR\fI\fR If defined, path to the file containing the signal samples (overrides the data file specified in the configuration file). .TP \fB\-log_dir=\fR\fI\fR If defined, overrides the default directory where logs are saved. .TP \fB\-version\fR Print program version and exit. .TP \fB\-help\fR Print all the available commandline flags and exit. .SH SEE ALSO .BR gnss\-sdr (1), volk_gnsssdr_profile (1) \.TP Example of configuration file available at: ${prefix}/share/gnss\-sdr/conf/front\-end\-cal.conf, where ${prefix}$ uses to be /usr or /usr/local. This will be the configuration file used by default if the \fB\-config_file\fR option is not set. \.TP [1] C. Fernandez\-Prades, J. Arribas, P. Closas, \fITurning a Television into a GNSS Receiver\fR, in Proceedings of ION GNSS+, 15\-16 September 2013, Nashville, Tennessee (USA). A draft copy is freely available at http://www.cttc.es/publication/turning\-a\-television\-into\-a\-gnss\-receiver/ \.TP Check http://gnss\\-sdr.org for more information. .SH BUGS No known bugs. .SH AUTHOR Javier Arribas (javier.arribas@cttc.es) \.TP This software has been developed at CTTC (Centre Tecnologic de Telecomunicacions de Catalunya, http://www.cttc.es) with contributions from around the world.gnss-sdr-0.0.9/docs/manpage/gnss-sdr-manpage000066400000000000000000000041531305042567700207250ustar00rootroot00000000000000.\" Manpage for gnss\-sdr. .\" Contact carles.fernandez@cttc.es to correct errors or typos. .TH gnss\-sdr 1 "05 Feb 2017" "0.0.9" "gnss\-sdr man page" .SH NAME \fBgnss\-sdr\fR \- GNSS Software Defined Receiver. .SH SYNOPSIS \fBgnss\-sdr \-config_file=\fR\fI\fR [OPTION]... .SH DESCRIPTION \fBgnss\-sdr\fR is a Global Navigation Satellite Systems Software Defined Receiver written in C++. It implements all the signal processing chain, taking as input raw samples coming from the output of an Analog\-to\-Digital Converter, and processing them up to the computation of the Position\-Velocity\-Time solution, including the generation of code and phase measurements. \.TP \fBgnss\-sdr\fR is able to work with raw data files or, if there is computational power enough, in real time with suitable radio frequency front\-ends. The whole receiver is defined in a single configuration file, and therefore users can define theirs. .SH OPTIONS \fBgnss\-sdr\fR takes the following options: .TP \fB\-config_file=\fR\fI\fR Set the configuration file. .TP \fB\-signal_source=\fR\fI\fR If defined, path to the file containing the signal samples (overrides the data file specified in the configuration file). .TP \fB\-log_dir=\fR\fI\fR If defined, overrides the default directory where logs are saved. .TP \fB\-RINEX_version=\fI\fR Specifies the RINEX version (2.11 or 3.02). Default: "3.02". .TP \fB\-version\fR Print program version and exit. .TP \fB\-help\fR Print all the available commandline flags and exit. .SH SEE ALSO .BR volk_gnsssdr_profile (1) \.TP Examples of configuration files available at: ${prefix}/share/gnss\-sdr/conf, where ${prefix} uses to be /usr or /usr/local. \.TP Check http://gnss\-sdr.org for more information. .SH BUGS Please report bugs at https://github.com/gnss-sdr/gnss-sdr/issues .SH AUTHOR Carles Fernandez\-Prades (carles.fernandez@cttc.es) \.TP This software package has been developed at CTTC (Centre Tecnologic de Telecomunicacions de Catalunya, http://www.cttc.es) with contributions from around the world.gnss-sdr-0.0.9/install/000077500000000000000000000000001305042567700147375ustar00rootroot00000000000000gnss-sdr-0.0.9/install/.gitignore000066400000000000000000000001061305042567700167240ustar00rootroot00000000000000# Ignore everything in this directory * # Except this file !.gitignoregnss-sdr-0.0.9/src/000077500000000000000000000000001305042567700140605ustar00rootroot00000000000000gnss-sdr-0.0.9/src/CMakeLists.txt000066400000000000000000000017021305042567700166200ustar00rootroot00000000000000# Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) # # 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 . # add_subdirectory(algorithms) add_subdirectory(core) add_subdirectory(main) if(ENABLE_UNIT_TESTING OR ENABLE_SYSTEM_TESTING) add_subdirectory(tests) endif(ENABLE_UNIT_TESTING OR ENABLE_SYSTEM_TESTING) add_subdirectory(utils) gnss-sdr-0.0.9/src/algorithms/000077500000000000000000000000001305042567700162315ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/CMakeLists.txt000066400000000000000000000021401305042567700207660ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # add_subdirectory(acquisition) add_subdirectory(channel) add_subdirectory(libs) add_subdirectory(conditioner) add_subdirectory(data_type_adapter) add_subdirectory(observables) add_subdirectory(telemetry_decoder) add_subdirectory(resampler) add_subdirectory(signal_generator) add_subdirectory(signal_source) add_subdirectory(input_filter) add_subdirectory(tracking) add_subdirectory(PVT) gnss-sdr-0.0.9/src/algorithms/PVT/000077500000000000000000000000001305042567700167025ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/PVT/CMakeLists.txt000066400000000000000000000014621305042567700214450ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # add_subdirectory(adapters) add_subdirectory(gnuradio_blocks) add_subdirectory(libs) gnss-sdr-0.0.9/src/algorithms/PVT/adapters/000077500000000000000000000000001305042567700205055ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/PVT/adapters/CMakeLists.txt000066400000000000000000000030341305042567700232450ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # set(PVT_ADAPTER_SOURCES gps_l1_ca_pvt.cc galileo_e1_pvt.cc hybrid_pvt.cc ) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/interfaces ${CMAKE_SOURCE_DIR}/src/core/receiver ${CMAKE_SOURCE_DIR}/src/algorithms/PVT/gnuradio_blocks ${CMAKE_SOURCE_DIR}/src/algorithms/PVT/libs ${ARMADILLO_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ) file(GLOB PVT_ADAPTER_HEADERS "*.h") list(SORT PVT_ADAPTER_HEADERS) add_library(pvt_adapters ${PVT_ADAPTER_SOURCES} ${PVT_ADAPTER_HEADERS}) source_group(Headers FILES ${PVT_ADAPTER_HEADERS}) target_link_libraries(pvt_adapters pvt_gr_blocks ${ARMADILLO_LIBRARIES} ${GNURADIO_RUNTIME_LIBRARIES}) gnss-sdr-0.0.9/src/algorithms/PVT/adapters/galileo_e1_pvt.cc000066400000000000000000000115731305042567700237150ustar00rootroot00000000000000/*! * \file galileo_e1_pvt.cc * \brief Implementation of an adapter of a GALILEO E1 PVT solver block to a * PvtInterface * \author Javier Arribas, 2011. jarribas(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_e1_pvt.h" #include #include #include "configuration_interface.h" using google::LogMessage; GalileoE1Pvt::GalileoE1Pvt(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { // dump parameters std::string default_dump_filename = "./pvt.dat"; std::string default_nmea_dump_filename = "./nmea_pvt.nmea"; std::string default_nmea_dump_devname = "/dev/tty1"; std::string default_rtcm_dump_devname = "/dev/pts/1"; DLOG(INFO) << "role " << role; dump_ = configuration->property(role + ".dump", false); dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename); // moving average depth parameters int averaging_depth = configuration->property(role + ".averaging_depth", 10); bool flag_averaging = configuration->property(role + ".flag_averaging", false); // output rate int output_rate_ms = configuration->property(role + ".output_rate_ms", 500); // display rate int display_rate_ms = configuration->property(role + ".display_rate_ms", 500); // NMEA Printer settings bool flag_nmea_tty_port = configuration->property(role + ".flag_nmea_tty_port", false); std::string nmea_dump_filename = configuration->property(role + ".nmea_dump_filename", default_nmea_dump_filename); std::string nmea_dump_devname = configuration->property(role + ".nmea_dump_devname", default_nmea_dump_devname); // RTCM Printer settings bool flag_rtcm_tty_port = configuration->property(role + ".flag_rtcm_tty_port", false); std::string rtcm_dump_devname = configuration->property(role + ".rtcm_dump_devname", default_rtcm_dump_devname); bool flag_rtcm_server = configuration->property(role + ".flag_rtcm_server", false); unsigned short rtcm_tcp_port = configuration->property(role + ".rtcm_tcp_port", 2101); unsigned short rtcm_station_id = configuration->property(role + ".rtcm_station_id", 1234); // RTCM message rates: least common multiple with output_rate_ms int rtcm_MT1045_rate_ms = boost::math::lcm(configuration->property(role + ".rtcm_MT1045_rate_ms", 5000), output_rate_ms); int rtcm_MSM_rate_ms = boost::math::lcm(configuration->property(role + ".rtcm_MSM_rate_ms", 1000), output_rate_ms); std::map rtcm_msg_rate_ms; rtcm_msg_rate_ms[1045] = rtcm_MT1045_rate_ms; for (int k = 1091; k < 1098; k++) // All Galileo MSM { rtcm_msg_rate_ms[k] = rtcm_MSM_rate_ms; } // make PVT object pvt_ = galileo_e1_make_pvt_cc(in_streams_, dump_, dump_filename_, averaging_depth, flag_averaging, output_rate_ms, display_rate_ms, flag_nmea_tty_port, nmea_dump_filename, nmea_dump_devname, flag_rtcm_server, flag_rtcm_tty_port, rtcm_tcp_port, rtcm_station_id, rtcm_msg_rate_ms, rtcm_dump_devname); DLOG(INFO) << "pvt(" << pvt_->unique_id() << ")"; } GalileoE1Pvt::~GalileoE1Pvt() {} void GalileoE1Pvt::connect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to connect internally DLOG(INFO) << "nothing to connect internally"; } void GalileoE1Pvt::disconnect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to disconnect } gr::basic_block_sptr GalileoE1Pvt::get_left_block() { return pvt_; } gr::basic_block_sptr GalileoE1Pvt::get_right_block() { return pvt_; } gnss-sdr-0.0.9/src/algorithms/PVT/adapters/galileo_e1_pvt.h000066400000000000000000000046341305042567700235570ustar00rootroot00000000000000/*! * \file galileo_e1_pvt.h * \brief Interface of an adapter of a GALILEO E1 PVT solver block to a * PvtInterface. * \author Javier Arribas, 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_E1_PVT_H_ #define GNSS_SDR_GALILEO_E1_PVT_H_ #include #include "pvt_interface.h" #include "galileo_e1_pvt_cc.h" class ConfigurationInterface; /*! * \brief This class implements a PvtInterface for Galileo E1 */ class GalileoE1Pvt : public PvtInterface { public: GalileoE1Pvt(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GalileoE1Pvt(); std::string role() { return role_; } //! Returns "GALILEO_E1_PVT" std::string implementation() { return "GALILEO_E1_PVT"; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); void reset() { return; } //! All blocks must have an item_size() function implementation. Returns sizeof(gr_complex) size_t item_size() { return sizeof(gr_complex); } private: galileo_e1_pvt_cc_sptr pvt_; bool dump_; //unsigned int fs_in_; std::string dump_filename_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; }; #endif gnss-sdr-0.0.9/src/algorithms/PVT/adapters/gps_l1_ca_pvt.cc000066400000000000000000000240711305042567700235410ustar00rootroot00000000000000/*! * \file gps_l1_ca_pvt.cc * \brief Implementation of an adapter of a GPS L1 C/A PVT solver block to a * PvtInterface * \author Javier Arribas, 2011. jarribas(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l1_ca_pvt.h" #include #include #include #include #include #include "configuration_interface.h" using google::LogMessage; GpsL1CaPvt::GpsL1CaPvt(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { // dump parameters std::string default_dump_filename = "./pvt.dat"; std::string default_nmea_dump_filename = "./nmea_pvt.nmea"; std::string default_nmea_dump_devname = "/dev/tty1"; std::string default_rtcm_dump_devname = "/dev/pts/1"; DLOG(INFO) << "role " << role; dump_ = configuration->property(role + ".dump", false); dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename); // moving average depth parameters int averaging_depth = configuration->property(role + ".averaging_depth", 10); bool flag_averaging = configuration->property(role + ".flag_averaging", false); // output rate int output_rate_ms = configuration->property(role + ".output_rate_ms", 500); // display rate int display_rate_ms = configuration->property(role + ".display_rate_ms", 500); // NMEA Printer settings bool flag_nmea_tty_port = configuration->property(role + ".flag_nmea_tty_port", false); std::string nmea_dump_filename = configuration->property(role + ".nmea_dump_filename", default_nmea_dump_filename); std::string nmea_dump_devname = configuration->property(role + ".nmea_dump_devname", default_nmea_dump_devname); // RTCM Printer settings bool flag_rtcm_tty_port = configuration->property(role + ".flag_rtcm_tty_port", false); std::string rtcm_dump_devname = configuration->property(role + ".rtcm_dump_devname", default_rtcm_dump_devname); bool flag_rtcm_server = configuration->property(role + ".flag_rtcm_server", false); unsigned short rtcm_tcp_port = configuration->property(role + ".rtcm_tcp_port", 2101); unsigned short rtcm_station_id = configuration->property(role + ".rtcm_station_id", 1234); // RTCM message rates: least common multiple with output_rate_ms int rtcm_MT1019_rate_ms = boost::math::lcm(configuration->property(role + ".rtcm_MT1019_rate_ms", 5000), output_rate_ms); int rtcm_MSM_rate_ms = boost::math::lcm(configuration->property(role + ".rtcm_MSM_rate_ms", 1000), output_rate_ms); std::map rtcm_msg_rate_ms; rtcm_msg_rate_ms[1019] = rtcm_MT1019_rate_ms; for (int k = 1071; k < 1078; k++) // All GPS MSM { rtcm_msg_rate_ms[k] = rtcm_MSM_rate_ms; } // getting names from the config file, if available // default filename for assistance data const std::string eph_default_xml_filename = "./gps_ephemeris.xml"; eph_xml_filename_= configuration->property("GNSS-SDR.SUPL_gps_ephemeris_xml", eph_default_xml_filename); //const std::string utc_default_xml_filename = "./gps_utc_model.xml"; //const std::string iono_default_xml_filename = "./gps_iono.xml"; //const std::string ref_time_default_xml_filename = "./gps_ref_time.xml"; //const std::string ref_location_default_xml_filename = "./gps_ref_location.xml"; //std::string utc_xml_filename = configuration_->property("GNSS-SDR.SUPL_gps_utc_model.xml", utc_default_xml_filename); //std::string iono_xml_filename = configuration_->property("GNSS-SDR.SUPL_gps_iono_xml", iono_default_xml_filename); //std::string ref_time_xml_filename = configuration_->property("GNSS-SDR.SUPL_gps_ref_time_xml", ref_time_default_xml_filename); //std::string ref_location_xml_filename = configuration_->property("GNSS-SDR.SUPL_gps_ref_location_xml", ref_location_default_xml_filename); // RINEX version int conf_rinex_version; conf_rinex_version = configuration->property(role + ".rinex_version", 0); // make PVT object pvt_ = gps_l1_ca_make_pvt_cc(in_streams_, dump_, dump_filename_, averaging_depth, flag_averaging, output_rate_ms, display_rate_ms, flag_nmea_tty_port, nmea_dump_filename, nmea_dump_devname, flag_rtcm_server, flag_rtcm_tty_port, rtcm_tcp_port, rtcm_station_id, rtcm_msg_rate_ms, rtcm_dump_devname, conf_rinex_version ); DLOG(INFO) << "pvt(" << pvt_->unique_id() << ")"; } bool GpsL1CaPvt::save_assistance_to_XML() { // return variable (true == succeeded) bool ret = false; LOG(INFO) << "SUPL: Try to save GPS ephemeris to XML file " << eph_xml_filename_; std::map eph_map = pvt_->get_GPS_L1_ephemeris_map(); if (eph_map.size() > 0) { try { std::ofstream ofs(eph_xml_filename_.c_str(), std::ofstream::trunc | std::ofstream::out); boost::archive::xml_oarchive xml(ofs); xml << boost::serialization::make_nvp("GNSS-SDR_ephemeris_map", eph_map); ofs.close(); LOG(INFO) << "Saved GPS L1 Ephemeris map data"; } catch (std::exception& e) { LOG(WARNING) << e.what(); return false; } return true; } else { LOG(WARNING) << "Failed to save Ephemeris, map is empty"; return false; } // Only try to save {utc, iono, ref time, ref location} if SUPL is enabled // bool enable_gps_supl_assistance = configuration_->property("GNSS-SDR.SUPL_gps_enabled", false); // if (enable_gps_supl_assistance == true) // { // // try to save utc model xml file // std::map utc_copy = global_gps_utc_model_map.get_map_copy(); // if (supl_client_acquisition_.save_utc_map_xml(utc_xml_filename, utc_copy) == true) // { // LOG(INFO) << "SUPL: Successfully saved UTC Model XML file"; // //ret = true; // } // else // { // LOG(INFO) << "SUPL: Error while trying to save utc XML file"; // //ret = false; // } // // try to save iono model xml file // std::map iono_copy = global_gps_iono_map.get_map_copy(); // if (supl_client_acquisition_.save_iono_map_xml(iono_xml_filename, iono_copy) == true) // { // LOG(INFO) << "SUPL: Successfully saved IONO Model XML file"; // //ret = true; // } // else // { // LOG(INFO) << "SUPL: Error while trying to save iono XML file"; // //ret = false; // } // // try to save ref time xml file // std::map ref_time_copy = global_gps_ref_time_map.get_map_copy(); // if (supl_client_acquisition_.save_ref_time_map_xml(ref_time_xml_filename, ref_time_copy) == true) // { // LOG(INFO) << "SUPL: Successfully saved Ref Time XML file"; // //ret = true; // } // else // { // LOG(INFO) << "SUPL: Error while trying to save ref time XML file"; // //ref = false; // } // // try to save ref location xml file // std::map ref_location_copy = global_gps_ref_location_map.get_map_copy(); // if (supl_client_acquisition_.save_ref_location_map_xml(ref_location_xml_filename, ref_location_copy) == true) // { // LOG(INFO) << "SUPL: Successfully saved Ref Location XML file"; // //ref = true; // } // else // { // LOG(INFO) << "SUPL: Error while trying to save ref location XML file"; // //ret = false; // } // } return ret; } GpsL1CaPvt::~GpsL1CaPvt() { save_assistance_to_XML(); } void GpsL1CaPvt::connect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to connect internally DLOG(INFO) << "nothing to connect internally"; } void GpsL1CaPvt::disconnect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to disconnect } gr::basic_block_sptr GpsL1CaPvt::get_left_block() { return pvt_; } gr::basic_block_sptr GpsL1CaPvt::get_right_block() { return pvt_; } gnss-sdr-0.0.9/src/algorithms/PVT/adapters/gps_l1_ca_pvt.h000066400000000000000000000047371305042567700234120ustar00rootroot00000000000000/*! * \file gps_l1_ca_pvt.h * \brief Interface of an adapter of a GPS L1 C/A PVT solver block to a * PvtInterface * Position Velocity and Time * \author Javier Arribas, 2011. jarribas(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L1_CA_PVT_H_ #define GNSS_SDR_GPS_L1_CA_PVT_H_ #include #include "pvt_interface.h" #include "gps_l1_ca_pvt_cc.h" class ConfigurationInterface; /*! * \brief This class implements a PvtInterface for GPS L1 C/A */ class GpsL1CaPvt : public PvtInterface { public: GpsL1CaPvt(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GpsL1CaPvt(); std::string role() { return role_; } //! Returns "GPS_L1_CA_PVT" std::string implementation() { return "GPS_L1_CA_PVT"; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); void reset() { return; } //! All blocks must have an item_size() function implementation. Returns sizeof(gr_complex) size_t item_size() { return sizeof(gr_complex); } private: gps_l1_ca_pvt_cc_sptr pvt_; bool dump_; std::string dump_filename_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; std::string eph_xml_filename_; bool save_assistance_to_XML(); }; #endif gnss-sdr-0.0.9/src/algorithms/PVT/adapters/hybrid_pvt.cc000066400000000000000000000275701305042567700232010ustar00rootroot00000000000000/*! * \file hybrid_pvt.cc * \brief Implementation of an adapter of a GALILEO E1 PVT solver block to a * PvtInterface * \author Javier Arribas, 2011. jarribas(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "hybrid_pvt.h" #include #include #include #include #include #include "configuration_interface.h" using google::LogMessage; HybridPvt::HybridPvt(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { // dump parameters std::string default_dump_filename = "./pvt.dat"; std::string default_nmea_dump_filename = "./nmea_pvt.nmea"; std::string default_nmea_dump_devname = "/dev/tty1"; std::string default_rtcm_dump_devname = "/dev/pts/1"; DLOG(INFO) << "role " << role; dump_ = configuration->property(role + ".dump", false); dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename); // moving average depth parameters int averaging_depth = configuration->property(role + ".averaging_depth", 10); bool flag_averaging = configuration->property(role + ".flag_averaging", false); // output rate int output_rate_ms = configuration->property(role + ".output_rate_ms", 500); // display rate int display_rate_ms = configuration->property(role + ".display_rate_ms", 500); // NMEA Printer settings bool flag_nmea_tty_port = configuration->property(role + ".flag_nmea_tty_port", false); std::string nmea_dump_filename = configuration->property(role + ".nmea_dump_filename", default_nmea_dump_filename); std::string nmea_dump_devname = configuration->property(role + ".nmea_dump_devname", default_nmea_dump_devname); // RTCM Printer settings bool flag_rtcm_tty_port = configuration->property(role + ".flag_rtcm_tty_port", false); std::string rtcm_dump_devname = configuration->property(role + ".rtcm_dump_devname", default_rtcm_dump_devname); bool flag_rtcm_server = configuration->property(role + ".flag_rtcm_server", false); unsigned short rtcm_tcp_port = configuration->property(role + ".rtcm_tcp_port", 2101); unsigned short rtcm_station_id = configuration->property(role + ".rtcm_station_id", 1234); // RTCM message rates: least common multiple with output_rate_ms int rtcm_MT1019_rate_ms = boost::math::lcm(configuration->property(role + ".rtcm_MT1019_rate_ms", 5000), output_rate_ms); int rtcm_MT1045_rate_ms = boost::math::lcm(configuration->property(role + ".rtcm_MT1045_rate_ms", 5000), output_rate_ms); int rtcm_MSM_rate_ms = boost::math::lcm(configuration->property(role + ".rtcm_MSM_rate_ms", 1000), output_rate_ms); int rtcm_MT1077_rate_ms = boost::math::lcm(configuration->property(role + ".rtcm_MT1077_rate_ms", rtcm_MSM_rate_ms), output_rate_ms); int rtcm_MT1097_rate_ms = boost::math::lcm(configuration->property(role + ".rtcm_MT1097_rate_ms", rtcm_MSM_rate_ms), output_rate_ms); std::map rtcm_msg_rate_ms; rtcm_msg_rate_ms[1019] = rtcm_MT1019_rate_ms; rtcm_msg_rate_ms[1045] = rtcm_MT1045_rate_ms; for (int k = 1071; k < 1078; k++) // All GPS MSM { rtcm_msg_rate_ms[k] = rtcm_MT1077_rate_ms; } for (int k = 1091; k < 1098; k++) // All Galileo MSM { rtcm_msg_rate_ms[k] = rtcm_MT1097_rate_ms; } // getting names from the config file, if available // default filename for assistance data const std::string eph_default_xml_filename = "./gps_ephemeris.xml"; const std::string utc_default_xml_filename = "./gps_utc_model.xml"; const std::string iono_default_xml_filename = "./gps_iono.xml"; const std::string ref_time_default_xml_filename = "./gps_ref_time.xml"; const std::string ref_location_default_xml_filename = "./gps_ref_location.xml"; eph_xml_filename_ = configuration->property("GNSS-SDR.SUPL_gps_ephemeris_xml", eph_default_xml_filename); //std::string utc_xml_filename = configuration_->property("GNSS-SDR.SUPL_gps_utc_model.xml", utc_default_xml_filename); //std::string iono_xml_filename = configuration_->property("GNSS-SDR.SUPL_gps_iono_xml", iono_default_xml_filename); //std::string ref_time_xml_filename = configuration_->property("GNSS-SDR.SUPL_gps_ref_time_xml", ref_time_default_xml_filename); //std::string ref_location_xml_filename = configuration_->property("GNSS-SDR.SUPL_gps_ref_location_xml", ref_location_default_xml_filename); // Infer the type of receiver /* * TYPE | RECEIVER * 0 | Unknown * 1 | GPS L1 C/A * 2 | GPS L2C * 3 | GPS L5 * 4 | Galileo E1B * 5 | Galileo E5a * 6 | Galileo E5b * 7 | GPS L1 C/A + GPS L2C * 8 | GPS L1 C/A + GPS L5 * 9 | GPS L1 C/A + Galileo E1B * 10 | GPS L1 C/A + Galileo E5a * 11 | GPS L1 C/A + Galileo E5b * 12 | Galileo E1B + GPS L2C * 13 | Galileo E1B + GPS L5 * 14 | Galileo E1B + Galileo E5a * 15 | Galileo E1B + Galileo E5b * 16 | GPS L2C + GPS L5 * 17 | GPS L2C + Galileo E5a * 18 | GPS L2C + Galileo E5b * 19 | GPS L5 + Galileo E5a * 20 | GPS L5 + Galileo E5b * 21 | GPS L1 C/A + Galileo E1B + GPS L2C * 22 | GPS L1 C/A + Galileo E1B + GPS L5 */ int gps_1C_count = configuration->property("Channels_1C.count", 0); int gps_2S_count = configuration->property("Channels_2S.count", 0); int gal_1B_count = configuration->property("Channels_1B.count", 0); int gal_E5a_count = configuration->property("Channels_5X.count", 0); // GPS L5 or Galileo E5a ? int gal_E5b_count = configuration->property("Channels_7X.count", 0); unsigned int type_of_receiver = 0; if( (gps_1C_count != 0) && (gps_2S_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) type_of_receiver = 1; if( (gps_1C_count == 0) && (gps_2S_count != 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) type_of_receiver = 2; if( (gps_1C_count == 0) && (gps_2S_count == 0) && (gal_1B_count != 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) type_of_receiver = 4; if( (gps_1C_count == 0) && (gps_2S_count == 0) && (gal_1B_count == 0) && (gal_E5a_count != 0) && (gal_E5b_count == 0)) type_of_receiver = 5; if( (gps_1C_count == 0) && (gps_2S_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count != 0)) type_of_receiver = 6; if( (gps_1C_count != 0) && (gps_2S_count != 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) type_of_receiver = 7; //if( (gps_1C_count != 0) && (gps_2S_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) type_of_receiver = 8; if( (gps_1C_count != 0) && (gps_2S_count == 0) && (gal_1B_count != 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) type_of_receiver = 9; if( (gps_1C_count != 0) && (gps_2S_count == 0) && (gal_1B_count == 0) && (gal_E5a_count != 0) && (gal_E5b_count == 0)) type_of_receiver = 10; if( (gps_1C_count != 0) && (gps_2S_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count != 0)) type_of_receiver = 11; if( (gps_1C_count == 0) && (gps_2S_count != 0) && (gal_1B_count != 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) type_of_receiver = 12; //if( (gps_1C_count == 0) && (gps_2S_count == 0) && (gal_1B_count != 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) type_of_receiver = 13; if( (gps_1C_count == 0) && (gps_2S_count == 0) && (gal_1B_count != 0) && (gal_E5a_count != 0) && (gal_E5b_count == 0)) type_of_receiver = 14; if( (gps_1C_count == 0) && (gps_2S_count == 0) && (gal_1B_count != 0) && (gal_E5a_count == 0) && (gal_E5b_count != 0)) type_of_receiver = 15; //if( (gps_1C_count == 0) && (gps_2S_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) type_of_receiver = 16; if( (gps_1C_count == 0) && (gps_2S_count != 0) && (gal_1B_count == 0) && (gal_E5a_count != 0) && (gal_E5b_count == 0)) type_of_receiver = 17; if( (gps_1C_count == 0) && (gps_2S_count != 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count != 0)) type_of_receiver = 18; //if( (gps_1C_count == 0) && (gps_2S_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) type_of_receiver = 19; //if( (gps_1C_count == 0) && (gps_2S_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) type_of_receiver = 20; if( (gps_1C_count != 0) && (gps_2S_count != 0) && (gal_1B_count != 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) type_of_receiver = 21; //if( (gps_1C_count == 0) && (gps_2S_count == 0) && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count = 0)) type_of_receiver = 22; // make PVT object pvt_ = hybrid_make_pvt_cc(in_streams_, dump_, dump_filename_, averaging_depth, flag_averaging, output_rate_ms, display_rate_ms, flag_nmea_tty_port, nmea_dump_filename, nmea_dump_devname, flag_rtcm_server, flag_rtcm_tty_port, rtcm_tcp_port, rtcm_station_id, rtcm_msg_rate_ms, rtcm_dump_devname, type_of_receiver); DLOG(INFO) << "pvt(" << pvt_->unique_id() << ")"; } bool HybridPvt::save_assistance_to_XML() { LOG(INFO) << "SUPL: Try to save GPS ephemeris to XML file " << eph_xml_filename_; std::map eph_map = pvt_->get_GPS_L1_ephemeris_map(); if (eph_map.size() > 0) { try { std::ofstream ofs(eph_xml_filename_.c_str(), std::ofstream::trunc | std::ofstream::out); boost::archive::xml_oarchive xml(ofs); xml << boost::serialization::make_nvp("GNSS-SDR_ephemeris_map", eph_map); ofs.close(); LOG(INFO) << "Saved GPS L1 Ephemeris map data"; } catch (std::exception& e) { LOG(WARNING) << e.what(); return false; } return true; // return variable (true == succeeded) } else { LOG(WARNING) << "Failed to save Ephemeris, map is empty"; return false; } } HybridPvt::~HybridPvt() { save_assistance_to_XML(); } void HybridPvt::connect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to connect internally DLOG(INFO) << "nothing to connect internally"; } void HybridPvt::disconnect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to disconnect } gr::basic_block_sptr HybridPvt::get_left_block() { return pvt_; } gr::basic_block_sptr HybridPvt::get_right_block() { return pvt_; // this is a sink, nothing downstream } gnss-sdr-0.0.9/src/algorithms/PVT/adapters/hybrid_pvt.h000066400000000000000000000046471305042567700230430ustar00rootroot00000000000000/*! * \file hybrid_pvt.h * \brief Interface of an adapter of a GALILEO E1 PVT solver block to a * PvtInterface. * \author Javier Arribas, 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_HYBRID_PVT_H_ #define GNSS_SDR_HYBRID_PVT_H_ #include #include "pvt_interface.h" #include "hybrid_pvt_cc.h" class ConfigurationInterface; /*! * \brief This class implements a PvtInterface for Galileo E1 */ class HybridPvt : public PvtInterface { public: HybridPvt(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~HybridPvt(); std::string role() { return role_; } //! Returns "Hybrid_Pvt" std::string implementation() { return "Hybrid_PVT"; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); void reset() { return; } //! All blocks must have an item_size() function implementation. Returns sizeof(gr_complex) size_t item_size() { return sizeof(gr_complex); } private: hybrid_pvt_cc_sptr pvt_; bool dump_; std::string dump_filename_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; std::string eph_xml_filename_; bool save_assistance_to_XML(); }; #endif gnss-sdr-0.0.9/src/algorithms/PVT/gnuradio_blocks/000077500000000000000000000000001305042567700220475ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/PVT/gnuradio_blocks/CMakeLists.txt000066400000000000000000000027231305042567700246130ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # set(PVT_GR_BLOCKS_SOURCES gps_l1_ca_pvt_cc.cc galileo_e1_pvt_cc.cc hybrid_pvt_cc.cc ) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/interfaces ${CMAKE_SOURCE_DIR}/src/core/receiver ${CMAKE_SOURCE_DIR}/src/algorithms/PVT/libs ${ARMADILLO_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ) file(GLOB PVT_GR_BLOCKS_HEADERS "*.h") list(SORT PVT_GR_BLOCKS_HEADERS) add_library(pvt_gr_blocks ${PVT_GR_BLOCKS_SOURCES} ${PVT_GR_BLOCKS_HEADERS}) source_group(Headers FILES ${PVT_GR_BLOCKS_HEADERS}) target_link_libraries(pvt_gr_blocks pvt_lib ${ARMADILLO_LIBRARIES}) gnss-sdr-0.0.9/src/algorithms/PVT/gnuradio_blocks/galileo_e1_pvt_cc.cc000066400000000000000000000525251305042567700257260ustar00rootroot00000000000000/*! * \file galileo_e1_pvt_cc.cc * \brief Implementation of a Position Velocity and Time computation block for GPS L1 C/A * \author Javier Arribas, 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_e1_pvt_cc.h" #include #include #include #include #include #include #include #include #include "concurrent_map.h" using google::LogMessage; galileo_e1_pvt_cc_sptr galileo_e1_make_pvt_cc(unsigned int nchannels, bool dump, std::string dump_filename, int averaging_depth, bool flag_averaging, int output_rate_ms, int display_rate_ms, bool flag_nmea_tty_port, std::string nmea_dump_filename, std::string nmea_dump_devname, bool flag_rtcm_server, bool flag_rtcm_tty_port, unsigned short rtcm_tcp_port, unsigned short rtcm_station_id, std::map rtcm_msg_rate_ms, std::string rtcm_dump_devname) { return galileo_e1_pvt_cc_sptr(new galileo_e1_pvt_cc(nchannels, dump, dump_filename, averaging_depth, flag_averaging, output_rate_ms, display_rate_ms, flag_nmea_tty_port, nmea_dump_filename, nmea_dump_devname, flag_rtcm_server, flag_rtcm_tty_port, rtcm_tcp_port, rtcm_station_id, rtcm_msg_rate_ms, rtcm_dump_devname)); } void galileo_e1_pvt_cc::msg_handler_telemetry(pmt::pmt_t msg) { try { if( pmt::any_ref(msg).type() == typeid(std::shared_ptr) ) { // ### Galileo EPHEMERIS ### std::shared_ptr galileo_eph; galileo_eph = boost::any_cast>(pmt::any_ref(msg)); // insert new ephemeris record DLOG(INFO) << "Galileo New Ephemeris record inserted in global map with TOW =" << galileo_eph->TOW_5 << ", GALILEO Week Number =" << galileo_eph->WN_5 << " and Ephemeris IOD = " << galileo_eph->IOD_ephemeris; // update/insert new ephemeris record to the global ephemeris map d_ls_pvt->galileo_ephemeris_map[galileo_eph->i_satellite_PRN] = *galileo_eph; } else if (pmt::any_ref(msg).type() == typeid(std::shared_ptr) ) { // ### Galileo IONO ### std::shared_ptr galileo_iono; galileo_iono = boost::any_cast>(pmt::any_ref(msg)); d_ls_pvt->galileo_iono = *galileo_iono; DLOG(INFO) << "New IONO record has arrived "; } else if (pmt::any_ref(msg).type() == typeid(std::shared_ptr) ) { // ### Galileo UTC MODEL ### std::shared_ptr galileo_utc_model; galileo_utc_model = boost::any_cast>(pmt::any_ref(msg)); d_ls_pvt->galileo_utc_model = *galileo_utc_model; DLOG(INFO) << "New UTC record has arrived "; } else if (pmt::any_ref(msg).type() == typeid(std::shared_ptr) ) { // ### Galileo Almanac ### std::shared_ptr galileo_almanac; galileo_almanac = boost::any_cast>(pmt::any_ref(msg)); // update/insert new ephemeris record to the global ephemeris map d_ls_pvt->galileo_almanac = *galileo_almanac; DLOG(INFO) << "New Galileo Almanac has arrived "; } else { LOG(WARNING) << "msg_handler_telemetry unknown object type!"; } } catch(boost::bad_any_cast& e) { LOG(WARNING) << "msg_handler_telemetry Bad any cast!\n"; } } galileo_e1_pvt_cc::galileo_e1_pvt_cc(unsigned int nchannels, bool dump, std::string dump_filename, int averaging_depth, bool flag_averaging, int output_rate_ms, int display_rate_ms, bool flag_nmea_tty_port, std::string nmea_dump_filename, std::string nmea_dump_devname, bool flag_rtcm_server, bool flag_rtcm_tty_port, unsigned short rtcm_tcp_port, unsigned short rtcm_station_id, std::map rtcm_msg_rate_ms, std::string rtcm_dump_devname) : gr::block("galileo_e1_pvt_cc", gr::io_signature::make(nchannels, nchannels, sizeof(Gnss_Synchro)), gr::io_signature::make(0, 0, sizeof(gr_complex))) { d_output_rate_ms = output_rate_ms; d_display_rate_ms = display_rate_ms; d_dump = dump; d_nchannels = nchannels; d_dump_filename = dump_filename; std::string dump_ls_pvt_filename = dump_filename; // GPS Ephemeris data message port in this->message_port_register_in(pmt::mp("telemetry")); this->set_msg_handler(pmt::mp("telemetry"), boost::bind(&galileo_e1_pvt_cc::msg_handler_telemetry, this, _1)); //initialize kml_printer std::string kml_dump_filename; kml_dump_filename = d_dump_filename; d_kml_dump = std::make_shared(); d_kml_dump->set_headers(kml_dump_filename); //initialize geojson_printer std::string geojson_dump_filename; geojson_dump_filename = d_dump_filename; d_geojson_printer = std::make_shared(); d_geojson_printer->set_headers(geojson_dump_filename); //initialize nmea_printer d_nmea_printer = std::make_shared(nmea_dump_filename, flag_nmea_tty_port, nmea_dump_devname); //initialize rtcm_printer std::string rtcm_dump_filename; rtcm_dump_filename = d_dump_filename; unsigned short _port = rtcm_tcp_port; unsigned short _station_id = rtcm_station_id; d_rtcm_printer = std::make_shared(rtcm_dump_filename, flag_rtcm_server, flag_rtcm_tty_port, _port, _station_id, rtcm_dump_devname); if(rtcm_msg_rate_ms.find(1045) != rtcm_msg_rate_ms.end()) { d_rtcm_MT1045_rate_ms = rtcm_msg_rate_ms[1045]; } else { d_rtcm_MT1045_rate_ms = boost::math::lcm(5000, d_output_rate_ms); // default value if not set } if(rtcm_msg_rate_ms.find(1091) != rtcm_msg_rate_ms.end()) // whatever between 1091 and 1097 { d_rtcm_MSM_rate_ms = rtcm_msg_rate_ms[1091]; } else { d_rtcm_MSM_rate_ms = boost::math::lcm(1000, d_output_rate_ms); // default value if not set } b_rtcm_writing_started = false; d_dump_filename.append("_raw.dat"); dump_ls_pvt_filename.append("_ls_pvt.dat"); d_averaging_depth = averaging_depth; d_flag_averaging = flag_averaging; d_ls_pvt = std::make_shared(nchannels, dump_ls_pvt_filename, d_dump); d_ls_pvt->set_averaging_depth(d_averaging_depth); d_sample_counter = 0; d_last_sample_nav_output = 0; d_rx_time = 0.0; b_rinex_header_written = false; b_rinex_header_updated = false; rp = std::make_shared(); d_last_status_print_seg = 0; // ############# ENABLE DATA FILE LOG ################# if (d_dump == true) { if (d_dump_file.is_open() == false) { try { d_dump_file.exceptions (std::ifstream::failbit | std::ifstream::badbit ); d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); LOG(INFO) << "PVT dump enabled Log file: " << d_dump_filename.c_str(); } catch (const std::ifstream::failure& e) { LOG(WARNING) << "Exception opening PVT dump file " << e.what(); } } } // Create Sys V message queue first_fix = true; sysv_msg_key = 1101; int msgflg = IPC_CREAT | 0666; if ((sysv_msqid = msgget(sysv_msg_key, msgflg )) == -1) { std::cout << "GNSS-SDR can not create message queues!" << std::endl; throw new std::exception(); } } galileo_e1_pvt_cc::~galileo_e1_pvt_cc() { msgctl(sysv_msqid, IPC_RMID, NULL); } void galileo_e1_pvt_cc::print_receiver_status(Gnss_Synchro** channels_synchronization_data) { // Print the current receiver status using std::cout every second int current_rx_seg = floor(channels_synchronization_data[0][0].Tracking_timestamp_secs); if ( current_rx_seg != d_last_status_print_seg) { d_last_status_print_seg = current_rx_seg; std::cout << "Current input signal time = " << current_rx_seg << " [s]" << std::endl << std::flush; //DLOG(INFO) << "GPS L1 C/A Tracking CH " << d_channel << ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) // << ", CN0 = " << d_CN0_SNV_dB_Hz << " [dB-Hz]" << std::endl; } } bool galileo_e1_pvt_cc::send_sys_v_ttff_msg(ttff_msgbuf ttff) { /* Fill Sys V message structures */ int msgsend_size; ttff_msgbuf msg; msg.ttff = ttff.ttff; msgsend_size = sizeof(msg.ttff); msg.mtype = 1; /* default message ID */ /* SEND SOLUTION OVER A MESSAGE QUEUE */ /* non-blocking Sys V message send */ msgsnd(sysv_msqid, &msg, msgsend_size, IPC_NOWAIT); return true; } int galileo_e1_pvt_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 __attribute__((unused))) { d_sample_counter++; std::map gnss_observables_map; Gnss_Synchro **in = (Gnss_Synchro **) &input_items[0]; //Get the input pointer print_receiver_status(in); // ############ 1. READ PSEUDORANGES #### for (unsigned int i = 0; i < d_nchannels; i++) { if (in[i][0].Flag_valid_pseudorange == true) { gnss_observables_map.insert(std::pair(in[i][0].PRN, in[i][0])); // store valid pseudoranges in a map d_rx_time = in[i][0].d_TOW_at_current_symbol; // all the channels have the same RX timestamp (common RX time pseudoranges) if(d_ls_pvt->galileo_ephemeris_map.size() > 0) { std::map::iterator tmp_eph_iter = d_ls_pvt->galileo_ephemeris_map.find(in[i][0].PRN); if(tmp_eph_iter != d_ls_pvt->galileo_ephemeris_map.end()) { d_rtcm_printer->lock_time(d_ls_pvt->galileo_ephemeris_map.find(in[i][0].PRN)->second, d_rx_time, in[i][0]); // keep track of locking time } } } } // ############ 2 COMPUTE THE PVT ################################ if (gnss_observables_map.size() > 0 and d_ls_pvt->galileo_ephemeris_map.size() > 0) { // compute on the fly PVT solution if ((d_sample_counter % d_output_rate_ms) == 0) { bool pvt_result; pvt_result = d_ls_pvt->get_PVT(gnss_observables_map, d_rx_time, d_flag_averaging); if (pvt_result == true) { // correct the observable to account for the receiver clock offset for (std::map::iterator it = gnss_observables_map.begin(); it != gnss_observables_map.end(); ++it) { it->second.Pseudorange_m = it->second.Pseudorange_m - d_ls_pvt->d_rx_dt_s * GPS_C_m_s; } if( first_fix == true) { std::cout << "First position fix at " << boost::posix_time::to_simple_string(d_ls_pvt->d_position_UTC_time) << " UTC is Lat = " << d_ls_pvt->d_latitude_d << " [deg], Long = " << d_ls_pvt->d_longitude_d << " [deg], Height= " << d_ls_pvt->d_height_m << " [m]" << std::endl; ttff_msgbuf ttff; ttff.mtype = 1; ttff.ttff = d_sample_counter; send_sys_v_ttff_msg(ttff); first_fix = false; } d_kml_dump->print_position(d_ls_pvt, d_flag_averaging); d_geojson_printer->print_position(d_ls_pvt, d_flag_averaging); d_nmea_printer->Print_Nmea_Line(d_ls_pvt, d_flag_averaging); if (!b_rinex_header_written) { std::map::iterator galileo_ephemeris_iter; galileo_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.begin(); if (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) { rp->rinex_obs_header(rp->obsFile, galileo_ephemeris_iter->second, d_rx_time); rp->rinex_nav_header(rp->navGalFile, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac); b_rinex_header_written = true; // do not write header anymore } } if(b_rinex_header_written) // Put here another condition to separate annotations (e.g 30 s) { // Limit the RINEX navigation output rate to 1/6 seg // Notice that d_sample_counter period is 4ms (for Galileo correlators) if ((d_sample_counter - d_last_sample_nav_output) >= 6000) { rp->log_rinex_nav(rp->navGalFile, d_ls_pvt->galileo_ephemeris_map); d_last_sample_nav_output = d_sample_counter; } std::map::iterator galileo_ephemeris_iter; galileo_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.begin(); if (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) { rp->log_rinex_obs(rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, gnss_observables_map); } if (!b_rinex_header_updated && (d_ls_pvt->galileo_utc_model.A0_6 != 0)) { rp->update_nav_header(rp->navGalFile, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac); rp->update_obs_header(rp->obsFile, d_ls_pvt->galileo_utc_model); b_rinex_header_updated = true; } } if(b_rtcm_writing_started) { if((d_sample_counter % (d_rtcm_MT1045_rate_ms / 4) ) == 0) { for(std::map::iterator gal_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.begin(); gal_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end(); gal_ephemeris_iter++ ) { d_rtcm_printer->Print_Rtcm_MT1045(gal_ephemeris_iter->second); } } if((d_sample_counter % (d_rtcm_MSM_rate_ms / 4) ) == 0) { std::map::iterator gal_ephemeris_iter; gal_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.begin(); if (gal_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) { d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, gal_ephemeris_iter->second, d_rx_time, gnss_observables_map, 0, 0, 0, 0, 0); } } } if(!b_rtcm_writing_started) // the first time { for(std::map::iterator gal_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.begin(); gal_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end(); gal_ephemeris_iter++ ) { d_rtcm_printer->Print_Rtcm_MT1045(gal_ephemeris_iter->second); } std::map::iterator gal_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.begin(); if (gal_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) { d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, gal_ephemeris_iter->second, d_rx_time, gnss_observables_map, 0, 0, 0, 0, 0); } b_rtcm_writing_started = true; } } } // DEBUG MESSAGE: Display position in console output if (((d_sample_counter % d_display_rate_ms) == 0) and d_ls_pvt->b_valid_position == true) { std::cout << "Galileo Position at " << boost::posix_time::to_simple_string(d_ls_pvt->d_position_UTC_time) << " UTC is Lat = " << d_ls_pvt->d_latitude_d << " [deg], Long = " << d_ls_pvt->d_longitude_d << " [deg], Height= " << d_ls_pvt->d_height_m << " [m]" << std::endl; LOG(INFO) << "Position at " << boost::posix_time::to_simple_string(d_ls_pvt->d_position_UTC_time) << " UTC is Lat = " << d_ls_pvt->d_latitude_d << " [deg], Long = " << d_ls_pvt->d_longitude_d << " [deg], Height= " << d_ls_pvt->d_height_m << " [m]"; LOG(INFO) << "Dilution of Precision at " << boost::posix_time::to_simple_string(d_ls_pvt->d_position_UTC_time) << " is HDOP = " << d_ls_pvt->d_HDOP << " VDOP = " << d_ls_pvt->d_VDOP <<" TDOP = " << d_ls_pvt->d_TDOP << " GDOP = " << d_ls_pvt->d_GDOP; } // MULTIPLEXED FILE RECORDING - Record results to file if(d_dump == true) { try { double tmp_double; for (unsigned int i = 0; i < d_nchannels; i++) { tmp_double = in[i][0].Pseudorange_m; d_dump_file.write((char*)&tmp_double, sizeof(double)); tmp_double = 0; d_dump_file.write((char*)&tmp_double, sizeof(double)); d_dump_file.write((char*)&d_rx_time, sizeof(double)); } } catch (const std::ifstream::failure& e) { LOG(WARNING) << "Exception writing observables dump file " << e.what(); } } } consume_each(1); //one by one return 1; } gnss-sdr-0.0.9/src/algorithms/PVT/gnuradio_blocks/galileo_e1_pvt_cc.h000066400000000000000000000145141305042567700255640ustar00rootroot00000000000000/*! * \file galileo_e1_pvt_cc.h * \brief Interface of a Position Velocity and Time computation block for Galileo E1 * \author Javier Arribas, 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_E1_PVT_CC_H #define GNSS_SDR_GALILEO_E1_PVT_CC_H #include #include #include #include #include #include #include #include "nmea_printer.h" #include "kml_printer.h" #include "rinex_printer.h" #include "geojson_printer.h" #include "rtcm_printer.h" #include "galileo_e1_ls_pvt.h" class galileo_e1_pvt_cc; typedef boost::shared_ptr galileo_e1_pvt_cc_sptr; galileo_e1_pvt_cc_sptr galileo_e1_make_pvt_cc(unsigned int n_channels, bool dump, std::string dump_filename, int averaging_depth, bool flag_averaging, int output_rate_ms, int display_rate_ms, bool flag_nmea_tty_port, std::string nmea_dump_filename, std::string nmea_dump_devname, bool flag_rtcm_server, bool flag_rtcm_tty_port, unsigned short rtcm_tcp_port, unsigned short rtcm_station_id, std::map rtcm_msg_rate_ms, std::string rtcm_dump_devname); /*! * \brief This class implements a block that computes the PVT solution with Galileo E1 signals */ class galileo_e1_pvt_cc : public gr::block { private: friend galileo_e1_pvt_cc_sptr galileo_e1_make_pvt_cc(unsigned int nchannels, bool dump, std::string dump_filename, int averaging_depth, bool flag_averaging, int output_rate_ms, int display_rate_ms, bool flag_nmea_tty_port, std::string nmea_dump_filename, std::string nmea_dump_devname, bool flag_rtcm_server, bool flag_rtcm_tty_port, unsigned short rtcm_tcp_port, unsigned short rtcm_station_id, std::map rtcm_msg_rate_ms, std::string rtcm_dump_devname); galileo_e1_pvt_cc(unsigned int nchannels, bool dump, std::string dump_filename, int averaging_depth, bool flag_averaging, int output_rate_ms, int display_rate_ms, bool flag_nmea_tty_port, std::string nmea_dump_filename, std::string nmea_dump_devname, bool flag_rtcm_server, bool flag_rtcm_tty_port, unsigned short rtcm_tcp_port, unsigned short rtcm_station_id, std::map rtcm_msg_rate_ms, std::string rtcm_dump_devname); void msg_handler_telemetry(pmt::pmt_t msg); bool d_dump; bool b_rinex_header_written; bool b_rinex_header_updated; bool b_rtcm_writing_started; void print_receiver_status(Gnss_Synchro** channels_synchronization_data); int d_last_status_print_seg; //for status printer unsigned int d_nchannels; std::string d_dump_filename; std::ofstream d_dump_file; int d_averaging_depth; bool d_flag_averaging; int d_output_rate_ms; int d_display_rate_ms; long unsigned int d_sample_counter; long unsigned int d_last_sample_nav_output; int d_rtcm_MT1045_rate_ms; int d_rtcm_MSM_rate_ms; std::shared_ptr rp; std::shared_ptr d_kml_dump; std::shared_ptr d_nmea_printer; std::shared_ptr d_geojson_printer; std::shared_ptr d_rtcm_printer; double d_rx_time; std::shared_ptr d_ls_pvt; bool first_fix; key_t sysv_msg_key; int sysv_msqid; typedef struct { long mtype;//required by sys v message double ttff; } ttff_msgbuf; bool send_sys_v_ttff_msg(ttff_msgbuf ttff); public: ~galileo_e1_pvt_cc (); //!< Default destructor int general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); //!< PVT Signal Processing }; #endif gnss-sdr-0.0.9/src/algorithms/PVT/gnuradio_blocks/gps_l1_ca_pvt_cc.cc000066400000000000000000000575361305042567700255640ustar00rootroot00000000000000/*! * \file gps_l1_ca_pvt_cc.cc * \brief Implementation of a Position Velocity and Time computation block for GPS L1 C/A * \author Javier Arribas, 2011. jarribas(at)cttc.es * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l1_ca_pvt_cc.h" #include #include #include #include #include #include #include #include #include #include "concurrent_map.h" #include "sbas_telemetry_data.h" #include "sbas_ionospheric_correction.h" using google::LogMessage; gps_l1_ca_pvt_cc_sptr gps_l1_ca_make_pvt_cc(unsigned int nchannels, bool dump, std::string dump_filename, int averaging_depth, bool flag_averaging, int output_rate_ms, int display_rate_ms, bool flag_nmea_tty_port, std::string nmea_dump_filename, std::string nmea_dump_devname, bool flag_rtcm_server, bool flag_rtcm_tty_port, unsigned short rtcm_tcp_port, unsigned short rtcm_station_id, std::map rtcm_msg_rate_ms, std::string rtcm_dump_devname, int rinex_version) { return gps_l1_ca_pvt_cc_sptr(new gps_l1_ca_pvt_cc(nchannels, dump, dump_filename, averaging_depth, flag_averaging, output_rate_ms, display_rate_ms, flag_nmea_tty_port, nmea_dump_filename, nmea_dump_devname, flag_rtcm_server, flag_rtcm_tty_port, rtcm_tcp_port, rtcm_station_id, rtcm_msg_rate_ms, rtcm_dump_devname, rinex_version)); } void gps_l1_ca_pvt_cc::msg_handler_telemetry(pmt::pmt_t msg) { try { if( pmt::any_ref(msg).type() == typeid(std::shared_ptr) ) { // ### GPS EPHEMERIS ### std::shared_ptr gps_eph; gps_eph = boost::any_cast>(pmt::any_ref(msg)); DLOG(INFO) << "Ephemeris record has arrived from SAT ID " << gps_eph->i_satellite_PRN << " (Block " << gps_eph->satelliteBlock[gps_eph->i_satellite_PRN] << ")" << "inserted with Toe="<< gps_eph->d_Toe<<" and GPS Week=" << gps_eph->i_GPS_week; // update/insert new ephemeris record to the global ephemeris map d_ls_pvt->gps_ephemeris_map[gps_eph->i_satellite_PRN] = *gps_eph; } else if (pmt::any_ref(msg).type() == typeid(std::shared_ptr) ) { // ### GPS IONO ### std::shared_ptr gps_iono; gps_iono = boost::any_cast>(pmt::any_ref(msg)); d_ls_pvt->gps_iono = *gps_iono; DLOG(INFO) << "New IONO record has arrived "; } else if (pmt::any_ref(msg).type() == typeid(std::shared_ptr) ) { // ### GPS UTC MODEL ### std::shared_ptr gps_utc_model; gps_utc_model = boost::any_cast>(pmt::any_ref(msg)); d_ls_pvt->gps_utc_model = *gps_utc_model; DLOG(INFO) << "New UTC record has arrived "; } else if (pmt::any_ref(msg).type() == typeid(std::shared_ptr) ) { // ### SBAS IONO ### std::shared_ptr sbas_iono; sbas_iono = boost::any_cast>(pmt::any_ref(msg)); d_ls_pvt->sbas_iono = *sbas_iono; DLOG(INFO) << "New SBAS IONO record has arrived "; } //TODO: add SBAS correction maps here //d_ls_pvt->sbas_sat_corr_map = global_sbas_sat_corr_map.get_map_copy(); //d_ls_pvt->sbas_ephemeris_map = global_sbas_ephemeris_map.get_map_copy(); else if (pmt::any_ref(msg).type() == typeid(std::shared_ptr) ) { std::shared_ptr sbas_raw_msg_ptr; sbas_raw_msg_ptr = boost::any_cast>(pmt::any_ref(msg)); Sbas_Raw_Msg sbas_raw_msg = *sbas_raw_msg_ptr; // read SBAS raw messages directly from queue and write them into rinex file // create the header of not yet done if(!b_rinex_sbs_header_written) { rp->rinex_sbs_header(rp->sbsFile); b_rinex_sbs_header_written = true; } // Define the RX time of the SBAS message by using the GPS time. // It has only an effect if there has not been yet a SBAS MT12 available // when the message was received. if(sbas_raw_msg.get_rx_time_obj().is_related() == false && gnss_observables_map.size() > 0 && d_ls_pvt->gps_ephemeris_map.size() > 0) { // doesn't matter which channel/satellite we choose Gnss_Synchro gs = gnss_observables_map.begin()->second; Gps_Ephemeris eph = d_ls_pvt->gps_ephemeris_map.begin()->second; double relative_rx_time = gs.Tracking_timestamp_secs; int gps_week = eph.i_GPS_week; double gps_sec = gs.d_TOW_at_current_symbol; Sbas_Time_Relation time_rel(relative_rx_time, gps_week, gps_sec); sbas_raw_msg.relate(time_rel); } // send the message to the rinex logger if it has a valid GPS time stamp if(sbas_raw_msg.get_rx_time_obj().is_related()) { rp->log_rinex_sbs(rp->sbsFile, sbas_raw_msg); } } else { LOG(WARNING) << "msg_handler_telemetry unknown object type!"; } } catch(boost::bad_any_cast& e) { LOG(WARNING) << "msg_handler_telemetry Bad any cast!\n"; } } std::map gps_l1_ca_pvt_cc::get_GPS_L1_ephemeris_map() { return d_ls_pvt->gps_ephemeris_map; } bool gps_l1_ca_pvt_cc::send_sys_v_ttff_msg(ttff_msgbuf ttff) { /* Fill Sys V message structures */ int msgsend_size; ttff_msgbuf msg; msg.ttff = ttff.ttff; msgsend_size = sizeof(msg.ttff); msg.mtype = 1; /* default message ID */ /* SEND SOLUTION OVER A MESSAGE QUEUE */ /* non-blocking Sys V message send */ msgsnd(sysv_msqid, &msg, msgsend_size, IPC_NOWAIT); return true; } gps_l1_ca_pvt_cc::gps_l1_ca_pvt_cc(unsigned int nchannels, bool dump, std::string dump_filename, int averaging_depth, bool flag_averaging, int output_rate_ms, int display_rate_ms, bool flag_nmea_tty_port, std::string nmea_dump_filename, std::string nmea_dump_devname, bool flag_rtcm_server, bool flag_rtcm_tty_port, unsigned short rtcm_tcp_port, unsigned short rtcm_station_id, std::map rtcm_msg_rate_ms, std::string rtcm_dump_devname, int rinex_version) : gr::block("gps_l1_ca_pvt_cc", gr::io_signature::make(nchannels, nchannels, sizeof(Gnss_Synchro)), gr::io_signature::make(0, 0, sizeof(gr_complex)) ) { d_output_rate_ms = output_rate_ms; d_display_rate_ms = display_rate_ms; d_dump = dump; d_nchannels = nchannels; d_dump_filename = dump_filename; std::string dump_ls_pvt_filename = dump_filename; // GPS Ephemeris data message port in this->message_port_register_in(pmt::mp("telemetry")); this->set_msg_handler(pmt::mp("telemetry"), boost::bind(&gps_l1_ca_pvt_cc::msg_handler_telemetry, this, _1)); // initialize kml_printer std::string kml_dump_filename; kml_dump_filename = d_dump_filename; d_kml_printer = std::make_shared(); d_kml_printer->set_headers(kml_dump_filename); // initialize geojson_printer std::string geojson_dump_filename; geojson_dump_filename = d_dump_filename; d_geojson_printer = std::make_shared(); d_geojson_printer->set_headers(geojson_dump_filename); // initialize nmea_printer d_nmea_printer = std::make_shared(nmea_dump_filename, flag_nmea_tty_port, nmea_dump_devname); // initialize rtcm_printer std::string rtcm_dump_filename; rtcm_dump_filename = d_dump_filename; d_rtcm_tcp_port = rtcm_tcp_port; d_rtcm_station_id = rtcm_station_id; d_rtcm_printer = std::make_shared(rtcm_dump_filename, flag_rtcm_server, flag_rtcm_tty_port, d_rtcm_tcp_port, d_rtcm_station_id, rtcm_dump_devname); if(rtcm_msg_rate_ms.find(1019) != rtcm_msg_rate_ms.end()) { d_rtcm_MT1019_rate_ms = rtcm_msg_rate_ms[1019]; } else { d_rtcm_MT1019_rate_ms = boost::math::lcm(5000, d_output_rate_ms); // default value if not set } if(rtcm_msg_rate_ms.find(1071) != rtcm_msg_rate_ms.end()) // whatever between 1071 and 1077 { d_rtcm_MSM_rate_ms = rtcm_msg_rate_ms[1071]; } else { d_rtcm_MSM_rate_ms = boost::math::lcm(1000, d_output_rate_ms); // default value if not set } b_rtcm_writing_started = false; d_dump_filename.append("_raw.dat"); dump_ls_pvt_filename.append("_ls_pvt.dat"); d_averaging_depth = averaging_depth; d_flag_averaging = flag_averaging; d_ls_pvt = std::make_shared((int)nchannels, dump_ls_pvt_filename, d_dump); d_ls_pvt->set_averaging_depth(d_averaging_depth); d_sample_counter = 0; d_last_sample_nav_output = 0; d_rx_time = 0.0; d_last_status_print_seg = 0; b_rinex_header_written = false; b_rinex_header_updated = false; b_rinex_sbs_header_written = false; rp = std::make_shared(rinex_version); // ############# ENABLE DATA FILE LOG ################# if (d_dump == true) { if (d_dump_file.is_open() == false) { try { d_dump_file.exceptions (std::ifstream::failbit | std::ifstream::badbit ); d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); LOG(INFO) << "PVT dump enabled Log file: " << d_dump_filename.c_str(); } catch (const std::ifstream::failure & e) { LOG(INFO) << "Exception opening PVT dump file " << e.what(); } } } // Create Sys V message queue first_fix = true; sysv_msg_key = 1101; int msgflg = IPC_CREAT | 0666; if ((sysv_msqid = msgget(sysv_msg_key, msgflg )) == -1) { std::cout << "GNSS-SDR can not create message queues!" << std::endl; throw new std::exception(); } } gps_l1_ca_pvt_cc::~gps_l1_ca_pvt_cc() { msgctl(sysv_msqid, IPC_RMID, NULL); } void gps_l1_ca_pvt_cc::print_receiver_status(Gnss_Synchro** channels_synchronization_data) { // Print the current receiver status using std::cout every second int current_rx_seg = floor(channels_synchronization_data[0][0].Tracking_timestamp_secs); if ( current_rx_seg!= d_last_status_print_seg) { d_last_status_print_seg = current_rx_seg; std::cout << "Current input signal time = " << current_rx_seg << " [s]" << std::endl << std::flush; //DLOG(INFO) << "GPS L1 C/A Tracking CH " << d_channel << ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) // << ", CN0 = " << d_CN0_SNV_dB_Hz << " [dB-Hz]"; } } int gps_l1_ca_pvt_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 __attribute__((unused))) { gnss_observables_map.clear(); d_sample_counter++; Gnss_Synchro **in = (Gnss_Synchro **) &input_items[0]; // Get the input pointer print_receiver_status(in); // ############ 1. READ PSEUDORANGES #### for (unsigned int i = 0; i < d_nchannels; i++) { if (in[i][0].Flag_valid_pseudorange == true) { gnss_observables_map.insert(std::pair(in[i][0].PRN, in[i][0])); // store valid pseudoranges in a map d_rx_time = in[i][0].d_TOW_at_current_symbol; // all the channels have the same RX timestamp (common RX time pseudoranges) if(d_ls_pvt->gps_ephemeris_map.size() > 0) { std::map::iterator tmp_eph_iter = d_ls_pvt->gps_ephemeris_map.find(in[i][0].PRN); if(tmp_eph_iter != d_ls_pvt->gps_ephemeris_map.end()) { d_rtcm_printer->lock_time(d_ls_pvt->gps_ephemeris_map.find(in[i][0].PRN)->second, d_rx_time, in[i][0]); // keep track of locking time } } } } // ############ 2 COMPUTE THE PVT ################################ if (gnss_observables_map.size() > 0 and d_ls_pvt->gps_ephemeris_map.size() > 0) { // compute on the fly PVT solution if ((d_sample_counter % d_output_rate_ms) == 0) { bool pvt_result; pvt_result = d_ls_pvt->get_PVT(gnss_observables_map, d_rx_time, d_flag_averaging); if (pvt_result == true) { // correct the observable to account for the receiver clock offset for (std::map::iterator it = gnss_observables_map.begin(); it != gnss_observables_map.end(); ++it) { it->second.Pseudorange_m = it->second.Pseudorange_m - d_ls_pvt->d_rx_dt_s * GPS_C_m_s; } if(first_fix == true) { std::cout << "First position fix at " << boost::posix_time::to_simple_string(d_ls_pvt->d_position_UTC_time) << " UTC is Lat = " << d_ls_pvt->d_latitude_d << " [deg], Long = " << d_ls_pvt->d_longitude_d << " [deg], Height= " << d_ls_pvt->d_height_m << " [m]" << std::endl; ttff_msgbuf ttff; ttff.mtype = 1; ttff.ttff = d_sample_counter; send_sys_v_ttff_msg(ttff); first_fix = false; } d_kml_printer->print_position(d_ls_pvt, d_flag_averaging); d_geojson_printer->print_position(d_ls_pvt, d_flag_averaging); d_nmea_printer->Print_Nmea_Line(d_ls_pvt, d_flag_averaging); if (!b_rinex_header_written) { std::map::iterator gps_ephemeris_iter; gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.begin(); if (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) { rp->rinex_obs_header(rp->obsFile, gps_ephemeris_iter->second, d_rx_time); rp->rinex_nav_header(rp->navFile, d_ls_pvt->gps_iono, d_ls_pvt->gps_utc_model); b_rinex_header_written = true; // do not write header anymore } } if(b_rinex_header_written) { // Limit the RINEX navigation output rate to 1/6 seg // Notice that d_sample_counter period is 1ms (for GPS correlators) if ((d_sample_counter - d_last_sample_nav_output) >= 6000) { rp->log_rinex_nav(rp->navFile, d_ls_pvt->gps_ephemeris_map); d_last_sample_nav_output = d_sample_counter; } std::map::iterator gps_ephemeris_iter; gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.begin(); if (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) { rp->log_rinex_obs(rp->obsFile, gps_ephemeris_iter->second, d_rx_time, gnss_observables_map); } if (!b_rinex_header_updated && (d_ls_pvt->gps_utc_model.d_A0 != 0)) { rp->update_obs_header(rp->obsFile, d_ls_pvt->gps_utc_model); rp->update_nav_header(rp->navFile, d_ls_pvt->gps_utc_model, d_ls_pvt->gps_iono); b_rinex_header_updated = true; } } if(b_rtcm_writing_started) { if((d_sample_counter % d_rtcm_MT1019_rate_ms) == 0) { for(std::map::iterator gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.begin(); gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end(); gps_ephemeris_iter++ ) { d_rtcm_printer->Print_Rtcm_MT1019(gps_ephemeris_iter->second); } } if((d_sample_counter % d_rtcm_MSM_rate_ms) == 0) { std::map::iterator gps_ephemeris_iter; gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.begin(); if (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) { d_rtcm_printer->Print_Rtcm_MSM(7, gps_ephemeris_iter->second, {}, {}, d_rx_time, gnss_observables_map, 0, 0, 0, 0, 0); } } } if(!b_rtcm_writing_started) // the first time { for(std::map::iterator gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.begin(); gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end(); gps_ephemeris_iter++ ) { d_rtcm_printer->Print_Rtcm_MT1019(gps_ephemeris_iter->second); } std::map::iterator gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.begin(); if (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) { d_rtcm_printer->Print_Rtcm_MSM(7, gps_ephemeris_iter->second, {}, {}, d_rx_time, gnss_observables_map, 0, 0, 0, 0, 0); } b_rtcm_writing_started = true; } } } // DEBUG MESSAGE: Display position in console output if (((d_sample_counter % d_display_rate_ms) == 0) and d_ls_pvt->b_valid_position == true) { std::cout << "Position at " << boost::posix_time::to_simple_string(d_ls_pvt->d_position_UTC_time) << " UTC is Lat = " << d_ls_pvt->d_latitude_d << " [deg], Long = " << d_ls_pvt->d_longitude_d << " [deg], Height= " << d_ls_pvt->d_height_m << " [m]" << std::endl; LOG(INFO) << "Position at " << boost::posix_time::to_simple_string(d_ls_pvt->d_position_UTC_time) << " UTC is Lat = " << d_ls_pvt->d_latitude_d << " [deg], Long = " << d_ls_pvt->d_longitude_d << " [deg], Height= " << d_ls_pvt->d_height_m << " [m]"; LOG(INFO) << "Dilution of Precision at " << boost::posix_time::to_simple_string(d_ls_pvt->d_position_UTC_time) << " is HDOP = " << d_ls_pvt->d_HDOP << " VDOP = " << d_ls_pvt->d_VDOP <<" TDOP = " << d_ls_pvt->d_TDOP << " GDOP = " << d_ls_pvt->d_GDOP; } // MULTIPLEXED FILE RECORDING - Record results to file if(d_dump == true) { try { double tmp_double; for (unsigned int i = 0; i < d_nchannels ; i++) { tmp_double = in[i][0].Pseudorange_m; d_dump_file.write((char*)&tmp_double, sizeof(double)); tmp_double = 0; d_dump_file.write((char*)&tmp_double, sizeof(double)); d_dump_file.write((char*)&d_rx_time, sizeof(double)); } } catch (const std::ifstream::failure & e) { LOG(WARNING) << "Exception writing observables dump file " << e.what(); } } } consume_each(1); //one by one return 1; } gnss-sdr-0.0.9/src/algorithms/PVT/gnuradio_blocks/gps_l1_ca_pvt_cc.h000066400000000000000000000154171305042567700254160ustar00rootroot00000000000000/*! * \file gps_l1_ca_pvt_cc.h * \brief Interface of a Position Velocity and Time computation block for GPS L1 C/A * \author Javier Arribas, 2011. jarribas(at)cttc.es * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L1_CA_PVT_CC_H #define GNSS_SDR_GPS_L1_CA_PVT_CC_H #include #include #include #include #include #include #include "nmea_printer.h" #include "kml_printer.h" #include "rinex_printer.h" #include "geojson_printer.h" #include "rtcm_printer.h" #include "gps_l1_ca_ls_pvt.h" class gps_l1_ca_pvt_cc; typedef boost::shared_ptr gps_l1_ca_pvt_cc_sptr; gps_l1_ca_pvt_cc_sptr gps_l1_ca_make_pvt_cc(unsigned int n_channels, bool dump, std::string dump_filename, int averaging_depth, bool flag_averaging, int output_rate_ms, int display_rate_ms, bool flag_nmea_tty_port, std::string nmea_dump_filename, std::string nmea_dump_devname, bool flag_rtcm_server, bool flag_rtcm_tty_port, unsigned short rtcm_tcp_port, unsigned short rtcm_station_id, std::map rtcm_msg_rate_ms, std::string rtcm_dump_devname, int rinex_version ); /*! * \brief This class implements a block that computes the PVT solution */ class gps_l1_ca_pvt_cc : public gr::block { private: friend gps_l1_ca_pvt_cc_sptr gps_l1_ca_make_pvt_cc(unsigned int nchannels, bool dump, std::string dump_filename, int averaging_depth, bool flag_averaging, int output_rate_ms, int display_rate_ms, bool flag_nmea_tty_port, std::string nmea_dump_filename, std::string nmea_dump_devname, bool flag_rtcm_server, bool flag_rtcm_tty_port, unsigned short rtcm_tcp_port, unsigned short rtcm_station_id, std::map rtcm_msg_rate_ms, std::string rtcm_dump_devname, int rinex_version); gps_l1_ca_pvt_cc(unsigned int nchannels, bool dump, std::string dump_filename, int averaging_depth, bool flag_averaging, int output_rate_ms, int display_rate_ms, bool flag_nmea_tty_port, std::string nmea_dump_filename, std::string nmea_dump_devname, bool flag_rtcm_server, bool flag_rtcm_tty_port, unsigned short rtcm_tcp_port, unsigned short rtcm_station_id, std::map rtcm_msg_rate_ms, std::string rtcm_dump_devname, int rinex_version); void msg_handler_telemetry(pmt::pmt_t msg); bool d_dump; bool b_rinex_header_written; bool b_rinex_sbs_header_written; bool b_rinex_header_updated; bool b_rtcm_writing_started; unsigned short d_rtcm_tcp_port; unsigned short d_rtcm_station_id; int d_rtcm_MT1019_rate_ms; int d_rtcm_MSM_rate_ms; void print_receiver_status(Gnss_Synchro** channels_synchronization_data); int d_last_status_print_seg; //for status printer unsigned int d_nchannels; std::string d_dump_filename; std::ofstream d_dump_file; int d_averaging_depth; bool d_flag_averaging; int d_output_rate_ms; int d_display_rate_ms; long unsigned int d_sample_counter; long unsigned int d_last_sample_nav_output; std::shared_ptr rp; std::shared_ptr d_kml_printer; std::shared_ptr d_nmea_printer; std::shared_ptr d_geojson_printer; std::shared_ptr d_rtcm_printer; double d_rx_time; std::shared_ptr d_ls_pvt; std::map gnss_observables_map; bool first_fix; key_t sysv_msg_key; int sysv_msqid; typedef struct { long mtype;//required by sys v message double ttff; } ttff_msgbuf; bool send_sys_v_ttff_msg(ttff_msgbuf ttff); public: /*! * \brief Get latest set of GPS L1 ephemeris from PVT block * * It is used to save the assistance data at the receiver shutdown */ std::map get_GPS_L1_ephemeris_map(); ~gps_l1_ca_pvt_cc (); //!< Default destructor int general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); //!< PVT Signal Processing }; #endif gnss-sdr-0.0.9/src/algorithms/PVT/gnuradio_blocks/hybrid_pvt_cc.cc000066400000000000000000002053131305042567700252010ustar00rootroot00000000000000/*! * \file hybrid_pvt_cc.cc * \brief Implementation of a Position Velocity and Time computation block for GPS L1 C/A * \author Javier Arribas, 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "hybrid_pvt_cc.h" #include #include #include #include #include #include #include #include #include "concurrent_map.h" using google::LogMessage; hybrid_pvt_cc_sptr hybrid_make_pvt_cc(unsigned int nchannels, bool dump, std::string dump_filename, int averaging_depth, bool flag_averaging, int output_rate_ms, int display_rate_ms, bool flag_nmea_tty_port, std::string nmea_dump_filename, std::string nmea_dump_devname, bool flag_rtcm_server, bool flag_rtcm_tty_port, unsigned short rtcm_tcp_port, unsigned short rtcm_station_id, std::map rtcm_msg_rate_ms, std::string rtcm_dump_devname, const unsigned int type_of_receiver) { return hybrid_pvt_cc_sptr(new hybrid_pvt_cc(nchannels, dump, dump_filename, averaging_depth, flag_averaging, output_rate_ms, display_rate_ms, flag_nmea_tty_port, nmea_dump_filename, nmea_dump_devname, flag_rtcm_server, flag_rtcm_tty_port, rtcm_tcp_port, rtcm_station_id, rtcm_msg_rate_ms, rtcm_dump_devname, type_of_receiver)); } void hybrid_pvt_cc::msg_handler_telemetry(pmt::pmt_t msg) { try { if( pmt::any_ref(msg).type() == typeid(std::shared_ptr) ) { // ### GPS EPHEMERIS ### std::shared_ptr gps_eph; gps_eph = boost::any_cast>(pmt::any_ref(msg)); DLOG(INFO) << "Ephemeris record has arrived from SAT ID " << gps_eph->i_satellite_PRN << " (Block " << gps_eph->satelliteBlock[gps_eph->i_satellite_PRN] << ")" << "inserted with Toe="<< gps_eph->d_Toe<<" and GPS Week=" << gps_eph->i_GPS_week; // update/insert new ephemeris record to the global ephemeris map d_ls_pvt->gps_ephemeris_map[gps_eph->i_satellite_PRN] = *gps_eph; } else if (pmt::any_ref(msg).type() == typeid(std::shared_ptr) ) { // ### GPS IONO ### std::shared_ptr gps_iono; gps_iono = boost::any_cast>(pmt::any_ref(msg)); d_ls_pvt->gps_iono = *gps_iono; DLOG(INFO) << "New IONO record has arrived "; } else if (pmt::any_ref(msg).type() == typeid(std::shared_ptr) ) { // ### GPS UTC MODEL ### std::shared_ptr gps_utc_model; gps_utc_model = boost::any_cast>(pmt::any_ref(msg)); d_ls_pvt->gps_utc_model = *gps_utc_model; DLOG(INFO) << "New UTC record has arrived "; } if( pmt::any_ref(msg).type() == typeid(std::shared_ptr) ) { // ### Galileo EPHEMERIS ### std::shared_ptr galileo_eph; galileo_eph = boost::any_cast>(pmt::any_ref(msg)); // insert new ephemeris record DLOG(INFO) << "Galileo New Ephemeris record inserted in global map with TOW =" << galileo_eph->TOW_5 << ", GALILEO Week Number =" << galileo_eph->WN_5 << " and Ephemeris IOD = " << galileo_eph->IOD_ephemeris; // update/insert new ephemeris record to the global ephemeris map d_ls_pvt->galileo_ephemeris_map[galileo_eph->i_satellite_PRN] = *galileo_eph; } else if (pmt::any_ref(msg).type() == typeid(std::shared_ptr) ) { // ### Galileo IONO ### std::shared_ptr galileo_iono; galileo_iono = boost::any_cast>(pmt::any_ref(msg)); d_ls_pvt->galileo_iono = *galileo_iono; DLOG(INFO) << "New IONO record has arrived "; } else if (pmt::any_ref(msg).type() == typeid(std::shared_ptr) ) { // ### Galileo UTC MODEL ### std::shared_ptr galileo_utc_model; galileo_utc_model = boost::any_cast>(pmt::any_ref(msg)); d_ls_pvt->galileo_utc_model = *galileo_utc_model; DLOG(INFO) << "New UTC record has arrived "; } else if (pmt::any_ref(msg).type() == typeid(std::shared_ptr) ) { // ### Galileo Almanac ### std::shared_ptr galileo_almanac; galileo_almanac = boost::any_cast>(pmt::any_ref(msg)); // update/insert new ephemeris record to the global ephemeris map d_ls_pvt->galileo_almanac = *galileo_almanac; DLOG(INFO) << "New Galileo Almanac has arrived "; } else if (pmt::any_ref(msg).type() == typeid(std::shared_ptr) ) { // ### GPS CNAV message ### std::shared_ptr gps_cnav_ephemeris; gps_cnav_ephemeris = boost::any_cast>(pmt::any_ref(msg)); // update/insert new ephemeris record to the global ephemeris map d_ls_pvt->gps_cnav_ephemeris_map[gps_cnav_ephemeris->i_satellite_PRN] = *gps_cnav_ephemeris; DLOG(INFO) << "New GPS CNAV ephemeris record has arrived "; } else if (pmt::any_ref(msg).type() == typeid(std::shared_ptr) ) { // ### GPS CNAV IONO ### std::shared_ptr gps_cnav_iono; gps_cnav_iono = boost::any_cast>(pmt::any_ref(msg)); d_ls_pvt->gps_cnav_iono = *gps_cnav_iono; DLOG(INFO) << "New CNAV IONO record has arrived "; } else if (pmt::any_ref(msg).type() == typeid(std::shared_ptr) ) { // ### GPS CNAV UTC MODEL ### std::shared_ptr gps_cnav_utc_model; gps_cnav_utc_model = boost::any_cast>(pmt::any_ref(msg)); d_ls_pvt->gps_cnav_utc_model = *gps_cnav_utc_model; DLOG(INFO) << "New CNAV UTC record has arrived "; } else { LOG(WARNING) << "msg_handler_telemetry unknown object type!"; } } catch(boost::bad_any_cast& e) { LOG(WARNING) << "msg_handler_telemetry Bad any cast!"; } } std::map hybrid_pvt_cc::get_GPS_L1_ephemeris_map() { return d_ls_pvt->gps_ephemeris_map; } hybrid_pvt_cc::hybrid_pvt_cc(unsigned int nchannels, bool dump, std::string dump_filename, int averaging_depth, bool flag_averaging, int output_rate_ms, int display_rate_ms, bool flag_nmea_tty_port, std::string nmea_dump_filename, std::string nmea_dump_devname, bool flag_rtcm_server, bool flag_rtcm_tty_port, unsigned short rtcm_tcp_port, unsigned short rtcm_station_id, std::map rtcm_msg_rate_ms, std::string rtcm_dump_devname, const unsigned int type_of_receiver) : gr::block("hybrid_pvt_cc", gr::io_signature::make(nchannels, nchannels, sizeof(Gnss_Synchro)), gr::io_signature::make(0, 0, sizeof(gr_complex))) { d_output_rate_ms = output_rate_ms; d_display_rate_ms = display_rate_ms; d_dump = dump; d_nchannels = nchannels; d_dump_filename = dump_filename; std::string dump_ls_pvt_filename = dump_filename; type_of_rx = type_of_receiver; // GPS Ephemeris data message port in this->message_port_register_in(pmt::mp("telemetry")); this->set_msg_handler(pmt::mp("telemetry"), boost::bind(&hybrid_pvt_cc::msg_handler_telemetry, this, _1)); //initialize kml_printer std::string kml_dump_filename; kml_dump_filename = d_dump_filename; d_kml_dump = std::make_shared(); d_kml_dump->set_headers(kml_dump_filename); //initialize geojson_printer std::string geojson_dump_filename; geojson_dump_filename = d_dump_filename; d_geojson_printer = std::make_shared(); d_geojson_printer->set_headers(geojson_dump_filename); //initialize nmea_printer d_nmea_printer = std::make_shared(nmea_dump_filename, flag_nmea_tty_port, nmea_dump_devname); //initialize rtcm_printer std::string rtcm_dump_filename; rtcm_dump_filename = d_dump_filename; d_rtcm_printer = std::make_shared(rtcm_dump_filename, flag_rtcm_server, flag_rtcm_tty_port, rtcm_tcp_port, rtcm_station_id, rtcm_dump_devname); if(rtcm_msg_rate_ms.find(1019) != rtcm_msg_rate_ms.end()) { d_rtcm_MT1019_rate_ms = rtcm_msg_rate_ms[1019]; } else { d_rtcm_MT1019_rate_ms = boost::math::lcm(5000, d_output_rate_ms); // default value if not set } if(rtcm_msg_rate_ms.find(1045) != rtcm_msg_rate_ms.end()) { d_rtcm_MT1045_rate_ms = rtcm_msg_rate_ms[1045]; } else { d_rtcm_MT1045_rate_ms = boost::math::lcm(5000, d_output_rate_ms); // default value if not set } if(rtcm_msg_rate_ms.find(1077) != rtcm_msg_rate_ms.end()) // whatever between 1071 and 1077 { d_rtcm_MT1077_rate_ms = rtcm_msg_rate_ms[1077]; } else { d_rtcm_MT1077_rate_ms = boost::math::lcm(1000, d_output_rate_ms); // default value if not set } if(rtcm_msg_rate_ms.find(1097) != rtcm_msg_rate_ms.end()) // whatever between 1091 and 1097 { d_rtcm_MT1097_rate_ms = rtcm_msg_rate_ms[1097]; d_rtcm_MSM_rate_ms = rtcm_msg_rate_ms[1097]; } else { d_rtcm_MT1097_rate_ms = boost::math::lcm(1000, d_output_rate_ms); // default value if not set d_rtcm_MSM_rate_ms = boost::math::lcm(1000, d_output_rate_ms); // default value if not set } b_rtcm_writing_started = false; d_dump_filename.append("_raw.dat"); dump_ls_pvt_filename.append("_ls_pvt.dat"); d_averaging_depth = averaging_depth; d_flag_averaging = flag_averaging; d_ls_pvt = std::make_shared((int)nchannels, dump_ls_pvt_filename, d_dump); d_ls_pvt->set_averaging_depth(d_averaging_depth); d_sample_counter = 0; d_last_sample_nav_output = 0; d_rx_time = 0.0; d_TOW_at_curr_symbol_constellation = 0.0; b_rinex_header_written = false; b_rinex_header_updated = false; rp = std::make_shared(); d_last_status_print_seg = 0; // ############# ENABLE DATA FILE LOG ################# if (d_dump == true) { if (d_dump_file.is_open() == false) { try { d_dump_file.exceptions (std::ifstream::failbit | std::ifstream::badbit ); d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); LOG(INFO) << "PVT dump enabled Log file: " << d_dump_filename.c_str(); } catch (const std::ifstream::failure& e) { LOG(WARNING) << "Exception opening PVT dump file " << e.what(); } } } // Create Sys V message queue first_fix = true; sysv_msg_key = 1101; int msgflg = IPC_CREAT | 0666; if ((sysv_msqid = msgget(sysv_msg_key, msgflg )) == -1) { std::cout << "GNSS-SDR can not create message queues!" << std::endl; throw new std::exception(); } } hybrid_pvt_cc::~hybrid_pvt_cc() { msgctl(sysv_msqid, IPC_RMID, NULL); } bool hybrid_pvt_cc::observables_pairCompare_min(const std::pair& a, const std::pair& b) { return (a.second.Pseudorange_m) < (b.second.Pseudorange_m); } void hybrid_pvt_cc::print_receiver_status(Gnss_Synchro** channels_synchronization_data) { // Print the current receiver status using std::cout every second int current_rx_seg = floor(channels_synchronization_data[0][0].Tracking_timestamp_secs); if ( current_rx_seg != d_last_status_print_seg) { d_last_status_print_seg = current_rx_seg; std::cout << "Current input signal time = " << current_rx_seg << " [s]" << std::endl << std::flush; //DLOG(INFO) << "GPS L1 C/A Tracking CH " << d_channel << ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) // << ", CN0 = " << d_CN0_SNV_dB_Hz << " [dB-Hz]" << std::endl; } } bool hybrid_pvt_cc::send_sys_v_ttff_msg(ttff_msgbuf ttff) { /* Fill Sys V message structures */ int msgsend_size; ttff_msgbuf msg; msg.ttff = ttff.ttff; msgsend_size = sizeof(msg.ttff); msg.mtype = 1; /* default message ID */ /* SEND SOLUTION OVER A MESSAGE QUEUE */ /* non-blocking Sys V message send */ msgsnd(sysv_msqid, &msg, msgsend_size, IPC_NOWAIT); return true; } int hybrid_pvt_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 __attribute__((unused))) { d_sample_counter++; unsigned int gps_channel = 0; unsigned int gal_channel = 0; gnss_observables_map.clear(); Gnss_Synchro **in = (Gnss_Synchro **) &input_items[0]; //Get the input pointer print_receiver_status(in); // ############ 1. READ PSEUDORANGES #### for (unsigned int i = 0; i < d_nchannels; i++) { if (in[i][0].Flag_valid_pseudorange == true) { gnss_observables_map.insert(std::pair(i, in[i][0])); // store valid observables in a map. //d_rx_time = in[i][0].d_TOW_at_current_symbol; // all the channels have the same RX timestamp (common RX time pseudoranges) d_TOW_at_curr_symbol_constellation = in[i][0].d_TOW_at_current_symbol; // d_TOW_at_current_symbol not corrected by delta t (just for debug) d_rx_time = in[i][0].d_TOW_hybrid_at_current_symbol; // hybrid rx time, all the channels have the same RX timestamp (common RX time pseudoranges) if(d_ls_pvt->gps_ephemeris_map.size() > 0) { std::map::iterator tmp_eph_iter = d_ls_pvt->gps_ephemeris_map.find(in[i][0].PRN); if(tmp_eph_iter != d_ls_pvt->gps_ephemeris_map.end()) { d_rtcm_printer->lock_time(d_ls_pvt->gps_ephemeris_map.find(in[i][0].PRN)->second, d_rx_time, in[i][0]); // keep track of locking time } } if(d_ls_pvt->galileo_ephemeris_map.size() > 0) { std::map::iterator tmp_eph_iter = d_ls_pvt->galileo_ephemeris_map.find(in[i][0].PRN); if(tmp_eph_iter != d_ls_pvt->galileo_ephemeris_map.end()) { d_rtcm_printer->lock_time(d_ls_pvt->galileo_ephemeris_map.find(in[i][0].PRN)->second, d_rx_time, in[i][0]); // keep track of locking time } } if(d_ls_pvt->gps_cnav_ephemeris_map.size() > 0) { std::map::iterator tmp_eph_iter = d_ls_pvt->gps_cnav_ephemeris_map.find(in[i][0].PRN); if(tmp_eph_iter != d_ls_pvt->gps_cnav_ephemeris_map.end()) { d_rtcm_printer->lock_time(d_ls_pvt->gps_cnav_ephemeris_map.find(in[i][0].PRN)->second, d_rx_time, in[i][0]); // keep track of locking time } } } } std::map::iterator galileo_ephemeris_iter; std::map::iterator gps_ephemeris_iter; std::map::iterator gps_cnav_ephemeris_iter; std::map::iterator gnss_observables_iter; /* * TYPE | RECEIVER * 0 | Unknown * 1 | GPS L1 C/A * 2 | GPS L2C * 3 | GPS L5 * 4 | Galileo E1B * 5 | Galileo E5a * 6 | Galileo E5b * 7 | GPS L1 C/A + GPS L2C * 8 | GPS L1 C/A + GPS L5 * 9 | GPS L1 C/A + Galileo E1B * 10 | GPS L1 C/A + Galileo E5a * 11 | GPS L1 C/A + Galileo E5b * 12 | Galileo E1B + GPS L2C * 13 | Galileo E1B + GPS L5 * 14 | Galileo E1B + Galileo E5a * 15 | Galileo E1B + Galileo E5b * 16 | GPS L2C + GPS L5 * 17 | GPS L2C + Galileo E5a * 18 | GPS L2C + Galileo E5b * 19 | GPS L5 + Galileo E5a * 20 | GPS L5 + Galileo E5b * 21 | GPS L1 C/A + Galileo E1B + GPS L2C * 22 | GPS L1 C/A + Galileo E1B + GPS L5 */ // ############ 2 COMPUTE THE PVT ################################ if (gnss_observables_map.size() > 0) { // compute on the fly PVT solution if ((d_sample_counter % d_output_rate_ms) == 0) { bool pvt_result; pvt_result = d_ls_pvt->get_PVT(gnss_observables_map, d_rx_time, d_flag_averaging); if (pvt_result == true) { // correct the observable to account for the receiver clock offset for (std::map::iterator it = gnss_observables_map.begin(); it != gnss_observables_map.end(); ++it) { it->second.Pseudorange_m = it->second.Pseudorange_m - d_ls_pvt->d_rx_dt_s * GPS_C_m_s; } if(first_fix == true) { std::cout << "First position fix at " << boost::posix_time::to_simple_string(d_ls_pvt->d_position_UTC_time) << " UTC is Lat = " << d_ls_pvt->d_latitude_d << " [deg], Long = " << d_ls_pvt->d_longitude_d << " [deg], Height= " << d_ls_pvt->d_height_m << " [m]" << std::endl; ttff_msgbuf ttff; ttff.mtype = 1; ttff.ttff = d_sample_counter; send_sys_v_ttff_msg(ttff); first_fix = false; } d_kml_dump->print_position(d_ls_pvt, d_flag_averaging); d_geojson_printer->print_position(d_ls_pvt, d_flag_averaging); d_nmea_printer->Print_Nmea_Line(d_ls_pvt, d_flag_averaging); // ####################### RINEX FILES ################# if (!b_rinex_header_written) // & we have utc data in nav message! { galileo_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.begin(); gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.begin(); gps_cnav_ephemeris_iter = d_ls_pvt->gps_cnav_ephemeris_map.begin(); if(type_of_rx == 1) // GPS L1 C/A only { if (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) { rp->rinex_obs_header(rp->obsFile, gps_ephemeris_iter->second, d_rx_time); rp->rinex_nav_header(rp->navFile, d_ls_pvt->gps_iono, d_ls_pvt->gps_utc_model); b_rinex_header_written = true; // do not write header anymore } } if(type_of_rx == 2) // GPS L2C only { if (gps_cnav_ephemeris_iter != d_ls_pvt->gps_cnav_ephemeris_map.end()) { rp->rinex_obs_header(rp->obsFile, gps_cnav_ephemeris_iter->second, d_rx_time); rp->rinex_nav_header(rp->navFile, d_ls_pvt->gps_cnav_iono, d_ls_pvt->gps_cnav_utc_model); b_rinex_header_written = true; // do not write header anymore } } if(type_of_rx == 4) // Galileo E1B only { if (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) { rp->rinex_obs_header(rp->obsFile, galileo_ephemeris_iter->second, d_rx_time); rp->rinex_nav_header(rp->navGalFile, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac); b_rinex_header_written = true; // do not write header anymore } } if(type_of_rx == 5) // Galileo E5a only { std::string signal("5X"); if (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) { rp->rinex_obs_header(rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, signal); rp->rinex_nav_header(rp->navGalFile, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac); b_rinex_header_written = true; // do not write header anymore } } if(type_of_rx == 6) // Galileo E5b only { std::string signal("7X"); if (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) { rp->rinex_obs_header(rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, signal); rp->rinex_nav_header(rp->navGalFile, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac); b_rinex_header_written = true; // do not write header anymore } } if(type_of_rx == 7) // GPS L1 C/A + GPS L2C { if ((gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) && (gps_cnav_ephemeris_iter != d_ls_pvt->gps_cnav_ephemeris_map.end())) { rp->rinex_obs_header(rp->obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, d_rx_time); rp->rinex_nav_header(rp->navFile, d_ls_pvt->gps_iono, d_ls_pvt->gps_utc_model); b_rinex_header_written = true; // do not write header anymore } } if(type_of_rx == 9) // GPS L1 C/A + Galileo E1B { if ((galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) && (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) ) { std::string gal_signal("1B"); rp->rinex_obs_header(rp->obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time, gal_signal); rp->rinex_nav_header(rp->navMixFile, d_ls_pvt->gps_iono, d_ls_pvt->gps_utc_model, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac); b_rinex_header_written = true; // do not write header anymore } } if(type_of_rx == 10) // GPS L1 C/A + Galileo E5a { if ((galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) && (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) ) { std::string gal_signal("5X"); rp->rinex_obs_header(rp->obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time, gal_signal); rp->rinex_nav_header(rp->navMixFile, d_ls_pvt->gps_iono, d_ls_pvt->gps_utc_model, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac); b_rinex_header_written = true; // do not write header anymore } } if(type_of_rx == 11) // GPS L1 C/A + Galileo E5b { if ((galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) && (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) ) { std::string gal_signal("7X"); rp->rinex_obs_header(rp->obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time, gal_signal); rp->rinex_nav_header(rp->navMixFile, d_ls_pvt->gps_iono, d_ls_pvt->gps_utc_model, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac); b_rinex_header_written = true; // do not write header anymore } } if(type_of_rx == 14) // Galileo E1B + Galileo E5a { if ((galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) ) { std::string gal_signal("1B 5X"); rp->rinex_obs_header(rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, gal_signal); rp->rinex_nav_header(rp->navGalFile, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac); b_rinex_header_written = true; // do not write header anymore } } if(type_of_rx == 15) // Galileo E1B + Galileo E5b { if ((galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) ) { std::string gal_signal("1B 7X"); rp->rinex_obs_header(rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, gal_signal); rp->rinex_nav_header(rp->navGalFile, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac); b_rinex_header_written = true; // do not write header anymore } } } if(b_rinex_header_written) // The header is already written, we can now log the navigation message data { // Limit the RINEX navigation output rate // Notice that d_sample_counter period is 4ms (for Galileo correlators) if ((d_sample_counter - d_last_sample_nav_output) >= 6000) { if(type_of_rx == 1) // GPS L1 C/A only { rp->log_rinex_nav(rp->navFile, d_ls_pvt->gps_ephemeris_map); } if(type_of_rx == 2) // GPS L2C only { rp->log_rinex_nav(rp->navFile, d_ls_pvt->gps_cnav_ephemeris_map); } if( (type_of_rx == 4) || (type_of_rx == 5) || (type_of_rx == 6) ) // Galileo { rp->log_rinex_nav(rp->navGalFile, d_ls_pvt->galileo_ephemeris_map); } if(type_of_rx == 7) // GPS L1 C/A + GPS L2C { rp->log_rinex_nav(rp->navFile, d_ls_pvt->gps_cnav_ephemeris_map); } if((type_of_rx == 9) || (type_of_rx == 10) || (type_of_rx == 11)) // GPS L1 C/A + Galileo { rp->log_rinex_nav(rp->navMixFile, d_ls_pvt->gps_ephemeris_map, d_ls_pvt->galileo_ephemeris_map); } if((type_of_rx == 14) || (type_of_rx == 15)) // Galileo E1B + Galileo E5a { rp->log_rinex_nav(rp->navGalFile, d_ls_pvt->galileo_ephemeris_map); } d_last_sample_nav_output = d_sample_counter; } galileo_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.begin(); gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.begin(); gps_cnav_ephemeris_iter = d_ls_pvt->gps_cnav_ephemeris_map.begin(); // Log observables into the RINEX file if(type_of_rx == 1) // GPS L1 C/A only { if (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) { rp->log_rinex_obs(rp->obsFile, gps_ephemeris_iter->second, d_rx_time, gnss_observables_map); } if (!b_rinex_header_updated && (d_ls_pvt->gps_utc_model.d_A0 != 0)) { rp->update_obs_header(rp->obsFile, d_ls_pvt->gps_utc_model); rp->update_nav_header(rp->navFile, d_ls_pvt->gps_utc_model, d_ls_pvt->gps_iono); b_rinex_header_updated = true; } } if(type_of_rx == 2) // GPS L2C only { if (gps_cnav_ephemeris_iter != d_ls_pvt->gps_cnav_ephemeris_map.end()) { rp->log_rinex_obs(rp->obsFile, gps_cnav_ephemeris_iter->second, d_rx_time, gnss_observables_map); } if (!b_rinex_header_updated && (d_ls_pvt->gps_cnav_utc_model.d_A0 != 0)) { rp->update_obs_header(rp->obsFile, d_ls_pvt->gps_cnav_utc_model); rp->update_nav_header(rp->navFile, d_ls_pvt->gps_cnav_utc_model, d_ls_pvt->gps_cnav_iono); b_rinex_header_updated = true; } } if(type_of_rx == 4) // Galileo E1B only { if (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) { rp->log_rinex_obs(rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, gnss_observables_map, "1B"); } if (!b_rinex_header_updated && (d_ls_pvt->galileo_utc_model.A0_6 != 0)) { rp->update_nav_header(rp->navGalFile, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac); rp->update_obs_header(rp->obsFile, d_ls_pvt->galileo_utc_model); b_rinex_header_updated = true; } } if(type_of_rx == 5) // Galileo E5a only { if (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) { rp->log_rinex_obs(rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, gnss_observables_map, "5X"); } if (!b_rinex_header_updated && (d_ls_pvt->galileo_utc_model.A0_6 != 0)) { rp->update_nav_header(rp->navGalFile, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac); rp->update_obs_header(rp->obsFile, d_ls_pvt->galileo_utc_model); b_rinex_header_updated = true; } } if(type_of_rx == 6) // Galileo E5b only { if (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) { rp->log_rinex_obs(rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, gnss_observables_map, "7X"); } if (!b_rinex_header_updated && (d_ls_pvt->galileo_utc_model.A0_6 != 0)) { rp->update_nav_header(rp->navGalFile, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac); rp->update_obs_header(rp->obsFile, d_ls_pvt->galileo_utc_model); b_rinex_header_updated = true; } } if(type_of_rx == 7) // GPS L1 C/A + GPS L2C { if( (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) && (gps_cnav_ephemeris_iter != d_ls_pvt->gps_cnav_ephemeris_map.end()) ) { rp->log_rinex_obs(rp->obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, d_rx_time, gnss_observables_map); } if (!b_rinex_header_updated && (d_ls_pvt->gps_utc_model.d_A0 != 0)) { rp->update_obs_header(rp->obsFile, d_ls_pvt->gps_utc_model); rp->update_nav_header(rp->navFile, d_ls_pvt->gps_utc_model, d_ls_pvt->gps_iono); b_rinex_header_updated = true; } } if(type_of_rx == 9) // GPS L1 C/A + Galileo E1B { if ((galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) && (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) ) { rp->log_rinex_obs(rp->obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time, gnss_observables_map); } if (!b_rinex_header_updated && (d_ls_pvt->gps_utc_model.d_A0 != 0)) { rp->update_obs_header(rp->obsFile, d_ls_pvt->gps_utc_model); rp->update_nav_header(rp->navMixFile, d_ls_pvt->gps_iono, d_ls_pvt->gps_utc_model, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac); b_rinex_header_updated = true; } } if(type_of_rx == 14) // Galileo E1B + Galileo E5a { if (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) { rp->log_rinex_obs(rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, gnss_observables_map, "1B 5X"); } if (!b_rinex_header_updated && (d_ls_pvt->galileo_utc_model.A0_6 != 0)) { rp->update_nav_header(rp->navGalFile, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac); rp->update_obs_header(rp->obsFile, d_ls_pvt->galileo_utc_model); b_rinex_header_updated = true; } } if(type_of_rx == 15) // Galileo E1B + Galileo E5b { if (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) { rp->log_rinex_obs(rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, gnss_observables_map, "1B 7X"); } if (!b_rinex_header_updated && (d_ls_pvt->galileo_utc_model.A0_6 != 0)) { rp->update_nav_header(rp->navGalFile, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac); rp->update_obs_header(rp->obsFile, d_ls_pvt->galileo_utc_model); b_rinex_header_updated = true; } } } // ####################### RTCM MESSAGES ################# if(b_rtcm_writing_started) { if(type_of_rx == 1) // GPS L1 C/A { if((d_sample_counter % d_rtcm_MT1019_rate_ms) == 0) { for(std::map::iterator gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.begin(); gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end(); gps_ephemeris_iter++ ) { d_rtcm_printer->Print_Rtcm_MT1019(gps_ephemeris_iter->second); } } if((d_sample_counter % d_rtcm_MSM_rate_ms) == 0) { std::map::iterator gps_ephemeris_iter; gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.begin(); if (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) { d_rtcm_printer->Print_Rtcm_MSM(7, gps_ephemeris_iter->second, {}, {}, d_rx_time, gnss_observables_map, 0, 0, 0, 0, 0); } } } if((type_of_rx == 4) || (type_of_rx == 5) || (type_of_rx == 6) || (type_of_rx == 14) || (type_of_rx == 15)) // Galileo { if((d_sample_counter % (d_rtcm_MT1045_rate_ms / 4) ) == 0) { for(std::map::iterator gal_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.begin(); gal_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end(); gal_ephemeris_iter++ ) { d_rtcm_printer->Print_Rtcm_MT1045(gal_ephemeris_iter->second); } } if((d_sample_counter % (d_rtcm_MSM_rate_ms / 4) ) == 0) { std::map::iterator gal_ephemeris_iter; gal_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.begin(); if (gal_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) { d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, gal_ephemeris_iter->second, d_rx_time, gnss_observables_map, 0, 0, 0, 0, 0); } } } if(type_of_rx == 7) // GPS L1 C/A + GPS L2C { if((d_sample_counter % d_rtcm_MT1019_rate_ms) == 0) { for(std::map::iterator gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.begin(); gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end(); gps_ephemeris_iter++ ) { d_rtcm_printer->Print_Rtcm_MT1019(gps_ephemeris_iter->second); } } if((d_sample_counter % d_rtcm_MSM_rate_ms) == 0) { std::map::iterator gps_ephemeris_iter; gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.begin(); std::map::iterator gps_cnav_ephemeris_iter; gps_cnav_ephemeris_iter = d_ls_pvt->gps_cnav_ephemeris_map.begin(); if ((gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) && (gps_cnav_ephemeris_iter != d_ls_pvt->gps_cnav_ephemeris_map.end()) ) { d_rtcm_printer->Print_Rtcm_MSM(7, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, {}, d_rx_time, gnss_observables_map, 0, 0, 0, 0, 0); } } } if(type_of_rx == 9) // GPS L1 C/A + Galileo E1B { if(((d_sample_counter % (d_rtcm_MT1019_rate_ms / 4)) == 0) && (d_rtcm_MT1019_rate_ms != 0)) { for(gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.begin(); gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end(); gps_ephemeris_iter++ ) { d_rtcm_printer->Print_Rtcm_MT1019(gps_ephemeris_iter->second); } } if(((d_sample_counter % (d_rtcm_MT1045_rate_ms / 4)) == 0) && (d_rtcm_MT1045_rate_ms != 0)) { for(galileo_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.begin(); galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end(); galileo_ephemeris_iter++ ) { d_rtcm_printer->Print_Rtcm_MT1045(galileo_ephemeris_iter->second); } } if(((d_sample_counter % (d_rtcm_MT1097_rate_ms / 4) ) == 0) || ((d_sample_counter % (d_rtcm_MT1077_rate_ms / 4) ) == 0)) { //gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.end(); //galileo_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.end(); unsigned int i = 0; for (gnss_observables_iter = gnss_observables_map.begin(); gnss_observables_iter != gnss_observables_map.end(); gnss_observables_iter++) { std::string system(&gnss_observables_iter->second.System, 1); if(gps_channel == 0) { if(system.compare("G") == 0) { // This is a channel with valid GPS signal gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.find(gnss_observables_iter->second.PRN); if (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) { gps_channel = i; } } } if(gal_channel == 0) { if(system.compare("E") == 0) { galileo_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.find(gnss_observables_iter->second.PRN); if (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) { gal_channel = i; } } } i++; } if(((d_sample_counter % (d_rtcm_MT1097_rate_ms / 4) ) == 0) && (d_rtcm_MT1097_rate_ms != 0) ) { if (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) { d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, galileo_ephemeris_iter->second, d_rx_time, gnss_observables_map, 0, 0, 0, 0, 0); } } if(((d_sample_counter % (d_rtcm_MT1077_rate_ms / 4) ) == 0) && (d_rtcm_MT1077_rate_ms != 0) ) { if (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) { d_rtcm_printer->Print_Rtcm_MSM(7, gps_ephemeris_iter->second, {}, {}, d_rx_time, gnss_observables_map, 0, 0, 0, 0, 0); } } } } } if(!b_rtcm_writing_started) // the first time { if(type_of_rx == 1) // GPS L1 C/A { for(std::map::iterator gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.begin(); gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end(); gps_ephemeris_iter++ ) { d_rtcm_printer->Print_Rtcm_MT1019(gps_ephemeris_iter->second); } std::map::iterator gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.begin(); if (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) { d_rtcm_printer->Print_Rtcm_MSM(7, gps_ephemeris_iter->second, {}, {}, d_rx_time, gnss_observables_map, 0, 0, 0, 0, 0); } b_rtcm_writing_started = true; } if((type_of_rx == 4) || (type_of_rx == 5) || (type_of_rx == 6) || (type_of_rx == 14) || (type_of_rx == 15)) // Galileo { for(std::map::iterator gal_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.begin(); gal_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end(); gal_ephemeris_iter++ ) { d_rtcm_printer->Print_Rtcm_MT1045(gal_ephemeris_iter->second); } std::map::iterator gal_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.begin(); if (gal_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) { d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, gal_ephemeris_iter->second, d_rx_time, gnss_observables_map, 0, 0, 0, 0, 0); } b_rtcm_writing_started = true; } if(type_of_rx == 7) // GPS L1 C/A + GPS L2C { for(std::map::iterator gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.begin(); gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end(); gps_ephemeris_iter++ ) { d_rtcm_printer->Print_Rtcm_MT1019(gps_ephemeris_iter->second); } std::map::iterator gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.begin(); std::map::iterator gps_cnav_ephemeris_iter = d_ls_pvt->gps_cnav_ephemeris_map.begin(); if ((gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) && (gps_cnav_ephemeris_iter != d_ls_pvt->gps_cnav_ephemeris_map.end())) { d_rtcm_printer->Print_Rtcm_MSM(7, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, {}, d_rx_time, gnss_observables_map, 0, 0, 0, 0, 0); } b_rtcm_writing_started = true; } if(type_of_rx == 9) // GPS L1 C/A + Galileo E1B { if(d_rtcm_MT1019_rate_ms != 0) // allows deactivating messages by setting rate = 0 { for(std::map::iterator gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.begin(); gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end(); gps_ephemeris_iter++ ) { d_rtcm_printer->Print_Rtcm_MT1019(gps_ephemeris_iter->second); } } if(d_rtcm_MT1045_rate_ms != 0) { for(galileo_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.begin(); galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end(); galileo_ephemeris_iter++ ) { d_rtcm_printer->Print_Rtcm_MT1045(galileo_ephemeris_iter->second); } } unsigned int i = 0; for (gnss_observables_iter = gnss_observables_map.begin(); gnss_observables_iter != gnss_observables_map.end(); gnss_observables_iter++) { std::string system(&gnss_observables_iter->second.System, 1); if(gps_channel == 0) { if(system.compare("G") == 0) { // This is a channel with valid GPS signal gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.find(gnss_observables_iter->second.PRN); if (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) { gps_channel = i; } } } if(gal_channel == 0) { if(system.compare("E") == 0) { galileo_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.find(gnss_observables_iter->second.PRN); if (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) { gal_channel = i; } } } i++; } if (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end() && (d_rtcm_MT1077_rate_ms != 0)) { d_rtcm_printer->Print_Rtcm_MSM(7, gps_ephemeris_iter->second, {}, {}, d_rx_time, gnss_observables_map, 0, 0, 0, 0, 0); } if (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end() && (d_rtcm_MT1097_rate_ms != 0) ) { d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, galileo_ephemeris_iter->second, d_rx_time, gnss_observables_map, 0, 0, 0, 0, 0); } b_rtcm_writing_started = true; } } } } // DEBUG MESSAGE: Display position in console output if (((d_sample_counter % d_display_rate_ms) == 0) and d_ls_pvt->b_valid_position == true) { std::cout << "Position at " << boost::posix_time::to_simple_string(d_ls_pvt->d_position_UTC_time) << " UTC using "<< d_ls_pvt->d_valid_observations<<" observations is Lat = " << d_ls_pvt->d_latitude_d << " [deg], Long = " << d_ls_pvt->d_longitude_d << " [deg], Height= " << d_ls_pvt->d_height_m << " [m]" << std::endl; LOG(INFO) << "Position at " << boost::posix_time::to_simple_string(d_ls_pvt->d_position_UTC_time) << " UTC using "<< d_ls_pvt->d_valid_observations<<" observations is Lat = " << d_ls_pvt->d_latitude_d << " [deg], Long = " << d_ls_pvt->d_longitude_d << " [deg], Height= " << d_ls_pvt->d_height_m << " [m]"; /* std::cout << "Dilution of Precision at " << boost::posix_time::to_simple_string(d_ls_pvt->d_position_UTC_time) << " UTC using "<< d_ls_pvt->d_valid_observations<<" observations is HDOP = " << d_ls_pvt->d_HDOP << " VDOP = " << d_ls_pvt->d_VDOP <<" TDOP = " << d_ls_pvt->d_TDOP << " GDOP = " << d_ls_pvt->d_GDOP << std::endl; */ } // MULTIPLEXED FILE RECORDING - Record results to file if(d_dump == true) { try { double tmp_double; for (unsigned int i = 0; i < d_nchannels; i++) { tmp_double = in[i][0].Pseudorange_m; d_dump_file.write((char*)&tmp_double, sizeof(double)); tmp_double = 0; d_dump_file.write((char*)&tmp_double, sizeof(double)); d_dump_file.write((char*)&d_rx_time, sizeof(double)); } } catch (const std::ifstream::failure& e) { LOG(WARNING) << "Exception writing observables dump file " << e.what(); } } } consume_each(1); //one by one return 1; } gnss-sdr-0.0.9/src/algorithms/PVT/gnuradio_blocks/hybrid_pvt_cc.h000066400000000000000000000160471305042567700250470ustar00rootroot00000000000000/*! * \file hybrid_pvt_cc.h * \brief Interface of a Position Velocity and Time computation block for Galileo E1 * \author Javier Arribas, 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_HYBRID_PVT_CC_H #define GNSS_SDR_HYBRID_PVT_CC_H #include #include #include #include #include #include #include #include "nmea_printer.h" #include "kml_printer.h" #include "geojson_printer.h" #include "rinex_printer.h" #include "rtcm_printer.h" #include "hybrid_ls_pvt.h" class hybrid_pvt_cc; typedef boost::shared_ptr hybrid_pvt_cc_sptr; hybrid_pvt_cc_sptr hybrid_make_pvt_cc(unsigned int n_channels, bool dump, std::string dump_filename, int averaging_depth, bool flag_averaging, int output_rate_ms, int display_rate_ms, bool flag_nmea_tty_port, std::string nmea_dump_filename, std::string nmea_dump_devname, bool flag_rtcm_server, bool flag_rtcm_tty_port, unsigned short rtcm_tcp_port, unsigned short rtcm_station_id, std::map rtcm_msg_rate_ms, std::string rtcm_dump_devname, const unsigned int type_of_receiver); /*! * \brief This class implements a block that computes the PVT solution with Galileo E1 signals */ class hybrid_pvt_cc : public gr::block { private: friend hybrid_pvt_cc_sptr hybrid_make_pvt_cc(unsigned int nchannels, bool dump, std::string dump_filename, int averaging_depth, bool flag_averaging, int output_rate_ms, int display_rate_ms, bool flag_nmea_tty_port, std::string nmea_dump_filename, std::string nmea_dump_devname, bool flag_rtcm_server, bool flag_rtcm_tty_port, unsigned short rtcm_tcp_port, unsigned short rtcm_station_id, std::map rtcm_msg_rate_ms, std::string rtcm_dump_devname, const unsigned int type_of_receiver); hybrid_pvt_cc(unsigned int nchannels, bool dump, std::string dump_filename, int averaging_depth, bool flag_averaging, int output_rate_ms, int display_rate_ms, bool flag_nmea_tty_port, std::string nmea_dump_filename, std::string nmea_dump_devname, bool flag_rtcm_server, bool flag_rtcm_tty_port, unsigned short rtcm_tcp_port, unsigned short rtcm_station_id, std::map rtcm_msg_rate_ms, std::string rtcm_dump_devname, const unsigned int type_of_receiver); void msg_handler_telemetry(pmt::pmt_t msg); bool d_dump; bool b_rinex_header_written; bool b_rinex_header_updated; bool b_rtcm_writing_started; int d_rtcm_MT1045_rate_ms; int d_rtcm_MT1019_rate_ms; int d_rtcm_MT1077_rate_ms; int d_rtcm_MT1097_rate_ms; int d_rtcm_MSM_rate_ms; void print_receiver_status(Gnss_Synchro** channels_synchronization_data); int d_last_status_print_seg; //for status printer unsigned int d_nchannels; std::string d_dump_filename; std::ofstream d_dump_file; int d_averaging_depth; bool d_flag_averaging; int d_output_rate_ms; int d_display_rate_ms; long unsigned int d_sample_counter; long unsigned int d_last_sample_nav_output; std::shared_ptr rp; std::shared_ptr d_kml_dump; std::shared_ptr d_nmea_printer; std::shared_ptr d_geojson_printer; std::shared_ptr d_rtcm_printer; double d_rx_time; double d_TOW_at_curr_symbol_constellation; std::shared_ptr d_ls_pvt; std::map gnss_observables_map; bool observables_pairCompare_min(const std::pair& a, const std::pair& b); unsigned int type_of_rx; bool first_fix; key_t sysv_msg_key; int sysv_msqid; typedef struct { long mtype;//required by sys v message double ttff; } ttff_msgbuf; bool send_sys_v_ttff_msg(ttff_msgbuf ttff); public: /*! * \brief Get latest set of GPS L1 ephemeris from PVT block * * It is used to save the assistance data at the receiver shutdown */ std::map get_GPS_L1_ephemeris_map(); ~hybrid_pvt_cc (); //!< Default destructor int general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); //!< PVT Signal Processing }; #endif gnss-sdr-0.0.9/src/algorithms/PVT/libs/000077500000000000000000000000001305042567700176335ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/PVT/libs/CMakeLists.txt000066400000000000000000000033141305042567700223740ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # add_definitions( -DGNSS_SDR_VERSION="${VERSION}" ) set(PVT_LIB_SOURCES pvt_solution.cc ls_pvt.cc gps_l1_ca_ls_pvt.cc galileo_e1_ls_pvt.cc hybrid_ls_pvt.cc kml_printer.cc rinex_printer.cc nmea_printer.cc rtcm_printer.cc geojson_printer.cc ) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/interfaces ${CMAKE_SOURCE_DIR}/src/core/receiver ${CMAKE_SOURCE_DIR}/src/algorithms/PVT/adapters ${Boost_INCLUDE_DIRS} ${ARMADILLO_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${GLOG_INCLUDE_DIRS} ) file(GLOB PVT_LIB_HEADERS "*.h") list(SORT PVT_LIB_HEADERS) add_library(pvt_lib ${PVT_LIB_SOURCES} ${PVT_LIB_HEADERS}) source_group(Headers FILES ${PVT_LIB_HEADERS}) add_dependencies(pvt_lib armadillo-${armadillo_RELEASE} glog-${glog_RELEASE}) target_link_libraries(pvt_lib ${Boost_LIBRARIES} ${GFlags_LIBS} ${GLOG_LIBRARIES} ${ARMADILLO_LIBRARIES}) gnss-sdr-0.0.9/src/algorithms/PVT/libs/galileo_e1_ls_pvt.cc000066400000000000000000000306211305042567700235340ustar00rootroot00000000000000/*! * \file galileo_e1_ls_pvt.cc * \brief Implementation of a Least Squares Position, Velocity, and Time * (PVT) solver, based on K.Borre's Matlab receiver. * \author Javier Arribas, 2011. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_e1_ls_pvt.h" #include #include "Galileo_E1.h" using google::LogMessage; galileo_e1_ls_pvt::galileo_e1_ls_pvt(int nchannels, std::string dump_filename, bool flag_dump_to_file) : Ls_Pvt() { // init empty ephemeris for all the available GNSS channels d_nchannels = nchannels; d_ephemeris = new Galileo_Navigation_Message[nchannels]; d_dump_filename = dump_filename; d_flag_dump_enabled = flag_dump_to_file; d_galileo_current_time = 0; d_flag_averaging = false; // ############# ENABLE DATA FILE LOG ################# if (d_flag_dump_enabled == true) { if (d_dump_file.is_open() == false) { try { d_dump_file.exceptions (std::ifstream::failbit | std::ifstream::badbit); d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); LOG(INFO) << "PVT lib dump enabled Log file: " << d_dump_filename.c_str(); } catch (const std::ifstream::failure &e) { LOG(WARNING) << "Exception opening PVT lib dump file " << e.what(); } } } } galileo_e1_ls_pvt::~galileo_e1_ls_pvt() { d_dump_file.close(); delete[] d_ephemeris; } bool galileo_e1_ls_pvt::get_PVT(std::map gnss_pseudoranges_map, double galileo_current_time, bool flag_averaging) { std::map::iterator gnss_pseudoranges_iter; std::map::iterator galileo_ephemeris_iter; arma::vec W; // channels weight vector arma::vec obs; // pseudoranges observation vector arma::mat satpos; // satellite positions matrix int Galileo_week_number = 0; double utc = 0.0; double GST = 0.0; double TX_time_corrected_s = 0.0; double SV_clock_bias_s = 0.0; d_flag_averaging = flag_averaging; // ******************************************************************************** // ****** PREPARE THE LEAST SQUARES DATA (SV POSITIONS MATRIX AND OBS VECTORS) **** // ******************************************************************************** int valid_obs = 0; //valid observations counter for(gnss_pseudoranges_iter = gnss_pseudoranges_map.begin(); gnss_pseudoranges_iter != gnss_pseudoranges_map.end(); gnss_pseudoranges_iter++) { // 1- find the ephemeris for the current SV observation. The SV PRN ID is the map key galileo_ephemeris_iter = galileo_ephemeris_map.find(gnss_pseudoranges_iter->first); if (galileo_ephemeris_iter != galileo_ephemeris_map.end()) { /*! * \todo Place here the satellite CN0 (power level, or weight factor) */ W.resize(valid_obs + 1, 1); W(valid_obs) = 1; // COMMON RX TIME PVT ALGORITHM double Rx_time = galileo_current_time; double Tx_time = Rx_time - gnss_pseudoranges_iter->second.Pseudorange_m / GALILEO_C_m_s; // 2- compute the clock drift using the clock model (broadcast) for this SV, including relativistic effect SV_clock_bias_s = galileo_ephemeris_iter->second.sv_clock_drift(Tx_time); // 3- compute the current ECEF position for this SV using corrected TX time TX_time_corrected_s = Tx_time - SV_clock_bias_s; galileo_ephemeris_iter->second.satellitePosition(TX_time_corrected_s); //store satellite positions in a matrix satpos.resize(3, valid_obs + 1); satpos(0, valid_obs) = galileo_ephemeris_iter->second.d_satpos_X; satpos(1, valid_obs) = galileo_ephemeris_iter->second.d_satpos_Y; satpos(2, valid_obs) = galileo_ephemeris_iter->second.d_satpos_Z; // 4- fill the observations vector with the corrected pseudoranges obs.resize(valid_obs + 1, 1); obs(valid_obs) = gnss_pseudoranges_iter->second.Pseudorange_m + SV_clock_bias_s * GALILEO_C_m_s - d_rx_dt_s * GALILEO_C_m_s; d_visible_satellites_IDs[valid_obs] = galileo_ephemeris_iter->second.i_satellite_PRN; d_visible_satellites_CN0_dB[valid_obs] = gnss_pseudoranges_iter->second.CN0_dB_hz; Galileo_week_number = galileo_ephemeris_iter->second.WN_5; //for GST GST = galileo_ephemeris_map.find(gnss_pseudoranges_iter->first)->second.Galileo_System_Time(Galileo_week_number, galileo_current_time); // SV ECEF DEBUG OUTPUT DLOG(INFO) << "ECEF satellite SV ID=" << galileo_ephemeris_iter->second.i_satellite_PRN << " X=" << galileo_ephemeris_iter->second.d_satpos_X << " [m] Y=" << galileo_ephemeris_iter->second.d_satpos_Y << " [m] Z=" << galileo_ephemeris_iter->second.d_satpos_Z << " [m] PR_obs=" << obs(valid_obs) << " [m]"; valid_obs++; } else // the ephemeris are not available for this SV { DLOG(INFO) << "No ephemeris data for SV "<< gnss_pseudoranges_iter->first; } } // ******************************************************************************** // ****** SOLVE LEAST SQUARES****************************************************** // ******************************************************************************** d_valid_observations = valid_obs; LOG(INFO) << "Galileo PVT: valid observations=" << valid_obs; if (valid_obs >= 4) { arma::vec rx_position_and_time; DLOG(INFO) << "satpos=" << satpos; DLOG(INFO) << "obs="<< obs; DLOG(INFO) << "W=" << W; try { // check if this is the initial position computation if (d_rx_dt_s == 0) { // execute Bancroft's algorithm to estimate initial receiver position and time DLOG(INFO) << " Executing Bancroft algorithm..."; rx_position_and_time = bancroftPos(satpos.t(), obs); d_rx_pos = rx_position_and_time.rows(0, 2); // save ECEF position for the next iteration d_rx_dt_s = rx_position_and_time(3) / GALILEO_C_m_s; // save time for the next iteration [meters]->[seconds] } // Execute WLS using previous position as the initialization point rx_position_and_time = leastSquarePos(satpos, obs, W); d_rx_pos = rx_position_and_time.rows(0, 2); // save ECEF position for the next iteration d_rx_dt_s += rx_position_and_time(3) / GALILEO_C_m_s; // accumulate the rx time error for the next iteration [meters]->[seconds] // Compute Gregorian time utc = galileo_utc_model.GST_to_UTC_time(GST, Galileo_week_number); // get time string Gregorian calendar boost::posix_time::time_duration t = boost::posix_time::seconds(utc); // 22 August 1999 00:00 last Galileo start GST epoch (ICD sec 5.1.2) boost::posix_time::ptime p_time(boost::gregorian::date(1999, 8, 22), t); d_position_UTC_time = p_time; DLOG(INFO) << "Galileo Position at TOW=" << galileo_current_time << " in ECEF (X,Y,Z) = " << rx_position_and_time; cart2geo(static_cast(rx_position_and_time(0)), static_cast(rx_position_and_time(1)), static_cast(rx_position_and_time(2)), 4); d_rx_dt_s = rx_position_and_time(3)/GALILEO_C_m_s; // Convert RX time offset from meters to seconds DLOG(INFO) << "Galileo Position at " << boost::posix_time::to_simple_string(p_time) << " is Lat = " << d_latitude_d << " [deg], Long = " << d_longitude_d << " [deg], Height= " << d_height_m << " [m]" << " RX time offset= " << d_rx_dt_s << " [s]"; // ###### Compute DOPs ######## compute_DOP(); // ######## LOG FILE ######### if(d_flag_dump_enabled == true) { // MULTIPLEXED FILE RECORDING - Record results to file try { double tmp_double; // PVT GPS time tmp_double = galileo_current_time; d_dump_file.write((char*)&tmp_double, sizeof(double)); // ECEF User Position East [m] tmp_double = rx_position_and_time(0); d_dump_file.write((char*)&tmp_double, sizeof(double)); // ECEF User Position North [m] tmp_double = rx_position_and_time(1); d_dump_file.write((char*)&tmp_double, sizeof(double)); // ECEF User Position Up [m] tmp_double = rx_position_and_time(2); d_dump_file.write((char*)&tmp_double, sizeof(double)); // User clock offset [s] tmp_double = rx_position_and_time(3); d_dump_file.write((char*)&tmp_double, sizeof(double)); // GEO user position Latitude [deg] tmp_double = d_latitude_d; d_dump_file.write((char*)&tmp_double, sizeof(double)); // GEO user position Longitude [deg] tmp_double = d_longitude_d; d_dump_file.write((char*)&tmp_double, sizeof(double)); // GEO user position Height [m] tmp_double = d_height_m; d_dump_file.write((char*)&tmp_double, sizeof(double)); } catch (const std::ifstream::failure& e) { LOG(WARNING) << "Exception writing PVT LS dump file "<< e.what(); } } // MOVING AVERAGE PVT galileo_e1_ls_pvt::pos_averaging(flag_averaging); } catch(const std::exception & e) { d_rx_dt_s = 0; //reset rx time estimation LOG(WARNING) << "Problem with the solver, invalid solution!" << e.what(); b_valid_position = false; } } else { b_valid_position = false; } return b_valid_position; } gnss-sdr-0.0.9/src/algorithms/PVT/libs/galileo_e1_ls_pvt.h000066400000000000000000000045021305042567700233750ustar00rootroot00000000000000/*! * \file galileo_e1_ls_pvt.h * \brief Interface of a Least Squares Position, Velocity, and Time (PVT) * solver, based on K.Borre's Matlab receiver. * \author Javier Arribas, 2011. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_E1_LS_PVT_H_ #define GNSS_SDR_GALILEO_E1_LS_PVT_H_ #include #include #include #include #include "ls_pvt.h" #include "galileo_navigation_message.h" #include "gnss_synchro.h" #include "galileo_ephemeris.h" #include "galileo_utc_model.h" /*! * \brief This class implements a simple PVT Least Squares solution */ class galileo_e1_ls_pvt : public Ls_Pvt { public: galileo_e1_ls_pvt(int nchannels,std::string dump_filename, bool flag_dump_to_file); ~galileo_e1_ls_pvt(); bool get_PVT(std::map gnss_pseudoranges_map, double galileo_current_time, bool flag_averaging); int d_nchannels; //!< Number of available channels for positioning Galileo_Navigation_Message* d_ephemeris; std::map galileo_ephemeris_map; //!< Map storing new Galileo_Ephemeris Galileo_Utc_Model galileo_utc_model; Galileo_Iono galileo_iono; Galileo_Almanac galileo_almanac; double d_galileo_current_time; bool d_flag_dump_enabled; bool d_flag_averaging; std::string d_dump_filename; std::ofstream d_dump_file; }; #endif gnss-sdr-0.0.9/src/algorithms/PVT/libs/geojson_printer.cc000066400000000000000000000130031305042567700233460ustar00rootroot00000000000000/*! * \file geojson_printer.cc * \brief Implementation of a class that prints PVT solutions in GeoJSON format * \author Carles Fernandez-Prades, 2015. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "geojson_printer.h" #include #include #include #include GeoJSON_Printer::GeoJSON_Printer() { first_pos = true; } GeoJSON_Printer::~GeoJSON_Printer () { GeoJSON_Printer::close_file(); } bool GeoJSON_Printer::set_headers(std::string filename, bool time_tag_name) { time_t rawtime; struct tm * timeinfo; time ( &rawtime ); timeinfo = localtime ( &rawtime ); if (time_tag_name) { std::stringstream strm0; const int year = timeinfo->tm_year - 100; strm0 << year; const int month = timeinfo->tm_mon + 1; if(month < 10) { strm0 << "0"; } strm0 << month; const int day = timeinfo->tm_mday; if(day < 10) { strm0 << "0"; } strm0 << day << "_"; const int hour = timeinfo->tm_hour; if(hour < 10) { strm0 << "0"; } strm0 << hour; const int min = timeinfo->tm_min; if(min < 10) { strm0 << "0"; } strm0 << min; const int sec = timeinfo->tm_sec; if(sec < 10) { strm0 << "0"; } strm0 << sec; filename_ = filename + "_" + strm0.str() + ".geojson"; } else { filename_ = filename + ".geojson"; } geojson_file.open(filename_.c_str()); first_pos = true; if (geojson_file.is_open()) { DLOG(INFO) << "GeoJSON printer writing on " << filename.c_str(); // Set iostream numeric format and precision geojson_file.setf(geojson_file.fixed, geojson_file.floatfield); geojson_file << std::setprecision(14); // Writing the header geojson_file << "{" << std::endl; geojson_file << " \"type\": \"Feature\"," << std::endl; geojson_file << " \"properties\": {" << std::endl; geojson_file << " \"name\": \"Locations generated by GNSS-SDR\" " << std::endl; geojson_file << " }," << std::endl; geojson_file << " \"geometry\": {" << std::endl; geojson_file << " \"type\": \"MultiPoint\"," << std::endl; geojson_file << " \"coordinates\": [" << std::endl; return true; } else { return false; } } bool GeoJSON_Printer::print_position(const std::shared_ptr& position, bool print_average_values) { double latitude; double longitude; double height; std::shared_ptr position_ = position; if (print_average_values == false) { latitude = position_->d_latitude_d; longitude = position_->d_longitude_d; height = position_->d_height_m; } else { latitude = position_->d_avg_latitude_d; longitude = position_->d_avg_longitude_d; height = position_->d_avg_height_m; } if (geojson_file.is_open()) { if (first_pos == true) { geojson_file << " [" << longitude << ", " << latitude << ", " << height << "]"; first_pos = false; } else { geojson_file << "," << std::endl; geojson_file << " [" << longitude << ", " << latitude << ", " << height << "]"; } return true; } else { return false; } } bool GeoJSON_Printer::close_file() { if (geojson_file.is_open()) { geojson_file << std::endl; geojson_file << " ]" << std::endl; geojson_file << " }" << std::endl; geojson_file << "}" << std::endl; geojson_file.close(); // if nothing is written, erase the file if (first_pos == true) { if(remove(filename_.c_str()) != 0) LOG(INFO) << "Error deleting temporary file"; } return true; } else { return false; } } gnss-sdr-0.0.9/src/algorithms/PVT/libs/geojson_printer.h000066400000000000000000000034331305042567700232160ustar00rootroot00000000000000/*! * \file geojson_printer.h * \brief Interface of a class that prints PVT solutions in GeoJSON format * \author Carles Fernandez-Prades, 2015. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GEOJSON_PRINTER_H_ #define GNSS_SDR_GEOJSON_PRINTER_H_ #include #include #include #include "pvt_solution.h" /*! * \brief Prints PVT solutions in GeoJSON format file * * See http://geojson.org/geojson-spec.html */ class GeoJSON_Printer { private: std::ofstream geojson_file; bool first_pos; std::string filename_; public: GeoJSON_Printer(); ~GeoJSON_Printer(); bool set_headers(std::string filename, bool time_tag_name = true); bool print_position(const std::shared_ptr& position, bool print_average_values); bool close_file(); }; #endif gnss-sdr-0.0.9/src/algorithms/PVT/libs/gps_l1_ca_ls_pvt.cc000066400000000000000000000306361305042567700233710ustar00rootroot00000000000000/*! * \file gps_l1_ca_ls_pvt.cc * \brief Implementation of a Least Squares Position, Velocity, and Time * (PVT) solver, based on K.Borre's Matlab receiver. * \author Javier Arribas, 2011. jarribas(at)cttc.es * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l1_ca_ls_pvt.h" #include #include using google::LogMessage; gps_l1_ca_ls_pvt::gps_l1_ca_ls_pvt(int nchannels, std::string dump_filename, bool flag_dump_to_file) : Ls_Pvt() { // init empty ephemeris for all the available GNSS channels d_nchannels = nchannels; d_ephemeris = new Gps_Navigation_Message[nchannels]; d_dump_filename = dump_filename; d_flag_dump_enabled = flag_dump_to_file; d_flag_averaging = false; d_GPS_current_time = 0; // ############# ENABLE DATA FILE LOG ################# if (d_flag_dump_enabled == true) { if (d_dump_file.is_open() == false) { try { d_dump_file.exceptions (std::ifstream::failbit | std::ifstream::badbit); d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); LOG(INFO) << "PVT lib dump enabled Log file: " << d_dump_filename.c_str(); } catch (const std::ifstream::failure &e) { LOG(WARNING) << "Exception opening PVT lib dump file " << e.what(); } } } } gps_l1_ca_ls_pvt::~gps_l1_ca_ls_pvt() { d_dump_file.close(); delete[] d_ephemeris; } bool gps_l1_ca_ls_pvt::get_PVT(std::map gnss_pseudoranges_map, double GPS_current_time, bool flag_averaging) { std::map::iterator gnss_pseudoranges_iter; std::map::iterator gps_ephemeris_iter; arma::vec W; // channels weight vector arma::vec obs; // pseudoranges observation vector arma::mat satpos; // satellite positions matrix int GPS_week = 0; double utc = 0.0; double TX_time_corrected_s; double SV_clock_bias_s = 0.0; d_flag_averaging = flag_averaging; // ******************************************************************************** // ****** PREPARE THE LEAST SQUARES DATA (SV POSITIONS MATRIX AND OBS VECTORS) **** // ******************************************************************************** int valid_obs = 0; //valid observations counter for(gnss_pseudoranges_iter = gnss_pseudoranges_map.begin(); gnss_pseudoranges_iter != gnss_pseudoranges_map.end(); gnss_pseudoranges_iter++) { // 1- find the ephemeris for the current SV observation. The SV PRN ID is the map key gps_ephemeris_iter = gps_ephemeris_map.find(gnss_pseudoranges_iter->first); if (gps_ephemeris_iter != gps_ephemeris_map.end()) { /*! * \todo Place here the satellite CN0 (power level, or weight factor) */ W.resize(valid_obs + 1, 1); W(valid_obs) = 1; // COMMON RX TIME PVT ALGORITHM MODIFICATION (Like RINEX files) // first estimate of transmit time double Rx_time = GPS_current_time; double Tx_time = Rx_time - gnss_pseudoranges_iter->second.Pseudorange_m / GPS_C_m_s; // 2- compute the clock drift using the clock model (broadcast) for this SV, not including relativistic effect SV_clock_bias_s = gps_ephemeris_iter->second.sv_clock_drift(Tx_time); //- gps_ephemeris_iter->second.d_TGD; // 3- compute the current ECEF position for this SV using corrected TX time and obtain clock bias including relativistic effect TX_time_corrected_s = Tx_time - SV_clock_bias_s; double dtr = gps_ephemeris_iter->second.satellitePosition(TX_time_corrected_s); //store satellite positions in a matrix satpos.resize(3, valid_obs + 1); satpos(0, valid_obs) = gps_ephemeris_iter->second.d_satpos_X; satpos(1, valid_obs) = gps_ephemeris_iter->second.d_satpos_Y; satpos(2, valid_obs) = gps_ephemeris_iter->second.d_satpos_Z; // 4- fill the observations vector with the corrected pseudoranges obs.resize(valid_obs + 1, 1); obs(valid_obs) = gnss_pseudoranges_iter->second.Pseudorange_m + dtr * GPS_C_m_s - d_rx_dt_s * GPS_C_m_s; d_visible_satellites_IDs[valid_obs] = gps_ephemeris_iter->second.i_satellite_PRN; d_visible_satellites_CN0_dB[valid_obs] = gnss_pseudoranges_iter->second.CN0_dB_hz; // SV ECEF DEBUG OUTPUT DLOG(INFO) << "(new)ECEF satellite SV ID=" << gps_ephemeris_iter->second.i_satellite_PRN << " X=" << gps_ephemeris_iter->second.d_satpos_X << " [m] Y=" << gps_ephemeris_iter->second.d_satpos_Y << " [m] Z=" << gps_ephemeris_iter->second.d_satpos_Z << " [m] PR_obs=" << obs(valid_obs) << " [m]"; valid_obs++; // compute the UTC time for this SV (just to print the associated UTC timestamp) GPS_week = gps_ephemeris_iter->second.i_GPS_week; utc = gps_utc_model.utc_time(TX_time_corrected_s, GPS_week); } else // the ephemeris are not available for this SV { DLOG(INFO) << "No ephemeris data for SV " << gnss_pseudoranges_iter->first; } } // ******************************************************************************** // ****** SOLVE LEAST SQUARES****************************************************** // ******************************************************************************** d_valid_observations = valid_obs; LOG(INFO) << "(new)PVT: valid observations=" << valid_obs; if (valid_obs >= 4) { arma::vec rx_position_and_time; DLOG(INFO) << "satpos=" << satpos; DLOG(INFO) << "obs=" << obs; DLOG(INFO) << "W=" << W; try { // check if this is the initial position computation if (d_rx_dt_s == 0) { // execute Bancroft's algorithm to estimate initial receiver position and time DLOG(INFO) << " Executing Bancroft algorithm..."; rx_position_and_time = bancroftPos(satpos.t(), obs); d_rx_pos = rx_position_and_time.rows(0, 2); // save ECEF position for the next iteration d_rx_dt_s = rx_position_and_time(3) / GPS_C_m_s; // save time for the next iteration [meters]->[seconds] } // Execute WLS using previous position as the initialization point rx_position_and_time = leastSquarePos(satpos, obs, W); d_rx_pos = rx_position_and_time.rows(0, 2); // save ECEF position for the next iteration d_rx_dt_s += rx_position_and_time(3) / GPS_C_m_s; // accumulate the rx time error for the next iteration [meters]->[seconds] DLOG(INFO) << "(new)Position at TOW=" << GPS_current_time << " in ECEF (X,Y,Z,t[meters]) = " << rx_position_and_time; DLOG(INFO) << "Accumulated rx clock error=" << d_rx_dt_s << " clock error for this iteration=" << rx_position_and_time(3) / GPS_C_m_s << " [s]"; cart2geo(static_cast(rx_position_and_time(0)), static_cast(rx_position_and_time(1)), static_cast(rx_position_and_time(2)), 4); // Compute UTC time and print PVT solution double secondsperweek = 604800.0; // number of seconds in one week (7*24*60*60) boost::posix_time::time_duration t = boost::posix_time::seconds(utc + secondsperweek * static_cast(GPS_week)); // 22 August 1999 last GPS time roll over boost::posix_time::ptime p_time(boost::gregorian::date(1999, 8, 22), t); d_position_UTC_time = p_time; DLOG(INFO) << "Position at " << boost::posix_time::to_simple_string(p_time) << " is Lat = " << d_latitude_d << " [deg], Long = " << d_longitude_d << " [deg], Height= " << d_height_m << " [m]" << " RX time offset= " << d_rx_dt_s << " [s]"; // ###### Compute DOPs ######## compute_DOP(); // ######## LOG FILE ######### if(d_flag_dump_enabled == true) { // MULTIPLEXED FILE RECORDING - Record results to file try { double tmp_double; // PVT GPS time tmp_double = GPS_current_time; d_dump_file.write((char*)&tmp_double, sizeof(double)); // ECEF User Position East [m] tmp_double = d_rx_pos(0); d_dump_file.write((char*)&tmp_double, sizeof(double)); // ECEF User Position North [m] tmp_double = d_rx_pos(1); d_dump_file.write((char*)&tmp_double, sizeof(double)); // ECEF User Position Up [m] tmp_double = d_rx_pos(2); d_dump_file.write((char*)&tmp_double, sizeof(double)); // User clock offset [s] tmp_double = d_rx_dt_s; d_dump_file.write((char*)&tmp_double, sizeof(double)); // GEO user position Latitude [deg] tmp_double = d_latitude_d; d_dump_file.write((char*)&tmp_double, sizeof(double)); // GEO user position Longitude [deg] tmp_double = d_longitude_d; d_dump_file.write((char*)&tmp_double, sizeof(double)); // GEO user position Height [m] tmp_double = d_height_m; d_dump_file.write((char*)&tmp_double, sizeof(double)); } catch (const std::ifstream::failure &e) { LOG(WARNING) << "Exception writing PVT LS dump file " << e.what(); } } // MOVING AVERAGE PVT pos_averaging(flag_averaging); } catch(const std::exception & e) { d_rx_dt_s = 0; //reset rx time estimation LOG(WARNING) << "Problem with the solver, invalid solution!" << e.what(); b_valid_position = false; } } else { b_valid_position = false; } return b_valid_position; } gnss-sdr-0.0.9/src/algorithms/PVT/libs/gps_l1_ca_ls_pvt.h000066400000000000000000000051221305042567700232230ustar00rootroot00000000000000/*! * \file gps_l1_ca_ls_pvt.h * \brief Interface of a Least Squares Position, Velocity, and Time (PVT) * solver for GPS L1 C/A, based on K.Borre's Matlab receiver. * \author Javier Arribas, 2011. jarribas(at)cttc.es * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L1_CA_LS_PVT_H_ #define GNSS_SDR_GPS_L1_CA_LS_PVT_H_ #include #include #include #include "ls_pvt.h" #include "GPS_L1_CA.h" #include "gnss_synchro.h" #include "gps_ephemeris.h" #include "gps_navigation_message.h" #include "gps_utc_model.h" #include "sbas_telemetry_data.h" #include "sbas_ionospheric_correction.h" #include "sbas_satellite_correction.h" #include "sbas_ephemeris.h" /*! * \brief This class implements a simple PVT Least Squares solution for GPS L1 C/A signals */ class gps_l1_ca_ls_pvt : public Ls_Pvt { public: gps_l1_ca_ls_pvt(int nchannels, std::string dump_filename, bool flag_dump_to_file); ~gps_l1_ca_ls_pvt(); bool get_PVT(std::map gnss_pseudoranges_map, double GPS_current_time, bool flag_averaging); int d_nchannels; //!< Number of available channels for positioning Gps_Navigation_Message* d_ephemeris; // new ephemeris storage std::map gps_ephemeris_map; //!< Map storing new Gps_Ephemeris Gps_Utc_Model gps_utc_model; Gps_Iono gps_iono; Sbas_Ionosphere_Correction sbas_iono; std::map sbas_sat_corr_map; std::map sbas_ephemeris_map; double d_GPS_current_time; bool d_flag_dump_enabled; bool d_flag_averaging; std::string d_dump_filename; std::ofstream d_dump_file; }; #endif gnss-sdr-0.0.9/src/algorithms/PVT/libs/hybrid_ls_pvt.cc000066400000000000000000000521341305042567700230170ustar00rootroot00000000000000/*! * \file galileo_e1_ls_pvt.cc * \brief Implementation of a Least Squares Position, Velocity, and Time * (PVT) solver, based on K.Borre's Matlab receiver. * \author Javier Arribas, 2011. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "hybrid_ls_pvt.h" #include #include "Galileo_E1.h" using google::LogMessage; hybrid_ls_pvt::hybrid_ls_pvt(int nchannels, std::string dump_filename, bool flag_dump_to_file) : Ls_Pvt() { // init empty ephemeris for all the available GNSS channels d_nchannels = nchannels; d_dump_filename = dump_filename; d_flag_dump_enabled = flag_dump_to_file; d_galileo_current_time = 0; count_valid_position = 0; d_flag_averaging = false; // ############# ENABLE DATA FILE LOG ################# if (d_flag_dump_enabled == true) { if (d_dump_file.is_open() == false) { try { d_dump_file.exceptions (std::ifstream::failbit | std::ifstream::badbit); d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); LOG(INFO) << "PVT lib dump enabled Log file: " << d_dump_filename.c_str(); } catch (const std::ifstream::failure &e) { LOG(WARNING) << "Exception opening PVT lib dump file " << e.what(); } } } } hybrid_ls_pvt::~hybrid_ls_pvt() { d_dump_file.close(); } bool hybrid_ls_pvt::get_PVT(std::map gnss_observables_map, double hybrid_current_time, bool flag_averaging) { std::map::iterator gnss_observables_iter; std::map::iterator galileo_ephemeris_iter; std::map::iterator gps_ephemeris_iter; std::map::iterator gps_cnav_ephemeris_iter; arma::vec W; // channels weight vector arma::vec obs; // pseudoranges observation vector arma::mat satpos; // satellite positions matrix int Galileo_week_number = 0; int GPS_week = 0; double utc = 0.0; double GST = 0.0; //double utc_tx_corrected = 0.0; //utc computed at tx_time_corrected, added for Galileo constellation (in GPS utc is directly computed at TX_time_corrected_s) double TX_time_corrected_s = 0.0; double SV_clock_bias_s = 0.0; d_flag_averaging = flag_averaging; // ******************************************************************************** // ****** PREPARE THE LEAST SQUARES DATA (SV POSITIONS MATRIX AND OBS VECTORS) **** // ******************************************************************************** int valid_obs = 0; //valid observations counter for(gnss_observables_iter = gnss_observables_map.begin(); gnss_observables_iter != gnss_observables_map.end(); gnss_observables_iter++) { switch(gnss_observables_iter->second.System) { case 'E': { // 1 Gal - find the ephemeris for the current GALILEO SV observation. The SV PRN ID is the map key galileo_ephemeris_iter = galileo_ephemeris_map.find(gnss_observables_iter->second.PRN); if (galileo_ephemeris_iter != galileo_ephemeris_map.end()) { /*! * \todo Place here the satellite CN0 (power level, or weight factor) */ W.resize(valid_obs + 1, 1); W(valid_obs) = 1; // COMMON RX TIME PVT ALGORITHM double Rx_time = hybrid_current_time; double Tx_time = Rx_time - gnss_observables_iter->second.Pseudorange_m / GALILEO_C_m_s; // 2- compute the clock drift using the clock model (broadcast) for this SV SV_clock_bias_s = galileo_ephemeris_iter->second.sv_clock_drift(Tx_time); // 3- compute the current ECEF position for this SV using corrected TX time TX_time_corrected_s = Tx_time - SV_clock_bias_s; galileo_ephemeris_iter->second.satellitePosition(TX_time_corrected_s); //store satellite positions in a matrix satpos.resize(3, valid_obs + 1); satpos(0, valid_obs) = galileo_ephemeris_iter->second.d_satpos_X; satpos(1, valid_obs) = galileo_ephemeris_iter->second.d_satpos_Y; satpos(2, valid_obs) = galileo_ephemeris_iter->second.d_satpos_Z; // 4- fill the observations vector with the corrected observables obs.resize(valid_obs + 1, 1); obs(valid_obs) = gnss_observables_iter->second.Pseudorange_m + SV_clock_bias_s * GALILEO_C_m_s - d_rx_dt_s * GALILEO_C_m_s; d_visible_satellites_IDs[valid_obs] = galileo_ephemeris_iter->second.i_satellite_PRN; d_visible_satellites_CN0_dB[valid_obs] = gnss_observables_iter->second.CN0_dB_hz; Galileo_week_number = galileo_ephemeris_iter->second.WN_5; //for GST GST = galileo_ephemeris_iter->second.Galileo_System_Time(Galileo_week_number, hybrid_current_time); // SV ECEF DEBUG OUTPUT DLOG(INFO) << "ECEF satellite SV ID=" << galileo_ephemeris_iter->second.i_satellite_PRN << " X=" << galileo_ephemeris_iter->second.d_satpos_X << " [m] Y=" << galileo_ephemeris_iter->second.d_satpos_Y << " [m] Z=" << galileo_ephemeris_iter->second.d_satpos_Z << " [m] PR_obs=" << obs(valid_obs) << " [m]"; valid_obs++; } else // the ephemeris are not available for this SV { DLOG(INFO) << "No ephemeris data for SV " << gnss_observables_iter->second.PRN; } break; } case 'G': { // 1 GPS - find the ephemeris for the current GPS SV observation. The SV PRN ID is the map key std::string sig_(gnss_observables_iter->second.Signal); if(sig_.compare("1C") == 0) { gps_ephemeris_iter = gps_ephemeris_map.find(gnss_observables_iter->second.PRN); if (gps_ephemeris_iter != gps_ephemeris_map.end()) { /*! * \todo Place here the satellite CN0 (power level, or weight factor) */ W.resize(valid_obs + 1, 1); W(valid_obs) = 1; // COMMON RX TIME PVT ALGORITHM MODIFICATION (Like RINEX files) // first estimate of transmit time double Rx_time = hybrid_current_time; double Tx_time = Rx_time - gnss_observables_iter->second.Pseudorange_m / GPS_C_m_s; // 2- compute the clock drift using the clock model (broadcast) for this SV, not including relativistic effect SV_clock_bias_s = gps_ephemeris_iter->second.sv_clock_drift(Tx_time); //- gps_ephemeris_iter->second.d_TGD; // 3- compute the current ECEF position for this SV using corrected TX time and obtain clock bias including relativistic effect TX_time_corrected_s = Tx_time - SV_clock_bias_s; double dtr = gps_ephemeris_iter->second.satellitePosition(TX_time_corrected_s); //store satellite positions in a matrix satpos.resize(3, valid_obs + 1); satpos(0, valid_obs) = gps_ephemeris_iter->second.d_satpos_X; satpos(1, valid_obs) = gps_ephemeris_iter->second.d_satpos_Y; satpos(2, valid_obs) = gps_ephemeris_iter->second.d_satpos_Z; // 4- fill the observations vector with the corrected pseudoranges obs.resize(valid_obs + 1, 1); obs(valid_obs) = gnss_observables_iter->second.Pseudorange_m + dtr * GPS_C_m_s - d_rx_dt_s * GPS_C_m_s; d_visible_satellites_IDs[valid_obs] = gps_ephemeris_iter->second.i_satellite_PRN; d_visible_satellites_CN0_dB[valid_obs] = gnss_observables_iter->second.CN0_dB_hz; // SV ECEF DEBUG OUTPUT DLOG(INFO) << "(new)ECEF satellite SV ID=" << gps_ephemeris_iter->second.i_satellite_PRN << " X=" << gps_ephemeris_iter->second.d_satpos_X << " [m] Y=" << gps_ephemeris_iter->second.d_satpos_Y << " [m] Z=" << gps_ephemeris_iter->second.d_satpos_Z << " [m] PR_obs=" << obs(valid_obs) << " [m]"; valid_obs++; // compute the UTC time for this SV (just to print the associated UTC timestamp) GPS_week = gps_ephemeris_iter->second.i_GPS_week; utc = gps_utc_model.utc_time(TX_time_corrected_s, GPS_week); } else // the ephemeris are not available for this SV { DLOG(INFO) << "No ephemeris data for SV " << gnss_observables_iter->first; } } if(sig_.compare("2S") == 0) { gps_cnav_ephemeris_iter = gps_cnav_ephemeris_map.find(gnss_observables_iter->second.PRN); if (gps_cnav_ephemeris_iter != gps_cnav_ephemeris_map.end()) { /*! * \todo Place here the satellite CN0 (power level, or weight factor) */ W.resize(valid_obs + 1, 1); W(valid_obs) = 1; // COMMON RX TIME PVT ALGORITHM MODIFICATION (Like RINEX files) // first estimate of transmit time double Rx_time = hybrid_current_time; double Tx_time = Rx_time - gnss_observables_iter->second.Pseudorange_m / GPS_C_m_s; // 2- compute the clock drift using the clock model (broadcast) for this SV SV_clock_bias_s = gps_cnav_ephemeris_iter->second.sv_clock_drift(Tx_time); // 3- compute the current ECEF position for this SV using corrected TX time TX_time_corrected_s = Tx_time - SV_clock_bias_s; gps_cnav_ephemeris_iter->second.satellitePosition(TX_time_corrected_s); //store satellite positions in a matrix satpos.resize(3, valid_obs + 1); satpos(0, valid_obs) = gps_cnav_ephemeris_iter->second.d_satpos_X; satpos(1, valid_obs) = gps_cnav_ephemeris_iter->second.d_satpos_Y; satpos(2, valid_obs) = gps_cnav_ephemeris_iter->second.d_satpos_Z; // 4- fill the observations vector with the corrected observables obs.resize(valid_obs + 1, 1); obs(valid_obs) = gnss_observables_iter->second.Pseudorange_m + SV_clock_bias_s * GPS_C_m_s; d_visible_satellites_IDs[valid_obs] = gps_cnav_ephemeris_iter->second.i_satellite_PRN; d_visible_satellites_CN0_dB[valid_obs] = gnss_observables_iter->second.CN0_dB_hz; GPS_week = gps_cnav_ephemeris_iter->second.i_GPS_week; // SV ECEF DEBUG OUTPUT DLOG(INFO) << "(new)ECEF satellite SV ID=" << gps_cnav_ephemeris_iter->second.i_satellite_PRN << " X=" << gps_cnav_ephemeris_iter->second.d_satpos_X << " [m] Y=" << gps_cnav_ephemeris_iter->second.d_satpos_Y << " [m] Z=" << gps_cnav_ephemeris_iter->second.d_satpos_Z << " [m] PR_obs=" << obs(valid_obs) << " [m]"; valid_obs++; } else // the ephemeris are not available for this SV { DLOG(INFO) << "No ephemeris data for SV " << gnss_observables_iter->second.PRN; } } break; } default : DLOG(INFO) << "Hybrid observables: Unknown GNSS"; break; } } // ******************************************************************************** // ****** SOLVE LEAST SQUARES****************************************************** // ******************************************************************************** d_valid_observations = valid_obs; LOG(INFO) << "HYBRID PVT: valid observations=" << valid_obs; if(valid_obs >= 4) { arma::vec rx_position_and_time; DLOG(INFO) << "satpos=" << satpos; DLOG(INFO) << "obs=" << obs; DLOG(INFO) << "W=" << W; try { // check if this is the initial position computation if (d_rx_dt_s == 0) { // execute Bancroft's algorithm to estimate initial receiver position and time DLOG(INFO) << " Executing Bancroft algorithm..."; rx_position_and_time = bancroftPos(satpos.t(), obs); d_rx_pos = rx_position_and_time.rows(0, 2); // save ECEF position for the next iteration d_rx_dt_s = rx_position_and_time(3) / GPS_C_m_s; // save time for the next iteration [meters]->[seconds] } // Execute WLS using previous position as the initialization point rx_position_and_time = leastSquarePos(satpos, obs, W); d_rx_pos = rx_position_and_time.rows(0, 2); // save ECEF position for the next iteration d_rx_dt_s += rx_position_and_time(3) / GPS_C_m_s; // accumulate the rx time error for the next iteration [meters]->[seconds] DLOG(INFO) << "Hybrid Position at TOW=" << hybrid_current_time << " in ECEF (X,Y,Z,t[meters]) = " << rx_position_and_time; DLOG(INFO) << "Accumulated rx clock error=" << d_rx_dt_s << " clock error for this iteration=" << rx_position_and_time(3) / GPS_C_m_s << " [s]"; double secondsperweek = 604800.0; // Compute GST and Gregorian time if( GST != 0.0) { utc = galileo_utc_model.GST_to_UTC_time(GST, Galileo_week_number); } else { utc = gps_utc_model.utc_time(TX_time_corrected_s, GPS_week) + secondsperweek * static_cast(GPS_week); } // get time string Gregorian calendar boost::posix_time::time_duration t = boost::posix_time::seconds(utc); // 22 August 1999 00:00 last Galileo start GST epoch (ICD sec 5.1.2) boost::posix_time::ptime p_time(boost::gregorian::date(1999, 8, 22), t); d_position_UTC_time = p_time; cart2geo(static_cast(rx_position_and_time(0)), static_cast(rx_position_and_time(1)), static_cast(rx_position_and_time(2)), 4); DLOG(INFO) << "Hybrid Position at " << boost::posix_time::to_simple_string(p_time) << " is Lat = " << d_latitude_d << " [deg], Long = " << d_longitude_d << " [deg], Height= " << d_height_m << " [m]" << " RX time offset= " << d_rx_dt_s << " [s]"; // ###### Compute DOPs ######## hybrid_ls_pvt::compute_DOP(); // ######## LOG FILE ######### if(d_flag_dump_enabled == true) { // MULTIPLEXED FILE RECORDING - Record results to file try { double tmp_double; // PVT GPS time tmp_double = hybrid_current_time; d_dump_file.write((char*)&tmp_double, sizeof(double)); // ECEF User Position East [m] tmp_double = rx_position_and_time(0); d_dump_file.write((char*)&tmp_double, sizeof(double)); // ECEF User Position North [m] tmp_double = rx_position_and_time(1); d_dump_file.write((char*)&tmp_double, sizeof(double)); // ECEF User Position Up [m] tmp_double = rx_position_and_time(2); d_dump_file.write((char*)&tmp_double, sizeof(double)); // User clock offset [s] tmp_double = rx_position_and_time(3); d_dump_file.write((char*)&tmp_double, sizeof(double)); // GEO user position Latitude [deg] tmp_double = d_latitude_d; d_dump_file.write((char*)&tmp_double, sizeof(double)); // GEO user position Longitude [deg] tmp_double = d_longitude_d; d_dump_file.write((char*)&tmp_double, sizeof(double)); // GEO user position Height [m] tmp_double = d_height_m; d_dump_file.write((char*)&tmp_double, sizeof(double)); } catch (const std::ifstream::failure& e) { LOG(WARNING) << "Exception writing PVT LS dump file " << e.what(); } } // MOVING AVERAGE PVT pos_averaging(flag_averaging); } catch(const std::exception & e) { d_rx_dt_s = 0; //reset rx time estimation LOG(WARNING) << "Problem with the solver, invalid solution!" << e.what(); b_valid_position = false; } } else { b_valid_position = false; } return b_valid_position; } gnss-sdr-0.0.9/src/algorithms/PVT/libs/hybrid_ls_pvt.h000066400000000000000000000051601305042567700226560ustar00rootroot00000000000000/*! * \file galileo_e1_ls_pvt.h * \brief Interface of a Least Squares Position, Velocity, and Time (PVT) * solver, based on K.Borre's Matlab receiver. * \author Javier Arribas, 2011. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_HYBRID_LS_PVT_H_ #define GNSS_SDR_HYBRID_LS_PVT_H_ #include #include #include #include #include "ls_pvt.h" #include "galileo_navigation_message.h" #include "gps_navigation_message.h" #include "gps_cnav_navigation_message.h" #include "gnss_synchro.h" /*! * \brief This class implements a simple PVT Least Squares solution */ class hybrid_ls_pvt : public Ls_Pvt { public: hybrid_ls_pvt(int nchannels,std::string dump_filename, bool flag_dump_to_file); ~hybrid_ls_pvt(); bool get_PVT(std::map gnss_observables_map, double hybrid_current_time, bool flag_averaging); int d_nchannels; //!< Number of available channels for positioning std::map galileo_ephemeris_map; //!< Map storing new Galileo_Ephemeris std::map gps_ephemeris_map; //!< Map storing new GPS_Ephemeris std::map gps_cnav_ephemeris_map; Galileo_Utc_Model galileo_utc_model; Galileo_Iono galileo_iono; Galileo_Almanac galileo_almanac; Gps_Utc_Model gps_utc_model; Gps_Iono gps_iono; Gps_CNAV_Iono gps_cnav_iono; Gps_CNAV_Utc_Model gps_cnav_utc_model; double d_galileo_current_time; int count_valid_position; bool d_flag_dump_enabled; bool d_flag_averaging; std::string d_dump_filename; std::ofstream d_dump_file; }; #endif gnss-sdr-0.0.9/src/algorithms/PVT/libs/kml_printer.cc000066400000000000000000000140421305042567700224710ustar00rootroot00000000000000/*! * \file kml_printer.cc * \brief Implementation of a class that prints PVT information to a kml file * \author Javier Arribas, 2011. jarribas(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "kml_printer.h" #include #include #include using google::LogMessage; bool Kml_Printer::set_headers(std::string filename, bool time_tag_name) { time_t rawtime; struct tm * timeinfo; time ( &rawtime ); timeinfo = localtime ( &rawtime ); if (time_tag_name) { std::stringstream strm0; const int year = timeinfo->tm_year - 100; strm0 << year; const int month = timeinfo->tm_mon + 1; if(month < 10) { strm0 << "0"; } strm0 << month; const int day = timeinfo->tm_mday; if(day < 10) { strm0 << "0"; } strm0 << day << "_"; const int hour = timeinfo->tm_hour; if(hour < 10) { strm0 << "0"; } strm0 << hour; const int min = timeinfo->tm_min; if(min < 10) { strm0 << "0"; } strm0 << min; const int sec = timeinfo->tm_sec; if(sec < 10) { strm0 << "0"; } strm0 << sec; kml_filename = filename + "_" + strm0.str() + ".kml"; } else { kml_filename = filename + ".kml"; } kml_file.open(kml_filename.c_str()); if (kml_file.is_open()) { DLOG(INFO) << "KML printer writing on " << filename.c_str(); // Set iostream numeric format and precision kml_file.setf(kml_file.fixed, kml_file.floatfield); kml_file << std::setprecision(14); kml_file << "" << std::endl << "" << std::endl << " " << std::endl << " GNSS Track" << std::endl << " GNSS-SDR Receiver position log file created at " << asctime (timeinfo) << " " << std::endl << "" << std::endl << "" << std::endl << "GNSS-SDR PVT" << std::endl << "GNSS-SDR position log" << std::endl << "#yellowLineGreenPoly" << std::endl << "" << std::endl << "0" << std::endl << "1" << std::endl << "absolute" << std::endl << "" << std::endl; return true; } else { return false; } } bool Kml_Printer::print_position(const std::shared_ptr& position, bool print_average_values) { double latitude; double longitude; double height; positions_printed = true; std::shared_ptr position_ = position; if (print_average_values == false) { latitude = position_->d_latitude_d; longitude = position_->d_longitude_d; height = position_->d_height_m; } else { latitude = position_->d_avg_latitude_d; longitude = position_->d_avg_longitude_d; height = position_->d_avg_height_m; } if (kml_file.is_open()) { kml_file << longitude << "," << latitude << "," << height << std::endl; return true; } else { return false; } } bool Kml_Printer::close_file() { if (kml_file.is_open()) { kml_file << "" << std::endl << "" << std::endl << "" << std::endl << "" << std::endl << ""; kml_file.close(); return true; } else { return false; } } Kml_Printer::Kml_Printer () { positions_printed = false; } Kml_Printer::~Kml_Printer () { close_file(); if(!positions_printed) { if(remove(kml_filename.c_str()) != 0) LOG(INFO) << "Error deleting temporary KML file"; } } gnss-sdr-0.0.9/src/algorithms/PVT/libs/kml_printer.h000066400000000000000000000034731305042567700223410ustar00rootroot00000000000000/*! * \file kml_printer.h * \brief Interface of a class that prints PVT information to a kml file * \author Javier Arribas, 2011. jarribas(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_KML_PRINTER_H_ #define GNSS_SDR_KML_PRINTER_H_ #include #include #include #include #include "pvt_solution.h" /*! * \brief Prints PVT information to OGC KML format file (can be viewed with Google Earth) * * See http://www.opengeospatial.org/standards/kml */ class Kml_Printer { private: std::ofstream kml_file; bool positions_printed; std::string kml_filename; public: Kml_Printer(); ~Kml_Printer(); bool set_headers(std::string filename, bool time_tag_name = true); bool print_position(const std::shared_ptr& position, bool print_average_values); bool close_file(); }; #endif gnss-sdr-0.0.9/src/algorithms/PVT/libs/ls_pvt.cc000066400000000000000000000273311305042567700214570ustar00rootroot00000000000000/*! * \file ls_pvt.cc * \brief Implementation of a base class for Least Squares PVT solutions * \author Carles Fernandez-Prades, 2015. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "ls_pvt.h" #include #include #include "GPS_L1_CA.h" #include #include using google::LogMessage; Ls_Pvt::Ls_Pvt() : Pvt_Solution() { } arma::vec Ls_Pvt::bancroftPos(const arma::mat& satpos, const arma::vec& obs) { // BANCROFT Calculation of preliminary coordinates for a GPS receiver based on pseudoranges // to 4 or more satellites. The ECEF coordinates are stored in satpos. // The observed pseudoranges are stored in obs // Reference: Bancroft, S. (1985) An Algebraic Solution of the GPS Equations, // IEEE Trans. Aerosp. and Elec. Systems, AES-21, Issue 1, pp. 56--59 // Based on code by: // Kai Borre 04-30-95, improved by C.C. Goad 11-24-96 // // Test values to use in debugging // B_pass =[ -11716227.778 -10118754.628 21741083.973 22163882.029; // -12082643.974 -20428242.179 11741374.154 21492579.823; // 14373286.650 -10448439.349 19596404.858 21492492.771; // 10278432.244 -21116508.618 -12689101.970 25284588.982 ]; // Solution: 595025.053 -4856501.221 4078329.981 // // Test values to use in debugging // B_pass = [14177509.188 -18814750.650 12243944.449 21119263.116; // 15097198.146 -4636098.555 21326705.426 22527063.486; // 23460341.997 -9433577.991 8174873.599 23674159.579; // -8206498.071 -18217989.839 17605227.065 20951643.862; // 1399135.830 -17563786.820 19705534.862 20155386.649; // 6995655.459 -23537808.269 -9927906.485 24222112.972 ]; // Solution: 596902.683 -4847843.316 4088216.740 arma::vec pos = arma::zeros(4,1); arma::mat B_pass = arma::zeros(obs.size(), 4); B_pass.submat(0, 0, obs.size() - 1, 2) = satpos; B_pass.col(3) = obs; arma::mat B; arma::mat BBB; double traveltime = 0; for (int iter = 0; iter < 2; iter++) { B = B_pass; int m = arma::size(B,0); for (int i = 0; i < m; i++) { int x = B(i,0); int y = B(i,1); if (iter == 0) { traveltime = 0.072; } else { int z = B(i,2); double rho = (x - pos(0)) * (x - pos(0)) + (y - pos(1)) * (y - pos(1)) + (z - pos(2)) * (z - pos(2)); traveltime = sqrt(rho) / GPS_C_m_s; } double angle = traveltime * 7.292115147e-5; double cosa = cos(angle); double sina = sin(angle); B(i,0) = cosa * x + sina * y; B(i,1) = -sina * x + cosa * y; }// % i-loop if (m > 3) { BBB = arma::inv(B.t() * B) * B.t(); } else { BBB = arma::inv(B); } arma::vec e = arma::ones(m,1); arma::vec alpha = arma::zeros(m,1); for (int i = 0; i < m; i++) { alpha(i) = lorentz(B.row(i).t(), B.row(i).t()) / 2.0; } arma::mat BBBe = BBB * e; arma::mat BBBalpha = BBB * alpha; double a = lorentz(BBBe, BBBe); double b = lorentz(BBBe, BBBalpha) - 1; double c = lorentz(BBBalpha, BBBalpha); double root = sqrt(b * b - a * c); arma::vec r = {(-b - root) / a, (-b + root) / a}; arma::mat possible_pos = arma::zeros(4,2); for (int i = 0; i < 2; i++) { possible_pos.col(i) = r(i) * BBBe + BBBalpha; possible_pos(3,i) = -possible_pos(3,i); } arma::vec abs_omc = arma::zeros(2,1); for (int j = 0; j < m; j++) { for (int i = 0; i < 2; i++) { double c_dt = possible_pos(3,i); double calc = arma::norm(satpos.row(i).t() - possible_pos.col(i).rows(0,2)) + c_dt; double omc = obs(j) - calc; abs_omc(i) = std::abs(omc); } } // % j-loop // discrimination between roots if (abs_omc(0) > abs_omc(1)) { pos = possible_pos.col(1); } else { pos = possible_pos.col(0); } } // % iter loop return pos; } double Ls_Pvt::lorentz(const arma::vec& x, const arma::vec& y) { // LORENTZ Calculates the Lorentz inner product of the two // 4 by 1 vectors x and y // Based on code by: // Kai Borre 04-22-95 // // M = diag([1 1 1 -1]); // p = x'*M*y; return(x(0) * y(0) + x(1) * y(1) + x(2) * y(2) - x(3) * y(3)); } arma::vec Ls_Pvt::leastSquarePos(const arma::mat & satpos, const arma::vec & obs, const arma::vec & w_vec) { /* Computes the Least Squares Solution. * Inputs: * satpos - Satellites positions in ECEF system: [X; Y; Z;] * obs - Observations - the pseudorange measurements to each satellite * w - weight vector * * Returns: * pos - receiver position and receiver clock error * (in ECEF system: [X, Y, Z, dt]) */ //=== Initialization ======================================================= int nmbOfIterations = 10; // TODO: include in config int nmbOfSatellites; nmbOfSatellites = satpos.n_cols; //Armadillo arma::mat w = arma::zeros(nmbOfSatellites, nmbOfSatellites); w.diag() = w_vec; //diagonal weight matrix arma::vec pos = {d_rx_pos(0), d_rx_pos(0), d_rx_pos(0), 0}; // time error in METERS (time x speed) arma::mat A; arma::mat omc; arma::mat az; arma::mat el; A = arma::zeros(nmbOfSatellites, 4); omc = arma::zeros(nmbOfSatellites, 1); az = arma::zeros(1, nmbOfSatellites); el = arma::zeros(1, nmbOfSatellites); arma::mat X = satpos; arma::vec Rot_X; double rho2; double traveltime; double trop = 0.0; double dlambda; double dphi; double h; arma::mat mat_tmp; arma::vec x; //=== Iteratively find receiver position =================================== for (int iter = 0; iter < nmbOfIterations; iter++) { for (int i = 0; i < nmbOfSatellites; i++) { if (iter == 0) { //--- Initialize variables at the first iteration -------------- Rot_X = X.col(i); //Armadillo trop = 0.0; } else { //--- Update equations ----------------------------------------- rho2 = (X(0, i) - pos(0)) * (X(0, i) - pos(0)) + (X(1, i) - pos(1)) * (X(1, i) - pos(1)) + (X(2, i) - pos(2)) * (X(2, i) - pos(2)); traveltime = sqrt(rho2) / GPS_C_m_s; //--- Correct satellite position (do to earth rotation) -------- Rot_X = Ls_Pvt::rotateSatellite(traveltime, X.col(i)); //armadillo //--- Find DOA and range of satellites Ls_Pvt::topocent(&d_visible_satellites_Az[i], &d_visible_satellites_El[i], &d_visible_satellites_Distance[i], pos.subvec(0,2), Rot_X - pos.subvec(0, 2)); if(traveltime < 0.1 && nmbOfSatellites > 3) { //--- Find receiver's height Ls_Pvt::togeod(&dphi, &dlambda, &h, 6378137.0, 298.257223563, pos(0), pos(1), pos(2)); // Add troposphere correction if the receiver is below the troposphere if (h > 15000) { //receiver is above the troposphere trop = 0.0; } else { //--- Find delay due to troposphere (in meters) Ls_Pvt::tropo(&trop, sin(d_visible_satellites_El[i] * GPS_PI / 180.0), h / 1000.0, 1013.0, 293.0, 50.0, 0.0, 0.0, 0.0); if(trop > 5.0 ) trop = 0.0; //check for erratic values } } } //--- Apply the corrections ---------------------------------------- omc(i) = (obs(i) - norm(Rot_X - pos.subvec(0, 2), 2) - pos(3) - trop); // Armadillo //--- Construct the A matrix --------------------------------------- //Armadillo A(i,0) = (-(Rot_X(0) - pos(0))) / obs(i); A(i,1) = (-(Rot_X(1) - pos(1))) / obs(i); A(i,2) = (-(Rot_X(2) - pos(2))) / obs(i); A(i,3) = 1.0; } //--- Find position update --------------------------------------------- x = arma::solve(w*A, w*omc); // Armadillo //--- Apply position update -------------------------------------------- pos = pos + x; if (arma::norm(x,2) < 1e-4) { break; // exit the loop because we assume that the LS algorithm has converged (err < 0.1 cm) } } //-- compute the Dilution Of Precision values d_Q = arma::inv(arma::htrans(A) * A); // check the consistency of the PVT solution if (((fabs(pos(3)) * 1000.0) / GPS_C_m_s) > GPS_STARTOFFSET_ms * 2) { LOG(WARNING) << "Receiver time offset out of range! Estimated RX Time error [s]:" << pos(3) / GPS_C_m_s; throw std::runtime_error("Receiver time offset out of range!"); } return pos; } gnss-sdr-0.0.9/src/algorithms/PVT/libs/ls_pvt.h000066400000000000000000000035651305042567700213240ustar00rootroot00000000000000/*! * \file ls_pvt.h * \brief Interface of a base class for Least Squares PVT solutions * \author Carles Fernandez-Prades, 2015. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_LS_PVT_H_ #define GNSS_SDR_LS_PVT_H_ #include "pvt_solution.h" /*! * \brief Base class for the Least Squares PVT solution * */ class Ls_Pvt : public Pvt_Solution { private: /*! * \brief Computes the Lorentz inner product between two vectors */ double lorentz(const arma::vec & x,const arma::vec & y); public: Ls_Pvt(); /*! * \brief Computes the initial position solution based on the Bancroft algorithm */ arma::vec bancroftPos(const arma::mat & satpos, const arma::vec & obs); /*! * \brief Computes the Weighted Least Squares position solution */ arma::vec leastSquarePos(const arma::mat & satpos, const arma::vec & obs, const arma::vec & w_vec); }; #endif gnss-sdr-0.0.9/src/algorithms/PVT/libs/nmea_printer.cc000066400000000000000000000500011305042567700226210ustar00rootroot00000000000000/*! * \file kml_printer.cc * \brief Implementation of a NMEA 2.1 printer for GNSS-SDR * This class provides a implementation of a subset of the NMEA-0183 standard for interfacing * marine electronic devices as defined by the National Marine Electronics Association (NMEA). * See http://www.nmea.org/ for the NMEA 183 standard * * \author Javier Arribas, 2012. jarribas(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "nmea_printer.h" #include #include #include #include #include using google::LogMessage; //DEFINE_string(NMEA_version, "2.1", "Specifies the NMEA version (2.1)"); Nmea_Printer::Nmea_Printer(std::string filename, bool flag_nmea_tty_port, std::string nmea_dump_devname) { nmea_filename = filename; nmea_file_descriptor.open(nmea_filename.c_str(), std::ios::out); if (nmea_file_descriptor.is_open()) { DLOG(INFO) << "NMEA printer writing on " << nmea_filename.c_str(); } nmea_devname = nmea_dump_devname; if (flag_nmea_tty_port == true) { nmea_dev_descriptor = init_serial(nmea_devname.c_str()); if (nmea_dev_descriptor != -1) { DLOG(INFO) << "NMEA printer writing on " << nmea_devname.c_str(); } } else { nmea_dev_descriptor = -1; } print_avg_pos = false; } Nmea_Printer::~Nmea_Printer() { if (nmea_file_descriptor.is_open()) { nmea_file_descriptor.close(); } close_serial(); } int Nmea_Printer::init_serial (std::string serial_device) { /*! * Opens the serial device and sets the default baud rate for a NMEA transmission (9600,8,N,1) */ int fd = 0; struct termios options; long BAUD; long DATABITS; long STOPBITS; long PARITYON; long PARITY; fd = open(serial_device.c_str(), O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1) return fd; //failed to open TTY port if(fcntl(fd, F_SETFL, 0) == -1) LOG(INFO) << "Error enabling direct I/O"; // clear all flags on descriptor, enable direct I/O tcgetattr(fd, &options); // read serial port options BAUD = B9600; //BAUD = B38400; DATABITS = CS8; STOPBITS = 0; PARITYON = 0; PARITY = 0; options.c_cflag = BAUD | DATABITS | STOPBITS | PARITYON | PARITY | CLOCAL | CREAD; // enable receiver, set 8 bit data, ignore control lines //options.c_cflag |= (CLOCAL | CREAD | CS8); options.c_iflag = IGNPAR; // set the new port options tcsetattr(fd, TCSANOW, &options); return fd; } void Nmea_Printer::close_serial () { if (nmea_dev_descriptor != -1) { close(nmea_dev_descriptor); } } bool Nmea_Printer::Print_Nmea_Line(const std::shared_ptr& pvt_data, bool print_average_values) { std::string GPRMC; std::string GPGGA; std::string GPGSA; std::string GPGSV; // set the new PVT data d_PVT_data = pvt_data; print_avg_pos = print_average_values; // generate the NMEA sentences //GPRMC GPRMC = get_GPRMC(); //GPGGA (Global Positioning System Fixed Data) GPGGA = get_GPGGA(); //GPGSA GPGSA = get_GPGSA(); //GPGSV GPGSV = get_GPGSV(); // write to log file try { //GPRMC nmea_file_descriptor << GPRMC; //GPGGA (Global Positioning System Fixed Data) nmea_file_descriptor << GPGGA; //GPGSA nmea_file_descriptor << GPGSA; //GPGSV nmea_file_descriptor << GPGSV; } catch(std::exception ex) { DLOG(INFO) << "NMEA printer can not write on output file" << nmea_filename.c_str();; } //write to serial device if (nmea_dev_descriptor!=-1) { if(write(nmea_dev_descriptor, GPRMC.c_str(), GPRMC.length()) == -1) { DLOG(INFO) << "NMEA printer cannot write on serial device" << nmea_devname.c_str(); return false; } if(write(nmea_dev_descriptor, GPGGA.c_str(), GPGGA.length()) == -1) { DLOG(INFO) << "NMEA printer cannot write on serial device" << nmea_devname.c_str(); return false; } if(write(nmea_dev_descriptor, GPGSA.c_str(), GPGSA.length()) == -1) { DLOG(INFO) << "NMEA printer cannot write on serial device" << nmea_devname.c_str(); return false; } if(write(nmea_dev_descriptor, GPGSV.c_str(), GPGSV.length()) == -1) { DLOG(INFO) << "NMEA printer cannot write on serial device" << nmea_devname.c_str(); return false; } } return true; } char Nmea_Printer::checkSum(std::string sentence) { char check = 0; // iterate over the string, XOR each byte with the total sum: for (unsigned int c = 0; c < sentence.length(); c++) { check = char(check ^ sentence.at(c)); } // return the result return check; } std::string Nmea_Printer::latitude_to_hm(double lat) { bool north; if (lat < 0.0) { north = false; lat = -lat ; } else { north = true; } int deg = static_cast(lat); double mins = lat - static_cast(deg); mins *= 60.0 ; std::ostringstream out_string; out_string.setf(std::ios::fixed, std::ios::floatfield); out_string.fill('0'); out_string.width(2); out_string << deg; out_string.width(6); out_string.precision(4); out_string << mins; if (north == true) { out_string << ",N"; } else { out_string << ",S"; } return out_string.str(); } std::string Nmea_Printer::longitude_to_hm(double longitude) { bool east; if (longitude < 0.0) { east = false; longitude = -longitude ; } else { east = true; } int deg = static_cast(longitude); double mins = longitude - static_cast(deg); mins *= 60.0 ; std::ostringstream out_string; out_string.setf(std::ios::fixed, std::ios::floatfield); out_string.width(3); out_string.fill('0'); out_string << deg; out_string.width(6); out_string.precision(4); out_string << mins; if (east == true) { out_string << ",E"; } else { out_string << ",W"; } return out_string.str(); } std::string Nmea_Printer::get_UTC_NMEA_time(boost::posix_time::ptime d_position_UTC_time) { //UTC Time: hhmmss.sss std::stringstream sentence_str; boost::posix_time::time_duration td = d_position_UTC_time.time_of_day(); int utc_hours; int utc_mins; int utc_seconds; int utc_milliseconds; utc_hours = td.hours(); utc_mins = td.minutes(); utc_seconds = td.seconds(); utc_milliseconds = td.total_milliseconds() - td.total_seconds()*1000; if (utc_hours < 10) sentence_str << "0"; // two digits for hours sentence_str << utc_hours; if (utc_mins < 10) sentence_str << "0"; // two digits for minutes sentence_str << utc_mins; if (utc_seconds < 10) sentence_str << "0"; // two digits for seconds sentence_str << utc_seconds; if (utc_milliseconds < 10) { sentence_str << ".00"; // three digits for ms sentence_str << utc_milliseconds; } else if (utc_milliseconds < 100) { sentence_str << ".0"; // three digits for ms sentence_str << utc_milliseconds; } else { sentence_str << "."; // three digits for ms sentence_str << utc_milliseconds; } return sentence_str.str(); } std::string Nmea_Printer::get_GPRMC() { // Sample -> $GPRMC,161229.487,A,3723.2475,N,12158.3416,W,0.13,309.62,120598,*10 bool valid_fix = d_PVT_data->b_valid_position; // ToDo: Compute speed and course over ground double speed_over_ground_knots = 0; double course_over_ground_deg = 0; //boost::posix_time::ptime d_position_UTC_time=boost::posix_time::microsec_clock::universal_time(); std::stringstream sentence_str; //GPRMC (RMC-Recommended,Minimum Specific GNSS Data) std::string sentence_header; sentence_header = "$GPRMC,"; sentence_str << sentence_header; //UTC Time: hhmmss.sss sentence_str << get_UTC_NMEA_time(d_PVT_data->d_position_UTC_time); //Status: A: data valid, V: data NOT valid if (valid_fix == true) { sentence_str << ",A"; } else { sentence_str << ",V"; }; if (print_avg_pos == true) { // Latitude ddmm.mmmm,(N or S) sentence_str << "," << latitude_to_hm(d_PVT_data->d_avg_latitude_d); // longitude dddmm.mmmm,(E or W) sentence_str << "," << longitude_to_hm(d_PVT_data->d_avg_longitude_d); } else { // Latitude ddmm.mmmm,(N or S) sentence_str << "," << latitude_to_hm(d_PVT_data->d_latitude_d); // longitude dddmm.mmmm,(E or W) sentence_str << "," << longitude_to_hm(d_PVT_data->d_longitude_d); } //Speed over ground (knots) sentence_str << ","; sentence_str.setf(std::ios::fixed, std::ios::floatfield); sentence_str.precision(2); sentence_str << speed_over_ground_knots; //course over ground (degrees) sentence_str << ","; sentence_str.setf(std::ios::fixed, std::ios::floatfield); sentence_str.precision(2); sentence_str << course_over_ground_deg; // Date ddmmyy boost::gregorian::date sentence_date = d_PVT_data->d_position_UTC_time.date(); unsigned int year = sentence_date.year(); unsigned int day = sentence_date.day(); unsigned int month = sentence_date.month(); sentence_str << ","; sentence_str.width(2); sentence_str.fill('0'); sentence_str << day; sentence_str.width(2); sentence_str.fill('0'); sentence_str << month; std::stringstream year_strs; year_strs << std::dec << year; sentence_str << std::dec << year_strs.str().substr(2); //Magnetic Variation (degrees) // ToDo: Implement magnetic compass sentence_str << ","; //Magnetic Variation (E or W) // ToDo: Implement magnetic compass sentence_str << ","; // Checksum char checksum; std::string tmpstr; tmpstr = sentence_str.str(); checksum = checkSum(tmpstr.substr(1)); sentence_str << "*"; sentence_str.width(2); sentence_str.fill('0'); sentence_str << std::hex << static_cast(checksum); // end NMEA sentence sentence_str << "\r\n"; return sentence_str.str(); } std::string Nmea_Printer::get_GPGSA() { //$GPGSA,A,3,07,02,26,27,09,04,15, , , , , ,1.8,1.0,1.5*33 // GSA-GNSS DOP and Active Satellites bool valid_fix = d_PVT_data->b_valid_position; int n_sats_used = d_PVT_data->d_valid_observations; double pdop = d_PVT_data->d_PDOP; double hdop = d_PVT_data->d_HDOP; double vdop = d_PVT_data->d_VDOP; std::stringstream sentence_str; std::string sentence_header; sentence_header = "$GPGSA,"; sentence_str << sentence_header; // mode1: // (M) Manual-forced to operate in 2D or 3D mode // (A) Automatic-allowed to automatically switch 2D/3D std::string mode1 = "M"; sentence_str << mode1; // mode2: // 1 fix not available // 2 fix 2D // 3 fix 3D if (valid_fix==true) { sentence_str << ",3"; } else { sentence_str << ",1"; }; // Used satellites for (int i=0; i<12; i++) { sentence_str << ","; if (i < n_sats_used) { sentence_str.width(2); sentence_str.fill('0'); sentence_str << d_PVT_data->d_visible_satellites_IDs[i]; } } // PDOP sentence_str << ","; sentence_str.setf(std::ios::fixed, std::ios::floatfield); sentence_str.width(2); sentence_str.precision(1); sentence_str.fill('0'); sentence_str << pdop; //HDOP sentence_str<<","; sentence_str.setf(std::ios::fixed, std::ios::floatfield); sentence_str.width(2); sentence_str.precision(1); sentence_str.fill('0'); sentence_str << hdop; //VDOP sentence_str << ","; sentence_str.setf(std::ios::fixed, std::ios::floatfield); sentence_str.width(2); sentence_str.precision(1); sentence_str.fill('0'); sentence_str << vdop; // Checksum char checksum; std::string tmpstr; tmpstr = sentence_str.str(); checksum = checkSum(tmpstr.substr(1)); sentence_str << "*"; sentence_str.width(2); sentence_str.fill('0'); sentence_str << std::hex << static_cast(checksum); // end NMEA sentence sentence_str << "\r\n"; return sentence_str.str(); } std::string Nmea_Printer::get_GPGSV() { // GSV-GNSS Satellites in View // Notice that NMEA 2.1 only supports 12 channels int n_sats_used = d_PVT_data->d_valid_observations; std::stringstream sentence_str; std::stringstream frame_str; std::string sentence_header; sentence_header = "$GPGSV,"; char checksum; std::string tmpstr; // 1st step: How many GPGSV frames we need? (up to 3) // Each frame contains up to 4 satellites int n_frames; n_frames = std::ceil((static_cast(n_sats_used)) / 4.0); // generate the frames int current_satellite = 0; for (int i=1; i<(n_frames+1); i++) { frame_str.str(""); frame_str << sentence_header; // number of messages frame_str << n_frames; // message number frame_str << ","; frame_str << i; // total number of satellites in view frame_str << ","; frame_str.width(2); frame_str.fill('0'); frame_str << std::dec << n_sats_used; //satellites info for (int j=0; j<4; j++) { // write satellite info frame_str << ","; frame_str.width(2); frame_str.fill('0'); frame_str << std::dec << d_PVT_data->d_visible_satellites_IDs[current_satellite]; frame_str << ","; frame_str.width(2); frame_str.fill('0'); frame_str << std::dec << static_cast(d_PVT_data->d_visible_satellites_El[current_satellite]); frame_str << ","; frame_str.width(3); frame_str.fill('0'); frame_str << std::dec << static_cast(d_PVT_data->d_visible_satellites_Az[current_satellite]); frame_str << ","; frame_str.width(2); frame_str.fill('0'); frame_str << std::dec << static_cast(d_PVT_data->d_visible_satellites_CN0_dB[current_satellite]); current_satellite++; if (current_satellite == n_sats_used) { break; } } // frame checksum tmpstr = frame_str.str(); checksum = checkSum(tmpstr.substr(1)); frame_str << "*"; frame_str.width(2); frame_str.fill('0'); frame_str << std::hex << static_cast(checksum); // end NMEA sentence frame_str << "\r\n"; //add frame to sentence sentence_str << frame_str.str(); } return sentence_str.str(); //$GPGSV,2,1,07,07,79,048,42,02,51,062,43,26,36,256,42,27,27,138,42*71 } std::string Nmea_Printer::get_GPGGA() { //boost::posix_time::ptime d_position_UTC_time=boost::posix_time::microsec_clock::universal_time(); bool valid_fix = d_PVT_data->b_valid_position; int n_channels = d_PVT_data->d_valid_observations;//d_nchannels double hdop = d_PVT_data->d_HDOP; double MSL_altitude; if (d_PVT_data->d_flag_averaging == true) { MSL_altitude = d_PVT_data->d_avg_height_m; } else { MSL_altitude = d_PVT_data->d_height_m; } std::stringstream sentence_str; //GPGGA (Global Positioning System Fixed Data) std::string sentence_header; sentence_header = "$GPGGA,"; sentence_str << sentence_header; //UTC Time: hhmmss.sss sentence_str << get_UTC_NMEA_time(d_PVT_data->d_position_UTC_time); if (d_PVT_data->d_flag_averaging == true) { // Latitude ddmm.mmmm,(N or S) sentence_str << "," << latitude_to_hm(d_PVT_data->d_avg_latitude_d); // longitude dddmm.mmmm,(E or W) sentence_str << "," << longitude_to_hm(d_PVT_data->d_avg_longitude_d); } else { // Latitude ddmm.mmmm,(N or S) sentence_str << "," << latitude_to_hm(d_PVT_data->d_latitude_d); // longitude dddmm.mmmm,(E or W) sentence_str << "," << longitude_to_hm(d_PVT_data->d_longitude_d); } // Position fix indicator // 0 - Fix not available or invalid // 1 - GPS SPS Mode, fix valid // 2 - Differential GPS, SPS Mode, fix valid // 3-5 - Not supported // 6 - Dead Reckoning Mode, fix valid // ToDo: Update PVT module to identify the fix mode if (valid_fix == true) { sentence_str << ",1"; } else { sentence_str << ",0"; } // Number of satellites used in PVT sentence_str << ","; if (n_channels < 10) { sentence_str << '0' << n_channels; } else { sentence_str << n_channels; } // HDOP sentence_str << ","; sentence_str.setf(std::ios::fixed, std::ios::floatfield); sentence_str.width(2); sentence_str.precision(1); sentence_str.fill('0'); sentence_str << hdop; // MSL Altitude sentence_str << ","; sentence_str.precision(1); sentence_str << MSL_altitude; sentence_str << ",M"; // Geoid-to-ellipsoid separation. Ellipsoid altitude = MSL Altitude + Geoid Separation. // ToDo: Compute this value sentence_str << ","; sentence_str << "0.0"; sentence_str << ",M"; // Age of Diff. Corr. (Seconds) Null fields when DGPS is not used // Diff. Ref. Station ID (0000) // ToDo: Implement this fields for Differential GPS sentence_str << ","; sentence_str << "0.0,0000"; // Checksum char checksum; std::string tmpstr; tmpstr = sentence_str.str(); checksum = checkSum(tmpstr.substr(1)); sentence_str << "*"; sentence_str.width(2); sentence_str.fill('0'); sentence_str << std::hex << static_cast(checksum); // end NMEA sentence sentence_str << "\r\n"; return sentence_str.str(); //$GPGGA,104427.591,5920.7009,N,01803.2938,E,1,05,3.3,78.2,M,23.2,M,0.0,0000*4A } gnss-sdr-0.0.9/src/algorithms/PVT/libs/nmea_printer.h000066400000000000000000000060451305042567700224740ustar00rootroot00000000000000/*! * \file nmea_printer.h * \brief Interface of a NMEA 2.1 printer for GNSS-SDR * This class provides a implementation of a subset of the NMEA-0183 standard for interfacing * marine electronic devices as defined by the National Marine Electronics Association (NMEA). * See http://www.nmea.org/ for the NMEA 183 standard * * \author Javier Arribas, 2012. jarribas(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_NMEA_PRINTER_H_ #define GNSS_SDR_NMEA_PRINTER_H_ #include #include #include #include "pvt_solution.h" /*! * \brief This class provides a implementation of a subset of the NMEA-0183 standard for interfacing * marine electronic devices as defined by the National Marine Electronics Association (NMEA). * * See http://en.wikipedia.org/wiki/NMEA_0183 */ class Nmea_Printer { public: /*! * \brief Default constructor. */ Nmea_Printer(std::string filename, bool flag_nmea_tty_port, std::string nmea_dump_filename); /*! * \brief Print NMEA PVT and satellite info to the initialized device */ bool Print_Nmea_Line(const std::shared_ptr& position, bool print_average_values); /*! * \brief Default destructor. */ ~Nmea_Printer(); private: std::string nmea_filename; // String with the NMEA log filename std::ofstream nmea_file_descriptor; // Output file stream for NMEA log file std::string nmea_devname; int nmea_dev_descriptor; // NMEA serial device descriptor (i.e. COM port) std::shared_ptr d_PVT_data; int init_serial(std::string serial_device); //serial port control void close_serial(); std::string get_GPGGA(); // fix data std::string get_GPGSV(); // satellite data std::string get_GPGSA(); // overall satellite reception data std::string get_GPRMC(); // minimum recommended data std::string get_UTC_NMEA_time(boost::posix_time::ptime d_position_UTC_time); std::string longitude_to_hm(double longitude); std::string latitude_to_hm(double lat); char checkSum(std::string sentence); bool print_avg_pos; }; #endif gnss-sdr-0.0.9/src/algorithms/PVT/libs/pvt_solution.cc000066400000000000000000000423111305042567700227100ustar00rootroot00000000000000/*! * \file pvt_solution.cc * \brief Implementation of a base class for a PVT solution * \author Carles Fernandez-Prades, 2015. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "pvt_solution.h" #include #include "GPS_L1_CA.h" #include #include using google::LogMessage; DEFINE_bool(tropo, true, "Apply tropospheric correction"); Pvt_Solution::Pvt_Solution() { d_latitude_d = 0.0; d_longitude_d = 0.0; d_height_m = 0.0; d_avg_latitude_d = 0.0; d_avg_longitude_d = 0.0; d_avg_height_m = 0.0; d_GDOP = 0.0; d_PDOP = 0.0; d_HDOP = 0.0; d_VDOP = 0.0; d_TDOP = 0.0; d_flag_averaging = false; b_valid_position = false; d_averaging_depth = 0; d_valid_observations = 0; d_rx_pos = arma::zeros(3,1); d_rx_dt_s = 0.0; } arma::vec Pvt_Solution::rotateSatellite(double const traveltime, const arma::vec & X_sat) { /* * Returns rotated satellite ECEF coordinates due to Earth * rotation during signal travel time * * Inputs: * travelTime - signal travel time * X_sat - satellite's ECEF coordinates * * Returns: * X_sat_rot - rotated satellite's coordinates (ECEF) */ //--- Find rotation angle -------------------------------------------------- double omegatau; omegatau = OMEGA_EARTH_DOT * traveltime; //--- Build a rotation matrix ---------------------------------------------- arma::mat R3 = arma::zeros(3,3); R3(0, 0) = cos(omegatau); R3(0, 1) = sin(omegatau); R3(0, 2) = 0.0; R3(1, 0) = -sin(omegatau); R3(1, 1) = cos(omegatau); R3(1, 2) = 0.0; R3(2, 0) = 0.0; R3(2, 1) = 0.0; R3(2, 2) = 1; //--- Do the rotation ------------------------------------------------------ arma::vec X_sat_rot; X_sat_rot = R3 * X_sat; return X_sat_rot; } int Pvt_Solution::cart2geo(double X, double Y, double Z, int elipsoid_selection) { /* Conversion of Cartesian coordinates (X,Y,Z) to geographical coordinates (latitude, longitude, h) on a selected reference ellipsoid. Choices of Reference Ellipsoid for Geographical Coordinates 0. International Ellipsoid 1924 1. International Ellipsoid 1967 2. World Geodetic System 1972 3. Geodetic Reference System 1980 4. World Geodetic System 1984 */ const double a[5] = {6378388.0, 6378160.0, 6378135.0, 6378137.0, 6378137.0}; const double f[5] = {1.0 / 297.0, 1.0 / 298.247, 1.0 / 298.26, 1.0 / 298.257222101, 1.0 / 298.257223563}; double lambda = atan2(Y, X); double ex2 = (2.0 - f[elipsoid_selection]) * f[elipsoid_selection] / ((1.0 - f[elipsoid_selection]) * (1.0 - f[elipsoid_selection])); double c = a[elipsoid_selection] * sqrt(1.0 + ex2); double phi = atan(Z / ((sqrt(X * X + Y * Y) * (1.0 - (2.0 - f[elipsoid_selection])) * f[elipsoid_selection]))); double h = 0.1; double oldh = 0.0; double N; int iterations = 0; do { oldh = h; N = c / sqrt(1 + ex2 * (cos(phi) * cos(phi))); phi = atan(Z / ((sqrt(X * X + Y * Y) * (1.0 - (2.0 - f[elipsoid_selection]) * f[elipsoid_selection] * N / (N + h) )))); h = sqrt(X * X + Y * Y) / cos(phi) - N; iterations = iterations + 1; if (iterations > 100) { LOG(WARNING) << "Failed to approximate h with desired precision. h-oldh= " << h - oldh; break; } } while (std::abs(h - oldh) > 1.0e-12); d_latitude_d = phi * 180.0 / GPS_PI; d_longitude_d = lambda * 180.0 / GPS_PI; d_height_m = h; return 0; } int Pvt_Solution::togeod(double *dphi, double *dlambda, double *h, double a, double finv, double X, double Y, double Z) { /* Subroutine to calculate geodetic coordinates latitude, longitude, height given Cartesian coordinates X,Y,Z, and reference ellipsoid values semi-major axis (a) and the inverse of flattening (finv). The output units of angular quantities will be in decimal degrees (15.5 degrees not 15 deg 30 min). The output units of h will be the same as the units of X,Y,Z,a. Inputs: a - semi-major axis of the reference ellipsoid finv - inverse of flattening of the reference ellipsoid X,Y,Z - Cartesian coordinates Outputs: dphi - latitude dlambda - longitude h - height above reference ellipsoid Based in a Matlab function by Kai Borre */ *h = 0; double tolsq = 1.e-10; // tolerance to accept convergence int maxit = 10; // max number of iterations double rtd = 180.0 / GPS_PI; // compute square of eccentricity double esq; if (finv < 1.0E-20) { esq = 0.0; } else { esq = (2.0 - 1.0 / finv) / finv; } // first guess double P = sqrt(X * X + Y * Y); // P is distance from spin axis //direct calculation of longitude if (P > 1.0E-20) { *dlambda = atan2(Y, X) * rtd; } else { *dlambda = 0.0; } // correct longitude bound if (*dlambda < 0) { *dlambda = *dlambda + 360.0; } double r = sqrt(P * P + Z * Z); // r is distance from origin (0,0,0) double sinphi; if (r > 1.0E-20) { sinphi = Z/r; } else { sinphi = 0.0; } *dphi = asin(sinphi); // initial value of height = distance from origin minus // approximate distance from origin to surface of ellipsoid if (r < 1.0E-20) { *h = 0; return 1; } *h = r - a * (1 - sinphi * sinphi/finv); // iterate double cosphi; double N_phi; double dP; double dZ; double oneesq = 1.0 - esq; for (int i = 0; i < maxit; i++) { sinphi = sin(*dphi); cosphi = cos(*dphi); // compute radius of curvature in prime vertical direction N_phi = a / sqrt(1 - esq * sinphi * sinphi); // compute residuals in P and Z dP = P - (N_phi + (*h)) * cosphi; dZ = Z - (N_phi * oneesq + (*h)) * sinphi; // update height and latitude *h = *h + (sinphi * dZ + cosphi * dP); *dphi = *dphi + (cosphi * dZ - sinphi * dP)/(N_phi + (*h)); // test for convergence if ((dP * dP + dZ * dZ) < tolsq) { break; } if (i == (maxit - 1)) { LOG(WARNING) << "The computation of geodetic coordinates did not converge"; } } *dphi = (*dphi) * rtd; return 0; } int Pvt_Solution::tropo(double *ddr_m, double sinel, double hsta_km, double p_mb, double t_kel, double hum, double hp_km, double htkel_km, double hhum_km) { /* Inputs: sinel - sin of elevation angle of satellite hsta_km - height of station in km p_mb - atmospheric pressure in mb at height hp_km t_kel - surface temperature in degrees Kelvin at height htkel_km hum - humidity in % at height hhum_km hp_km - height of pressure measurement in km htkel_km - height of temperature measurement in km hhum_km - height of humidity measurement in km Outputs: ddr_m - range correction (meters) Reference Goad, C.C. & Goodman, L. (1974) A Modified Hopfield Tropospheric Refraction Correction Model. Paper presented at the American Geophysical Union Annual Fall Meeting, San Francisco, December 12-17 Translated to C++ by Carles Fernandez from a Matlab implementation by Kai Borre */ const double a_e = 6378.137; // semi-major axis of earth ellipsoid const double b0 = 7.839257e-5; const double tlapse = -6.5; const double em = -978.77 / (2.8704e6 * tlapse * 1.0e-5); double tkhum = t_kel + tlapse * (hhum_km - htkel_km); double atkel = 7.5 * (tkhum - 273.15) / (237.3 + tkhum - 273.15); double e0 = 0.0611 * hum * pow(10, atkel); double tksea = t_kel - tlapse * htkel_km; double tkelh = tksea + tlapse * hhum_km; double e0sea = e0 * pow((tksea / tkelh), (4 * em)); double tkelp = tksea + tlapse * hp_km; double psea = p_mb * pow((tksea / tkelp), em); if(sinel < 0) { sinel = 0.0; } double tropo_delay = 0.0; bool done = false; double refsea = 77.624e-6 / tksea; double htop = 1.1385e-5 / refsea; refsea = refsea * psea; double ref = refsea * pow(((htop - hsta_km) / htop), 4); double a; double b; double rtop; while(1) { rtop = pow((a_e + htop), 2) - pow((a_e + hsta_km), 2) * (1 - pow(sinel, 2)); // check to see if geometry is crazy if(rtop < 0) { rtop = 0; } rtop = sqrt(rtop) - (a_e + hsta_km) * sinel; a = -sinel / (htop - hsta_km); b = -b0 * (1 - pow(sinel,2)) / (htop - hsta_km); arma::vec rn = arma::vec(8); rn.zeros(); for(int i = 0; i<8; i++) { rn(i) = pow(rtop, (i+1+1)); } arma::rowvec alpha = {2 * a, 2 * pow(a, 2) + 4 * b /3, a * (pow(a, 2) + 3 * b), pow(a, 4)/5 + 2.4 * pow(a, 2) * b + 1.2 * pow(b, 2), 2 * a * b * (pow(a, 2) + 3 * b)/3, pow(b, 2) * (6 * pow(a, 2) + 4 * b) * 1.428571e-1, 0, 0}; if(pow(b, 2) > 1.0e-35) { alpha(6) = a * pow(b, 3) /2; alpha(7) = pow(b, 4) / 9; } double dr = rtop; arma::mat aux_ = alpha * rn; dr = dr + aux_(0, 0); tropo_delay = tropo_delay + dr * ref * 1000; if(done == true) { *ddr_m = tropo_delay; break; } done = true; refsea = (371900.0e-6 / tksea - 12.92e-6) / tksea; htop = 1.1385e-5 * (1255 / tksea + 0.05) / refsea; ref = refsea * e0sea * pow(((htop - hsta_km) / htop), 4); } return 0; } int Pvt_Solution::topocent(double *Az, double *El, double *D, const arma::vec & x, const arma::vec & dx) { /* Transformation of vector dx into topocentric coordinate system with origin at x Inputs: x - vector origin coordinates (in ECEF system [X; Y; Z;]) dx - vector ([dX; dY; dZ;]). Outputs: D - vector length. Units like the input Az - azimuth from north positive clockwise, degrees El - elevation angle, degrees Based on a Matlab function by Kai Borre */ double lambda; double phi; double h; double dtr = GPS_PI / 180.0; double a = 6378137.0; // semi-major axis of the reference ellipsoid WGS-84 double finv = 298.257223563; // inverse of flattening of the reference ellipsoid WGS-84 // Transform x into geodetic coordinates Pvt_Solution::togeod(&phi, &lambda, &h, a, finv, x(0), x(1), x(2)); double cl = cos(lambda * dtr); double sl = sin(lambda * dtr); double cb = cos(phi * dtr); double sb = sin(phi * dtr); arma::mat F = arma::zeros(3,3); F(0,0) = -sl; F(0,1) = -sb * cl; F(0,2) = cb * cl; F(1,0) = cl; F(1,1) = -sb * sl; F(1,2) = cb * sl; F(2,0) = 0; F(2,1) = cb; F(2,2) = sb; arma::vec local_vector; local_vector = arma::htrans(F) * dx; double E = local_vector(0); double N = local_vector(1); double U = local_vector(2); double hor_dis; hor_dis = sqrt(E * E + N * N); if (hor_dis < 1.0E-20) { *Az = 0; *El = 90; } else { *Az = atan2(E, N) / dtr; *El = atan2(U, hor_dis) / dtr; } if (*Az < 0) { *Az = *Az + 360.0; } *D = sqrt(dx(0) * dx(0) + dx(1) * dx(1) + dx(2) * dx(2)); return 0; } int Pvt_Solution::compute_DOP() { // ###### Compute DOPs ######## // 1- Rotation matrix from ECEF coordinates to ENU coordinates // ref: http://www.navipedia.net/index.php/Transformations_between_ECEF_and_ENU_coordinates arma::mat F = arma::zeros(3,3); F(0,0) = -sin(GPS_TWO_PI * (d_longitude_d/360.0)); F(0,1) = -sin(GPS_TWO_PI * (d_latitude_d/360.0)) * cos(GPS_TWO_PI * (d_longitude_d/360.0)); F(0,2) = cos(GPS_TWO_PI * (d_latitude_d/360.0)) * cos(GPS_TWO_PI * (d_longitude_d/360.0)); F(1,0) = cos((GPS_TWO_PI * d_longitude_d)/360.0); F(1,1) = -sin((GPS_TWO_PI * d_latitude_d)/360.0) * sin((GPS_TWO_PI * d_longitude_d)/360.0); F(1,2) = cos((GPS_TWO_PI * d_latitude_d/360.0)) * sin((GPS_TWO_PI * d_longitude_d)/360.0); F(2,0) = 0; F(2,1) = cos((GPS_TWO_PI * d_latitude_d)/360.0); F(2,2) = sin((GPS_TWO_PI * d_latitude_d/360.0)); // 2- Apply the rotation to the latest covariance matrix (available in ECEF from LS) arma::mat Q_ECEF = d_Q.submat(0, 0, 2, 2); arma::mat DOP_ENU = arma::zeros(3, 3); try { DOP_ENU = arma::htrans(F) * Q_ECEF * F; d_GDOP = sqrt(arma::trace(DOP_ENU)); // Geometric DOP d_PDOP = sqrt(DOP_ENU(0, 0) + DOP_ENU(1, 1) + DOP_ENU(2, 2));// PDOP d_HDOP = sqrt(DOP_ENU(0, 0) + DOP_ENU(1, 1)); // HDOP d_VDOP = sqrt(DOP_ENU(2, 2)); // VDOP d_TDOP = sqrt(d_Q(3, 3)); // TDOP } catch(std::exception& ex) { d_GDOP = -1; // Geometric DOP d_PDOP = -1; // PDOP d_HDOP = -1; // HDOP d_VDOP = -1; // VDOP d_TDOP = -1; // TDOP } return 0; } int Pvt_Solution::set_averaging_depth(int depth) { d_averaging_depth = depth; return 0; } int Pvt_Solution::pos_averaging(bool flag_averaring) { // MOVING AVERAGE PVT bool avg = flag_averaring; if (avg == true) { if (d_hist_longitude_d.size() == (unsigned int)d_averaging_depth) { // Pop oldest value d_hist_longitude_d.pop_back(); d_hist_latitude_d.pop_back(); d_hist_height_m.pop_back(); // Push new values d_hist_longitude_d.push_front(d_longitude_d); d_hist_latitude_d.push_front(d_latitude_d); d_hist_height_m.push_front(d_height_m); d_avg_latitude_d = 0.0; d_avg_longitude_d = 0.0; d_avg_height_m = 0.0; for (unsigned int i = 0; i < d_hist_longitude_d.size(); i++) { d_avg_latitude_d = d_avg_latitude_d + d_hist_latitude_d.at(i); d_avg_longitude_d = d_avg_longitude_d + d_hist_longitude_d.at(i); d_avg_height_m = d_avg_height_m + d_hist_height_m.at(i); } d_avg_latitude_d = d_avg_latitude_d / static_cast(d_averaging_depth); d_avg_longitude_d = d_avg_longitude_d / static_cast(d_averaging_depth); d_avg_height_m = d_avg_height_m / static_cast(d_averaging_depth); b_valid_position = true; } else { //int current_depth=d_hist_longitude_d.size(); // Push new values d_hist_longitude_d.push_front(d_longitude_d); d_hist_latitude_d.push_front(d_latitude_d); d_hist_height_m.push_front(d_height_m); d_avg_latitude_d = d_latitude_d; d_avg_longitude_d = d_longitude_d; d_avg_height_m = d_height_m; b_valid_position = false; } } else { b_valid_position = true; } return 0; } gnss-sdr-0.0.9/src/algorithms/PVT/libs/pvt_solution.h000066400000000000000000000152451305042567700225600ustar00rootroot00000000000000/*! * \file pvt_solution.h * \brief Interface of a base class for a PVT solution * \author Carles Fernandez-Prades, 2015. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_PVT_SOLUTION_H_ #define GNSS_SDR_PVT_SOLUTION_H_ #include #include #include #define PVT_MAX_CHANNELS 24 /*! * \brief Base class for a PVT solution * */ class Pvt_Solution { public: Pvt_Solution(); double d_latitude_d; //!< RX position Latitude WGS84 [deg] double d_longitude_d; //!< RX position Longitude WGS84 [deg] double d_height_m; //!< RX position height WGS84 [m] arma::vec d_rx_pos; double d_rx_dt_s; //!< RX time offset [s] boost::posix_time::ptime d_position_UTC_time; bool b_valid_position; int d_valid_observations; //!< Number of valid pseudorange observations (valid satellites) int d_visible_satellites_IDs[PVT_MAX_CHANNELS] = {}; //!< Array with the IDs of the valid satellites double d_visible_satellites_El[PVT_MAX_CHANNELS] = {}; //!< Array with the LOS Elevation of the valid satellites double d_visible_satellites_Az[PVT_MAX_CHANNELS] = {}; //!< Array with the LOS Azimuth of the valid satellites double d_visible_satellites_Distance[PVT_MAX_CHANNELS] = {}; //!< Array with the LOS Distance of the valid satellites double d_visible_satellites_CN0_dB[PVT_MAX_CHANNELS] = {}; //!< Array with the IDs of the valid satellites //averaging int d_averaging_depth; //!< Length of averaging window std::deque d_hist_latitude_d; std::deque d_hist_longitude_d; std::deque d_hist_height_m; double d_avg_latitude_d; //!< Averaged latitude in degrees double d_avg_longitude_d; //!< Averaged longitude in degrees double d_avg_height_m; //!< Averaged height [m] int pos_averaging(bool flag_averaging); // DOP estimations arma::mat d_Q; double d_GDOP; double d_PDOP; double d_HDOP; double d_VDOP; double d_TDOP; int compute_DOP(); //!< Compute Dilution Of Precision parameters bool d_flag_averaging; int set_averaging_depth(int depth); arma::vec rotateSatellite(double traveltime, const arma::vec & X_sat); /*! * \brief Conversion of Cartesian coordinates (X,Y,Z) to geographical * coordinates (d_latitude_d, d_longitude_d, d_height_m) on a selected reference ellipsoid. * * \param[in] X [m] Cartesian coordinate * \param[in] Y [m] Cartesian coordinate * \param[in] Z [m] Cartesian coordinate * \param[in] elipsoid_selection. Choices of Reference Ellipsoid for Geographical Coordinates: * 0 - International Ellipsoid 1924. * 1 - International Ellipsoid 1967. * 2 - World Geodetic System 1972. * 3 - Geodetic Reference System 1980. * 4 - World Geodetic System 1984. * */ int cart2geo(double X, double Y, double Z, int elipsoid_selection); /*! * \brief Transformation of vector dx into topocentric coordinate system with origin at x * * \param[in] x Vector origin coordinates (in ECEF system [X; Y; Z;]) * \param[in] dx Vector ([dX; dY; dZ;]). * * \param[out] D Vector length. Units like the input * \param[out] Az Azimuth from north positive clockwise, degrees * \param[out] El Elevation angle, degrees * * Based on a Matlab function by Kai Borre */ int topocent(double *Az, double *El, double *D, const arma::vec & x, const arma::vec & dx); /*! * \brief Subroutine to calculate geodetic coordinates latitude, longitude, * height given Cartesian coordinates X,Y,Z, and reference ellipsoid * values semi-major axis (a) and the inverse of flattening (finv). * * The output units of angular quantities will be in decimal degrees * (15.5 degrees not 15 deg 30 min). The output units of h will be the * same as the units of X,Y,Z,a. * * \param[in] a - semi-major axis of the reference ellipsoid * \param[in] finv - inverse of flattening of the reference ellipsoid * \param[in] X,Y,Z - Cartesian coordinates * * \param[out] dphi - latitude * \param[out] dlambda - longitude * \param[out] h - height above reference ellipsoid * * Based in a Matlab function by Kai Borre */ int togeod(double *dphi, double *dlambda, double *h, double a, double finv, double X, double Y, double Z); /*! * \brief Tropospheric correction * * \param[in] sinel - sin of elevation angle of satellite * \param[in] hsta_km - height of station in km * \param[in] p_mb - atmospheric pressure in mb at height hp_km * \param[in] t_kel - surface temperature in degrees Kelvin at height htkel_km * \param[in] hum - humidity in % at height hhum_km * \param[in] hp_km - height of pressure measurement in km * \param[in] htkel_km - height of temperature measurement in km * \param[in] hhum_km - height of humidity measurement in km * * \param[out] ddr_m - range correction (meters) * * * Reference: * Goad, C.C. & Goodman, L. (1974) A Modified Hopfield Tropospheric * Refraction Correction Model. Paper presented at the * American Geophysical Union Annual Fall Meeting, San * Francisco, December 12-17 * * Translated to C++ by Carles Fernandez from a Matlab implementation by Kai Borre */ int tropo(double *ddr_m, double sinel, double hsta_km, double p_mb, double t_kel, double hum, double hp_km, double htkel_km, double hhum_km); }; #endif gnss-sdr-0.0.9/src/algorithms/PVT/libs/rinex_printer.cc000066400000000000000000006412251305042567700230440ustar00rootroot00000000000000/*! * \file rinex_printer.cc * \brief Implementation of a RINEX 2.11 / 3.02 printer * See http://igscb.jpl.nasa.gov/igscb/data/format/rinex302.pdf * \author Carles Fernandez Prades, 2011. cfernandez(at)cttc.es * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "rinex_printer.h" #include // for getlogin_r() #include // for min and max #include // for floor #include // for getenv() #include #include #include #include #include #include #include #include #include #include #include using google::LogMessage; DEFINE_string(RINEX_version, "3.02", "Specifies the RINEX version (2.11 or 3.02)"); Rinex_Printer::Rinex_Printer(int conf_version) { navfilename = Rinex_Printer::createFilename("RINEX_FILE_TYPE_GPS_NAV"); obsfilename = Rinex_Printer::createFilename("RINEX_FILE_TYPE_OBS"); sbsfilename = Rinex_Printer::createFilename("RINEX_FILE_TYPE_SBAS"); navGalfilename = Rinex_Printer::createFilename("RINEX_FILE_TYPE_GAL_NAV"); navMixfilename = Rinex_Printer::createFilename("RINEX_FILE_TYPE_MIXED_NAV"); Rinex_Printer::navFile.open(navfilename, std::ios::out | std::ios::in | std::ios::app); Rinex_Printer::obsFile.open(obsfilename, std::ios::out | std::ios::in | std::ios::app); Rinex_Printer::sbsFile.open(sbsfilename, std::ios::out | std::ios::app); Rinex_Printer::navGalFile.open(navGalfilename, std::ios::out | std::ios::in | std::ios::app); Rinex_Printer::navMixFile.open(navMixfilename, std::ios::out | std::ios::in | std::ios::app); // RINEX v3.02 codes satelliteSystem["GPS"] = "G"; satelliteSystem["GLONASS"] = "R"; satelliteSystem["SBAS payload"] = "S"; satelliteSystem["Galileo"] = "E"; satelliteSystem["Beidou"] = "C"; satelliteSystem["Mixed"] = "M"; observationCode["GPS_L1_CA"] = "1C"; // "1C" GPS L1 C/A observationCode["GPS_L1_P"] = "1P"; // "1P" GPS L1 P observationCode["GPS_L1_Z_TRACKING"] = "1W"; // "1W" GPS L1 Z-tracking and similar (AS on) observationCode["GPS_L1_Y"] = "1Y"; // "1Y" GPS L1 Y observationCode["GPS_L1_M "] = "1M"; // "1M" GPS L1 M observationCode["GPS_L1_CODELESS"] = "1N"; // "1N" GPS L1 codeless observationCode["GPS_L2_CA"] = "2C"; // "2C" GPS L2 C/A observationCode["L2_SEMI_CODELESS"] = "2D"; // "2D" GPS L2 L1(C/A)+(P2-P1) semi-codeless observationCode["GPS_L2_L2CM"] = "2S"; // "2S" GPS L2 L2C (M) observationCode["GPS_L2_L2CL"] = "2L"; // "2L" GPS L2 L2C (L) observationCode["GPS_L2_L2CML"] = "2X"; // "2X" GPS L2 L2C (M+L) observationCode["GPS_L2_P"] = "2P"; // "2P" GPS L2 P observationCode["GPS_L2_Z_TRACKING"] = "2W"; // "2W" GPS L2 Z-tracking and similar (AS on) observationCode["GPS_L2_Y"] = "2Y"; // "2Y" GPS L2 Y observationCode["GPS_L2_M"] = "2M"; // "2M" GPS GPS L2 M observationCode["GPS_L2_codeless"] = "2N"; // "2N" GPS L2 codeless observationCode["GPS_L5_I"] = "5I"; // "5I" GPS L5 I observationCode["GPS_L5_Q"] = "5Q"; // "5Q" GPS L5 Q observationCode["GPS_L5_IQ"] = "5X"; // "5X" GPS L5 I+Q observationCode["GLONASS_G1_CA"] = "1C"; // "1C" GLONASS G1 C/A observationCode["GLONASS_G1_P"] = "1P"; // "1P" GLONASS G1 P observationCode["GLONASS_G2_CA"] = "2C"; // "2C" GLONASS G2 C/A (Glonass M) observationCode["GLONASS_G2_P"] = "2P"; // "2P" GLONASS G2 P observationCode["GALILEO_E1_A"] = "1A"; // "1A" GALILEO E1 A (PRS) observationCode["GALILEO_E1_B"] = "1B"; // "1B" GALILEO E1 B (I/NAV OS/CS/SoL) observationCode["GALILEO_E1_C"] = "1C"; // "1C" GALILEO E1 C (no data) observationCode["GALILEO_E1_BC"] = "1X"; // "1X" GALILEO E1 B+C observationCode["GALILEO_E1_ABC"] = "1Z"; // "1Z" GALILEO E1 A+B+C observationCode["GALILEO_E5a_I"] = "5I"; // "5I" GALILEO E5a I (F/NAV OS) observationCode["GALILEO_E5a_Q"] = "5Q"; // "5Q" GALILEO E5a Q (no data) observationCode["GALILEO_E5a_IQ"] = "5X"; // "5X" GALILEO E5a I+Q observationCode["GALILEO_E5b_I"] = "7I"; // "7I" GALILEO E5b I observationCode["GALILEO_E5b_Q"] = "7Q"; // "7Q" GALILEO E5b Q observationCode["GALILEO_E5b_IQ"] = "7X"; // "7X" GALILEO E5b I+Q observationCode["GALILEO_E5_I"] = "8I"; // "8I" GALILEO E5 I observationCode["GALILEO_E5_Q"] = "8Q"; // "8Q" GALILEO E5 Q observationCode["GALILEO_E5_IQ"] = "8X"; // "8X" GALILEO E5 I+Q observationCode["GALILEO_E56_A"] = "6A"; // "6A" GALILEO E6 A observationCode["GALILEO_E56_B"] = "6B"; // "6B" GALILEO E6 B observationCode["GALILEO_E56_B"] = "6C"; // "6C" GALILEO E6 C observationCode["GALILEO_E56_BC"] = "6X"; // "6X" GALILEO E6 B+C observationCode["GALILEO_E56_ABC"] = "6Z"; // "6Z" GALILEO E6 A+B+C observationCode["SBAS_L1_CA"] = "1C"; // "1C" SBAS L1 C/A observationCode["SBAS_L5_I"] = "5I"; // "5I" SBAS L5 I observationCode["SBAS_L5_Q"] = "5Q"; // "5Q" SBAS L5 Q observationCode["SBAS_L5_IQ"] = "5X"; // "5X" SBAS L5 I+Q observationCode["COMPASS_E2_I"] = "2I"; observationCode["COMPASS_E2_Q"] = "2Q"; observationCode["COMPASS_E2_IQ"] = "2X"; observationCode["COMPASS_E5b_I"] = "7I"; observationCode["COMPASS_E5b_Q"] = "7Q"; observationCode["COMPASS_E5b_IQ"] = "7X"; observationCode["COMPASS_E6_I"] = "6I"; observationCode["COMPASS_E6_Q"] = "6Q"; observationCode["COMPASS_E6_IQ"] = "6X"; observationType["PSEUDORANGE"] = "C"; observationType["CARRIER_PHASE"] = "L"; observationType["DOPPLER"] = "D"; observationType["SIGNAL_STRENGTH"] = "S"; // RINEX v2.10 and v2.11 codes observationType["PSEUDORANGE_CA_v2"] = "C"; observationType["PSEUDORANGE_P_v2"] = "P"; observationType["CARRIER_PHASE_CA_v2"] = "L"; observationType["DOPPLER_v2"] = "D"; observationType["SIGNAL_STRENGTH_v2"] = "S"; observationCode["GPS_L1_CA_v2"] = "1"; if ( FLAGS_RINEX_version.compare("3.01") == 0 ) { version = 3; stringVersion = "3.01"; } else if ( FLAGS_RINEX_version.compare("3.02") == 0 ) { version = 3; stringVersion = "3.02"; } else if ( FLAGS_RINEX_version.compare("3") == 0 ) { version = 3; stringVersion = "3.02"; } else if ( FLAGS_RINEX_version.compare("2.11") == 0 ) { version = 2; stringVersion = "2.11"; } else if ( FLAGS_RINEX_version.compare("2.10") == 0 ) { version = 2; stringVersion = "2.10"; } else if ( FLAGS_RINEX_version.compare("2") == 0 ) { version = 2; stringVersion = "2.11"; } else { LOG(WARNING) << "Unknown RINEX version " << FLAGS_RINEX_version << " (must be 2.11 or 3.02). Using 3.02"; version = 3; stringVersion = "3.02"; } if(conf_version != 0) { if(conf_version == 2) version = 2; stringVersion = "2.11"; } numberTypesObservations = 4; // Number of available types of observable in the system } Rinex_Printer::~Rinex_Printer() { // close RINEX files long posn, poso, poss, posng, posmn; posn = navFile.tellp(); poso = obsFile.tellp(); poss = sbsFile.tellp(); posng = navGalFile.tellp(); posmn = navMixFile.tellp(); Rinex_Printer::navFile.close(); Rinex_Printer::obsFile.close(); Rinex_Printer::sbsFile.close(); Rinex_Printer::navGalFile.close(); // If nothing written, erase the files. if (posn == 0) { if(remove(navfilename.c_str()) != 0) LOG(INFO) << "Error deleting temporary file"; } if (poso == 0) { if(remove(obsfilename.c_str()) != 0) LOG(INFO) << "Error deleting temporary file"; } if (poss == 0) { if(remove(sbsfilename.c_str()) != 0) LOG(INFO) << "Error deleting temporary file"; } if (posng == 0) { if(remove(navGalfilename.c_str()) != 0) LOG(INFO) << "Error deleting temporary file"; } if (posmn == 0) { if(remove(navMixfilename.c_str()) != 0) LOG(INFO) << "Error deleting temporary file"; } } void Rinex_Printer::lengthCheck(const std::string& line) { if (line.length() != 80) { LOG(ERROR) << "Bad defined RINEX line: " << line.length() << " characters (must be 80)" << std::endl << line << std::endl << "----|---1|0---|---2|0---|---3|0---|---4|0---|---5|0---|---6|0---|---7|0---|---8|" << std::endl; } } std::string Rinex_Printer::createFilename(std::string type) { const std::string stationName = "GSDR"; // 4-character station name designator boost::gregorian::date today = boost::gregorian::day_clock::local_day(); const int dayOfTheYear = today.day_of_year(); std::stringstream strm0; if (dayOfTheYear < 100) strm0 << "0"; // three digits for day of the year if (dayOfTheYear < 10) strm0 << "0"; // three digits for day of the year strm0 << dayOfTheYear; std::string dayOfTheYearTag=strm0.str(); std::map fileType; fileType.insert(std::pair("RINEX_FILE_TYPE_OBS", "O")); // O - Observation file. fileType.insert(std::pair("RINEX_FILE_TYPE_GPS_NAV", "N")); // N - GPS navigation message file. fileType.insert(std::pair("RINEX_FILE_TYPE_MET", "M")); // M - Meteorological data file. fileType.insert(std::pair("RINEX_FILE_TYPE_GLO_NAV", "G")); // G - GLONASS navigation file. fileType.insert(std::pair("RINEX_FILE_TYPE_GAL_NAV", "L")); // L - Galileo navigation message file. fileType.insert(std::pair("RINEX_FILE_TYPE_MIXED_NAV", "P")); // P - Mixed GNSS navigation message file. fileType.insert(std::pair("RINEX_FILE_TYPE_GEO_NAV", "H")); // H - SBAS Payload navigation message file. fileType.insert(std::pair("RINEX_FILE_TYPE_SBAS", "B")); // B - SBAS broadcast data file. fileType.insert(std::pair("RINEX_FILE_TYPE_CLK", "C")); // C - Clock file. fileType.insert(std::pair("RINEX_FILE_TYPE_SUMMARY", "S")); // S - Summary file (used e.g., by IGS, not a standard!). boost::posix_time::ptime pt = boost::posix_time::second_clock::local_time(); tm pt_tm = boost::posix_time::to_tm(pt); int local_hour = pt_tm.tm_hour; std::stringstream strm; strm << local_hour; std::map Hmap; Hmap.insert(std::pair("0", "a")); Hmap.insert(std::pair("1", "b")); Hmap.insert(std::pair("2", "c")); Hmap.insert(std::pair("3", "d")); Hmap.insert(std::pair("4", "e")); Hmap.insert(std::pair("5", "f")); Hmap.insert(std::pair("6", "g")); Hmap.insert(std::pair("7", "h")); Hmap.insert(std::pair("8", "i")); Hmap.insert(std::pair("9", "j")); Hmap.insert(std::pair("10", "k")); Hmap.insert(std::pair("11", "l")); Hmap.insert(std::pair("12", "m")); Hmap.insert(std::pair("13", "n")); Hmap.insert(std::pair("14", "o")); Hmap.insert(std::pair("15", "p")); Hmap.insert(std::pair("16", "q")); Hmap.insert(std::pair("17", "r")); Hmap.insert(std::pair("18", "s")); Hmap.insert(std::pair("19", "t")); Hmap.insert(std::pair("20", "u")); Hmap.insert(std::pair("21", "v")); Hmap.insert(std::pair("22", "w")); Hmap.insert(std::pair("23", "x")); std::string hourTag = Hmap[strm.str()]; int local_minute = pt_tm.tm_min; std::stringstream strm2; if (local_minute<10) strm2 << "0"; // at least two digits for minutes strm2 << local_minute; std::string minTag = strm2.str(); int local_year = pt_tm.tm_year - 100; // 2012 is 112 std::stringstream strm3; strm3 << local_year; std::string yearTag = strm3.str(); std::string typeOfFile = fileType[type]; std::string filename(stationName + dayOfTheYearTag + hourTag + minTag + "." + yearTag + typeOfFile); return filename; } std::string Rinex_Printer::getLocalTime() { std::string line; line += std::string("GNSS-SDR"); line += std::string(12, ' '); std::string username; char c_username[20] = {0}; int nGet = getlogin_r(c_username, sizeof(c_username) - 1); if (nGet == 0) { username = c_username; } else { username = "UNKNOWN USER"; } line += Rinex_Printer::leftJustify(username, 20); boost::gregorian::date today = boost::gregorian::day_clock::local_day(); boost::local_time::time_zone_ptr zone(new boost::local_time::posix_time_zone("UTC")); boost::local_time::local_date_time pt = boost::local_time::local_sec_clock::local_time(zone); tm pt_tm = boost::local_time::to_tm(pt); std::stringstream strmHour; int utc_hour = pt_tm.tm_hour; if (utc_hour < 10) strmHour << "0"; // two digits for hours strmHour << utc_hour; std::stringstream strmMin; int utc_minute = pt_tm.tm_min; if (utc_minute < 10) strmMin << "0"; // two digits for minutes strmMin << utc_minute; if (version == 2) { int day = pt_tm.tm_mday; line += Rinex_Printer::rightJustify(boost::lexical_cast(day), 2); line += std::string("-"); std::map months; months[0] = "JAN"; months[1] = "FEB"; months[2] = "MAR"; months[3] = "APR"; months[4] = "MAY"; months[5] = "JUN"; months[6] = "JUL"; months[7] = "AUG"; months[8] = "SEP"; months[9] = "OCT"; months[10] = "NOV"; months[11] = "DEC"; line += months[pt_tm.tm_mon]; line += std::string("-"); line += boost::lexical_cast(pt_tm.tm_year - 100); line += std::string(1, ' '); line += strmHour.str(); line += std::string(":"); line += strmMin.str(); line += std::string(5, ' '); } if (version == 3) { line += boost::gregorian::to_iso_string(today); line += std::string(1, ' '); line += strmHour.str(); line += strmMin.str(); std::stringstream strm2; int utc_seconds = pt_tm.tm_sec; if (utc_seconds < 10) strm2 << "0"; // two digits for seconds strm2 << utc_seconds; line += strm2.str(); line += std::string(1, ' '); line += std::string("UTC"); line += std::string(1, ' '); } return line; } void Rinex_Printer::rinex_nav_header(std::fstream& out, const Galileo_Iono& iono, const Galileo_Utc_Model& utc_model, const Galileo_Almanac& galileo_almanac) { std::string line; stringVersion = "3.02"; version = 3; // -------- Line 1 line = std::string(5, ' '); line += stringVersion; line += std::string(11, ' '); line += std::string("N: GNSS NAV DATA"); line += std::string(4, ' '); line += std::string("E: GALILEO"); line += std::string(10, ' '); line += std::string("RINEX VERSION / TYPE"); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line 2 line.clear(); line += Rinex_Printer::getLocalTime(); line += std::string("PGM / RUN BY / DATE"); line += std::string(1, ' '); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT line.clear(); line += Rinex_Printer::leftJustify("GALILEO NAVIGATION MESSAGE FILE GENERATED BY GNSS-SDR", 60); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT line.clear(); std::string gnss_sdr_version(GNSS_SDR_VERSION); line += "GNSS-SDR VERSION "; line += Rinex_Printer::leftJustify(gnss_sdr_version, 43); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT line.clear(); line += Rinex_Printer::leftJustify("See http://gnss-sdr.org", 60); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line ionospheric info 1 line.clear(); line += std::string("GAL "); line += std::string(1, ' '); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.ai0_5, 10, 2), 12); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.ai1_5, 10, 2), 12); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.ai2_5, 10, 2), 12); double zero = 0.0; line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(zero, 10, 2), 12); line += std::string(7, ' '); line += Rinex_Printer::leftJustify("IONOSPHERIC CORR", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line system time correction line.clear(); line += std::string("GAUT"); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(utc_model.A0_6, 16, 2), 18); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(utc_model.A1_6, 15, 2), 16); line += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.t0t_6), 7); line += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.WNot_6), 5); line += std::string(10, ' '); line += Rinex_Printer::leftJustify("TIME SYSTEM CORR", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line system time correction 2 line.clear(); line += std::string("GPGA"); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(galileo_almanac.A_0G_10, 16, 2), 18); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(galileo_almanac.A_1G_10, 15, 2), 16); line += Rinex_Printer::rightJustify(boost::lexical_cast(galileo_almanac.t_0G_10), 7); line += Rinex_Printer::rightJustify(boost::lexical_cast(galileo_almanac.WN_0G_10), 5); line += std::string(10, ' '); line += Rinex_Printer::leftJustify("TIME SYSTEM CORR", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line 6 leap seconds // For leap second information, see http://www.endruntechnologies.com/leap.htm line.clear(); line += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.Delta_tLS_6), 6); line += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.Delta_tLSF_6), 6); line += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.WN_LSF_6), 6); line += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.DN_6), 6); line += std::string(36, ' '); line += Rinex_Printer::leftJustify("LEAP SECONDS", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- End of Header line.clear(); line += std::string(60, ' '); line += Rinex_Printer::leftJustify("END OF HEADER", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; } void Rinex_Printer::rinex_nav_header(std::fstream& out, const Gps_CNAV_Iono & iono, const Gps_CNAV_Utc_Model & utc_model) { std::string line; // -------- Line 1 line = std::string(5, ' '); line += stringVersion; line += std::string(11, ' '); line += std::string("N: GNSS NAV DATA"); line += std::string(4, ' '); line += std::string("G: GPS"); line += std::string(14, ' '); line += std::string("RINEX VERSION / TYPE"); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line 2 line.clear(); line += Rinex_Printer::getLocalTime(); line += std::string("PGM / RUN BY / DATE"); line += std::string(1, ' '); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line 3 line.clear(); line += Rinex_Printer::leftJustify("GPS NAVIGATION MESSAGE FILE GENERATED BY GNSS-SDR", 60); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT line.clear(); std::string gnss_sdr_version(GNSS_SDR_VERSION); line += "GNSS-SDR VERSION "; line += Rinex_Printer::leftJustify(gnss_sdr_version, 43); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT line.clear(); line += Rinex_Printer::leftJustify("See http://gnss-sdr.org", 60); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line ionospheric info 1 line.clear(); line += std::string("GPSA"); line += std::string(1, ' '); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_alpha0, 10, 2), 12); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_alpha1, 10, 2), 12); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_alpha2, 10, 2), 12); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_alpha3, 10, 2), 12); line += std::string(7, ' '); line += Rinex_Printer::leftJustify("IONOSPHERIC CORR", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line ionospheric info 2 line.clear(); line += std::string("GPSB"); line += std::string(1, ' '); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_beta0, 10, 2), 12); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_beta1, 10, 2), 12); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_beta2, 10, 2), 12); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_beta3, 10, 2), 12); line += std::string(7, ' '); line += Rinex_Printer::leftJustify("IONOSPHERIC CORR", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line 5 system time correction line.clear(); line += std::string("GPUT"); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(utc_model.d_A0, 16, 2), 18); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(utc_model.d_A1, 15, 2), 16); line += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.d_t_OT), 7); line += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.i_WN_T + 1024), 5); // valid until 2019 /* if ( SBAS ) { line += string(1, ' '); line += leftJustify(asString(d_t_OT_SBAS),5); line += string(1, ' '); line += leftJustify(asString(d_WN_T_SBAS),2); line += string(1, ' '); } else */ line += std::string(10, ' '); line += Rinex_Printer::leftJustify("TIME SYSTEM CORR", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line 6 leap seconds // For leap second information, see http://www.endruntechnologies.com/leap.htm line.clear(); line += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.d_DeltaT_LS), 6); line += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.d_DeltaT_LSF), 6); line += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.i_WN_LSF), 6); line += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.i_DN), 6); line += std::string(36, ' '); line += Rinex_Printer::leftJustify("LEAP SECONDS", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- End of Header line.clear(); line += std::string(60, ' '); line += Rinex_Printer::leftJustify("END OF HEADER", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; } void Rinex_Printer::rinex_nav_header(std::fstream& out, const Gps_Iono& iono, const Gps_Utc_Model& utc_model) { std::string line; // -------- Line 1 line = std::string(5, ' '); line += stringVersion; line += std::string(11, ' '); if (version == 2) { line += std::string("N: GPS NAV DATA"); line += std::string(25, ' '); } if (version == 3 ) { line += std::string("N: GNSS NAV DATA"); line += std::string(4, ' '); //! \todo Add here other systems... line += std::string("G: GPS"); line += std::string(14, ' '); // ... } line += std::string("RINEX VERSION / TYPE"); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line 2 line.clear(); line += Rinex_Printer::getLocalTime(); line += std::string("PGM / RUN BY / DATE"); line += std::string(1, ' '); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line 3 line.clear(); line += Rinex_Printer::leftJustify("GPS NAVIGATION MESSAGE FILE GENERATED BY GNSS-SDR", 60); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT line.clear(); std::string gnss_sdr_version(GNSS_SDR_VERSION); line += "GNSS-SDR VERSION "; line += Rinex_Printer::leftJustify(gnss_sdr_version, 43); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT line.clear(); line += Rinex_Printer::leftJustify("See http://gnss-sdr.org", 60); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line ionospheric info 1 line.clear(); if (version == 2) { line += std::string(2, ' '); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_alpha0, 10, 2), 12); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_alpha1, 10, 2), 12); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_alpha2, 10, 2), 12); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_alpha3, 10, 2), 12); line += std::string(10, ' '); line += Rinex_Printer::leftJustify("ION ALPHA", 20); } if (version == 3) { line += std::string("GPSA"); line += std::string(1, ' '); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_alpha0, 10, 2), 12); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_alpha1, 10, 2), 12); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_alpha2, 10, 2), 12); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_alpha3, 10, 2), 12); line += std::string(7, ' '); line += Rinex_Printer::leftJustify("IONOSPHERIC CORR", 20); } Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line ionospheric info 2 line.clear(); if (version == 2) { line += std::string(2, ' '); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_beta0, 10, 2), 12); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_beta1, 10, 2), 12); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_beta2, 10, 2), 12); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_beta3, 10, 2), 12); line += std::string(10, ' '); line += Rinex_Printer::leftJustify("ION BETA", 20); } if (version == 3) { line += std::string("GPSB"); line += std::string(1, ' '); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_beta0, 10, 2), 12); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_beta1, 10, 2), 12); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_beta2, 10, 2), 12); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_beta3, 10, 2), 12); line += std::string(7, ' '); line += Rinex_Printer::leftJustify("IONOSPHERIC CORR", 20); } Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line 5 system time correction line.clear(); if (version == 2) { line += std::string(3, ' '); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(utc_model.d_A0, 18, 2), 19); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(utc_model.d_A1, 18, 2), 19); line += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.d_t_OT), 9); line += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.i_WN_T + 1024), 9); // valid until 2019 line += std::string(1, ' '); line += Rinex_Printer::leftJustify("DELTA-UTC: A0,A1,T,W", 20); } if (version == 3) { line += std::string("GPUT"); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(utc_model.d_A0, 16, 2), 18); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(utc_model.d_A1, 15, 2), 16); line += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.d_t_OT), 7); line += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.i_WN_T + 1024), 5); // valid until 2019 /* if ( SBAS ) { line += string(1, ' '); line += leftJustify(asString(d_t_OT_SBAS),5); line += string(1, ' '); line += leftJustify(asString(d_WN_T_SBAS),2); line += string(1, ' '); } else */ line += std::string(10, ' '); line += Rinex_Printer::leftJustify("TIME SYSTEM CORR", 20); } Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line 6 leap seconds // For leap second information, see http://www.endruntechnologies.com/leap.htm line.clear(); line += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.d_DeltaT_LS), 6); if (version == 2) { line += std::string(54, ' '); } if (version == 3) { line += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.d_DeltaT_LSF), 6); line += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.i_WN_LSF), 6); line += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.i_DN), 6); line += std::string(36, ' '); } line += Rinex_Printer::leftJustify("LEAP SECONDS", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- End of Header line.clear(); line += std::string(60, ' '); line += Rinex_Printer::leftJustify("END OF HEADER", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; } void Rinex_Printer::rinex_nav_header(std::fstream& out, const Gps_Iono& gps_iono, const Gps_Utc_Model& gps_utc_model, const Galileo_Iono& galileo_iono, const Galileo_Utc_Model& galileo_utc_model, const Galileo_Almanac& galileo_almanac) { std::string line; stringVersion = "3.02"; version = 3; // -------- Line 1 line = std::string(5, ' '); line += stringVersion; line += std::string(11, ' '); line += std::string("N: GNSS NAV DATA"); line += std::string(4, ' '); line += std::string("M: MIXED"); line += std::string(12, ' '); line += std::string("RINEX VERSION / TYPE"); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line 2 line.clear(); line += Rinex_Printer::getLocalTime(); line += std::string("PGM / RUN BY / DATE"); line += std::string(1, ' '); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT line.clear(); line += Rinex_Printer::leftJustify("GNSS NAVIGATION MESSAGE FILE GENERATED BY GNSS-SDR", 60); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT line.clear(); std::string gnss_sdr_version(GNSS_SDR_VERSION); line += "GNSS-SDR VERSION "; line += Rinex_Printer::leftJustify(gnss_sdr_version, 43); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT line.clear(); line += Rinex_Printer::leftJustify("See http://gnss-sdr.org", 60); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line ionospheric info 1 line.clear(); line += std::string("GAL "); line += std::string(1, ' '); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(galileo_iono.ai0_5, 10, 2), 12); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(galileo_iono.ai1_5, 10, 2), 12); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(galileo_iono.ai2_5, 10, 2), 12); double zero = 0.0; line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(zero, 10, 2), 12); line += std::string(7, ' '); line += Rinex_Printer::leftJustify("IONOSPHERIC CORR", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line ionospheric info 2 line.clear(); line += std::string("GPSA"); line += std::string(1, ' '); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(gps_iono.d_alpha0, 10, 2), 12); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(gps_iono.d_alpha1, 10, 2), 12); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(gps_iono.d_alpha2, 10, 2), 12); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(gps_iono.d_alpha3, 10, 2), 12); line += std::string(7, ' '); line += Rinex_Printer::leftJustify("IONOSPHERIC CORR", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line system time correction line.clear(); line += std::string("GAUT"); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(galileo_utc_model.A0_6, 16, 2), 18); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(galileo_utc_model.A1_6, 15, 2), 16); line += Rinex_Printer::rightJustify(boost::lexical_cast(galileo_utc_model.t0t_6), 7); line += Rinex_Printer::rightJustify(boost::lexical_cast(galileo_utc_model.WNot_6), 5); line += std::string(10, ' '); line += Rinex_Printer::leftJustify("TIME SYSTEM CORR", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line system time correction 2 line.clear(); line += std::string("GPGA"); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(galileo_almanac.A_0G_10, 16, 2), 18); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(galileo_almanac.A_1G_10, 15, 2), 16); line += Rinex_Printer::rightJustify(boost::lexical_cast(galileo_almanac.t_0G_10), 7); line += Rinex_Printer::rightJustify(boost::lexical_cast(galileo_almanac.WN_0G_10), 5); line += std::string(10, ' '); line += Rinex_Printer::leftJustify("TIME SYSTEM CORR", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line system time correction 3 line.clear(); line += std::string("GPUT"); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(gps_utc_model.d_A0, 16, 2), 18); line += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(gps_utc_model.d_A1, 15, 2), 16); line += Rinex_Printer::rightJustify(boost::lexical_cast(gps_utc_model.d_t_OT), 7); line += Rinex_Printer::rightJustify(boost::lexical_cast(gps_utc_model.i_WN_T + 1024), 5); // valid until 2019 line += std::string(10, ' '); line += Rinex_Printer::leftJustify("TIME SYSTEM CORR", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line 6 leap seconds // For leap second information, see http://www.endruntechnologies.com/leap.htm line.clear(); line += Rinex_Printer::rightJustify(boost::lexical_cast(gps_utc_model.d_DeltaT_LS), 6); line += Rinex_Printer::rightJustify(boost::lexical_cast(gps_utc_model.d_DeltaT_LSF), 6); line += Rinex_Printer::rightJustify(boost::lexical_cast(gps_utc_model.i_WN_LSF), 6); line += Rinex_Printer::rightJustify(boost::lexical_cast(gps_utc_model.i_DN), 6); line += std::string(36, ' '); line += Rinex_Printer::leftJustify("LEAP SECONDS", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- End of Header line.clear(); line += std::string(60, ' '); line += Rinex_Printer::leftJustify("END OF HEADER", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; } void Rinex_Printer::rinex_sbs_header(std::fstream& out) { std::string line; // -------- Line 1 line.clear(); line = std::string(5, ' '); line += std::string("2.10"); line += std::string(11, ' '); line += Rinex_Printer::leftJustify("B SBAS DATA",20); line += std::string(20, ' '); line += std::string("RINEX VERSION / TYPE"); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line 2 line.clear(); line += Rinex_Printer::leftJustify("GNSS-SDR", 20); std::string username; char c_username[20] = {0}; int nGet = getlogin_r(c_username, sizeof(c_username) - 1); if (nGet == 0) { username = c_username; } else { username = "UNKNOWN USER"; } line += Rinex_Printer::leftJustify(username, 20); // Date of file creation (dd-mmm-yy hhmm) boost::local_time::time_zone_ptr zone(new boost::local_time::posix_time_zone("UTC")); boost::local_time::local_date_time pt = boost::local_time::local_sec_clock::local_time(zone); tm pt_tm = boost::local_time::to_tm(pt); std::stringstream strYear; int utc_year = pt.date().year(); utc_year -= 2000; // two digits for year strYear << utc_year; std::stringstream strMonth; int utc_month = pt.date().month().as_number(); if (utc_month < 10) strMonth << "0"; // two digits for months strMonth << utc_month; std::stringstream strmDay; int utc_day = pt.date().day().as_number(); if (utc_day < 10) strmDay << "0"; // two digits for days strmDay << utc_day; std::stringstream strmHour; int utc_hour = pt_tm.tm_hour; if (utc_hour < 10) strmHour << "0"; // two digits for hours strmHour << utc_hour; std::stringstream strmMin; int utc_minute = pt_tm.tm_min; if (utc_minute < 10) strmMin << "0"; // two digits for minutes strmMin << utc_minute; std::string time_str; time_str += strmDay.str(); time_str += "-"; time_str += strMonth.str(); time_str += "-"; time_str += strYear.str(); time_str += " "; time_str += strmHour.str(); time_str += strmMin.str(); line += Rinex_Printer::leftJustify(time_str, 20); line += Rinex_Printer::leftJustify("PGM / RUN BY / DATE", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line 3 line.clear(); line += std::string(60, ' '); line += Rinex_Printer::leftJustify("REC INDEX/TYPE/VERS", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT 1 line.clear(); line += Rinex_Printer::leftJustify("BROADCAST DATA FILE FOR GEO SV, GENERATED BY GNSS-SDR", 60); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT line.clear(); std::string gnss_sdr_version(GNSS_SDR_VERSION); line += "GNSS-SDR VERSION "; line += Rinex_Printer::leftJustify(gnss_sdr_version, 43); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT 2 line.clear(); line += Rinex_Printer::leftJustify("See http://gnss-sdr.org", 60); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- End of Header line.clear(); line += std::string(60, ' '); line += Rinex_Printer::leftJustify("END OF HEADER", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; } void Rinex_Printer::update_nav_header(std::fstream& out, const Galileo_Iono& galileo_iono, const Galileo_Utc_Model& utc_model, const Galileo_Almanac& galileo_almanac) { std::vector data; std::string line_aux; long pos = out.tellp(); out.seekp(0); data.clear(); bool no_more_finds = false; std::string line_str; while(!out.eof()) { std::getline(out, line_str); if(!no_more_finds) { line_aux.clear(); if ((line_str.find("GAL", 0) != std::string::npos) && (line_str.find("IONOSPHERIC CORR", 59) != std::string::npos)) { line_aux += std::string("GAL "); line_aux += std::string(1, ' '); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(galileo_iono.ai0_5, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(galileo_iono.ai1_5, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(galileo_iono.ai2_5, 10, 2), 12); double zero = 0.0; line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(zero, 10, 2), 12); line_aux += std::string(7, ' '); line_aux += Rinex_Printer::leftJustify("IONOSPHERIC CORR", 20); data.push_back(line_aux); } else if ((line_str.find("GAUT", 0) != std::string::npos) && (line_str.find("TIME SYSTEM CORR", 59) != std::string::npos)) { line_aux += std::string("GAUT"); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(utc_model.A0_6, 16, 2), 18); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(utc_model.A1_6, 15, 2), 16); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.t0t_6), 7); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.WNot_6), 5); line_aux += std::string(10, ' '); line_aux += Rinex_Printer::leftJustify("TIME SYSTEM CORR", 20); data.push_back(line_aux); } else if ((line_str.find("GPGA", 0) != std::string::npos) && (line_str.find("TIME SYSTEM CORR", 59) != std::string::npos)) { line_aux += std::string("GPGA"); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(galileo_almanac.A_0G_10, 16, 2), 18); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(galileo_almanac.A_1G_10, 15, 2), 16); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(galileo_almanac.t_0G_10), 7); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(galileo_almanac.WN_0G_10), 5); line_aux += std::string(10, ' '); line_aux += Rinex_Printer::leftJustify("TIME SYSTEM CORR", 20); data.push_back(line_aux); } else if (line_str.find("LEAP SECONDS", 59) != std::string::npos) { line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.Delta_tLS_6), 6); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.Delta_tLSF_6), 6); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.WN_LSF_6), 6); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.DN_6), 6); line_aux += std::string(36, ' '); line_aux += Rinex_Printer::leftJustify("LEAP SECONDS", 20); data.push_back(line_aux); } else if (line_str.find("END OF HEADER", 59) != std::string::npos) { data.push_back(line_str); no_more_finds = true; } else { data.push_back(line_str); } } else { data.push_back(line_str); } } out.close(); out.open(navGalfilename, std::ios::out | std::ios::trunc); out.seekp(0); for (int i = 0; i < (int) data.size() - 1; i++) { out << data[i] << std::endl; } out.close(); out.open(navGalfilename, std::ios::out | std::ios::app); out.seekp(pos); std::cout << "The RINEX Navigation file header has been updated with UTC and IONO info." << std::endl; } void Rinex_Printer::update_nav_header(std::fstream& out, const Gps_Utc_Model& utc_model, const Gps_Iono& iono) { std::vector data; std::string line_aux; long pos = out.tellp(); out.seekp(0); data.clear(); bool no_more_finds = false; std::string line_str; while(!out.eof()) { std::getline(out, line_str); if(!no_more_finds) { line_aux.clear(); if (version == 2) { if (line_str.find("ION ALPHA", 59) != std::string::npos) { line_aux += std::string(2, ' '); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_alpha0, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_alpha1, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_alpha2, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_alpha3, 10, 2), 12); line_aux += std::string(10, ' '); line_aux += Rinex_Printer::leftJustify("ION ALPHA", 20); data.push_back(line_aux); } else if (line_str.find("ION BETA", 59) != std::string::npos) { line_aux += std::string(2, ' '); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_beta0, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_beta1, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_beta2, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_beta3, 10, 2), 12); line_aux += std::string(10, ' '); line_aux += Rinex_Printer::leftJustify("ION BETA", 20); data.push_back(line_aux); } else if (line_str.find("DELTA-UTC", 59) != std::string::npos) { line_aux += std::string(3, ' '); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(utc_model.d_A0, 18, 2), 19); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(utc_model.d_A1, 18, 2), 19); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.d_t_OT), 9); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.i_WN_T + 1024), 9); // valid until 2019 line_aux += std::string(1, ' '); line_aux += Rinex_Printer::leftJustify("DELTA-UTC: A0,A1,T,W", 20); data.push_back(line_aux); } else if (line_str.find("LEAP SECONDS", 59) != std::string::npos) { line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.d_DeltaT_LS), 6); line_aux += std::string(54, ' '); line_aux += Rinex_Printer::leftJustify("LEAP SECONDS", 20); data.push_back(line_aux); } else if (line_str.find("END OF HEADER", 59) != std::string::npos) { data.push_back(line_str); no_more_finds = true; } else { data.push_back(line_str); } } if (version == 3) { if (line_str.find("GPSA", 0) != std::string::npos) { line_aux += std::string("GPSA"); line_aux += std::string(1, ' '); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_alpha0, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_alpha1, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_alpha2, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_alpha3, 10, 2), 12); line_aux += std::string(7, ' '); line_aux += Rinex_Printer::leftJustify("IONOSPHERIC CORR", 20); data.push_back(line_aux); } else if (line_str.find("GPSB", 0) != std::string::npos) { line_aux += std::string("GPSB"); line_aux += std::string(1, ' '); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_beta0, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_beta1, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_beta2, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_beta3, 10, 2), 12); line_aux += std::string(7, ' '); line_aux += Rinex_Printer::leftJustify("IONOSPHERIC CORR", 20); data.push_back(line_aux); } else if (line_str.find("GPUT", 0) != std::string::npos) { line_aux += std::string("GPUT"); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(utc_model.d_A0, 16, 2), 18); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(utc_model.d_A1, 15, 2), 16); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.d_t_OT), 7); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.i_WN_T + 1024), 5); // valid until 2019 line_aux += std::string(10, ' '); line_aux += Rinex_Printer::leftJustify("TIME SYSTEM CORR", 20); data.push_back(line_aux); } else if (line_str.find("LEAP SECONDS", 59) != std::string::npos) { line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.d_DeltaT_LS), 6); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.d_DeltaT_LSF), 6); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.i_WN_LSF), 6); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.i_DN), 6); line_aux += std::string(36, ' '); line_aux += Rinex_Printer::leftJustify("LEAP SECONDS", 20); data.push_back(line_aux); } else if (line_str.find("END OF HEADER", 59) != std::string::npos) { data.push_back(line_str); no_more_finds = true; } else { data.push_back(line_str); } } } else { data.push_back(line_str); } } out.close(); out.open(navfilename, std::ios::out | std::ios::trunc); out.seekp(0); for (int i = 0; i < (int) data.size() - 1; i++) { out << data[i] << std::endl; } out.close(); out.open(navfilename, std::ios::out | std::ios::app); out.seekp(pos); std::cout << "The RINEX Navigation file header has been updated with UTC and IONO info." << std::endl; } void Rinex_Printer::update_nav_header(std::fstream & out, const Gps_CNAV_Utc_Model & utc_model, const Gps_CNAV_Iono & iono ) { std::vector data; std::string line_aux; long pos = out.tellp(); out.seekp(0); data.clear(); bool no_more_finds = false; std::string line_str; while(!out.eof()) { std::getline(out, line_str); if(!no_more_finds) { line_aux.clear(); if (line_str.find("GPSA", 0) != std::string::npos) { line_aux += std::string("GPSA"); line_aux += std::string(1, ' '); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_alpha0, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_alpha1, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_alpha2, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_alpha3, 10, 2), 12); line_aux += std::string(7, ' '); line_aux += Rinex_Printer::leftJustify("IONOSPHERIC CORR", 20); data.push_back(line_aux); } else if (line_str.find("GPSB", 0) != std::string::npos) { line_aux += std::string("GPSB"); line_aux += std::string(1, ' '); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_beta0, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_beta1, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_beta2, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(iono.d_beta3, 10, 2), 12); line_aux += std::string(7, ' '); line_aux += Rinex_Printer::leftJustify("IONOSPHERIC CORR", 20); data.push_back(line_aux); } else if (line_str.find("GPUT", 0) != std::string::npos) { line_aux += std::string("GPUT"); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(utc_model.d_A0, 16, 2), 18); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(utc_model.d_A1, 15, 2), 16); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.d_t_OT), 7); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.i_WN_T + 1024), 5); // valid until 2019 line_aux += std::string(10, ' '); line_aux += Rinex_Printer::leftJustify("TIME SYSTEM CORR", 20); data.push_back(line_aux); } else if (line_str.find("LEAP SECONDS", 59) != std::string::npos) { line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.d_DeltaT_LS), 6); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.d_DeltaT_LSF), 6); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.i_WN_LSF), 6); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.i_DN), 6); line_aux += std::string(36, ' '); line_aux += Rinex_Printer::leftJustify("LEAP SECONDS", 20); data.push_back(line_aux); } else if (line_str.find("END OF HEADER", 59) != std::string::npos) { data.push_back(line_str); no_more_finds = true; } else { data.push_back(line_str); } } else { data.push_back(line_str); } } out.close(); out.open(navfilename, std::ios::out | std::ios::trunc); out.seekp(0); for (int i = 0; i < (int) data.size() - 1; i++) { out << data[i] << std::endl; } out.close(); out.open(navfilename, std::ios::out | std::ios::app); out.seekp(pos); std::cout << "The RINEX Navigation file header has been updated with UTC and IONO info." << std::endl; } void Rinex_Printer::update_nav_header(std::fstream& out, const Gps_Iono& gps_iono, const Gps_Utc_Model& gps_utc_model, const Galileo_Iono& galileo_iono, const Galileo_Utc_Model& galileo_utc_model, const Galileo_Almanac& galileo_almanac) { std::vector data; std::string line_aux; long pos = out.tellp(); out.seekp(0); data.clear(); bool no_more_finds = false; std::string line_str; while(!out.eof()) { std::getline(out, line_str); if(!no_more_finds) { line_aux.clear(); if (line_str.find("GPSA", 0) != std::string::npos) { line_aux += std::string("GPSA"); line_aux += std::string(1, ' '); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(gps_iono.d_alpha0, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(gps_iono.d_alpha1, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(gps_iono.d_alpha2, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(gps_iono.d_alpha3, 10, 2), 12); line_aux += std::string(7, ' '); line_aux += Rinex_Printer::leftJustify("IONOSPHERIC CORR", 20); data.push_back(line_aux); } else if ((line_str.find("GAL", 0) != std::string::npos) && (line_str.find("IONOSPHERIC CORR", 59) != std::string::npos)) { line_aux += std::string("GAL "); line_aux += std::string(1, ' '); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(galileo_iono.ai0_5, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(galileo_iono.ai1_5, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(galileo_iono.ai2_5, 10, 2), 12); double zero = 0.0; line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(zero, 10, 2), 12); line_aux += std::string(7, ' '); line_aux += Rinex_Printer::leftJustify("IONOSPHERIC CORR", 20); data.push_back(line_aux); } else if ((line_str.find("GPSB", 0) != std::string::npos) && (line_str.find("IONOSPHERIC CORR", 59) != std::string::npos)) { line_aux += std::string("GPSB"); line_aux += std::string(1, ' '); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(gps_iono.d_beta0, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(gps_iono.d_beta1, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(gps_iono.d_beta2, 10, 2), 12); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(gps_iono.d_beta3, 10, 2), 12); line_aux += std::string(7, ' '); line_aux += Rinex_Printer::leftJustify("IONOSPHERIC CORR", 20); data.push_back(line_aux); } else if ((line_str.find("GPUT", 0) != std::string::npos) && (line_str.find("TIME SYSTEM CORR", 59) != std::string::npos)) { line_aux += std::string("GPUT"); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(gps_utc_model.d_A0, 16, 2), 18); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(gps_utc_model.d_A1, 15, 2), 16); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(gps_utc_model.d_t_OT), 7); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(gps_utc_model.i_WN_T + 1024), 5); // valid until 2019 line_aux += std::string(10, ' '); line_aux += Rinex_Printer::leftJustify("TIME SYSTEM CORR", 20); data.push_back(line_aux); } else if ((line_str.find("GAUT", 0) != std::string::npos) && (line_str.find("TIME SYSTEM CORR", 59) != std::string::npos)) { line_aux += std::string("GAUT"); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(galileo_utc_model.A0_6, 16, 2), 18); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(galileo_utc_model.A1_6, 15, 2), 16); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(galileo_utc_model.t0t_6), 7); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(galileo_utc_model.WNot_6), 5); line_aux += std::string(10, ' '); line_aux += Rinex_Printer::leftJustify("TIME SYSTEM CORR", 20); data.push_back(line_aux); } else if ((line_str.find("GPGA", 0) != std::string::npos) && (line_str.find("TIME SYSTEM CORR", 59) != std::string::npos)) { line_aux += std::string("GPGA"); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(galileo_almanac.A_0G_10, 16, 2), 18); line_aux += Rinex_Printer::rightJustify(Rinex_Printer::doub2for(galileo_almanac.A_1G_10, 15, 2), 16); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(galileo_almanac.t_0G_10), 7); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(galileo_almanac.WN_0G_10), 5); line_aux += std::string(10, ' '); line_aux += Rinex_Printer::leftJustify("TIME SYSTEM CORR", 20); data.push_back(line_aux); } else if (line_str.find("LEAP SECONDS", 59) != std::string::npos) { line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(gps_utc_model.d_DeltaT_LS), 6); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(gps_utc_model.d_DeltaT_LSF), 6); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(gps_utc_model.i_WN_LSF), 6); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(gps_utc_model.i_DN), 6); line_aux += std::string(36, ' '); line_aux += Rinex_Printer::leftJustify("LEAP SECONDS", 20); data.push_back(line_aux); } else if (line_str.find("END OF HEADER", 59) != std::string::npos) { data.push_back(line_str); no_more_finds = true; } else { data.push_back(line_str); } } else { data.push_back(line_str); } } out.close(); out.open(navMixfilename, std::ios::out | std::ios::trunc); out.seekp(0); for (int i = 0; i < (int) data.size() - 1; i++) { out << data[i] << std::endl; } out.close(); out.open(navMixfilename, std::ios::out | std::ios::app); out.seekp(pos); std::cout << "The RINEX Navigation file header has been updated with UTC and IONO info." << std::endl; } void Rinex_Printer::log_rinex_nav(std::fstream& out, const std::map& eph_map) { std::string line; std::map::const_iterator gps_ephemeris_iter; for(gps_ephemeris_iter = eph_map.begin(); gps_ephemeris_iter != eph_map.end(); gps_ephemeris_iter++) { // -------- SV / EPOCH / SV CLK boost::posix_time::ptime p_utc_time = Rinex_Printer::compute_GPS_time(gps_ephemeris_iter->second, gps_ephemeris_iter->second.d_Toc); std::string timestring = boost::posix_time::to_iso_string(p_utc_time); std::string month (timestring, 4, 2); std::string day (timestring, 6, 2); std::string hour (timestring, 9, 2); std::string minutes (timestring, 11, 2); std::string seconds (timestring, 13, 2); if (version == 2) { line += Rinex_Printer::rightJustify(boost::lexical_cast(gps_ephemeris_iter->second.i_satellite_PRN), 2); line += std::string(1, ' '); std::string year (timestring, 2, 2); line += year; line += std::string(1, ' '); if(boost::lexical_cast(month) < 10) { line += std::string(1, ' '); line += std::string(month, 1, 1); } else { line += month; } line += std::string(1, ' '); if(boost::lexical_cast(day) < 10) { line += std::string(1, ' '); line += std::string(day, 1, 1); } else { line += day; } line += std::string(1, ' '); if(boost::lexical_cast(hour) < 10) { line += std::string(1, ' '); line += std::string(hour, 1, 1); } else { line += hour; } line += std::string(1, ' '); if(boost::lexical_cast(minutes) < 10) { line += std::string(1, ' '); line += std::string(minutes, 1, 1); } else { line += minutes; } line += std::string(1, ' '); if(boost::lexical_cast(seconds) < 10) { line += std::string(1, ' '); line += std::string(seconds, 1, 1); } else { line += seconds; } line += std::string(1, '.'); std::string decimal = std::string("0"); if (timestring.size() > 16) { std::string decimal (timestring, 16, 1); } line += decimal; line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_A_f0, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_A_f1, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_A_f2, 18, 2); line += std::string(1, ' '); } if (version == 3) { line += satelliteSystem["GPS"]; if (gps_ephemeris_iter->second.i_satellite_PRN < 10) line += std::string("0"); line += boost::lexical_cast(gps_ephemeris_iter->second.i_satellite_PRN); std::string year (timestring, 0, 4); line += std::string(1, ' '); line += year; line += std::string(1, ' '); line += month; line += std::string(1, ' '); line += day; line += std::string(1, ' '); line += hour; line += std::string(1, ' '); line += minutes; line += std::string(1, ' '); line += seconds; line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_A_f0, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_A_f1, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_A_f2, 18, 2); } Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- BROADCAST ORBIT - 1 line.clear(); if (version == 2) { line += std::string(4, ' '); } if (version == 3) { line += std::string(5, ' '); } // If there is a discontinued reception the ephemeris is not validated if (gps_ephemeris_iter->second.d_IODE_SF2 == gps_ephemeris_iter->second.d_IODE_SF3) { line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_IODE_SF2, 18, 2); } else { LOG(WARNING) << "Discontinued reception of Frame 2 and 3"; } line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_Crs, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_Delta_n, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_M_0, 18, 2); if (version == 2) { line += std::string(1, ' '); } Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- BROADCAST ORBIT - 2 line.clear(); if (version == 2) { line += std::string(4, ' '); } if (version == 3) { line += std::string(5, ' '); } line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_Cuc, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_e_eccentricity, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_Cus, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_sqrt_A, 18, 2); if (version == 2) { line += std::string(1, ' '); } Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- BROADCAST ORBIT - 3 line.clear(); if (version == 2) { line += std::string(4, ' '); } if (version == 3) { line += std::string(5, ' '); } line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_Toe, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_Cic, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_OMEGA0, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_Cis, 18, 2); if (version == 2) { line += std::string(1, ' '); } Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- BROADCAST ORBIT - 4 line.clear(); if (version == 2) { line += std::string(4, ' '); } if (version == 3) { line += std::string(5, ' '); } line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_i_0, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_Crc, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_OMEGA, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_OMEGA_DOT, 18, 2); if (version == 2) { line += std::string(1, ' '); } Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- BROADCAST ORBIT - 5 line.clear(); if (version == 2) { line += std::string(4, ' '); } if (version == 3) { line += std::string(5, ' '); } line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_IDOT, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(static_cast(gps_ephemeris_iter->second.i_code_on_L2), 18, 2); line += std::string(1, ' '); double GPS_week_continuous_number = static_cast(gps_ephemeris_iter->second.i_GPS_week + 1024); // valid until April 7, 2019 (check http://www.colorado.edu/geography/gcraft/notes/gps/gpseow.htm) line += Rinex_Printer::doub2for(GPS_week_continuous_number, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(static_cast(gps_ephemeris_iter->second.i_code_on_L2), 18, 2); if (version == 2) { line += std::string(1, ' '); } Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- BROADCAST ORBIT - 6 line.clear(); if (version == 2) { line += std::string(4, ' '); } if (version == 3) { line += std::string(5, ' '); } line += Rinex_Printer::doub2for(static_cast(gps_ephemeris_iter->second.i_SV_accuracy), 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(static_cast(gps_ephemeris_iter->second.i_SV_health), 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_TGD, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_IODC, 18, 2); if (version == 2) { line += std::string(1, ' '); } Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- BROADCAST ORBIT - 7 line.clear(); if (version == 2) { line += std::string(4, ' '); } if (version == 3) { line += std::string(5, ' '); } line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_TOW, 18, 2); line += std::string(1, ' '); double curve_fit_interval = 4; if (gps_ephemeris_iter->second.satelliteBlock.at(gps_ephemeris_iter->second.i_satellite_PRN).compare("IIA")) { // Block II/IIA (Table 20-XI IS-GPS-200E ) if ( (gps_ephemeris_iter->second.d_IODC > 239) && (gps_ephemeris_iter->second.d_IODC < 248) ) curve_fit_interval = 8; if ( ( (gps_ephemeris_iter->second.d_IODC > 247) && (gps_ephemeris_iter->second.d_IODC < 256) ) || (gps_ephemeris_iter->second.d_IODC == 496) ) curve_fit_interval = 14; if ( (gps_ephemeris_iter->second.d_IODC > 496) && (gps_ephemeris_iter->second.d_IODC < 504) ) curve_fit_interval = 26; if ( (gps_ephemeris_iter->second.d_IODC > 503) && (gps_ephemeris_iter->second.d_IODC < 511) ) curve_fit_interval = 50; if ( ( (gps_ephemeris_iter->second.d_IODC > 751) && (gps_ephemeris_iter->second.d_IODC < 757) ) || (gps_ephemeris_iter->second.d_IODC == 511) ) curve_fit_interval = 74; if ( gps_ephemeris_iter->second.d_IODC == 757 ) curve_fit_interval = 98; } if ((gps_ephemeris_iter->second.satelliteBlock.at(gps_ephemeris_iter->second.i_satellite_PRN).compare("IIR") == 0) || (gps_ephemeris_iter->second.satelliteBlock.at(gps_ephemeris_iter->second.i_satellite_PRN).compare("IIR-M") == 0) || (gps_ephemeris_iter->second.satelliteBlock.at(gps_ephemeris_iter->second.i_satellite_PRN).compare("IIF") == 0) || (gps_ephemeris_iter->second.satelliteBlock.at(gps_ephemeris_iter->second.i_satellite_PRN).compare("IIIA") == 0) ) { // Block IIR/IIR-M/IIF/IIIA (Table 20-XII IS-GPS-200E ) if ( (gps_ephemeris_iter->second.d_IODC > 239) && (gps_ephemeris_iter->second.d_IODC < 248)) curve_fit_interval = 8; if ( ( (gps_ephemeris_iter->second.d_IODC > 247) && (gps_ephemeris_iter->second.d_IODC < 256)) || (gps_ephemeris_iter->second.d_IODC == 496) ) curve_fit_interval = 14; if ( ( (gps_ephemeris_iter->second.d_IODC > 496) && (gps_ephemeris_iter->second.d_IODC < 504)) || ( (gps_ephemeris_iter->second.d_IODC > 1020) && (gps_ephemeris_iter->second.d_IODC < 1024) ) ) curve_fit_interval = 26; } line += Rinex_Printer::doub2for(curve_fit_interval, 18, 2); line += std::string(1, ' '); line += std::string(18, ' '); // spare line += std::string(1, ' '); line += std::string(18, ' '); // spare if (version == 2) { line += std::string(1, ' '); } Rinex_Printer::lengthCheck(line); out << line << std::endl; line.clear(); } } void Rinex_Printer::log_rinex_nav(std::fstream& out, const std::map& eph_map) { std::string line; std::map::const_iterator gps_ephemeris_iter; for(gps_ephemeris_iter = eph_map.begin(); gps_ephemeris_iter != eph_map.end(); gps_ephemeris_iter++) { // -------- SV / EPOCH / SV CLK boost::posix_time::ptime p_utc_time = Rinex_Printer::compute_GPS_time(gps_ephemeris_iter->second, gps_ephemeris_iter->second.d_Toc); std::string timestring = boost::posix_time::to_iso_string(p_utc_time); std::string month (timestring, 4, 2); std::string day (timestring, 6, 2); std::string hour (timestring, 9, 2); std::string minutes (timestring, 11, 2); std::string seconds (timestring, 13, 2); line += satelliteSystem["GPS"]; if (gps_ephemeris_iter->second.i_satellite_PRN < 10) line += std::string("0"); line += boost::lexical_cast(gps_ephemeris_iter->second.i_satellite_PRN); std::string year (timestring, 0, 4); line += std::string(1, ' '); line += year; line += std::string(1, ' '); line += month; line += std::string(1, ' '); line += day; line += std::string(1, ' '); line += hour; line += std::string(1, ' '); line += minutes; line += std::string(1, ' '); line += seconds; line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_A_f0, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_A_f1, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_A_f2, 18, 2); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- BROADCAST ORBIT - 1 line.clear(); line += std::string(5, ' '); // If there is no IODE in CNAV, so we set it to zero double my_zero = 0.0; line += Rinex_Printer::doub2for(my_zero, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_Crs, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_Delta_n, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_M_0, 18, 2); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- BROADCAST ORBIT - 2 line.clear(); line += std::string(5, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_Cuc, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_e_eccentricity, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_Cus, 18, 2); line += std::string(1, ' '); const double A_REF = 26559710.0; // See IS-GPS-200H, pp. 163 double sqrt_A = sqrt(A_REF + gps_ephemeris_iter->second.d_DELTA_A); line += Rinex_Printer::doub2for(sqrt_A, 18, 2); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- BROADCAST ORBIT - 3 line.clear(); line += std::string(5, ' '); line += Rinex_Printer::doub2for(std::max(gps_ephemeris_iter->second.d_Toe1, gps_ephemeris_iter->second.d_Toe2), 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_Cic, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_OMEGA0, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_Cis, 18, 2); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- BROADCAST ORBIT - 4 line.clear(); line += std::string(5, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_i_0, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_Crc, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_OMEGA, 18, 2); line += std::string(1, ' '); const double OMEGA_DOT_REF = -2.6e-9; // semicircles / s, see IS-GPS-200H pp. 164 double OMEGA_DOT = OMEGA_DOT_REF + gps_ephemeris_iter->second.d_DELTA_OMEGA_DOT; line += Rinex_Printer::doub2for(OMEGA_DOT, 18, 2); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- BROADCAST ORBIT - 5 line.clear(); line += std::string(5, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_IDOT, 18, 2); line += std::string(1, ' '); // No data flag for L2 P code line += Rinex_Printer::doub2for(my_zero, 18, 2); line += std::string(1, ' '); double GPS_week_continuous_number = static_cast(gps_ephemeris_iter->second.i_GPS_week + 1024); // valid until April 7, 2019 (check http://www.colorado.edu/geography/gcraft/notes/gps/gpseow.htm) line += Rinex_Printer::doub2for(GPS_week_continuous_number, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(my_zero, 18, 2); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- BROADCAST ORBIT - 6 line.clear(); line += std::string(5, ' '); line += Rinex_Printer::doub2for(static_cast(gps_ephemeris_iter->second.i_URA), 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(static_cast(gps_ephemeris_iter->second.i_signal_health), 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_TGD, 18, 2); line += std::string(1, ' '); // no IODC in CNAV, so we set it to zero line += Rinex_Printer::doub2for(my_zero, 18, 2); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- BROADCAST ORBIT - 7 line.clear(); line += std::string(5, ' '); line += Rinex_Printer::doub2for(gps_ephemeris_iter->second.d_TOW, 18, 2); line += std::string(1, ' '); double curve_fit_interval = 3; /// ?? Not defined in CNAV line += Rinex_Printer::doub2for(curve_fit_interval, 18, 2); line += std::string(1, ' '); line += std::string(18, ' '); // spare line += std::string(1, ' '); line += std::string(18, ' '); // spare Rinex_Printer::lengthCheck(line); out << line << std::endl; line.clear(); } } void Rinex_Printer::log_rinex_nav(std::fstream& out, const std::map& eph_map) { std::string line; std::map::const_iterator galileo_ephemeris_iter; line.clear(); for(galileo_ephemeris_iter = eph_map.begin(); galileo_ephemeris_iter != eph_map.end(); galileo_ephemeris_iter++) { // -------- SV / EPOCH / SV CLK boost::posix_time::ptime p_utc_time = Rinex_Printer::compute_Galileo_time(galileo_ephemeris_iter->second, galileo_ephemeris_iter->second.t0e_1); std::string timestring = boost::posix_time::to_iso_string(p_utc_time); std::string month (timestring, 4, 2); std::string day (timestring, 6, 2); std::string hour (timestring, 9, 2); std::string minutes (timestring, 11, 2); std::string seconds (timestring, 13, 2); line += satelliteSystem["Galileo"]; if (galileo_ephemeris_iter->second.i_satellite_PRN < 10) line += std::string("0"); line += boost::lexical_cast(galileo_ephemeris_iter->second.i_satellite_PRN); std::string year (timestring, 0, 4); line += std::string(1, ' '); line += year; line += std::string(1, ' '); line += month; line += std::string(1, ' '); line += day; line += std::string(1, ' '); line += hour; line += std::string(1, ' '); line += minutes; line += std::string(1, ' '); line += seconds; line += std::string(1, ' '); line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.af0_4, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.af1_4, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.af2_4, 18, 2); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- BROADCAST ORBIT - 1 line.clear(); line += std::string(5, ' '); line += Rinex_Printer::doub2for(static_cast(galileo_ephemeris_iter->second.IOD_ephemeris), 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.C_rs_3, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.delta_n_3, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.M0_1, 18, 2); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- BROADCAST ORBIT - 2 line.clear(); line += std::string(5, ' '); line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.C_uc_3, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.e_1, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.C_us_3, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.A_1, 18, 2); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- BROADCAST ORBIT - 3 line.clear(); line += std::string(5, ' '); line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.t0e_1, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.C_ic_4, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.OMEGA_0_2, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.C_is_4, 18, 2); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- BROADCAST ORBIT - 4 line.clear(); line += std::string(5, ' '); line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.i_0_2, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.C_rc_3, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.omega_2, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.OMEGA_dot_3, 18, 2); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- BROADCAST ORBIT - 5 line.clear(); line += std::string(5, ' '); line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.iDot_2, 18, 2); line += std::string(1, ' '); //double one = 1.0; // INAV E1-B std::string iNAVE1B("1000000001"); int data_source_INAV = Rinex_Printer::toInt(iNAVE1B, 10); line += Rinex_Printer::doub2for(static_cast(data_source_INAV), 18, 2); line += std::string(1, ' '); double GST_week = static_cast(galileo_ephemeris_iter->second.WN_5); double num_GST_rollovers = floor((GST_week + 1024.0) / 4096.0 ); double Galileo_week_continuous_number = GST_week + 1024.0 + num_GST_rollovers * 4096.0; line += Rinex_Printer::doub2for(Galileo_week_continuous_number, 18, 2); line += std::string(1, ' '); double zero = 0.0; line += Rinex_Printer::doub2for(zero, 18, 2); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- BROADCAST ORBIT - 6 line.clear(); line += std::string(5, ' '); //line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.SISA_3, 18, 2); line += Rinex_Printer::doub2for(zero, 18, 2); // *************** CHANGE THIS WHEN GALILEO SIGNAL IS VALID line += std::string(1, ' '); std::string E1B_HS; std::string E5B_HS; if(galileo_ephemeris_iter->second.E1B_HS_5 == 0) E1B_HS = "00"; if(galileo_ephemeris_iter->second.E1B_HS_5 == 1) E1B_HS = "01"; if(galileo_ephemeris_iter->second.E1B_HS_5 == 2) E1B_HS = "10"; if(galileo_ephemeris_iter->second.E1B_HS_5 == 3) E1B_HS = "11"; if(galileo_ephemeris_iter->second.E5b_HS_5 == 0) E5B_HS = "00"; if(galileo_ephemeris_iter->second.E5b_HS_5 == 1) E5B_HS = "01"; if(galileo_ephemeris_iter->second.E5b_HS_5 == 2) E5B_HS = "10"; if(galileo_ephemeris_iter->second.E5b_HS_5 == 3) E5B_HS = "11"; if(E1B_HS == "11") LOG(WARNING) << "Signal Component currently in Test"; if(E1B_HS == "10") LOG(WARNING) << "Signal will be out of service"; if(E1B_HS == "01") LOG(WARNING) << "Signal out of service"; E1B_HS = "00"; // *************** CHANGE THIS WHEN GALILEO SIGNAL IS VALID std::string E1B_DVS = boost::lexical_cast(galileo_ephemeris_iter->second.E1B_DVS_5); if(E1B_DVS == "1") LOG(WARNING) << "Navigation data without guarantee"; E1B_DVS = "0"; // *************** CHANGE THIS WHEN GALILEO SIGNAL IS VALID std::string SVhealth_str = E5B_HS + boost::lexical_cast(galileo_ephemeris_iter->second.E5b_DVS_5) + "11" + "1" + E1B_DVS + E1B_HS + boost::lexical_cast(galileo_ephemeris_iter->second.E1B_DVS_5); SVhealth_str = "000000000"; // *************** CHANGE THIS WHEN GALILEO SIGNAL IS VALID int SVhealth = Rinex_Printer::toInt(SVhealth_str, 9); line += Rinex_Printer::doub2for(static_cast(SVhealth), 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.BGD_E1E5a_5, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.BGD_E1E5b_5, 18, 2); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- BROADCAST ORBIT - 7 line.clear(); line += std::string(5, ' '); line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.TOW_5, 18, 2); line += std::string(1, ' '); line += Rinex_Printer::doub2for(zero, 18, 2); line += std::string(1, ' '); line += std::string(18, ' '); // spare line += std::string(1, ' '); line += std::string(18, ' '); // spare Rinex_Printer::lengthCheck(line); out << line << std::endl; line.clear(); } } void Rinex_Printer::log_rinex_nav(std::fstream& out, const std::map& gps_eph_map, const std::map& galileo_eph_map) { version = 3; stringVersion = "3.02"; Rinex_Printer::log_rinex_nav(out, gps_eph_map); Rinex_Printer::log_rinex_nav(out, galileo_eph_map); } void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& eph, const double d_TOW_first_observation) { std::string line; // -------- Line 1 line = std::string(5, ' '); line += stringVersion; line += std::string(11, ' '); line += Rinex_Printer::leftJustify("OBSERVATION DATA", 20); line += satelliteSystem["GPS"]; line += std::string(19, ' '); line += std::string("RINEX VERSION / TYPE"); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line 2 line.clear(); if (version == 2) { line += Rinex_Printer::leftJustify("BLANK OR G = GPS, R = GLONASS, E = GALILEO, M = MIXED", 60); } if (version == 3) { line += Rinex_Printer::leftJustify("G = GPS R = GLONASS E = GALILEO S = GEO M = MIXED", 60); } line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line 3 line.clear(); line += Rinex_Printer::getLocalTime(); line += std::string("PGM / RUN BY / DATE"); line += std::string(1, ' '); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT line.clear(); line += Rinex_Printer::leftJustify("GPS OBSERVATION DATA FILE GENERATED BY GNSS-SDR", 60); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT line.clear(); std::string gnss_sdr_version(GNSS_SDR_VERSION); line += "GNSS-SDR VERSION "; line += Rinex_Printer::leftJustify(gnss_sdr_version, 43); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT line.clear(); line += Rinex_Printer::leftJustify("See http://gnss-sdr.org", 60); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line MARKER NAME line.clear(); line += Rinex_Printer::leftJustify("DEFAULT MARKER NAME", 60); // put a flag or a property, line += Rinex_Printer::leftJustify("MARKER NAME", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line MARKER TYPE //line.clear(); //line += Rinex_Printer::leftJustify("GROUND_CRAFT", 20); // put a flag or a property //line += std::string(40, ' '); //line += Rinex_Printer::leftJustify("MARKER TYPE", 20); //Rinex_Printer::lengthCheck(line); //out << line << std::endl; // -------- Line OBSERVER / AGENCY line.clear(); std::string username; char c_username[20] = {0}; int nGet = getlogin_r(c_username, sizeof(c_username) - 1); if (nGet == 0) { username = c_username; } else { username = "UNKNOWN USER"; } line += leftJustify(username, 20); line += Rinex_Printer::leftJustify("CTTC", 40); // add flag and property line += Rinex_Printer::leftJustify("OBSERVER / AGENCY", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line REC / TYPE VERS line.clear(); line += Rinex_Printer::leftJustify("GNSS-SDR", 20); // add flag and property line += Rinex_Printer::leftJustify("Software Receiver", 20); // add flag and property //line += Rinex_Printer::leftJustify(google::VersionString(), 20); // add flag and property if(gnss_sdr_version.length() > 20) gnss_sdr_version.resize(9, ' '); line += Rinex_Printer::leftJustify(gnss_sdr_version, 20); line += Rinex_Printer::leftJustify("REC # / TYPE / VERS", 20); lengthCheck(line); out << line << std::endl; // -------- ANTENNA TYPE line.clear(); line += Rinex_Printer::leftJustify("Antenna number", 20); // add flag and property line += Rinex_Printer::leftJustify("Antenna type", 20); // add flag and property line += std::string(20, ' '); line += Rinex_Printer::leftJustify("ANT # / TYPE", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- APPROX POSITION (optional for moving platforms) // put here real data! double antena_x = 0.0; double antena_y = 0.0; double antena_z = 0.0; line.clear(); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_x, 4), 14); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_y, 4), 14); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_z, 4), 14); line += std::string(18, ' '); line += Rinex_Printer::leftJustify("APPROX POSITION XYZ", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- ANTENNA: DELTA H/E/N // put here real data! double antena_h = 0.0; double antena_e = 0.0; double antena_n = 0.0; line.clear(); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_h, 4), 14); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_e, 4), 14); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_n, 4), 14); line += std::string(18, ' '); line += Rinex_Printer::leftJustify("ANTENNA: DELTA H/E/N", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; if (version == 2) { // --------- WAVELENGHT FACTOR // put here real data! line.clear(); line +=Rinex_Printer::rightJustify("1",6); line +=Rinex_Printer::rightJustify("1",6); line += std::string(48, ' '); line += Rinex_Printer::leftJustify("WAVELENGTH FACT L1/2", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; } if (version == 3) { // -------- SYS / OBS TYPES // one line per available system line.clear(); line += satelliteSystem["GPS"]; line += std::string(2, ' '); std::stringstream strm; numberTypesObservations = 4; strm << numberTypesObservations; line += Rinex_Printer::rightJustify(strm.str(), 3); // per type of observation // GPS L1 PSEUDORANGE line += std::string(1, ' '); line += observationType["PSEUDORANGE"]; line += observationCode["GPS_L1_CA"]; // GPS L1 PHASE line += std::string(1, ' '); line += observationType["CARRIER_PHASE"]; line += observationCode["GPS_L1_CA"]; // GPS DOPPLER L1 line += std::string(1, ' '); line += observationType["DOPPLER"]; line += observationCode["GPS_L1_CA"]; // GPS L1 CA SIGNAL STRENGTH line += std::string(1, ' '); line += observationType["SIGNAL_STRENGTH"]; line += observationCode["GPS_L1_CA"]; line += std::string(60-line.size(), ' '); line += Rinex_Printer::leftJustify("SYS / # / OBS TYPES", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; } if (version == 2) { // -------- SYS / OBS TYPES line.clear(); std::stringstream strm; strm << numberTypesObservations; line += Rinex_Printer::rightJustify(strm.str(), 6); // per type of observation // GPS L1 PSEUDORANGE line += Rinex_Printer::rightJustify(observationType["PSEUDORANGE_CA_v2"], 5); line += observationCode["GPS_L1_CA_v2"]; // GPS L1 PHASE line += Rinex_Printer::rightJustify(observationType["CARRIER_PHASE_CA_v2"], 5); line += observationCode["GPS_L1_CA_v2"]; // GPS DOPPLER L1 line += Rinex_Printer::rightJustify(observationType["DOPPLER_v2"], 5); line += observationCode["GPS_L1_CA_v2"]; // GPS L1 SIGNAL STRENGTH line += Rinex_Printer::rightJustify(observationType["SIGNAL_STRENGTH_v2"], 5); line += observationCode["GPS_L1_CA_v2"]; line += std::string(60-line.size(), ' '); line += Rinex_Printer::leftJustify("# / TYPES OF OBSERV", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; } if (version == 3) { // -------- Signal Strength units line.clear(); line += Rinex_Printer::leftJustify("DBHZ", 20); line += std::string(40, ' '); line += Rinex_Printer::leftJustify("SIGNAL STRENGTH UNIT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; } // -------- TIME OF FIRST OBS line.clear(); boost::posix_time::ptime p_gps_time = Rinex_Printer::compute_GPS_time(eph,d_TOW_first_observation); std::string timestring = boost::posix_time::to_iso_string(p_gps_time); std::string year (timestring, 0, 4); std::string month (timestring, 4, 2); std::string day (timestring, 6, 2); std::string hour (timestring, 9, 2); std::string minutes (timestring, 11, 2); double gps_t = d_TOW_first_observation; double seconds = fmod(gps_t, 60); line += Rinex_Printer::rightJustify(year, 6); line += Rinex_Printer::rightJustify(month, 6); line += Rinex_Printer::rightJustify(day, 6); line += Rinex_Printer::rightJustify(hour, 6); line += Rinex_Printer::rightJustify(minutes, 6); line += Rinex_Printer::rightJustify(asString(seconds, 7), 13); line += Rinex_Printer::rightJustify(std::string("GPS"), 8); line += std::string(9, ' '); line += Rinex_Printer::leftJustify("TIME OF FIRST OBS", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- SYS /PHASE SHIFTS // -------- end of header line.clear(); line += std::string(60, ' '); line += Rinex_Printer::leftJustify("END OF HEADER", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; } void Rinex_Printer::rinex_obs_header(std::fstream & out, const Gps_CNAV_Ephemeris & eph, const double d_TOW_first_observation) { std::string line; // -------- Line 1 line = std::string(5, ' '); line += stringVersion; line += std::string(11, ' '); line += Rinex_Printer::leftJustify("OBSERVATION DATA", 20); line += satelliteSystem["GPS"]; line += std::string(19, ' '); line += std::string("RINEX VERSION / TYPE"); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line 2 line.clear(); line += Rinex_Printer::leftJustify("G = GPS R = GLONASS E = GALILEO S = GEO M = MIXED", 60); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line 3 line.clear(); line += Rinex_Printer::getLocalTime(); line += std::string("PGM / RUN BY / DATE"); line += std::string(1, ' '); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT line.clear(); line += Rinex_Printer::leftJustify("GPS OBSERVATION DATA FILE GENERATED BY GNSS-SDR", 60); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT line.clear(); std::string gnss_sdr_version(GNSS_SDR_VERSION); line += "GNSS-SDR VERSION "; line += Rinex_Printer::leftJustify(gnss_sdr_version, 43); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT line.clear(); line += Rinex_Printer::leftJustify("See http://gnss-sdr.org", 60); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line MARKER NAME line.clear(); line += Rinex_Printer::leftJustify("DEFAULT MARKER NAME", 60); // put a flag or a property, line += Rinex_Printer::leftJustify("MARKER NAME", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line MARKER TYPE //line.clear(); //line += Rinex_Printer::leftJustify("GROUND_CRAFT", 20); // put a flag or a property //line += std::string(40, ' '); //line += Rinex_Printer::leftJustify("MARKER TYPE", 20); //Rinex_Printer::lengthCheck(line); //out << line << std::endl; // -------- Line OBSERVER / AGENCY line.clear(); std::string username; char c_username[20] = {0}; int nGet = getlogin_r(c_username, sizeof(c_username) - 1); if (nGet == 0) { username = c_username; } else { username = "UNKNOWN USER"; } line += leftJustify(username, 20); line += Rinex_Printer::leftJustify("CTTC", 40); // add flag and property line += Rinex_Printer::leftJustify("OBSERVER / AGENCY", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line REC / TYPE VERS line.clear(); line += Rinex_Printer::leftJustify("GNSS-SDR", 20); // add flag and property line += Rinex_Printer::leftJustify("Software Receiver", 20); // add flag and property //line += Rinex_Printer::leftJustify(google::VersionString(), 20); // add flag and property if(gnss_sdr_version.length() > 20) gnss_sdr_version.resize(9, ' '); line += Rinex_Printer::leftJustify(gnss_sdr_version, 20); line += Rinex_Printer::leftJustify("REC # / TYPE / VERS", 20); lengthCheck(line); out << line << std::endl; // -------- ANTENNA TYPE line.clear(); line += Rinex_Printer::leftJustify("Antenna number", 20); // add flag and property line += Rinex_Printer::leftJustify("Antenna type", 20); // add flag and property line += std::string(20, ' '); line += Rinex_Printer::leftJustify("ANT # / TYPE", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- APPROX POSITION (optional for moving platforms) // put here real data! double antena_x = 0.0; double antena_y = 0.0; double antena_z = 0.0; line.clear(); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_x, 4), 14); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_y, 4), 14); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_z, 4), 14); line += std::string(18, ' '); line += Rinex_Printer::leftJustify("APPROX POSITION XYZ", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- ANTENNA: DELTA H/E/N // put here real data! double antena_h = 0.0; double antena_e = 0.0; double antena_n = 0.0; line.clear(); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_h, 4), 14); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_e, 4), 14); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_n, 4), 14); line += std::string(18, ' '); line += Rinex_Printer::leftJustify("ANTENNA: DELTA H/E/N", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- SYS / OBS TYPES // one line per available system line.clear(); line += satelliteSystem["GPS"]; line += std::string(2, ' '); std::stringstream strm; numberTypesObservations = 4; strm << numberTypesObservations; line += Rinex_Printer::rightJustify(strm.str(), 3); // per type of observation // GPS L2 PSEUDORANGE line += std::string(1, ' '); line += observationType["PSEUDORANGE"]; line += observationCode["GPS_L2_L2CM"]; // GPS L2 PHASE line += std::string(1, ' '); line += observationType["CARRIER_PHASE"]; line += observationCode["GPS_L2_L2CM"]; // GPS DOPPLER L2 line += std::string(1, ' '); line += observationType["DOPPLER"]; line += observationCode["GPS_L2_L2CM"]; // GPS L2 SIGNAL STRENGTH line += std::string(1, ' '); line += observationType["SIGNAL_STRENGTH"]; line += observationCode["GPS_L2_L2CM"]; line += std::string(60-line.size(), ' '); line += Rinex_Printer::leftJustify("SYS / # / OBS TYPES", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Signal Strength units line.clear(); line += Rinex_Printer::leftJustify("DBHZ", 20); line += std::string(40, ' '); line += Rinex_Printer::leftJustify("SIGNAL STRENGTH UNIT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- TIME OF FIRST OBS line.clear(); boost::posix_time::ptime p_gps_time = Rinex_Printer::compute_GPS_time(eph,d_TOW_first_observation); std::string timestring = boost::posix_time::to_iso_string(p_gps_time); std::string year (timestring, 0, 4); std::string month (timestring, 4, 2); std::string day (timestring, 6, 2); std::string hour (timestring, 9, 2); std::string minutes (timestring, 11, 2); double gps_t = d_TOW_first_observation; double seconds = fmod(gps_t, 60); line += Rinex_Printer::rightJustify(year, 6); line += Rinex_Printer::rightJustify(month, 6); line += Rinex_Printer::rightJustify(day, 6); line += Rinex_Printer::rightJustify(hour, 6); line += Rinex_Printer::rightJustify(minutes, 6); line += Rinex_Printer::rightJustify(asString(seconds, 7), 13); line += Rinex_Printer::rightJustify(std::string("GPS"), 8); line += std::string(9, ' '); line += Rinex_Printer::leftJustify("TIME OF FIRST OBS", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- SYS /PHASE SHIFTS // -------- end of header line.clear(); line += std::string(60, ' '); line += Rinex_Printer::leftJustify("END OF HEADER", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; } void Rinex_Printer::rinex_obs_header(std::fstream & out, const Gps_Ephemeris & eph, const Gps_CNAV_Ephemeris & eph_cnav, const double d_TOW_first_observation) { if(eph_cnav.d_i_0){} // avoid warning, not needed std::string line; // -------- Line 1 line = std::string(5, ' '); line += stringVersion; line += std::string(11, ' '); line += Rinex_Printer::leftJustify("OBSERVATION DATA", 20); line += satelliteSystem["GPS"]; line += std::string(19, ' '); line += std::string("RINEX VERSION / TYPE"); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line 2 line.clear(); line += Rinex_Printer::leftJustify("G = GPS R = GLONASS E = GALILEO S = GEO M = MIXED", 60); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line 3 line.clear(); line += Rinex_Printer::getLocalTime(); line += std::string("PGM / RUN BY / DATE"); line += std::string(1, ' '); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT line.clear(); line += Rinex_Printer::leftJustify("GPS OBSERVATION DATA FILE GENERATED BY GNSS-SDR", 60); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT line.clear(); std::string gnss_sdr_version(GNSS_SDR_VERSION); line += "GNSS-SDR VERSION "; line += Rinex_Printer::leftJustify(gnss_sdr_version, 43); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT line.clear(); line += Rinex_Printer::leftJustify("See http://gnss-sdr.org", 60); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line MARKER NAME line.clear(); line += Rinex_Printer::leftJustify("DEFAULT MARKER NAME", 60); // put a flag or a property, line += Rinex_Printer::leftJustify("MARKER NAME", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line MARKER TYPE //line.clear(); //line += Rinex_Printer::leftJustify("GROUND_CRAFT", 20); // put a flag or a property //line += std::string(40, ' '); //line += Rinex_Printer::leftJustify("MARKER TYPE", 20); //Rinex_Printer::lengthCheck(line); //out << line << std::endl; // -------- Line OBSERVER / AGENCY line.clear(); std::string username; char c_username[20] = {0}; int nGet = getlogin_r(c_username, sizeof(c_username) - 1); if (nGet == 0) { username = c_username; } else { username = "UNKNOWN USER"; } line += leftJustify(username, 20); line += Rinex_Printer::leftJustify("CTTC", 40); // add flag and property line += Rinex_Printer::leftJustify("OBSERVER / AGENCY", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line REC / TYPE VERS line.clear(); line += Rinex_Printer::leftJustify("GNSS-SDR", 20); // add flag and property line += Rinex_Printer::leftJustify("Software Receiver", 20); // add flag and property //line += Rinex_Printer::leftJustify(google::VersionString(), 20); // add flag and property if(gnss_sdr_version.length() > 20) gnss_sdr_version.resize(9, ' '); line += Rinex_Printer::leftJustify(gnss_sdr_version, 20); line += Rinex_Printer::leftJustify("REC # / TYPE / VERS", 20); lengthCheck(line); out << line << std::endl; // -------- ANTENNA TYPE line.clear(); line += Rinex_Printer::leftJustify("Antenna number", 20); // add flag and property line += Rinex_Printer::leftJustify("Antenna type", 20); // add flag and property line += std::string(20, ' '); line += Rinex_Printer::leftJustify("ANT # / TYPE", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- APPROX POSITION (optional for moving platforms) // put here real data! double antena_x = 0.0; double antena_y = 0.0; double antena_z = 0.0; line.clear(); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_x, 4), 14); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_y, 4), 14); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_z, 4), 14); line += std::string(18, ' '); line += Rinex_Printer::leftJustify("APPROX POSITION XYZ", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- ANTENNA: DELTA H/E/N // put here real data! double antena_h = 0.0; double antena_e = 0.0; double antena_n = 0.0; line.clear(); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_h, 4), 14); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_e, 4), 14); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_n, 4), 14); line += std::string(18, ' '); line += Rinex_Printer::leftJustify("ANTENNA: DELTA H/E/N", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- SYS / OBS TYPES // one line per available system line.clear(); line += satelliteSystem["GPS"]; line += std::string(2, ' '); std::stringstream strm; numberTypesObservations = 8; strm << numberTypesObservations; line += Rinex_Printer::rightJustify(strm.str(), 3); // per type of observation // GPS L1 PSEUDORANGE line += std::string(1, ' '); line += observationType["PSEUDORANGE"]; line += observationCode["GPS_L1_CA"]; // GPS L1 PHASE line += std::string(1, ' '); line += observationType["CARRIER_PHASE"]; line += observationCode["GPS_L1_CA"]; // GPS DOPPLER L1 line += std::string(1, ' '); line += observationType["DOPPLER"]; line += observationCode["GPS_L1_CA"]; // GPS L1 CA SIGNAL STRENGTH line += std::string(1, ' '); line += observationType["SIGNAL_STRENGTH"]; line += observationCode["GPS_L1_CA"]; // GPS L2 PSEUDORANGE line += std::string(1, ' '); line += observationType["PSEUDORANGE"]; line += observationCode["GPS_L2_L2CM"]; // GPS L2 PHASE line += std::string(1, ' '); line += observationType["CARRIER_PHASE"]; line += observationCode["GPS_L2_L2CM"]; // GPS DOPPLER L2 line += std::string(1, ' '); line += observationType["DOPPLER"]; line += observationCode["GPS_L2_L2CM"]; // GPS L2 SIGNAL STRENGTH line += std::string(1, ' '); line += observationType["SIGNAL_STRENGTH"]; line += observationCode["GPS_L2_L2CM"]; line += std::string(60-line.size(), ' '); line += Rinex_Printer::leftJustify("SYS / # / OBS TYPES", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Signal Strength units line.clear(); line += Rinex_Printer::leftJustify("DBHZ", 20); line += std::string(40, ' '); line += Rinex_Printer::leftJustify("SIGNAL STRENGTH UNIT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- TIME OF FIRST OBS line.clear(); boost::posix_time::ptime p_gps_time = Rinex_Printer::compute_GPS_time(eph,d_TOW_first_observation); std::string timestring = boost::posix_time::to_iso_string(p_gps_time); std::string year (timestring, 0, 4); std::string month (timestring, 4, 2); std::string day (timestring, 6, 2); std::string hour (timestring, 9, 2); std::string minutes (timestring, 11, 2); double gps_t = d_TOW_first_observation; double seconds = fmod(gps_t, 60); line += Rinex_Printer::rightJustify(year, 6); line += Rinex_Printer::rightJustify(month, 6); line += Rinex_Printer::rightJustify(day, 6); line += Rinex_Printer::rightJustify(hour, 6); line += Rinex_Printer::rightJustify(minutes, 6); line += Rinex_Printer::rightJustify(asString(seconds, 7), 13); line += Rinex_Printer::rightJustify(std::string("GPS"), 8); line += std::string(9, ' '); line += Rinex_Printer::leftJustify("TIME OF FIRST OBS", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- SYS /PHASE SHIFTS // -------- end of header line.clear(); line += std::string(60, ' '); line += Rinex_Printer::leftJustify("END OF HEADER", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; } void Rinex_Printer::rinex_obs_header(std::fstream& out, const Galileo_Ephemeris& eph, const double d_TOW_first_observation, const std::string bands) { std::string line; version = 3; // -------- Line 1 line = std::string(5, ' '); line += "3.02"; line += std::string(11, ' '); line += Rinex_Printer::leftJustify("OBSERVATION DATA", 20); line += satelliteSystem["Galileo"]; line += std::string(19, ' '); line += std::string("RINEX VERSION / TYPE"); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line 2 line.clear(); line += Rinex_Printer::leftJustify("G = GPS R = GLONASS E = GALILEO S = GEO M = MIXED", 60); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line 3 line.clear(); line += Rinex_Printer::getLocalTime(); line += std::string("PGM / RUN BY / DATE"); line += std::string(1, ' '); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT line.clear(); line += Rinex_Printer::leftJustify("GALILEO OBSERVATION DATA FILE GENERATED BY GNSS-SDR", 60); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT line.clear(); std::string gnss_sdr_version(GNSS_SDR_VERSION); line += "GNSS-SDR VERSION "; line += Rinex_Printer::leftJustify(gnss_sdr_version, 43); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT line.clear(); line += Rinex_Printer::leftJustify("See http://gnss-sdr.org", 60); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line MARKER NAME line.clear(); line += Rinex_Printer::leftJustify("DEFAULT MARKER NAME", 60); // put a flag or a property, line += Rinex_Printer::leftJustify("MARKER NAME", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line MARKER TYPE //line.clear(); //line += Rinex_Printer::leftJustify("NON_GEODETIC", 20); // put a flag or a property //line += std::string(40, ' '); //line += Rinex_Printer::leftJustify("MARKER TYPE", 20); //Rinex_Printer::lengthCheck(line); //out << line << std::endl; // -------- Line OBSERVER / AGENCY line.clear(); std::string username; char c_username[20] = {0}; int nGet = getlogin_r(c_username, sizeof(c_username) - 1); if (nGet == 0) { username = c_username; } else { username = "UNKNOWN USER"; } line += leftJustify(username, 20); line += Rinex_Printer::leftJustify("CTTC", 40); // add flag and property line += Rinex_Printer::leftJustify("OBSERVER / AGENCY", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line REC / TYPE VERS line.clear(); line += Rinex_Printer::leftJustify("GNSS-SDR", 20); // add flag and property line += Rinex_Printer::leftJustify("Software Receiver", 20); // add flag and property //line += Rinex_Printer::leftJustify(google::VersionString(), 20); // add flag and property if(gnss_sdr_version.length() > 20) gnss_sdr_version.resize(9, ' '); line += Rinex_Printer::leftJustify(gnss_sdr_version, 20); line += Rinex_Printer::leftJustify("REC # / TYPE / VERS", 20); lengthCheck(line); out << line << std::endl; // -------- ANTENNA TYPE line.clear(); line += Rinex_Printer::leftJustify("Antenna number", 20); // add flag and property line += Rinex_Printer::leftJustify("Antenna type", 20); // add flag and property line += std::string(20, ' '); line += Rinex_Printer::leftJustify("ANT # / TYPE", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- APPROX POSITION (optional for moving platforms) // put here real data! double antena_x = 0.0; double antena_y = 0.0; double antena_z = 0.0; line.clear(); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_x, 4), 14); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_y, 4), 14); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_z, 4), 14); line += std::string(18, ' '); line += Rinex_Printer::leftJustify("APPROX POSITION XYZ", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- ANTENNA: DELTA H/E/N // put here real data! double antena_h = 0.0; double antena_e = 0.0; double antena_n = 0.0; line.clear(); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_h, 4), 14); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_e, 4), 14); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_n, 4), 14); line += std::string(18, ' '); line += Rinex_Printer::leftJustify("ANTENNA: DELTA H/E/N", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- SYS / OBS TYPES // one line per available system unsigned int number_of_observations = 0; std::string signal_("1B"); std::size_t found_1B = bands.find(signal_); if(found_1B != std::string::npos) { number_of_observations = number_of_observations + 4; } signal_ = "5X"; std::size_t found_5X = bands.find(signal_); if(found_5X != std::string::npos) { number_of_observations = number_of_observations + 4; } line.clear(); signal_ = "7X"; std::size_t found_7X = bands.find(signal_); if(found_7X != std::string::npos) { number_of_observations = number_of_observations + 4; } line.clear(); line += satelliteSystem["Galileo"]; line += std::string(2, ' '); line += Rinex_Printer::rightJustify(std::to_string(number_of_observations), 3); if(found_1B != std::string::npos) { line += std::string(1, ' '); line += observationType["PSEUDORANGE"]; line += observationCode["GALILEO_E1_B"]; line += std::string(1, ' '); line += observationType["CARRIER_PHASE"]; line += observationCode["GALILEO_E1_B"]; line += std::string(1, ' '); line += observationType["DOPPLER"]; line += observationCode["GALILEO_E1_B"]; line += std::string(1, ' '); line += observationType["SIGNAL_STRENGTH"]; line += observationCode["GALILEO_E1_B"]; } if(found_5X != std::string::npos) { line += std::string(1, ' '); line += observationType["PSEUDORANGE"]; line += observationCode["GALILEO_E5a_IQ"]; line += std::string(1, ' '); line += observationType["CARRIER_PHASE"]; line += observationCode["GALILEO_E5a_IQ"]; line += std::string(1, ' '); line += observationType["DOPPLER"]; line += observationCode["GALILEO_E5a_IQ"]; line += std::string(1, ' '); line += observationType["SIGNAL_STRENGTH"]; line += observationCode["GALILEO_E5a_IQ"]; } if(found_7X != std::string::npos) { line += std::string(1, ' '); line += observationType["PSEUDORANGE"]; line += observationCode["GALILEO_E5b_IQ"]; line += std::string(1, ' '); line += observationType["CARRIER_PHASE"]; line += observationCode["GALILEO_E5b_IQ"]; line += std::string(1, ' '); line += observationType["DOPPLER"]; line += observationCode["GALILEO_E5b_IQ"]; line += std::string(1, ' '); line += observationType["SIGNAL_STRENGTH"]; line += observationCode["GALILEO_E5b_IQ"]; } line += std::string(60-line.size(), ' '); line += Rinex_Printer::leftJustify("SYS / # / OBS TYPES", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Signal Strength units line.clear(); line += Rinex_Printer::leftJustify("DBHZ", 20); line += std::string(40, ' '); line += Rinex_Printer::leftJustify("SIGNAL STRENGTH UNIT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- TIME OF FIRST OBS line.clear(); boost::posix_time::ptime p_galileo_time = Rinex_Printer::compute_Galileo_time(eph, d_TOW_first_observation); std::string timestring=boost::posix_time::to_iso_string(p_galileo_time); std::string year (timestring, 0, 4); std::string month (timestring, 4, 2); std::string day (timestring, 6, 2); std::string hour (timestring, 9, 2); std::string minutes (timestring, 11, 2); double galileo_t = d_TOW_first_observation; double seconds = fmod(galileo_t, 60); line += Rinex_Printer::rightJustify(year, 6); line += Rinex_Printer::rightJustify(month, 6); line += Rinex_Printer::rightJustify(day, 6); line += Rinex_Printer::rightJustify(hour, 6); line += Rinex_Printer::rightJustify(minutes, 6); line += Rinex_Printer::rightJustify(asString(seconds, 7), 13); line += Rinex_Printer::rightJustify(std::string("GAL"), 8); line += std::string(9, ' '); line += Rinex_Printer::leftJustify("TIME OF FIRST OBS", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- SYS /PHASE SHIFTS // -------- end of header line.clear(); line += std::string(60, ' '); line += Rinex_Printer::leftJustify("END OF HEADER", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; } void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& gps_eph, const Galileo_Ephemeris& galileo_eph, const double d_TOW_first_observation, const std::string galileo_bands) { if(galileo_eph.e_1){} // avoid warning, not needed std::string line; version = 3; // -------- Line 1 line = std::string(5, ' '); line += "3.02"; line += std::string(11, ' '); line += Rinex_Printer::leftJustify("OBSERVATION DATA", 20); line += satelliteSystem["Mixed"]; line += std::string(19, ' '); line += std::string("RINEX VERSION / TYPE"); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line 2 line.clear(); line += Rinex_Printer::leftJustify("G = GPS R = GLONASS E = GALILEO S = GEO M = MIXED", 60); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line 3 line.clear(); line += Rinex_Printer::getLocalTime(); line += std::string("PGM / RUN BY / DATE"); line += std::string(1, ' '); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT line.clear(); line += Rinex_Printer::leftJustify("MIXED (GPS/GALILEO) OBSERVATION DATA FILE GENERATED BY GNSS-SDR", 60); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT line.clear(); std::string gnss_sdr_version(GNSS_SDR_VERSION); line += "GNSS-SDR VERSION "; line += Rinex_Printer::leftJustify(gnss_sdr_version, 43); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line COMMENT line.clear(); line += Rinex_Printer::leftJustify("See http://gnss-sdr.org", 60); line += Rinex_Printer::leftJustify("COMMENT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line MARKER NAME line.clear(); line += Rinex_Printer::leftJustify("DEFAULT MARKER NAME", 60); // put a flag or a property, line += Rinex_Printer::leftJustify("MARKER NAME", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line MARKER TYPE //line.clear(); //line += Rinex_Printer::leftJustify("NON_GEODETIC", 20); // put a flag or a property //line += std::string(40, ' '); //line += Rinex_Printer::leftJustify("MARKER TYPE", 20); //Rinex_Printer::lengthCheck(line); //out << line << std::endl; // -------- Line OBSERVER / AGENCY line.clear(); std::string username; char c_username[20] = {0}; int nGet = getlogin_r(c_username, sizeof(c_username) - 1); if (nGet == 0) { username = c_username; } else { username = "UNKNOWN USER"; } line += leftJustify(username, 20); line += Rinex_Printer::leftJustify("CTTC", 40); // add flag and property line += Rinex_Printer::leftJustify("OBSERVER / AGENCY", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Line REC / TYPE VERS line.clear(); line += Rinex_Printer::leftJustify("GNSS-SDR", 20); // add flag and property line += Rinex_Printer::leftJustify("Software Receiver", 20); // add flag and property //line += Rinex_Printer::leftJustify(google::VersionString(), 20); // add flag and property if(gnss_sdr_version.length() > 20) gnss_sdr_version.resize(9, ' '); line += Rinex_Printer::leftJustify(gnss_sdr_version, 20); line += Rinex_Printer::leftJustify("REC # / TYPE / VERS", 20); lengthCheck(line); out << line << std::endl; // -------- ANTENNA TYPE line.clear(); line += Rinex_Printer::leftJustify("Antenna number", 20); // add flag and property line += Rinex_Printer::leftJustify("Antenna type", 20); // add flag and property line += std::string(20, ' '); line += Rinex_Printer::leftJustify("ANT # / TYPE", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- APPROX POSITION (optional for moving platforms) // put here real data! double antena_x = 0.0; double antena_y = 0.0; double antena_z = 0.0; line.clear(); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_x, 4), 14); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_y, 4), 14); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_z, 4), 14); line += std::string(18, ' '); line += Rinex_Printer::leftJustify("APPROX POSITION XYZ", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- ANTENNA: DELTA H/E/N // put here real data! double antena_h = 0.0; double antena_e = 0.0; double antena_n = 0.0; line.clear(); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_h, 4), 14); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_e, 4), 14); line += Rinex_Printer::rightJustify(Rinex_Printer::asString(antena_n, 4), 14); line += std::string(18, ' '); line += Rinex_Printer::leftJustify("ANTENNA: DELTA H/E/N", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- SYS / OBS TYPES // one line per available system line.clear(); line += satelliteSystem["GPS"]; line += std::string(2, ' '); std::stringstream strm; numberTypesObservations = 4; strm << numberTypesObservations; line += Rinex_Printer::rightJustify(strm.str(), 3); // per type of observation // GPS L1 PSEUDORANGE line += std::string(1, ' '); line += observationType["PSEUDORANGE"]; line += observationCode["GPS_L1_CA"]; // GPS L1 PHASE line += std::string(1, ' '); line += observationType["CARRIER_PHASE"]; line += observationCode["GPS_L1_CA"]; // GPS DOPPLER L1 line += std::string(1, ' '); line += observationType["DOPPLER"]; line += observationCode["GPS_L1_CA"]; // GPS L1 CA SIGNAL STRENGTH line += std::string(1, ' '); line += observationType["SIGNAL_STRENGTH"]; line += observationCode["GPS_L1_CA"]; line += std::string(60-line.size(), ' '); line += Rinex_Printer::leftJustify("SYS / # / OBS TYPES", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; line.clear(); unsigned int number_of_observations_gal = 0; std::string signal_("1B"); std::size_t found_1B = galileo_bands.find(signal_); if(found_1B != std::string::npos) { number_of_observations_gal = number_of_observations_gal + 4; } signal_ = "5X"; std::size_t found_5X = galileo_bands.find(signal_); if(found_5X != std::string::npos) { number_of_observations_gal = number_of_observations_gal + 4; } line.clear(); signal_ = "7X"; std::size_t found_7X = galileo_bands.find(signal_); if(found_7X != std::string::npos) { number_of_observations_gal = number_of_observations_gal + 4; } line += satelliteSystem["Galileo"]; line += std::string(2, ' '); line += Rinex_Printer::rightJustify(std::to_string(number_of_observations_gal), 3); if(found_1B != std::string::npos) { line += std::string(1, ' '); line += observationType["PSEUDORANGE"]; line += observationCode["GALILEO_E1_B"]; line += std::string(1, ' '); line += observationType["CARRIER_PHASE"]; line += observationCode["GALILEO_E1_B"]; line += std::string(1, ' '); line += observationType["DOPPLER"]; line += observationCode["GALILEO_E1_B"]; line += std::string(1, ' '); line += observationType["SIGNAL_STRENGTH"]; line += observationCode["GALILEO_E1_B"]; } if(found_5X != std::string::npos) { line += std::string(1, ' '); line += observationType["PSEUDORANGE"]; line += observationCode["GALILEO_E5a_IQ"]; line += std::string(1, ' '); line += observationType["CARRIER_PHASE"]; line += observationCode["GALILEO_E5a_IQ"]; line += std::string(1, ' '); line += observationType["DOPPLER"]; line += observationCode["GALILEO_E5a_IQ"]; line += std::string(1, ' '); line += observationType["SIGNAL_STRENGTH"]; line += observationCode["GALILEO_E5a_IQ"]; } if(found_7X != std::string::npos) { line += std::string(1, ' '); line += observationType["PSEUDORANGE"]; line += observationCode["GALILEO_E5b_IQ"]; line += std::string(1, ' '); line += observationType["CARRIER_PHASE"]; line += observationCode["GALILEO_E5b_IQ"]; line += std::string(1, ' '); line += observationType["DOPPLER"]; line += observationCode["GALILEO_E5b_IQ"]; line += std::string(1, ' '); line += observationType["SIGNAL_STRENGTH"]; line += observationCode["GALILEO_E5b_IQ"]; } line += std::string(60-line.size(), ' '); line += Rinex_Printer::leftJustify("SYS / # / OBS TYPES", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- Signal Strength units line.clear(); line += Rinex_Printer::leftJustify("DBHZ", 20); line += std::string(40, ' '); line += Rinex_Printer::leftJustify("SIGNAL STRENGTH UNIT", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- TIME OF FIRST OBS line.clear(); boost::posix_time::ptime p_gps_time = Rinex_Printer::compute_GPS_time(gps_eph, d_TOW_first_observation); std::string timestring=boost::posix_time::to_iso_string(p_gps_time); std::string year (timestring, 0, 4); std::string month (timestring, 4, 2); std::string day (timestring, 6, 2); std::string hour (timestring, 9, 2); std::string minutes (timestring, 11, 2); double gps_t = d_TOW_first_observation; double seconds = fmod(gps_t, 60); line += Rinex_Printer::rightJustify(year, 6); line += Rinex_Printer::rightJustify(month, 6); line += Rinex_Printer::rightJustify(day, 6); line += Rinex_Printer::rightJustify(hour, 6); line += Rinex_Printer::rightJustify(minutes, 6); line += Rinex_Printer::rightJustify(asString(seconds, 7), 13); line += Rinex_Printer::rightJustify(std::string("GPS"), 8); line += std::string(9, ' '); line += Rinex_Printer::leftJustify("TIME OF FIRST OBS", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; // -------- end of header line.clear(); line += std::string(60, ' '); line += Rinex_Printer::leftJustify("END OF HEADER", 20); Rinex_Printer::lengthCheck(line); out << line << std::endl; } void Rinex_Printer::update_obs_header(std::fstream& out, const Gps_Utc_Model& utc_model) { std::vector data; std::string line_aux; out.seekp(0); data.clear(); bool no_more_finds = false; std::string line_str; while(!out.eof()) { std::getline(out, line_str); if(!no_more_finds) { line_aux.clear(); if (version == 2) { if (line_str.find("TIME OF FIRST OBS", 59) != std::string::npos) // TIME OF FIRST OBS last header annotation might change in the future { data.push_back(line_str); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.d_DeltaT_LS), 6); line_aux += std::string(54, ' '); line_aux += Rinex_Printer::leftJustify("LEAP SECONDS", 20); data.push_back(line_aux); } else if (line_str.find("END OF HEADER", 59) != std::string::npos) { data.push_back(line_str); no_more_finds = true; } else { data.push_back(line_str); } } if (version == 3) { if (line_str.find("TIME OF FIRST OBS", 59) != std::string::npos) { data.push_back(line_str); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.d_DeltaT_LS), 6); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.d_DeltaT_LSF), 6); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.i_WN_LSF), 6); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.i_DN), 6); line_aux += std::string(36, ' '); line_aux += Rinex_Printer::leftJustify("LEAP SECONDS", 20); data.push_back(line_aux); } else if (line_str.find("END OF HEADER", 59) != std::string::npos) { data.push_back(line_str); no_more_finds = true; } else { data.push_back(line_str); } } } else { data.push_back(line_str); } } out.close(); out.open(obsfilename, std::ios::out | std::ios::trunc); out.seekp(0); for (int i = 0; i < (int) data.size() - 1; i++) { out << data[i] << std::endl; } out.close(); out.open(obsfilename, std::ios::out | std::ios::in | std::ios::app); out.seekp(0, std::ios_base::end); } void Rinex_Printer::update_obs_header(std::fstream& out, const Gps_CNAV_Utc_Model& utc_model) { std::vector data; std::string line_aux; out.seekp(0); data.clear(); bool no_more_finds = false; std::string line_str; while(!out.eof()) { std::getline(out, line_str); if(!no_more_finds) { line_aux.clear(); if (line_str.find("TIME OF FIRST OBS", 59) != std::string::npos) { data.push_back(line_str); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.d_DeltaT_LS), 6); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.d_DeltaT_LSF), 6); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.i_WN_LSF), 6); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(utc_model.i_DN), 6); line_aux += std::string(36, ' '); line_aux += Rinex_Printer::leftJustify("LEAP SECONDS", 20); data.push_back(line_aux); } else if (line_str.find("END OF HEADER", 59) != std::string::npos) { data.push_back(line_str); no_more_finds = true; } else { data.push_back(line_str); } } else { data.push_back(line_str); } } out.close(); out.open(obsfilename, std::ios::out | std::ios::trunc); out.seekp(0); for (int i = 0; i < (int) data.size() - 1; i++) { out << data[i] << std::endl; } out.close(); out.open(obsfilename, std::ios::out | std::ios::in | std::ios::app); out.seekp(0, std::ios_base::end); } void Rinex_Printer::update_obs_header(std::fstream& out, const Galileo_Utc_Model& galileo_utc_model) { std::vector data; std::string line_aux; out.seekp(0); data.clear(); bool no_more_finds = false; std::string line_str; while(!out.eof()) { std::getline(out, line_str); if(!no_more_finds) { line_aux.clear(); if (line_str.find("TIME OF FIRST OBS", 59) != std::string::npos) { data.push_back(line_str); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(galileo_utc_model.Delta_tLS_6), 6); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(galileo_utc_model.Delta_tLSF_6), 6); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(galileo_utc_model.WN_LSF_6), 6); line_aux += Rinex_Printer::rightJustify(boost::lexical_cast(galileo_utc_model.DN_6), 6); line_aux += std::string(36, ' '); line_aux += Rinex_Printer::leftJustify("LEAP SECONDS", 20); data.push_back(line_aux); } else if (line_str.find("END OF HEADER", 59) != std::string::npos) { data.push_back(line_str); no_more_finds = true; } else { data.push_back(line_str); } } else { data.push_back(line_str); } } out.close(); out.open(obsfilename, std::ios::out | std::ios::trunc); out.seekp(0); for (int i = 0; i < (int) data.size() - 1; i++) { out << data[i] << std::endl; } out.close(); out.open(obsfilename, std::ios::out | std::ios::in |std::ios::app); out.seekp(0, std::ios_base::end); } void Rinex_Printer::log_rinex_obs(std::fstream& out, const Gps_Ephemeris& eph, const double obs_time, const std::map& observables) { // RINEX observations timestamps are GPS timestamps. std::string line; boost::posix_time::ptime p_gps_time = Rinex_Printer::compute_GPS_time(eph, obs_time); std::string timestring = boost::posix_time::to_iso_string(p_gps_time); //double utc_t = nav_msg.utc_time(nav_msg.sv_clock_correction(obs_time)); //double gps_t = eph.sv_clock_correction(obs_time); double gps_t = obs_time; std::string month (timestring, 4, 2); std::string day (timestring, 6, 2); std::string hour (timestring, 9, 2); std::string minutes (timestring, 11, 2); if (version == 2) { line.clear(); std::string year (timestring, 2, 2); line += std::string(1, ' '); line += year; line += std::string(1, ' '); if (month.compare(0, 1 , "0") == 0) { line += std::string(1, ' '); line += month.substr(1, 1); } else { line += month; } line += std::string(1, ' '); if (day.compare(0, 1 , "0") == 0) { line += std::string(1, ' '); line += day.substr(1, 1); } else { line += day; } line += std::string(1, ' '); line += hour; line += std::string(1, ' '); line += minutes; line += std::string(1, ' '); double second_ = fmod(gps_t, 60); if (second_ < 10) { line += std::string(1, ' '); } line += Rinex_Printer::asString(second_, 7); line += std::string(2, ' '); // Epoch flag 0: OK 1: power failure between previous and current epoch <1: Special event line += std::string(1, '0'); //Number of satellites observed in current epoch int numSatellitesObserved = 0; std::map::const_iterator observables_iter; for(observables_iter = observables.begin(); observables_iter != observables.end(); observables_iter++) { numSatellitesObserved++; } line += Rinex_Printer::rightJustify(boost::lexical_cast(numSatellitesObserved), 3); for(observables_iter = observables.begin(); observables_iter != observables.end(); observables_iter++) { line += satelliteSystem["GPS"]; if (static_cast(observables_iter->second.PRN) < 10) line += std::string(1, '0'); line += boost::lexical_cast(static_cast(observables_iter->second.PRN)); } // Receiver clock offset (optional) //line += rightJustify(asString(clockOffset, 12), 15); line += std::string(80 - line.size(), ' '); Rinex_Printer::lengthCheck(line); out << line << std::endl; for(observables_iter = observables.begin(); observables_iter != observables.end(); observables_iter++) { std::string lineObs; lineObs.clear(); line.clear(); // GPS L1 PSEUDORANGE line += std::string(2, ' '); lineObs += Rinex_Printer::rightJustify(asString(observables_iter->second.Pseudorange_m, 3), 14); //Loss of lock indicator (LLI) int lli = 0; // Include in the observation!! if (lli == 0) { lineObs += std::string(1, ' '); } else { lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(lli), 1); } // Signal Strength Indicator (SSI) int ssi = Rinex_Printer::signalStrength(observables_iter->second.CN0_dB_hz); lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(ssi), 1); // GPS L1 CA PHASE lineObs += Rinex_Printer::rightJustify(asString(observables_iter->second.Carrier_phase_rads/GPS_TWO_PI, 3), 14); if (lli == 0) { lineObs += std::string(1, ' '); } else { lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(lli), 1); } lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(ssi), 1); // GPS L1 CA DOPPLER lineObs += Rinex_Printer::rightJustify(asString(observables_iter->second.Carrier_Doppler_hz, 3), 14); if (lli == 0) { lineObs += std::string(1, ' '); } else { lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(lli), 1); } lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(ssi), 1); //GPS L1 SIGNAL STRENGTH lineObs += Rinex_Printer::rightJustify(asString(observables_iter->second.CN0_dB_hz, 3), 14); if (lineObs.size() < 80) lineObs += std::string(80 - lineObs.size(), ' '); out << lineObs << std::endl; } } if (version == 3) { std::string year (timestring, 0, 4); line += std::string(1, '>'); line += std::string(1, ' '); line += year; line += std::string(1, ' '); line += month; line += std::string(1, ' '); line += day; line += std::string(1, ' '); line += hour; line += std::string(1, ' '); line += minutes; line += std::string(1, ' '); double seconds = fmod(gps_t, 60); // Add extra 0 if seconds are < 10 if (seconds < 10) { line += std::string(1, '0'); } line += Rinex_Printer::asString(seconds, 7); line += std::string(2, ' '); // Epoch flag 0: OK 1: power failure between previous and current epoch <1: Special event line += std::string(1, '0'); //Number of satellites observed in current epoch int numSatellitesObserved = 0; std::map::const_iterator observables_iter; for(observables_iter = observables.begin(); observables_iter != observables.end(); observables_iter++) { numSatellitesObserved++; } line += Rinex_Printer::rightJustify(boost::lexical_cast(numSatellitesObserved), 3); // Receiver clock offset (optional) //line += rightJustify(asString(clockOffset, 12), 15); line += std::string(80 - line.size(), ' '); Rinex_Printer::lengthCheck(line); out << line << std::endl; for(observables_iter = observables.begin(); observables_iter != observables.end(); observables_iter++) { std::string lineObs; lineObs.clear(); lineObs += satelliteSystem["GPS"]; if (static_cast(observables_iter->second.PRN) < 10) lineObs += std::string(1, '0'); lineObs += boost::lexical_cast(static_cast(observables_iter->second.PRN)); //lineObs += std::string(2, ' '); lineObs += Rinex_Printer::rightJustify(asString(observables_iter->second.Pseudorange_m, 3), 14); //Loss of lock indicator (LLI) int lli = 0; // Include in the observation!! if (lli == 0) { lineObs += std::string(1, ' '); } else { lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(lli), 1); } // Signal Strength Indicator (SSI) int ssi = Rinex_Printer::signalStrength(observables_iter->second.CN0_dB_hz); lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(ssi), 1); // GPS L1 CA PHASE lineObs += Rinex_Printer::rightJustify(asString(observables_iter->second.Carrier_phase_rads/GPS_TWO_PI, 3), 14); if (lli == 0) { lineObs += std::string(1, ' '); } else { lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(lli), 1); } lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(ssi), 1); // GPS L1 CA DOPPLER lineObs += Rinex_Printer::rightJustify(asString(observables_iter->second.Carrier_Doppler_hz, 3), 14); if (lli == 0) { lineObs += std::string(1, ' '); } else { lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(lli), 1); } lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(ssi), 1); //GPS L1 SIGNAL STRENGTH lineObs += Rinex_Printer::rightJustify(asString(observables_iter->second.CN0_dB_hz, 3), 14); if (lineObs.size() < 80) lineObs += std::string(80 - lineObs.size(), ' '); out << lineObs << std::endl; } } } void Rinex_Printer::log_rinex_obs(std::fstream & out, const Gps_CNAV_Ephemeris & eph, double obs_time, const std::map & observables) { // RINEX observations timestamps are GPS timestamps. std::string line; boost::posix_time::ptime p_gps_time = Rinex_Printer::compute_GPS_time(eph, obs_time); std::string timestring = boost::posix_time::to_iso_string(p_gps_time); //double utc_t = nav_msg.utc_time(nav_msg.sv_clock_correction(obs_time)); //double gps_t = eph.sv_clock_correction(obs_time); double gps_t = obs_time; std::string month (timestring, 4, 2); std::string day (timestring, 6, 2); std::string hour (timestring, 9, 2); std::string minutes (timestring, 11, 2); std::string year (timestring, 0, 4); line += std::string(1, '>'); line += std::string(1, ' '); line += year; line += std::string(1, ' '); line += month; line += std::string(1, ' '); line += day; line += std::string(1, ' '); line += hour; line += std::string(1, ' '); line += minutes; line += std::string(1, ' '); double seconds = fmod(gps_t, 60); // Add extra 0 if seconds are < 10 if (seconds < 10) { line += std::string(1, '0'); } line += Rinex_Printer::asString(seconds, 7); line += std::string(2, ' '); // Epoch flag 0: OK 1: power failure between previous and current epoch <1: Special event line += std::string(1, '0'); //Number of satellites observed in current epoch int numSatellitesObserved = 0; std::map::const_iterator observables_iter; for(observables_iter = observables.begin(); observables_iter != observables.end(); observables_iter++) { numSatellitesObserved++; } line += Rinex_Printer::rightJustify(boost::lexical_cast(numSatellitesObserved), 3); // Receiver clock offset (optional) //line += rightJustify(asString(clockOffset, 12), 15); line += std::string(80 - line.size(), ' '); Rinex_Printer::lengthCheck(line); out << line << std::endl; for(observables_iter = observables.begin(); observables_iter != observables.end(); observables_iter++) { std::string lineObs; lineObs.clear(); lineObs += satelliteSystem["GPS"]; if (static_cast(observables_iter->second.PRN) < 10) lineObs += std::string(1, '0'); lineObs += boost::lexical_cast(static_cast(observables_iter->second.PRN)); //lineObs += std::string(2, ' '); //GPS L2 PSEUDORANGE lineObs += Rinex_Printer::rightJustify(asString(observables_iter->second.Pseudorange_m, 3), 14); //Loss of lock indicator (LLI) int lli = 0; // Include in the observation!! if (lli == 0) { lineObs += std::string(1, ' '); } else { lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(lli), 1); } // Signal Strength Indicator (SSI) int ssi = Rinex_Printer::signalStrength(observables_iter->second.CN0_dB_hz); lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(ssi), 1); // GPS L2 PHASE lineObs += Rinex_Printer::rightJustify(asString(observables_iter->second.Carrier_phase_rads/GPS_TWO_PI, 3), 14); if (lli == 0) { lineObs += std::string(1, ' '); } else { lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(lli), 1); } lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(ssi), 1); // GPS L2 DOPPLER lineObs += Rinex_Printer::rightJustify(asString(observables_iter->second.Carrier_Doppler_hz, 3), 14); if (lli == 0) { lineObs += std::string(1, ' '); } else { lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(lli), 1); } lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(ssi), 1); //GPS L2 SIGNAL STRENGTH lineObs += Rinex_Printer::rightJustify(asString(observables_iter->second.CN0_dB_hz, 3), 14); if (lineObs.size() < 80) lineObs += std::string(80 - lineObs.size(), ' '); out << lineObs << std::endl; } } void Rinex_Printer::log_rinex_obs(std::fstream & out, const Gps_Ephemeris & eph, const Gps_CNAV_Ephemeris & eph_cnav, double obs_time, const std::map & observables) { if(eph_cnav.d_i_0){} // avoid warning, not needed // RINEX observations timestamps are GPS timestamps. std::string line; boost::posix_time::ptime p_gps_time = Rinex_Printer::compute_GPS_time(eph, obs_time); std::string timestring = boost::posix_time::to_iso_string(p_gps_time); //double utc_t = nav_msg.utc_time(nav_msg.sv_clock_correction(obs_time)); //double gps_t = eph.sv_clock_correction(obs_time); double gps_t = obs_time; std::string month (timestring, 4, 2); std::string day (timestring, 6, 2); std::string hour (timestring, 9, 2); std::string minutes (timestring, 11, 2); std::string year (timestring, 0, 4); line += std::string(1, '>'); line += std::string(1, ' '); line += year; line += std::string(1, ' '); line += month; line += std::string(1, ' '); line += day; line += std::string(1, ' '); line += hour; line += std::string(1, ' '); line += minutes; line += std::string(1, ' '); double seconds = fmod(gps_t, 60); // Add extra 0 if seconds are < 10 if (seconds < 10) { line += std::string(1, '0'); } line += Rinex_Printer::asString(seconds, 7); line += std::string(2, ' '); // Epoch flag 0: OK 1: power failure between previous and current epoch <1: Special event line += std::string(1, '0'); //Number of satellites observed in current epoch //Get maps with GPS L1 and L2 observations std::map observablesL1; std::map observablesL2; std::map::const_iterator observables_iter; std::map::const_iterator observables_iter2; std::multimap total_mmap; std::multimap::iterator mmap_iter; for(observables_iter = observables.begin(); observables_iter != observables.end(); observables_iter++) { std::string system_(&observables_iter->second.System, 1); std::string sig_(observables_iter->second.Signal); if((system_.compare("G") == 0) && (sig_.compare("1C") == 0)) { observablesL1.insert(std::pair(observables_iter->first, observables_iter->second)); total_mmap.insert(std::pair(observables_iter->second.PRN, observables_iter->second)); } if((system_.compare("G") == 0) && (sig_.compare("2S") == 0)) { observablesL2.insert(std::pair(observables_iter->first, observables_iter->second)); mmap_iter = total_mmap.find(observables_iter->second.PRN); if(mmap_iter == total_mmap.end()) { Gnss_Synchro gs = Gnss_Synchro(); total_mmap.insert(std::pair(observables_iter->second.PRN, gs)); } total_mmap.insert(std::pair(observables_iter->second.PRN, observables_iter->second)); } } // Fill with zeros satellites with L1 obs but not L2 std::multimap mmap_aux; mmap_aux = total_mmap; for(mmap_iter = mmap_aux.begin(); mmap_iter != mmap_aux.end(); mmap_iter++) { if((total_mmap.count(mmap_iter->second.PRN)) == 1 && (mmap_iter->second.PRN != 0)) { Gnss_Synchro gs = Gnss_Synchro(); std::string sys = "G"; gs.System = *sys.c_str(); std::string sig = "2S"; std::memcpy((void*)gs.Signal, sig.c_str(), 3); gs.PRN = mmap_iter->second.PRN; total_mmap.insert(std::pair(mmap_iter->second.PRN, gs)); } } std::set available_prns; std::set::iterator it; for(observables_iter = observablesL1.begin(); observables_iter != observablesL1.end(); observables_iter++) { unsigned int prn_ = observables_iter->second.PRN; it = available_prns.find(prn_); if(it == available_prns.end()) { available_prns.insert(prn_); } } for(observables_iter = observablesL2.begin(); observables_iter != observablesL2.end(); observables_iter++) { unsigned int prn_ = observables_iter->second.PRN; it = available_prns.find(prn_); if(it == available_prns.end()) { available_prns.insert(prn_); } } int numSatellitesObserved = available_prns.size(); line += Rinex_Printer::rightJustify(boost::lexical_cast(numSatellitesObserved), 3); // Receiver clock offset (optional) //line += rightJustify(asString(clockOffset, 12), 15); line += std::string(80 - line.size(), ' '); Rinex_Printer::lengthCheck(line); out << line << std::endl; std::string lineObs; std::pair ::iterator, std::multimap::iterator> ret; for(it = available_prns.begin(); it != available_prns.end(); it++) { lineObs.clear(); lineObs += satelliteSystem["GPS"]; if (static_cast(*it) < 10) lineObs += std::string(1, '0'); lineObs += boost::lexical_cast(static_cast(*it)); ret = total_mmap.equal_range(*it); for (std::multimap::iterator iter = ret.first; iter != ret.second; ++iter) { lineObs += Rinex_Printer::rightJustify(asString(iter->second.Pseudorange_m, 3), 14); //Loss of lock indicator (LLI) int lli = 0; // Include in the observation!! if (lli == 0) { lineObs += std::string(1, ' '); } else { lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(lli), 1); } // Signal Strength Indicator (SSI) int ssi = Rinex_Printer::signalStrength(iter->second.CN0_dB_hz); lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(ssi), 1); // GPS CARRIER PHASE lineObs += Rinex_Printer::rightJustify(asString(iter->second.Carrier_phase_rads / (GALILEO_TWO_PI), 3), 14); if (lli == 0) { lineObs += std::string(1, ' '); } else { lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(lli), 1); } lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(ssi), 1); // GPS DOPPLER lineObs += Rinex_Printer::rightJustify(asString(iter->second.Carrier_Doppler_hz, 3), 14); if (lli == 0) { lineObs += std::string(1, ' '); } else { lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(lli), 1); } lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(ssi), 1); // GPS SIGNAL STRENGTH lineObs += Rinex_Printer::rightJustify(asString(iter->second.CN0_dB_hz, 3), 14); } if (lineObs.size() < 80) lineObs += std::string(80 - lineObs.size(), ' '); out << lineObs << std::endl; } } void Rinex_Printer::log_rinex_obs(std::fstream& out, const Galileo_Ephemeris& eph, double obs_time, const std::map& observables, const std::string galileo_bands) { // RINEX observations timestamps are Galileo timestamps. // See http://gage14.upc.es/gLAB/HTML/Observation_Rinex_v3.01.html std::string line; boost::posix_time::ptime p_galileo_time = Rinex_Printer::compute_Galileo_time(eph, obs_time); std::string timestring = boost::posix_time::to_iso_string(p_galileo_time); //double utc_t = nav_msg.utc_time(nav_msg.sv_clock_correction(obs_time)); //double gps_t = eph.sv_clock_correction(obs_time); double galileo_t = obs_time; std::string month (timestring, 4, 2); std::string day (timestring, 6, 2); std::string hour (timestring, 9, 2); std::string minutes (timestring, 11, 2); std::string year (timestring, 0, 4); line += std::string(1, '>'); line += std::string(1, ' '); line += year; line += std::string(1, ' '); line += month; line += std::string(1, ' '); line += day; line += std::string(1, ' '); line += hour; line += std::string(1, ' '); line += minutes; line += std::string(1, ' '); double seconds = fmod(galileo_t, 60); // Add extra 0 if seconds are < 10 if (seconds < 10) { line += std::string(1, '0'); } line += Rinex_Printer::asString(seconds, 7); line += std::string(2, ' '); // Epoch flag 0: OK 1: power failure between previous and current epoch <1: Special event line += std::string(1, '0'); //Number of satellites observed in current epoch //Get maps with Galileo observations std::map observablesE1B; std::map observablesE5A; std::map observablesE5B; std::map::const_iterator observables_iter; for(observables_iter = observables.begin(); observables_iter != observables.end(); observables_iter++) { std::string system_(&observables_iter->second.System, 1); std::string sig_(observables_iter->second.Signal); if((system_.compare("E") == 0) && (sig_.compare("1B") == 0)) { observablesE1B.insert(std::pair(observables_iter->first, observables_iter->second)); } if((system_.compare("E") == 0) && (sig_.compare("5X") == 0)) { observablesE5A.insert(std::pair(observables_iter->first, observables_iter->second)); } if((system_.compare("E") == 0) && (sig_.compare("7X") == 0)) { observablesE5B.insert(std::pair(observables_iter->first, observables_iter->second)); } } std::size_t found_1B = galileo_bands.find("1B"); std::size_t found_E5a = galileo_bands.find("5X"); std::size_t found_E5b = galileo_bands.find("7X"); std::multimap total_map; std::set available_prns; std::set::iterator it; if(found_1B != std::string::npos) { for(observables_iter = observablesE1B.begin(); observables_iter != observablesE1B.end(); observables_iter++) { unsigned int prn_ = observables_iter->second.PRN; total_map.insert(std::pair(prn_, observables_iter->second)); it = available_prns.find(prn_); if(it == available_prns.end()) { available_prns.insert(prn_); } } } if(found_E5a != std::string::npos) { for(observables_iter = observablesE5A.begin(); observables_iter != observablesE5A.end(); observables_iter++) { unsigned int prn_ = observables_iter->second.PRN; it = available_prns.find(prn_); if(it == available_prns.end()) { available_prns.insert(prn_); if(found_1B != std::string::npos) { Gnss_Synchro gs = Gnss_Synchro(); std::string sys = "E"; gs.System = *sys.c_str(); std::string sig = "1B"; std::memcpy((void*)gs.Signal, sig.c_str(), 3); gs.PRN = prn_; total_map.insert(std::pair(prn_, gs)); } } total_map.insert(std::pair(prn_, observables_iter->second)); } } if(found_E5b != std::string::npos) { for(observables_iter = observablesE5B.begin(); observables_iter != observablesE5B.end(); observables_iter++) { unsigned int prn_ = observables_iter->second.PRN; it = available_prns.find(prn_); if(it == available_prns.end()) { available_prns.insert(prn_); if(found_1B != std::string::npos) { Gnss_Synchro gs = Gnss_Synchro(); std::string sys = "E"; gs.System = *sys.c_str(); std::string sig = "1B"; std::memcpy((void*)gs.Signal, sig.c_str(), 3); gs.PRN = prn_; total_map.insert(std::pair(prn_, gs)); } if(found_E5a != std::string::npos) { Gnss_Synchro gs = Gnss_Synchro(); std::string sys = "E"; gs.System = *sys.c_str(); std::string sig = "5X"; std::memcpy((void*)gs.Signal, sig.c_str(), 3); gs.PRN = prn_; total_map.insert(std::pair(prn_, gs)); } } else { // if 5X is listed but empty if(found_E5a != std::string::npos) { if( (total_map.count(prn_)) == 1) { Gnss_Synchro gs = Gnss_Synchro(); std::string sys = "E"; gs.System = *sys.c_str(); std::string sig = "5X"; std::memcpy((void*)gs.Signal, sig.c_str(), 3); gs.PRN = prn_; total_map.insert(std::pair(prn_, gs)); } } } total_map.insert(std::pair(prn_, observables_iter->second)); } } int numSatellitesObserved = available_prns.size(); line += Rinex_Printer::rightJustify(boost::lexical_cast(numSatellitesObserved), 3); // Receiver clock offset (optional) //line += rightJustify(asString(clockOffset, 12), 15); line += std::string(80 - line.size(), ' '); Rinex_Printer::lengthCheck(line); out << line << std::endl; std::string lineObs; std::pair ::iterator, std::multimap::iterator> ret; for(it = available_prns.begin(); it != available_prns.end(); it++) { lineObs.clear(); lineObs += satelliteSystem["Galileo"]; if (static_cast(*it) < 10) lineObs += std::string(1, '0'); lineObs += boost::lexical_cast(static_cast(*it)); ret = total_map.equal_range(*it); for (std::multimap::iterator iter = ret.first; iter != ret.second; ++iter) { lineObs += Rinex_Printer::rightJustify(asString(iter->second.Pseudorange_m, 3), 14); //Loss of lock indicator (LLI) int lli = 0; // Include in the observation!! if (lli == 0) { lineObs += std::string(1, ' '); } else { lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(lli), 1); } // Signal Strength Indicator (SSI) int ssi = Rinex_Printer::signalStrength(iter->second.CN0_dB_hz); lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(ssi), 1); // Galileo CARRIER PHASE lineObs += Rinex_Printer::rightJustify(asString(iter->second.Carrier_phase_rads / (GALILEO_TWO_PI), 3), 14); if (lli == 0) { lineObs += std::string(1, ' '); } else { lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(lli), 1); } lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(ssi), 1); // Galileo DOPPLER lineObs += Rinex_Printer::rightJustify(asString(iter->second.Carrier_Doppler_hz, 3), 14); if (lli == 0) { lineObs += std::string(1, ' '); } else { lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(lli), 1); } lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(ssi), 1); // Galileo SIGNAL STRENGTH lineObs += Rinex_Printer::rightJustify(asString(iter->second.CN0_dB_hz, 3), 14); } if (lineObs.size() < 80) lineObs += std::string(80 - lineObs.size(), ' '); out << lineObs << std::endl; } } void Rinex_Printer::log_rinex_obs(std::fstream& out, const Gps_Ephemeris& gps_eph, const Galileo_Ephemeris& galileo_eph, double gps_obs_time, const std::map& observables) { if(galileo_eph.e_1){} // avoid warning, not needed std::string line; boost::posix_time::ptime p_gps_time = Rinex_Printer::compute_GPS_time(gps_eph, gps_obs_time); std::string timestring = boost::posix_time::to_iso_string(p_gps_time); //double utc_t = nav_msg.utc_time(nav_msg.sv_clock_correction(obs_time)); //double gps_t = eph.sv_clock_correction(obs_time); double gps_t = gps_obs_time; std::string month (timestring, 4, 2); std::string day (timestring, 6, 2); std::string hour (timestring, 9, 2); std::string minutes (timestring, 11, 2); std::string year (timestring, 0, 4); line += std::string(1, '>'); line += std::string(1, ' '); line += year; line += std::string(1, ' '); line += month; line += std::string(1, ' '); line += day; line += std::string(1, ' '); line += hour; line += std::string(1, ' '); line += minutes; line += std::string(1, ' '); double seconds = fmod(gps_t, 60); // Add extra 0 if seconds are < 10 if (seconds < 10) { line +=std::string(1, '0'); } line += Rinex_Printer::asString(seconds, 7); line += std::string(2, ' '); // Epoch flag 0: OK 1: power failure between previous and current epoch <1: Special event line += std::string(1, '0'); //Number of satellites observed in current epoch //Get maps with observations std::map observablesG1C; std::map observablesE1B; std::map observablesE5A; std::map observablesE5B; std::map::const_iterator observables_iter; for(observables_iter = observables.begin(); observables_iter != observables.end(); observables_iter++) { std::string system_(&observables_iter->second.System, 1); std::string sig_(observables_iter->second.Signal); if((system_.compare("E") == 0) && (sig_.compare("1B") == 0)) { observablesE1B.insert(std::pair(observables_iter->first, observables_iter->second)); } if((system_.compare("E") == 0) && (sig_.compare("5X") == 0)) { observablesE5A.insert(std::pair(observables_iter->first, observables_iter->second)); } if((system_.compare("E") == 0) && (sig_.compare("7X") == 0)) { observablesE5B.insert(std::pair(observables_iter->first, observables_iter->second)); } if((system_.compare("G") == 0) && (sig_.compare("1C") == 0)) { observablesG1C.insert(std::pair(observables_iter->first, observables_iter->second)); } } std::multimap total_gal_map; std::set available_gal_prns; std::set::iterator it; for(observables_iter = observablesE1B.begin(); observables_iter != observablesE1B.end(); observables_iter++) { unsigned int prn_ = observables_iter->second.PRN; total_gal_map.insert(std::pair(prn_, observables_iter->second)); it = available_gal_prns.find(prn_); if(it == available_gal_prns.end()) { available_gal_prns.insert(prn_); } } for(observables_iter = observablesE5A.begin(); observables_iter != observablesE5A.end(); observables_iter++) { unsigned int prn_ = observables_iter->second.PRN; total_gal_map.insert(std::pair(prn_, observables_iter->second)); it = available_gal_prns.find(prn_); if(it == available_gal_prns.end()) { available_gal_prns.insert(prn_); } } for(observables_iter = observablesE5B.begin(); observables_iter != observablesE5B.end(); observables_iter++) { unsigned int prn_ = observables_iter->second.PRN; total_gal_map.insert(std::pair(prn_, observables_iter->second)); it = available_gal_prns.find(prn_); if(it == available_gal_prns.end()) { available_gal_prns.insert(prn_); } } int numGalSatellitesObserved = available_gal_prns.size(); int numGpsSatellitesObserved = observablesG1C.size(); int numSatellitesObserved = numGalSatellitesObserved + numGpsSatellitesObserved; line += Rinex_Printer::rightJustify(boost::lexical_cast(numSatellitesObserved), 3); // Receiver clock offset (optional) //line += rightJustify(asString(clockOffset, 12), 15); line += std::string(80 - line.size(), ' '); Rinex_Printer::lengthCheck(line); out << line << std::endl; std::string s; std::string lineObs; for(observables_iter = observablesG1C.begin(); observables_iter != observablesG1C.end(); observables_iter++) { lineObs.clear(); s.assign(1, observables_iter->second.System); if(s.compare("G") == 0) lineObs += satelliteSystem["GPS"]; if(s.compare("E") == 0) lineObs += satelliteSystem["Galileo"]; // should not happen if (static_cast(observables_iter->second.PRN) < 10) lineObs += std::string(1, '0'); lineObs += boost::lexical_cast(static_cast(observables_iter->second.PRN)); lineObs += Rinex_Printer::rightJustify(asString(observables_iter->second.Pseudorange_m, 3), 14); //Loss of lock indicator (LLI) int lli = 0; // Include in the observation!! if (lli == 0) { lineObs += std::string(1, ' '); } else { lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(lli), 1); } // Signal Strength Indicator (SSI) int ssi = Rinex_Printer::signalStrength(observables_iter->second.CN0_dB_hz); lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(ssi), 1); // PHASE lineObs += Rinex_Printer::rightJustify(asString(observables_iter->second.Carrier_phase_rads/GPS_TWO_PI, 3), 14); if (lli == 0) { lineObs += std::string(1, ' '); } else { lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(lli), 1); } lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(ssi), 1); // DOPPLER lineObs += Rinex_Printer::rightJustify(asString(observables_iter->second.Carrier_Doppler_hz, 3), 14); if (lli == 0) { lineObs += std::string(1, ' '); } else { lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(lli), 1); } lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(ssi), 1); // SIGNAL STRENGTH lineObs += Rinex_Printer::rightJustify(asString(observables_iter->second.CN0_dB_hz, 3), 14); if (lineObs.size() < 80) lineObs += std::string(80 - lineObs.size(), ' '); out << lineObs << std::endl; } std::pair ::iterator, std::multimap::iterator> ret; for(it = available_gal_prns.begin(); it != available_gal_prns.end(); it++) { lineObs.clear(); lineObs += satelliteSystem["Galileo"]; if (static_cast(*it) < 10) lineObs += std::string(1, '0'); lineObs += boost::lexical_cast(static_cast(*it)); ret = total_gal_map.equal_range(*it); for (std::multimap::iterator iter = ret.first; iter != ret.second; ++iter) { lineObs += Rinex_Printer::rightJustify(asString(iter->second.Pseudorange_m, 3), 14); //Loss of lock indicator (LLI) int lli = 0; // Include in the observation!! if (lli == 0) { lineObs += std::string(1, ' '); } else { lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(lli), 1); } // Signal Strength Indicator (SSI) int ssi = Rinex_Printer::signalStrength(iter->second.CN0_dB_hz); lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(ssi), 1); // Galileo CARRIER PHASE lineObs += Rinex_Printer::rightJustify(asString(iter->second.Carrier_phase_rads / (GALILEO_TWO_PI), 3), 14); if (lli == 0) { lineObs += std::string(1, ' '); } else { lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(lli), 1); } lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(ssi), 1); // Galileo DOPPLER lineObs += Rinex_Printer::rightJustify(asString(iter->second.Carrier_Doppler_hz, 3), 14); if (lli == 0) { lineObs += std::string(1, ' '); } else { lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(lli), 1); } lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString(ssi), 1); // Galileo SIGNAL STRENGTH lineObs += Rinex_Printer::rightJustify(asString(iter->second.CN0_dB_hz, 3), 14); } if (lineObs.size() < 80) lineObs += std::string(80 - lineObs.size(), ' '); out << lineObs << std::endl; } } void Rinex_Printer::to_date_time(int gps_week, int gps_tow, int &year, int &month, int &day, int &hour, int &minute, int &second) { // represents GPS time (week, TOW) in the date time format of the Gregorian calendar. // -> Leap years are considered, but leap seconds are not. int days_per_month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // seconds in a not leap year const int secs_per_day = 24*60*60; const int secs_per_week = 7*secs_per_day; const int secs_per_normal_year = 365*secs_per_day; const int secs_per_leap_year = secs_per_normal_year + secs_per_day; // the GPS epoch is 06.01.1980 00:00, i.e. midnight 5. / 6. January 1980 // -> seconds since then int secs_since_gps_epoch = gps_week*secs_per_week + gps_tow; // find year, consider leap years bool is_leap_year; int remaining_secs = secs_since_gps_epoch + 5*secs_per_day; for (int y = 1980; true ; y++) { is_leap_year = y%4 == 0 && (y%100 != 0 || y%400 == 0); int secs_in_year_y = is_leap_year ? secs_per_leap_year : secs_per_normal_year; if (secs_in_year_y <= remaining_secs) { remaining_secs -= secs_in_year_y; } else { year = y; //std::cout << "year: year=" << year << " secs_in_year_y="<< secs_in_year_y << " remaining_secs="<< remaining_secs << std::endl; break; } //std::cout << "year: y=" << y << " secs_in_year_y="<< secs_in_year_y << " remaining_secs="<< remaining_secs << std::endl; } // find month for (int m = 1; true ; m++) { int secs_in_month_m = days_per_month[m-1]*secs_per_day; if (is_leap_year && m == 2 ) // consider February of leap year { secs_in_month_m += secs_per_day; } if (secs_in_month_m <= remaining_secs) { remaining_secs -= secs_in_month_m; } else { month = m; //std::cout << "month: month=" << month << " secs_in_month_m="<< secs_in_month_m << " remaining_secs="<< remaining_secs << std::endl; break; } //std::cout << "month: m=" << m << " secs_in_month_m="<< secs_in_month_m << " remaining_secs="<< remaining_secs << std::endl; } day = remaining_secs/secs_per_day+1; remaining_secs = remaining_secs%secs_per_day; hour = remaining_secs/(60*60); remaining_secs = remaining_secs%(60*60); minute = remaining_secs/60; second = remaining_secs%60; } void Rinex_Printer::log_rinex_sbs(std::fstream& out, const Sbas_Raw_Msg& sbs_message) { // line 1: PRN / EPOCH / RCVR std::stringstream line1; // SBAS PRN line1 << sbs_message.get_prn(); line1 << " "; // gps time of reception int gps_week; double gps_sec; if(sbs_message.get_rx_time_obj().get_gps_time(gps_week, gps_sec)) { int year; int month; int day; int hour; int minute; int second; double gps_sec_one_digit_precicion = round(gps_sec *10)/10; // to prevent rounding towards 60.0sec in the stream output int gps_tow = trunc(gps_sec_one_digit_precicion); double sub_sec = gps_sec_one_digit_precicion - double(gps_tow); to_date_time(gps_week, gps_tow, year, month, day, hour, minute, second); line1 << asFixWidthString(year, 2, '0') << " " << asFixWidthString(month, 2, '0') << " " << asFixWidthString(day, 2, '0') << " " << asFixWidthString(hour, 2, '0') << " " << asFixWidthString(minute, 2, '0') << " " << rightJustify(asString(double(second)+sub_sec,1),4,' '); } else { line1 << std::string(19, ' '); } line1 << " "; // band line1 << "L1"; line1 << " "; // Length of data message (bytes) line1 << asFixWidthString(sbs_message.get_msg().size(), 3, ' '); line1 << " "; // File-internal receiver index line1 << " 0"; line1 << " "; // Transmission System Identifier line1 << "SBA"; line1 << std::string(35, ' '); lengthCheck(line1.str()); out << line1.str() << std::endl; // DATA RECORD - 1 std::stringstream line2; line2 << " "; // Message frame identifier if (sbs_message.get_msg_type() < 10) line2 << " "; line2 << sbs_message.get_msg_type(); line2 << std::string(4, ' '); // First 18 bytes of message (hex) std::vector msg = sbs_message.get_msg(); for (size_t i = 0; i < 18 && i < msg.size(); ++i) { line2 << std::hex << std::setfill('0') << std::setw(2); line2 << int(msg[i]) << " "; } line2 << std::string(19, ' '); lengthCheck(line2.str()); out << line2.str() << std::endl; // DATA RECORD - 2 std::stringstream line3; line3 << std::string(7, ' '); // Remaining bytes of message (hex) for (size_t i = 18; i < 36 && i < msg.size(); ++i) { line3 << std::hex << std::setfill('0') << std::setw(2); line3 << int(msg[i]) << " "; } line3 << std::string(31, ' '); lengthCheck(line3.str()); out << line3.str() << std::endl; } int Rinex_Printer::signalStrength(const double snr) { int ss; ss = int ( std::min( std::max( int (floor(snr/6)) , 1), 9) ); return ss; } boost::posix_time::ptime Rinex_Printer::compute_UTC_time(const Gps_Navigation_Message& nav_msg) { // if we are processing a file -> wait to leap second to resolve the ambiguity else take the week from the local system time //: idea resolve the ambiguity with the leap second http://www.colorado.edu/geography/gcraft/notes/gps/gpseow.htm const double utc_t = nav_msg.utc_time(nav_msg.d_TOW); boost::posix_time::time_duration t = boost::posix_time::millisec((utc_t + 604800 * static_cast(nav_msg.i_GPS_week)) * 1000); boost::posix_time::ptime p_time(boost::gregorian::date(1999, 8, 22), t); return p_time; } boost::posix_time::ptime Rinex_Printer::compute_GPS_time(const Gps_Ephemeris& eph, const double obs_time) { // The RINEX v2.11 v3.00 format uses GPS time for the observations epoch, not UTC time, thus, no leap seconds needed here. // (see Section 3 in http://igscb.jpl.nasa.gov/igscb/data/format/rinex211.txt) // (see Pag. 17 in http://igscb.jpl.nasa.gov/igscb/data/format/rinex300.pdf) // --??? No time correction here, since it will be done in the RINEX processor const double gps_t = obs_time; boost::posix_time::time_duration t = boost::posix_time::millisec((gps_t + 604800 * static_cast(eph.i_GPS_week % 1024)) * 1000); boost::posix_time::ptime p_time(boost::gregorian::date(1999, 8, 22), t); return p_time; } boost::posix_time::ptime Rinex_Printer::compute_GPS_time(const Gps_CNAV_Ephemeris & eph, const double obs_time) { // The RINEX v2.11 v3.00 format uses GPS time for the observations epoch, not UTC time, thus, no leap seconds needed here. // (see Section 3 in http://igscb.jpl.nasa.gov/igscb/data/format/rinex211.txt) // (see Pag. 17 in http://igscb.jpl.nasa.gov/igscb/data/format/rinex300.pdf) // --??? No time correction here, since it will be done in the RINEX processor const double gps_t = obs_time; boost::posix_time::time_duration t = boost::posix_time::millisec((gps_t + 604800 * static_cast(eph.i_GPS_week % 1024)) * 1000); boost::posix_time::ptime p_time(boost::gregorian::date(1999, 8, 22), t); return p_time; } boost::posix_time::ptime Rinex_Printer::compute_Galileo_time(const Galileo_Ephemeris& eph, const double obs_time) { // The RINEX v2.11 v3.00 format uses Galileo time for the observations epoch, not UTC time, thus, no leap seconds needed here. // (see Pag. 17 in http://igscb.jpl.nasa.gov/igscb/data/format/rinex301.pdf) // --??? No time correction here, since it will be done in the RINEX processor double galileo_t = obs_time; boost::posix_time::time_duration t = boost::posix_time::millisec((galileo_t + 604800 * static_cast(eph.WN_5)) * 1000); // boost::posix_time::ptime p_time(boost::gregorian::date(1999, 8, 22), t); return p_time; } /* enum RINEX_enumMarkerType { GEODETIC, //!< GEODETIC Earth-fixed, high-precision monumentation NON_GEODETIC, //!< NON_GEODETIC Earth-fixed, low-precision monumentation SPACEBORNE, //!< SPACEBORNE Orbiting space vehicle AIRBORNE , //!< AIRBORNE Aircraft, balloon, etc. WATER_CRAFT, //!< WATER_CRAFT Mobile water craft GROUND_CRAFT, //!< GROUND_CRAFT Mobile terrestrial vehicle FIXED_BUOY, //!< FIXED_BUOY "Fixed" on water surface FLOATING_BUOY, //!< FLOATING_BUOY Floating on water surface FLOATING_ICE, //!< FLOATING_ICE Floating ice sheet, etc. GLACIER, //!< GLACIER "Fixed" on a glacier BALLISTIC, //!< BALLISTIC Rockets, shells, etc ANIMAL, //!< ANIMAL Animal carrying a receiver HUMAN //!< HUMAN Human being }; */ gnss-sdr-0.0.9/src/algorithms/PVT/libs/rinex_printer.h000066400000000000000000000613011305042567700226750ustar00rootroot00000000000000/*! * \file rinex_printer.h * \brief Interface of a RINEX 2.11 / 3.01 printer * See http://igscb.jpl.nasa.gov/igscb/data/format/rinex301.pdf * * Receiver Independent EXchange Format (RINEX): * The first proposal for the Receiver Independent Exchange Format RINEX * was developed by the Astronomical Institute of the University of Berne * for the easy exchange of the GPS data to be collected during the large * European GPS campaign EUREF 89, which involved more than 60 GPS receivers * of 4 different manufacturers. * The governing aspect during the development was the fact that most geodetic * processing software for GPS data use a well-defined set of observables: * 1) The carrier-phase measurement at one or both carriers (actually being a * measurement on the beat frequency between the received carrier of the * satellite signal and a receiver-generated reference frequency). * 2) The pseudorange (code) measurement , equivalent to the difference * of the time of reception (expressed in the time frame of the receiver) * and the time of transmission (expressed in the time frame of the satellite) * of a distinct satellite signal. * 3) The observation time being the reading of the receiver clock at the * instant of validity of the carrier-phase and/or the code measurements. * Note: A collection of the formats currently used by the IGS can be found * here: http://igscb.jpl.nasa.gov/components/formats.html * \author Carles Fernandez Prades, 2011. cfernandez(at)cttc.es * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_RINEX_PRINTER_H_ #define GNSS_SDR_RINEX_PRINTER_H_ #include #include #include #include // for stringstream #include // for setprecision #include #include #include "gps_navigation_message.h" #include "gps_cnav_navigation_message.h" #include "galileo_navigation_message.h" #include "sbas_telemetry_data.h" #include "GPS_L1_CA.h" #include "Galileo_E1.h" #include "gnss_synchro.h" class Sbas_Raw_Msg; /*! * \brief Class that handles the generation of Receiver * INdependent EXchange format (RINEX) files */ class Rinex_Printer { public: /*! * \brief Default constructor. Creates GPS Navigation and Observables RINEX files and their headers */ Rinex_Printer(int version = 0); /*! * \brief Default destructor. Closes GPS Navigation and Observables RINEX files */ ~Rinex_Printer(); std::fstream obsFile ; // & eph_map); /*! * \brief Writes data from the GPS L2 navigation message into the RINEX file */ void log_rinex_nav(std::fstream & out, const std::map & eph_map); /*! * \brief Writes data from the Galileo navigation message into the RINEX file */ void log_rinex_nav(std::fstream & out, const std::map & eph_map); /*! * \brief Writes data from the Mixed (GPS/Galileo) navigation message into the RINEX file */ void log_rinex_nav(std::fstream & out, const std::map & gps_eph_map, const std::map & galileo_eph_map); /*! * \brief Writes GPS L1 observables into the RINEX file */ void log_rinex_obs(std::fstream & out, const Gps_Ephemeris & eph, double obs_time, const std::map & observables); /*! * \brief Writes GPS L2 observables into the RINEX file */ void log_rinex_obs(std::fstream & out, const Gps_CNAV_Ephemeris & eph, double obs_time, const std::map & observables); /*! * \brief Writes dual frequency GPS L1 and L2 observables into the RINEX file */ void log_rinex_obs(std::fstream & out, const Gps_Ephemeris & eph, const Gps_CNAV_Ephemeris & eph_cnav, double obs_time, const std::map & observables); /*! * \brief Writes Galileo observables into the RINEX file. Example: galileo_bands("1B"), galileo_bands("1B 5X"), galileo_bands("5X"), ... Default: "1B". */ void log_rinex_obs(std::fstream & out, const Galileo_Ephemeris & eph, double obs_time, const std::map & observables, const std::string galileo_bands = "1B"); /*! * \brief Writes Mixed GPS / Galileo observables into the RINEX file */ void log_rinex_obs(std::fstream & out, const Gps_Ephemeris & gps_eph, const Galileo_Ephemeris & galileo_eph, const double gps_obs_time, const std::map & observables); /*! * \brief Represents GPS time in the date time format. Leap years are considered, but leap seconds are not. */ void to_date_time(int gps_week, int gps_tow, int & year, int & month, int & day, int & hour, int & minute, int & second); /*! * \brief Writes raw SBAS messages into the RINEX file */ void log_rinex_sbs(std::fstream & out, const Sbas_Raw_Msg & sbs_message); void update_nav_header(std::fstream & out, const Gps_Utc_Model & gps_utc, const Gps_Iono & gps_iono); void update_nav_header(std::fstream & out, const Gps_CNAV_Utc_Model & utc_model, const Gps_CNAV_Iono & iono); void update_nav_header(std::fstream & out, const Gps_Iono & gps_iono, const Gps_Utc_Model & gps_utc_model, const Galileo_Iono & galileo_iono, const Galileo_Utc_Model & galileo_utc_model, const Galileo_Almanac& galileo_almanac); void update_nav_header(std::fstream & out, const Galileo_Iono & galileo_iono, const Galileo_Utc_Model & utc_model, const Galileo_Almanac & galileo_almanac); void update_obs_header(std::fstream & out, const Gps_Utc_Model & utc_model); void update_obs_header(std::fstream & out, const Gps_CNAV_Utc_Model & utc_model); void update_obs_header(std::fstream & out, const Galileo_Utc_Model & galileo_utc_model); std::map satelliteSystem; // observationType; // observationCode; // 0.87654E-0004 or -0.1234E00005. */ inline std::string & sci2for(std::string & aStr, const std::string::size_type startPos = 0, const std::string::size_type length = std::string::npos, const std::string::size_type expLen = 3, const bool checkSwitch = true); /* * Convert double precision floating point to a string * containing the number in FORTRAN notation. * As an example, the number 156360 becomes ".15636D6". * @param d number to convert. * @param length length (in characters) of number, including exponent. * @param expLen length (in characters of exponent, including sign. * @param checkSwitch if true, keeps the exponential sanity check for * exponentials above three characters in length. If false, it removes * that check. * @return a string containing \a d in FORTRAN notation. */ inline std::string doub2for(const double & d, const std::string::size_type length, const std::string::size_type expLen, const bool checkSwitch = true); /* * Convert a string to a double precision floating point number. * @param s string containing a number. * @return double representation of string. */ inline double asDouble(const std::string & s) { return strtod(s.c_str(), 0); } inline int toInt(std::string bitString, int sLength); /* * Convert a string to an integer. * @param s string containing a number. * @return long integer representation of string. */ inline long asInt(const std::string & s) { return strtol(s.c_str(), 0, 10); } /* * Convert a double to a string in fixed notation. * @param x double. * @param precision the number of decimal places you want displayed. * @return string representation of \a x. */ inline std::string asString(const double x, const std::string::size_type precision = 17); /* * Convert a long double to a string in fixed notation. * @param x long double. * @param precision the number of decimal places you want displayed. * @return string representation of \a x. */ inline std::string asString(const long double x, const std::string::size_type precision = 21); /* * Convert any old object to a string. * The class must have stream operators defined. * @param x object to turn into a string. * @return string representation of \a x. */ template inline std::string asString(const X x); inline std::string asFixWidthString(const int x, const int width, char fill_digit); }; // Implementation of inline functions (modified versions from GPSTk http://www.gpstk.org) inline std::string & Rinex_Printer::leftJustify(std::string & s, const std::string::size_type length, const char pad) { if(length < s.length()) { s = s.substr(0, length); } else { s.append(length-s.length(), pad); } return s; } // if the string is bigger than length, truncate it from the left. // otherwise, add pad characters to its left. inline std::string & Rinex_Printer::rightJustify(std::string & s, const std::string::size_type length, const char pad) { if(length < s.length()) { s = s.substr(s.length()-length, std::string::npos); } else { s.insert((std::string::size_type)0, length-s.length(), pad); } return s; } inline std::string Rinex_Printer::doub2for(const double & d, const std::string::size_type length, const std::string::size_type expLen, const bool checkSwitch) { short exponentLength = expLen; /* Validate the assumptions regarding the input arguments */ if (exponentLength < 0) exponentLength = 1; if (exponentLength > 3 && checkSwitch) exponentLength = 3; std::string toReturn = doub2sci(d, length, exponentLength, true, checkSwitch); sci2for(toReturn, 0, length, exponentLength, checkSwitch); return toReturn; } inline std::string Rinex_Printer::doub2sci(const double & d, const std::string::size_type length, const std::string::size_type expLen, const bool showSign, const bool checkSwitch) { std::string toReturn; short exponentLength = expLen; /* Validate the assumptions regarding the input arguments */ if (exponentLength < 0) exponentLength = 1; if (exponentLength > 3 && checkSwitch) exponentLength = 3; std::stringstream c; c.setf(std::ios::scientific, std::ios::floatfield); // length - 3 for special characters ('.', 'e', '+' or '-') // - exponentlength (e04) // - 1 for the digit before the decimal (2.) // and if showSign == true, // an extra -1 for '-' or ' ' if it's positive or negative int expSize = 0; if (showSign) expSize = 1; c.precision(length - 3 - exponentLength - 1 - expSize); c << d; c >> toReturn; return toReturn; } inline std::string & Rinex_Printer::sci2for(std::string & aStr, const std::string::size_type startPos, const std::string::size_type length, const std::string::size_type expLen, const bool checkSwitch) { std::string::size_type idx = aStr.find('.', startPos); int expAdd = 0; std::string exp; long iexp; //If checkSwitch is false, always redo the exponential. Otherwise, //set it to false. bool redoexp =! checkSwitch; // Check for decimal place within specified boundaries if ((idx <= 0) || (idx >= (startPos + length - expLen - 1))) { // Error: no decimal point in string return aStr; } // Here, account for the possibility that there are // no numbers to the left of the decimal, but do not // account for the possibility of non-scientific // notation (more than one digit to the left of the // decimal) if (idx > startPos) { redoexp = true; // Swap digit and decimal. aStr[idx] = aStr[idx - 1]; aStr[idx - 1] = '.'; // Only add one to the exponent if the number is non-zero if (asDouble(aStr.substr(startPos, length)) != 0.0) expAdd = 1; } idx = aStr.find('e', startPos); if (idx == std::string::npos) { idx = aStr.find('E', startPos); if (idx == std::string::npos) { // Error: no 'e' or 'E' in string"; } } // Change the exponent character to D normally, or E of checkSwitch is false. if (checkSwitch) aStr[idx] = 'D'; else aStr[idx] = 'E'; // Change the exponent itself if (redoexp) { exp = aStr.substr(idx + 1, std::string::npos); iexp = asInt(exp); iexp += expAdd; aStr.erase(idx + 1); if (iexp < 0) { aStr += "-"; iexp -= iexp*2; } else aStr += "+"; aStr += Rinex_Printer::rightJustify(asString(iexp),expLen,'0'); } // if the number is positive, append a space // (if it's negative, there's a leading '-' if (aStr[0] == '.') { aStr.insert((std::string::size_type)0, 1, ' '); } //If checkSwitch is false, add on one leading zero to the string if (!checkSwitch) { aStr.insert((std::string::size_type)1, 1, '0'); } return aStr; } // end sci2for inline std::string asString(const long double x, const std::string::size_type precision) { std::ostringstream ss; ss << std::fixed << std::setprecision(precision) << x ; return ss.str(); } inline std::string Rinex_Printer::asString(const double x, const std::string::size_type precision) { std::ostringstream ss; ss << std::fixed << std::setprecision(precision) << x; return ss.str(); } inline std::string Rinex_Printer::asFixWidthString(const int x, const int width, char fill_digit) { std::ostringstream ss; ss << std::setfill(fill_digit) << std::setw(width) << x; return ss.str().substr(ss.str().size() - width); } inline long asInt(const std::string & s) { return strtol(s.c_str(), 0, 10); } inline int Rinex_Printer::toInt(std::string bitString, int sLength) { int tempInt; int num = 0; for(int i = 0; i < sLength; i++) { tempInt = bitString[i]-'0'; num |= (1 << (sLength - 1 - i)) * tempInt; } return num; } template inline std::string Rinex_Printer::asString(const X x) { std::ostringstream ss; ss << x; return ss.str(); } #endif gnss-sdr-0.0.9/src/algorithms/PVT/libs/rtcm_printer.cc000066400000000000000000000257131305042567700226620ustar00rootroot00000000000000/*! * \file rtcm_printer.cc * \brief Implementation of a RTCM 3.2 printer for GNSS-SDR * This class provides a implementation of a subset of the RTCM Standard 10403.2 * for Differential GNSS Services * * \author Carles Fernandez-Prades, 2014. cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "rtcm_printer.h" #include #include #include #include // for O_RDWR #include // for tcgetattr #include #include using google::LogMessage; Rtcm_Printer::Rtcm_Printer(std::string filename, bool flag_rtcm_server, bool flag_rtcm_tty_port, unsigned short rtcm_tcp_port, unsigned short rtcm_station_id, std::string rtcm_dump_devname, bool time_tag_name) { time_t rawtime; struct tm * timeinfo; time ( &rawtime ); timeinfo = localtime ( &rawtime ); if (time_tag_name) { std::stringstream strm0; const int year = timeinfo->tm_year - 100; strm0 << year; const int month = timeinfo->tm_mon + 1; if(month < 10) { strm0 << "0"; } strm0 << month; const int day = timeinfo->tm_mday; if(day < 10) { strm0 << "0"; } strm0 << day << "_"; const int hour = timeinfo->tm_hour; if(hour < 10) { strm0 << "0"; } strm0 << hour; const int min = timeinfo->tm_min; if(min < 10) { strm0 << "0"; } strm0 << min; const int sec = timeinfo->tm_sec; if(sec < 10) { strm0 << "0"; } strm0 << sec; rtcm_filename = filename + "_" + strm0.str() + ".rtcm"; } else { rtcm_filename = filename + ".rtcm"; } rtcm_file_descriptor.open(rtcm_filename.c_str(), std::ios::out); if (rtcm_file_descriptor.is_open()) { DLOG(INFO) << "RTCM printer writing on " << rtcm_filename.c_str(); } rtcm_devname = rtcm_dump_devname; if (flag_rtcm_tty_port == true) { rtcm_dev_descriptor = init_serial(rtcm_devname.c_str()); if (rtcm_dev_descriptor != -1) { DLOG(INFO) << "RTCM printer writing on " << rtcm_devname.c_str(); } } else { rtcm_dev_descriptor = -1; } port = rtcm_tcp_port; station_id = rtcm_station_id; rtcm = std::make_shared(port); if(flag_rtcm_server) { rtcm->run_server(); } } Rtcm_Printer::~Rtcm_Printer() { if(rtcm->is_server_running()) { try { rtcm->stop_server(); } catch( boost::exception & e ) { LOG(WARNING) << "Boost exception: " << boost::diagnostic_information(e); } catch(std::exception const& ex) { LOG(WARNING) << "STD exception: " << ex.what(); } } if (rtcm_file_descriptor.is_open()) { long pos; pos = rtcm_file_descriptor.tellp(); rtcm_file_descriptor.close(); if (pos == 0) { if(remove(rtcm_filename.c_str()) != 0) LOG(INFO) << "Error deleting temporary RTCM file"; } } close_serial(); } bool Rtcm_Printer::Print_Rtcm_MT1001(const Gps_Ephemeris& gps_eph, double obs_time, const std::map & observables) { std::string m1001 = rtcm->print_MT1001(gps_eph, obs_time, observables, station_id); Rtcm_Printer::Print_Message(m1001); return true; } bool Rtcm_Printer::Print_Rtcm_MT1002(const Gps_Ephemeris& gps_eph, double obs_time, const std::map & observables) { std::string m1002 = rtcm->print_MT1002(gps_eph, obs_time, observables, station_id); Rtcm_Printer::Print_Message(m1002); return true; } bool Rtcm_Printer::Print_Rtcm_MT1003(const Gps_Ephemeris& gps_eph, const Gps_CNAV_Ephemeris& cnav_eph, double obs_time, const std::map & observables) { std::string m1003 = rtcm->print_MT1003(gps_eph, cnav_eph, obs_time, observables, station_id); Rtcm_Printer::Print_Message(m1003); return true; } bool Rtcm_Printer::Print_Rtcm_MT1004(const Gps_Ephemeris& gps_eph, const Gps_CNAV_Ephemeris& cnav_eph, double obs_time, const std::map & observables) { std::string m1003 = rtcm->print_MT1004(gps_eph, cnav_eph, obs_time, observables, station_id); Rtcm_Printer::Print_Message(m1003); return true; } bool Rtcm_Printer::Print_Rtcm_MT1019(const Gps_Ephemeris & gps_eph) { std::string m1019 = rtcm->print_MT1019(gps_eph); Rtcm_Printer::Print_Message(m1019); return true; } bool Rtcm_Printer::Print_Rtcm_MT1045(const Galileo_Ephemeris & gal_eph) { std::string m1045 = rtcm->print_MT1045(gal_eph); Rtcm_Printer::Print_Message(m1045); return true; } bool Rtcm_Printer::Print_Rtcm_MSM(unsigned int msm_number, const Gps_Ephemeris & gps_eph, const Gps_CNAV_Ephemeris & gps_cnav_eph, const Galileo_Ephemeris & gal_eph, double obs_time, const std::map & observables, unsigned int clock_steering_indicator, unsigned int external_clock_indicator, int smooth_int, bool divergence_free, bool more_messages) { std::string msm; if(msm_number == 1) { msm = rtcm->print_MSM_1(gps_eph, gps_cnav_eph, gal_eph, obs_time, observables, station_id, clock_steering_indicator, external_clock_indicator, smooth_int, divergence_free, more_messages); } else if(msm_number == 2) { msm = rtcm->print_MSM_2(gps_eph, gps_cnav_eph, gal_eph, obs_time, observables, station_id, clock_steering_indicator, external_clock_indicator, smooth_int, divergence_free, more_messages); } else if(msm_number == 3) { msm = rtcm->print_MSM_3(gps_eph, gps_cnav_eph, gal_eph, obs_time, observables, station_id, clock_steering_indicator, external_clock_indicator, smooth_int, divergence_free, more_messages); } else if(msm_number == 4) { msm = rtcm->print_MSM_4(gps_eph, gps_cnav_eph, gal_eph, obs_time, observables, station_id, clock_steering_indicator, external_clock_indicator, smooth_int, divergence_free, more_messages); } else if(msm_number == 5) { msm = rtcm->print_MSM_5(gps_eph, gps_cnav_eph, gal_eph, obs_time, observables, station_id, clock_steering_indicator, external_clock_indicator, smooth_int, divergence_free, more_messages); } else if(msm_number == 6) { msm = rtcm->print_MSM_6(gps_eph, gps_cnav_eph, gal_eph, obs_time, observables, station_id, clock_steering_indicator, external_clock_indicator, smooth_int, divergence_free, more_messages); } else if(msm_number == 7) { msm = rtcm->print_MSM_7(gps_eph, gps_cnav_eph, gal_eph, obs_time, observables, station_id, clock_steering_indicator, external_clock_indicator, smooth_int, divergence_free, more_messages); } else { return false; } Rtcm_Printer::Print_Message(msm); return true; } int Rtcm_Printer::init_serial(std::string serial_device) { /* * Opens the serial device and sets the default baud rate for a RTCM transmission (9600,8,N,1) */ int fd = 0; struct termios options; long BAUD; long DATABITS; long STOPBITS; long PARITYON; long PARITY; fd = open(serial_device.c_str(), O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1) return fd; // failed to open TTY port if(fcntl(fd, F_SETFL, 0) == -1) LOG(INFO) << "Error enabling direct I/O"; // clear all flags on descriptor, enable direct I/O tcgetattr(fd, &options); // read serial port options BAUD = B9600; //BAUD = B38400; DATABITS = CS8; STOPBITS = 0; PARITYON = 0; PARITY = 0; options.c_cflag = BAUD | DATABITS | STOPBITS | PARITYON | PARITY | CLOCAL | CREAD; // enable receiver, set 8 bit data, ignore control lines //options.c_cflag |= (CLOCAL | CREAD | CS8); options.c_iflag = IGNPAR; // set the new port options tcsetattr(fd, TCSANOW, &options); return fd; } void Rtcm_Printer::close_serial() { if (rtcm_dev_descriptor != -1) { close(rtcm_dev_descriptor); } } bool Rtcm_Printer::Print_Message(const std::string & message) { //write to file try { rtcm_file_descriptor << message << std::endl; } catch(std::exception ex) { DLOG(INFO) << "RTCM printer can not write on output file" << rtcm_filename.c_str(); return false; } //write to serial device if (rtcm_dev_descriptor != -1) { if(write(rtcm_dev_descriptor, message.c_str(), message.length()) == -1) { DLOG(INFO) << "RTCM printer cannot write on serial device" << rtcm_devname.c_str(); std::cout << "RTCM printer cannot write on serial device" << rtcm_devname.c_str() << std::endl; return false; } } return true; } std::string Rtcm_Printer::print_MT1005_test() { std::string test = rtcm->print_MT1005_test(); return test; } unsigned int Rtcm_Printer::lock_time(const Gps_Ephemeris& eph, double obs_time, const Gnss_Synchro & gnss_synchro) { return rtcm->lock_time(eph, obs_time, gnss_synchro); } unsigned int Rtcm_Printer::lock_time(const Gps_CNAV_Ephemeris& eph, double obs_time, const Gnss_Synchro & gnss_synchro) { return rtcm->lock_time(eph, obs_time, gnss_synchro); } unsigned int Rtcm_Printer::lock_time(const Galileo_Ephemeris& eph, double obs_time, const Gnss_Synchro & gnss_synchro) { return rtcm->lock_time(eph, obs_time, gnss_synchro); } gnss-sdr-0.0.9/src/algorithms/PVT/libs/rtcm_printer.h000066400000000000000000000101161305042567700225130ustar00rootroot00000000000000/*! * \file rtcm_printer.h * \brief Interface of a RTCM 3.2 printer for GNSS-SDR * This class provides a implementation of a subset of the RTCM Standard 10403.2 * for Differential GNSS Services * * \author Carles Fernandez-Prades, 2014. cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_RTCM_PRINTER_H_ #define GNSS_SDR_RTCM_PRINTER_H_ #include // std::ofstream #include // std::cout #include // std::shared_ptr #include "rtcm.h" /*! * \brief This class provides a implementation of a subset of the RTCM Standard 10403.2 messages */ class Rtcm_Printer { public: /*! * \brief Default constructor. */ Rtcm_Printer(std::string filename, bool flag_rtcm_server, bool flag_rtcm_tty_port, unsigned short rtcm_tcp_port, unsigned short rtcm_station_id, std::string rtcm_dump_filename, bool time_tag_name = true); /*! * \brief Default destructor. */ ~Rtcm_Printer(); bool Print_Rtcm_MT1001(const Gps_Ephemeris& gps_eph, double obs_time, const std::map & observables); bool Print_Rtcm_MT1002(const Gps_Ephemeris& gps_eph, double obs_time, const std::map & observables); bool Print_Rtcm_MT1003(const Gps_Ephemeris& gps_eph, const Gps_CNAV_Ephemeris& cnav_eph, double obs_time, const std::map & observables); bool Print_Rtcm_MT1004(const Gps_Ephemeris& gps_eph, const Gps_CNAV_Ephemeris& cnav_eph, double obs_time, const std::map & observables); bool Print_Rtcm_MT1019(const Gps_Ephemeris & gps_eph); // & observables, unsigned int clock_steering_indicator, unsigned int external_clock_indicator, int smooth_int, bool divergence_free, bool more_messages); std::string print_MT1005_test(); // rtcm; bool Print_Message(const std::string & message); }; #endif gnss-sdr-0.0.9/src/algorithms/acquisition/000077500000000000000000000000001305042567700205615ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/acquisition/CMakeLists.txt000066400000000000000000000014341305042567700233230ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # add_subdirectory(adapters) add_subdirectory(gnuradio_blocks) gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/000077500000000000000000000000001305042567700223645ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/CMakeLists.txt000066400000000000000000000044071305042567700251310ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # set(ACQ_ADAPTER_SOURCES gps_l1_ca_pcps_acquisition.cc gps_l1_ca_pcps_multithread_acquisition.cc gps_l1_ca_pcps_assisted_acquisition.cc gps_l1_ca_pcps_acquisition_fine_doppler.cc gps_l1_ca_pcps_tong_acquisition.cc gps_l1_ca_pcps_quicksync_acquisition.cc gps_l2_m_pcps_acquisition.cc galileo_e1_pcps_ambiguous_acquisition.cc galileo_e1_pcps_cccwsr_ambiguous_acquisition.cc galileo_e1_pcps_quicksync_ambiguous_acquisition.cc galileo_e1_pcps_tong_ambiguous_acquisition.cc galileo_e1_pcps_8ms_ambiguous_acquisition.cc galileo_e5a_noncoherent_iq_acquisition_caf.cc ) if(OPENCL_FOUND) set(ACQ_ADAPTER_SOURCES ${ACQ_ADAPTER_SOURCES} gps_l1_ca_pcps_opencl_acquisition.cc) endif(OPENCL_FOUND) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/interfaces ${CMAKE_SOURCE_DIR}/src/core/receiver ${CMAKE_SOURCE_DIR}/src/algorithms/acquisition/gnuradio_blocks ${CMAKE_SOURCE_DIR}/src/algorithms/libs ${Boost_INCLUDE_DIRS} ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ${GNURADIO_BLOCKS_INCLUDE_DIRS} ${VOLK_GNSSSDR_INCLUDE_DIRS} ) file(GLOB ACQ_ADAPTER_HEADERS "*.h") list(SORT ACQ_ADAPTER_HEADERS) add_library(acq_adapters ${ACQ_ADAPTER_SOURCES} ${ACQ_ADAPTER_HEADERS}) source_group(Headers FILES ${ACQ_ADAPTER_HEADERS}) target_link_libraries(acq_adapters gnss_sp_libs acq_gr_blocks ${Boost_LIBRARIES} ${GNURADIO_RUNTIME_LIBRARIES} ${GNURADIO_BLOCKS_LIBRARIES}) gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/galileo_e1_pcps_8ms_ambiguous_acquisition.cc000066400000000000000000000207001305042567700331720ustar00rootroot00000000000000/*! * \file galileo_e1_pcps_8ms_ambiguous_acquisition.cc * \brief Adapts a Galileo PCPS 8ms acquisition block to an * AcquisitionInterface for Galileo E1 Signals * \author Marc Molina, 2013. marc.molina.pena(at)gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_e1_pcps_8ms_ambiguous_acquisition.h" #include #include #include #include "galileo_e1_signal_processing.h" #include "Galileo_E1.h" #include "configuration_interface.h" using google::LogMessage; GalileoE1Pcps8msAmbiguousAcquisition::GalileoE1Pcps8msAmbiguousAcquisition( ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { configuration_ = configuration; std::string default_item_type = "gr_complex"; std::string default_dump_filename = "../data/acquisition.dat"; DLOG(INFO) << "role " << role; item_type_ = configuration_->property(role + ".item_type", default_item_type); fs_in_ = configuration_->property("GNSS-SDR.internal_fs_hz", 4000000); if_ = configuration_->property(role + ".if", 0); dump_ = configuration_->property(role + ".dump", false); doppler_max_ = configuration_->property(role + ".doppler_max", 5000); sampled_ms_ = configuration_->property(role + ".coherent_integration_time_ms", 4); if (sampled_ms_ % 4 != 0) { sampled_ms_ = (int)(sampled_ms_/4) * 4; LOG(WARNING) << "coherent_integration_time should be multiple of " << "Galileo code length (4 ms). coherent_integration_time = " << sampled_ms_ << " ms will be used."; } max_dwells_ = configuration_->property(role + ".max_dwells", 1); dump_filename_ = configuration_->property(role + ".dump_filename", default_dump_filename); //--- Find number of samples per spreading code (4 ms) ----------------- code_length_ = round( fs_in_ / (Galileo_E1_CODE_CHIP_RATE_HZ / Galileo_E1_B_CODE_LENGTH_CHIPS)); vector_length_ = code_length_ * (int)(sampled_ms_/4); int samples_per_ms = code_length_ / 4; code_ = new gr_complex[vector_length_]; if (item_type_.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); acquisition_cc_ = galileo_pcps_8ms_make_acquisition_cc(sampled_ms_, max_dwells_, doppler_max_, if_, fs_in_, samples_per_ms, code_length_, dump_, dump_filename_); stream_to_vector_ = gr::blocks::stream_to_vector::make(item_size_, vector_length_); DLOG(INFO) << "stream_to_vector(" << stream_to_vector_->unique_id() << ")"; DLOG(INFO) << "acquisition(" << acquisition_cc_->unique_id() << ")"; } else { item_size_ = sizeof(gr_complex); LOG(WARNING) << item_type_ << " unknown acquisition item type"; } channel_ = 0; threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = 0; } GalileoE1Pcps8msAmbiguousAcquisition::~GalileoE1Pcps8msAmbiguousAcquisition() { delete[] code_; } void GalileoE1Pcps8msAmbiguousAcquisition::set_channel(unsigned int channel) { channel_ = channel; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_channel(channel_); } } void GalileoE1Pcps8msAmbiguousAcquisition::set_threshold(float threshold) { float pfa = configuration_->property(role_+ boost::lexical_cast(channel_) + ".pfa", 0.0); if(pfa == 0.0) pfa = configuration_->property(role_ + ".pfa", 0.0); if(pfa == 0.0) { threshold_ = threshold; } else { threshold_ = calculate_threshold(pfa); } DLOG(INFO) << "Channel " << channel_ << " Threshold = " << threshold_; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_threshold(threshold_); } } void GalileoE1Pcps8msAmbiguousAcquisition::set_doppler_max(unsigned int doppler_max) { doppler_max_ = doppler_max; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_doppler_max(doppler_max_); } } void GalileoE1Pcps8msAmbiguousAcquisition::set_doppler_step(unsigned int doppler_step) { doppler_step_ = doppler_step; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_doppler_step(doppler_step_); } } void GalileoE1Pcps8msAmbiguousAcquisition::set_gnss_synchro( Gnss_Synchro* gnss_synchro) { gnss_synchro_ = gnss_synchro; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_gnss_synchro(gnss_synchro_); } } signed int GalileoE1Pcps8msAmbiguousAcquisition::mag() { if (item_type_.compare("gr_complex") == 0) { return acquisition_cc_->mag(); } else { return 0; } } void GalileoE1Pcps8msAmbiguousAcquisition::init() { acquisition_cc_->init(); set_local_code(); } void GalileoE1Pcps8msAmbiguousAcquisition::set_local_code() { if (item_type_.compare("gr_complex") == 0) { bool cboc = configuration_->property( "Acquisition" + boost::lexical_cast(channel_) + ".cboc", false); std::complex * code = new std::complex[code_length_]; galileo_e1_code_gen_complex_sampled(code, gnss_synchro_->Signal, cboc, gnss_synchro_->PRN, fs_in_, 0, false); for (unsigned int i = 0; i < sampled_ms_/4; i++) { memcpy(&(code_[i*code_length_]), code, sizeof(gr_complex)*code_length_); } acquisition_cc_->set_local_code(code_); delete[] code; } } void GalileoE1Pcps8msAmbiguousAcquisition::reset() { if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_active(true); } } float GalileoE1Pcps8msAmbiguousAcquisition::calculate_threshold(float pfa) { unsigned int frequency_bins = 0; for (int doppler = (int)(-doppler_max_); doppler <= (int)doppler_max_; doppler += doppler_step_) { frequency_bins++; } DLOG(INFO) << "Channel " << channel_ << " Pfa = " << pfa; unsigned int ncells = vector_length_*frequency_bins; double exponent = 1 / static_cast(ncells); double val = pow(1.0 - pfa,exponent); double lambda = double(vector_length_); boost::math::exponential_distribution mydist (lambda); float threshold = (float)quantile(mydist,val); return threshold; } void GalileoE1Pcps8msAmbiguousAcquisition::connect(gr::top_block_sptr top_block) { if (item_type_.compare("gr_complex") == 0) { top_block->connect(stream_to_vector_, 0, acquisition_cc_, 0); } } void GalileoE1Pcps8msAmbiguousAcquisition::disconnect(gr::top_block_sptr top_block) { if (item_type_.compare("gr_complex") == 0) { top_block->disconnect(stream_to_vector_, 0, acquisition_cc_, 0); } } gr::basic_block_sptr GalileoE1Pcps8msAmbiguousAcquisition::get_left_block() { return stream_to_vector_; } gr::basic_block_sptr GalileoE1Pcps8msAmbiguousAcquisition::get_right_block() { return acquisition_cc_; } gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/galileo_e1_pcps_8ms_ambiguous_acquisition.h000066400000000000000000000103771305042567700330450ustar00rootroot00000000000000/*! * \file galileo_e1_pcps_8ms_ambiguous_acquisition.h * \brief Adapts a PCPS 8ms acquisition block to an * AcquisitionInterface for Galileo E1 Signals * \author Marc Molina, 2013. marc.molina.pena(at)gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_E1_PCPS_8MS_AMBIGUOUS_ACQUISITION_H_ #define GNSS_SDR_GALILEO_E1_PCPS_8MS_AMBIGUOUS_ACQUISITION_H_ #include #include #include "gnss_synchro.h" #include "acquisition_interface.h" #include "galileo_pcps_8ms_acquisition_cc.h" class ConfigurationInterface; /*! * \brief Adapts a PCPS 8ms acquisition block to an * AcquisitionInterface for Galileo E1 Signals */ class GalileoE1Pcps8msAmbiguousAcquisition: public AcquisitionInterface { public: GalileoE1Pcps8msAmbiguousAcquisition(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GalileoE1Pcps8msAmbiguousAcquisition(); std::string role() { return role_; } /*! * \brief Returns "Galileo_E1_PCPS_8ms_Ambiguous_Acquisition" */ std::string implementation() { return "Galileo_E1_PCPS_8ms_Ambiguous_Acquisition"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to efficiently exchange synchronization data between acquisition and * tracking blocks */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); /*! * \brief Set acquisition channel unique ID */ void set_channel(unsigned int channel); /*! * \brief Set statistics threshold of PCPS algorithm */ void set_threshold(float threshold); /*! * \brief Set maximum Doppler off grid search */ void set_doppler_max(unsigned int doppler_max); /*! * \brief Set Doppler steps for the grid search */ void set_doppler_step(unsigned int doppler_step); /*! * \brief Initializes acquisition algorithm. */ void init(); /*! * \brief Sets local code for Galileo E1 PCPS acquisition algorithm. */ void set_local_code(); /*! * \brief Returns the maximum peak of grid search */ signed int mag(); /*! * \brief Restart acquisition algorithm */ void reset(); private: ConfigurationInterface* configuration_; galileo_pcps_8ms_acquisition_cc_sptr acquisition_cc_; gr::blocks::stream_to_vector::sptr stream_to_vector_; size_t item_size_; std::string item_type_; unsigned int vector_length_; unsigned int code_length_; unsigned int channel_; float threshold_; unsigned int doppler_max_; unsigned int doppler_step_; unsigned int sampled_ms_; unsigned int max_dwells_; long fs_in_; long if_; bool dump_; std::string dump_filename_; std::complex * code_; Gnss_Synchro * gnss_synchro_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; float calculate_threshold(float pfa); }; #endif /* GNSS_SDR_GALILEO_E1_PCPS_8MS_AMBIGUOUS_ACQUISITION_H_ */ gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.cc000066400000000000000000000273541305042567700324170ustar00rootroot00000000000000/*! * \file galileo_e1_pcps_ambiguous_acquisition.cc * \brief Adapts a PCPS acquisition block to an AcquisitionInterface for * Galileo E1 Signals * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_e1_pcps_ambiguous_acquisition.h" #include #include #include #include "galileo_e1_signal_processing.h" #include "Galileo_E1.h" #include "configuration_interface.h" using google::LogMessage; GalileoE1PcpsAmbiguousAcquisition::GalileoE1PcpsAmbiguousAcquisition( ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { configuration_ = configuration; std::string default_item_type = "gr_complex"; std::string default_dump_filename = "../data/acquisition.dat"; DLOG(INFO) << "role " << role; item_type_ = configuration_->property(role + ".item_type", default_item_type); fs_in_ = configuration_->property("GNSS-SDR.internal_fs_hz", 4000000); if_ = configuration_->property(role + ".if", 0); dump_ = configuration_->property(role + ".dump", false); doppler_max_ = configuration_->property(role + ".doppler_max", 5000); sampled_ms_ = configuration_->property(role + ".coherent_integration_time_ms", 4); if (sampled_ms_ % 4 != 0) { sampled_ms_ = (int)(sampled_ms_ / 4) * 4; LOG(WARNING) << "coherent_integration_time should be multiple of " << "Galileo code length (4 ms). coherent_integration_time = " << sampled_ms_ << " ms will be used."; } bit_transition_flag_ = configuration_->property(role + ".bit_transition_flag", false); use_CFAR_algorithm_flag_ = configuration_->property(role + ".use_CFAR_algorithm", true); //will be false in future versions max_dwells_ = configuration_->property(role + ".max_dwells", 1); dump_filename_ = configuration_->property(role + ".dump_filename", default_dump_filename); //--- Find number of samples per spreading code (4 ms) ----------------- code_length_ = round(fs_in_ / (Galileo_E1_CODE_CHIP_RATE_HZ / Galileo_E1_B_CODE_LENGTH_CHIPS)); int samples_per_ms = round(code_length_ / 4.0); vector_length_ = sampled_ms_ * samples_per_ms; if( bit_transition_flag_ ) { vector_length_ *= 2; } code_ = new gr_complex[vector_length_]; if (item_type_.compare("cshort") == 0 ) { item_size_ = sizeof(lv_16sc_t); acquisition_sc_ = pcps_make_acquisition_sc(sampled_ms_, max_dwells_, doppler_max_, if_, fs_in_, samples_per_ms, code_length_, bit_transition_flag_, use_CFAR_algorithm_flag_, dump_, dump_filename_); DLOG(INFO) << "acquisition(" << acquisition_sc_->unique_id() << ")"; }else{ item_size_ = sizeof(gr_complex); acquisition_cc_ = pcps_make_acquisition_cc(sampled_ms_, max_dwells_, doppler_max_, if_, fs_in_, samples_per_ms, code_length_, bit_transition_flag_, use_CFAR_algorithm_flag_, dump_, dump_filename_); DLOG(INFO) << "acquisition(" << acquisition_cc_->unique_id() << ")"; } stream_to_vector_ = gr::blocks::stream_to_vector::make(item_size_, vector_length_); DLOG(INFO) << "stream_to_vector(" << stream_to_vector_->unique_id() << ")"; if (item_type_.compare("cbyte") == 0) { cbyte_to_float_x2_ = make_complex_byte_to_float_x2(); float_to_complex_ = gr::blocks::float_to_complex::make(); } channel_ = 0; threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = 0; } GalileoE1PcpsAmbiguousAcquisition::~GalileoE1PcpsAmbiguousAcquisition() { delete[] code_; } void GalileoE1PcpsAmbiguousAcquisition::set_channel(unsigned int channel) { channel_ = channel; if (item_type_.compare("cshort") == 0) { acquisition_sc_->set_channel(channel_); } else { acquisition_cc_->set_channel(channel_); } } void GalileoE1PcpsAmbiguousAcquisition::set_threshold(float threshold) { float pfa = configuration_->property(role_+ boost::lexical_cast(channel_) + ".pfa", 0.0); if(pfa == 0.0) pfa = configuration_->property(role_ + ".pfa", 0.0); if(pfa == 0.0) { threshold_ = threshold; } else { threshold_ = calculate_threshold(pfa); } DLOG(INFO) << "Channel " << channel_ << " Threshold = " << threshold_; if (item_type_.compare("cshort") == 0) { acquisition_sc_->set_threshold(threshold_); } else { acquisition_cc_->set_threshold(threshold_); } } void GalileoE1PcpsAmbiguousAcquisition::set_doppler_max(unsigned int doppler_max) { doppler_max_ = doppler_max; if (item_type_.compare("cshort") == 0) { acquisition_sc_->set_doppler_max(doppler_max_); } else { acquisition_cc_->set_doppler_max(doppler_max_); } } void GalileoE1PcpsAmbiguousAcquisition::set_doppler_step(unsigned int doppler_step) { doppler_step_ = doppler_step; if (item_type_.compare("cshort") == 0) { acquisition_sc_->set_doppler_step(doppler_step_); } else { acquisition_cc_->set_doppler_step(doppler_step_); } } void GalileoE1PcpsAmbiguousAcquisition::set_gnss_synchro(Gnss_Synchro* gnss_synchro) { gnss_synchro_ = gnss_synchro; if (item_type_.compare("cshort") == 0) { acquisition_sc_->set_gnss_synchro(gnss_synchro_); } else { acquisition_cc_->set_gnss_synchro(gnss_synchro_); } } signed int GalileoE1PcpsAmbiguousAcquisition::mag() { if (item_type_.compare("cshort") == 0) { return acquisition_sc_->mag(); } else { return acquisition_cc_->mag(); } } void GalileoE1PcpsAmbiguousAcquisition::init() { if (item_type_.compare("cshort") == 0) { acquisition_sc_->init(); } else { acquisition_cc_->init(); } set_local_code(); } void GalileoE1PcpsAmbiguousAcquisition::set_local_code() { bool cboc = configuration_->property( "Acquisition" + boost::lexical_cast(channel_) + ".cboc", false); std::complex * code = new std::complex[code_length_]; galileo_e1_code_gen_complex_sampled(code, gnss_synchro_->Signal, cboc, gnss_synchro_->PRN, fs_in_, 0, false); for (unsigned int i = 0; i < sampled_ms_ / 4; i++) { memcpy(&(code_[i*code_length_]), code, sizeof(gr_complex)*code_length_); } if (item_type_.compare("cshort") == 0) { acquisition_sc_->set_local_code(code_); } else { acquisition_cc_->set_local_code(code_); } delete[] code; } void GalileoE1PcpsAmbiguousAcquisition::reset() { if (item_type_.compare("cshort") == 0) { acquisition_sc_->set_active(true); } else { acquisition_cc_->set_active(true); } } void GalileoE1PcpsAmbiguousAcquisition::set_state(int state) { if (item_type_.compare("cshort") == 0) { acquisition_sc_->set_state(state); } else { acquisition_cc_->set_state(state); } } float GalileoE1PcpsAmbiguousAcquisition::calculate_threshold(float pfa) { unsigned int frequency_bins = 0; for (int doppler = (int)(-doppler_max_); doppler <= (int)doppler_max_; doppler += doppler_step_) { frequency_bins++; } DLOG(INFO) <<"Channel "<connect(stream_to_vector_, 0, acquisition_cc_, 0); } else if (item_type_.compare("cshort") == 0) { top_block->connect(stream_to_vector_, 0, acquisition_sc_, 0); } else if (item_type_.compare("cbyte") == 0) { top_block->connect(cbyte_to_float_x2_, 0, float_to_complex_, 0); top_block->connect(cbyte_to_float_x2_, 1, float_to_complex_, 1); top_block->connect(float_to_complex_, 0, stream_to_vector_, 0); top_block->connect(stream_to_vector_, 0, acquisition_cc_, 0); } else { LOG(WARNING) << item_type_ << " unknown acquisition item type"; } } void GalileoE1PcpsAmbiguousAcquisition::disconnect(gr::top_block_sptr top_block) { if (item_type_.compare("gr_complex") == 0) { top_block->disconnect(stream_to_vector_, 0, acquisition_cc_, 0); } else if (item_type_.compare("cshort") == 0) { top_block->disconnect(stream_to_vector_, 0, acquisition_sc_, 0); } else if (item_type_.compare("cbyte") == 0) { // Since a byte-based acq implementation is not available, // we just convert cshorts to gr_complex top_block->disconnect(cbyte_to_float_x2_, 0, float_to_complex_, 0); top_block->disconnect(cbyte_to_float_x2_, 1, float_to_complex_, 1); top_block->disconnect(float_to_complex_, 0, stream_to_vector_, 0); top_block->disconnect(stream_to_vector_, 0, acquisition_cc_, 0); } else { LOG(WARNING) << item_type_ << " unknown acquisition item type"; } } gr::basic_block_sptr GalileoE1PcpsAmbiguousAcquisition::get_left_block() { if (item_type_.compare("gr_complex") == 0) { return stream_to_vector_; } else if (item_type_.compare("cshort") == 0) { return stream_to_vector_; } else if (item_type_.compare("cbyte") == 0) { return cbyte_to_float_x2_; } else { LOG(WARNING) << item_type_ << " unknown acquisition item type"; return nullptr; } } gr::basic_block_sptr GalileoE1PcpsAmbiguousAcquisition::get_right_block() { if (item_type_.compare("cshort") == 0) { return acquisition_sc_; } else { return acquisition_cc_; } } gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.h000066400000000000000000000113201305042567700322430ustar00rootroot00000000000000/*! * \file galileo_e1_pcps_ambiguous_acquisition.h * \brief Adapts a PCPS acquisition block to an AcquisitionInterface for * Galileo E1 Signals * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_E1_PCPS_AMBIGUOUS_ACQUISITION_H_ #define GNSS_SDR_GALILEO_E1_PCPS_AMBIGUOUS_ACQUISITION_H_ #include #include #include #include "gnss_synchro.h" #include "acquisition_interface.h" #include "pcps_acquisition_cc.h" #include "pcps_acquisition_sc.h" #include "complex_byte_to_float_x2.h" #include class ConfigurationInterface; /*! * \brief This class adapts a PCPS acquisition block to an * AcquisitionInterface for Galileo E1 Signals */ class GalileoE1PcpsAmbiguousAcquisition: public AcquisitionInterface { public: GalileoE1PcpsAmbiguousAcquisition(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GalileoE1PcpsAmbiguousAcquisition(); std::string role() { return role_; } /*! * \brief Returns "Galileo_E1_PCPS_Ambiguous_Acquisition" */ std::string implementation() { return "Galileo_E1_PCPS_Ambiguous_Acquisition"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to efficiently exchange synchronization data between acquisition and * tracking blocks */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); /*! * \brief Set acquisition channel unique ID */ void set_channel(unsigned int channel); /*! * \brief Set statistics threshold of PCPS algorithm */ void set_threshold(float threshold); /*! * \brief Set maximum Doppler off grid search */ void set_doppler_max(unsigned int doppler_max); /*! * \brief Set Doppler steps for the grid search */ void set_doppler_step(unsigned int doppler_step); /*! * \brief Initializes acquisition algorithm. */ void init(); /*! * \brief Sets local code for Galileo E1 PCPS acquisition algorithm. */ void set_local_code(); /*! * \brief Returns the maximum peak of grid search */ signed int mag(); /*! * \brief Restart acquisition algorithm */ void reset(); /*! * \brief If state = 1, it forces the block to start acquiring from the first sample */ void set_state(int state); private: ConfigurationInterface* configuration_; pcps_acquisition_cc_sptr acquisition_cc_; pcps_acquisition_sc_sptr acquisition_sc_; gr::blocks::stream_to_vector::sptr stream_to_vector_; gr::blocks::float_to_complex::sptr float_to_complex_; complex_byte_to_float_x2_sptr cbyte_to_float_x2_; size_t item_size_; std::string item_type_; unsigned int vector_length_; unsigned int code_length_; bool bit_transition_flag_; bool use_CFAR_algorithm_flag_; unsigned int channel_; float threshold_; unsigned int doppler_max_; unsigned int doppler_step_; unsigned int sampled_ms_; unsigned int max_dwells_; long fs_in_; long if_; bool dump_; std::string dump_filename_; std::complex * code_; Gnss_Synchro * gnss_synchro_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; float calculate_threshold(float pfa); }; #endif /* GNSS_SDR_GALILEO_E1_PCPS_AMBIGUOUS_ACQUISITION_H_ */ gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/galileo_e1_pcps_cccwsr_ambiguous_acquisition.cc000066400000000000000000000202211305042567700337450ustar00rootroot00000000000000/*! * \file galileo_e1_pcps_cccwsr_ambiguous_acquisition.cc * \brief Adapts a PCPS CCCWSR acquisition block to an AcquisitionInterface for * Galileo E1 Signals * \author Marc Molina, 2013. marc.molina.pena(at)gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_e1_pcps_cccwsr_ambiguous_acquisition.h" #include #include #include #include "galileo_e1_signal_processing.h" #include "Galileo_E1.h" #include "configuration_interface.h" using google::LogMessage; GalileoE1PcpsCccwsrAmbiguousAcquisition::GalileoE1PcpsCccwsrAmbiguousAcquisition( ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { configuration_ = configuration; std::string default_item_type = "gr_complex"; std::string default_dump_filename = "../data/acquisition.dat"; DLOG(INFO) << "role " << role; item_type_ = configuration_->property(role + ".item_type", default_item_type); fs_in_ = configuration_->property("GNSS-SDR.internal_fs_hz", 4000000); if_ = configuration_->property(role + ".if", 0); dump_ = configuration_->property(role + ".dump", false); doppler_max_ = configuration_->property(role + ".doppler_max", 5000); sampled_ms_ = configuration_->property(role + ".coherent_integration_time_ms", 4); if (sampled_ms_ % 4 != 0) { sampled_ms_ = static_cast(sampled_ms_ / 4) * 4; LOG(WARNING) << "coherent_integration_time should be multiple of " << "Galileo code length (4 ms). coherent_integration_time = " << sampled_ms_ << " ms will be used."; } max_dwells_ = configuration_->property(role + ".max_dwells", 1); dump_filename_ = configuration_->property(role + ".dump_filename", default_dump_filename); //--- Find number of samples per spreading code (4 ms) ----------------- code_length_ = round( fs_in_ / (Galileo_E1_CODE_CHIP_RATE_HZ / Galileo_E1_B_CODE_LENGTH_CHIPS)); vector_length_ = code_length_ * static_cast(sampled_ms_ / 4); int samples_per_ms = code_length_ / 4; code_data_ = new gr_complex[vector_length_]; code_pilot_ = new gr_complex[vector_length_]; if (item_type_.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); acquisition_cc_ = pcps_cccwsr_make_acquisition_cc(sampled_ms_, max_dwells_, doppler_max_, if_, fs_in_, samples_per_ms, code_length_, dump_, dump_filename_); stream_to_vector_ = gr::blocks::stream_to_vector::make(item_size_, vector_length_); DLOG(INFO) << "stream_to_vector(" << stream_to_vector_->unique_id() << ")"; DLOG(INFO) << "acquisition(" << acquisition_cc_->unique_id() << ")"; } else { item_size_ = sizeof(gr_complex); LOG(WARNING) << item_type_ << " unknown acquisition item type"; } channel_ = 0; threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = 0; } GalileoE1PcpsCccwsrAmbiguousAcquisition::~GalileoE1PcpsCccwsrAmbiguousAcquisition() { delete[] code_data_; delete[] code_pilot_; } void GalileoE1PcpsCccwsrAmbiguousAcquisition::set_channel(unsigned int channel) { channel_ = channel; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_channel(channel_); } } void GalileoE1PcpsCccwsrAmbiguousAcquisition::set_threshold(float threshold) { // float pfa = configuration_->property(role_+ boost::lexical_cast(channel_) + ".pfa", 0.0); // if(pfa==0.0) pfa = configuration_->property(role_+".pfa", 0.0); // if(pfa==0.0) // { // threshold_ = threshold; // } // else // { // threshold_ = calculate_threshold(pfa); // } threshold_ = threshold; DLOG(INFO) <<"Channel "<set_threshold(threshold_); } } void GalileoE1PcpsCccwsrAmbiguousAcquisition::set_doppler_max(unsigned int doppler_max) { doppler_max_ = doppler_max; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_doppler_max(doppler_max_); } } void GalileoE1PcpsCccwsrAmbiguousAcquisition::set_doppler_step(unsigned int doppler_step) { doppler_step_ = doppler_step; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_doppler_step(doppler_step_); } } void GalileoE1PcpsCccwsrAmbiguousAcquisition::set_gnss_synchro( Gnss_Synchro* gnss_synchro) { gnss_synchro_ = gnss_synchro; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_gnss_synchro(gnss_synchro_); } } signed int GalileoE1PcpsCccwsrAmbiguousAcquisition::mag() { if (item_type_.compare("gr_complex") == 0) { return acquisition_cc_->mag(); } else { return 0; } } void GalileoE1PcpsCccwsrAmbiguousAcquisition::init() { acquisition_cc_->init(); set_local_code(); } void GalileoE1PcpsCccwsrAmbiguousAcquisition::set_local_code() { if (item_type_.compare("gr_complex") == 0) { bool cboc = configuration_->property( "Acquisition" + boost::lexical_cast(channel_) + ".cboc", false); char signal[3]; strcpy(signal, "1B"); galileo_e1_code_gen_complex_sampled(code_data_, signal, cboc, gnss_synchro_->PRN, fs_in_, 0, false); strcpy(signal, "1C"); galileo_e1_code_gen_complex_sampled(code_pilot_, signal, cboc, gnss_synchro_->PRN, fs_in_, 0, false); acquisition_cc_->set_local_code(code_data_, code_pilot_); } } void GalileoE1PcpsCccwsrAmbiguousAcquisition::reset() { if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_active(true); } } void GalileoE1PcpsCccwsrAmbiguousAcquisition::set_state(int state) { acquisition_cc_->set_state(state); } float GalileoE1PcpsCccwsrAmbiguousAcquisition::calculate_threshold(float pfa) { if(pfa){ /* Not implemented*/}; return 0.0; } void GalileoE1PcpsCccwsrAmbiguousAcquisition::connect(gr::top_block_sptr top_block) { if (item_type_.compare("gr_complex") == 0) { top_block->connect(stream_to_vector_, 0, acquisition_cc_, 0); } } void GalileoE1PcpsCccwsrAmbiguousAcquisition::disconnect(gr::top_block_sptr top_block) { if (item_type_.compare("gr_complex") == 0) { top_block->disconnect(stream_to_vector_, 0, acquisition_cc_, 0); } } gr::basic_block_sptr GalileoE1PcpsCccwsrAmbiguousAcquisition::get_left_block() { return stream_to_vector_; } gr::basic_block_sptr GalileoE1PcpsCccwsrAmbiguousAcquisition::get_right_block() { return acquisition_cc_; } gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/galileo_e1_pcps_cccwsr_ambiguous_acquisition.h000066400000000000000000000106241305042567700336150ustar00rootroot00000000000000/*! * \file galileo_e1_pcps_cccwsr_ambiguous_acquisition.h * \brief Adapts a PCPS CCCWSR acquisition block to an AcquisitionInterface for * Galileo E1 Signals * \author Marc Molina, 2013. marc.molina.pena(at)gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_E1_PCPS_CCCWSR_AMBIGUOUS_ACQUISITION_H_ #define GNSS_SDR_GALILEO_E1_PCPS_CCCWSR_AMBIGUOUS_ACQUISITION_H_ #include #include #include "gnss_synchro.h" #include "acquisition_interface.h" #include "pcps_cccwsr_acquisition_cc.h" class ConfigurationInterface; /*! * \brief Adapts a PCPS CCCWSR acquisition block to an AcquisitionInterface * for Galileo E1 Signals */ class GalileoE1PcpsCccwsrAmbiguousAcquisition: public AcquisitionInterface { public: GalileoE1PcpsCccwsrAmbiguousAcquisition(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GalileoE1PcpsCccwsrAmbiguousAcquisition(); std::string role() { return role_; } /*! * \brief Returns "Galileo_E1_PCPS_CCCWSR_Ambiguous_Acquisition" */ std::string implementation() { return "Galileo_E1_PCPS_CCCWSR_Ambiguous_Acquisition"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to efficiently exchange synchronization data between acquisition and * tracking blocks */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); /*! * \brief Set acquisition channel unique ID */ void set_channel(unsigned int channel); /*! * \brief Set statistics threshold of CCCWSR algorithm */ void set_threshold(float threshold); /*! * \brief Set maximum Doppler off grid search */ void set_doppler_max(unsigned int doppler_max); /*! * \brief Set Doppler steps for the grid search */ void set_doppler_step(unsigned int doppler_step); /*! * \brief Initializes acquisition algorithm. */ void init(); void set_local_code(); /*! * \brief Returns the maximum peak of grid search */ signed int mag(); /*! * \brief Restart acquisition algorithm */ void reset(); /*! * \brief If state = 1, it forces the block to start acquiring from the first sample */ void set_state(int state); private: ConfigurationInterface* configuration_; pcps_cccwsr_acquisition_cc_sptr acquisition_cc_; gr::blocks::stream_to_vector::sptr stream_to_vector_; size_t item_size_; std::string item_type_; unsigned int vector_length_; unsigned int code_length_; //unsigned int satellite_; unsigned int channel_; float threshold_; unsigned int doppler_max_; unsigned int doppler_step_; unsigned int sampled_ms_; unsigned int max_dwells_; long fs_in_; long if_; bool dump_; std::string dump_filename_; std::complex * code_data_; std::complex * code_pilot_; Gnss_Synchro * gnss_synchro_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; float calculate_threshold(float pfa); }; #endif /* GNSS_SDR_GALILEO_E1_PCPS_CCCWSR_AMBIGUOUS_ACQUISITION_H_ */ galileo_e1_pcps_quicksync_ambiguous_acquisition.cc000066400000000000000000000251141305042567700344210ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/*! * \file galileo_e1_pcps_quicksync_ambiguous_acquisition.cc * \brief Adapts a PCPS acquisition block to an AcquisitionInterface for * Galileo E1 Signals using the QuickSync Algorithm * \author Damian Miralles, 2014. dmiralles2009@gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_e1_pcps_quicksync_ambiguous_acquisition.h" #include #include #include #include "galileo_e1_signal_processing.h" #include "Galileo_E1.h" #include "configuration_interface.h" using google::LogMessage; GalileoE1PcpsQuickSyncAmbiguousAcquisition::GalileoE1PcpsQuickSyncAmbiguousAcquisition( ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { configuration_ = configuration; std::string default_item_type = "gr_complex"; std::string default_dump_filename = "../data/acquisition.dat"; DLOG(INFO) << "role " << role; item_type_ = configuration_->property(role + ".item_type", default_item_type); fs_in_ = configuration_->property("GNSS-SDR.internal_fs_hz", 4000000); if_ = configuration_->property(role + ".if", 0); dump_ = configuration_->property(role + ".dump", false); doppler_max_ = configuration_->property(role + ".doppler_max", 5000); sampled_ms_ = configuration_->property(role + ".coherent_integration_time_ms", 8); /*--- Find number of samples per spreading code (4 ms) -----------------*/ code_length_ = round( fs_in_ / (Galileo_E1_CODE_CHIP_RATE_HZ / Galileo_E1_B_CODE_LENGTH_CHIPS)); int samples_per_ms = round(code_length_ / 4.0); /*Calculate the folding factor value based on the formula described in the paper. This may be a bug, but acquisition also work by variying the folding factor at va- lues different that the expressed in the paper. In adition, it is important to point out that by making the folding factor smaller we were able to get QuickSync work with Galileo. Future work should be directed to test this asumption statistically.*/ //folding_factor_ = (unsigned int)ceil(sqrt(log2(code_length_))); folding_factor_ = configuration_->property(role + ".folding_factor", 2); if (sampled_ms_ % (folding_factor_*4) != 0) { LOG(WARNING) << "QuickSync Algorithm requires a coherent_integration_time" << " multiple of "<<(folding_factor_*4)<<"ms, Value entered " <property(role + ".bit_transition_flag", false); if (!bit_transition_flag_) { max_dwells_ = configuration_->property(role + ".max_dwells", 1); } else { max_dwells_ = 2; } dump_filename_ = configuration_->property(role + ".dump_filename", default_dump_filename); code_ = new gr_complex[code_length_]; LOG(INFO) << "Vector Length: " << vector_length_ << ", Samples per ms: " << samples_per_ms << ", Folding factor: " << folding_factor_ << ", Sampled ms: " << sampled_ms_ << ", Code Length: " << code_length_; if (item_type_.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); acquisition_cc_ = pcps_quicksync_make_acquisition_cc(folding_factor_, sampled_ms_, max_dwells_, doppler_max_, if_, fs_in_, samples_per_ms, code_length_, bit_transition_flag_, dump_, dump_filename_); stream_to_vector_ = gr::blocks::stream_to_vector::make(item_size_, vector_length_); DLOG(INFO) << "stream_to_vector_quicksync(" << stream_to_vector_->unique_id() << ")"; DLOG(INFO) << "acquisition_quicksync(" << acquisition_cc_->unique_id() << ")"; } else { item_size_ = sizeof(gr_complex); LOG(WARNING) << item_type_ << " unknown acquisition item type"; } channel_ = 0; threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = 0; } GalileoE1PcpsQuickSyncAmbiguousAcquisition::~GalileoE1PcpsQuickSyncAmbiguousAcquisition() { delete[] code_; } void GalileoE1PcpsQuickSyncAmbiguousAcquisition::set_channel(unsigned int channel) { channel_ = channel; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_channel(channel_); } } void GalileoE1PcpsQuickSyncAmbiguousAcquisition::set_threshold(float threshold) { float pfa = configuration_->property(role_+ boost::lexical_cast(channel_) + ".pfa", 0.0); if(pfa==0.0) pfa = configuration_->property(role_+".pfa", 0.0); if(pfa==0.0) { threshold_ = threshold; } else { threshold_ = calculate_threshold(pfa); } DLOG(INFO) <<"Channel "<set_threshold(threshold_); } } void GalileoE1PcpsQuickSyncAmbiguousAcquisition::set_doppler_max(unsigned int doppler_max) { doppler_max_ = doppler_max; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_doppler_max(doppler_max_); } } void GalileoE1PcpsQuickSyncAmbiguousAcquisition::set_doppler_step(unsigned int doppler_step) { doppler_step_ = doppler_step; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_doppler_step(doppler_step_); } } void GalileoE1PcpsQuickSyncAmbiguousAcquisition::set_gnss_synchro( Gnss_Synchro* gnss_synchro) { gnss_synchro_ = gnss_synchro; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_gnss_synchro(gnss_synchro_); } } signed int GalileoE1PcpsQuickSyncAmbiguousAcquisition::mag() { if (item_type_.compare("gr_complex") == 0) { return acquisition_cc_->mag(); } else { return 0; } } void GalileoE1PcpsQuickSyncAmbiguousAcquisition::init() { acquisition_cc_->init(); set_local_code(); } void GalileoE1PcpsQuickSyncAmbiguousAcquisition::set_local_code() { if (item_type_.compare("gr_complex") == 0) { bool cboc = configuration_->property( "Acquisition" + boost::lexical_cast(channel_) + ".cboc", false); std::complex * code = new std::complex[code_length_]; galileo_e1_code_gen_complex_sampled(code, gnss_synchro_->Signal, cboc, gnss_synchro_->PRN, fs_in_, 0, false); for (unsigned int i = 0; i < (sampled_ms_/(folding_factor_*4)); i++) { memcpy(&(code_[i*code_length_]), code, sizeof(gr_complex)*code_length_); } // memcpy(code_, code,sizeof(gr_complex)*code_length_); acquisition_cc_->set_local_code(code_); delete[] code; code = NULL; } } void GalileoE1PcpsQuickSyncAmbiguousAcquisition::reset() { if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_active(true); } } void GalileoE1PcpsQuickSyncAmbiguousAcquisition::set_state(int state) { if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_state(state); } } float GalileoE1PcpsQuickSyncAmbiguousAcquisition::calculate_threshold(float pfa) { unsigned int frequency_bins = 0; for (int doppler = (int)(-doppler_max_); doppler <= (int)doppler_max_; doppler += doppler_step_) { frequency_bins++; } DLOG(INFO) << "Channel " << channel_ << " Pfa = " << pfa; unsigned int ncells = code_length_ / folding_factor_ * frequency_bins; double exponent = 1.0 / static_cast(ncells); double val = pow(1.0 - pfa, exponent); double lambda = static_cast(code_length_) / static_cast(folding_factor_); boost::math::exponential_distribution mydist (lambda); float threshold = static_cast(quantile(mydist,val)); return threshold; } void GalileoE1PcpsQuickSyncAmbiguousAcquisition::connect(gr::top_block_sptr top_block) { if (item_type_.compare("gr_complex") == 0) { top_block->connect(stream_to_vector_, 0, acquisition_cc_, 0); } } void GalileoE1PcpsQuickSyncAmbiguousAcquisition::disconnect(gr::top_block_sptr top_block) { if (item_type_.compare("gr_complex") == 0) { top_block->disconnect(stream_to_vector_, 0, acquisition_cc_, 0); } } gr::basic_block_sptr GalileoE1PcpsQuickSyncAmbiguousAcquisition::get_left_block() { return stream_to_vector_; } gr::basic_block_sptr GalileoE1PcpsQuickSyncAmbiguousAcquisition::get_right_block() { return acquisition_cc_; } gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/galileo_e1_pcps_quicksync_ambiguous_acquisition.h000066400000000000000000000110061305042567700343350ustar00rootroot00000000000000/*! * \file galileo_e1_pcps_quicksync_ambiguous_acquisition.h * \brief Adapts a PCPS acquisition block to an AcquisitionInterface for Galileo E1 Signals * \date June, 2014 * \author Damian Miralles Sanchez. dmiralles2009@gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_E1_PCPS_QUICKSYNC_AMBIGUOUS_ACQUISITION_H_ #define GNSS_SDR_GALILEO_E1_PCPS_QUICKSYNC_AMBIGUOUS_ACQUISITION_H_ #include #include #include "gnss_synchro.h" #include "acquisition_interface.h" #include "pcps_quicksync_acquisition_cc.h" class ConfigurationInterface; /*! * \brief This class adapts a PCPS acquisition block to an * AcquisitionInterface for Galileo E1 Signals */ class GalileoE1PcpsQuickSyncAmbiguousAcquisition: public AcquisitionInterface { public: GalileoE1PcpsQuickSyncAmbiguousAcquisition(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GalileoE1PcpsQuickSyncAmbiguousAcquisition(); std::string role() { return role_; } /*! * \brief Returns "Galileo_E1_PCPS_Ambiguous_Acquisition" */ std::string implementation() { return "Galileo_E1_PCPS_QuickSync_Ambiguous_Acquisition"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to efficiently exchange synchronization data between acquisition and * tracking blocks */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); /*! * \brief Set acquisition channel unique ID */ void set_channel(unsigned int channel); /*! * \brief Set statistics threshold of PCPS algorithm */ void set_threshold(float threshold); /*! * \brief Set maximum Doppler off grid search */ void set_doppler_max(unsigned int doppler_max); /*! * \brief Set Doppler steps for the grid search */ void set_doppler_step(unsigned int doppler_step); /*! * \brief Initializes acquisition algorithm. */ void init(); /*! * \brief Sets local code for Galileo E1 PCPS acquisition algorithm. */ void set_local_code(); /*! * \brief Returns the maximum peak of grid search */ signed int mag(); /*! * \brief Restart acquisition algorithm */ void reset(); /*! * \brief If state = 1, it forces the block to start acquiring from the first sample */ void set_state(int state); private: ConfigurationInterface* configuration_; pcps_quicksync_acquisition_cc_sptr acquisition_cc_; gr::blocks::stream_to_vector::sptr stream_to_vector_; size_t item_size_; std::string item_type_; unsigned int vector_length_; unsigned int code_length_; bool bit_transition_flag_; unsigned int channel_; float threshold_; unsigned int doppler_max_; unsigned int doppler_step_; unsigned int sampled_ms_; unsigned int max_dwells_; unsigned int folding_factor_; long fs_in_; long if_; bool dump_; std::string dump_filename_; std::complex * code_; Gnss_Synchro * gnss_synchro_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; float calculate_threshold(float pfa); }; #endif /* GNSS_SDR_GALILEO_E1_PCPS_QUICKSYNC_AMBIGUOUS_ACQUISITION_H_ */ gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/galileo_e1_pcps_tong_ambiguous_acquisition.cc000066400000000000000000000213721305042567700334400ustar00rootroot00000000000000/*! * \file galileo_e1_pcps_tong_ambiguous_acquisition.cc * \brief Adapts a PCPS Tong acquisition block to an Acq1uisitionInterface for * Galileo E1 Signals * \author Marc Molina, 2013. marc.molina.pena(at)gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_e1_pcps_tong_ambiguous_acquisition.h" #include #include #include #include "galileo_e1_signal_processing.h" #include "Galileo_E1.h" #include "configuration_interface.h" using google::LogMessage; GalileoE1PcpsTongAmbiguousAcquisition::GalileoE1PcpsTongAmbiguousAcquisition( ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { configuration_ = configuration; std::string default_item_type = "gr_complex"; std::string default_dump_filename = "../data/acquisition.dat"; DLOG(INFO) << "role " << role; item_type_ = configuration_->property(role + ".item_type", default_item_type); fs_in_ = configuration_->property("GNSS-SDR.internal_fs_hz", 4000000); if_ = configuration_->property(role + ".if", 0); dump_ = configuration_->property(role + ".dump", false); doppler_max_ = configuration_->property(role + ".doppler_max", 5000); sampled_ms_ = configuration_->property(role + ".coherent_integration_time_ms", 4); if (sampled_ms_ % 4 != 0) { sampled_ms_ = (int)(sampled_ms_/4) * 4; LOG(WARNING) << "coherent_integration_time should be multiple of " << "Galileo code length (4 ms). coherent_integration_time = " << sampled_ms_ << " ms will be used."; } tong_init_val_ = configuration->property(role + ".tong_init_val", 1); tong_max_val_ = configuration->property(role + ".tong_max_val", 2); tong_max_dwells_ = configuration->property(role + ".tong_max_dwells", tong_max_val_ + 1); dump_filename_ = configuration_->property(role + ".dump_filename", default_dump_filename); //--- Find number of samples per spreading code (4 ms) ----------------- code_length_ = round( fs_in_ / (Galileo_E1_CODE_CHIP_RATE_HZ / Galileo_E1_B_CODE_LENGTH_CHIPS)); vector_length_ = code_length_ * (int)(sampled_ms_/4); int samples_per_ms = code_length_ / 4; code_ = new gr_complex[vector_length_]; if (item_type_.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); acquisition_cc_ = pcps_tong_make_acquisition_cc(sampled_ms_, doppler_max_, if_, fs_in_, samples_per_ms, code_length_, tong_init_val_, tong_max_val_, tong_max_dwells_, dump_, dump_filename_); stream_to_vector_ = gr::blocks::stream_to_vector::make(item_size_, vector_length_); DLOG(INFO) << "stream_to_vector(" << stream_to_vector_->unique_id() << ")"; DLOG(INFO) << "acquisition(" << acquisition_cc_->unique_id() << ")"; } else { item_size_ = sizeof(gr_complex); LOG(WARNING) << item_type_ << " unknown acquisition item type"; } channel_ = 0; threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = 0; } GalileoE1PcpsTongAmbiguousAcquisition::~GalileoE1PcpsTongAmbiguousAcquisition() { delete[] code_; } void GalileoE1PcpsTongAmbiguousAcquisition::set_channel(unsigned int channel) { channel_ = channel; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_channel(channel_); } } void GalileoE1PcpsTongAmbiguousAcquisition::set_threshold(float threshold) { float pfa = configuration_->property(role_+ boost::lexical_cast(channel_) + ".pfa", 0.0); if(pfa == 0.0) pfa = configuration_->property(role_+".pfa", 0.0); if(pfa == 0.0) { threshold_ = threshold; } else { threshold_ = calculate_threshold(pfa); } DLOG(INFO) <<"Channel "<set_threshold(threshold_); } } void GalileoE1PcpsTongAmbiguousAcquisition::set_doppler_max(unsigned int doppler_max) { doppler_max_ = doppler_max; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_doppler_max(doppler_max_); } } void GalileoE1PcpsTongAmbiguousAcquisition::set_doppler_step(unsigned int doppler_step) { doppler_step_ = doppler_step; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_doppler_step(doppler_step_); } } void GalileoE1PcpsTongAmbiguousAcquisition::set_gnss_synchro( Gnss_Synchro* gnss_synchro) { gnss_synchro_ = gnss_synchro; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_gnss_synchro(gnss_synchro_); } } signed int GalileoE1PcpsTongAmbiguousAcquisition::mag() { if (item_type_.compare("gr_complex") == 0) { return acquisition_cc_->mag(); } else { return 0; } } void GalileoE1PcpsTongAmbiguousAcquisition::init() { acquisition_cc_->init(); set_local_code(); } void GalileoE1PcpsTongAmbiguousAcquisition::set_local_code() { if (item_type_.compare("gr_complex") == 0) { bool cboc = configuration_->property( "Acquisition" + boost::lexical_cast(channel_) + ".cboc", false); std::complex * code = new std::complex[code_length_]; galileo_e1_code_gen_complex_sampled(code, gnss_synchro_->Signal, cboc, gnss_synchro_->PRN, fs_in_, 0, false); for (unsigned int i = 0; i < sampled_ms_/4; i++) { memcpy(&(code_[i*code_length_]), code, sizeof(gr_complex)*code_length_); } acquisition_cc_->set_local_code(code_); delete[] code; } } void GalileoE1PcpsTongAmbiguousAcquisition::reset() { if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_active(true); } } void GalileoE1PcpsTongAmbiguousAcquisition::set_state(int state) { acquisition_cc_->set_state(state); } float GalileoE1PcpsTongAmbiguousAcquisition::calculate_threshold(float pfa) { unsigned int frequency_bins = 0; for (int doppler = (int)(-doppler_max_); doppler <= (int)doppler_max_; doppler += doppler_step_) { frequency_bins++; } DLOG(INFO) << "Channel " << channel_ << " Pfa = " << pfa; unsigned int ncells = vector_length_ * frequency_bins; double exponent = 1 / static_cast(ncells); double val = pow(1.0-pfa,exponent); double lambda = double(vector_length_); boost::math::exponential_distribution mydist (lambda); float threshold = (float)quantile(mydist,val); return threshold; } void GalileoE1PcpsTongAmbiguousAcquisition::connect(gr::top_block_sptr top_block) { if (item_type_.compare("gr_complex") == 0) { top_block->connect(stream_to_vector_, 0, acquisition_cc_, 0); } } void GalileoE1PcpsTongAmbiguousAcquisition::disconnect(gr::top_block_sptr top_block) { if (item_type_.compare("gr_complex") == 0) { top_block->disconnect(stream_to_vector_, 0, acquisition_cc_, 0); } } gr::basic_block_sptr GalileoE1PcpsTongAmbiguousAcquisition::get_left_block() { return stream_to_vector_; } gr::basic_block_sptr GalileoE1PcpsTongAmbiguousAcquisition::get_right_block() { return acquisition_cc_; } gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/galileo_e1_pcps_tong_ambiguous_acquisition.h000066400000000000000000000107151305042567700333010ustar00rootroot00000000000000/*! * \file galileo_e1_pcps_tong_ambiguous_acquisition.h * \brief Adapts a PCPS Tong acquisition block to an AcquisitionInterface for * Galileo E1 Signals * \author Marc Molina, 2013. marc.molina.pena(at)gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_E1_PCPS_TONG_AMBIGUOUS_ACQUISITION_H_ #define GNSS_SDR_GALILEO_E1_PCPS_TONG_AMBIGUOUS_ACQUISITION_H_ #include #include #include "gnss_synchro.h" #include "acquisition_interface.h" #include "pcps_tong_acquisition_cc.h" class ConfigurationInterface; /*! * \brief Adapts a PCPS Tong acquisition block to an AcquisitionInterface * for Galileo E1 Signals */ class GalileoE1PcpsTongAmbiguousAcquisition: public AcquisitionInterface { public: GalileoE1PcpsTongAmbiguousAcquisition(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GalileoE1PcpsTongAmbiguousAcquisition(); std::string role() { return role_; } /*! * \brief Returns "Galileo_E1_PCPS_Tong_Ambiguous_Acquisition" */ std::string implementation() { return "Galileo_E1_PCPS_Tong_Ambiguous_Acquisition"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to efficiently exchange synchronization data between acquisition and * tracking blocks */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); /*! * \brief Set acquisition channel unique ID */ void set_channel(unsigned int channel); /*! * \brief Set statistics threshold of TONG algorithm */ void set_threshold(float threshold); /*! * \brief Set maximum Doppler off grid search */ void set_doppler_max(unsigned int doppler_max); /*! * \brief Set Doppler steps for the grid search */ void set_doppler_step(unsigned int doppler_step); /*! * \brief Initializes acquisition algorithm. */ void init(); /*! * \brief Sets local code for Galileo E1 TONG acquisition algorithm. */ void set_local_code(); /*! * \brief Returns the maximum peak of grid search */ signed int mag(); /*! * \brief Restart acquisition algorithm */ void reset(); /*! * \brief If state = 1, it forces the block to start acquiring from the first sample */ void set_state(int state); private: ConfigurationInterface* configuration_; pcps_tong_acquisition_cc_sptr acquisition_cc_; gr::blocks::stream_to_vector::sptr stream_to_vector_; size_t item_size_; std::string item_type_; unsigned int vector_length_; unsigned int code_length_; unsigned int channel_; float threshold_; unsigned int doppler_max_; unsigned int doppler_step_; unsigned int sampled_ms_; unsigned int tong_init_val_; unsigned int tong_max_val_; unsigned int tong_max_dwells_; long fs_in_; long if_; bool dump_; std::string dump_filename_; std::complex * code_; Gnss_Synchro * gnss_synchro_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; float calculate_threshold(float pfa); }; #endif /* GNSS_SDR_GALILEO_E1_PCPS_TONG_AMBIGUOUS_ACQUISITION_H_ */ gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/galileo_e5a_noncoherent_iq_acquisition_caf.cc000066400000000000000000000251611305042567700333620ustar00rootroot00000000000000/*! * \file galileo_e5a_noncoherent_iq_acquisition_caf.cc * \brief Adapts a PCPS acquisition block to an AcquisitionInterface for * Galileo E5a data and pilot Signals * \author Marc Sales, 2014. marcsales92(at)gmail.com * \based on work from: *
    *
  • Javier Arribas, 2011. jarribas(at)cttc.es *
  • Luis Esteve, 2012. luis(at)epsilon-formacion.com *
  • Marc Molina, 2013. marc.molina.pena@gmail.com *
* * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_e5a_noncoherent_iq_acquisition_caf.h" #include #include #include #include "galileo_e5_signal_processing.h" #include "Galileo_E5a.h" #include "configuration_interface.h" using google::LogMessage; GalileoE5aNoncoherentIQAcquisitionCaf::GalileoE5aNoncoherentIQAcquisitionCaf( ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { configuration_ = configuration; std::string default_item_type = "gr_complex"; std::string default_dump_filename = "../data/acquisition.dat"; DLOG(INFO) << "role " << role; item_type_ = configuration_->property(role + ".item_type", default_item_type); fs_in_ = configuration_->property("GNSS-SDR.internal_fs_hz", 32000000); if_ = configuration_->property(role + ".if", 0); dump_ = configuration_->property(role + ".dump", false); doppler_max_ = configuration_->property(role + ".doppler_max", 5000); CAF_window_hz_ = configuration_->property(role + ".CAF_window_hz",0); Zero_padding = configuration_->property(role + ".Zero_padding",0); sampled_ms_ = configuration_->property(role + ".coherent_integration_time_ms", 1); if (sampled_ms_ > 3) { sampled_ms_ = 3; DLOG(INFO) << "Coherent integration time should be 3 ms or less. Changing to 3ms "; std::cout << "Too high coherent integration time. Changing to 3ms" << std::endl; } if (Zero_padding > 0) { sampled_ms_ = 2; DLOG(INFO) << "Zero padding activated. Changing to 1ms code + 1ms zero padding "; std::cout << "Zero padding activated. Changing to 1ms code + 1ms zero padding" << std::endl; } max_dwells_ = configuration_->property(role + ".max_dwells", 1); dump_filename_ = configuration_->property(role + ".dump_filename", default_dump_filename); bit_transition_flag_ = configuration_->property(role + ".bit_transition_flag", false); //--- Find number of samples per spreading code (1ms)------------------------- code_length_ = round(fs_in_ / Galileo_E5a_CODE_CHIP_RATE_HZ * Galileo_E5a_CODE_LENGTH_CHIPS); vector_length_ = code_length_ * sampled_ms_; codeI_= new gr_complex[vector_length_]; codeQ_= new gr_complex[vector_length_]; both_signal_components = false; std::string sig_ = configuration_->property("Channel.signal", std::string("5X")); if (sig_.at(0) == '5' && sig_.at(1) == 'X') { both_signal_components = true; } if (item_type_.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); acquisition_cc_ = galileo_e5a_noncoherentIQ_make_acquisition_caf_cc(sampled_ms_, max_dwells_, doppler_max_, if_, fs_in_, code_length_, code_length_, bit_transition_flag_, dump_, dump_filename_, both_signal_components, CAF_window_hz_,Zero_padding); } else { item_size_ = sizeof(gr_complex); LOG(WARNING) << item_type_ << " unknown acquisition item type"; } channel_ = 0; threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = 0; } GalileoE5aNoncoherentIQAcquisitionCaf::~GalileoE5aNoncoherentIQAcquisitionCaf() { delete[] codeI_; delete[] codeQ_; } void GalileoE5aNoncoherentIQAcquisitionCaf::set_channel(unsigned int channel) { channel_ = channel; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_channel(channel_); } } void GalileoE5aNoncoherentIQAcquisitionCaf::set_threshold(float threshold) { float pfa = configuration_->property(role_+ boost::lexical_cast(channel_) + ".pfa", 0.0); if(pfa == 0.0) pfa = configuration_->property(role_ + ".pfa", 0.0); if(pfa == 0.0) { threshold_ = threshold; } else { threshold_ = calculate_threshold(pfa); } DLOG(INFO) << "Channel " << channel_ << " Threshold = " << threshold_; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_threshold(threshold_); } } void GalileoE5aNoncoherentIQAcquisitionCaf::set_doppler_max(unsigned int doppler_max) { doppler_max_ = doppler_max; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_doppler_max(doppler_max_); } } void GalileoE5aNoncoherentIQAcquisitionCaf::set_doppler_step(unsigned int doppler_step) { doppler_step_ = doppler_step; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_doppler_step(doppler_step_); } } void GalileoE5aNoncoherentIQAcquisitionCaf::set_gnss_synchro( Gnss_Synchro* gnss_synchro) { gnss_synchro_ = gnss_synchro; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_gnss_synchro(gnss_synchro_); } } signed int GalileoE5aNoncoherentIQAcquisitionCaf::mag() { if (item_type_.compare("gr_complex") == 0) { return acquisition_cc_->mag(); } else { return 0; } } void GalileoE5aNoncoherentIQAcquisitionCaf::init() { acquisition_cc_->init(); set_local_code(); } void GalileoE5aNoncoherentIQAcquisitionCaf::set_local_code() { if (item_type_.compare("gr_complex") == 0) { std::complex* codeI = new std::complex[code_length_]; std::complex* codeQ = new std::complex[code_length_]; if (gnss_synchro_->Signal[0] == '5' && gnss_synchro_->Signal[1] == 'X') { char a[3]; strcpy(a,"5I"); galileo_e5_a_code_gen_complex_sampled(codeI, a, gnss_synchro_->PRN, fs_in_, 0); strcpy(a,"5Q"); galileo_e5_a_code_gen_complex_sampled(codeQ, a, gnss_synchro_->PRN, fs_in_, 0); } else { galileo_e5_a_code_gen_complex_sampled(codeI, gnss_synchro_->Signal, gnss_synchro_->PRN, fs_in_, 0); } // WARNING: 3ms are coherently integrated. Secondary sequence (1,1,1) // is generated, and modulated in the 'block'. if (Zero_padding == 0) // if no zero_padding { for (unsigned int i = 0; i < sampled_ms_; i++) { memcpy(&(codeI_[i*code_length_]), codeI, sizeof(gr_complex)*code_length_); if (gnss_synchro_->Signal[0] == '5' && gnss_synchro_->Signal[1] == 'X') { memcpy(&(codeQ_[i*code_length_]), codeQ, sizeof(gr_complex)*code_length_); } } } else { // 1ms code + 1ms zero padding memcpy(&(codeI_[0]), codeI, sizeof(gr_complex)*code_length_); if (gnss_synchro_->Signal[0] == '5' && gnss_synchro_->Signal[1] == 'X') { memcpy(&(codeQ_[0]), codeQ, sizeof(gr_complex)*code_length_); } } acquisition_cc_->set_local_code(codeI_,codeQ_); delete[] codeI; delete[] codeQ; } } void GalileoE5aNoncoherentIQAcquisitionCaf::reset() { if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_active(true); } } float GalileoE5aNoncoherentIQAcquisitionCaf::calculate_threshold(float pfa) { //Calculate the threshold unsigned int frequency_bins = 0; for (int doppler = (int)(-doppler_max_); doppler <= (int)doppler_max_; doppler += doppler_step_) { frequency_bins++; } DLOG(INFO) << "Channel " << channel_ << " Pfa = " << pfa; unsigned int ncells = vector_length_ * frequency_bins; double exponent = 1 / static_cast(ncells); double val = pow(1.0 - pfa, exponent); double lambda = double(vector_length_); boost::math::exponential_distribution mydist (lambda); float threshold = (float)quantile(mydist,val); return threshold; } void GalileoE5aNoncoherentIQAcquisitionCaf::set_state(int state) { acquisition_cc_->set_state(state); } void GalileoE5aNoncoherentIQAcquisitionCaf::connect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to connect internally } void GalileoE5aNoncoherentIQAcquisitionCaf::disconnect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to disconnect internally } gr::basic_block_sptr GalileoE5aNoncoherentIQAcquisitionCaf::get_left_block() { return acquisition_cc_; } gr::basic_block_sptr GalileoE5aNoncoherentIQAcquisitionCaf::get_right_block() { return acquisition_cc_; } gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/galileo_e5a_noncoherent_iq_acquisition_caf.h000066400000000000000000000113661305042567700332260ustar00rootroot00000000000000/*! * \file galileo_e5a_noncoherent_iq_acquisition_caf.h * \brief Adapts a PCPS acquisition block to an AcquisitionInterface for * Galileo E5a data and pilot Signals * \author Marc Sales, 2014. marcsales92(at)gmail.com * \based on work from: *
    *
  • Javier Arribas, 2011. jarribas(at)cttc.es *
  • Luis Esteve, 2012. luis(at)epsilon-formacion.com *
  • Marc Molina, 2013. marc.molina.pena@gmail.com *
* * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 GALILEO_E5A_NONCOHERENT_IQ_ACQUISITION_CAF_H_ #define GALILEO_E5A_NONCOHERENT_IQ_ACQUISITION_CAF_H_ #include #include #include "gnss_synchro.h" #include "acquisition_interface.h" #include "galileo_e5a_noncoherent_iq_acquisition_caf_cc.h" class ConfigurationInterface; class GalileoE5aNoncoherentIQAcquisitionCaf: public AcquisitionInterface { public: GalileoE5aNoncoherentIQAcquisitionCaf(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GalileoE5aNoncoherentIQAcquisitionCaf(); std::string role() { return role_; } /*! * \brief Returns "Galileo_E5a_Noncoherent_IQ_Acquisition_CAF" */ std::string implementation() { return "Galileo_E5a_Noncoherent_IQ_Acquisition_CAF"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to efficiently exchange synchronization data between acquisition and * tracking blocks */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); /*! * \brief Set acquisition channel unique ID */ void set_channel(unsigned int channel); /*! * \brief Set statistics threshold of PCPS algorithm */ void set_threshold(float threshold); /*! * \brief Set maximum Doppler off grid search */ void set_doppler_max(unsigned int doppler_max); /*! * \brief Set Doppler steps for the grid search */ void set_doppler_step(unsigned int doppler_step); /*! * \brief Initializes acquisition algorithm. */ void init(); /*! * \brief Sets local Galileo E5a code for PCPS acquisition algorithm. */ void set_local_code(); /*! * \brief Returns the maximum peak of grid search */ signed int mag(); /*! * \brief Restart acquisition algorithm */ void reset(); /*! * \brief If set to 1, ensures that acquisition starts at the * first available sample. * \param state - int=1 forces start of acquisition */ void set_state(int state); private: ConfigurationInterface* configuration_; galileo_e5a_noncoherentIQ_acquisition_caf_cc_sptr acquisition_cc_; gr::blocks::stream_to_vector::sptr stream_to_vector_; size_t item_size_; std::string item_type_; unsigned int vector_length_; unsigned int code_length_; bool bit_transition_flag_; unsigned int channel_; float threshold_; unsigned int doppler_max_; unsigned int doppler_step_; unsigned int sampled_ms_; unsigned int max_dwells_; long fs_in_; long if_; bool dump_; std::string dump_filename_; int Zero_padding; int CAF_window_hz_; std::complex * codeI_; std::complex * codeQ_; bool both_signal_components; Gnss_Synchro * gnss_synchro_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; float calculate_threshold(float pfa); }; #endif /* GALILEO_E5A_NONCOHERENT_IQ_ACQUISITION_CAF_H_ */ gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.cc000066400000000000000000000257251305042567700301730ustar00rootroot00000000000000/*! * \file gps_l1_ca_pcps_acquisition.cc * \brief Adapts a PCPS acquisition block to an AcquisitionInterface for * GPS L1 C/A signals * \authors
    *
  • Javier Arribas, 2011. jarribas(at)cttc.es *
  • Luis Esteve, 2012. luis(at)epsilon-formacion.com *
  • Marc Molina, 2013. marc.molina.pena(at)gmail.com *
* * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l1_ca_pcps_acquisition.h" #include #include #include "gps_sdr_signal_processing.h" #include "GPS_L1_CA.h" #include "configuration_interface.h" using google::LogMessage; GpsL1CaPcpsAcquisition::GpsL1CaPcpsAcquisition( ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { configuration_ = configuration; std::string default_item_type = "gr_complex"; std::string default_dump_filename = "./data/acquisition.dat"; DLOG(INFO) << "role " << role; item_type_ = configuration_->property(role + ".item_type", default_item_type); fs_in_ = configuration_->property("GNSS-SDR.internal_fs_hz", 2048000); if_ = configuration_->property(role + ".if", 0); dump_ = configuration_->property(role + ".dump", false); doppler_max_ = configuration_->property(role + ".doppler_max", 5000); sampled_ms_ = configuration_->property(role + ".coherent_integration_time_ms", 1); bit_transition_flag_ = configuration_->property(role + ".bit_transition_flag", false); use_CFAR_algorithm_flag_=configuration_->property(role + ".use_CFAR_algorithm", true); //will be false in future versions max_dwells_ = configuration_->property(role + ".max_dwells", 1); dump_filename_ = configuration_->property(role + ".dump_filename", default_dump_filename); //--- Find number of samples per spreading code ------------------------- code_length_ = round(fs_in_ / (GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS)); vector_length_ = code_length_ * sampled_ms_; if( bit_transition_flag_ ) { vector_length_ *= 2; } code_ = new gr_complex[vector_length_]; if (item_type_.compare("cshort") == 0 ) { item_size_ = sizeof(lv_16sc_t); acquisition_sc_ = pcps_make_acquisition_sc(sampled_ms_, max_dwells_, doppler_max_, if_, fs_in_, code_length_, code_length_, bit_transition_flag_, use_CFAR_algorithm_flag_, dump_, dump_filename_); DLOG(INFO) << "acquisition(" << acquisition_sc_->unique_id() << ")"; }else{ item_size_ = sizeof(gr_complex); acquisition_cc_ = pcps_make_acquisition_cc(sampled_ms_, max_dwells_, doppler_max_, if_, fs_in_, code_length_, code_length_, bit_transition_flag_, use_CFAR_algorithm_flag_, dump_, dump_filename_); DLOG(INFO) << "acquisition(" << acquisition_cc_->unique_id() << ")"; } stream_to_vector_ = gr::blocks::stream_to_vector::make(item_size_, vector_length_); DLOG(INFO) << "stream_to_vector(" << stream_to_vector_->unique_id() << ")"; if (item_type_.compare("cbyte") == 0) { cbyte_to_float_x2_ = make_complex_byte_to_float_x2(); float_to_complex_ = gr::blocks::float_to_complex::make(); } channel_ = 0; threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = 0; } GpsL1CaPcpsAcquisition::~GpsL1CaPcpsAcquisition() { delete[] code_; } void GpsL1CaPcpsAcquisition::set_channel(unsigned int channel) { channel_ = channel; if (item_type_.compare("cshort") == 0) { acquisition_sc_->set_channel(channel_); } else { acquisition_cc_->set_channel(channel_); } } void GpsL1CaPcpsAcquisition::set_threshold(float threshold) { float pfa = configuration_->property(role_ + ".pfa", 0.0); if(pfa == 0.0) { threshold_ = threshold; } else { threshold_ = calculate_threshold(pfa); } DLOG(INFO) << "Channel " << channel_ << " Threshold = " << threshold_; if (item_type_.compare("cshort") == 0) { acquisition_sc_->set_threshold(threshold_); } else { acquisition_cc_->set_threshold(threshold_); } } void GpsL1CaPcpsAcquisition::set_doppler_max(unsigned int doppler_max) { doppler_max_ = doppler_max; if (item_type_.compare("cshort") == 0) { acquisition_sc_->set_doppler_max(doppler_max_); } else { acquisition_cc_->set_doppler_max(doppler_max_); } } void GpsL1CaPcpsAcquisition::set_doppler_step(unsigned int doppler_step) { doppler_step_ = doppler_step; if (item_type_.compare("cshort") == 0) { acquisition_sc_->set_doppler_step(doppler_step_); } else { acquisition_cc_->set_doppler_step(doppler_step_); } } void GpsL1CaPcpsAcquisition::set_gnss_synchro(Gnss_Synchro* gnss_synchro) { gnss_synchro_ = gnss_synchro; if (item_type_.compare("cshort") == 0) { acquisition_sc_->set_gnss_synchro(gnss_synchro_); } else { acquisition_cc_->set_gnss_synchro(gnss_synchro_); } } signed int GpsL1CaPcpsAcquisition::mag() { if (item_type_.compare("cshort") == 0) { return acquisition_sc_->mag(); } else { return acquisition_cc_->mag(); } } void GpsL1CaPcpsAcquisition::init() { if (item_type_.compare("cshort") == 0) { acquisition_sc_->init(); } else { acquisition_cc_->init(); } set_local_code(); } void GpsL1CaPcpsAcquisition::set_local_code() { std::complex* code = new std::complex[code_length_]; gps_l1_ca_code_gen_complex_sampled(code, gnss_synchro_->PRN, fs_in_, 0); for (unsigned int i = 0; i < sampled_ms_; i++) { memcpy(&(code_[i*code_length_]), code, sizeof(gr_complex)*code_length_); } if (item_type_.compare("cshort") == 0) { acquisition_sc_->set_local_code(code_); } else { acquisition_cc_->set_local_code(code_); } delete[] code; } void GpsL1CaPcpsAcquisition::reset() { if (item_type_.compare("cshort") == 0) { acquisition_sc_->set_active(true); } else { acquisition_cc_->set_active(true); } } void GpsL1CaPcpsAcquisition::set_state(int state) { if (item_type_.compare("cshort") == 0) { acquisition_sc_->set_state(state); } else { acquisition_cc_->set_state(state); } } float GpsL1CaPcpsAcquisition::calculate_threshold(float pfa) { //Calculate the threshold unsigned int frequency_bins = 0; for (int doppler = (int)(-doppler_max_); doppler <= (int)doppler_max_; doppler += doppler_step_) { frequency_bins++; } DLOG(INFO) << "Channel " << channel_ << " Pfa = " << pfa; unsigned int ncells = vector_length_ * frequency_bins; double exponent = 1 / static_cast(ncells); double val = pow(1.0 - pfa, exponent); double lambda = double(vector_length_); boost::math::exponential_distribution mydist (lambda); float threshold = (float)quantile(mydist,val); return threshold; } void GpsL1CaPcpsAcquisition::connect(gr::top_block_sptr top_block) { if (item_type_.compare("gr_complex") == 0) { top_block->connect(stream_to_vector_, 0, acquisition_cc_, 0); } else if (item_type_.compare("cshort") == 0) { top_block->connect(stream_to_vector_, 0, acquisition_sc_, 0); } else if (item_type_.compare("cbyte") == 0) { top_block->connect(cbyte_to_float_x2_, 0, float_to_complex_, 0); top_block->connect(cbyte_to_float_x2_, 1, float_to_complex_, 1); top_block->connect(float_to_complex_, 0, stream_to_vector_, 0); top_block->connect(stream_to_vector_, 0, acquisition_cc_, 0); } else { LOG(WARNING) << item_type_ << " unknown acquisition item type"; } } void GpsL1CaPcpsAcquisition::disconnect(gr::top_block_sptr top_block) { if (item_type_.compare("gr_complex") == 0) { top_block->disconnect(stream_to_vector_, 0, acquisition_cc_, 0); } else if (item_type_.compare("cshort") == 0) { top_block->disconnect(stream_to_vector_, 0, acquisition_sc_, 0); } else if (item_type_.compare("cbyte") == 0) { // Since a byte-based acq implementation is not available, // we just convert cshorts to gr_complex top_block->disconnect(cbyte_to_float_x2_, 0, float_to_complex_, 0); top_block->disconnect(cbyte_to_float_x2_, 1, float_to_complex_, 1); top_block->disconnect(float_to_complex_, 0, stream_to_vector_, 0); top_block->disconnect(stream_to_vector_, 0, acquisition_cc_, 0); } else { LOG(WARNING) << item_type_ << " unknown acquisition item type"; } } gr::basic_block_sptr GpsL1CaPcpsAcquisition::get_left_block() { if (item_type_.compare("gr_complex") == 0) { return stream_to_vector_; } else if (item_type_.compare("cshort") == 0) { return stream_to_vector_; } else if (item_type_.compare("cbyte") == 0) { return cbyte_to_float_x2_; } else { LOG(WARNING) << item_type_ << " unknown acquisition item type"; return nullptr; } } gr::basic_block_sptr GpsL1CaPcpsAcquisition::get_right_block() { if (item_type_.compare("cshort") == 0) { return acquisition_sc_; } else { return acquisition_cc_; } } gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h000066400000000000000000000114241305042567700300240ustar00rootroot00000000000000/*! * \file gps_l1_ca_pcps_acquisition.h * \brief Adapts a PCPS acquisition block to an AcquisitionInterface for * GPS L1 C/A signals * \authors
    *
  • Javier Arribas, 2011. jarribas(at)cttc.es *
  • Luis Esteve, 2012. luis(at)epsilon-formacion.com *
  • Marc Molina, 2013. marc.molina.pena(at)gmail.com *
* * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L1_CA_PCPS_ACQUISITION_H_ #define GNSS_SDR_GPS_L1_CA_PCPS_ACQUISITION_H_ #include #include #include #include "gnss_synchro.h" #include "acquisition_interface.h" #include "pcps_acquisition_cc.h" #include "pcps_acquisition_sc.h" #include "complex_byte_to_float_x2.h" #include class ConfigurationInterface; /*! * \brief This class adapts a PCPS acquisition block to an AcquisitionInterface * for GPS L1 C/A signals */ class GpsL1CaPcpsAcquisition: public AcquisitionInterface { public: GpsL1CaPcpsAcquisition(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GpsL1CaPcpsAcquisition(); std::string role() { return role_; } /*! * \brief Returns "GPS_L1_CA_PCPS_Acquisition" */ std::string implementation() { return "GPS_L1_CA_PCPS_Acquisition"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to efficiently exchange synchronization data between acquisition and * tracking blocks */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); /*! * \brief Set acquisition channel unique ID */ void set_channel(unsigned int channel); /*! * \brief Set statistics threshold of PCPS algorithm */ void set_threshold(float threshold); /*! * \brief Set maximum Doppler off grid search */ void set_doppler_max(unsigned int doppler_max); /*! * \brief Set Doppler steps for the grid search */ void set_doppler_step(unsigned int doppler_step); /*! * \brief Initializes acquisition algorithm. */ void init(); /*! * \brief Sets local code for GPS L1/CA PCPS acquisition algorithm. */ void set_local_code(); /*! * \brief Returns the maximum peak of grid search */ signed int mag(); /*! * \brief Restart acquisition algorithm */ void reset(); /*! * \brief If state = 1, it forces the block to start acquiring from the first sample */ void set_state(int state); private: ConfigurationInterface* configuration_; pcps_acquisition_cc_sptr acquisition_cc_; pcps_acquisition_sc_sptr acquisition_sc_; gr::blocks::stream_to_vector::sptr stream_to_vector_; gr::blocks::float_to_complex::sptr float_to_complex_; complex_byte_to_float_x2_sptr cbyte_to_float_x2_; size_t item_size_; std::string item_type_; unsigned int vector_length_; unsigned int code_length_; bool bit_transition_flag_; bool use_CFAR_algorithm_flag_; unsigned int channel_; float threshold_; unsigned int doppler_max_; unsigned int doppler_step_; unsigned int sampled_ms_; unsigned int max_dwells_; long fs_in_; long if_; bool dump_; std::string dump_filename_; std::complex * code_; Gnss_Synchro * gnss_synchro_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; float calculate_threshold(float pfa); }; #endif /* GNSS_SDR_GPS_L1_CA_PCPS_ACQUISITION_H_ */ gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fine_doppler.cc000066400000000000000000000125421305042567700327120ustar00rootroot00000000000000/*! * \file gps_l1_ca_pcps_acquisition.cc * \brief Adapts a PCPS acquisition block to an AcquisitionInterface for * GPS L1 C/A Signals * \authors
    *
  • Javier Arribas, 2011. jarribas(at)cttc.es *
  • Luis Esteve, 2012. luis(at)epsilon-formacion.com *
* * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l1_ca_pcps_acquisition_fine_doppler.h" #include #include "gps_sdr_signal_processing.h" #include "GPS_L1_CA.h" #include "configuration_interface.h" using google::LogMessage; GpsL1CaPcpsAcquisitionFineDoppler::GpsL1CaPcpsAcquisitionFineDoppler( ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { std::string default_item_type = "gr_complex"; std::string default_dump_filename = "./data/acquisition.dat"; DLOG(INFO) << "role " << role; item_type_ = configuration->property(role + ".item_type", default_item_type); fs_in_ = configuration->property("GNSS-SDR.internal_fs_hz", 2048000); if_ = configuration->property(role + ".if", 0); dump_ = configuration->property(role + ".dump", false); dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename); doppler_max_ = configuration->property(role + ".doppler_max", 5000); doppler_min_ = configuration->property(role + ".doppler_min", -5000); sampled_ms_ = configuration->property(role + ".coherent_integration_time_ms", 1); max_dwells_= configuration->property(role + ".max_dwells", 1); //--- Find number of samples per spreading code ------------------------- vector_length_ = round(fs_in_ / (GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS)); code_ = new gr_complex[vector_length_]; if (item_type_.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); acquisition_cc_ = pcps_make_acquisition_fine_doppler_cc(max_dwells_,sampled_ms_, doppler_max_, doppler_min_, if_, fs_in_, vector_length_, dump_, dump_filename_); } else { item_size_ = sizeof(gr_complex); LOG(WARNING) << item_type_ << " unknown acquisition item type"; } channel_ = 0; threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = 0; } GpsL1CaPcpsAcquisitionFineDoppler::~GpsL1CaPcpsAcquisitionFineDoppler() { delete[] code_; } void GpsL1CaPcpsAcquisitionFineDoppler::set_channel(unsigned int channel) { channel_ = channel; acquisition_cc_->set_channel(channel_); } void GpsL1CaPcpsAcquisitionFineDoppler::set_threshold(float threshold) { threshold_ = threshold; acquisition_cc_->set_threshold(threshold_); } void GpsL1CaPcpsAcquisitionFineDoppler::set_doppler_max(unsigned int doppler_max) { doppler_max_ = doppler_max; acquisition_cc_->set_doppler_max(doppler_max_); } void GpsL1CaPcpsAcquisitionFineDoppler::set_doppler_step(unsigned int doppler_step) { doppler_step_ = doppler_step; acquisition_cc_->set_doppler_step(doppler_step_); } void GpsL1CaPcpsAcquisitionFineDoppler::set_gnss_synchro(Gnss_Synchro* gnss_synchro) { gnss_synchro_ = gnss_synchro; acquisition_cc_->set_gnss_synchro(gnss_synchro_); } signed int GpsL1CaPcpsAcquisitionFineDoppler::mag() { return acquisition_cc_->mag(); } void GpsL1CaPcpsAcquisitionFineDoppler::init() { acquisition_cc_->init(); set_local_code(); } void GpsL1CaPcpsAcquisitionFineDoppler::set_local_code() { gps_l1_ca_code_gen_complex_sampled(code_, gnss_synchro_->PRN, fs_in_, 0); acquisition_cc_->set_local_code(code_); } void GpsL1CaPcpsAcquisitionFineDoppler::reset() { acquisition_cc_->set_active(true); } void GpsL1CaPcpsAcquisitionFineDoppler::connect(boost::shared_ptr top_block) { if(top_block) { /* top_block is not null */}; //nothing to disconnect, now the tracking uses gr_sync_decimator } void GpsL1CaPcpsAcquisitionFineDoppler::disconnect(boost::shared_ptr top_block) { if(top_block) { /* top_block is not null */}; //nothing to disconnect, now the tracking uses gr_sync_decimator } boost::shared_ptr GpsL1CaPcpsAcquisitionFineDoppler::get_left_block() { return acquisition_cc_; } boost::shared_ptr GpsL1CaPcpsAcquisitionFineDoppler::get_right_block() { return acquisition_cc_; } gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fine_doppler.h000066400000000000000000000101261305042567700325500ustar00rootroot00000000000000/*! * \file gps_l1_ca_pcps_acquisition_fine_doppler.h * \brief Adapts a PCPS acquisition block with fine Doppler estimation to an AcquisitionInterface for * GPS L1 C/A signals * \authors
    *
  • Javier Arribas, 2013. jarribas(at)cttc.es *
* * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L1_CA_PCPS_ACQUISITION_FINE_DOPPLER_H_ #define GNSS_SDR_GPS_L1_CA_PCPS_ACQUISITION_FINE_DOPPLER_H_ #include #include "gnss_synchro.h" #include "acquisition_interface.h" #include "pcps_acquisition_fine_doppler_cc.h" class ConfigurationInterface; /*! * \brief This class Adapts a PCPS acquisition block with fine Doppler estimation to an AcquisitionInterface for * GPS L1 C/A signals */ class GpsL1CaPcpsAcquisitionFineDoppler: public AcquisitionInterface { public: GpsL1CaPcpsAcquisitionFineDoppler(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GpsL1CaPcpsAcquisitionFineDoppler(); std::string role() { return role_; } /*! * \brief Returns "GPS_L1_CA_PCPS_Acquisition_Fine_Doppler" */ std::string implementation() { return "GPS_L1_CA_PCPS_Acquisition_Fine_Doppler"; } size_t item_size() { return item_size_; } void connect(boost::shared_ptr top_block); void disconnect(boost::shared_ptr top_block); boost::shared_ptr get_left_block(); boost::shared_ptr get_right_block(); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to efficiently exchange synchronization data between acquisition and * tracking blocks */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); /*! * \brief Set acquisition channel unique ID */ void set_channel(unsigned int channel); /*! * \brief Set statistics threshold of PCPS algorithm */ void set_threshold(float threshold); /*! * \brief Set maximum Doppler off grid search */ void set_doppler_max(unsigned int doppler_max); /*! * \brief Set Doppler steps for the grid search */ void set_doppler_step(unsigned int doppler_step); /*! * \brief Initializes acquisition algorithm. */ void init(); void set_local_code(); /*! * \brief Returns the maximum peak of grid search */ signed int mag(); /*! * \brief Restart acquisition algorithm */ void reset(); private: pcps_acquisition_fine_doppler_cc_sptr acquisition_cc_; size_t item_size_; std::string item_type_; unsigned int vector_length_; unsigned int channel_; float threshold_; int doppler_max_; unsigned int doppler_step_; int doppler_min_; unsigned int sampled_ms_; int max_dwells_; long fs_in_; long if_; bool dump_; std::string dump_filename_; std::complex * code_; Gnss_Synchro * gnss_synchro_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; }; #endif /* GNSS_SDR_GPS_L1_CA_PCPS_ACQUISITION_FINE_DOPPLER_H_ */ gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_assisted_acquisition.cc000066400000000000000000000123561305042567700320660ustar00rootroot00000000000000/*! * \file gps_l1_ca_pcps_acquisition.cc * \brief Adapts a PCPS acquisition block to an AcquisitionInterface for * GPS L1 C/A Signals * \authors
    *
  • Javier Arribas, 2011. jarribas(at)cttc.es *
  • Luis Esteve, 2012. luis(at)epsilon-formacion.com *
* * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l1_ca_pcps_assisted_acquisition.h" #include #include "gps_sdr_signal_processing.h" #include "GPS_L1_CA.h" #include "configuration_interface.h" using google::LogMessage; GpsL1CaPcpsAssistedAcquisition::GpsL1CaPcpsAssistedAcquisition( ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { std::string default_item_type = "gr_complex"; std::string default_dump_filename = "./data/acquisition.dat"; DLOG(INFO) << "role " << role; item_type_ = configuration->property(role + ".item_type", default_item_type); fs_in_ = configuration->property("GNSS-SDR.internal_fs_hz", 2048000); if_ = configuration->property(role + ".if", 0); dump_ = configuration->property(role + ".dump", false); doppler_max_ = configuration->property(role + ".doppler_max", 5000); doppler_min_ = configuration->property(role + ".doppler_min", -5000); sampled_ms_ = configuration->property(role + ".coherent_integration_time_ms", 1); max_dwells_= configuration->property(role + ".max_dwells", 1); dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename); //--- Find number of samples per spreading code ------------------------- vector_length_ = round(fs_in_ / (GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS)); code_ = new gr_complex[vector_length_]; if (item_type_.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); acquisition_cc_ = pcps_make_assisted_acquisition_cc(max_dwells_, sampled_ms_, doppler_max_, doppler_min_, if_, fs_in_, vector_length_, dump_, dump_filename_); } else { item_size_ = sizeof(gr_complex); LOG(WARNING) << item_type_ << " unknown acquisition item type"; } channel_ = 0; threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = 0; } GpsL1CaPcpsAssistedAcquisition::~GpsL1CaPcpsAssistedAcquisition() { delete[] code_; } void GpsL1CaPcpsAssistedAcquisition::set_channel(unsigned int channel) { channel_ = channel; acquisition_cc_->set_channel(channel_); } void GpsL1CaPcpsAssistedAcquisition::set_threshold(float threshold) { threshold_ = threshold; acquisition_cc_->set_threshold(threshold_); } void GpsL1CaPcpsAssistedAcquisition::set_doppler_max(unsigned int doppler_max) { doppler_max_ = doppler_max; acquisition_cc_->set_doppler_max(doppler_max_); } void GpsL1CaPcpsAssistedAcquisition::set_doppler_step(unsigned int doppler_step) { doppler_step_ = doppler_step; acquisition_cc_->set_doppler_step(doppler_step_); } void GpsL1CaPcpsAssistedAcquisition::set_gnss_synchro(Gnss_Synchro* gnss_synchro) { gnss_synchro_ = gnss_synchro; acquisition_cc_->set_gnss_synchro(gnss_synchro_); } signed int GpsL1CaPcpsAssistedAcquisition::mag() { return acquisition_cc_->mag(); } void GpsL1CaPcpsAssistedAcquisition::init() { acquisition_cc_->init(); set_local_code(); } void GpsL1CaPcpsAssistedAcquisition::set_local_code() { gps_l1_ca_code_gen_complex_sampled(code_, gnss_synchro_->PRN, fs_in_, 0); acquisition_cc_->set_local_code(code_); } void GpsL1CaPcpsAssistedAcquisition::reset() { acquisition_cc_->set_active(true); } void GpsL1CaPcpsAssistedAcquisition::connect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; //nothing to disconnect, now the tracking uses gr_sync_decimator } void GpsL1CaPcpsAssistedAcquisition::disconnect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; //nothing to disconnect, now the tracking uses gr_sync_decimator } gr::basic_block_sptr GpsL1CaPcpsAssistedAcquisition::get_left_block() { return acquisition_cc_; } gr::basic_block_sptr GpsL1CaPcpsAssistedAcquisition::get_right_block() { return acquisition_cc_; } gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_assisted_acquisition.h000066400000000000000000000077431305042567700317340ustar00rootroot00000000000000/*! * \file gps_l1_ca_pcps_assisted_acquisition.h * \brief Adapts a PCPS Assisted acquisition block to an AcquisitionInterface for * GPS L1 C/A signals * \authors
    *
  • Javier Arribas, 2011. jarribas(at)cttc.es *
* * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L1_CA_PCPS_ASSISTED_ACQUISITION_H_ #define GNSS_SDR_GPS_L1_CA_PCPS_ASSISTED_ACQUISITION_H_ #include #include "gnss_synchro.h" #include "acquisition_interface.h" #include "pcps_assisted_acquisition_cc.h" class ConfigurationInterface; /*! * \brief This class adapts a PCPS acquisition block to an AcquisitionInterface * for GPS L1 C/A signals */ class GpsL1CaPcpsAssistedAcquisition: public AcquisitionInterface { public: GpsL1CaPcpsAssistedAcquisition(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GpsL1CaPcpsAssistedAcquisition(); std::string role() { return role_; } /*! * \brief Returns "GPS_L1_CA_PCPS_Assisted_Acquisition" */ std::string implementation() { return "GPS_L1_CA_PCPS_Assisted_Acquisition"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to efficiently exchange synchronization data between acquisition and * tracking blocks */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); /*! * \brief Set acquisition channel unique ID */ void set_channel(unsigned int channel); /*! * \brief Set statistics threshold of PCPS algorithm */ void set_threshold(float threshold); /*! * \brief Set maximum Doppler off grid search */ void set_doppler_max(unsigned int doppler_max); /*! * \brief Set Doppler steps for the grid search */ void set_doppler_step(unsigned int doppler_step); /*! * \brief Initializes acquisition algorithm. */ void init(); void set_local_code(); /*! * \brief Returns the maximum peak of grid search */ signed int mag(); /*! * \brief Restart acquisition algorithm */ void reset(); private: pcps_assisted_acquisition_cc_sptr acquisition_cc_; size_t item_size_; std::string item_type_; unsigned int vector_length_; //unsigned int satellite_; unsigned int channel_; float threshold_; int doppler_max_; unsigned int doppler_step_; int doppler_min_; unsigned int sampled_ms_; int max_dwells_; long fs_in_; long if_; bool dump_; std::string dump_filename_; std::complex * code_; Gnss_Synchro * gnss_synchro_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; }; #endif /* GNSS_SDR_GPS_L1_CA_PCPS_ASSISTED_ACQUISITION_H_ */ gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_multithread_acquisition.cc000066400000000000000000000177141305042567700325740ustar00rootroot00000000000000/*! * \file gps_l1_ca_pcps_multithread_acquisition.cc * \brief Adapts a multithread PCPS acquisition block to an * AcquisitionInterface for GPS L1 C/A signals * \author Marc Molina, 2013. marc.molina.pena(at)gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l1_ca_pcps_multithread_acquisition.h" #include #include #include "gps_sdr_signal_processing.h" #include "GPS_L1_CA.h" #include "configuration_interface.h" using google::LogMessage; GpsL1CaPcpsMultithreadAcquisition::GpsL1CaPcpsMultithreadAcquisition( ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { configuration_ = configuration; std::string default_item_type = "gr_complex"; std::string default_dump_filename = "./data/acquisition.dat"; DLOG(INFO) << "role " << role; item_type_ = configuration_->property(role + ".item_type", default_item_type); fs_in_ = configuration_->property("GNSS-SDR.internal_fs_hz", 2048000); if_ = configuration_->property(role + ".if", 0); dump_ = configuration_->property(role + ".dump", false); doppler_max_ = configuration->property(role + ".doppler_max", 5000); sampled_ms_ = configuration_->property(role + ".coherent_integration_time_ms", 1); bit_transition_flag_ = configuration_->property("Acquisition.bit_transition_flag", false); if (!bit_transition_flag_) { max_dwells_ = configuration_->property(role + ".max_dwells", 1); } else { max_dwells_ = 2; } dump_filename_ = configuration_->property(role + ".dump_filename", default_dump_filename); //--- Find number of samples per spreading code ------------------------- code_length_ = round(fs_in_ / (GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS)); vector_length_ = code_length_ * sampled_ms_; code_ = new gr_complex[vector_length_]; if (item_type_.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); acquisition_cc_ = pcps_make_multithread_acquisition_cc(sampled_ms_, max_dwells_, doppler_max_, if_, fs_in_, code_length_, code_length_, bit_transition_flag_, dump_, dump_filename_); stream_to_vector_ = gr::blocks::stream_to_vector::make(item_size_, vector_length_); DLOG(INFO) << "stream_to_vector(" << stream_to_vector_->unique_id() << ")"; DLOG(INFO) << "acquisition(" << acquisition_cc_->unique_id() << ")"; } else { item_size_ = sizeof(gr_complex); LOG(WARNING) << item_type_ << " unknown acquisition item type"; } channel_ = 0; threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = 0; } GpsL1CaPcpsMultithreadAcquisition::~GpsL1CaPcpsMultithreadAcquisition() { delete[] code_; } void GpsL1CaPcpsMultithreadAcquisition::set_channel(unsigned int channel) { channel_ = channel; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_channel(channel_); } } void GpsL1CaPcpsMultithreadAcquisition::set_threshold(float threshold) { float pfa = configuration_->property(role_ + boost::lexical_cast(channel_) + ".pfa", 0.0); if(pfa == 0.0) { pfa = configuration_->property(role_+".pfa", 0.0); } if(pfa == 0.0) { threshold_ = threshold; } else { threshold_ = calculate_threshold(pfa); } DLOG(INFO) << "Channel " << channel_ << " Threshold = " << threshold_; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_threshold(threshold_); } } void GpsL1CaPcpsMultithreadAcquisition::set_doppler_max(unsigned int doppler_max) { doppler_max_ = doppler_max; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_doppler_max(doppler_max_); } } void GpsL1CaPcpsMultithreadAcquisition::set_doppler_step(unsigned int doppler_step) { doppler_step_ = doppler_step; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_doppler_step(doppler_step_); } } void GpsL1CaPcpsMultithreadAcquisition::set_gnss_synchro(Gnss_Synchro* gnss_synchro) { gnss_synchro_ = gnss_synchro; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_gnss_synchro(gnss_synchro_); } } signed int GpsL1CaPcpsMultithreadAcquisition::mag() { if (item_type_.compare("gr_complex") == 0) { return acquisition_cc_->mag(); } else { return 0; } } void GpsL1CaPcpsMultithreadAcquisition::init() { acquisition_cc_->init(); set_local_code(); } void GpsL1CaPcpsMultithreadAcquisition::set_local_code() { if (item_type_.compare("gr_complex") == 0) { std::complex* code = new std::complex[code_length_]; gps_l1_ca_code_gen_complex_sampled(code, gnss_synchro_->PRN, fs_in_, 0); for (unsigned int i = 0; i < sampled_ms_; i++) { memcpy(&(code_[i*code_length_]), code, sizeof(gr_complex)*code_length_); } acquisition_cc_->set_local_code(code_); delete[] code; } } void GpsL1CaPcpsMultithreadAcquisition::reset() { if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_active(true); } } float GpsL1CaPcpsMultithreadAcquisition::calculate_threshold(float pfa) { //Calculate the threshold unsigned int frequency_bins = 0; for (int doppler = (int)(-doppler_max_); doppler <= (int)doppler_max_; doppler += doppler_step_) { frequency_bins++; } DLOG(INFO) << "Channel "<< channel_ << " Pfa = " << pfa; unsigned int ncells = vector_length_ * frequency_bins; double exponent = 1 / static_cast(ncells); double val = pow(1.0 - pfa, exponent); double lambda = double(vector_length_); boost::math::exponential_distribution mydist (lambda); float threshold = (float)quantile(mydist,val); return threshold; } void GpsL1CaPcpsMultithreadAcquisition::connect(gr::top_block_sptr top_block) { if (item_type_.compare("gr_complex") == 0) { top_block->connect(stream_to_vector_, 0, acquisition_cc_, 0); } } void GpsL1CaPcpsMultithreadAcquisition::disconnect(gr::top_block_sptr top_block) { if (item_type_.compare("gr_complex") == 0) { top_block->disconnect(stream_to_vector_, 0, acquisition_cc_, 0); } } gr::basic_block_sptr GpsL1CaPcpsMultithreadAcquisition::get_left_block() { return stream_to_vector_; } gr::basic_block_sptr GpsL1CaPcpsMultithreadAcquisition::get_right_block() { return acquisition_cc_; } gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_multithread_acquisition.h000066400000000000000000000104411305042567700324240ustar00rootroot00000000000000/*! * \file gps_l1_ca_pcps_multithread_acquisition.h * \brief Adapts a multithread PCPS acquisition block to an * AcquisitionInterface for GPS L1 C/A signals * \author Marc Molina, 2013. marc.molina.pena(at)gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L1_CA_PCPS_MULTITHREAD_ACQUISITION_H_ #define GNSS_SDR_GPS_L1_CA_PCPS_MULTITHREAD_ACQUISITION_H_ #include #include #include "gnss_synchro.h" #include "acquisition_interface.h" #include "pcps_multithread_acquisition_cc.h" class ConfigurationInterface; /*! * \brief This class adapts a multithread PCPS acquisition block to an * AcquisitionInterface for GPS L1 C/A signals */ class GpsL1CaPcpsMultithreadAcquisition: public AcquisitionInterface { public: GpsL1CaPcpsMultithreadAcquisition(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GpsL1CaPcpsMultithreadAcquisition(); std::string role() { return role_; } /*! * \brief Returns "GPS_L1_CA_PCPS_Multithread_Acquisition" */ std::string implementation() { return "GPS_L1_CA_PCPS_Multithread_Acquisition"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to efficiently exchange synchronization data between acquisition and * tracking blocks */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); /*! * \brief Set acquisition channel unique ID */ void set_channel(unsigned int channel); /*! * \brief Set statistics threshold of PCPS algorithm */ void set_threshold(float threshold); /*! * \brief Set maximum Doppler off grid search */ void set_doppler_max(unsigned int doppler_max); /*! * \brief Set Doppler steps for the grid search */ void set_doppler_step(unsigned int doppler_step); /*! * \brief Initializes acquisition algorithm. */ void init(); /*! * \brief Sets local code for GPS L1/CA PCPS acquisition algorithm. */ void set_local_code(); /*! * \brief Returns the maximum peak of grid search */ signed int mag(); /*! * \brief Restart acquisition algorithm */ void reset(); private: ConfigurationInterface* configuration_; pcps_multithread_acquisition_cc_sptr acquisition_cc_; gr::blocks::stream_to_vector::sptr stream_to_vector_; size_t item_size_; std::string item_type_; unsigned int vector_length_; unsigned int code_length_; bool bit_transition_flag_; unsigned int channel_; float threshold_; unsigned int doppler_max_; unsigned int doppler_step_; unsigned int sampled_ms_; unsigned int max_dwells_; long fs_in_; long if_; bool dump_; std::string dump_filename_; std::complex * code_; Gnss_Synchro * gnss_synchro_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; float calculate_threshold(float pfa); }; #endif /* GNSS_SDR_GPS_L1_CA_PCPS_MULTITHREAD_ACQUISITION_H_ */ gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_opencl_acquisition.cc000066400000000000000000000174601305042567700315300ustar00rootroot00000000000000/*! * \file gps_l1_ca_pcps_opencl_acquisition.cc * \brief Adapts an OpenCL PCPS acquisition block to an * AcquisitionInterface for GPS L1 C/A signals * \author Marc Molina, 2013. marc.molina.pena(at)gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l1_ca_pcps_opencl_acquisition.h" #include #include #include "gps_sdr_signal_processing.h" #include "GPS_L1_CA.h" #include "configuration_interface.h" using google::LogMessage; GpsL1CaPcpsOpenClAcquisition::GpsL1CaPcpsOpenClAcquisition( ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { configuration_ = configuration; std::string default_item_type = "gr_complex"; std::string default_dump_filename = "./data/acquisition.dat"; DLOG(INFO) << "role " << role; item_type_ = configuration_->property(role + ".item_type", default_item_type); fs_in_ = configuration_->property("GNSS-SDR.internal_fs_hz", 2048000); if_ = configuration_->property(role + ".if", 0); dump_ = configuration_->property(role + ".dump", false); doppler_max_ = configuration->property(role + ".doppler_max", 5000); sampled_ms_ = configuration_->property(role + ".coherent_integration_time_ms", 1); bit_transition_flag_ = configuration_->property("Acquisition.bit_transition_flag", false); if (!bit_transition_flag_) { max_dwells_ = configuration_->property(role + ".max_dwells", 1); } else { max_dwells_ = 2; } dump_filename_ = configuration_->property(role + ".dump_filename", default_dump_filename); //--- Find number of samples per spreading code ------------------------- code_length_ = round(fs_in_ / (GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS)); vector_length_ = code_length_ * sampled_ms_; code_ = new gr_complex[vector_length_]; if (item_type_.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); acquisition_cc_ = pcps_make_opencl_acquisition_cc(sampled_ms_, max_dwells_, doppler_max_, if_, fs_in_, code_length_, code_length_, bit_transition_flag_, dump_, dump_filename_); stream_to_vector_ = gr::blocks::stream_to_vector::make(item_size_, vector_length_); DLOG(INFO) << "stream_to_vector(" << stream_to_vector_->unique_id() << ")"; DLOG(INFO) << "acquisition(" << acquisition_cc_->unique_id() << ")"; } else { item_size_ = sizeof(gr_complex); LOG(WARNING) << item_type_ << " unknown acquisition item type"; } channel_ = 0; threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = 0; } GpsL1CaPcpsOpenClAcquisition::~GpsL1CaPcpsOpenClAcquisition() { delete[] code_; } void GpsL1CaPcpsOpenClAcquisition::set_channel(unsigned int channel) { channel_ = channel; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_channel(channel_); } } void GpsL1CaPcpsOpenClAcquisition::set_threshold(float threshold) { float pfa = configuration_->property(role_ + boost::lexical_cast(channel_) + ".pfa", 0.0); if(pfa == 0.0) { pfa = configuration_->property(role_ + ".pfa", 0.0); } if(pfa == 0.0) { threshold_ = threshold; } else { threshold_ = calculate_threshold(pfa); } DLOG(INFO) << "Channel " << channel_ << " Threshold = " << threshold_; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_threshold(threshold_); } } void GpsL1CaPcpsOpenClAcquisition::set_doppler_max(unsigned int doppler_max) { doppler_max_ = doppler_max; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_doppler_max(doppler_max_); } } void GpsL1CaPcpsOpenClAcquisition::set_doppler_step(unsigned int doppler_step) { doppler_step_ = doppler_step; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_doppler_step(doppler_step_); } } void GpsL1CaPcpsOpenClAcquisition::set_gnss_synchro(Gnss_Synchro* gnss_synchro) { gnss_synchro_ = gnss_synchro; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_gnss_synchro(gnss_synchro_); } } signed int GpsL1CaPcpsOpenClAcquisition::mag() { if (item_type_.compare("gr_complex") == 0) { return acquisition_cc_->mag(); } else { return 0; } } void GpsL1CaPcpsOpenClAcquisition::init() { acquisition_cc_->init(); set_local_code(); } void GpsL1CaPcpsOpenClAcquisition::set_local_code() { if (item_type_.compare("gr_complex") == 0) { std::complex* code = new std::complex[code_length_]; gps_l1_ca_code_gen_complex_sampled(code, gnss_synchro_->PRN, fs_in_, 0); for (unsigned int i = 0; i < sampled_ms_; i++) { memcpy(&(code_[i*code_length_]), code, sizeof(gr_complex)*code_length_); } acquisition_cc_->set_local_code(code_); delete[] code; } } void GpsL1CaPcpsOpenClAcquisition::reset() { if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_active(true); } } float GpsL1CaPcpsOpenClAcquisition::calculate_threshold(float pfa) { //Calculate the threshold unsigned int frequency_bins = 0; for (int doppler = (int)(-doppler_max_); doppler <= (int)doppler_max_; doppler += doppler_step_) { frequency_bins++; } DLOG(INFO) << "Channel " << channel_ << " Pfa = " << pfa; unsigned int ncells = vector_length_ * frequency_bins; double exponent = 1 / static_cast(ncells); double val = pow(1.0 - pfa, exponent); double lambda = double(vector_length_); boost::math::exponential_distribution mydist (lambda); float threshold = (float)quantile(mydist,val); return threshold; } void GpsL1CaPcpsOpenClAcquisition::connect(gr::top_block_sptr top_block) { if (item_type_.compare("gr_complex") == 0) { top_block->connect(stream_to_vector_, 0, acquisition_cc_, 0); } } void GpsL1CaPcpsOpenClAcquisition::disconnect(gr::top_block_sptr top_block) { if (item_type_.compare("gr_complex") == 0) { top_block->disconnect(stream_to_vector_, 0, acquisition_cc_, 0); } } gr::basic_block_sptr GpsL1CaPcpsOpenClAcquisition::get_left_block() { return stream_to_vector_; } gr::basic_block_sptr GpsL1CaPcpsOpenClAcquisition::get_right_block() { return acquisition_cc_; } gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_opencl_acquisition.h000066400000000000000000000103421305042567700313620ustar00rootroot00000000000000/*! * \file gps_l1_ca_pcps_opencl_acquisition.h * \brief Adapts an OpenCL PCPS acquisition block to an * AcquisitionInterface for GPS L1 C/A signals * \author Marc Molina, 2013. marc.molina.pena(at)gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L1_CA_PCPS_OPENCL_ACQUISITION_H_ #define GNSS_SDR_GPS_L1_CA_PCPS_OPENCL_ACQUISITION_H_ #include #include #include "gnss_synchro.h" #include "acquisition_interface.h" #include "pcps_opencl_acquisition_cc.h" class ConfigurationInterface; /*! * \brief This class adapts an OpenCL PCPS acquisition block to an * AcquisitionInterface for GPS L1 C/A signals */ class GpsL1CaPcpsOpenClAcquisition: public AcquisitionInterface { public: GpsL1CaPcpsOpenClAcquisition(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GpsL1CaPcpsOpenClAcquisition(); std::string role() { return role_; } /*! * \brief Returns "GPS_L1_CA_PCPS_OpenCl_Acquisition" */ std::string implementation() { return "GPS_L1_CA_PCPS_OpenCl_Acquisition"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to efficiently exchange synchronization data between acquisition and * tracking blocks */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); /*! * \brief Set acquisition channel unique ID */ void set_channel(unsigned int channel); /*! * \brief Set statistics threshold of PCPS algorithm */ void set_threshold(float threshold); /*! * \brief Set maximum Doppler off grid search */ void set_doppler_max(unsigned int doppler_max); /*! * \brief Set Doppler steps for the grid search */ void set_doppler_step(unsigned int doppler_step); /*! * \brief Initializes acquisition algorithm. */ void init(); /*! * \brief Sets local code for GPS L1/CA PCPS acquisition algorithm. */ void set_local_code(); /*! * \brief Returns the maximum peak of grid search */ signed int mag(); /*! * \brief Restart acquisition algorithm */ void reset(); private: ConfigurationInterface* configuration_; pcps_opencl_acquisition_cc_sptr acquisition_cc_; gr::blocks::stream_to_vector::sptr stream_to_vector_; size_t item_size_; std::string item_type_; unsigned int vector_length_; unsigned int code_length_; bool bit_transition_flag_; unsigned int channel_; float threshold_; unsigned int doppler_max_; unsigned int doppler_step_; unsigned int sampled_ms_; unsigned int max_dwells_; long fs_in_; long if_; bool dump_; std::string dump_filename_; std::complex * code_; Gnss_Synchro * gnss_synchro_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; float calculate_threshold(float pfa); }; #endif /* GNSS_SDR_GPS_L1_CA_PCPS_OPENCL_ACQUISITION_H_ */ gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_quicksync_acquisition.cc000066400000000000000000000233121305042567700322520ustar00rootroot00000000000000/*! * \file gps_l1_ca_pcps_quicksync_acquisition.cc * \brief Adapts a PCPS acquisition block to an AcquisitionInterface for * GPS L1 C/A signals using the QuickSync Algorithm * \author Damian Miralles, 2014. dmiralles2009@gmail.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l1_ca_pcps_quicksync_acquisition.h" #include #include #include "gps_sdr_signal_processing.h" #include "GPS_L1_CA.h" #include "configuration_interface.h" using google::LogMessage; GpsL1CaPcpsQuickSyncAcquisition::GpsL1CaPcpsQuickSyncAcquisition( ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { configuration_ = configuration; std::string default_item_type = "gr_complex"; std::string default_dump_filename = "./data/acquisition.dat"; DLOG(INFO) << "role " << role; item_type_ = configuration_->property(role + ".item_type", default_item_type); fs_in_ = configuration_->property("GNSS-SDR.internal_fs_hz", 4000000); if_ = configuration_->property(role + ".if", 0); dump_ = configuration_->property(role + ".dump", false); doppler_max_ = configuration->property(role + ".doppler_max", 5000); sampled_ms_ = configuration_->property(role + ".coherent_integration_time_ms", 4); //--- Find number of samples per spreading code ------------------------- code_length_ = round(fs_in_ / (GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS)); /*Calculate the folding factor value based on the calculations*/ unsigned int temp = (unsigned int)ceil(sqrt(log2(code_length_))); folding_factor_ = configuration_->property(role + ".folding_factor", temp); if ( sampled_ms_ % folding_factor_ != 0) { LOG(WARNING) << "QuickSync Algorithm requires a coherent_integration_time" << " multiple of " << folding_factor_ << "ms, Value entered " << sampled_ms_ << " ms"; if(sampled_ms_ < folding_factor_) { sampled_ms_ = (int) folding_factor_; } else { sampled_ms_ = (int)(sampled_ms_/folding_factor_) * folding_factor_; } LOG(WARNING) <<" Coherent_integration_time of " << sampled_ms_ << " ms will be used instead."; } vector_length_ = code_length_ * sampled_ms_; bit_transition_flag_ = configuration_->property(role + ".bit_transition_flag", false); if (!bit_transition_flag_) { max_dwells_ = configuration_->property(role + ".max_dwells", 1); } else { max_dwells_ = 2; } dump_filename_ = configuration_->property(role + ".dump_filename", default_dump_filename); int samples_per_ms = round(code_length_); code_ = new gr_complex[code_length_](); /*Object relevant information for debugging*/ LOG(INFO) << "Implementation: " << this->implementation() << ", Vector Length: " << vector_length_ << ", Samples per ms: " << samples_per_ms << ", Folding factor: " << folding_factor_ << ", Sampled ms: " << sampled_ms_ << ", Code Length: " << code_length_; if (item_type_.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); acquisition_cc_ = pcps_quicksync_make_acquisition_cc(folding_factor_, sampled_ms_, max_dwells_,doppler_max_, if_, fs_in_, samples_per_ms, code_length_,bit_transition_flag_, dump_, dump_filename_); stream_to_vector_ = gr::blocks::stream_to_vector::make(item_size_, code_length_*folding_factor_); DLOG(INFO) << "stream_to_vector_quicksync(" << stream_to_vector_->unique_id() << ")"; DLOG(INFO) << "acquisition(" << acquisition_cc_->unique_id() << ")"; } else { item_size_ = sizeof(gr_complex); LOG(WARNING) << item_type_ << " unknown acquisition item type"; } channel_ = 0; threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = 0; } GpsL1CaPcpsQuickSyncAcquisition::~GpsL1CaPcpsQuickSyncAcquisition() { delete[] code_; } void GpsL1CaPcpsQuickSyncAcquisition::set_channel(unsigned int channel) { channel_ = channel; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_channel(channel_); } } void GpsL1CaPcpsQuickSyncAcquisition::set_threshold(float threshold) { float pfa = configuration_->property(role_ + boost::lexical_cast(channel_) + ".pfa", 0.0); if(pfa == 0.0) { pfa = configuration_->property(role_ + ".pfa", 0.0); } if(pfa == 0.0) { threshold_ = threshold; } else { threshold_ = calculate_threshold(pfa); } DLOG(INFO) << "Channel "<< channel_ << " Threshold = " << threshold_; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_threshold(threshold_); } } void GpsL1CaPcpsQuickSyncAcquisition::set_doppler_max(unsigned int doppler_max) { doppler_max_ = doppler_max; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_doppler_max(doppler_max_); } } void GpsL1CaPcpsQuickSyncAcquisition::set_doppler_step(unsigned int doppler_step) { doppler_step_ = doppler_step; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_doppler_step(doppler_step_); } } void GpsL1CaPcpsQuickSyncAcquisition::set_gnss_synchro(Gnss_Synchro* gnss_synchro) { gnss_synchro_ = gnss_synchro; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_gnss_synchro(gnss_synchro_); } } signed int GpsL1CaPcpsQuickSyncAcquisition::mag() { if (item_type_.compare("gr_complex") == 0) { return acquisition_cc_->mag(); } else { return 0; } } void GpsL1CaPcpsQuickSyncAcquisition::init() { acquisition_cc_->init(); set_local_code(); } void GpsL1CaPcpsQuickSyncAcquisition::set_local_code() { if (item_type_.compare("gr_complex") == 0) { std::complex* code = new std::complex[code_length_](); gps_l1_ca_code_gen_complex_sampled(code, gnss_synchro_->PRN, fs_in_, 0); for (unsigned int i = 0; i < (sampled_ms_/folding_factor_); i++) { memcpy(&(code_[i*code_length_]), code, sizeof(gr_complex)*code_length_); } //memcpy(code_, code,sizeof(gr_complex)*code_length_); acquisition_cc_->set_local_code(code_); delete[] code; } } void GpsL1CaPcpsQuickSyncAcquisition::reset() { if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_active(true); } } void GpsL1CaPcpsQuickSyncAcquisition::set_state(int state) { if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_state(state); } } float GpsL1CaPcpsQuickSyncAcquisition::calculate_threshold(float pfa) { //Calculate the threshold unsigned int frequency_bins = 0; for (int doppler = (int)(-doppler_max_); doppler <= (int)doppler_max_; doppler += doppler_step_) { frequency_bins++; } DLOG(INFO) << "Channel " << channel_<< " Pfa = " << pfa; unsigned int ncells = (code_length_ / folding_factor_) * frequency_bins; double exponent = 1.0 / static_cast(ncells); double val = pow(1.0 - pfa, exponent); double lambda = static_cast(code_length_) / static_cast(folding_factor_); boost::math::exponential_distribution mydist (lambda); float threshold = static_cast(quantile(mydist,val)); return threshold; } void GpsL1CaPcpsQuickSyncAcquisition::connect(gr::top_block_sptr top_block) { if (item_type_.compare("gr_complex") == 0) { top_block->connect(stream_to_vector_, 0, acquisition_cc_, 0); } } void GpsL1CaPcpsQuickSyncAcquisition::disconnect(gr::top_block_sptr top_block) { if (item_type_.compare("gr_complex") == 0) { top_block->disconnect(stream_to_vector_, 0, acquisition_cc_, 0); } } gr::basic_block_sptr GpsL1CaPcpsQuickSyncAcquisition::get_left_block() { return stream_to_vector_; } gr::basic_block_sptr GpsL1CaPcpsQuickSyncAcquisition::get_right_block() { return acquisition_cc_; } gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_quicksync_acquisition.h000066400000000000000000000107741305042567700321240ustar00rootroot00000000000000/*! * \file gps_l1_ca_pcps_quicksync_acquisition.h * \brief Adapts a PCPS acquisition block to an AcquisitionInterface for GPS L1 C/A signals implementing the QuickSync Algorithm. * \date June, 2014 * \author Damian Miralles Sanchez. dmiralles2009@gmail.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L1_CA_PCPS_QUICKSYNC_ACQUISITION_H_ #define GNSS_SDR_GPS_L1_CA_PCPS_QUICKSYNC_ACQUISITION_H_ #include #include #include "gnss_synchro.h" #include "acquisition_interface.h" #include "pcps_quicksync_acquisition_cc.h" #include "configuration_interface.h" class ConfigurationInterface; /*! * \brief This class adapts a PCPS acquisition block to an AcquisitionInterface * for GPS L1 C/A signals */ class GpsL1CaPcpsQuickSyncAcquisition: public AcquisitionInterface { public: GpsL1CaPcpsQuickSyncAcquisition(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GpsL1CaPcpsQuickSyncAcquisition(); std::string role() { return role_; } /*! * \brief Returns "GPS_L1_CA_PCPS_QuickSync_Acquisition" */ std::string implementation() { return "GPS_L1_CA_PCPS_QuickSync_Acquisition"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to efficiently exchange synchronization data between acquisition and * tracking blocks */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); /*! * \brief Set acquisition channel unique ID */ void set_channel(unsigned int channel); /*! * \brief Set statistics threshold of PCPS algorithm */ void set_threshold(float threshold); /*! * \brief Set maximum Doppler off grid search */ void set_doppler_max(unsigned int doppler_max); /*! * \brief Set Doppler steps for the grid search */ void set_doppler_step(unsigned int doppler_step); /*! * \brief Initializes acquisition algorithm. */ void init(); /*! * \brief Sets local code for GPS L1/CA PCPS acquisition algorithm. */ void set_local_code(); /*! * \brief Returns the maximum peak of grid search */ signed int mag(); /*! * \brief Restart acquisition algorithm */ void reset(); /*! * \brief If state = 1, it forces the block to start acquiring from the first sample */ void set_state(int state); private: ConfigurationInterface* configuration_; pcps_quicksync_acquisition_cc_sptr acquisition_cc_; gr::blocks::stream_to_vector::sptr stream_to_vector_; size_t item_size_; std::string item_type_; unsigned int vector_length_; unsigned int code_length_; bool bit_transition_flag_; unsigned int channel_; float threshold_; unsigned int doppler_max_; unsigned int doppler_step_; unsigned int sampled_ms_; unsigned int max_dwells_; unsigned int folding_factor_; long fs_in_; long if_; bool dump_; std::string dump_filename_; std::complex * code_; Gnss_Synchro * gnss_synchro_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; float calculate_threshold(float pfa); }; #endif /* GNSS_SDR_GPS_L1_CA_PCPS_QUICKSYNC_ACQUISITION_H_ */ gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_tong_acquisition.cc000066400000000000000000000175251305042567700312210ustar00rootroot00000000000000/*! * \file gps_l1_ca_pcps_tong_acquisition.cc * \brief Adapts a PCPS Tong acquisition block to an AcquisitionInterface for * GPS L1 C/A signals * \author Marc Molina, 2013. marc.molina.pena(at)gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l1_ca_pcps_tong_acquisition.h" #include #include #include "gps_sdr_signal_processing.h" #include "GPS_L1_CA.h" #include "configuration_interface.h" using google::LogMessage; GpsL1CaPcpsTongAcquisition::GpsL1CaPcpsTongAcquisition( ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { configuration_ = configuration; std::string default_item_type = "gr_complex"; std::string default_dump_filename = "./data/acquisition.dat"; DLOG(INFO) << "role " << role; item_type_ = configuration_->property(role + ".item_type", default_item_type); fs_in_ = configuration_->property("GNSS-SDR.internal_fs_hz", 2048000); if_ = configuration_->property(role + ".if", 0); dump_ = configuration_->property(role + ".dump", false); doppler_max_ = configuration->property(role + ".doppler_max", 5000); sampled_ms_ = configuration_->property(role + ".coherent_integration_time_ms", 1); tong_init_val_ = configuration->property(role + ".tong_init_val", 1); tong_max_val_ = configuration->property(role + ".tong_max_val", 2); tong_max_dwells_ = configuration->property(role + ".tong_max_dwells", tong_max_val_ + 1); dump_filename_ = configuration_->property(role + ".dump_filename", default_dump_filename); //--- Find number of samples per spreading code ------------------------- code_length_ = round(fs_in_ / (GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS)); vector_length_ = code_length_ * sampled_ms_; code_ = new gr_complex[vector_length_]; if (item_type_.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); acquisition_cc_ = pcps_tong_make_acquisition_cc(sampled_ms_, doppler_max_, if_, fs_in_, code_length_, code_length_, tong_init_val_, tong_max_val_, tong_max_dwells_, dump_, dump_filename_); stream_to_vector_ = gr::blocks::stream_to_vector::make(item_size_, vector_length_); DLOG(INFO) << "stream_to_vector(" << stream_to_vector_->unique_id() << ")"; DLOG(INFO) << "acquisition(" << acquisition_cc_->unique_id() << ")"; } else { item_size_ = sizeof(gr_complex); LOG(WARNING) << item_type_ << " unknown acquisition item type"; } channel_ = 0; threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = 0; } GpsL1CaPcpsTongAcquisition::~GpsL1CaPcpsTongAcquisition() { delete[] code_; } void GpsL1CaPcpsTongAcquisition::set_channel(unsigned int channel) { channel_ = channel; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_channel(channel_); } } void GpsL1CaPcpsTongAcquisition::set_threshold(float threshold) { float pfa = configuration_->property(role_ + boost::lexical_cast(channel_) + ".pfa", 0.0); if(pfa == 0.0) { pfa = configuration_->property(role_+".pfa", 0.0); } if(pfa == 0.0) { threshold_ = threshold; } else { threshold_ = calculate_threshold(pfa); } DLOG(INFO) << "Channel " << channel_ << " Threshold = " << threshold_; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_threshold(threshold_); } } void GpsL1CaPcpsTongAcquisition::set_doppler_max(unsigned int doppler_max) { doppler_max_ = doppler_max; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_doppler_max(doppler_max_); } } void GpsL1CaPcpsTongAcquisition::set_doppler_step(unsigned int doppler_step) { doppler_step_ = doppler_step; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_doppler_step(doppler_step_); } } void GpsL1CaPcpsTongAcquisition::set_gnss_synchro(Gnss_Synchro* gnss_synchro) { gnss_synchro_ = gnss_synchro; if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_gnss_synchro(gnss_synchro_); } } signed int GpsL1CaPcpsTongAcquisition::mag() { if (item_type_.compare("gr_complex") == 0) { return acquisition_cc_->mag(); } else { return 0; } } void GpsL1CaPcpsTongAcquisition::init() { acquisition_cc_->init(); set_local_code(); } void GpsL1CaPcpsTongAcquisition::set_local_code() { if (item_type_.compare("gr_complex") == 0) { std::complex* code = new std::complex[code_length_]; gps_l1_ca_code_gen_complex_sampled(code, gnss_synchro_->PRN, fs_in_, 0); for (unsigned int i = 0; i < sampled_ms_; i++) { memcpy(&(code_[i*code_length_]), code, sizeof(gr_complex)*code_length_); } acquisition_cc_->set_local_code(code_); delete[] code; } } void GpsL1CaPcpsTongAcquisition::reset() { if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_active(true); } } void GpsL1CaPcpsTongAcquisition::set_state(int state) { if (item_type_.compare("gr_complex") == 0) { acquisition_cc_->set_state(state); } } float GpsL1CaPcpsTongAcquisition::calculate_threshold(float pfa) { //Calculate the threshold unsigned int frequency_bins = 0; for (int doppler = (int)(-doppler_max_); doppler <= (int)doppler_max_; doppler += doppler_step_) { frequency_bins++; } DLOG(INFO) << "Channel "<< channel_ <<" Pfa = "<< pfa; unsigned int ncells = vector_length_ * frequency_bins; double exponent = 1 / static_cast(ncells); double val = pow(1.0 - pfa,exponent); double lambda = double(vector_length_); boost::math::exponential_distribution mydist (lambda); float threshold = (float)quantile(mydist, val); return threshold; } void GpsL1CaPcpsTongAcquisition::connect(gr::top_block_sptr top_block) { if (item_type_.compare("gr_complex") == 0) { top_block->connect(stream_to_vector_, 0, acquisition_cc_, 0); } } void GpsL1CaPcpsTongAcquisition::disconnect(gr::top_block_sptr top_block) { if (item_type_.compare("gr_complex") == 0) { top_block->disconnect(stream_to_vector_, 0, acquisition_cc_, 0); } } gr::basic_block_sptr GpsL1CaPcpsTongAcquisition::get_left_block() { return stream_to_vector_; } gr::basic_block_sptr GpsL1CaPcpsTongAcquisition::get_right_block() { return acquisition_cc_; } gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_tong_acquisition.h000066400000000000000000000106121305042567700310510ustar00rootroot00000000000000/*! * \file gps_l1_ca_pcps_tong_acquisition.h * \brief Adapts a PCPS Tong acquisition block to an AcquisitionInterface for * GPS L1 C/A signals * \author Marc Molina, 2013. marc.molina.pena(at)gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L1_CA_TONG_ACQUISITION_H_ #define GNSS_SDR_GPS_L1_CA_TONG_ACQUISITION_H_ #include #include #include "gnss_synchro.h" #include "acquisition_interface.h" #include "pcps_tong_acquisition_cc.h" #include "configuration_interface.h" class ConfigurationInterface; /*! * \brief This class adapts a PCPS Tong acquisition block to an * AcquisitionInterface for GPS L1 C/A signals */ class GpsL1CaPcpsTongAcquisition: public AcquisitionInterface { public: GpsL1CaPcpsTongAcquisition(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GpsL1CaPcpsTongAcquisition(); std::string role() { return role_; } /*! * \brief Returns "GPS_L1_CA_PCPS_Tong_Acquisition" */ std::string implementation() { return "GPS_L1_CA_PCPS_Tong_Acquisition"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to efficiently exchange synchronization data between acquisition and * tracking blocks */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); /*! * \brief Set acquisition channel unique ID */ void set_channel(unsigned int channel); /*! * \brief Set statistics threshold of TONG algorithm */ void set_threshold(float threshold); /*! * \brief Set maximum Doppler off grid search */ void set_doppler_max(unsigned int doppler_max); /*! * \brief Set Doppler steps for the grid search */ void set_doppler_step(unsigned int doppler_step); /*! * \brief Initializes acquisition algorithm. */ void init(); /*! * \brief Sets local code for GPS L1/CA TONG acquisition algorithm. */ void set_local_code(); /*! * \brief Returns the maximum peak of grid search */ signed int mag(); /*! * \brief Restart acquisition algorithm */ void reset(); /*! * \brief If state = 1, it forces the block to start acquiring from the first sample */ void set_state(int state); private: ConfigurationInterface* configuration_; pcps_tong_acquisition_cc_sptr acquisition_cc_; gr::blocks::stream_to_vector::sptr stream_to_vector_; size_t item_size_; std::string item_type_; unsigned int vector_length_; unsigned int code_length_; unsigned int channel_; float threshold_; unsigned int doppler_max_; unsigned int doppler_step_; unsigned int sampled_ms_; unsigned int tong_init_val_; unsigned int tong_max_val_; unsigned int tong_max_dwells_; long fs_in_; long if_; bool dump_; std::string dump_filename_; std::complex * code_; Gnss_Synchro * gnss_synchro_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; float calculate_threshold(float pfa); }; #endif /* GNSS_SDR_GPS_L1_CA_TONG_ACQUISITION_H_ */ gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.cc000066400000000000000000000264001305042567700300340ustar00rootroot00000000000000/*! * \file gps_l2_m_pcps_acquisition.cc * \brief Adapts a PCPS acquisition block to an AcquisitionInterface for * GPS L2 M signals * \authors
    *
  • Javier Arribas, 2015. jarribas(at)cttc.es *
* * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l2_m_pcps_acquisition.h" #include #include #include "gps_l2c_signal.h" #include "GPS_L2C.h" #include "configuration_interface.h" using google::LogMessage; GpsL2MPcpsAcquisition::GpsL2MPcpsAcquisition( ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { configuration_ = configuration; std::string default_item_type = "gr_complex"; std::string default_dump_filename = "./data/acquisition.dat"; LOG(INFO) << "role " << role; item_type_ = configuration_->property(role + ".item_type", default_item_type); //float pfa = configuration_->property(role + ".pfa", 0.0); fs_in_ = configuration_->property("GNSS-SDR.internal_fs_hz", 2048000); if_ = configuration_->property(role + ".if", 0); dump_ = configuration_->property(role + ".dump", false); doppler_max_ = configuration->property(role + ".doppler_max", 5000); bit_transition_flag_ = configuration_->property(role + ".bit_transition_flag", false); use_CFAR_algorithm_flag_=configuration_->property(role + ".use_CFAR_algorithm", true); //will be false in future versions max_dwells_ = configuration_->property(role + ".max_dwells", 1); dump_filename_ = configuration_->property(role + ".dump_filename", default_dump_filename); //--- Find number of samples per spreading code ------------------------- code_length_ = round(static_cast(fs_in_) / (GPS_L2_M_CODE_RATE_HZ / static_cast(GPS_L2_M_CODE_LENGTH_CHIPS))); vector_length_ = code_length_; if( bit_transition_flag_ ) { vector_length_ *= 2; } code_ = new gr_complex[vector_length_]; if (item_type_.compare("cshort") == 0 ) { item_size_ = sizeof(lv_16sc_t); acquisition_sc_ = pcps_make_acquisition_sc(1, max_dwells_, doppler_max_, if_, fs_in_, code_length_, code_length_, bit_transition_flag_, use_CFAR_algorithm_flag_, dump_, dump_filename_); DLOG(INFO) << "acquisition(" << acquisition_sc_->unique_id() << ")"; }else{ item_size_ = sizeof(gr_complex); acquisition_cc_ = pcps_make_acquisition_cc(1, max_dwells_, doppler_max_, if_, fs_in_, code_length_, code_length_, bit_transition_flag_, use_CFAR_algorithm_flag_, dump_, dump_filename_); DLOG(INFO) << "acquisition(" << acquisition_cc_->unique_id() << ")"; } stream_to_vector_ = gr::blocks::stream_to_vector::make(item_size_, vector_length_); DLOG(INFO) << "stream_to_vector(" << stream_to_vector_->unique_id() << ")"; if (item_type_.compare("cbyte") == 0) { cbyte_to_float_x2_ = make_complex_byte_to_float_x2(); float_to_complex_ = gr::blocks::float_to_complex::make(); } channel_ = 0; threshold_ = 0.0; doppler_step_ = 0; gnss_synchro_ = 0; } GpsL2MPcpsAcquisition::~GpsL2MPcpsAcquisition() { delete[] code_; } void GpsL2MPcpsAcquisition::set_channel(unsigned int channel) { channel_ = channel; if (item_type_.compare("cshort") == 0) { acquisition_sc_->set_channel(channel_); } else { acquisition_cc_->set_channel(channel_); } } void GpsL2MPcpsAcquisition::set_threshold(float threshold) { float pfa = configuration_->property(role_ + boost::lexical_cast(channel_) + ".pfa", 0.0); if(pfa == 0.0) { pfa = configuration_->property(role_ + ".pfa", 0.0); } if(pfa == 0.0) { threshold_ = threshold; } else { threshold_ = calculate_threshold(pfa); } DLOG(INFO) << "Channel " << channel_ <<" Threshold = " << threshold_; if (item_type_.compare("cshort") == 0) { acquisition_sc_->set_threshold(threshold_); } else { acquisition_cc_->set_threshold(threshold_); } } void GpsL2MPcpsAcquisition::set_doppler_max(unsigned int doppler_max) { doppler_max_ = doppler_max; if (item_type_.compare("cshort") == 0) { acquisition_sc_->set_doppler_max(doppler_max_); } else { acquisition_cc_->set_doppler_max(doppler_max_); } } // Be aware that Doppler step should be set to 2/(3T) Hz, where T is the coherent integration time (GPS L2 period is 0.02s) // Doppler bin minimum size= 33 Hz void GpsL2MPcpsAcquisition::set_doppler_step(unsigned int doppler_step) { doppler_step_ = doppler_step; if (item_type_.compare("cshort") == 0) { acquisition_sc_->set_doppler_step(doppler_step_); } else { acquisition_cc_->set_doppler_step(doppler_step_); } } void GpsL2MPcpsAcquisition::set_gnss_synchro(Gnss_Synchro* gnss_synchro) { gnss_synchro_ = gnss_synchro; if (item_type_.compare("cshort") == 0) { acquisition_sc_->set_gnss_synchro(gnss_synchro_); } else { acquisition_cc_->set_gnss_synchro(gnss_synchro_); } } signed int GpsL2MPcpsAcquisition::mag() { if (item_type_.compare("cshort") == 0) { return acquisition_sc_->mag(); } else { return acquisition_cc_->mag(); } } void GpsL2MPcpsAcquisition::init() { if (item_type_.compare("cshort") == 0) { acquisition_sc_->init(); } else { acquisition_cc_->init(); } set_local_code(); } void GpsL2MPcpsAcquisition::set_local_code() { gps_l2c_m_code_gen_complex_sampled(code_, gnss_synchro_->PRN, fs_in_); if (item_type_.compare("cshort") == 0) { acquisition_sc_->set_local_code(code_); } else { acquisition_cc_->set_local_code(code_); } // //debug // std::ofstream d_dump_file; // std::stringstream filename; // std::streamsize n = 2 * sizeof(float) * (code_length_); // complex file write // filename.str(""); // filename << "../data/local_prn_sampled.dat"; // d_dump_file.open(filename.str().c_str(), std::ios::out | std::ios::binary); // d_dump_file.write((char*)code_, n); // d_dump_file.close(); // } } void GpsL2MPcpsAcquisition::reset() { if (item_type_.compare("cshort") == 0) { acquisition_sc_->set_active(true); } else { acquisition_cc_->set_active(true); } } void GpsL2MPcpsAcquisition::set_state(int state) { if (item_type_.compare("cshort") == 0) { acquisition_sc_->set_state(state); } else { acquisition_cc_->set_state(state); } } float GpsL2MPcpsAcquisition::calculate_threshold(float pfa) { //Calculate the threshold unsigned int frequency_bins = 0; for (int doppler = static_cast(-doppler_max_); doppler <= static_cast(doppler_max_); doppler += doppler_step_) { frequency_bins++; } DLOG(INFO) << "Channel " << channel_<< " Pfa = " << pfa; unsigned int ncells = vector_length_ * frequency_bins; double exponent = 1.0 / static_cast(ncells); double val = pow(1.0 - pfa, exponent); double lambda = double(vector_length_); boost::math::exponential_distribution mydist (lambda); float threshold = (float)quantile(mydist,val); return threshold; } void GpsL2MPcpsAcquisition::connect(gr::top_block_sptr top_block) { if (item_type_.compare("gr_complex") == 0) { top_block->connect(stream_to_vector_, 0, acquisition_cc_, 0); } else if (item_type_.compare("cshort") == 0) { top_block->connect(stream_to_vector_, 0, acquisition_sc_, 0); } else if (item_type_.compare("cbyte") == 0) { top_block->connect(cbyte_to_float_x2_, 0, float_to_complex_, 0); top_block->connect(cbyte_to_float_x2_, 1, float_to_complex_, 1); top_block->connect(float_to_complex_, 0, stream_to_vector_, 0); top_block->connect(stream_to_vector_, 0, acquisition_cc_, 0); } else { LOG(WARNING) << item_type_ << " unknown acquisition item type"; } } void GpsL2MPcpsAcquisition::disconnect(gr::top_block_sptr top_block) { if (item_type_.compare("gr_complex") == 0) { top_block->disconnect(stream_to_vector_, 0, acquisition_cc_, 0); } else if (item_type_.compare("cshort") == 0) { top_block->disconnect(stream_to_vector_, 0, acquisition_sc_, 0); } else if (item_type_.compare("cbyte") == 0) { // Since a byte-based acq implementation is not available, // we just convert cshorts to gr_complex top_block->disconnect(cbyte_to_float_x2_, 0, float_to_complex_, 0); top_block->disconnect(cbyte_to_float_x2_, 1, float_to_complex_, 1); top_block->disconnect(float_to_complex_, 0, stream_to_vector_, 0); top_block->disconnect(stream_to_vector_, 0, acquisition_cc_, 0); } else { LOG(WARNING) << item_type_ << " unknown acquisition item type"; } } gr::basic_block_sptr GpsL2MPcpsAcquisition::get_left_block() { if (item_type_.compare("gr_complex") == 0) { return stream_to_vector_; } else if (item_type_.compare("cshort") == 0) { return stream_to_vector_; } else if (item_type_.compare("cbyte") == 0) { return cbyte_to_float_x2_; } else { LOG(WARNING) << item_type_ << " unknown acquisition item type"; return nullptr; } } gr::basic_block_sptr GpsL2MPcpsAcquisition::get_right_block() { if (item_type_.compare("cshort") == 0) { return acquisition_sc_; } else { return acquisition_cc_; } } gnss-sdr-0.0.9/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.h000066400000000000000000000111441305042567700276750ustar00rootroot00000000000000/*! * \file gps_l2_m_pcps_acquisition.h * \brief Adapts a PCPS acquisition block to an AcquisitionInterface for * GPS L2 M signals * \authors
    *
  • Javier Arribas, 2015. jarribas(at)cttc.es *
* * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L2_M_PCPS_ACQUISITION_H_ #define GNSS_SDR_GPS_L2_M_PCPS_ACQUISITION_H_ #include #include #include #include "gnss_synchro.h" #include "acquisition_interface.h" #include "pcps_acquisition_cc.h" #include "pcps_acquisition_sc.h" #include "complex_byte_to_float_x2.h" #include class ConfigurationInterface; /*! * \brief This class adapts a PCPS acquisition block to an AcquisitionInterface * for GPS L2 M signals */ class GpsL2MPcpsAcquisition: public AcquisitionInterface { public: GpsL2MPcpsAcquisition(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GpsL2MPcpsAcquisition(); std::string role() { return role_; } /*! * \brief Returns "GPS_L2_M_PCPS_Acquisition" */ std::string implementation() { return "GPS_L2_M_PCPS_Acquisition"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to efficiently exchange synchronization data between acquisition and * tracking blocks */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); /*! * \brief Set acquisition channel unique ID */ void set_channel(unsigned int channel); /*! * \brief Set statistics threshold of PCPS algorithm */ void set_threshold(float threshold); /*! * \brief Set maximum Doppler off grid search */ void set_doppler_max(unsigned int doppler_max); /*! * \brief Set Doppler steps for the grid search */ void set_doppler_step(unsigned int doppler_step); /*! * \brief Initializes acquisition algorithm. */ void init(); /*! * \brief Sets local code for GPS L2/M PCPS acquisition algorithm. */ void set_local_code(); /*! * \brief Returns the maximum peak of grid search */ signed int mag(); /*! * \brief Restart acquisition algorithm */ void reset(); /*! * \brief If state = 1, it forces the block to start acquiring from the first sample */ void set_state(int state); private: ConfigurationInterface* configuration_; pcps_acquisition_cc_sptr acquisition_cc_; pcps_acquisition_sc_sptr acquisition_sc_; gr::blocks::stream_to_vector::sptr stream_to_vector_; gr::blocks::float_to_complex::sptr float_to_complex_; complex_byte_to_float_x2_sptr cbyte_to_float_x2_; size_t item_size_; std::string item_type_; unsigned int vector_length_; unsigned int code_length_; bool bit_transition_flag_; bool use_CFAR_algorithm_flag_; unsigned int channel_; float threshold_; unsigned int doppler_max_; unsigned int doppler_step_; unsigned int max_dwells_; long fs_in_; long if_; bool dump_; std::string dump_filename_; std::complex * code_; Gnss_Synchro * gnss_synchro_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; float calculate_threshold(float pfa); }; #endif /* GNSS_SDR_GPS_L2_M_PCPS_ACQUISITION_H_ */ gnss-sdr-0.0.9/src/algorithms/acquisition/gnuradio_blocks/000077500000000000000000000000001305042567700237265ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/acquisition/gnuradio_blocks/CMakeLists.txt000066400000000000000000000045641305042567700264770ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # set(ACQ_GR_BLOCKS_SOURCES pcps_acquisition_cc.cc pcps_acquisition_sc.cc pcps_multithread_acquisition_cc.cc pcps_assisted_acquisition_cc.cc pcps_acquisition_fine_doppler_cc.cc pcps_tong_acquisition_cc.cc pcps_cccwsr_acquisition_cc.cc pcps_quicksync_acquisition_cc.cc galileo_pcps_8ms_acquisition_cc.cc galileo_e5a_noncoherent_iq_acquisition_caf_cc.cc ) if(OPENCL_FOUND) set(ACQ_GR_BLOCKS_SOURCES ${ACQ_GR_BLOCKS_SOURCES} pcps_opencl_acquisition_cc.cc) endif(OPENCL_FOUND) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/interfaces ${CMAKE_SOURCE_DIR}/src/core/receiver ${CMAKE_SOURCE_DIR}/src/algorithms/libs ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ${VOLK_GNSSSDR_INCLUDE_DIRS} ) if(OPENCL_FOUND) include_directories( ${OPENCL_INCLUDE_DIRS} ) if(OS_IS_MACOSX) set(OPT_LIBRARIES ${OPT_LIBRARIES} "-framework OpenCL") else(OS_IS_MACOSX) set(OPT_LIBRARIES ${OPT_LIBRARIES} ${OPENCL_LIBRARIES}) endif(OS_IS_MACOSX) endif(OPENCL_FOUND) file(GLOB ACQ_GR_BLOCKS_HEADERS "*.h") list(SORT ACQ_GR_BLOCKS_HEADERS) add_library(acq_gr_blocks ${ACQ_GR_BLOCKS_SOURCES} ${ACQ_GR_BLOCKS_HEADERS}) source_group(Headers FILES ${ACQ_GR_BLOCKS_HEADERS}) target_link_libraries(acq_gr_blocks gnss_sp_libs gnss_system_parameters ${GNURADIO_RUNTIME_LIBRARIES} ${GNURADIO_FFT_LIBRARIES} ${VOLK_LIBRARIES} ${VOLK_GNSSSDR_LIBRARIES} ${OPT_LIBRARIES}) if(NOT VOLK_GNSSSDR_FOUND) add_dependencies(acq_gr_blocks volk_gnsssdr_module) endif(NOT VOLK_GNSSSDR_FOUND) galileo_e5a_noncoherent_iq_acquisition_caf_cc.cc000066400000000000000000001201171305042567700353070ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/acquisition/gnuradio_blocks/*! * \file galileo_e5a_noncoherent_iq_acquisition_caf_cc.cc * \brief Adapts a PCPS acquisition block to an AcquisitionInterface for * Galileo E5a data and pilot Signals * \author Marc Sales, 2014. marcsales92(at)gmail.com * \based on work from: *
    *
  • Javier Arribas, 2011. jarribas(at)cttc.es *
  • Luis Esteve, 2012. luis(at)epsilon-formacion.com *
  • Marc Molina, 2013. marc.molina.pena@gmail.com *
* * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_e5a_noncoherent_iq_acquisition_caf_cc.h" #include #include #include #include #include #include "control_message_factory.h" using google::LogMessage; galileo_e5a_noncoherentIQ_acquisition_caf_cc_sptr galileo_e5a_noncoherentIQ_make_acquisition_caf_cc( unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool dump, std::string dump_filename, bool both_signal_components_, int CAF_window_hz_, int Zero_padding_) { return galileo_e5a_noncoherentIQ_acquisition_caf_cc_sptr( new galileo_e5a_noncoherentIQ_acquisition_caf_cc(sampled_ms, max_dwells, doppler_max, freq, fs_in, samples_per_ms, samples_per_code, bit_transition_flag, dump, dump_filename, both_signal_components_, CAF_window_hz_, Zero_padding_)); } galileo_e5a_noncoherentIQ_acquisition_caf_cc::galileo_e5a_noncoherentIQ_acquisition_caf_cc( unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool dump, std::string dump_filename, bool both_signal_components_, int CAF_window_hz_, int Zero_padding_) : gr::block("galileo_e5a_noncoherentIQ_acquisition_caf_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(0, 0, sizeof(gr_complex))) { this->message_port_register_out(pmt::mp("events")); d_sample_counter = 0; // SAMPLE COUNTER d_active = false; d_state = 0; d_freq = freq; d_fs_in = fs_in; d_samples_per_ms = samples_per_ms; d_samples_per_code = samples_per_code; d_max_dwells = max_dwells; d_well_count = 0; d_doppler_max = doppler_max; if (Zero_padding_ > 0) { d_sampled_ms = 1; } else { d_sampled_ms = sampled_ms; } d_fft_size = sampled_ms * d_samples_per_ms; d_mag = 0; d_input_power = 0.0; d_num_doppler_bins = 0; d_bit_transition_flag = bit_transition_flag; d_buffer_count = 0; d_both_signal_components = both_signal_components_; d_CAF_window_hz = CAF_window_hz_; d_inbuffer = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); d_fft_code_I_A = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); d_magnitudeIA = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); if (d_both_signal_components == true) { d_fft_code_Q_A = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); d_magnitudeQA = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); } else { d_fft_code_Q_A = 0; d_magnitudeQA = 0; } // IF COHERENT INTEGRATION TIME > 1 if (d_sampled_ms > 1) { d_fft_code_I_B = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); d_magnitudeIB = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); if (d_both_signal_components == true) { d_fft_code_Q_B = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); d_magnitudeQB = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); } else { d_fft_code_Q_B = 0; d_magnitudeQB = 0; } } else { d_fft_code_I_B = 0; d_magnitudeIB = 0; d_fft_code_Q_B = 0; d_magnitudeQB = 0; } // Direct FFT d_fft_if = new gr::fft::fft_complex(d_fft_size, true); // Inverse FFT d_ifft = new gr::fft::fft_complex(d_fft_size, false); // For dumping samples into a file d_dump = dump; d_dump_filename = dump_filename; d_doppler_resolution = 0; d_threshold = 0; d_doppler_step = 250; d_grid_doppler_wipeoffs = 0; d_gnss_synchro = 0; d_code_phase = 0; d_doppler_freq = 0; d_test_statistics = 0; d_CAF_vector = 0; d_CAF_vector_I = 0; d_CAF_vector_Q = 0; d_channel = 0; d_gr_stream_buffer = 0; } galileo_e5a_noncoherentIQ_acquisition_caf_cc::~galileo_e5a_noncoherentIQ_acquisition_caf_cc() { if (d_num_doppler_bins > 0) { for (unsigned int i = 0; i < d_num_doppler_bins; i++) { volk_gnsssdr_free(d_grid_doppler_wipeoffs[i]); } delete[] d_grid_doppler_wipeoffs; } volk_gnsssdr_free(d_inbuffer); volk_gnsssdr_free(d_fft_code_I_A); volk_gnsssdr_free(d_magnitudeIA); if (d_both_signal_components == true) { volk_gnsssdr_free(d_fft_code_Q_A); volk_gnsssdr_free(d_magnitudeQA); } // IF INTEGRATION TIME > 1 if (d_sampled_ms > 1) { volk_gnsssdr_free(d_fft_code_I_B); volk_gnsssdr_free(d_magnitudeIB); if (d_both_signal_components == true) { volk_gnsssdr_free(d_fft_code_Q_B); volk_gnsssdr_free(d_magnitudeQB); } } if (d_CAF_window_hz > 0) { volk_gnsssdr_free(d_CAF_vector); volk_gnsssdr_free(d_CAF_vector_I); if (d_both_signal_components == true) { volk_gnsssdr_free(d_CAF_vector_Q); } } delete d_fft_if; delete d_ifft; if (d_dump) { d_dump_file.close(); } } void galileo_e5a_noncoherentIQ_acquisition_caf_cc::set_local_code(std::complex * codeI, std::complex * codeQ ) { // DATA SIGNAL // Three replicas of data primary code. CODE A: (1,1,1) memcpy(d_fft_if->get_inbuf(), codeI, sizeof(gr_complex)*d_fft_size); d_fft_if->execute(); // We need the FFT of local code //Conjugate the local code volk_32fc_conjugate_32fc(d_fft_code_I_A,d_fft_if->get_outbuf(),d_fft_size); // SAME FOR PILOT SIGNAL if (d_both_signal_components == true) { // Three replicas of pilot primary code. CODE A: (1,1,1) memcpy(d_fft_if->get_inbuf(), codeQ, sizeof(gr_complex)*d_fft_size); d_fft_if->execute(); // We need the FFT of local code //Conjugate the local code volk_32fc_conjugate_32fc(d_fft_code_Q_A,d_fft_if->get_outbuf(),d_fft_size); } // IF INTEGRATION TIME > 1 code, we need to evaluate the other possible combination // Note: max integration time allowed = 3ms (dealt in adapter) if (d_sampled_ms > 1) { // DATA CODE B: First replica is inverted (0,1,1) volk_32fc_s32fc_multiply_32fc(&(d_fft_if->get_inbuf())[0], &codeI[0], gr_complex(-1,0), d_samples_per_code); d_fft_if->execute(); // We need the FFT of local code //Conjugate the local code volk_32fc_conjugate_32fc(d_fft_code_I_B,d_fft_if->get_outbuf(),d_fft_size); if (d_both_signal_components == true) { // PILOT CODE B: First replica is inverted (0,1,1) volk_32fc_s32fc_multiply_32fc(&(d_fft_if->get_inbuf())[0], &codeQ[0], gr_complex(-1,0), d_samples_per_code); d_fft_if->execute(); // We need the FFT of local code //Conjugate the local code volk_32fc_conjugate_32fc(d_fft_code_Q_B,d_fft_if->get_outbuf(),d_fft_size); } } } void galileo_e5a_noncoherentIQ_acquisition_caf_cc::init() { d_gnss_synchro->Flag_valid_acquisition = false; d_gnss_synchro->Flag_valid_symbol_output = false; d_gnss_synchro->Flag_valid_pseudorange = false; d_gnss_synchro->Flag_valid_word = false; d_gnss_synchro->Flag_preamble = false; d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_mag = 0.0; d_input_power = 0.0; const double GALILEO_TWO_PI = 6.283185307179600; // Count the number of bins d_num_doppler_bins = 0; for (int doppler = static_cast(-d_doppler_max); doppler <= static_cast(d_doppler_max); doppler += d_doppler_step) { d_num_doppler_bins++; } // Create the carrier Doppler wipeoff signals d_grid_doppler_wipeoffs = new gr_complex*[d_num_doppler_bins]; for (unsigned int doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { d_grid_doppler_wipeoffs[doppler_index] = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); int doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; float phase_step_rad = GALILEO_TWO_PI * (d_freq + doppler) / static_cast(d_fs_in); float _phase[1]; _phase[0] = 0; volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], - phase_step_rad, _phase, d_fft_size); } /* CAF Filtering to resolve doppler ambiguity. Phase and quadrature must be processed * separately before non-coherent integration */ // if (d_CAF_filter) if (d_CAF_window_hz > 0) { d_CAF_vector = static_cast(volk_gnsssdr_malloc(d_num_doppler_bins * sizeof(float), volk_gnsssdr_get_alignment())); d_CAF_vector_I = static_cast(volk_gnsssdr_malloc(d_num_doppler_bins * sizeof(float), volk_gnsssdr_get_alignment())); if (d_both_signal_components == true) { d_CAF_vector_Q = static_cast(volk_gnsssdr_malloc(d_num_doppler_bins * sizeof(float), volk_gnsssdr_get_alignment())); } } } void galileo_e5a_noncoherentIQ_acquisition_caf_cc::set_state(int state) { d_state = state; if (d_state == 1) { d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_well_count = 0; d_mag = 0.0; d_input_power = 0.0; d_test_statistics = 0.0; } else if (d_state == 0) {} else { LOG(ERROR) << "State can only be set to 0 or 1"; } } int galileo_e5a_noncoherentIQ_acquisition_caf_cc::general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items __attribute__((unused))) { /* * By J.Arribas, L.Esteve, M.Molina and M.Sales * Acquisition strategy (Kay Borre book + CFAR threshold): * 1. Compute the input signal power estimation * 2. Doppler serial search loop * 3. Perform the FFT-based circular convolution (parallel time search) * 4. OPTIONAL: CAF filter to avoid doppler ambiguity * 5. Record the maximum peak and the associated synchronization parameters * 6. Compute the test statistics and compare to the threshold * 7. Declare positive or negative acquisition using a message port */ int acquisition_message = -1; //0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL /* States: 0 Stop Channel * 1 Load the buffer until it reaches fft_size * 2 Acquisition algorithm * 3 Positive acquisition * 4 Negative acquisition */ switch (d_state) { case 0: { if (d_active) { //restart acquisition variables d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_well_count = 0; d_mag = 0.0; d_input_power = 0.0; d_test_statistics = 0.0; d_state = 1; } d_sample_counter += ninput_items[0]; // sample counter consume_each(ninput_items[0]); break; } case 1: { const gr_complex *in = (const gr_complex *)input_items[0]; //Get the input samples pointer unsigned int buff_increment; if (ninput_items[0] + d_buffer_count <= d_fft_size) { buff_increment = ninput_items[0]; } else { buff_increment = (d_fft_size - d_buffer_count); } memcpy(&d_inbuffer[d_buffer_count], in, sizeof(gr_complex) * buff_increment); // If buffer will be full in next iteration if (d_buffer_count >= d_fft_size - d_gr_stream_buffer) { d_state = 2; } d_buffer_count += buff_increment; d_sample_counter += buff_increment; // sample counter consume_each(buff_increment); break; } case 2: { // Fill last part of the buffer and reset counter const gr_complex *in = (const gr_complex *)input_items[0]; //Get the input samples pointer if (d_buffer_count < d_fft_size) { memcpy(&d_inbuffer[d_buffer_count], in, sizeof(gr_complex)*(d_fft_size-d_buffer_count)); } d_sample_counter += d_fft_size-d_buffer_count; // sample counter // initialize acquisition algorithm int doppler; uint32_t indext = 0; uint32_t indext_IA = 0; uint32_t indext_IB = 0; uint32_t indext_QA = 0; uint32_t indext_QB = 0; float magt = 0.0; float magt_IA = 0.0; float magt_IB = 0.0; float magt_QA = 0.0; float magt_QB = 0.0; float fft_normalization_factor = static_cast(d_fft_size) * static_cast(d_fft_size); d_input_power = 0.0; d_mag = 0.0; d_well_count++; DLOG(INFO) << "Channel: " << d_channel << " , doing acquisition of satellite: " << d_gnss_synchro->System << " "<< d_gnss_synchro->PRN << " ,sample stamp: " << d_sample_counter << ", threshold: " << d_threshold << ", doppler_max: " << d_doppler_max << ", doppler_step: " << d_doppler_step; // 1- Compute the input signal power estimation volk_32fc_magnitude_squared_32f(d_magnitudeIA, d_inbuffer, d_fft_size); volk_32f_accumulator_s32f(&d_input_power, d_magnitudeIA, d_fft_size); d_input_power /= static_cast(d_fft_size); // 2- Doppler frequency search loop for (unsigned int doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { // doppler search steps doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; volk_32fc_x2_multiply_32fc(d_fft_if->get_inbuf(), d_inbuffer, d_grid_doppler_wipeoffs[doppler_index], d_fft_size); // 3- Perform the FFT-based convolution (parallel time search) // Compute the FFT of the carrier wiped--off incoming signal d_fft_if->execute(); // CODE IA // Multiply carrier wiped--off, Fourier transformed incoming signal // with the local FFT'd code reference using SIMD operations with VOLK library volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), d_fft_if->get_outbuf(), d_fft_code_I_A, d_fft_size); // compute the inverse FFT d_ifft->execute(); // Search maximum volk_32fc_magnitude_squared_32f(d_magnitudeIA, d_ifft->get_outbuf(), d_fft_size); volk_gnsssdr_32f_index_max_32u(&indext_IA, d_magnitudeIA, d_fft_size); // Normalize the maximum value to correct the scale factor introduced by FFTW magt_IA = d_magnitudeIA[indext_IA] / (fft_normalization_factor * fft_normalization_factor); if (d_both_signal_components == true) { // REPEAT FOR ALL CODES. CODE_QA volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), d_fft_if->get_outbuf(), d_fft_code_Q_A, d_fft_size); d_ifft->execute(); volk_32fc_magnitude_squared_32f(d_magnitudeQA, d_ifft->get_outbuf(), d_fft_size); volk_gnsssdr_32f_index_max_32u(&indext_QA, d_magnitudeQA, d_fft_size); magt_QA = d_magnitudeQA[indext_QA] / (fft_normalization_factor * fft_normalization_factor); } if (d_sampled_ms > 1) // If Integration time > 1 code { // REPEAT FOR ALL CODES. CODE_IB volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), d_fft_if->get_outbuf(), d_fft_code_I_B, d_fft_size); d_ifft->execute(); volk_32fc_magnitude_squared_32f(d_magnitudeIB, d_ifft->get_outbuf(), d_fft_size); volk_gnsssdr_32f_index_max_32u(&indext_IB, d_magnitudeIB, d_fft_size); magt_IB = d_magnitudeIB[indext_IB] / (fft_normalization_factor * fft_normalization_factor); if (d_both_signal_components == true) { // REPEAT FOR ALL CODES. CODE_QB volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), d_fft_if->get_outbuf(), d_fft_code_Q_B, d_fft_size); d_ifft->execute(); volk_32fc_magnitude_squared_32f(d_magnitudeQB, d_ifft->get_outbuf(), d_fft_size); volk_gnsssdr_32f_index_max_32u(&indext_QB, d_magnitudeQB, d_fft_size); magt_QB = d_magnitudeIB[indext_QB] / (fft_normalization_factor * fft_normalization_factor); } } // Integrate noncoherently the two best combinations (I² + Q²) // and store the result in the I channel. // If CAF filter to resolve doppler ambiguity is needed, // peak is stored before non-coherent integration. if (d_sampled_ms > 1) // T_integration > 1 code { if (magt_IA >= magt_IB) { // if (d_CAF_filter) {d_CAF_vector_I[doppler_index] = magt_IA;} if (d_CAF_window_hz > 0) {d_CAF_vector_I[doppler_index] = d_magnitudeIA[indext_IA];} if (d_both_signal_components) { // Integrate non-coherently I+Q if (magt_QA >= magt_QB) { // if (d_CAF_filter) {d_CAF_vector_Q[doppler_index] = magt_QA;} if (d_CAF_window_hz > 0) {d_CAF_vector_Q[doppler_index] = d_magnitudeQA[indext_QA];} for (unsigned int i=0; i 0) {d_CAF_vector_Q[doppler_index] = d_magnitudeQB[indext_QB];} for (unsigned int i=0; i 0) {d_CAF_vector_I[doppler_index] = d_magnitudeIB[indext_IB];} if (d_both_signal_components) { // Integrate non-coherently I+Q if (magt_QA >= magt_QB) { //if (d_CAF_filter) {d_CAF_vector_Q[doppler_index] = magt_QA;} if (d_CAF_window_hz > 0) {d_CAF_vector_Q[doppler_index] = d_magnitudeQA[indext_QA];} for (unsigned int i=0; i 0) {d_CAF_vector_Q[doppler_index] = d_magnitudeQB[indext_QB];} for (unsigned int i=0; i 0) {d_CAF_vector_I[doppler_index] = d_magnitudeIA[indext_IA];} if (d_both_signal_components) { // if (d_CAF_filter) {d_CAF_vector_Q[doppler_index] = magt_QA;} if (d_CAF_window_hz > 0) {d_CAF_vector_Q[doppler_index] = d_magnitudeQA[indext_QA];} // NON-Coherent integration of only 1 code for (unsigned int i=0; iAcq_delay_samples = static_cast(indext % d_samples_per_code); d_gnss_synchro->Acq_doppler_hz = static_cast(doppler); d_gnss_synchro->Acq_samplestamp_samples = d_sample_counter; // 5- Compute the test statistics and compare to the threshold d_test_statistics = d_mag / d_input_power; } } // Record results to file if required if (d_dump) { std::stringstream filename; std::streamsize n = sizeof(float) * (d_fft_size); // noncomplex file write filename.str(""); filename << "../data/test_statistics_E5a_sat_" << d_gnss_synchro->PRN << "_doppler_" << doppler << ".dat"; d_dump_file.open(filename.str().c_str(), std::ios::out | std::ios::binary); if (d_sampled_ms > 1) // If integration time > 1 code { if (magt_IA >= magt_IB) { d_dump_file.write((char*)d_magnitudeIA, n); } else { d_dump_file.write((char*)d_magnitudeIB, n); } } else { d_dump_file.write((char*)d_magnitudeIA, n); } d_dump_file.close(); } } // std::cout << "d_mag " << d_mag << ".d_sample_counter " << d_sample_counter << ". acq delay " << d_gnss_synchro->Acq_delay_samples<< " indext "<< indext << std::endl; // 6 OPTIONAL: CAF filter to avoid Doppler ambiguity in bit transition. if (d_CAF_window_hz > 0) { int CAF_bins_half; float* accum = static_cast(volk_gnsssdr_malloc(sizeof(float), volk_gnsssdr_get_alignment())); CAF_bins_half = d_CAF_window_hz / (2 * d_doppler_step); float weighting_factor; weighting_factor = 0.5 / static_cast(CAF_bins_half); // weighting_factor = 0; // std::cout << "weighting_factor " << weighting_factor << std::endl; // Initialize first iterations for (int doppler_index = 0; doppler_index < CAF_bins_half; doppler_index++) { d_CAF_vector[doppler_index] = 0; // volk_32f_accumulator_s32f_a(&d_CAF_vector[doppler_index], d_CAF_vector_I, CAF_bins_half+doppler_index+1); for (int i = 0; i < CAF_bins_half + doppler_index + 1; i++) { d_CAF_vector[doppler_index] += d_CAF_vector_I[i] * (1 - weighting_factor * static_cast((doppler_index - i))); } // d_CAF_vector[doppler_index] /= CAF_bins_half+doppler_index+1; d_CAF_vector[doppler_index] /= 1 + CAF_bins_half + doppler_index - weighting_factor * CAF_bins_half * (CAF_bins_half + 1) / 2 - weighting_factor * doppler_index * (doppler_index + 1) / 2; // triangles = [n*(n+1)/2] if (d_both_signal_components) { accum[0] = 0; // volk_32f_accumulator_s32f_a(&accum[0], d_CAF_vector_Q, CAF_bins_half+doppler_index+1); for (int i = 0; i < CAF_bins_half + doppler_index + 1; i++) { accum[0] += d_CAF_vector_Q[i] * (1 - weighting_factor * static_cast(abs(doppler_index - i))); } // accum[0] /= CAF_bins_half+doppler_index+1; accum[0] /= 1 + CAF_bins_half + doppler_index - weighting_factor * CAF_bins_half * (CAF_bins_half + 1) / 2 - weighting_factor * doppler_index * (doppler_index + 1) / 2; // triangles = [n*(n+1)/2] d_CAF_vector[doppler_index] += accum[0]; } } // Body loop for (unsigned int doppler_index = CAF_bins_half; doppler_index < d_num_doppler_bins - CAF_bins_half; doppler_index++) { d_CAF_vector[doppler_index] = 0; // volk_32f_accumulator_s32f_a(&d_CAF_vector[doppler_index], &d_CAF_vector_I[doppler_index-CAF_bins_half], 2*CAF_bins_half+1); for (int i = doppler_index - CAF_bins_half; i < static_cast(doppler_index + CAF_bins_half + 1); i++) { d_CAF_vector[doppler_index] += d_CAF_vector_I[i] * (1 - weighting_factor * static_cast((doppler_index - i))); } // d_CAF_vector[doppler_index] /= 2*CAF_bins_half+1; d_CAF_vector[doppler_index] /= 1 + 2 * CAF_bins_half - 2 * weighting_factor * CAF_bins_half * (CAF_bins_half + 1) / 2; if (d_both_signal_components) { accum[0] = 0; // volk_32f_accumulator_s32f_a(&accum[0], &d_CAF_vector_Q[doppler_index-CAF_bins_half], 2*CAF_bins_half); for (int i = doppler_index-CAF_bins_half; i < static_cast(doppler_index + CAF_bins_half + 1); i++) { accum[0] += d_CAF_vector_Q[i] * (1 - weighting_factor * static_cast((doppler_index - i))); } // accum[0] /= 2*CAF_bins_half+1; accum[0] /= 1 + 2 * CAF_bins_half - 2 * weighting_factor * CAF_bins_half * (CAF_bins_half + 1) / 2; d_CAF_vector[doppler_index] += accum[0]; } } // Final iterations for (int doppler_index = d_num_doppler_bins - CAF_bins_half; doppler_index < static_cast(d_num_doppler_bins); doppler_index++) { d_CAF_vector[doppler_index] = 0; // volk_32f_accumulator_s32f_a(&d_CAF_vector[doppler_index], &d_CAF_vector_I[doppler_index-CAF_bins_half], CAF_bins_half + (d_num_doppler_bins-doppler_index)); for (int i = doppler_index - CAF_bins_half; i < static_cast(d_num_doppler_bins); i++) { d_CAF_vector[doppler_index] += d_CAF_vector_I[i] * (1 - weighting_factor * (abs(doppler_index - i))); } // d_CAF_vector[doppler_index] /= CAF_bins_half+(d_num_doppler_bins-doppler_index); d_CAF_vector[doppler_index] /= 1 + CAF_bins_half + (d_num_doppler_bins - doppler_index - 1) - weighting_factor * CAF_bins_half * (CAF_bins_half + 1) / 2 - weighting_factor * (d_num_doppler_bins - doppler_index - 1) * (d_num_doppler_bins - doppler_index) / 2; if (d_both_signal_components) { accum[0] = 0; // volk_32f_accumulator_s32f_a(&accum[0], &d_CAF_vector_Q[doppler_index-CAF_bins_half], CAF_bins_half + (d_num_doppler_bins-doppler_index)); for (int i = doppler_index-CAF_bins_half; i < static_cast(d_num_doppler_bins); i++) { accum[0] += d_CAF_vector_Q[i] * (1 - weighting_factor * (abs(doppler_index - i))); } // accum[0] /= CAF_bins_half+(d_num_doppler_bins-doppler_index); accum[0] /= 1 + CAF_bins_half + (d_num_doppler_bins - doppler_index - 1) - weighting_factor * CAF_bins_half * (CAF_bins_half + 1) / 2 - weighting_factor * (d_num_doppler_bins - doppler_index - 1) * (d_num_doppler_bins - doppler_index) / 2; d_CAF_vector[doppler_index] += accum[0]; } } // Recompute the maximum doppler peak volk_gnsssdr_32f_index_max_32u(&indext, d_CAF_vector, d_num_doppler_bins); doppler = -static_cast(d_doppler_max) + d_doppler_step * indext; d_gnss_synchro->Acq_doppler_hz = static_cast(doppler); // Dump if required, appended at the end of the file if (d_dump) { std::stringstream filename; std::streamsize n = sizeof(float) * (d_num_doppler_bins); // noncomplex file write filename.str(""); filename << "../data/test_statistics_E5a_sat_" << d_gnss_synchro->PRN << "_CAF.dat"; d_dump_file.open(filename.str().c_str(), std::ios::out | std::ios::binary); d_dump_file.write((char*)d_CAF_vector, n); d_dump_file.close(); } volk_gnsssdr_free(accum); } if (d_well_count == d_max_dwells) { if (d_test_statistics > d_threshold) { d_state = 3; // Positive acquisition } else { d_state = 4; // Negative acquisition } } else { d_state = 1; } consume_each(d_fft_size - d_buffer_count); d_buffer_count = 0; break; } case 3: { // 7.1- Declare positive acquisition using a message port DLOG(INFO) << "positive acquisition"; DLOG(INFO) << "satellite " << d_gnss_synchro->System << " " << d_gnss_synchro->PRN; DLOG(INFO) << "sample_stamp " << d_sample_counter; DLOG(INFO) << "test statistics value " << d_test_statistics; DLOG(INFO) << "test statistics threshold " << d_threshold; DLOG(INFO) << "code phase " << d_gnss_synchro->Acq_delay_samples; DLOG(INFO) << "doppler " << d_gnss_synchro->Acq_doppler_hz; DLOG(INFO) << "magnitude " << d_mag; DLOG(INFO) << "input signal power " << d_input_power; d_active = false; d_state = 0; acquisition_message = 1; this->message_port_pub(pmt::mp("events"), pmt::from_long(acquisition_message)); d_sample_counter += ninput_items[0]; // sample counter consume_each(ninput_items[0]); break; } case 4: { // 7.2- Declare negative acquisition using a message port DLOG(INFO) << "negative acquisition"; DLOG(INFO) << "satellite " << d_gnss_synchro->System << " " << d_gnss_synchro->PRN; DLOG(INFO) << "sample_stamp " << d_sample_counter; DLOG(INFO) << "test statistics value " << d_test_statistics; DLOG(INFO) << "test statistics threshold " << d_threshold; DLOG(INFO) << "code phase " << d_gnss_synchro->Acq_delay_samples; DLOG(INFO) << "doppler " << d_gnss_synchro->Acq_doppler_hz; DLOG(INFO) << "magnitude " << d_mag; DLOG(INFO) << "input signal power " << d_input_power; d_active = false; d_state = 0; d_sample_counter += ninput_items[0]; // sample counter consume_each(ninput_items[0]); acquisition_message = 2; this->message_port_pub(pmt::mp("events"), pmt::from_long(acquisition_message)); break; } } return noutput_items; } galileo_e5a_noncoherent_iq_acquisition_caf_cc.h000066400000000000000000000177141305042567700351610ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/acquisition/gnuradio_blocks/*! * \file galileo_e5a_noncoherent_iq_acquisition_caf_cc.h * \brief Adapts a PCPS acquisition block to an AcquisitionInterface for * Galileo E5a data and pilot Signals * \author Marc Sales, 2014. marcsales92(at)gmail.com * \based on work from: *
    *
  • Javier Arribas, 2011. jarribas(at)cttc.es *
  • Luis Esteve, 2012. luis(at)epsilon-formacion.com *
  • Marc Molina, 2013. marc.molina.pena@gmail.com *
* * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 GALILEO_E5A_NONCOHERENT_IQ_ACQUISITION_CAF_CC_H_ #define GALILEO_E5A_NONCOHERENT_IQ_ACQUISITION_CAF_CC_H_ #include #include #include #include #include #include "gnss_synchro.h" class galileo_e5a_noncoherentIQ_acquisition_caf_cc; typedef boost::shared_ptr galileo_e5a_noncoherentIQ_acquisition_caf_cc_sptr; galileo_e5a_noncoherentIQ_acquisition_caf_cc_sptr galileo_e5a_noncoherentIQ_make_acquisition_caf_cc(unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool dump, std::string dump_filename, bool both_signal_components_, int CAF_window_hz_, int Zero_padding_); /*! * \brief This class implements a Parallel Code Phase Search Acquisition. * * Check \ref Navitec2012 "An Open Source Galileo E1 Software Receiver", * Algorithm 1, for a pseudocode description of this implementation. */ class galileo_e5a_noncoherentIQ_acquisition_caf_cc: public gr::block { private: friend galileo_e5a_noncoherentIQ_acquisition_caf_cc_sptr galileo_e5a_noncoherentIQ_make_acquisition_caf_cc( unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool dump, std::string dump_filename, bool both_signal_components_, int CAF_window_hz_, int Zero_padding_); galileo_e5a_noncoherentIQ_acquisition_caf_cc( unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool dump, std::string dump_filename, bool both_signal_components_, int CAF_window_hz_, int Zero_padding_); void calculate_magnitudes(gr_complex* fft_begin, int doppler_shift, int doppler_offset); float estimate_input_power(gr_complex *in ); long d_fs_in; long d_freq; int d_samples_per_ms; int d_sampled_ms; int d_samples_per_code; unsigned int d_doppler_resolution; float d_threshold; std::string d_satellite_str; unsigned int d_doppler_max; unsigned int d_doppler_step; unsigned int d_max_dwells; unsigned int d_well_count; unsigned int d_fft_size; unsigned long int d_sample_counter; gr_complex** d_grid_doppler_wipeoffs; unsigned int d_num_doppler_bins; gr_complex* d_fft_code_I_A; gr_complex* d_fft_code_I_B; gr_complex* d_fft_code_Q_A; gr_complex* d_fft_code_Q_B; gr_complex* d_inbuffer; gr::fft::fft_complex* d_fft_if; gr::fft::fft_complex* d_ifft; Gnss_Synchro *d_gnss_synchro; unsigned int d_code_phase; float d_doppler_freq; float d_mag; float* d_magnitudeIA; float* d_magnitudeIB; float* d_magnitudeQA; float* d_magnitudeQB; float d_input_power; float d_test_statistics; bool d_bit_transition_flag; std::ofstream d_dump_file; bool d_active; int d_state; bool d_dump; bool d_both_signal_components; // bool d_CAF_filter; int d_CAF_window_hz; float* d_CAF_vector; float* d_CAF_vector_I; float* d_CAF_vector_Q; // double* d_CAF_vector; // double* d_CAF_vector_I; // double* d_CAF_vector_Q; unsigned int d_channel; std::string d_dump_filename; unsigned int d_buffer_count; unsigned int d_gr_stream_buffer; public: /*! * \brief Default destructor. */ ~galileo_e5a_noncoherentIQ_acquisition_caf_cc(); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to exchange synchronization data between acquisition and tracking blocks. * \param p_gnss_synchro Satellite information shared by the processing blocks. */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { d_gnss_synchro = p_gnss_synchro; } /*! * \brief Returns the maximum peak of grid search. */ unsigned int mag() { return d_mag; } /*! * \brief Initializes acquisition algorithm. */ void init(); /*! * \brief Sets local code for PCPS acquisition algorithm. * \param code - Pointer to the PRN code. */ void set_local_code(std::complex * code, std::complex * codeQ); /*! * \brief Starts acquisition algorithm, turning from standby mode to * active mode * \param active - bool that activates/deactivates the block. */ void set_active(bool active) { d_active = active; } /*! * \brief If set to 1, ensures that acquisition starts at the * first available sample. * \param state - int=1 forces start of acquisition */ void set_state(int state); /*! * \brief Set acquisition channel unique ID * \param channel - receiver channel. */ void set_channel(unsigned int channel) { d_channel = channel; } /*! * \brief Set statistics threshold of PCPS algorithm. * \param threshold - Threshold for signal detection (check \ref Navitec2012, * Algorithm 1, for a definition of this threshold). */ void set_threshold(float threshold) { d_threshold = threshold; } /*! * \brief Set maximum Doppler grid search * \param doppler_max - Maximum Doppler shift considered in the grid search [Hz]. */ void set_doppler_max(unsigned int doppler_max) { d_doppler_max = doppler_max; } /*! * \brief Set Doppler steps for the grid search * \param doppler_step - Frequency bin of the search grid [Hz]. */ void set_doppler_step(unsigned int doppler_step) { d_doppler_step = doppler_step; } /*! * \brief Parallel Code Phase Search Acquisition signal processing. */ int general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; #endif /* GALILEO_E5A_NONCOHERENT_IQ_ACQUISITION_CAF_CC_H_ */ gnss-sdr-0.0.9/src/algorithms/acquisition/gnuradio_blocks/galileo_pcps_8ms_acquisition_cc.cc000066400000000000000000000406211305042567700325450ustar00rootroot00000000000000/*! * \file galileo_pcps_8ms_acquisition_cc.cc * \brief This class implements a Parallel Code Phase Search Acquisition for * Galileo E1 signals with coherent integration time = 8 ms (two codes) * \author Marc Molina, 2013. marc.molina.pena(at)gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_pcps_8ms_acquisition_cc.h" #include #include #include #include #include #include "control_message_factory.h" using google::LogMessage; galileo_pcps_8ms_acquisition_cc_sptr galileo_pcps_8ms_make_acquisition_cc( unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool dump, std::string dump_filename) { return galileo_pcps_8ms_acquisition_cc_sptr( new galileo_pcps_8ms_acquisition_cc(sampled_ms, max_dwells, doppler_max, freq, fs_in, samples_per_ms, samples_per_code, dump, dump_filename)); } galileo_pcps_8ms_acquisition_cc::galileo_pcps_8ms_acquisition_cc( unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool dump, std::string dump_filename) : gr::block("galileo_pcps_8ms_acquisition_cc", gr::io_signature::make(1, 1, sizeof(gr_complex) * sampled_ms * samples_per_ms), gr::io_signature::make(0, 0, sizeof(gr_complex) * sampled_ms * samples_per_ms)) { this->message_port_register_out(pmt::mp("events")); d_sample_counter = 0; // SAMPLE COUNTER d_active = false; d_state = 0; d_freq = freq; d_fs_in = fs_in; d_samples_per_ms = samples_per_ms; d_samples_per_code = samples_per_code; d_sampled_ms = sampled_ms; d_max_dwells = max_dwells; d_well_count = 0; d_doppler_max = doppler_max; d_fft_size = d_sampled_ms * d_samples_per_ms; d_mag = 0; d_input_power = 0.0; d_num_doppler_bins = 0; d_fft_code_A = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); d_fft_code_B = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); d_magnitude = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); // Direct FFT d_fft_if = new gr::fft::fft_complex(d_fft_size, true); // Inverse FFT d_ifft = new gr::fft::fft_complex(d_fft_size, false); // For dumping samples into a file d_dump = dump; d_dump_filename = dump_filename; d_doppler_resolution = 0; d_threshold = 0; d_doppler_step = 0; d_grid_doppler_wipeoffs = 0; d_gnss_synchro = 0; d_code_phase = 0; d_doppler_freq = 0; d_test_statistics = 0; d_channel = 0; } galileo_pcps_8ms_acquisition_cc::~galileo_pcps_8ms_acquisition_cc() { if (d_num_doppler_bins > 0) { for (unsigned int i = 0; i < d_num_doppler_bins; i++) { volk_gnsssdr_free(d_grid_doppler_wipeoffs[i]); } delete[] d_grid_doppler_wipeoffs; } volk_gnsssdr_free(d_fft_code_A); volk_gnsssdr_free(d_fft_code_B); volk_gnsssdr_free(d_magnitude); delete d_ifft; delete d_fft_if; if (d_dump) { d_dump_file.close(); } } void galileo_pcps_8ms_acquisition_cc::set_local_code(std::complex * code) { // code A: two replicas of a primary code memcpy(d_fft_if->get_inbuf(), code, sizeof(gr_complex)*d_fft_size); d_fft_if->execute(); // We need the FFT of local code //Conjugate the local code volk_32fc_conjugate_32fc(d_fft_code_A, d_fft_if->get_outbuf(), d_fft_size); // code B: two replicas of a primary code; the second replica is inverted. volk_32fc_s32fc_multiply_32fc(&(d_fft_if->get_inbuf())[d_samples_per_code], &code[d_samples_per_code], gr_complex(-1,0), d_samples_per_code); d_fft_if->execute(); // We need the FFT of local code //Conjugate the local code volk_32fc_conjugate_32fc(d_fft_code_B, d_fft_if->get_outbuf(), d_fft_size); } void galileo_pcps_8ms_acquisition_cc::init() { d_gnss_synchro->Flag_valid_acquisition = false; d_gnss_synchro->Flag_valid_symbol_output = false; d_gnss_synchro->Flag_valid_pseudorange = false; d_gnss_synchro->Flag_valid_word = false; d_gnss_synchro->Flag_preamble = false; d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_mag = 0.0; d_input_power = 0.0; const double GALILEO_TWO_PI = 6.283185307179600; // Count the number of bins d_num_doppler_bins = 0; for (int doppler = static_cast(-d_doppler_max); doppler <= static_cast(d_doppler_max); doppler += d_doppler_step) { d_num_doppler_bins++; } // Create the carrier Doppler wipeoff signals d_grid_doppler_wipeoffs = new gr_complex*[d_num_doppler_bins]; for (unsigned int doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { d_grid_doppler_wipeoffs[doppler_index] = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); int doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; float phase_step_rad = static_cast(GALILEO_TWO_PI) * (d_freq + doppler) / static_cast(d_fs_in); float _phase[1]; _phase[0] = 0; volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], - phase_step_rad, _phase, d_fft_size); } } void galileo_pcps_8ms_acquisition_cc::set_state(int state) { d_state = state; if (d_state == 1) { d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_well_count = 0; d_mag = 0.0; d_input_power = 0.0; d_test_statistics = 0.0; } else if (d_state == 0) {} else { LOG(ERROR) << "State can only be set to 0 or 1"; } } int galileo_pcps_8ms_acquisition_cc::general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items __attribute__((unused))) { int acquisition_message = -1; //0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL switch (d_state) { case 0: { if (d_active) { //restart acquisition variables d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_well_count = 0; d_mag = 0.0; d_input_power = 0.0; d_test_statistics = 0.0; d_state = 1; } d_sample_counter += d_fft_size * ninput_items[0]; // sample counter consume_each(ninput_items[0]); break; } case 1: { // initialize acquisition algorithm int doppler; uint32_t indext = 0; uint32_t indext_A = 0; uint32_t indext_B = 0; float magt = 0.0; float magt_A = 0.0; float magt_B = 0.0; const gr_complex *in = (const gr_complex *)input_items[0]; //Get the input samples pointer float fft_normalization_factor = static_cast(d_fft_size) * static_cast(d_fft_size); d_input_power = 0.0; d_mag = 0.0; d_sample_counter += d_fft_size; // sample counter d_well_count++; DLOG(INFO) << "Channel: " << d_channel << " , doing acquisition of satellite: " << d_gnss_synchro->System << " "<< d_gnss_synchro->PRN << " ,sample stamp: " << d_sample_counter << ", threshold: " << d_threshold << ", doppler_max: " << d_doppler_max << ", doppler_step: " << d_doppler_step; // 1- Compute the input signal power estimation volk_32fc_magnitude_squared_32f(d_magnitude, in, d_fft_size); volk_32f_accumulator_s32f(&d_input_power, d_magnitude, d_fft_size); d_input_power /= static_cast(d_fft_size); // 2- Doppler frequency search loop for (unsigned int doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { // doppler search steps doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; volk_32fc_x2_multiply_32fc(d_fft_if->get_inbuf(), in, d_grid_doppler_wipeoffs[doppler_index], d_fft_size); // 3- Perform the FFT-based convolution (parallel time search) // Compute the FFT of the carrier wiped--off incoming signal d_fft_if->execute(); // Multiply carrier wiped--off, Fourier transformed incoming signal // with the local FFT'd code A reference using SIMD operations with // VOLK library volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), d_fft_if->get_outbuf(), d_fft_code_A, d_fft_size); // compute the inverse FFT d_ifft->execute(); // Search maximum volk_32fc_magnitude_squared_32f(d_magnitude, d_ifft->get_outbuf(), d_fft_size); volk_gnsssdr_32f_index_max_32u(&indext_A, d_magnitude, d_fft_size); // Normalize the maximum value to correct the scale factor introduced by FFTW magt_A = d_magnitude[indext_A] / (fft_normalization_factor * fft_normalization_factor); // Multiply carrier wiped--off, Fourier transformed incoming signal // with the local FFT'd code B reference using SIMD operations with // VOLK library volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), d_fft_if->get_outbuf(), d_fft_code_B, d_fft_size); // compute the inverse FFT d_ifft->execute(); // Search maximum volk_32fc_magnitude_squared_32f(d_magnitude, d_ifft->get_outbuf(), d_fft_size); volk_gnsssdr_32f_index_max_32u(&indext_B, d_magnitude, d_fft_size); // Normalize the maximum value to correct the scale factor introduced by FFTW magt_B = d_magnitude[indext_B] / (fft_normalization_factor * fft_normalization_factor); // Take the greater magnitude if (magt_A >= magt_B) { magt = magt_A; indext = indext_A; } else { magt = magt_B; indext = indext_B; } // 4- record the maximum peak and the associated synchronization parameters if (d_mag < magt) { d_mag = magt; d_gnss_synchro->Acq_delay_samples = static_cast(indext % d_samples_per_code); d_gnss_synchro->Acq_doppler_hz = static_cast(doppler); d_gnss_synchro->Acq_samplestamp_samples = d_sample_counter; } // Record results to file if required if (d_dump) { std::stringstream filename; std::streamsize n = 2 * sizeof(float) * (d_fft_size); // complex file write filename.str(""); filename << "../data/test_statistics_" << d_gnss_synchro->System <<"_" << d_gnss_synchro->Signal << "_sat_" << d_gnss_synchro->PRN << "_doppler_" << doppler << ".dat"; d_dump_file.open(filename.str().c_str(), std::ios::out | std::ios::binary); d_dump_file.write((char*)d_ifft->get_outbuf(), n); //write directly |abs(x)|^2 in this Doppler bin? d_dump_file.close(); } } // 5- Compute the test statistics and compare to the threshold //d_test_statistics = 2 * d_fft_size * d_mag / d_input_power; d_test_statistics = d_mag / d_input_power; if (d_test_statistics > d_threshold) { d_state = 2; // Positive acquisition } else if (d_well_count == d_max_dwells) { d_state = 3; // Negative acquisition } consume_each(1); break; } case 2: { // 6.1- Declare positive acquisition using a message port DLOG(INFO) << "positive acquisition"; DLOG(INFO) << "satellite " << d_gnss_synchro->System << " " << d_gnss_synchro->PRN; DLOG(INFO) << "sample_stamp " << d_sample_counter; DLOG(INFO) << "test statistics value " << d_test_statistics; DLOG(INFO) << "test statistics threshold " << d_threshold; DLOG(INFO) << "code phase " << d_gnss_synchro->Acq_delay_samples; DLOG(INFO) << "doppler " << d_gnss_synchro->Acq_doppler_hz; DLOG(INFO) << "magnitude " << d_mag; DLOG(INFO) << "input signal power " << d_input_power; d_active = false; d_state = 0; d_sample_counter += d_fft_size * ninput_items[0]; // sample counter consume_each(ninput_items[0]); acquisition_message = 1; this->message_port_pub(pmt::mp("events"), pmt::from_long(acquisition_message)); break; } case 3: { // 6.2- Declare negative acquisition using a message port DLOG(INFO) << "negative acquisition"; DLOG(INFO) << "satellite " << d_gnss_synchro->System << " " << d_gnss_synchro->PRN; DLOG(INFO) << "sample_stamp " << d_sample_counter; DLOG(INFO) << "test statistics value " << d_test_statistics; DLOG(INFO) << "test statistics threshold " << d_threshold; DLOG(INFO) << "code phase " << d_gnss_synchro->Acq_delay_samples; DLOG(INFO) << "doppler " << d_gnss_synchro->Acq_doppler_hz; DLOG(INFO) << "magnitude " << d_mag; DLOG(INFO) << "input signal power " << d_input_power; d_active = false; d_state = 0; d_sample_counter += d_fft_size * ninput_items[0]; // sample counter consume_each(ninput_items[0]); acquisition_message = 2; this->message_port_pub(pmt::mp("events"), pmt::from_long(acquisition_message)); break; } } return noutput_items; } gnss-sdr-0.0.9/src/algorithms/acquisition/gnuradio_blocks/galileo_pcps_8ms_acquisition_cc.h000066400000000000000000000146051305042567700324120ustar00rootroot00000000000000/*! * \file galileo_pcps_8ms_acquisition_cc.h * \brief This class implements a Parallel Code Phase Search Acquisition for * Galileo E1 signals with coherent integration time = 8 ms (two codes) * \author Marc Molina, 2013. marc.molina.pena(at)gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_PCPS_8MS_ACQUISITION_CC_H_ #define GNSS_SDR_PCPS_8MS_ACQUISITION_CC_H_ #include #include #include #include #include #include "gnss_synchro.h" class galileo_pcps_8ms_acquisition_cc; typedef boost::shared_ptr galileo_pcps_8ms_acquisition_cc_sptr; galileo_pcps_8ms_acquisition_cc_sptr galileo_pcps_8ms_make_acquisition_cc(unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool dump, std::string dump_filename); /*! * \brief This class implements a Parallel Code Phase Search Acquisition for * Galileo E1 signals with coherent integration time = 8 ms (two codes) */ class galileo_pcps_8ms_acquisition_cc: public gr::block { private: friend galileo_pcps_8ms_acquisition_cc_sptr galileo_pcps_8ms_make_acquisition_cc(unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool dump, std::string dump_filename); galileo_pcps_8ms_acquisition_cc(unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool dump, std::string dump_filename); void calculate_magnitudes(gr_complex* fft_begin, int doppler_shift, int doppler_offset); long d_fs_in; long d_freq; int d_samples_per_ms; int d_samples_per_code; unsigned int d_doppler_resolution; float d_threshold; std::string d_satellite_str; unsigned int d_doppler_max; unsigned int d_doppler_step; unsigned int d_sampled_ms; unsigned int d_max_dwells; unsigned int d_well_count; unsigned int d_fft_size; unsigned long int d_sample_counter; gr_complex** d_grid_doppler_wipeoffs; unsigned int d_num_doppler_bins; gr_complex* d_fft_code_A; gr_complex* d_fft_code_B; gr::fft::fft_complex* d_fft_if; gr::fft::fft_complex* d_ifft; Gnss_Synchro *d_gnss_synchro; unsigned int d_code_phase; float d_doppler_freq; float d_mag; float* d_magnitude; float d_input_power; float d_test_statistics; std::ofstream d_dump_file; bool d_active; int d_state; bool d_dump; unsigned int d_channel; std::string d_dump_filename; public: /*! * \brief Default destructor. */ ~galileo_pcps_8ms_acquisition_cc(); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to exchange synchronization data between acquisition and tracking blocks. * \param p_gnss_synchro Satellite information shared by the processing blocks. */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { d_gnss_synchro = p_gnss_synchro; } /*! * \brief Returns the maximum peak of grid search. */ unsigned int mag() { return d_mag; } /*! * \brief Initializes acquisition algorithm. */ void init(); /*! * \brief Sets local code for PCPS acquisition algorithm. * \param code - Pointer to the PRN code. */ void set_local_code(std::complex * code); /*! * \brief Starts acquisition algorithm, turning from standby mode to * active mode * \param active - bool that activates/deactivates the block. */ void set_active(bool active) { d_active = active; } /*! * \brief If set to 1, ensures that acquisition starts at the * first available sample. * \param state - int=1 forces start of acquisition */ void set_state(int state); /*! * \brief Set acquisition channel unique ID * \param channel - receiver channel. */ void set_channel(unsigned int channel) { d_channel = channel; } /*! * \brief Set statistics threshold of PCPS algorithm. * \param threshold - Threshold for signal detection (check \ref Navitec2012, * Algorithm 1, for a definition of this threshold). */ void set_threshold(float threshold) { d_threshold = threshold; } /*! * \brief Set maximum Doppler grid search * \param doppler_max - Maximum Doppler shift considered in the grid search [Hz]. */ void set_doppler_max(unsigned int doppler_max) { d_doppler_max = doppler_max; } /*! * \brief Set Doppler steps for the grid search * \param doppler_step - Frequency bin of the search grid [Hz]. */ void set_doppler_step(unsigned int doppler_step) { d_doppler_step = doppler_step; } /*! * \brief Parallel Code Phase Search Acquisition signal processing. */ int general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; #endif /* GNSS_SDR_PCPS_8MS_ACQUISITION_CC_H_*/ gnss-sdr-0.0.9/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_cc.cc000066400000000000000000000501251305042567700302620ustar00rootroot00000000000000/*! * \file pcps_acquisition_cc.cc * \brief This class implements a Parallel Code Phase Search Acquisition * \authors
    *
  • Javier Arribas, 2011. jarribas(at)cttc.es *
  • Luis Esteve, 2012. luis(at)epsilon-formacion.com *
  • Marc Molina, 2013. marc.molina.pena@gmail.com *
* * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "pcps_acquisition_cc.h" #include #include #include #include #include #include #include "control_message_factory.h" #include "GPS_L1_CA.h" //GPS_TWO_PI using google::LogMessage; pcps_acquisition_cc_sptr pcps_make_acquisition_cc( unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool use_CFAR_algorithm_flag, bool dump, std::string dump_filename) { return pcps_acquisition_cc_sptr( new pcps_acquisition_cc(sampled_ms, max_dwells, doppler_max, freq, fs_in, samples_per_ms, samples_per_code, bit_transition_flag, use_CFAR_algorithm_flag, dump, dump_filename)); } pcps_acquisition_cc::pcps_acquisition_cc( unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool use_CFAR_algorithm_flag, bool dump, std::string dump_filename) : gr::block("pcps_acquisition_cc", gr::io_signature::make(1, 1, sizeof(gr_complex) * sampled_ms * samples_per_ms * ( bit_transition_flag ? 2 : 1 )), gr::io_signature::make(0, 0, sizeof(gr_complex) * sampled_ms * samples_per_ms * ( bit_transition_flag ? 2 : 1 )) ) { this->message_port_register_out(pmt::mp("events")); d_sample_counter = 0; // SAMPLE COUNTER d_active = false; d_state = 0; d_freq = freq; d_fs_in = fs_in; d_samples_per_ms = samples_per_ms; d_samples_per_code = samples_per_code; d_sampled_ms = sampled_ms; d_max_dwells = max_dwells; d_well_count = 0; d_doppler_max = doppler_max; d_fft_size = d_sampled_ms * d_samples_per_ms; d_mag = 0; d_input_power = 0.0; d_num_doppler_bins = 0; d_bit_transition_flag = bit_transition_flag; d_use_CFAR_algorithm_flag = use_CFAR_algorithm_flag; d_threshold = 0.0; d_doppler_step = 0; d_code_phase = 0; d_test_statistics = 0.0; d_channel = 0; d_doppler_freq = 0.0; //set_relative_rate( 1.0/d_fft_size ); // COD: // Experimenting with the overlap/save technique for handling bit trannsitions // The problem: Circular correlation is asynchronous with the received code. // In effect the first code phase used in the correlation is the current // estimate of the code phase at the start of the input buffer. If this is 1/2 // of the code period a bit transition would move all the signal energy into // adjacent frequency bands at +/- 1/T where T is the integration time. // // We can avoid this by doing linear correlation, effectively doubling the // size of the input buffer and padding the code with zeros. if( d_bit_transition_flag ) { d_fft_size *= 2; d_max_dwells = 1; //Activation of d_bit_transition_flag invalidates the value of d_max_dwells } d_fft_codes = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); d_magnitude = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); // Direct FFT d_fft_if = new gr::fft::fft_complex(d_fft_size, true); // Inverse FFT d_ifft = new gr::fft::fft_complex(d_fft_size, false); // For dumping samples into a file d_dump = dump; d_dump_filename = dump_filename; d_gnss_synchro = 0; d_grid_doppler_wipeoffs = 0; } pcps_acquisition_cc::~pcps_acquisition_cc() { if (d_num_doppler_bins > 0) { for (unsigned int i = 0; i < d_num_doppler_bins; i++) { volk_gnsssdr_free(d_grid_doppler_wipeoffs[i]); } delete[] d_grid_doppler_wipeoffs; } volk_gnsssdr_free(d_fft_codes); volk_gnsssdr_free(d_magnitude); delete d_ifft; delete d_fft_if; if (d_dump) { d_dump_file.close(); } } void pcps_acquisition_cc::set_local_code(std::complex * code) { // COD // Here we want to create a buffer that looks like this: // [ 0 0 0 ... 0 c_0 c_1 ... c_L] // where c_i is the local code and there are L zeros and L chips if( d_bit_transition_flag ) { int offset = d_fft_size/2; std::fill_n( d_fft_if->get_inbuf(), offset, gr_complex( 0.0, 0.0 ) ); memcpy(d_fft_if->get_inbuf() + offset, code, sizeof(gr_complex) * offset); } else { memcpy(d_fft_if->get_inbuf(), code, sizeof(gr_complex) * d_fft_size); } d_fft_if->execute(); // We need the FFT of local code volk_32fc_conjugate_32fc(d_fft_codes, d_fft_if->get_outbuf(), d_fft_size); } void pcps_acquisition_cc::update_local_carrier(gr_complex* carrier_vector, int correlator_length_samples, float freq) { float phase_step_rad = GPS_TWO_PI * freq / static_cast(d_fs_in); float _phase[1]; _phase[0] = 0; volk_gnsssdr_s32f_sincos_32fc(carrier_vector, - phase_step_rad, _phase, correlator_length_samples); } void pcps_acquisition_cc::init() { d_gnss_synchro->Flag_valid_acquisition = false; d_gnss_synchro->Flag_valid_symbol_output = false; d_gnss_synchro->Flag_valid_pseudorange = false; d_gnss_synchro->Flag_valid_word = false; d_gnss_synchro->Flag_preamble = false; d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_mag = 0.0; d_input_power = 0.0; d_num_doppler_bins = ceil( static_cast(static_cast(d_doppler_max) - static_cast(-d_doppler_max)) / static_cast(d_doppler_step)); // Create the carrier Doppler wipeoff signals d_grid_doppler_wipeoffs = new gr_complex*[d_num_doppler_bins]; for (unsigned int doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { d_grid_doppler_wipeoffs[doppler_index] = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); int doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; update_local_carrier(d_grid_doppler_wipeoffs[doppler_index], d_fft_size, d_freq + doppler); } } void pcps_acquisition_cc::set_state(int state) { d_state = state; if (d_state == 1) { d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_well_count = 0; d_mag = 0.0; d_input_power = 0.0; d_test_statistics = 0.0; } else if (d_state == 0) {} else { LOG(ERROR) << "State can only be set to 0 or 1"; } } int pcps_acquisition_cc::general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items __attribute__((unused))) { /* * By J.Arribas, L.Esteve and M.Molina * Acquisition strategy (Kay Borre book + CFAR threshold): * 1. Compute the input signal power estimation * 2. Doppler serial search loop * 3. Perform the FFT-based circular convolution (parallel time search) * 4. Record the maximum peak and the associated synchronization parameters * 5. Compute the test statistics and compare to the threshold * 6. Declare positive or negative acquisition using a message port */ int acquisition_message = -1; //0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL switch (d_state) { case 0: { if (d_active) { //restart acquisition variables d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_well_count = 0; d_mag = 0.0; d_input_power = 0.0; d_test_statistics = 0.0; d_state = 1; } d_sample_counter += d_fft_size * ninput_items[0]; // sample counter consume_each(ninput_items[0]); //DLOG(INFO) << "Consumed " << ninput_items[0] << " items"; break; } case 1: { // initialize acquisition algorithm int doppler; uint32_t indext = 0; float magt = 0.0; const gr_complex *in = (const gr_complex *)input_items[0]; //Get the input samples pointer int effective_fft_size = ( d_bit_transition_flag ? d_fft_size/2 : d_fft_size ); float fft_normalization_factor = static_cast(d_fft_size) * static_cast(d_fft_size); d_input_power = 0.0; d_mag = 0.0; d_sample_counter += d_fft_size; // sample counter d_well_count++; DLOG(INFO) << "Channel: " << d_channel << " , doing acquisition of satellite: " << d_gnss_synchro->System << " " << d_gnss_synchro->PRN << " ,sample stamp: " << d_sample_counter << ", threshold: " << d_threshold << ", doppler_max: " << d_doppler_max << ", doppler_step: " << d_doppler_step; if (d_use_CFAR_algorithm_flag == true) { // 1- (optional) Compute the input signal power estimation volk_32fc_magnitude_squared_32f(d_magnitude, in, d_fft_size); volk_32f_accumulator_s32f(&d_input_power, d_magnitude, d_fft_size); d_input_power /= static_cast(d_fft_size); } // 2- Doppler frequency search loop for (unsigned int doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { // doppler search steps doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; volk_32fc_x2_multiply_32fc(d_fft_if->get_inbuf(), in, d_grid_doppler_wipeoffs[doppler_index], d_fft_size); // 3- Perform the FFT-based convolution (parallel time search) // Compute the FFT of the carrier wiped--off incoming signal d_fft_if->execute(); // Multiply carrier wiped--off, Fourier transformed incoming signal // with the local FFT'd code reference using SIMD operations with VOLK library volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), d_fft_if->get_outbuf(), d_fft_codes, d_fft_size); // compute the inverse FFT d_ifft->execute(); // Search maximum size_t offset = ( d_bit_transition_flag ? effective_fft_size : 0 ); volk_32fc_magnitude_squared_32f(d_magnitude, d_ifft->get_outbuf() + offset, effective_fft_size); volk_gnsssdr_32f_index_max_32u(&indext, d_magnitude, effective_fft_size); magt = d_magnitude[indext]; if (d_use_CFAR_algorithm_flag == true) { // Normalize the maximum value to correct the scale factor introduced by FFTW magt = d_magnitude[indext] / (fft_normalization_factor * fft_normalization_factor); } // 4- record the maximum peak and the associated synchronization parameters if (d_mag < magt) { d_mag = magt; if (d_use_CFAR_algorithm_flag == false) { // Search grid noise floor approximation for this doppler line volk_32f_accumulator_s32f(&d_input_power, d_magnitude, effective_fft_size); d_input_power = (d_input_power - d_mag) / (effective_fft_size - 1); } // In case that d_bit_transition_flag = true, we compare the potentially // new maximum test statistics (d_mag/d_input_power) with the value in // d_test_statistics. When the second dwell is being processed, the value // of d_mag/d_input_power could be lower than d_test_statistics (i.e, // the maximum test statistics in the previous dwell is greater than // current d_mag/d_input_power). Note that d_test_statistics is not // restarted between consecutive dwells in multidwell operation. if (d_test_statistics < (d_mag / d_input_power) || !d_bit_transition_flag) { d_gnss_synchro->Acq_delay_samples = static_cast(indext % d_samples_per_code); d_gnss_synchro->Acq_doppler_hz = static_cast(doppler); d_gnss_synchro->Acq_samplestamp_samples = d_sample_counter; // 5- Compute the test statistics and compare to the threshold //d_test_statistics = 2 * d_fft_size * d_mag / d_input_power; d_test_statistics = d_mag / d_input_power; } } // Record results to file if required if (d_dump) { std::stringstream filename; std::streamsize n = 2 * sizeof(float) * (d_fft_size); // complex file write filename.str(""); boost::filesystem::path p = d_dump_filename; filename << p.parent_path().string() << boost::filesystem::path::preferred_separator << p.stem().string() << "_" << d_gnss_synchro->System <<"_" << d_gnss_synchro->Signal << "_sat_" << d_gnss_synchro->PRN << "_doppler_" << doppler << p.extension().string(); DLOG(INFO) << "Writing ACQ out to " << filename.str(); d_dump_file.open(filename.str().c_str(), std::ios::out | std::ios::binary); d_dump_file.write((char*)d_ifft->get_outbuf(), n); //write directly |abs(x)|^2 in this Doppler bin? d_dump_file.close(); } } if (!d_bit_transition_flag) { if (d_test_statistics > d_threshold) { d_state = 2; // Positive acquisition } else if (d_well_count == d_max_dwells) { d_state = 3; // Negative acquisition } } else { if (d_well_count == d_max_dwells) // d_max_dwells = 2 { if (d_test_statistics > d_threshold) { d_state = 2; // Positive acquisition } else { d_state = 3; // Negative acquisition } } } consume_each(1); DLOG(INFO) << "Done. Consumed 1 item."; break; } case 2: { // 6.1- Declare positive acquisition using a message port DLOG(INFO) << "positive acquisition"; DLOG(INFO) << "satellite " << d_gnss_synchro->System << " " << d_gnss_synchro->PRN; DLOG(INFO) << "sample_stamp " << d_sample_counter; DLOG(INFO) << "test statistics value " << d_test_statistics; DLOG(INFO) << "test statistics threshold " << d_threshold; DLOG(INFO) << "code phase " << d_gnss_synchro->Acq_delay_samples; DLOG(INFO) << "doppler " << d_gnss_synchro->Acq_doppler_hz; DLOG(INFO) << "magnitude " << d_mag; DLOG(INFO) << "input signal power " << d_input_power; d_active = false; d_state = 0; d_sample_counter += d_fft_size * ninput_items[0]; // sample counter consume_each(ninput_items[0]); acquisition_message = 1; this->message_port_pub(pmt::mp("events"), pmt::from_long(acquisition_message)); break; } case 3: { // 6.2- Declare negative acquisition using a message port DLOG(INFO) << "negative acquisition"; DLOG(INFO) << "satellite " << d_gnss_synchro->System << " " << d_gnss_synchro->PRN; DLOG(INFO) << "sample_stamp " << d_sample_counter; DLOG(INFO) << "test statistics value " << d_test_statistics; DLOG(INFO) << "test statistics threshold " << d_threshold; DLOG(INFO) << "code phase " << d_gnss_synchro->Acq_delay_samples; DLOG(INFO) << "doppler " << d_gnss_synchro->Acq_doppler_hz; DLOG(INFO) << "magnitude " << d_mag; DLOG(INFO) << "input signal power " << d_input_power; d_active = false; d_state = 0; d_sample_counter += d_fft_size * ninput_items[0]; // sample counter consume_each(ninput_items[0]); acquisition_message = 2; this->message_port_pub(pmt::mp("events"), pmt::from_long(acquisition_message)); break; } } return noutput_items; } //void pcps_acquisition_cc::forecast (int noutput_items, gr_vector_int &ninput_items_required) //{ //// COD: //// For zero-padded case we need one extra code period //if( d_bit_transition_flag ) //{ //ninput_items_required[0] = noutput_items*(d_samples_per_code * d_max_dwells + d_samples_per_code); //} //else //{ //ninput_items_required[0] = noutput_items*d_fft_size*d_max_dwells; //} //} gnss-sdr-0.0.9/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_cc.h000066400000000000000000000164421305042567700301300ustar00rootroot00000000000000/*! * \file pcps_acquisition_cc.h * \brief This class implements a Parallel Code Phase Search Acquisition * * Acquisition strategy (Kay Borre book + CFAR threshold). *
    *
  1. Compute the input signal power estimation *
  2. Doppler serial search loop *
  3. Perform the FFT-based circular convolution (parallel time search) *
  4. Record the maximum peak and the associated synchronization parameters *
  5. Compute the test statistics and compare to the threshold *
  6. Declare positive or negative acquisition using a message queue *
* * Kay Borre book: K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * "A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach", Birkha user, 2007. pp 81-84 * * \authors
    *
  • Javier Arribas, 2011. jarribas(at)cttc.es *
  • Luis Esteve, 2012. luis(at)epsilon-formacion.com *
  • Marc Molina, 2013. marc.molina.pena@gmail.com *
* * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_PCPS_ACQUISITION_CC_H_ #define GNSS_SDR_PCPS_ACQUISITION_CC_H_ #include #include #include #include #include #include "gnss_synchro.h" class pcps_acquisition_cc; typedef boost::shared_ptr pcps_acquisition_cc_sptr; pcps_acquisition_cc_sptr pcps_make_acquisition_cc(unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool use_CFAR_algorithm_flag, bool dump, std::string dump_filename); /*! * \brief This class implements a Parallel Code Phase Search Acquisition. * * Check \ref Navitec2012 "An Open Source Galileo E1 Software Receiver", * Algorithm 1, for a pseudocode description of this implementation. */ class pcps_acquisition_cc: public gr::block { private: friend pcps_acquisition_cc_sptr pcps_make_acquisition_cc(unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool use_CFAR_algorithm_flag, bool dump, std::string dump_filename); pcps_acquisition_cc(unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool use_CFAR_algorithm_flag, bool dump, std::string dump_filename); void update_local_carrier(gr_complex* carrier_vector, int correlator_length_samples, float freq); long d_fs_in; long d_freq; int d_samples_per_ms; int d_samples_per_code; //unsigned int d_doppler_resolution; float d_threshold; std::string d_satellite_str; unsigned int d_doppler_max; unsigned int d_doppler_step; unsigned int d_sampled_ms; unsigned int d_max_dwells; unsigned int d_well_count; unsigned int d_fft_size; unsigned long int d_sample_counter; gr_complex** d_grid_doppler_wipeoffs; unsigned int d_num_doppler_bins; gr_complex* d_fft_codes; gr::fft::fft_complex* d_fft_if; gr::fft::fft_complex* d_ifft; Gnss_Synchro *d_gnss_synchro; unsigned int d_code_phase; float d_doppler_freq; float d_mag; float* d_magnitude; float d_input_power; float d_test_statistics; bool d_bit_transition_flag; bool d_use_CFAR_algorithm_flag; std::ofstream d_dump_file; bool d_active; int d_state; bool d_dump; unsigned int d_channel; std::string d_dump_filename; public: /*! * \brief Default destructor. */ ~pcps_acquisition_cc(); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to exchange synchronization data between acquisition and tracking blocks. * \param p_gnss_synchro Satellite information shared by the processing blocks. */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { d_gnss_synchro = p_gnss_synchro; } /*! * \brief Returns the maximum peak of grid search. */ unsigned int mag() { return d_mag; } /*! * \brief Initializes acquisition algorithm. */ void init(); /*! * \brief Sets local code for PCPS acquisition algorithm. * \param code - Pointer to the PRN code. */ void set_local_code(std::complex * code); /*! * \brief Starts acquisition algorithm, turning from standby mode to * active mode * \param active - bool that activates/deactivates the block. */ void set_active(bool active) { d_active = active; } /*! * \brief If set to 1, ensures that acquisition starts at the * first available sample. * \param state - int=1 forces start of acquisition */ void set_state(int state); /*! * \brief Set acquisition channel unique ID * \param channel - receiver channel. */ void set_channel(unsigned int channel) { d_channel = channel; } /*! * \brief Set statistics threshold of PCPS algorithm. * \param threshold - Threshold for signal detection (check \ref Navitec2012, * Algorithm 1, for a definition of this threshold). */ void set_threshold(float threshold) { d_threshold = threshold; } /*! * \brief Set maximum Doppler grid search * \param doppler_max - Maximum Doppler shift considered in the grid search [Hz]. */ void set_doppler_max(unsigned int doppler_max) { d_doppler_max = doppler_max; } /*! * \brief Set Doppler steps for the grid search * \param doppler_step - Frequency bin of the search grid [Hz]. */ void set_doppler_step(unsigned int doppler_step) { d_doppler_step = doppler_step; } /*! * \brief Parallel Code Phase Search Acquisition signal processing. */ int general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; #endif /* GNSS_SDR_PCPS_ACQUISITION_CC_H_*/ gnss-sdr-0.0.9/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fine_doppler_cc.cc000066400000000000000000000504331305042567700330120ustar00rootroot00000000000000/*! * \file pcps_acquisition_fine_doppler_acquisition_cc.cc * \brief This class implements a Parallel Code Phase Search Acquisition with multi-dwells and fine Doppler estimation * \authors
    *
  • Javier Arribas, 2013. jarribas(at)cttc.es *
* * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "pcps_acquisition_fine_doppler_cc.h" #include // std::rotate #include #include #include #include #include #include "concurrent_map.h" #include "gps_sdr_signal_processing.h" #include "control_message_factory.h" #include "GPS_L1_CA.h" using google::LogMessage; pcps_acquisition_fine_doppler_cc_sptr pcps_make_acquisition_fine_doppler_cc( int max_dwells, unsigned int sampled_ms, int doppler_max, int doppler_min, long freq, long fs_in, int samples_per_ms, bool dump, std::string dump_filename) { return pcps_acquisition_fine_doppler_cc_sptr( new pcps_acquisition_fine_doppler_cc(max_dwells, sampled_ms, doppler_max, doppler_min, freq, fs_in, samples_per_ms, dump, dump_filename)); } pcps_acquisition_fine_doppler_cc::pcps_acquisition_fine_doppler_cc( int max_dwells, unsigned int sampled_ms, int doppler_max, int doppler_min, long freq, long fs_in, int samples_per_ms, bool dump, std::string dump_filename) : gr::block("pcps_acquisition_fine_doppler_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(0, 0, sizeof(gr_complex))) { this->message_port_register_out(pmt::mp("events")); d_sample_counter = 0; // SAMPLE COUNTER d_active = false; d_freq = freq; d_fs_in = fs_in; d_samples_per_ms = samples_per_ms; d_sampled_ms = sampled_ms; d_config_doppler_max = doppler_max; d_config_doppler_min = doppler_min; d_fft_size = d_sampled_ms * d_samples_per_ms; // HS Acquisition d_max_dwells = max_dwells; d_gnuradio_forecast_samples = d_fft_size; d_input_power = 0.0; d_state = 0; d_carrier = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); d_fft_codes = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); d_magnitude = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); // Direct FFT d_fft_if = new gr::fft::fft_complex(d_fft_size, true); // Inverse FFT d_ifft = new gr::fft::fft_complex(d_fft_size, false); // For dumping samples into a file d_dump = dump; d_dump_filename = dump_filename; d_doppler_resolution = 0; d_threshold = 0; d_num_doppler_points = 0; d_doppler_step = 0; d_grid_data = 0; d_grid_doppler_wipeoffs = 0; d_gnss_synchro = 0; d_code_phase = 0; d_doppler_freq = 0; d_test_statistics = 0; d_well_count = 0; d_channel = 0; } void pcps_acquisition_fine_doppler_cc::set_doppler_step(unsigned int doppler_step) { d_doppler_step = doppler_step; // Create the search grid array d_num_doppler_points = floor(std::abs(d_config_doppler_max - d_config_doppler_min) / d_doppler_step); d_grid_data = new float*[d_num_doppler_points]; for (int i = 0; i < d_num_doppler_points; i++) { d_grid_data[i] = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); } update_carrier_wipeoff(); } void pcps_acquisition_fine_doppler_cc::free_grid_memory() { for (int i = 0; i < d_num_doppler_points; i++) { volk_gnsssdr_free(d_grid_data[i]); delete[] d_grid_doppler_wipeoffs[i]; } delete d_grid_data; delete d_grid_doppler_wipeoffs; } pcps_acquisition_fine_doppler_cc::~pcps_acquisition_fine_doppler_cc() { volk_gnsssdr_free(d_carrier); volk_gnsssdr_free(d_fft_codes); volk_gnsssdr_free(d_magnitude); delete d_ifft; delete d_fft_if; if (d_dump) { d_dump_file.close(); } free_grid_memory(); } void pcps_acquisition_fine_doppler_cc::set_local_code(std::complex * code) { memcpy(d_fft_if->get_inbuf(), code, sizeof(gr_complex) * d_fft_size); d_fft_if->execute(); // We need the FFT of local code //Conjugate the local code volk_32fc_conjugate_32fc(d_fft_codes, d_fft_if->get_outbuf(), d_fft_size); } void pcps_acquisition_fine_doppler_cc::init() { d_gnss_synchro->Flag_valid_acquisition = false; d_gnss_synchro->Flag_valid_symbol_output = false; d_gnss_synchro->Flag_valid_pseudorange = false; d_gnss_synchro->Flag_valid_word = false; d_gnss_synchro->Flag_preamble = false; d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_input_power = 0.0; d_state = 0; } void pcps_acquisition_fine_doppler_cc::forecast (int noutput_items, gr_vector_int &ninput_items_required) { if (noutput_items != 0) { ninput_items_required[0] = d_gnuradio_forecast_samples ; //set the required available samples in each call } } void pcps_acquisition_fine_doppler_cc::reset_grid() { d_well_count = 0; for (int i = 0; i < d_num_doppler_points; i++) { for (unsigned int j = 0; j < d_fft_size; j++) { d_grid_data[i][j] = 0.0; } } } void pcps_acquisition_fine_doppler_cc::update_carrier_wipeoff() { // create the carrier Doppler wipeoff signals int doppler_hz; float phase_step_rad; d_grid_doppler_wipeoffs = new gr_complex*[d_num_doppler_points]; for (int doppler_index = 0; doppler_index < d_num_doppler_points; doppler_index++) { doppler_hz = d_config_doppler_min + d_doppler_step*doppler_index; // doppler search steps // compute the carrier doppler wipe-off signal and store it phase_step_rad = static_cast(GPS_TWO_PI) * ( d_freq + doppler_hz ) / static_cast(d_fs_in); d_grid_doppler_wipeoffs[doppler_index] = new gr_complex[d_fft_size]; float _phase[1]; _phase[0] = 0; volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], - phase_step_rad, _phase, d_fft_size); } } double pcps_acquisition_fine_doppler_cc::search_maximum() { float magt = 0.0; float fft_normalization_factor; int index_doppler = 0; uint32_t tmp_intex_t = 0; uint32_t index_time = 0; for (int i=0;i magt) { magt = d_grid_data[i][tmp_intex_t]; //std::cout<(d_fft_size) * static_cast(d_fft_size); magt = magt / (fft_normalization_factor * fft_normalization_factor); // 5- Compute the test statistics and compare to the threshold d_test_statistics = magt/(d_input_power*std::sqrt(d_well_count)); // 4- record the maximum peak and the associated synchronization parameters d_gnss_synchro->Acq_delay_samples = static_cast(index_time); d_gnss_synchro->Acq_doppler_hz = static_cast(index_doppler * d_doppler_step + d_config_doppler_min); d_gnss_synchro->Acq_samplestamp_samples = d_sample_counter; // Record results to file if required if (d_dump) { std::stringstream filename; std::streamsize n = 2 * sizeof(float) * (d_fft_size); // complex file write filename.str(""); filename << "../data/test_statistics_" << d_gnss_synchro->System <<"_" << d_gnss_synchro->Signal << "_sat_" << d_gnss_synchro->PRN << "_doppler_" << d_gnss_synchro->Acq_doppler_hz << ".dat"; d_dump_file.open(filename.str().c_str(), std::ios::out | std::ios::binary); d_dump_file.write((char*)d_grid_data[index_doppler], n); //write directly |abs(x)|^2 in this Doppler bin? d_dump_file.close(); } return d_test_statistics; } float pcps_acquisition_fine_doppler_cc::estimate_input_power(gr_vector_const_void_star &input_items) { const gr_complex *in = (const gr_complex *)input_items[0]; //Get the input samples pointer // Compute the input signal power estimation float power = 0; volk_32fc_magnitude_squared_32f(d_magnitude, in, d_fft_size); volk_32f_accumulator_s32f(&power, d_magnitude, d_fft_size); power /= static_cast(d_fft_size); return power; } int pcps_acquisition_fine_doppler_cc::compute_and_accumulate_grid(gr_vector_const_void_star &input_items) { // initialize acquisition algorithm const gr_complex *in = (const gr_complex *)input_items[0]; //Get the input samples pointer DLOG(INFO) << "Channel: " << d_channel << " , doing acquisition of satellite: " << d_gnss_synchro->System << " "<< d_gnss_synchro->PRN << " ,sample stamp: " << d_sample_counter << ", threshold: " << d_threshold << ", doppler_max: " << d_config_doppler_max << ", doppler_step: " << d_doppler_step; // 2- Doppler frequency search loop float* p_tmp_vector = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); for (int doppler_index = 0; doppler_index < d_num_doppler_points; doppler_index++) { // doppler search steps // Perform the carrier wipe-off volk_32fc_x2_multiply_32fc(d_fft_if->get_inbuf(), in, d_grid_doppler_wipeoffs[doppler_index], d_fft_size); // 3- Perform the FFT-based convolution (parallel time search) // Compute the FFT of the carrier wiped--off incoming signal d_fft_if->execute(); // Multiply carrier wiped--off, Fourier transformed incoming signal // with the local FFT'd code reference using SIMD operations with VOLK library volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), d_fft_if->get_outbuf(), d_fft_codes, d_fft_size); // compute the inverse FFT d_ifft->execute(); // save the grid matrix delay file volk_32fc_magnitude_squared_32f(p_tmp_vector, d_ifft->get_outbuf(), d_fft_size); const float* old_vector = d_grid_data[doppler_index]; volk_32f_x2_add_32f(d_grid_data[doppler_index], old_vector, p_tmp_vector, d_fft_size); } volk_gnsssdr_free(p_tmp_vector); return d_fft_size; } int pcps_acquisition_fine_doppler_cc::estimate_Doppler(gr_vector_const_void_star &input_items) { // Direct FFT int zero_padding_factor = 2; int fft_size_extended = d_fft_size * zero_padding_factor; gr::fft::fft_complex *fft_operator = new gr::fft::fft_complex(fft_size_extended, true); //zero padding the entire vector memset(fft_operator->get_inbuf(), 0, fft_size_extended * sizeof(gr_complex)); //1. generate local code aligned with the acquisition code phase estimation gr_complex *code_replica = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); gps_l1_ca_code_gen_complex_sampled(code_replica, d_gnss_synchro->PRN, d_fs_in, 0); int shift_index = static_cast(d_gnss_synchro->Acq_delay_samples); // Rotate to align the local code replica using acquisition time delay estimation if (shift_index != 0) { std::rotate(code_replica, code_replica + (d_fft_size - shift_index), code_replica + d_fft_size - 1); } //2. Perform code wipe-off const gr_complex *in = (const gr_complex *)input_items[0]; //Get the input samples pointer volk_32fc_x2_multiply_32fc(fft_operator->get_inbuf(), in, code_replica, d_fft_size); // 3. Perform the FFT (zero padded!) fft_operator->execute(); // 4. Compute the magnitude and find the maximum float* p_tmp_vector = static_cast(volk_gnsssdr_malloc(fft_size_extended * sizeof(float), volk_gnsssdr_get_alignment())); volk_32fc_magnitude_squared_32f(p_tmp_vector, fft_operator->get_outbuf(), fft_size_extended); uint32_t tmp_index_freq = 0; volk_gnsssdr_32f_index_max_32u(&tmp_index_freq, p_tmp_vector, fft_size_extended); //case even int counter = 0; float fftFreqBins[fft_size_extended]; memset(fftFreqBins, 0, fft_size_extended * sizeof(float)); for (int k=0; k < (fft_size_extended / 2); k++) { fftFreqBins[counter] = ((static_cast(d_fs_in) / 2.0) * static_cast(k)) / (static_cast(fft_size_extended) / 2.0); counter++; } for (int k = fft_size_extended / 2; k > 0; k--) { fftFreqBins[counter] = ((-static_cast(d_fs_in) / 2) * static_cast(k)) / (static_cast(fft_size_extended) / 2.0); counter++; } // 5. Update the Doppler estimation in Hz if (std::abs(fftFreqBins[tmp_index_freq] - d_gnss_synchro->Acq_doppler_hz) < 1000) { d_gnss_synchro->Acq_doppler_hz = static_cast(fftFreqBins[tmp_index_freq]); //std::cout<<"FFT maximum present at "<PRN << ".dat"; // d_dump_file.open(filename.str().c_str(), std::ios::out // | std::ios::binary); // d_dump_file.write((char*)code_replica, n); //write directly |abs(x)|^2 in this Doppler bin? // d_dump_file.close(); // // filename.str(""); // filename << "../data/signal_prn_" << d_gnss_synchro->PRN << ".dat"; // d_dump_file.open(filename.str().c_str(), std::ios::out // | std::ios::binary); // d_dump_file.write((char*)in, n); //write directly |abs(x)|^2 in this Doppler bin? // d_dump_file.close(); // // // n = sizeof(float) * (fft_size_extended); // filename.str(""); // filename << "../data/fft_prn_" << d_gnss_synchro->PRN << ".dat"; // d_dump_file.open(filename.str().c_str(), std::ios::out // | std::ios::binary); // d_dump_file.write((char*)p_tmp_vector, n); //write directly |abs(x)|^2 in this Doppler bin? // d_dump_file.close(); } // free memory!! delete fft_operator; volk_gnsssdr_free(code_replica); volk_gnsssdr_free(p_tmp_vector); return d_fft_size; } int pcps_acquisition_fine_doppler_cc::general_work(int noutput_items, gr_vector_int &ninput_items __attribute__((unused)), gr_vector_const_void_star &input_items, gr_vector_void_star &output_items __attribute__((unused))) { /*! * TODO: High sensitivity acquisition algorithm: * State Mechine: * S0. StandBy. If d_active==1 -> S1 * S1. ComputeGrid. Perform the FFT acqusition doppler and delay grid. * Accumulate the search grid matrix (#doppler_bins x #fft_size) * Compare maximum to threshold and decide positive or negative * If T>=gamma -> S4 else * If d_well_count S2 * else -> S5. * S4. Positive_Acq: Send message and stop acq -> S0 * S5. Negative_Acq: Send message and stop acq -> S0 */ switch (d_state) { case 0: // S0. StandBy //DLOG(INFO) <<"S0"<= d_max_dwells) { d_state = 2; } break; case 2: // Compute test statistics and decide //DLOG(INFO) <<"S2"< d_threshold) { d_state = 3; //perform fine doppler estimation } else { d_state = 5; //negative acquisition } break; case 3: // Fine doppler estimation //DLOG(INFO) <<"S3"<System << " " << d_gnss_synchro->PRN; DLOG(INFO) << "sample_stamp " << d_sample_counter; DLOG(INFO) << "test statistics value " << d_test_statistics; DLOG(INFO) << "test statistics threshold " << d_threshold; DLOG(INFO) << "code phase " << d_gnss_synchro->Acq_delay_samples; DLOG(INFO) << "doppler " << d_gnss_synchro->Acq_doppler_hz; DLOG(INFO) << "input signal power " << d_input_power; d_active = false; // Send message to channel port //0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL this->message_port_pub(pmt::mp("events"), pmt::from_long(1)); d_state = 0; break; case 5: // Negative_Acq //DLOG(INFO) <<"S5"<System << " " << d_gnss_synchro->PRN; DLOG(INFO) << "sample_stamp " << d_sample_counter; DLOG(INFO) << "test statistics value " << d_test_statistics; DLOG(INFO) << "test statistics threshold " << d_threshold; DLOG(INFO) << "code phase " << d_gnss_synchro->Acq_delay_samples; DLOG(INFO) << "doppler " << d_gnss_synchro->Acq_doppler_hz; DLOG(INFO) << "input signal power " << d_input_power; d_active = false; // Send message to channel port //0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL this->message_port_pub(pmt::mp("events"), pmt::from_long(2)); d_state = 0; break; default: d_state = 0; break; } //DLOG(INFO)<<"d_sample_counter="< *
  • Compute the input signal power estimation *
  • Doppler serial search loop *
  • Perform the FFT-based circular convolution (parallel time search) *
  • Record the maximum peak and the associated synchronization parameters *
  • Compute the test statistics and compare to the threshold *
  • Declare positive or negative acquisition using a message port * * * Kay Borre book: K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * "A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach", Birkha user, 2007. pp 81-84 * * \authors
      *
    • Javier Arribas, 2013. jarribas(at)cttc.es *
    * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_PCPS_ACQUISITION_FINE_DOPPLER_CC_H_ #define GNSS_SDR_PCPS_ACQUISITION_FINE_DOPPLER_CC_H_ #include #include #include #include #include #include "gnss_synchro.h" class pcps_acquisition_fine_doppler_cc; typedef boost::shared_ptr pcps_acquisition_fine_doppler_cc_sptr; pcps_acquisition_fine_doppler_cc_sptr pcps_make_acquisition_fine_doppler_cc(int max_dwells, unsigned int sampled_ms, int doppler_max, int doppler_min, long freq, long fs_in, int samples_per_ms, bool dump, std::string dump_filename); /*! * \brief This class implements a Parallel Code Phase Search Acquisition. * * Check \ref Navitec2012 "An Open Source Galileo E1 Software Receiver", * Algorithm 1, for a pseudocode description of this implementation. */ class pcps_acquisition_fine_doppler_cc: public gr::block { private: friend pcps_acquisition_fine_doppler_cc_sptr pcps_make_acquisition_fine_doppler_cc(int max_dwells, unsigned int sampled_ms, int doppler_max, int doppler_min, long freq, long fs_in, int samples_per_ms, bool dump, std::string dump_filename); pcps_acquisition_fine_doppler_cc(int max_dwells, unsigned int sampled_ms, int doppler_max, int doppler_min, long freq, long fs_in, int samples_per_ms, bool dump, std::string dump_filename); void calculate_magnitudes(gr_complex* fft_begin, int doppler_shift, int doppler_offset); int compute_and_accumulate_grid(gr_vector_const_void_star &input_items); int estimate_Doppler(gr_vector_const_void_star &input_items); float estimate_input_power(gr_vector_const_void_star &input_items); double search_maximum(); void reset_grid(); void update_carrier_wipeoff(); void free_grid_memory(); long d_fs_in; long d_freq; int d_samples_per_ms; int d_max_dwells; unsigned int d_doppler_resolution; int d_gnuradio_forecast_samples; float d_threshold; std::string d_satellite_str; int d_config_doppler_max; int d_config_doppler_min; int d_num_doppler_points; int d_doppler_step; unsigned int d_sampled_ms; unsigned int d_fft_size; unsigned long int d_sample_counter; gr_complex* d_carrier; gr_complex* d_fft_codes; float* d_magnitude; float** d_grid_data; gr_complex** d_grid_doppler_wipeoffs; gr::fft::fft_complex* d_fft_if; gr::fft::fft_complex* d_ifft; Gnss_Synchro *d_gnss_synchro; unsigned int d_code_phase; float d_doppler_freq; float d_input_power; float d_test_statistics; std::ofstream d_dump_file; int d_state; bool d_active; int d_well_count; bool d_dump; unsigned int d_channel; std::string d_dump_filename; public: /*! * \brief Default destructor. */ ~pcps_acquisition_fine_doppler_cc(); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to exchange synchronization data between acquisition and tracking blocks. * \param p_gnss_synchro Satellite information shared by the processing blocks. */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { d_gnss_synchro = p_gnss_synchro; } /*! * \brief Returns the maximum peak of grid search. */ unsigned int mag() { return d_test_statistics; } /*! * \brief Initializes acquisition algorithm. */ void init(); /*! * \brief Sets local code for PCPS acquisition algorithm. * \param code - Pointer to the PRN code. */ void set_local_code(std::complex * code); /*! * \brief Starts acquisition algorithm, turning from standby mode to * active mode * \param active - bool that activates/deactivates the block. */ void set_active(bool active) { d_active = active; } /*! * \brief Set acquisition channel unique ID * \param channel - receiver channel. */ void set_channel(unsigned int channel) { d_channel = channel; } /*! * \brief Set statistics threshold of PCPS algorithm. * \param threshold - Threshold for signal detection (check \ref Navitec2012, * Algorithm 1, for a definition of this threshold). */ void set_threshold(float threshold) { d_threshold = threshold; } /*! * \brief Set maximum Doppler grid search * \param doppler_max - Maximum Doppler shift considered in the grid search [Hz]. */ void set_doppler_max(unsigned int doppler_max) { d_config_doppler_max = doppler_max; } /*! * \brief Set Doppler steps for the grid search * \param doppler_step - Frequency bin of the search grid [Hz]. */ void set_doppler_step(unsigned int doppler_step); /*! * \brief Parallel Code Phase Search Acquisition signal processing. */ int general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); void forecast (int noutput_items, gr_vector_int &ninput_items_required); }; #endif /* pcps_acquisition_fine_doppler_cc*/ gnss-sdr-0.0.9/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_sc.cc000066400000000000000000000477751305042567700303230ustar00rootroot00000000000000/*! * \file pcps_acquisition_sc.cc * \brief This class implements a Parallel Code Phase Search Acquisition * \authors
      *
    • Javier Arribas, 2011. jarribas(at)cttc.es *
    • Luis Esteve, 2012. luis(at)epsilon-formacion.com *
    • Marc Molina, 2013. marc.molina.pena@gmail.com *
    * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "pcps_acquisition_sc.h" #include #include #include #include #include #include #include "control_message_factory.h" #include "GPS_L1_CA.h" //GPS_TWO_PI using google::LogMessage; pcps_acquisition_sc_sptr pcps_make_acquisition_sc( unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool use_CFAR_algorithm_flag, bool dump, std::string dump_filename) { return pcps_acquisition_sc_sptr( new pcps_acquisition_sc(sampled_ms, max_dwells, doppler_max, freq, fs_in, samples_per_ms, samples_per_code, bit_transition_flag, use_CFAR_algorithm_flag, dump, dump_filename)); } pcps_acquisition_sc::pcps_acquisition_sc( unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool use_CFAR_algorithm_flag, bool dump, std::string dump_filename) : gr::block("pcps_acquisition_sc", gr::io_signature::make(1, 1, sizeof(lv_16sc_t) * sampled_ms * samples_per_ms * ( bit_transition_flag ? 2 : 1 )), gr::io_signature::make(0, 0, 0)) { this->message_port_register_out(pmt::mp("events")); d_sample_counter = 0; // SAMPLE COUNTER d_active = false; d_state = 0; d_freq = freq; d_fs_in = fs_in; d_samples_per_ms = samples_per_ms; d_samples_per_code = samples_per_code; d_sampled_ms = sampled_ms; d_max_dwells = max_dwells; d_well_count = 0; d_doppler_max = doppler_max; d_fft_size = d_sampled_ms * d_samples_per_ms; d_mag = 0; d_input_power = 0.0; d_num_doppler_bins = 0; d_bit_transition_flag = bit_transition_flag; d_use_CFAR_algorithm_flag = use_CFAR_algorithm_flag; d_threshold = 0.0; d_doppler_step = 250; d_code_phase = 0; d_test_statistics = 0.0; d_channel = 0; d_doppler_freq = 0.0; //set_relative_rate( 1.0/d_fft_size ); // COD: // Experimenting with the overlap/save technique for handling bit trannsitions // The problem: Circular correlation is asynchronous with the received code. // In effect the first code phase used in the correlation is the current // estimate of the code phase at the start of the input buffer. If this is 1/2 // of the code period a bit transition would move all the signal energy into // adjacent frequency bands at +/- 1/T where T is the integration time. // // We can avoid this by doing linear correlation, effectively doubling the // size of the input buffer and padding the code with zeros. if( d_bit_transition_flag ) { d_fft_size *= 2; d_max_dwells = 1; } d_fft_codes = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); d_magnitude = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); //temporary storage for the input conversion from 16sc to float 32fc d_in_32fc = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); // Direct FFT d_fft_if = new gr::fft::fft_complex(d_fft_size, true); // Inverse FFT d_ifft = new gr::fft::fft_complex(d_fft_size, false); // For dumping samples into a file d_dump = dump; d_dump_filename = dump_filename; d_gnss_synchro = 0; d_grid_doppler_wipeoffs = 0; } pcps_acquisition_sc::~pcps_acquisition_sc() { if (d_num_doppler_bins > 0) { for (unsigned int i = 0; i < d_num_doppler_bins; i++) { volk_gnsssdr_free(d_grid_doppler_wipeoffs[i]); } delete[] d_grid_doppler_wipeoffs; } volk_gnsssdr_free(d_fft_codes); volk_gnsssdr_free(d_magnitude); volk_gnsssdr_free(d_in_32fc); delete d_ifft; delete d_fft_if; if (d_dump) { d_dump_file.close(); } } void pcps_acquisition_sc::set_local_code(std::complex * code) { // COD // Here we want to create a buffer that looks like this: // [ 0 0 0 ... 0 c_0 c_1 ... c_L] // where c_i is the local code and there are L zeros and L chips int offset = 0; if( d_bit_transition_flag ) { std::fill_n( d_fft_if->get_inbuf(), d_samples_per_code, gr_complex( 0.0, 0.0 ) ); offset = d_samples_per_code; } memcpy(d_fft_if->get_inbuf() + offset, code, sizeof(gr_complex) * d_samples_per_code); d_fft_if->execute(); // We need the FFT of local code volk_32fc_conjugate_32fc(d_fft_codes, d_fft_if->get_outbuf(), d_fft_size); } void pcps_acquisition_sc::update_local_carrier(gr_complex* carrier_vector, int correlator_length_samples, float freq) { float phase_step_rad = GPS_TWO_PI * freq / static_cast(d_fs_in); float _phase[1]; _phase[0] = 0; volk_gnsssdr_s32f_sincos_32fc(carrier_vector, - phase_step_rad, _phase, correlator_length_samples); } void pcps_acquisition_sc::init() { d_gnss_synchro->Flag_valid_acquisition = false; d_gnss_synchro->Flag_valid_symbol_output = false; d_gnss_synchro->Flag_valid_pseudorange = false; d_gnss_synchro->Flag_valid_word = false; d_gnss_synchro->Flag_preamble = false; d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_mag = 0.0; d_input_power = 0.0; d_num_doppler_bins = ceil( static_cast(static_cast(d_doppler_max) - static_cast(-d_doppler_max)) / static_cast(d_doppler_step)); // Create the carrier Doppler wipeoff signals d_grid_doppler_wipeoffs = new gr_complex*[d_num_doppler_bins]; for (unsigned int doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { d_grid_doppler_wipeoffs[doppler_index] = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); int doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; update_local_carrier(d_grid_doppler_wipeoffs[doppler_index], d_fft_size, d_freq + doppler); } } void pcps_acquisition_sc::set_state(int state) { d_state = state; if (d_state == 1) { d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_well_count = 0; d_mag = 0.0; d_input_power = 0.0; d_test_statistics = 0.0; } else if (d_state == 0) {} else { LOG(ERROR) << "State can only be set to 0 or 1"; } } int pcps_acquisition_sc::general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items __attribute__((unused))) { /* * By J.Arribas, L.Esteve and M.Molina * Acquisition strategy (Kay Borre book + CFAR threshold): * 1. Compute the input signal power estimation * 2. Doppler serial search loop * 3. Perform the FFT-based circular convolution (parallel time search) * 4. Record the maximum peak and the associated synchronization parameters * 5. Compute the test statistics and compare to the threshold * 6. Declare positive or negative acquisition using a message port */ int acquisition_message = -1; //0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL switch (d_state) { case 0: { if (d_active) { //restart acquisition variables d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_well_count = 0; d_mag = 0.0; d_input_power = 0.0; d_test_statistics = 0.0; d_state = 1; } d_sample_counter += d_fft_size * ninput_items[0]; // sample counter consume_each(ninput_items[0]); //DLOG(INFO) << "Consumed " << ninput_items[0] << " items"; break; } case 1: { // initialize acquisition algorithm int doppler; uint32_t indext = 0; float magt = 0.0; const lv_16sc_t *in = (const lv_16sc_t *)input_items[0]; //Get the input samples pointer int effective_fft_size = ( d_bit_transition_flag ? d_fft_size/2 : d_fft_size ); //TODO: optimize the signal processing chain to not use gr_complex. This is a temporary solution volk_gnsssdr_16ic_convert_32fc(d_in_32fc,in,effective_fft_size); float fft_normalization_factor = static_cast(d_fft_size) * static_cast(d_fft_size); d_mag = 0.0; d_sample_counter += d_fft_size; // sample counter d_well_count++; DLOG(INFO) << "Channel: " << d_channel << " , doing acquisition of satellite: " << d_gnss_synchro->System << " "<< d_gnss_synchro->PRN << " ,sample stamp: " << d_sample_counter << ", threshold: " << d_threshold << ", doppler_max: " << d_doppler_max << ", doppler_step: " << d_doppler_step; if (d_use_CFAR_algorithm_flag == true) { // 1- (optional) Compute the input signal power estimation volk_32fc_magnitude_squared_32f(d_magnitude, d_in_32fc, d_fft_size); volk_32f_accumulator_s32f(&d_input_power, d_magnitude, d_fft_size); d_input_power /= static_cast(d_fft_size); } // 2- Doppler frequency search loop for (unsigned int doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { // doppler search steps doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; volk_32fc_x2_multiply_32fc(d_fft_if->get_inbuf(), d_in_32fc, d_grid_doppler_wipeoffs[doppler_index], d_fft_size); // 3- Perform the FFT-based convolution (parallel time search) // Compute the FFT of the carrier wiped--off incoming signal d_fft_if->execute(); // Multiply carrier wiped--off, Fourier transformed incoming signal // with the local FFT'd code reference using SIMD operations with VOLK library volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), d_fft_if->get_outbuf(), d_fft_codes, d_fft_size); // compute the inverse FFT d_ifft->execute(); // Search maximum size_t offset = ( d_bit_transition_flag ? effective_fft_size : 0 ); volk_32fc_magnitude_squared_32f(d_magnitude, d_ifft->get_outbuf() + offset, effective_fft_size); volk_gnsssdr_32f_index_max_32u(&indext, d_magnitude, effective_fft_size); magt = d_magnitude[indext]; if (d_use_CFAR_algorithm_flag == true) { // Normalize the maximum value to correct the scale factor introduced by FFTW magt = d_magnitude[indext] / (fft_normalization_factor * fft_normalization_factor); } // 4- record the maximum peak and the associated synchronization parameters if (d_mag < magt) { d_mag = magt; if (d_use_CFAR_algorithm_flag == false) { // Search grid noise floor approximation for this doppler line volk_32f_accumulator_s32f(&d_input_power, d_magnitude, effective_fft_size); d_input_power = (d_input_power - d_mag) / (effective_fft_size - 1); } // In case that d_bit_transition_flag = true, we compare the potentially // new maximum test statistics (d_mag/d_input_power) with the value in // d_test_statistics. When the second dwell is being processed, the value // of d_mag/d_input_power could be lower than d_test_statistics (i.e, // the maximum test statistics in the previous dwell is greater than // current d_mag/d_input_power). Note that d_test_statistics is not // restarted between consecutive dwells in multidwell operation. if (d_test_statistics < (d_mag / d_input_power) || !d_bit_transition_flag) { d_gnss_synchro->Acq_delay_samples = static_cast(indext % d_samples_per_code); d_gnss_synchro->Acq_doppler_hz = static_cast(doppler); d_gnss_synchro->Acq_samplestamp_samples = d_sample_counter; // 5- Compute the test statistics and compare to the threshold d_test_statistics = d_mag / d_input_power; //std::cout<<"d_input_power="<Acq_doppler_hz ="<Acq_doppler_hz <System <<"_" << d_gnss_synchro->Signal << "_sat_" << d_gnss_synchro->PRN << "_doppler_" << doppler << p.extension().string(); DLOG(INFO) << "Writing ACQ out to " << filename.str(); d_dump_file.open(filename.str().c_str(), std::ios::out | std::ios::binary); d_dump_file.write((char*)d_ifft->get_outbuf(), n); //write directly |abs(x)|^2 in this Doppler bin? d_dump_file.close(); } } if (!d_bit_transition_flag) { if (d_test_statistics > d_threshold) { d_state = 2; // Positive acquisition } else if (d_well_count == d_max_dwells) { d_state = 3; // Negative acquisition } } else { if (d_well_count == d_max_dwells) // d_max_dwells = 2 { if (d_test_statistics > d_threshold) { d_state = 2; // Positive acquisition } else { d_state = 3; // Negative acquisition } } } consume_each(1); DLOG(INFO) << "Done. Consumed 1 item."; break; } case 2: { // 6.1- Declare positive acquisition using a message port DLOG(INFO) << "positive acquisition"; DLOG(INFO) << "satellite " << d_gnss_synchro->System << " " << d_gnss_synchro->PRN; DLOG(INFO) << "sample_stamp " << d_sample_counter; DLOG(INFO) << "test statistics value " << d_test_statistics; DLOG(INFO) << "test statistics threshold " << d_threshold; DLOG(INFO) << "code phase " << d_gnss_synchro->Acq_delay_samples; DLOG(INFO) << "doppler " << d_gnss_synchro->Acq_doppler_hz; DLOG(INFO) << "magnitude " << d_mag; DLOG(INFO) << "input signal power " << d_input_power; d_active = false; d_state = 0; d_sample_counter += d_fft_size * ninput_items[0]; // sample counter consume_each(ninput_items[0]); acquisition_message = 1; this->message_port_pub(pmt::mp("events"), pmt::from_long(acquisition_message)); break; } case 3: { // 6.2- Declare negative acquisition using a message port DLOG(INFO) << "negative acquisition"; DLOG(INFO) << "satellite " << d_gnss_synchro->System << " " << d_gnss_synchro->PRN; DLOG(INFO) << "sample_stamp " << d_sample_counter; DLOG(INFO) << "test statistics value " << d_test_statistics; DLOG(INFO) << "test statistics threshold " << d_threshold; DLOG(INFO) << "code phase " << d_gnss_synchro->Acq_delay_samples; DLOG(INFO) << "doppler " << d_gnss_synchro->Acq_doppler_hz; DLOG(INFO) << "magnitude " << d_mag; DLOG(INFO) << "input signal power " << d_input_power; d_active = false; d_state = 0; d_sample_counter += d_fft_size * ninput_items[0]; // sample counter consume_each(ninput_items[0]); acquisition_message = 2; this->message_port_pub(pmt::mp("events"), pmt::from_long(acquisition_message)); break; } } return noutput_items; } gnss-sdr-0.0.9/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_sc.h000066400000000000000000000165251305042567700301520ustar00rootroot00000000000000/*! * \file pcps_acquisition_sc.h * \brief This class implements a Parallel Code Phase Search Acquisition * * Acquisition strategy (Kay Borre book + CFAR threshold). *
      *
    1. Compute the input signal power estimation *
    2. Doppler serial search loop *
    3. Perform the FFT-based circular convolution (parallel time search) *
    4. Record the maximum peak and the associated synchronization parameters *
    5. Compute the test statistics and compare to the threshold *
    6. Declare positive or negative acquisition using a message port *
    * * Kay Borre book: K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * "A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach", Birkha user, 2007. pp 81-84 * * \authors
      *
    • Javier Arribas, 2011. jarribas(at)cttc.es *
    • Luis Esteve, 2012. luis(at)epsilon-formacion.com *
    • Marc Molina, 2013. marc.molina.pena@gmail.com *
    * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_PCPS_ACQUISITION_SC_H_ #define GNSS_SDR_PCPS_ACQUISITION_SC_H_ #include #include #include #include #include #include "gnss_synchro.h" class pcps_acquisition_sc; typedef boost::shared_ptr pcps_acquisition_sc_sptr; pcps_acquisition_sc_sptr pcps_make_acquisition_sc(unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool use_CFAR_algorithm_flag, bool dump, std::string dump_filename); /*! * \brief This class implements a Parallel Code Phase Search Acquisition. * * Check \ref Navitec2012 "An Open Source Galileo E1 Software Receiver", * Algorithm 1, for a pseudocode description of this implementation. */ class pcps_acquisition_sc: public gr::block { private: friend pcps_acquisition_sc_sptr pcps_make_acquisition_sc(unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool use_CFAR_algorithm_flag, bool dump, std::string dump_filename); pcps_acquisition_sc(unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool use_CFAR_algorithm_flag, bool dump, std::string dump_filename); void update_local_carrier(gr_complex* carrier_vector, int correlator_length_samples, float freq); long d_fs_in; long d_freq; int d_samples_per_ms; int d_samples_per_code; //unsigned int d_doppler_resolution; float d_threshold; std::string d_satellite_str; unsigned int d_doppler_max; unsigned int d_doppler_step; unsigned int d_sampled_ms; unsigned int d_max_dwells; unsigned int d_well_count; unsigned int d_fft_size; unsigned long int d_sample_counter; gr_complex** d_grid_doppler_wipeoffs; unsigned int d_num_doppler_bins; gr_complex* d_fft_codes; gr_complex* d_in_32fc; gr::fft::fft_complex* d_fft_if; gr::fft::fft_complex* d_ifft; Gnss_Synchro *d_gnss_synchro; unsigned int d_code_phase; float d_doppler_freq; float d_mag; float* d_magnitude; float d_input_power; float d_test_statistics; bool d_bit_transition_flag; bool d_use_CFAR_algorithm_flag; std::ofstream d_dump_file; bool d_active; int d_state; bool d_dump; unsigned int d_channel; std::string d_dump_filename; public: /*! * \brief Default destructor. */ ~pcps_acquisition_sc(); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to exchange synchronization data between acquisition and tracking blocks. * \param p_gnss_synchro Satellite information shared by the processing blocks. */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { d_gnss_synchro = p_gnss_synchro; } /*! * \brief Returns the maximum peak of grid search. */ unsigned int mag() { return d_mag; } /*! * \brief Initializes acquisition algorithm. */ void init(); /*! * \brief Sets local code for PCPS acquisition algorithm. * \param code - Pointer to the PRN code. */ void set_local_code(std::complex * code); /*! * \brief Starts acquisition algorithm, turning from standby mode to * active mode * \param active - bool that activates/deactivates the block. */ void set_active(bool active) { d_active = active; } /*! * \brief If set to 1, ensures that acquisition starts at the * first available sample. * \param state - int=1 forces start of acquisition */ void set_state(int state); /*! * \brief Set acquisition channel unique ID * \param channel - receiver channel. */ void set_channel(unsigned int channel) { d_channel = channel; } /*! * \brief Set statistics threshold of PCPS algorithm. * \param threshold - Threshold for signal detection (check \ref Navitec2012, * Algorithm 1, for a definition of this threshold). */ void set_threshold(float threshold) { d_threshold = threshold; } /*! * \brief Set maximum Doppler grid search * \param doppler_max - Maximum Doppler shift considered in the grid search [Hz]. */ void set_doppler_max(unsigned int doppler_max) { d_doppler_max = doppler_max; } /*! * \brief Set Doppler steps for the grid search * \param doppler_step - Frequency bin of the search grid [Hz]. */ void set_doppler_step(unsigned int doppler_step) { d_doppler_step = doppler_step; } /*! * \brief Parallel Code Phase Search Acquisition signal processing. */ int general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; #endif /* GNSS_SDR_PCPS_ACQUISITION_SC_H_*/ gnss-sdr-0.0.9/src/algorithms/acquisition/gnuradio_blocks/pcps_assisted_acquisition_cc.cc000066400000000000000000000435521305042567700321670ustar00rootroot00000000000000/*! * \file pcps_assisted_acquisition_cc.cc * \brief This class implements a Parallel Code Phase Search Acquisition with assistance and multi-dwells * \authors
      *
    • Javier Arribas, 2013. jarribas(at)cttc.es *
    * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "pcps_assisted_acquisition_cc.h" #include #include #include #include #include #include "concurrent_map.h" #include "control_message_factory.h" #include "gps_acq_assist.h" #include "GPS_L1_CA.h" extern concurrent_map global_gps_acq_assist_map; using google::LogMessage; pcps_assisted_acquisition_cc_sptr pcps_make_assisted_acquisition_cc( int max_dwells, unsigned int sampled_ms, int doppler_max, int doppler_min, long freq, long fs_in, int samples_per_ms, bool dump, std::string dump_filename) { return pcps_assisted_acquisition_cc_sptr( new pcps_assisted_acquisition_cc(max_dwells, sampled_ms, doppler_max, doppler_min, freq, fs_in, samples_per_ms, dump, dump_filename)); } pcps_assisted_acquisition_cc::pcps_assisted_acquisition_cc( int max_dwells, unsigned int sampled_ms, int doppler_max, int doppler_min, long freq, long fs_in, int samples_per_ms, bool dump, std::string dump_filename) : gr::block("pcps_assisted_acquisition_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(0, 0, sizeof(gr_complex))) { this->message_port_register_out(pmt::mp("events")); d_sample_counter = 0; // SAMPLE COUNTER d_active = false; d_freq = freq; d_fs_in = fs_in; d_samples_per_ms = samples_per_ms; d_sampled_ms = sampled_ms; d_config_doppler_max = doppler_max; d_config_doppler_min = doppler_min; d_fft_size = d_sampled_ms * d_samples_per_ms; // HS Acquisition d_max_dwells = max_dwells; d_gnuradio_forecast_samples = d_fft_size*4; d_input_power = 0.0; d_state = 0; d_disable_assist = false; d_fft_codes = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); d_carrier = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); // Direct FFT d_fft_if = new gr::fft::fft_complex(d_fft_size, true); // Inverse FFT d_ifft = new gr::fft::fft_complex(d_fft_size, false); // For dumping samples into a file d_dump = dump; d_dump_filename = dump_filename; d_doppler_resolution = 0; d_threshold = 0; d_doppler_max = 0; d_doppler_min = 0; d_num_doppler_points = 0; d_doppler_step = 0; d_grid_data = 0; d_grid_doppler_wipeoffs = 0; d_gnss_synchro = 0; d_code_phase = 0; d_doppler_freq = 0; d_test_statistics = 0; d_well_count = 0; d_channel = 0; } void pcps_assisted_acquisition_cc::set_doppler_step(unsigned int doppler_step) { d_doppler_step = doppler_step; } void pcps_assisted_acquisition_cc::free_grid_memory() { for (int i = 0; i < d_num_doppler_points; i++) { delete[] d_grid_data[i]; delete[] d_grid_doppler_wipeoffs[i]; } delete d_grid_data; } pcps_assisted_acquisition_cc::~pcps_assisted_acquisition_cc() { volk_gnsssdr_free(d_carrier); volk_gnsssdr_free(d_fft_codes); delete d_ifft; delete d_fft_if; if (d_dump) { d_dump_file.close(); } } void pcps_assisted_acquisition_cc::set_local_code(std::complex * code) { memcpy(d_fft_if->get_inbuf(), code, sizeof(gr_complex)*d_fft_size); } void pcps_assisted_acquisition_cc::init() { d_gnss_synchro->Flag_valid_acquisition = false; d_gnss_synchro->Flag_valid_symbol_output = false; d_gnss_synchro->Flag_valid_pseudorange = false; d_gnss_synchro->Flag_valid_word = false; d_gnss_synchro->Flag_preamble = false; d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_input_power = 0.0; d_state = 0; d_fft_if->execute(); // We need the FFT of local code //Conjugate the local code volk_32fc_conjugate_32fc(d_fft_codes, d_fft_if->get_outbuf(), d_fft_size); } void pcps_assisted_acquisition_cc::forecast (int noutput_items, gr_vector_int &ninput_items_required) { if (noutput_items != 0) { ninput_items_required[0] = d_gnuradio_forecast_samples ; //set the required available samples in each call } } void pcps_assisted_acquisition_cc::get_assistance() { Gps_Acq_Assist gps_acq_assisistance; if (global_gps_acq_assist_map.read(this->d_gnss_synchro->PRN, gps_acq_assisistance)==true) { //TODO: use the LO tolerance here if (gps_acq_assisistance.dopplerUncertainty >= 1000) { d_doppler_max = gps_acq_assisistance.d_Doppler0 + gps_acq_assisistance.dopplerUncertainty*2; d_doppler_min = gps_acq_assisistance.d_Doppler0 - gps_acq_assisistance.dopplerUncertainty*2; } else { d_doppler_max = gps_acq_assisistance.d_Doppler0 + 1000; d_doppler_min = gps_acq_assisistance.d_Doppler0 - 1000; } this->d_disable_assist = false; std::cout << "Acq assist ENABLED for GPS SV "<< this->d_gnss_synchro->PRN <<" (Doppler max,Doppler min)=(" << d_doppler_max << "," << d_doppler_min << ")" << std::endl; } else { this->d_disable_assist = true; std::cout << "Acq assist DISABLED for GPS SV "<< this->d_gnss_synchro->PRN << std::endl; } } void pcps_assisted_acquisition_cc::reset_grid() { d_well_count = 0; for (int i = 0; i < d_num_doppler_points; i++) { for (unsigned int j = 0; j < d_fft_size; j++) { d_grid_data[i][j] = 0.0; } } } void pcps_assisted_acquisition_cc::redefine_grid() { if (this->d_disable_assist == true) { d_doppler_max = d_config_doppler_max; d_doppler_min = d_config_doppler_min; } // Create the search grid array d_num_doppler_points = floor(std::abs(d_doppler_max - d_doppler_min) / d_doppler_step); d_grid_data = new float*[d_num_doppler_points]; for (int i = 0; i < d_num_doppler_points; i++) { d_grid_data[i] = new float[d_fft_size]; } // create the carrier Doppler wipeoff signals int doppler_hz; float phase_step_rad; d_grid_doppler_wipeoffs = new gr_complex*[d_num_doppler_points]; for (int doppler_index = 0; doppler_index < d_num_doppler_points; doppler_index++) { doppler_hz = d_doppler_min + d_doppler_step*doppler_index; // doppler search steps // compute the carrier doppler wipe-off signal and store it phase_step_rad = static_cast(GPS_TWO_PI) * doppler_hz / static_cast(d_fs_in); d_grid_doppler_wipeoffs[doppler_index] = new gr_complex[d_fft_size]; float _phase[1]; _phase[0] = 0; volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], - phase_step_rad, _phase, d_fft_size); } } double pcps_assisted_acquisition_cc::search_maximum() { float magt = 0.0; float fft_normalization_factor; int index_doppler = 0; uint32_t tmp_intex_t = 0; uint32_t index_time = 0; for (int i=0;i magt) { magt = d_grid_data[i][index_time]; index_doppler = i; index_time = tmp_intex_t; } } // Normalize the maximum value to correct the scale factor introduced by FFTW fft_normalization_factor = static_cast(d_fft_size) * static_cast(d_fft_size); magt = magt / (fft_normalization_factor * fft_normalization_factor); // 5- Compute the test statistics and compare to the threshold d_test_statistics = 2 * d_fft_size * magt / (d_input_power * d_well_count); // 4- record the maximum peak and the associated synchronization parameters d_gnss_synchro->Acq_delay_samples = static_cast(index_time); d_gnss_synchro->Acq_doppler_hz = static_cast(index_doppler * d_doppler_step + d_doppler_min); d_gnss_synchro->Acq_samplestamp_samples = d_sample_counter; // Record results to file if required if (d_dump) { std::stringstream filename; std::streamsize n = 2 * sizeof(float) * (d_fft_size); // complex file write filename.str(""); filename << "../data/test_statistics_" << d_gnss_synchro->System << "_" << d_gnss_synchro->Signal << "_sat_" << d_gnss_synchro->PRN << "_doppler_" << d_gnss_synchro->Acq_doppler_hz << ".dat"; d_dump_file.open(filename.str().c_str(), std::ios::out | std::ios::binary); d_dump_file.write((char*)d_grid_data[index_doppler], n); //write directly |abs(x)|^2 in this Doppler bin? d_dump_file.close(); } return d_test_statistics; } float pcps_assisted_acquisition_cc::estimate_input_power(gr_vector_const_void_star &input_items) { const gr_complex *in = (const gr_complex *)input_items[0]; //Get the input samples pointer // 1- Compute the input signal power estimation float* p_tmp_vector = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); volk_32fc_magnitude_squared_32f(p_tmp_vector, in, d_fft_size); const float* p_const_tmp_vector = p_tmp_vector; float power; volk_32f_accumulator_s32f(&power, p_const_tmp_vector, d_fft_size); volk_gnsssdr_free(p_tmp_vector); return ( power / static_cast(d_fft_size)); } int pcps_assisted_acquisition_cc::compute_and_accumulate_grid(gr_vector_const_void_star &input_items) { // initialize acquisition algorithm const gr_complex *in = (const gr_complex *)input_items[0]; //Get the input samples pointer DLOG(INFO) << "Channel: " << d_channel << " , doing acquisition of satellite: " << d_gnss_synchro->System << " " << d_gnss_synchro->PRN << " ,sample stamp: " << d_sample_counter << ", threshold: " << d_threshold << ", doppler_max: " << d_doppler_max << ", doppler_step: " << d_doppler_step; // 2- Doppler frequency search loop float* p_tmp_vector = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); for (int doppler_index = 0; doppler_index < d_num_doppler_points; doppler_index++) { // doppler search steps // Perform the carrier wipe-off volk_32fc_x2_multiply_32fc(d_fft_if->get_inbuf(), in, d_grid_doppler_wipeoffs[doppler_index], d_fft_size); // 3- Perform the FFT-based convolution (parallel time search) // Compute the FFT of the carrier wiped--off incoming signal d_fft_if->execute(); // Multiply carrier wiped--off, Fourier transformed incoming signal // with the local FFT'd code reference using SIMD operations with VOLK library volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), d_fft_if->get_outbuf(), d_fft_codes, d_fft_size); // compute the inverse FFT d_ifft->execute(); // save the grid matrix delay file volk_32fc_magnitude_squared_32f(p_tmp_vector, d_ifft->get_outbuf(), d_fft_size); const float* old_vector = d_grid_data[doppler_index]; volk_32f_x2_add_32f(d_grid_data[doppler_index], old_vector, p_tmp_vector, d_fft_size); } volk_gnsssdr_free(p_tmp_vector); return d_fft_size; } int pcps_assisted_acquisition_cc::general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items __attribute__((unused))) { /*! * TODO: High sensitivity acquisition algorithm: * State Mechine: * S0. StandBy. If d_active==1 -> S1 * S1. GetAssist. Define search grid with assistance information. Reset grid matrix -> S2 * S2. ComputeGrid. Perform the FFT acqusition doppler and delay grid. * Accumulate the search grid matrix (#doppler_bins x #fft_size) * Compare maximum to threshold and decide positive or negative * If T>=gamma -> S4 else * If d_well_count S2 * else if !disable_assist -> S3 * else -> S5. * S3. RedefineGrid. Open the grid search to unasisted acquisition. Reset counters and grid. -> S2 * S4. Positive_Acq: Send message and stop acq -> S0 * S5. Negative_Acq: Send message and stop acq -> S0 */ switch (d_state) { case 0: // S0. StandBy if (d_active == true) d_state = 1; d_sample_counter += ninput_items[0]; // sample counter consume_each(ninput_items[0]); break; case 1: // S1. GetAssist get_assistance(); redefine_grid(); reset_grid(); d_sample_counter += ninput_items[0]; // sample counter consume_each(ninput_items[0]); d_state = 2; break; case 2: // S2. ComputeGrid int consumed_samples; consumed_samples = compute_and_accumulate_grid(input_items); d_well_count++; if (d_well_count >= d_max_dwells) { d_state=3; } d_sample_counter += consumed_samples; consume_each(consumed_samples); break; case 3: // Compute test statistics and decide d_input_power = estimate_input_power(input_items); d_test_statistics = search_maximum(); if (d_test_statistics > d_threshold) { d_state = 5; } else { if (d_disable_assist == false) { d_disable_assist = true; std::cout << "Acq assist DISABLED for GPS SV "<< this->d_gnss_synchro->PRN << std::endl; d_state = 4; } else { d_state = 6; } } d_sample_counter += ninput_items[0]; // sample counter consume_each(ninput_items[0]); break; case 4: // RedefineGrid free_grid_memory(); redefine_grid(); reset_grid(); d_sample_counter += ninput_items[0]; // sample counter consume_each(ninput_items[0]); d_state = 2; break; case 5: // Positive_Acq DLOG(INFO) << "positive acquisition"; DLOG(INFO) << "satellite " << d_gnss_synchro->System << " " << d_gnss_synchro->PRN; DLOG(INFO) << "sample_stamp " << d_sample_counter; DLOG(INFO) << "test statistics value " << d_test_statistics; DLOG(INFO) << "test statistics threshold " << d_threshold; DLOG(INFO) << "code phase " << d_gnss_synchro->Acq_delay_samples; DLOG(INFO) << "doppler " << d_gnss_synchro->Acq_doppler_hz; DLOG(INFO) << "input signal power " << d_input_power; d_active = false; // Send message to channel port //0=STOP_CHANNEL 1=ACQ_SUCCESS 2=ACQ_FAIL this->message_port_pub(pmt::mp("events"), pmt::from_long(1)); free_grid_memory(); // consume samples to not block the GNU Radio flowgraph d_sample_counter += ninput_items[0]; // sample counter consume_each(ninput_items[0]); d_state = 0; break; case 6: // Negative_Acq DLOG(INFO) << "negative acquisition"; DLOG(INFO) << "satellite " << d_gnss_synchro->System << " " << d_gnss_synchro->PRN; DLOG(INFO) << "sample_stamp " << d_sample_counter; DLOG(INFO) << "test statistics value " << d_test_statistics; DLOG(INFO) << "test statistics threshold " << d_threshold; DLOG(INFO) << "code phase " << d_gnss_synchro->Acq_delay_samples; DLOG(INFO) << "doppler " << d_gnss_synchro->Acq_doppler_hz; DLOG(INFO) << "input signal power " << d_input_power; d_active = false; // Send message to channel port //0=STOP_CHANNEL 1=ACQ_SUCCESS 2=ACQ_FAIL this->message_port_pub(pmt::mp("events"), pmt::from_long(2)); free_grid_memory(); // consume samples to not block the GNU Radio flowgraph d_sample_counter += ninput_items[0]; // sample counter consume_each(ninput_items[0]); d_state = 0; break; default: d_state = 0; break; } return noutput_items; } gnss-sdr-0.0.9/src/algorithms/acquisition/gnuradio_blocks/pcps_assisted_acquisition_cc.h000066400000000000000000000157721305042567700320340ustar00rootroot00000000000000/*! * \file pcps_assisted_acquisition_cc.h * \brief This class implements a Parallel Code Phase Search Acquisition with assistance and multi-dwells * * Acquisition strategy (Kay Borre book + CFAR threshold). *
      *
    1. Compute the input signal power estimation *
    2. Doppler serial search loop *
    3. Perform the FFT-based circular convolution (parallel time search) *
    4. Record the maximum peak and the associated synchronization parameters *
    5. Compute the test statistics and compare to the threshold *
    6. Declare positive or negative acquisition using a message queue *
    * * Kay Borre book: K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * "A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach", Birkha user, 2007. pp 81-84 * * \authors
      *
    • Javier Arribas, 2013. jarribas(at)cttc.es *
    * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_PCPS_ASSISTED_ACQUISITION_CC_H_ #define GNSS_SDR_PCPS_ASSISTED_ACQUISITION_CC_H_ #include #include #include #include #include #include "gnss_synchro.h" class pcps_assisted_acquisition_cc; typedef boost::shared_ptr pcps_assisted_acquisition_cc_sptr; pcps_assisted_acquisition_cc_sptr pcps_make_assisted_acquisition_cc(int max_dwells, unsigned int sampled_ms, int doppler_max, int doppler_min, long freq, long fs_in, int samples_per_ms, bool dump, std::string dump_filename); /*! * \brief This class implements a Parallel Code Phase Search Acquisition. * * Check \ref Navitec2012 "An Open Source Galileo E1 Software Receiver", * Algorithm 1, for a pseudocode description of this implementation. */ class pcps_assisted_acquisition_cc: public gr::block { private: friend pcps_assisted_acquisition_cc_sptr pcps_make_assisted_acquisition_cc(int max_dwells, unsigned int sampled_ms, int doppler_max, int doppler_min, long freq, long fs_in, int samples_per_ms, bool dump, std::string dump_filename); pcps_assisted_acquisition_cc(int max_dwells, unsigned int sampled_ms, int doppler_max, int doppler_min, long freq, long fs_in, int samples_per_ms, bool dump, std::string dump_filename); void calculate_magnitudes(gr_complex* fft_begin, int doppler_shift, int doppler_offset); int compute_and_accumulate_grid(gr_vector_const_void_star &input_items); float estimate_input_power(gr_vector_const_void_star &input_items); double search_maximum(); void get_assistance(); void reset_grid(); void redefine_grid(); void free_grid_memory(); long d_fs_in; long d_freq; int d_samples_per_ms; int d_max_dwells; unsigned int d_doppler_resolution; int d_gnuradio_forecast_samples; float d_threshold; std::string d_satellite_str; int d_doppler_max; int d_doppler_min; int d_config_doppler_max; int d_config_doppler_min; int d_num_doppler_points; int d_doppler_step; unsigned int d_sampled_ms; unsigned int d_fft_size; unsigned long int d_sample_counter; gr_complex* d_carrier; gr_complex* d_fft_codes; float** d_grid_data; gr_complex** d_grid_doppler_wipeoffs; gr::fft::fft_complex* d_fft_if; gr::fft::fft_complex* d_ifft; Gnss_Synchro *d_gnss_synchro; unsigned int d_code_phase; float d_doppler_freq; float d_input_power; float d_test_statistics; std::ofstream d_dump_file; int d_state; bool d_active; bool d_disable_assist; int d_well_count; bool d_dump; unsigned int d_channel; std::string d_dump_filename; public: /*! * \brief Default destructor. */ ~pcps_assisted_acquisition_cc(); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to exchange synchronization data between acquisition and tracking blocks. * \param p_gnss_synchro Satellite information shared by the processing blocks. */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { d_gnss_synchro = p_gnss_synchro; } /*! * \brief Returns the maximum peak of grid search. */ unsigned int mag() { return d_test_statistics; } /*! * \brief Initializes acquisition algorithm. */ void init(); /*! * \brief Sets local code for PCPS acquisition algorithm. * \param code - Pointer to the PRN code. */ void set_local_code(std::complex * code); /*! * \brief Starts acquisition algorithm, turning from standby mode to * active mode * \param active - bool that activates/deactivates the block. */ void set_active(bool active) { d_active = active; } /*! * \brief Set acquisition channel unique ID * \param channel - receiver channel. */ void set_channel(unsigned int channel) { d_channel = channel; } /*! * \brief Set statistics threshold of PCPS algorithm. * \param threshold - Threshold for signal detection (check \ref Navitec2012, * Algorithm 1, for a definition of this threshold). */ void set_threshold(float threshold) { d_threshold = threshold; } /*! * \brief Set maximum Doppler grid search * \param doppler_max - Maximum Doppler shift considered in the grid search [Hz]. */ void set_doppler_max(unsigned int doppler_max) { d_doppler_max = doppler_max; } /*! * \brief Set Doppler steps for the grid search * \param doppler_step - Frequency bin of the search grid [Hz]. */ void set_doppler_step(unsigned int doppler_step); /*! * \brief Parallel Code Phase Search Acquisition signal processing. */ int general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); void forecast (int noutput_items, gr_vector_int &ninput_items_required); }; #endif /* GNSS_SDR_PCPS_assisted_acquisition_cc_H_*/ gnss-sdr-0.0.9/src/algorithms/acquisition/gnuradio_blocks/pcps_cccwsr_acquisition_cc.cc000066400000000000000000000441011305042567700316230ustar00rootroot00000000000000/*! * \file pcps_cccwsr_acquisition_cc.cc * \brief This class implements a Parallel Code Phase Search acquisition * with Coherent Channel Combining With Sign Recovery scheme. * \author Marc Molina, 2013. marc.molina.pena(at)gmail.com * * D.Borio, C.O'Driscoll, G.Lachapelle, "Coherent, Noncoherent and * Differentially Coherent Combining Techniques for Acquisition of * New Composite GNSS Signals", IEEE Transactions On Aerospace and * Electronic Systems vol. 45 no. 3, July 2009, section IV * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "pcps_cccwsr_acquisition_cc.h" #include #include #include #include #include #include "control_message_factory.h" #include "GPS_L1_CA.h" //GPS_TWO_PI using google::LogMessage; pcps_cccwsr_acquisition_cc_sptr pcps_cccwsr_make_acquisition_cc( unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool dump, std::string dump_filename) { return pcps_cccwsr_acquisition_cc_sptr( new pcps_cccwsr_acquisition_cc(sampled_ms, max_dwells, doppler_max, freq, fs_in, samples_per_ms, samples_per_code, dump, dump_filename)); } pcps_cccwsr_acquisition_cc::pcps_cccwsr_acquisition_cc( unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool dump, std::string dump_filename) : gr::block("pcps_cccwsr_acquisition_cc", gr::io_signature::make(1, 1, sizeof(gr_complex) * sampled_ms * samples_per_ms), gr::io_signature::make(0, 0, sizeof(gr_complex) * sampled_ms * samples_per_ms)) { this->message_port_register_out(pmt::mp("events")); d_sample_counter = 0; // SAMPLE COUNTER d_active = false; d_state = 0; d_freq = freq; d_fs_in = fs_in; d_samples_per_ms = samples_per_ms; d_samples_per_code = samples_per_code; d_sampled_ms = sampled_ms; d_max_dwells = max_dwells; d_well_count = 0; d_doppler_max = doppler_max; d_fft_size = d_sampled_ms * d_samples_per_ms; d_mag = 0; d_input_power = 0.0; d_num_doppler_bins = 0; d_fft_code_data = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); d_fft_code_pilot = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); d_data_correlation = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); d_pilot_correlation = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); d_correlation_plus = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); d_correlation_minus = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); d_magnitude = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); // Direct FFT d_fft_if = new gr::fft::fft_complex(d_fft_size, true); // Inverse FFT d_ifft = new gr::fft::fft_complex(d_fft_size, false); // For dumping samples into a file d_dump = dump; d_dump_filename = dump_filename; d_doppler_resolution = 0; d_threshold = 0; d_doppler_step = 0; d_grid_doppler_wipeoffs = 0; d_gnss_synchro = 0; d_code_phase = 0; d_doppler_freq = 0; d_test_statistics = 0; d_channel = 0; } pcps_cccwsr_acquisition_cc::~pcps_cccwsr_acquisition_cc() { if (d_num_doppler_bins > 0) { for (unsigned int i = 0; i < d_num_doppler_bins; i++) { volk_gnsssdr_free(d_grid_doppler_wipeoffs[i]); } delete[] d_grid_doppler_wipeoffs; } volk_gnsssdr_free(d_fft_code_data); volk_gnsssdr_free(d_fft_code_pilot); volk_gnsssdr_free(d_data_correlation); volk_gnsssdr_free(d_pilot_correlation); volk_gnsssdr_free(d_correlation_plus); volk_gnsssdr_free(d_correlation_minus); volk_gnsssdr_free(d_magnitude); delete d_ifft; delete d_fft_if; if (d_dump) { d_dump_file.close(); } } void pcps_cccwsr_acquisition_cc::set_local_code(std::complex* code_data, std::complex* code_pilot) { // Data code (E1B) memcpy(d_fft_if->get_inbuf(), code_data, sizeof(gr_complex) * d_fft_size); d_fft_if->execute(); // We need the FFT of local code //Conjugate the local code volk_32fc_conjugate_32fc(d_fft_code_data,d_fft_if->get_outbuf(),d_fft_size); // Pilot code (E1C) memcpy(d_fft_if->get_inbuf(), code_pilot, sizeof(gr_complex) * d_fft_size); d_fft_if->execute(); // We need the FFT of local code //Conjugate the local code, volk_32fc_conjugate_32fc(d_fft_code_pilot, d_fft_if->get_outbuf(), d_fft_size); } void pcps_cccwsr_acquisition_cc::init() { d_gnss_synchro->Flag_valid_acquisition = false; d_gnss_synchro->Flag_valid_symbol_output = false; d_gnss_synchro->Flag_valid_pseudorange = false; d_gnss_synchro->Flag_valid_word = false; d_gnss_synchro->Flag_preamble = false; d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_mag = 0.0; d_input_power = 0.0; // Count the number of bins d_num_doppler_bins = 0; for (int doppler = static_cast(-d_doppler_max); doppler <= static_cast(d_doppler_max); doppler += d_doppler_step) { d_num_doppler_bins++; } // Create the carrier Doppler wipeoff signals d_grid_doppler_wipeoffs = new gr_complex*[d_num_doppler_bins]; for (unsigned int doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { d_grid_doppler_wipeoffs[doppler_index] = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); int doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; float phase_step_rad = GPS_TWO_PI * (d_freq + doppler) / static_cast(d_fs_in); float _phase[1]; _phase[0] = 0; volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], - phase_step_rad, _phase, d_fft_size); } } void pcps_cccwsr_acquisition_cc::set_state(int state) { d_state = state; if (d_state == 1) { d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_well_count = 0; d_mag = 0.0; d_input_power = 0.0; d_test_statistics = 0.0; } else if (d_state == 0) {} else { LOG(ERROR) << "State can only be set to 0 or 1"; } } int pcps_cccwsr_acquisition_cc::general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items __attribute__((unused))) { int acquisition_message = -1; //0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL switch (d_state) { case 0: { if (d_active) { //restart acquisition variables d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_well_count = 0; d_mag = 0.0; d_input_power = 0.0; d_test_statistics = 0.0; d_state = 1; } d_sample_counter += d_fft_size * ninput_items[0]; // sample counter consume_each(ninput_items[0]); break; } case 1: { // initialize acquisition algorithm int doppler; uint32_t indext = 0; uint32_t indext_plus = 0; uint32_t indext_minus = 0; float magt = 0.0; float magt_plus = 0.0; float magt_minus = 0.0; const gr_complex *in = (const gr_complex *)input_items[0]; //Get the input samples pointer float fft_normalization_factor = static_cast(d_fft_size) * static_cast(d_fft_size); d_sample_counter += d_fft_size; // sample counter d_well_count++; DLOG(INFO) << "Channel: " << d_channel << " , doing acquisition of satellite: " << d_gnss_synchro->System << " "<< d_gnss_synchro->PRN << " ,sample stamp: " << d_sample_counter << ", threshold: " << d_threshold << ", doppler_max: " << d_doppler_max << ", doppler_step: " << d_doppler_step; // 1- Compute the input signal power estimation volk_32fc_magnitude_squared_32f(d_magnitude, in, d_fft_size); volk_32f_accumulator_s32f(&d_input_power, d_magnitude, d_fft_size); d_input_power /= static_cast(d_fft_size); // 2- Doppler frequency search loop for (unsigned int doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { // doppler search steps doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; volk_32fc_x2_multiply_32fc(d_fft_if->get_inbuf(), in, d_grid_doppler_wipeoffs[doppler_index], d_fft_size); // 3- Perform the FFT-based convolution (parallel time search) // Compute the FFT of the carrier wiped--off incoming signal d_fft_if->execute(); // Multiply carrier wiped--off, Fourier transformed incoming signal // with the local FFT'd data code reference (E1B) using SIMD operations // with VOLK library volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), d_fft_if->get_outbuf(), d_fft_code_data, d_fft_size); // compute the inverse FFT d_ifft->execute(); // Copy the result of the correlation between wiped--off signal and data code in // d_data_correlation. memcpy(d_data_correlation, d_ifft->get_outbuf(), sizeof(gr_complex)*d_fft_size); // Multiply carrier wiped--off, Fourier transformed incoming signal // with the local FFT'd pilot code reference (E1C) using SIMD operations // with VOLK library volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), d_fft_if->get_outbuf(), d_fft_code_pilot, d_fft_size); // Compute the inverse FFT d_ifft->execute(); // Copy the result of the correlation between wiped--off signal and pilot code in // d_data_correlation. memcpy(d_pilot_correlation, d_ifft->get_outbuf(), sizeof(gr_complex)*d_fft_size); for (unsigned int i = 0; i < d_fft_size; i++) { d_correlation_plus[i] = std::complex( d_data_correlation[i].real() - d_pilot_correlation[i].imag(), d_data_correlation[i].imag() + d_pilot_correlation[i].real()); d_correlation_minus[i] = std::complex( d_data_correlation[i].real() + d_pilot_correlation[i].imag(), d_data_correlation[i].imag() - d_pilot_correlation[i].real()); } volk_32fc_magnitude_squared_32f(d_magnitude, d_correlation_plus, d_fft_size); volk_gnsssdr_32f_index_max_32u(&indext_plus, d_magnitude, d_fft_size); magt_plus = d_magnitude[indext_plus] / (fft_normalization_factor * fft_normalization_factor); volk_32fc_magnitude_squared_32f(d_magnitude, d_correlation_minus, d_fft_size); volk_gnsssdr_32f_index_max_32u(&indext_minus, d_magnitude, d_fft_size); magt_minus = d_magnitude[indext_minus] / (fft_normalization_factor * fft_normalization_factor); if (magt_plus >= magt_minus) { magt = magt_plus; indext = indext_plus; } else { magt = magt_minus; indext = indext_minus; } // 4- record the maximum peak and the associated synchronization parameters if (d_mag < magt) { d_mag = magt; d_gnss_synchro->Acq_delay_samples = static_cast(indext % d_samples_per_code); d_gnss_synchro->Acq_doppler_hz = static_cast(doppler); d_gnss_synchro->Acq_samplestamp_samples = d_sample_counter; } // Record results to file if required if (d_dump) { std::stringstream filename; std::streamsize n = 2 * sizeof(float) * (d_fft_size); // complex file write filename.str(""); filename << "../data/test_statistics_" << d_gnss_synchro->System <<"_" << d_gnss_synchro->Signal << "_sat_" << d_gnss_synchro->PRN << "_doppler_" << doppler << ".dat"; d_dump_file.open(filename.str().c_str(), std::ios::out | std::ios::binary); d_dump_file.write((char*)d_ifft->get_outbuf(), n); //write directly |abs(x)|^2 in this Doppler bin? d_dump_file.close(); } } // 5- Compute the test statistics and compare to the threshold //d_test_statistics = 2 * d_fft_size * d_mag / d_input_power; d_test_statistics = d_mag / d_input_power; // 6- Declare positive or negative acquisition using a message port if (d_test_statistics > d_threshold) { d_state = 2; // Positive acquisition } else if (d_well_count == d_max_dwells) { d_state = 3; // Negative acquisition } consume_each(1); break; } case 2: { // 6.1- Declare positive acquisition using a message port DLOG(INFO) << "positive acquisition"; DLOG(INFO) << "satellite " << d_gnss_synchro->System << " " << d_gnss_synchro->PRN; DLOG(INFO) << "sample_stamp " << d_sample_counter; DLOG(INFO) << "test statistics value " << d_test_statistics; DLOG(INFO) << "test statistics threshold " << d_threshold; DLOG(INFO) << "code phase " << d_gnss_synchro->Acq_delay_samples; DLOG(INFO) << "doppler " << d_gnss_synchro->Acq_doppler_hz; DLOG(INFO) << "magnitude " << d_mag; DLOG(INFO) << "input signal power " << d_input_power; d_active = false; d_state = 0; d_sample_counter += d_fft_size * ninput_items[0]; // sample counter consume_each(ninput_items[0]); acquisition_message = 1; this->message_port_pub(pmt::mp("events"), pmt::from_long(acquisition_message)); break; } case 3: { // 6.2- Declare negative acquisition using a message port DLOG(INFO) << "negative acquisition"; DLOG(INFO) << "satellite " << d_gnss_synchro->System << " " << d_gnss_synchro->PRN; DLOG(INFO) << "sample_stamp " << d_sample_counter; DLOG(INFO) << "test statistics value " << d_test_statistics; DLOG(INFO) << "test statistics threshold " << d_threshold; DLOG(INFO) << "code phase " << d_gnss_synchro->Acq_delay_samples; DLOG(INFO) << "doppler " << d_gnss_synchro->Acq_doppler_hz; DLOG(INFO) << "magnitude " << d_mag; DLOG(INFO) << "input signal power " << d_input_power; d_active = false; d_state = 0; d_sample_counter += d_fft_size * ninput_items[0]; // sample counter consume_each(ninput_items[0]); acquisition_message = 2; this->message_port_pub(pmt::mp("events"), pmt::from_long(acquisition_message)); break; } } return noutput_items; } gnss-sdr-0.0.9/src/algorithms/acquisition/gnuradio_blocks/pcps_cccwsr_acquisition_cc.h000066400000000000000000000154571305042567700315010ustar00rootroot00000000000000/*! * \file pcps_cccwsr_acquisition_cc.h * \brief This class implements a Parallel Code Phase Search acquisition * with Coherent Channel Combining With Sign Recovery scheme. * \author Marc Molina, 2013. marc.molina.pena(at)gmail.com * * D.Borio, C.O'Driscoll, G.Lachapelle, "Coherent, Noncoherent and * Differentially Coherent Combining Techniques for Acquisition of * New Composite GNSS Signals", IEEE Transactions On Aerospace and * Electronic Systems vol. 45 no. 3, July 2009, section IV * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_PCPS_CCCWSR_ACQUISITION_CC_H_ #define GNSS_SDR_PCPS_CCCWSR_ACQUISITION_CC_H_ #include #include #include #include #include #include "gnss_synchro.h" class pcps_cccwsr_acquisition_cc; typedef boost::shared_ptr pcps_cccwsr_acquisition_cc_sptr; pcps_cccwsr_acquisition_cc_sptr pcps_cccwsr_make_acquisition_cc(unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool dump, std::string dump_filename); /*! * \brief This class implements a Parallel Code Phase Search Acquisition with * Coherent Channel Combining With Sign Recovery scheme. */ class pcps_cccwsr_acquisition_cc: public gr::block { private: friend pcps_cccwsr_acquisition_cc_sptr pcps_cccwsr_make_acquisition_cc(unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool dump, std::string dump_filename); pcps_cccwsr_acquisition_cc(unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool dump, std::string dump_filename); void calculate_magnitudes(gr_complex* fft_begin, int doppler_shift, int doppler_offset); long d_fs_in; long d_freq; int d_samples_per_ms; int d_samples_per_code; unsigned int d_doppler_resolution; float d_threshold; std::string d_satellite_str; unsigned int d_doppler_max; unsigned int d_doppler_step; unsigned int d_sampled_ms; unsigned int d_max_dwells; unsigned int d_well_count; unsigned int d_fft_size; unsigned long int d_sample_counter; gr_complex** d_grid_doppler_wipeoffs; unsigned int d_num_doppler_bins; gr_complex* d_fft_code_data; gr_complex* d_fft_code_pilot; gr::fft::fft_complex* d_fft_if; gr::fft::fft_complex* d_ifft; Gnss_Synchro *d_gnss_synchro; unsigned int d_code_phase; float d_doppler_freq; float d_mag; float* d_magnitude; gr_complex* d_data_correlation; gr_complex* d_pilot_correlation; gr_complex* d_correlation_plus; gr_complex* d_correlation_minus; float d_input_power; float d_test_statistics; std::ofstream d_dump_file; bool d_active; int d_state; bool d_dump; unsigned int d_channel; std::string d_dump_filename; public: /*! * \brief Default destructor. */ ~pcps_cccwsr_acquisition_cc(); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to exchange synchronization data between acquisition and tracking blocks. * \param p_gnss_synchro Satellite information shared by the processing blocks. */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { d_gnss_synchro = p_gnss_synchro; } /*! * \brief Returns the maximum peak of grid search. */ unsigned int mag() { return d_mag; } /*! * \brief Initializes acquisition algorithm. */ void init(); /*! * \brief Sets local code for CCCWSR acquisition algorithm. * \param data_code - Pointer to the data PRN code. * \param pilot_code - Pointer to the pilot PRN code. */ void set_local_code(std::complex * code_data, std::complex * code_pilot); /*! * \brief Starts acquisition algorithm, turning from standby mode to * active mode * \param active - bool that activates/deactivates the block. */ void set_active(bool active) { d_active = active; } /*! * \brief If set to 1, ensures that acquisition starts at the * first available sample. * \param state - int=1 forces start of acquisition */ void set_state(int state); /*! * \brief Set acquisition channel unique ID * \param channel - receiver channel. */ void set_channel(unsigned int channel) { d_channel = channel; } /*! * \brief Set statistics threshold of CCCWSR algorithm. * \param threshold - Threshold for signal detection (check \ref Navitec2012, * Algorithm 1, for a definition of this threshold). */ void set_threshold(float threshold) { d_threshold = threshold; } /*! * \brief Set maximum Doppler grid search * \param doppler_max - Maximum Doppler shift considered in the grid search [Hz]. */ void set_doppler_max(unsigned int doppler_max) { d_doppler_max = doppler_max; } /*! * \brief Set Doppler steps for the grid search * \param doppler_step - Frequency bin of the search grid [Hz]. */ void set_doppler_step(unsigned int doppler_step) { d_doppler_step = doppler_step; } /*! * \brief Coherent Channel Combining With Sign Recovery Acquisition signal processing. */ int general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; #endif /* GNSS_SDR_PCPS_CCCWSR_ACQUISITION_CC_H_*/ gnss-sdr-0.0.9/src/algorithms/acquisition/gnuradio_blocks/pcps_multithread_acquisition_cc.cc000066400000000000000000000443421305042567700326700ustar00rootroot00000000000000/*! * \file pcps_multithread_acquisition_cc.cc * \brief This class implements a Parallel Code Phase Search Acquisition * \authors
      *
    • Javier Arribas, 2011. jarribas(at)cttc.es *
    • Luis Esteve, 2012. luis(at)epsilon-formacion.com *
    • Marc Molina, 2013. marc.molina.pena@gmail.com *
    * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "pcps_multithread_acquisition_cc.h" #include #include #include #include #include #include #include #include "control_message_factory.h" #include "GPS_L1_CA.h" //GPS_TWO_PI using google::LogMessage; pcps_multithread_acquisition_cc_sptr pcps_make_multithread_acquisition_cc( unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool dump, std::string dump_filename) { return pcps_multithread_acquisition_cc_sptr( new pcps_multithread_acquisition_cc(sampled_ms, max_dwells, doppler_max, freq, fs_in, samples_per_ms, samples_per_code, bit_transition_flag, dump, dump_filename)); } pcps_multithread_acquisition_cc::pcps_multithread_acquisition_cc( unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool dump, std::string dump_filename) : gr::block("pcps_multithread_acquisition_cc", gr::io_signature::make(1, 1, sizeof(gr_complex) * sampled_ms * samples_per_ms), gr::io_signature::make(0, 0, sizeof(gr_complex) * sampled_ms * samples_per_ms)) { this->message_port_register_out(pmt::mp("events")); d_sample_counter = 0; // SAMPLE COUNTER d_active = false; d_state = 0; d_core_working = false; d_freq = freq; d_fs_in = fs_in; d_samples_per_ms = samples_per_ms; d_samples_per_code = samples_per_code; d_sampled_ms = sampled_ms; d_max_dwells = max_dwells; d_well_count = 0; d_doppler_max = doppler_max; d_fft_size = d_sampled_ms * d_samples_per_ms; d_mag = 0; d_input_power = 0.0; d_num_doppler_bins = 0; d_bit_transition_flag = bit_transition_flag; d_in_dwell_count = 0; d_in_buffer = new gr_complex*[d_max_dwells]; //todo: do something if posix_memalign fails for (unsigned int i = 0; i < d_max_dwells; i++) { d_in_buffer[i] = static_cast(volk_malloc(d_fft_size * sizeof(gr_complex), volk_get_alignment())); } d_fft_codes = static_cast(volk_malloc(d_fft_size * sizeof(gr_complex), volk_get_alignment())); d_magnitude = static_cast(volk_malloc(d_fft_size * sizeof(float), volk_get_alignment())); // Direct FFT d_fft_if = new gr::fft::fft_complex(d_fft_size, true); // Inverse FFT d_ifft = new gr::fft::fft_complex(d_fft_size, false); // For dumping samples into a file d_dump = dump; d_dump_filename = dump_filename; d_doppler_resolution = 0; d_threshold = 0; d_doppler_step = 0; d_grid_doppler_wipeoffs = 0; d_gnss_synchro = 0; d_code_phase = 0; d_doppler_freq = 0; d_test_statistics = 0; d_channel = 0; } pcps_multithread_acquisition_cc::~pcps_multithread_acquisition_cc() { if (d_num_doppler_bins > 0) { for (unsigned int i = 0; i < d_num_doppler_bins; i++) { volk_free(d_grid_doppler_wipeoffs[i]); } delete[] d_grid_doppler_wipeoffs; } for (unsigned int i = 0; i < d_max_dwells; i++) { volk_free(d_in_buffer[i]); } delete[] d_in_buffer; volk_free(d_fft_codes); volk_free(d_magnitude); delete d_ifft; delete d_fft_if; if (d_dump) { d_dump_file.close(); } } void pcps_multithread_acquisition_cc::init() { d_gnss_synchro->Flag_valid_acquisition = false; d_gnss_synchro->Flag_valid_symbol_output = false; d_gnss_synchro->Flag_valid_pseudorange = false; d_gnss_synchro->Flag_valid_word = false; d_gnss_synchro->Flag_preamble = false; d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_mag = 0.0; d_input_power = 0.0; // Count the number of bins d_num_doppler_bins = 0; for (int doppler = (int)(-d_doppler_max); doppler <= (int)d_doppler_max; doppler += d_doppler_step) { d_num_doppler_bins++; } // Create the carrier Doppler wipeoff signals d_grid_doppler_wipeoffs = new gr_complex*[d_num_doppler_bins]; for (unsigned int doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { d_grid_doppler_wipeoffs[doppler_index] = static_cast(volk_malloc(d_fft_size * sizeof(gr_complex), volk_get_alignment())); int doppler = -(int)d_doppler_max + d_doppler_step * doppler_index; float phase_step_rad = static_cast(GPS_TWO_PI) * (d_freq + doppler) / static_cast(d_fs_in); float _phase[1]; _phase[0] = 0; volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], - phase_step_rad, _phase, d_fft_size); } } void pcps_multithread_acquisition_cc::set_local_code(std::complex * code) { memcpy(d_fft_if->get_inbuf(), code, sizeof(gr_complex)*d_fft_size); d_fft_if->execute(); // We need the FFT of local code //Conjugate the local code volk_32fc_conjugate_32fc(d_fft_codes, d_fft_if->get_outbuf(), d_fft_size); } void pcps_multithread_acquisition_cc::acquisition_core() { // initialize acquisition algorithm int doppler; uint32_t indext = 0; float magt = 0.0; float fft_normalization_factor = (float)d_fft_size * (float)d_fft_size; gr_complex* in = d_in_buffer[d_well_count]; unsigned long int samplestamp = d_sample_counter_buffer[d_well_count]; d_input_power = 0.0; d_mag = 0.0; d_well_count++; DLOG(INFO) << "Channel: " << d_channel << " , doing acquisition of satellite: " << d_gnss_synchro->System << " "<< d_gnss_synchro->PRN << " ,sample stamp: " << d_sample_counter << ", threshold: " << d_threshold << ", doppler_max: " << d_doppler_max << ", doppler_step: " << d_doppler_step; // 1- Compute the input signal power estimation volk_32fc_magnitude_squared_32f(d_magnitude, in, d_fft_size); volk_32f_accumulator_s32f(&d_input_power, d_magnitude, d_fft_size); d_input_power /= (float)d_fft_size; // 2- Doppler frequency search loop for (unsigned int doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { // doppler search steps doppler = -(int)d_doppler_max + d_doppler_step*doppler_index; volk_32fc_x2_multiply_32fc(d_fft_if->get_inbuf(), in, d_grid_doppler_wipeoffs[doppler_index], d_fft_size); // 3- Perform the FFT-based convolution (parallel time search) // Compute the FFT of the carrier wiped--off incoming signal d_fft_if->execute(); // Multiply carrier wiped--off, Fourier transformed incoming signal // with the local FFT'd code reference using SIMD operations with VOLK library volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), d_fft_if->get_outbuf(), d_fft_codes, d_fft_size); // compute the inverse FFT d_ifft->execute(); // Search maximum volk_32fc_magnitude_squared_32f(d_magnitude, d_ifft->get_outbuf(), d_fft_size); volk_gnsssdr_32f_index_max_32u(&indext, d_magnitude, d_fft_size); // Normalize the maximum value to correct the scale factor introduced by FFTW magt = d_magnitude[indext] / (fft_normalization_factor * fft_normalization_factor); // 4- record the maximum peak and the associated synchronization parameters if (d_mag < magt) { d_mag = magt; // In case that d_bit_transition_flag = true, we compare the potentially // new maximum test statistics (d_mag/d_input_power) with the value in // d_test_statistics. When the second dwell is being processed, the value // of d_mag/d_input_power could be lower than d_test_statistics (i.e, // the maximum test statistics in the previous dwell is greater than // current d_mag/d_input_power). Note that d_test_statistics is not // restarted between consecutive dwells in multidwell operation. if (d_test_statistics < (d_mag / d_input_power) || !d_bit_transition_flag) { d_gnss_synchro->Acq_delay_samples = (double)(indext % d_samples_per_code); d_gnss_synchro->Acq_doppler_hz = (double)doppler; d_gnss_synchro->Acq_samplestamp_samples = samplestamp; // 5- Compute the test statistics and compare to the threshold //d_test_statistics = 2 * d_fft_size * d_mag / d_input_power; d_test_statistics = d_mag / d_input_power; } } // Record results to file if required if (d_dump) { std::stringstream filename; std::streamsize n = 2 * sizeof(float) * (d_fft_size); // complex file write filename.str(""); filename << "../data/test_statistics_" << d_gnss_synchro->System <<"_" << d_gnss_synchro->Signal << "_sat_" << d_gnss_synchro->PRN << "_doppler_" << doppler << ".dat"; d_dump_file.open(filename.str().c_str(), std::ios::out | std::ios::binary); d_dump_file.write((char*)d_ifft->get_outbuf(), n); //write directly |abs(x)|^2 in this Doppler bin? d_dump_file.close(); } } if (!d_bit_transition_flag) { if (d_test_statistics > d_threshold) { d_state = 2; // Positive acquisition } else if (d_well_count == d_max_dwells) { d_state = 3; // Negative acquisition } } else { if (d_well_count == d_max_dwells) // d_max_dwells = 2 { if (d_test_statistics > d_threshold) { d_state = 2; // Positive acquisition } else { d_state = 3; // Negative acquisition } } } d_core_working = false; } void pcps_multithread_acquisition_cc::set_state(int state) { d_state = state; if (d_state == 1) { d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_well_count = 0; d_mag = 0.0; d_input_power = 0.0; d_test_statistics = 0.0; d_in_dwell_count = 0; d_sample_counter_buffer.clear(); } else if (d_state == 0) {} else { LOG(ERROR) << "State can only be set to 0 or 1"; } } int pcps_multithread_acquisition_cc::general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items __attribute__((unused))) { int acquisition_message = -1; //0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL switch (d_state) { case 0: { if (d_active) { //restart acquisition variables d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_well_count = 0; d_mag = 0.0; d_input_power = 0.0; d_test_statistics = 0.0; d_in_dwell_count = 0; d_sample_counter_buffer.clear(); d_state = 1; } d_sample_counter += d_fft_size * ninput_items[0]; // sample counter break; } case 1: { if (d_in_dwell_count < d_max_dwells) { // Fill internal buffer with d_max_dwells signal blocks. This step ensures that // consecutive signal blocks will be processed in multi-dwell operation. This is // essential when d_bit_transition_flag = true. unsigned int num_dwells = std::min((int)(d_max_dwells-d_in_dwell_count),ninput_items[0]); for (unsigned int i = 0; i < num_dwells; i++) { memcpy(d_in_buffer[d_in_dwell_count++], (gr_complex*)input_items[i], sizeof(gr_complex)*d_fft_size); d_sample_counter += d_fft_size; d_sample_counter_buffer.push_back(d_sample_counter); } if (ninput_items[0] > (int)num_dwells) { d_sample_counter += d_fft_size * (ninput_items[0]-num_dwells); } } else { // We already have d_max_dwells consecutive blocks in the internal buffer, // just skip input blocks. d_sample_counter += d_fft_size * ninput_items[0]; } // We create a new thread to process next block if the following // conditions are fulfilled: // 1. There are new blocks in d_in_buffer that have not been processed yet // (d_well_count < d_in_dwell_count). // 2. No other acquisition_core thead is working (!d_core_working). // 3. d_state==1. We need to check again d_state because it can be modified at any // moment by the external thread (may have changed since checked in the switch()). // If the external thread has already declared positive (d_state=2) or negative // (d_state=3) acquisition, we don't have to process next block!! if ((d_well_count < d_in_dwell_count) && !d_core_working && d_state==1) { d_core_working = true; boost::thread(&pcps_multithread_acquisition_cc::acquisition_core, this); } break; } case 2: { // Declare positive acquisition using a message port DLOG(INFO) << "positive acquisition"; DLOG(INFO) << "satellite " << d_gnss_synchro->System << " " << d_gnss_synchro->PRN; DLOG(INFO) << "sample_stamp " << d_sample_counter; DLOG(INFO) << "test statistics value " << d_test_statistics; DLOG(INFO) << "test statistics threshold " << d_threshold; DLOG(INFO) << "code phase " << d_gnss_synchro->Acq_delay_samples; DLOG(INFO) << "doppler " << d_gnss_synchro->Acq_doppler_hz; DLOG(INFO) << "magnitude " << d_mag; DLOG(INFO) << "input signal power " << d_input_power; d_active = false; d_state = 0; d_sample_counter += d_fft_size * ninput_items[0]; // sample counter acquisition_message = 1; this->message_port_pub(pmt::mp("events"), pmt::from_long(acquisition_message)); break; } case 3: { // Declare negative acquisition using a message port DLOG(INFO) << "negative acquisition"; DLOG(INFO) << "satellite " << d_gnss_synchro->System << " " << d_gnss_synchro->PRN; DLOG(INFO) << "sample_stamp " << d_sample_counter; DLOG(INFO) << "test statistics value " << d_test_statistics; DLOG(INFO) << "test statistics threshold " << d_threshold; DLOG(INFO) << "code phase " << d_gnss_synchro->Acq_delay_samples; DLOG(INFO) << "doppler " << d_gnss_synchro->Acq_doppler_hz; DLOG(INFO) << "magnitude " << d_mag; DLOG(INFO) << "input signal power " << d_input_power; d_active = false; d_state = 0; d_sample_counter += d_fft_size * ninput_items[0]; // sample counter acquisition_message = 2; this->message_port_pub(pmt::mp("events"), pmt::from_long(acquisition_message)); break; } } consume_each(ninput_items[0]); return noutput_items; } gnss-sdr-0.0.9/src/algorithms/acquisition/gnuradio_blocks/pcps_multithread_acquisition_cc.h000066400000000000000000000171531305042567700325320ustar00rootroot00000000000000/*! * \file pcps_multithread_acquisition_cc.h * \brief This class implements a Parallel Code Phase Search Acquisition * * Acquisition strategy (Kay Borre book + CFAR threshold). *
      *
    1. Compute the input signal power estimation *
    2. Doppler serial search loop *
    3. Perform the FFT-based circular convolution (parallel time search) *
    4. Record the maximum peak and the associated synchronization parameters *
    5. Compute the test statistics and compare to the threshold *
    6. Declare positive or negative acquisition using a message port *
    * * Kay Borre book: K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * "A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach", Birkha user, 2007. pp 81-84 * * \authors
      *
    • Javier Arribas, 2011. jarribas(at)cttc.es *
    • Luis Esteve, 2012. luis(at)epsilon-formacion.com *
    • Marc Molina, 2013. marc.molina.pena@gmail.com *
    * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_PCPS_MULTITHREAD_ACQUISITION_CC_H_ #define GNSS_SDR_PCPS_MULTITHREAD_ACQUISITION_CC_H_ #include #include #include #include #include #include #include #include "gnss_synchro.h" class pcps_multithread_acquisition_cc; typedef boost::shared_ptr pcps_multithread_acquisition_cc_sptr; pcps_multithread_acquisition_cc_sptr pcps_make_multithread_acquisition_cc(unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool dump, std::string dump_filename); /*! * \brief This class implements a Parallel Code Phase Search Acquisition. * * Check \ref Navitec2012 "An Open Source Galileo E1 Software Receiver", * Algorithm 1, for a pseudocode description of this implementation. */ class pcps_multithread_acquisition_cc: public gr::block { private: friend pcps_multithread_acquisition_cc_sptr pcps_make_multithread_acquisition_cc(unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool dump, std::string dump_filename); pcps_multithread_acquisition_cc(unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool dump, std::string dump_filename); void calculate_magnitudes(gr_complex* fft_begin, int doppler_shift, int doppler_offset); long d_fs_in; long d_freq; int d_samples_per_ms; int d_samples_per_code; unsigned int d_doppler_resolution; float d_threshold; std::string d_satellite_str; unsigned int d_doppler_max; unsigned int d_doppler_step; unsigned int d_sampled_ms; unsigned int d_max_dwells; unsigned int d_well_count; unsigned int d_fft_size; unsigned long int d_sample_counter; gr_complex** d_grid_doppler_wipeoffs; unsigned int d_num_doppler_bins; gr_complex* d_fft_codes; gr::fft::fft_complex* d_fft_if; gr::fft::fft_complex* d_ifft; Gnss_Synchro *d_gnss_synchro; unsigned int d_code_phase; float d_doppler_freq; float d_mag; float* d_magnitude; float d_input_power; float d_test_statistics; bool d_bit_transition_flag; std::ofstream d_dump_file; bool d_active; int d_state; bool d_core_working; bool d_dump; unsigned int d_channel; std::string d_dump_filename; gr_complex** d_in_buffer; std::vector d_sample_counter_buffer; unsigned int d_in_dwell_count; public: /*! * \brief Default destructor. */ ~pcps_multithread_acquisition_cc(); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to exchange synchronization data between acquisition and tracking blocks. * \param p_gnss_synchro Satellite information shared by the processing blocks. */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { d_gnss_synchro = p_gnss_synchro; } /*! * \brief Returns the maximum peak of grid search. */ unsigned int mag() { return d_mag; } /*! * \brief Initializes acquisition algorithm. */ void init(); /*! * \brief Sets local code for PCPS acquisition algorithm. * \param code - Pointer to the PRN code. */ void set_local_code(std::complex * code); /*! * \brief Starts acquisition algorithm, turning from standby mode to * active mode * \param active - bool that activates/deactivates the block. */ void set_active(bool active) { d_active = active; } /*! * \brief If set to 1, ensures that acquisition starts at the * first available sample. * \param state - int=1 forces start of acquisition */ void set_state(int state); /*! * \brief Set acquisition channel unique ID * \param channel - receiver channel. */ void set_channel(unsigned int channel) { d_channel = channel; } /*! * \brief Set statistics threshold of PCPS algorithm. * \param threshold - Threshold for signal detection (check \ref Navitec2012, * Algorithm 1, for a definition of this threshold). */ void set_threshold(float threshold) { d_threshold = threshold; } /*! * \brief Set maximum Doppler grid search * \param doppler_max - Maximum Doppler shift considered in the grid search [Hz]. */ void set_doppler_max(unsigned int doppler_max) { d_doppler_max = doppler_max; } /*! * \brief Set Doppler steps for the grid search * \param doppler_step - Frequency bin of the search grid [Hz]. */ void set_doppler_step(unsigned int doppler_step) { d_doppler_step = doppler_step; } /*! * \brief Parallel Code Phase Search Acquisition signal processing. */ int general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); void acquisition_core(); }; #endif /* GNSS_SDR_PCPS_MULTITHREAD_ACQUISITION_CC_H_*/ gnss-sdr-0.0.9/src/algorithms/acquisition/gnuradio_blocks/pcps_opencl_acquisition_cc.cc000066400000000000000000001016501305042567700316220ustar00rootroot00000000000000/*! * \file pcps_opencl_acquisition_cc.cc * \brief This class implements a Parallel Code Phase Search Acquisition * using OpenCL to offload some functions to the GPU. * * Acquisition strategy (Kay Borre book + CFAR threshold). *
      *
    1. Compute the input signal power estimation *
    2. Doppler serial search loop *
    3. Perform the FFT-based circular convolution (parallel time search) *
    4. Record the maximum peak and the associated synchronization parameters *
    5. Compute the test statistics and compare to the threshold *
    6. Declare positive or negative acquisition using a message port *
    * * Kay Borre book: K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * "A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach", Birkhauser, 2007. pp 81-84 * * \authors
      *
    • Javier Arribas, 2011. jarribas(at)cttc.es *
    • Luis Esteve, 2012. luis(at)epsilon-formacion.com *
    • Marc Molina, 2013. marc.molina.pena@gmail.com *
    * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "pcps_opencl_acquisition_cc.h" #include #include #include #include #include #include #include #include #include "control_message_factory.h" #include "fft_base_kernels.h" #include "fft_internal.h" #include "GPS_L1_CA.h" //GPS_TWO_PI using google::LogMessage; pcps_opencl_acquisition_cc_sptr pcps_make_opencl_acquisition_cc( unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool dump, std::string dump_filename) { return pcps_opencl_acquisition_cc_sptr( new pcps_opencl_acquisition_cc(sampled_ms, max_dwells, doppler_max, freq, fs_in, samples_per_ms, samples_per_code, bit_transition_flag, dump, dump_filename)); } pcps_opencl_acquisition_cc::pcps_opencl_acquisition_cc( unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool dump, std::string dump_filename) : gr::block("pcps_opencl_acquisition_cc", gr::io_signature::make(1, 1, sizeof(gr_complex) * sampled_ms * samples_per_ms), gr::io_signature::make(0, 0, sizeof(gr_complex) * sampled_ms * samples_per_ms)) { this->message_port_register_out(pmt::mp("events")); d_sample_counter = 0; // SAMPLE COUNTER d_active = false; d_state = 0; d_core_working = false; d_freq = freq; d_fs_in = fs_in; d_samples_per_ms = samples_per_ms; d_samples_per_code = samples_per_code; d_sampled_ms = sampled_ms; d_max_dwells = max_dwells; d_well_count = 0; d_doppler_max = doppler_max; d_fft_size = d_sampled_ms * d_samples_per_ms; d_fft_size_pow2 = pow(2, ceil(log2(2 * d_fft_size))); d_mag = 0; d_input_power = 0.0; d_num_doppler_bins = 0; d_bit_transition_flag = bit_transition_flag; d_in_dwell_count = 0; d_cl_fft_batch_size = 1; d_in_buffer = new gr_complex*[d_max_dwells]; for (unsigned int i = 0; i < d_max_dwells; i++) { d_in_buffer[i] = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); } d_magnitude = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); d_fft_codes = static_cast(volk_gnsssdr_malloc(d_fft_size_pow2 * sizeof(gr_complex), volk_gnsssdr_get_alignment())); d_zero_vector = static_cast(volk_gnsssdr_malloc((d_fft_size_pow2 - d_fft_size) * sizeof(gr_complex), volk_gnsssdr_get_alignment())); for (unsigned int i = 0; i < (d_fft_size_pow2-d_fft_size); i++) { d_zero_vector[i] = gr_complex(0.0,0.0); } d_opencl = init_opencl_environment("math_kernel.cl"); if (d_opencl != 0) { // Direct FFT d_fft_if = new gr::fft::fft_complex(d_fft_size, true); // Inverse FFT d_ifft = new gr::fft::fft_complex(d_fft_size, false); } // For dumping samples into a file d_dump = dump; d_dump_filename = dump_filename; } pcps_opencl_acquisition_cc::~pcps_opencl_acquisition_cc() { if (d_num_doppler_bins > 0) { for (unsigned int i = 0; i < d_num_doppler_bins; i++) { volk_gnsssdr_free(d_grid_doppler_wipeoffs[i]); } delete[] d_grid_doppler_wipeoffs; } for (unsigned int i = 0; i < d_max_dwells; i++) { volk_gnsssdr_free(d_in_buffer[i]); } delete[] d_in_buffer; volk_gnsssdr_free(d_fft_codes); volk_gnsssdr_free(d_magnitude); volk_gnsssdr_free(d_zero_vector); if (d_opencl == 0) { delete d_cl_queue; delete d_cl_buffer_in; delete d_cl_buffer_1; delete d_cl_buffer_2; delete d_cl_buffer_magnitude; delete d_cl_buffer_fft_codes; if(d_num_doppler_bins > 0) { delete[] d_cl_buffer_grid_doppler_wipeoffs; } clFFT_DestroyPlan(d_cl_fft_plan); } else { delete d_ifft; delete d_fft_if; } if (d_dump) { d_dump_file.close(); } } int pcps_opencl_acquisition_cc::init_opencl_environment(std::string kernel_filename) { //get all platforms (drivers) std::vector all_platforms; cl::Platform::get(&all_platforms); if(all_platforms.size()==0) { std::cout << "No OpenCL platforms found. Check OpenCL installation!" << std::endl; return 1; } d_cl_platform = all_platforms[0]; //get default platform std::cout << "Using platform: " << d_cl_platform.getInfo() << std::endl; //get default GPU device of the default platform std::vector gpu_devices; d_cl_platform.getDevices(CL_DEVICE_TYPE_GPU, &gpu_devices); if(gpu_devices.size()==0) { std::cout << "No GPU devices found. Check OpenCL installation!" << std::endl; return 2; } d_cl_device = gpu_devices[0]; std::vector device; device.push_back(d_cl_device); std::cout << "Using device: " << d_cl_device.getInfo() << std::endl; cl::Context context(device); d_cl_context = context; // build the program from the source in the file std::ifstream kernel_file(kernel_filename, std::ifstream::in); std::string kernel_code(std::istreambuf_iterator(kernel_file), (std::istreambuf_iterator())); kernel_file.close(); // std::cout << "Kernel code: \n" << kernel_code << std::endl; cl::Program::Sources sources; sources.push_back({kernel_code.c_str(),kernel_code.length()}); cl::Program program(context,sources); if(program.build(device)!=CL_SUCCESS) { std::cout << " Error building: " << program.getBuildInfo(device[0]) << std::endl; return 3; } d_cl_program = program; // create buffers on the device d_cl_buffer_in = new cl::Buffer(d_cl_context, CL_MEM_READ_WRITE, sizeof(gr_complex)*d_fft_size); d_cl_buffer_fft_codes = new cl::Buffer(d_cl_context, CL_MEM_READ_WRITE, sizeof(gr_complex)*d_fft_size_pow2); d_cl_buffer_1 = new cl::Buffer(d_cl_context, CL_MEM_READ_WRITE, sizeof(gr_complex)*d_fft_size_pow2); d_cl_buffer_2 = new cl::Buffer(d_cl_context, CL_MEM_READ_WRITE, sizeof(gr_complex)*d_fft_size_pow2); d_cl_buffer_magnitude = new cl::Buffer(d_cl_context, CL_MEM_READ_WRITE, sizeof(float)*d_fft_size); //create queue to which we will push commands for the device. d_cl_queue = new cl::CommandQueue(d_cl_context,d_cl_device); //create FFT plan cl_int err; clFFT_Dim3 dim = {d_fft_size_pow2, 1, 1}; d_cl_fft_plan = clFFT_CreatePlan(d_cl_context(), dim, clFFT_1D, clFFT_InterleavedComplexFormat, &err); if (err != 0) { delete d_cl_queue; delete d_cl_buffer_in; delete d_cl_buffer_1; delete d_cl_buffer_2; delete d_cl_buffer_magnitude; delete d_cl_buffer_fft_codes; std::cout << "Error creating OpenCL FFT plan." << std::endl; return 4; } return 0; } void pcps_opencl_acquisition_cc::init() { d_gnss_synchro->Flag_valid_acquisition = false; d_gnss_synchro->Flag_valid_symbol_output = false; d_gnss_synchro->Flag_valid_pseudorange = false; d_gnss_synchro->Flag_valid_word = false; d_gnss_synchro->Flag_preamble = false; d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_mag = 0.0; d_input_power = 0.0; // Count the number of bins d_num_doppler_bins = 0; for (int doppler = static_cast(-d_doppler_max); doppler <= static_cast(d_doppler_max); doppler += d_doppler_step) { d_num_doppler_bins++; } // Create the carrier Doppler wipeoff signals d_grid_doppler_wipeoffs = new gr_complex*[d_num_doppler_bins]; if (d_opencl == 0) { d_cl_buffer_grid_doppler_wipeoffs = new cl::Buffer*[d_num_doppler_bins]; } for (unsigned int doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { d_grid_doppler_wipeoffs[doppler_index] = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); int doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; float phase_step_rad = static_cast(GPS_TWO_PI) * (d_freq + doppler) / static_cast(d_fs_in); float _phase[1]; _phase[0] = 0; volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], - phase_step_rad, _phase, d_fft_size); if (d_opencl == 0) { d_cl_buffer_grid_doppler_wipeoffs[doppler_index] = new cl::Buffer(d_cl_context, CL_MEM_READ_WRITE, sizeof(gr_complex)*d_fft_size); d_cl_queue->enqueueWriteBuffer(*(d_cl_buffer_grid_doppler_wipeoffs[doppler_index]), CL_TRUE, 0, sizeof(gr_complex)*d_fft_size, d_grid_doppler_wipeoffs[doppler_index]); } } // zero padding in buffer_1 (FFT input) if (d_opencl == 0) { d_cl_queue->enqueueWriteBuffer(*d_cl_buffer_1, CL_TRUE, sizeof(gr_complex)*d_fft_size, sizeof(gr_complex)*(d_fft_size_pow2 - d_fft_size), d_zero_vector); } } void pcps_opencl_acquisition_cc::set_local_code(std::complex * code) { if(d_opencl == 0) { d_cl_queue->enqueueWriteBuffer(*d_cl_buffer_2, CL_TRUE, 0, sizeof(gr_complex)*d_fft_size, code); d_cl_queue->enqueueWriteBuffer(*d_cl_buffer_2, CL_TRUE, sizeof(gr_complex)*d_fft_size, sizeof(gr_complex)*(d_fft_size_pow2 - 2*d_fft_size), d_zero_vector); d_cl_queue->enqueueWriteBuffer(*d_cl_buffer_2, CL_TRUE, sizeof(gr_complex) *(d_fft_size_pow2 - d_fft_size), sizeof(gr_complex)*d_fft_size, code); clFFT_ExecuteInterleaved((*d_cl_queue)(), d_cl_fft_plan, d_cl_fft_batch_size, clFFT_Forward, (*d_cl_buffer_2)(), (*d_cl_buffer_2)(), 0, NULL, NULL); //Conjucate the local code cl::Kernel kernel = cl::Kernel(d_cl_program, "conj_vector"); kernel.setArg(0, *d_cl_buffer_2); //input kernel.setArg(1, *d_cl_buffer_fft_codes); //output d_cl_queue->enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(d_fft_size_pow2), cl::NullRange); } else { memcpy(d_fft_if->get_inbuf(), code, sizeof(gr_complex)*d_fft_size); d_fft_if->execute(); // We need the FFT of local code //Conjugate the local code volk_32fc_conjugate_32fc(d_fft_codes, d_fft_if->get_outbuf(), d_fft_size); } } void pcps_opencl_acquisition_cc::acquisition_core_volk() { // initialize acquisition algorithm int doppler; uint32_t indext = 0; float magt = 0.0; float fft_normalization_factor = static_cast(d_fft_size) * static_cast(d_fft_size); gr_complex* in = d_in_buffer[d_well_count]; unsigned long int samplestamp = d_sample_counter_buffer[d_well_count]; d_input_power = 0.0; d_mag = 0.0; d_well_count++; DLOG(INFO) << "Channel: " << d_channel << " , doing acquisition of satellite: " << d_gnss_synchro->System << " "<< d_gnss_synchro->PRN << " ,sample stamp: " << d_sample_counter << ", threshold: " << d_threshold << ", doppler_max: " << d_doppler_max << ", doppler_step: " << d_doppler_step; // 1- Compute the input signal power estimation volk_32fc_magnitude_squared_32f(d_magnitude, in, d_fft_size); volk_32f_accumulator_s32f(&d_input_power, d_magnitude, d_fft_size); d_input_power /= static_cast(d_fft_size); // 2- Doppler frequency search loop for (unsigned int doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { // doppler search steps doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; volk_32fc_x2_multiply_32fc(d_fft_if->get_inbuf(), in, d_grid_doppler_wipeoffs[doppler_index], d_fft_size); // 3- Perform the FFT-based convolution (parallel time search) // Compute the FFT of the carrier wiped--off incoming signal d_fft_if->execute(); // Multiply carrier wiped--off, Fourier transformed incoming signal // with the local FFT'd code reference using SIMD operations with VOLK library volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), d_fft_if->get_outbuf(), d_fft_codes, d_fft_size); // compute the inverse FFT d_ifft->execute(); // Search maximum volk_32fc_magnitude_squared_32f(d_magnitude, d_ifft->get_outbuf(), d_fft_size); volk_gnsssdr_32f_index_max_32u(&indext, d_magnitude, d_fft_size); // Normalize the maximum value to correct the scale factor introduced by FFTW magt = d_magnitude[indext] / (fft_normalization_factor * fft_normalization_factor); // 4- record the maximum peak and the associated synchronization parameters if (d_mag < magt) { d_mag = magt; // In case that d_bit_transition_flag = true, we compare the potentially // new maximum test statistics (d_mag/d_input_power) with the value in // d_test_statistics. When the second dwell is being processed, the value // of d_mag/d_input_power could be lower than d_test_statistics (i.e, // the maximum test statistics in the previous dwell is greater than // current d_mag/d_input_power). Note that d_test_statistics is not // restarted between consecutive dwells in multidwell operation. if (d_test_statistics < (d_mag / d_input_power) || !d_bit_transition_flag) { d_gnss_synchro->Acq_delay_samples = static_cast(indext % d_samples_per_code); d_gnss_synchro->Acq_doppler_hz = static_cast(doppler); d_gnss_synchro->Acq_samplestamp_samples = samplestamp; // 5- Compute the test statistics and compare to the threshold //d_test_statistics = 2 * d_fft_size * d_mag / d_input_power; d_test_statistics = d_mag / d_input_power; } } // Record results to file if required if (d_dump) { std::stringstream filename; std::streamsize n = 2 * sizeof(float) * (d_fft_size); // complex file write filename.str(""); filename << "../data/test_statistics_" << d_gnss_synchro->System <<"_" << d_gnss_synchro->Signal << "_sat_" << d_gnss_synchro->PRN << "_doppler_" << doppler << ".dat"; d_dump_file.open(filename.str().c_str(), std::ios::out | std::ios::binary); d_dump_file.write((char*)d_ifft->get_outbuf(), n); //write directly |abs(x)|^2 in this Doppler bin? d_dump_file.close(); } } if (!d_bit_transition_flag) { if (d_test_statistics > d_threshold) { d_state = 2; // Positive acquisition } else if (d_well_count == d_max_dwells) { d_state = 3; // Negative acquisition } } else { if (d_well_count == d_max_dwells) // d_max_dwells = 2 { if (d_test_statistics > d_threshold) { d_state = 2; // Positive acquisition } else { d_state = 3; // Negative acquisition } } } d_core_working = false; } void pcps_opencl_acquisition_cc::acquisition_core_opencl() { // initialize acquisition algorithm int doppler; uint32_t indext = 0; float magt = 0.0; float fft_normalization_factor = (static_cast(d_fft_size_pow2) * static_cast(d_fft_size)); //This works, but I am not sure why. gr_complex* in = d_in_buffer[d_well_count]; unsigned long int samplestamp = d_sample_counter_buffer[d_well_count]; d_input_power = 0.0; d_mag = 0.0; // write input vector in buffer of OpenCL device d_cl_queue->enqueueWriteBuffer(*d_cl_buffer_in, CL_TRUE, 0, sizeof(gr_complex)*d_fft_size, in); d_well_count++; // struct timeval tv; // long long int begin = 0; // long long int end = 0; // gettimeofday(&tv, NULL); // begin = tv.tv_sec *1e6 + tv.tv_usec; DLOG(INFO) << "Channel: " << d_channel << " , doing acquisition of satellite: " << d_gnss_synchro->System << " " << d_gnss_synchro->PRN << " ,sample stamp: " << d_sample_counter << ", threshold: " << d_threshold << ", doppler_max: " << d_doppler_max << ", doppler_step: " << d_doppler_step; // 1- Compute the input signal power estimation volk_32fc_magnitude_squared_32f(d_magnitude, in, d_fft_size); volk_32f_accumulator_s32f(&d_input_power, d_magnitude, d_fft_size); d_input_power /= static_cast(d_fft_size); cl::Kernel kernel; // 2- Doppler frequency search loop for (unsigned int doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { // doppler search steps doppler = -static_cast(d_doppler_max) + d_doppler_step*doppler_index; //Multiply input signal with doppler wipe-off kernel = cl::Kernel(d_cl_program, "mult_vectors"); kernel.setArg(0, *d_cl_buffer_in); //input 1 kernel.setArg(1, *d_cl_buffer_grid_doppler_wipeoffs[doppler_index]); //input 2 kernel.setArg(2, *d_cl_buffer_1); //output d_cl_queue->enqueueNDRangeKernel(kernel,cl::NullRange, cl::NDRange(d_fft_size), cl::NullRange); // In the previous operation, we store the result in the first d_fft_size positions // of d_cl_buffer_1. The rest d_fft_size_pow2-d_fft_size already have zeros // (zero-padding is made in init() for optimization purposes). clFFT_ExecuteInterleaved((*d_cl_queue)(), d_cl_fft_plan, d_cl_fft_batch_size, clFFT_Forward,(*d_cl_buffer_1)(), (*d_cl_buffer_2)(), 0, NULL, NULL); // Multiply carrier wiped--off, Fourier transformed incoming signal // with the local FFT'd code reference kernel = cl::Kernel(d_cl_program, "mult_vectors"); kernel.setArg(0, *d_cl_buffer_2); //input 1 kernel.setArg(1, *d_cl_buffer_fft_codes); //input 2 kernel.setArg(2, *d_cl_buffer_2); //output d_cl_queue->enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(d_fft_size_pow2), cl::NullRange); // compute the inverse FFT clFFT_ExecuteInterleaved((*d_cl_queue)(), d_cl_fft_plan, d_cl_fft_batch_size, clFFT_Inverse, (*d_cl_buffer_2)(), (*d_cl_buffer_2)(), 0, NULL, NULL); // Compute magnitude kernel = cl::Kernel(d_cl_program, "magnitude_squared"); kernel.setArg(0, *d_cl_buffer_2); //input 1 kernel.setArg(1, *d_cl_buffer_magnitude); //output d_cl_queue->enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(d_fft_size), cl::NullRange); // This is the only function that blocks this thread until all previously enqueued // OpenCL commands are completed. d_cl_queue->enqueueReadBuffer(*d_cl_buffer_magnitude, CL_TRUE, 0, sizeof(float)*d_fft_size,d_magnitude); // Search maximum // @TODO: find an efficient way to search the maximum with OpenCL in the GPU. volk_gnsssdr_32f_index_max_32u(&indext, d_magnitude, d_fft_size); // Normalize the maximum value to correct the scale factor introduced by FFTW magt = d_magnitude[indext] / (fft_normalization_factor * fft_normalization_factor); // 4- record the maximum peak and the associated synchronization parameters if (d_mag < magt) { d_mag = magt; // In case that d_bit_transition_flag = true, we compare the potentially // new maximum test statistics (d_mag/d_input_power) with the value in // d_test_statistics. When the second dwell is being processed, the value // of d_mag/d_input_power could be lower than d_test_statistics (i.e, // the maximum test statistics in the previous dwell is greater than // current d_mag/d_input_power). Note that d_test_statistics is not // restarted between consecutive dwells in multidwell operation. if (d_test_statistics < (d_mag / d_input_power) || !d_bit_transition_flag) { d_gnss_synchro->Acq_delay_samples = static_cast(indext % d_samples_per_code); d_gnss_synchro->Acq_doppler_hz = static_cast(doppler); d_gnss_synchro->Acq_samplestamp_samples = samplestamp; // 5- Compute the test statistics and compare to the threshold //d_test_statistics = 2 * d_fft_size * d_mag / d_input_power; d_test_statistics = d_mag / d_input_power; } } // Record results to file if required if (d_dump) { std::stringstream filename; std::streamsize n = 2 * sizeof(float) * (d_fft_size); // complex file write filename.str(""); filename << "../data/test_statistics_" << d_gnss_synchro->System << "_" << d_gnss_synchro->Signal << "_sat_" << d_gnss_synchro->PRN << "_doppler_" << doppler << ".dat"; d_dump_file.open(filename.str().c_str(), std::ios::out | std::ios::binary); d_dump_file.write((char*)d_ifft->get_outbuf(), n); //write directly |abs(x)|^2 in this Doppler bin? d_dump_file.close(); } } // gettimeofday(&tv, NULL); // end = tv.tv_sec *1e6 + tv.tv_usec; // std::cout << "Acq time = " << (end-begin) << " us" << std::endl; if (!d_bit_transition_flag) { if (d_test_statistics > d_threshold) { d_state = 2; // Positive acquisition } else if (d_well_count == d_max_dwells) { d_state = 3; // Negative acquisition } } else { if (d_well_count == d_max_dwells) // d_max_dwells = 2 { if (d_test_statistics > d_threshold) { d_state = 2; // Positive acquisition } else { d_state = 3; // Negative acquisition } } } d_core_working = false; } void pcps_opencl_acquisition_cc::set_state(int state) { d_state = state; if (d_state == 1) { d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_well_count = 0; d_mag = 0.0; d_input_power = 0.0; d_test_statistics = 0.0; d_in_dwell_count = 0; d_sample_counter_buffer.clear(); } else if (d_state == 0) {} else { LOG(ERROR) << "State can only be set to 0 or 1"; } } int pcps_opencl_acquisition_cc::general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items __attribute__((unused))) { int acquisition_message = -1; //0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL switch (d_state) { case 0: { if (d_active) { //restart acquisition variables d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_well_count = 0; d_mag = 0.0; d_input_power = 0.0; d_test_statistics = 0.0; d_in_dwell_count = 0; d_sample_counter_buffer.clear(); d_state = 1; } d_sample_counter += d_fft_size * ninput_items[0]; // sample counter break; } case 1: { if (d_in_dwell_count < d_max_dwells) { // Fill internal buffer with d_max_dwells signal blocks. This step ensures that // consecutive signal blocks will be processed in multi-dwell operation. This is // essential when d_bit_transition_flag = true. unsigned int num_dwells = std::min(static_cast(d_max_dwells-d_in_dwell_count), ninput_items[0]); for (unsigned int i = 0; i < num_dwells; i++) { memcpy(d_in_buffer[d_in_dwell_count++], (gr_complex*)input_items[i], sizeof(gr_complex)*d_fft_size); d_sample_counter += d_fft_size; d_sample_counter_buffer.push_back(d_sample_counter); } if (ninput_items[0] > static_cast(num_dwells)) { d_sample_counter += d_fft_size * (ninput_items[0] - num_dwells); } } else { // We already have d_max_dwells consecutive blocks in the internal buffer, // just skip input blocks. d_sample_counter += d_fft_size * ninput_items[0]; } // We create a new thread to process next block if the following // conditions are fulfilled: // 1. There are new blocks in d_in_buffer that have not been processed yet // (d_well_count < d_in_dwell_count). // 2. No other acquisition_core thead is working (!d_core_working). // 3. d_state==1. We need to check again d_state because it can be modified at any // moment by the external thread (may have changed since checked in the switch()). // If the external thread has already declared positive (d_state=2) or negative // (d_state=3) acquisition, we don't have to process next block!! if ((d_well_count < d_in_dwell_count) && !d_core_working && d_state == 1) { d_core_working = true; if (d_opencl == 0) { // Use OpenCL implementation boost::thread(&pcps_opencl_acquisition_cc::acquisition_core_opencl, this); } else { // Use Volk implementation boost::thread(&pcps_opencl_acquisition_cc::acquisition_core_volk, this); } } break; } case 2: { // Declare positive acquisition using a message port DLOG(INFO) << "positive acquisition"; DLOG(INFO) << "satellite " << d_gnss_synchro->System << " " << d_gnss_synchro->PRN; DLOG(INFO) << "sample_stamp " << d_sample_counter; DLOG(INFO) << "test statistics value " << d_test_statistics; DLOG(INFO) << "test statistics threshold " << d_threshold; DLOG(INFO) << "code phase " << d_gnss_synchro->Acq_delay_samples; DLOG(INFO) << "doppler " << d_gnss_synchro->Acq_doppler_hz; DLOG(INFO) << "magnitude " << d_mag; DLOG(INFO) << "input signal power " << d_input_power; d_active = false; d_state = 0; d_sample_counter += d_fft_size * ninput_items[0]; // sample counter acquisition_message = 1; this->message_port_pub(pmt::mp("events"), pmt::from_long(acquisition_message)); break; } case 3: { // Declare negative acquisition using a message port DLOG(INFO) << "negative acquisition"; DLOG(INFO) << "satellite " << d_gnss_synchro->System << " " << d_gnss_synchro->PRN; DLOG(INFO) << "sample_stamp " << d_sample_counter; DLOG(INFO) << "test statistics value " << d_test_statistics; DLOG(INFO) << "test statistics threshold " << d_threshold; DLOG(INFO) << "code phase " << d_gnss_synchro->Acq_delay_samples; DLOG(INFO) << "doppler " << d_gnss_synchro->Acq_doppler_hz; DLOG(INFO) << "magnitude " << d_mag; DLOG(INFO) << "input signal power " << d_input_power; d_active = false; d_state = 0; d_sample_counter += d_fft_size * ninput_items[0]; // sample counter acquisition_message = 2; this->message_port_pub(pmt::mp("events"), pmt::from_long(acquisition_message)); break; } } consume_each(ninput_items[0]); return noutput_items; } gnss-sdr-0.0.9/src/algorithms/acquisition/gnuradio_blocks/pcps_opencl_acquisition_cc.h000066400000000000000000000203241305042567700314620ustar00rootroot00000000000000/*! * \file pcps_opencl_acquisition_cc.h * \brief This class implements a Parallel Code Phase Search Acquisition * using OpenCL to offload some functions to the GPU. * * Acquisition strategy (Kay Borre book + CFAR threshold). *
      *
    1. Compute the input signal power estimation *
    2. Doppler serial search loop *
    3. Perform the FFT-based circular convolution (parallel time search) *
    4. Record the maximum peak and the associated synchronization parameters *
    5. Compute the test statistics and compare to the threshold *
    6. Declare positive or negative acquisition using a message port *
    * * Kay Borre book: K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * "A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach", Birkha user, 2007. pp 81-84 * * \authors
      *
    • Javier Arribas, 2011. jarribas(at)cttc.es *
    • Luis Esteve, 2012. luis(at)epsilon-formacion.com *
    • Marc Molina, 2013. marc.molina.pena@gmail.com *
    * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_PCPS_OPENCL_ACQUISITION_CC_H_ #define GNSS_SDR_PCPS_OPENCL_ACQUISITION_CC_H_ #include #include #include #include #include #include #include "fft_internal.h" #include "gnss_synchro.h" #ifdef __APPLE__ #include "cl.hpp" #else #include #endif class pcps_opencl_acquisition_cc; typedef boost::shared_ptr pcps_opencl_acquisition_cc_sptr; pcps_opencl_acquisition_cc_sptr pcps_make_opencl_acquisition_cc(unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool dump, std::string dump_filename); /*! * \brief This class implements a Parallel Code Phase Search Acquisition. * * Check \ref Navitec2012 "An Open Source Galileo E1 Software Receiver", * Algorithm 1, for a pseudocode description of this implementation. */ class pcps_opencl_acquisition_cc: public gr::block { private: friend pcps_opencl_acquisition_cc_sptr pcps_make_opencl_acquisition_cc(unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool dump, std::string dump_filename); pcps_opencl_acquisition_cc(unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool dump, std::string dump_filename); void calculate_magnitudes(gr_complex* fft_begin, int doppler_shift, int doppler_offset); int init_opencl_environment(std::string kernel_filename); long d_fs_in; long d_freq; int d_samples_per_ms; int d_samples_per_code; unsigned int d_doppler_resolution; float d_threshold; std::string d_satellite_str; unsigned int d_doppler_max; unsigned int d_doppler_step; unsigned int d_sampled_ms; unsigned int d_max_dwells; unsigned int d_well_count; unsigned int d_fft_size; unsigned int d_fft_size_pow2; int* d_max_doppler_indexs; unsigned long int d_sample_counter; gr_complex** d_grid_doppler_wipeoffs; unsigned int d_num_doppler_bins; gr_complex* d_fft_codes; gr::fft::fft_complex* d_fft_if; gr::fft::fft_complex* d_ifft; Gnss_Synchro *d_gnss_synchro; unsigned int d_code_phase; float d_doppler_freq; float d_mag; float* d_magnitude; float d_input_power; float d_test_statistics; bool d_bit_transition_flag; std::ofstream d_dump_file; bool d_active; int d_state; bool d_core_working; bool d_dump; unsigned int d_channel; std::string d_dump_filename; gr_complex* d_zero_vector; gr_complex** d_in_buffer; std::vector d_sample_counter_buffer; unsigned int d_in_dwell_count; cl::Platform d_cl_platform; cl::Device d_cl_device; cl::Context d_cl_context; cl::Program d_cl_program; cl::Buffer* d_cl_buffer_in; cl::Buffer* d_cl_buffer_fft_codes; cl::Buffer* d_cl_buffer_1; cl::Buffer* d_cl_buffer_2; cl::Buffer* d_cl_buffer_magnitude; cl::Buffer** d_cl_buffer_grid_doppler_wipeoffs; cl::CommandQueue* d_cl_queue; clFFT_Plan d_cl_fft_plan; cl_int d_cl_fft_batch_size; int d_opencl; public: /*! * \brief Default destructor. */ ~pcps_opencl_acquisition_cc(); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to exchange synchronization data between acquisition and tracking blocks. * \param p_gnss_synchro Satellite information shared by the processing blocks. */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { d_gnss_synchro = p_gnss_synchro; } /*! * \brief Returns the maximum peak of grid search. */ unsigned int mag() { return d_mag; } /*! * \brief Initializes acquisition algorithm. */ void init(); /*! * \brief Sets local code for PCPS acquisition algorithm. * \param code - Pointer to the PRN code. */ void set_local_code(std::complex * code); /*! * \brief Starts acquisition algorithm, turning from standby mode to * active mode * \param active - bool that activates/deactivates the block. */ void set_active(bool active) { d_active = active; } /*! * \brief If set to 1, ensures that acquisition starts at the * first available sample. * \param state - int=1 forces start of acquisition */ void set_state(int state); /*! * \brief Set acquisition channel unique ID * \param channel - receiver channel. */ void set_channel(unsigned int channel) { d_channel = channel; } /*! * \brief Set statistics threshold of PCPS algorithm. * \param threshold - Threshold for signal detection (check \ref Navitec2012, * Algorithm 1, for a definition of this threshold). */ void set_threshold(float threshold) { d_threshold = threshold; } /*! * \brief Set maximum Doppler grid search * \param doppler_max - Maximum Doppler shift considered in the grid search [Hz]. */ void set_doppler_max(unsigned int doppler_max) { d_doppler_max = doppler_max; } /*! * \brief Set Doppler steps for the grid search * \param doppler_step - Frequency bin of the search grid [Hz]. */ void set_doppler_step(unsigned int doppler_step) { d_doppler_step = doppler_step; } /*! * \brief Parallel Code Phase Search Acquisition signal processing. */ int general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); void acquisition_core_volk(); void acquisition_core_opencl(); }; #endif gnss-sdr-0.0.9/src/algorithms/acquisition/gnuradio_blocks/pcps_quicksync_acquisition_cc.cc000066400000000000000000000637311305042567700323620ustar00rootroot00000000000000/*! * \file pcps_quicksync_acquisition_cc.cc * \brief This class implements a Parallel Code Phase Search Acquisition * \author Damian Miralles Sanchez, 2014. dmiralles2009(at)gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "pcps_quicksync_acquisition_cc.h" #include #include #include #include #include #include #include "control_message_factory.h" #include "GPS_L1_CA.h" using google::LogMessage; pcps_quicksync_acquisition_cc_sptr pcps_quicksync_make_acquisition_cc( unsigned int folding_factor, unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool dump, std::string dump_filename) { return pcps_quicksync_acquisition_cc_sptr( new pcps_quicksync_acquisition_cc( folding_factor, sampled_ms, max_dwells, doppler_max, freq, fs_in, samples_per_ms, samples_per_code, bit_transition_flag, dump, dump_filename)); } pcps_quicksync_acquisition_cc::pcps_quicksync_acquisition_cc( unsigned int folding_factor, unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool dump, std::string dump_filename): gr::block("pcps_quicksync_acquisition_cc", gr::io_signature::make(1, 1, (sizeof(gr_complex)*sampled_ms * samples_per_ms )), gr::io_signature::make(0, 0, (sizeof(gr_complex)*sampled_ms * samples_per_ms ))) { this->message_port_register_out(pmt::mp("events")); d_sample_counter = 0; // SAMPLE COUNTER d_active = false; d_state = 0; d_freq = freq; d_fs_in = fs_in; d_samples_per_ms = samples_per_ms; d_samples_per_code = samples_per_code; d_sampled_ms = sampled_ms; d_max_dwells = max_dwells; d_well_count = 0; d_doppler_max = doppler_max; d_mag = 0; d_input_power = 0.0; d_num_doppler_bins = 0; d_bit_transition_flag = bit_transition_flag; d_folding_factor = folding_factor; //fft size is reduced. d_fft_size = (d_samples_per_code) / d_folding_factor; d_fft_codes = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); d_magnitude = static_cast(volk_gnsssdr_malloc(d_samples_per_code * d_folding_factor * sizeof(float), volk_gnsssdr_get_alignment())); d_magnitude_folded = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); d_possible_delay = new unsigned int[d_folding_factor]; d_corr_output_f = new float[d_folding_factor]; /*Create the d_code signal , which would store the values of the code in its original form to perform later correlation in time domain*/ d_code = new gr_complex[d_samples_per_code](); // Direct FFT d_fft_if = new gr::fft::fft_complex(d_fft_size, true); // Inverse FFT d_ifft = new gr::fft::fft_complex(d_fft_size, false); // For dumping samples into a file d_dump = dump; d_dump_filename = dump_filename; d_corr_acumulator = 0; d_signal_folded = 0; d_code_folded = new gr_complex[d_fft_size](); d_noise_floor_power = 0; d_doppler_resolution = 0; d_threshold = 0; d_doppler_step = 0; d_grid_doppler_wipeoffs = 0; d_fft_if2 = 0; d_gnss_synchro = 0; d_code_phase = 0; d_doppler_freq = 0; d_test_statistics = 0; d_channel = 0; //d_code_folded = 0; // DLOG(INFO) << "END CONSTRUCTOR"; } pcps_quicksync_acquisition_cc::~pcps_quicksync_acquisition_cc() { //DLOG(INFO) << "START DESTROYER"; if (d_num_doppler_bins > 0) { for (unsigned int i = 0; i < d_num_doppler_bins; i++) { volk_gnsssdr_free(d_grid_doppler_wipeoffs[i]); } delete[] d_grid_doppler_wipeoffs; } volk_gnsssdr_free(d_fft_codes); volk_gnsssdr_free(d_magnitude); volk_gnsssdr_free(d_magnitude_folded); delete d_ifft; delete d_fft_if; delete d_code; delete d_possible_delay; delete d_corr_output_f; delete[] d_code_folded; if (d_dump) { d_dump_file.close(); } // DLOG(INFO) << "END DESTROYER"; } void pcps_quicksync_acquisition_cc::set_local_code(std::complex* code) { /*save a local copy of the code without the folding process to perform corre- lation in time in the final steps of the acquisition stage*/ memcpy(d_code, code, sizeof(gr_complex) * d_samples_per_code); //d_code_folded = new gr_complex[d_fft_size](); memcpy(d_fft_if->get_inbuf(), d_code_folded, sizeof(gr_complex) * (d_fft_size)); /*perform folding of the code by the factorial factor parameter. Notice that folding of the code in the time stage would result in a downsampled spectrum in the frequency domain after applying the fftw operation*/ for (unsigned int i = 0; i < d_folding_factor; i++) { std::transform ((code + i * d_fft_size), (code + ((i + 1) * d_fft_size)) , d_fft_if->get_inbuf(), d_fft_if->get_inbuf(), std::plus()); } d_fft_if->execute(); // We need the FFT of local code //Conjugate the local code volk_32fc_conjugate_32fc(d_fft_codes, d_fft_if->get_outbuf(), d_fft_size); } void pcps_quicksync_acquisition_cc::init() { d_gnss_synchro->Flag_valid_acquisition = false; d_gnss_synchro->Flag_valid_symbol_output = false; d_gnss_synchro->Flag_valid_pseudorange = false; d_gnss_synchro->Flag_valid_word = false; d_gnss_synchro->Flag_preamble = false; //DLOG(INFO) << "START init"; d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_mag = 0.0; d_input_power = 0.0; if(d_doppler_step == 0) d_doppler_step = 250; // Count the number of bins d_num_doppler_bins = 0; for (int doppler = static_cast(-d_doppler_max); doppler <= static_cast(d_doppler_max); doppler += d_doppler_step) { d_num_doppler_bins++; } // Create the carrier Doppler wipeoff signals d_grid_doppler_wipeoffs = new gr_complex*[d_num_doppler_bins]; for (unsigned int doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { d_grid_doppler_wipeoffs[doppler_index] = static_cast(volk_gnsssdr_malloc(d_samples_per_code * d_folding_factor * sizeof(gr_complex), volk_gnsssdr_get_alignment())); int doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; float phase_step_rad = GPS_TWO_PI * (d_freq + doppler) / static_cast(d_fs_in); float _phase[1]; _phase[0] = 0; volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], - phase_step_rad, _phase, d_samples_per_code * d_folding_factor); } // DLOG(INFO) << "end init"; } void pcps_quicksync_acquisition_cc::set_state(int state) { d_state = state; if (d_state == 1) { d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_well_count = 0; d_mag = 0.0; d_input_power = 0.0; d_test_statistics = 0.0; d_active = 1; } else if (d_state == 0) {} else { LOG(ERROR) << "State can only be set to 0 or 1"; } } int pcps_quicksync_acquisition_cc::general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items __attribute__((unused))) { /* * By J.Arribas, L.Esteve and M.Molina * Acquisition strategy (Kay Borre book + CFAR threshold): * 1. Compute the input signal power estimation * 2. Doppler serial search loop * 3. Perform the FFT-based circular convolution (parallel time search) * 4. Record the maximum peak and the associated synchronization parameters * 5. Compute the test statistics and compare to the threshold * 6. Declare positive or negative acquisition using a message queue */ //DLOG(INFO) << "START GENERAL WORK"; int acquisition_message = -1; //0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL //std::cout<<"general_work in quicksync gnuradio block"<Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_well_count = 0; d_mag = 0.0; d_input_power = 0.0; d_test_statistics = 0.0; d_state = 1; } d_sample_counter += d_sampled_ms * d_samples_per_ms * ninput_items[0]; // sample counter consume_each(ninput_items[0]); //DLOG(INFO) << "END CASE 0"; break; } case 1: { /* initialize acquisition implementing the QuickSync algorithm*/ //DLOG(INFO) << "START CASE 1"; int doppler; uint32_t indext = 0; float magt = 0.0; const gr_complex *in = (const gr_complex *)input_items[0]; //Get the input samples pointer gr_complex* in_temp = static_cast(volk_gnsssdr_malloc(d_samples_per_code * d_folding_factor * sizeof(gr_complex), volk_gnsssdr_get_alignment())); gr_complex* in_temp_folded = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); /*Create a signal to store a signal of size 1ms, to perform correlation in time. No folding on this data is required*/ gr_complex* in_1code = static_cast(volk_gnsssdr_malloc(d_samples_per_code * sizeof(gr_complex), volk_gnsssdr_get_alignment())); /*Stores the values of the correlation output between the local code and the signal with doppler shift corrected */ gr_complex* corr_output = static_cast(volk_gnsssdr_malloc(d_samples_per_code * sizeof(gr_complex), volk_gnsssdr_get_alignment())); /*Stores a copy of the folded version of the signal.This is used for the FFT operations in future steps of excecution*/ // gr_complex in_folded[d_fft_size]; float fft_normalization_factor = static_cast(d_fft_size) * static_cast(d_fft_size); d_input_power = 0.0; d_mag = 0.0; d_test_statistics = 0.0; d_noise_floor_power = 0.0; d_sample_counter += d_sampled_ms * d_samples_per_ms; // sample counter d_well_count++; DLOG(INFO) << "Channel: " << d_channel << " , doing acquisition of satellite: " << d_gnss_synchro->System << " "<< d_gnss_synchro->PRN << " ,algorithm: pcps_quicksync_acquisition" << " ,folding factor: " << d_folding_factor << " ,sample stamp: " << d_sample_counter << ", threshold: " << d_threshold << ", doppler_max: " << d_doppler_max << ", doppler_step: " << d_doppler_step << ", Signal Size: " << d_samples_per_code * d_folding_factor; /* 1- Compute the input signal power estimation. This operation is being performed in a signal of size nxp */ volk_32fc_magnitude_squared_32f(d_magnitude, in, d_samples_per_code * d_folding_factor); volk_32f_accumulator_s32f(&d_input_power, d_magnitude, d_samples_per_code * d_folding_factor); d_input_power /= static_cast(d_samples_per_code * d_folding_factor); for (unsigned int doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { /*Ensure that the signal is going to start with all samples at zero. This is done to avoid over acumulation when performing the folding process to be stored in d_fft_if->get_inbuf()*/ d_signal_folded = new gr_complex[d_fft_size](); memcpy( d_fft_if->get_inbuf(), d_signal_folded, sizeof(gr_complex) * (d_fft_size)); /*Doppler search steps and then multiplication of the incoming signal with the doppler wipeoffs to eliminate frequency offset */ doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; /*Perform multiplication of the incoming signal with the complex exponential vector. This removes the frequency doppler shift offset*/ volk_32fc_x2_multiply_32fc(in_temp, in, d_grid_doppler_wipeoffs[doppler_index], d_samples_per_code * d_folding_factor); /*Perform folding of the carrier wiped-off incoming signal. Since superlinear method is being used the folding factor in the incoming raw data signal is of d_folding_factor^2*/ for ( int i = 0; i < static_cast(d_folding_factor * d_folding_factor); i++) { std::transform ((in_temp + i * d_fft_size), (in_temp + ((i + 1) * d_fft_size)) , d_fft_if->get_inbuf(), d_fft_if->get_inbuf(), std::plus()); } /* 3- Perform the FFT-based convolution (parallel time search) Compute the FFT of the carrier wiped--off incoming signal*/ d_fft_if->execute(); /*Multiply carrier wiped--off, Fourier transformed incoming signal with the local FFT'd code reference using SIMD operations with VOLK library*/ volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), d_fft_if->get_outbuf(), d_fft_codes, d_fft_size); /* compute the inverse FFT of the aliased signal*/ d_ifft->execute(); /* Compute the magnitude and get the maximum value with its index position*/ volk_32fc_magnitude_squared_32f(d_magnitude_folded, d_ifft->get_outbuf(), d_fft_size); /* Normalize the maximum value to correct the scale factor introduced by FFTW*/ //volk_32f_s32f_multiply_32f_a(d_magnitude_folded,d_magnitude_folded, // (1 / (fft_normalization_factor * fft_normalization_factor)), d_fft_size); volk_gnsssdr_32f_index_max_32u(&indext, d_magnitude_folded, d_fft_size); magt = d_magnitude_folded[indext] / (fft_normalization_factor * fft_normalization_factor); delete[] d_signal_folded; // 4- record the maximum peak and the associated synchronization parameters if (d_mag < magt) { d_mag = magt; /* In case that d_bit_transition_flag = true, we compare the potentially new maximum test statistics (d_mag/d_input_power) with the value in d_test_statistics. When the second dwell is being processed, the value of d_mag/d_input_power could be lower than d_test_statistics (i.e, the maximum test statistics in the previous dwell is greater than current d_mag/d_input_power). Note that d_test_statistics is not restarted between consecutive dwells in multidwell operation.*/ if (d_test_statistics < (d_mag / d_input_power) || !d_bit_transition_flag) { unsigned int detected_delay_samples_folded = 0; detected_delay_samples_folded = (indext % d_samples_per_code); gr_complex complex_acumulator[100]; //gr_complex complex_acumulator[d_folding_factor]; for (int i = 0; i < static_cast(d_folding_factor); i++) { d_possible_delay[i] = detected_delay_samples_folded + (i) * d_fft_size; } for ( int i = 0; i < static_cast(d_folding_factor); i++) { /*Copy a signal of 1 code length into suggested buffer. The copied signal must have doppler effect corrected*/ memcpy(in_1code,&in_temp[d_possible_delay[i]], sizeof(gr_complex) * (d_samples_per_code)); /*Perform multiplication of the unmodified local generated code with the incoming signal with doppler effect corrected and accumulates its value. This is indeed correlation in time for an specific value of a shift*/ volk_32fc_x2_multiply_32fc(corr_output, in_1code, d_code, d_samples_per_code); for(int j = 0; j < d_samples_per_code; j++) { complex_acumulator[i] += (corr_output[j]); } } /*Obtain maximun value of correlation given the possible delay selected */ volk_32fc_magnitude_squared_32f(d_corr_output_f, complex_acumulator, d_folding_factor); volk_gnsssdr_32f_index_max_32u(&indext, d_corr_output_f, d_folding_factor); /*Now save the real code phase in the gnss_syncro block for use in other stages*/ d_gnss_synchro->Acq_delay_samples = static_cast(d_possible_delay[indext]); d_gnss_synchro->Acq_doppler_hz = static_cast(doppler); d_gnss_synchro->Acq_samplestamp_samples = d_sample_counter; /* 5- Compute the test statistics and compare to the threshold d_test_statistics = 2 * d_fft_size * d_mag / d_input_power;*/ d_test_statistics = d_mag / d_input_power; //delete complex_acumulator; } } // Record results to file if required if (d_dump) { /*Since QuickSYnc performs a folded correlation in frequency by means of the FFT, it is esential to also keep the values obtained from the possible delay to show how it is maximize*/ std::stringstream filename; std::streamsize n = sizeof(float) * (d_fft_size); // complex file write filename.str(""); filename << "../data/test_statistics_" << d_gnss_synchro->System << "_" << d_gnss_synchro->Signal << "_sat_" << d_gnss_synchro->PRN << "_doppler_" << doppler << ".dat"; d_dump_file.open(filename.str().c_str(), std::ios::out | std::ios::binary); d_dump_file.write((char*)d_magnitude_folded, n); //write directly |abs(x)|^2 in this Doppler bin? d_dump_file.close(); } } if (!d_bit_transition_flag) { if (d_test_statistics > d_threshold) { d_state = 2; // Positive acquisition } else if (d_well_count == d_max_dwells) { d_state = 3; // Negative acquisition } } else { if (d_well_count == d_max_dwells) // d_max_dwells = 2 { if (d_test_statistics > d_threshold) { d_state = 2; // Positive acquisition } else { d_state = 3; // Negative acquisition } } } volk_gnsssdr_free(in_temp); volk_gnsssdr_free(in_temp_folded); volk_gnsssdr_free(in_1code); volk_gnsssdr_free(corr_output); consume_each(1); break; } case 2: { //DLOG(INFO) << "START CASE 2"; // 6.1- Declare positive acquisition using a message port DLOG(INFO) << "positive acquisition"; DLOG(INFO) << "satellite " << d_gnss_synchro->System << " " << d_gnss_synchro->PRN; DLOG(INFO) << "sample_stamp " << d_sample_counter; DLOG(INFO) << "test statistics value " << d_test_statistics; DLOG(INFO) << "test statistics threshold " << d_threshold; DLOG(INFO) << "folding factor " << d_folding_factor; DLOG(INFO) << "possible delay correlation output"; for (int i = 0; i < static_cast(d_folding_factor); i++) DLOG(INFO) << d_possible_delay[i] << "\t\t\t" << d_corr_output_f[i]; DLOG(INFO) << "code phase " << d_gnss_synchro->Acq_delay_samples; DLOG(INFO) << "doppler " << d_gnss_synchro->Acq_doppler_hz; DLOG(INFO) << "magnitude folded " << d_mag; DLOG(INFO) << "input signal power " << d_input_power; d_active = false; d_state = 0; d_sample_counter += d_sampled_ms * d_samples_per_ms * ninput_items[0]; // sample counter consume_each(ninput_items[0]); acquisition_message = 1; this->message_port_pub(pmt::mp("events"), pmt::from_long(acquisition_message)); //DLOG(INFO) << "END CASE 2"; break; } case 3: { //DLOG(INFO) << "START CASE 3"; // 6.2- Declare negative acquisition using a message port DLOG(INFO) << "negative acquisition"; DLOG(INFO) << "satellite " << d_gnss_synchro->System << " " << d_gnss_synchro->PRN; DLOG(INFO) << "sample_stamp " << d_sample_counter; DLOG(INFO) << "test statistics value " << d_test_statistics; DLOG(INFO) << "test statistics threshold " << d_threshold; DLOG(INFO) << "folding factor "<(d_folding_factor); i++) DLOG(INFO) << d_possible_delay[i] << "\t\t\t" << d_corr_output_f[i]; DLOG(INFO) << "code phase " << d_gnss_synchro->Acq_delay_samples; DLOG(INFO) << "doppler " << d_gnss_synchro->Acq_doppler_hz; DLOG(INFO) << "magnitude folded " << d_mag; DLOG(INFO) << "input signal power " << d_input_power; d_active = false; d_state = 0; d_sample_counter += d_sampled_ms * d_samples_per_ms * ninput_items[0]; // sample counter consume_each(ninput_items[0]); acquisition_message = 2; this->message_port_pub(pmt::mp("events"), pmt::from_long(acquisition_message)); //DLOG(INFO) << "END CASE 3"; break; } } return noutput_items; } gnss-sdr-0.0.9/src/algorithms/acquisition/gnuradio_blocks/pcps_quicksync_acquisition_cc.h000066400000000000000000000173711305042567700322230ustar00rootroot00000000000000/*! * \file pcps_quicksync_acquisition_cc.h * \brief This class implements a Parallel Code Phase Search Acquisition with the * QuickSync Algorithm * * Acquisition strategy (Kay Borre book CFAR + threshold). *
      *
    1. Compute the input signal power estimation *
    2. Doppler serial search loop *
    3. Perform folding of the incoming signal and local generated code *
    4. Perform the FFT-based circular convolution (parallel time search) *
    5. Record the maximum peak and the associated synchronization parameters *
    6. Compute the test statistics and compare to the threshold *
    7. Declare positive or negative acquisition using a message port *
    8. Obtain the adequate acquisition parameters by correlating the incoming * signal shifted by the possible folded delays *
    * * Kay Borre book: K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * "A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach", Birkha user, 2007. pp 81-84 * * \date Jun2 2014 * \author Damian Miralles Sanchez, dmiralles2009@gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_PCPS_QUICKSYNC_ACQUISITION_CC_H_ #define GNSS_SDR_PCPS_QUICKSYNC_ACQUISITION_CC_H_ #include #include #include #include #include #include #include #include #include "gnss_synchro.h" class pcps_quicksync_acquisition_cc; typedef boost::shared_ptr pcps_quicksync_acquisition_cc_sptr; pcps_quicksync_acquisition_cc_sptr pcps_quicksync_make_acquisition_cc(unsigned int folding_factor, unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool dump, std::string dump_filename); /*! * \brief This class implements a Parallel Code Phase Search Acquisition with * the implementation of the Sparse QuickSync Algorithm. * * Check \ref Navitec2012 "Faster GPS via the Sparse Fourier Transform", * for details of its implementation and functionality. */ class pcps_quicksync_acquisition_cc: public gr::block { private: friend pcps_quicksync_acquisition_cc_sptr pcps_quicksync_make_acquisition_cc(unsigned int folding_factor, unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool dump, std::string dump_filename); pcps_quicksync_acquisition_cc(unsigned int folding_factor, unsigned int sampled_ms, unsigned int max_dwells, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, bool bit_transition_flag, bool dump, std::string dump_filename); void calculate_magnitudes(gr_complex* fft_begin, int doppler_shift, int doppler_offset); gr_complex* d_code; unsigned int d_folding_factor; // also referred in the paper as 'p' float* d_corr_acumulator; unsigned int* d_possible_delay; float* d_corr_output_f; float* d_magnitude_folded; gr_complex* d_signal_folded; gr_complex* d_code_folded; float d_noise_floor_power; long d_fs_in; long d_freq; int d_samples_per_ms; int d_samples_per_code; unsigned int d_doppler_resolution; float d_threshold; std::string d_satellite_str; unsigned int d_doppler_max; unsigned int d_doppler_step; unsigned int d_sampled_ms; unsigned int d_max_dwells; unsigned int d_well_count; unsigned int d_fft_size; unsigned long int d_sample_counter; gr_complex** d_grid_doppler_wipeoffs; unsigned int d_num_doppler_bins; gr_complex* d_fft_codes; gr::fft::fft_complex* d_fft_if; gr::fft::fft_complex* d_fft_if2; gr::fft::fft_complex* d_ifft; Gnss_Synchro *d_gnss_synchro; unsigned int d_code_phase; float d_doppler_freq; float d_mag; float* d_magnitude; float d_input_power; float d_test_statistics; bool d_bit_transition_flag; std::ofstream d_dump_file; bool d_active; int d_state; bool d_dump; unsigned int d_channel; std::string d_dump_filename; public: /*! * \brief Default destructor. */ ~pcps_quicksync_acquisition_cc(); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to exchange synchronization data between acquisition and tracking blocks. * \param p_gnss_synchro Satellite information shared by the processing blocks. */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { d_gnss_synchro = p_gnss_synchro; } /*! * \brief Returns the maximum peak of grid search. */ unsigned int mag() { return d_mag; } /*! * \brief Initializes acquisition algorithm. */ void init(); /*! * \brief Sets local code for PCPS acquisition algorithm. * \param code - Pointer to the PRN code. */ void set_local_code(std::complex * code); /*! * \brief Starts acquisition algorithm, turning from standby mode to * active mode * \param active - bool that activates/deactivates the block. */ void set_active(bool active) { d_active = active; } /*! * \brief If set to 1, ensures that acquisition starts at the * first available sample. * \param state - int=1 forces start of acquisition */ void set_state(int state); /*! * \brief Set acquisition channel unique ID * \param channel - receiver channel. */ void set_channel(unsigned int channel) { d_channel = channel; } /*! * \brief Set statistics threshold of PCPS algorithm. * \param threshold - Threshold for signal detection (check \ref Navitec2012, * Algorithm 1, for a definition of this threshold). */ void set_threshold(float threshold) { d_threshold = threshold; } /*! * \brief Set maximum Doppler grid search * \param doppler_max - Maximum Doppler shift considered in the grid search [Hz]. */ void set_doppler_max(unsigned int doppler_max) { d_doppler_max = doppler_max; } /*! * \brief Set Doppler steps for the grid search * \param doppler_step - Frequency bin of the search grid [Hz]. */ void set_doppler_step(unsigned int doppler_step) { d_doppler_step = doppler_step; } /*! * \brief Parallel Code Phase Search Acquisition signal processing. */ int general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; #endif /* GNSS_SDR_PCPS_ACQUISITION_CC_H_*/ gnss-sdr-0.0.9/src/algorithms/acquisition/gnuradio_blocks/pcps_tong_acquisition_cc.cc000066400000000000000000000427531305042567700313210ustar00rootroot00000000000000/*! * \file pcps_tong_acquisition_cc.h * \brief This class implements a Parallel Code Phase Search Acquisition with * Tong algorithm. * \author Marc Molina, 2013. marc.molina.pena(at)gmail.com * * Acquisition strategy (Kaplan book + CFAR threshold). *
      *
    1. Compute the input signal power estimation. *
    2. Doppler serial search loop. *
    3. Perform the FFT-based circular convolution (parallel time search). *
    4. Compute the tests statistics for all the cells. *
    5. Accumulate the grid of tests statistics with the previous grids. *
    6. Record the maximum peak and the associated synchronization parameters. *
    7. Compare the maximum averaged test statistics with a threshold. *
    8. If the test statistics exceeds the threshold, increment the Tong counter. *
    9. Otherwise, decrement the Tong counter. *
    10. If the Tong counter is equal to a given maximum value, declare positive *
    11. acquisition. If the Tong counter is equal to zero, declare negative *
    12. acquisition. Otherwise, process the next block. *
    * * Kaplan book: D.Kaplan, J.Hegarty, "Understanding GPS. Principles * and Applications", Artech House, 2006, pp 223-227 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "pcps_tong_acquisition_cc.h" #include #include #include #include #include #include "control_message_factory.h" #include "GPS_L1_CA.h" //GPS_TWO_PI using google::LogMessage; pcps_tong_acquisition_cc_sptr pcps_tong_make_acquisition_cc( unsigned int sampled_ms, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, unsigned int tong_init_val, unsigned int tong_max_val, unsigned int tong_max_dwells, bool dump, std::string dump_filename) { return pcps_tong_acquisition_cc_sptr( new pcps_tong_acquisition_cc(sampled_ms, doppler_max, freq, fs_in, samples_per_ms, samples_per_code, tong_init_val, tong_max_val, tong_max_dwells, dump, dump_filename)); } pcps_tong_acquisition_cc::pcps_tong_acquisition_cc( unsigned int sampled_ms, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, unsigned int tong_init_val, unsigned int tong_max_val, unsigned int tong_max_dwells, bool dump, std::string dump_filename) : gr::block("pcps_tong_acquisition_cc", gr::io_signature::make(1, 1, sizeof(gr_complex) * sampled_ms * samples_per_ms), gr::io_signature::make(0, 0, sizeof(gr_complex) * sampled_ms * samples_per_ms)) { this->message_port_register_out(pmt::mp("events")); d_sample_counter = 0; // SAMPLE COUNTER d_active = false; d_state = 0; d_freq = freq; d_fs_in = fs_in; d_samples_per_ms = samples_per_ms; d_samples_per_code = samples_per_code; d_sampled_ms = sampled_ms; d_dwell_count = 0; d_tong_max_val = tong_max_val; d_tong_max_dwells = tong_max_dwells; d_tong_init_val = tong_init_val; d_tong_count = d_tong_init_val; d_doppler_max = doppler_max; d_fft_size = d_sampled_ms * d_samples_per_ms; d_mag = 0; d_input_power = 0.0; d_num_doppler_bins = 0; d_fft_codes = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); d_magnitude = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); // Direct FFT d_fft_if = new gr::fft::fft_complex(d_fft_size, true); // Inverse FFT d_ifft = new gr::fft::fft_complex(d_fft_size, false); // For dumping samples into a file d_dump = dump; d_dump_filename = dump_filename; d_doppler_resolution = 0; d_threshold = 0; d_doppler_step = 0; d_grid_data = 0; d_grid_doppler_wipeoffs = 0; d_gnss_synchro = 0; d_code_phase = 0; d_doppler_freq = 0; d_test_statistics = 0; d_channel = 0; } pcps_tong_acquisition_cc::~pcps_tong_acquisition_cc() { if (d_num_doppler_bins > 0) { for (unsigned int i = 0; i < d_num_doppler_bins; i++) { volk_gnsssdr_free(d_grid_doppler_wipeoffs[i]); volk_gnsssdr_free(d_grid_data[i]); } delete[] d_grid_doppler_wipeoffs; delete[] d_grid_data; } volk_gnsssdr_free(d_fft_codes); volk_gnsssdr_free(d_magnitude); delete d_ifft; delete d_fft_if; if (d_dump) { d_dump_file.close(); } } void pcps_tong_acquisition_cc::set_local_code(std::complex * code) { memcpy(d_fft_if->get_inbuf(), code, sizeof(gr_complex)*d_fft_size); d_fft_if->execute(); // We need the FFT of local code //Conjugate the local code volk_32fc_conjugate_32fc(d_fft_codes, d_fft_if->get_outbuf(), d_fft_size); } void pcps_tong_acquisition_cc::init() { d_gnss_synchro->Flag_valid_acquisition = false; d_gnss_synchro->Flag_valid_symbol_output = false; d_gnss_synchro->Flag_valid_pseudorange = false; d_gnss_synchro->Flag_valid_word = false; d_gnss_synchro->Flag_preamble = false; d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_mag = 0.0; d_input_power = 0.0; // Count the number of bins d_num_doppler_bins = 0; for (int doppler = static_cast(-d_doppler_max); doppler <= static_cast(d_doppler_max); doppler += d_doppler_step) { d_num_doppler_bins++; } // Create the carrier Doppler wipeoff signals and allocate data grid. d_grid_doppler_wipeoffs = new gr_complex*[d_num_doppler_bins]; d_grid_data = new float*[d_num_doppler_bins]; for (unsigned int doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { d_grid_doppler_wipeoffs[doppler_index] = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); int doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; float phase_step_rad = GPS_TWO_PI * (d_freq + doppler) / static_cast(d_fs_in); float _phase[1]; _phase[0] = 0; volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], - phase_step_rad, _phase, d_fft_size); d_grid_data[doppler_index] = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); for (unsigned int i = 0; i < d_fft_size; i++) { d_grid_data[doppler_index][i] = 0; } } } void pcps_tong_acquisition_cc::set_state(int state) { d_state = state; if (d_state == 1) { d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_dwell_count = 0; d_tong_count = d_tong_init_val; d_mag = 0.0; d_input_power = 0.0; d_test_statistics = 0.0; for (unsigned int doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { for (unsigned int i = 0; i < d_fft_size; i++) { d_grid_data[doppler_index][i] = 0; } } } else if (d_state == 0) {} else { LOG(ERROR) << "State can only be set to 0 or 1"; } } int pcps_tong_acquisition_cc::general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items __attribute__((unused))) { int acquisition_message = -1; //0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL switch (d_state) { case 0: { if (d_active) { //restart acquisition variables d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0; d_dwell_count = 0; d_tong_count = d_tong_init_val; d_mag = 0.0; d_input_power = 0.0; d_test_statistics = 0.0; for (unsigned int doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { for (unsigned int i = 0; i < d_fft_size; i++) { d_grid_data[doppler_index][i] = 0; } } d_state = 1; } d_sample_counter += d_fft_size * ninput_items[0]; // sample counter consume_each(ninput_items[0]); break; } case 1: { // initialize acquisition algorithm int doppler; uint32_t indext = 0; float magt = 0.0; const gr_complex *in = (const gr_complex *)input_items[0]; //Get the input samples pointer float fft_normalization_factor = static_cast(d_fft_size) * static_cast(d_fft_size); d_input_power = 0.0; d_mag = 0.0; d_sample_counter += d_fft_size; // sample counter d_dwell_count++; DLOG(INFO) << "Channel: " << d_channel << " , doing acquisition of satellite: " << d_gnss_synchro->System << " "<< d_gnss_synchro->PRN << " ,sample stamp: " << d_sample_counter << ", threshold: " << d_threshold << ", doppler_max: " << d_doppler_max << ", doppler_step: " << d_doppler_step; // 1- Compute the input signal power estimation volk_32fc_magnitude_squared_32f(d_magnitude, in, d_fft_size); volk_32f_accumulator_s32f(&d_input_power, d_magnitude, d_fft_size); d_input_power /= static_cast(d_fft_size); // 2- Doppler frequency search loop for (unsigned int doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { // doppler search steps doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; volk_32fc_x2_multiply_32fc(d_fft_if->get_inbuf(), in, d_grid_doppler_wipeoffs[doppler_index], d_fft_size); // 3- Perform the FFT-based convolution (parallel time search) // Compute the FFT of the carrier wiped--off incoming signal d_fft_if->execute(); // Multiply carrier wiped--off, Fourier transformed incoming signal // with the local FFT'd code reference using SIMD operations with VOLK library volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), d_fft_if->get_outbuf(), d_fft_codes, d_fft_size); // compute the inverse FFT d_ifft->execute(); // Compute magnitude volk_32fc_magnitude_squared_32f(d_magnitude, d_ifft->get_outbuf(), d_fft_size); // Compute vector of test statistics corresponding to current doppler index. volk_32f_s32f_multiply_32f(d_magnitude, d_magnitude, 1/(fft_normalization_factor*fft_normalization_factor*d_input_power), d_fft_size); // Accumulate test statistics in d_grid_data. volk_32f_x2_add_32f(d_grid_data[doppler_index], d_magnitude, d_grid_data[doppler_index], d_fft_size); // Search maximum volk_gnsssdr_32f_index_max_32u(&indext, d_grid_data[doppler_index], d_fft_size); magt = d_grid_data[doppler_index][indext]; // 4- record the maximum peak and the associated synchronization parameters if (d_mag < magt) { d_mag = magt; d_gnss_synchro->Acq_delay_samples = static_cast(indext % d_samples_per_code); d_gnss_synchro->Acq_doppler_hz = static_cast(doppler); d_gnss_synchro->Acq_samplestamp_samples = d_sample_counter; } // Record results to file if required if (d_dump) { std::stringstream filename; std::streamsize n = 2 * sizeof(float) * (d_fft_size); // complex file write filename.str(""); filename << "../data/test_statistics_" << d_gnss_synchro->System <<"_" << d_gnss_synchro->Signal << "_sat_" << d_gnss_synchro->PRN << "_doppler_" << doppler << ".dat"; d_dump_file.open(filename.str().c_str(), std::ios::out | std::ios::binary); d_dump_file.write((char*)d_ifft->get_outbuf(), n); //write directly |abs(x)|^2 in this Doppler bin? d_dump_file.close(); } } // 5- Compute the test statistics and compare to the threshold d_test_statistics = d_mag; if (d_test_statistics > d_threshold * d_dwell_count) { d_tong_count++; if (d_tong_count == d_tong_max_val) { d_state = 2; // Positive acquisition } } else { d_tong_count--; if (d_tong_count == 0) { d_state = 3; // Negative acquisition } } if(d_dwell_count >= d_tong_max_dwells) { d_state = 3; // Negative acquisition } consume_each(1); break; } case 2: { // 6.1- Declare positive acquisition using a message port DLOG(INFO) << "positive acquisition"; DLOG(INFO) << "satellite " << d_gnss_synchro->System << " " << d_gnss_synchro->PRN; DLOG(INFO) << "sample_stamp " << d_sample_counter; DLOG(INFO) << "test statistics value " << d_test_statistics; DLOG(INFO) << "test statistics threshold " << d_threshold; DLOG(INFO) << "code phase " << d_gnss_synchro->Acq_delay_samples; DLOG(INFO) << "doppler " << d_gnss_synchro->Acq_doppler_hz; DLOG(INFO) << "magnitude " << d_mag; DLOG(INFO) << "input signal power " << d_input_power; d_active = false; d_state = 0; d_sample_counter += d_fft_size * ninput_items[0]; // sample counter consume_each(ninput_items[0]); acquisition_message = 1; this->message_port_pub(pmt::mp("events"), pmt::from_long(acquisition_message)); break; } case 3: { // 6.2- Declare negative acquisition using a message port DLOG(INFO) << "negative acquisition"; DLOG(INFO) << "satellite " << d_gnss_synchro->System << " " << d_gnss_synchro->PRN; DLOG(INFO) << "sample_stamp " << d_sample_counter; DLOG(INFO) << "test statistics value " << d_test_statistics; DLOG(INFO) << "test statistics threshold " << d_threshold; DLOG(INFO) << "code phase " << d_gnss_synchro->Acq_delay_samples; DLOG(INFO) << "doppler " << d_gnss_synchro->Acq_doppler_hz; DLOG(INFO) << "magnitude " << d_mag; DLOG(INFO) << "input signal power " << d_input_power; d_active = false; d_state = 0; d_sample_counter += d_fft_size * ninput_items[0]; // sample counter consume_each(ninput_items[0]); acquisition_message = 2; this->message_port_pub(pmt::mp("events"), pmt::from_long(acquisition_message)); break; } } return noutput_items; } gnss-sdr-0.0.9/src/algorithms/acquisition/gnuradio_blocks/pcps_tong_acquisition_cc.h000066400000000000000000000167561305042567700311670ustar00rootroot00000000000000/*! * \file pcps_tong_acquisition_cc.h * \brief This class implements a Parallel Code Phase Search Acquisition with * Tong algorithm. * \author Marc Molina, 2013. marc.molina.pena(at)gmail.com * * Acquisition strategy (Kaplan book + CFAR threshold). *
      *
    1. Compute the input signal power estimation. *
    2. Doppler serial search loop. *
    3. Perform the FFT-based circular convolution (parallel time search). *
    4. Compute the tests statistics for all the cells. *
    5. Accumulate the grid of tests statistics with the previous grids. *
    6. Record the maximum peak and the associated synchronization parameters. *
    7. Compare the maximum averaged test statistics with a threshold. *
    8. If the test statistics exceeds the threshold, increment the Tong counter. *
    9. Otherwise, decrement the Tong counter. *
    10. If the Tong counter is equal to a given maximum value, declare positive *
    11. acquisition. If the Tong counter is equa to zero, declare negative *
    12. acquisition. Otherwise, process the next block. *
    * * Kaplan book: D.Kaplan, J.Hegarty, "Understanding GPS. Principles * and Applications", Artech House, 2006, pp 223-227 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_PCPS_TONG_ACQUISITION_CC_H_ #define GNSS_SDR_PCPS_TONG_ACQUISITION_CC_H_ #include #include #include #include #include #include "gnss_synchro.h" class pcps_tong_acquisition_cc; typedef boost::shared_ptr pcps_tong_acquisition_cc_sptr; pcps_tong_acquisition_cc_sptr pcps_tong_make_acquisition_cc(unsigned int sampled_ms, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, unsigned int tong_init_val, unsigned int tong_max_val, unsigned int tong_max_dwells, bool dump, std::string dump_filename); /*! * \brief This class implements a Parallel Code Phase Search Acquisition with * Tong algorithm. */ class pcps_tong_acquisition_cc: public gr::block { private: friend pcps_tong_acquisition_cc_sptr pcps_tong_make_acquisition_cc(unsigned int sampled_ms, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, unsigned int tong_init_val, unsigned int tong_max_val, unsigned int tong_max_dwells, bool dump, std::string dump_filename); pcps_tong_acquisition_cc(unsigned int sampled_ms, unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, int samples_per_code, unsigned int tong_init_val, unsigned int tong_max_val, unsigned int tong_max_dwells, bool dump, std::string dump_filename); void calculate_magnitudes(gr_complex* fft_begin, int doppler_shift, int doppler_offset); long d_fs_in; long d_freq; int d_samples_per_ms; int d_samples_per_code; unsigned int d_doppler_resolution; float d_threshold; std::string d_satellite_str; unsigned int d_doppler_max; unsigned int d_doppler_step; unsigned int d_sampled_ms; unsigned int d_dwell_count; unsigned int d_tong_count; unsigned int d_tong_init_val; unsigned int d_tong_max_val; unsigned int d_tong_max_dwells; unsigned int d_fft_size; unsigned long int d_sample_counter; gr_complex** d_grid_doppler_wipeoffs; unsigned int d_num_doppler_bins; gr_complex* d_fft_codes; float** d_grid_data; gr::fft::fft_complex* d_fft_if; gr::fft::fft_complex* d_ifft; Gnss_Synchro *d_gnss_synchro; unsigned int d_code_phase; float d_doppler_freq; float d_mag; float* d_magnitude; float d_input_power; float d_test_statistics; std::ofstream d_dump_file; bool d_active; int d_state; bool d_dump; unsigned int d_channel; std::string d_dump_filename; public: /*! * \brief Default destructor. */ ~pcps_tong_acquisition_cc(); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to exchange synchronization data between acquisition and tracking blocks. * \param p_gnss_synchro Satellite information shared by the processing blocks. */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { d_gnss_synchro = p_gnss_synchro; } /*! * \brief Returns the maximum peak of grid search. */ unsigned int mag() { return d_mag; } /*! * \brief Initializes acquisition algorithm. */ void init(); /*! * \brief Sets local code for TONG acquisition algorithm. * \param code - Pointer to the PRN code. */ void set_local_code(std::complex * code); /*! * \brief Starts acquisition algorithm, turning from standby mode to * active mode * \param active - bool that activates/deactivates the block. */ void set_active(bool active) { d_active = active; } /*! * \brief If set to 1, ensures that acquisition starts at the * first available sample. * \param state - int=1 forces start of acquisition */ void set_state(int state); /*! * \brief Set acquisition channel unique ID * \param channel - receiver channel. */ void set_channel(unsigned int channel) { d_channel = channel; } /*! * \brief Set statistics threshold of TONG algorithm. * \param threshold - Threshold for signal detection (check \ref Navitec2012, * Algorithm 1, for a definition of this threshold). */ void set_threshold(float threshold) { d_threshold = threshold; } /*! * \brief Set maximum Doppler grid search * \param doppler_max - Maximum Doppler shift considered in the grid search [Hz]. */ void set_doppler_max(unsigned int doppler_max) { d_doppler_max = doppler_max; } /*! * \brief Set Doppler steps for the grid search * \param doppler_step - Frequency bin of the search grid [Hz]. */ void set_doppler_step(unsigned int doppler_step) { d_doppler_step = doppler_step; } /*! * \brief Parallel Code Phase Search Acquisition signal processing. */ int general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; #endif /* GNSS_SDR_PCPS_TONG_ACQUISITION_CC_H_ */ gnss-sdr-0.0.9/src/algorithms/channel/000077500000000000000000000000001305042567700176415ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/channel/CMakeLists.txt000066400000000000000000000014171305042567700224040ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # add_subdirectory(adapters) add_subdirectory(libs)gnss-sdr-0.0.9/src/algorithms/channel/adapters/000077500000000000000000000000001305042567700214445ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/channel/adapters/CMakeLists.txt000066400000000000000000000026641305042567700242140ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # set(CHANNEL_ADAPTER_SOURCES channel.cc) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/interfaces ${CMAKE_SOURCE_DIR}/src/core/receiver ${CMAKE_SOURCE_DIR}/src/algorithms/channel/libs ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ) file(GLOB CHANNEL_ADAPTER_HEADERS "*.h") list(SORT CHANNEL_ADAPTER_HEADERS) add_library(channel_adapters ${CHANNEL_ADAPTER_SOURCES} ${CHANNEL_ADAPTER_HEADERS}) source_group(Headers FILES ${CHANNEL_ADAPTER_HEADERS}) target_link_libraries(channel_adapters channel_fsm ${GNURADIO_RUNTIME_LIBRARIES} ${Boost_LIBRARIES}) gnss-sdr-0.0.9/src/algorithms/channel/adapters/channel.cc000066400000000000000000000150061305042567700233650ustar00rootroot00000000000000/*! * \file channel.cc * \brief Implementation of a GNSS_Channel with a Finite State Machine * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Luis Esteve, 2011. luis(at)epsilon-formacion.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "channel.h" //#include #include #include //#include "channel_interface.h" //#include "acquisition_interface.h" //#include "tracking_interface.h" //#include "telemetry_decoder_interface.h" #include "configuration_interface.h" //#include "channel_msg_receiver_cc.h" using google::LogMessage; // Constructor Channel::Channel(ConfigurationInterface *configuration, unsigned int channel, std::shared_ptr pass_through, std::shared_ptr acq, std::shared_ptr trk, std::shared_ptr nav, std::string role, std::string implementation, boost::shared_ptr queue) { pass_through_ = pass_through; acq_ = acq; trk_ = trk; nav_ = nav; role_ = role; implementation_ = implementation; channel_ = channel; queue_ = queue; acq_->set_channel(channel_); trk_->set_channel(channel_); nav_->set_channel(channel_); gnss_synchro_.Channel_ID = channel_; acq_->set_gnss_synchro(&gnss_synchro_); trk_->set_gnss_synchro(&gnss_synchro_); // IMPORTANT: Do not change the order between set_doppler_step and set_threshold unsigned int doppler_step = configuration->property("Acquisition_" + implementation_ + boost::lexical_cast(channel_) + ".doppler_step" ,0); if(doppler_step == 0) doppler_step = configuration->property("Acquisition_" + implementation_+".doppler_step", 500); DLOG(INFO) << "Channel "<< channel_ << " Doppler_step = " << doppler_step; acq_->set_doppler_step(doppler_step); float threshold = configuration->property("Acquisition_" + implementation_ + boost::lexical_cast(channel_) + ".threshold", 0.0); if(threshold == 0.0) threshold = configuration->property("Acquisition_" + implementation_ + ".threshold", 0.0); acq_->set_threshold(threshold); acq_->init(); repeat_ = configuration->property("Acquisition_" + implementation_ + boost::lexical_cast(channel_) + ".repeat_satellite", false); DLOG(INFO) << "Channel " << channel_ << " satellite repeat = " << repeat_; channel_fsm_.set_acquisition(acq_); channel_fsm_.set_tracking(trk_); channel_fsm_.set_channel(channel_); channel_fsm_.set_queue(queue_); connected_ = false; gnss_signal_ = Gnss_Signal(implementation_); channel_msg_rx = channel_msg_receiver_make_cc(&channel_fsm_, repeat_); } // Destructor Channel::~Channel() { channel_fsm_.terminate(); } void Channel::connect(gr::top_block_sptr top_block) { if (connected_) { LOG(WARNING) << "channel already connected internally"; return; } pass_through_->connect(top_block); acq_->connect(top_block); trk_->connect(top_block); nav_->connect(top_block); //Synchronous ports top_block->connect(pass_through_->get_right_block(), 0, acq_->get_left_block(), 0); DLOG(INFO) << "pass_through_ -> acquisition"; top_block->connect(pass_through_->get_right_block(), 0, trk_->get_left_block(), 0); DLOG(INFO) << "pass_through_ -> tracking"; top_block->connect(trk_->get_right_block(), 0, nav_->get_left_block(), 0); DLOG(INFO) << "tracking -> telemetry_decoder"; // Message ports top_block->msg_connect(nav_->get_left_block(), pmt::mp("preamble_timestamp_s"), trk_->get_right_block(), pmt::mp("preamble_timestamp_s")); DLOG(INFO) << "MSG FEEDBACK CHANNEL telemetry_decoder -> tracking"; //std::cout<<"has port: "<get_right_block()->has_msg_port(pmt::mp("events"))<msg_connect(acq_->get_right_block(), pmt::mp("events"), channel_msg_rx, pmt::mp("events")); top_block->msg_connect(trk_->get_right_block(), pmt::mp("events"), channel_msg_rx, pmt::mp("events")); connected_ = true; } void Channel::disconnect(gr::top_block_sptr top_block) { if (!connected_) { LOG(WARNING) << "Channel already disconnected internally"; return; } top_block->disconnect(pass_through_->get_right_block(), 0, acq_->get_left_block(), 0); top_block->disconnect(pass_through_->get_right_block(), 0, trk_->get_left_block(), 0); top_block->disconnect(trk_->get_right_block(), 0, nav_->get_left_block(), 0); pass_through_->disconnect(top_block); acq_->disconnect(top_block); trk_->disconnect(top_block); nav_->disconnect(top_block); connected_ = false; } gr::basic_block_sptr Channel::get_left_block() { return pass_through_->get_left_block(); } gr::basic_block_sptr Channel::get_right_block() { return nav_->get_right_block(); } void Channel::set_signal(const Gnss_Signal& gnss_signal) { gnss_signal_ = gnss_signal; std::string str_aux = gnss_signal_.get_signal_str(); const char * str = str_aux.c_str(); // get a C style null terminated string std::memcpy((void*)gnss_synchro_.Signal, str, 3); // copy string into synchro char array: 2 char + null gnss_synchro_.Signal[2] = 0; // make sure that string length is only two characters gnss_synchro_.PRN = gnss_signal_.get_satellite().get_PRN(); gnss_synchro_.System = gnss_signal_.get_satellite().get_system_short().c_str()[0]; acq_->set_local_code(); nav_->set_satellite(gnss_signal_.get_satellite()); } void Channel::start_acquisition() { channel_fsm_.Event_start_acquisition(); } gnss-sdr-0.0.9/src/algorithms/channel/adapters/channel.h000066400000000000000000000073361305042567700232360ustar00rootroot00000000000000/*! * \file channel.h * \brief Interface of a GNSS channel. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Luis Esteve, 2011. luis(at)epsilon-formacion.com * * It holds blocks for acquisition, tracking, * navigation data extraction and pseudorange calculation. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_CHANNEL_H_ #define GNSS_SDR_CHANNEL_H_ #include #include #include #include #include "channel_interface.h" #include "channel_fsm.h" #include "gnss_synchro.h" #include "channel_msg_receiver_cc.h" class ConfigurationInterface; class AcquisitionInterface; class TrackingInterface; class TelemetryDecoderInterface; /*! * \brief This class represents a GNSS channel. It wraps an AcquisitionInterface, * a Tracking Interface and a TelemetryDecoderInterface, and handles * their interaction through a Finite State Machine * */ class Channel: public ChannelInterface { public: //! Constructor Channel(ConfigurationInterface *configuration, unsigned int channel, std::shared_ptr pass_through, std::shared_ptr acq, std::shared_ptr trk, std::shared_ptr nav, std::string role, std::string implementation, boost::shared_ptr queue); //! Virtual destructor virtual ~Channel(); void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); std::string role(){ return role_; } //! Returns "Channel" std::string implementation(){ return implementation_; } size_t item_size(){ return 0; } Gnss_Signal get_signal() const { return gnss_signal_; } std::shared_ptr acquisition(){ return acq_; } std::shared_ptr tracking(){ return trk_; } std::shared_ptr telemetry(){ return nav_; } void start_acquisition(); //!< Start the State Machine void set_signal(const Gnss_Signal& gnss_signal_); //!< Sets the channel GNSS signal void msg_handler_events(pmt::pmt_t msg); private: channel_msg_receiver_cc_sptr channel_msg_rx; std::shared_ptr pass_through_; std::shared_ptr acq_; std::shared_ptr trk_; std::shared_ptr nav_; std::string role_; std::string implementation_; unsigned int channel_; Gnss_Synchro gnss_synchro_; Gnss_Signal gnss_signal_; bool connected_; bool repeat_; ChannelFsm channel_fsm_; boost::shared_ptr queue_; }; #endif /*GNSS_SDR_CHANNEL_H_*/ gnss-sdr-0.0.9/src/algorithms/channel/libs/000077500000000000000000000000001305042567700205725ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/channel/libs/CMakeLists.txt000066400000000000000000000027041305042567700233350ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # set(CHANNEL_FSM_SOURCES channel_fsm.cc channel_msg_receiver_cc.cc ) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/interfaces ${CMAKE_SOURCE_DIR}/src/core/receiver ${CMAKE_SOURCE_DIR}/src/algorithms/channel/adapters ${Boost_INCLUDE_DIRS} ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ) file(GLOB CHANNEL_FSM_HEADERS "*.h") list(SORT CHANNEL_FSM_HEADERS) add_library(channel_fsm ${CHANNEL_FSM_SOURCES} ${CHANNEL_FSM_HEADERS}) source_group(Headers FILES ${CHANNEL_FSM_HEADERS}) add_dependencies(channel_fsm glog-${glog_RELEASE}) target_link_libraries(channel_fsm gnss_rx) gnss-sdr-0.0.9/src/algorithms/channel/libs/channel_fsm.cc000066400000000000000000000146051305042567700233640ustar00rootroot00000000000000/*! * \file channel_fsm.cc * \brief Implementation of a State Machine for channel using boost::statechart * \author Luis Esteve, 2011. luis(at)epsilon-formacion.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "channel_fsm.h" #include #include #include #include #include #include #include #include "control_message_factory.h" struct Ev_channel_start_acquisition: sc::event {}; struct Ev_channel_valid_acquisition: sc::event {}; struct Ev_channel_failed_acquisition_repeat: sc::event {}; struct Ev_channel_failed_acquisition_no_repeat: sc::event {}; struct Ev_channel_failed_tracking_standby: sc::event {}; //struct Ev_channel_failed_tracking_reacq: sc::event //{}; struct channel_idle_fsm_S0: public sc::state { public: // sc::transition(event, next state) typedef sc::transition reactions; channel_idle_fsm_S0(my_context ctx) : my_base(ctx) { //std::cout << "Enter Channel_Idle_S0 " << std::endl; } }; struct channel_acquiring_fsm_S1: public sc::state { public: typedef mpl::list, sc::transition, sc::transition > reactions; channel_acquiring_fsm_S1(my_context ctx) : my_base(ctx) { //std::cout << "Enter Channel_Acq_S1 " << std::endl; context ().start_acquisition(); } ~channel_acquiring_fsm_S1() { //std::cout << "Exit Channel_Acq_S1 " << std::endl; } }; struct channel_tracking_fsm_S2: public sc::state { public: typedef mpl::list, sc::transition> reactions; channel_tracking_fsm_S2(my_context ctx) : my_base(ctx) { //std::cout << "Enter Channel_tracking_S2 " << std::endl; context ().start_tracking(); } ~channel_tracking_fsm_S2() { //std::cout << "Exit Channel_tracking_S2 " << std::endl; context ().notify_stop_tracking(); } }; struct channel_waiting_fsm_S3: public sc::state { public: typedef sc::transition reactions; channel_waiting_fsm_S3(my_context ctx) : my_base(ctx) { //std::cout << "Enter Channel_waiting_S3 " << std::endl; context ().request_satellite(); } // ~channel_waiting_fsm_S3(){} }; ChannelFsm::ChannelFsm() { acq_ = nullptr; trk_ = nullptr; channel_ = 0; initiate(); //start the FSM } ChannelFsm::ChannelFsm(std::shared_ptr acquisition) : acq_(acquisition) { trk_ = nullptr; channel_ = 0; initiate(); //start the FSM } void ChannelFsm::Event_start_acquisition() { this->process_event(Ev_channel_start_acquisition()); //std::cout<<"Ev_channel_start_acquisition launched"<process_event(Ev_channel_valid_acquisition()); } void ChannelFsm::Event_failed_acquisition_repeat() { this->process_event(Ev_channel_failed_acquisition_repeat()); } void ChannelFsm::Event_failed_acquisition_no_repeat() { this->process_event(Ev_channel_failed_acquisition_no_repeat()); } // Something is wrong here, we are using a memory after it ts freed void ChannelFsm::Event_failed_tracking_standby() { this->process_event(Ev_channel_failed_tracking_standby()); } //void ChannelFsm::Event_failed_tracking_reacq() { // this->process_event(Ev_channel_failed_tracking_reacq()); //} void ChannelFsm::set_acquisition(std::shared_ptr acquisition) { acq_ = acquisition; } void ChannelFsm::set_tracking(std::shared_ptr tracking) { trk_ = tracking; } void ChannelFsm::set_queue(boost::shared_ptr queue) { queue_ = queue; } void ChannelFsm::set_channel(unsigned int channel) { channel_ = channel; } void ChannelFsm::start_acquisition() { acq_->reset(); } void ChannelFsm::start_tracking() { trk_->start_tracking(); std::unique_ptr cmf(new ControlMessageFactory()); if (queue_ != gr::msg_queue::make()) { queue_->handle(cmf->GetQueueMessage(channel_, 1)); } } void ChannelFsm::request_satellite() { std::unique_ptr cmf(new ControlMessageFactory()); if (queue_ != gr::msg_queue::make()) { queue_->handle(cmf->GetQueueMessage(channel_, 0)); } } void ChannelFsm::notify_stop_tracking() { std::unique_ptr cmf(new ControlMessageFactory()); if (queue_ != gr::msg_queue::make()) { queue_->handle(cmf->GetQueueMessage(channel_, 2)); } } gnss-sdr-0.0.9/src/algorithms/channel/libs/channel_fsm.h000066400000000000000000000052531305042567700232250ustar00rootroot00000000000000/*! * \file channel_fsm.h * \brief Interface of the State Machine for channel using boost::statechart * \author Luis Esteve, 2011. luis(at)epsilon-formacion.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_CHANNEL_FSM_H #define GNSS_SDR_CHANNEL_FSM_H #include #include #include "acquisition_interface.h" #include "tracking_interface.h" #include "telemetry_decoder_interface.h" namespace sc = boost::statechart; namespace mpl = boost::mpl; struct channel_idle_fsm_S0; struct channel_acquiring_fsm_S1; struct channel_tracking_fsm_S2; struct channel_waiting_fsm_S3; /*! * \brief This class implements a State Machine for channel using boost::statechart */ class ChannelFsm: public sc::state_machine { public: ChannelFsm(); ChannelFsm(std::shared_ptr acquisition); void set_acquisition(std::shared_ptr acquisition); void set_tracking(std::shared_ptr tracking); void set_queue(boost::shared_ptr queue); void set_channel(unsigned int channel); void start_acquisition(); void start_tracking(); void request_satellite(); void notify_stop_tracking(); //FSM EVENTS void Event_start_acquisition(); void Event_valid_acquisition(); void Event_failed_acquisition_repeat(); void Event_failed_acquisition_no_repeat(); //void Event_gps_failed_tracking_reacq(); void Event_failed_tracking_standby(); private: std::shared_ptr acq_; std::shared_ptr trk_; boost::shared_ptr queue_; unsigned int channel_; }; #endif /*GNSS_SDR_CHANNEL_FSM_H*/ gnss-sdr-0.0.9/src/algorithms/channel/libs/channel_msg_receiver_cc.cc000066400000000000000000000065241305042567700257170ustar00rootroot00000000000000/*! * \file channel_msg_receiver_cc.cc * \brief GNU Radio block that receives asynchronous channel messages from acquisition and tracking blocks * \author Javier Arribas, 2016. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2016 (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 . * * ------------------------------------------------------------------------- */ #include "channel_msg_receiver_cc.h" #include #include #include using google::LogMessage; channel_msg_receiver_cc_sptr channel_msg_receiver_make_cc(ChannelFsm* channel_fsm, bool repeat) { return channel_msg_receiver_cc_sptr(new channel_msg_receiver_cc(channel_fsm, repeat)); } void channel_msg_receiver_cc::msg_handler_events(pmt::pmt_t msg) { try { long int message = pmt::to_long(msg); switch (message) { case 1: //positive acquisition //DLOG(INFO) << "Channel " << channel_ << " ACQ SUCCESS satellite " << // gnss_synchro_.System << " " << gnss_synchro_.PRN; d_channel_fsm->Event_valid_acquisition(); break; case 2: //negative acquisition //DLOG(INFO) << "Channel " << channel_ // << " ACQ FAILED satellite " << gnss_synchro_.System << " " << gnss_synchro_.PRN; if (d_repeat == true) { d_channel_fsm->Event_failed_acquisition_repeat(); } else { d_channel_fsm->Event_failed_acquisition_no_repeat(); } break; case 3: // tracking loss of lock event d_channel_fsm->Event_failed_tracking_standby(); break; default: LOG(WARNING) << "Default case, invalid message."; break; } } catch(boost::bad_any_cast& e) { LOG(WARNING) << "msg_handler_telemetry Bad any cast!"; } } channel_msg_receiver_cc::channel_msg_receiver_cc(ChannelFsm* channel_fsm, bool repeat) : gr::block("channel_msg_receiver_cc", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)) { this->message_port_register_in(pmt::mp("events")); this->set_msg_handler(pmt::mp("events"), boost::bind(&channel_msg_receiver_cc::msg_handler_events, this, _1)); d_channel_fsm = channel_fsm; d_repeat = repeat; } channel_msg_receiver_cc::~channel_msg_receiver_cc() {} gnss-sdr-0.0.9/src/algorithms/channel/libs/channel_msg_receiver_cc.h000066400000000000000000000041201305042567700255470ustar00rootroot00000000000000/*! * \file channel_msg_receiver_cc.h * \brief GNU Radio block that receives asynchronous channel messages from acquisition and tracking blocks * \author Javier Arribas, 2016. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2016 (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_CHANNEL_MSG_RECEIVER_CC_H #define GNSS_SDR_CHANNEL_MSG_RECEIVER_CC_H #include #include "channel_fsm.h" class channel_msg_receiver_cc; typedef boost::shared_ptr channel_msg_receiver_cc_sptr; channel_msg_receiver_cc_sptr channel_msg_receiver_make_cc(ChannelFsm* channel_fsm, bool repeat); /*! * \brief GNU Radio block that receives asynchronous channel messages from acquisition and tracking blocks */ class channel_msg_receiver_cc : public gr::block { private: ChannelFsm* d_channel_fsm; bool d_repeat; // todo: change FSM to include repeat value friend channel_msg_receiver_cc_sptr channel_msg_receiver_make_cc(ChannelFsm* channel_fsm, bool repeat); void msg_handler_events(pmt::pmt_t msg); channel_msg_receiver_cc(ChannelFsm* channel_fsm, bool repeat); public: ~channel_msg_receiver_cc (); //!< Default destructor }; #endif gnss-sdr-0.0.9/src/algorithms/conditioner/000077500000000000000000000000001305042567700205465ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/conditioner/CMakeLists.txt000066400000000000000000000014331305042567700233070ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # add_subdirectory(adapters) #add_subdirectory(gnuradio_blocks)gnss-sdr-0.0.9/src/algorithms/conditioner/adapters/000077500000000000000000000000001305042567700223515ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/conditioner/adapters/CMakeLists.txt000066400000000000000000000027111305042567700251120ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # set(COND_ADAPTER_SOURCES signal_conditioner.cc array_signal_conditioner.cc ) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/interfaces ${CMAKE_SOURCE_DIR}/src/core/receiver ${CMAKE_SOURCE_DIR}/src/algorithms/acquisition/gnuradio_blocks ${CMAKE_SOURCE_DIR}/src/algorithms/libs ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ) file(GLOB COND_ADAPTER_HEADERS "*.h") list(SORT COND_ADAPTER_HEADERS) add_library(conditioner_adapters ${COND_ADAPTER_SOURCES} ${COND_ADAPTER_HEADERS}) source_group(Headers FILES ${COND_ADAPTER_HEADERS}) add_dependencies(conditioner_adapters glog-${glog_RELEASE})gnss-sdr-0.0.9/src/algorithms/conditioner/adapters/array_signal_conditioner.cc000066400000000000000000000067131305042567700277370ustar00rootroot00000000000000/*! * \file array_signal_conditioner.cc * \brief It wraps blocks to change data type, filter and resample input data, adapted to array receiver * \author Javier Arribas jarribas (at) cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "array_signal_conditioner.h" #include using google::LogMessage; // Constructor ArraySignalConditioner::ArraySignalConditioner(ConfigurationInterface *configuration, std::shared_ptr data_type_adapt, std::shared_ptr in_filt, std::shared_ptr res, std::string role, std::string implementation) : data_type_adapt_(data_type_adapt), in_filt_(in_filt), res_(res), role_(role), implementation_(implementation) { connected_ = false; if(configuration){ }; } // Destructor ArraySignalConditioner::~ArraySignalConditioner() {} void ArraySignalConditioner::connect(gr::top_block_sptr top_block) { // note: the array signal conditioner do not have data type adapter, and must use the array input filter (multichannel) if (connected_) { LOG(WARNING) << "Array Signal conditioner already connected internally"; return; } //data_type_adapt_->connect(top_block); in_filt_->connect(top_block); res_->connect(top_block); //top_block->connect(data_type_adapt_->get_right_block(), 0, in_filt_->get_left_block(), 0); //DLOG(INFO) << "data_type_adapter -> input_filter"; top_block->connect(in_filt_->get_right_block(), 0, res_->get_left_block(), 0); DLOG(INFO) << "Array input_filter -> resampler"; connected_ = true; } void ArraySignalConditioner::disconnect(gr::top_block_sptr top_block) { if (!connected_) { LOG(WARNING) << "Array Signal conditioner already disconnected internally"; return; } //top_block->disconnect(data_type_adapt_->get_right_block(), 0, // in_filt_->get_left_block(), 0); top_block->disconnect(in_filt_->get_right_block(), 0, res_->get_left_block(), 0); //data_type_adapt_->disconnect(top_block); in_filt_->disconnect(top_block); res_->disconnect(top_block); connected_ = false; } gr::basic_block_sptr ArraySignalConditioner::get_left_block() { //return data_type_adapt_->get_left_block(); return in_filt_->get_left_block(); } gr::basic_block_sptr ArraySignalConditioner::get_right_block() { return res_->get_right_block(); } gnss-sdr-0.0.9/src/algorithms/conditioner/adapters/array_signal_conditioner.h000066400000000000000000000056561305042567700276060ustar00rootroot00000000000000/*! * \file array_signal_conditioner.h * \brief It wraps blocks to change data type, filter and resample input data, adapted to array receiver * \author Javier Arribas jarribas (at) cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_ARRAY_SIGNAL_CONDITIONER_H_ #define GNSS_SDR_ARRAY_SIGNAL_CONDITIONER_H_ #include #include #include "gnss_block_interface.h" class ConfigurationInterface; class AcquisitionInterface; class TrackingInterface; class TelemetryDecoderInterface; /*! * \brief This class wraps blocks to change data_type_adapter, input_filter and resampler * to be applied to the input flow of sampled signal. */ class ArraySignalConditioner: public GNSSBlockInterface { public: //! Constructor ArraySignalConditioner(ConfigurationInterface *configuration, std::shared_ptr data_type_adapt, std::shared_ptr in_filt, std::shared_ptr res, std::string role, std::string implementation); //! Virtual destructor virtual ~ArraySignalConditioner(); void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); std::string role(){ return role_; } //! Returns "Signal_Conditioner" std::string implementation(){ return "Array_Signal_Conditioner"; } size_t item_size(){ return 0; } std::shared_ptr data_type_adapter(){ return data_type_adapt_; } std::shared_ptr input_filter(){ return in_filt_; } std::shared_ptr resampler(){ return res_; } private: std::shared_ptr data_type_adapt_; std::shared_ptr in_filt_; std::shared_ptr res_; std::string role_; std::string implementation_; bool connected_; //bool stop_; }; #endif /*GNSS_SDR_SIGNAL_CONDITIONER_H_*/ gnss-sdr-0.0.9/src/algorithms/conditioner/adapters/signal_conditioner.cc000066400000000000000000000062521305042567700265370ustar00rootroot00000000000000/*! * \file signal_conditioner.cc * \brief It holds blocks to change data type, filter and resample input data. * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "signal_conditioner.h" #include using google::LogMessage; // Constructor SignalConditioner::SignalConditioner(ConfigurationInterface *configuration, std::shared_ptr data_type_adapt, std::shared_ptr in_filt, std::shared_ptr res, std::string role, std::string implementation) : data_type_adapt_(data_type_adapt), in_filt_(in_filt), res_(res), role_(role), implementation_(implementation) { connected_ = false; if(configuration){ }; } // Destructor SignalConditioner::~SignalConditioner() {} void SignalConditioner::connect(gr::top_block_sptr top_block) { if (connected_) { LOG(WARNING) << "Signal conditioner already connected internally"; return; } data_type_adapt_->connect(top_block); in_filt_->connect(top_block); res_->connect(top_block); top_block->connect(data_type_adapt_->get_right_block(), 0, in_filt_->get_left_block(), 0); DLOG(INFO) << "data_type_adapter -> input_filter"; top_block->connect(in_filt_->get_right_block(), 0, res_->get_left_block(), 0); DLOG(INFO) << "input_filter -> resampler"; connected_ = true; } void SignalConditioner::disconnect(gr::top_block_sptr top_block) { if (!connected_) { LOG(WARNING) << "Signal conditioner already disconnected internally"; return; } top_block->disconnect(data_type_adapt_->get_right_block(), 0, in_filt_->get_left_block(), 0); top_block->disconnect(in_filt_->get_right_block(), 0, res_->get_left_block(), 0); data_type_adapt_->disconnect(top_block); in_filt_->disconnect(top_block); res_->disconnect(top_block); connected_ = false; } gr::basic_block_sptr SignalConditioner::get_left_block() { return data_type_adapt_->get_left_block(); } gr::basic_block_sptr SignalConditioner::get_right_block() { return res_->get_right_block(); } gnss-sdr-0.0.9/src/algorithms/conditioner/adapters/signal_conditioner.h000066400000000000000000000055301305042567700263770ustar00rootroot00000000000000/*! * \file signal_conditioner.h * \brief It wraps blocks to change data type, filter and resample input data. * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_SIGNAL_CONDITIONER_H_ #define GNSS_SDR_SIGNAL_CONDITIONER_H_ #include #include "gnss_block_interface.h" class ConfigurationInterface; class AcquisitionInterface; class TrackingInterface; class TelemetryDecoderInterface; /*! * \brief This class wraps blocks to change data_type_adapter, input_filter and resampler * to be applied to the input flow of sampled signal. */ class SignalConditioner: public GNSSBlockInterface { public: //! Constructor SignalConditioner(ConfigurationInterface *configuration, std::shared_ptr data_type_adapt, std::shared_ptr in_filt, std::shared_ptr res, std::string role, std::string implementation); //! Virtual destructor virtual ~SignalConditioner(); void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); std::string role(){ return role_; } //! Returns "Signal_Conditioner" std::string implementation(){ return "Signal_Conditioner"; } size_t item_size(){ return 0; } std::shared_ptr data_type_adapter(){ return data_type_adapt_; } std::shared_ptr input_filter(){ return in_filt_; } std::shared_ptr resampler(){ return res_; } private: std::shared_ptr data_type_adapt_; std::shared_ptr in_filt_; std::shared_ptr res_; std::string role_; std::string implementation_; bool connected_; //bool stop_; }; #endif /*GNSS_SDR_SIGNAL_CONDITIONER_H_*/ gnss-sdr-0.0.9/src/algorithms/data_type_adapter/000077500000000000000000000000001305042567700217035ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/data_type_adapter/CMakeLists.txt000066400000000000000000000014361305042567700244470ustar00rootroot00000000000000# # Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # add_subdirectory(adapters) add_subdirectory(gnuradio_blocks) gnss-sdr-0.0.9/src/algorithms/data_type_adapter/adapters/000077500000000000000000000000001305042567700235065ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/data_type_adapter/adapters/CMakeLists.txt000066400000000000000000000031641305042567700262520ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # set(DATATYPE_ADAPTER_SOURCES byte_to_short.cc ibyte_to_cbyte.cc ibyte_to_complex.cc ibyte_to_cshort.cc ishort_to_cshort.cc ishort_to_complex.cc ) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/interfaces ${CMAKE_SOURCE_DIR}/src/algorithms/data_type_adapter/gnuradio_blocks ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ${VOLK_INCLUDE_DIRS} ) file(GLOB DATATYPE_ADAPTER_HEADERS "*.h") list(SORT DATATYPE_ADAPTER_HEADERS) add_library(datatype_adapters ${DATATYPE_ADAPTER_SOURCES} ${DATATYPE_ADAPTER_HEADERS}) source_group(Headers FILES ${DATATYPE_ADAPTER_HEADERS}) add_dependencies(datatype_adapters glog-${glog_RELEASE}) target_link_libraries(datatype_adapters data_type_gr_blocks ${GNURADIO_RUNTIME_LIBRARIES} ${GNURADIO_BLOCKS_LIBRARIES}) gnss-sdr-0.0.9/src/algorithms/data_type_adapter/adapters/byte_to_short.cc000066400000000000000000000057141305042567700267100ustar00rootroot00000000000000/*! * \file byte_to_short.cc * \brief Adapts an 8-bits sample stream (IF) to a short int stream (IF) * \author Carles Fernandez Prades, cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "byte_to_short.h" #include #include "configuration_interface.h" using google::LogMessage; ByteToShort::ByteToShort(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : config_(configuration), role_(role), in_streams_(in_streams), out_streams_(out_streams) { std::string default_input_item_type = "byte"; std::string default_output_item_type = "short"; std::string default_dump_filename = "../data/input_filter.dat"; DLOG(INFO) << "role " << role_; input_item_type_ = config_->property(role_ + ".input_item_type", default_input_item_type); dump_ = config_->property(role_ + ".dump", false); dump_filename_ = config_->property(role_ + ".dump_filename", default_dump_filename); size_t item_size = sizeof(short); gr_char_to_short_ = gr::blocks::char_to_short::make(); DLOG(INFO) << "data_type_adapter_(" << gr_char_to_short_->unique_id() << ")"; if (dump_) { DLOG(INFO) << "Dumping output into file " << dump_filename_; file_sink_ = gr::blocks::file_sink::make(item_size, dump_filename_.c_str()); } } ByteToShort::~ByteToShort() {} void ByteToShort::connect(gr::top_block_sptr top_block) { if (dump_) { top_block->connect(gr_char_to_short_, 0, file_sink_, 0); } else { DLOG(INFO) << "Nothing to connect internally"; } } void ByteToShort::disconnect(gr::top_block_sptr top_block) { if (dump_) { top_block->disconnect(gr_char_to_short_, 0, file_sink_, 0); } } gr::basic_block_sptr ByteToShort::get_left_block() { return gr_char_to_short_; } gr::basic_block_sptr ByteToShort::get_right_block() { return gr_char_to_short_; } gnss-sdr-0.0.9/src/algorithms/data_type_adapter/adapters/byte_to_short.h000066400000000000000000000046701305042567700265520ustar00rootroot00000000000000/*! * \file byte_to_short.h * \brief Adapts an 8-bits sample stream (IF) to a short int stream (IF) * \author Carles Fernandez Prades, cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_BYTE_TO_SHORT_H_ #define GNSS_SDR_BYTE_TO_SHORT_H_ #include #include #include #include "gnss_block_interface.h" class ConfigurationInterface; /*! * \brief Adapts an 8-bits sample stream (IF) to a short int stream (IF) * */ class ByteToShort: public GNSSBlockInterface { public: ByteToShort(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~ByteToShort(); std::string role() { return role_; } //! Returns "Byte_To_Short" std::string implementation() { return "Byte_To_Short"; } size_t item_size() { return 0; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); private: gr::blocks::char_to_short::sptr gr_char_to_short_; ConfigurationInterface* config_; bool dump_; std::string dump_filename_; std::string input_item_type_; std::string output_item_type_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; gr::blocks::file_sink::sptr file_sink_; }; #endif gnss-sdr-0.0.9/src/algorithms/data_type_adapter/adapters/ibyte_to_cbyte.cc000066400000000000000000000057001305042567700270230ustar00rootroot00000000000000/*! * \file ibyte_to_cbyte.cc * \brief Adapts an I/Q interleaved byte (unsigned char) sample stream * into a std::complex stream * \author Carles Fernandez Prades, cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "ibyte_to_cbyte.h" #include #include #include "configuration_interface.h" using google::LogMessage; IbyteToCbyte::IbyteToCbyte(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : config_(configuration), role_(role), in_streams_(in_streams), out_streams_(out_streams) { std::string default_input_item_type = "byte"; std::string default_output_item_type = "lv_8sc_t"; std::string default_dump_filename = "../data/input_filter.dat"; DLOG(INFO) << "role " << role_; input_item_type_ = config_->property(role_ + ".input_item_type", default_input_item_type); dump_ = config_->property(role_ + ".dump", false); dump_filename_ = config_->property(role_ + ".dump_filename", default_dump_filename); size_t item_size = sizeof(lv_8sc_t); ibyte_to_cbyte_ = make_interleaved_byte_to_complex_byte(); DLOG(INFO) << "data_type_adapter_(" << ibyte_to_cbyte_->unique_id() << ")"; if (dump_) { DLOG(INFO) << "Dumping output into file " << dump_filename_; file_sink_ = gr::blocks::file_sink::make(item_size, dump_filename_.c_str()); } } IbyteToCbyte::~IbyteToCbyte() {} void IbyteToCbyte::connect(gr::top_block_sptr top_block) { if (dump_) { top_block->connect(ibyte_to_cbyte_, 0, file_sink_, 0); } } void IbyteToCbyte::disconnect(gr::top_block_sptr top_block) { if (dump_) { top_block->disconnect(ibyte_to_cbyte_, 0, file_sink_, 0); } } gr::basic_block_sptr IbyteToCbyte::get_left_block() { return ibyte_to_cbyte_; } gr::basic_block_sptr IbyteToCbyte::get_right_block() { return ibyte_to_cbyte_; } gnss-sdr-0.0.9/src/algorithms/data_type_adapter/adapters/ibyte_to_cbyte.h000066400000000000000000000050401305042567700266620ustar00rootroot00000000000000/*! * \file ibyte_to_cbyte.h * \brief \brief Adapts an I/Q interleaved byte (unsigned char) sample stream * into a std::complex stream * \author Carles Fernandez Prades, cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_IBYTE_TO_CBYTE_H_ #define GNSS_SDR_IBYTE_TO_CBYTE_H_ #include #include #include "gnss_block_interface.h" #include "interleaved_byte_to_complex_byte.h" class ConfigurationInterface; /*! * \briefAdapts an I/Q interleaved byte (unsigned char) sample stream * into a std::complex stream */ class IbyteToCbyte : public GNSSBlockInterface { public: IbyteToCbyte(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~IbyteToCbyte(); std::string role() { return role_; } //! Returns "Ibyte_To_Cbyte" std::string implementation() { return "Ibyte_To_Cbyte"; } size_t item_size() { return 0; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); private: interleaved_byte_to_complex_byte_sptr ibyte_to_cbyte_; ConfigurationInterface* config_; bool dump_; std::string dump_filename_; std::string input_item_type_; std::string output_item_type_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; gr::blocks::file_sink::sptr file_sink_; }; #endif gnss-sdr-0.0.9/src/algorithms/data_type_adapter/adapters/ibyte_to_complex.cc000066400000000000000000000060111305042567700273600ustar00rootroot00000000000000/*! * \file ibyte_to_complex.cc * \brief Adapts an I/Q interleaved byte integer sample stream to a gr_complex (float) stream * \author Javier Arribas, jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "ibyte_to_complex.h" #include #include "configuration_interface.h" using google::LogMessage; IbyteToComplex::IbyteToComplex(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : config_(configuration), role_(role), in_streams_(in_streams), out_streams_(out_streams) { std::string default_input_item_type = "byte"; std::string default_output_item_type = "gr_complex"; std::string default_dump_filename = "../data/input_filter.dat"; DLOG(INFO) << "role " << role_; input_item_type_ = config_->property(role_ + ".input_item_type", default_input_item_type); dump_ = config_->property(role_ + ".dump", false); dump_filename_ = config_->property(role_ + ".dump_filename", default_dump_filename); size_t item_size = sizeof(gr_complex); gr_interleaved_char_to_complex_ = gr::blocks::interleaved_char_to_complex::make(); DLOG(INFO) << "data_type_adapter_(" << gr_interleaved_char_to_complex_->unique_id() << ")"; if (dump_) { DLOG(INFO) << "Dumping output into file " << dump_filename_; file_sink_ = gr::blocks::file_sink::make(item_size, dump_filename_.c_str()); } } IbyteToComplex::~IbyteToComplex() {} void IbyteToComplex::connect(gr::top_block_sptr top_block) { if (dump_) { top_block->connect(gr_interleaved_char_to_complex_, 0, file_sink_, 0); } } void IbyteToComplex::disconnect(gr::top_block_sptr top_block) { if (dump_) { top_block->disconnect(gr_interleaved_char_to_complex_, 0, file_sink_, 0); } } gr::basic_block_sptr IbyteToComplex::get_left_block() { return gr_interleaved_char_to_complex_; } gr::basic_block_sptr IbyteToComplex::get_right_block() { return gr_interleaved_char_to_complex_; } gnss-sdr-0.0.9/src/algorithms/data_type_adapter/adapters/ibyte_to_complex.h000066400000000000000000000050641305042567700272310ustar00rootroot00000000000000/*! * \file ibyte_to_complex.h * \brief Adapts an I/Q interleaved byte integer sample stream to a gr_complex (float) stream * \author Javier Arribas, jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_IBYTE_TO_COMPLEX_H_ #define GNSS_SDR_IBYTE_TO_COMPLEX_H_ #include #include #include #include "gnss_synchro.h" #include "gnss_block_interface.h" class ConfigurationInterface; /*! * \brief Adapts an I/Q interleaved byte integer sample stream to a gr_complex (float) stream * */ class IbyteToComplex: public GNSSBlockInterface { public: IbyteToComplex(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~IbyteToComplex(); std::string role() { return role_; } //! Returns "Ibyte_To_Complex" std::string implementation() { return "Ibyte_To_Complex"; } size_t item_size() { return 0; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); private: gr::blocks::interleaved_char_to_complex::sptr gr_interleaved_char_to_complex_; ConfigurationInterface* config_; bool dump_; std::string dump_filename_; std::string input_item_type_; std::string output_item_type_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; gr::blocks::file_sink::sptr file_sink_; }; #endif gnss-sdr-0.0.9/src/algorithms/data_type_adapter/adapters/ibyte_to_cshort.cc000066400000000000000000000060631305042567700272220ustar00rootroot00000000000000/*! * \file ibyte_to_cshort.cc * \brief Adapts an I/Q interleaved short integer (16 bits) sample stream * to a gr_complex (float) stream * \author Carles Fernandez-Prades, cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "ibyte_to_cshort.h" #include #include #include "configuration_interface.h" using google::LogMessage; IbyteToCshort::IbyteToCshort(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : config_(configuration), role_(role), in_streams_(in_streams), out_streams_(out_streams) { std::string default_input_item_type = "byte"; std::string default_output_item_type = "cshort"; std::string default_dump_filename = "../data/input_filter.dat"; DLOG(INFO) << "role " << role_; input_item_type_ = config_->property(role_ + ".input_item_type", default_input_item_type); dump_ = config_->property(role_ + ".dump", false); dump_filename_ = config_->property(role_ + ".dump_filename", default_dump_filename); size_t item_size = sizeof(lv_16sc_t); interleaved_byte_to_complex_short_ = make_interleaved_byte_to_complex_short(); DLOG(INFO) << "data_type_adapter_(" << interleaved_byte_to_complex_short_->unique_id()<<")"; if (dump_) { DLOG(INFO) << "Dumping output into file " << dump_filename_; file_sink_ = gr::blocks::file_sink::make(item_size, dump_filename_.c_str()); } } IbyteToCshort::~IbyteToCshort() {} void IbyteToCshort::connect(gr::top_block_sptr top_block) { if (dump_) { top_block->connect(interleaved_byte_to_complex_short_, 0, file_sink_, 0); } } void IbyteToCshort::disconnect(gr::top_block_sptr top_block) { if (dump_) { top_block->disconnect(interleaved_byte_to_complex_short_, 0, file_sink_, 0); } } gr::basic_block_sptr IbyteToCshort::get_left_block() { return interleaved_byte_to_complex_short_; } gr::basic_block_sptr IbyteToCshort::get_right_block() { return interleaved_byte_to_complex_short_; } gnss-sdr-0.0.9/src/algorithms/data_type_adapter/adapters/ibyte_to_cshort.h000066400000000000000000000050171305042567700270620ustar00rootroot00000000000000/*! * \file ibyte_to_cshort.h * \brief Adapts a short interleaved sample stream into a std::complex stream * \author Carles Fernandez-Prades, cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_IBYTE_TO_CSHORT_H_ #define GNSS_SDR_IBYTE_TO_CSHORT_H_ #include #include #include "gnss_block_interface.h" #include "interleaved_byte_to_complex_short.h" class ConfigurationInterface; /*! * \brief Adapts a short integer (16 bits) interleaved sample stream into a std::complex stream * */ class IbyteToCshort: public GNSSBlockInterface { public: IbyteToCshort(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~IbyteToCshort(); std::string role() { return role_; } //! Returns "Ibyte_To_Cshort" std::string implementation() { return "Ibyte_To_Cshort"; } size_t item_size() { return 0; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); private: interleaved_byte_to_complex_short_sptr interleaved_byte_to_complex_short_; ConfigurationInterface* config_; bool dump_; std::string dump_filename_; std::string input_item_type_; std::string output_item_type_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; gr::blocks::file_sink::sptr file_sink_; }; #endif gnss-sdr-0.0.9/src/algorithms/data_type_adapter/adapters/ishort_to_complex.cc000066400000000000000000000061641305042567700275650ustar00rootroot00000000000000/*! * \file ishort_to_complex.cc * \brief Adapts an I/Q interleaved short integer sample stream to a gr_complex (float) stream * \author Javier Arribas, jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "ishort_to_complex.h" #include #include "configuration_interface.h" using google::LogMessage; IshortToComplex::IshortToComplex(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : config_(configuration), role_(role), in_streams_(in_streams), out_streams_(out_streams) { std::string default_input_item_type = "short"; std::string default_output_item_type = "gr_complex"; std::string default_dump_filename = "../data/input_filter.dat"; DLOG(INFO) << "role " << role_; input_item_type_ = config_->property(role_ + ".input_item_type", default_input_item_type); dump_ = config_->property(role_ + ".dump", false); dump_filename_ = config_->property(role_ + ".dump_filename", default_dump_filename); size_t item_size = sizeof(gr_complex); gr_interleaved_short_to_complex_ = gr::blocks::interleaved_short_to_complex::make(); DLOG(INFO) << "data_type_adapter_(" << gr_interleaved_short_to_complex_->unique_id() << ")"; if (dump_) { DLOG(INFO) << "Dumping output into file " << dump_filename_; file_sink_ = gr::blocks::file_sink::make(item_size, dump_filename_.c_str()); } } IshortToComplex::~IshortToComplex() {} void IshortToComplex::connect(gr::top_block_sptr top_block) { if (dump_) { top_block->connect(gr_interleaved_short_to_complex_, 0, file_sink_, 0); } else { DLOG(INFO) << "Nothing to connect internally"; } } void IshortToComplex::disconnect(gr::top_block_sptr top_block) { if (dump_) { top_block->disconnect(gr_interleaved_short_to_complex_, 0, file_sink_, 0); } } gr::basic_block_sptr IshortToComplex::get_left_block() { return gr_interleaved_short_to_complex_; } gr::basic_block_sptr IshortToComplex::get_right_block() { return gr_interleaved_short_to_complex_; } gnss-sdr-0.0.9/src/algorithms/data_type_adapter/adapters/ishort_to_complex.h000066400000000000000000000050461305042567700274250ustar00rootroot00000000000000/*! * \file ishort_to_complex.h * \brief Adapts an I/Q interleaved short integer sample stream to a gr_complex (float) stream * \author Javier Arribas, jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_ISHORT_TO_COMPLEX_H_ #define GNSS_SDR_ISHORT_TO_COMPLEX_H_ #include #include #include #include "gnss_block_interface.h" class ConfigurationInterface; /*! * \brief Adapts an I/Q interleaved short integer sample stream to a gr_complex (float) stream * */ class IshortToComplex: public GNSSBlockInterface { public: IshortToComplex(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~IshortToComplex(); std::string role() { return role_; } //! Returns "Ishort_To_Complex" std::string implementation() { return "Ishort_To_Complex"; } size_t item_size() { return 0; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); private: gr::blocks::interleaved_short_to_complex::sptr gr_interleaved_short_to_complex_; ConfigurationInterface* config_; bool dump_; std::string dump_filename_; std::string input_item_type_; std::string output_item_type_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; gr::blocks::file_sink::sptr file_sink_; }; #endif gnss-sdr-0.0.9/src/algorithms/data_type_adapter/adapters/ishort_to_cshort.cc000066400000000000000000000062371305042567700274210ustar00rootroot00000000000000/*! * \file ishort_to_cshort.cc * \brief Adapts an I/Q interleaved short integer (16 bits) sample stream * to a gr_complex (float) stream * \author Carles Fernandez-Prades, cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "ishort_to_cshort.h" #include #include #include "configuration_interface.h" using google::LogMessage; IshortToCshort::IshortToCshort(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : config_(configuration), role_(role), in_streams_(in_streams), out_streams_(out_streams) { std::string default_input_item_type = "short"; std::string default_output_item_type = "cshort"; std::string default_dump_filename = "../data/input_filter.dat"; DLOG(INFO) << "role " << role_; input_item_type_ = config_->property(role_ + ".input_item_type", default_input_item_type); dump_ = config_->property(role_ + ".dump", false); dump_filename_ = config_->property(role_ + ".dump_filename", default_dump_filename); size_t item_size = sizeof(lv_16sc_t); interleaved_short_to_complex_short_ = make_interleaved_short_to_complex_short(); DLOG(INFO) << "data_type_adapter_(" << interleaved_short_to_complex_short_->unique_id() << ")"; if (dump_) { DLOG(INFO) << "Dumping output into file " << dump_filename_; file_sink_ = gr::blocks::file_sink::make(item_size, dump_filename_.c_str()); } } IshortToCshort::~IshortToCshort() {} void IshortToCshort::connect(gr::top_block_sptr top_block) { if (dump_) { top_block->connect(interleaved_short_to_complex_short_, 0, file_sink_, 0); } else { DLOG(INFO) << "Nothing to connect internally"; } } void IshortToCshort::disconnect(gr::top_block_sptr top_block) { if (dump_) { top_block->disconnect(interleaved_short_to_complex_short_, 0, file_sink_, 0); } } gr::basic_block_sptr IshortToCshort::get_left_block() { return interleaved_short_to_complex_short_; } gr::basic_block_sptr IshortToCshort::get_right_block() { return interleaved_short_to_complex_short_; } gnss-sdr-0.0.9/src/algorithms/data_type_adapter/adapters/ishort_to_cshort.h000066400000000000000000000050321305042567700272530ustar00rootroot00000000000000/*! * \file ishort_to_cshort.h * \brief Adapts a short interleaved sample stream into a std::complex stream * \author Carles Fernandez-Prades, cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_ISHORT_TO_CSHORT_H_ #define GNSS_SDR_ISHORT_TO_CSHORT_H_ #include #include #include "gnss_block_interface.h" #include "interleaved_short_to_complex_short.h" class ConfigurationInterface; /*! * \brief Adapts a short integer (16 bits) interleaved sample stream into a std::complex stream * */ class IshortToCshort: public GNSSBlockInterface { public: IshortToCshort(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~IshortToCshort(); std::string role() { return role_; } //! Returns "Ishort_To_Cshort" std::string implementation() { return "Ishort_To_Cshort"; } size_t item_size() { return 0; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); private: interleaved_short_to_complex_short_sptr interleaved_short_to_complex_short_; ConfigurationInterface* config_; bool dump_; std::string dump_filename_; std::string input_item_type_; std::string output_item_type_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; gr::blocks::file_sink::sptr file_sink_; }; #endif gnss-sdr-0.0.9/src/algorithms/data_type_adapter/gnuradio_blocks/000077500000000000000000000000001305042567700250505ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/data_type_adapter/gnuradio_blocks/CMakeLists.txt000066400000000000000000000025021305042567700276070ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # set(DATA_TYPE_GR_BLOCKS_SOURCES interleaved_byte_to_complex_byte.cc interleaved_short_to_complex_short.cc interleaved_byte_to_complex_short.cc ) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${GNURADIO_RUNTIME_INCLUDE_DIRS} ${VOLK_INCLUDE_DIRS} ) file(GLOB DATA_TYPE_GR_BLOCKS_HEADERS "*.h") list(SORT DATA_TYPE_GR_BLOCKS_HEADERS) add_library(data_type_gr_blocks ${DATA_TYPE_GR_BLOCKS_SOURCES} ${DATA_TYPE_GR_BLOCKS_HEADERS}) source_group(Headers FILES ${DATA_TYPE_GR_BLOCKS_HEADERS}) target_link_libraries(data_type_gr_blocks ${GNURADIO_RUNTIME_LIBRARIES} ${VOLK_LIBRARIES})gnss-sdr-0.0.9/src/algorithms/data_type_adapter/gnuradio_blocks/interleaved_byte_to_complex_byte.cc000066400000000000000000000050511305042567700341610ustar00rootroot00000000000000/*! * \file interleaved_byte_to_complex_byte.cc * \brief Adapts an 8-bits interleaved sample stream into a 16-bits complex stream * \author Carles Fernandez Prades, cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "interleaved_byte_to_complex_byte.h" #include #include interleaved_byte_to_complex_byte_sptr make_interleaved_byte_to_complex_byte() { return interleaved_byte_to_complex_byte_sptr(new interleaved_byte_to_complex_byte()); } interleaved_byte_to_complex_byte::interleaved_byte_to_complex_byte() : sync_decimator("interleaved_byte_to_complex_byte", gr::io_signature::make (1, 1, sizeof(int8_t)), gr::io_signature::make (1, 1, sizeof(lv_8sc_t)), // lv_8sc_t is a Volk's typedef for std::complex 2) { const int alignment_multiple = volk_get_alignment() / sizeof(lv_8sc_t); set_alignment(std::max(1, alignment_multiple)); } int interleaved_byte_to_complex_byte::work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { const int8_t *in = (const int8_t *) input_items[0]; lv_8sc_t *out = (lv_8sc_t *) output_items[0]; // This could be put into a Volk kernel int8_t real_part; int8_t imag_part; for(int number = 0; number < noutput_items; number++) { // lv_cmake(r, i) defined at volk/volk_complex.h real_part = *in++; imag_part = *in++; *out++ = lv_cmake(real_part, imag_part); } return noutput_items; } gnss-sdr-0.0.9/src/algorithms/data_type_adapter/gnuradio_blocks/interleaved_byte_to_complex_byte.h000066400000000000000000000040551305042567700340260ustar00rootroot00000000000000/*! * \file interleaved_byte_to_complex_byte.h * \brief Adapts an 8-bits interleaved sample stream into a 16-bits complex stream * \author Carles Fernandez Prades, cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_INTERLEAVED_BYTE_TO_COMPLEX_BYTE_H_ #define GNSS_SDR_INTERLEAVED_BYTE_TO_COMPLEX_BYTE_H_ #include #include class interleaved_byte_to_complex_byte; typedef boost::shared_ptr interleaved_byte_to_complex_byte_sptr; interleaved_byte_to_complex_byte_sptr make_interleaved_byte_to_complex_byte(); /*! * \brief This class adapts an 8-bits interleaved sample stream * into a 16-bits complex stream (std::complex) */ class interleaved_byte_to_complex_byte : public gr::sync_decimator { private: friend interleaved_byte_to_complex_byte_sptr make_interleaved_byte_to_complex_byte(); public: interleaved_byte_to_complex_byte(); int work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; #endif gnss-sdr-0.0.9/src/algorithms/data_type_adapter/gnuradio_blocks/interleaved_byte_to_complex_short.cc000066400000000000000000000051101305042567700343510ustar00rootroot00000000000000/*! * \file interleaved_byte_to_complex_short.cc * \brief Adapts a byte (8-bits) interleaved sample stream into a std::complex stream * \author Javier Arribas (jarribas(at)cttc.es) * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "interleaved_byte_to_complex_short.h" #include #include interleaved_byte_to_complex_short_sptr make_interleaved_byte_to_complex_short() { return interleaved_byte_to_complex_short_sptr(new interleaved_byte_to_complex_short()); } interleaved_byte_to_complex_short::interleaved_byte_to_complex_short() : sync_decimator("interleaved_byte_to_complex_short", gr::io_signature::make (1, 1, sizeof(int8_t)), gr::io_signature::make (1, 1, sizeof(lv_16sc_t)), // lv_16sc_t is a Volk's typedef for std::complex 2) { const int alignment_multiple = volk_get_alignment() / sizeof(lv_16sc_t); set_alignment(std::max(1, alignment_multiple)); } int interleaved_byte_to_complex_short::work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { const int8_t *in = (const int8_t *) input_items[0]; lv_16sc_t *out = (lv_16sc_t *) output_items[0]; // This could be put into a Volk kernel int8_t real_part; int8_t imag_part; for(int number = 0; number < noutput_items; number++) { // lv_cmake(r, i) defined at volk/volk_complex.h real_part = *in++; imag_part = *in++; *out++ = lv_cmake((int16_t)real_part, (int16_t)imag_part); } return noutput_items; } gnss-sdr-0.0.9/src/algorithms/data_type_adapter/gnuradio_blocks/interleaved_byte_to_complex_short.h000066400000000000000000000040451305042567700342210ustar00rootroot00000000000000/*! * \file interleaved_byte_to_complex_short.h * \brief Adapts a byte (8-bits) interleaved sample stream into a std::complex stream * \author Javier Arribas (jarribas(at)cttc.es) * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_INTERLEAVED_BYTE_TO_COMPLEX_SHORT_H_ #define GNSS_SDR_INTERLEAVED_BYTE_TO_COMPLEX_SHORT_H_ #include #include class interleaved_byte_to_complex_short; typedef boost::shared_ptr interleaved_byte_to_complex_short_sptr; interleaved_byte_to_complex_short_sptr make_interleaved_byte_to_complex_short(); /*! * \brief This class adapts a short (16-bits) interleaved sample stream * into a std::complex stream */ class interleaved_byte_to_complex_short : public gr::sync_decimator { private: friend interleaved_byte_to_complex_short_sptr make_interleaved_byte_to_complex_short(); public: interleaved_byte_to_complex_short(); int work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; #endif interleaved_short_to_complex_short.cc000066400000000000000000000051211305042567700344700ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/data_type_adapter/gnuradio_blocks/*! * \file interleaved_short_to_complex_short.cc * \brief Adapts a short (16-bits) interleaved sample stream into a std::complex stream * \author Carles Fernandez Prades, cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "interleaved_short_to_complex_short.h" #include #include interleaved_short_to_complex_short_sptr make_interleaved_short_to_complex_short() { return interleaved_short_to_complex_short_sptr(new interleaved_short_to_complex_short()); } interleaved_short_to_complex_short::interleaved_short_to_complex_short() : sync_decimator("interleaved_short_to_complex_short", gr::io_signature::make (1, 1, sizeof(int16_t)), gr::io_signature::make (1, 1, sizeof(lv_16sc_t)), // lv_16sc_t is a Volk's typedef for std::complex 2) { const int alignment_multiple = volk_get_alignment() / sizeof(lv_16sc_t); set_alignment(std::max(1, alignment_multiple)); } int interleaved_short_to_complex_short::work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { const int16_t *in = (const int16_t *) input_items[0]; lv_16sc_t *out = (lv_16sc_t *) output_items[0]; // This could be put into a Volk kernel int16_t real_part; int16_t imag_part; for(int number = 0; number < noutput_items; number++) { // lv_cmake(r, i) defined at volk/volk_complex.h real_part = *in++; imag_part = *in++; *out++ = lv_cmake(real_part, imag_part); } return noutput_items; } gnss-sdr-0.0.9/src/algorithms/data_type_adapter/gnuradio_blocks/interleaved_short_to_complex_short.h000066400000000000000000000040751305042567700344200ustar00rootroot00000000000000/*! * \file interleaved_short_to_complex_short.h * \brief Adapts a short (16-bits) interleaved sample stream into a std::complex stream * \author Carles Fernandez Prades, cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_INTERLEAVED_SHORT_TO_COMPLEX_SHORT_H_ #define GNSS_SDR_INTERLEAVED_SHORT_TO_COMPLEX_SHORT_H_ #include #include class interleaved_short_to_complex_short; typedef boost::shared_ptr interleaved_short_to_complex_short_sptr; interleaved_short_to_complex_short_sptr make_interleaved_short_to_complex_short(); /*! * \brief This class adapts a short (16-bits) interleaved sample stream * into a std::complex stream */ class interleaved_short_to_complex_short : public gr::sync_decimator { private: friend interleaved_short_to_complex_short_sptr make_interleaved_short_to_complex_short(); public: interleaved_short_to_complex_short(); int work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; #endif gnss-sdr-0.0.9/src/algorithms/input_filter/000077500000000000000000000000001305042567700207355ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/input_filter/CMakeLists.txt000066400000000000000000000014321305042567700234750ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # add_subdirectory(adapters) add_subdirectory(gnuradio_blocks)gnss-sdr-0.0.9/src/algorithms/input_filter/adapters/000077500000000000000000000000001305042567700225405ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/input_filter/adapters/CMakeLists.txt000066400000000000000000000032731305042567700253050ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # set(INPUT_FILTER_ADAPTER_SOURCES fir_filter.cc freq_xlating_fir_filter.cc beamformer_filter.cc ) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/interfaces ${CMAKE_SOURCE_DIR}/src/algorithms/input_filter/gnuradio_blocks ${CMAKE_SOURCE_DIR}/src/algorithms/libs ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ${VOLK_INCLUDE_DIRS} ) file(GLOB INPUT_FILTER_ADAPTER_HEADERS "*.h") list(SORT INPUT_FILTER_ADAPTER_HEADERS) add_library(input_filter_adapters ${INPUT_FILTER_ADAPTER_SOURCES} ${INPUT_FILTER_ADAPTER_HEADERS}) source_group(Headers FILES ${INPUT_FILTER_ADAPTER_HEADERS}) add_dependencies(input_filter_adapters glog-${glog_RELEASE} gnss_sp_libs) target_link_libraries(input_filter_adapters input_filter_gr_blocks ${GNURADIO_RUNTIME_LIBRARIES} ${GNURADIO_BLOCKS_LIBRARIES} ${GNURADIO_FILTER_LIBRARIES} gnss_sp_libs) gnss-sdr-0.0.9/src/algorithms/input_filter/adapters/beamformer_filter.cc000066400000000000000000000065511305042567700265420ustar00rootroot00000000000000/*! * \file beamformer_filter.cc * \brief Interface of an adapter of a digital beamformer * \author Javier Arribas jarribas (at) cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "beamformer_filter.h" #include #include #include "beamformer.h" #include "configuration_interface.h" using google::LogMessage; BeamformerFilter::BeamformerFilter( ConfigurationInterface* configuration, std::string role, unsigned int in_stream, unsigned int out_stream) : role_(role), in_stream_(in_stream), out_stream_(out_stream) { std::string default_item_type = "gr_complex"; std::string default_dump_file = "./data/input_filter.dat"; item_type_ = configuration->property(role + ".item_type", default_item_type); dump_ = configuration->property(role + ".dump", false); DLOG(INFO) << "dump_ is " << dump_; dump_filename_ = configuration->property(role + ".dump_filename", default_dump_file); if (item_type_.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); beamformer_ = make_beamformer(); DLOG(INFO) << "Item size " << item_size_; DLOG(INFO) << "resampler(" << beamformer_->unique_id() << ")"; } else { LOG(WARNING) << item_type_ << " unrecognized item type for beamformer"; item_size_ = sizeof(gr_complex); } if (dump_) { DLOG(INFO) << "Dumping output into file " << dump_filename_; file_sink_ = gr::blocks::file_sink::make(item_size_, dump_filename_.c_str()); DLOG(INFO) << "file_sink(" << file_sink_->unique_id() << ")"; } samples_ = 0; } BeamformerFilter::~BeamformerFilter() {} void BeamformerFilter::connect(gr::top_block_sptr top_block) { if (dump_) { top_block->connect(beamformer_, 0, file_sink_, 0); DLOG(INFO) << "connected beamformer output to file sink"; } else { DLOG(INFO) << "nothing to connect internally"; } } void BeamformerFilter::disconnect(gr::top_block_sptr top_block) { if (dump_) { top_block->disconnect(beamformer_, 0, file_sink_, 0); } } gr::basic_block_sptr BeamformerFilter::get_left_block() { return beamformer_; } gr::basic_block_sptr BeamformerFilter::get_right_block() { return beamformer_; } gnss-sdr-0.0.9/src/algorithms/input_filter/adapters/beamformer_filter.h000066400000000000000000000046341305042567700264040ustar00rootroot00000000000000/*! * \file beamformer_filter.h * \brief Interface of an adapter of a digital beamformer * \author Javier Arribas jarribas (at) cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_BEAMFORMER_FILTER_H_ #define GNSS_SDR_BEAMFORMER_FILTER_H_ #include #include #include "gnss_block_interface.h" class ConfigurationInterface; /*! * \brief Interface of an adapter of a direct resampler conditioner block * to a SignalConditionerInterface */ class BeamformerFilter: public GNSSBlockInterface { public: BeamformerFilter(ConfigurationInterface* configuration, std::string role, unsigned int in_stream, unsigned int out_stream); virtual ~BeamformerFilter(); std::string role() { return role_; } //! returns "Direct_Resampler" std::string implementation() { return "Beamformer_Filter"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); private: std::string role_; unsigned int in_stream_; unsigned int out_stream_; std::string item_type_; size_t item_size_; unsigned long long samples_; bool dump_; std::string dump_filename_; gr::block_sptr beamformer_; gr::block_sptr file_sink_; }; #endif /*GNSS_SDR_BEAMFORMER_FILTER_H_*/ gnss-sdr-0.0.9/src/algorithms/input_filter/adapters/fir_filter.cc000066400000000000000000000447341305042567700252100ustar00rootroot00000000000000/*! * \file fir_filter.cc * \brief Adapts a gnuradio gr_fir_filter designed with gr_remez * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com * Carles Fernandez-Prades, 2015 cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "fir_filter.h" #include #include #include #include #include "configuration_interface.h" using google::LogMessage; FirFilter::FirFilter(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : config_(configuration), role_(role), in_streams_(in_streams), out_streams_(out_streams) { size_t item_size; (*this).init(); if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("gr_complex") == 0) && (output_item_type_.compare("gr_complex") == 0)) { item_size = sizeof(gr_complex); fir_filter_ccf_ = gr::filter::fir_filter_ccf::make(1, taps_); DLOG(INFO) << "input_filter(" << fir_filter_ccf_->unique_id() << ")"; if (dump_) { DLOG(INFO) << "Dumping output into file " << dump_filename_; file_sink_ = gr::blocks::file_sink::make(item_size, dump_filename_.c_str()); } } else if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("cshort") == 0) && (output_item_type_.compare("cshort") == 0)) { item_size = sizeof(lv_16sc_t); cshort_to_float_x2_ = make_cshort_to_float_x2(); fir_filter_fff_1_ = gr::filter::fir_filter_fff::make(1, taps_); fir_filter_fff_2_ = gr::filter::fir_filter_fff::make(1, taps_); DLOG(INFO) << "I input_filter(" << fir_filter_fff_1_->unique_id() << ")"; DLOG(INFO) << "Q input_filter(" << fir_filter_fff_2_->unique_id() << ")"; float_to_short_1_ = gr::blocks::float_to_short::make(); float_to_short_2_ = gr::blocks::float_to_short::make(); short_x2_to_cshort_ = make_short_x2_to_cshort(); if (dump_) { DLOG(INFO) << "Dumping output into file " << dump_filename_; file_sink_ = gr::blocks::file_sink::make(item_size, dump_filename_.c_str()); } } else if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("cshort") == 0) && (output_item_type_.compare("gr_complex") == 0)) { item_size = sizeof(gr_complex); cshort_to_float_x2_ = make_cshort_to_float_x2(); fir_filter_fff_1_ = gr::filter::fir_filter_fff::make(1, taps_); fir_filter_fff_2_ = gr::filter::fir_filter_fff::make(1, taps_); DLOG(INFO) << "I input_filter(" << fir_filter_fff_1_->unique_id() << ")"; DLOG(INFO) << "Q input_filter(" << fir_filter_fff_2_->unique_id() << ")"; float_to_complex_ = gr::blocks::float_to_complex::make(); if (dump_) { DLOG(INFO) << "Dumping output into file " << dump_filename_; file_sink_ = gr::blocks::file_sink::make(item_size, dump_filename_.c_str()); } } else if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("cbyte") == 0) && (output_item_type_.compare("gr_complex") == 0)) { item_size = sizeof(gr_complex); cbyte_to_float_x2_ = make_complex_byte_to_float_x2(); fir_filter_fff_1_ = gr::filter::fir_filter_fff::make(1, taps_); fir_filter_fff_2_ = gr::filter::fir_filter_fff::make(1, taps_); DLOG(INFO) << "I input_filter(" << fir_filter_fff_1_->unique_id() << ")"; DLOG(INFO) << "Q input_filter(" << fir_filter_fff_2_->unique_id() << ")"; float_to_complex_ = gr::blocks::float_to_complex::make(); if (dump_) { DLOG(INFO) << "Dumping output into file " << dump_filename_; file_sink_ = gr::blocks::file_sink::make(item_size, dump_filename_.c_str()); } } else if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("cbyte") == 0) && (output_item_type_.compare("cbyte") == 0)) { item_size = sizeof(lv_8sc_t); cbyte_to_float_x2_ = make_complex_byte_to_float_x2(); fir_filter_fff_1_ = gr::filter::fir_filter_fff::make(1, taps_); fir_filter_fff_2_ = gr::filter::fir_filter_fff::make(1, taps_); DLOG(INFO) << "I input_filter(" << fir_filter_fff_1_->unique_id() << ")"; DLOG(INFO) << "Q input_filter(" << fir_filter_fff_2_->unique_id() << ")"; float_to_char_1_ = gr::blocks::float_to_char::make(); float_to_char_2_ = gr::blocks::float_to_char::make(); char_x2_cbyte_ = make_byte_x2_to_complex_byte(); if (dump_) { DLOG(INFO) << "Dumping output into file " << dump_filename_; file_sink_ = gr::blocks::file_sink::make(item_size, dump_filename_.c_str()); } } else { LOG(ERROR) << " Unknown item type conversion"; } } FirFilter::~FirFilter() {} void FirFilter::connect(gr::top_block_sptr top_block) { if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("gr_complex") == 0) && (output_item_type_.compare("gr_complex") == 0)) { if (dump_) { top_block->connect(fir_filter_ccf_, 0, file_sink_, 0); } else { DLOG(INFO) << "Nothing to connect internally"; } } else if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("cshort") == 0) && (output_item_type_.compare("cshort") == 0)) { top_block->connect(cshort_to_float_x2_, 0, fir_filter_fff_1_, 0); top_block->connect(cshort_to_float_x2_, 1, fir_filter_fff_2_, 0); top_block->connect(fir_filter_fff_1_, 0, float_to_short_1_, 0); top_block->connect(fir_filter_fff_2_, 0, float_to_short_2_, 0); top_block->connect(float_to_short_1_, 0, short_x2_to_cshort_, 0); top_block->connect(float_to_short_2_, 0, short_x2_to_cshort_, 1); if (dump_) { top_block->connect(short_x2_to_cshort_, 0, file_sink_, 0); } } else if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("cbyte") == 0) && (output_item_type_.compare("gr_complex") == 0)) { top_block->connect(cbyte_to_float_x2_, 0, fir_filter_fff_1_, 0); top_block->connect(cbyte_to_float_x2_, 1, fir_filter_fff_2_, 0); top_block->connect(fir_filter_fff_1_, 0, float_to_complex_, 0); top_block->connect(fir_filter_fff_2_, 0, float_to_complex_, 1); if (dump_) { top_block->connect(float_to_complex_, 0, file_sink_, 0); } } else if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("cbyte") == 0) && (output_item_type_.compare("cbyte") == 0)) { top_block->connect(cbyte_to_float_x2_, 0, fir_filter_fff_1_, 0); top_block->connect(cbyte_to_float_x2_, 1, fir_filter_fff_2_, 0); top_block->connect(fir_filter_fff_1_, 0, float_to_char_1_, 0); top_block->connect(fir_filter_fff_2_, 0, float_to_char_2_, 0); top_block->connect(float_to_char_1_, 0, char_x2_cbyte_, 0); top_block->connect(float_to_char_2_, 0, char_x2_cbyte_, 1); if (dump_) { top_block->connect(char_x2_cbyte_, 0, file_sink_, 0); } } else if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("cshort") == 0) && (output_item_type_.compare("gr_complex") == 0)) { top_block->connect(cshort_to_float_x2_, 0, fir_filter_fff_1_, 0); top_block->connect(cshort_to_float_x2_, 1, fir_filter_fff_2_, 0); top_block->connect(fir_filter_fff_1_, 0, float_to_complex_, 0); top_block->connect(fir_filter_fff_2_, 0, float_to_complex_, 1); if (dump_) { top_block->connect(float_to_complex_, 0, file_sink_, 0); } } else { LOG(ERROR) << " Unknown item type conversion"; } } void FirFilter::disconnect(gr::top_block_sptr top_block) { if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("gr_complex") == 0) && (output_item_type_.compare("gr_complex") == 0)) { if (dump_) { top_block->disconnect(fir_filter_ccf_, 0, file_sink_, 0); } } else if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("cbyte") == 0) && (output_item_type_.compare("gr_complex") == 0)) { top_block->disconnect(fir_filter_fff_2_, 0, float_to_complex_, 1); top_block->disconnect(fir_filter_fff_1_, 0, float_to_complex_, 0); top_block->disconnect(cbyte_to_float_x2_, 1, fir_filter_fff_2_, 0); top_block->disconnect(cbyte_to_float_x2_, 0, fir_filter_fff_1_, 0); if (dump_) { top_block->disconnect(float_to_complex_, 0, file_sink_, 0); } } else if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("cshort") == 0) && (output_item_type_.compare("cshort") == 0)) { top_block->disconnect(cshort_to_float_x2_, 0, fir_filter_fff_1_, 0); top_block->disconnect(cshort_to_float_x2_, 1, fir_filter_fff_2_, 0); top_block->disconnect(fir_filter_fff_1_, 0, float_to_short_1_, 0); top_block->disconnect(fir_filter_fff_2_, 0, float_to_short_2_, 0); top_block->disconnect(float_to_short_1_, 0, short_x2_to_cshort_, 0); top_block->disconnect(float_to_short_2_, 0, short_x2_to_cshort_, 1); if (dump_) { top_block->disconnect(short_x2_to_cshort_, 0, file_sink_, 0); } } else if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("cbyte") == 0) && (output_item_type_.compare("cbyte") == 0)) { top_block->disconnect(float_to_char_2_, 0, char_x2_cbyte_, 1); top_block->disconnect(float_to_char_1_, 0, char_x2_cbyte_, 0); top_block->disconnect(fir_filter_fff_2_, 0, float_to_char_2_, 0); top_block->disconnect(fir_filter_fff_1_, 0, float_to_char_1_, 0); top_block->disconnect(cbyte_to_float_x2_, 0, fir_filter_fff_1_, 0); top_block->disconnect(cbyte_to_float_x2_, 1, fir_filter_fff_2_, 0); if (dump_) { top_block->disconnect(char_x2_cbyte_, 0, file_sink_, 0); } } else if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("cshort") == 0) && (output_item_type_.compare("gr_complex") == 0)) { top_block->disconnect(cshort_to_float_x2_, 0, fir_filter_fff_1_, 0); top_block->disconnect(cshort_to_float_x2_, 1, fir_filter_fff_2_, 0); top_block->disconnect(fir_filter_fff_1_, 0, float_to_complex_, 0); top_block->disconnect(fir_filter_fff_2_, 0, float_to_complex_, 1); if (dump_) { top_block->disconnect(float_to_complex_, 0, file_sink_, 0); } } else { LOG(ERROR) << " Unknown item type conversion"; } } gr::basic_block_sptr FirFilter::get_left_block() { if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("gr_complex") == 0) && (output_item_type_.compare("gr_complex") == 0)) { return fir_filter_ccf_; } else if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("cshort") == 0) && (output_item_type_.compare("cshort") == 0)) { return cshort_to_float_x2_; } else if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("cbyte") == 0) && (output_item_type_.compare("gr_complex") == 0)) { return cbyte_to_float_x2_; } else if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("cbyte") == 0) && (output_item_type_.compare("cbyte") == 0)) { return cbyte_to_float_x2_; } else if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("cshort") == 0) && (output_item_type_.compare("gr_complex") == 0)) { return cshort_to_float_x2_; } else { return nullptr; LOG(ERROR) << " Unknown item type conversion"; } } gr::basic_block_sptr FirFilter::get_right_block() { if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("gr_complex") == 0) && (output_item_type_.compare("gr_complex") == 0)) { return fir_filter_ccf_; } else if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("cshort") == 0) && (output_item_type_.compare("cshort") == 0)) { return short_x2_to_cshort_; } else if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("cbyte") == 0) && (output_item_type_.compare("gr_complex") == 0)) { return float_to_complex_; } else if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("cbyte") == 0) && (output_item_type_.compare("cbyte") == 0)) { return char_x2_cbyte_; } else if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("cshort") == 0) && (output_item_type_.compare("gr_complex") == 0)) { return float_to_complex_; } else { return nullptr; LOG(ERROR) << " unknown input filter item type"; } } void FirFilter::init() { std::string default_input_item_type = "gr_complex"; std::string default_output_item_type = "gr_complex"; std::string default_taps_item_type = "float"; std::string default_dump_filename = "../data/input_filter.dat"; int default_number_of_taps = 6; unsigned int default_number_of_bands = 2; std::vector default_bands = { 0.0, 0.4, 0.6, 1.0 }; std::vector default_ampl = { 1.0, 1.0, 0.0, 0.0 }; std::vector default_error_w = { 1.0, 1.0 }; std::string default_filter_type = "bandpass"; int default_grid_density = 16; DLOG(INFO) << "role " << role_; input_item_type_ = config_->property(role_ + ".input_item_type", default_input_item_type); output_item_type_ = config_->property(role_ + ".output_item_type", default_output_item_type); taps_item_type_ = config_->property(role_ + ".taps_item_type", default_taps_item_type); dump_ = config_->property(role_ + ".dump", false); dump_filename_ = config_->property(role_ + ".dump_filename", default_dump_filename); int number_of_taps = config_->property(role_ + ".number_of_taps", default_number_of_taps); unsigned int number_of_bands = config_->property(role_ + ".number_of_bands", default_number_of_bands); std::vector bands; std::vector ampl; std::vector error_w; std::string option; double option_value; for (unsigned int i = 0; i < number_of_bands; i++) { option = ".band" + boost::lexical_cast(i + 1) + "_begin"; option_value = config_->property(role_ + option, default_bands[i]); bands.push_back(option_value); option = ".band" + boost::lexical_cast(i + 1) + "_end"; option_value = config_->property(role_ + option, default_bands[i]); bands.push_back(option_value); option = ".ampl" + boost::lexical_cast(i + 1) + "_begin"; option_value = config_->property(role_ + option, default_bands[i]); ampl.push_back(option_value); option = ".ampl" + boost::lexical_cast(i + 1) + "_end"; option_value = config_->property(role_ + option, default_bands[i]); ampl.push_back(option_value); option = ".band" + boost::lexical_cast(i + 1) + "_error"; option_value = config_->property(role_ + option, default_bands[i]); error_w.push_back(option_value); } std::string filter_type = config_->property(role_ + ".filter_type", default_filter_type); int grid_density = config_->property(role_ + ".grid_density", default_grid_density); // pm_remez implements the Parks-McClellan FIR filter design. // It calculates the optimal (in the Chebyshev/minimax sense) FIR filter // impulse response given a set of band edges, the desired response on // those bands, and the weight given to the error in those bands. std::vector taps_d = gr::filter::pm_remez(number_of_taps - 1, bands, ampl, error_w, filter_type, grid_density); taps_.reserve(taps_d.size()); for (std::vector::iterator it = taps_d.begin(); it != taps_d.end(); it++) { taps_.push_back(float(*it)); } } gnss-sdr-0.0.9/src/algorithms/input_filter/adapters/fir_filter.h000066400000000000000000000075551305042567700250520ustar00rootroot00000000000000/*! * \file fir_filter.h * \brief Adapts a gnuradio gr_fir_filter designed with pm_remez * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com * * Detailed description of the file here if needed. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_FIR_FILTER_H_ #define GNSS_SDR_FIR_FILTER_H_ #include #include #include #include #include #include #include #include #include #include #include "gnss_block_interface.h" #include "complex_byte_to_float_x2.h" #include "byte_x2_to_complex_byte.h" #include "short_x2_to_cshort.h" #include "cshort_to_float_x2.h" class ConfigurationInterface; /*! * \brief This class adapts a GNU Radio gr_fir_filter designed with pm_remez * * See Parks-McClellan FIR filter design, http://en.wikipedia.org/wiki/Parks-McClellan_filter_design_algorithm * Calculates the optimal (in the Chebyshev/minimax sense) FIR filter impulse response * given a set of band edges, the desired response on those bands, and the weight given * to the error in those bands. */ class FirFilter: public GNSSBlockInterface { public: //! Constructor FirFilter(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); //! Destructor virtual ~FirFilter(); std::string role() { return role_; } //! Returns "Fir_Filter" std::string implementation() { return "Fir_Filter"; } size_t item_size() { return 0; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); private: gr::filter::fir_filter_ccf::sptr fir_filter_ccf_; ConfigurationInterface* config_; bool dump_; std::string dump_filename_; std::string input_item_type_; std::string output_item_type_; std::string taps_item_type_; std::vector taps_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; gr::blocks::file_sink::sptr file_sink_; void init(); complex_byte_to_float_x2_sptr cbyte_to_float_x2_; gr::filter::fir_filter_fff::sptr fir_filter_fff_1_; gr::filter::fir_filter_fff::sptr fir_filter_fff_2_; gr::blocks::float_to_char::sptr float_to_char_1_; gr::blocks::float_to_char::sptr float_to_char_2_; byte_x2_to_complex_byte_sptr char_x2_cbyte_; gr::blocks::float_to_complex::sptr float_to_complex_; cshort_to_float_x2_sptr cshort_to_float_x2_; gr::blocks::float_to_short::sptr float_to_short_1_; gr::blocks::float_to_short::sptr float_to_short_2_; short_x2_to_cshort_sptr short_x2_to_cshort_; }; #endif gnss-sdr-0.0.9/src/algorithms/input_filter/adapters/freq_xlating_fir_filter.cc000066400000000000000000000434551305042567700277520ustar00rootroot00000000000000/*! * \file freq_xlating_fir_filter.cc * \brief Adapts a gnuradio gr_freq_xlating_fir_filter designed with gr_remez * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "freq_xlating_fir_filter.h" #include #include #include #include #include #include "configuration_interface.h" using google::LogMessage; FreqXlatingFirFilter::FreqXlatingFirFilter(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : config_(configuration), role_(role), in_streams_(in_streams), out_streams_(out_streams) { size_t item_size; (*this).init(); int decimation_factor; int default_decimation_factor = 1; decimation_factor = config_->property(role_ + ".decimation_factor", default_decimation_factor); if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("gr_complex") == 0) && (output_item_type_.compare("gr_complex") == 0)) { item_size = sizeof(gr_complex); //output input_size_ = sizeof(gr_complex); //input freq_xlating_fir_filter_ccf_ = gr::filter::freq_xlating_fir_filter_ccf::make(decimation_factor, taps_, intermediate_freq_, sampling_freq_); DLOG(INFO) << "input_filter(" << freq_xlating_fir_filter_ccf_->unique_id() << ")"; } else if((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("float") == 0) && (output_item_type_.compare("gr_complex") == 0)) { item_size = sizeof(gr_complex); input_size_ = sizeof(float); //input freq_xlating_fir_filter_fcf_ = gr::filter::freq_xlating_fir_filter_fcf::make(decimation_factor, taps_, intermediate_freq_, sampling_freq_); DLOG(INFO) << "input_filter(" << freq_xlating_fir_filter_fcf_->unique_id() << ")"; } else if((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("short") == 0) && (output_item_type_.compare("gr_complex") == 0)) { item_size = sizeof(gr_complex); input_size_ = sizeof(int16_t); //input freq_xlating_fir_filter_scf_ = gr::filter::freq_xlating_fir_filter_scf::make(decimation_factor, taps_, intermediate_freq_, sampling_freq_); DLOG(INFO) << "input_filter(" << freq_xlating_fir_filter_scf_->unique_id() << ")"; } else if((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("short") == 0) && (output_item_type_.compare("cshort") == 0)) { item_size = sizeof(lv_16sc_t); input_size_ = sizeof(int16_t); //input freq_xlating_fir_filter_scf_ = gr::filter::freq_xlating_fir_filter_scf::make(decimation_factor, taps_, intermediate_freq_, sampling_freq_); DLOG(INFO) << "input_filter(" << freq_xlating_fir_filter_scf_->unique_id() << ")"; complex_to_float_ = gr::blocks::complex_to_float::make(); float_to_short_1_ = gr::blocks::float_to_short::make(); float_to_short_2_ = gr::blocks::float_to_short::make(); short_x2_to_cshort_ = make_short_x2_to_cshort(); } else if((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("byte") == 0) && (output_item_type_.compare("gr_complex") == 0)) { item_size = sizeof(gr_complex); input_size_ = sizeof(int8_t); //input gr_char_to_short_ = gr::blocks::char_to_short::make(); freq_xlating_fir_filter_scf_ = gr::filter::freq_xlating_fir_filter_scf::make(decimation_factor, taps_, intermediate_freq_, sampling_freq_); DLOG(INFO) << "input_filter(" << freq_xlating_fir_filter_scf_->unique_id() << ")"; } else if((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("byte") == 0) && (output_item_type_.compare("cbyte") == 0)) { item_size = sizeof(lv_8sc_t); input_size_ = sizeof(int8_t); //input gr_char_to_short_ = gr::blocks::char_to_short::make(); freq_xlating_fir_filter_scf_ = gr::filter::freq_xlating_fir_filter_scf::make(decimation_factor, taps_, intermediate_freq_, sampling_freq_); DLOG(INFO) << "input_filter(" << freq_xlating_fir_filter_scf_->unique_id() << ")"; complex_to_complex_byte_ = make_complex_float_to_complex_byte(); } else { LOG(ERROR) << " Unknown input filter input/output item type conversion"; item_size = sizeof(gr_complex); //avoids uninitialization input_size_ = sizeof(gr_complex); //avoids uninitialization } if (dump_) { DLOG(INFO) << "Dumping output into file " << dump_filename_; std::cout << "Dumping output into file " << dump_filename_ << std::endl; file_sink_ = gr::blocks::file_sink::make(item_size, dump_filename_.c_str()); } } FreqXlatingFirFilter::~FreqXlatingFirFilter() {} void FreqXlatingFirFilter::connect(gr::top_block_sptr top_block) { if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("gr_complex") == 0) && (output_item_type_.compare("gr_complex") == 0)) { if (dump_) { top_block->connect(freq_xlating_fir_filter_ccf_, 0, file_sink_, 0); } } else if((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("float") == 0) && (output_item_type_.compare("gr_complex") == 0)) { if (dump_) { top_block->connect(freq_xlating_fir_filter_fcf_, 0, file_sink_, 0); } } else if((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("short") == 0) && (output_item_type_.compare("gr_complex") == 0)) { if (dump_) { top_block->connect(freq_xlating_fir_filter_scf_, 0, file_sink_, 0); } } else if((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("short") == 0) && (output_item_type_.compare("cshort") == 0)) { top_block->connect(freq_xlating_fir_filter_scf_, 0, complex_to_float_, 0); top_block->connect(complex_to_float_, 0, float_to_short_1_, 0); top_block->connect(complex_to_float_, 1, float_to_short_2_, 0); top_block->connect(float_to_short_1_, 0, short_x2_to_cshort_, 0); top_block->connect(float_to_short_2_, 0, short_x2_to_cshort_, 0); if (dump_) { top_block->connect(short_x2_to_cshort_, 0, file_sink_, 0); } } else if((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("byte") == 0) && (output_item_type_.compare("gr_complex") == 0)) { top_block->connect(gr_char_to_short_, 0, freq_xlating_fir_filter_scf_, 0); if (dump_) { top_block->connect(freq_xlating_fir_filter_scf_, 0, file_sink_, 0); } } else if((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("byte") == 0) && (output_item_type_.compare("cbyte") == 0)) { top_block->connect(gr_char_to_short_, 0, freq_xlating_fir_filter_scf_, 0); top_block->connect(freq_xlating_fir_filter_scf_, 0, complex_to_complex_byte_, 0); if (dump_) { top_block->connect(complex_to_complex_byte_, 0, file_sink_, 0); } } else { LOG(ERROR) << " Unknown input filter input/output item type conversion"; } } void FreqXlatingFirFilter::disconnect(gr::top_block_sptr top_block) { if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("gr_complex") == 0) && (output_item_type_.compare("gr_complex") == 0)) { if (dump_) { top_block->disconnect(freq_xlating_fir_filter_ccf_, 0, file_sink_, 0); } } else if((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("float") == 0) && (output_item_type_.compare("gr_complex") == 0)) { if (dump_) { top_block->disconnect(freq_xlating_fir_filter_fcf_, 0, file_sink_, 0); } } else if((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("short") == 0) && (output_item_type_.compare("gr_complex") == 0)) { if (dump_) { top_block->disconnect(freq_xlating_fir_filter_scf_, 0, file_sink_, 0); } } else if((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("short") == 0) && (output_item_type_.compare("cshort") == 0)) { top_block->disconnect(freq_xlating_fir_filter_scf_, 0, complex_to_float_, 0); top_block->disconnect(complex_to_float_, 0, float_to_short_1_, 0); top_block->disconnect(complex_to_float_, 1, float_to_short_2_, 0); top_block->disconnect(float_to_short_1_, 0, short_x2_to_cshort_, 0); top_block->disconnect(float_to_short_2_, 0, short_x2_to_cshort_, 0); if (dump_) { top_block->disconnect(short_x2_to_cshort_, 0, file_sink_, 0); } } else if((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("byte") == 0) && (output_item_type_.compare("gr_complex") == 0)) { top_block->disconnect(gr_char_to_short_, 0, freq_xlating_fir_filter_scf_, 0); if (dump_) { top_block->disconnect(freq_xlating_fir_filter_scf_, 0, file_sink_, 0); } } else if((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("byte") == 0) && (output_item_type_.compare("cbyte") == 0)) { top_block->disconnect(gr_char_to_short_, 0, freq_xlating_fir_filter_scf_, 0); top_block->disconnect(freq_xlating_fir_filter_scf_, 0, complex_to_complex_byte_, 0); if (dump_) { top_block->disconnect(complex_to_complex_byte_, 0, file_sink_, 0); } } else { LOG(ERROR) << " Unknown input filter input/output item type conversion"; } } gr::basic_block_sptr FreqXlatingFirFilter::get_left_block() { if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("gr_complex") == 0) && (output_item_type_.compare("gr_complex") == 0)) { return freq_xlating_fir_filter_ccf_; } else if((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("float") == 0) && (output_item_type_.compare("gr_complex") == 0)) { return freq_xlating_fir_filter_fcf_; } else if((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("short") == 0) && (output_item_type_.compare("gr_complex") == 0)) { return freq_xlating_fir_filter_scf_; } else if((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("short") == 0) && (output_item_type_.compare("cshort") == 0)) { return freq_xlating_fir_filter_scf_; } else if((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("byte") == 0) && (output_item_type_.compare("gr_complex") == 0)) { return gr_char_to_short_; } else if((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("byte") == 0) && (output_item_type_.compare("cbyte") == 0)) { return gr_char_to_short_; } else { return nullptr; LOG(ERROR) << " Unknown input filter input/output item type conversion"; } } gr::basic_block_sptr FreqXlatingFirFilter::get_right_block() { if ((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("gr_complex") == 0) && (output_item_type_.compare("gr_complex") == 0)) { return freq_xlating_fir_filter_ccf_; } else if((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("float") == 0) && (output_item_type_.compare("gr_complex") == 0)) { return freq_xlating_fir_filter_fcf_; } else if((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("short") == 0) && (output_item_type_.compare("gr_complex") == 0)) { return freq_xlating_fir_filter_scf_; } else if((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("short") == 0) && (output_item_type_.compare("cshort") == 0)) { return short_x2_to_cshort_; } else if((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("byte") == 0) && (output_item_type_.compare("gr_complex") == 0)) { return freq_xlating_fir_filter_scf_; } else if((taps_item_type_.compare("float") == 0) && (input_item_type_.compare("byte") == 0) && (output_item_type_.compare("cbyte") == 0)) { return complex_to_complex_byte_; } else { return nullptr; LOG(ERROR) << " Unknown input filter input/output item type conversion"; } } void FreqXlatingFirFilter::init() { std::string default_input_item_type = "gr_complex"; std::string default_output_item_type = "gr_complex"; std::string default_taps_item_type = "float"; std::string default_dump_filename = "../data/input_filter.dat"; double default_intermediate_freq = 0; double default_sampling_freq = 4000000; int default_number_of_taps = 6; unsigned int default_number_of_bands = 2; std::vector default_bands = { 0.0, 0.4, 0.6, 1.0 }; std::vector default_ampl = { 1.0, 1.0, 0.0, 0.0 }; std::vector default_error_w = { 1.0, 1.0 }; std::string default_filter_type = "bandpass"; int default_grid_density = 16; DLOG(INFO) << "role " << role_; input_item_type_ = config_->property(role_ + ".input_item_type", default_input_item_type); output_item_type_ = config_->property(role_ + ".output_item_type", default_output_item_type); taps_item_type_ = config_->property(role_ + ".taps_item_type", default_taps_item_type); dump_ = config_->property(role_ + ".dump", false); dump_filename_ = config_->property(role_ + ".dump_filename", default_dump_filename); intermediate_freq_ = config_->property(role_ + ".IF", default_intermediate_freq); sampling_freq_ = config_->property(role_ + ".sampling_frequency", default_sampling_freq); int number_of_taps = config_->property(role_ + ".number_of_taps", default_number_of_taps); unsigned int number_of_bands = config_->property(role_ + ".number_of_bands", default_number_of_bands); std::vector bands; std::vector ampl; std::vector error_w; std::string option; double option_value; for (unsigned int i = 0; i < number_of_bands; i++) { option = ".band" + boost::lexical_cast(i + 1) + "_begin"; option_value = config_->property(role_ + option, default_bands[i]); bands.push_back(option_value); option = ".band" + boost::lexical_cast(i + 1) + "_end"; option_value = config_->property(role_ + option, default_bands[i]); bands.push_back(option_value); option = ".ampl" + boost::lexical_cast(i + 1) + "_begin"; option_value = config_->property(role_ + option, default_bands[i]); ampl.push_back(option_value); option = ".ampl" + boost::lexical_cast(i + 1) + "_end"; option_value = config_->property(role_ + option, default_bands[i]); ampl.push_back(option_value); option = ".band" + boost::lexical_cast(i + 1) + "_error"; option_value = config_->property(role_ + option, default_bands[i]); error_w.push_back(option_value); } std::string filter_type = config_->property(role_ + ".filter_type", default_filter_type); int grid_density = config_->property(role_ + ".grid_density", default_grid_density); std::vector taps_d = gr::filter::pm_remez(number_of_taps - 1, bands, ampl, error_w, filter_type, grid_density); taps_.reserve(taps_d.size()); for (std::vector::iterator it = taps_d.begin(); it != taps_d.end(); it++) { taps_.push_back(float(*it)); //std::cout<<"TAP="<. * * ------------------------------------------------------------------------- */ #ifndef GNSS_SDR_FREQ_XLATING_FIR_FILTER_H_ #define GNSS_SDR_FREQ_XLATING_FIR_FILTER_H_ #include #include #include #include #include #include #include #include #include #include "gnss_block_interface.h" #include "short_x2_to_cshort.h" #include "complex_float_to_complex_byte.h" class ConfigurationInterface; /*! * \brief This class adapts a gnuradio gr_freq_xlating_fir_filter designed with pm_remez * * Construct a FIR filter with the given taps and a composite frequency * translation that shifts intermediate_freq_ down to zero Hz. The frequency * translation logically comes before the filtering operation. * * See Parks-McClellan FIR filter design, http://en.wikipedia.org/wiki/Parks-McClellan_filter_design_algorithm * Calculates the optimal (in the Chebyshev/minimax sense) FIR filter impulse response * given a set of band edges, the desired response on those bands, and the weight given * to the error in those bands. */ class FreqXlatingFirFilter: public GNSSBlockInterface { public: FreqXlatingFirFilter(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~FreqXlatingFirFilter(); std::string role() { return role_; } //! Returns "Freq_Xlating_Fir_Filter" std::string implementation() { return "Freq_Xlating_Fir_Filter"; } size_t item_size() { return 0; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); private: gr::filter::freq_xlating_fir_filter_ccf::sptr freq_xlating_fir_filter_ccf_; gr::filter::freq_xlating_fir_filter_fcf::sptr freq_xlating_fir_filter_fcf_; gr::filter::freq_xlating_fir_filter_scf::sptr freq_xlating_fir_filter_scf_; ConfigurationInterface* config_; bool dump_; std::string dump_filename_; std::string input_item_type_; size_t input_size_; std::string output_item_type_; std::string taps_item_type_; std::vector taps_; double intermediate_freq_; double sampling_freq_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; gr::blocks::file_sink::sptr file_sink_; gr::blocks::complex_to_float::sptr complex_to_float_; gr::blocks::char_to_short::sptr gr_char_to_short_; gr::blocks::float_to_short::sptr float_to_short_1_; gr::blocks::float_to_short::sptr float_to_short_2_; short_x2_to_cshort_sptr short_x2_to_cshort_; complex_float_to_complex_byte_sptr complex_to_complex_byte_; void init(); }; #endif // GNSS_SDR_FREQ_XLATING_FIR_FILTER_H_ gnss-sdr-0.0.9/src/algorithms/input_filter/gnuradio_blocks/000077500000000000000000000000001305042567700241025ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/input_filter/gnuradio_blocks/CMakeLists.txt000066400000000000000000000024371305042567700266500ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # set(INPUT_FILTER_GR_BLOCKS_SOURCES beamformer.cc ) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ${GNURADIO_BLOCKS_INCLUDE_DIRS} ) file(GLOB INPUT_FILTER_GR_BLOCKS_HEADERS "*.h") list(SORT INPUT_FILTER_GR_BLOCKS_HEADERS) add_library(input_filter_gr_blocks ${INPUT_FILTER_GR_BLOCKS_SOURCES} ${INPUT_FILTER_GR_BLOCKS_HEADERS}) source_group(Headers FILES ${INPUT_FILTER_GR_BLOCKS_HEADERS}) target_link_libraries(input_filter_gr_blocks ${GNURADIO_RUNTIME_LIBRARIES}) gnss-sdr-0.0.9/src/algorithms/input_filter/gnuradio_blocks/beamformer.cc000066400000000000000000000057361305042567700265430ustar00rootroot00000000000000/*! * \file beamformer.cc * * \brief Unpacks byte samples to NSR 2 bits samples * \author Javier Arribas jarribas (at) cttc.es * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "beamformer.h" #include #include #include #define GNSS_SDR_BEAMFORMER_CHANNELS 8 beamformer_sptr make_beamformer() { return beamformer_sptr(new beamformer()); } beamformer::beamformer() : gr::sync_block("beamformer", gr::io_signature::make(GNSS_SDR_BEAMFORMER_CHANNELS, GNSS_SDR_BEAMFORMER_CHANNELS,sizeof(gr_complex)), gr::io_signature::make(1, 1,sizeof(gr_complex))) { //initialize weight vector if (posix_memalign((void**)&weight_vector, 16, GNSS_SDR_BEAMFORMER_CHANNELS * sizeof(gr_complex)) == 0){}; for (int i = 0; i< GNSS_SDR_BEAMFORMER_CHANNELS; i++) { weight_vector[i]=gr_complex(1,0); } } beamformer::~beamformer() { free(weight_vector); } int beamformer::work(int noutput_items,gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { gr_complex *out = (gr_complex *) output_items[0]; // channel output buffers // gr_complex *ch1 = (gr_complex *) input_items[0]; // gr_complex *ch2 = (gr_complex *) input_items[1]; // gr_complex *ch3 = (gr_complex *) input_items[2]; // gr_complex *ch4 = (gr_complex *) input_items[3]; // gr_complex *ch5 = (gr_complex *) input_items[4]; // gr_complex *ch6 = (gr_complex *) input_items[5]; // gr_complex *ch7 = (gr_complex *) input_items[6]; // gr_complex *ch8 = (gr_complex *) input_items[7]; // NON-VOLK beamforming operation //TODO: Implement VOLK SIMD-accelerated beamformer! gr_complex sum; for(int n = 0; n < noutput_items; n++) { sum = gr_complex(0,0); for (int i = 0; i < GNSS_SDR_BEAMFORMER_CHANNELS; i++) { sum = sum + ((gr_complex*)input_items[i])[n] * weight_vector[i]; } out[n] = sum; } return noutput_items; } gnss-sdr-0.0.9/src/algorithms/input_filter/gnuradio_blocks/beamformer.h000066400000000000000000000035161305042567700263770ustar00rootroot00000000000000/*! * \file beamformer.h * * \brief Simple spatial filter using RAW array input and beamforming coefficients * \author Javier Arribas jarribas (at) cttc.es * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_BEAMFORMER_H #define GNSS_SDR_BEAMFORMER_H #include class beamformer; typedef boost::shared_ptr beamformer_sptr; beamformer_sptr make_beamformer(); /*! * \brief This class implements a real-time software-defined spatial filter using the CTTC GNSS experimental antenna array input and a set of dynamically reloadable weights */ class beamformer: public gr::sync_block { private: friend beamformer_sptr make_beamformer_sptr(); gr_complex* weight_vector; public: beamformer(); ~beamformer(); int work (int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; #endif gnss-sdr-0.0.9/src/algorithms/libs/000077500000000000000000000000001305042567700171625ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/CMakeLists.txt000066400000000000000000000054161305042567700217300ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # set(GNSS_SPLIBS_SOURCES gps_l2c_signal.cc galileo_e1_signal_processing.cc gnss_sdr_valve.cc gnss_signal_processing.cc gps_sdr_signal_processing.cc pass_through.cc galileo_e5_signal_processing.cc complex_byte_to_float_x2.cc byte_x2_to_complex_byte.cc cshort_to_float_x2.cc short_x2_to_cshort.cc complex_float_to_complex_byte.cc ) if(OPENCL_FOUND) set(GNSS_SPLIBS_SOURCES ${GNSS_SPLIBS_SOURCES} fft_execute.cc # Needs OpenCL fft_setup.cc # Needs OpenCL fft_kernelstring.cc # Needs OpenCL ) endif(OPENCL_FOUND) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/receiver ${CMAKE_SOURCE_DIR}/src/core/interfaces ${Boost_INCLUDE_DIRS} ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ${GNURADIO_BLOCKS_INCLUDE_DIRS} ${VOLK_INCLUDE_DIRS} ${VOLK_GNSSSDR_INCLUDE_DIRS} ) if(OPENCL_FOUND) include_directories( ${OPENCL_INCLUDE_DIRS} ) if(OS_IS_MACOSX) set(OPT_LIBRARIES ${OPT_LIBRARIES} "-framework OpenCL") else(OS_IS_MACOSX) set(OPT_LIBRARIES ${OPT_LIBRARIES} ${OPENCL_LIBRARIES}) endif(OS_IS_MACOSX) endif(OPENCL_FOUND) file(GLOB GNSS_SPLIBS_HEADERS "*.h") list(SORT GNSS_SPLIBS_HEADERS) add_library(gnss_sp_libs ${GNSS_SPLIBS_SOURCES} ${GNSS_SPLIBS_HEADERS}) source_group(Headers FILES ${GNSS_SPLIBS_HEADERS}) target_link_libraries(gnss_sp_libs ${GNURADIO_RUNTIME_LIBRARIES} ${VOLK_LIBRARIES} ${ORC_LIBRARIES} ${VOLK_GNSSSDR_LIBRARIES} ${ORC_LIBRARIES} ${GNURADIO_BLOCKS_LIBRARIES} ${GNURADIO_FFT_LIBRARIES} ${GNURADIO_FILTER_LIBRARIES} ${OPT_LIBRARIES} gnss_rx ) if(NOT VOLK_GNSSSDR_FOUND) add_dependencies(gnss_sp_libs volk_gnsssdr_module) endif(NOT VOLK_GNSSSDR_FOUND) gnss-sdr-0.0.9/src/algorithms/libs/byte_x2_to_complex_byte.cc000066400000000000000000000050601305042567700243220ustar00rootroot00000000000000/*! * \file byte_x2_to_complex_byte.cc * \brief Adapts two signed char streams into a std::complex stream * \author Carles Fernandez Prades, cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "byte_x2_to_complex_byte.h" #include #include byte_x2_to_complex_byte_sptr make_byte_x2_to_complex_byte() { return byte_x2_to_complex_byte_sptr(new byte_x2_to_complex_byte()); } byte_x2_to_complex_byte::byte_x2_to_complex_byte() : sync_block("byte_x2_to_complex_byte", gr::io_signature::make (2, 2, sizeof(int8_t)), // int8_t, defined in stdint.h and included in volk.h (signed char) gr::io_signature::make (1, 1, sizeof(lv_8sc_t))) // lv_8sc_t is a Volk's typedef for std::complex { const int alignment_multiple = volk_get_alignment() / sizeof(lv_8sc_t); set_alignment(std::max(1, alignment_multiple)); } int byte_x2_to_complex_byte::work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { const int8_t *in0 = (const int8_t *) input_items[0]; const int8_t *in1 = (const int8_t *) input_items[1]; lv_8sc_t *out = (lv_8sc_t *) output_items[0]; // This could be put into a volk kernel int8_t real_part; int8_t imag_part; for(int number = 0; number < noutput_items; number++) { // lv_cmake(r, i) defined at volk/volk_complex.h real_part = *in0++; imag_part = *in1++; *out++ = lv_cmake(real_part, imag_part); } return noutput_items; } gnss-sdr-0.0.9/src/algorithms/libs/byte_x2_to_complex_byte.h000066400000000000000000000036261305042567700241720ustar00rootroot00000000000000/*! * \file byte_x2_to_complex_byte.h * \brief Adapts two signed char streams into a std::complex stream * \author Carles Fernandez Prades, cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_BYTE_X2_TO_COMPLEX_BYTE_H_ #define GNSS_SDR_BYTE_X2_TO_COMPLEX_BYTE_H_ #include #include class byte_x2_to_complex_byte; typedef boost::shared_ptr byte_x2_to_complex_byte_sptr; byte_x2_to_complex_byte_sptr make_byte_x2_to_complex_byte(); /*! * \brief This class adapts two signed char streams * into a std::complex stream */ class byte_x2_to_complex_byte : public gr::sync_block { private: friend byte_x2_to_complex_byte_sptr make_byte_x2_to_complex_byte(); public: byte_x2_to_complex_byte(); int work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; #endif gnss-sdr-0.0.9/src/algorithms/libs/cl.hpp000066400000000000000000010352431305042567700203010ustar00rootroot00000000000000/******************************************************************************* * Copyright (c) 2008-2013 The Khronos Group Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and/or associated documentation files (the * "Materials"), to deal in the Materials without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Materials, and to * permit persons to whom the Materials are furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Materials. * * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. ******************************************************************************/ /*! \file * * \brief C++ bindings for OpenCL 1.0 (rev 48), OpenCL 1.1 (rev 33) and * OpenCL 1.2 (rev 15) * \author Benedict R. Gaster, Laurent Morichetti and Lee Howes * * Additions and fixes from: * Brian Cole, March 3rd 2010 and April 2012 * Matt Gruenke, April 2012. * Bruce Merry, February 2013. * * \version 1.2.5 * \date June 2013 * * Optional extension support * * cl * cl_ext_device_fission * #define USE_CL_DEVICE_FISSION */ /*! \mainpage * \section intro Introduction * For many large applications C++ is the language of choice and so it seems * reasonable to define C++ bindings for OpenCL. * * * The interface is contained with a single C++ header file \em cl.hpp and all * definitions are contained within the namespace \em cl. There is no additional * requirement to include \em cl.h and to use either the C++ or original C * bindings it is enough to simply include \em cl.hpp. * * The bindings themselves are lightweight and correspond closely to the * underlying C API. Using the C++ bindings introduces no additional execution * overhead. * * For detail documentation on the bindings see: * * The OpenCL C++ Wrapper API 1.2 (revision 09) * http://www.khronos.org/registry/cl/specs/opencl-cplusplus-1.2.pdf * * \section example Example * * The following example shows a general use case for the C++ * bindings, including support for the optional exception feature and * also the supplied vector and string classes, see following sections for * decriptions of these features. * * \code * #define __CL_ENABLE_EXCEPTIONS * * #if defined(__APPLE__) || defined(__MACOSX) * #include * #else * #include * #endif * #include * #include * #include * * const char * helloStr = "__kernel void " * "hello(void) " * "{ " * " " * "} "; * * int * main(void) * { * cl_int err = CL_SUCCESS; * try { * * std::vector platforms; * cl::Platform::get(&platforms); * if (platforms.size() == 0) { * std::cout << "Platform size 0\n"; * return -1; * } * * cl_context_properties properties[] = * { CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[0])(), 0}; * cl::Context context(CL_DEVICE_TYPE_CPU, properties); * * std::vector devices = context.getInfo(); * * cl::Program::Sources source(1, * std::make_pair(helloStr,strlen(helloStr))); * cl::Program program_ = cl::Program(context, source); * program_.build(devices); * * cl::Kernel kernel(program_, "hello", &err); * * cl::Event event; * cl::CommandQueue queue(context, devices[0], 0, &err); * queue.enqueueNDRangeKernel( * kernel, * cl::NullRange, * cl::NDRange(4,4), * cl::NullRange, * NULL, * &event); * * event.wait(); * } * catch (cl::Error err) { * std::cerr * << "ERROR: " * << err.what() * << "(" * << err.err() * << ")" * << std::endl; * } * * return EXIT_SUCCESS; * } * * \endcode * */ #ifndef CL_HPP_ #define CL_HPP_ #ifdef _WIN32 #include #include #include #include #if defined(__CL_ENABLE_EXCEPTIONS) #include #endif // #if defined(__CL_ENABLE_EXCEPTIONS) #pragma push_macro("max") #undef max #if defined(USE_DX_INTEROP) #include #include #endif #endif // _WIN32 // #if defined(USE_CL_DEVICE_FISSION) #include #endif #if defined(__APPLE__) || defined(__MACOSX) #include #include #include #else #include #include #endif // !__APPLE__ // To avoid accidentally taking ownership of core OpenCL types // such as cl_kernel constructors are made explicit // under OpenCL 1.2 #if defined(CL_VERSION_1_2) && !defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) #define __CL_EXPLICIT_CONSTRUCTORS explicit #else // #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) #define __CL_EXPLICIT_CONSTRUCTORS #endif // #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) // Define deprecated prefixes and suffixes to ensure compilation // in case they are not pre-defined #if !defined(CL_EXT_PREFIX__VERSION_1_1_DEPRECATED) #define CL_EXT_PREFIX__VERSION_1_1_DEPRECATED #endif // #if !defined(CL_EXT_PREFIX__VERSION_1_1_DEPRECATED) #if !defined(CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED) #define CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED #endif // #if !defined(CL_EXT_PREFIX__VERSION_1_1_DEPRECATED) #if !defined(CL_CALLBACK) #define CL_CALLBACK #endif //CL_CALLBACK #include #include #if !defined(__NO_STD_VECTOR) #include #endif #if !defined(__NO_STD_STRING) #include #endif #if defined(linux) || defined(__APPLE__) || defined(__MACOSX) #include #include #include #endif // linux #include /*! \namespace cl * * \brief The OpenCL C++ bindings are defined within this namespace. * */ namespace cl { class Memory; /** * Deprecated APIs for 1.2 */ #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2)) #define __INIT_CL_EXT_FCN_PTR(name) \ if(!pfn_##name) { \ pfn_##name = (PFN_##name) \ clGetExtensionFunctionAddress(#name); \ if(!pfn_##name) { \ } \ } #endif // #if defined(CL_VERSION_1_1) #if defined(CL_VERSION_1_2) #define __INIT_CL_EXT_FCN_PTR_PLATFORM(platform, name) \ if(!pfn_##name) { \ pfn_##name = (PFN_##name) \ clGetExtensionFunctionAddressForPlatform(platform, #name); \ if(!pfn_##name) { \ } \ } #endif // #if defined(CL_VERSION_1_1) class Program; class Device; class Context; class CommandQueue; class Memory; class Buffer; #if defined(__CL_ENABLE_EXCEPTIONS) /*! \brief Exception class * * This may be thrown by API functions when __CL_ENABLE_EXCEPTIONS is defined. */ class Error : public std::exception { private: cl_int err_; const char * errStr_; public: /*! \brief Create a new CL error exception for a given error code * and corresponding message. * * \param err error code value. * * \param errStr a descriptive string that must remain in scope until * handling of the exception has concluded. If set, it * will be returned by what(). */ Error(cl_int err, const char * errStr = NULL) : err_(err), errStr_(errStr) {} ~Error() throw() {} /*! \brief Get error string associated with exception * * \return A memory pointer to the error message string. */ virtual const char * what() const throw () { if (errStr_ == NULL) { return "empty"; } else { return errStr_; } } /*! \brief Get error code associated with exception * * \return The error code. */ cl_int err(void) const { return err_; } }; #define __ERR_STR(x) #x #else #define __ERR_STR(x) NULL #endif // __CL_ENABLE_EXCEPTIONS namespace detail { #if defined(__CL_ENABLE_EXCEPTIONS) static inline cl_int errHandler ( cl_int err, const char * errStr = NULL) { if (err != CL_SUCCESS) { throw Error(err, errStr); } return err; } #else static inline cl_int errHandler (cl_int err, const char * errStr = NULL) { (void) errStr; // suppress unused variable warning return err; } #endif // __CL_ENABLE_EXCEPTIONS } //! \cond DOXYGEN_DETAIL #if !defined(__CL_USER_OVERRIDE_ERROR_STRINGS) #define __GET_DEVICE_INFO_ERR __ERR_STR(clGetDeviceInfo) #define __GET_PLATFORM_INFO_ERR __ERR_STR(clGetPlatformInfo) #define __GET_DEVICE_IDS_ERR __ERR_STR(clGetDeviceIDs) #define __GET_PLATFORM_IDS_ERR __ERR_STR(clGetPlatformIDs) #define __GET_CONTEXT_INFO_ERR __ERR_STR(clGetContextInfo) #define __GET_EVENT_INFO_ERR __ERR_STR(clGetEventInfo) #define __GET_EVENT_PROFILE_INFO_ERR __ERR_STR(clGetEventProfileInfo) #define __GET_MEM_OBJECT_INFO_ERR __ERR_STR(clGetMemObjectInfo) #define __GET_IMAGE_INFO_ERR __ERR_STR(clGetImageInfo) #define __GET_SAMPLER_INFO_ERR __ERR_STR(clGetSamplerInfo) #define __GET_KERNEL_INFO_ERR __ERR_STR(clGetKernelInfo) #if defined(CL_VERSION_1_2) #define __GET_KERNEL_ARG_INFO_ERR __ERR_STR(clGetKernelArgInfo) #endif // #if defined(CL_VERSION_1_2) #define __GET_KERNEL_WORK_GROUP_INFO_ERR __ERR_STR(clGetKernelWorkGroupInfo) #define __GET_PROGRAM_INFO_ERR __ERR_STR(clGetProgramInfo) #define __GET_PROGRAM_BUILD_INFO_ERR __ERR_STR(clGetProgramBuildInfo) #define __GET_COMMAND_QUEUE_INFO_ERR __ERR_STR(clGetCommandQueueInfo) #define __CREATE_CONTEXT_ERR __ERR_STR(clCreateContext) #define __CREATE_CONTEXT_FROM_TYPE_ERR __ERR_STR(clCreateContextFromType) #define __GET_SUPPORTED_IMAGE_FORMATS_ERR __ERR_STR(clGetSupportedImageFormats) #define __CREATE_BUFFER_ERR __ERR_STR(clCreateBuffer) #define __COPY_ERR __ERR_STR(cl::copy) #define __CREATE_SUBBUFFER_ERR __ERR_STR(clCreateSubBuffer) #define __CREATE_GL_BUFFER_ERR __ERR_STR(clCreateFromGLBuffer) #define __CREATE_GL_RENDER_BUFFER_ERR __ERR_STR(clCreateFromGLBuffer) #define __GET_GL_OBJECT_INFO_ERR __ERR_STR(clGetGLObjectInfo) #if defined(CL_VERSION_1_2) #define __CREATE_IMAGE_ERR __ERR_STR(clCreateImage) #define __CREATE_GL_TEXTURE_ERR __ERR_STR(clCreateFromGLTexture) #define __IMAGE_DIMENSION_ERR __ERR_STR(Incorrect image dimensions) #endif // #if defined(CL_VERSION_1_2) #define __CREATE_SAMPLER_ERR __ERR_STR(clCreateSampler) #define __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR __ERR_STR(clSetMemObjectDestructorCallback) #define __CREATE_USER_EVENT_ERR __ERR_STR(clCreateUserEvent) #define __SET_USER_EVENT_STATUS_ERR __ERR_STR(clSetUserEventStatus) #define __SET_EVENT_CALLBACK_ERR __ERR_STR(clSetEventCallback) #define __WAIT_FOR_EVENTS_ERR __ERR_STR(clWaitForEvents) #define __CREATE_KERNEL_ERR __ERR_STR(clCreateKernel) #define __SET_KERNEL_ARGS_ERR __ERR_STR(clSetKernelArg) #define __CREATE_PROGRAM_WITH_SOURCE_ERR __ERR_STR(clCreateProgramWithSource) #define __CREATE_PROGRAM_WITH_BINARY_ERR __ERR_STR(clCreateProgramWithBinary) #if defined(CL_VERSION_1_2) #define __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR __ERR_STR(clCreateProgramWithBuiltInKernels) #endif // #if defined(CL_VERSION_1_2) #define __BUILD_PROGRAM_ERR __ERR_STR(clBuildProgram) #if defined(CL_VERSION_1_2) #define __COMPILE_PROGRAM_ERR __ERR_STR(clCompileProgram) #endif // #if defined(CL_VERSION_1_2) #define __CREATE_KERNELS_IN_PROGRAM_ERR __ERR_STR(clCreateKernelsInProgram) #define __CREATE_COMMAND_QUEUE_ERR __ERR_STR(clCreateCommandQueue) #define __SET_COMMAND_QUEUE_PROPERTY_ERR __ERR_STR(clSetCommandQueueProperty) #define __ENQUEUE_READ_BUFFER_ERR __ERR_STR(clEnqueueReadBuffer) #define __ENQUEUE_READ_BUFFER_RECT_ERR __ERR_STR(clEnqueueReadBufferRect) #define __ENQUEUE_WRITE_BUFFER_ERR __ERR_STR(clEnqueueWriteBuffer) #define __ENQUEUE_WRITE_BUFFER_RECT_ERR __ERR_STR(clEnqueueWriteBufferRect) #define __ENQEUE_COPY_BUFFER_ERR __ERR_STR(clEnqueueCopyBuffer) #define __ENQEUE_COPY_BUFFER_RECT_ERR __ERR_STR(clEnqueueCopyBufferRect) #define __ENQUEUE_FILL_BUFFER_ERR __ERR_STR(clEnqueueFillBuffer) #define __ENQUEUE_READ_IMAGE_ERR __ERR_STR(clEnqueueReadImage) #define __ENQUEUE_WRITE_IMAGE_ERR __ERR_STR(clEnqueueWriteImage) #define __ENQUEUE_COPY_IMAGE_ERR __ERR_STR(clEnqueueCopyImage) #define __ENQUEUE_FILL_IMAGE_ERR __ERR_STR(clEnqueueFillImage) #define __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR __ERR_STR(clEnqueueCopyImageToBuffer) #define __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR __ERR_STR(clEnqueueCopyBufferToImage) #define __ENQUEUE_MAP_BUFFER_ERR __ERR_STR(clEnqueueMapBuffer) #define __ENQUEUE_MAP_IMAGE_ERR __ERR_STR(clEnqueueMapImage) #define __ENQUEUE_UNMAP_MEM_OBJECT_ERR __ERR_STR(clEnqueueUnMapMemObject) #define __ENQUEUE_NDRANGE_KERNEL_ERR __ERR_STR(clEnqueueNDRangeKernel) #define __ENQUEUE_TASK_ERR __ERR_STR(clEnqueueTask) #define __ENQUEUE_NATIVE_KERNEL __ERR_STR(clEnqueueNativeKernel) #if defined(CL_VERSION_1_2) #define __ENQUEUE_MIGRATE_MEM_OBJECTS_ERR __ERR_STR(clEnqueueMigrateMemObjects) #endif // #if defined(CL_VERSION_1_2) #define __ENQUEUE_ACQUIRE_GL_ERR __ERR_STR(clEnqueueAcquireGLObjects) #define __ENQUEUE_RELEASE_GL_ERR __ERR_STR(clEnqueueReleaseGLObjects) #define __RETAIN_ERR __ERR_STR(Retain Object) #define __RELEASE_ERR __ERR_STR(Release Object) #define __FLUSH_ERR __ERR_STR(clFlush) #define __FINISH_ERR __ERR_STR(clFinish) #define __VECTOR_CAPACITY_ERR __ERR_STR(Vector capacity error) /** * CL 1.2 version that uses device fission. */ #if defined(CL_VERSION_1_2) #define __CREATE_SUB_DEVICES __ERR_STR(clCreateSubDevices) #else #define __CREATE_SUB_DEVICES __ERR_STR(clCreateSubDevicesEXT) #endif // #if defined(CL_VERSION_1_2) /** * Deprecated APIs for 1.2 */ #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2)) #define __ENQUEUE_MARKER_ERR __ERR_STR(clEnqueueMarker) #define __ENQUEUE_WAIT_FOR_EVENTS_ERR __ERR_STR(clEnqueueWaitForEvents) #define __ENQUEUE_BARRIER_ERR __ERR_STR(clEnqueueBarrier) #define __UNLOAD_COMPILER_ERR __ERR_STR(clUnloadCompiler) #define __CREATE_GL_TEXTURE_2D_ERR __ERR_STR(clCreateFromGLTexture2D) #define __CREATE_GL_TEXTURE_3D_ERR __ERR_STR(clCreateFromGLTexture3D) #define __CREATE_IMAGE2D_ERR __ERR_STR(clCreateImage2D) #define __CREATE_IMAGE3D_ERR __ERR_STR(clCreateImage3D) #endif // #if defined(CL_VERSION_1_1) #endif // __CL_USER_OVERRIDE_ERROR_STRINGS //! \endcond /** * CL 1.2 marker and barrier commands */ #if defined(CL_VERSION_1_2) #define __ENQUEUE_MARKER_WAIT_LIST_ERR __ERR_STR(clEnqueueMarkerWithWaitList) #define __ENQUEUE_BARRIER_WAIT_LIST_ERR __ERR_STR(clEnqueueBarrierWithWaitList) #endif // #if defined(CL_VERSION_1_2) #if !defined(__USE_DEV_STRING) && !defined(__NO_STD_STRING) typedef std::string STRING_CLASS; #elif !defined(__USE_DEV_STRING) /*! \class string * \brief Simple string class, that provides a limited subset of std::string * functionality but avoids many of the issues that come with that class. * \note Deprecated. Please use std::string as default or * re-define the string class to match the std::string * interface by defining STRING_CLASS */ class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED string CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED { private: ::size_t size_; char * str_; public: //! \brief Constructs an empty string, allocating no memory. string(void) : size_(0), str_(NULL) { } /*! \brief Constructs a string populated from an arbitrary value of * specified size. * * An extra '\0' is added, in case none was contained in str. * * \param str the initial value of the string instance. Note that '\0' * characters receive no special treatment. If NULL, * the string is left empty, with a size of 0. * * \param size the number of characters to copy from str. */ string(const char * str, ::size_t size) : size_(size), str_(NULL) { if( size > 0 ) { str_ = new char[size_+1]; if (str_ != NULL) { memcpy(str_, str, size_ * sizeof(char)); str_[size_] = '\0'; } else { size_ = 0; } } } /*! \brief Constructs a string populated from a null-terminated value. * * \param str the null-terminated initial value of the string instance. * If NULL, the string is left empty, with a size of 0. */ string(const char * str) : size_(0), str_(NULL) { if( str ) { size_= ::strlen(str); } if( size_ > 0 ) { str_ = new char[size_ + 1]; if (str_ != NULL) { memcpy(str_, str, (size_ + 1) * sizeof(char)); } } } void resize( ::size_t n ) { if( size_ == n ) { return; } if (n == 0) { if( str_ ) { delete [] str_; } str_ = NULL; size_ = 0; } else { char *newString = new char[n + 1]; int copySize = n; if( size_ < n ) { copySize = size_; } size_ = n; if(str_) { memcpy(newString, str_, (copySize + 1) * sizeof(char)); } if( copySize < size_ ) { memset(newString + copySize, 0, size_ - copySize); } newString[size_] = '\0'; delete [] str_; str_ = newString; } } const char& operator[] ( ::size_t pos ) const { return str_[pos]; } char& operator[] ( ::size_t pos ) { return str_[pos]; } /*! \brief Copies the value of another string to this one. * * \param rhs the string to copy. * * \returns a reference to the modified instance. */ string& operator=(const string& rhs) { if (this == &rhs) { return *this; } if( str_ != NULL ) { delete [] str_; str_ = NULL; size_ = 0; } if (rhs.size_ == 0 || rhs.str_ == NULL) { str_ = NULL; size_ = 0; } else { str_ = new char[rhs.size_ + 1]; size_ = rhs.size_; if (str_ != NULL) { memcpy(str_, rhs.str_, (size_ + 1) * sizeof(char)); } else { size_ = 0; } } return *this; } /*! \brief Constructs a string by copying the value of another instance. * * \param rhs the string to copy. */ string(const string& rhs) : size_(0), str_(NULL) { *this = rhs; } //! \brief Destructor - frees memory used to hold the current value. ~string() { delete[] str_; str_ = NULL; } //! \brief Queries the length of the string, excluding any added '\0's. ::size_t size(void) const { return size_; } //! \brief Queries the length of the string, excluding any added '\0's. ::size_t length(void) const { return size(); } /*! \brief Returns a pointer to the private copy held by this instance, * or "" if empty/unset. */ const char * c_str(void) const { return (str_) ? str_ : "";} }; typedef cl::string STRING_CLASS; #endif // #elif !defined(__USE_DEV_STRING) #if !defined(__USE_DEV_VECTOR) && !defined(__NO_STD_VECTOR) #define VECTOR_CLASS std::vector #elif !defined(__USE_DEV_VECTOR) #define VECTOR_CLASS cl::vector #if !defined(__MAX_DEFAULT_VECTOR_SIZE) #define __MAX_DEFAULT_VECTOR_SIZE 10 #endif /*! \class vector * \brief Fixed sized vector implementation that mirroring * * \note Deprecated. Please use std::vector as default or * re-define the vector class to match the std::vector * interface by defining VECTOR_CLASS * \note Not recommended for use with custom objects as * current implementation will construct N elements * * std::vector functionality. * \brief Fixed sized vector compatible with std::vector. * * \note * This differs from std::vector<> not just in memory allocation, * but also in terms of when members are constructed, destroyed, * and assigned instead of being copy constructed. * * \param T type of element contained in the vector. * * \param N maximum size of the vector. */ template class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED vector CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED { private: T data_[N]; unsigned int size_; public: //! \brief Constructs an empty vector with no memory allocated. vector() : size_(static_cast(0)) {} //! \brief Deallocates the vector's memory and destroys all of its elements. ~vector() { clear(); } //! \brief Returns the number of elements currently contained. unsigned int size(void) const { return size_; } /*! \brief Empties the vector of all elements. * \note * This does not deallocate memory but will invoke destructors * on contained elements. */ void clear() { while(!empty()) { pop_back(); } } /*! \brief Appends an element after the last valid element. * Calling this on a vector that has reached capacity will throw an * exception if exceptions are enabled. */ void push_back (const T& x) { if (size() < N) { new (&data_[size_]) T(x); size_++; } else { detail::errHandler(CL_MEM_OBJECT_ALLOCATION_FAILURE, __VECTOR_CAPACITY_ERR); } } /*! \brief Removes the last valid element from the vector. * Calling this on an empty vector will throw an exception * if exceptions are enabled. */ void pop_back(void) { if (size_ != 0) { --size_; data_[size_].~T(); } else { detail::errHandler(CL_MEM_OBJECT_ALLOCATION_FAILURE, __VECTOR_CAPACITY_ERR); } } /*! \brief Constructs with a value copied from another. * * \param vec the vector to copy. */ vector(const vector& vec) : size_(vec.size_) { if (size_ != 0) { assign(vec.begin(), vec.end()); } } /*! \brief Constructs with a specified number of initial elements. * * \param size number of initial elements. * * \param val value of initial elements. */ vector(unsigned int size, const T& val = T()) : size_(0) { for (unsigned int i = 0; i < size; i++) { push_back(val); } } /*! \brief Overwrites the current content with that copied from another * instance. * * \param rhs vector to copy. * * \returns a reference to this. */ vector& operator=(const vector& rhs) { if (this == &rhs) { return *this; } if (rhs.size_ != 0) { assign(rhs.begin(), rhs.end()); } else { clear(); } return *this; } /*! \brief Tests equality against another instance. * * \param vec the vector against which to compare. */ bool operator==(vector &vec) { if (size() != vec.size()) { return false; } for( unsigned int i = 0; i < size(); ++i ) { if( operator[](i) != vec[i] ) { return false; } } return true; } //! \brief Conversion operator to T*. operator T* () { return data_; } //! \brief Conversion operator to const T*. operator const T* () const { return data_; } //! \brief Tests whether this instance has any elements. bool empty (void) const { return size_==0; } //! \brief Returns the maximum number of elements this instance can hold. unsigned int max_size (void) const { return N; } //! \brief Returns the maximum number of elements this instance can hold. unsigned int capacity () const { return N; } /*! \brief Returns a reference to a given element. * * \param index which element to access. * * \note * The caller is responsible for ensuring index is >= 0 and < size(). */ T& operator[](int index) { return data_[index]; } /*! \brief Returns a const reference to a given element. * * \param index which element to access. * * \note * The caller is responsible for ensuring index is >= 0 and < size(). */ const T& operator[](int index) const { return data_[index]; } /*! \brief Assigns elements of the vector based on a source iterator range. * * \param start Beginning iterator of source range * \param end Enditerator of source range * * \note * Will throw an exception if exceptions are enabled and size exceeded. */ template void assign(I start, I end) { clear(); while(start != end) { push_back(*start); start++; } } /*! \class iterator * \brief Const iterator class for vectors */ class iterator { private: const vector *vec_; int index_; /** * Internal iterator constructor to capture reference * to the vector it iterates over rather than taking * the vector by copy. */ iterator (const vector &vec, int index) : vec_(&vec) { if( !vec.empty() ) { index_ = index; } else { index_ = -1; } } public: iterator(void) : index_(-1), vec_(NULL) { } iterator(const iterator& rhs) : vec_(rhs.vec_), index_(rhs.index_) { } ~iterator(void) {} static iterator begin(const cl::vector &vec) { iterator i(vec, 0); return i; } static iterator end(const cl::vector &vec) { iterator i(vec, vec.size()); return i; } bool operator==(iterator i) { return ((vec_ == i.vec_) && (index_ == i.index_)); } bool operator!=(iterator i) { return (!(*this==i)); } iterator& operator++() { ++index_; return *this; } iterator operator++(int) { iterator retVal(*this); ++index_; return retVal; } iterator& operator--() { --index_; return *this; } iterator operator--(int) { iterator retVal(*this); --index_; return retVal; } const T& operator *() const { return (*vec_)[index_]; } }; iterator begin(void) { return iterator::begin(*this); } iterator begin(void) const { return iterator::begin(*this); } iterator end(void) { return iterator::end(*this); } iterator end(void) const { return iterator::end(*this); } T& front(void) { return data_[0]; } T& back(void) { return data_[size_]; } const T& front(void) const { return data_[0]; } const T& back(void) const { return data_[size_-1]; } }; #endif // #if !defined(__USE_DEV_VECTOR) && !defined(__NO_STD_VECTOR) namespace detail { #define __DEFAULT_NOT_INITIALIZED 1 #define __DEFAULT_BEING_INITIALIZED 2 #define __DEFAULT_INITIALIZED 4 /* * Compare and exchange primitives are needed for handling of defaults */ inline int compare_exchange(volatile int * dest, int exchange, int comparand) { #ifdef _WIN32 return (int)(InterlockedCompareExchange( (volatile long*)dest, (long)exchange, (long)comparand)); #elif defined(__APPLE__) || defined(__MACOSX) return OSAtomicOr32Orig((uint32_t)exchange, (volatile uint32_t*)dest); #else // !_WIN32 || defined(__APPLE__) || defined(__MACOSX) return (__sync_val_compare_and_swap( dest, comparand, exchange)); #endif // !_WIN32 } inline void fence() { _mm_mfence(); } }; // namespace detail /*! \brief class used to interface between C++ and * OpenCL C calls that require arrays of size_t values, whose * size is known statically. */ template class size_t { private: ::size_t data_[N]; public: //! \brief Initialize size_t to all 0s size_t() { for( int i = 0; i < N; ++i ) { data_[i] = 0; } } ::size_t& operator[](int index) { return data_[index]; } const ::size_t& operator[](int index) const { return data_[index]; } //! \brief Conversion operator to T*. operator ::size_t* () { return data_; } //! \brief Conversion operator to const T*. operator const ::size_t* () const { return data_; } }; namespace detail { // Generic getInfoHelper. The final parameter is used to guide overload // resolution: the actual parameter passed is an int, which makes this // a worse conversion sequence than a specialization that declares the // parameter as an int. template inline cl_int getInfoHelper(Functor f, cl_uint name, T* param, long) { return f(name, sizeof(T), param, NULL); } // Specialized getInfoHelper for VECTOR_CLASS params template inline cl_int getInfoHelper(Func f, cl_uint name, VECTOR_CLASS* param, long) { ::size_t required; cl_int err = f(name, 0, NULL, &required); if (err != CL_SUCCESS) { return err; } T* value = (T*) alloca(required); err = f(name, required, value, NULL); if (err != CL_SUCCESS) { return err; } param->assign(&value[0], &value[required/sizeof(T)]); return CL_SUCCESS; } /* Specialization for reference-counted types. This depends on the * existence of Wrapper::cl_type, and none of the other types having the * cl_type member. Note that simplify specifying the parameter as Wrapper * does not work, because when using a derived type (e.g. Context) the generic * template will provide a better match. */ template inline cl_int getInfoHelper(Func f, cl_uint name, VECTOR_CLASS* param, int, typename T::cl_type = 0) { ::size_t required; cl_int err = f(name, 0, NULL, &required); if (err != CL_SUCCESS) { return err; } typename T::cl_type * value = (typename T::cl_type *) alloca(required); err = f(name, required, value, NULL); if (err != CL_SUCCESS) { return err; } ::size_t elements = required / sizeof(typename T::cl_type); param->assign(&value[0], &value[elements]); for (::size_t i = 0; i < elements; i++) { if (value[i] != NULL) { err = (*param)[i].retain(); if (err != CL_SUCCESS) { return err; } } } return CL_SUCCESS; } // Specialized for getInfo template inline cl_int getInfoHelper(Func f, cl_uint name, VECTOR_CLASS* param, int) { cl_int err = f(name, param->size() * sizeof(char *), &(*param)[0], NULL); if (err != CL_SUCCESS) { return err; } return CL_SUCCESS; } // Specialized GetInfoHelper for STRING_CLASS params template inline cl_int getInfoHelper(Func f, cl_uint name, STRING_CLASS* param, long) { ::size_t required; cl_int err = f(name, 0, NULL, &required); if (err != CL_SUCCESS) { return err; } char* value = (char*) alloca(required); err = f(name, required, value, NULL); if (err != CL_SUCCESS) { return err; } *param = value; return CL_SUCCESS; } // Specialized GetInfoHelper for cl::size_t params template inline cl_int getInfoHelper(Func f, cl_uint name, size_t* param, long) { ::size_t required; cl_int err = f(name, 0, NULL, &required); if (err != CL_SUCCESS) { return err; } ::size_t* value = (::size_t*) alloca(required); err = f(name, required, value, NULL); if (err != CL_SUCCESS) { return err; } for(int i = 0; i < N; ++i) { (*param)[i] = value[i]; } return CL_SUCCESS; } template struct ReferenceHandler; /* Specialization for reference-counted types. This depends on the * existence of Wrapper::cl_type, and none of the other types having the * cl_type member. Note that simplify specifying the parameter as Wrapper * does not work, because when using a derived type (e.g. Context) the generic * template will provide a better match. */ template inline cl_int getInfoHelper(Func f, cl_uint name, T* param, int, typename T::cl_type = 0) { typename T::cl_type value; cl_int err = f(name, sizeof(value), &value, NULL); if (err != CL_SUCCESS) { return err; } *param = value; if (value != NULL) { err = param->retain(); if (err != CL_SUCCESS) { return err; } } return CL_SUCCESS; } #define __PARAM_NAME_INFO_1_0(F) \ F(cl_platform_info, CL_PLATFORM_PROFILE, STRING_CLASS) \ F(cl_platform_info, CL_PLATFORM_VERSION, STRING_CLASS) \ F(cl_platform_info, CL_PLATFORM_NAME, STRING_CLASS) \ F(cl_platform_info, CL_PLATFORM_VENDOR, STRING_CLASS) \ F(cl_platform_info, CL_PLATFORM_EXTENSIONS, STRING_CLASS) \ \ F(cl_device_info, CL_DEVICE_TYPE, cl_device_type) \ F(cl_device_info, CL_DEVICE_VENDOR_ID, cl_uint) \ F(cl_device_info, CL_DEVICE_MAX_COMPUTE_UNITS, cl_uint) \ F(cl_device_info, CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS, cl_uint) \ F(cl_device_info, CL_DEVICE_MAX_WORK_GROUP_SIZE, ::size_t) \ F(cl_device_info, CL_DEVICE_MAX_WORK_ITEM_SIZES, VECTOR_CLASS< ::size_t>) \ F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR, cl_uint) \ F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT, cl_uint) \ F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT, cl_uint) \ F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG, cl_uint) \ F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT, cl_uint) \ F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE, cl_uint) \ F(cl_device_info, CL_DEVICE_MAX_CLOCK_FREQUENCY, cl_uint) \ F(cl_device_info, CL_DEVICE_ADDRESS_BITS, cl_uint) \ F(cl_device_info, CL_DEVICE_MAX_READ_IMAGE_ARGS, cl_uint) \ F(cl_device_info, CL_DEVICE_MAX_WRITE_IMAGE_ARGS, cl_uint) \ F(cl_device_info, CL_DEVICE_MAX_MEM_ALLOC_SIZE, cl_ulong) \ F(cl_device_info, CL_DEVICE_IMAGE2D_MAX_WIDTH, ::size_t) \ F(cl_device_info, CL_DEVICE_IMAGE2D_MAX_HEIGHT, ::size_t) \ F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_WIDTH, ::size_t) \ F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_HEIGHT, ::size_t) \ F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_DEPTH, ::size_t) \ F(cl_device_info, CL_DEVICE_IMAGE_SUPPORT, cl_bool) \ F(cl_device_info, CL_DEVICE_MAX_PARAMETER_SIZE, ::size_t) \ F(cl_device_info, CL_DEVICE_MAX_SAMPLERS, cl_uint) \ F(cl_device_info, CL_DEVICE_MEM_BASE_ADDR_ALIGN, cl_uint) \ F(cl_device_info, CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE, cl_uint) \ F(cl_device_info, CL_DEVICE_SINGLE_FP_CONFIG, cl_device_fp_config) \ F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHE_TYPE, cl_device_mem_cache_type) \ F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE, cl_uint)\ F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHE_SIZE, cl_ulong) \ F(cl_device_info, CL_DEVICE_GLOBAL_MEM_SIZE, cl_ulong) \ F(cl_device_info, CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE, cl_ulong) \ F(cl_device_info, CL_DEVICE_MAX_CONSTANT_ARGS, cl_uint) \ F(cl_device_info, CL_DEVICE_LOCAL_MEM_TYPE, cl_device_local_mem_type) \ F(cl_device_info, CL_DEVICE_LOCAL_MEM_SIZE, cl_ulong) \ F(cl_device_info, CL_DEVICE_ERROR_CORRECTION_SUPPORT, cl_bool) \ F(cl_device_info, CL_DEVICE_PROFILING_TIMER_RESOLUTION, ::size_t) \ F(cl_device_info, CL_DEVICE_ENDIAN_LITTLE, cl_bool) \ F(cl_device_info, CL_DEVICE_AVAILABLE, cl_bool) \ F(cl_device_info, CL_DEVICE_COMPILER_AVAILABLE, cl_bool) \ F(cl_device_info, CL_DEVICE_EXECUTION_CAPABILITIES, cl_device_exec_capabilities) \ F(cl_device_info, CL_DEVICE_QUEUE_PROPERTIES, cl_command_queue_properties) \ F(cl_device_info, CL_DEVICE_PLATFORM, cl_platform_id) \ F(cl_device_info, CL_DEVICE_NAME, STRING_CLASS) \ F(cl_device_info, CL_DEVICE_VENDOR, STRING_CLASS) \ F(cl_device_info, CL_DRIVER_VERSION, STRING_CLASS) \ F(cl_device_info, CL_DEVICE_PROFILE, STRING_CLASS) \ F(cl_device_info, CL_DEVICE_VERSION, STRING_CLASS) \ F(cl_device_info, CL_DEVICE_EXTENSIONS, STRING_CLASS) \ \ F(cl_context_info, CL_CONTEXT_REFERENCE_COUNT, cl_uint) \ F(cl_context_info, CL_CONTEXT_DEVICES, VECTOR_CLASS) \ F(cl_context_info, CL_CONTEXT_PROPERTIES, VECTOR_CLASS) \ \ F(cl_event_info, CL_EVENT_COMMAND_QUEUE, cl::CommandQueue) \ F(cl_event_info, CL_EVENT_COMMAND_TYPE, cl_command_type) \ F(cl_event_info, CL_EVENT_REFERENCE_COUNT, cl_uint) \ F(cl_event_info, CL_EVENT_COMMAND_EXECUTION_STATUS, cl_uint) \ \ F(cl_profiling_info, CL_PROFILING_COMMAND_QUEUED, cl_ulong) \ F(cl_profiling_info, CL_PROFILING_COMMAND_SUBMIT, cl_ulong) \ F(cl_profiling_info, CL_PROFILING_COMMAND_START, cl_ulong) \ F(cl_profiling_info, CL_PROFILING_COMMAND_END, cl_ulong) \ \ F(cl_mem_info, CL_MEM_TYPE, cl_mem_object_type) \ F(cl_mem_info, CL_MEM_FLAGS, cl_mem_flags) \ F(cl_mem_info, CL_MEM_SIZE, ::size_t) \ F(cl_mem_info, CL_MEM_HOST_PTR, void*) \ F(cl_mem_info, CL_MEM_MAP_COUNT, cl_uint) \ F(cl_mem_info, CL_MEM_REFERENCE_COUNT, cl_uint) \ F(cl_mem_info, CL_MEM_CONTEXT, cl::Context) \ \ F(cl_image_info, CL_IMAGE_FORMAT, cl_image_format) \ F(cl_image_info, CL_IMAGE_ELEMENT_SIZE, ::size_t) \ F(cl_image_info, CL_IMAGE_ROW_PITCH, ::size_t) \ F(cl_image_info, CL_IMAGE_SLICE_PITCH, ::size_t) \ F(cl_image_info, CL_IMAGE_WIDTH, ::size_t) \ F(cl_image_info, CL_IMAGE_HEIGHT, ::size_t) \ F(cl_image_info, CL_IMAGE_DEPTH, ::size_t) \ \ F(cl_sampler_info, CL_SAMPLER_REFERENCE_COUNT, cl_uint) \ F(cl_sampler_info, CL_SAMPLER_CONTEXT, cl::Context) \ F(cl_sampler_info, CL_SAMPLER_NORMALIZED_COORDS, cl_addressing_mode) \ F(cl_sampler_info, CL_SAMPLER_ADDRESSING_MODE, cl_filter_mode) \ F(cl_sampler_info, CL_SAMPLER_FILTER_MODE, cl_bool) \ \ F(cl_program_info, CL_PROGRAM_REFERENCE_COUNT, cl_uint) \ F(cl_program_info, CL_PROGRAM_CONTEXT, cl::Context) \ F(cl_program_info, CL_PROGRAM_NUM_DEVICES, cl_uint) \ F(cl_program_info, CL_PROGRAM_DEVICES, VECTOR_CLASS) \ F(cl_program_info, CL_PROGRAM_SOURCE, STRING_CLASS) \ F(cl_program_info, CL_PROGRAM_BINARY_SIZES, VECTOR_CLASS< ::size_t>) \ F(cl_program_info, CL_PROGRAM_BINARIES, VECTOR_CLASS) \ \ F(cl_program_build_info, CL_PROGRAM_BUILD_STATUS, cl_build_status) \ F(cl_program_build_info, CL_PROGRAM_BUILD_OPTIONS, STRING_CLASS) \ F(cl_program_build_info, CL_PROGRAM_BUILD_LOG, STRING_CLASS) \ \ F(cl_kernel_info, CL_KERNEL_FUNCTION_NAME, STRING_CLASS) \ F(cl_kernel_info, CL_KERNEL_NUM_ARGS, cl_uint) \ F(cl_kernel_info, CL_KERNEL_REFERENCE_COUNT, cl_uint) \ F(cl_kernel_info, CL_KERNEL_CONTEXT, cl::Context) \ F(cl_kernel_info, CL_KERNEL_PROGRAM, cl::Program) \ \ F(cl_kernel_work_group_info, CL_KERNEL_WORK_GROUP_SIZE, ::size_t) \ F(cl_kernel_work_group_info, CL_KERNEL_COMPILE_WORK_GROUP_SIZE, cl::size_t<3>) \ F(cl_kernel_work_group_info, CL_KERNEL_LOCAL_MEM_SIZE, cl_ulong) \ \ F(cl_command_queue_info, CL_QUEUE_CONTEXT, cl::Context) \ F(cl_command_queue_info, CL_QUEUE_DEVICE, cl::Device) \ F(cl_command_queue_info, CL_QUEUE_REFERENCE_COUNT, cl_uint) \ F(cl_command_queue_info, CL_QUEUE_PROPERTIES, cl_command_queue_properties) #if defined(CL_VERSION_1_1) #define __PARAM_NAME_INFO_1_1(F) \ F(cl_context_info, CL_CONTEXT_NUM_DEVICES, cl_uint)\ F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF, cl_uint) \ F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR, cl_uint) \ F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT, cl_uint) \ F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_INT, cl_uint) \ F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG, cl_uint) \ F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT, cl_uint) \ F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE, cl_uint) \ F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF, cl_uint) \ F(cl_device_info, CL_DEVICE_DOUBLE_FP_CONFIG, cl_device_fp_config) \ F(cl_device_info, CL_DEVICE_HALF_FP_CONFIG, cl_device_fp_config) \ F(cl_device_info, CL_DEVICE_HOST_UNIFIED_MEMORY, cl_bool) \ F(cl_device_info, CL_DEVICE_OPENCL_C_VERSION, STRING_CLASS) \ \ F(cl_mem_info, CL_MEM_ASSOCIATED_MEMOBJECT, cl::Memory) \ F(cl_mem_info, CL_MEM_OFFSET, ::size_t) \ \ F(cl_kernel_work_group_info, CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE, ::size_t) \ F(cl_kernel_work_group_info, CL_KERNEL_PRIVATE_MEM_SIZE, cl_ulong) \ \ F(cl_event_info, CL_EVENT_CONTEXT, cl::Context) #endif // CL_VERSION_1_1 #if defined(CL_VERSION_1_2) #define __PARAM_NAME_INFO_1_2(F) \ F(cl_image_info, CL_IMAGE_BUFFER, cl::Buffer) \ \ F(cl_program_info, CL_PROGRAM_NUM_KERNELS, ::size_t) \ F(cl_program_info, CL_PROGRAM_KERNEL_NAMES, STRING_CLASS) \ \ F(cl_program_build_info, CL_PROGRAM_BINARY_TYPE, cl_program_binary_type) \ \ F(cl_kernel_info, CL_KERNEL_ATTRIBUTES, STRING_CLASS) \ \ F(cl_kernel_arg_info, CL_KERNEL_ARG_ADDRESS_QUALIFIER, cl_kernel_arg_address_qualifier) \ F(cl_kernel_arg_info, CL_KERNEL_ARG_ACCESS_QUALIFIER, cl_kernel_arg_access_qualifier) \ F(cl_kernel_arg_info, CL_KERNEL_ARG_TYPE_NAME, STRING_CLASS) \ F(cl_kernel_arg_info, CL_KERNEL_ARG_NAME, STRING_CLASS) \ \ F(cl_device_info, CL_DEVICE_PARENT_DEVICE, cl_device_id) \ F(cl_device_info, CL_DEVICE_PARTITION_PROPERTIES, VECTOR_CLASS) \ F(cl_device_info, CL_DEVICE_PARTITION_TYPE, VECTOR_CLASS) \ F(cl_device_info, CL_DEVICE_REFERENCE_COUNT, cl_uint) \ F(cl_device_info, CL_DEVICE_PREFERRED_INTEROP_USER_SYNC, ::size_t) \ F(cl_device_info, CL_DEVICE_PARTITION_AFFINITY_DOMAIN, cl_device_affinity_domain) \ F(cl_device_info, CL_DEVICE_BUILT_IN_KERNELS, STRING_CLASS) #endif // #if defined(CL_VERSION_1_2) #if defined(USE_CL_DEVICE_FISSION) #define __PARAM_NAME_DEVICE_FISSION(F) \ F(cl_device_info, CL_DEVICE_PARENT_DEVICE_EXT, cl_device_id) \ F(cl_device_info, CL_DEVICE_PARTITION_TYPES_EXT, VECTOR_CLASS) \ F(cl_device_info, CL_DEVICE_AFFINITY_DOMAINS_EXT, VECTOR_CLASS) \ F(cl_device_info, CL_DEVICE_REFERENCE_COUNT_EXT , cl_uint) \ F(cl_device_info, CL_DEVICE_PARTITION_STYLE_EXT, VECTOR_CLASS) #endif // USE_CL_DEVICE_FISSION template struct param_traits {}; #define __CL_DECLARE_PARAM_TRAITS(token, param_name, T) \ struct token; \ template<> \ struct param_traits \ { \ enum { value = param_name }; \ typedef T param_type; \ }; __PARAM_NAME_INFO_1_0(__CL_DECLARE_PARAM_TRAITS) #if defined(CL_VERSION_1_1) __PARAM_NAME_INFO_1_1(__CL_DECLARE_PARAM_TRAITS) #endif // CL_VERSION_1_1 #if defined(CL_VERSION_1_2) __PARAM_NAME_INFO_1_2(__CL_DECLARE_PARAM_TRAITS) #endif // CL_VERSION_1_1 #if defined(USE_CL_DEVICE_FISSION) __PARAM_NAME_DEVICE_FISSION(__CL_DECLARE_PARAM_TRAITS); #endif // USE_CL_DEVICE_FISSION #ifdef CL_PLATFORM_ICD_SUFFIX_KHR __CL_DECLARE_PARAM_TRAITS(cl_platform_info, CL_PLATFORM_ICD_SUFFIX_KHR, STRING_CLASS) #endif #ifdef CL_DEVICE_PROFILING_TIMER_OFFSET_AMD __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_PROFILING_TIMER_OFFSET_AMD, cl_ulong) #endif #ifdef CL_DEVICE_GLOBAL_FREE_MEMORY_AMD __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_FREE_MEMORY_AMD, VECTOR_CLASS< ::size_t>) #endif #ifdef CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD, cl_uint) #endif #ifdef CL_DEVICE_SIMD_WIDTH_AMD __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_SIMD_WIDTH_AMD, cl_uint) #endif #ifdef CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD, cl_uint) #endif #ifdef CL_DEVICE_WAVEFRONT_WIDTH_AMD __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_WAVEFRONT_WIDTH_AMD, cl_uint) #endif #ifdef CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD, cl_uint) #endif #ifdef CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD, cl_uint) #endif #ifdef CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD, cl_uint) #endif #ifdef CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD, cl_uint) #endif #ifdef CL_DEVICE_LOCAL_MEM_BANKS_AMD __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_LOCAL_MEM_BANKS_AMD, cl_uint) #endif #ifdef CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV, cl_uint) #endif #ifdef CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV, cl_uint) #endif #ifdef CL_DEVICE_REGISTERS_PER_BLOCK_NV __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_REGISTERS_PER_BLOCK_NV, cl_uint) #endif #ifdef CL_DEVICE_WARP_SIZE_NV __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_WARP_SIZE_NV, cl_uint) #endif #ifdef CL_DEVICE_GPU_OVERLAP_NV __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GPU_OVERLAP_NV, cl_bool) #endif #ifdef CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV, cl_bool) #endif #ifdef CL_DEVICE_INTEGRATED_MEMORY_NV __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_INTEGRATED_MEMORY_NV, cl_bool) #endif // Convenience functions template inline cl_int getInfo(Func f, cl_uint name, T* param) { return getInfoHelper(f, name, param, 0); } template struct GetInfoFunctor0 { Func f_; const Arg0& arg0_; cl_int operator ()( cl_uint param, ::size_t size, void* value, ::size_t* size_ret) { return f_(arg0_, param, size, value, size_ret); } }; template struct GetInfoFunctor1 { Func f_; const Arg0& arg0_; const Arg1& arg1_; cl_int operator ()( cl_uint param, ::size_t size, void* value, ::size_t* size_ret) { return f_(arg0_, arg1_, param, size, value, size_ret); } }; template inline cl_int getInfo(Func f, const Arg0& arg0, cl_uint name, T* param) { GetInfoFunctor0 f0 = { f, arg0 }; return getInfoHelper(f0, name, param, 0); } template inline cl_int getInfo(Func f, const Arg0& arg0, const Arg1& arg1, cl_uint name, T* param) { GetInfoFunctor1 f0 = { f, arg0, arg1 }; return getInfoHelper(f0, name, param, 0); } template struct ReferenceHandler { }; #if defined(CL_VERSION_1_2) /** * OpenCL 1.2 devices do have retain/release. */ template <> struct ReferenceHandler { /** * Retain the device. * \param device A valid device created using createSubDevices * \return * CL_SUCCESS if the function executed successfully. * CL_INVALID_DEVICE if device was not a valid subdevice * CL_OUT_OF_RESOURCES * CL_OUT_OF_HOST_MEMORY */ static cl_int retain(cl_device_id device) { return ::clRetainDevice(device); } /** * Retain the device. * \param device A valid device created using createSubDevices * \return * CL_SUCCESS if the function executed successfully. * CL_INVALID_DEVICE if device was not a valid subdevice * CL_OUT_OF_RESOURCES * CL_OUT_OF_HOST_MEMORY */ static cl_int release(cl_device_id device) { return ::clReleaseDevice(device); } }; #else // #if defined(CL_VERSION_1_2) /** * OpenCL 1.1 devices do not have retain/release. */ template <> struct ReferenceHandler { // cl_device_id does not have retain(). static cl_int retain(cl_device_id) { return CL_SUCCESS; } // cl_device_id does not have release(). static cl_int release(cl_device_id) { return CL_SUCCESS; } }; #endif // #if defined(CL_VERSION_1_2) template <> struct ReferenceHandler { // cl_platform_id does not have retain(). static cl_int retain(cl_platform_id) { return CL_SUCCESS; } // cl_platform_id does not have release(). static cl_int release(cl_platform_id) { return CL_SUCCESS; } }; template <> struct ReferenceHandler { static cl_int retain(cl_context context) { return ::clRetainContext(context); } static cl_int release(cl_context context) { return ::clReleaseContext(context); } }; template <> struct ReferenceHandler { static cl_int retain(cl_command_queue queue) { return ::clRetainCommandQueue(queue); } static cl_int release(cl_command_queue queue) { return ::clReleaseCommandQueue(queue); } }; template <> struct ReferenceHandler { static cl_int retain(cl_mem memory) { return ::clRetainMemObject(memory); } static cl_int release(cl_mem memory) { return ::clReleaseMemObject(memory); } }; template <> struct ReferenceHandler { static cl_int retain(cl_sampler sampler) { return ::clRetainSampler(sampler); } static cl_int release(cl_sampler sampler) { return ::clReleaseSampler(sampler); } }; template <> struct ReferenceHandler { static cl_int retain(cl_program program) { return ::clRetainProgram(program); } static cl_int release(cl_program program) { return ::clReleaseProgram(program); } }; template <> struct ReferenceHandler { static cl_int retain(cl_kernel kernel) { return ::clRetainKernel(kernel); } static cl_int release(cl_kernel kernel) { return ::clReleaseKernel(kernel); } }; template <> struct ReferenceHandler { static cl_int retain(cl_event event) { return ::clRetainEvent(event); } static cl_int release(cl_event event) { return ::clReleaseEvent(event); } }; // Extracts version number with major in the upper 16 bits, minor in the lower 16 static cl_uint getVersion(const char *versionInfo) { int highVersion = 0; int lowVersion = 0; int index = 7; while(versionInfo[index] != '.' ) { highVersion *= 10; highVersion += versionInfo[index]-'0'; ++index; } ++index; while(versionInfo[index] != ' ' ) { lowVersion *= 10; lowVersion += versionInfo[index]-'0'; ++index; } return (highVersion << 16) | lowVersion; } static cl_uint getPlatformVersion(cl_platform_id platform) { ::size_t size = 0; clGetPlatformInfo(platform, CL_PLATFORM_VERSION, 0, NULL, &size); char *versionInfo = (char *) alloca(size); clGetPlatformInfo(platform, CL_PLATFORM_VERSION, size, &versionInfo[0], &size); return getVersion(versionInfo); } static cl_uint getDevicePlatformVersion(cl_device_id device) { cl_platform_id platform; clGetDeviceInfo(device, CL_DEVICE_PLATFORM, sizeof(platform), &platform, NULL); return getPlatformVersion(platform); } #if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) static cl_uint getContextPlatformVersion(cl_context context) { // The platform cannot be queried directly, so we first have to grab a // device and obtain its context ::size_t size = 0; clGetContextInfo(context, CL_CONTEXT_DEVICES, 0, NULL, &size); if (size == 0) return 0; cl_device_id *devices = (cl_device_id *) alloca(size); clGetContextInfo(context, CL_CONTEXT_DEVICES, size, devices, NULL); return getDevicePlatformVersion(devices[0]); } #endif // #if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) template class Wrapper { public: typedef T cl_type; protected: cl_type object_; public: Wrapper() : object_(NULL) { } Wrapper(const cl_type &obj) : object_(obj) { } ~Wrapper() { if (object_ != NULL) { release(); } } Wrapper(const Wrapper& rhs) { object_ = rhs.object_; if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); } } Wrapper& operator = (const Wrapper& rhs) { if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); } object_ = rhs.object_; if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); } return *this; } Wrapper& operator = (const cl_type &rhs) { if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); } object_ = rhs; return *this; } cl_type operator ()() const { return object_; } cl_type& operator ()() { return object_; } protected: template friend inline cl_int getInfoHelper(Func, cl_uint, U*, int, typename U::cl_type); cl_int retain() const { return ReferenceHandler::retain(object_); } cl_int release() const { return ReferenceHandler::release(object_); } }; template <> class Wrapper { public: typedef cl_device_id cl_type; protected: cl_type object_; bool referenceCountable_; static bool isReferenceCountable(cl_device_id device) { bool retVal = false; if (device != NULL) { int version = getDevicePlatformVersion(device); if(version > ((1 << 16) + 1)) { retVal = true; } } return retVal; } public: Wrapper() : object_(NULL), referenceCountable_(false) { } Wrapper(const cl_type &obj) : object_(obj), referenceCountable_(false) { referenceCountable_ = isReferenceCountable(obj); } ~Wrapper() { if (object_ != NULL) { release(); } } Wrapper(const Wrapper& rhs) { object_ = rhs.object_; referenceCountable_ = isReferenceCountable(object_); if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); } } Wrapper& operator = (const Wrapper& rhs) { if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); } object_ = rhs.object_; referenceCountable_ = rhs.referenceCountable_; if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); } return *this; } Wrapper& operator = (const cl_type &rhs) { if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); } object_ = rhs; referenceCountable_ = isReferenceCountable(object_); return *this; } cl_type operator ()() const { return object_; } cl_type& operator ()() { return object_; } protected: template friend inline cl_int getInfoHelper(Func, cl_uint, U*, int, typename U::cl_type); template friend inline cl_int getInfoHelper(Func, cl_uint, VECTOR_CLASS*, int, typename U::cl_type); cl_int retain() const { if( referenceCountable_ ) { return ReferenceHandler::retain(object_); } else { return CL_SUCCESS; } } cl_int release() const { if( referenceCountable_ ) { return ReferenceHandler::release(object_); } else { return CL_SUCCESS; } } }; } // namespace detail //! \endcond /*! \stuct ImageFormat * \brief Adds constructors and member functions for cl_image_format. * * \see cl_image_format */ struct ImageFormat : public cl_image_format { //! \brief Default constructor - performs no initialization. ImageFormat(){} //! \brief Initializing constructor. ImageFormat(cl_channel_order order, cl_channel_type type) { image_channel_order = order; image_channel_data_type = type; } //! \brief Assignment operator. ImageFormat& operator = (const ImageFormat& rhs) { if (this != &rhs) { this->image_channel_data_type = rhs.image_channel_data_type; this->image_channel_order = rhs.image_channel_order; } return *this; } }; /*! \brief Class interface for cl_device_id. * * \note Copies of these objects are inexpensive, since they don't 'own' * any underlying resources or data structures. * * \see cl_device_id */ class Device : public detail::Wrapper { public: //! \brief Default constructor - initializes to NULL. Device() : detail::Wrapper() { } /*! \brief Copy constructor. * * This simply copies the device ID value, which is an inexpensive operation. */ Device(const Device& device) : detail::Wrapper(device) { } /*! \brief Constructor from cl_device_id. * * This simply copies the device ID value, which is an inexpensive operation. */ Device(const cl_device_id &device) : detail::Wrapper(device) { } /*! \brief Returns the first device on the default context. * * \see Context::getDefault() */ static Device getDefault(cl_int * err = NULL); /*! \brief Assignment operator from Device. * * This simply copies the device ID value, which is an inexpensive operation. */ Device& operator = (const Device& rhs) { if (this != &rhs) { detail::Wrapper::operator=(rhs); } return *this; } /*! \brief Assignment operator from cl_device_id. * * This simply copies the device ID value, which is an inexpensive operation. */ Device& operator = (const cl_device_id& rhs) { detail::Wrapper::operator=(rhs); return *this; } //! \brief Wrapper for clGetDeviceInfo(). template cl_int getInfo(cl_device_info name, T* param) const { return detail::errHandler( detail::getInfo(&::clGetDeviceInfo, object_, name, param), __GET_DEVICE_INFO_ERR); } //! \brief Wrapper for clGetDeviceInfo() that returns by value. template typename detail::param_traits::param_type getInfo(cl_int* err = NULL) const { typename detail::param_traits< detail::cl_device_info, name>::param_type param; cl_int result = getInfo(name, ¶m); if (err != NULL) { *err = result; } return param; } /** * CL 1.2 version */ #if defined(CL_VERSION_1_2) //! \brief Wrapper for clCreateSubDevicesEXT(). cl_int createSubDevices( const cl_device_partition_property * properties, VECTOR_CLASS* devices) { cl_uint n = 0; cl_int err = clCreateSubDevices(object_, properties, 0, NULL, &n); if (err != CL_SUCCESS) { return detail::errHandler(err, __CREATE_SUB_DEVICES); } cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id)); err = clCreateSubDevices(object_, properties, n, ids, NULL); if (err != CL_SUCCESS) { return detail::errHandler(err, __CREATE_SUB_DEVICES); } devices->assign(&ids[0], &ids[n]); return CL_SUCCESS; } #endif // #if defined(CL_VERSION_1_2) /** * CL 1.1 version that uses device fission. */ #if defined(CL_VERSION_1_1) #if defined(USE_CL_DEVICE_FISSION) cl_int createSubDevices( const cl_device_partition_property_ext * properties, VECTOR_CLASS* devices) { typedef CL_API_ENTRY cl_int ( CL_API_CALL * PFN_clCreateSubDevicesEXT)( cl_device_id /*in_device*/, const cl_device_partition_property_ext * /* properties */, cl_uint /*num_entries*/, cl_device_id * /*out_devices*/, cl_uint * /*num_devices*/ ) CL_EXT_SUFFIX__VERSION_1_1; static PFN_clCreateSubDevicesEXT pfn_clCreateSubDevicesEXT = NULL; __INIT_CL_EXT_FCN_PTR(clCreateSubDevicesEXT); cl_uint n = 0; cl_int err = pfn_clCreateSubDevicesEXT(object_, properties, 0, NULL, &n); if (err != CL_SUCCESS) { return detail::errHandler(err, __CREATE_SUB_DEVICES); } cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id)); err = pfn_clCreateSubDevicesEXT(object_, properties, n, ids, NULL); if (err != CL_SUCCESS) { return detail::errHandler(err, __CREATE_SUB_DEVICES); } devices->assign(&ids[0], &ids[n]); return CL_SUCCESS; } #endif // #if defined(USE_CL_DEVICE_FISSION) #endif // #if defined(CL_VERSION_1_1) }; /*! \brief Class interface for cl_platform_id. * * \note Copies of these objects are inexpensive, since they don't 'own' * any underlying resources or data structures. * * \see cl_platform_id */ class Platform : public detail::Wrapper { public: //! \brief Default constructor - initializes to NULL. Platform() : detail::Wrapper() { } /*! \brief Copy constructor. * * This simply copies the platform ID value, which is an inexpensive operation. */ Platform(const Platform& platform) : detail::Wrapper(platform) { } /*! \brief Constructor from cl_platform_id. * * This simply copies the platform ID value, which is an inexpensive operation. */ Platform(const cl_platform_id &platform) : detail::Wrapper(platform) { } /*! \brief Assignment operator from Platform. * * This simply copies the platform ID value, which is an inexpensive operation. */ Platform& operator = (const Platform& rhs) { if (this != &rhs) { detail::Wrapper::operator=(rhs); } return *this; } /*! \brief Assignment operator from cl_platform_id. * * This simply copies the platform ID value, which is an inexpensive operation. */ Platform& operator = (const cl_platform_id& rhs) { detail::Wrapper::operator=(rhs); return *this; } //! \brief Wrapper for clGetPlatformInfo(). cl_int getInfo(cl_platform_info name, STRING_CLASS* param) const { return detail::errHandler( detail::getInfo(&::clGetPlatformInfo, object_, name, param), __GET_PLATFORM_INFO_ERR); } //! \brief Wrapper for clGetPlatformInfo() that returns by value. template typename detail::param_traits::param_type getInfo(cl_int* err = NULL) const { typename detail::param_traits< detail::cl_platform_info, name>::param_type param; cl_int result = getInfo(name, ¶m); if (err != NULL) { *err = result; } return param; } /*! \brief Gets a list of devices for this platform. * * Wraps clGetDeviceIDs(). */ cl_int getDevices( cl_device_type type, VECTOR_CLASS* devices) const { cl_uint n = 0; if( devices == NULL ) { return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_DEVICE_IDS_ERR); } cl_int err = ::clGetDeviceIDs(object_, type, 0, NULL, &n); if (err != CL_SUCCESS) { return detail::errHandler(err, __GET_DEVICE_IDS_ERR); } cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id)); err = ::clGetDeviceIDs(object_, type, n, ids, NULL); if (err != CL_SUCCESS) { return detail::errHandler(err, __GET_DEVICE_IDS_ERR); } devices->assign(&ids[0], &ids[n]); return CL_SUCCESS; } #if defined(USE_DX_INTEROP) /*! \brief Get the list of available D3D10 devices. * * \param d3d_device_source. * * \param d3d_object. * * \param d3d_device_set. * * \param devices returns a vector of OpenCL D3D10 devices found. The cl::Device * values returned in devices can be used to identify a specific OpenCL * device. If \a devices argument is NULL, this argument is ignored. * * \return One of the following values: * - CL_SUCCESS if the function is executed successfully. * * The application can query specific capabilities of the OpenCL device(s) * returned by cl::getDevices. This can be used by the application to * determine which device(s) to use. * * \note In the case that exceptions are enabled and a return value * other than CL_SUCCESS is generated, then cl::Error exception is * generated. */ cl_int getDevices( cl_d3d10_device_source_khr d3d_device_source, void * d3d_object, cl_d3d10_device_set_khr d3d_device_set, VECTOR_CLASS* devices) const { typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clGetDeviceIDsFromD3D10KHR)( cl_platform_id platform, cl_d3d10_device_source_khr d3d_device_source, void * d3d_object, cl_d3d10_device_set_khr d3d_device_set, cl_uint num_entries, cl_device_id * devices, cl_uint* num_devices); if( devices == NULL ) { return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_DEVICE_IDS_ERR); } static PFN_clGetDeviceIDsFromD3D10KHR pfn_clGetDeviceIDsFromD3D10KHR = NULL; __INIT_CL_EXT_FCN_PTR_PLATFORM(object_, clGetDeviceIDsFromD3D10KHR); cl_uint n = 0; cl_int err = pfn_clGetDeviceIDsFromD3D10KHR( object_, d3d_device_source, d3d_object, d3d_device_set, 0, NULL, &n); if (err != CL_SUCCESS) { return detail::errHandler(err, __GET_DEVICE_IDS_ERR); } cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id)); err = pfn_clGetDeviceIDsFromD3D10KHR( object_, d3d_device_source, d3d_object, d3d_device_set, n, ids, NULL); if (err != CL_SUCCESS) { return detail::errHandler(err, __GET_DEVICE_IDS_ERR); } devices->assign(&ids[0], &ids[n]); return CL_SUCCESS; } #endif /*! \brief Gets a list of available platforms. * * Wraps clGetPlatformIDs(). */ static cl_int get( VECTOR_CLASS* platforms) { cl_uint n = 0; if( platforms == NULL ) { return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_PLATFORM_IDS_ERR); } cl_int err = ::clGetPlatformIDs(0, NULL, &n); if (err != CL_SUCCESS) { return detail::errHandler(err, __GET_PLATFORM_IDS_ERR); } cl_platform_id* ids = (cl_platform_id*) alloca( n * sizeof(cl_platform_id)); err = ::clGetPlatformIDs(n, ids, NULL); if (err != CL_SUCCESS) { return detail::errHandler(err, __GET_PLATFORM_IDS_ERR); } platforms->assign(&ids[0], &ids[n]); return CL_SUCCESS; } /*! \brief Gets the first available platform. * * Wraps clGetPlatformIDs(), returning the first result. */ static cl_int get( Platform * platform) { cl_uint n = 0; if( platform == NULL ) { return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_PLATFORM_IDS_ERR); } cl_int err = ::clGetPlatformIDs(0, NULL, &n); if (err != CL_SUCCESS) { return detail::errHandler(err, __GET_PLATFORM_IDS_ERR); } cl_platform_id* ids = (cl_platform_id*) alloca( n * sizeof(cl_platform_id)); err = ::clGetPlatformIDs(n, ids, NULL); if (err != CL_SUCCESS) { return detail::errHandler(err, __GET_PLATFORM_IDS_ERR); } *platform = ids[0]; return CL_SUCCESS; } /*! \brief Gets the first available platform, returning it by value. * * Wraps clGetPlatformIDs(), returning the first result. */ static Platform get( cl_int * errResult = NULL) { Platform platform; cl_uint n = 0; cl_int err = ::clGetPlatformIDs(0, NULL, &n); if (err != CL_SUCCESS) { detail::errHandler(err, __GET_PLATFORM_IDS_ERR); if (errResult != NULL) { *errResult = err; } } cl_platform_id* ids = (cl_platform_id*) alloca( n * sizeof(cl_platform_id)); err = ::clGetPlatformIDs(n, ids, NULL); if (err != CL_SUCCESS) { detail::errHandler(err, __GET_PLATFORM_IDS_ERR); } if (errResult != NULL) { *errResult = err; } return ids[0]; } static Platform getDefault( cl_int *errResult = NULL ) { return get(errResult); } #if defined(CL_VERSION_1_2) //! \brief Wrapper for clUnloadCompiler(). cl_int unloadCompiler() { return ::clUnloadPlatformCompiler(object_); } #endif // #if defined(CL_VERSION_1_2) }; // class Platform /** * Deprecated APIs for 1.2 */ #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2)) /** * Unload the OpenCL compiler. * \note Deprecated for OpenCL 1.2. Use Platform::unloadCompiler instead. */ inline CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_int UnloadCompiler() CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED; inline cl_int UnloadCompiler() { return ::clUnloadCompiler(); } #endif // #if defined(CL_VERSION_1_1) /*! \brief Class interface for cl_context. * * \note Copies of these objects are shallow, meaning that the copy will refer * to the same underlying cl_context as the original. For details, see * clRetainContext() and clReleaseContext(). * * \see cl_context */ class Context : public detail::Wrapper { private: static volatile int default_initialized_; static Context default_; static volatile cl_int default_error_; public: /*! \brief Destructor. * * This calls clReleaseContext() on the value held by this instance. */ ~Context() { } /*! \brief Constructs a context including a list of specified devices. * * Wraps clCreateContext(). */ Context( const VECTOR_CLASS& devices, cl_context_properties* properties = NULL, void (CL_CALLBACK * notifyFptr)( const char *, const void *, ::size_t, void *) = NULL, void* data = NULL, cl_int* err = NULL) { cl_int error; ::size_t numDevices = devices.size(); cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id)); for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) { deviceIDs[deviceIndex] = (devices[deviceIndex])(); } object_ = ::clCreateContext( properties, (cl_uint) numDevices, deviceIDs, notifyFptr, data, &error); detail::errHandler(error, __CREATE_CONTEXT_ERR); if (err != NULL) { *err = error; } } Context( const Device& device, cl_context_properties* properties = NULL, void (CL_CALLBACK * notifyFptr)( const char *, const void *, ::size_t, void *) = NULL, void* data = NULL, cl_int* err = NULL) { cl_int error; cl_device_id deviceID = device(); object_ = ::clCreateContext( properties, 1, &deviceID, notifyFptr, data, &error); detail::errHandler(error, __CREATE_CONTEXT_ERR); if (err != NULL) { *err = error; } } /*! \brief Constructs a context including all devices of a specified type. * * Wraps clCreateContextFromType(). */ Context( cl_device_type type, cl_context_properties* properties = NULL, void (CL_CALLBACK * notifyFptr)( const char *, const void *, ::size_t, void *) = NULL, void* data = NULL, cl_int* err = NULL) { cl_int error; #if !defined(__APPLE__) || !defined(__MACOS) cl_context_properties prop[4] = {CL_CONTEXT_PLATFORM, 0, 0, 0 }; if (properties == NULL) { prop[1] = (cl_context_properties)Platform::get(&error)(); if (error != CL_SUCCESS) { detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR); if (err != NULL) { *err = error; return; } } properties = &prop[0]; } #endif object_ = ::clCreateContextFromType( properties, type, notifyFptr, data, &error); detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR); if (err != NULL) { *err = error; } } /*! \brief Returns a singleton context including all devices of CL_DEVICE_TYPE_DEFAULT. * * \note All calls to this function return the same cl_context as the first. */ static Context getDefault(cl_int * err = NULL) { int state = detail::compare_exchange( &default_initialized_, __DEFAULT_BEING_INITIALIZED, __DEFAULT_NOT_INITIALIZED); if (state & __DEFAULT_INITIALIZED) { if (err != NULL) { *err = default_error_; } return default_; } if (state & __DEFAULT_BEING_INITIALIZED) { // Assume writes will propagate eventually... while(default_initialized_ != __DEFAULT_INITIALIZED) { detail::fence(); } if (err != NULL) { *err = default_error_; } return default_; } cl_int error; default_ = Context( CL_DEVICE_TYPE_DEFAULT, NULL, NULL, NULL, &error); detail::fence(); default_error_ = error; // Assume writes will propagate eventually... default_initialized_ = __DEFAULT_INITIALIZED; detail::fence(); if (err != NULL) { *err = default_error_; } return default_; } //! \brief Default constructor - initializes to NULL. Context() : detail::Wrapper() { } /*! \brief Copy constructor. * * This calls clRetainContext() on the parameter's cl_context. */ Context(const Context& context) : detail::Wrapper(context) { } /*! \brief Constructor from cl_context - takes ownership. * * This effectively transfers ownership of a refcount on the cl_context * into the new Context object. */ __CL_EXPLICIT_CONSTRUCTORS Context(const cl_context& context) : detail::Wrapper(context) { } /*! \brief Assignment operator from Context. * * This calls clRetainContext() on the parameter and clReleaseContext() on * the previous value held by this instance. */ Context& operator = (const Context& rhs) { if (this != &rhs) { detail::Wrapper::operator=(rhs); } return *this; } /*! \brief Assignment operator from cl_context - takes ownership. * * This effectively transfers ownership of a refcount on the rhs and calls * clReleaseContext() on the value previously held by this instance. */ Context& operator = (const cl_context& rhs) { detail::Wrapper::operator=(rhs); return *this; } //! \brief Wrapper for clGetContextInfo(). template cl_int getInfo(cl_context_info name, T* param) const { return detail::errHandler( detail::getInfo(&::clGetContextInfo, object_, name, param), __GET_CONTEXT_INFO_ERR); } //! \brief Wrapper for clGetContextInfo() that returns by value. template typename detail::param_traits::param_type getInfo(cl_int* err = NULL) const { typename detail::param_traits< detail::cl_context_info, name>::param_type param; cl_int result = getInfo(name, ¶m); if (err != NULL) { *err = result; } return param; } /*! \brief Gets a list of supported image formats. * * Wraps clGetSupportedImageFormats(). */ cl_int getSupportedImageFormats( cl_mem_flags flags, cl_mem_object_type type, VECTOR_CLASS* formats) const { cl_uint numEntries; cl_int err = ::clGetSupportedImageFormats( object_, flags, type, 0, NULL, &numEntries); if (err != CL_SUCCESS) { return detail::errHandler(err, __GET_SUPPORTED_IMAGE_FORMATS_ERR); } ImageFormat* value = (ImageFormat*) alloca(numEntries * sizeof(ImageFormat)); err = ::clGetSupportedImageFormats( object_, flags, type, numEntries, (cl_image_format*) value, NULL); if (err != CL_SUCCESS) { return detail::errHandler(err, __GET_SUPPORTED_IMAGE_FORMATS_ERR); } formats->assign(&value[0], &value[numEntries]); return CL_SUCCESS; } }; inline Device Device::getDefault(cl_int * err) { cl_int error; Device device; Context context = Context::getDefault(&error); detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR); if (error != CL_SUCCESS) { if (err != NULL) { *err = error; } } else { device = context.getInfo()[0]; if (err != NULL) { *err = CL_SUCCESS; } } return device; } #ifdef _WIN32 __declspec(selectany) volatile int Context::default_initialized_ = __DEFAULT_NOT_INITIALIZED; __declspec(selectany) Context Context::default_; __declspec(selectany) volatile cl_int Context::default_error_ = CL_SUCCESS; #else __attribute__((weak)) volatile int Context::default_initialized_ = __DEFAULT_NOT_INITIALIZED; __attribute__((weak)) Context Context::default_; __attribute__((weak)) volatile cl_int Context::default_error_ = CL_SUCCESS; #endif /*! \brief Class interface for cl_event. * * \note Copies of these objects are shallow, meaning that the copy will refer * to the same underlying cl_event as the original. For details, see * clRetainEvent() and clReleaseEvent(). * * \see cl_event */ class Event : public detail::Wrapper { public: /*! \brief Destructor. * * This calls clReleaseEvent() on the value held by this instance. */ ~Event() { } //! \brief Default constructor - initializes to NULL. Event() : detail::Wrapper() { } /*! \brief Copy constructor. * * This calls clRetainEvent() on the parameter's cl_event. */ Event(const Event& event) : detail::Wrapper(event) { } /*! \brief Constructor from cl_event - takes ownership. * * This effectively transfers ownership of a refcount on the cl_event * into the new Event object. */ Event(const cl_event& event) : detail::Wrapper(event) { } /*! \brief Assignment operator from cl_event - takes ownership. * * This effectively transfers ownership of a refcount on the rhs and calls * clReleaseEvent() on the value previously held by this instance. */ Event& operator = (const Event& rhs) { if (this != &rhs) { detail::Wrapper::operator=(rhs); } return *this; } /*! \brief Assignment operator from cl_event. * * This calls clRetainEvent() on the parameter and clReleaseEvent() on * the previous value held by this instance. */ Event& operator = (const cl_event& rhs) { detail::Wrapper::operator=(rhs); return *this; } //! \brief Wrapper for clGetEventInfo(). template cl_int getInfo(cl_event_info name, T* param) const { return detail::errHandler( detail::getInfo(&::clGetEventInfo, object_, name, param), __GET_EVENT_INFO_ERR); } //! \brief Wrapper for clGetEventInfo() that returns by value. template typename detail::param_traits::param_type getInfo(cl_int* err = NULL) const { typename detail::param_traits< detail::cl_event_info, name>::param_type param; cl_int result = getInfo(name, ¶m); if (err != NULL) { *err = result; } return param; } //! \brief Wrapper for clGetEventProfilingInfo(). template cl_int getProfilingInfo(cl_profiling_info name, T* param) const { return detail::errHandler(detail::getInfo( &::clGetEventProfilingInfo, object_, name, param), __GET_EVENT_PROFILE_INFO_ERR); } //! \brief Wrapper for clGetEventProfilingInfo() that returns by value. template typename detail::param_traits::param_type getProfilingInfo(cl_int* err = NULL) const { typename detail::param_traits< detail::cl_profiling_info, name>::param_type param; cl_int result = getProfilingInfo(name, ¶m); if (err != NULL) { *err = result; } return param; } /*! \brief Blocks the calling thread until this event completes. * * Wraps clWaitForEvents(). */ cl_int wait() const { return detail::errHandler( ::clWaitForEvents(1, &object_), __WAIT_FOR_EVENTS_ERR); } #if defined(CL_VERSION_1_1) /*! \brief Registers a user callback function for a specific command execution status. * * Wraps clSetEventCallback(). */ cl_int setCallback( cl_int type, void (CL_CALLBACK * pfn_notify)(cl_event, cl_int, void *), void * user_data = NULL) { return detail::errHandler( ::clSetEventCallback( object_, type, pfn_notify, user_data), __SET_EVENT_CALLBACK_ERR); } #endif /*! \brief Blocks the calling thread until every event specified is complete. * * Wraps clWaitForEvents(). */ static cl_int waitForEvents(const VECTOR_CLASS& events) { return detail::errHandler( ::clWaitForEvents( (cl_uint) events.size(), (cl_event*)&events.front()), __WAIT_FOR_EVENTS_ERR); } }; #if defined(CL_VERSION_1_1) /*! \brief Class interface for user events (a subset of cl_event's). * * See Event for details about copy semantics, etc. */ class UserEvent : public Event { public: /*! \brief Constructs a user event on a given context. * * Wraps clCreateUserEvent(). */ UserEvent( const Context& context, cl_int * err = NULL) { cl_int error; object_ = ::clCreateUserEvent( context(), &error); detail::errHandler(error, __CREATE_USER_EVENT_ERR); if (err != NULL) { *err = error; } } //! \brief Default constructor - initializes to NULL. UserEvent() : Event() { } //! \brief Copy constructor - performs shallow copy. UserEvent(const UserEvent& event) : Event(event) { } //! \brief Assignment Operator - performs shallow copy. UserEvent& operator = (const UserEvent& rhs) { if (this != &rhs) { Event::operator=(rhs); } return *this; } /*! \brief Sets the execution status of a user event object. * * Wraps clSetUserEventStatus(). */ cl_int setStatus(cl_int status) { return detail::errHandler( ::clSetUserEventStatus(object_,status), __SET_USER_EVENT_STATUS_ERR); } }; #endif /*! \brief Blocks the calling thread until every event specified is complete. * * Wraps clWaitForEvents(). */ inline static cl_int WaitForEvents(const VECTOR_CLASS& events) { return detail::errHandler( ::clWaitForEvents( (cl_uint) events.size(), (cl_event*)&events.front()), __WAIT_FOR_EVENTS_ERR); } /*! \brief Class interface for cl_mem. * * \note Copies of these objects are shallow, meaning that the copy will refer * to the same underlying cl_mem as the original. For details, see * clRetainMemObject() and clReleaseMemObject(). * * \see cl_mem */ class Memory : public detail::Wrapper { public: /*! \brief Destructor. * * This calls clReleaseMemObject() on the value held by this instance. */ ~Memory() {} //! \brief Default constructor - initializes to NULL. Memory() : detail::Wrapper() { } /*! \brief Copy constructor - performs shallow copy. * * This calls clRetainMemObject() on the parameter's cl_mem. */ Memory(const Memory& memory) : detail::Wrapper(memory) { } /*! \brief Constructor from cl_mem - takes ownership. * * This effectively transfers ownership of a refcount on the cl_mem * into the new Memory object. */ __CL_EXPLICIT_CONSTRUCTORS Memory(const cl_mem& memory) : detail::Wrapper(memory) { } /*! \brief Assignment operator from Memory. * * This calls clRetainMemObject() on the parameter and clReleaseMemObject() * on the previous value held by this instance. */ Memory& operator = (const Memory& rhs) { if (this != &rhs) { detail::Wrapper::operator=(rhs); } return *this; } /*! \brief Assignment operator from cl_mem - takes ownership. * * This effectively transfers ownership of a refcount on the rhs and calls * clReleaseMemObject() on the value previously held by this instance. */ Memory& operator = (const cl_mem& rhs) { detail::Wrapper::operator=(rhs); return *this; } //! \brief Wrapper for clGetMemObjectInfo(). template cl_int getInfo(cl_mem_info name, T* param) const { return detail::errHandler( detail::getInfo(&::clGetMemObjectInfo, object_, name, param), __GET_MEM_OBJECT_INFO_ERR); } //! \brief Wrapper for clGetMemObjectInfo() that returns by value. template typename detail::param_traits::param_type getInfo(cl_int* err = NULL) const { typename detail::param_traits< detail::cl_mem_info, name>::param_type param; cl_int result = getInfo(name, ¶m); if (err != NULL) { *err = result; } return param; } #if defined(CL_VERSION_1_1) /*! \brief Registers a callback function to be called when the memory object * is no longer needed. * * Wraps clSetMemObjectDestructorCallback(). * * Repeated calls to this function, for a given cl_mem value, will append * to the list of functions called (in reverse order) when memory object's * resources are freed and the memory object is deleted. * * \note * The registered callbacks are associated with the underlying cl_mem * value - not the Memory class instance. */ cl_int setDestructorCallback( void (CL_CALLBACK * pfn_notify)(cl_mem, void *), void * user_data = NULL) { return detail::errHandler( ::clSetMemObjectDestructorCallback( object_, pfn_notify, user_data), __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR); } #endif }; // Pre-declare copy functions class Buffer; template< typename IteratorType > cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer ); template< typename IteratorType > cl_int copy( const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator ); /*! \brief Class interface for Buffer Memory Objects. * * See Memory for details about copy semantics, etc. * * \see Memory */ class Buffer : public Memory { public: /*! \brief Constructs a Buffer in a specified context. * * Wraps clCreateBuffer(). * * \param host_ptr Storage to be used if the CL_MEM_USE_HOST_PTR flag was * specified. Note alignment & exclusivity requirements. */ Buffer( const Context& context, cl_mem_flags flags, ::size_t size, void* host_ptr = NULL, cl_int* err = NULL) { cl_int error; object_ = ::clCreateBuffer(context(), flags, size, host_ptr, &error); detail::errHandler(error, __CREATE_BUFFER_ERR); if (err != NULL) { *err = error; } } /*! \brief Constructs a Buffer in the default context. * * Wraps clCreateBuffer(). * * \param host_ptr Storage to be used if the CL_MEM_USE_HOST_PTR flag was * specified. Note alignment & exclusivity requirements. * * \see Context::getDefault() */ Buffer( cl_mem_flags flags, ::size_t size, void* host_ptr = NULL, cl_int* err = NULL) { cl_int error; Context context = Context::getDefault(err); object_ = ::clCreateBuffer(context(), flags, size, host_ptr, &error); detail::errHandler(error, __CREATE_BUFFER_ERR); if (err != NULL) { *err = error; } } /*! * \brief Construct a Buffer from a host container via iterators. * If useHostPtr is specified iterators must be random access. */ template< typename IteratorType > Buffer( IteratorType startIterator, IteratorType endIterator, bool readOnly, bool useHostPtr = false, cl_int* err = NULL) { typedef typename std::iterator_traits::value_type DataType; cl_int error; cl_mem_flags flags = 0; if( readOnly ) { flags |= CL_MEM_READ_ONLY; } else { flags |= CL_MEM_READ_WRITE; } if( useHostPtr ) { flags |= CL_MEM_USE_HOST_PTR; } ::size_t size = sizeof(DataType)*(endIterator - startIterator); Context context = Context::getDefault(err); if( useHostPtr ) { object_ = ::clCreateBuffer(context(), flags, size, static_cast(&*startIterator), &error); } else { object_ = ::clCreateBuffer(context(), flags, size, 0, &error); } detail::errHandler(error, __CREATE_BUFFER_ERR); if (err != NULL) { *err = error; } if( !useHostPtr ) { error = cl::copy(startIterator, endIterator, *this); detail::errHandler(error, __CREATE_BUFFER_ERR); if (err != NULL) { *err = error; } } } //! \brief Default constructor - initializes to NULL. Buffer() : Memory() { } /*! \brief Copy constructor - performs shallow copy. * * See Memory for further details. */ Buffer(const Buffer& buffer) : Memory(buffer) { } /*! \brief Constructor from cl_mem - takes ownership. * * See Memory for further details. */ __CL_EXPLICIT_CONSTRUCTORS Buffer(const cl_mem& buffer) : Memory(buffer) { } /*! \brief Assignment from Buffer - performs shallow copy. * * See Memory for further details. */ Buffer& operator = (const Buffer& rhs) { if (this != &rhs) { Memory::operator=(rhs); } return *this; } /*! \brief Assignment from cl_mem - performs shallow copy. * * See Memory for further details. */ Buffer& operator = (const cl_mem& rhs) { Memory::operator=(rhs); return *this; } #if defined(CL_VERSION_1_1) /*! \brief Creates a new buffer object from this. * * Wraps clCreateSubBuffer(). */ Buffer createSubBuffer( cl_mem_flags flags, cl_buffer_create_type buffer_create_type, const void * buffer_create_info, cl_int * err = NULL) { Buffer result; cl_int error; result.object_ = ::clCreateSubBuffer( object_, flags, buffer_create_type, buffer_create_info, &error); detail::errHandler(error, __CREATE_SUBBUFFER_ERR); if (err != NULL) { *err = error; } return result; } #endif }; #if defined (USE_DX_INTEROP) /*! \brief Class interface for creating OpenCL buffers from ID3D10Buffer's. * * This is provided to facilitate interoperability with Direct3D. * * See Memory for details about copy semantics, etc. * * \see Memory */ class BufferD3D10 : public Buffer { public: typedef CL_API_ENTRY cl_mem (CL_API_CALL *PFN_clCreateFromD3D10BufferKHR)( cl_context context, cl_mem_flags flags, ID3D10Buffer* buffer, cl_int* errcode_ret); /*! \brief Constructs a BufferD3D10, in a specified context, from a * given ID3D10Buffer. * * Wraps clCreateFromD3D10BufferKHR(). */ BufferD3D10( const Context& context, cl_mem_flags flags, ID3D10Buffer* bufobj, cl_int * err = NULL) { static PFN_clCreateFromD3D10BufferKHR pfn_clCreateFromD3D10BufferKHR = NULL; #if defined(CL_VERSION_1_2) vector props = context.getInfo(); cl_platform platform = -1; for( int i = 0; i < props.size(); ++i ) { if( props[i] == CL_CONTEXT_PLATFORM ) { platform = props[i+1]; } } __INIT_CL_EXT_FCN_PTR_PLATFORM(platform, clCreateFromD3D10BufferKHR); #endif #if defined(CL_VERSION_1_1) __INIT_CL_EXT_FCN_PTR(clCreateFromD3D10BufferKHR); #endif cl_int error; object_ = pfn_clCreateFromD3D10BufferKHR( context(), flags, bufobj, &error); detail::errHandler(error, __CREATE_GL_BUFFER_ERR); if (err != NULL) { *err = error; } } //! \brief Default constructor - initializes to NULL. BufferD3D10() : Buffer() { } /*! \brief Copy constructor - performs shallow copy. * * See Memory for further details. */ BufferD3D10(const BufferD3D10& buffer) : Buffer(buffer) { } /*! \brief Constructor from cl_mem - takes ownership. * * See Memory for further details. */ __CL_EXPLICIT_CONSTRUCTORS BufferD3D10(const cl_mem& buffer) : Buffer(buffer) { } /*! \brief Assignment from BufferD3D10 - performs shallow copy. * * See Memory for further details. */ BufferD3D10& operator = (const BufferD3D10& rhs) { if (this != &rhs) { Buffer::operator=(rhs); } return *this; } /*! \brief Assignment from cl_mem - performs shallow copy. * * See Memory for further details. */ BufferD3D10& operator = (const cl_mem& rhs) { Buffer::operator=(rhs); return *this; } }; #endif /*! \brief Class interface for GL Buffer Memory Objects. * * This is provided to facilitate interoperability with OpenGL. * * See Memory for details about copy semantics, etc. * * \see Memory */ class BufferGL : public Buffer { public: /*! \brief Constructs a BufferGL in a specified context, from a given * GL buffer. * * Wraps clCreateFromGLBuffer(). */ BufferGL( const Context& context, cl_mem_flags flags, GLuint bufobj, cl_int * err = NULL) { cl_int error; object_ = ::clCreateFromGLBuffer( context(), flags, bufobj, &error); detail::errHandler(error, __CREATE_GL_BUFFER_ERR); if (err != NULL) { *err = error; } } //! \brief Default constructor - initializes to NULL. BufferGL() : Buffer() { } /*! \brief Copy constructor - performs shallow copy. * * See Memory for further details. */ BufferGL(const BufferGL& buffer) : Buffer(buffer) { } /*! \brief Constructor from cl_mem - takes ownership. * * See Memory for further details. */ __CL_EXPLICIT_CONSTRUCTORS BufferGL(const cl_mem& buffer) : Buffer(buffer) { } /*! \brief Assignment from BufferGL - performs shallow copy. * * See Memory for further details. */ BufferGL& operator = (const BufferGL& rhs) { if (this != &rhs) { Buffer::operator=(rhs); } return *this; } /*! \brief Assignment from cl_mem - performs shallow copy. * * See Memory for further details. */ BufferGL& operator = (const cl_mem& rhs) { Buffer::operator=(rhs); return *this; } //! \brief Wrapper for clGetGLObjectInfo(). cl_int getObjectInfo( cl_gl_object_type *type, GLuint * gl_object_name) { return detail::errHandler( ::clGetGLObjectInfo(object_,type,gl_object_name), __GET_GL_OBJECT_INFO_ERR); } }; /*! \brief Class interface for GL Render Buffer Memory Objects. * * This is provided to facilitate interoperability with OpenGL. * * See Memory for details about copy semantics, etc. * * \see Memory */ class BufferRenderGL : public Buffer { public: /*! \brief Constructs a BufferRenderGL in a specified context, from a given * GL Renderbuffer. * * Wraps clCreateFromGLRenderbuffer(). */ BufferRenderGL( const Context& context, cl_mem_flags flags, GLuint bufobj, cl_int * err = NULL) { cl_int error; object_ = ::clCreateFromGLRenderbuffer( context(), flags, bufobj, &error); detail::errHandler(error, __CREATE_GL_RENDER_BUFFER_ERR); if (err != NULL) { *err = error; } } //! \brief Default constructor - initializes to NULL. BufferRenderGL() : Buffer() { } /*! \brief Copy constructor - performs shallow copy. * * See Memory for further details. */ BufferRenderGL(const BufferGL& buffer) : Buffer(buffer) { } /*! \brief Constructor from cl_mem - takes ownership. * * See Memory for further details. */ __CL_EXPLICIT_CONSTRUCTORS BufferRenderGL(const cl_mem& buffer) : Buffer(buffer) { } /*! \brief Assignment from BufferGL - performs shallow copy. * * See Memory for further details. */ BufferRenderGL& operator = (const BufferRenderGL& rhs) { if (this != &rhs) { Buffer::operator=(rhs); } return *this; } /*! \brief Assignment from cl_mem - performs shallow copy. * * See Memory for further details. */ BufferRenderGL& operator = (const cl_mem& rhs) { Buffer::operator=(rhs); return *this; } //! \brief Wrapper for clGetGLObjectInfo(). cl_int getObjectInfo( cl_gl_object_type *type, GLuint * gl_object_name) { return detail::errHandler( ::clGetGLObjectInfo(object_,type,gl_object_name), __GET_GL_OBJECT_INFO_ERR); } }; /*! \brief C++ base class for Image Memory objects. * * See Memory for details about copy semantics, etc. * * \see Memory */ class Image : public Memory { protected: //! \brief Default constructor - initializes to NULL. Image() : Memory() { } /*! \brief Copy constructor - performs shallow copy. * * See Memory for further details. */ Image(const Image& image) : Memory(image) { } /*! \brief Constructor from cl_mem - takes ownership. * * See Memory for further details. */ __CL_EXPLICIT_CONSTRUCTORS Image(const cl_mem& image) : Memory(image) { } /*! \brief Assignment from Image - performs shallow copy. * * See Memory for further details. */ Image& operator = (const Image& rhs) { if (this != &rhs) { Memory::operator=(rhs); } return *this; } /*! \brief Assignment from cl_mem - performs shallow copy. * * See Memory for further details. */ Image& operator = (const cl_mem& rhs) { Memory::operator=(rhs); return *this; } public: //! \brief Wrapper for clGetImageInfo(). template cl_int getImageInfo(cl_image_info name, T* param) const { return detail::errHandler( detail::getInfo(&::clGetImageInfo, object_, name, param), __GET_IMAGE_INFO_ERR); } //! \brief Wrapper for clGetImageInfo() that returns by value. template typename detail::param_traits::param_type getImageInfo(cl_int* err = NULL) const { typename detail::param_traits< detail::cl_image_info, name>::param_type param; cl_int result = getImageInfo(name, ¶m); if (err != NULL) { *err = result; } return param; } }; #if defined(CL_VERSION_1_2) /*! \brief Class interface for 1D Image Memory objects. * * See Memory for details about copy semantics, etc. * * \see Memory */ class Image1D : public Image { public: /*! \brief Constructs a 1D Image in a specified context. * * Wraps clCreateImage(). */ Image1D( const Context& context, cl_mem_flags flags, ImageFormat format, ::size_t width, void* host_ptr = NULL, cl_int* err = NULL) { cl_int error; cl_image_desc desc; desc.image_type = CL_MEM_OBJECT_IMAGE1D; desc.image_width = width; desc.image_row_pitch = 0; desc.num_mip_levels = 0; desc.num_samples = 0; desc.buffer = 0; object_ = ::clCreateImage( context(), flags, &format, &desc, host_ptr, &error); detail::errHandler(error, __CREATE_IMAGE_ERR); if (err != NULL) { *err = error; } } //! \brief Default constructor - initializes to NULL. Image1D() { } /*! \brief Copy constructor - performs shallow copy. * * See Memory for further details. */ Image1D(const Image1D& image1D) : Image(image1D) { } /*! \brief Constructor from cl_mem - takes ownership. * * See Memory for further details. */ __CL_EXPLICIT_CONSTRUCTORS Image1D(const cl_mem& image1D) : Image(image1D) { } /*! \brief Assignment from Image1D - performs shallow copy. * * See Memory for further details. */ Image1D& operator = (const Image1D& rhs) { if (this != &rhs) { Image::operator=(rhs); } return *this; } /*! \brief Assignment from cl_mem - performs shallow copy. * * See Memory for further details. */ Image1D& operator = (const cl_mem& rhs) { Image::operator=(rhs); return *this; } }; /*! \class Image1DBuffer * \brief Image interface for 1D buffer images. */ class Image1DBuffer : public Image { public: Image1DBuffer( const Context& context, cl_mem_flags flags, ImageFormat format, ::size_t width, const Buffer &buffer, cl_int* err = NULL) { cl_int error; cl_image_desc desc; desc.image_type = CL_MEM_OBJECT_IMAGE1D_BUFFER; desc.image_width = width; desc.image_row_pitch = 0; desc.num_mip_levels = 0; desc.num_samples = 0; desc.buffer = buffer(); object_ = ::clCreateImage( context(), flags, &format, &desc, NULL, &error); detail::errHandler(error, __CREATE_IMAGE_ERR); if (err != NULL) { *err = error; } } Image1DBuffer() { } Image1DBuffer(const Image1DBuffer& image1D) : Image(image1D) { } __CL_EXPLICIT_CONSTRUCTORS Image1DBuffer(const cl_mem& image1D) : Image(image1D) { } Image1DBuffer& operator = (const Image1DBuffer& rhs) { if (this != &rhs) { Image::operator=(rhs); } return *this; } Image1DBuffer& operator = (const cl_mem& rhs) { Image::operator=(rhs); return *this; } }; /*! \class Image1DArray * \brief Image interface for arrays of 1D images. */ class Image1DArray : public Image { public: Image1DArray( const Context& context, cl_mem_flags flags, ImageFormat format, ::size_t arraySize, ::size_t width, ::size_t rowPitch, void* host_ptr = NULL, cl_int* err = NULL) { cl_int error; cl_image_desc desc; desc.image_type = CL_MEM_OBJECT_IMAGE1D_ARRAY; desc.image_array_size = arraySize; desc.image_width = width; desc.image_row_pitch = rowPitch; desc.num_mip_levels = 0; desc.num_samples = 0; desc.buffer = 0; object_ = ::clCreateImage( context(), flags, &format, &desc, host_ptr, &error); detail::errHandler(error, __CREATE_IMAGE_ERR); if (err != NULL) { *err = error; } } Image1DArray() { } Image1DArray(const Image1DArray& imageArray) : Image(imageArray) { } __CL_EXPLICIT_CONSTRUCTORS Image1DArray(const cl_mem& imageArray) : Image(imageArray) { } Image1DArray& operator = (const Image1DArray& rhs) { if (this != &rhs) { Image::operator=(rhs); } return *this; } Image1DArray& operator = (const cl_mem& rhs) { Image::operator=(rhs); return *this; } }; #endif // #if defined(CL_VERSION_1_2) /*! \brief Class interface for 2D Image Memory objects. * * See Memory for details about copy semantics, etc. * * \see Memory */ class Image2D : public Image { public: /*! \brief Constructs a 1D Image in a specified context. * * Wraps clCreateImage(). */ Image2D( const Context& context, cl_mem_flags flags, ImageFormat format, ::size_t width, ::size_t height, ::size_t row_pitch = 0, void* host_ptr = NULL, cl_int* err = NULL) { cl_int error; bool useCreateImage; #if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) // Run-time decision based on the actual platform { cl_uint version = detail::getContextPlatformVersion(context()); useCreateImage = (version >= 0x10002); // OpenCL 1.2 or above } #elif defined(CL_VERSION_1_2) useCreateImage = true; #else useCreateImage = false; #endif #if defined(CL_VERSION_1_2) if (useCreateImage) { cl_image_desc desc; desc.image_type = CL_MEM_OBJECT_IMAGE2D; desc.image_width = width; desc.image_height = height; desc.image_row_pitch = row_pitch; desc.num_mip_levels = 0; desc.num_samples = 0; desc.buffer = 0; object_ = ::clCreateImage( context(), flags, &format, &desc, host_ptr, &error); detail::errHandler(error, __CREATE_IMAGE_ERR); if (err != NULL) { *err = error; } } #endif // #if defined(CL_VERSION_1_2) #if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) if (!useCreateImage) { object_ = ::clCreateImage2D( context(), flags,&format, width, height, row_pitch, host_ptr, &error); detail::errHandler(error, __CREATE_IMAGE2D_ERR); if (err != NULL) { *err = error; } } #endif // #if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) } //! \brief Default constructor - initializes to NULL. Image2D() { } /*! \brief Copy constructor - performs shallow copy. * * See Memory for further details. */ Image2D(const Image2D& image2D) : Image(image2D) { } /*! \brief Constructor from cl_mem - takes ownership. * * See Memory for further details. */ __CL_EXPLICIT_CONSTRUCTORS Image2D(const cl_mem& image2D) : Image(image2D) { } /*! \brief Assignment from Image2D - performs shallow copy. * * See Memory for further details. */ Image2D& operator = (const Image2D& rhs) { if (this != &rhs) { Image::operator=(rhs); } return *this; } /*! \brief Assignment from cl_mem - performs shallow copy. * * See Memory for further details. */ Image2D& operator = (const cl_mem& rhs) { Image::operator=(rhs); return *this; } }; #if !defined(CL_VERSION_1_2) /*! \brief Class interface for GL 2D Image Memory objects. * * This is provided to facilitate interoperability with OpenGL. * * See Memory for details about copy semantics, etc. * * \see Memory * \note Deprecated for OpenCL 1.2. Please use ImageGL instead. */ class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED Image2DGL CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED : public Image2D { public: /*! \brief Constructs an Image2DGL in a specified context, from a given * GL Texture. * * Wraps clCreateFromGLTexture2D(). */ Image2DGL( const Context& context, cl_mem_flags flags, GLenum target, GLint miplevel, GLuint texobj, cl_int * err = NULL) { cl_int error; object_ = ::clCreateFromGLTexture2D( context(), flags, target, miplevel, texobj, &error); detail::errHandler(error, __CREATE_GL_TEXTURE_2D_ERR); if (err != NULL) { *err = error; } } //! \brief Default constructor - initializes to NULL. Image2DGL() : Image2D() { } /*! \brief Copy constructor - performs shallow copy. * * See Memory for further details. */ Image2DGL(const Image2DGL& image) : Image2D(image) { } /*! \brief Constructor from cl_mem - takes ownership. * * See Memory for further details. */ __CL_EXPLICIT_CONSTRUCTORS Image2DGL(const cl_mem& image) : Image2D(image) { } /*! \brief Assignment from Image2DGL - performs shallow copy. * * See Memory for further details. */ Image2DGL& operator = (const Image2DGL& rhs) { if (this != &rhs) { Image2D::operator=(rhs); } return *this; } /*! \brief Assignment from cl_mem - performs shallow copy. * * See Memory for further details. */ Image2DGL& operator = (const cl_mem& rhs) { Image2D::operator=(rhs); return *this; } }; #endif // #if !defined(CL_VERSION_1_2) #if defined(CL_VERSION_1_2) /*! \class Image2DArray * \brief Image interface for arrays of 2D images. */ class Image2DArray : public Image { public: Image2DArray( const Context& context, cl_mem_flags flags, ImageFormat format, ::size_t arraySize, ::size_t width, ::size_t height, ::size_t rowPitch, ::size_t slicePitch, void* host_ptr = NULL, cl_int* err = NULL) { cl_int error; cl_image_desc desc; desc.image_type = CL_MEM_OBJECT_IMAGE2D_ARRAY; desc.image_array_size = arraySize; desc.image_width = width; desc.image_height = height; desc.image_row_pitch = rowPitch; desc.image_slice_pitch = slicePitch; desc.num_mip_levels = 0; desc.num_samples = 0; desc.buffer = 0; object_ = ::clCreateImage( context(), flags, &format, &desc, host_ptr, &error); detail::errHandler(error, __CREATE_IMAGE_ERR); if (err != NULL) { *err = error; } } Image2DArray() { } Image2DArray(const Image2DArray& imageArray) : Image(imageArray) { } __CL_EXPLICIT_CONSTRUCTORS Image2DArray(const cl_mem& imageArray) : Image(imageArray) { } Image2DArray& operator = (const Image2DArray& rhs) { if (this != &rhs) { Image::operator=(rhs); } return *this; } Image2DArray& operator = (const cl_mem& rhs) { Image::operator=(rhs); return *this; } }; #endif // #if defined(CL_VERSION_1_2) /*! \brief Class interface for 3D Image Memory objects. * * See Memory for details about copy semantics, etc. * * \see Memory */ class Image3D : public Image { public: /*! \brief Constructs a 3D Image in a specified context. * * Wraps clCreateImage(). */ Image3D( const Context& context, cl_mem_flags flags, ImageFormat format, ::size_t width, ::size_t height, ::size_t depth, ::size_t row_pitch = 0, ::size_t slice_pitch = 0, void* host_ptr = NULL, cl_int* err = NULL) { cl_int error; bool useCreateImage; #if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) // Run-time decision based on the actual platform { cl_uint version = detail::getContextPlatformVersion(context()); useCreateImage = (version >= 0x10002); // OpenCL 1.2 or above } #elif defined(CL_VERSION_1_2) useCreateImage = true; #else useCreateImage = false; #endif #if defined(CL_VERSION_1_2) if (useCreateImage) { cl_image_desc desc; desc.image_type = CL_MEM_OBJECT_IMAGE3D; desc.image_width = width; desc.image_height = height; desc.image_depth = depth; desc.image_row_pitch = row_pitch; desc.image_slice_pitch = slice_pitch; desc.num_mip_levels = 0; desc.num_samples = 0; desc.buffer = 0; object_ = ::clCreateImage( context(), flags, &format, &desc, host_ptr, &error); detail::errHandler(error, __CREATE_IMAGE_ERR); if (err != NULL) { *err = error; } } #endif // #if defined(CL_VERSION_1_2) #if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) if (!useCreateImage) { object_ = ::clCreateImage3D( context(), flags, &format, width, height, depth, row_pitch, slice_pitch, host_ptr, &error); detail::errHandler(error, __CREATE_IMAGE3D_ERR); if (err != NULL) { *err = error; } } #endif // #if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) } //! \brief Default constructor - initializes to NULL. Image3D() { } /*! \brief Copy constructor - performs shallow copy. * * See Memory for further details. */ Image3D(const Image3D& image3D) : Image(image3D) { } /*! \brief Constructor from cl_mem - takes ownership. * * See Memory for further details. */ __CL_EXPLICIT_CONSTRUCTORS Image3D(const cl_mem& image3D) : Image(image3D) { } /*! \brief Assignment from Image3D - performs shallow copy. * * See Memory for further details. */ Image3D& operator = (const Image3D& rhs) { if (this != &rhs) { Image::operator=(rhs); } return *this; } /*! \brief Assignment from cl_mem - performs shallow copy. * * See Memory for further details. */ Image3D& operator = (const cl_mem& rhs) { Image::operator=(rhs); return *this; } }; #if !defined(CL_VERSION_1_2) /*! \brief Class interface for GL 3D Image Memory objects. * * This is provided to facilitate interoperability with OpenGL. * * See Memory for details about copy semantics, etc. * * \see Memory */ class Image3DGL : public Image3D { public: /*! \brief Constructs an Image3DGL in a specified context, from a given * GL Texture. * * Wraps clCreateFromGLTexture3D(). */ Image3DGL( const Context& context, cl_mem_flags flags, GLenum target, GLint miplevel, GLuint texobj, cl_int * err = NULL) { cl_int error; object_ = ::clCreateFromGLTexture3D( context(), flags, target, miplevel, texobj, &error); detail::errHandler(error, __CREATE_GL_TEXTURE_3D_ERR); if (err != NULL) { *err = error; } } //! \brief Default constructor - initializes to NULL. Image3DGL() : Image3D() { } /*! \brief Copy constructor - performs shallow copy. * * See Memory for further details. */ Image3DGL(const Image3DGL& image) : Image3D(image) { } /*! \brief Constructor from cl_mem - takes ownership. * * See Memory for further details. */ __CL_EXPLICIT_CONSTRUCTORS Image3DGL(const cl_mem& image) : Image3D(image) { } /*! \brief Assignment from Image3DGL - performs shallow copy. * * See Memory for further details. */ Image3DGL& operator = (const Image3DGL& rhs) { if (this != &rhs) { Image3D::operator=(rhs); } return *this; } /*! \brief Assignment from cl_mem - performs shallow copy. * * See Memory for further details. */ Image3DGL& operator = (const cl_mem& rhs) { Image3D::operator=(rhs); return *this; } }; #endif // #if !defined(CL_VERSION_1_2) #if defined(CL_VERSION_1_2) /*! \class ImageGL * \brief general image interface for GL interop. * We abstract the 2D and 3D GL images into a single instance here * that wraps all GL sourced images on the grounds that setup information * was performed by OpenCL anyway. */ class ImageGL : public Image { public: ImageGL( const Context& context, cl_mem_flags flags, GLenum target, GLint miplevel, GLuint texobj, cl_int * err = NULL) { cl_int error; object_ = ::clCreateFromGLTexture( context(), flags, target, miplevel, texobj, &error); detail::errHandler(error, __CREATE_GL_TEXTURE_ERR); if (err != NULL) { *err = error; } } ImageGL() : Image() { } ImageGL(const ImageGL& image) : Image(image) { } __CL_EXPLICIT_CONSTRUCTORS ImageGL(const cl_mem& image) : Image(image) { } ImageGL& operator = (const ImageGL& rhs) { if (this != &rhs) { Image::operator=(rhs); } return *this; } ImageGL& operator = (const cl_mem& rhs) { Image::operator=(rhs); return *this; } }; #endif // #if defined(CL_VERSION_1_2) /*! \brief Class interface for cl_sampler. * * \note Copies of these objects are shallow, meaning that the copy will refer * to the same underlying cl_sampler as the original. For details, see * clRetainSampler() and clReleaseSampler(). * * \see cl_sampler */ class Sampler : public detail::Wrapper { public: /*! \brief Destructor. * * This calls clReleaseSampler() on the value held by this instance. */ ~Sampler() { } //! \brief Default constructor - initializes to NULL. Sampler() { } /*! \brief Constructs a Sampler in a specified context. * * Wraps clCreateSampler(). */ Sampler( const Context& context, cl_bool normalized_coords, cl_addressing_mode addressing_mode, cl_filter_mode filter_mode, cl_int* err = NULL) { cl_int error; object_ = ::clCreateSampler( context(), normalized_coords, addressing_mode, filter_mode, &error); detail::errHandler(error, __CREATE_SAMPLER_ERR); if (err != NULL) { *err = error; } } /*! \brief Copy constructor - performs shallow copy. * * This calls clRetainSampler() on the parameter's cl_sampler. */ Sampler(const Sampler& sampler) : detail::Wrapper(sampler) { } /*! \brief Constructor from cl_sampler - takes ownership. * * This effectively transfers ownership of a refcount on the cl_sampler * into the new Sampler object. */ Sampler(const cl_sampler& sampler) : detail::Wrapper(sampler) { } /*! \brief Assignment operator from Sampler. * * This calls clRetainSampler() on the parameter and clReleaseSampler() * on the previous value held by this instance. */ Sampler& operator = (const Sampler& rhs) { if (this != &rhs) { detail::Wrapper::operator=(rhs); } return *this; } /*! \brief Assignment operator from cl_sampler - takes ownership. * * This effectively transfers ownership of a refcount on the rhs and calls * clReleaseSampler() on the value previously held by this instance. */ Sampler& operator = (const cl_sampler& rhs) { detail::Wrapper::operator=(rhs); return *this; } //! \brief Wrapper for clGetSamplerInfo(). template cl_int getInfo(cl_sampler_info name, T* param) const { return detail::errHandler( detail::getInfo(&::clGetSamplerInfo, object_, name, param), __GET_SAMPLER_INFO_ERR); } //! \brief Wrapper for clGetSamplerInfo() that returns by value. template typename detail::param_traits::param_type getInfo(cl_int* err = NULL) const { typename detail::param_traits< detail::cl_sampler_info, name>::param_type param; cl_int result = getInfo(name, ¶m); if (err != NULL) { *err = result; } return param; } }; class Program; class CommandQueue; class Kernel; //! \brief Class interface for specifying NDRange values. class NDRange { private: size_t<3> sizes_; cl_uint dimensions_; public: //! \brief Default constructor - resulting range has zero dimensions. NDRange() : dimensions_(0) { } //! \brief Constructs one-dimensional range. NDRange(::size_t size0) : dimensions_(1) { sizes_[0] = size0; } //! \brief Constructs two-dimensional range. NDRange(::size_t size0, ::size_t size1) : dimensions_(2) { sizes_[0] = size0; sizes_[1] = size1; } //! \brief Constructs three-dimensional range. NDRange(::size_t size0, ::size_t size1, ::size_t size2) : dimensions_(3) { sizes_[0] = size0; sizes_[1] = size1; sizes_[2] = size2; } /*! \brief Conversion operator to const ::size_t *. * * \returns a pointer to the size of the first dimension. */ operator const ::size_t*() const { return (const ::size_t*) sizes_; } //! \brief Queries the number of dimensions in the range. ::size_t dimensions() const { return dimensions_; } }; //! \brief A zero-dimensional range. static const NDRange NullRange; //! \brief Local address wrapper for use with Kernel::setArg struct LocalSpaceArg { ::size_t size_; }; namespace detail { template struct KernelArgumentHandler { static ::size_t size(const T&) { return sizeof(T); } static T* ptr(T& value) { return &value; } }; template <> struct KernelArgumentHandler { static ::size_t size(const LocalSpaceArg& value) { return value.size_; } static void* ptr(LocalSpaceArg&) { return NULL; } }; } //! \endcond /*! __local * \brief Helper function for generating LocalSpaceArg objects. * Deprecated. Replaced with Local. */ inline CL_EXT_PREFIX__VERSION_1_1_DEPRECATED LocalSpaceArg __local(::size_t size) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED; inline LocalSpaceArg __local(::size_t size) { LocalSpaceArg ret = { size }; return ret; } /*! Local * \brief Helper function for generating LocalSpaceArg objects. */ inline LocalSpaceArg Local(::size_t size) { LocalSpaceArg ret = { size }; return ret; } //class KernelFunctor; /*! \brief Class interface for cl_kernel. * * \note Copies of these objects are shallow, meaning that the copy will refer * to the same underlying cl_kernel as the original. For details, see * clRetainKernel() and clReleaseKernel(). * * \see cl_kernel */ class Kernel : public detail::Wrapper { public: inline Kernel(const Program& program, const char* name, cl_int* err = NULL); /*! \brief Destructor. * * This calls clReleaseKernel() on the value held by this instance. */ ~Kernel() { } //! \brief Default constructor - initializes to NULL. Kernel() { } /*! \brief Copy constructor - performs shallow copy. * * This calls clRetainKernel() on the parameter's cl_kernel. */ Kernel(const Kernel& kernel) : detail::Wrapper(kernel) { } /*! \brief Constructor from cl_kernel - takes ownership. * * This effectively transfers ownership of a refcount on the cl_kernel * into the new Kernel object. */ __CL_EXPLICIT_CONSTRUCTORS Kernel(const cl_kernel& kernel) : detail::Wrapper(kernel) { } /*! \brief Assignment operator from Kernel. * * This calls clRetainKernel() on the parameter and clReleaseKernel() * on the previous value held by this instance. */ Kernel& operator = (const Kernel& rhs) { if (this != &rhs) { detail::Wrapper::operator=(rhs); } return *this; } /*! \brief Assignment operator from cl_kernel - takes ownership. * * This effectively transfers ownership of a refcount on the rhs and calls * clReleaseKernel() on the value previously held by this instance. */ Kernel& operator = (const cl_kernel& rhs) { detail::Wrapper::operator=(rhs); return *this; } template cl_int getInfo(cl_kernel_info name, T* param) const { return detail::errHandler( detail::getInfo(&::clGetKernelInfo, object_, name, param), __GET_KERNEL_INFO_ERR); } template typename detail::param_traits::param_type getInfo(cl_int* err = NULL) const { typename detail::param_traits< detail::cl_kernel_info, name>::param_type param; cl_int result = getInfo(name, ¶m); if (err != NULL) { *err = result; } return param; } #if defined(CL_VERSION_1_2) template cl_int getArgInfo(cl_uint argIndex, cl_kernel_arg_info name, T* param) const { return detail::errHandler( detail::getInfo(&::clGetKernelArgInfo, object_, argIndex, name, param), __GET_KERNEL_ARG_INFO_ERR); } template typename detail::param_traits::param_type getArgInfo(cl_uint argIndex, cl_int* err = NULL) const { typename detail::param_traits< detail::cl_kernel_arg_info, name>::param_type param; cl_int result = getArgInfo(argIndex, name, ¶m); if (err != NULL) { *err = result; } return param; } #endif // #if defined(CL_VERSION_1_2) template cl_int getWorkGroupInfo( const Device& device, cl_kernel_work_group_info name, T* param) const { return detail::errHandler( detail::getInfo( &::clGetKernelWorkGroupInfo, object_, device(), name, param), __GET_KERNEL_WORK_GROUP_INFO_ERR); } template typename detail::param_traits::param_type getWorkGroupInfo(const Device& device, cl_int* err = NULL) const { typename detail::param_traits< detail::cl_kernel_work_group_info, name>::param_type param; cl_int result = getWorkGroupInfo(device, name, ¶m); if (err != NULL) { *err = result; } return param; } template cl_int setArg(cl_uint index, T value) { return detail::errHandler( ::clSetKernelArg( object_, index, detail::KernelArgumentHandler::size(value), detail::KernelArgumentHandler::ptr(value)), __SET_KERNEL_ARGS_ERR); } cl_int setArg(cl_uint index, ::size_t size, void* argPtr) { return detail::errHandler( ::clSetKernelArg(object_, index, size, argPtr), __SET_KERNEL_ARGS_ERR); } }; /*! \class Program * \brief Program interface that implements cl_program. */ class Program : public detail::Wrapper { public: typedef VECTOR_CLASS > Binaries; typedef VECTOR_CLASS > Sources; Program( const STRING_CLASS& source, cl_int* err = NULL) { cl_int error; const char * strings = source.c_str(); const ::size_t length = source.size(); Context context = Context::getDefault(err); object_ = ::clCreateProgramWithSource( context(), (cl_uint)1, &strings, &length, &error); detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR); if (error == CL_SUCCESS) { error = ::clBuildProgram( object_, 0, NULL, "", NULL, NULL); detail::errHandler(error, __BUILD_PROGRAM_ERR); } if (err != NULL) { *err = error; } } Program( const STRING_CLASS& source, bool build, cl_int* err = NULL) { cl_int error; const char * strings = source.c_str(); const ::size_t length = source.size(); Context context = Context::getDefault(err); object_ = ::clCreateProgramWithSource( context(), (cl_uint)1, &strings, &length, &error); detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR); if (error == CL_SUCCESS && build) { error = ::clBuildProgram( object_, 0, NULL, "", NULL, NULL); detail::errHandler(error, __BUILD_PROGRAM_ERR); } if (err != NULL) { *err = error; } } Program( const Context& context, const STRING_CLASS& source, bool build = false, cl_int* err = NULL) { cl_int error; const char * strings = source.c_str(); const ::size_t length = source.size(); object_ = ::clCreateProgramWithSource( context(), (cl_uint)1, &strings, &length, &error); detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR); if (error == CL_SUCCESS && build) { error = ::clBuildProgram( object_, 0, NULL, "", NULL, NULL); detail::errHandler(error, __BUILD_PROGRAM_ERR); } if (err != NULL) { *err = error; } } Program( const Context& context, const Sources& sources, cl_int* err = NULL) { cl_int error; const ::size_t n = (::size_t)sources.size(); ::size_t* lengths = (::size_t*) alloca(n * sizeof(::size_t)); const char** strings = (const char**) alloca(n * sizeof(const char*)); for (::size_t i = 0; i < n; ++i) { strings[i] = sources[(int)i].first; lengths[i] = sources[(int)i].second; } object_ = ::clCreateProgramWithSource( context(), (cl_uint)n, strings, lengths, &error); detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR); if (err != NULL) { *err = error; } } /** * Construct a program object from a list of devices and a per-device list of binaries. * \param context A valid OpenCL context in which to construct the program. * \param devices A vector of OpenCL device objects for which the program will be created. * \param binaries A vector of pairs of a pointer to a binary object and its length. * \param binaryStatus An optional vector that on completion will be resized to * match the size of binaries and filled with values to specify if each binary * was successfully loaded. * Set to CL_SUCCESS if the binary was successfully loaded. * Set to CL_INVALID_VALUE if the length is 0 or the binary pointer is NULL. * Set to CL_INVALID_BINARY if the binary provided is not valid for the matching device. * \param err if non-NULL will be set to CL_SUCCESS on successful operation or one of the following errors: * CL_INVALID_CONTEXT if context is not a valid context. * CL_INVALID_VALUE if the length of devices is zero; or if the length of binaries does not match the length of devices; * or if any entry in binaries is NULL or has length 0. * CL_INVALID_DEVICE if OpenCL devices listed in devices are not in the list of devices associated with context. * CL_INVALID_BINARY if an invalid program binary was encountered for any device. binaryStatus will return specific status for each device. * CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required by the OpenCL implementation on the host. */ Program( const Context& context, const VECTOR_CLASS& devices, const Binaries& binaries, VECTOR_CLASS* binaryStatus = NULL, cl_int* err = NULL) { cl_int error; const ::size_t numDevices = devices.size(); // Catch size mismatch early and return if(binaries.size() != numDevices) { error = CL_INVALID_VALUE; detail::errHandler(error, __CREATE_PROGRAM_WITH_BINARY_ERR); if (err != NULL) { *err = error; } return; } ::size_t* lengths = (::size_t*) alloca(numDevices * sizeof(::size_t)); const unsigned char** images = (const unsigned char**) alloca(numDevices * sizeof(const unsigned char**)); for (::size_t i = 0; i < numDevices; ++i) { images[i] = (const unsigned char*)binaries[i].first; lengths[i] = binaries[(int)i].second; } cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id)); for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) { deviceIDs[deviceIndex] = (devices[deviceIndex])(); } if(binaryStatus) { binaryStatus->resize(numDevices); } object_ = ::clCreateProgramWithBinary( context(), (cl_uint) devices.size(), deviceIDs, lengths, images, binaryStatus != NULL ? &binaryStatus->front() : NULL, &error); detail::errHandler(error, __CREATE_PROGRAM_WITH_BINARY_ERR); if (err != NULL) { *err = error; } } #if defined(CL_VERSION_1_2) /** * Create program using builtin kernels. * \param kernelNames Semi-colon separated list of builtin kernel names */ Program( const Context& context, const VECTOR_CLASS& devices, const STRING_CLASS& kernelNames, cl_int* err = NULL) { cl_int error; ::size_t numDevices = devices.size(); cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id)); for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) { deviceIDs[deviceIndex] = (devices[deviceIndex])(); } object_ = ::clCreateProgramWithBuiltInKernels( context(), (cl_uint) devices.size(), deviceIDs, kernelNames.c_str(), &error); detail::errHandler(error, __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR); if (err != NULL) { *err = error; } } #endif // #if defined(CL_VERSION_1_2) Program() { } Program(const Program& program) : detail::Wrapper(program) { } __CL_EXPLICIT_CONSTRUCTORS Program(const cl_program& program) : detail::Wrapper(program) { } Program& operator = (const Program& rhs) { if (this != &rhs) { detail::Wrapper::operator=(rhs); } return *this; } Program& operator = (const cl_program& rhs) { detail::Wrapper::operator=(rhs); return *this; } cl_int build( const VECTOR_CLASS& devices, const char* options = NULL, void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL, void* data = NULL) const { ::size_t numDevices = devices.size(); cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id)); for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) { deviceIDs[deviceIndex] = (devices[deviceIndex])(); } return detail::errHandler( ::clBuildProgram( object_, (cl_uint) devices.size(), deviceIDs, options, notifyFptr, data), __BUILD_PROGRAM_ERR); } cl_int build( const char* options = NULL, void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL, void* data = NULL) const { return detail::errHandler( ::clBuildProgram( object_, 0, NULL, options, notifyFptr, data), __BUILD_PROGRAM_ERR); } #if defined(CL_VERSION_1_2) cl_int compile( const char* options = NULL, void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL, void* data = NULL) const { return detail::errHandler( ::clCompileProgram( object_, 0, NULL, options, 0, NULL, NULL, notifyFptr, data), __COMPILE_PROGRAM_ERR); } #endif template cl_int getInfo(cl_program_info name, T* param) const { return detail::errHandler( detail::getInfo(&::clGetProgramInfo, object_, name, param), __GET_PROGRAM_INFO_ERR); } template typename detail::param_traits::param_type getInfo(cl_int* err = NULL) const { typename detail::param_traits< detail::cl_program_info, name>::param_type param; cl_int result = getInfo(name, ¶m); if (err != NULL) { *err = result; } return param; } template cl_int getBuildInfo( const Device& device, cl_program_build_info name, T* param) const { return detail::errHandler( detail::getInfo( &::clGetProgramBuildInfo, object_, device(), name, param), __GET_PROGRAM_BUILD_INFO_ERR); } template typename detail::param_traits::param_type getBuildInfo(const Device& device, cl_int* err = NULL) const { typename detail::param_traits< detail::cl_program_build_info, name>::param_type param; cl_int result = getBuildInfo(device, name, ¶m); if (err != NULL) { *err = result; } return param; } cl_int createKernels(VECTOR_CLASS* kernels) { cl_uint numKernels; cl_int err = ::clCreateKernelsInProgram(object_, 0, NULL, &numKernels); if (err != CL_SUCCESS) { return detail::errHandler(err, __CREATE_KERNELS_IN_PROGRAM_ERR); } Kernel* value = (Kernel*) alloca(numKernels * sizeof(Kernel)); err = ::clCreateKernelsInProgram( object_, numKernels, (cl_kernel*) value, NULL); if (err != CL_SUCCESS) { return detail::errHandler(err, __CREATE_KERNELS_IN_PROGRAM_ERR); } kernels->assign(&value[0], &value[numKernels]); return CL_SUCCESS; } }; #if defined(CL_VERSION_1_2) inline Program linkProgram( Program input1, Program input2, const char* options = NULL, void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL, void* data = NULL, cl_int* err = NULL) { cl_int err_local = CL_SUCCESS; cl_program programs[2] = { input1(), input2() }; Context ctx = input1.getInfo(); cl_program prog = ::clLinkProgram( ctx(), 0, NULL, options, 2, programs, notifyFptr, data, &err_local); detail::errHandler(err_local,__COMPILE_PROGRAM_ERR); if (err != NULL) { *err = err_local; } return Program(prog); } inline Program linkProgram( VECTOR_CLASS inputPrograms, const char* options = NULL, void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL, void* data = NULL, cl_int* err = NULL) { cl_int err_local = CL_SUCCESS; cl_program * programs = (cl_program*) alloca(inputPrograms.size() * sizeof(cl_program)); if (programs != NULL) { for (unsigned int i = 0; i < inputPrograms.size(); i++) { programs[i] = inputPrograms[i](); } } cl_program prog = ::clLinkProgram( Context::getDefault()(), 0, NULL, options, (cl_uint)inputPrograms.size(), programs, notifyFptr, data, &err_local); detail::errHandler(err_local,__COMPILE_PROGRAM_ERR); if (err != NULL) { *err = err_local; } return Program(prog); } #endif template<> inline VECTOR_CLASS cl::Program::getInfo(cl_int* err) const { VECTOR_CLASS< ::size_t> sizes = getInfo(); VECTOR_CLASS binaries; for (VECTOR_CLASS< ::size_t>::iterator s = sizes.begin(); s != sizes.end(); ++s) { char *ptr = NULL; if (*s != 0) ptr = new char[*s]; binaries.push_back(ptr); } cl_int result = getInfo(CL_PROGRAM_BINARIES, &binaries); if (err != NULL) { *err = result; } return binaries; } inline Kernel::Kernel(const Program& program, const char* name, cl_int* err) { cl_int error; object_ = ::clCreateKernel(program(), name, &error); detail::errHandler(error, __CREATE_KERNEL_ERR); if (err != NULL) { *err = error; } } /*! \class CommandQueue * \brief CommandQueue interface for cl_command_queue. */ class CommandQueue : public detail::Wrapper { private: static volatile int default_initialized_; static CommandQueue default_; static volatile cl_int default_error_; public: CommandQueue( cl_command_queue_properties properties, cl_int* err = NULL) { cl_int error; Context context = Context::getDefault(&error); detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR); if (error != CL_SUCCESS) { if (err != NULL) { *err = error; } } else { Device device = context.getInfo()[0]; object_ = ::clCreateCommandQueue( context(), device(), properties, &error); detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR); if (err != NULL) { *err = error; } } } CommandQueue( const Context& context, const Device& device, cl_command_queue_properties properties = 0, cl_int* err = NULL) { cl_int error; object_ = ::clCreateCommandQueue( context(), device(), properties, &error); detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR); if (err != NULL) { *err = error; } } static CommandQueue getDefault(cl_int * err = NULL) { int state = detail::compare_exchange( &default_initialized_, __DEFAULT_BEING_INITIALIZED, __DEFAULT_NOT_INITIALIZED); if (state & __DEFAULT_INITIALIZED) { if (err != NULL) { *err = default_error_; } return default_; } if (state & __DEFAULT_BEING_INITIALIZED) { // Assume writes will propagate eventually... while(default_initialized_ != __DEFAULT_INITIALIZED) { detail::fence(); } if (err != NULL) { *err = default_error_; } return default_; } cl_int error; Context context = Context::getDefault(&error); detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR); if (error != CL_SUCCESS) { if (err != NULL) { *err = error; } } else { Device device = context.getInfo()[0]; default_ = CommandQueue(context, device, 0, &error); detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR); if (err != NULL) { *err = error; } } detail::fence(); default_error_ = error; // Assume writes will propagate eventually... default_initialized_ = __DEFAULT_INITIALIZED; detail::fence(); if (err != NULL) { *err = default_error_; } return default_; } CommandQueue() { } CommandQueue(const CommandQueue& commandQueue) : detail::Wrapper(commandQueue) { } CommandQueue(const cl_command_queue& commandQueue) : detail::Wrapper(commandQueue) { } CommandQueue& operator = (const CommandQueue& rhs) { if (this != &rhs) { detail::Wrapper::operator=(rhs); } return *this; } CommandQueue& operator = (const cl_command_queue& rhs) { detail::Wrapper::operator=(rhs); return *this; } template cl_int getInfo(cl_command_queue_info name, T* param) const { return detail::errHandler( detail::getInfo( &::clGetCommandQueueInfo, object_, name, param), __GET_COMMAND_QUEUE_INFO_ERR); } template typename detail::param_traits::param_type getInfo(cl_int* err = NULL) const { typename detail::param_traits< detail::cl_command_queue_info, name>::param_type param; cl_int result = getInfo(name, ¶m); if (err != NULL) { *err = result; } return param; } cl_int enqueueReadBuffer( const Buffer& buffer, cl_bool blocking, ::size_t offset, ::size_t size, void* ptr, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { cl_event tmp; cl_int err = detail::errHandler( ::clEnqueueReadBuffer( object_, buffer(), blocking, offset, size, ptr, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQUEUE_READ_BUFFER_ERR); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } cl_int enqueueWriteBuffer( const Buffer& buffer, cl_bool blocking, ::size_t offset, ::size_t size, const void* ptr, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { cl_event tmp; cl_int err = detail::errHandler( ::clEnqueueWriteBuffer( object_, buffer(), blocking, offset, size, ptr, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQUEUE_WRITE_BUFFER_ERR); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } cl_int enqueueCopyBuffer( const Buffer& src, const Buffer& dst, ::size_t src_offset, ::size_t dst_offset, ::size_t size, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { cl_event tmp; cl_int err = detail::errHandler( ::clEnqueueCopyBuffer( object_, src(), dst(), src_offset, dst_offset, size, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQEUE_COPY_BUFFER_ERR); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } cl_int enqueueReadBufferRect( const Buffer& buffer, cl_bool blocking, const size_t<3>& buffer_offset, const size_t<3>& host_offset, const size_t<3>& region, ::size_t buffer_row_pitch, ::size_t buffer_slice_pitch, ::size_t host_row_pitch, ::size_t host_slice_pitch, void *ptr, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { cl_event tmp; cl_int err = detail::errHandler( ::clEnqueueReadBufferRect( object_, buffer(), blocking, (const ::size_t *)buffer_offset, (const ::size_t *)host_offset, (const ::size_t *)region, buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch, ptr, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQUEUE_READ_BUFFER_RECT_ERR); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } cl_int enqueueWriteBufferRect( const Buffer& buffer, cl_bool blocking, const size_t<3>& buffer_offset, const size_t<3>& host_offset, const size_t<3>& region, ::size_t buffer_row_pitch, ::size_t buffer_slice_pitch, ::size_t host_row_pitch, ::size_t host_slice_pitch, void *ptr, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { cl_event tmp; cl_int err = detail::errHandler( ::clEnqueueWriteBufferRect( object_, buffer(), blocking, (const ::size_t *)buffer_offset, (const ::size_t *)host_offset, (const ::size_t *)region, buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch, ptr, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQUEUE_WRITE_BUFFER_RECT_ERR); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } cl_int enqueueCopyBufferRect( const Buffer& src, const Buffer& dst, const size_t<3>& src_origin, const size_t<3>& dst_origin, const size_t<3>& region, ::size_t src_row_pitch, ::size_t src_slice_pitch, ::size_t dst_row_pitch, ::size_t dst_slice_pitch, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { cl_event tmp; cl_int err = detail::errHandler( ::clEnqueueCopyBufferRect( object_, src(), dst(), (const ::size_t *)src_origin, (const ::size_t *)dst_origin, (const ::size_t *)region, src_row_pitch, src_slice_pitch, dst_row_pitch, dst_slice_pitch, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQEUE_COPY_BUFFER_RECT_ERR); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } #if defined(CL_VERSION_1_2) /** * Enqueue a command to fill a buffer object with a pattern * of a given size. The pattern is specified a as vector. * \tparam PatternType The datatype of the pattern field. * The pattern type must be an accepted OpenCL data type. */ template cl_int enqueueFillBuffer( const Buffer& buffer, PatternType pattern, ::size_t offset, ::size_t size, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { cl_event tmp; cl_int err = detail::errHandler( ::clEnqueueFillBuffer( object_, buffer(), static_cast(&pattern), sizeof(PatternType), offset, size, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQUEUE_FILL_BUFFER_ERR); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } #endif // #if defined(CL_VERSION_1_2) cl_int enqueueReadImage( const Image& image, cl_bool blocking, const size_t<3>& origin, const size_t<3>& region, ::size_t row_pitch, ::size_t slice_pitch, void* ptr, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { cl_event tmp; cl_int err = detail::errHandler( ::clEnqueueReadImage( object_, image(), blocking, (const ::size_t *) origin, (const ::size_t *) region, row_pitch, slice_pitch, ptr, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQUEUE_READ_IMAGE_ERR); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } cl_int enqueueWriteImage( const Image& image, cl_bool blocking, const size_t<3>& origin, const size_t<3>& region, ::size_t row_pitch, ::size_t slice_pitch, void* ptr, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { cl_event tmp; cl_int err = detail::errHandler( ::clEnqueueWriteImage( object_, image(), blocking, (const ::size_t *) origin, (const ::size_t *) region, row_pitch, slice_pitch, ptr, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQUEUE_WRITE_IMAGE_ERR); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } cl_int enqueueCopyImage( const Image& src, const Image& dst, const size_t<3>& src_origin, const size_t<3>& dst_origin, const size_t<3>& region, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { cl_event tmp; cl_int err = detail::errHandler( ::clEnqueueCopyImage( object_, src(), dst(), (const ::size_t *) src_origin, (const ::size_t *)dst_origin, (const ::size_t *) region, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQUEUE_COPY_IMAGE_ERR); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } #if defined(CL_VERSION_1_2) /** * Enqueue a command to fill an image object with a specified color. * \param fillColor is the color to use to fill the image. * This is a four component RGBA floating-point color value if * the image channel data type is not an unnormalized signed or * unsigned data type. */ cl_int enqueueFillImage( const Image& image, cl_float4 fillColor, const size_t<3>& origin, const size_t<3>& region, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { cl_event tmp; cl_int err = detail::errHandler( ::clEnqueueFillImage( object_, image(), static_cast(&fillColor), (const ::size_t *) origin, (const ::size_t *) region, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQUEUE_FILL_IMAGE_ERR); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } /** * Enqueue a command to fill an image object with a specified color. * \param fillColor is the color to use to fill the image. * This is a four component RGBA signed integer color value if * the image channel data type is an unnormalized signed integer * type. */ cl_int enqueueFillImage( const Image& image, cl_int4 fillColor, const size_t<3>& origin, const size_t<3>& region, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { cl_event tmp; cl_int err = detail::errHandler( ::clEnqueueFillImage( object_, image(), static_cast(&fillColor), (const ::size_t *) origin, (const ::size_t *) region, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQUEUE_FILL_IMAGE_ERR); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } /** * Enqueue a command to fill an image object with a specified color. * \param fillColor is the color to use to fill the image. * This is a four component RGBA unsigned integer color value if * the image channel data type is an unnormalized unsigned integer * type. */ cl_int enqueueFillImage( const Image& image, cl_uint4 fillColor, const size_t<3>& origin, const size_t<3>& region, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { cl_event tmp; cl_int err = detail::errHandler( ::clEnqueueFillImage( object_, image(), static_cast(&fillColor), (const ::size_t *) origin, (const ::size_t *) region, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQUEUE_FILL_IMAGE_ERR); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } #endif // #if defined(CL_VERSION_1_2) cl_int enqueueCopyImageToBuffer( const Image& src, const Buffer& dst, const size_t<3>& src_origin, const size_t<3>& region, ::size_t dst_offset, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { cl_event tmp; cl_int err = detail::errHandler( ::clEnqueueCopyImageToBuffer( object_, src(), dst(), (const ::size_t *) src_origin, (const ::size_t *) region, dst_offset, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } cl_int enqueueCopyBufferToImage( const Buffer& src, const Image& dst, ::size_t src_offset, const size_t<3>& dst_origin, const size_t<3>& region, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { cl_event tmp; cl_int err = detail::errHandler( ::clEnqueueCopyBufferToImage( object_, src(), dst(), src_offset, (const ::size_t *) dst_origin, (const ::size_t *) region, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } void* enqueueMapBuffer( const Buffer& buffer, cl_bool blocking, cl_map_flags flags, ::size_t offset, ::size_t size, const VECTOR_CLASS* events = NULL, Event* event = NULL, cl_int* err = NULL) const { cl_int error; void * result = ::clEnqueueMapBuffer( object_, buffer(), blocking, flags, offset, size, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (cl_event*) event, &error); detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR); if (err != NULL) { *err = error; } return result; } void* enqueueMapImage( const Image& buffer, cl_bool blocking, cl_map_flags flags, const size_t<3>& origin, const size_t<3>& region, ::size_t * row_pitch, ::size_t * slice_pitch, const VECTOR_CLASS* events = NULL, Event* event = NULL, cl_int* err = NULL) const { cl_int error; void * result = ::clEnqueueMapImage( object_, buffer(), blocking, flags, (const ::size_t *) origin, (const ::size_t *) region, row_pitch, slice_pitch, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (cl_event*) event, &error); detail::errHandler(error, __ENQUEUE_MAP_IMAGE_ERR); if (err != NULL) { *err = error; } return result; } cl_int enqueueUnmapMemObject( const Memory& memory, void* mapped_ptr, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { cl_event tmp; cl_int err = detail::errHandler( ::clEnqueueUnmapMemObject( object_, memory(), mapped_ptr, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQUEUE_UNMAP_MEM_OBJECT_ERR); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } #if defined(CL_VERSION_1_2) /** * Enqueues a marker command which waits for either a list of events to complete, * or all previously enqueued commands to complete. * * Enqueues a marker command which waits for either a list of events to complete, * or if the list is empty it waits for all commands previously enqueued in command_queue * to complete before it completes. This command returns an event which can be waited on, * i.e. this event can be waited on to insure that all events either in the event_wait_list * or all previously enqueued commands, queued before this command to command_queue, * have completed. */ cl_int enqueueMarkerWithWaitList( const VECTOR_CLASS *events = 0, Event *event = 0) { cl_event tmp; cl_int err = detail::errHandler( ::clEnqueueMarkerWithWaitList( object_, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQUEUE_MARKER_WAIT_LIST_ERR); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } /** * A synchronization point that enqueues a barrier operation. * * Enqueues a barrier command which waits for either a list of events to complete, * or if the list is empty it waits for all commands previously enqueued in command_queue * to complete before it completes. This command blocks command execution, that is, any * following commands enqueued after it do not execute until it completes. This command * returns an event which can be waited on, i.e. this event can be waited on to insure that * all events either in the event_wait_list or all previously enqueued commands, queued * before this command to command_queue, have completed. */ cl_int enqueueBarrierWithWaitList( const VECTOR_CLASS *events = 0, Event *event = 0) { cl_event tmp; cl_int err = detail::errHandler( ::clEnqueueBarrierWithWaitList( object_, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQUEUE_BARRIER_WAIT_LIST_ERR); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } /** * Enqueues a command to indicate with which device a set of memory objects * should be associated. */ cl_int enqueueMigrateMemObjects( const VECTOR_CLASS &memObjects, cl_mem_migration_flags flags, const VECTOR_CLASS* events = NULL, Event* event = NULL ) { cl_event tmp; cl_mem* localMemObjects = static_cast(alloca(memObjects.size() * sizeof(cl_mem))); for( int i = 0; i < (int)memObjects.size(); ++i ) { localMemObjects[i] = memObjects[i](); } cl_int err = detail::errHandler( ::clEnqueueMigrateMemObjects( object_, (cl_uint)memObjects.size(), static_cast(localMemObjects), flags, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQUEUE_UNMAP_MEM_OBJECT_ERR); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } #endif // #if defined(CL_VERSION_1_2) cl_int enqueueNDRangeKernel( const Kernel& kernel, const NDRange& offset, const NDRange& global, const NDRange& local = NullRange, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { cl_event tmp; cl_int err = detail::errHandler( ::clEnqueueNDRangeKernel( object_, kernel(), (cl_uint) global.dimensions(), offset.dimensions() != 0 ? (const ::size_t*) offset : NULL, (const ::size_t*) global, local.dimensions() != 0 ? (const ::size_t*) local : NULL, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQUEUE_NDRANGE_KERNEL_ERR); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } cl_int enqueueTask( const Kernel& kernel, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { cl_event tmp; cl_int err = detail::errHandler( ::clEnqueueTask( object_, kernel(), (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQUEUE_TASK_ERR); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } cl_int enqueueNativeKernel( void (CL_CALLBACK *userFptr)(void *), std::pair args, const VECTOR_CLASS* mem_objects = NULL, const VECTOR_CLASS* mem_locs = NULL, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { cl_mem * mems = (mem_objects != NULL && mem_objects->size() > 0) ? (cl_mem*) alloca(mem_objects->size() * sizeof(cl_mem)) : NULL; if (mems != NULL) { for (unsigned int i = 0; i < mem_objects->size(); i++) { mems[i] = ((*mem_objects)[i])(); } } cl_event tmp; cl_int err = detail::errHandler( ::clEnqueueNativeKernel( object_, userFptr, args.first, args.second, (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0, mems, (mem_locs != NULL) ? (const void **) &mem_locs->front() : NULL, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQUEUE_NATIVE_KERNEL); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } /** * Deprecated APIs for 1.2 */ #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2)) CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_int enqueueMarker(Event* event = NULL) const CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED { return detail::errHandler( ::clEnqueueMarker(object_, (cl_event*) event), __ENQUEUE_MARKER_ERR); } CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_int enqueueWaitForEvents(const VECTOR_CLASS& events) const CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED { return detail::errHandler( ::clEnqueueWaitForEvents( object_, (cl_uint) events.size(), (const cl_event*) &events.front()), __ENQUEUE_WAIT_FOR_EVENTS_ERR); } #endif // #if defined(CL_VERSION_1_1) cl_int enqueueAcquireGLObjects( const VECTOR_CLASS* mem_objects = NULL, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { cl_event tmp; cl_int err = detail::errHandler( ::clEnqueueAcquireGLObjects( object_, (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0, (mem_objects != NULL) ? (const cl_mem *) &mem_objects->front(): NULL, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQUEUE_ACQUIRE_GL_ERR); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } cl_int enqueueReleaseGLObjects( const VECTOR_CLASS* mem_objects = NULL, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { cl_event tmp; cl_int err = detail::errHandler( ::clEnqueueReleaseGLObjects( object_, (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0, (mem_objects != NULL) ? (const cl_mem *) &mem_objects->front(): NULL, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQUEUE_RELEASE_GL_ERR); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } #if defined (USE_DX_INTEROP) typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueAcquireD3D10ObjectsKHR)( cl_command_queue command_queue, cl_uint num_objects, const cl_mem* mem_objects, cl_uint num_events_in_wait_list, const cl_event* event_wait_list, cl_event* event); typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueReleaseD3D10ObjectsKHR)( cl_command_queue command_queue, cl_uint num_objects, const cl_mem* mem_objects, cl_uint num_events_in_wait_list, const cl_event* event_wait_list, cl_event* event); cl_int enqueueAcquireD3D10Objects( const VECTOR_CLASS* mem_objects = NULL, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { static PFN_clEnqueueAcquireD3D10ObjectsKHR pfn_clEnqueueAcquireD3D10ObjectsKHR = NULL; #if defined(CL_VERSION_1_2) cl_context context = getInfo(); cl::Device device(getInfo()); cl_platform_id platform = device.getInfo(); __INIT_CL_EXT_FCN_PTR_PLATFORM(platform, clEnqueueAcquireD3D10ObjectsKHR); #endif #if defined(CL_VERSION_1_1) __INIT_CL_EXT_FCN_PTR(clEnqueueAcquireD3D10ObjectsKHR); #endif cl_event tmp; cl_int err = detail::errHandler( pfn_clEnqueueAcquireD3D10ObjectsKHR( object_, (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0, (mem_objects != NULL) ? (const cl_mem *) &mem_objects->front(): NULL, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQUEUE_ACQUIRE_GL_ERR); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } cl_int enqueueReleaseD3D10Objects( const VECTOR_CLASS* mem_objects = NULL, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { static PFN_clEnqueueReleaseD3D10ObjectsKHR pfn_clEnqueueReleaseD3D10ObjectsKHR = NULL; #if defined(CL_VERSION_1_2) cl_context context = getInfo(); cl::Device device(getInfo()); cl_platform_id platform = device.getInfo(); __INIT_CL_EXT_FCN_PTR_PLATFORM(platform, clEnqueueReleaseD3D10ObjectsKHR); #endif // #if defined(CL_VERSION_1_2) #if defined(CL_VERSION_1_1) __INIT_CL_EXT_FCN_PTR(clEnqueueReleaseD3D10ObjectsKHR); #endif // #if defined(CL_VERSION_1_1) cl_event tmp; cl_int err = detail::errHandler( pfn_clEnqueueReleaseD3D10ObjectsKHR( object_, (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0, (mem_objects != NULL) ? (const cl_mem *) &mem_objects->front(): NULL, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQUEUE_RELEASE_GL_ERR); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } #endif /** * Deprecated APIs for 1.2 */ #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2)) CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_int enqueueBarrier() const CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED { return detail::errHandler( ::clEnqueueBarrier(object_), __ENQUEUE_BARRIER_ERR); } #endif // #if defined(CL_VERSION_1_1) cl_int flush() const { return detail::errHandler(::clFlush(object_), __FLUSH_ERR); } cl_int finish() const { return detail::errHandler(::clFinish(object_), __FINISH_ERR); } }; #ifdef _WIN32 __declspec(selectany) volatile int CommandQueue::default_initialized_ = __DEFAULT_NOT_INITIALIZED; __declspec(selectany) CommandQueue CommandQueue::default_; __declspec(selectany) volatile cl_int CommandQueue::default_error_ = CL_SUCCESS; #else __attribute__((weak)) volatile int CommandQueue::default_initialized_ = __DEFAULT_NOT_INITIALIZED; __attribute__((weak)) CommandQueue CommandQueue::default_; __attribute__((weak)) volatile cl_int CommandQueue::default_error_ = CL_SUCCESS; #endif inline cl_int enqueueReadBuffer( const Buffer& buffer, cl_bool blocking, ::size_t offset, ::size_t size, void* ptr, const VECTOR_CLASS* events = NULL, Event* event = NULL) { cl_int error; CommandQueue queue = CommandQueue::getDefault(&error); if (error != CL_SUCCESS) { return error; } return queue.enqueueReadBuffer(buffer, blocking, offset, size, ptr, events, event); } inline cl_int enqueueWriteBuffer( const Buffer& buffer, cl_bool blocking, ::size_t offset, ::size_t size, const void* ptr, const VECTOR_CLASS* events = NULL, Event* event = NULL) { cl_int error; CommandQueue queue = CommandQueue::getDefault(&error); if (error != CL_SUCCESS) { return error; } return queue.enqueueWriteBuffer(buffer, blocking, offset, size, ptr, events, event); } inline void* enqueueMapBuffer( const Buffer& buffer, cl_bool blocking, cl_map_flags flags, ::size_t offset, ::size_t size, const VECTOR_CLASS* events = NULL, Event* event = NULL, cl_int* err = NULL) { cl_int error; CommandQueue queue = CommandQueue::getDefault(&error); detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR); if (err != NULL) { *err = error; } void * result = ::clEnqueueMapBuffer( queue(), buffer(), blocking, flags, offset, size, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (cl_event*) event, &error); detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR); if (err != NULL) { *err = error; } return result; } inline cl_int enqueueUnmapMemObject( const Memory& memory, void* mapped_ptr, const VECTOR_CLASS* events = NULL, Event* event = NULL) { cl_int error; CommandQueue queue = CommandQueue::getDefault(&error); detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR); if (error != CL_SUCCESS) { return error; } cl_event tmp; cl_int err = detail::errHandler( ::clEnqueueUnmapMemObject( queue(), memory(), mapped_ptr, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (event != NULL) ? &tmp : NULL), __ENQUEUE_UNMAP_MEM_OBJECT_ERR); if (event != NULL && err == CL_SUCCESS) *event = tmp; return err; } inline cl_int enqueueCopyBuffer( const Buffer& src, const Buffer& dst, ::size_t src_offset, ::size_t dst_offset, ::size_t size, const VECTOR_CLASS* events = NULL, Event* event = NULL) { cl_int error; CommandQueue queue = CommandQueue::getDefault(&error); if (error != CL_SUCCESS) { return error; } return queue.enqueueCopyBuffer(src, dst, src_offset, dst_offset, size, events, event); } /** * Blocking copy operation between iterators and a buffer. */ template< typename IteratorType > inline cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer ) { typedef typename std::iterator_traits::value_type DataType; cl_int error; ::size_t length = endIterator-startIterator; ::size_t byteLength = length*sizeof(DataType); DataType *pointer = static_cast(enqueueMapBuffer(buffer, CL_TRUE, CL_MAP_WRITE, 0, byteLength, 0, 0, &error)); // if exceptions enabled, enqueueMapBuffer will throw if( error != CL_SUCCESS ) { return error; } #if defined(_MSC_VER) std::copy( startIterator, endIterator, stdext::checked_array_iterator( pointer, length)); #else std::copy(startIterator, endIterator, pointer); #endif Event endEvent; error = enqueueUnmapMemObject(buffer, pointer, 0, &endEvent); // if exceptions enabled, enqueueUnmapMemObject will throw if( error != CL_SUCCESS ) { return error; } endEvent.wait(); return CL_SUCCESS; } /** * Blocking copy operation between iterators and a buffer. */ template< typename IteratorType > inline cl_int copy( const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator ) { typedef typename std::iterator_traits::value_type DataType; cl_int error; ::size_t length = endIterator-startIterator; ::size_t byteLength = length*sizeof(DataType); DataType *pointer = static_cast(enqueueMapBuffer(buffer, CL_TRUE, CL_MAP_READ, 0, byteLength, 0, 0, &error)); // if exceptions enabled, enqueueMapBuffer will throw if( error != CL_SUCCESS ) { return error; } std::copy(pointer, pointer + length, startIterator); Event endEvent; error = enqueueUnmapMemObject(buffer, pointer, 0, &endEvent); // if exceptions enabled, enqueueUnmapMemObject will throw if( error != CL_SUCCESS ) { return error; } endEvent.wait(); return CL_SUCCESS; } #if defined(CL_VERSION_1_1) inline cl_int enqueueReadBufferRect( const Buffer& buffer, cl_bool blocking, const size_t<3>& buffer_offset, const size_t<3>& host_offset, const size_t<3>& region, ::size_t buffer_row_pitch, ::size_t buffer_slice_pitch, ::size_t host_row_pitch, ::size_t host_slice_pitch, void *ptr, const VECTOR_CLASS* events = NULL, Event* event = NULL) { cl_int error; CommandQueue queue = CommandQueue::getDefault(&error); if (error != CL_SUCCESS) { return error; } return queue.enqueueReadBufferRect( buffer, blocking, buffer_offset, host_offset, region, buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch, ptr, events, event); } inline cl_int enqueueWriteBufferRect( const Buffer& buffer, cl_bool blocking, const size_t<3>& buffer_offset, const size_t<3>& host_offset, const size_t<3>& region, ::size_t buffer_row_pitch, ::size_t buffer_slice_pitch, ::size_t host_row_pitch, ::size_t host_slice_pitch, void *ptr, const VECTOR_CLASS* events = NULL, Event* event = NULL) { cl_int error; CommandQueue queue = CommandQueue::getDefault(&error); if (error != CL_SUCCESS) { return error; } return queue.enqueueWriteBufferRect( buffer, blocking, buffer_offset, host_offset, region, buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch, ptr, events, event); } inline cl_int enqueueCopyBufferRect( const Buffer& src, const Buffer& dst, const size_t<3>& src_origin, const size_t<3>& dst_origin, const size_t<3>& region, ::size_t src_row_pitch, ::size_t src_slice_pitch, ::size_t dst_row_pitch, ::size_t dst_slice_pitch, const VECTOR_CLASS* events = NULL, Event* event = NULL) { cl_int error; CommandQueue queue = CommandQueue::getDefault(&error); if (error != CL_SUCCESS) { return error; } return queue.enqueueCopyBufferRect( src, dst, src_origin, dst_origin, region, src_row_pitch, src_slice_pitch, dst_row_pitch, dst_slice_pitch, events, event); } #endif inline cl_int enqueueReadImage( const Image& image, cl_bool blocking, const size_t<3>& origin, const size_t<3>& region, ::size_t row_pitch, ::size_t slice_pitch, void* ptr, const VECTOR_CLASS* events = NULL, Event* event = NULL) { cl_int error; CommandQueue queue = CommandQueue::getDefault(&error); if (error != CL_SUCCESS) { return error; } return queue.enqueueReadImage( image, blocking, origin, region, row_pitch, slice_pitch, ptr, events, event); } inline cl_int enqueueWriteImage( const Image& image, cl_bool blocking, const size_t<3>& origin, const size_t<3>& region, ::size_t row_pitch, ::size_t slice_pitch, void* ptr, const VECTOR_CLASS* events = NULL, Event* event = NULL) { cl_int error; CommandQueue queue = CommandQueue::getDefault(&error); if (error != CL_SUCCESS) { return error; } return queue.enqueueWriteImage( image, blocking, origin, region, row_pitch, slice_pitch, ptr, events, event); } inline cl_int enqueueCopyImage( const Image& src, const Image& dst, const size_t<3>& src_origin, const size_t<3>& dst_origin, const size_t<3>& region, const VECTOR_CLASS* events = NULL, Event* event = NULL) { cl_int error; CommandQueue queue = CommandQueue::getDefault(&error); if (error != CL_SUCCESS) { return error; } return queue.enqueueCopyImage( src, dst, src_origin, dst_origin, region, events, event); } inline cl_int enqueueCopyImageToBuffer( const Image& src, const Buffer& dst, const size_t<3>& src_origin, const size_t<3>& region, ::size_t dst_offset, const VECTOR_CLASS* events = NULL, Event* event = NULL) { cl_int error; CommandQueue queue = CommandQueue::getDefault(&error); if (error != CL_SUCCESS) { return error; } return queue.enqueueCopyImageToBuffer( src, dst, src_origin, region, dst_offset, events, event); } inline cl_int enqueueCopyBufferToImage( const Buffer& src, const Image& dst, ::size_t src_offset, const size_t<3>& dst_origin, const size_t<3>& region, const VECTOR_CLASS* events = NULL, Event* event = NULL) { cl_int error; CommandQueue queue = CommandQueue::getDefault(&error); if (error != CL_SUCCESS) { return error; } return queue.enqueueCopyBufferToImage( src, dst, src_offset, dst_origin, region, events, event); } inline cl_int flush(void) { cl_int error; CommandQueue queue = CommandQueue::getDefault(&error); if (error != CL_SUCCESS) { return error; } return queue.flush(); } inline cl_int finish(void) { cl_int error; CommandQueue queue = CommandQueue::getDefault(&error); if (error != CL_SUCCESS) { return error; } return queue.finish(); } // Kernel Functor support // New interface as of September 2011 // Requires the C++11 std::tr1::function (note do not support TR1) // Visual Studio 2010 and GCC 4.2 struct EnqueueArgs { CommandQueue queue_; const NDRange offset_; const NDRange global_; const NDRange local_; VECTOR_CLASS events_; EnqueueArgs(NDRange global) : queue_(CommandQueue::getDefault()), offset_(NullRange), global_(global), local_(NullRange) { } EnqueueArgs(NDRange global, NDRange local) : queue_(CommandQueue::getDefault()), offset_(NullRange), global_(global), local_(local) { } EnqueueArgs(NDRange offset, NDRange global, NDRange local) : queue_(CommandQueue::getDefault()), offset_(offset), global_(global), local_(local) { } EnqueueArgs(Event e, NDRange global) : queue_(CommandQueue::getDefault()), offset_(NullRange), global_(global), local_(NullRange) { events_.push_back(e); } EnqueueArgs(Event e, NDRange global, NDRange local) : queue_(CommandQueue::getDefault()), offset_(NullRange), global_(global), local_(local) { events_.push_back(e); } EnqueueArgs(Event e, NDRange offset, NDRange global, NDRange local) : queue_(CommandQueue::getDefault()), offset_(offset), global_(global), local_(local) { events_.push_back(e); } EnqueueArgs(const VECTOR_CLASS &events, NDRange global) : queue_(CommandQueue::getDefault()), offset_(NullRange), global_(global), local_(NullRange), events_(events) { } EnqueueArgs(const VECTOR_CLASS &events, NDRange global, NDRange local) : queue_(CommandQueue::getDefault()), offset_(NullRange), global_(global), local_(local), events_(events) { } EnqueueArgs(const VECTOR_CLASS &events, NDRange offset, NDRange global, NDRange local) : queue_(CommandQueue::getDefault()), offset_(offset), global_(global), local_(local), events_(events) { } EnqueueArgs(CommandQueue &queue, NDRange global) : queue_(queue), offset_(NullRange), global_(global), local_(NullRange) { } EnqueueArgs(CommandQueue &queue, NDRange global, NDRange local) : queue_(queue), offset_(NullRange), global_(global), local_(local) { } EnqueueArgs(CommandQueue &queue, NDRange offset, NDRange global, NDRange local) : queue_(queue), offset_(offset), global_(global), local_(local) { } EnqueueArgs(CommandQueue &queue, Event e, NDRange global) : queue_(queue), offset_(NullRange), global_(global), local_(NullRange) { events_.push_back(e); } EnqueueArgs(CommandQueue &queue, Event e, NDRange global, NDRange local) : queue_(queue), offset_(NullRange), global_(global), local_(local) { events_.push_back(e); } EnqueueArgs(CommandQueue &queue, Event e, NDRange offset, NDRange global, NDRange local) : queue_(queue), offset_(offset), global_(global), local_(local) { events_.push_back(e); } EnqueueArgs(CommandQueue &queue, const VECTOR_CLASS &events, NDRange global) : queue_(queue), offset_(NullRange), global_(global), local_(NullRange), events_(events) { } EnqueueArgs(CommandQueue &queue, const VECTOR_CLASS &events, NDRange global, NDRange local) : queue_(queue), offset_(NullRange), global_(global), local_(local), events_(events) { } EnqueueArgs(CommandQueue &queue, const VECTOR_CLASS &events, NDRange offset, NDRange global, NDRange local) : queue_(queue), offset_(offset), global_(global), local_(local), events_(events) { } }; namespace detail { class NullType {}; template struct SetArg { static void set (Kernel kernel, T0 arg) { kernel.setArg(index, arg); } }; template struct SetArg { static void set (Kernel, NullType) { } }; template < typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31 > class KernelFunctorGlobal { private: Kernel kernel_; public: KernelFunctorGlobal( Kernel kernel) : kernel_(kernel) {} KernelFunctorGlobal( const Program& program, const STRING_CLASS name, cl_int * err = NULL) : kernel_(program, name.c_str(), err) {} Event operator() ( const EnqueueArgs& args, T0 t0, T1 t1 = NullType(), T2 t2 = NullType(), T3 t3 = NullType(), T4 t4 = NullType(), T5 t5 = NullType(), T6 t6 = NullType(), T7 t7 = NullType(), T8 t8 = NullType(), T9 t9 = NullType(), T10 t10 = NullType(), T11 t11 = NullType(), T12 t12 = NullType(), T13 t13 = NullType(), T14 t14 = NullType(), T15 t15 = NullType(), T16 t16 = NullType(), T17 t17 = NullType(), T18 t18 = NullType(), T19 t19 = NullType(), T20 t20 = NullType(), T21 t21 = NullType(), T22 t22 = NullType(), T23 t23 = NullType(), T24 t24 = NullType(), T25 t25 = NullType(), T26 t26 = NullType(), T27 t27 = NullType(), T28 t28 = NullType(), T29 t29 = NullType(), T30 t30 = NullType(), T31 t31 = NullType() ) { Event event; SetArg<0, T0>::set(kernel_, t0); SetArg<1, T1>::set(kernel_, t1); SetArg<2, T2>::set(kernel_, t2); SetArg<3, T3>::set(kernel_, t3); SetArg<4, T4>::set(kernel_, t4); SetArg<5, T5>::set(kernel_, t5); SetArg<6, T6>::set(kernel_, t6); SetArg<7, T7>::set(kernel_, t7); SetArg<8, T8>::set(kernel_, t8); SetArg<9, T9>::set(kernel_, t9); SetArg<10, T10>::set(kernel_, t10); SetArg<11, T11>::set(kernel_, t11); SetArg<12, T12>::set(kernel_, t12); SetArg<13, T13>::set(kernel_, t13); SetArg<14, T14>::set(kernel_, t14); SetArg<15, T15>::set(kernel_, t15); SetArg<16, T16>::set(kernel_, t16); SetArg<17, T17>::set(kernel_, t17); SetArg<18, T18>::set(kernel_, t18); SetArg<19, T19>::set(kernel_, t19); SetArg<20, T20>::set(kernel_, t20); SetArg<21, T21>::set(kernel_, t21); SetArg<22, T22>::set(kernel_, t22); SetArg<23, T23>::set(kernel_, t23); SetArg<24, T24>::set(kernel_, t24); SetArg<25, T25>::set(kernel_, t25); SetArg<26, T26>::set(kernel_, t26); SetArg<27, T27>::set(kernel_, t27); SetArg<28, T28>::set(kernel_, t28); SetArg<29, T29>::set(kernel_, t29); SetArg<30, T30>::set(kernel_, t30); SetArg<31, T31>::set(kernel_, t31); args.queue_.enqueueNDRangeKernel( kernel_, args.offset_, args.global_, args.local_, &args.events_, &event); return event; } }; //------------------------------------------------------------------------------------------------------ template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31> struct functionImplementation_ { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 32)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16, T17 arg17, T18 arg18, T19 arg19, T20 arg20, T21 arg21, T22 arg22, T23 arg23, T24 arg24, T25 arg25, T26 arg26, T27 arg27, T28 arg28, T29 arg29, T30 arg30, T31 arg31) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23, arg24, arg25, arg26, arg27, arg28, arg29, arg30, arg31); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30> struct functionImplementation_ < T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 31)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16, T17 arg17, T18 arg18, T19 arg19, T20 arg20, T21 arg21, T22 arg22, T23 arg23, T24 arg24, T25 arg25, T26 arg26, T27 arg27, T28 arg28, T29 arg29, T30 arg30) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23, arg24, arg25, arg26, arg27, arg28, arg29, arg30); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29> struct functionImplementation_ < T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 30)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16, T17 arg17, T18 arg18, T19 arg19, T20 arg20, T21 arg21, T22 arg22, T23 arg23, T24 arg24, T25 arg25, T26 arg26, T27 arg27, T28 arg28, T29 arg29) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23, arg24, arg25, arg26, arg27, arg28, arg29); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28> struct functionImplementation_ < T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 29)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16, T17 arg17, T18 arg18, T19 arg19, T20 arg20, T21 arg21, T22 arg22, T23 arg23, T24 arg24, T25 arg25, T26 arg26, T27 arg27, T28 arg28) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23, arg24, arg25, arg26, arg27, arg28); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27> struct functionImplementation_ < T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 28)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16, T17 arg17, T18 arg18, T19 arg19, T20 arg20, T21 arg21, T22 arg22, T23 arg23, T24 arg24, T25 arg25, T26 arg26, T27 arg27) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23, arg24, arg25, arg26, arg27); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26> struct functionImplementation_ < T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 27)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16, T17 arg17, T18 arg18, T19 arg19, T20 arg20, T21 arg21, T22 arg22, T23 arg23, T24 arg24, T25 arg25, T26 arg26) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23, arg24, arg25, arg26); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25> struct functionImplementation_ < T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NullType, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NullType, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 26)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16, T17 arg17, T18 arg18, T19 arg19, T20 arg20, T21 arg21, T22 arg22, T23 arg23, T24 arg24, T25 arg25) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23, arg24, arg25); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24> struct functionImplementation_ < T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NullType, NullType, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NullType, NullType, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 25)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16, T17 arg17, T18 arg18, T19 arg19, T20 arg20, T21 arg21, T22 arg22, T23 arg23, T24 arg24) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23, arg24); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23> struct functionImplementation_ < T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 24)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16, T17 arg17, T18 arg18, T19 arg19, T20 arg20, T21 arg21, T22 arg22, T23 arg23) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22> struct functionImplementation_ < T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 23)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16, T17 arg17, T18 arg18, T19 arg19, T20 arg20, T21 arg21, T22 arg22) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21> struct functionImplementation_ < T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 22)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16, T17 arg17, T18 arg18, T19 arg19, T20 arg20, T21 arg21) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20> struct functionImplementation_ < T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 21)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16, T17 arg17, T18 arg18, T19 arg19, T20 arg20) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19> struct functionImplementation_ < T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 20)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16, T17 arg17, T18 arg18, T19 arg19) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18> struct functionImplementation_ < T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 19)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16, T17 arg17, T18 arg18) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17> struct functionImplementation_ < T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 18)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16, T17 arg17) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16> struct functionImplementation_ < T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 17)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15> struct functionImplementation_ < T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 16)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14> struct functionImplementation_ < T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 15)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13> struct functionImplementation_ < T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 14)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12> struct functionImplementation_ < T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 13)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11> struct functionImplementation_ < T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 12)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10> struct functionImplementation_ < T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 11)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> struct functionImplementation_ < T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 10)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> struct functionImplementation_ < T0, T1, T2, T3, T4, T5, T6, T7, T8, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, T7, T8, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 9)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5, T6, T7, T8); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> struct functionImplementation_ < T0, T1, T2, T3, T4, T5, T6, T7, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, T7, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 8)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5, T6, T7); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> struct functionImplementation_ < T0, T1, T2, T3, T4, T5, T6, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 7)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5, T6); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5, arg6); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4, typename T5> struct functionImplementation_ < T0, T1, T2, T3, T4, T5, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 6)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4, T5); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4, arg5); } }; template< typename T0, typename T1, typename T2, typename T3, typename T4> struct functionImplementation_ < T0, T1, T2, T3, T4, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 5)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3, T4); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3, arg4); } }; template< typename T0, typename T1, typename T2, typename T3> struct functionImplementation_ < T0, T1, T2, T3, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 4)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2, T3); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2, T3 arg3) { return functor_( enqueueArgs, arg0, arg1, arg2, arg3); } }; template< typename T0, typename T1, typename T2> struct functionImplementation_ < T0, T1, T2, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, T2, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 3)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1, T2); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1, T2 arg2) { return functor_( enqueueArgs, arg0, arg1, arg2); } }; template< typename T0, typename T1> struct functionImplementation_ < T0, T1, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, T1, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 2)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0, T1); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0, T1 arg1) { return functor_( enqueueArgs, arg0, arg1); } }; template< typename T0> struct functionImplementation_ < T0, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> { typedef detail::KernelFunctorGlobal< T0, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType, NullType> FunctorType; FunctorType functor_; functionImplementation_(const FunctorType &functor) : functor_(functor) { #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 1)) // Fail variadic expansion for dev11 static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it."); #endif } //! \brief Return type of the functor typedef Event result_type; //! \brief Function signature of kernel functor with no event dependency. typedef Event type_( const EnqueueArgs&, T0); Event operator()( const EnqueueArgs& enqueueArgs, T0 arg0) { return functor_( enqueueArgs, arg0); } }; } // namespace detail //---------------------------------------------------------------------------------------------- template < typename T0, typename T1 = detail::NullType, typename T2 = detail::NullType, typename T3 = detail::NullType, typename T4 = detail::NullType, typename T5 = detail::NullType, typename T6 = detail::NullType, typename T7 = detail::NullType, typename T8 = detail::NullType, typename T9 = detail::NullType, typename T10 = detail::NullType, typename T11 = detail::NullType, typename T12 = detail::NullType, typename T13 = detail::NullType, typename T14 = detail::NullType, typename T15 = detail::NullType, typename T16 = detail::NullType, typename T17 = detail::NullType, typename T18 = detail::NullType, typename T19 = detail::NullType, typename T20 = detail::NullType, typename T21 = detail::NullType, typename T22 = detail::NullType, typename T23 = detail::NullType, typename T24 = detail::NullType, typename T25 = detail::NullType, typename T26 = detail::NullType, typename T27 = detail::NullType, typename T28 = detail::NullType, typename T29 = detail::NullType, typename T30 = detail::NullType, typename T31 = detail::NullType > struct make_kernel : public detail::functionImplementation_< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31 > { public: typedef detail::KernelFunctorGlobal< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31 > FunctorType; make_kernel( const Program& program, const STRING_CLASS name, cl_int * err = NULL) : detail::functionImplementation_< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31 >( FunctorType(program, name, err)) {} make_kernel( const Kernel kernel) : detail::functionImplementation_< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31 >( FunctorType(kernel)) {} }; //---------------------------------------------------------------------------------------------------------------------- #undef __ERR_STR #if !defined(__CL_USER_OVERRIDE_ERROR_STRINGS) #undef __GET_DEVICE_INFO_ERR #undef __GET_PLATFORM_INFO_ERR #undef __GET_DEVICE_IDS_ERR #undef __GET_CONTEXT_INFO_ERR #undef __GET_EVENT_INFO_ERR #undef __GET_EVENT_PROFILE_INFO_ERR #undef __GET_MEM_OBJECT_INFO_ERR #undef __GET_IMAGE_INFO_ERR #undef __GET_SAMPLER_INFO_ERR #undef __GET_KERNEL_INFO_ERR #undef __GET_KERNEL_ARG_INFO_ERR #undef __GET_KERNEL_WORK_GROUP_INFO_ERR #undef __GET_PROGRAM_INFO_ERR #undef __GET_PROGRAM_BUILD_INFO_ERR #undef __GET_COMMAND_QUEUE_INFO_ERR #undef __CREATE_CONTEXT_ERR #undef __CREATE_CONTEXT_FROM_TYPE_ERR #undef __GET_SUPPORTED_IMAGE_FORMATS_ERR #undef __CREATE_BUFFER_ERR #undef __CREATE_SUBBUFFER_ERR #undef __CREATE_IMAGE2D_ERR #undef __CREATE_IMAGE3D_ERR #undef __CREATE_SAMPLER_ERR #undef __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR #undef __CREATE_USER_EVENT_ERR #undef __SET_USER_EVENT_STATUS_ERR #undef __SET_EVENT_CALLBACK_ERR #undef __SET_PRINTF_CALLBACK_ERR #undef __WAIT_FOR_EVENTS_ERR #undef __CREATE_KERNEL_ERR #undef __SET_KERNEL_ARGS_ERR #undef __CREATE_PROGRAM_WITH_SOURCE_ERR #undef __CREATE_PROGRAM_WITH_BINARY_ERR #undef __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR #undef __BUILD_PROGRAM_ERR #undef __CREATE_KERNELS_IN_PROGRAM_ERR #undef __CREATE_COMMAND_QUEUE_ERR #undef __SET_COMMAND_QUEUE_PROPERTY_ERR #undef __ENQUEUE_READ_BUFFER_ERR #undef __ENQUEUE_WRITE_BUFFER_ERR #undef __ENQUEUE_READ_BUFFER_RECT_ERR #undef __ENQUEUE_WRITE_BUFFER_RECT_ERR #undef __ENQEUE_COPY_BUFFER_ERR #undef __ENQEUE_COPY_BUFFER_RECT_ERR #undef __ENQUEUE_READ_IMAGE_ERR #undef __ENQUEUE_WRITE_IMAGE_ERR #undef __ENQUEUE_COPY_IMAGE_ERR #undef __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR #undef __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR #undef __ENQUEUE_MAP_BUFFER_ERR #undef __ENQUEUE_MAP_IMAGE_ERR #undef __ENQUEUE_UNMAP_MEM_OBJECT_ERR #undef __ENQUEUE_NDRANGE_KERNEL_ERR #undef __ENQUEUE_TASK_ERR #undef __ENQUEUE_NATIVE_KERNEL #undef __CL_EXPLICIT_CONSTRUCTORS #undef __UNLOAD_COMPILER_ERR #endif //__CL_USER_OVERRIDE_ERROR_STRINGS #undef __CL_FUNCTION_TYPE // Extensions /** * Deprecated APIs for 1.2 */ #if defined(CL_VERSION_1_1) #undef __INIT_CL_EXT_FCN_PTR #endif // #if defined(CL_VERSION_1_1) #undef __CREATE_SUB_DEVICES #if defined(USE_CL_DEVICE_FISSION) #undef __PARAM_NAME_DEVICE_FISSION #endif // USE_CL_DEVICE_FISSION #undef __DEFAULT_NOT_INITIALIZED #undef __DEFAULT_BEING_INITIALIZED #undef __DEFAULT_INITIALIZED } // namespace cl #ifdef _WIN32 #pragma pop_macro("max") #endif // _WIN32 #endif // CL_HPP_ gnss-sdr-0.0.9/src/algorithms/libs/clFFT.h000066400000000000000000000114741305042567700203000ustar00rootroot00000000000000 // // File: clFFT.h // // Version: <1.0> // // Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Inc. ("Apple") // in consideration of your agreement to the following terms, and your use, // installation, modification or redistribution of this Apple software // constitutes acceptance of these terms. If you do not agree with these // terms, please do not use, install, modify or redistribute this Apple // software. // // In consideration of your agreement to abide by the following terms, and // subject to these terms, Apple grants you a personal, non - exclusive // license, under Apple's copyrights in this original Apple software ( the // "Apple Software" ), to use, reproduce, modify and redistribute the Apple // Software, with or without modifications, in source and / or binary forms; // provided that if you redistribute the Apple Software in its entirety and // without modifications, you must retain this notice and the following text // and disclaimers in all such redistributions of the Apple Software. Neither // the name, trademarks, service marks or logos of Apple Inc. may be used to // endorse or promote products derived from the Apple Software without specific // prior written permission from Apple. Except as expressly stated in this // notice, no other rights or licenses, express or implied, are granted by // Apple herein, including but not limited to any patent rights that may be // infringed by your derivative works or by other works in which the Apple // Software may be incorporated. // // The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO // WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED // WARRANTIES OF NON - INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A // PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION // ALONE OR IN COMBINATION WITH YOUR PRODUCTS. // // IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR // CONSEQUENTIAL DAMAGES ( INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION ) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION // AND / OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER // UNDER THEORY OF CONTRACT, TORT ( INCLUDING NEGLIGENCE ), STRICT LIABILITY OR // OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Copyright ( C ) 2008 Apple Inc. All Rights Reserved. // //////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef __CLFFT_H #define __CLFFT_H #ifdef __cplusplus extern "C" { #endif #include #ifdef __APPLE__ #include #else #include #endif // XForm type typedef enum { clFFT_Forward = -1, clFFT_Inverse = 1 }clFFT_Direction; // XForm dimension typedef enum { clFFT_1D = 0, clFFT_2D = 1, clFFT_3D = 3 }clFFT_Dimension; // XForm Data type typedef enum { clFFT_SplitComplexFormat = 0, clFFT_InterleavedComplexFormat = 1 }clFFT_DataFormat; typedef struct { unsigned int x; unsigned int y; unsigned int z; }clFFT_Dim3; typedef struct { float *real; float *imag; } clFFT_SplitComplex; typedef struct { float real; float imag; }clFFT_Complex; typedef void* clFFT_Plan; clFFT_Plan clFFT_CreatePlan( cl_context context, clFFT_Dim3 n, clFFT_Dimension dim, clFFT_DataFormat dataFormat, cl_int *error_code ); void clFFT_DestroyPlan( clFFT_Plan plan ); cl_int clFFT_ExecuteInterleaved( cl_command_queue queue, clFFT_Plan plan, cl_int batchSize, clFFT_Direction dir, cl_mem data_in, cl_mem data_out, cl_int num_events, cl_event *event_list, cl_event *event ); cl_int clFFT_ExecutePlannar( cl_command_queue queue, clFFT_Plan plan, cl_int batchSize, clFFT_Direction dir, cl_mem data_in_real, cl_mem data_in_imag, cl_mem data_out_real, cl_mem data_out_imag, cl_int num_events, cl_event *event_list, cl_event *event ); cl_int clFFT_1DTwistInterleaved(clFFT_Plan Plan, cl_command_queue queue, cl_mem array, size_t numRows, size_t numCols, size_t startRow, size_t rowsToProcess, clFFT_Direction dir); cl_int clFFT_1DTwistPlannar(clFFT_Plan Plan, cl_command_queue queue, cl_mem array_real, cl_mem array_imag, size_t numRows, size_t numCols, size_t startRow, size_t rowsToProcess, clFFT_Direction dir); void clFFT_DumpPlan( clFFT_Plan plan, FILE *file); #ifdef __cplusplus } #endif #endif gnss-sdr-0.0.9/src/algorithms/libs/complex_byte_to_float_x2.cc000066400000000000000000000043661305042567700244740ustar00rootroot00000000000000/*! * \file complex_byte_to_float_x2.cc * \brief Adapts a std::complex stream into two 16-bits (short) streams * \author Carles Fernandez Prades, cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "complex_byte_to_float_x2.h" #include #include complex_byte_to_float_x2_sptr make_complex_byte_to_float_x2() { return complex_byte_to_float_x2_sptr(new complex_byte_to_float_x2()); } complex_byte_to_float_x2::complex_byte_to_float_x2() : sync_block("complex_byte_to_float_x2", gr::io_signature::make (1, 1, sizeof(lv_8sc_t)), // lv_8sc_t is a Volk's typedef for std::complex gr::io_signature::make (2, 2, sizeof(float))) { const int alignment_multiple = volk_get_alignment() / sizeof(float); set_alignment(std::max(1, alignment_multiple)); } int complex_byte_to_float_x2::work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { const lv_8sc_t *in = (const lv_8sc_t *) input_items[0]; float *out0 = (float*) output_items[0]; float *out1 = (float*) output_items[1]; const float scalar = 1; volk_8ic_s32f_deinterleave_32f_x2(out0, out1, in, scalar, noutput_items); return noutput_items; } gnss-sdr-0.0.9/src/algorithms/libs/complex_byte_to_float_x2.h000066400000000000000000000036521305042567700243330ustar00rootroot00000000000000/*! * \file complex_byte_to_float_x2.h * \brief Adapts a std::complex stream into two 16-bits (short) streams * \author Carles Fernandez Prades, cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_COMPLEX_BYTE_TO_FLOAT_X2_H_ #define GNSS_SDR_COMPLEX_BYTE_TO_FLOAT_X2_H_ #include #include class complex_byte_to_float_x2; typedef boost::shared_ptr complex_byte_to_float_x2_sptr; complex_byte_to_float_x2_sptr make_complex_byte_to_float_x2(); /*! * \brief This class adapts a std::complex stream * into two 16-bits (short) streams */ class complex_byte_to_float_x2 : public gr::sync_block { private: friend complex_byte_to_float_x2_sptr make_complex_byte_to_float_x2(); public: complex_byte_to_float_x2(); int work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; #endif gnss-sdr-0.0.9/src/algorithms/libs/complex_float_to_complex_byte.cc000066400000000000000000000043761305042567700256130ustar00rootroot00000000000000/*! * \file complex_float_to_complex_byte.cc * \brief Adapts a gr_complex stream into a std::complex stream * \author Carles Fernandez Prades, cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "complex_float_to_complex_byte.h" #include #include #include "volk_gnsssdr/volk_gnsssdr.h" complex_float_to_complex_byte_sptr make_complex_float_to_complex_byte() { return complex_float_to_complex_byte_sptr(new complex_float_to_complex_byte()); } complex_float_to_complex_byte::complex_float_to_complex_byte() : sync_block("complex_float_to_complex_byte", gr::io_signature::make (1, 1, sizeof(gr_complex)), gr::io_signature::make (1, 1, sizeof(lv_8sc_t))) // lv_8sc_t is a Volk's typedef for std::complex { const int alignment_multiple = volk_get_alignment() / sizeof(lv_8sc_t); set_alignment(std::max(1, alignment_multiple)); } int complex_float_to_complex_byte::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]; lv_8sc_t *out = (lv_8sc_t*) output_items[0]; volk_gnsssdr_32fc_convert_8ic(out, in, noutput_items); return noutput_items; } gnss-sdr-0.0.9/src/algorithms/libs/complex_float_to_complex_byte.h000066400000000000000000000037221305042567700254470ustar00rootroot00000000000000/*! * \file complex_float_to_complex_byte.h * \brief Adapts a gr_complex stream into a std::complex stream * \author Carles Fernandez Prades, cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_COMPLEX_FLOAT_TO_COMPLEX_BYTE_H_ #define GNSS_SDR_COMPLEX_FLOAT_TO_COMPLEX_BYTE_H_ #include #include class complex_float_to_complex_byte; typedef boost::shared_ptr complex_float_to_complex_byte_sptr; complex_float_to_complex_byte_sptr make_complex_float_to_complex_byte(); /*! * \brief This class adapts a gr_complex stream into a std::complex stream */ class complex_float_to_complex_byte : public gr::sync_block { private: friend complex_float_to_complex_byte_sptr make_complex_float_to_complex_byte(); public: complex_float_to_complex_byte(); int work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; #endif gnss-sdr-0.0.9/src/algorithms/libs/cshort_to_float_x2.cc000066400000000000000000000042621305042567700232770ustar00rootroot00000000000000/*! * \file cshort_to_float_x2.cc * \brief Adapts a std::complex stream into two float streams * \author Carles Fernandez Prades, cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "cshort_to_float_x2.h" #include #include cshort_to_float_x2_sptr make_cshort_to_float_x2() { return cshort_to_float_x2_sptr(new cshort_to_float_x2()); } cshort_to_float_x2::cshort_to_float_x2() : sync_block("cshort_to_float_x2", gr::io_signature::make (1, 1, sizeof(lv_16sc_t)), // lv_8sc_t is a Volk's typedef for std::complex gr::io_signature::make (2, 2, sizeof(float))) { const int alignment_multiple = volk_get_alignment() / sizeof(lv_16sc_t); set_alignment(std::max(1, alignment_multiple)); } int cshort_to_float_x2::work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { const lv_16sc_t *in = (const lv_16sc_t *) input_items[0]; float *out0 = (float*) output_items[0]; float *out1 = (float*) output_items[1]; const float scalar = 1; volk_16ic_s32f_deinterleave_32f_x2(out0, out1, in, scalar, noutput_items); return noutput_items; } gnss-sdr-0.0.9/src/algorithms/libs/cshort_to_float_x2.h000066400000000000000000000035141305042567700231400ustar00rootroot00000000000000/*! * \file cshort_to_float_x2.h * \brief Adapts a std::complex stream into two float streams * \author Carles Fernandez Prades, cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_CSHORT_TO_FLOAT_X2_H_ #define GNSS_SDR_CSHORT_TO_FLOAT_X2_H_ #include #include class cshort_to_float_x2; typedef boost::shared_ptr cshort_to_float_x2_sptr; cshort_to_float_x2_sptr make_cshort_to_float_x2(); /*! * \brief This class adapts a std::complex stream * into two 32-bits (float) streams */ class cshort_to_float_x2 : public gr::sync_block { private: friend cshort_to_float_x2_sptr make_cshort_to_float_x2(); public: cshort_to_float_x2(); int work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; #endif gnss-sdr-0.0.9/src/algorithms/libs/fft_base_kernels.h000066400000000000000000000335521305042567700226370ustar00rootroot00000000000000 // // File: fft_base_kernels.h // // Version: <1.0> // // Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Inc. ("Apple") // in consideration of your agreement to the following terms, and your use, // installation, modification or redistribution of this Apple software // constitutes acceptance of these terms. If you do not agree with these // terms, please do not use, install, modify or redistribute this Apple // software. // // In consideration of your agreement to abide by the following terms, and // subject to these terms, Apple grants you a personal, non - exclusive // license, under Apple's copyrights in this original Apple software ( the // "Apple Software" ), to use, reproduce, modify and redistribute the Apple // Software, with or without modifications, in source and / or binary forms; // provided that if you redistribute the Apple Software in its entirety and // without modifications, you must retain this notice and the following text // and disclaimers in all such redistributions of the Apple Software. Neither // the name, trademarks, service marks or logos of Apple Inc. may be used to // endorse or promote products derived from the Apple Software without specific // prior written permission from Apple. Except as expressly stated in this // notice, no other rights or licenses, express or implied, are granted by // Apple herein, including but not limited to any patent rights that may be // infringed by your derivative works or by other works in which the Apple // Software may be incorporated. // // The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO // WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED // WARRANTIES OF NON - INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A // PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION // ALONE OR IN COMBINATION WITH YOUR PRODUCTS. // // IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR // CONSEQUENTIAL DAMAGES ( INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION ) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION // AND / OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER // UNDER THEORY OF CONTRACT, TORT ( INCLUDING NEGLIGENCE ), STRICT LIABILITY OR // OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Copyright ( C ) 2008 Apple Inc. All Rights Reserved. // //////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef __CL_FFT_BASE_KERNELS_ #define __CL_FFT_BASE_KERNELS_ #include using namespace std; static string baseKernels = string( "#ifndef M_PI\n" "#define M_PI 0x1.921fb54442d18p+1\n" "#endif\n" "#define complexMul(a,b) ((float2)(mad(-(a).y, (b).y, (a).x * (b).x), mad((a).y, (b).x, (a).x * (b).y)))\n" "#define conj(a) ((float2)((a).x, -(a).y))\n" "#define conjTransp(a) ((float2)(-(a).y, (a).x))\n" "\n" "#define fftKernel2(a,dir) \\\n" "{ \\\n" " float2 c = (a)[0]; \\\n" " (a)[0] = c + (a)[1]; \\\n" " (a)[1] = c - (a)[1]; \\\n" "}\n" "\n" "#define fftKernel2S(d1,d2,dir) \\\n" "{ \\\n" " float2 c = (d1); \\\n" " (d1) = c + (d2); \\\n" " (d2) = c - (d2); \\\n" "}\n" "\n" "#define fftKernel4(a,dir) \\\n" "{ \\\n" " fftKernel2S((a)[0], (a)[2], dir); \\\n" " fftKernel2S((a)[1], (a)[3], dir); \\\n" " fftKernel2S((a)[0], (a)[1], dir); \\\n" " (a)[3] = (float2)(dir)*(conjTransp((a)[3])); \\\n" " fftKernel2S((a)[2], (a)[3], dir); \\\n" " float2 c = (a)[1]; \\\n" " (a)[1] = (a)[2]; \\\n" " (a)[2] = c; \\\n" "}\n" "\n" "#define fftKernel4s(a0,a1,a2,a3,dir) \\\n" "{ \\\n" " fftKernel2S((a0), (a2), dir); \\\n" " fftKernel2S((a1), (a3), dir); \\\n" " fftKernel2S((a0), (a1), dir); \\\n" " (a3) = (float2)(dir)*(conjTransp((a3))); \\\n" " fftKernel2S((a2), (a3), dir); \\\n" " float2 c = (a1); \\\n" " (a1) = (a2); \\\n" " (a2) = c; \\\n" "}\n" "\n" "#define bitreverse8(a) \\\n" "{ \\\n" " float2 c; \\\n" " c = (a)[1]; \\\n" " (a)[1] = (a)[4]; \\\n" " (a)[4] = c; \\\n" " c = (a)[3]; \\\n" " (a)[3] = (a)[6]; \\\n" " (a)[6] = c; \\\n" "}\n" "\n" "#define fftKernel8(a,dir) \\\n" "{ \\\n" " const float2 w1 = (float2)(0x1.6a09e6p-1f, dir*0x1.6a09e6p-1f); \\\n" " const float2 w3 = (float2)(-0x1.6a09e6p-1f, dir*0x1.6a09e6p-1f); \\\n" " float2 c; \\\n" " fftKernel2S((a)[0], (a)[4], dir); \\\n" " fftKernel2S((a)[1], (a)[5], dir); \\\n" " fftKernel2S((a)[2], (a)[6], dir); \\\n" " fftKernel2S((a)[3], (a)[7], dir); \\\n" " (a)[5] = complexMul(w1, (a)[5]); \\\n" " (a)[6] = (float2)(dir)*(conjTransp((a)[6])); \\\n" " (a)[7] = complexMul(w3, (a)[7]); \\\n" " fftKernel2S((a)[0], (a)[2], dir); \\\n" " fftKernel2S((a)[1], (a)[3], dir); \\\n" " fftKernel2S((a)[4], (a)[6], dir); \\\n" " fftKernel2S((a)[5], (a)[7], dir); \\\n" " (a)[3] = (float2)(dir)*(conjTransp((a)[3])); \\\n" " (a)[7] = (float2)(dir)*(conjTransp((a)[7])); \\\n" " fftKernel2S((a)[0], (a)[1], dir); \\\n" " fftKernel2S((a)[2], (a)[3], dir); \\\n" " fftKernel2S((a)[4], (a)[5], dir); \\\n" " fftKernel2S((a)[6], (a)[7], dir); \\\n" " bitreverse8((a)); \\\n" "}\n" "\n" "#define bitreverse4x4(a) \\\n" "{ \\\n" " float2 c; \\\n" " c = (a)[1]; (a)[1] = (a)[4]; (a)[4] = c; \\\n" " c = (a)[2]; (a)[2] = (a)[8]; (a)[8] = c; \\\n" " c = (a)[3]; (a)[3] = (a)[12]; (a)[12] = c; \\\n" " c = (a)[6]; (a)[6] = (a)[9]; (a)[9] = c; \\\n" " c = (a)[7]; (a)[7] = (a)[13]; (a)[13] = c; \\\n" " c = (a)[11]; (a)[11] = (a)[14]; (a)[14] = c; \\\n" "}\n" "\n" "#define fftKernel16(a,dir) \\\n" "{ \\\n" " const float w0 = 0x1.d906bcp-1f; \\\n" " const float w1 = 0x1.87de2ap-2f; \\\n" " const float w2 = 0x1.6a09e6p-1f; \\\n" " fftKernel4s((a)[0], (a)[4], (a)[8], (a)[12], dir); \\\n" " fftKernel4s((a)[1], (a)[5], (a)[9], (a)[13], dir); \\\n" " fftKernel4s((a)[2], (a)[6], (a)[10], (a)[14], dir); \\\n" " fftKernel4s((a)[3], (a)[7], (a)[11], (a)[15], dir); \\\n" " (a)[5] = complexMul((a)[5], (float2)(w0, dir*w1)); \\\n" " (a)[6] = complexMul((a)[6], (float2)(w2, dir*w2)); \\\n" " (a)[7] = complexMul((a)[7], (float2)(w1, dir*w0)); \\\n" " (a)[9] = complexMul((a)[9], (float2)(w2, dir*w2)); \\\n" " (a)[10] = (float2)(dir)*(conjTransp((a)[10])); \\\n" " (a)[11] = complexMul((a)[11], (float2)(-w2, dir*w2)); \\\n" " (a)[13] = complexMul((a)[13], (float2)(w1, dir*w0)); \\\n" " (a)[14] = complexMul((a)[14], (float2)(-w2, dir*w2)); \\\n" " (a)[15] = complexMul((a)[15], (float2)(-w0, dir*-w1)); \\\n" " fftKernel4((a), dir); \\\n" " fftKernel4((a) + 4, dir); \\\n" " fftKernel4((a) + 8, dir); \\\n" " fftKernel4((a) + 12, dir); \\\n" " bitreverse4x4((a)); \\\n" "}\n" "\n" "#define bitreverse32(a) \\\n" "{ \\\n" " float2 c1, c2; \\\n" " c1 = (a)[2]; (a)[2] = (a)[1]; c2 = (a)[4]; (a)[4] = c1; c1 = (a)[8]; (a)[8] = c2; c2 = (a)[16]; (a)[16] = c1; (a)[1] = c2; \\\n" " c1 = (a)[6]; (a)[6] = (a)[3]; c2 = (a)[12]; (a)[12] = c1; c1 = (a)[24]; (a)[24] = c2; c2 = (a)[17]; (a)[17] = c1; (a)[3] = c2; \\\n" " c1 = (a)[10]; (a)[10] = (a)[5]; c2 = (a)[20]; (a)[20] = c1; c1 = (a)[9]; (a)[9] = c2; c2 = (a)[18]; (a)[18] = c1; (a)[5] = c2; \\\n" " c1 = (a)[14]; (a)[14] = (a)[7]; c2 = (a)[28]; (a)[28] = c1; c1 = (a)[25]; (a)[25] = c2; c2 = (a)[19]; (a)[19] = c1; (a)[7] = c2; \\\n" " c1 = (a)[22]; (a)[22] = (a)[11]; c2 = (a)[13]; (a)[13] = c1; c1 = (a)[26]; (a)[26] = c2; c2 = (a)[21]; (a)[21] = c1; (a)[11] = c2; \\\n" " c1 = (a)[30]; (a)[30] = (a)[15]; c2 = (a)[29]; (a)[29] = c1; c1 = (a)[27]; (a)[27] = c2; c2 = (a)[23]; (a)[23] = c1; (a)[15] = c2; \\\n" "}\n" "\n" "#define fftKernel32(a,dir) \\\n" "{ \\\n" " fftKernel2S((a)[0], (a)[16], dir); \\\n" " fftKernel2S((a)[1], (a)[17], dir); \\\n" " fftKernel2S((a)[2], (a)[18], dir); \\\n" " fftKernel2S((a)[3], (a)[19], dir); \\\n" " fftKernel2S((a)[4], (a)[20], dir); \\\n" " fftKernel2S((a)[5], (a)[21], dir); \\\n" " fftKernel2S((a)[6], (a)[22], dir); \\\n" " fftKernel2S((a)[7], (a)[23], dir); \\\n" " fftKernel2S((a)[8], (a)[24], dir); \\\n" " fftKernel2S((a)[9], (a)[25], dir); \\\n" " fftKernel2S((a)[10], (a)[26], dir); \\\n" " fftKernel2S((a)[11], (a)[27], dir); \\\n" " fftKernel2S((a)[12], (a)[28], dir); \\\n" " fftKernel2S((a)[13], (a)[29], dir); \\\n" " fftKernel2S((a)[14], (a)[30], dir); \\\n" " fftKernel2S((a)[15], (a)[31], dir); \\\n" " (a)[17] = complexMul((a)[17], (float2)(0x1.f6297cp-1f, dir*0x1.8f8b84p-3f)); \\\n" " (a)[18] = complexMul((a)[18], (float2)(0x1.d906bcp-1f, dir*0x1.87de2ap-2f)); \\\n" " (a)[19] = complexMul((a)[19], (float2)(0x1.a9b662p-1f, dir*0x1.1c73b4p-1f)); \\\n" " (a)[20] = complexMul((a)[20], (float2)(0x1.6a09e6p-1f, dir*0x1.6a09e6p-1f)); \\\n" " (a)[21] = complexMul((a)[21], (float2)(0x1.1c73b4p-1f, dir*0x1.a9b662p-1f)); \\\n" " (a)[22] = complexMul((a)[22], (float2)(0x1.87de2ap-2f, dir*0x1.d906bcp-1f)); \\\n" " (a)[23] = complexMul((a)[23], (float2)(0x1.8f8b84p-3f, dir*0x1.f6297cp-1f)); \\\n" " (a)[24] = complexMul((a)[24], (float2)(0x0p+0f, dir*0x1p+0f)); \\\n" " (a)[25] = complexMul((a)[25], (float2)(-0x1.8f8b84p-3f, dir*0x1.f6297cp-1f)); \\\n" " (a)[26] = complexMul((a)[26], (float2)(-0x1.87de2ap-2f, dir*0x1.d906bcp-1f)); \\\n" " (a)[27] = complexMul((a)[27], (float2)(-0x1.1c73b4p-1f, dir*0x1.a9b662p-1f)); \\\n" " (a)[28] = complexMul((a)[28], (float2)(-0x1.6a09e6p-1f, dir*0x1.6a09e6p-1f)); \\\n" " (a)[29] = complexMul((a)[29], (float2)(-0x1.a9b662p-1f, dir*0x1.1c73b4p-1f)); \\\n" " (a)[30] = complexMul((a)[30], (float2)(-0x1.d906bcp-1f, dir*0x1.87de2ap-2f)); \\\n" " (a)[31] = complexMul((a)[31], (float2)(-0x1.f6297cp-1f, dir*0x1.8f8b84p-3f)); \\\n" " fftKernel16((a), dir); \\\n" " fftKernel16((a) + 16, dir); \\\n" " bitreverse32((a)); \\\n" "}\n\n" ); static string twistKernelInterleaved = string( "__kernel void \\\n" "clFFT_1DTwistInterleaved(__global float2 *in, unsigned int startRow, unsigned int numCols, unsigned int N, unsigned int numRowsToProcess, int dir) \\\n" "{ \\\n" " float2 a, w; \\\n" " float ang; \\\n" " unsigned int j; \\\n" " unsigned int i = get_global_id(0); \\\n" " unsigned int startIndex = i; \\\n" " \\\n" " if(i < numCols) \\\n" " { \\\n" " for(j = 0; j < numRowsToProcess; j++) \\\n" " { \\\n" " a = in[startIndex]; \\\n" " ang = 2.0f * M_PI * dir * i * (startRow + j) / N; \\\n" " w = (float2)(native_cos(ang), native_sin(ang)); \\\n" " a = complexMul(a, w); \\\n" " in[startIndex] = a; \\\n" " startIndex += numCols; \\\n" " } \\\n" " } \\\n" "} \\\n" ); static string twistKernelPlannar = string( "__kernel void \\\n" "clFFT_1DTwistSplit(__global float *in_real, __global float *in_imag , unsigned int startRow, unsigned int numCols, unsigned int N, unsigned int numRowsToProcess, int dir) \\\n" "{ \\\n" " float2 a, w; \\\n" " float ang; \\\n" " unsigned int j; \\\n" " unsigned int i = get_global_id(0); \\\n" " unsigned int startIndex = i; \\\n" " \\\n" " if(i < numCols) \\\n" " { \\\n" " for(j = 0; j < numRowsToProcess; j++) \\\n" " { \\\n" " a = (float2)(in_real[startIndex], in_imag[startIndex]); \\\n" " ang = 2.0f * M_PI * dir * i * (startRow + j) / N; \\\n" " w = (float2)(native_cos(ang), native_sin(ang)); \\\n" " a = complexMul(a, w); \\\n" " in_real[startIndex] = a.x; \\\n" " in_imag[startIndex] = a.y; \\\n" " startIndex += numCols; \\\n" " } \\\n" " } \\\n" "} \\\n" ); #endif gnss-sdr-0.0.9/src/algorithms/libs/fft_execute.cc000066400000000000000000000340011305042567700217700ustar00rootroot00000000000000 // // File: fft_execute.cpp // // Version: <1.0> // // Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Inc. ("Apple") // in consideration of your agreement to the following terms, and your use, // installation, modification or redistribution of this Apple software // constitutes acceptance of these terms. If you do not agree with these // terms, please do not use, install, modify or redistribute this Apple // software.¬ // // In consideration of your agreement to abide by the following terms, and // subject to these terms, Apple grants you a personal, non - exclusive // license, under Apple's copyrights in this original Apple software ( the // "Apple Software" ), to use, reproduce, modify and redistribute the Apple // Software, with or without modifications, in source and / or binary forms; // provided that if you redistribute the Apple Software in its entirety and // without modifications, you must retain this notice and the following text // and disclaimers in all such redistributions of the Apple Software. Neither // the name, trademarks, service marks or logos of Apple Inc. may be used to // endorse or promote products derived from the Apple Software without specific // prior written permission from Apple. Except as expressly stated in this // notice, no other rights or licenses, express or implied, are granted by // Apple herein, including but not limited to any patent rights that may be // infringed by your derivative works or by other works in which the Apple // Software may be incorporated. // // The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO // WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED // WARRANTIES OF NON - INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A // PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION // ALONE OR IN COMBINATION WITH YOUR PRODUCTS. // // IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR // CONSEQUENTIAL DAMAGES ( INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION ) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION // AND / OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER // UNDER THEORY OF CONTRACT, TORT ( INCLUDING NEGLIGENCE ), STRICT LIABILITY OR // OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Copyright ( C ) 2008 Apple Inc. All Rights Reserved. // //////////////////////////////////////////////////////////////////////////////////////////////////// #include "fft_internal.h" #include "clFFT.h" #include #include #include #define max(a,b) (((a)>(b)) ? (a) : (b)) #define min(a,b) (((a)<(b)) ? (a) : (b)) static cl_int allocateTemporaryBufferInterleaved(cl_fft_plan *plan, cl_uint batchSize) { cl_int err = CL_SUCCESS; if(plan->temp_buffer_needed && plan->last_batch_size != batchSize) { plan->last_batch_size = batchSize; size_t tmpLength = plan->n.x * plan->n.y * plan->n.z * batchSize * 2 * sizeof(cl_float); if(plan->tempmemobj) clReleaseMemObject(plan->tempmemobj); plan->tempmemobj = clCreateBuffer(plan->context, CL_MEM_READ_WRITE, tmpLength, NULL, &err); } return err; } static cl_int allocateTemporaryBufferPlannar(cl_fft_plan *plan, cl_uint batchSize) { cl_int err = CL_SUCCESS; cl_int terr; if(plan->temp_buffer_needed && plan->last_batch_size != batchSize) { plan->last_batch_size = batchSize; size_t tmpLength = plan->n.x * plan->n.y * plan->n.z * batchSize * sizeof(cl_float); if(plan->tempmemobj_real) clReleaseMemObject(plan->tempmemobj_real); if(plan->tempmemobj_imag) clReleaseMemObject(plan->tempmemobj_imag); plan->tempmemobj_real = clCreateBuffer(plan->context, CL_MEM_READ_WRITE, tmpLength, NULL, &err); plan->tempmemobj_imag = clCreateBuffer(plan->context, CL_MEM_READ_WRITE, tmpLength, NULL, &terr); err |= terr; } return err; } void getKernelWorkDimensions(cl_fft_plan *plan, cl_fft_kernel_info *kernelInfo, cl_int *batchSize, size_t *gWorkItems, size_t *lWorkItems) { *lWorkItems = kernelInfo->num_workitems_per_workgroup; int numWorkGroups = kernelInfo->num_workgroups; int numXFormsPerWG = kernelInfo->num_xforms_per_workgroup; switch(kernelInfo->dir) { case cl_fft_kernel_x: *batchSize *= (plan->n.y * plan->n.z); numWorkGroups = (*batchSize % numXFormsPerWG) ? (*batchSize/numXFormsPerWG + 1) : (*batchSize/numXFormsPerWG); numWorkGroups *= kernelInfo->num_workgroups; break; case cl_fft_kernel_y: *batchSize *= plan->n.z; numWorkGroups *= *batchSize; break; case cl_fft_kernel_z: numWorkGroups *= *batchSize; break; } *gWorkItems = numWorkGroups * *lWorkItems; } cl_int clFFT_ExecuteInterleaved( cl_command_queue queue, clFFT_Plan Plan, cl_int batchSize, clFFT_Direction dir, cl_mem data_in, cl_mem data_out, cl_int num_events, cl_event *event_list, cl_event *event ) { int s; cl_fft_plan *plan = (cl_fft_plan *) Plan; if(plan->format != clFFT_InterleavedComplexFormat) return CL_INVALID_VALUE; cl_int err; size_t gWorkItems, lWorkItems; int inPlaceDone; cl_int isInPlace = data_in == data_out ? 1 : 0; if((err = allocateTemporaryBufferInterleaved(plan, batchSize)) != CL_SUCCESS) return err; cl_mem memObj[3]; memObj[0] = data_in; memObj[1] = data_out; memObj[2] = plan->tempmemobj; cl_fft_kernel_info *kernelInfo = plan->kernel_info; int numKernels = plan->num_kernels; int numKernelsOdd = numKernels & 1; int currRead = 0; int currWrite = 1; // at least one external dram shuffle (transpose) required if(plan->temp_buffer_needed) { // in-place transform if(isInPlace) { inPlaceDone = 0; currRead = 1; currWrite = 2; } else { currWrite = (numKernels & 1) ? 1 : 2; } while(kernelInfo) { if( isInPlace && numKernelsOdd && !inPlaceDone && kernelInfo->in_place_possible) { currWrite = currRead; inPlaceDone = 1; } s = batchSize; getKernelWorkDimensions(plan, kernelInfo, &s, &gWorkItems, &lWorkItems); err |= clSetKernelArg(kernelInfo->kernel, 0, sizeof(cl_mem), &memObj[currRead]); err |= clSetKernelArg(kernelInfo->kernel, 1, sizeof(cl_mem), &memObj[currWrite]); err |= clSetKernelArg(kernelInfo->kernel, 2, sizeof(cl_int), &dir); err |= clSetKernelArg(kernelInfo->kernel, 3, sizeof(cl_int), &s); err |= clEnqueueNDRangeKernel(queue, kernelInfo->kernel, 1, NULL, &gWorkItems, &lWorkItems, 0, NULL, NULL); if(err) return err; currRead = (currWrite == 1) ? 1 : 2; currWrite = (currWrite == 1) ? 2 : 1; kernelInfo = kernelInfo->next; } } // no dram shuffle (transpose required) transform // all kernels can execute in-place. else { while(kernelInfo) { s = batchSize; getKernelWorkDimensions(plan, kernelInfo, &s, &gWorkItems, &lWorkItems); err |= clSetKernelArg(kernelInfo->kernel, 0, sizeof(cl_mem), &memObj[currRead]); err |= clSetKernelArg(kernelInfo->kernel, 1, sizeof(cl_mem), &memObj[currWrite]); err |= clSetKernelArg(kernelInfo->kernel, 2, sizeof(cl_int), &dir); err |= clSetKernelArg(kernelInfo->kernel, 3, sizeof(cl_int), &s); err |= clEnqueueNDRangeKernel(queue, kernelInfo->kernel, 1, NULL, &gWorkItems, &lWorkItems, 0, NULL, NULL); if(err) return err; currRead = 1; currWrite = 1; kernelInfo = kernelInfo->next; } } return err; } cl_int clFFT_ExecutePlannar( cl_command_queue queue, clFFT_Plan Plan, cl_int batchSize, clFFT_Direction dir, cl_mem data_in_real, cl_mem data_in_imag, cl_mem data_out_real, cl_mem data_out_imag, cl_int num_events, cl_event *event_list, cl_event *event) { int s; cl_fft_plan *plan = (cl_fft_plan *) Plan; if(plan->format != clFFT_SplitComplexFormat) return CL_INVALID_VALUE; cl_int err; size_t gWorkItems, lWorkItems; int inPlaceDone; cl_int isInPlace = ((data_in_real == data_out_real) && (data_in_imag == data_out_imag)) ? 1 : 0; if((err = allocateTemporaryBufferPlannar(plan, batchSize)) != CL_SUCCESS) return err; cl_mem memObj_real[3]; cl_mem memObj_imag[3]; memObj_real[0] = data_in_real; memObj_real[1] = data_out_real; memObj_real[2] = plan->tempmemobj_real; memObj_imag[0] = data_in_imag; memObj_imag[1] = data_out_imag; memObj_imag[2] = plan->tempmemobj_imag; cl_fft_kernel_info *kernelInfo = plan->kernel_info; int numKernels = plan->num_kernels; int numKernelsOdd = numKernels & 1; int currRead = 0; int currWrite = 1; // at least one external dram shuffle (transpose) required if(plan->temp_buffer_needed) { // in-place transform if(isInPlace) { inPlaceDone = 0; currRead = 1; currWrite = 2; } else { currWrite = (numKernels & 1) ? 1 : 2; } while(kernelInfo) { if( isInPlace && numKernelsOdd && !inPlaceDone && kernelInfo->in_place_possible) { currWrite = currRead; inPlaceDone = 1; } s = batchSize; getKernelWorkDimensions(plan, kernelInfo, &s, &gWorkItems, &lWorkItems); err |= clSetKernelArg(kernelInfo->kernel, 0, sizeof(cl_mem), &memObj_real[currRead]); err |= clSetKernelArg(kernelInfo->kernel, 1, sizeof(cl_mem), &memObj_imag[currRead]); err |= clSetKernelArg(kernelInfo->kernel, 2, sizeof(cl_mem), &memObj_real[currWrite]); err |= clSetKernelArg(kernelInfo->kernel, 3, sizeof(cl_mem), &memObj_imag[currWrite]); err |= clSetKernelArg(kernelInfo->kernel, 4, sizeof(cl_int), &dir); err |= clSetKernelArg(kernelInfo->kernel, 5, sizeof(cl_int), &s); err |= clEnqueueNDRangeKernel(queue, kernelInfo->kernel, 1, NULL, &gWorkItems, &lWorkItems, 0, NULL, NULL); if(err) return err; currRead = (currWrite == 1) ? 1 : 2; currWrite = (currWrite == 1) ? 2 : 1; kernelInfo = kernelInfo->next; } } // no dram shuffle (transpose required) transform else { while(kernelInfo) { s = batchSize; getKernelWorkDimensions(plan, kernelInfo, &s, &gWorkItems, &lWorkItems); err |= clSetKernelArg(kernelInfo->kernel, 0, sizeof(cl_mem), &memObj_real[currRead]); err |= clSetKernelArg(kernelInfo->kernel, 1, sizeof(cl_mem), &memObj_imag[currRead]); err |= clSetKernelArg(kernelInfo->kernel, 2, sizeof(cl_mem), &memObj_real[currWrite]); err |= clSetKernelArg(kernelInfo->kernel, 3, sizeof(cl_mem), &memObj_imag[currWrite]); err |= clSetKernelArg(kernelInfo->kernel, 4, sizeof(cl_int), &dir); err |= clSetKernelArg(kernelInfo->kernel, 5, sizeof(cl_int), &s); err |= clEnqueueNDRangeKernel(queue, kernelInfo->kernel, 1, NULL, &gWorkItems, &lWorkItems, 0, NULL, NULL); if(err) return err; currRead = 1; currWrite = 1; kernelInfo = kernelInfo->next; } } return err; } cl_int clFFT_1DTwistInterleaved(clFFT_Plan Plan, cl_command_queue queue, cl_mem array, unsigned numRows, unsigned numCols, unsigned startRow, unsigned rowsToProcess, clFFT_Direction dir) { cl_fft_plan *plan = (cl_fft_plan *) Plan; unsigned int N = numRows*numCols; unsigned int nCols = numCols; unsigned int sRow = startRow; unsigned int rToProcess = rowsToProcess; int d = dir; int err = 0; cl_device_id device_id; err = clGetCommandQueueInfo(queue, CL_QUEUE_DEVICE, sizeof(cl_device_id), &device_id, NULL); if(err) return err; size_t gSize; err = clGetKernelWorkGroupInfo(plan->twist_kernel, device_id, CL_KERNEL_WORK_GROUP_SIZE, sizeof(size_t), &gSize, NULL); if(err) return err; gSize = min(128, gSize); size_t numGlobalThreads[1] = { max(numCols / gSize, 1)*gSize }; size_t numLocalThreads[1] = { gSize }; err |= clSetKernelArg(plan->twist_kernel, 0, sizeof(cl_mem), &array); err |= clSetKernelArg(plan->twist_kernel, 1, sizeof(unsigned int), &sRow); err |= clSetKernelArg(plan->twist_kernel, 2, sizeof(unsigned int), &nCols); err |= clSetKernelArg(plan->twist_kernel, 3, sizeof(unsigned int), &N); err |= clSetKernelArg(plan->twist_kernel, 4, sizeof(unsigned int), &rToProcess); err |= clSetKernelArg(plan->twist_kernel, 5, sizeof(int), &d); err |= clEnqueueNDRangeKernel(queue, plan->twist_kernel, 1, NULL, numGlobalThreads, numLocalThreads, 0, NULL, NULL); return err; } cl_int clFFT_1DTwistPlannar(clFFT_Plan Plan, cl_command_queue queue, cl_mem array_real, cl_mem array_imag, unsigned numRows, unsigned numCols, unsigned startRow, unsigned rowsToProcess, clFFT_Direction dir) { cl_fft_plan *plan = (cl_fft_plan *) Plan; unsigned int N = numRows*numCols; unsigned int nCols = numCols; unsigned int sRow = startRow; unsigned int rToProcess = rowsToProcess; int d = dir; int err = 0; cl_device_id device_id; err = clGetCommandQueueInfo(queue, CL_QUEUE_DEVICE, sizeof(cl_device_id), &device_id, NULL); if(err) return err; size_t gSize; err = clGetKernelWorkGroupInfo(plan->twist_kernel, device_id, CL_KERNEL_WORK_GROUP_SIZE, sizeof(size_t), &gSize, NULL); if(err) return err; gSize = min(128, gSize); size_t numGlobalThreads[1] = { max(numCols / gSize, 1)*gSize }; size_t numLocalThreads[1] = { gSize }; err |= clSetKernelArg(plan->twist_kernel, 0, sizeof(cl_mem), &array_real); err |= clSetKernelArg(plan->twist_kernel, 1, sizeof(cl_mem), &array_imag); err |= clSetKernelArg(plan->twist_kernel, 2, sizeof(unsigned int), &sRow); err |= clSetKernelArg(plan->twist_kernel, 3, sizeof(unsigned int), &nCols); err |= clSetKernelArg(plan->twist_kernel, 4, sizeof(unsigned int), &N); err |= clSetKernelArg(plan->twist_kernel, 5, sizeof(unsigned int), &rToProcess); err |= clSetKernelArg(plan->twist_kernel, 6, sizeof(int), &d); err |= clEnqueueNDRangeKernel(queue, plan->twist_kernel, 1, NULL, numGlobalThreads, numLocalThreads, 0, NULL, NULL); return err; } gnss-sdr-0.0.9/src/algorithms/libs/fft_internal.h000066400000000000000000000156741305042567700220230ustar00rootroot00000000000000 // // File: fft_internal.h // // Version: <1.0> // // Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Inc. ("Apple") // in consideration of your agreement to the following terms, and your use, // installation, modification or redistribution of this Apple software // constitutes acceptance of these terms. If you do not agree with these // terms, please do not use, install, modify or redistribute this Apple // software. // // In consideration of your agreement to abide by the following terms, and // subject to these terms, Apple grants you a personal, non - exclusive // license, under Apple's copyrights in this original Apple software ( the // "Apple Software" ), to use, reproduce, modify and redistribute the Apple // Software, with or without modifications, in source and / or binary forms; // provided that if you redistribute the Apple Software in its entirety and // without modifications, you must retain this notice and the following text // and disclaimers in all such redistributions of the Apple Software. Neither // the name, trademarks, service marks or logos of Apple Inc. may be used to // endorse or promote products derived from the Apple Software without specific // prior written permission from Apple. Except as expressly stated in this // notice, no other rights or licenses, express or implied, are granted by // Apple herein, including but not limited to any patent rights that may be // infringed by your derivative works or by other works in which the Apple // Software may be incorporated. // // The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO // WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED // WARRANTIES OF NON - INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A // PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION // ALONE OR IN COMBINATION WITH YOUR PRODUCTS. // // IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR // CONSEQUENTIAL DAMAGES ( INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION ) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION // AND / OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER // UNDER THEORY OF CONTRACT, TORT ( INCLUDING NEGLIGENCE ), STRICT LIABILITY OR // OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Copyright ( C ) 2008 Apple Inc. All Rights Reserved. // //////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef __CLFFT_INTERNAL_H #define __CLFFT_INTERNAL_H #include "clFFT.h" #include #include #include using namespace std; typedef enum kernel_dir_t { cl_fft_kernel_x, cl_fft_kernel_y, cl_fft_kernel_z }cl_fft_kernel_dir; typedef struct kernel_info_t { cl_kernel kernel; char *kernel_name; unsigned lmem_size; unsigned num_workgroups; unsigned num_xforms_per_workgroup; unsigned num_workitems_per_workgroup; cl_fft_kernel_dir dir; int in_place_possible; kernel_info_t *next; }cl_fft_kernel_info; typedef struct { // context in which fft resources are created and kernels are executed cl_context context; // size of signal clFFT_Dim3 n; // dimension of transform ... must be either 1D, 2D or 3D clFFT_Dimension dim; // data format ... must be either interleaved or plannar clFFT_DataFormat format; // string containing kernel source. Generated at runtime based on // n, dim, format and other parameters string *kernel_string; // CL program containing source and kernel this particular // n, dim, data format cl_program program; // linked list of kernels which needs to be executed for this fft cl_fft_kernel_info *kernel_info; // number of kernels int num_kernels; // twist kernel for virtualizing fft of very large sizes that do not // fit in GPU global memory cl_kernel twist_kernel; // flag indicating if temporary intermediate buffer is needed or not. // this depends on fft kernels being executed and if transform is // in-place or out-of-place. e.g. Local memory fft (say 1D 1024 ... // one that does not require global transpose do not need temporary buffer) // 2D 1024x1024 out-of-place fft however do require intermediate buffer. // If temp buffer is needed, its allocation is lazy i.e. its not allocated // until its needed cl_int temp_buffer_needed; // Batch size is runtime parameter and size of temporary buffer (if needed) // depends on batch size. Allocation of temporary buffer is lazy i.e. its // only created when needed. Once its created at first call of clFFT_Executexxx // it is not allocated next time if next time clFFT_Executexxx is called with // batch size different than the first call. last_batch_size caches the last // batch size with which this plan is used so that we dont keep allocating/deallocating // temp buffer if same batch size is used again and again. unsigned last_batch_size; // temporary buffer for interleaved plan cl_mem tempmemobj; // temporary buffer for planner plan. Only one of tempmemobj or // (tempmemobj_real, tempmemobj_imag) pair is valid (allocated) depending // data format of plan (plannar or interleaved) cl_mem tempmemobj_real, tempmemobj_imag; // Maximum size of signal for which local memory transposed based // fft is sufficient i.e. no global mem transpose (communication) // is needed unsigned max_localmem_fft_size; // Maximum work items per work group allowed. This, along with max_radix below controls // maximum local memory being used by fft kernels of this plan. Set to 256 by default unsigned max_work_item_per_workgroup; // Maximum base radix for local memory fft ... this controls the maximum register // space used by work items. Currently defaults to 16 unsigned max_radix; // Device depended parameter that tells how many work-items need to be read consecutive // values to make sure global memory access by work-items of a work-group result in // coalesced memory access to utilize full bandwidth e.g. on NVidia tesla, this is 16 unsigned min_mem_coalesce_width; // Number of local memory banks. This is used to geneate kernel with local memory // transposes with appropriate padding to avoid bank conflicts to local memory // e.g. on NVidia it is 16. unsigned num_local_mem_banks; }cl_fft_plan; void FFT1D(cl_fft_plan *plan, cl_fft_kernel_dir dir); #endif gnss-sdr-0.0.9/src/algorithms/libs/fft_kernelstring.cc000066400000000000000000001442111305042567700230420ustar00rootroot00000000000000 // // File: fft_kernelstring.cpp // // Version: <1.0> // // Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Inc. ("Apple") // in consideration of your agreement to the following terms, and your use, // installation, modification or redistribution of this Apple software // constitutes acceptance of these terms. If you do not agree with these // terms, please do not use, install, modify or redistribute this Apple // software. // // In consideration of your agreement to abide by the following terms, and // subject to these terms, Apple grants you a personal, non - exclusive // license, under Apple's copyrights in this original Apple software ( the // "Apple Software" ), to use, reproduce, modify and redistribute the Apple // Software, with or without modifications, in source and / or binary forms; // provided that if you redistribute the Apple Software in its entirety and // without modifications, you must retain this notice and the following text // and disclaimers in all such redistributions of the Apple Software. Neither // the name, trademarks, service marks or logos of Apple Inc. may be used to // endorse or promote products derived from the Apple Software without specific // prior written permission from Apple. Except as expressly stated in this // notice, no other rights or licenses, express or implied, are granted by // Apple herein, including but not limited to any patent rights that may be // infringed by your derivative works or by other works in which the Apple // Software may be incorporated. // // The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO // WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED // WARRANTIES OF NON - INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A // PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION // ALONE OR IN COMBINATION WITH YOUR PRODUCTS. // // IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR // CONSEQUENTIAL DAMAGES ( INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION ) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION // AND / OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER // UNDER THEORY OF CONTRACT, TORT ( INCLUDING NEGLIGENCE ), STRICT LIABILITY OR // OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Copyright ( C ) 2008 Apple Inc. All Rights Reserved. // //////////////////////////////////////////////////////////////////////////////////////////////////// #include #include #include #include #include #include #include #include #include "fft_internal.h" #include "clFFT.h" using namespace std; #define max(A,B) ((A) > (B) ? (A) : (B)) #define min(A,B) ((A) < (B) ? (A) : (B)) static string num2str(int num) { char temp[200]; sprintf(temp, "%d", num); return string(temp); } // For any n, this function decomposes n into factors for loacal memory tranpose // based fft. Factors (radices) are sorted such that the first one (radixArray[0]) // is the largest. This base radix determines the number of registers used by each // work item and product of remaining radices determine the size of work group needed. // To make things concrete with and example, suppose n = 1024. It is decomposed into // 1024 = 16 x 16 x 4. Hence kernel uses float2 a[16], for local in-register fft and // needs 16 x 4 = 64 work items per work group. So kernel first performance 64 length // 16 ffts (64 work items working in parallel) following by transpose using local // memory followed by again 64 length 16 ffts followed by transpose using local memory // followed by 256 length 4 ffts. For the last step since with size of work group is // 64 and each work item can array for 16 values, 64 work items can compute 256 length // 4 ffts by each work item computing 4 length 4 ffts. // Similarly for n = 2048 = 8 x 8 x 8 x 4, each work group has 8 x 8 x 4 = 256 work // iterms which each computes 256 (in-parallel) length 8 ffts in-register, followed // by transpose using local memory, followed by 256 length 8 in-register ffts, followed // by transpose using local memory, followed by 256 length 8 in-register ffts, followed // by transpose using local memory, followed by 512 length 4 in-register ffts. Again, // for the last step, each work item computes two length 4 in-register ffts and thus // 256 work items are needed to compute all 512 ffts. // For n = 32 = 8 x 4, 4 work items first compute 4 in-register // lenth 8 ffts, followed by transpose using local memory followed by 8 in-register // length 4 ffts, where each work item computes two length 4 ffts thus 4 work items // can compute 8 length 4 ffts. However if work group size of say 64 is choosen, // each work group can compute 64/ 4 = 16 size 32 ffts (batched transform). // Users can play with these parameters to figure what gives best performance on // their particular device i.e. some device have less register space thus using // smaller base radix can avoid spilling ... some has small local memory thus // using smaller work group size may be required etc static void getRadixArray(unsigned int n, unsigned int *radixArray, unsigned int *numRadices, unsigned int maxRadix) { if(maxRadix > 1) { maxRadix = min(n, maxRadix); unsigned int cnt = 0; while(n > maxRadix) { radixArray[cnt++] = maxRadix; n /= maxRadix; } radixArray[cnt++] = n; *numRadices = cnt; return; } switch(n) { case 2: *numRadices = 1; radixArray[0] = 2; break; case 4: *numRadices = 1; radixArray[0] = 4; break; case 8: *numRadices = 1; radixArray[0] = 8; break; case 16: *numRadices = 2; radixArray[0] = 8; radixArray[1] = 2; break; case 32: *numRadices = 2; radixArray[0] = 8; radixArray[1] = 4; break; case 64: *numRadices = 2; radixArray[0] = 8; radixArray[1] = 8; break; case 128: *numRadices = 3; radixArray[0] = 8; radixArray[1] = 4; radixArray[2] = 4; break; case 256: *numRadices = 4; radixArray[0] = 4; radixArray[1] = 4; radixArray[2] = 4; radixArray[3] = 4; break; case 512: *numRadices = 3; radixArray[0] = 8; radixArray[1] = 8; radixArray[2] = 8; break; case 1024: *numRadices = 3; radixArray[0] = 16; radixArray[1] = 16; radixArray[2] = 4; break; case 2048: *numRadices = 4; radixArray[0] = 8; radixArray[1] = 8; radixArray[2] = 8; radixArray[3] = 4; break; default: *numRadices = 0; return; } } static void insertHeader(string &kernelString, string &kernelName, clFFT_DataFormat dataFormat) { if(dataFormat == clFFT_SplitComplexFormat) kernelString += string("__kernel void ") + kernelName + string("(__global float *in_real, __global float *in_imag, __global float *out_real, __global float *out_imag, int dir, int S)\n"); else kernelString += string("__kernel void ") + kernelName + string("(__global float2 *in, __global float2 *out, int dir, int S)\n"); } static void insertVariables(string &kStream, int maxRadix) { kStream += string(" int i, j, r, indexIn, indexOut, index, tid, bNum, xNum, k, l;\n"); kStream += string(" int s, ii, jj, offset;\n"); kStream += string(" float2 w;\n"); kStream += string(" float ang, angf, ang1;\n"); kStream += string(" __local float *lMemStore, *lMemLoad;\n"); kStream += string(" float2 a[") + num2str(maxRadix) + string("];\n"); kStream += string(" int lId = get_local_id( 0 );\n"); kStream += string(" int groupId = get_group_id( 0 );\n"); } static void formattedLoad(string &kernelString, int aIndex, int gIndex, clFFT_DataFormat dataFormat) { if(dataFormat == clFFT_InterleavedComplexFormat) kernelString += string(" a[") + num2str(aIndex) + string("] = in[") + num2str(gIndex) + string("];\n"); else { kernelString += string(" a[") + num2str(aIndex) + string("].x = in_real[") + num2str(gIndex) + string("];\n"); kernelString += string(" a[") + num2str(aIndex) + string("].y = in_imag[") + num2str(gIndex) + string("];\n"); } } static void formattedStore(string &kernelString, int aIndex, int gIndex, clFFT_DataFormat dataFormat) { if(dataFormat == clFFT_InterleavedComplexFormat) kernelString += string(" out[") + num2str(gIndex) + string("] = a[") + num2str(aIndex) + string("];\n"); else { kernelString += string(" out_real[") + num2str(gIndex) + string("] = a[") + num2str(aIndex) + string("].x;\n"); kernelString += string(" out_imag[") + num2str(gIndex) + string("] = a[") + num2str(aIndex) + string("].y;\n"); } } static int insertGlobalLoadsAndTranspose(string &kernelString, int N, int numWorkItemsPerXForm, int numXFormsPerWG, int R0, int mem_coalesce_width, clFFT_DataFormat dataFormat) { int log2NumWorkItemsPerXForm = (int) log2(numWorkItemsPerXForm); int groupSize = numWorkItemsPerXForm * numXFormsPerWG; int i, j; int lMemSize = 0; if(numXFormsPerWG > 1) kernelString += string(" s = S & ") + num2str(numXFormsPerWG - 1) + string(";\n"); if(numWorkItemsPerXForm >= mem_coalesce_width) { if(numXFormsPerWG > 1) { kernelString += string(" ii = lId & ") + num2str(numWorkItemsPerXForm-1) + string(";\n"); kernelString += string(" jj = lId >> ") + num2str(log2NumWorkItemsPerXForm) + string(";\n"); kernelString += string(" if( !s || (groupId < get_num_groups(0)-1) || (jj < s) ) {\n"); kernelString += string(" offset = mad24( mad24(groupId, ") + num2str(numXFormsPerWG) + string(", jj), ") + num2str(N) + string(", ii );\n"); if(dataFormat == clFFT_InterleavedComplexFormat) { kernelString += string(" in += offset;\n"); kernelString += string(" out += offset;\n"); } else { kernelString += string(" in_real += offset;\n"); kernelString += string(" in_imag += offset;\n"); kernelString += string(" out_real += offset;\n"); kernelString += string(" out_imag += offset;\n"); } for(i = 0; i < R0; i++) formattedLoad(kernelString, i, i*numWorkItemsPerXForm, dataFormat); kernelString += string(" }\n"); } else { kernelString += string(" ii = lId;\n"); kernelString += string(" jj = 0;\n"); kernelString += string(" offset = mad24(groupId, ") + num2str(N) + string(", ii);\n"); if(dataFormat == clFFT_InterleavedComplexFormat) { kernelString += string(" in += offset;\n"); kernelString += string(" out += offset;\n"); } else { kernelString += string(" in_real += offset;\n"); kernelString += string(" in_imag += offset;\n"); kernelString += string(" out_real += offset;\n"); kernelString += string(" out_imag += offset;\n"); } for(i = 0; i < R0; i++) formattedLoad(kernelString, i, i*numWorkItemsPerXForm, dataFormat); } } else if( N >= mem_coalesce_width ) { int numInnerIter = N / mem_coalesce_width; int numOuterIter = numXFormsPerWG / ( groupSize / mem_coalesce_width ); kernelString += string(" ii = lId & ") + num2str(mem_coalesce_width - 1) + string(";\n"); kernelString += string(" jj = lId >> ") + num2str((int)log2(mem_coalesce_width)) + string(";\n"); kernelString += string(" lMemStore = sMem + mad24( jj, ") + num2str(N + numWorkItemsPerXForm) + string(", ii );\n"); kernelString += string(" offset = mad24( groupId, ") + num2str(numXFormsPerWG) + string(", jj);\n"); kernelString += string(" offset = mad24( offset, ") + num2str(N) + string(", ii );\n"); if(dataFormat == clFFT_InterleavedComplexFormat) { kernelString += string(" in += offset;\n"); kernelString += string(" out += offset;\n"); } else { kernelString += string(" in_real += offset;\n"); kernelString += string(" in_imag += offset;\n"); kernelString += string(" out_real += offset;\n"); kernelString += string(" out_imag += offset;\n"); } kernelString += string("if((groupId == get_num_groups(0)-1) && s) {\n"); for(i = 0; i < numOuterIter; i++ ) { kernelString += string(" if( jj < s ) {\n"); for(j = 0; j < numInnerIter; j++ ) formattedLoad(kernelString, i * numInnerIter + j, j * mem_coalesce_width + i * ( groupSize / mem_coalesce_width ) * N, dataFormat); kernelString += string(" }\n"); if(i != numOuterIter - 1) kernelString += string(" jj += ") + num2str(groupSize / mem_coalesce_width) + string(";\n"); } kernelString += string("}\n "); kernelString += string("else {\n"); for(i = 0; i < numOuterIter; i++ ) { for(j = 0; j < numInnerIter; j++ ) formattedLoad(kernelString, i * numInnerIter + j, j * mem_coalesce_width + i * ( groupSize / mem_coalesce_width ) * N, dataFormat); } kernelString += string("}\n"); kernelString += string(" ii = lId & ") + num2str(numWorkItemsPerXForm - 1) + string(";\n"); kernelString += string(" jj = lId >> ") + num2str(log2NumWorkItemsPerXForm) + string(";\n"); kernelString += string(" lMemLoad = sMem + mad24( jj, ") + num2str(N + numWorkItemsPerXForm) + string(", ii);\n"); for( i = 0; i < numOuterIter; i++ ) { for( j = 0; j < numInnerIter; j++ ) { kernelString += string(" lMemStore[") + num2str(j * mem_coalesce_width + i * ( groupSize / mem_coalesce_width ) * (N + numWorkItemsPerXForm )) + string("] = a[") + num2str(i * numInnerIter + j) + string("].x;\n"); } } kernelString += string(" barrier( CLK_LOCAL_MEM_FENCE );\n"); for( i = 0; i < R0; i++ ) kernelString += string(" a[") + num2str(i) + string("].x = lMemLoad[") + num2str(i * numWorkItemsPerXForm) + string("];\n"); kernelString += string(" barrier( CLK_LOCAL_MEM_FENCE );\n"); for( i = 0; i < numOuterIter; i++ ) { for( j = 0; j < numInnerIter; j++ ) { kernelString += string(" lMemStore[") + num2str(j * mem_coalesce_width + i * ( groupSize / mem_coalesce_width ) * (N + numWorkItemsPerXForm )) + string("] = a[") + num2str(i * numInnerIter + j) + string("].y;\n"); } } kernelString += string(" barrier( CLK_LOCAL_MEM_FENCE );\n"); for( i = 0; i < R0; i++ ) kernelString += string(" a[") + num2str(i) + string("].y = lMemLoad[") + num2str(i * numWorkItemsPerXForm) + string("];\n"); kernelString += string(" barrier( CLK_LOCAL_MEM_FENCE );\n"); lMemSize = (N + numWorkItemsPerXForm) * numXFormsPerWG; } else { kernelString += string(" offset = mad24( groupId, ") + num2str(N * numXFormsPerWG) + string(", lId );\n"); if(dataFormat == clFFT_InterleavedComplexFormat) { kernelString += string(" in += offset;\n"); kernelString += string(" out += offset;\n"); } else { kernelString += string(" in_real += offset;\n"); kernelString += string(" in_imag += offset;\n"); kernelString += string(" out_real += offset;\n"); kernelString += string(" out_imag += offset;\n"); } kernelString += string(" ii = lId & ") + num2str(N-1) + string(";\n"); kernelString += string(" jj = lId >> ") + num2str((int)log2(N)) + string(";\n"); kernelString += string(" lMemStore = sMem + mad24( jj, ") + num2str(N + numWorkItemsPerXForm) + string(", ii );\n"); kernelString += string("if((groupId == get_num_groups(0)-1) && s) {\n"); for( i = 0; i < R0; i++ ) { kernelString += string(" if(jj < s )\n"); formattedLoad(kernelString, i, i*groupSize, dataFormat); if(i != R0 - 1) kernelString += string(" jj += ") + num2str(groupSize / N) + string(";\n"); } kernelString += string("}\n"); kernelString += string("else {\n"); for( i = 0; i < R0; i++ ) { formattedLoad(kernelString, i, i*groupSize, dataFormat); } kernelString += string("}\n"); if(numWorkItemsPerXForm > 1) { kernelString += string(" ii = lId & ") + num2str(numWorkItemsPerXForm - 1) + string(";\n"); kernelString += string(" jj = lId >> ") + num2str(log2NumWorkItemsPerXForm) + string(";\n"); kernelString += string(" lMemLoad = sMem + mad24( jj, ") + num2str(N + numWorkItemsPerXForm) + string(", ii );\n"); } else { kernelString += string(" ii = 0;\n"); kernelString += string(" jj = lId;\n"); kernelString += string(" lMemLoad = sMem + mul24( jj, ") + num2str(N + numWorkItemsPerXForm) + string(");\n"); } for( i = 0; i < R0; i++ ) kernelString += string(" lMemStore[") + num2str(i * ( groupSize / N ) * ( N + numWorkItemsPerXForm )) + string("] = a[") + num2str(i) + string("].x;\n"); kernelString += string(" barrier( CLK_LOCAL_MEM_FENCE );\n"); for( i = 0; i < R0; i++ ) kernelString += string(" a[") + num2str(i) + string("].x = lMemLoad[") + num2str(i * numWorkItemsPerXForm) + string("];\n"); kernelString += string(" barrier( CLK_LOCAL_MEM_FENCE );\n"); for( i = 0; i < R0; i++ ) kernelString += string(" lMemStore[") + num2str(i * ( groupSize / N ) * ( N + numWorkItemsPerXForm )) + string("] = a[") + num2str(i) + string("].y;\n"); kernelString += string(" barrier( CLK_LOCAL_MEM_FENCE );\n"); for( i = 0; i < R0; i++ ) kernelString += string(" a[") + num2str(i) + string("].y = lMemLoad[") + num2str(i * numWorkItemsPerXForm) + string("];\n"); kernelString += string(" barrier( CLK_LOCAL_MEM_FENCE );\n"); lMemSize = (N + numWorkItemsPerXForm) * numXFormsPerWG; } return lMemSize; } static int insertGlobalStoresAndTranspose(string &kernelString, int N, int maxRadix, int Nr, int numWorkItemsPerXForm, int numXFormsPerWG, int mem_coalesce_width, clFFT_DataFormat dataFormat) { int groupSize = numWorkItemsPerXForm * numXFormsPerWG; int i, j, k, ind; int lMemSize = 0; int numIter = maxRadix / Nr; string indent = string(""); if( numWorkItemsPerXForm >= mem_coalesce_width ) { if(numXFormsPerWG > 1) { kernelString += string(" if( !s || (groupId < get_num_groups(0)-1) || (jj < s) ) {\n"); indent = string(" "); } for(i = 0; i < maxRadix; i++) { j = i % numIter; k = i / numIter; ind = j * Nr + k; formattedStore(kernelString, ind, i*numWorkItemsPerXForm, dataFormat); } if(numXFormsPerWG > 1) kernelString += string(" }\n"); } else if( N >= mem_coalesce_width ) { int numInnerIter = N / mem_coalesce_width; int numOuterIter = numXFormsPerWG / ( groupSize / mem_coalesce_width ); kernelString += string(" lMemLoad = sMem + mad24( jj, ") + num2str(N + numWorkItemsPerXForm) + string(", ii );\n"); kernelString += string(" ii = lId & ") + num2str(mem_coalesce_width - 1) + string(";\n"); kernelString += string(" jj = lId >> ") + num2str((int)log2(mem_coalesce_width)) + string(";\n"); kernelString += string(" lMemStore = sMem + mad24( jj,") + num2str(N + numWorkItemsPerXForm) + string(", ii );\n"); for( i = 0; i < maxRadix; i++ ) { j = i % numIter; k = i / numIter; ind = j * Nr + k; kernelString += string(" lMemLoad[") + num2str(i*numWorkItemsPerXForm) + string("] = a[") + num2str(ind) + string("].x;\n"); } kernelString += string(" barrier( CLK_LOCAL_MEM_FENCE );\n"); for( i = 0; i < numOuterIter; i++ ) for( j = 0; j < numInnerIter; j++ ) kernelString += string(" a[") + num2str(i*numInnerIter + j) + string("].x = lMemStore[") + num2str(j*mem_coalesce_width + i*( groupSize / mem_coalesce_width )*(N + numWorkItemsPerXForm)) + string("];\n"); kernelString += string(" barrier( CLK_LOCAL_MEM_FENCE );\n"); for( i = 0; i < maxRadix; i++ ) { j = i % numIter; k = i / numIter; ind = j * Nr + k; kernelString += string(" lMemLoad[") + num2str(i*numWorkItemsPerXForm) + string("] = a[") + num2str(ind) + string("].y;\n"); } kernelString += string(" barrier( CLK_LOCAL_MEM_FENCE );\n"); for( i = 0; i < numOuterIter; i++ ) for( j = 0; j < numInnerIter; j++ ) kernelString += string(" a[") + num2str(i*numInnerIter + j) + string("].y = lMemStore[") + num2str(j*mem_coalesce_width + i*( groupSize / mem_coalesce_width )*(N + numWorkItemsPerXForm)) + string("];\n"); kernelString += string(" barrier( CLK_LOCAL_MEM_FENCE );\n"); kernelString += string("if((groupId == get_num_groups(0)-1) && s) {\n"); for(i = 0; i < numOuterIter; i++ ) { kernelString += string(" if( jj < s ) {\n"); for(j = 0; j < numInnerIter; j++ ) formattedStore(kernelString, i*numInnerIter + j, j*mem_coalesce_width + i*(groupSize/mem_coalesce_width)*N, dataFormat); kernelString += string(" }\n"); if(i != numOuterIter - 1) kernelString += string(" jj += ") + num2str(groupSize / mem_coalesce_width) + string(";\n"); } kernelString += string("}\n"); kernelString += string("else {\n"); for(i = 0; i < numOuterIter; i++ ) { for(j = 0; j < numInnerIter; j++ ) formattedStore(kernelString, i*numInnerIter + j, j*mem_coalesce_width + i*(groupSize/mem_coalesce_width)*N, dataFormat); } kernelString += string("}\n"); lMemSize = (N + numWorkItemsPerXForm) * numXFormsPerWG; } else { kernelString += string(" lMemLoad = sMem + mad24( jj,") + num2str(N + numWorkItemsPerXForm) + string(", ii );\n"); kernelString += string(" ii = lId & ") + num2str(N - 1) + string(";\n"); kernelString += string(" jj = lId >> ") + num2str((int) log2(N)) + string(";\n"); kernelString += string(" lMemStore = sMem + mad24( jj,") + num2str(N + numWorkItemsPerXForm) + string(", ii );\n"); for( i = 0; i < maxRadix; i++ ) { j = i % numIter; k = i / numIter; ind = j * Nr + k; kernelString += string(" lMemLoad[") + num2str(i*numWorkItemsPerXForm) + string("] = a[") + num2str(ind) + string("].x;\n"); } kernelString += string(" barrier( CLK_LOCAL_MEM_FENCE );\n"); for( i = 0; i < maxRadix; i++ ) kernelString += string(" a[") + num2str(i) + string("].x = lMemStore[") + num2str(i*( groupSize / N )*( N + numWorkItemsPerXForm )) + string("];\n"); kernelString += string(" barrier( CLK_LOCAL_MEM_FENCE );\n"); for( i = 0; i < maxRadix; i++ ) { j = i % numIter; k = i / numIter; ind = j * Nr + k; kernelString += string(" lMemLoad[") + num2str(i*numWorkItemsPerXForm) + string("] = a[") + num2str(ind) + string("].y;\n"); } kernelString += string(" barrier( CLK_LOCAL_MEM_FENCE );\n"); for( i = 0; i < maxRadix; i++ ) kernelString += string(" a[") + num2str(i) + string("].y = lMemStore[") + num2str(i*( groupSize / N )*( N + numWorkItemsPerXForm )) + string("];\n"); kernelString += string(" barrier( CLK_LOCAL_MEM_FENCE );\n"); kernelString += string("if((groupId == get_num_groups(0)-1) && s) {\n"); for( i = 0; i < maxRadix; i++ ) { kernelString += string(" if(jj < s ) {\n"); formattedStore(kernelString, i, i*groupSize, dataFormat); kernelString += string(" }\n"); if( i != maxRadix - 1) kernelString += string(" jj +=") + num2str(groupSize / N) + string(";\n"); } kernelString += string("}\n"); kernelString += string("else {\n"); for( i = 0; i < maxRadix; i++ ) { formattedStore(kernelString, i, i*groupSize, dataFormat); } kernelString += string("}\n"); lMemSize = (N + numWorkItemsPerXForm) * numXFormsPerWG; } return lMemSize; } static void insertfftKernel(string &kernelString, int Nr, int numIter) { int i; for(i = 0; i < numIter; i++) { kernelString += string(" fftKernel") + num2str(Nr) + string("(a+") + num2str(i*Nr) + string(", dir);\n"); } } static void insertTwiddleKernel(string &kernelString, int Nr, int numIter, int Nprev, int len, int numWorkItemsPerXForm) { int z, k; int logNPrev = (int)log2(Nprev); for(z = 0; z < numIter; z++) { if(z == 0) { if(Nprev > 1) kernelString += string(" angf = (float) (ii >> ") + num2str(logNPrev) + string(");\n"); else kernelString += string(" angf = (float) ii;\n"); } else { if(Nprev > 1) kernelString += string(" angf = (float) ((") + num2str(z*numWorkItemsPerXForm) + string(" + ii) >>") + num2str(logNPrev) + string(");\n"); else kernelString += string(" angf = (float) (") + num2str(z*numWorkItemsPerXForm) + string(" + ii);\n"); } for(k = 1; k < Nr; k++) { int ind = z*Nr + k; //float fac = (float) (2.0 * M_PI * (double) k / (double) len); kernelString += string(" ang = dir * ( 2.0f * M_PI * ") + num2str(k) + string(".0f / ") + num2str(len) + string(".0f )") + string(" * angf;\n"); kernelString += string(" w = (float2)(native_cos(ang), native_sin(ang));\n"); kernelString += string(" a[") + num2str(ind) + string("] = complexMul(a[") + num2str(ind) + string("], w);\n"); } } } static int getPadding(int numWorkItemsPerXForm, int Nprev, int numWorkItemsReq, int numXFormsPerWG, int Nr, int numBanks, int *offset, int *midPad) { if((numWorkItemsPerXForm <= Nprev) || (Nprev >= numBanks)) *offset = 0; else { int numRowsReq = ((numWorkItemsPerXForm < numBanks) ? numWorkItemsPerXForm : numBanks) / Nprev; int numColsReq = 1; if(numRowsReq > Nr) numColsReq = numRowsReq / Nr; numColsReq = Nprev * numColsReq; *offset = numColsReq; } if(numWorkItemsPerXForm >= numBanks || numXFormsPerWG == 1) *midPad = 0; else { int bankNum = ( (numWorkItemsReq + *offset) * Nr ) & (numBanks - 1); if( bankNum >= numWorkItemsPerXForm ) *midPad = 0; else *midPad = numWorkItemsPerXForm - bankNum; } int lMemSize = ( numWorkItemsReq + *offset) * Nr * numXFormsPerWG + *midPad * (numXFormsPerWG - 1); return lMemSize; } static void insertLocalStores(string &kernelString, int numIter, int Nr, int numWorkItemsPerXForm, int numWorkItemsReq, int offset, string &comp) { int z, k; for(z = 0; z < numIter; z++) { for(k = 0; k < Nr; k++) { int index = k*(numWorkItemsReq + offset) + z*numWorkItemsPerXForm; kernelString += string(" lMemStore[") + num2str(index) + string("] = a[") + num2str(z*Nr + k) + string("].") + comp + string(";\n"); } } kernelString += string(" barrier(CLK_LOCAL_MEM_FENCE);\n"); } static void insertLocalLoads(string &kernelString, int n, int Nr, int Nrn, int Nprev, int Ncurr, int numWorkItemsPerXForm, int numWorkItemsReq, int offset, string &comp) { int numWorkItemsReqN = n / Nrn; int interBlockHNum = max( Nprev / numWorkItemsPerXForm, 1 ); int interBlockHStride = numWorkItemsPerXForm; int vertWidth = max(numWorkItemsPerXForm / Nprev, 1); vertWidth = min( vertWidth, Nr); int vertNum = Nr / vertWidth; int vertStride = ( n / Nr + offset ) * vertWidth; int iter = max( numWorkItemsReqN / numWorkItemsPerXForm, 1); int intraBlockHStride = (numWorkItemsPerXForm / (Nprev*Nr)) > 1 ? (numWorkItemsPerXForm / (Nprev*Nr)) : 1; intraBlockHStride *= Nprev; int stride = numWorkItemsReq / Nrn; int i; for(i = 0; i < iter; i++) { int ii = i / (interBlockHNum * vertNum); int zz = i % (interBlockHNum * vertNum); int jj = zz % interBlockHNum; int kk = zz / interBlockHNum; int z; for(z = 0; z < Nrn; z++) { int st = kk * vertStride + jj * interBlockHStride + ii * intraBlockHStride + z * stride; kernelString += string(" a[") + num2str(i*Nrn + z) + string("].") + comp + string(" = lMemLoad[") + num2str(st) + string("];\n"); } } kernelString += string(" barrier(CLK_LOCAL_MEM_FENCE);\n"); } static void insertLocalLoadIndexArithmatic(string &kernelString, int Nprev, int Nr, int numWorkItemsReq, int numWorkItemsPerXForm, int numXFormsPerWG, int offset, int midPad) { int Ncurr = Nprev * Nr; int logNcurr = (int)log2(Ncurr); int logNprev = (int)log2(Nprev); int incr = (numWorkItemsReq + offset) * Nr + midPad; if(Ncurr < numWorkItemsPerXForm) { if(Nprev == 1) kernelString += string(" j = ii & ") + num2str(Ncurr - 1) + string(";\n"); else kernelString += string(" j = (ii & ") + num2str(Ncurr - 1) + string(") >> ") + num2str(logNprev) + string(";\n"); if(Nprev == 1) kernelString += string(" i = ii >> ") + num2str(logNcurr) + string(";\n"); else kernelString += string(" i = mad24(ii >> ") + num2str(logNcurr) + string(", ") + num2str(Nprev) + string(", ii & ") + num2str(Nprev - 1) + string(");\n"); } else { if(Nprev == 1) kernelString += string(" j = ii;\n"); else kernelString += string(" j = ii >> ") + num2str(logNprev) + string(";\n"); if(Nprev == 1) kernelString += string(" i = 0;\n"); else kernelString += string(" i = ii & ") + num2str(Nprev - 1) + string(";\n"); } if(numXFormsPerWG > 1) kernelString += string(" i = mad24(jj, ") + num2str(incr) + string(", i);\n"); kernelString += string(" lMemLoad = sMem + mad24(j, ") + num2str(numWorkItemsReq + offset) + string(", i);\n"); } static void insertLocalStoreIndexArithmatic(string &kernelString, int numWorkItemsReq, int numXFormsPerWG, int Nr, int offset, int midPad) { if(numXFormsPerWG == 1) { kernelString += string(" lMemStore = sMem + ii;\n"); } else { kernelString += string(" lMemStore = sMem + mad24(jj, ") + num2str((numWorkItemsReq + offset)*Nr + midPad) + string(", ii);\n"); } } static void createLocalMemfftKernelString(cl_fft_plan *plan) { unsigned int radixArray[10]; unsigned int numRadix; unsigned int n = plan->n.x; assert(n <= plan->max_work_item_per_workgroup * plan->max_radix && "signal lenght too big for local mem fft\n"); getRadixArray(n, radixArray, &numRadix, 0); assert(numRadix > 0 && "no radix array supplied\n"); if(n/radixArray[0] > plan->max_work_item_per_workgroup) getRadixArray(n, radixArray, &numRadix, plan->max_radix); assert(radixArray[0] <= plan->max_radix && "max radix choosen is greater than allowed\n"); assert(n/radixArray[0] <= plan->max_work_item_per_workgroup && "required work items per xform greater than maximum work items allowed per work group for local mem fft\n"); unsigned int tmpLen = 1; unsigned int i; for(i = 0; i < numRadix; i++) { assert( radixArray[i] && !( (radixArray[i] - 1) & radixArray[i] ) ); tmpLen *= radixArray[i]; } assert(tmpLen == n && "product of radices choosen doesnt match the length of signal\n"); int offset, midPad; string localString(""), kernelName(""); clFFT_DataFormat dataFormat = plan->format; string *kernelString = plan->kernel_string; cl_fft_kernel_info **kInfo = &plan->kernel_info; int kCount = 0; while(*kInfo) { kInfo = &(*kInfo)->next; kCount++; } kernelName = string("fft") + num2str(kCount); *kInfo = (cl_fft_kernel_info *) malloc(sizeof(cl_fft_kernel_info)); (*kInfo)->kernel = 0; (*kInfo)->lmem_size = 0; (*kInfo)->num_workgroups = 0; (*kInfo)->num_workitems_per_workgroup = 0; (*kInfo)->dir = cl_fft_kernel_x; (*kInfo)->in_place_possible = 1; (*kInfo)->next = NULL; (*kInfo)->kernel_name = (char *) malloc(sizeof(char)*(kernelName.size()+1)); strcpy((*kInfo)->kernel_name, kernelName.c_str()); unsigned int numWorkItemsPerXForm = n / radixArray[0]; unsigned int numWorkItemsPerWG = numWorkItemsPerXForm <= 64 ? 64 : numWorkItemsPerXForm; assert(numWorkItemsPerWG <= plan->max_work_item_per_workgroup); int numXFormsPerWG = numWorkItemsPerWG / numWorkItemsPerXForm; (*kInfo)->num_workgroups = 1; (*kInfo)->num_xforms_per_workgroup = numXFormsPerWG; (*kInfo)->num_workitems_per_workgroup = numWorkItemsPerWG; unsigned int *N = radixArray; unsigned int maxRadix = N[0]; unsigned int lMemSize = 0; insertVariables(localString, maxRadix); lMemSize = insertGlobalLoadsAndTranspose(localString, n, numWorkItemsPerXForm, numXFormsPerWG, maxRadix, plan->min_mem_coalesce_width, dataFormat); (*kInfo)->lmem_size = (lMemSize > (*kInfo)->lmem_size) ? lMemSize : (*kInfo)->lmem_size; string xcomp = string("x"); string ycomp = string("y"); unsigned int Nprev = 1; unsigned int len = n; unsigned int r; for(r = 0; r < numRadix; r++) { int numIter = N[0] / N[r]; int numWorkItemsReq = n / N[r]; int Ncurr = Nprev * N[r]; insertfftKernel(localString, N[r], numIter); if(r < (numRadix - 1)) { insertTwiddleKernel(localString, N[r], numIter, Nprev, len, numWorkItemsPerXForm); lMemSize = getPadding(numWorkItemsPerXForm, Nprev, numWorkItemsReq, numXFormsPerWG, N[r], plan->num_local_mem_banks, &offset, &midPad); (*kInfo)->lmem_size = (lMemSize > (*kInfo)->lmem_size) ? lMemSize : (*kInfo)->lmem_size; insertLocalStoreIndexArithmatic(localString, numWorkItemsReq, numXFormsPerWG, N[r], offset, midPad); insertLocalLoadIndexArithmatic(localString, Nprev, N[r], numWorkItemsReq, numWorkItemsPerXForm, numXFormsPerWG, offset, midPad); insertLocalStores(localString, numIter, N[r], numWorkItemsPerXForm, numWorkItemsReq, offset, xcomp); insertLocalLoads(localString, n, N[r], N[r+1], Nprev, Ncurr, numWorkItemsPerXForm, numWorkItemsReq, offset, xcomp); insertLocalStores(localString, numIter, N[r], numWorkItemsPerXForm, numWorkItemsReq, offset, ycomp); insertLocalLoads(localString, n, N[r], N[r+1], Nprev, Ncurr, numWorkItemsPerXForm, numWorkItemsReq, offset, ycomp); Nprev = Ncurr; len = len / N[r]; } } lMemSize = insertGlobalStoresAndTranspose(localString, n, maxRadix, N[numRadix - 1], numWorkItemsPerXForm, numXFormsPerWG, plan->min_mem_coalesce_width, dataFormat); (*kInfo)->lmem_size = (lMemSize > (*kInfo)->lmem_size) ? lMemSize : (*kInfo)->lmem_size; insertHeader(*kernelString, kernelName, dataFormat); *kernelString += string("{\n"); if((*kInfo)->lmem_size) *kernelString += string(" __local float sMem[") + num2str((*kInfo)->lmem_size) + string("];\n"); *kernelString += localString; *kernelString += string("}\n"); } // For n larger than what can be computed using local memory fft, global transposes // multiple kernel launces is needed. For these sizes, n can be decomposed using // much larger base radices i.e. say n = 262144 = 128 x 64 x 32. Thus three kernel // launches will be needed, first computing 64 x 32, length 128 ffts, second computing // 128 x 32 length 64 ffts, and finally a kernel computing 128 x 64 length 32 ffts. // Each of these base radices can futher be divided into factors so that each of these // base ffts can be computed within one kernel launch using in-register ffts and local // memory transposes i.e for the first kernel above which computes 64 x 32 ffts on length // 128, 128 can be decomposed into 128 = 16 x 8 i.e. 8 work items can compute 8 length // 16 ffts followed by transpose using local memory followed by each of these eight // work items computing 2 length 8 ffts thus computing 16 length 8 ffts in total. This // means only 8 work items are needed for computing one length 128 fft. If we choose // work group size of say 64, we can compute 64/8 = 8 length 128 ffts within one // work group. Since we need to compute 64 x 32 length 128 ffts in first kernel, this // means we need to launch 64 x 32 / 8 = 256 work groups with 64 work items in each // work group where each work group is computing 8 length 128 ffts where each length // 128 fft is computed by 8 work items. Same logic can be applied to other two kernels // in this example. Users can play with difference base radices and difference // decompositions of base radices to generates different kernels and see which gives // best performance. Following function is just fixed to use 128 as base radix void getGlobalRadixInfo(int n, int *radix, int *R1, int *R2, int *numRadices) { int baseRadix = min(n, 128); int numR = 0; int N = n; while(N > baseRadix) { N /= baseRadix; numR++; } for(int i = 0; i < numR; i++) radix[i] = baseRadix; radix[numR] = N; numR++; *numRadices = numR; for(int i = 0; i < numR; i++) { int B = radix[i]; if(B <= 8) { R1[i] = B; R2[i] = 1; continue; } int r1 = 2; int r2 = B / r1; while(r2 > r1) { r1 *=2; r2 = B / r1; } R1[i] = r1; R2[i] = r2; } } static void createGlobalFFTKernelString(cl_fft_plan *plan, int n, int BS, cl_fft_kernel_dir dir, int vertBS) { int i, j, k, t; int radixArr[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; int R1Arr[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; int R2Arr[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; int radix, R1, R2; int numRadices; int maxThreadsPerBlock = plan->max_work_item_per_workgroup; int maxArrayLen = plan->max_radix; int batchSize = plan->min_mem_coalesce_width; clFFT_DataFormat dataFormat = plan->format; int vertical = (dir == cl_fft_kernel_x) ? 0 : 1; getGlobalRadixInfo(n, radixArr, R1Arr, R2Arr, &numRadices); int numPasses = numRadices; string localString(""), kernelName(""); string *kernelString = plan->kernel_string; cl_fft_kernel_info **kInfo = &plan->kernel_info; int kCount = 0; while(*kInfo) { kInfo = &(*kInfo)->next; kCount++; } int N = n; int m = (int)log2(n); int Rinit = vertical ? BS : 1; batchSize = vertical ? min(BS, batchSize) : batchSize; int passNum; for(passNum = 0; passNum < numPasses; passNum++) { localString.clear(); kernelName.clear(); radix = radixArr[passNum]; R1 = R1Arr[passNum]; R2 = R2Arr[passNum]; int strideI = Rinit; for(i = 0; i < numPasses; i++) if(i != passNum) strideI *= radixArr[i]; int strideO = Rinit; for(i = 0; i < passNum; i++) strideO *= radixArr[i]; int threadsPerXForm = R2; batchSize = R2 == 1 ? plan->max_work_item_per_workgroup : batchSize; batchSize = min(batchSize, strideI); int threadsPerBlock = batchSize * threadsPerXForm; threadsPerBlock = min(threadsPerBlock, maxThreadsPerBlock); batchSize = threadsPerBlock / threadsPerXForm; assert(R2 <= R1); assert(R1*R2 == radix); assert(R1 <= maxArrayLen); assert(threadsPerBlock <= maxThreadsPerBlock); int numIter = R1 / R2; int gInInc = threadsPerBlock / batchSize; int lgStrideO = (int)log2(strideO); int numBlocksPerXForm = strideI / batchSize; int numBlocks = numBlocksPerXForm; if(!vertical) numBlocks *= BS; else numBlocks *= vertBS; kernelName = string("fft") + num2str(kCount); *kInfo = (cl_fft_kernel_info *) malloc(sizeof(cl_fft_kernel_info)); (*kInfo)->kernel = 0; if(R2 == 1) (*kInfo)->lmem_size = 0; else { if(strideO == 1) (*kInfo)->lmem_size = (radix + 1)*batchSize; else (*kInfo)->lmem_size = threadsPerBlock*R1; } (*kInfo)->num_workgroups = numBlocks; (*kInfo)->num_xforms_per_workgroup = 1; (*kInfo)->num_workitems_per_workgroup = threadsPerBlock; (*kInfo)->dir = dir; if( (passNum == (numPasses - 1)) && (numPasses & 1) ) (*kInfo)->in_place_possible = 1; else (*kInfo)->in_place_possible = 0; (*kInfo)->next = NULL; (*kInfo)->kernel_name = (char *) malloc(sizeof(char)*(kernelName.size()+1)); strcpy((*kInfo)->kernel_name, kernelName.c_str()); insertVariables(localString, R1); if(vertical) { localString += string("xNum = groupId >> ") + num2str((int)log2(numBlocksPerXForm)) + string(";\n"); localString += string("groupId = groupId & ") + num2str(numBlocksPerXForm - 1) + string(";\n"); localString += string("indexIn = mad24(groupId, ") + num2str(batchSize) + string(", xNum << ") + num2str((int)log2(n*BS)) + string(");\n"); localString += string("tid = mul24(groupId, ") + num2str(batchSize) + string(");\n"); localString += string("i = tid >> ") + num2str(lgStrideO) + string(";\n"); localString += string("j = tid & ") + num2str(strideO - 1) + string(";\n"); int stride = radix*Rinit; for(i = 0; i < passNum; i++) stride *= radixArr[i]; localString += string("indexOut = mad24(i, ") + num2str(stride) + string(", j + ") + string("(xNum << ") + num2str((int) log2(n*BS)) + string("));\n"); localString += string("bNum = groupId;\n"); } else { int lgNumBlocksPerXForm = (int)log2(numBlocksPerXForm); localString += string("bNum = groupId & ") + num2str(numBlocksPerXForm - 1) + string(";\n"); localString += string("xNum = groupId >> ") + num2str(lgNumBlocksPerXForm) + string(";\n"); localString += string("indexIn = mul24(bNum, ") + num2str(batchSize) + string(");\n"); localString += string("tid = indexIn;\n"); localString += string("i = tid >> ") + num2str(lgStrideO) + string(";\n"); localString += string("j = tid & ") + num2str(strideO - 1) + string(";\n"); int stride = radix*Rinit; for(i = 0; i < passNum; i++) stride *= radixArr[i]; localString += string("indexOut = mad24(i, ") + num2str(stride) + string(", j);\n"); localString += string("indexIn += (xNum << ") + num2str(m) + string(");\n"); localString += string("indexOut += (xNum << ") + num2str(m) + string(");\n"); } // Load Data int lgBatchSize = (int)log2(batchSize); localString += string("tid = lId;\n"); localString += string("i = tid & ") + num2str(batchSize - 1) + string(";\n"); localString += string("j = tid >> ") + num2str(lgBatchSize) + string(";\n"); localString += string("indexIn += mad24(j, ") + num2str(strideI) + string(", i);\n"); if(dataFormat == clFFT_SplitComplexFormat) { localString += string("in_real += indexIn;\n"); localString += string("in_imag += indexIn;\n"); for(j = 0; j < R1; j++) localString += string("a[") + num2str(j) + string("].x = in_real[") + num2str(j*gInInc*strideI) + string("];\n"); for(j = 0; j < R1; j++) localString += string("a[") + num2str(j) + string("].y = in_imag[") + num2str(j*gInInc*strideI) + string("];\n"); } else { localString += string("in += indexIn;\n"); for(j = 0; j < R1; j++) localString += string("a[") + num2str(j) + string("] = in[") + num2str(j*gInInc*strideI) + string("];\n"); } localString += string("fftKernel") + num2str(R1) + string("(a, dir);\n"); if(R2 > 1) { // twiddle for(k = 1; k < R1; k++) { localString += string("ang = dir*(2.0f*M_PI*") + num2str(k) + string("/") + num2str(radix) + string(")*j;\n"); localString += string("w = (float2)(native_cos(ang), native_sin(ang));\n"); localString += string("a[") + num2str(k) + string("] = complexMul(a[") + num2str(k) + string("], w);\n"); } // shuffle numIter = R1 / R2; localString += string("indexIn = mad24(j, ") + num2str(threadsPerBlock*numIter) + string(", i);\n"); localString += string("lMemStore = sMem + tid;\n"); localString += string("lMemLoad = sMem + indexIn;\n"); for(k = 0; k < R1; k++) localString += string("lMemStore[") + num2str(k*threadsPerBlock) + string("] = a[") + num2str(k) + string("].x;\n"); localString += string("barrier(CLK_LOCAL_MEM_FENCE);\n"); for(k = 0; k < numIter; k++) for(t = 0; t < R2; t++) localString += string("a[") + num2str(k*R2+t) + string("].x = lMemLoad[") + num2str(t*batchSize + k*threadsPerBlock) + string("];\n"); localString += string("barrier(CLK_LOCAL_MEM_FENCE);\n"); for(k = 0; k < R1; k++) localString += string("lMemStore[") + num2str(k*threadsPerBlock) + string("] = a[") + num2str(k) + string("].y;\n"); localString += string("barrier(CLK_LOCAL_MEM_FENCE);\n"); for(k = 0; k < numIter; k++) for(t = 0; t < R2; t++) localString += string("a[") + num2str(k*R2+t) + string("].y = lMemLoad[") + num2str(t*batchSize + k*threadsPerBlock) + string("];\n"); localString += string("barrier(CLK_LOCAL_MEM_FENCE);\n"); for(j = 0; j < numIter; j++) localString += string("fftKernel") + num2str(R2) + string("(a + ") + num2str(j*R2) + string(", dir);\n"); } // twiddle if(passNum < (numPasses - 1)) { localString += string("l = ((bNum << ") + num2str(lgBatchSize) + string(") + i) >> ") + num2str(lgStrideO) + string(";\n"); localString += string("k = j << ") + num2str((int)log2(R1/R2)) + string(";\n"); localString += string("ang1 = dir*(2.0f*M_PI/") + num2str(N) + string(")*l;\n"); for(t = 0; t < R1; t++) { localString += string("ang = ang1*(k + ") + num2str((t%R2)*R1 + (t/R2)) + string(");\n"); localString += string("w = (float2)(native_cos(ang), native_sin(ang));\n"); localString += string("a[") + num2str(t) + string("] = complexMul(a[") + num2str(t) + string("], w);\n"); } } // Store Data if(strideO == 1) { localString += string("lMemStore = sMem + mad24(i, ") + num2str(radix + 1) + string(", j << ") + num2str((int)log2(R1/R2)) + string(");\n"); localString += string("lMemLoad = sMem + mad24(tid >> ") + num2str((int)log2(radix)) + string(", ") + num2str(radix+1) + string(", tid & ") + num2str(radix-1) + string(");\n"); for(i = 0; i < R1/R2; i++) for(j = 0; j < R2; j++) localString += string("lMemStore[ ") + num2str(i + j*R1) + string("] = a[") + num2str(i*R2+j) + string("].x;\n"); localString += string("barrier(CLK_LOCAL_MEM_FENCE);\n"); if(threadsPerBlock >= radix) { for(i = 0; i < R1; i++) localString += string("a[") + num2str(i) + string("].x = lMemLoad[") + num2str(i*(radix+1)*(threadsPerBlock/radix)) + string("];\n"); } else { int innerIter = radix/threadsPerBlock; int outerIter = R1/innerIter; for(i = 0; i < outerIter; i++) for(j = 0; j < innerIter; j++) localString += string("a[") + num2str(i*innerIter+j) + string("].x = lMemLoad[") + num2str(j*threadsPerBlock + i*(radix+1)) + string("];\n"); } localString += string("barrier(CLK_LOCAL_MEM_FENCE);\n"); for(i = 0; i < R1/R2; i++) for(j = 0; j < R2; j++) localString += string("lMemStore[ ") + num2str(i + j*R1) + string("] = a[") + num2str(i*R2+j) + string("].y;\n"); localString += string("barrier(CLK_LOCAL_MEM_FENCE);\n"); if(threadsPerBlock >= radix) { for(i = 0; i < R1; i++) localString += string("a[") + num2str(i) + string("].y = lMemLoad[") + num2str(i*(radix+1)*(threadsPerBlock/radix)) + string("];\n"); } else { int innerIter = radix/threadsPerBlock; int outerIter = R1/innerIter; for(i = 0; i < outerIter; i++) for(j = 0; j < innerIter; j++) localString += string("a[") + num2str(i*innerIter+j) + string("].y = lMemLoad[") + num2str(j*threadsPerBlock + i*(radix+1)) + string("];\n"); } localString += string("barrier(CLK_LOCAL_MEM_FENCE);\n"); localString += string("indexOut += tid;\n"); if(dataFormat == clFFT_SplitComplexFormat) { localString += string("out_real += indexOut;\n"); localString += string("out_imag += indexOut;\n"); for(k = 0; k < R1; k++) localString += string("out_real[") + num2str(k*threadsPerBlock) + string("] = a[") + num2str(k) + string("].x;\n"); for(k = 0; k < R1; k++) localString += string("out_imag[") + num2str(k*threadsPerBlock) + string("] = a[") + num2str(k) + string("].y;\n"); } else { localString += string("out += indexOut;\n"); for(k = 0; k < R1; k++) localString += string("out[") + num2str(k*threadsPerBlock) + string("] = a[") + num2str(k) + string("];\n"); } } else { localString += string("indexOut += mad24(j, ") + num2str(numIter*strideO) + string(", i);\n"); if(dataFormat == clFFT_SplitComplexFormat) { localString += string("out_real += indexOut;\n"); localString += string("out_imag += indexOut;\n"); for(k = 0; k < R1; k++) localString += string("out_real[") + num2str(((k%R2)*R1 + (k/R2))*strideO) + string("] = a[") + num2str(k) + string("].x;\n"); for(k = 0; k < R1; k++) localString += string("out_imag[") + num2str(((k%R2)*R1 + (k/R2))*strideO) + string("] = a[") + num2str(k) + string("].y;\n"); } else { localString += string("out += indexOut;\n"); for(k = 0; k < R1; k++) localString += string("out[") + num2str(((k%R2)*R1 + (k/R2))*strideO) + string("] = a[") + num2str(k) + string("];\n"); } } insertHeader(*kernelString, kernelName, dataFormat); *kernelString += string("{\n"); if((*kInfo)->lmem_size) *kernelString += string(" __local float sMem[") + num2str((*kInfo)->lmem_size) + string("];\n"); *kernelString += localString; *kernelString += string("}\n"); N /= radix; kInfo = &(*kInfo)->next; kCount++; } } void FFT1D(cl_fft_plan *plan, cl_fft_kernel_dir dir) { unsigned int radixArray[10]; unsigned int numRadix; switch(dir) { case cl_fft_kernel_x: if(plan->n.x > plan->max_localmem_fft_size) { createGlobalFFTKernelString(plan, plan->n.x, 1, cl_fft_kernel_x, 1); } else if(plan->n.x > 1) { getRadixArray(plan->n.x, radixArray, &numRadix, 0); if(plan->n.x / radixArray[0] <= plan->max_work_item_per_workgroup) { createLocalMemfftKernelString(plan); } else { getRadixArray(plan->n.x, radixArray, &numRadix, plan->max_radix); if(plan->n.x / radixArray[0] <= plan->max_work_item_per_workgroup) createLocalMemfftKernelString(plan); else createGlobalFFTKernelString(plan, plan->n.x, 1, cl_fft_kernel_x, 1); } } break; case cl_fft_kernel_y: if(plan->n.y > 1) createGlobalFFTKernelString(plan, plan->n.y, plan->n.x, cl_fft_kernel_y, 1); break; case cl_fft_kernel_z: if(plan->n.z > 1) createGlobalFFTKernelString(plan, plan->n.z, plan->n.x*plan->n.y, cl_fft_kernel_z, 1); default: return; } } gnss-sdr-0.0.9/src/algorithms/libs/fft_setup.cc000066400000000000000000000264611305042567700215010ustar00rootroot00000000000000 // // File: fft_setup.cpp // // Version: <1.0> // // Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Inc. ("Apple") // in consideration of your agreement to the following terms, and your use, // installation, modification or redistribution of this Apple software // constitutes acceptance of these terms. If you do not agree with these // terms, please do not use, install, modify or redistribute this Apple // software. // // In consideration of your agreement to abide by the following terms, and // subject to these terms, Apple grants you a personal, non - exclusive // license, under Apple's copyrights in this original Apple software ( the // "Apple Software" ), to use, reproduce, modify and redistribute the Apple // Software, with or without modifications, in source and / or binary forms; // provided that if you redistribute the Apple Software in its entirety and // without modifications, you must retain this notice and the following text // and disclaimers in all such redistributions of the Apple Software. Neither // the name, trademarks, service marks or logos of Apple Inc. may be used to // endorse or promote products derived from the Apple Software without specific // prior written permission from Apple. Except as expressly stated in this // notice, no other rights or licenses, express or implied, are granted by // Apple herein, including but not limited to any patent rights that may be // infringed by your derivative works or by other works in which the Apple // Software may be incorporated. // // The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO // WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED // WARRANTIES OF NON - INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A // PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION // ALONE OR IN COMBINATION WITH YOUR PRODUCTS. // // IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR // CONSEQUENTIAL DAMAGES ( INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION ) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION // AND / OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER // UNDER THEORY OF CONTRACT, TORT ( INCLUDING NEGLIGENCE ), STRICT LIABILITY OR // OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Copyright ( C ) 2008 Apple Inc. All Rights Reserved. // //////////////////////////////////////////////////////////////////////////////////////////////////// #include "fft_internal.h" #include "fft_base_kernels.h" #include #include #include #include #include #include #include #include using namespace std; extern void getKernelWorkDimensions(cl_fft_plan *plan, cl_fft_kernel_info *kernelInfo, cl_int *batchSize, size_t *gWorkItems, size_t *lWorkItems); static void getBlockConfigAndKernelString(cl_fft_plan *plan) { plan->temp_buffer_needed = 0; *plan->kernel_string += baseKernels; if(plan->format == clFFT_SplitComplexFormat) *plan->kernel_string += twistKernelPlannar; else *plan->kernel_string += twistKernelInterleaved; switch(plan->dim) { case clFFT_1D: FFT1D(plan, cl_fft_kernel_x); break; case clFFT_2D: FFT1D(plan, cl_fft_kernel_x); FFT1D(plan, cl_fft_kernel_y); break; case clFFT_3D: FFT1D(plan, cl_fft_kernel_x); FFT1D(plan, cl_fft_kernel_y); FFT1D(plan, cl_fft_kernel_z); break; default: return; } plan->temp_buffer_needed = 0; cl_fft_kernel_info *kInfo = plan->kernel_info; while(kInfo) { plan->temp_buffer_needed |= !kInfo->in_place_possible; kInfo = kInfo->next; } } static void deleteKernelInfo(cl_fft_kernel_info *kInfo) { if(kInfo) { if(kInfo->kernel_name) free(kInfo->kernel_name); if(kInfo->kernel) clReleaseKernel(kInfo->kernel); free(kInfo); } } static void destroy_plan(cl_fft_plan *Plan) { cl_fft_kernel_info *kernel_info = Plan->kernel_info; while(kernel_info) { cl_fft_kernel_info *tmp = kernel_info->next; deleteKernelInfo(kernel_info); kernel_info = tmp; } Plan->kernel_info = NULL; if(Plan->kernel_string) { delete Plan->kernel_string; Plan->kernel_string = NULL; } if(Plan->twist_kernel) { clReleaseKernel(Plan->twist_kernel); Plan->twist_kernel = NULL; } if(Plan->program) { clReleaseProgram(Plan->program); Plan->program = NULL; } if(Plan->tempmemobj) { clReleaseMemObject(Plan->tempmemobj); Plan->tempmemobj = NULL; } if(Plan->tempmemobj_real) { clReleaseMemObject(Plan->tempmemobj_real); Plan->tempmemobj_real = NULL; } if(Plan->tempmemobj_imag) { clReleaseMemObject(Plan->tempmemobj_imag); Plan->tempmemobj_imag = NULL; } } static int createKernelList(cl_fft_plan *plan) { cl_program program = plan->program; cl_fft_kernel_info *kernel_info = plan->kernel_info; cl_int err; while(kernel_info) { kernel_info->kernel = clCreateKernel(program, kernel_info->kernel_name, &err); if(!kernel_info->kernel || err != CL_SUCCESS) return err; kernel_info = kernel_info->next; } if(plan->format == clFFT_SplitComplexFormat) plan->twist_kernel = clCreateKernel(program, "clFFT_1DTwistSplit", &err); else plan->twist_kernel = clCreateKernel(program, "clFFT_1DTwistInterleaved", &err); if(!plan->twist_kernel || err) return err; return CL_SUCCESS; } int getMaxKernelWorkGroupSize(cl_fft_plan *plan, unsigned int *max_wg_size, unsigned int num_devices, cl_device_id *devices) { int reg_needed = 0; *max_wg_size = std::numeric_limits::max(); int err; unsigned wg_size; unsigned int i; for(i = 0; i < num_devices; i++) { cl_fft_kernel_info *kInfo = plan->kernel_info; while(kInfo) { err = clGetKernelWorkGroupInfo(kInfo->kernel, devices[i], CL_KERNEL_WORK_GROUP_SIZE, sizeof(size_t), &wg_size, NULL); if(err != CL_SUCCESS) return -1; if(wg_size < kInfo->num_workitems_per_workgroup) reg_needed |= 1; if(*max_wg_size > wg_size) *max_wg_size = wg_size; kInfo = kInfo->next; } } return reg_needed; } #define ERR_MACRO(err) { \ if( err != CL_SUCCESS) \ { \ if(error_code) \ *error_code = err; \ clFFT_DestroyPlan((clFFT_Plan) plan); \ return (clFFT_Plan) NULL; \ } \ } clFFT_Plan clFFT_CreatePlan(cl_context context, clFFT_Dim3 n, clFFT_Dimension dim, clFFT_DataFormat dataFormat, cl_int *error_code ) { int i; cl_int err; int isPow2 = 1; cl_fft_plan *plan = NULL; ostringstream kString; int num_devices; int gpu_found = 0; cl_device_id devices[16]; size_t ret_size; cl_device_type device_type; if(!context) ERR_MACRO(CL_INVALID_VALUE); isPow2 |= n.x && !( (n.x - 1) & n.x ); isPow2 |= n.y && !( (n.y - 1) & n.y ); isPow2 |= n.z && !( (n.z - 1) & n.z ); if(!isPow2) ERR_MACRO(CL_INVALID_VALUE); if( (dim == clFFT_1D && (n.y != 1 || n.z != 1)) || (dim == clFFT_2D && n.z != 1) ) ERR_MACRO(CL_INVALID_VALUE); plan = (cl_fft_plan *) malloc(sizeof(cl_fft_plan)); if(!plan) ERR_MACRO(CL_OUT_OF_RESOURCES); plan->context = context; clRetainContext(context); plan->n = n; plan->dim = dim; plan->format = dataFormat; plan->kernel_info = 0; plan->num_kernels = 0; plan->twist_kernel = 0; plan->program = 0; plan->temp_buffer_needed = 0; plan->last_batch_size = 0; plan->tempmemobj = 0; plan->tempmemobj_real = 0; plan->tempmemobj_imag = 0; plan->max_localmem_fft_size = 2048; plan->max_work_item_per_workgroup = 256; plan->max_radix = 16; plan->min_mem_coalesce_width = 16; plan->num_local_mem_banks = 16; patch_kernel_source: plan->kernel_string = new string(""); if(!plan->kernel_string) ERR_MACRO(CL_OUT_OF_RESOURCES); getBlockConfigAndKernelString(plan); const char *source_str = plan->kernel_string->c_str(); plan->program = clCreateProgramWithSource(context, 1, (const char**) &source_str, NULL, &err); ERR_MACRO(err); err = clGetContextInfo(context, CL_CONTEXT_DEVICES, sizeof(devices), devices, &ret_size); ERR_MACRO(err); num_devices = (int)(ret_size / sizeof(cl_device_id)); for(i = 0; i < num_devices; i++) { err = clGetDeviceInfo(devices[i], CL_DEVICE_TYPE, sizeof(device_type), &device_type, NULL); ERR_MACRO(err); if(device_type == CL_DEVICE_TYPE_GPU) { gpu_found = 1; err = clBuildProgram(plan->program, 1, &devices[i], "-cl-mad-enable", NULL, NULL); if (err != CL_SUCCESS) { char *build_log; char devicename[200]; size_t log_size; err = clGetProgramBuildInfo(plan->program, devices[i], CL_PROGRAM_BUILD_LOG, 0, NULL, &log_size); ERR_MACRO(err); build_log = (char *) malloc(log_size + 1); err = clGetProgramBuildInfo(plan->program, devices[i], CL_PROGRAM_BUILD_LOG, log_size, build_log, NULL); ERR_MACRO(err); err = clGetDeviceInfo(devices[i], CL_DEVICE_NAME, sizeof(devicename), devicename, NULL); ERR_MACRO(err); fprintf(stdout, "FFT program build log on device %s\n", devicename); fprintf(stdout, "%s\n", build_log); free(build_log); ERR_MACRO(err); } } } if(!gpu_found) ERR_MACRO(CL_INVALID_CONTEXT); err = createKernelList(plan); ERR_MACRO(err); // we created program and kernels based on "some max work group size (default 256)" ... this work group size // may be larger than what kernel may execute with ... if thats the case we need to regenerate the kernel source // setting this as limit i.e max group size and rebuild. unsigned int max_kernel_wg_size; int patching_req = getMaxKernelWorkGroupSize(plan, &max_kernel_wg_size, num_devices, devices); if(patching_req == -1) { ERR_MACRO(err); } if(patching_req) { destroy_plan(plan); plan->max_work_item_per_workgroup = max_kernel_wg_size; goto patch_kernel_source; } cl_fft_kernel_info *kInfo = plan->kernel_info; while(kInfo) { plan->num_kernels++; kInfo = kInfo->next; } if(error_code) *error_code = CL_SUCCESS; return (clFFT_Plan) plan; } void clFFT_DestroyPlan(clFFT_Plan plan) { cl_fft_plan *Plan = (cl_fft_plan *) plan; if(Plan) { destroy_plan(Plan); clReleaseContext(Plan->context); free(Plan); } } void clFFT_DumpPlan( clFFT_Plan Plan, FILE *file) { size_t gDim, lDim; FILE *out; if(!file) out = stdout; else out = file; cl_fft_plan *plan = (cl_fft_plan *) Plan; cl_fft_kernel_info *kInfo = plan->kernel_info; while(kInfo) { cl_int s = 1; getKernelWorkDimensions(plan, kInfo, &s, &gDim, &lDim); fprintf(out, "Run kernel %s with global dim = {%zd*BatchSize}, local dim={%zd}\n", kInfo->kernel_name, gDim, lDim); kInfo = kInfo->next; } fprintf(out, "%s\n", plan->kernel_string->c_str()); } gnss-sdr-0.0.9/src/algorithms/libs/galileo_e1_signal_processing.cc000066400000000000000000000206211305042567700252640ustar00rootroot00000000000000/*! * \file galileo_e1_signal_processing.cc * \brief This library implements various functions for Galileo E1 signals * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com * * Detailed description of the file here if needed. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_e1_signal_processing.h" #include #include "Galileo_E1.h" #include "gnss_signal_processing.h" void galileo_e1_code_gen_int(int* _dest, char _Signal[3], signed int _prn) { std::string _galileo_signal = _Signal; signed int prn = _prn - 1; int index = 0; /* A simple error check */ if ((_prn < 1) || (_prn > 50)) { return; } if (_galileo_signal.rfind("1B") != std::string::npos && _galileo_signal.length() >= 2) { for (size_t i = 0; i < Galileo_E1_B_PRIMARY_CODE[prn].length(); i++) { hex_to_binary_converter(&_dest[index], Galileo_E1_B_PRIMARY_CODE[prn].at(i)); index = index + 4; } } else if (_galileo_signal.rfind("1C") != std::string::npos && _galileo_signal.length() >= 2) { for (size_t i = 0; i < Galileo_E1_C_PRIMARY_CODE[prn].length(); i++) { hex_to_binary_converter(&_dest[index], Galileo_E1_C_PRIMARY_CODE[prn].at(i)); index = index + 4; } } else { return; } } void galileo_e1_sinboc_11_gen(std::complex* _dest, int* _prn, unsigned int _length_out) { const unsigned int _length_in = Galileo_E1_B_CODE_LENGTH_CHIPS; unsigned int _period = static_cast( _length_out / _length_in ); for (unsigned int i = 0; i < _length_in; i++) { for (unsigned int j = 0; j < (_period / 2); j++) { _dest[i * _period + j] = std::complex(static_cast(_prn[i]), 0.0); } for (unsigned int j = (_period / 2); j < _period; j++) { _dest[i * _period + j] = std::complex(static_cast(- _prn[i]), 0.0); } } } void galileo_e1_sinboc_61_gen(std::complex* _dest, int* _prn, unsigned int _length_out) { const unsigned int _length_in = Galileo_E1_B_CODE_LENGTH_CHIPS; unsigned int _period = static_cast(_length_out / _length_in); for (unsigned int i = 0; i < _length_in; i++) { for (unsigned int j = 0; j < _period; j += 2) { _dest[i * _period + j] = std::complex(static_cast(_prn[i]), 0.0); } for (unsigned int j = 1; j < _period; j += 2) { _dest[i * _period + j] = std::complex(static_cast(- _prn[i]), 0.0); } } } void galileo_e1_gen(std::complex* _dest, int* _prn, char _Signal[3]) { std::string _galileo_signal = _Signal; const unsigned int _codeLength = 12 * Galileo_E1_B_CODE_LENGTH_CHIPS; const float alpha = sqrt(10.0 / 11.0); const float beta = sqrt(1.0 / 11.0); std::complex sinboc_11[12 * 4092]; // _codeLength not accepted by Clang std::complex sinboc_61[12 * 4092]; galileo_e1_sinboc_11_gen(sinboc_11, _prn, _codeLength); //generate sinboc(1,1) 12 samples per chip galileo_e1_sinboc_61_gen(sinboc_61, _prn, _codeLength); //generate sinboc(6,1) 12 samples per chip if (_galileo_signal.rfind("1B") != std::string::npos && _galileo_signal.length() >= 2) { for (unsigned int i = 0; i < _codeLength; i++) { _dest[i] = alpha * sinboc_11[i] + beta * sinboc_61[i]; } } else if (_galileo_signal.rfind("1C") != std::string::npos && _galileo_signal.length() >= 2) { for (unsigned int i = 0; i < _codeLength; i++) { _dest[i] = alpha * sinboc_11[i] - beta * sinboc_61[i]; } } else return; } void galileo_e1_code_gen_complex_sampled(std::complex* _dest, char _Signal[3], bool _cboc, unsigned int _prn, signed int _fs, unsigned int _chip_shift, bool _secondary_flag) { // This function is based on the GNU software GPS for MATLAB in Kay Borre's book std::string _galileo_signal = _Signal; unsigned int _samplesPerCode; const int _codeFreqBasis = Galileo_E1_CODE_CHIP_RATE_HZ; //Hz unsigned int _codeLength = Galileo_E1_B_CODE_LENGTH_CHIPS; int primary_code_E1_chips[static_cast(Galileo_E1_B_CODE_LENGTH_CHIPS)]; _samplesPerCode = static_cast( static_cast(_fs) / (static_cast(_codeFreqBasis ) / static_cast(_codeLength))); const int _samplesPerChip = (_cboc == true) ? 12 : 2; const unsigned int delay = ((static_cast(Galileo_E1_B_CODE_LENGTH_CHIPS) - _chip_shift) % static_cast(Galileo_E1_B_CODE_LENGTH_CHIPS)) * _samplesPerCode / Galileo_E1_B_CODE_LENGTH_CHIPS; galileo_e1_code_gen_int(primary_code_E1_chips, _Signal, _prn); //generate Galileo E1 code, 1 sample per chip std::complex* _signal_E1; _codeLength = _samplesPerChip * Galileo_E1_B_CODE_LENGTH_CHIPS; _signal_E1 = new std::complex[_codeLength]; if (_cboc == true) { galileo_e1_gen(_signal_E1, primary_code_E1_chips, _Signal); //generate cboc 12 samples per chip } else { galileo_e1_sinboc_11_gen(_signal_E1, primary_code_E1_chips, _codeLength); //generate sinboc(1,1) 2 samples per chip } if (_fs != _samplesPerChip * _codeFreqBasis) { std::complex* _resampled_signal = new std::complex[_samplesPerCode]; resampler(_signal_E1, _resampled_signal, _samplesPerChip * _codeFreqBasis, _fs, _codeLength, _samplesPerCode); //resamples code to fs delete[] _signal_E1; _signal_E1 = _resampled_signal; } if (_galileo_signal.rfind("1C") != std::string::npos && _galileo_signal.length() >= 2 && _secondary_flag) { std::complex* _signal_E1C_secondary = new std::complex [static_cast(Galileo_E1_C_SECONDARY_CODE_LENGTH) * _samplesPerCode]; for (unsigned int i = 0; i < static_cast(Galileo_E1_C_SECONDARY_CODE_LENGTH); i++) { for (unsigned k = 0; k < _samplesPerCode; k++) { _signal_E1C_secondary[i*_samplesPerCode + k] = _signal_E1[k] * (Galileo_E1_C_SECONDARY_CODE.at(i) == '0' ? std::complex(1,0) : std::complex(-1,0)); } } _samplesPerCode *= static_cast(Galileo_E1_C_SECONDARY_CODE_LENGTH); delete[] _signal_E1; _signal_E1 = _signal_E1C_secondary; } for (unsigned int i = 0; i < _samplesPerCode; i++) { _dest[(i + delay) % _samplesPerCode] = _signal_E1[i]; } delete[] _signal_E1; } void galileo_e1_code_gen_complex_sampled(std::complex* _dest, char _Signal[3], bool _cboc, unsigned int _prn, signed int _fs, unsigned int _chip_shift) { galileo_e1_code_gen_complex_sampled(_dest, _Signal, _cboc, _prn, _fs, _chip_shift, false); } gnss-sdr-0.0.9/src/algorithms/libs/galileo_e1_signal_processing.h000066400000000000000000000054251305042567700251330ustar00rootroot00000000000000/*! * \file galileo_e1_signal_processing.h * \brief This library implements various functions for Galileo E1 signals * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_E1_SIGNAL_PROCESSING_H_ #define GNSS_SDR_GALILEO_E1_SIGNAL_PROCESSING_H_ #include /*! * \brief This function generates Galileo E1 code (one sample per chip). * */ void galileo_e1_code_gen_int(int* _dest, char _Signal[3], signed int _prn); /*! * \brief This function generates Galileo E1 sinboc(1,1) code (minimum 2 samples per chip), * the _codeLength variable must be a multiple of 2*4092. * */ void galileo_e1_sinboc_11_gen(std::complex* _dest, int* _prn, unsigned int _codeLength); /*! * \brief This function generates Galileo E1 sinboc(6,1) code (minimum 12 samples per chip), * the _codeLength variable must be a multiple of 12*4092. * */ void galileo_e1_sinboc_61_gen(std::complex* _dest, int* _prn, unsigned int _codeLength); /*! * \brief This function generates Galileo E1 cboc code (12 samples per chip). * */ void galileo_e1_cboc_gen(std::complex* _dest, int* _prn, char _Signal[3]); /*! * \brief This function generates Galileo E1 code (can select E1B or E1C, cboc or sinboc * and the sample frequency _fs). * */ void galileo_e1_code_gen_complex_sampled(std::complex* _dest, char _Signal[3], bool _cboc, unsigned int _prn, signed int _fs, unsigned int _chip_shift, bool _secondary_flag); /*! * \brief galileo_e1_code_gen_complex_sampled without _secondary_flag for backward compatibility. */ void galileo_e1_code_gen_complex_sampled(std::complex* _dest, char _Signal[3], bool _cboc, unsigned int _prn, signed int _fs, unsigned int _chip_shift); #endif /* GNSS_SDR_GALILEO_E1_SIGNAL_PROCESSING_H_ */ gnss-sdr-0.0.9/src/algorithms/libs/galileo_e5_signal_processing.cc000066400000000000000000000140011305042567700252630ustar00rootroot00000000000000/*! * \file galileo_e5_signal_processing.cc * \brief This library implements various functions for Galileo E5 signals such * as replica code generation * \author Marc Sales, 2014. marcsales92(at)gmail.com * * Detailed description of the file here if needed. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_e5_signal_processing.h" #include #include "Galileo_E5a.h" #include "gnss_signal_processing.h" void galileo_e5_a_code_gen_complex_primary(std::complex* _dest, signed int _prn, char _Signal[3]) { unsigned int prn = _prn - 1; unsigned int index = 0; int a[4]; if ((_prn < 1) || (_prn > 50)) { return; } if (_Signal[0] == '5' && _Signal[1] == 'Q') { for (size_t i = 0; i < Galileo_E5a_Q_PRIMARY_CODE[prn].length() - 1; i++) { hex_to_binary_converter(a, Galileo_E5a_Q_PRIMARY_CODE[prn].at(i)); _dest[index] = std::complex(0.0, float(a[0])); _dest[index + 1] = std::complex(0.0, float(a[1])); _dest[index + 2] = std::complex(0.0, float(a[2])); _dest[index + 3] = std::complex(0.0, float(a[3])); index = index + 4; } // last 2 bits are filled up zeros hex_to_binary_converter(a, Galileo_E5a_Q_PRIMARY_CODE[prn].at(Galileo_E5a_Q_PRIMARY_CODE[prn].length() - 1)); _dest[index] = std::complex(float(0.0), a[0]); _dest[index + 1] = std::complex(float(0.0), a[1]); } else if (_Signal[0] == '5' && _Signal[1] == 'I') { for (size_t i = 0; i < Galileo_E5a_I_PRIMARY_CODE[prn].length() - 1; i++) { hex_to_binary_converter(a, Galileo_E5a_I_PRIMARY_CODE[prn].at(i)); _dest[index] = std::complex(float(a[0]), 0.0); _dest[index + 1] = std::complex(float(a[1]), 0.0); _dest[index + 2] = std::complex(float(a[2]), 0.0); _dest[index + 3] = std::complex(float(a[3]), 0.0); index = index + 4; } // last 2 bits are filled up zeros hex_to_binary_converter(a, Galileo_E5a_I_PRIMARY_CODE[prn].at(Galileo_E5a_I_PRIMARY_CODE[prn].length() - 1)); _dest[index] = std::complex(float(a[0]), 0.0); _dest[index + 1] = std::complex(float(a[1]), 0.0); } else if (_Signal[0] == '5' && _Signal[1] == 'X') { int b[4]; for (size_t i = 0; i < Galileo_E5a_I_PRIMARY_CODE[prn].length() - 1; i++) { hex_to_binary_converter(a, Galileo_E5a_I_PRIMARY_CODE[prn].at(i)); hex_to_binary_converter(b, Galileo_E5a_Q_PRIMARY_CODE[prn].at(i)); _dest[index] = std::complex(float(a[0]),float(b[0])); _dest[index + 1] = std::complex(float(a[1]),float(b[1])); _dest[index + 2] = std::complex(float(a[2]),float(b[2])); _dest[index + 3] = std::complex(float(a[3]),float(b[3])); index = index + 4; } // last 2 bits are filled up zeros hex_to_binary_converter(a, Galileo_E5a_I_PRIMARY_CODE[prn].at(Galileo_E5a_I_PRIMARY_CODE[prn].length() - 1)); hex_to_binary_converter(b, Galileo_E5a_Q_PRIMARY_CODE[prn].at(Galileo_E5a_Q_PRIMARY_CODE[prn].length() - 1)); _dest[index] = std::complex(float(a[0]), float(b[0])); _dest[index + 1] = std::complex(float(a[1]), float(b[1])); } } void galileo_e5_a_code_gen_complex_sampled(std::complex* _dest, char _Signal[3], unsigned int _prn, signed int _fs, unsigned int _chip_shift) { unsigned int _samplesPerCode; unsigned int delay; const unsigned int _codeLength = Galileo_E5a_CODE_LENGTH_CHIPS; const int _codeFreqBasis = Galileo_E5a_CODE_CHIP_RATE_HZ; std::complex* _code = new std::complex[_codeLength](); galileo_e5_a_code_gen_complex_primary(_code , _prn , _Signal); _samplesPerCode = static_cast(static_cast(_fs) / ( static_cast(_codeFreqBasis) / static_cast(_codeLength))); delay = ((_codeLength - _chip_shift) % _codeLength) * _samplesPerCode / _codeLength; if (_fs != _codeFreqBasis) { std::complex* _resampled_signal; if (posix_memalign((void**)&_resampled_signal, 16, _samplesPerCode * sizeof(gr_complex)) == 0){}; resampler(_code, _resampled_signal, _codeFreqBasis, _fs, _codeLength, _samplesPerCode); //resamples code to fs delete[] _code; _code = _resampled_signal; } for (unsigned int i = 0; i < _samplesPerCode; i++) { _dest[(i + delay) % _samplesPerCode] = _code[i]; } if (_fs != _codeFreqBasis) { free(_code); } else { delete[] _code; } } gnss-sdr-0.0.9/src/algorithms/libs/galileo_e5_signal_processing.h000066400000000000000000000041731305042567700251360ustar00rootroot00000000000000/*! * \file galileo_e5_signal_processing.cc * \brief This library implements various functions for Galileo E5 signals such * as replica code generation * \author Marc Sales, 2014. marcsales92(at)gmail.com * * Detailed description of the file here if needed. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_E5_SIGNAL_PROCESSING_H_ #define GNSS_SDR_GALILEO_E5_SIGNAL_PROCESSING_H_ #include /*! * \brief Generates Galileo E5a code at 1 sample/chip * bool _pilot generates E5aQ code if true and E5aI (data signal) if false. */ void galileo_e5_a_code_gen_complex_primary(std::complex* _dest, signed int _prn, char _Signal[3]); void galileo_e5_a_code_gen_tiered(std::complex* _dest,std::complex* _primary ,unsigned int _prn, char _Signal[3]); /*! * \brief Generates Galileo E5a complex code, shifted to the desired chip and sampled at a frequency fs * bool _pilot generates E5aQ code if true and E5aI (data signal) if false. */ void galileo_e5_a_code_gen_complex_sampled(std::complex* _dest, char _Signal[3], unsigned int _prn, signed int _fs, unsigned int _chip_shift); #endif /* GNSS_SDR_GALILEO_E5_SIGNAL_PROCESSING_H_ */ gnss-sdr-0.0.9/src/algorithms/libs/gnss_sdr_valve.cc000066400000000000000000000051551305042567700225160ustar00rootroot00000000000000/*! * \file gnss_sdr_valve.cc * \brief Implementation of a GNU Radio block that sends a STOP message to the * control queue right after a specific number of samples have passed through it. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gnss_sdr_valve.h" #include // for min #include #include "control_message_factory.h" gnss_sdr_valve::gnss_sdr_valve (size_t sizeof_stream_item, unsigned long long nitems, gr::msg_queue::sptr queue) : gr::sync_block("valve", gr::io_signature::make(1, 1, sizeof_stream_item), gr::io_signature::make(1, 1, sizeof_stream_item) ), d_nitems(nitems), d_ncopied_items(0), d_queue(queue) {} boost::shared_ptr gnss_sdr_make_valve (size_t sizeof_stream_item, unsigned long long nitems, gr::msg_queue::sptr queue) { boost::shared_ptr valve_(new gnss_sdr_valve(sizeof_stream_item, nitems, queue)); return valve_; } int gnss_sdr_valve::work (int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { if (d_ncopied_items >= d_nitems) { ControlMessageFactory* cmf = new ControlMessageFactory(); d_queue->handle(cmf->GetQueueMessage(200,0)); delete cmf; return -1; // Done! } unsigned long long n = std::min(d_nitems - d_ncopied_items, (long long unsigned int)noutput_items); if (n == 0) return 0; memcpy (output_items[0], input_items[0], n * input_signature()->sizeof_stream_item(0)); d_ncopied_items += n; return n; } gnss-sdr-0.0.9/src/algorithms/libs/gnss_sdr_valve.h000066400000000000000000000045421305042567700223570ustar00rootroot00000000000000/*! * \file gnss_sdr_valve.h * \brief Interface of a GNU Radio block that sends a STOP message to the * control queue right after a specific number of samples have passed through it. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GNSS_SDR_VALVE_H_ #define GNSS_SDR_GNSS_SDR_VALVE_H_ #include #include #include #include boost::shared_ptr gnss_sdr_make_valve (size_t sizeof_stream_item, unsigned long long nitems, gr::msg_queue::sptr queue); /*! * \brief Implementation of a GNU Radio block that sends a STOP message to the * control queue right after a specific number of samples have passed through it. */ class gnss_sdr_valve : public gr::sync_block { friend boost::shared_ptr gnss_sdr_make_valve(size_t sizeof_stream_item, unsigned long long nitems, gr::msg_queue::sptr queue); gnss_sdr_valve (size_t sizeof_stream_item, unsigned long long nitems, gr::msg_queue::sptr queue); unsigned long long d_nitems; unsigned long long d_ncopied_items; gr::msg_queue::sptr d_queue; public: int work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; #endif /*GNSS_SDR_GNSS_SDR_VALVE_H_*/ gnss-sdr-0.0.9/src/algorithms/libs/gnss_signal_processing.cc000066400000000000000000000117201305042567700242350ustar00rootroot00000000000000/*! * \file gnss_signal_processing.cc * \brief This library gathers a few functions used by the algorithms of gnss-sdr, * regardless of system used * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com * * Detailed description of the file here if needed. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gnss_signal_processing.h" #include #include "GPS_L1_CA.h" auto auxCeil2 = [](float x){ return static_cast(static_cast((x)+1)); }; void complex_exp_gen(std::complex* _dest, double _f, double _fs, unsigned int _samps) { gr::fxpt_nco d_nco; d_nco.set_freq((GPS_TWO_PI * _f) / _fs); d_nco.sincos(_dest, _samps, 1); } void complex_exp_gen_conj(std::complex* _dest, double _f, double _fs, unsigned int _samps) { gr::fxpt_nco d_nco; d_nco.set_freq(-(GPS_TWO_PI * _f) / _fs); d_nco.sincos(_dest, _samps, 1); } void hex_to_binary_converter(int * _dest, char _from) { switch(_from) { case '0': *(_dest) = 1; *(_dest+1) = 1; *(_dest+2) = 1; *(_dest+3) = 1; break; case '1': *(_dest) = 1; *(_dest+1) = 1; *(_dest+2) = 1; *(_dest+3) = -1; break; case '2': *(_dest) = 1; *(_dest+1) = 1; *(_dest+2) = -1; *(_dest+3) = 1; break; case '3': *(_dest) = 1; *(_dest+1) = 1; *(_dest+2) = -1; *(_dest+3) = -1; break; case '4': *(_dest) = 1; *(_dest+1) = -1; *(_dest+2) = 1; *(_dest+3) = 1; break; case '5': *(_dest) = 1; *(_dest+1) = -1; *(_dest+2) = 1; *(_dest+3) = -1; break; case '6': *(_dest) = 1; *(_dest+1) = -1; *(_dest+2) = -1; *(_dest+3) = 1; break; case '7': *(_dest) = 1; *(_dest+1) = -1; *(_dest+2) = -1; *(_dest+3) = -1; break; case '8': *(_dest) = -1; *(_dest+1) = 1; *(_dest+2) = 1; *(_dest+3) = 1; break; case '9': *(_dest) = -1; *(_dest+1) = 1; *(_dest+2) = 1; *(_dest+3) = -1; break; case 'A': *(_dest) = -1; *(_dest+1) = 1; *(_dest+2) = -1; *(_dest+3) = 1; break; case 'B': *(_dest) = -1; *(_dest+1) = 1; *(_dest+2) = -1; *(_dest+3) = -1; break; case 'C': *(_dest) = -1; *(_dest+1) = -1; *(_dest+2) = 1; *(_dest+3) = 1; break; case 'D': *(_dest) = -1; *(_dest+1) = -1; *(_dest+2) = 1; *(_dest+3) = -1; break; case 'E': *(_dest) = -1; *(_dest+1) = -1; *(_dest+2) = -1; *(_dest+3) = 1; break; case 'F': *(_dest) = -1; *(_dest+1) = -1; *(_dest+2) = -1; *(_dest+3) = -1; break; } } void resampler(std::complex* _from, std::complex* _dest, float _fs_in, float _fs_out, unsigned int _length_in, unsigned int _length_out) { unsigned int _codeValueIndex; float aux; //--- Find time constants -------------------------------------------------- const float _t_in = 1 / _fs_in; // Incoming sampling period in sec const float _t_out = 1 / _fs_out; // Out sampling period in sec for (unsigned int i = 0; i < _length_out - 1; i++) { //=== Digitizing ======================================================= //--- compute index array to read sampled values ------------------------- //_codeValueIndex = ceil((_t_out * ((float)i + 1)) / _t_in) - 1; aux = (_t_out * (i + 1)) / _t_in; _codeValueIndex = auxCeil2(aux) - 1; //if repeat the chip -> upsample by nearest neighborhood interpolation _dest[i] = _from[_codeValueIndex]; } //--- Correct the last index (due to number rounding issues) ----------- _dest[_length_out - 1] = _from[_length_in - 1]; } gnss-sdr-0.0.9/src/algorithms/libs/gnss_signal_processing.h000066400000000000000000000043171305042567700241030ustar00rootroot00000000000000/*! * \file gnss_signal_processing.h * \brief This library gathers a few functions used by the algorithms of gnss-sdr, * regardless of system used * * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com * * Detailed description of the file here if needed. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GNSS_SIGNAL_PROCESSING_H_ #define GNSS_SDR_GNSS_SIGNAL_PROCESSING_H_ #include /*! * \brief This function generates a complex exponential in _dest. * */ void complex_exp_gen(std::complex* _dest, double _f, double _fs, unsigned int _samps); /*! * \brief This function generates a conjugate complex exponential in _dest. * */ void complex_exp_gen_conj(std::complex* _dest, double _f, double _fs, unsigned int _samps); /*! * \brief This function makes a conversion from hex (the input is a char) * to binary (the output are 4 ints with +1 or -1 values). * */ void hex_to_binary_converter(int * _dest, char _from); /*! * \brief This function resamples a sequence of complex values. * */ void resampler(std::complex* _from, std::complex* _dest, float _fs_in, float _fs_out, unsigned int _length_in, unsigned int _length_out); #endif /* GNSS_SDR_GNSS_SIGNAL_PROCESSING_H_ */ gnss-sdr-0.0.9/src/algorithms/libs/gps_l2c_signal.cc000066400000000000000000000100751305042567700223620ustar00rootroot00000000000000/*! * \file gps_l2c_signal.cc * \brief This class implements signal generators for the GPS L2C signals * \author Javier Arribas, 2015. jarribas(at)cttc.es * * Detailed description of the file here if needed. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include "GPS_L2C.h" int32_t gps_l2c_m_shift(int32_t x) { return static_cast((x >> 1)^((x & 1) * 0445112474)); } void gps_l2c_m_code(int32_t * _dest, unsigned int _prn) { int32_t x; x = GPS_L2C_M_INIT_REG[ _prn - 1]; for (int n = 0; n < GPS_L2_M_CODE_LENGTH_CHIPS; n++) { _dest[n] = (int8_t)(x&1); x = gps_l2c_m_shift(x); } } void gps_l2c_m_code_gen_complex(std::complex* _dest, unsigned int _prn) { int32_t* _code = new int32_t[GPS_L2_M_CODE_LENGTH_CHIPS]; if (_prn > 0 and _prn < 51) { gps_l2c_m_code(_code, _prn); } for (signed int i = 0; i < GPS_L2_M_CODE_LENGTH_CHIPS; i++) { _dest[i] = std::complex(1.0 - 2.0 * _code[i], 0.0); } delete[] _code; } /* * Generates complex GPS L2C M code for the desired SV ID and sampled to specific sampling frequency */ void gps_l2c_m_code_gen_complex_sampled(std::complex* _dest, unsigned int _prn, signed int _fs) { int32_t* _code = new int32_t[GPS_L2_M_CODE_LENGTH_CHIPS]; if (_prn > 0 and _prn < 51) { gps_l2c_m_code(_code, _prn); } signed int _samplesPerCode, _codeValueIndex; float _ts; float _tc; const signed int _codeLength = GPS_L2_M_CODE_LENGTH_CHIPS; //--- Find number of samples per spreading code ---------------------------- _samplesPerCode = static_cast(static_cast(_fs) / (static_cast(GPS_L2_M_CODE_RATE_HZ) / static_cast(_codeLength))); //--- Find time constants -------------------------------------------------- _ts = 1.0 / static_cast(_fs); // Sampling period in sec _tc = 1.0 / static_cast(GPS_L2_M_CODE_RATE_HZ); // C/A chip period in sec //float aux; for (signed int i = 0; i < _samplesPerCode; i++) { //=== Digitizing ======================================================= //--- Make index array to read L2C code values ------------------------- //TODO: Check this formula! Seems to start with an extra sample _codeValueIndex = ceil((_ts * ((float)i + 1)) / _tc) - 1; //aux = (_ts * (i + 1)) / _tc; //_codeValueIndex = static_cast(static_cast(aux)) - 1; //--- Make the digitized version of the L2C code ----------------------- if (i == _samplesPerCode - 1) { //--- Correct the last index (due to number rounding issues) ----------- _dest[i] = std::complex(1.0 - 2.0 * _code[_codeLength - 1], 0); } else { _dest[i] = std::complex(1.0 - 2.0 * _code[_codeValueIndex], 0); //repeat the chip -> upsample } } delete[] _code; } gnss-sdr-0.0.9/src/algorithms/libs/gps_l2c_signal.h000066400000000000000000000032311305042567700222200ustar00rootroot00000000000000/*! * \file gps_l2c_signal.h * \brief This class implements signal generators for the GPS L2C signals * \author Javier Arribas, 2015. jarribas(at)cttc.es * * Detailed description of the file here if needed. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GPS_L2C_SIGNAL_H_ #define GNSS_GPS_L2C_SIGNAL_H_ #include //!Generates complex GPS L2C M code for the desired SV ID void gps_l2c_m_code_gen_complex(std::complex* _dest, unsigned int _prn); //! Generates complex GPS L2C M code for the desired SV ID, and sampled to specific sampling frequency void gps_l2c_m_code_gen_complex_sampled(std::complex* _dest, unsigned int _prn, signed int _fs); #endif /* GNSS_GPS_L2C_SIGNAL_H_ */ gnss-sdr-0.0.9/src/algorithms/libs/gps_sdr_signal_processing.cc000066400000000000000000000140311305042567700247220ustar00rootroot00000000000000/*! * \file gps_sdr_signal_processing.cc * \brief This class implements various functions for GPS L1 CA signals * \author Javier Arribas, 2011. jarribas(at)cttc.es * * Detailed description of the file here if needed. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_sdr_signal_processing.h" auto auxCeil = [](float x){ return static_cast(static_cast((x)+1)); }; void gps_l1_ca_code_gen_complex(std::complex* _dest, signed int _prn, unsigned int _chip_shift) { const unsigned int _code_length = 1023; bool G1[_code_length]; bool G2[_code_length]; bool G1_register[10], G2_register[10]; bool feedback1, feedback2; bool aux; unsigned int lcv, lcv2; unsigned int delay; signed int prn_idx; /* G2 Delays as defined in GPS-ISD-200D */ const signed int delays[51] = {5 /*PRN1*/, 6, 7, 8, 17, 18, 139, 140, 141, 251, 252, 254 ,255, 256, 257, 258, 469, 470, 471, 472, 473, 474, 509, 512, 513, 514, 515, 516, 859, 860, 861, 862 /*PRN32*/, 145 /*PRN120*/, 175, 52, 21, 237, 235, 886, 657, 634, 762, 355, 1012, 176, 603, 130, 359, 595, 68, 386 /*PRN138*/}; // compute delay array index for given PRN number if(120 <= _prn && _prn <= 138) { prn_idx = _prn - 88; // SBAS PRNs are at array indices 31 to 50 (offset: -120+33-1 =-88) } else { prn_idx = _prn - 1; } /* A simple error check */ if((prn_idx < 0) || (prn_idx > 51)) return; for(lcv = 0; lcv < 10; lcv++) { G1_register[lcv] = 1; G2_register[lcv] = 1; } /* Generate G1 & G2 Register */ for(lcv = 0; lcv < _code_length; lcv++) { G1[lcv] = G1_register[0]; G2[lcv] = G2_register[0]; feedback1 = G1_register[7]^G1_register[0]; feedback2 = (G2_register[8] + G2_register[7] + G2_register[4] + G2_register[2] + G2_register[1] + G2_register[0]) & 0x1; for(lcv2 = 0; lcv2 < 9; lcv2++) { G1_register[lcv2] = G1_register[lcv2 + 1]; G2_register[lcv2] = G2_register[lcv2 + 1]; } G1_register[9] = feedback1; G2_register[9] = feedback2; } /* Set the delay */ delay = _code_length - delays[prn_idx]; delay += _chip_shift; delay %= _code_length; /* Generate PRN from G1 and G2 Registers */ for(lcv = 0; lcv < _code_length; lcv++) { aux = G1[(lcv + _chip_shift) % _code_length]^G2[delay]; if(aux == true) { _dest[lcv] = std::complex(1, 0); } else { _dest[lcv] = std::complex(-1, 0); } delay++; delay %= _code_length; } } /* * Generates complex GPS L1 C/A code for the desired SV ID and sampled to specific sampling frequency */ void gps_l1_ca_code_gen_complex_sampled(std::complex* _dest, unsigned int _prn, signed int _fs, unsigned int _chip_shift) { // This function is based on the GNU software GPS for MATLAB in the Kay Borre book std::complex _code[1023]; signed int _samplesPerCode, _codeValueIndex; float _ts; float _tc; float aux; const signed int _codeFreqBasis = 1023000; //Hz const signed int _codeLength = 1023; //--- Find number of samples per spreading code ---------------------------- _samplesPerCode = static_cast(static_cast(_fs) / static_cast(_codeFreqBasis / _codeLength)); //--- Find time constants -------------------------------------------------- _ts = 1.0 / static_cast(_fs); // Sampling period in sec _tc = 1.0 / static_cast(_codeFreqBasis); // C/A chip period in sec gps_l1_ca_code_gen_complex(_code, _prn, _chip_shift); //generate C/A code 1 sample per chip for (signed int i = 0; i < _samplesPerCode; i++) { //=== Digitizing ======================================================= //--- Make index array to read C/A code values ------------------------- // The length of the index array depends on the sampling frequency - // number of samples per millisecond (because one C/A code period is one // millisecond). // _codeValueIndex = ceil((_ts * ((float)i + 1)) / _tc) - 1; aux = (_ts * (i + 1)) / _tc; _codeValueIndex = auxCeil( aux ) - 1; //--- Make the digitized version of the C/A code ----------------------- // The "upsampled" code is made by selecting values form the CA code // chip array (caCode) for the time instances of each sample. if (i == _samplesPerCode - 1) { //--- Correct the last index (due to number rounding issues) ----------- _dest[i] = _code[_codeLength - 1]; } else { _dest[i] = _code[_codeValueIndex]; //repeat the chip -> upsample } } } gnss-sdr-0.0.9/src/algorithms/libs/gps_sdr_signal_processing.h000066400000000000000000000040061305042567700245650ustar00rootroot00000000000000/*! * \file gps_sdr_signal_processing.h * \brief This class implements various functions for GPS L1 CA signals * \author Javier Arribas, 2011. jarribas(at)cttc.es * * Detailed description of the file here if needed. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_SDR_SIGNAL_PROCESSING_H_ #define GNSS_SDR_GPS_SDR_SIGNAL_PROCESSING_H_ #include //!Generates complex GPS L1 C/A code for the desired SV ID and code shift, and sampled to specific sampling frequency void gps_l1_ca_code_gen_complex(std::complex* _dest, signed int _prn, unsigned int _chip_shift); //! Generates N complex GPS L1 C/A codes for the desired SV ID and code shift void gps_l1_ca_code_gen_complex_sampled(std::complex* _dest, unsigned int _prn, signed int _fs, unsigned int _chip_shift, unsigned int _ncodes); //! Generates complex GPS L1 C/A code for the desired SV ID and code shift void gps_l1_ca_code_gen_complex_sampled(std::complex* _dest, unsigned int _prn, signed int _fs, unsigned int _chip_shift); #endif /* GNSS_SDR_GPS_SDR_SIGNAL_PROCESSING_H_ */ gnss-sdr-0.0.9/src/algorithms/libs/pass_through.cc000066400000000000000000000075771305042567700222170ustar00rootroot00000000000000/*! * \file pass_through.cc * \brief Implementation of a block that just puts its input in its * output. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "pass_through.h" #include #include #include #include #include "configuration_interface.h" using google::LogMessage; Pass_Through::Pass_Through(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { std::string default_item_type = "gr_complex"; std::string input_type = configuration->property(role + ".input_item_type", default_item_type); std::string output_type = configuration->property(role + ".output_item_type", default_item_type); if(input_type.compare(output_type) != 0) { LOG(WARNING) << "input_item_type and output_item_type are different in a Pass_Through implementation! Taking " << input_type << ", but item_size will supersede it."; } item_type_ = configuration->property(role + ".item_type", input_type); vector_size_ = configuration->property(role + ".vector_size", 1); if(item_type_.compare("float") == 0) { item_size_ = sizeof(float); } else if(item_type_.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); } else if(item_type_.compare("short") == 0) { item_size_ = sizeof(int16_t); } else if(item_type_.compare("ishort") == 0) { item_size_ = sizeof(int16_t); } else if(item_type_.compare("cshort") == 0) { item_size_ = sizeof(lv_16sc_t); } else if(item_type_.compare("byte") == 0) { item_size_ = sizeof(int8_t); } else if(item_type_.compare("ibyte") == 0) { item_size_ = sizeof(int8_t); } else if(item_type_.compare("cbyte") == 0) { item_size_ = sizeof(lv_8sc_t); } else { LOG(WARNING) << item_type_ << " unrecognized item type. Using float"; item_size_ = sizeof(float); } kludge_copy_ = gr::blocks::copy::make(item_size_); DLOG(INFO) << "kludge_copy(" << kludge_copy_->unique_id() << ")"; } Pass_Through::~Pass_Through() {} void Pass_Through::connect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; DLOG(INFO) << "nothing to connect internally"; } void Pass_Through::disconnect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to disconnect } gr::basic_block_sptr Pass_Through::get_left_block() { return kludge_copy_; } gr::basic_block_sptr Pass_Through::get_right_block() { return kludge_copy_; } gnss-sdr-0.0.9/src/algorithms/libs/pass_through.h000066400000000000000000000050261305042567700220440ustar00rootroot00000000000000/*! * \file pass_through.h * \brief Interface of a block that just puts its input in its * output. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_PASS_THROUGH_H_ #define GNSS_SDR_PASS_THROUGH_H_ #include #include #include #include "gnss_block_interface.h" class ConfigurationInterface; /*! * \brief This class implements a block that connects input and output (does nothing) */ class Pass_Through : public GNSSBlockInterface { public: Pass_Through(ConfigurationInterface* configuration, std::string role, unsigned int in_stream, unsigned int out_stream); virtual ~Pass_Through(); std::string role() { return role_; } //! returns "Pass_Through" std::string implementation() { return "Pass_Through"; } std::string item_type() { return item_type_; } size_t vector_size() { return vector_size_; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); private: std::string item_type_; size_t vector_size_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; //gr_kludge_copy_sptr kludge_copy_; gr::blocks::copy::sptr kludge_copy_; size_t item_size_; }; #endif /*GNSS_SDR_PASS_THROUGH_H_*/ gnss-sdr-0.0.9/src/algorithms/libs/short_x2_to_cshort.cc000066400000000000000000000046531305042567700233350ustar00rootroot00000000000000/*! * \file short_x2_to_cshort.cc * \brief Adapts two short streams into a std::complex stream * \author Carles Fernandez Prades, cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "short_x2_to_cshort.h" #include #include short_x2_to_cshort_sptr make_short_x2_to_cshort() { return short_x2_to_cshort_sptr(new short_x2_to_cshort()); } short_x2_to_cshort::short_x2_to_cshort() : sync_block("short_x2_to_cshort", gr::io_signature::make (2, 2, sizeof(short)), gr::io_signature::make (1, 1, sizeof(lv_16sc_t))) // lv_8sc_t is a Volk's typedef for std::complex { const int alignment_multiple = volk_get_alignment() / sizeof(lv_16sc_t); set_alignment(std::max(1, alignment_multiple)); } int short_x2_to_cshort::work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { const short *in0 = (const short *) input_items[0]; const short *in1 = (const short *) input_items[1]; lv_16sc_t *out = (lv_16sc_t *) output_items[0]; // This could be put into a volk kernel short real_part; short imag_part; for(int number = 0; number < noutput_items; number++) { // lv_cmake(r, i) defined at volk/volk_complex.h real_part = *in0++; imag_part = *in1++; *out++ = lv_cmake(real_part, imag_part); } return noutput_items; } gnss-sdr-0.0.9/src/algorithms/libs/short_x2_to_cshort.h000066400000000000000000000034771305042567700232020ustar00rootroot00000000000000/*! * \file short_x2_to_cshort.h * \brief Adapts two short streams into a std::complex stream * \author Carles Fernandez Prades, cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_SHORT_X2_TO_CSHORT_H_ #define GNSS_SDR_SHORT_X2_TO_CSHORT_H_ #include #include class short_x2_to_cshort; typedef boost::shared_ptr short_x2_to_cshort_sptr; short_x2_to_cshort_sptr make_short_x2_to_cshort(); /*! * \brief This class adapts two short streams into a std::complex stream */ class short_x2_to_cshort : public gr::sync_block { private: friend short_x2_to_cshort_sptr make_short_x2_to_cshort(); public: short_x2_to_cshort(); int work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; #endif gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/000077500000000000000000000000001305042567700232455ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/000077500000000000000000000000001305042567700257635ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/.gitignore000066400000000000000000000000721305042567700277520ustar00rootroot00000000000000*~ *.pyc *.pyo html/ build/ .project .cproject /.DS_Store gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/CMakeLists.txt000066400000000000000000000275211305042567700305320ustar00rootroot00000000000000# # Copyright (C) 2010-2017 (see AUTHORS file for a list of contributors) # # 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 . # ######################################################################## # Project setup ######################################################################## cmake_minimum_required(VERSION 2.6) set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "Choose build type: None Debug Release RelWithDebInfo MinSizeRel") project(volk_gnsssdr) enable_language(CXX) enable_language(C) enable_testing() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") add_definitions(-D_GLIBCXX_USE_CXX11_ABI=1) option(ENABLE_STRIP "Create a stripped volk_gnsssdr_profile binary (without shared libraries)" OFF) set(PROJECT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) #allows this to be a sub-project set(PROJECT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) #allows this to be a sub-project list(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules) #location for custom "Modules" include(VolkBuildTypes) #select the release build type by default to get optimization flags if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release") message(STATUS "Build type not specified: defaulting to release.") endif() VOLK_CHECK_BUILD_TYPE(${CMAKE_BUILD_TYPE}) set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "") message(STATUS "Build type set to ${CMAKE_BUILD_TYPE}.") set(VERSION_INFO_MAJOR_VERSION 0) set(VERSION_INFO_MINOR_VERSION 0) set(VERSION_INFO_MAINT_VERSION 9) include(VolkVersion) #setup version info ######################################################################## # Environment setup ######################################################################## IF(NOT DEFINED BOOST_ROOT AND NOT DEFINED ENV{BOOST_ROOT}) SET(BOOST_ROOT ${CMAKE_INSTALL_PREFIX}) ENDIF() IF(NOT DEFINED CROSSCOMPILE_MULTILIB) SET(CROSSCOMPILE_MULTILIB "") ENDIF() SET(CROSSCOMPILE_MULTILIB ${CROSSCOMPILE_MULTILIB} CACHE STRING "Define \"true\" if you have and want to use multiple C development libs installed for cross compile") if(MSVC) add_definitions(-D_USE_MATH_DEFINES) #enables math constants on all supported versions of MSVC add_compile_options(/W1) #reduce warnings add_compile_options(/wo4309) add_compile_options(/wd4752) add_compile_options(/wo4273) add_compile_options(/wo4838) endif(MSVC) ######################################################################## # Dependencies setup ######################################################################## # Python include(VolkPython) #sets PYTHON_EXECUTABLE and PYTHON_DASH_B VOLK_PYTHON_CHECK_MODULE("python >= 2.7" sys "sys.version.split()[0] >= '2.7'" PYTHON_MIN_VER_FOUND) VOLK_PYTHON_CHECK_MODULE("mako >= 0.4.2" mako "mako.__version__ >= '0.4.2'" MAKO_FOUND) VOLK_PYTHON_CHECK_MODULE("six - python 2 and 3 compatibility library" six "True" SIX_FOUND) if(NOT PYTHON_MIN_VER_FOUND) message(FATAL_ERROR "Python 2.7 or greater required to build VOLK_GNSSSDR") endif() # Mako if(NOT MAKO_FOUND) message(FATAL_ERROR "Mako templates required to build VOLK_GNSSSDR") endif() # Six if(NOT SIX_FOUND) message(FATAL_ERROR "six - python 2 and 3 compatibility library required to build VOLK") endif() # Boost if(MSVC) if (NOT DEFINED BOOST_ALL_DYN_LINK) set(BOOST_ALL_DYN_LINK TRUE) endif() set(BOOST_ALL_DYN_LINK "${BOOST_ALL_DYN_LINK}" CACHE BOOL "boost enable dynamic linking") if(BOOST_ALL_DYN_LINK) add_definitions(-DBOOST_ALL_DYN_LINK) #setup boost auto-linking in msvc else(BOOST_ALL_DYN_LINK) unset(BOOST_REQUIRED_COMPONENTS) #empty components list for static link endif(BOOST_ALL_DYN_LINK) endif(MSVC) include(VolkBoost) if(NOT Boost_FOUND) message(FATAL_ERROR "VOLK_GNSSSDR Requires boost to build") endif() # Orc option(ENABLE_ORC "Enable Orc" True) if(ENABLE_ORC) find_package(ORC) else(ENABLE_ORC) message(STATUS "Disabling use of ORC") endif(ENABLE_ORC) ######################################################################## # Setup doxygen ######################################################################## find_package(Doxygen) if(DOXYGEN_FOUND) configure_file( ${PROJECT_SOURCE_DIR}/Doxyfile.in ${PROJECT_BINARY_DIR}/Doxyfile @ONLY) add_custom_target(doc ${DOXYGEN_EXECUTABLE} ${PROJECT_BINARY_DIR}/Doxyfile WORKING_DIRECTORY ${PROJECT_BINARY_DIR} COMMENT "Generating documentation with Doxygen" VERBATIM ) endif(DOXYGEN_FOUND) ######################################################################## # Setup the package config file ######################################################################## #set variables found in the pc.in file set(prefix ${CMAKE_INSTALL_PREFIX}) set(exec_prefix "\${prefix}") set(libdir "\${exec_prefix}/lib${LIB_SUFFIX}") set(includedir "\${prefix}/include") configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/volk_gnsssdr.pc.in ${CMAKE_CURRENT_BINARY_DIR}/volk_gnsssdr.pc @ONLY) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/volk_gnsssdr.pc DESTINATION lib${LIB_SUFFIX}/pkgconfig COMPONENT "volk_gnsssdr_devel" ) ######################################################################## # Install all headers in the include directories ######################################################################## set(VOLK_RUNTIME_DIR bin) set(VOLK_LIBRARY_DIR lib${LIB_SUFFIX}) set(VOLK_INCLUDE_DIR include) install( DIRECTORY ${PROJECT_SOURCE_DIR}/kernels/volk_gnsssdr DESTINATION include COMPONENT "volk_gnsssdr_devel" FILES_MATCHING PATTERN "*.h" ) install(FILES ${PROJECT_SOURCE_DIR}/include/volk_gnsssdr/volk_gnsssdr_prefs.h ${PROJECT_SOURCE_DIR}/include/volk_gnsssdr/volk_gnsssdr_complex.h ${PROJECT_SOURCE_DIR}/include/volk_gnsssdr/volk_gnsssdr_common.h ${PROJECT_SOURCE_DIR}/include/volk_gnsssdr/volk_gnsssdr_avx_intrinsics.h ${PROJECT_SOURCE_DIR}/include/volk_gnsssdr/volk_gnsssdr_sse3_intrinsics.h ${PROJECT_SOURCE_DIR}/include/volk_gnsssdr/volk_gnsssdr_neon_intrinsics.h ${PROJECT_BINARY_DIR}/include/volk_gnsssdr/volk_gnsssdr.h ${PROJECT_BINARY_DIR}/include/volk_gnsssdr/volk_gnsssdr_cpu.h ${PROJECT_BINARY_DIR}/include/volk_gnsssdr/volk_gnsssdr_config_fixed.h ${PROJECT_BINARY_DIR}/include/volk_gnsssdr/volk_gnsssdr_typedefs.h ${PROJECT_SOURCE_DIR}/include/volk_gnsssdr/volk_gnsssdr_malloc.h ${PROJECT_SOURCE_DIR}/include/volk_gnsssdr/volk_gnsssdr_sine_table.h DESTINATION include/volk_gnsssdr COMPONENT "volk_gnsssdr_devel" ) ######################################################################## # On Apple only, set install name and use rpath correctly, if not already set ######################################################################## if(APPLE) if(NOT CMAKE_INSTALL_NAME_DIR) set(CMAKE_INSTALL_NAME_DIR ${CMAKE_INSTALL_PREFIX}/${VOLK_LIBRARY_DIR} CACHE PATH "Library Install Name Destination Directory" FORCE) endif(NOT CMAKE_INSTALL_NAME_DIR) if(NOT CMAKE_INSTALL_RPATH) set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/${VOLK_LIBRARY_DIR} CACHE PATH "Library Install RPath" FORCE) endif(NOT CMAKE_INSTALL_RPATH) if(NOT CMAKE_BUILD_WITH_INSTALL_RPATH) set(CMAKE_BUILD_WITH_INSTALL_RPATH ON CACHE BOOL "Do Build Using Library Install RPath" FORCE) endif(NOT CMAKE_BUILD_WITH_INSTALL_RPATH) endif(APPLE) ######################################################################## # Create uninstall target ######################################################################## configure_file( ${PROJECT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake @ONLY) # Only add the target if there isn't one defined already if(NOT TARGET uninstall) add_custom_target(uninstall ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake ) endif() ######################################################################## # Install our Cmake modules into $prefix/lib/cmake/volk_gnsssdr # See "Package Configuration Files" on page: # http://www.cmake.org/Wiki/CMake/Tutorials/Packaging ######################################################################## configure_file( ${CMAKE_SOURCE_DIR}/cmake/Modules/VolkGnsssdrConfig.cmake.in ${CMAKE_BINARY_DIR}/cmake/Modules/VolkGnsssdrConfig.cmake @ONLY) configure_file( ${PROJECT_SOURCE_DIR}/cmake/Modules/VolkGnsssdrConfigVersion.cmake.in ${PROJECT_BINARY_DIR}/cmake/Modules/VolkGnsssdrConfigVersion.cmake @ONLY) ######################################################################## # Install cmake search routine for external use ######################################################################## if(NOT CMAKE_MODULES_DIR) set(CMAKE_MODULES_DIR lib${LIB_SUFFIX}/cmake) endif(NOT CMAKE_MODULES_DIR) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/cmake/Modules/VolkGnsssdrConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/cmake/Modules/VolkGnsssdrConfigVersion.cmake DESTINATION ${CMAKE_MODULES_DIR}/volk_gnsssdr COMPONENT "volk_gnsssdr_devel" ) ######################################################################## # Option to enable QA testing, on by default ######################################################################## OPTION(ENABLE_TESTING "Enable QA testing" ON) if(ENABLE_TESTING) message(STATUS "QA Testing is enabled.") else() message(STATUS "QA Testing is disabled.") endif() message(STATUS " Modify using: -DENABLE_TESTING=ON/OFF") ######################################################################## # Option to enable post-build profiling using volk_profile, off by default ######################################################################## OPTION(ENABLE_PROFILING "Launch system profiler after build" OFF) if(ENABLE_PROFILING) set(ENABLE_STATIC_LIBS ON) if(DEFINED VOLK_CONFIGPATH) get_filename_component(VOLK_CONFIGPATH ${VOLK_CONFIGPATH} ABSOLUTE) set(VOLK_CONFIGPATH "${VOLK_CONFIGPATH}/volk_gnsssdr") message(STATUS "System profiling is enabled, using path: ${VOLK_CONFIGPATH}") elseif(DEFINED ENV{VOLK_CONFIGPATH}) set(VOLK_CONFIGPATH "$ENV{VOLK_CONFIGPATH}/volk_gnsssdr") message(STATUS "System profiling is enabled, using env path: $ENV{VOLK_CONFIGPATH}") else() message(STATUS "System profiling is enabled with default paths.") if(DEFINED ENV{HOME}) set(VOLK_CONFIGPATH "$ENV{HOME}/.volk_gnsssdr") elseif(DEFINED ENV{APPDATA}) set(VOLK_CONFIGPATH "$ENV{APPDATA}/.volk_gnsssdr") endif() endif() else() message(STATUS "System profiling is disabled.") endif() message(STATUS " Modify using: -DENABLE_PROFILING=ON/OFF") ######################################################################## ######################################################################## # Setup the library ######################################################################## add_subdirectory(lib) ######################################################################## # And the utility apps ######################################################################## add_subdirectory(apps) add_subdirectory(python/volk_gnsssdr_modtool) ######################################################################## # Print summary ######################################################################## message(STATUS "Using install prefix: ${CMAKE_INSTALL_PREFIX}") gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/COPYING000066400000000000000000001057551305042567700270330ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/Doxyfile.in000066400000000000000000003103301305042567700300760ustar00rootroot00000000000000# Doxyfile 1.8.6 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a double hash (##) is considered a comment and is placed in # front of the TAG it is preceding. # # All text after a single hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all text # before the first occurrence of this tag. Doxygen uses libiconv (or the iconv # built into libc) for the transcoding. See http://www.gnu.org/software/libiconv # for the list of possible encodings. # The default value is: UTF-8. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded by # double-quotes, unless you are using Doxywizard) that should identify the # project for which the documentation is generated. This name is used in the # title of most generated pages and in a few other places. # The default value is: My Project. PROJECT_NAME = "Vector-Optimized Library of Kernels for GNSS-SDR" # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version # control system is used. PROJECT_NUMBER = @VERSION@ # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = "Architecture-tuned implementations of math kernels" # With the PROJECT_LOGO tag one can specify an logo or icon that is included in # the documentation. The maximum height of the logo should not exceed 55 pixels # and the maximum width should not exceed 200 pixels. Doxygen will copy the logo # to the output directory. PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. 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. # TODO: configure this to be a special docs directory. nw tried, but running # make doc won' create the directory, but with doxygen it will. why? OUTPUT_DIRECTORY = # 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 format and # will distribute the generated files over these directories. Enabling this # option can be useful when feeding doxygen a huge amount of source files, where # putting all generated files in the same directory would otherwise causes # performance problems for the file system. # The default value is: NO. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, # Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), # Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, # Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), # Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, # Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, # Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, # Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. # The default value is: YES. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief # description of a member or function before the detailed description # # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. # The default value is: YES. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator that is # used to form the text in various listings. Each string in this list, if found # as the leading text of the brief description, will be stripped from the text # and the result, after processing the whole list, is used as the annotated # text. Otherwise, the brief description is used as-is. If left blank, the # following values are used ($name is automatically replaced with the name of # the entity):The $name class, The $name widget, The $name file, is, provides, # specifies, contains, represents, a, an and the. ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # doxygen will generate a detailed section even if there is only a brief # description. # The default value is: NO. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. # The default value is: NO. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the # shortest path that makes the file name unique will be used # The default value is: YES. FULL_PATH_NAMES = YES # The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. # Stripping is only done if one of the specified strings matches the left-hand # part of the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the path to # strip. # # Note that you can specify absolute paths here, but also relative paths, which # will be relative from the directory where doxygen is started. # This tag requires that the tag FULL_PATH_NAMES is set to YES. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the # path mentioned in the documentation of a class, which tells the reader which # header file to include in order to use a class. If left blank only the name of # the header file containing the class definition is used. Otherwise one should # specify the list of include paths that are normally passed to the compiler # using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but # less readable) file names. This can be useful is your file systems doesn't # support long names like on DOS, Mac, or CD-ROM. # The default value is: NO. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the # first line (until the first dot) of a Javadoc-style comment as the brief # description. If set to NO, the Javadoc-style will behave just like regular Qt- # style comments (thus requiring an explicit @brief command for a brief # description.) # The default value is: NO. JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If # set to NO, the Qt-style will behave just like regular Qt-style comments (thus # requiring an explicit \brief command for a brief description.) # The default value is: NO. QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a # multi-line C++ special comment block (i.e. a block of //! or /// comments) as # a brief description. This used to be the default behavior. The new default is # to treat a multi-line C++ comment block as a detailed description. Set this # tag to YES if you prefer the old behavior instead. # # Note that setting this tag to YES also means that rational rose comments are # not recognized any more. # The default value is: NO. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a # new page for each member. If set to NO, the documentation of a member will be # part of the file/class/namespace that contains it. # The default value is: NO. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen # uses this value to replace tabs by spaces in code fragments. # Minimum value: 1, maximum value: 16, default value: 4. TAB_SIZE = 4 # This tag can be used to specify a number of aliases that act as commands in # the documentation. An alias has the form: # name=value # For example adding # "sideeffect=@par Side Effects:\n" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading # "Side Effects:". You can put \n's in the value part of an alias to insert # newlines. ALIASES = # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding "class=itcl::class" # will allow you to use the command class in the itcl::class meaning. TCL_SUBST = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For # instance, some of the names that are used will be different. The list of all # members will be omitted, etc. # The default value is: NO. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or # Python sources only. Doxygen will then generate output that is more tailored # for that language. For instance, namespaces will be presented as packages, # qualified scopes will look different, etc. # The default value is: NO. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources. Doxygen will then generate output that is tailored for Fortran. # The default value is: NO. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for VHDL. # The default value is: NO. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and # language is one of the parsers supported by doxygen: IDL, Java, Javascript, # C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make # doxygen treat .inc files as Fortran files (default is PHP), and .f files as C # (default is Fortran), use: inc=Fortran f=C. # # Note For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise # the files are not read by doxygen. EXTENSION_MAPPING = # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments # according to the Markdown format, which allows for more readable # documentation. See http://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you can # mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in # case of backward compatibilities issues. # The default value is: YES. MARKDOWN_SUPPORT = YES # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can # be prevented in individual cases by by putting a % sign in front of the word # or globally by setting AUTOLINK_SUPPORT to NO. # The default value is: YES. AUTOLINK_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should set this # tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); # versus func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. # The default value is: NO. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. # The default value is: NO. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: # http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen # will parse them like normal C++ but will assume all classes use public instead # of private inheritance when no explicit protection keyword is present. # The default value is: NO. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate # getter and setter methods for a property. Setting this option to YES will make # doxygen to replace the get and set methods by a property in the documentation. # This will only work if the methods are indeed getting or setting a simple # type. If this is not the case, or you want to show the methods anyway, you # should set this option to NO. # The default value is: YES. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. # The default value is: NO. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES to allow class member groups of the same type # (for instance a group of public functions) to be put as a subgroup of that # type (e.g. under the Public Functions section). Set it to NO to prevent # subgrouping. Alternatively, this can be done per class using the # \nosubgrouping command. # The default value is: YES. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions # are shown inside the group in which they are included (e.g. using \ingroup) # instead of on a separate page (for HTML and Man pages) or section (for LaTeX # and RTF). # # Note that this feature does not work in combination with # SEPARATE_MEMBER_PAGES. # The default value is: NO. INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions # with only public data fields or simple typedef fields will be shown inline in # the documentation of the scope in which they are defined (i.e. file, # namespace, or group documentation), provided this scope is documented. If set # to NO, structs, classes, and unions are shown on a separate page (for HTML and # Man pages) or section (for LaTeX and RTF). # The default value is: NO. INLINE_SIMPLE_STRUCTS = NO # When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or # enum is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically be # useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. # The default value is: NO. TYPEDEF_HIDES_STRUCT = NO # The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This # cache is used to resolve symbols given their name and scope. Since this can be # an expensive process and often the same symbol appears multiple times in the # code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small # doxygen will become slower. If the cache is too large, memory is wasted. The # cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range # is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 # symbols. At the end of a run doxygen will report the cache usage and suggest # the optimal cache size from a speed point of view. # Minimum value: 0, maximum value: 9, default value: 0. LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. Private # class members and static file members will be hidden unless the # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. # Note: This will also disable the warnings about undocumented members that are # normally produced when WARNINGS is set to YES. # The default value is: NO. EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class will # be included in the documentation. # The default value is: NO. EXTRACT_PRIVATE = NO # If the EXTRACT_PACKAGE tag is set to YES all members with package or internal # scope will be included in the documentation. # The default value is: NO. EXTRACT_PACKAGE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file will be # included in the documentation. # The default value is: NO. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined # locally in source files will be included in the documentation. If set to NO # only classes defined in header files are included. Does not have any effect # for Java sources. # The default value is: YES. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local methods, # which are defined in the implementation section but not in the interface are # included in the documentation. If set to NO only methods in the interface are # included. # The default value is: NO. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base name of # the file that contains the anonymous namespace. By default anonymous namespace # are hidden. # The default value is: NO. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation # section is generated. This option has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_MEMBERS = YES # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO these classes will be included in the various overviews. This option has # no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = YES # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend # (class|struct|union) declarations. If set to NO these declarations will be # included in the documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any # documentation blocks found inside the body of a function. If set to NO these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation that is typed after a # \internal command is included. If the tag is set to NO then the documentation # will be excluded. Set it to YES to include the internal documentation. # The default value is: NO. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file # names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. # The default value is: system dependent. CASE_SENSE_NAMES = NO # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with # their full class and namespace scopes in the documentation. If set to YES the # scope will be hidden. # The default value is: NO. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. SHOW_INCLUDE_FILES = YES # If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each # grouped member an include statement to the documentation, telling the reader # which file to include in order to use the member. # The default value is: NO. SHOW_GROUPED_MEMB_INC = NO # If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include # files with double quotes in the documentation rather than with sharp brackets. # The default value is: NO. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the # documentation for inline members. # The default value is: YES. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the # (detailed) documentation of file and class members alphabetically by member # name. If set to NO the members will appear in declaration order. # The default value is: YES. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member # name. If set to NO the members will appear in declaration order. Note that # this will also influence the order of the classes in the class list. # The default value is: NO. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the # (brief and detailed) documentation of class members so that constructors and # destructors are listed first. If set to NO the constructors will appear in the # respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. # Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief # member documentation. # Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting # detailed member documentation. # The default value is: NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy # of group names into alphabetical order. If set to NO the group names will # appear in their defined order. # The default value is: NO. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by # fully-qualified names, including namespaces. If set to NO, the class list will # be sorted only by class name, not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the alphabetical # list. # The default value is: NO. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper # type resolution of all parameters of a function it will reject a match between # the prototype and the implementation of a member function even if there is # only one candidate or it is obvious which candidate to choose by doing a # simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still # accept a match between prototype and implementation in such cases. # The default value is: NO. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the # todo list. This list is created by putting \todo commands in the # documentation. # The default value is: YES. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the # test list. This list is created by putting \test commands in the # documentation. # The default value is: YES. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug # list. This list is created by putting \bug commands in the documentation. # The default value is: YES. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO) # the deprecated list. This list is created by putting \deprecated commands in # the documentation. # The default value is: YES. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional documentation # sections, marked by \if ... \endif and \cond # ... \endcond blocks. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the # initial value of a variable or macro / define can have for it to appear in the # documentation. If the initializer consists of more lines than specified here # it will be hidden. Use a value of 0 to hide initializers completely. The # appearance of the value of individual variables and macros / defines can be # controlled using \showinitializer or \hideinitializer command in the # documentation regardless of this setting. # Minimum value: 0, maximum value: 10000, default value: 30. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated at # the bottom of the documentation of classes and structs. If set to YES the list # will mention the files that were used to generate the documentation. # The default value is: YES. SHOW_USED_FILES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. This # will remove the Files entry from the Quick Index and from the Folder Tree View # (if specified). # The default value is: YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces # page. This will remove the Namespaces entry from the Quick Index and from the # Folder Tree View (if specified). # The default value is: YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command command input-file, where command is the value of the # FILE_VERSION_FILTER tag, and input-file is the name of an input file provided # by doxygen. Whatever the program writes to standard output is used as the file # version. For an example see the documentation. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml # will be used as the name of the layout file. # # Note that if you run doxygen from a directory containing a file called # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. LAYOUT_FILE = @PROJECT_SOURCE_DIR@/DoxygenLayout.xml # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib # extension is automatically appended if omitted. This requires the bibtex tool # to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. # For LaTeX the style of the bibliography can be controlled using # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the # search path. Do not use file names with spaces, bibtex cannot handle them. See # also \cite for info how to create references. CITE_BIB_FILES = #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated to # standard output by doxygen. If QUIET is set to YES this implies that the # messages are off. # The default value is: NO. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES # this implies that the warnings are on. # # Tip: Turn warnings on while writing the documentation. # The default value is: YES. WARNINGS = YES # If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: YES. WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some parameters # in a documented function, or documenting parameters that don't exist or using # markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return # value. If set to NO doxygen will only warn about wrong or incomplete parameter # documentation, but not about the absence of documentation. # The default value is: NO. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that doxygen # can produce. The string should contain the $file, $line, and $text tags, which # will be replaced by the file and line number from which the warning originated # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard # error (stderr). WARN_LOGFILE = #--------------------------------------------------------------------------- # Configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag is used to specify the files and/or directories that contain # documented source files. You may enter file names like myfile.cpp or # directories like /usr/src/myproject. Separate the files or directories with # spaces. # Note: If this tag is empty the current directory is searched. INPUT = @PROJECT_SOURCE_DIR@ # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv # documentation (see: http://www.gnu.org/software/libiconv) for the list of # possible encodings. # The default value is: UTF-8. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. If left blank the # following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, # *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, # *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, # *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, # *.qsf, *.as and *.js. FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.idl \ *.ddl \ *.odl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.cs \ *.d \ *.php \ *.php4 \ *.php5 \ *.phtml \ *.inc \ *.m \ *.markdown \ *.md \ *.mm \ *.dox \ *.py \ *.f90 \ *.f \ *.for \ *.tcl \ *.vhd \ *.vhdl \ *.ucf \ *.qsf \ *.as \ *.js # The RECURSIVE tag can be used to specify whether or not subdirectories should # be searched for input files as well. # The default value is: NO. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = @PROJECT_BINARY_DIR@ # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. # The default value is: NO. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories use the pattern */test/* EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include # command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and # *.h) to filter out the source-files in the directories. If left blank all # files are included. EXAMPLE_PATTERNS = * # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude commands # irrespective of the value of the RECURSIVE tag. # The default value is: NO. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or directories # that contain images that are to be included in the documentation (see the # \image command). IMAGE_PATH = @PROJECT_SOURCE_DIR@/docs/images # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command: # # # # where is the value of the INPUT_FILTER tag, and is the # name of an input file. Doxygen will then use the output that the filter # program writes to standard output. If FILTER_PATTERNS is specified, this tag # will be ignored. # # Note that the filter must not add or remove lines; it is applied before the # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: pattern=filter # (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how # filters are used. If the FILTER_PATTERNS tag is empty or if none of the # patterns match the file name, INPUT_FILTER is applied. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER ) will also be used to filter the input files that are used for # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). # The default value is: NO. FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) and # it is also possible to disable source filtering for a specific pattern using # *.ext= (so without naming a filter). # This tag requires that the tag FILTER_SOURCE_FILES is set to YES. FILTER_SOURCE_PATTERNS = # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that # is part of the input, its contents will be placed on the main page # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. USE_MDFILE_AS_MAINPAGE = #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will be # generated. Documented entities will be cross-referenced with these sources. # # Note: To get rid of all source code in the generated output, make sure that # also VERBATIM_HEADERS is set to NO. # The default value is: NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body of functions, # classes and enums directly into the documentation. # The default value is: NO. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any # special comment blocks from generated source code fragments. Normal C, C++ and # Fortran comments will always remain visible. # The default value is: YES. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES then for each documented # function all documented functions referencing it will be listed. # The default value is: NO. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES then for each documented function # all documented entities called/used by that function will be listed. # The default value is: NO. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set # to YES, then the hyperlinks from functions in REFERENCES_RELATION and # REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will # link to the documentation. # The default value is: YES. REFERENCES_LINK_SOURCE = YES # If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the # source code will show a tooltip with additional information such as prototype, # brief description and links to the definition and documentation. Since this # will make the HTML file larger and loading of large files a bit slower, you # can opt to disable this feature. # The default value is: YES. # This tag requires that the tag SOURCE_BROWSER is set to YES. SOURCE_TOOLTIPS = YES # If the USE_HTAGS tag is set to YES then the references to source code will # point to the HTML generated by the htags(1) tool instead of doxygen built-in # source browser. The htags tool is part of GNU's global source tagging system # (see http://www.gnu.org/software/global/global.html). You will need version # 4.8.6 or higher. # # To use it do the following: # - Install the latest version of global # - Enable SOURCE_BROWSER and USE_HTAGS in the config file # - Make sure the INPUT points to the root of the source tree # - Run doxygen as normal # # Doxygen will invoke htags (and that will in turn invoke gtags), so these # tools must be available from the command line (i.e. in the search path). # # The result: instead of the source browser generated by doxygen, the links to # source code will now point to the output of htags. # The default value is: NO. # This tag requires that the tag SOURCE_BROWSER is set to YES. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a # verbatim copy of the header file for each class for which an include is # specified. Set to NO to disable this. # See also: Section \class. # The default value is: YES. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all # compounds will be generated. Enable this if the project contains a lot of # classes, structs, unions or interfaces. # The default value is: YES. ALPHABETICAL_INDEX = YES # The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in # which the alphabetical index list will be split. # Minimum value: 1, maximum value: 20, default value: 5. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all classes will # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag # can be used to specify a prefix (or a list of prefixes) that should be ignored # while generating the index headers. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES doxygen will generate HTML output # The default value is: YES. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of # it. # The default directory is: html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for each # generated HTML page (for example: .htm, .php, .asp). # The default value is: .html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a user-defined HTML header file for # each generated HTML page. If the tag is left blank doxygen will generate a # standard header. # # To get valid HTML the header file that includes any scripts and style sheets # that doxygen needs, which is dependent on the configuration options used (e.g. # the setting GENERATE_TREEVIEW). It is highly recommended to start with a # default header using # doxygen -w html new_header.html new_footer.html new_stylesheet.css # YourConfigFile # and then modify the file new_header.html. See also section "Doxygen usage" # for information on how to generate the default header that doxygen normally # uses. # Note: The header is subject to change so you typically have to regenerate the # default header when upgrading to a newer version of doxygen. For a description # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank doxygen will generate a standard # footer. See HTML_HEADER for more information on how to generate a default # footer and what special commands can be used inside the footer. See also # section "Doxygen usage" for information on how to generate the default footer # that doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of # the HTML output. If left blank doxygen will generate a default style sheet. # See also section "Doxygen usage" for information on how to generate the style # sheet that doxygen normally uses. # Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as # it is more robust and this tag (HTML_STYLESHEET) will in the future become # obsolete. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user- # defined cascading style sheet that is included after the standard style sheets # created by doxygen. Using this option one can overrule certain style aspects. # This is preferred over using HTML_STYLESHEET since it does not replace the # standard style sheet and is therefor more robust against future updates. # Doxygen will copy the style sheet file to the output directory. For an example # see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that the # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the stylesheet and background images according to # this color. Hue is specified as an angle on a colorwheel, see # http://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. # Minimum value: 0, maximum value: 359, default value: 220. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors # in the HTML output. For a value of 0 the output will use grayscales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the # luminance component of the colors in the HTML output. Values below 100 # gradually make the output lighter, whereas values above 100 make the output # darker. The value divided by 100 is the actual gamma applied, so 80 represents # a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not # change the gamma. # Minimum value: 40, maximum value: 240, default value: 80. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting this # to NO can help when comparing the output of multiple runs. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_TIMESTAMP = NO # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_DYNAMIC_SECTIONS = NO # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand # and collapse entries dynamically later on. Doxygen will expand the tree to # such a level that at most the specified number of entries are visible (unless # a fully collapsed tree already exceeds this amount). So setting the number of # entries 1 will produce a full collapsed tree by default. 0 is a special value # representing an infinite number of entries and will result in a full expanded # tree by default. # Minimum value: 0, maximum value: 9999, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files will be # generated that can be used as input for Apple's Xcode 3 integrated development # environment (see: http://developer.apple.com/tools/xcode/), introduced with # OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a # Makefile in the HTML output directory. Running make will produce the docset in # that directory and running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at # startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_DOCSET = NO # This tag determines the name of the docset feed. A documentation feed provides # an umbrella under which multiple documentation sets from a single provider # (such as a company or product suite) can be grouped. # The default value is: Doxygen generated docs. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_FEEDNAME = "Doxygen generated docs" # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_BUNDLE_ID = org.doxygen.Project # The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. # The default value is: org.doxygen.Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. # The default value is: Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop # (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on # Windows. # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML # files are now used as the Windows 98 help format, and will replace the old # Windows help format (.hlp) on all Windows platforms in the future. Compressed # HTML files also contain an index, a table of contents, and you can search for # words in the documentation. The HTML workshop also contains a viewer for # compressed HTML files. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_HTMLHELP = NO # The CHM_FILE tag can be used to specify the file name of the resulting .chm # file. You can add a path in front of the file if the result should not be # written to the html output directory. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler ( hhc.exe). If non-empty # doxygen will try to run the HTML help compiler on the generated index.hhp. # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. HHC_LOCATION = # The GENERATE_CHI flag controls if a separate .chi index file is generated ( # YES) or that it should be included in the master .chm file ( NO). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. GENERATE_CHI = NO # The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc) # and project file content. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_INDEX_ENCODING = # The BINARY_TOC flag controls whether a binary table of contents is generated ( # YES) or a normal table of contents ( NO) in the .chm file. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members to # the table of contents of the HTML help documentation and to the tree view. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help # (.qch) of the generated HTML documentation. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify # the file name of the resulting .qch file. The path specified is relative to # the HTML output folder. # This tag requires that the tag GENERATE_QHP is set to YES. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace # (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual # Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- # folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom # Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom # Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: # http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_SECT_FILTER_ATTRS = # The QHG_LOCATION tag can be used to specify the location of Qt's # qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the # generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be # generated, together with the HTML files, they form an Eclipse help plugin. To # install this plugin and make it available under the help contents menu in # Eclipse, the contents of the directory containing the HTML and XML files needs # to be copied into the plugins directory of eclipse. The name of the directory # within the plugins directory should be the same as the ECLIPSE_DOC_ID value. # After copying Eclipse needs to be restarted before the help appears. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_ECLIPSEHELP = NO # A unique identifier for the Eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have this # name. Each documentation set should have its own identifier. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. ECLIPSE_DOC_ID = org.doxygen.Project # If you want full control over the layout of the generated HTML pages it might # be necessary to disable the index and replace it with your own. The # DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top # of each HTML page. A value of NO enables the index and the value YES disables # it. Since the tabs in the index contain the same information as the navigation # tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. DISABLE_INDEX = YES # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. If the tag # value is set to YES, a side panel will be generated containing a tree-like # index structure (just like the one that is generated for HTML Help). For this # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can # further fine-tune the look of the index. As an example, the default style # sheet generated by doxygen has an example that shows how to put an image at # the root of the tree instead of the PROJECT_NAME. Since the tree basically has # the same information as the tab index, you could consider setting # DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = YES # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. # # Note that a value of 0 will completely suppress the enum values from appearing # in the overview section. # Minimum value: 0, maximum value: 20, default value: 4. # This tag requires that the tag GENERATE_HTML is set to YES. ENUM_VALUES_PER_LINE = 4 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used # to set the initial width (in pixels) of the frame in which the tree is shown. # Minimum value: 0, maximum value: 1500, default value: 250. # This tag requires that the tag GENERATE_HTML is set to YES. TREEVIEW_WIDTH = 250 # When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to # external symbols imported via tag files in a separate window. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful # doxygen run you need to manually remove any form_*.png images from the HTML # output directory to force them to be regenerated. # Minimum value: 8, maximum value: 50, default value: 10. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are not # supported properly for IE 6.0, but are supported on all modern browsers. # # Note that when changing this option you need to delete any form_*.png files in # the HTML output directory before the changes have effect. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see # http://www.mathjax.org) which uses client side Javascript for the rendering # instead of using prerendered bitmaps. Use this if you do not have LaTeX # installed or if you want to formulas look prettier in the HTML output. When # enabled you may also need to install MathJax separately and configure the path # to it using the MATHJAX_RELPATH option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. USE_MATHJAX = NO # When MathJax is enabled you can set the default output format to be used for # the MathJax output. See the MathJax site (see: # http://docs.mathjax.org/en/latest/output.html) for more details. # Possible values are: HTML-CSS (which is slower, but has the best # compatibility), NativeMML (i.e. MathML) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_FORMAT = HTML-CSS # When MathJax is enabled you need to specify the location relative to the HTML # output directory using the MATHJAX_RELPATH option. The destination directory # should contain the MathJax.js script. For instance, if the mathjax directory # is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of # MathJax from http://www.mathjax.org before deployment. # The default value is: http://cdn.mathjax.org/mathjax/latest. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site # (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_CODEFILE = # When the SEARCHENGINE tag is enabled doxygen will generate a search box for # the HTML output. The underlying search engine uses javascript and DHTML and # should work on any modern browser. Note that when using HTML help # (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) # there is already a search function so this one should typically be disabled. # For large projects the javascript based search engine can be slow, then # enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to # search using the keyboard; to jump to the search box use + S # (what the is depends on the OS and browser, but it is typically # , /
  • Andres Cecilia, 2014. a.cecilia.luque(at)gmail.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ /*! * \page volk_gnsssdr_32fc_convert_16ic * * \b Overview * * Converts a complex vector of 32-bits float each component into * a complex vector of 16-bits integer each component. * Values are saturated to the limit values of the output data type. * * Dispatcher Prototype * \code * void volk_gnsssdr_32fc_convert_16ic(lv_16sc_t* outputVector, const lv_32fc_t* inputVector, unsigned int num_points); * \endcode * * \b Inputs * \li inputVector: The complex 32-bit float input data buffer. * \li num_points: The number of data values to be converted. * * \b Outputs * \li outputVector: The complex 16-bit integer output data buffer. * */ #ifndef INCLUDED_volk_gnsssdr_32fc_convert_16ic_H #define INCLUDED_volk_gnsssdr_32fc_convert_16ic_H #include #include #include "volk_gnsssdr/volk_gnsssdr_complex.h" #ifdef LV_HAVE_SSE2 #include static inline void volk_gnsssdr_32fc_convert_16ic_u_sse2(lv_16sc_t* outputVector, const lv_32fc_t* inputVector, unsigned int num_points) { const unsigned int sse_iters = num_points / 4; float* inputVectorPtr = (float*)inputVector; int16_t* outputVectorPtr = (int16_t*)outputVector; float aux; unsigned int i; const float min_val = (float)SHRT_MIN; const float max_val = (float)SHRT_MAX; __m128 inputVal1, inputVal2; __m128i intInputVal1, intInputVal2; __m128 ret1, ret2; const __m128 vmin_val = _mm_set_ps1(min_val); const __m128 vmax_val = _mm_set_ps1(max_val); for(i = 0; i < sse_iters; i++) { inputVal1 = _mm_loadu_ps((float*)inputVectorPtr); inputVectorPtr += 4; inputVal2 = _mm_loadu_ps((float*)inputVectorPtr); inputVectorPtr += 4; __VOLK_GNSSSDR_PREFETCH(inputVectorPtr + 8); // Clip ret1 = _mm_max_ps(_mm_min_ps(inputVal1, vmax_val), vmin_val); ret2 = _mm_max_ps(_mm_min_ps(inputVal2, vmax_val), vmin_val); intInputVal1 = _mm_cvtps_epi32(ret1); intInputVal2 = _mm_cvtps_epi32(ret2); intInputVal1 = _mm_packs_epi32(intInputVal1, intInputVal2); _mm_storeu_si128((__m128i*)outputVectorPtr, intInputVal1); outputVectorPtr += 8; } for(i = sse_iters * 8; i < num_points * 2; i++) { aux = *inputVectorPtr++; if(aux > max_val) aux = max_val; else if(aux < min_val) aux = min_val; *outputVectorPtr++ = (int16_t)rintf(aux); } } #endif /* LV_HAVE_SSE2 */ #ifdef LV_HAVE_SSE #include static inline void volk_gnsssdr_32fc_convert_16ic_u_sse(lv_16sc_t* outputVector, const lv_32fc_t* inputVector, unsigned int num_points) { const unsigned int sse_iters = num_points / 4; float* inputVectorPtr = (float*)inputVector; int16_t* outputVectorPtr = (int16_t*)outputVector; float aux; unsigned int i; const float min_val = (float)SHRT_MIN; const float max_val = (float)SHRT_MAX; __m128 inputVal1, inputVal2; __m128i intInputVal1, intInputVal2; // is __m128i defined in xmmintrin.h? __m128 ret1, ret2; const __m128 vmin_val = _mm_set_ps1(min_val); const __m128 vmax_val = _mm_set_ps1(max_val); for(i = 0;i < sse_iters; i++) { inputVal1 = _mm_loadu_ps((float*)inputVectorPtr); inputVectorPtr += 4; inputVal2 = _mm_loadu_ps((float*)inputVectorPtr); inputVectorPtr += 4; __VOLK_GNSSSDR_PREFETCH(inputVectorPtr + 8); // Clip ret1 = _mm_max_ps(_mm_min_ps(inputVal1, vmax_val), vmin_val); ret2 = _mm_max_ps(_mm_min_ps(inputVal2, vmax_val), vmin_val); intInputVal1 = _mm_cvtps_epi32(ret1); intInputVal2 = _mm_cvtps_epi32(ret2); intInputVal1 = _mm_packs_epi32(intInputVal1, intInputVal2); _mm_storeu_si128((__m128i*)outputVectorPtr, intInputVal1); outputVectorPtr += 8; } for(i = sse_iters * 8; i < num_points*2; i++) { aux = *inputVectorPtr++; if(aux > max_val) aux = max_val; else if(aux < min_val) aux = min_val; *outputVectorPtr++ = (int16_t)rintf(aux); } } #endif /* LV_HAVE_SSE */ #ifdef LV_HAVE_SSE2 #include static inline void volk_gnsssdr_32fc_convert_16ic_a_sse2(lv_16sc_t* outputVector, const lv_32fc_t* inputVector, unsigned int num_points) { const unsigned int sse_iters = num_points / 4; float* inputVectorPtr = (float*)inputVector; int16_t* outputVectorPtr = (int16_t*)outputVector; float aux; unsigned int i; const float min_val = (float)SHRT_MIN; const float max_val = (float)SHRT_MAX; __m128 inputVal1, inputVal2; __m128i intInputVal1, intInputVal2; __m128 ret1, ret2; const __m128 vmin_val = _mm_set_ps1(min_val); const __m128 vmax_val = _mm_set_ps1(max_val); for(i = 0; i < sse_iters; i++) { inputVal1 = _mm_load_ps((float*)inputVectorPtr); inputVectorPtr += 4; inputVal2 = _mm_load_ps((float*)inputVectorPtr); inputVectorPtr += 4; __VOLK_GNSSSDR_PREFETCH(inputVectorPtr + 8); // Clip ret1 = _mm_max_ps(_mm_min_ps(inputVal1, vmax_val), vmin_val); ret2 = _mm_max_ps(_mm_min_ps(inputVal2, vmax_val), vmin_val); intInputVal1 = _mm_cvtps_epi32(ret1); intInputVal2 = _mm_cvtps_epi32(ret2); intInputVal1 = _mm_packs_epi32(intInputVal1, intInputVal2); _mm_store_si128((__m128i*)outputVectorPtr, intInputVal1); outputVectorPtr += 8; } for(i = sse_iters * 8; i < num_points * 2; i++) { aux = *inputVectorPtr++; if(aux > max_val) aux = max_val; else if(aux < min_val) aux = min_val; *outputVectorPtr++ = (int16_t)rintf(aux); } } #endif /* LV_HAVE_SSE2 */ #ifdef LV_HAVE_SSE #include static inline void volk_gnsssdr_32fc_convert_16ic_a_sse(lv_16sc_t* outputVector, const lv_32fc_t* inputVector, unsigned int num_points) { const unsigned int sse_iters = num_points / 4; const float min_val = (float)SHRT_MIN; const float max_val = (float)SHRT_MAX; float aux; unsigned int i; float* inputVectorPtr = (float*)inputVector; int16_t* outputVectorPtr = (int16_t*)outputVector; __m128 inputVal1, inputVal2; __m128i intInputVal1, intInputVal2; __m128 ret1, ret2; const __m128 vmin_val = _mm_set_ps1(min_val); const __m128 vmax_val = _mm_set_ps1(max_val); for(i = 0; i < sse_iters; i++) { inputVal1 = _mm_load_ps((float*)inputVectorPtr); inputVectorPtr += 4; inputVal2 = _mm_load_ps((float*)inputVectorPtr); inputVectorPtr += 4; __VOLK_GNSSSDR_PREFETCH(inputVectorPtr + 8); // Clip ret1 = _mm_max_ps(_mm_min_ps(inputVal1, vmax_val), vmin_val); ret2 = _mm_max_ps(_mm_min_ps(inputVal2, vmax_val), vmin_val); intInputVal1 = _mm_cvtps_epi32(ret1); intInputVal2 = _mm_cvtps_epi32(ret2); intInputVal1 = _mm_packs_epi32(intInputVal1, intInputVal2); _mm_store_si128((__m128i*)outputVectorPtr, intInputVal1); outputVectorPtr += 8; } for(i = sse_iters * 8; i < num_points * 2; i++) { aux = *inputVectorPtr++; if(aux > max_val) aux = max_val; else if(aux < min_val) aux = min_val; *outputVectorPtr++ = (int16_t)rintf(aux); } } #endif /* LV_HAVE_SSE */ #ifdef LV_HAVE_NEON #include static inline void volk_gnsssdr_32fc_convert_16ic_neon(lv_16sc_t* outputVector, const lv_32fc_t* inputVector, unsigned int num_points) { const unsigned int neon_iters = num_points / 4; float32_t* inputVectorPtr = (float32_t*)inputVector; int16_t* outputVectorPtr = (int16_t*)outputVector; const float min_val_f = (float)SHRT_MIN; const float max_val_f = (float)SHRT_MAX; float32_t aux; unsigned int i; const float32x4_t min_val = vmovq_n_f32(min_val_f); const float32x4_t max_val = vmovq_n_f32(max_val_f); float32x4_t half = vdupq_n_f32(0.5f); float32x4_t ret1, ret2, a, b, sign, PlusHalf, Round; int32x4_t toint_a, toint_b; int16x4_t intInputVal1, intInputVal2; int16x8_t res; for(i = 0; i < neon_iters; i++) { a = vld1q_f32((const float32_t*)(inputVectorPtr)); inputVectorPtr += 4; b = vld1q_f32((const float32_t*)(inputVectorPtr)); inputVectorPtr += 4; __VOLK_GNSSSDR_PREFETCH(inputVectorPtr + 8); ret1 = vmaxq_f32(vminq_f32(a, max_val), min_val); ret2 = vmaxq_f32(vminq_f32(b, max_val), min_val); /* in __aarch64__ we can do that with vcvtaq_s32_f32(ret1); vcvtaq_s32_f32(ret2); */ sign = vcvtq_f32_u32((vshrq_n_u32(vreinterpretq_u32_f32(ret1), 31))); PlusHalf = vaddq_f32(ret1, half); Round = vsubq_f32(PlusHalf, sign); toint_a = vcvtq_s32_f32(Round); sign = vcvtq_f32_u32((vshrq_n_u32(vreinterpretq_u32_f32(ret2), 31))); PlusHalf = vaddq_f32(ret2, half); Round = vsubq_f32(PlusHalf, sign); toint_b = vcvtq_s32_f32(Round); intInputVal1 = vqmovn_s32(toint_a); intInputVal2 = vqmovn_s32(toint_b); res = vcombine_s16(intInputVal1, intInputVal2); vst1q_s16((int16_t*)outputVectorPtr, res); outputVectorPtr += 8; } for(i = neon_iters * 8; i < num_points * 2; i++) { aux = *inputVectorPtr++; if(aux > max_val_f) aux = max_val_f; else if(aux < min_val_f) aux = min_val_f; *outputVectorPtr++ = (int16_t)rintf(aux); } } #endif /* LV_HAVE_NEON */ #ifdef LV_HAVE_GENERIC static inline void volk_gnsssdr_32fc_convert_16ic_generic(lv_16sc_t* outputVector, const lv_32fc_t* inputVector, unsigned int num_points) { float* inputVectorPtr = (float*)inputVector; int16_t* outputVectorPtr = (int16_t*)outputVector; const float min_val = (float)SHRT_MIN; const float max_val = (float)SHRT_MAX; float aux; unsigned int i; for(i = 0; i < num_points * 2; i++) { aux = *inputVectorPtr++; if(aux > max_val) aux = max_val; else if(aux < min_val) aux = min_val; *outputVectorPtr++ = (int16_t)rintf(aux); } } #endif /* LV_HAVE_GENERIC */ #endif /* INCLUDED_volk_gnsssdr_32fc_convert_16ic_H */ volk_gnsssdr_32fc_convert_8ic.h000077500000000000000000000261751305042567700401120ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/*! * \file volk_gnsssdr_32fc_convert_8ic.h * \brief VOLK_GNSSSDR kernel: converts float32 complex values to 8 integer complex values taking care of overflow. * \authors
      *
    • Andres Cecilia, 2014. a.cecilia.luque(at)gmail.com *
    * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ /*! * \page volk_gnsssdr_32fc_convert_8ic * * \b Overview * * Converts a complex vector of 32-bits float each component into * a complex vector of 8-bits integer each component. * Values are saturated to the limit values of the output data type. * * Dispatcher Prototype * \code * void volk_gnsssdr_32fc_convert_8ic(lv_8sc_t* outputVector, const lv_32fc_t* inputVector, unsigned int num_points); * \endcode * * \b Inputs * \li inputVector: The complex 32-bit float input data buffer. * \li num_points: The number of data values to be converted. * * \b Outputs * \li outputVector: The complex 8-bit integer output data buffer. * */ #ifndef INCLUDED_volk_gnsssdr_32fc_convert_8ic_H #define INCLUDED_volk_gnsssdr_32fc_convert_8ic_H #include #include #include #include "volk_gnsssdr/volk_gnsssdr_complex.h" #ifdef LV_HAVE_GENERIC static inline void volk_gnsssdr_32fc_convert_8ic_generic(lv_8sc_t* outputVector, const lv_32fc_t* inputVector, unsigned int num_points) { float* inputVectorPtr = (float*)inputVector; int8_t* outputVectorPtr = (int8_t*)outputVector; const float min_val = (float)SCHAR_MIN; const float max_val = (float)SCHAR_MAX; float aux; unsigned int i; for(i = 0; i < num_points * 2; i++) { aux = *inputVectorPtr++ * max_val; if(aux > max_val) aux = max_val; else if(aux < min_val) aux = min_val; *outputVectorPtr++ = (int8_t)rintf(aux); } } #endif /* LV_HAVE_GENERIC */ #ifdef LV_HAVE_SSE2 #include static inline void volk_gnsssdr_32fc_convert_8ic_u_sse2(lv_8sc_t* outputVector, const lv_32fc_t* inputVector, unsigned int num_points) { const unsigned int sse_iters = num_points / 8; float* inputVectorPtr = (float*)inputVector; int8_t* outputVectorPtr = (int8_t*)outputVector; const float min_val = (float)SCHAR_MIN; const float max_val = (float)SCHAR_MAX; float aux; unsigned int i; __m128 inputVal1, inputVal2, inputVal3, inputVal4; __m128i intInputVal1, intInputVal2, intInputVal3, intInputVal4; __m128i int8InputVal; __m128 ret1, ret2, ret3, ret4; const __m128 vmin_val = _mm_set_ps1(min_val); const __m128 vmax_val = _mm_set_ps1(max_val); for(i = 0; i < sse_iters; i++) { inputVal1 = _mm_loadu_ps((float*)inputVectorPtr); inputVectorPtr += 4; inputVal2 = _mm_loadu_ps((float*)inputVectorPtr); inputVectorPtr += 4; inputVal3 = _mm_loadu_ps((float*)inputVectorPtr); inputVectorPtr += 4; inputVal4 = _mm_loadu_ps((float*)inputVectorPtr); inputVectorPtr += 4; inputVal1 = _mm_mul_ps(inputVal1, vmax_val); inputVal2 = _mm_mul_ps(inputVal2, vmax_val); inputVal3 = _mm_mul_ps(inputVal3, vmax_val); inputVal4 = _mm_mul_ps(inputVal4, vmax_val); // Clip ret1 = _mm_max_ps(_mm_min_ps(inputVal1, vmax_val), vmin_val); ret2 = _mm_max_ps(_mm_min_ps(inputVal2, vmax_val), vmin_val); ret3 = _mm_max_ps(_mm_min_ps(inputVal3, vmax_val), vmin_val); ret4 = _mm_max_ps(_mm_min_ps(inputVal4, vmax_val), vmin_val); intInputVal1 = _mm_cvtps_epi32(ret1); intInputVal2 = _mm_cvtps_epi32(ret2); intInputVal3 = _mm_cvtps_epi32(ret3); intInputVal4 = _mm_cvtps_epi32(ret4); intInputVal1 = _mm_packs_epi32(intInputVal1, intInputVal2); intInputVal2 = _mm_packs_epi32(intInputVal3, intInputVal4); int8InputVal = _mm_packs_epi16(intInputVal1, intInputVal2); _mm_storeu_si128((__m128i*)outputVectorPtr, int8InputVal); outputVectorPtr += 16; } for(i = sse_iters * 16; i < num_points * 2; i++) { aux = *inputVectorPtr++ * max_val; if(aux > max_val) aux = max_val; else if(aux < min_val) aux = min_val; *outputVectorPtr++ = (int8_t)rintf(aux); } } #endif /* LV_HAVE_SSE2 */ #ifdef LV_HAVE_SSE2 #include static inline void volk_gnsssdr_32fc_convert_8ic_a_sse2(lv_8sc_t* outputVector, const lv_32fc_t* inputVector, unsigned int num_points) { const unsigned int sse_iters = num_points / 8; float* inputVectorPtr = (float*)inputVector; int8_t* outputVectorPtr = (int8_t*)outputVector; const float min_val = (float)SCHAR_MIN; const float max_val = (float)SCHAR_MAX; float aux; unsigned int i; __m128 inputVal1, inputVal2, inputVal3, inputVal4; __m128i intInputVal1, intInputVal2, intInputVal3, intInputVal4; __m128i int8InputVal; __m128 ret1, ret2, ret3, ret4; const __m128 vmin_val = _mm_set_ps1(min_val); const __m128 vmax_val = _mm_set_ps1(max_val); for(i = 0; i < sse_iters; i++) { inputVal1 = _mm_load_ps((float*)inputVectorPtr); inputVectorPtr += 4; inputVal2 = _mm_load_ps((float*)inputVectorPtr); inputVectorPtr += 4; inputVal3 = _mm_load_ps((float*)inputVectorPtr); inputVectorPtr += 4; inputVal4 = _mm_load_ps((float*)inputVectorPtr); inputVectorPtr += 4; inputVal1 = _mm_mul_ps(inputVal1, vmax_val); inputVal2 = _mm_mul_ps(inputVal2, vmax_val); inputVal3 = _mm_mul_ps(inputVal3, vmax_val); inputVal4 = _mm_mul_ps(inputVal4, vmax_val); // Clip ret1 = _mm_max_ps(_mm_min_ps(inputVal1, vmax_val), vmin_val); ret2 = _mm_max_ps(_mm_min_ps(inputVal2, vmax_val), vmin_val); ret3 = _mm_max_ps(_mm_min_ps(inputVal3, vmax_val), vmin_val); ret4 = _mm_max_ps(_mm_min_ps(inputVal4, vmax_val), vmin_val); intInputVal1 = _mm_cvtps_epi32(ret1); intInputVal2 = _mm_cvtps_epi32(ret2); intInputVal3 = _mm_cvtps_epi32(ret3); intInputVal4 = _mm_cvtps_epi32(ret4); intInputVal1 = _mm_packs_epi32(intInputVal1, intInputVal2); intInputVal2 = _mm_packs_epi32(intInputVal3, intInputVal4); int8InputVal = _mm_packs_epi16(intInputVal1, intInputVal2); _mm_store_si128((__m128i*)outputVectorPtr, int8InputVal); outputVectorPtr += 16; } for(i = sse_iters * 16; i < num_points * 2; i++) { aux = *inputVectorPtr++ * max_val; if(aux > max_val) aux = max_val; else if(aux < min_val) aux = min_val; *outputVectorPtr++ = (int8_t)rintf(aux); } } #endif /* LV_HAVE_SSE2 */ #ifdef LV_HAVE_NEON #include static inline void volk_gnsssdr_32fc_convert_8ic_neon(lv_8sc_t* outputVector, const lv_32fc_t* inputVector, unsigned int num_points) { const unsigned int neon_iters = num_points / 8; float32_t* inputVectorPtr = (float32_t*)inputVector; int8_t* outputVectorPtr = (int8_t*)outputVector; const float32_t max_val_f = (float32_t)SCHAR_MAX; const float32_t min_val_f = (float32_t)SCHAR_MIN; float32_t aux; unsigned int i; const float32x4_t min_val = vmovq_n_f32(min_val_f); const float32x4_t max_val = vmovq_n_f32(max_val_f); const float32x4_t half = vdupq_n_f32(0.5f); float32x4_t sign, PlusHalf, Round, ret1, a; int32x4_t toint_a; int16x4_t intInputVal1, intInputVal2; int16x8_t pack16_8_1; int8x8_t res8_1, res8_2; int8x16_t outputVal; for(i = 0; i < neon_iters; i++) { a = vld1q_f32((const float32_t*)inputVectorPtr); inputVectorPtr += 4; a = vmulq_f32(a, max_val); ret1 = vmaxq_f32(vminq_f32(a, max_val), min_val); sign = vcvtq_f32_u32((vshrq_n_u32(vreinterpretq_u32_f32(ret1), 31))); PlusHalf = vaddq_f32(ret1, half); Round = vsubq_f32(PlusHalf, sign); toint_a = vcvtq_s32_f32(Round); intInputVal1 = vqmovn_s32(toint_a); a = vld1q_f32((const float32_t*)inputVectorPtr); inputVectorPtr += 4; a = vmulq_f32(a, max_val); ret1 = vmaxq_f32(vminq_f32(a, max_val), min_val); sign = vcvtq_f32_u32((vshrq_n_u32(vreinterpretq_u32_f32(ret1), 31))); PlusHalf = vaddq_f32(ret1, half); Round = vsubq_f32(PlusHalf, sign); toint_a = vcvtq_s32_f32(Round); intInputVal2 = vqmovn_s32(toint_a); pack16_8_1 = vcombine_s16(intInputVal1, intInputVal2); res8_1 = vqmovn_s16(pack16_8_1); a = vld1q_f32((const float32_t*)inputVectorPtr); inputVectorPtr += 4; a = vmulq_f32(a, max_val); ret1 = vmaxq_f32(vminq_f32(a, max_val), min_val); sign = vcvtq_f32_u32((vshrq_n_u32(vreinterpretq_u32_f32(ret1), 31))); PlusHalf = vaddq_f32(ret1, half); Round = vsubq_f32(PlusHalf, sign); toint_a = vcvtq_s32_f32(Round); intInputVal1 = vqmovn_s32(toint_a); a = vld1q_f32((const float32_t*)inputVectorPtr); inputVectorPtr += 4; a = vmulq_f32(a, max_val); ret1 = vmaxq_f32(vminq_f32(a, max_val), min_val); sign = vcvtq_f32_u32((vshrq_n_u32(vreinterpretq_u32_f32(ret1), 31))); PlusHalf = vaddq_f32(ret1, half); Round = vsubq_f32(PlusHalf, sign); toint_a = vcvtq_s32_f32(Round); intInputVal2 = vqmovn_s32(toint_a); pack16_8_1 = vcombine_s16(intInputVal1, intInputVal2); res8_2 = vqmovn_s16(pack16_8_1); outputVal = vcombine_s8(res8_1, res8_2); vst1q_s8((int8_t*)outputVectorPtr, outputVal); outputVectorPtr += 16; } for(i = neon_iters * 16; i < num_points * 2; i++) { aux = *inputVectorPtr++ * max_val_f; if(aux > max_val_f) aux = max_val_f; else if(aux < min_val_f) aux = min_val_f; *outputVectorPtr++ = (int8_t)rintf(aux); } } #endif /* LV_HAVE_NEON */ #endif /* INCLUDED_volk_gnsssdr_32fc_convert_8ic_H */ volk_gnsssdr_32fc_resamplerxnpuppet_32fc.h000066400000000000000000000244531305042567700422740ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/*! * \file volk_gnsssdr_32fc_resamplerxnpuppet_32fc.h * \brief VOLK_GNSSSDR puppet for the multiple 16-bit complex vector resampler kernel. * \authors
      *
    • Carles Fernandez Prades 2016 cfernandez at cttc dot cat *
    * * VOLK_GNSSSDR puppet for integrating the multiple resampler into the test system * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 INCLUDED_volk_gnsssdr_32fc_resamplerxnpuppet_32fc_H #define INCLUDED_volk_gnsssdr_32fc_resamplerxnpuppet_32fc_H #include "volk_gnsssdr/volk_gnsssdr_32fc_xn_resampler_32fc_xn.h" #include #include #include #include #ifdef LV_HAVE_GENERIC static inline void volk_gnsssdr_32fc_resamplerxnpuppet_32fc_generic(lv_32fc_t* result, const lv_32fc_t* local_code, unsigned int num_points) { float code_phase_step_chips = -0.6; int code_length_chips = 1023; int num_out_vectors = 3; float rem_code_phase_chips = -0.234; unsigned int n; float shifts_chips[3] = { -0.1, 0.0, 0.1 }; lv_32fc_t** result_aux = (lv_32fc_t**)volk_gnsssdr_malloc(sizeof(lv_32fc_t*) * num_out_vectors, volk_gnsssdr_get_alignment()); for(n = 0; n < num_out_vectors; n++) { result_aux[n] = (lv_32fc_t*)volk_gnsssdr_malloc(sizeof(lv_32fc_t) * num_points, volk_gnsssdr_get_alignment()); } volk_gnsssdr_32fc_xn_resampler_32fc_xn_generic(result_aux, local_code, rem_code_phase_chips, code_phase_step_chips, shifts_chips, code_length_chips, num_out_vectors, num_points); memcpy((lv_32fc_t*)result, (lv_32fc_t*)result_aux[0], sizeof(lv_32fc_t) * num_points); for(n = 0; n < num_out_vectors; n++) { volk_gnsssdr_free(result_aux[n]); } volk_gnsssdr_free(result_aux); } #endif /* LV_HAVE_GENERIC */ #ifdef LV_HAVE_SSE3 static inline void volk_gnsssdr_32fc_resamplerxnpuppet_32fc_a_sse3(lv_32fc_t* result, const lv_32fc_t* local_code, unsigned int num_points) { float code_phase_step_chips = -0.6; int code_length_chips = 1023; int num_out_vectors = 3; float rem_code_phase_chips = -0.234; unsigned int n; float shifts_chips[3] = { -0.1, 0.0, 0.1 }; lv_32fc_t** result_aux = (lv_32fc_t**)volk_gnsssdr_malloc(sizeof(lv_32fc_t*) * num_out_vectors, volk_gnsssdr_get_alignment()); for(n = 0; n < num_out_vectors; n++) { result_aux[n] = (lv_32fc_t*)volk_gnsssdr_malloc(sizeof(lv_32fc_t) * num_points, volk_gnsssdr_get_alignment()); } volk_gnsssdr_32fc_xn_resampler_32fc_xn_a_sse3(result_aux, local_code, rem_code_phase_chips, code_phase_step_chips, shifts_chips, code_length_chips, num_out_vectors, num_points); memcpy((lv_32fc_t*)result, (lv_32fc_t*)result_aux[0], sizeof(lv_32fc_t) * num_points); for(n = 0; n < num_out_vectors; n++) { volk_gnsssdr_free(result_aux[n]); } volk_gnsssdr_free(result_aux); } #endif #ifdef LV_HAVE_SSE3 static inline void volk_gnsssdr_32fc_resamplerxnpuppet_32fc_u_sse3(lv_32fc_t* result, const lv_32fc_t* local_code, unsigned int num_points) { float code_phase_step_chips = -0.6; int code_length_chips = 1023; int num_out_vectors = 3; float rem_code_phase_chips = -0.234; unsigned int n; float shifts_chips[3] = { -0.1, 0.0, 0.1 }; lv_32fc_t** result_aux = (lv_32fc_t**)volk_gnsssdr_malloc(sizeof(lv_32fc_t*) * num_out_vectors, volk_gnsssdr_get_alignment()); for(n = 0; n < num_out_vectors; n++) { result_aux[n] = (lv_32fc_t*)volk_gnsssdr_malloc(sizeof(lv_32fc_t) * num_points, volk_gnsssdr_get_alignment()); } volk_gnsssdr_32fc_xn_resampler_32fc_xn_u_sse3(result_aux, local_code, rem_code_phase_chips, code_phase_step_chips, shifts_chips, code_length_chips, num_out_vectors, num_points); memcpy((lv_32fc_t*)result, (lv_32fc_t*)result_aux[0], sizeof(lv_32fc_t) * num_points); for(n = 0; n < num_out_vectors; n++) { volk_gnsssdr_free(result_aux[n]); } volk_gnsssdr_free(result_aux); } #endif #ifdef LV_HAVE_SSE4_1 static inline void volk_gnsssdr_32fc_resamplerxnpuppet_32fc_u_sse4_1(lv_32fc_t* result, const lv_32fc_t* local_code, unsigned int num_points) { float code_phase_step_chips = -0.6; int code_length_chips = 1023; int num_out_vectors = 3; float rem_code_phase_chips = -0.234; unsigned int n; float shifts_chips[3] = { -0.1, 0.0, 0.1 }; lv_32fc_t** result_aux = (lv_32fc_t**)volk_gnsssdr_malloc(sizeof(lv_32fc_t*) * num_out_vectors, volk_gnsssdr_get_alignment()); for(n = 0; n < num_out_vectors; n++) { result_aux[n] = (lv_32fc_t*)volk_gnsssdr_malloc(sizeof(lv_32fc_t) * num_points, volk_gnsssdr_get_alignment()); } volk_gnsssdr_32fc_xn_resampler_32fc_xn_u_sse4_1(result_aux, local_code, rem_code_phase_chips, code_phase_step_chips, shifts_chips, code_length_chips, num_out_vectors, num_points); memcpy((lv_32fc_t*)result, (lv_32fc_t*)result_aux[0], sizeof(lv_32fc_t) * num_points); for(n = 0; n < num_out_vectors; n++) { volk_gnsssdr_free(result_aux[n]); } volk_gnsssdr_free(result_aux); } #endif #ifdef LV_HAVE_SSE4_1 static inline void volk_gnsssdr_32fc_resamplerxnpuppet_32fc_a_sse4_1(lv_32fc_t* result, const lv_32fc_t* local_code, unsigned int num_points) { float code_phase_step_chips = -0.6; int code_length_chips = 1023; int num_out_vectors = 3; float rem_code_phase_chips = -0.234; unsigned int n; float shifts_chips[3] = { -0.1, 0.0, 0.1 }; lv_32fc_t** result_aux = (lv_32fc_t**)volk_gnsssdr_malloc(sizeof(lv_32fc_t*) * num_out_vectors, volk_gnsssdr_get_alignment()); for(n = 0; n < num_out_vectors; n++) { result_aux[n] = (lv_32fc_t*)volk_gnsssdr_malloc(sizeof(lv_32fc_t) * num_points, volk_gnsssdr_get_alignment()); } volk_gnsssdr_32fc_xn_resampler_32fc_xn_a_sse4_1(result_aux, local_code, rem_code_phase_chips, code_phase_step_chips, shifts_chips, code_length_chips, num_out_vectors, num_points); memcpy((lv_32fc_t*)result, (lv_32fc_t*)result_aux[0], sizeof(lv_32fc_t) * num_points); for(n = 0; n < num_out_vectors; n++) { volk_gnsssdr_free(result_aux[n]); } volk_gnsssdr_free(result_aux); } #endif #ifdef LV_HAVE_AVX static inline void volk_gnsssdr_32fc_resamplerxnpuppet_32fc_a_avx(lv_32fc_t* result, const lv_32fc_t* local_code, unsigned int num_points) { float code_phase_step_chips = -0.6; int code_length_chips = 1023; int num_out_vectors = 3; float rem_code_phase_chips = -0.234; unsigned int n; float shifts_chips[3] = { -0.1, 0.0, 0.1 }; lv_32fc_t** result_aux = (lv_32fc_t**)volk_gnsssdr_malloc(sizeof(lv_32fc_t*) * num_out_vectors, volk_gnsssdr_get_alignment()); for(n = 0; n < num_out_vectors; n++) { result_aux[n] = (lv_32fc_t*)volk_gnsssdr_malloc(sizeof(lv_32fc_t) * num_points, volk_gnsssdr_get_alignment()); } volk_gnsssdr_32fc_xn_resampler_32fc_xn_a_avx(result_aux, local_code, rem_code_phase_chips, code_phase_step_chips, shifts_chips, code_length_chips, num_out_vectors, num_points); memcpy((lv_32fc_t*)result, (lv_32fc_t*)result_aux[0], sizeof(lv_32fc_t) * num_points); for(n = 0; n < num_out_vectors; n++) { volk_gnsssdr_free(result_aux[n]); } volk_gnsssdr_free(result_aux); } #endif #ifdef LV_HAVE_AVX static inline void volk_gnsssdr_32fc_resamplerxnpuppet_32fc_u_avx(lv_32fc_t* result, const lv_32fc_t* local_code, unsigned int num_points) { float code_phase_step_chips = -0.6; int code_length_chips = 1023; int num_out_vectors = 3; float rem_code_phase_chips = -0.234; unsigned int n; float shifts_chips[3] = { -0.1, 0.0, 0.1 }; lv_32fc_t** result_aux = (lv_32fc_t**)volk_gnsssdr_malloc(sizeof(lv_32fc_t*) * num_out_vectors, volk_gnsssdr_get_alignment()); for(n = 0; n < num_out_vectors; n++) { result_aux[n] = (lv_32fc_t*)volk_gnsssdr_malloc(sizeof(lv_32fc_t) * num_points, volk_gnsssdr_get_alignment()); } volk_gnsssdr_32fc_xn_resampler_32fc_xn_u_avx(result_aux, local_code, rem_code_phase_chips, code_phase_step_chips, shifts_chips, code_length_chips, num_out_vectors, num_points); memcpy((lv_32fc_t*)result, (lv_32fc_t*)result_aux[0], sizeof(lv_32fc_t) * num_points); for(n = 0; n < num_out_vectors; n++) { volk_gnsssdr_free(result_aux[n]); } volk_gnsssdr_free(result_aux); } #endif #ifdef LV_HAVE_NEON static inline void volk_gnsssdr_32fc_resamplerxnpuppet_32fc_neon(lv_32fc_t* result, const lv_32fc_t* local_code, unsigned int num_points) { float code_phase_step_chips = -0.6; int code_length_chips = 1023; int num_out_vectors = 3; float rem_code_phase_chips = -0.234; unsigned int n; float shifts_chips[3] = { -0.1, 0.0, 0.1 }; lv_32fc_t** result_aux = (lv_32fc_t**)volk_gnsssdr_malloc(sizeof(lv_32fc_t*) * num_out_vectors, volk_gnsssdr_get_alignment()); for(n = 0; n < num_out_vectors; n++) { result_aux[n] = (lv_32fc_t*)volk_gnsssdr_malloc(sizeof(lv_32fc_t) * num_points, volk_gnsssdr_get_alignment()); } volk_gnsssdr_32fc_xn_resampler_32fc_xn_neon(result_aux, local_code, rem_code_phase_chips, code_phase_step_chips, shifts_chips, code_length_chips, num_out_vectors, num_points); memcpy((lv_32fc_t*)result, (lv_32fc_t*)result_aux[0], sizeof(lv_32fc_t) * num_points); for(n = 0; n < num_out_vectors; n++) { volk_gnsssdr_free(result_aux[n]); } volk_gnsssdr_free(result_aux); } #endif #endif // INCLUDED_volk_gnsssdr_32fc_resamplerpuppet_32fc_H volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn.h000066400000000000000000000775021305042567700432030ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/*! * \file volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn.h * \brief VOLK_GNSSSDR kernel: multiplies N complex (32-bit float per component) vectors * by a common vector, phase rotated and accumulates the results in N float complex outputs. * \authors
      *
    • Carles Fernandez-Prades, 2016. cfernandez(at)cttc.es *
    * * VOLK_GNSSSDR kernel that multiplies N 32 bits complex vectors by a common vector, which is * phase-rotated by phase offset and phase increment, and accumulates the results * in N 32 bits float complex outputs. * It is optimized to perform the N tap correlation process in GNSS receivers. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ /*! * \page volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn * * \b Overview * * Rotates and multiplies the reference complex vector with an arbitrary number of other complex vectors, * accumulates the results and stores them in the output vector. * The rotation is done at a fixed rate per sample, from an initial \p phase offset. * This function can be used for Doppler wipe-off and multiple correlator. * * Dispatcher Prototype * \code * void volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn(lv_32fc_t* result, const lv_32fc_t* in_common, const lv_32fc_t phase_inc, lv_32fc_t* phase, const lv_32fc_t** in_a, int num_a_vectors, unsigned int num_points); * \endcode * * \b Inputs * \li in_common: Pointer to one of the vectors to be rotated, multiplied and accumulated (reference vector). * \li phase_inc: Phase increment = lv_cmake(cos(phase_step_rad), sin(phase_step_rad)) * \li phase: Initial phase = lv_cmake(cos(initial_phase_rad), sin(initial_phase_rad)) * \li in_a: Pointer to an array of pointers to multiple vectors to be multiplied and accumulated. * \li num_a_vectors: Number of vectors to be multiplied by the reference vector and accumulated. * \li num_points: Number of complex values to be multiplied together, accumulated and stored into \p result. * * \b Outputs * \li phase: Final phase. * \li result: Vector of \p num_a_vectors components with the multiple vectors of \p in_a rotated, multiplied by \p in_common and accumulated. * */ #ifndef INCLUDED_volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn_H #define INCLUDED_volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn_H #include #include #include #include #include #include #ifdef LV_HAVE_GENERIC static inline void volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn_generic(lv_32fc_t* result, const lv_32fc_t* in_common, const lv_32fc_t phase_inc, lv_32fc_t* phase, const lv_32fc_t** in_a, int num_a_vectors, unsigned int num_points) { lv_32fc_t tmp32_1, tmp32_2; int n_vec; unsigned int n; for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { result[n_vec] = lv_cmake(0,0); } for (n = 0; n < num_points; n++) { tmp32_1 = *in_common++ * (*phase);//if(n<10 || n >= 8108) printf("generic phase %i: %f,%f\n", n,lv_creal(*phase),lv_cimag(*phase)); // Regenerate phase if (n % 256 == 0) { //printf("Phase before regeneration %i: %f,%f Modulus: %f\n", n,lv_creal(*phase),lv_cimag(*phase), cabsf(*phase)); #ifdef __cplusplus (*phase) /= std::abs((*phase)); #else (*phase) /= hypotf(lv_creal(*phase), lv_cimag(*phase)); #endif //printf("Phase after regeneration %i: %f,%f Modulus: %f\n", n,lv_creal(*phase),lv_cimag(*phase), cabsf(*phase)); } (*phase) *= phase_inc; for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { tmp32_2 = tmp32_1 * in_a[n_vec][n]; result[n_vec] += tmp32_2; } } } #endif /*LV_HAVE_GENERIC*/ #ifdef LV_HAVE_GENERIC static inline void volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn_generic_reload(lv_32fc_t* result, const lv_32fc_t* in_common, const lv_32fc_t phase_inc, lv_32fc_t* phase, const lv_32fc_t** in_a, int num_a_vectors, unsigned int num_points) { lv_32fc_t tmp32_1, tmp32_2; const unsigned int ROTATOR_RELOAD = 256; int n_vec; unsigned int n; unsigned int j; for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { result[n_vec] = lv_cmake(0,0); } for (n = 0; n < num_points / ROTATOR_RELOAD; n++) { for (j = 0; j < ROTATOR_RELOAD; j++) { tmp32_1 = *in_common++ * (*phase); (*phase) *= phase_inc; for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { tmp32_2 = tmp32_1 * in_a[n_vec][n * ROTATOR_RELOAD + j]; result[n_vec] += tmp32_2; } } /* Regenerate phase */ #ifdef __cplusplus (*phase) /= std::abs((*phase)); #else //(*phase) /= cabsf((*phase)); (*phase) /= hypotf(lv_creal(*phase), lv_cimag(*phase)); #endif } for (j = 0; j < num_points % ROTATOR_RELOAD; j++) { tmp32_1 = *in_common++ * (*phase); (*phase) *= phase_inc; for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { tmp32_2 = tmp32_1 * in_a[n_vec][(num_points / ROTATOR_RELOAD) * ROTATOR_RELOAD + j]; result[n_vec] += tmp32_2; } } } #endif /*LV_HAVE_GENERIC*/ #ifdef LV_HAVE_SSE3 #include static inline void volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn_u_sse3(lv_32fc_t* result, const lv_32fc_t* in_common, const lv_32fc_t phase_inc, lv_32fc_t* phase, const lv_32fc_t** in_a, int num_a_vectors, unsigned int num_points) { lv_32fc_t dotProduct = lv_cmake(0,0); lv_32fc_t tmp32_1, tmp32_2; const unsigned int sse_iters = num_points / 2; int n_vec; int i; unsigned int number; unsigned int n; const lv_32fc_t** _in_a = in_a; const lv_32fc_t* _in_common = in_common; __VOLK_ATTR_ALIGNED(16) lv_32fc_t dotProductVector[2]; __m128* acc = (__m128*)volk_gnsssdr_malloc(num_a_vectors * sizeof(__m128), volk_gnsssdr_get_alignment()); for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { acc[n_vec] = _mm_setzero_ps(); } // phase rotation registers __m128 a, two_phase_acc_reg, two_phase_inc_reg, yl, yh, tmp1, tmp1p, tmp2, tmp2p, z1; __VOLK_ATTR_ALIGNED(16) lv_32fc_t two_phase_inc[2]; two_phase_inc[0] = phase_inc * phase_inc; two_phase_inc[1] = phase_inc * phase_inc; two_phase_inc_reg = _mm_load_ps((float*) two_phase_inc); __VOLK_ATTR_ALIGNED(16) lv_32fc_t two_phase_acc[2]; two_phase_acc[0] = (*phase); two_phase_acc[1] = (*phase) * phase_inc; two_phase_acc_reg = _mm_load_ps((float*)two_phase_acc); const __m128 ylp = _mm_moveldup_ps(two_phase_inc_reg); const __m128 yhp = _mm_movehdup_ps(two_phase_inc_reg); for(number = 0; number < sse_iters; number++) { // Phase rotation on operand in_common starts here: a = _mm_loadu_ps((float*)_in_common); // __VOLK_GNSSSDR_PREFETCH(_in_common + 4); yl = _mm_moveldup_ps(two_phase_acc_reg); // Load yl with cr,cr,dr,dr yh = _mm_movehdup_ps(two_phase_acc_reg); tmp1 = _mm_mul_ps(a, yl); tmp1p = _mm_mul_ps(two_phase_acc_reg, ylp); a = _mm_shuffle_ps(a, a, 0xB1); two_phase_acc_reg = _mm_shuffle_ps(two_phase_acc_reg, two_phase_acc_reg, 0xB1); tmp2 = _mm_mul_ps(a, yh); tmp2p = _mm_mul_ps(two_phase_acc_reg, yhp); z1 = _mm_addsub_ps(tmp1, tmp2); two_phase_acc_reg = _mm_addsub_ps(tmp1p, tmp2p); yl = _mm_moveldup_ps(z1); // Load yl with cr,cr,dr,dr yh = _mm_movehdup_ps(z1); //next two samples _in_common += 2; for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { a = _mm_loadu_ps((float*)&(_in_a[n_vec][number*2])); tmp1 = _mm_mul_ps(a, yl); a = _mm_shuffle_ps(a, a, 0xB1); tmp2 = _mm_mul_ps(a, yh); z1 = _mm_addsub_ps(tmp1, tmp2); acc[n_vec] = _mm_add_ps(acc[n_vec], z1); } // Regenerate phase if ((number % 128) == 0) { tmp1 = _mm_mul_ps(two_phase_acc_reg, two_phase_acc_reg); tmp2 = _mm_hadd_ps(tmp1, tmp1); tmp1 = _mm_shuffle_ps(tmp2, tmp2, 0xD8); tmp2 = _mm_sqrt_ps(tmp1); two_phase_acc_reg = _mm_div_ps(two_phase_acc_reg, tmp2); } } for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { _mm_store_ps((float*)dotProductVector, acc[n_vec]); // Store the results back into the dot product vector dotProduct = lv_cmake(0,0); for (i = 0; i < 2; ++i) { dotProduct = dotProduct + dotProductVector[i]; } result[n_vec] = dotProduct; } volk_gnsssdr_free(acc); _mm_store_ps((float*)two_phase_acc, two_phase_acc_reg); (*phase) = two_phase_acc[0]; for(n = sse_iters * 2; n < num_points; n++) { tmp32_1 = in_common[n] * (*phase); (*phase) *= phase_inc; for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { tmp32_2 = tmp32_1 * in_a[n_vec][n]; result[n_vec] += tmp32_2; } } } #endif /* LV_HAVE_SSE3 */ #ifdef LV_HAVE_SSE3 #include static inline void volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn_a_sse3(lv_32fc_t* result, const lv_32fc_t* in_common, const lv_32fc_t phase_inc, lv_32fc_t* phase, const lv_32fc_t** in_a, int num_a_vectors, unsigned int num_points) { lv_32fc_t dotProduct = lv_cmake(0,0); lv_32fc_t tmp32_1, tmp32_2; const unsigned int sse_iters = num_points / 2; int n_vec; int i; unsigned int n; unsigned int number; const lv_32fc_t** _in_a = in_a; const lv_32fc_t* _in_common = in_common; __VOLK_ATTR_ALIGNED(16) lv_32fc_t dotProductVector[2]; __m128* acc = (__m128*)volk_gnsssdr_malloc(num_a_vectors * sizeof(__m128), volk_gnsssdr_get_alignment()); for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { acc[n_vec] = _mm_setzero_ps(); } // phase rotation registers __m128 a, two_phase_acc_reg, two_phase_inc_reg, yl, yh, tmp1, tmp1p, tmp2, tmp2p, z1; __VOLK_ATTR_ALIGNED(16) lv_32fc_t two_phase_inc[2]; two_phase_inc[0] = phase_inc * phase_inc; two_phase_inc[1] = phase_inc * phase_inc; two_phase_inc_reg = _mm_load_ps((float*) two_phase_inc); __VOLK_ATTR_ALIGNED(16) lv_32fc_t two_phase_acc[2]; two_phase_acc[0] = (*phase); two_phase_acc[1] = (*phase) * phase_inc; two_phase_acc_reg = _mm_load_ps((float*)two_phase_acc); const __m128 ylp = _mm_moveldup_ps(two_phase_inc_reg); const __m128 yhp = _mm_movehdup_ps(two_phase_inc_reg); for(number = 0; number < sse_iters; number++) { // Phase rotation on operand in_common starts here: a = _mm_load_ps((float*)_in_common); // __VOLK_GNSSSDR_PREFETCH(_in_common + 4); yl = _mm_moveldup_ps(two_phase_acc_reg); // Load yl with cr,cr,dr,dr yh = _mm_movehdup_ps(two_phase_acc_reg); tmp1 = _mm_mul_ps(a, yl); tmp1p = _mm_mul_ps(two_phase_acc_reg, ylp); a = _mm_shuffle_ps(a, a, 0xB1); two_phase_acc_reg = _mm_shuffle_ps(two_phase_acc_reg, two_phase_acc_reg, 0xB1); tmp2 = _mm_mul_ps(a, yh); tmp2p = _mm_mul_ps(two_phase_acc_reg, yhp); z1 = _mm_addsub_ps(tmp1, tmp2); two_phase_acc_reg = _mm_addsub_ps(tmp1p, tmp2p); yl = _mm_moveldup_ps(z1); // Load yl with cr,cr,dr,dr yh = _mm_movehdup_ps(z1); //next two samples _in_common += 2; for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { a = _mm_load_ps((float*)&(_in_a[n_vec][number*2])); tmp1 = _mm_mul_ps(a, yl); a = _mm_shuffle_ps(a, a, 0xB1); tmp2 = _mm_mul_ps(a, yh); z1 = _mm_addsub_ps(tmp1, tmp2); acc[n_vec] = _mm_add_ps(acc[n_vec], z1); } // Regenerate phase if ((number % 128) == 0) { tmp1 = _mm_mul_ps(two_phase_acc_reg, two_phase_acc_reg); tmp2 = _mm_hadd_ps(tmp1, tmp1); tmp1 = _mm_shuffle_ps(tmp2, tmp2, 0xD8); tmp2 = _mm_sqrt_ps(tmp1); two_phase_acc_reg = _mm_div_ps(two_phase_acc_reg, tmp2); } } for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { _mm_store_ps((float*)dotProductVector, acc[n_vec]); // Store the results back into the dot product vector dotProduct = lv_cmake(0,0); for (i = 0; i < 2; ++i) { dotProduct = dotProduct + dotProductVector[i]; } result[n_vec] = dotProduct; } volk_gnsssdr_free(acc); _mm_store_ps((float*)two_phase_acc, two_phase_acc_reg); (*phase) = two_phase_acc[0]; for(n = sse_iters * 2; n < num_points; n++) { tmp32_1 = in_common[n] * (*phase); (*phase) *= phase_inc; for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { tmp32_2 = tmp32_1 * in_a[n_vec][n]; result[n_vec] += tmp32_2; } } } #endif /* LV_HAVE_SSE3 */ #ifdef LV_HAVE_AVX #include static inline void volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn_u_avx(lv_32fc_t* result, const lv_32fc_t* in_common, const lv_32fc_t phase_inc, lv_32fc_t* phase, const lv_32fc_t** in_a, int num_a_vectors, unsigned int num_points) { lv_32fc_t dotProduct = lv_cmake(0,0); lv_32fc_t tmp32_1, tmp32_2; const unsigned int avx_iters = num_points / 4; int n_vec; int i; unsigned int number; unsigned int n; const lv_32fc_t** _in_a = in_a; const lv_32fc_t* _in_common = in_common; lv_32fc_t _phase = (*phase); __VOLK_ATTR_ALIGNED(32) lv_32fc_t dotProductVector[4]; __m256* acc = (__m256*)volk_gnsssdr_malloc(num_a_vectors * sizeof(__m256), volk_gnsssdr_get_alignment()); for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { acc[n_vec] = _mm256_setzero_ps(); result[n_vec] = lv_cmake(0, 0); } // phase rotation registers __m256 a, four_phase_acc_reg, yl, yh, tmp1, tmp1p, tmp2, tmp2p, z; __attribute__((aligned(32))) lv_32fc_t four_phase_inc[4]; const lv_32fc_t phase_inc2 = phase_inc * phase_inc; const lv_32fc_t phase_inc3 = phase_inc2 * phase_inc; const lv_32fc_t phase_inc4 = phase_inc3 * phase_inc; four_phase_inc[0] = phase_inc4; four_phase_inc[1] = phase_inc4; four_phase_inc[2] = phase_inc4; four_phase_inc[3] = phase_inc4; const __m256 four_phase_inc_reg = _mm256_load_ps((float*)four_phase_inc); __attribute__((aligned(32))) lv_32fc_t four_phase_acc[4]; four_phase_acc[0] = _phase; four_phase_acc[1] = _phase * phase_inc; four_phase_acc[2] = _phase * phase_inc2; four_phase_acc[3] = _phase * phase_inc3; four_phase_acc_reg = _mm256_load_ps((float*)four_phase_acc); const __m256 ylp = _mm256_moveldup_ps(four_phase_inc_reg); const __m256 yhp = _mm256_movehdup_ps(four_phase_inc_reg); for(number = 0; number < avx_iters; number++) { // Phase rotation on operand in_common starts here: a = _mm256_loadu_ps((float*)_in_common); __VOLK_GNSSSDR_PREFETCH(_in_common + 16); yl = _mm256_moveldup_ps(four_phase_acc_reg); // Load yl with cr,cr,dr,dr yh = _mm256_movehdup_ps(four_phase_acc_reg); tmp1 = _mm256_mul_ps(a, yl); tmp1p = _mm256_mul_ps(four_phase_acc_reg, ylp); a = _mm256_shuffle_ps(a, a, 0xB1); four_phase_acc_reg = _mm256_shuffle_ps(four_phase_acc_reg, four_phase_acc_reg, 0xB1); tmp2 = _mm256_mul_ps(a, yh); tmp2p = _mm256_mul_ps(four_phase_acc_reg, yhp); z = _mm256_addsub_ps(tmp1, tmp2); four_phase_acc_reg = _mm256_addsub_ps(tmp1p, tmp2p); yl = _mm256_moveldup_ps(z); // Load yl with cr,cr,dr,dr yh = _mm256_movehdup_ps(z); //next two samples _in_common += 4; for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { a = _mm256_loadu_ps((float*)&(_in_a[n_vec][number * 4])); tmp1 = _mm256_mul_ps(a, yl); a = _mm256_shuffle_ps(a, a, 0xB1); tmp2 = _mm256_mul_ps(a, yh); z = _mm256_addsub_ps(tmp1, tmp2); acc[n_vec] = _mm256_add_ps(acc[n_vec], z); } // Regenerate phase if ((number % 128) == 0) { tmp1 = _mm256_mul_ps(four_phase_acc_reg, four_phase_acc_reg); tmp2 = _mm256_hadd_ps(tmp1, tmp1); tmp1 = _mm256_shuffle_ps(tmp2, tmp2, 0xD8); tmp2 = _mm256_sqrt_ps(tmp1); four_phase_acc_reg = _mm256_div_ps(four_phase_acc_reg, tmp2); } } for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { _mm256_store_ps((float*)dotProductVector, acc[n_vec]); // Store the results back into the dot product vector dotProduct = lv_cmake(0,0); for (i = 0; i < 4; ++i) { dotProduct = dotProduct + dotProductVector[i]; } result[n_vec] = dotProduct; } volk_gnsssdr_free(acc); tmp1 = _mm256_mul_ps(four_phase_acc_reg, four_phase_acc_reg); tmp2 = _mm256_hadd_ps(tmp1, tmp1); tmp1 = _mm256_shuffle_ps(tmp2, tmp2, 0xD8); tmp2 = _mm256_sqrt_ps(tmp1); four_phase_acc_reg = _mm256_div_ps(four_phase_acc_reg, tmp2); _mm256_store_ps((float*)four_phase_acc, four_phase_acc_reg); _phase = four_phase_acc[0]; _mm256_zeroupper(); for(n = avx_iters * 4; n < num_points; n++) { tmp32_1 = *_in_common++ * _phase; _phase *= phase_inc; for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { tmp32_2 = tmp32_1 * _in_a[n_vec][n]; result[n_vec] += tmp32_2; } } (*phase) = _phase; } #endif /* LV_HAVE_AVX */ #ifdef LV_HAVE_AVX #include static inline void volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn_a_avx(lv_32fc_t* result, const lv_32fc_t* in_common, const lv_32fc_t phase_inc, lv_32fc_t* phase, const lv_32fc_t** in_a, int num_a_vectors, unsigned int num_points) { lv_32fc_t dotProduct = lv_cmake(0,0); lv_32fc_t tmp32_1, tmp32_2; const unsigned int avx_iters = num_points / 4; int n_vec; int i; unsigned int number; unsigned int n; const lv_32fc_t** _in_a = in_a; const lv_32fc_t* _in_common = in_common; lv_32fc_t _phase = (*phase); __VOLK_ATTR_ALIGNED(32) lv_32fc_t dotProductVector[4]; __m256* acc = (__m256*)volk_gnsssdr_malloc(num_a_vectors * sizeof(__m256), volk_gnsssdr_get_alignment()); for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { acc[n_vec] = _mm256_setzero_ps(); result[n_vec] = lv_cmake(0, 0); } // phase rotation registers __m256 a, four_phase_acc_reg, yl, yh, tmp1, tmp1p, tmp2, tmp2p, z; __VOLK_ATTR_ALIGNED(32) lv_32fc_t four_phase_inc[4]; const lv_32fc_t phase_inc2 = phase_inc * phase_inc; const lv_32fc_t phase_inc3 = phase_inc2 * phase_inc; const lv_32fc_t phase_inc4 = phase_inc3 * phase_inc; four_phase_inc[0] = phase_inc4; four_phase_inc[1] = phase_inc4; four_phase_inc[2] = phase_inc4; four_phase_inc[3] = phase_inc4; const __m256 four_phase_inc_reg = _mm256_load_ps((float*)four_phase_inc); __VOLK_ATTR_ALIGNED(32) lv_32fc_t four_phase_acc[4]; four_phase_acc[0] = _phase; four_phase_acc[1] = _phase * phase_inc; four_phase_acc[2] = _phase * phase_inc2; four_phase_acc[3] = _phase * phase_inc3; four_phase_acc_reg = _mm256_load_ps((float*)four_phase_acc); const __m256 ylp = _mm256_moveldup_ps(four_phase_inc_reg); const __m256 yhp = _mm256_movehdup_ps(four_phase_inc_reg); for(number = 0; number < avx_iters; number++) { // Phase rotation on operand in_common starts here: a = _mm256_load_ps((float*)_in_common); __VOLK_GNSSSDR_PREFETCH(_in_common + 16); yl = _mm256_moveldup_ps(four_phase_acc_reg); // Load yl with cr,cr,dr,dr yh = _mm256_movehdup_ps(four_phase_acc_reg); tmp1 = _mm256_mul_ps(a, yl); tmp1p = _mm256_mul_ps(four_phase_acc_reg, ylp); a = _mm256_shuffle_ps(a, a, 0xB1); four_phase_acc_reg = _mm256_shuffle_ps(four_phase_acc_reg, four_phase_acc_reg, 0xB1); tmp2 = _mm256_mul_ps(a, yh); tmp2p = _mm256_mul_ps(four_phase_acc_reg, yhp); z = _mm256_addsub_ps(tmp1, tmp2); four_phase_acc_reg = _mm256_addsub_ps(tmp1p, tmp2p); yl = _mm256_moveldup_ps(z); // Load yl with cr,cr,dr,dr yh = _mm256_movehdup_ps(z); //next two samples _in_common += 4; for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { a = _mm256_load_ps((float*)&(_in_a[n_vec][number * 4])); tmp1 = _mm256_mul_ps(a, yl); a = _mm256_shuffle_ps(a, a, 0xB1); tmp2 = _mm256_mul_ps(a, yh); z = _mm256_addsub_ps(tmp1, tmp2); acc[n_vec] = _mm256_add_ps(acc[n_vec], z); } // Regenerate phase if ((number % 128) == 0) { tmp1 = _mm256_mul_ps(four_phase_acc_reg, four_phase_acc_reg); tmp2 = _mm256_hadd_ps(tmp1, tmp1); tmp1 = _mm256_shuffle_ps(tmp2, tmp2, 0xD8); tmp2 = _mm256_sqrt_ps(tmp1); four_phase_acc_reg = _mm256_div_ps(four_phase_acc_reg, tmp2); } } for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { _mm256_store_ps((float*)dotProductVector, acc[n_vec]); // Store the results back into the dot product vector dotProduct = lv_cmake(0,0); for (i = 0; i < 4; ++i) { dotProduct = dotProduct + dotProductVector[i]; } result[n_vec] = dotProduct; } volk_gnsssdr_free(acc); tmp1 = _mm256_mul_ps(four_phase_acc_reg, four_phase_acc_reg); tmp2 = _mm256_hadd_ps(tmp1, tmp1); tmp1 = _mm256_shuffle_ps(tmp2, tmp2, 0xD8); tmp2 = _mm256_sqrt_ps(tmp1); four_phase_acc_reg = _mm256_div_ps(four_phase_acc_reg, tmp2); _mm256_store_ps((float*)four_phase_acc, four_phase_acc_reg); _phase = four_phase_acc[0]; _mm256_zeroupper(); for(n = avx_iters * 4; n < num_points; n++) { tmp32_1 = *_in_common++ * _phase; _phase *= phase_inc; for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { tmp32_2 = tmp32_1 * _in_a[n_vec][n]; result[n_vec] += tmp32_2; } } (*phase) = _phase; } #endif /* LV_HAVE_AVX */ #ifdef LV_HAVE_NEON #include static inline void volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn_neon(lv_32fc_t* result, const lv_32fc_t* in_common, const lv_32fc_t phase_inc, lv_32fc_t* phase, const lv_32fc_t** in_a, int num_a_vectors, unsigned int num_points) { const unsigned int neon_iters = num_points / 4; int n_vec; int i; unsigned int number; unsigned int n ; const lv_32fc_t** _in_a = in_a; const lv_32fc_t* _in_common = in_common; lv_32fc_t* _out = result; lv_32fc_t _phase = (*phase); lv_32fc_t tmp32_1, tmp32_2; if (neon_iters > 0) { lv_32fc_t dotProduct = lv_cmake(0,0); float32_t arg_phase0 = cargf(_phase); float32_t arg_phase_inc = cargf(phase_inc); float32_t phase_est; lv_32fc_t ___phase4 = phase_inc * phase_inc * phase_inc * phase_inc; __VOLK_ATTR_ALIGNED(16) float32_t __phase4_real[4] = { lv_creal(___phase4), lv_creal(___phase4), lv_creal(___phase4), lv_creal(___phase4) }; __VOLK_ATTR_ALIGNED(16) float32_t __phase4_imag[4] = { lv_cimag(___phase4), lv_cimag(___phase4), lv_cimag(___phase4), lv_cimag(___phase4) }; float32x4_t _phase4_real = vld1q_f32(__phase4_real); float32x4_t _phase4_imag = vld1q_f32(__phase4_imag); lv_32fc_t phase2 = (lv_32fc_t)(_phase) * phase_inc; lv_32fc_t phase3 = phase2 * phase_inc; lv_32fc_t phase4 = phase3 * phase_inc; __VOLK_ATTR_ALIGNED(16) float32_t __phase_real[4] = { lv_creal((_phase)), lv_creal(phase2), lv_creal(phase3), lv_creal(phase4) }; __VOLK_ATTR_ALIGNED(16) float32_t __phase_imag[4] = { lv_cimag((_phase)), lv_cimag(phase2), lv_cimag(phase3), lv_cimag(phase4) }; float32x4_t _phase_real = vld1q_f32(__phase_real); float32x4_t _phase_imag = vld1q_f32(__phase_imag); __VOLK_ATTR_ALIGNED(32) lv_32fc_t dotProductVector[4]; float32x4x2_t a_val, b_val, tmp32_real, tmp32_imag; float32x4x2_t* accumulator1 = (float32x4x2_t*)volk_gnsssdr_malloc(num_a_vectors * sizeof(float32x4x2_t), volk_gnsssdr_get_alignment()); float32x4x2_t* accumulator2 = (float32x4x2_t*)volk_gnsssdr_malloc(num_a_vectors * sizeof(float32x4x2_t), volk_gnsssdr_get_alignment()); for(n_vec = 0; n_vec < num_a_vectors; n_vec++) { accumulator1[n_vec].val[0] = vdupq_n_f32(0.0f); accumulator1[n_vec].val[1] = vdupq_n_f32(0.0f); accumulator2[n_vec].val[0] = vdupq_n_f32(0.0f); accumulator2[n_vec].val[1] = vdupq_n_f32(0.0f); } for(number = 0; number < neon_iters; number++) { /* load 4 complex numbers (float 32 bits each component) */ b_val = vld2q_f32((float32_t*)_in_common); __VOLK_GNSSSDR_PREFETCH(_in_common + 8); _in_common += 4; /* complex multiplication of four complex samples (float 32 bits each component) */ tmp32_real.val[0] = vmulq_f32(b_val.val[0], _phase_real); tmp32_real.val[1] = vmulq_f32(b_val.val[1], _phase_imag); tmp32_imag.val[0] = vmulq_f32(b_val.val[0], _phase_imag); tmp32_imag.val[1] = vmulq_f32(b_val.val[1], _phase_real); b_val.val[0] = vsubq_f32(tmp32_real.val[0], tmp32_real.val[1]); b_val.val[1] = vaddq_f32(tmp32_imag.val[0], tmp32_imag.val[1]); /* compute next four phases */ tmp32_real.val[0] = vmulq_f32(_phase_real, _phase4_real); tmp32_real.val[1] = vmulq_f32(_phase_imag, _phase4_imag); tmp32_imag.val[0] = vmulq_f32(_phase_real, _phase4_imag); tmp32_imag.val[1] = vmulq_f32(_phase_imag, _phase4_real); _phase_real = vsubq_f32(tmp32_real.val[0], tmp32_real.val[1]); _phase_imag = vaddq_f32(tmp32_imag.val[0], tmp32_imag.val[1]); // Regenerate phase if ((number % 128) == 0) { phase_est = arg_phase0 + (number + 1) * 4 * arg_phase_inc; _phase = lv_cmake(cos(phase_est), sin(phase_est)); phase2 = _phase * phase_inc; phase3 = phase2 * phase_inc; phase4 = phase3 * phase_inc; __VOLK_ATTR_ALIGNED(16) float32_t ____phase_real[4] = { lv_creal((_phase)), lv_creal(phase2), lv_creal(phase3), lv_creal(phase4) }; __VOLK_ATTR_ALIGNED(16) float32_t ____phase_imag[4] = { lv_cimag((_phase)), lv_cimag(phase2), lv_cimag(phase3), lv_cimag(phase4) }; _phase_real = vld1q_f32(____phase_real); _phase_imag = vld1q_f32(____phase_imag); } for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { a_val = vld2q_f32((float32_t*)&(_in_a[n_vec][number * 4])); // use 2 accumulators to remove inter-instruction data dependencies accumulator1[n_vec].val[0] = vmlaq_f32(accumulator1[n_vec].val[0], a_val.val[0], b_val.val[0]); accumulator2[n_vec].val[0] = vmlsq_f32(accumulator2[n_vec].val[0], a_val.val[1], b_val.val[1]); accumulator1[n_vec].val[1] = vmlaq_f32(accumulator1[n_vec].val[1], a_val.val[0], b_val.val[1]); accumulator2[n_vec].val[1] = vmlaq_f32(accumulator2[n_vec].val[1], a_val.val[1], b_val.val[0]); } } for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { accumulator1[n_vec].val[0] = vaddq_f32(accumulator1[n_vec].val[0], accumulator2[n_vec].val[0]); accumulator1[n_vec].val[1] = vaddq_f32(accumulator1[n_vec].val[1], accumulator2[n_vec].val[1]); } for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { vst2q_f32((float32_t*)dotProductVector, accumulator1[n_vec]); // Store the results back into the dot product vector dotProduct = lv_cmake(0,0); for (i = 0; i < 4; ++i) { dotProduct = dotProduct + dotProductVector[i]; } _out[n_vec] = dotProduct; } volk_gnsssdr_free(accumulator1); volk_gnsssdr_free(accumulator2); vst1q_f32((float32_t*)__phase_real, _phase_real); vst1q_f32((float32_t*)__phase_imag, _phase_imag); _phase = lv_cmake((float32_t)__phase_real[0], (float32_t)__phase_imag[0]); } for(n = neon_iters * 4; n < num_points; n++) { tmp32_1 = in_common[n] * _phase; _phase *= phase_inc; for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { tmp32_2 = tmp32_1 * in_a[n_vec][n]; _out[n_vec] += tmp32_2; } } (*phase) = _phase; } #endif /* LV_HAVE_NEON */ #endif /* INCLUDED_volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn_H */ volk_gnsssdr_32fc_x2_rotator_dotprodxnpuppet_32fc.h000066400000000000000000000251311305042567700441320ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/*! * \file volk_gnsssdr_32fc_x2_rotator_dotprodxnpuppet_32fc.h * \brief Volk puppet for the multiple 16-bit complex dot product kernel. * \authors
      *
    • Carles Fernandez Prades 2016 cfernandez at cttc dot cat *
    * * Volk puppet for integrating the resampler into volk's test system * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 INCLUDED_volk_gnsssdr_32fc_x2_rotator_dotprodxnpuppet_32fc_H #define INCLUDED_volk_gnsssdr_32fc_x2_rotator_dotprodxnpuppet_32fc_H #include "volk_gnsssdr/volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn.h" #include #include #include #ifdef LV_HAVE_GENERIC static inline void volk_gnsssdr_32fc_x2_rotator_dotprodxnpuppet_32fc_generic(lv_32fc_t* result, const lv_32fc_t* local_code, const lv_32fc_t* in, unsigned int num_points) { // phases must be normalized. Phase rotator expects a complex exponential input! float rem_carrier_phase_in_rad = 0.25; float phase_step_rad = 0.1; lv_32fc_t phase[1]; phase[0] = lv_cmake(cos(rem_carrier_phase_in_rad), sin(rem_carrier_phase_in_rad)); lv_32fc_t phase_inc[1]; phase_inc[0] = lv_cmake(cos(phase_step_rad), sin(phase_step_rad)); unsigned int n; int num_a_vectors = 3; lv_32fc_t** in_a = (lv_32fc_t**)volk_gnsssdr_malloc(sizeof(lv_32fc_t*) * num_a_vectors, volk_gnsssdr_get_alignment()); for(n = 0; n < num_a_vectors; n++) { in_a[n] = (lv_32fc_t*)volk_gnsssdr_malloc(sizeof(lv_32fc_t) * num_points, volk_gnsssdr_get_alignment()); memcpy((lv_32fc_t*)in_a[n], (lv_32fc_t*)in, sizeof(lv_32fc_t) * num_points); } volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn_generic_reload(result, local_code, phase_inc[0], phase, (const lv_32fc_t**) in_a, num_a_vectors, num_points); for(n = 0; n < num_a_vectors; n++) { volk_gnsssdr_free(in_a[n]); } volk_gnsssdr_free(in_a); } #endif // Generic #ifdef LV_HAVE_GENERIC static inline void volk_gnsssdr_32fc_x2_rotator_dotprodxnpuppet_32fc_generic_reload(lv_32fc_t* result, const lv_32fc_t* local_code, const lv_32fc_t* in, unsigned int num_points) { // phases must be normalized. Phase rotator expects a complex exponential input! float rem_carrier_phase_in_rad = 0.25; float phase_step_rad = 0.1; lv_32fc_t phase[1]; phase[0] = lv_cmake(cos(rem_carrier_phase_in_rad), sin(rem_carrier_phase_in_rad)); lv_32fc_t phase_inc[1]; phase_inc[0] = lv_cmake(cos(phase_step_rad), sin(phase_step_rad)); unsigned int n; int num_a_vectors = 3; lv_32fc_t** in_a = (lv_32fc_t**)volk_gnsssdr_malloc(sizeof(lv_32fc_t*) * num_a_vectors, volk_gnsssdr_get_alignment()); for(n = 0; n < num_a_vectors; n++) { in_a[n] = (lv_32fc_t*)volk_gnsssdr_malloc(sizeof(lv_32fc_t) * num_points, volk_gnsssdr_get_alignment()); memcpy((lv_32fc_t*)in_a[n], (lv_32fc_t*)in, sizeof(lv_32fc_t) * num_points); } volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn_generic_reload(result, local_code, phase_inc[0], phase, (const lv_32fc_t**) in_a, num_a_vectors, num_points); for(n = 0; n < num_a_vectors; n++) { volk_gnsssdr_free(in_a[n]); } volk_gnsssdr_free(in_a); } #endif // Generic #ifdef LV_HAVE_SSE3 static inline void volk_gnsssdr_32fc_x2_rotator_dotprodxnpuppet_32fc_u_sse3(lv_32fc_t* result, const lv_32fc_t* local_code, const lv_32fc_t* in, unsigned int num_points) { // phases must be normalized. Phase rotator expects a complex exponential input! float rem_carrier_phase_in_rad = 0.25; float phase_step_rad = 0.1; lv_32fc_t phase[1]; phase[0] = lv_cmake(cos(rem_carrier_phase_in_rad), sin(rem_carrier_phase_in_rad)); lv_32fc_t phase_inc[1]; phase_inc[0] = lv_cmake(cos(phase_step_rad), sin(phase_step_rad)); unsigned int n; int num_a_vectors = 3; lv_32fc_t** in_a = (lv_32fc_t**)volk_gnsssdr_malloc(sizeof(lv_32fc_t*) * num_a_vectors, volk_gnsssdr_get_alignment()); for(n = 0; n < num_a_vectors; n++) { in_a[n] = (lv_32fc_t*)volk_gnsssdr_malloc(sizeof(lv_32fc_t) * num_points, volk_gnsssdr_get_alignment()); memcpy((lv_32fc_t*)in_a[n], (lv_32fc_t*)in, sizeof(lv_32fc_t) * num_points); } volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn_u_sse3(result, local_code, phase_inc[0], phase, (const lv_32fc_t**) in_a, num_a_vectors, num_points); for(n = 0; n < num_a_vectors; n++) { volk_gnsssdr_free(in_a[n]); } volk_gnsssdr_free(in_a); } #endif // SSE3 #ifdef LV_HAVE_SSE3 static inline void volk_gnsssdr_32fc_x2_rotator_dotprodxnpuppet_32fc_a_sse3(lv_32fc_t* result, const lv_32fc_t* local_code, const lv_32fc_t* in, unsigned int num_points) { // phases must be normalized. Phase rotator expects a complex exponential input! float rem_carrier_phase_in_rad = 0.25; float phase_step_rad = 0.1; lv_32fc_t phase[1]; phase[0] = lv_cmake(cos(rem_carrier_phase_in_rad), sin(rem_carrier_phase_in_rad)); lv_32fc_t phase_inc[1]; phase_inc[0] = lv_cmake(cos(phase_step_rad), sin(phase_step_rad)); unsigned int n; int num_a_vectors = 3; lv_32fc_t** in_a = (lv_32fc_t**)volk_gnsssdr_malloc(sizeof(lv_32fc_t*) * num_a_vectors, volk_gnsssdr_get_alignment()); for(n = 0; n < num_a_vectors; n++) { in_a[n] = (lv_32fc_t*)volk_gnsssdr_malloc(sizeof(lv_32fc_t) * num_points, volk_gnsssdr_get_alignment()); memcpy((lv_32fc_t*)in_a[n], (lv_32fc_t*)in, sizeof(lv_32fc_t) * num_points); } volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn_a_sse3(result, local_code, phase_inc[0], phase, (const lv_32fc_t**) in_a, num_a_vectors, num_points); for(n = 0; n < num_a_vectors; n++) { volk_gnsssdr_free(in_a[n]); } volk_gnsssdr_free(in_a); } #endif // SSE3 #ifdef LV_HAVE_AVX static inline void volk_gnsssdr_32fc_x2_rotator_dotprodxnpuppet_32fc_u_avx(lv_32fc_t* result, const lv_32fc_t* local_code, const lv_32fc_t* in, unsigned int num_points) { // phases must be normalized. Phase rotator expects a complex exponential input! float rem_carrier_phase_in_rad = 0.25; float phase_step_rad = 0.1; lv_32fc_t phase[1]; phase[0] = lv_cmake(cos(rem_carrier_phase_in_rad), sin(rem_carrier_phase_in_rad)); lv_32fc_t phase_inc[1]; phase_inc[0] = lv_cmake(cos(phase_step_rad), sin(phase_step_rad)); unsigned int n; int num_a_vectors = 3; lv_32fc_t** in_a = (lv_32fc_t**)volk_gnsssdr_malloc(sizeof(lv_32fc_t*) * num_a_vectors, volk_gnsssdr_get_alignment()); for(n = 0; n < num_a_vectors; n++) { in_a[n] = (lv_32fc_t*)volk_gnsssdr_malloc(sizeof(lv_32fc_t) * num_points, volk_gnsssdr_get_alignment()); memcpy((lv_32fc_t*)in_a[n], (lv_32fc_t*)in, sizeof(lv_32fc_t) * num_points); } volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn_u_avx(result, local_code, phase_inc[0], phase, (const lv_32fc_t**) in_a, num_a_vectors, num_points); for(n = 0; n < num_a_vectors; n++) { volk_gnsssdr_free(in_a[n]); } volk_gnsssdr_free(in_a); } #endif // AVX #ifdef LV_HAVE_AVX static inline void volk_gnsssdr_32fc_x2_rotator_dotprodxnpuppet_32fc_a_avx(lv_32fc_t* result, const lv_32fc_t* local_code, const lv_32fc_t* in, unsigned int num_points) { // phases must be normalized. Phase rotator expects a complex exponential input! float rem_carrier_phase_in_rad = 0.25; float phase_step_rad = 0.1; lv_32fc_t phase[1]; phase[0] = lv_cmake(cos(rem_carrier_phase_in_rad), sin(rem_carrier_phase_in_rad)); lv_32fc_t phase_inc[1]; phase_inc[0] = lv_cmake(cos(phase_step_rad), sin(phase_step_rad)); unsigned int n; int num_a_vectors = 3; lv_32fc_t** in_a = (lv_32fc_t**)volk_gnsssdr_malloc(sizeof(lv_32fc_t*) * num_a_vectors, volk_gnsssdr_get_alignment()); for(n = 0; n < num_a_vectors; n++) { in_a[n] = (lv_32fc_t*)volk_gnsssdr_malloc(sizeof(lv_32fc_t) * num_points, volk_gnsssdr_get_alignment()); memcpy((lv_32fc_t*)in_a[n], (lv_32fc_t*)in, sizeof(lv_32fc_t) * num_points); } volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn_a_avx(result, local_code, phase_inc[0], phase, (const lv_32fc_t**) in_a, num_a_vectors, num_points); for(n = 0; n < num_a_vectors; n++) { volk_gnsssdr_free(in_a[n]); } volk_gnsssdr_free(in_a); } #endif // AVX #ifdef LV_HAVE_NEON static inline void volk_gnsssdr_32fc_x2_rotator_dotprodxnpuppet_32fc_neon(lv_32fc_t* result, const lv_32fc_t* local_code, const lv_32fc_t* in, unsigned int num_points) { // phases must be normalized. Phase rotator expects a complex exponential input! float rem_carrier_phase_in_rad = 0.25; float phase_step_rad = 0.1; lv_32fc_t phase[1]; phase[0] = lv_cmake(cos(rem_carrier_phase_in_rad), sin(rem_carrier_phase_in_rad)); lv_32fc_t phase_inc[1]; phase_inc[0] = lv_cmake(cos(phase_step_rad), sin(phase_step_rad)); unsigned int n; int num_a_vectors = 3; lv_32fc_t** in_a = (lv_32fc_t**)volk_gnsssdr_malloc(sizeof(lv_32fc_t*) * num_a_vectors, volk_gnsssdr_get_alignment()); for(n = 0; n < num_a_vectors; n++) { in_a[n] = (lv_32fc_t*)volk_gnsssdr_malloc(sizeof(lv_32fc_t) * num_points, volk_gnsssdr_get_alignment()); memcpy((lv_32fc_t*)in_a[n], (lv_32fc_t*)in, sizeof(lv_32fc_t) * num_points); } volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn_neon(result, local_code, phase_inc[0], phase, (const lv_32fc_t**) in_a, num_a_vectors, num_points); for(n = 0; n < num_a_vectors; n++) { volk_gnsssdr_free(in_a[n]); } volk_gnsssdr_free(in_a); } #endif // AVX #endif // INCLUDED_volk_gnsssdr_32fc_x2_rotator_dotprodxnpuppet_32fc_H volk_gnsssdr_32fc_xn_resampler_32fc_xn.h000066400000000000000000000741541305042567700417050ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/*! * \file volk_gnsssdr_32fc_xn_resampler_32fc_xn.h * \brief VOLK_GNSSSDR kernel: Resamples N complex 32-bit float vectors using zero hold resample algorithm. * \authors
      *
    • Javier Arribas, 2015. jarribas(at)cttc.es *
    * * VOLK_GNSSSDR kernel that esamples N complex 32-bit float vectors using zero hold resample algorithm. * It is optimized to resample a single GNSS local code signal replica into N vectors fractional-resampled and fractional-delayed * (i.e. it creates the Early, Prompt, and Late code replicas) * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ /*! * \page volk_gnsssdr_32fc_xn_resampler_32fc_xn * * \b Overview * * Resamples a complex vector (32-bit float each component), providing \p num_out_vectors outputs. * * Dispatcher Prototype * \code * void volk_gnsssdr_32fc_xn_resampler_32fc_xn(lv_32fc_t** result, const lv_32fc_t* local_code, float rem_code_phase_chips, float code_phase_step_chips, float* shifts_chips, unsigned int code_length_chips, int num_out_vectors, unsigned int num_points) * \endcode * * \b Inputs * \li local_code: Vector to be resampled. * \li rem_code_phase_chips: Remnant code phase [chips]. * \li code_phase_step_chips: Phase increment per sample [chips/sample]. * \li shifts_chips: Vector of floats that defines the spacing (in chips) between the replicas of \p local_code * \li code_length_chips: Code length in chips. * \li num_out_vectors Number of output vectors. * \li num_points: The number of data values to be in the resampled vector. * * \b Outputs * \li result: Pointer to a vector of pointers where the results will be stored. * */ #ifndef INCLUDED_volk_gnsssdr_32fc_xn_resampler_32fc_xn_H #define INCLUDED_volk_gnsssdr_32fc_xn_resampler_32fc_xn_H #include #include /* abs */ #include #include #ifdef LV_HAVE_GENERIC static inline void volk_gnsssdr_32fc_xn_resampler_32fc_xn_generic(lv_32fc_t** result, const lv_32fc_t* local_code, float rem_code_phase_chips, float code_phase_step_chips, float* shifts_chips, unsigned int code_length_chips, int num_out_vectors, unsigned int num_points) { int local_code_chip_index; int current_correlator_tap; int n; for (current_correlator_tap = 0; current_correlator_tap < num_out_vectors; current_correlator_tap++) { for (n = 0; n < num_points; n++) { // resample code for current tap local_code_chip_index = (int)floor(code_phase_step_chips * (float)n + shifts_chips[current_correlator_tap] - rem_code_phase_chips); //Take into account that in multitap correlators, the shifts can be negative! if (local_code_chip_index < 0) local_code_chip_index += (int)code_length_chips * (abs(local_code_chip_index) / code_length_chips + 1); local_code_chip_index = local_code_chip_index % code_length_chips; result[current_correlator_tap][n] = local_code[local_code_chip_index]; } } } #endif /*LV_HAVE_GENERIC*/ #ifdef LV_HAVE_SSE3 #include static inline void volk_gnsssdr_32fc_xn_resampler_32fc_xn_a_sse3(lv_32fc_t** result, const lv_32fc_t* local_code, float rem_code_phase_chips, float code_phase_step_chips, float* shifts_chips, unsigned int code_length_chips, int num_out_vectors, unsigned int num_points) { lv_32fc_t** _result = result; const unsigned int quarterPoints = num_points / 4; int current_correlator_tap; unsigned int n; unsigned int k; const __m128 ones = _mm_set1_ps(1.0f); const __m128 fours = _mm_set1_ps(4.0f); const __m128 rem_code_phase_chips_reg = _mm_set_ps1(rem_code_phase_chips); const __m128 code_phase_step_chips_reg = _mm_set_ps1(code_phase_step_chips); __VOLK_ATTR_ALIGNED(16) int local_code_chip_index[4]; int local_code_chip_index_; const __m128i zeros = _mm_setzero_si128(); const __m128 code_length_chips_reg_f = _mm_set_ps1((float)code_length_chips); const __m128i code_length_chips_reg_i = _mm_set1_epi32((int)code_length_chips); __m128i local_code_chip_index_reg, aux_i, negatives, i; __m128 aux, aux2, shifts_chips_reg, fi, igx, j, c, cTrunc, base; for (current_correlator_tap = 0; current_correlator_tap < num_out_vectors; current_correlator_tap++) { shifts_chips_reg = _mm_set_ps1((float)shifts_chips[current_correlator_tap]); aux2 = _mm_sub_ps(shifts_chips_reg, rem_code_phase_chips_reg); __m128 indexn = _mm_set_ps(3.0f, 2.0f, 1.0f, 0.0f); for(n = 0; n < quarterPoints; n++) { aux = _mm_mul_ps(code_phase_step_chips_reg, indexn); aux = _mm_add_ps(aux, aux2); // floor i = _mm_cvttps_epi32(aux); fi = _mm_cvtepi32_ps(i); igx = _mm_cmpgt_ps(fi, aux); j = _mm_and_ps(igx, ones); aux = _mm_sub_ps(fi, j); // fmod c = _mm_div_ps(aux, code_length_chips_reg_f); i = _mm_cvttps_epi32(c); cTrunc = _mm_cvtepi32_ps(i); base = _mm_mul_ps(cTrunc, code_length_chips_reg_f); local_code_chip_index_reg = _mm_cvtps_epi32(_mm_sub_ps(aux, base)); negatives = _mm_cmplt_epi32(local_code_chip_index_reg, zeros); aux_i = _mm_and_si128(code_length_chips_reg_i, negatives); local_code_chip_index_reg = _mm_add_epi32(local_code_chip_index_reg, aux_i); _mm_store_si128((__m128i*)local_code_chip_index, local_code_chip_index_reg); for(k = 0; k < 4; ++k) { _result[current_correlator_tap][n * 4 + k] = local_code[local_code_chip_index[k]]; } indexn = _mm_add_ps(indexn, fours); } for(n = quarterPoints * 4; n < num_points; n++) { // resample code for current tap local_code_chip_index_ = (int)floor(code_phase_step_chips * (float)n + shifts_chips[current_correlator_tap] - rem_code_phase_chips); //Take into account that in multitap correlators, the shifts can be negative! if (local_code_chip_index_ < 0) local_code_chip_index_ += (int)code_length_chips * (abs(local_code_chip_index_) / code_length_chips + 1) ; local_code_chip_index_ = local_code_chip_index_ % code_length_chips; _result[current_correlator_tap][n] = local_code[local_code_chip_index_]; } } } #endif #ifdef LV_HAVE_SSE3 #include static inline void volk_gnsssdr_32fc_xn_resampler_32fc_xn_u_sse3(lv_32fc_t** result, const lv_32fc_t* local_code, float rem_code_phase_chips, float code_phase_step_chips, float* shifts_chips, unsigned int code_length_chips, int num_out_vectors, unsigned int num_points) { lv_32fc_t** _result = result; const unsigned int quarterPoints = num_points / 4; int current_correlator_tap; unsigned int n; unsigned int k; const __m128 ones = _mm_set1_ps(1.0f); const __m128 fours = _mm_set1_ps(4.0f); const __m128 rem_code_phase_chips_reg = _mm_set_ps1(rem_code_phase_chips); const __m128 code_phase_step_chips_reg = _mm_set_ps1(code_phase_step_chips); __VOLK_ATTR_ALIGNED(16) int local_code_chip_index[4]; int local_code_chip_index_; const __m128i zeros = _mm_setzero_si128(); const __m128 code_length_chips_reg_f = _mm_set_ps1((float)code_length_chips); const __m128i code_length_chips_reg_i = _mm_set1_epi32((int)code_length_chips); __m128i local_code_chip_index_reg, aux_i, negatives, i; __m128 aux, aux2, shifts_chips_reg, fi, igx, j, c, cTrunc, base; for (current_correlator_tap = 0; current_correlator_tap < num_out_vectors; current_correlator_tap++) { shifts_chips_reg = _mm_set_ps1((float)shifts_chips[current_correlator_tap]); aux2 = _mm_sub_ps(shifts_chips_reg, rem_code_phase_chips_reg); __m128 indexn = _mm_set_ps(3.0f, 2.0f, 1.0f, 0.0f); for(n = 0; n < quarterPoints; n++) { aux = _mm_mul_ps(code_phase_step_chips_reg, indexn); aux = _mm_add_ps(aux, aux2); // floor i = _mm_cvttps_epi32(aux); fi = _mm_cvtepi32_ps(i); igx = _mm_cmpgt_ps(fi, aux); j = _mm_and_ps(igx, ones); aux = _mm_sub_ps(fi, j); // fmod c = _mm_div_ps(aux, code_length_chips_reg_f); i = _mm_cvttps_epi32(c); cTrunc = _mm_cvtepi32_ps(i); base = _mm_mul_ps(cTrunc, code_length_chips_reg_f); local_code_chip_index_reg = _mm_cvtps_epi32(_mm_sub_ps(aux, base)); negatives = _mm_cmplt_epi32(local_code_chip_index_reg, zeros); aux_i = _mm_and_si128(code_length_chips_reg_i, negatives); local_code_chip_index_reg = _mm_add_epi32(local_code_chip_index_reg, aux_i); _mm_store_si128((__m128i*)local_code_chip_index, local_code_chip_index_reg); for(k = 0; k < 4; ++k) { _result[current_correlator_tap][n * 4 + k] = local_code[local_code_chip_index[k]]; } indexn = _mm_add_ps(indexn, fours); } for(n = quarterPoints * 4; n < num_points; n++) { // resample code for current tap local_code_chip_index_ = (int)floor(code_phase_step_chips * (float)n + shifts_chips[current_correlator_tap] - rem_code_phase_chips); //Take into account that in multitap correlators, the shifts can be negative! if (local_code_chip_index_ < 0) local_code_chip_index_ += (int)code_length_chips * (abs(local_code_chip_index_) / code_length_chips + 1) ; local_code_chip_index_ = local_code_chip_index_ % code_length_chips; _result[current_correlator_tap][n] = local_code[local_code_chip_index_]; } } } #endif #ifdef LV_HAVE_SSE4_1 #include static inline void volk_gnsssdr_32fc_xn_resampler_32fc_xn_a_sse4_1(lv_32fc_t** result, const lv_32fc_t* local_code, float rem_code_phase_chips, float code_phase_step_chips, float* shifts_chips, unsigned int code_length_chips, int num_out_vectors, unsigned int num_points) { lv_32fc_t** _result = result; const unsigned int quarterPoints = num_points / 4; int current_correlator_tap; unsigned int n; unsigned int k; const __m128 fours = _mm_set1_ps(4.0f); const __m128 rem_code_phase_chips_reg = _mm_set_ps1(rem_code_phase_chips); const __m128 code_phase_step_chips_reg = _mm_set_ps1(code_phase_step_chips); __VOLK_ATTR_ALIGNED(16) int local_code_chip_index[4]; int local_code_chip_index_; const __m128i zeros = _mm_setzero_si128(); const __m128 code_length_chips_reg_f = _mm_set_ps1((float)code_length_chips); const __m128i code_length_chips_reg_i = _mm_set1_epi32((int)code_length_chips); __m128i local_code_chip_index_reg, aux_i, negatives, i; __m128 aux, aux2, shifts_chips_reg, c, cTrunc, base; for (current_correlator_tap = 0; current_correlator_tap < num_out_vectors; current_correlator_tap++) { shifts_chips_reg = _mm_set_ps1((float)shifts_chips[current_correlator_tap]); aux2 = _mm_sub_ps(shifts_chips_reg, rem_code_phase_chips_reg); __m128 indexn = _mm_set_ps(3.0f, 2.0f, 1.0f, 0.0f); for(n = 0; n < quarterPoints; n++) { aux = _mm_mul_ps(code_phase_step_chips_reg, indexn); aux = _mm_add_ps(aux, aux2); // floor aux = _mm_floor_ps(aux); // fmod c = _mm_div_ps(aux, code_length_chips_reg_f); i = _mm_cvttps_epi32(c); cTrunc = _mm_cvtepi32_ps(i); base = _mm_mul_ps(cTrunc, code_length_chips_reg_f); local_code_chip_index_reg = _mm_cvtps_epi32(_mm_sub_ps(aux, base)); negatives = _mm_cmplt_epi32(local_code_chip_index_reg, zeros); aux_i = _mm_and_si128(code_length_chips_reg_i, negatives); local_code_chip_index_reg = _mm_add_epi32(local_code_chip_index_reg, aux_i); _mm_store_si128((__m128i*)local_code_chip_index, local_code_chip_index_reg); for(k = 0; k < 4; ++k) { _result[current_correlator_tap][n * 4 + k] = local_code[local_code_chip_index[k]]; } indexn = _mm_add_ps(indexn, fours); } for(n = quarterPoints * 4; n < num_points; n++) { // resample code for current tap local_code_chip_index_ = (int)floor(code_phase_step_chips * (float)n + shifts_chips[current_correlator_tap] - rem_code_phase_chips); //Take into account that in multitap correlators, the shifts can be negative! if (local_code_chip_index_ < 0) local_code_chip_index_ += (int)code_length_chips * (abs(local_code_chip_index_) / code_length_chips + 1) ; local_code_chip_index_ = local_code_chip_index_ % code_length_chips; _result[current_correlator_tap][n] = local_code[local_code_chip_index_]; } } } #endif #ifdef LV_HAVE_SSE4_1 #include static inline void volk_gnsssdr_32fc_xn_resampler_32fc_xn_u_sse4_1(lv_32fc_t** result, const lv_32fc_t* local_code, float rem_code_phase_chips, float code_phase_step_chips, float* shifts_chips, unsigned int code_length_chips, int num_out_vectors, unsigned int num_points) { lv_32fc_t** _result = result; const unsigned int quarterPoints = num_points / 4; int current_correlator_tap; unsigned int n; unsigned int k; const __m128 fours = _mm_set1_ps(4.0f); const __m128 rem_code_phase_chips_reg = _mm_set_ps1(rem_code_phase_chips); const __m128 code_phase_step_chips_reg = _mm_set_ps1(code_phase_step_chips); __VOLK_ATTR_ALIGNED(16) int local_code_chip_index[4]; int local_code_chip_index_; const __m128i zeros = _mm_setzero_si128(); const __m128 code_length_chips_reg_f = _mm_set_ps1((float)code_length_chips); const __m128i code_length_chips_reg_i = _mm_set1_epi32((int)code_length_chips); __m128i local_code_chip_index_reg, aux_i, negatives, i; __m128 aux, aux2, shifts_chips_reg, c, cTrunc, base; for (current_correlator_tap = 0; current_correlator_tap < num_out_vectors; current_correlator_tap++) { shifts_chips_reg = _mm_set_ps1((float)shifts_chips[current_correlator_tap]); aux2 = _mm_sub_ps(shifts_chips_reg, rem_code_phase_chips_reg); __m128 indexn = _mm_set_ps(3.0f, 2.0f, 1.0f, 0.0f); for(n = 0; n < quarterPoints; n++) { aux = _mm_mul_ps(code_phase_step_chips_reg, indexn); aux = _mm_add_ps(aux, aux2); // floor aux = _mm_floor_ps(aux); // fmod c = _mm_div_ps(aux, code_length_chips_reg_f); i = _mm_cvttps_epi32(c); cTrunc = _mm_cvtepi32_ps(i); base = _mm_mul_ps(cTrunc, code_length_chips_reg_f); local_code_chip_index_reg = _mm_cvtps_epi32(_mm_sub_ps(aux, base)); negatives = _mm_cmplt_epi32(local_code_chip_index_reg, zeros); aux_i = _mm_and_si128(code_length_chips_reg_i, negatives); local_code_chip_index_reg = _mm_add_epi32(local_code_chip_index_reg, aux_i); _mm_store_si128((__m128i*)local_code_chip_index, local_code_chip_index_reg); for(k = 0; k < 4; ++k) { _result[current_correlator_tap][n * 4 + k] = local_code[local_code_chip_index[k]]; } indexn = _mm_add_ps(indexn, fours); } for(n = quarterPoints * 4; n < num_points; n++) { // resample code for current tap local_code_chip_index_ = (int)floor(code_phase_step_chips * (float)n + shifts_chips[current_correlator_tap] - rem_code_phase_chips); //Take into account that in multitap correlators, the shifts can be negative! if (local_code_chip_index_ < 0) local_code_chip_index_ += (int)code_length_chips * (abs(local_code_chip_index_) / code_length_chips + 1) ; local_code_chip_index_ = local_code_chip_index_ % code_length_chips; _result[current_correlator_tap][n] = local_code[local_code_chip_index_]; } } } #endif #ifdef LV_HAVE_AVX #include static inline void volk_gnsssdr_32fc_xn_resampler_32fc_xn_a_avx(lv_32fc_t** result, const lv_32fc_t* local_code, float rem_code_phase_chips, float code_phase_step_chips, float* shifts_chips, unsigned int code_length_chips, int num_out_vectors, unsigned int num_points) { lv_32fc_t** _result = result; const unsigned int avx_iters = num_points / 8; int current_correlator_tap; unsigned int n; unsigned int k; const __m256 eights = _mm256_set1_ps(8.0f); const __m256 rem_code_phase_chips_reg = _mm256_set1_ps(rem_code_phase_chips); const __m256 code_phase_step_chips_reg = _mm256_set1_ps(code_phase_step_chips); __VOLK_ATTR_ALIGNED(32) int local_code_chip_index[8]; int local_code_chip_index_; const __m256 zeros = _mm256_setzero_ps(); const __m256 code_length_chips_reg_f = _mm256_set1_ps((float)code_length_chips); const __m256 n0 = _mm256_set_ps(7.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f, 0.0f); __m256i local_code_chip_index_reg, i; __m256 aux, aux2, aux3, shifts_chips_reg, c, cTrunc, base, negatives, indexn; for (current_correlator_tap = 0; current_correlator_tap < num_out_vectors; current_correlator_tap++) { shifts_chips_reg = _mm256_set1_ps((float)shifts_chips[current_correlator_tap]); aux2 = _mm256_sub_ps(shifts_chips_reg, rem_code_phase_chips_reg); indexn = n0; for(n = 0; n < avx_iters; n++) { __VOLK_GNSSSDR_PREFETCH_LOCALITY(&_result[current_correlator_tap][8 * n + 7], 1, 0); __VOLK_GNSSSDR_PREFETCH_LOCALITY(&local_code_chip_index[8], 1, 3); aux = _mm256_mul_ps(code_phase_step_chips_reg, indexn); aux = _mm256_add_ps(aux, aux2); // floor aux = _mm256_floor_ps(aux); // fmod c = _mm256_div_ps(aux, code_length_chips_reg_f); i = _mm256_cvttps_epi32(c); cTrunc = _mm256_cvtepi32_ps(i); base = _mm256_mul_ps(cTrunc, code_length_chips_reg_f); local_code_chip_index_reg = _mm256_cvttps_epi32(_mm256_sub_ps(aux, base)); // no negatives c = _mm256_cvtepi32_ps(local_code_chip_index_reg); negatives = _mm256_cmp_ps(c, zeros, 0x01 ); aux3 = _mm256_and_ps(code_length_chips_reg_f, negatives); aux = _mm256_add_ps(c, aux3); local_code_chip_index_reg = _mm256_cvttps_epi32(aux); _mm256_store_si256((__m256i*)local_code_chip_index, local_code_chip_index_reg); for(k = 0; k < 8; ++k) { _result[current_correlator_tap][n * 8 + k] = local_code[local_code_chip_index[k]]; } indexn = _mm256_add_ps(indexn, eights); } } _mm256_zeroupper(); for (current_correlator_tap = 0; current_correlator_tap < num_out_vectors; current_correlator_tap++) { for(n = avx_iters * 8; n < num_points; n++) { // resample code for current tap local_code_chip_index_ = (int)floor(code_phase_step_chips * (float)n + shifts_chips[current_correlator_tap] - rem_code_phase_chips); //Take into account that in multitap correlators, the shifts can be negative! if (local_code_chip_index_ < 0) local_code_chip_index_ += (int)code_length_chips * (abs(local_code_chip_index_) / code_length_chips + 1) ; local_code_chip_index_ = local_code_chip_index_ % code_length_chips; _result[current_correlator_tap][n] = local_code[local_code_chip_index_]; } } } #endif #ifdef LV_HAVE_AVX #include static inline void volk_gnsssdr_32fc_xn_resampler_32fc_xn_u_avx(lv_32fc_t** result, const lv_32fc_t* local_code, float rem_code_phase_chips, float code_phase_step_chips, float* shifts_chips, unsigned int code_length_chips, int num_out_vectors, unsigned int num_points) { lv_32fc_t** _result = result; const unsigned int avx_iters = num_points / 8; int current_correlator_tap; unsigned int n; unsigned int k; const __m256 eights = _mm256_set1_ps(8.0f); const __m256 rem_code_phase_chips_reg = _mm256_set1_ps(rem_code_phase_chips); const __m256 code_phase_step_chips_reg = _mm256_set1_ps(code_phase_step_chips); __VOLK_ATTR_ALIGNED(32) int local_code_chip_index[8]; int local_code_chip_index_; const __m256 zeros = _mm256_setzero_ps(); const __m256 code_length_chips_reg_f = _mm256_set1_ps((float)code_length_chips); const __m256 n0 = _mm256_set_ps(7.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f, 0.0f); __m256i local_code_chip_index_reg, i; __m256 aux, aux2, aux3, shifts_chips_reg, c, cTrunc, base, negatives, indexn; for (current_correlator_tap = 0; current_correlator_tap < num_out_vectors; current_correlator_tap++) { shifts_chips_reg = _mm256_set1_ps((float)shifts_chips[current_correlator_tap]); aux2 = _mm256_sub_ps(shifts_chips_reg, rem_code_phase_chips_reg); indexn = n0; for(n = 0; n < avx_iters; n++) { __VOLK_GNSSSDR_PREFETCH_LOCALITY(&_result[current_correlator_tap][8 * n + 7], 1, 0); __VOLK_GNSSSDR_PREFETCH_LOCALITY(&local_code_chip_index[8], 1, 3); aux = _mm256_mul_ps(code_phase_step_chips_reg, indexn); aux = _mm256_add_ps(aux, aux2); // floor aux = _mm256_floor_ps(aux); // fmod c = _mm256_div_ps(aux, code_length_chips_reg_f); i = _mm256_cvttps_epi32(c); cTrunc = _mm256_cvtepi32_ps(i); base = _mm256_mul_ps(cTrunc, code_length_chips_reg_f); local_code_chip_index_reg = _mm256_cvttps_epi32(_mm256_sub_ps(aux, base)); // no negatives c = _mm256_cvtepi32_ps(local_code_chip_index_reg); negatives = _mm256_cmp_ps(c, zeros, 0x01 ); aux3 = _mm256_and_ps(code_length_chips_reg_f, negatives); aux = _mm256_add_ps(c, aux3); local_code_chip_index_reg = _mm256_cvttps_epi32(aux); _mm256_store_si256((__m256i*)local_code_chip_index, local_code_chip_index_reg); for(k = 0; k < 8; ++k) { _result[current_correlator_tap][n * 8 + k] = local_code[local_code_chip_index[k]]; } indexn = _mm256_add_ps(indexn, eights); } } _mm256_zeroupper(); for (current_correlator_tap = 0; current_correlator_tap < num_out_vectors; current_correlator_tap++) { for(n = avx_iters * 8; n < num_points; n++) { // resample code for current tap local_code_chip_index_ = (int)floor(code_phase_step_chips * (float)n + shifts_chips[current_correlator_tap] - rem_code_phase_chips); //Take into account that in multitap correlators, the shifts can be negative! if (local_code_chip_index_ < 0) local_code_chip_index_ += (int)code_length_chips * (abs(local_code_chip_index_) / code_length_chips + 1) ; local_code_chip_index_ = local_code_chip_index_ % code_length_chips; _result[current_correlator_tap][n] = local_code[local_code_chip_index_]; } } } #endif #ifdef LV_HAVE_NEON #include static inline void volk_gnsssdr_32fc_xn_resampler_32fc_xn_neon(lv_32fc_t** result, const lv_32fc_t* local_code, float rem_code_phase_chips, float code_phase_step_chips, float* shifts_chips, unsigned int code_length_chips, int num_out_vectors, unsigned int num_points) { lv_32fc_t** _result = result; const unsigned int neon_iters = num_points / 4; int current_correlator_tap; unsigned int n; unsigned int k; const int32x4_t ones = vdupq_n_s32(1); const float32x4_t fours = vdupq_n_f32(4.0f); const float32x4_t rem_code_phase_chips_reg = vdupq_n_f32(rem_code_phase_chips); const float32x4_t code_phase_step_chips_reg = vdupq_n_f32(code_phase_step_chips); __VOLK_ATTR_ALIGNED(16) int32_t local_code_chip_index[4]; int32_t local_code_chip_index_; const int32x4_t zeros = vdupq_n_s32(0); const float32x4_t code_length_chips_reg_f = vdupq_n_f32((float)code_length_chips); const int32x4_t code_length_chips_reg_i = vdupq_n_s32((int32_t)code_length_chips); int32x4_t local_code_chip_index_reg, aux_i, negatives, i; float32x4_t aux, aux2, shifts_chips_reg, fi, c, j, cTrunc, base, indexn, reciprocal; __VOLK_ATTR_ALIGNED(16) const float vec[4] = { 0.0f, 1.0f, 2.0f, 3.0f }; uint32x4_t igx; reciprocal = vrecpeq_f32(code_length_chips_reg_f); reciprocal = vmulq_f32(vrecpsq_f32(code_length_chips_reg_f, reciprocal), reciprocal); reciprocal = vmulq_f32(vrecpsq_f32(code_length_chips_reg_f, reciprocal), reciprocal); // this refinement is required! float32x4_t n0 = vld1q_f32((float*)vec); for (current_correlator_tap = 0; current_correlator_tap < num_out_vectors; current_correlator_tap++) { shifts_chips_reg = vdupq_n_f32((float)shifts_chips[current_correlator_tap]); aux2 = vsubq_f32(shifts_chips_reg, rem_code_phase_chips_reg); indexn = n0; for(n = 0; n < neon_iters; n++) { __VOLK_GNSSSDR_PREFETCH_LOCALITY(&_result[current_correlator_tap][4 * n + 3], 1, 0); __VOLK_GNSSSDR_PREFETCH(&local_code_chip_index[4]); aux = vmulq_f32(code_phase_step_chips_reg, indexn); aux = vaddq_f32(aux, aux2); //floor i = vcvtq_s32_f32(aux); fi = vcvtq_f32_s32(i); igx = vcgtq_f32(fi, aux); j = vcvtq_f32_s32(vandq_s32(vreinterpretq_s32_u32(igx), ones)); aux = vsubq_f32(fi, j); // fmod c = vmulq_f32(aux, reciprocal); i = vcvtq_s32_f32(c); cTrunc = vcvtq_f32_s32(i); base = vmulq_f32(cTrunc, code_length_chips_reg_f); aux = vsubq_f32(aux, base); local_code_chip_index_reg = vcvtq_s32_f32(aux); negatives = vreinterpretq_s32_u32(vcltq_s32(local_code_chip_index_reg, zeros)); aux_i = vandq_s32(code_length_chips_reg_i, negatives); local_code_chip_index_reg = vaddq_s32(local_code_chip_index_reg, aux_i); vst1q_s32((int32_t*)local_code_chip_index, local_code_chip_index_reg); for(k = 0; k < 4; ++k) { _result[current_correlator_tap][n * 4 + k] = local_code[local_code_chip_index[k]]; } indexn = vaddq_f32(indexn, fours); } for(n = neon_iters * 4; n < num_points; n++) { __VOLK_GNSSSDR_PREFETCH_LOCALITY(&_result[current_correlator_tap][n], 1, 0); // resample code for current tap local_code_chip_index_ = (int)floor(code_phase_step_chips * (float)n + shifts_chips[current_correlator_tap] - rem_code_phase_chips); //Take into account that in multitap correlators, the shifts can be negative! if (local_code_chip_index_ < 0) local_code_chip_index_ += (int)code_length_chips * (abs(local_code_chip_index_) / code_length_chips + 1); local_code_chip_index_ = local_code_chip_index_ % code_length_chips; _result[current_correlator_tap][n] = local_code[local_code_chip_index_]; } } } #endif #endif /*INCLUDED_volk_gnsssdr_32fc_xn_resampler_32fc_xn_H*/ volk_gnsssdr_64f_accumulator_64f.h000066400000000000000000000142301305042567700405110ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/*! * \file volk_gnsssdr_64f_accumulator_64f.h * \brief VOLK_GNSSSDR kernel: 64 bits (double) scalar accumulator. * \authors
      *
    • Andres Cecilia, 2014. a.cecilia.luque(at)gmail.com *
    * * VOLK_GNSSSDR kernel that implements an accumulator of double (64-bit float) values. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ /*! * \page volk_gnsssdr_64f_accumulator_64f * * \b Overview * * Accumulates the values in the input buffer. * * Dispatcher Prototype * \code * void volk_gnsssdr_64f_accumulator_64f(double* result, const double* inputBuffer, unsigned int num_points); * \endcode * * \b Inputs * \li inputBuffer: The buffer of data to be accumulated. * \li num_points: The number of values in \p inputBuffer to be accumulated. * * \b Outputs * \li result: The accumulated result. * */ #ifndef INCLUDED_volk_gnsssdr_64f_accumulator_64f_u_H #define INCLUDED_volk_gnsssdr_64f_accumulator_64f_u_H #include #ifdef LV_HAVE_AVX #include static inline void volk_gnsssdr_64f_accumulator_64f_u_avx(double* result, const double* inputBuffer, unsigned int num_points) { double returnValue = 0; const unsigned int sse_iters = num_points / 4; unsigned int number; unsigned int i; const double* aPtr = inputBuffer; __VOLK_ATTR_ALIGNED(32) double tempBuffer[4]; __m256d accumulator = _mm256_setzero_pd(); __m256d aVal = _mm256_setzero_pd(); for(number = 0; number < sse_iters; number++) { aVal = _mm256_loadu_pd(aPtr); accumulator = _mm256_add_pd(accumulator, aVal); aPtr += 4; } _mm256_storeu_pd((double*)tempBuffer, accumulator); for(i = 0; i < 4; ++i) { returnValue += tempBuffer[i]; } for(i = 0; i < (num_points % 4); ++i) { returnValue += (*aPtr++); } *result = returnValue; } #endif /* LV_HAVE_AVX */ #ifdef LV_HAVE_SSE3 #include static inline void volk_gnsssdr_64f_accumulator_64f_u_sse3(double* result,const double* inputBuffer, unsigned int num_points) { double returnValue = 0; const unsigned int sse_iters = num_points / 2; unsigned int number; unsigned int i; const double* aPtr = inputBuffer; __VOLK_ATTR_ALIGNED(16) double tempBuffer[2]; __m128d accumulator = _mm_setzero_pd(); __m128d aVal = _mm_setzero_pd(); for(number = 0; number < sse_iters; number++) { aVal = _mm_loadu_pd(aPtr); accumulator = _mm_add_pd(accumulator, aVal); aPtr += 2; } _mm_storeu_pd((double*)tempBuffer, accumulator); for(i = 0; i < 2; ++i) { returnValue += tempBuffer[i]; } for(i = 0; i < (num_points % 2); ++i) { returnValue += (*aPtr++); } *result = returnValue; } #endif /* LV_HAVE_SSE3 */ #ifdef LV_HAVE_GENERIC static inline void volk_gnsssdr_64f_accumulator_64f_generic(double* result,const double* inputBuffer, unsigned int num_points) { const double* aPtr = inputBuffer; double returnValue = 0; unsigned int number; for(number = 0; number < num_points; number++) { returnValue += (*aPtr++); } *result = returnValue; } #endif /* LV_HAVE_GENERIC */ #ifdef LV_HAVE_AVX #include static inline void volk_gnsssdr_64f_accumulator_64f_a_avx(double* result,const double* inputBuffer, unsigned int num_points) { double returnValue = 0; const unsigned int sse_iters = num_points / 4; unsigned int number; unsigned int i; const double* aPtr = inputBuffer; __VOLK_ATTR_ALIGNED(32) double tempBuffer[4]; __m256d accumulator = _mm256_setzero_pd(); __m256d aVal = _mm256_setzero_pd(); for(number = 0; number < sse_iters; number++) { aVal = _mm256_load_pd(aPtr); accumulator = _mm256_add_pd(accumulator, aVal); aPtr += 4; } _mm256_store_pd((double*)tempBuffer, accumulator); for(i = 0; i < 4; ++i) { returnValue += tempBuffer[i]; } for(i = 0; i < (num_points % 4); ++i) { returnValue += (*aPtr++); } *result = returnValue; } #endif /* LV_HAVE_AVX */ #ifdef LV_HAVE_SSE3 #include static inline void volk_gnsssdr_64f_accumulator_64f_a_sse3(double* result,const double* inputBuffer, unsigned int num_points) { double returnValue = 0; const unsigned int sse_iters = num_points / 2; unsigned int number; unsigned int i; const double* aPtr = inputBuffer; __VOLK_ATTR_ALIGNED(16) double tempBuffer[2]; __m128d accumulator = _mm_setzero_pd(); __m128d aVal = _mm_setzero_pd(); for(number = 0; number < sse_iters; number++) { aVal = _mm_load_pd(aPtr); accumulator = _mm_add_pd(accumulator, aVal); aPtr += 2; } _mm_store_pd((double*)tempBuffer, accumulator); for(i = 0; i < 2; ++i) { returnValue += tempBuffer[i]; } for(i = 0; i < (num_points % 2); ++i) { returnValue += (*aPtr++); } *result = returnValue; } #endif /* LV_HAVE_SSE3 */ #endif /* INCLUDED_volk_gnsssdr_64f_accumulator_64f_H */ volk_gnsssdr_8i_accumulator_s8i.h000066400000000000000000000113341305042567700405400ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/*! * \file volk_gnsssdr_8i_accumulator_s8i.h * \brief VOLK_GNSSSDR kernel: 8 bits (char) scalar accumulator. * \authors
      *
    • Andres Cecilia, 2014. a.cecilia.luque(at)gmail.com *
    * * VOLK_GNSSSDR kernel that implements an accumulator of char values * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ /*! * \page volk_gnsssdr_8i_accumulator_s8i * * \b Overview * * Accumulates the values in the input buffer. * * Dispatcher Prototype * \code * void volk_gnsssdr_8i_accumulator_s8i(char* result, const char* inputBuffer, unsigned int num_points); * \endcode * * \b Inputs * \li inputBuffer: The buffer of data to be accumulated. * \li num_points: The number of values in \p inputBuffer to be accumulated. * * \b Outputs * \li result: The accumulated result. * */ #ifndef INCLUDED_volk_gnsssdr_8i_accumulator_s8i_H #define INCLUDED_volk_gnsssdr_8i_accumulator_s8i_H #include #include #ifdef LV_HAVE_SSE3 #include static inline void volk_gnsssdr_8i_accumulator_s8i_u_sse3(char* result, const char* inputBuffer, unsigned int num_points) { char returnValue = 0; const unsigned int sse_iters = num_points / 16; unsigned int number; unsigned int i; const char* aPtr = inputBuffer; __VOLK_ATTR_ALIGNED(16) char tempBuffer[16]; __m128i accumulator = _mm_setzero_si128(); __m128i aVal = _mm_setzero_si128(); for(number = 0; number < sse_iters; number++) { aVal = _mm_lddqu_si128((__m128i*)aPtr); accumulator = _mm_add_epi8(accumulator, aVal); aPtr += 16; } _mm_storeu_si128((__m128i*)tempBuffer, accumulator); for(i = 0; i < 16; ++i) { returnValue += tempBuffer[i]; } for(i = 0; i < (num_points % 16); ++i) { returnValue += (*aPtr++); } *result = returnValue; } #endif /* LV_HAVE_SSE3 */ #ifdef LV_HAVE_GENERIC static inline void volk_gnsssdr_8i_accumulator_s8i_generic(char* result, const char* inputBuffer, unsigned int num_points) { const char* aPtr = inputBuffer; char returnValue = 0; unsigned int number; for(number = 0;number < num_points; number++) { returnValue += (*aPtr++); } *result = returnValue; } #endif /* LV_HAVE_GENERIC */ #ifdef LV_HAVE_SSE3 #include static inline void volk_gnsssdr_8i_accumulator_s8i_a_sse3(char* result, const char* inputBuffer, unsigned int num_points) { char returnValue = 0; const unsigned int sse_iters = num_points / 16; unsigned int number; unsigned int i; const char* aPtr = inputBuffer; __VOLK_ATTR_ALIGNED(16) char tempBuffer[16]; __m128i accumulator = _mm_setzero_si128(); __m128i aVal = _mm_setzero_si128(); for(number = 0; number < sse_iters; number++) { aVal = _mm_load_si128((__m128i*)aPtr); accumulator = _mm_add_epi8(accumulator, aVal); aPtr += 16; } _mm_store_si128((__m128i*)tempBuffer,accumulator); for(i = 0; i < 16; ++i) { returnValue += tempBuffer[i]; } for(i = 0; i < (num_points % 16); ++i) { returnValue += (*aPtr++); } *result = returnValue; } #endif /* LV_HAVE_SSE3 */ #ifdef LV_HAVE_ORC extern void volk_gnsssdr_8i_accumulator_s8i_a_orc_impl(short* result, const char* inputBuffer, unsigned int num_points); static inline void volk_gnsssdr_8i_accumulator_s8i_u_orc(char* result, const char* inputBuffer, unsigned int num_points) { short res = 0; char* resc = (char*)&res; resc++; volk_gnsssdr_8i_accumulator_s8i_a_orc_impl(&res, inputBuffer, num_points); *result = *resc; } #endif /* LV_HAVE_ORC */ #endif /* INCLUDED_volk_gnsssdr_8i_accumulator_s8i_H */ volk_gnsssdr_8i_index_max_16u.h000066400000000000000000000377421305042567700401200ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/*! * \file volk_gnsssdr_8i_index_max_16u.h * \brief VOLK_GNSSSDR kernel: calculates the index of the maximum value in a group of 8 bits (char) scalars. * \authors
      *
    • Andres Cecilia, 2014. a.cecilia.luque(at)gmail.com *
    * * VOLK_GNSSSDR kernel that returns the index of the maximum value of a group of 8 bits (char) scalars * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ /*! * \page volk_gnsssdr_8i_index_max_16u * * \b Overview * * Returns the index of the max value in \p src0 * * Dispatcher Prototype * \code * void volk_gnsssdr_8i_index_max_16u(unsigned int* target, const char* src0, unsigned int num_points); * \endcode * * \b Inputs * \li src0: The buffer of data to be analyzed. * \li num_points: The number of values in \p src0 to be analyzed. * * \b Outputs * \li target: The index of the maximum value in \p src0 * */ #ifndef INCLUDED_volk_gnsssdr_8i_index_max_16u_H #define INCLUDED_volk_gnsssdr_8i_index_max_16u_H #include #ifdef LV_HAVE_AVX #include static inline void volk_gnsssdr_8i_index_max_16u_u_avx(unsigned int* target, const char* src0, unsigned int num_points) { if(num_points > 0) { const unsigned int sse_iters = num_points / 32; unsigned int number; unsigned int i; char* basePtr = (char*)src0; char* inputPtr = (char*)src0; char max = src0[0]; unsigned int index = 0; __VOLK_ATTR_ALIGNED(32) char currentValuesBuffer[32]; __m256i ones, compareResults, currentValues; __m128i compareResultslo, compareResultshi, maxValues, lo, hi; ones = _mm256_set1_epi8(0xFF); maxValues = _mm_set1_epi8(max); for(number = 0; number < sse_iters; number++) { currentValues = _mm256_lddqu_si256((__m256i*)inputPtr); lo = _mm256_castsi256_si128(currentValues); hi = _mm256_extractf128_si256(currentValues,1); compareResultslo = _mm_cmpgt_epi8(maxValues, lo); compareResultshi = _mm_cmpgt_epi8(maxValues, hi); //compareResults = _mm256_set_m128i(compareResultshi , compareResultslo); //not defined in some versions of immintrin.h compareResults = _mm256_insertf128_si256(_mm256_castsi128_si256(compareResultslo),(compareResultshi),1); if (!_mm256_testc_si256(compareResults, ones)) { _mm256_storeu_si256((__m256i*)¤tValuesBuffer, currentValues); for(i = 0; i < 32; i++) { if(currentValuesBuffer[i] > max) { index = inputPtr - basePtr + i; max = currentValuesBuffer[i]; } } maxValues = _mm_set1_epi8(max); } inputPtr += 32; } for(i = 0; i<(num_points % 32); ++i) { if(src0[i] > max) { index = i; max = src0[i]; } } target[0] = index; } } #endif /*LV_HAVE_AVX*/ #ifdef LV_HAVE_SSE4_1 #include static inline void volk_gnsssdr_8i_index_max_16u_u_sse4_1(unsigned int* target, const char* src0, unsigned int num_points) { if(num_points > 0) { const unsigned int sse_iters = num_points / 16; unsigned int number; unsigned int i = 0; char* basePtr = (char*)src0; char* inputPtr = (char*)src0; char max = src0[0]; unsigned int index = 0; __VOLK_ATTR_ALIGNED(16) char currentValuesBuffer[16]; __m128i maxValues, compareResults, currentValues; maxValues = _mm_set1_epi8(max); for(number = 0; number < sse_iters; number++) { currentValues = _mm_lddqu_si128((__m128i*)inputPtr); compareResults = _mm_cmpgt_epi8(maxValues, currentValues); if (!_mm_test_all_ones(compareResults)) { _mm_storeu_si128((__m128i*)¤tValuesBuffer, currentValues); for(i = 0; i < 16; i++) { if(currentValuesBuffer[i] > max) { index = inputPtr - basePtr + i; max = currentValuesBuffer[i]; } } maxValues = _mm_set1_epi8(max); } inputPtr += 16; } for(i = 0; i<(num_points % 16); ++i) { if(src0[i] > max) { index = i; max = src0[i]; } } target[0] = index; } } #endif /*LV_HAVE_SSE4_1*/ #ifdef LV_HAVE_SSE2 #include static inline void volk_gnsssdr_8i_index_max_16u_u_sse2(unsigned int* target, const char* src0, unsigned int num_points) { if(num_points > 0) { const unsigned int sse_iters = num_points / 16; unsigned int number; unsigned int i; char* basePtr = (char*)src0; char* inputPtr = (char*)src0; char max = src0[0]; unsigned int index = 0; unsigned short mask; __VOLK_ATTR_ALIGNED(16) char currentValuesBuffer[16]; __m128i maxValues, compareResults, currentValues; maxValues = _mm_set1_epi8(max); for(number = 0; number < sse_iters; number++) { currentValues = _mm_loadu_si128((__m128i*)inputPtr); compareResults = _mm_cmpgt_epi8(maxValues, currentValues); mask = _mm_movemask_epi8(compareResults); if (mask != 0xFFFF) { _mm_storeu_si128((__m128i*)¤tValuesBuffer, currentValues); mask = ~mask; i = 0; while (mask > 0) { if ((mask & 1) == 1) { if(currentValuesBuffer[i] > max) { index = inputPtr - basePtr + i; max = currentValuesBuffer[i]; } } i++; mask >>= 1; } maxValues = _mm_set1_epi8(max); } inputPtr += 16; } for(i = 0; i<(num_points % 16); ++i) { if(src0[i] > max) { index = i; max = src0[i]; } } target[0] = index; } } #endif /*LV_HAVE_SSE2*/ #ifdef LV_HAVE_GENERIC static inline void volk_gnsssdr_8i_index_max_16u_generic(unsigned int* target, const char* src0, unsigned int num_points) { if(num_points > 0) { char max = src0[0]; unsigned int index = 0; unsigned int i; for(i = 1; i < num_points; ++i) { if(src0[i] > max) { index = i; max = src0[i]; } } target[0] = index; } } #endif /*LV_HAVE_GENERIC*/ #ifdef LV_HAVE_AVX #include static inline void volk_gnsssdr_8i_index_max_16u_a_avx(unsigned int* target, const char* src0, unsigned int num_points) { if(num_points > 0) { const unsigned int sse_iters = num_points / 32; unsigned int number; unsigned int i; char* basePtr = (char*)src0; char* inputPtr = (char*)src0; char max = src0[0]; unsigned int index = 0; __VOLK_ATTR_ALIGNED(32) char currentValuesBuffer[32]; __m256i ones, compareResults, currentValues; __m128i compareResultslo, compareResultshi, maxValues, lo, hi; ones = _mm256_set1_epi8(0xFF); maxValues = _mm_set1_epi8(max); for(number = 0; number < sse_iters; number++) { currentValues = _mm256_load_si256((__m256i*)inputPtr); lo = _mm256_castsi256_si128(currentValues); hi = _mm256_extractf128_si256(currentValues,1); compareResultslo = _mm_cmpgt_epi8(maxValues, lo); compareResultshi = _mm_cmpgt_epi8(maxValues, hi); //compareResults = _mm256_set_m128i(compareResultshi , compareResultslo); //not defined in some versions of immintrin.h compareResults = _mm256_insertf128_si256(_mm256_castsi128_si256(compareResultslo), (compareResultshi), 1); if (!_mm256_testc_si256(compareResults, ones)) { _mm256_store_si256((__m256i*)¤tValuesBuffer, currentValues); for(i = 0; i < 32; i++) { if(currentValuesBuffer[i] > max) { index = inputPtr - basePtr + i; max = currentValuesBuffer[i]; } } maxValues = _mm_set1_epi8(max); } inputPtr += 32; } for(i = 0; i<(num_points % 32); ++i) { if(src0[i] > max) { index = i; max = src0[i]; } } target[0] = index; } } #endif /*LV_HAVE_AVX*/ #ifdef LV_HAVE_SSE4_1 #include static inline void volk_gnsssdr_8i_index_max_16u_a_sse4_1(unsigned int* target, const char* src0, unsigned int num_points) { if(num_points > 0) { const unsigned int sse_iters = num_points / 16; unsigned int number; unsigned int i; char* basePtr = (char*)src0; char* inputPtr = (char*)src0; char max = src0[0]; unsigned int index = 0; __VOLK_ATTR_ALIGNED(16) char currentValuesBuffer[16]; __m128i maxValues, compareResults, currentValues; maxValues = _mm_set1_epi8(max); for(number = 0; number < sse_iters; number++) { currentValues = _mm_load_si128((__m128i*)inputPtr); compareResults = _mm_cmpgt_epi8(maxValues, currentValues); if (!_mm_test_all_ones(compareResults)) { _mm_store_si128((__m128i*)¤tValuesBuffer, currentValues); for(i = 0; i < 16; i++) { if(currentValuesBuffer[i] > max) { index = inputPtr - basePtr + i; max = currentValuesBuffer[i]; } } maxValues = _mm_set1_epi8(max); } inputPtr += 16; } for(i = 0; i<(num_points % 16); ++i) { if(src0[i] > max) { index = i; max = src0[i]; } } target[0] = index; } } #endif /*LV_HAVE_SSE4_1*/ #ifdef LV_HAVE_SSE2 #include static inline void volk_gnsssdr_8i_index_max_16u_a_sse2(unsigned int* target, const char* src0, unsigned int num_points) { if(num_points > 0) { const unsigned int sse_iters = num_points / 16; unsigned int number; unsigned int i; char* basePtr = (char*)src0; char* inputPtr = (char*)src0; char max = src0[0]; unsigned int index = 0; unsigned short mask; __VOLK_ATTR_ALIGNED(16) char currentValuesBuffer[16]; __m128i maxValues, compareResults, currentValues; maxValues = _mm_set1_epi8(max); for(number = 0; number < sse_iters; number++) { currentValues = _mm_load_si128((__m128i*)inputPtr); compareResults = _mm_cmpgt_epi8(maxValues, currentValues); mask = _mm_movemask_epi8(compareResults); if (mask != 0xFFFF) { _mm_store_si128((__m128i*)¤tValuesBuffer, currentValues); mask = ~mask; i = 0; while (mask > 0) { if ((mask & 1) == 1) { if(currentValuesBuffer[i] > max) { index = inputPtr - basePtr + i; max = currentValuesBuffer[i]; } } i++; mask >>= 1; } maxValues = _mm_set1_epi8(max); } inputPtr += 16; } for(i = 0; i<(num_points % 16); ++i) { if(src0[i] > max) { index = i; max = src0[i]; } } target[0] = index; } } #endif /*LV_HAVE_SSE2*/ #endif /*INCLUDED_volk_gnsssdr_8i_index_max_16u_H*/ volk_gnsssdr_8i_max_s8i.h000066400000000000000000000231321305042567700370050ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/*! * \file volk_gnsssdr_8i_max_s8i.h * \brief VOLK_GNSSSDR kernel: calculates the maximum value in a group of 8 bits (char) scalars. * \authors
      *
    • Andres Cecilia, 2014. a.cecilia.luque(at)gmail.com *
    * * VOLK_GNSSSDR kernel that returns the maximum value of a group of 8 bits (char) scalars * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ /*! * \page volk_gnsssdr_8i_max_s8i * * \b Overview * * Returns the max value in \p src0 * * Dispatcher Prototype * \code * void volk_gnsssdr_8i_max_s8i(char* target, const char* src0, unsigned int num_points); * \endcode * * \b Inputs * \li src0: The buffer of data to be analyzed. * \li num_points: The number of values in \p src0 to be analyzed. * * \b Outputs * \li target: The max value in \p src0 * */ #ifndef INCLUDED_volk_gnsssdr_8i_max_s8i_H #define INCLUDED_volk_gnsssdr_8i_max_s8i_H #include #ifdef LV_HAVE_SSE4_1 #include static inline void volk_gnsssdr_8i_max_s8i_u_sse4_1(char* target, const char* src0, unsigned int num_points) { if(num_points > 0) { const unsigned int sse_iters = num_points / 16; unsigned int number; unsigned int i; char* inputPtr = (char*)src0; char max = src0[0]; __VOLK_ATTR_ALIGNED(16) char maxValuesBuffer[16]; __m128i maxValues, compareResults, currentValues; maxValues = _mm_set1_epi8(max); for(number = 0; number < sse_iters; number++) { currentValues = _mm_loadu_si128((__m128i*)inputPtr); compareResults = _mm_cmpgt_epi8(maxValues, currentValues); maxValues = _mm_blendv_epi8(currentValues, maxValues, compareResults); inputPtr += 16; } _mm_storeu_si128((__m128i*)maxValuesBuffer, maxValues); for(i = 0; i < 16; ++i) { if(maxValuesBuffer[i] > max) { max = maxValuesBuffer[i]; } } for(i = sse_iters * 16; i < num_points; ++i) { if(src0[i] > max) { max = src0[i]; } } target[0] = max; } } #endif /*LV_HAVE_SSE4_1*/ #ifdef LV_HAVE_SSE2 #include static inline void volk_gnsssdr_8i_max_s8i_u_sse2(char* target, const char* src0, unsigned int num_points) { if(num_points > 0) { const unsigned int sse_iters = num_points / 16; unsigned int number; unsigned int i; char* inputPtr = (char*)src0; char max = src0[0]; unsigned short mask; __VOLK_ATTR_ALIGNED(16) char currentValuesBuffer[16]; __m128i maxValues, compareResults, currentValues; maxValues = _mm_set1_epi8(max); for(number = 0; number < sse_iters; number++) { currentValues = _mm_loadu_si128((__m128i*)inputPtr); compareResults = _mm_cmpgt_epi8(maxValues, currentValues); mask = _mm_movemask_epi8(compareResults); if (mask != 0xFFFF) { _mm_storeu_si128((__m128i*)¤tValuesBuffer, currentValues); mask = ~mask; i = 0; while (mask > 0) { if ((mask & 1) == 1) { if(currentValuesBuffer[i] > max) { max = currentValuesBuffer[i]; } } i++; mask >>= 1; } maxValues = _mm_set1_epi8(max); } inputPtr += 16; } for(i = sse_iters * 16; i < num_points; ++i) { if(src0[i] > max) { max = src0[i]; } } target[0] = max; } } #endif /*LV_HAVE_SSE2*/ #ifdef LV_HAVE_GENERIC static inline void volk_gnsssdr_8i_max_s8i_generic(char* target, const char* src0, unsigned int num_points) { if(num_points > 0) { char max = src0[0]; unsigned int i; for(i = 1; i < num_points; ++i) { if(src0[i] > max) { max = src0[i]; } } target[0] = max; } } #endif /*LV_HAVE_GENERIC*/ #ifdef LV_HAVE_SSE4_1 #include static inline void volk_gnsssdr_8i_max_s8i_a_sse4_1(char* target, const char* src0, unsigned int num_points) { if(num_points > 0) { const unsigned int sse_iters = num_points / 16; unsigned int number; unsigned int i; char* inputPtr = (char*)src0; char max = src0[0]; __VOLK_ATTR_ALIGNED(16) char maxValuesBuffer[16]; __m128i maxValues, compareResults, currentValues; maxValues = _mm_set1_epi8(max); for(number = 0; number < sse_iters; number++) { currentValues = _mm_load_si128((__m128i*)inputPtr); compareResults = _mm_cmpgt_epi8(maxValues, currentValues); maxValues = _mm_blendv_epi8(currentValues, maxValues, compareResults); inputPtr += 16; } _mm_store_si128((__m128i*)maxValuesBuffer, maxValues); for(i = 0; i < 16; ++i) { if(maxValuesBuffer[i] > max) { max = maxValuesBuffer[i]; } } for(i = sse_iters * 16; i < num_points; ++i) { if(src0[i] > max) { max = src0[i]; } } target[0] = max; } } #endif /*LV_HAVE_SSE4_1*/ #ifdef LV_HAVE_SSE2 #include static inline void volk_gnsssdr_8i_max_s8i_a_sse2(char* target, const char* src0, unsigned int num_points) { if(num_points > 0) { const unsigned int sse_iters = num_points / 16; unsigned int number; unsigned int i; char* inputPtr = (char*)src0; char max = src0[0]; unsigned short mask; __VOLK_ATTR_ALIGNED(16) char currentValuesBuffer[16]; __m128i maxValues, compareResults, currentValues; maxValues = _mm_set1_epi8(max); for(number = 0; number < sse_iters; number++) { currentValues = _mm_load_si128((__m128i*)inputPtr); compareResults = _mm_cmpgt_epi8(maxValues, currentValues); mask = _mm_movemask_epi8(compareResults); if (mask != 0xFFFF) { _mm_store_si128((__m128i*)¤tValuesBuffer, currentValues); mask = ~mask; int i = 0; while (mask > 0) { if ((mask & 1) == 1) { if(currentValuesBuffer[i] > max) { max = currentValuesBuffer[i]; } } i++; mask >>= 1; } maxValues = _mm_set1_epi8(max); } inputPtr += 16; } for(i = sse_iters * 16; i < num_points; ++i) { if(src0[i] > max) { max = src0[i]; } } target[0] = max; } } #endif /*LV_HAVE_SSE2*/ #endif /*INCLUDED_volk_gnsssdr_8i_max_s8i_H*/ volk_gnsssdr_8i_x2_add_8i.h000066400000000000000000000112031305042567700371720ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/*! * \file volk_gnsssdr_8i_x2_add_8i.h * \brief VOLK_GNSSSDR kernel: adds pairs of 8 bits (char) scalars. * \authors
      *
    • Andres Cecilia, 2014. a.cecilia.luque(at)gmail.com *
    * * VOLK_GNSSSDR kernel that adds pairs of 8 bits (char) scalars * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ /*! * \page volk_gnsssdr_8i_x2_add_8i * * \b Overview * * Adds the two input vectors and store the results in the third vector. * * Dispatcher Prototype * \code * void volk_gnsssdr_8i_x2_add_8i(char* cVector, const char* aVector, const char* bVector, unsigned int num_points); * \endcode * * \b Inputs * \li aVector: One of the vectors of to be added. * \li bVector: The other vector to be added. * \li num_points: Number of values in \p aVector and \p bVector to be added together and stored into \p cVector * * \b Outputs * \li cVector: The vector where the result will be stored. * */ #ifndef INCLUDED_volk_gnsssdr_8i_x2_add_8i_H #define INCLUDED_volk_gnsssdr_8i_x2_add_8i_H #ifdef LV_HAVE_SSE2 #include static inline void volk_gnsssdr_8i_x2_add_8i_u_sse2(char* cVector, const char* aVector, const char* bVector, unsigned int num_points) { const unsigned int sse_iters = num_points / 16; unsigned int number; unsigned int i; char* cPtr = cVector; const char* aPtr = aVector; const char* bPtr = bVector; __m128i aVal, bVal, cVal; for(number = 0; number < sse_iters; number++) { aVal = _mm_loadu_si128((__m128i*)aPtr); bVal = _mm_loadu_si128((__m128i*)bPtr); cVal = _mm_add_epi8(aVal, bVal); _mm_storeu_si128((__m128i*)cPtr, cVal); // Store the results back into the C container aPtr += 16; bPtr += 16; cPtr += 16; } for(i = sse_iters * 16; i < num_points; ++i) { *cPtr++ = (*aPtr++) + (*bPtr++); } } #endif /* LV_HAVE_SSE2 */ #ifdef LV_HAVE_GENERIC static inline void volk_gnsssdr_8i_x2_add_8i_generic(char* cVector, const char* aVector, const char* bVector, unsigned int num_points) { char* cPtr = cVector; const char* aPtr = aVector; const char* bPtr = bVector; unsigned int number; for(number = 0; number < num_points; number++) { *cPtr++ = (*aPtr++) + (*bPtr++); } } #endif /* LV_HAVE_GENERIC */ #ifdef LV_HAVE_SSE2 #include static inline void volk_gnsssdr_8i_x2_add_8i_a_sse2(char* cVector, const char* aVector, const char* bVector, unsigned int num_points) { const unsigned int sse_iters = num_points / 16; unsigned int number; unsigned int i; char* cPtr = cVector; const char* aPtr = aVector; const char* bPtr = bVector; __m128i aVal, bVal, cVal; for(number = 0; number < sse_iters; number++) { aVal = _mm_load_si128((__m128i*)aPtr); bVal = _mm_load_si128((__m128i*)bPtr); cVal = _mm_add_epi8(aVal, bVal); _mm_store_si128((__m128i*)cPtr, cVal); // Store the results back into the C container aPtr += 16; bPtr += 16; cPtr += 16; } for(i = sse_iters * 16; i < num_points; ++i) { *cPtr++ = (*aPtr++) + (*bPtr++); } } #endif /* LV_HAVE_SSE2 */ #ifdef LV_HAVE_ORC extern void volk_gnsssdr_8i_x2_add_8i_a_orc_impl(char* cVector, const char* aVector, const char* bVector, unsigned int num_points); static inline void volk_gnsssdr_8i_x2_add_8i_u_orc(char* cVector, const char* aVector, const char* bVector, unsigned int num_points) { volk_gnsssdr_8i_x2_add_8i_a_orc_impl(cVector, aVector, bVector, num_points); } #endif /* LV_HAVE_ORC */ #endif /* INCLUDED_volk_gnsssdr_8i_x2_add_8i_H */ volk_gnsssdr_8ic_conjugate_8ic.h000066400000000000000000000234631305042567700403310ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/*! * \file volk_gnsssdr_8ic_conjugate_8ic.h * \brief VOLK_GNSSSDR kernel: calculates the conjugate of a 16 bits vector. * \authors
      *
    • Andres Cecilia, 2014. a.cecilia.luque(at)gmail.com *
    * * VOLK_GNSSSDR kernel that calculates the conjugate of a * 16 bits vector (8 bits the real part and 8 bits the imaginary part) * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ /*! * \page volk_gnsssdr_8ic_conjugate_8ic * * \b Overview * * Takes the conjugate of a complex unsigned char vector. * * Dispatcher Prototype * \code * void volk_gnsssdr_8ic_conjugate_8ic(lv_8sc_t* cVector, const lv_8sc_t* aVector, unsigned int num_points); * \endcode * * \b Inputs * \li aVector: Vector of complex items to be conjugated * \li num_points: The number of complex data points. * * \b Outputs * \li cVector: The vector where the result will be stored * */ #ifndef INCLUDED_volk_gnsssdr_8ic_conjugate_8ic_H #define INCLUDED_volk_gnsssdr_8ic_conjugate_8ic_H #include #ifdef LV_HAVE_AVX #include static inline void volk_gnsssdr_8ic_conjugate_8ic_u_avx(lv_8sc_t* cVector, const lv_8sc_t* aVector, unsigned int num_points) { const unsigned int sse_iters = num_points / 16; unsigned int i; lv_8sc_t* c = cVector; const lv_8sc_t* a = aVector; __m256 tmp; __m128i tmp128lo, tmp128hi; __m256 conjugator1 = _mm256_castsi256_ps(_mm256_setr_epi8(0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255)); __m128i conjugator2 = _mm_setr_epi8(0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1); for (i = 0; i < sse_iters; ++i) { tmp = _mm256_loadu_ps((float*)a); tmp = _mm256_xor_ps(tmp, conjugator1); tmp128lo = _mm256_castsi256_si128(_mm256_castps_si256(tmp)); tmp128lo = _mm_add_epi8(tmp128lo, conjugator2); tmp128hi = _mm256_extractf128_si256(_mm256_castps_si256(tmp),1); tmp128hi = _mm_add_epi8(tmp128hi, conjugator2); //tmp = _mm256_set_m128i(tmp128hi , tmp128lo); //not defined in some versions of immintrin.h tmp = _mm256_castsi256_ps(_mm256_insertf128_si256(_mm256_castsi128_si256(tmp128lo),(tmp128hi),1)); _mm256_storeu_ps((float*)c, tmp); a += 16; c += 16; } for (i = sse_iters * 16; i < num_points; ++i) { *c++ = lv_conj(*a++); } } #endif /* LV_HAVE_AVX */ #ifdef LV_HAVE_SSSE3 #include static inline void volk_gnsssdr_8ic_conjugate_8ic_u_ssse3(lv_8sc_t* cVector, const lv_8sc_t* aVector, unsigned int num_points) { const unsigned int sse_iters = num_points / 8; unsigned int i; lv_8sc_t* c = cVector; const lv_8sc_t* a = aVector; __m128i tmp; __m128i conjugator = _mm_setr_epi8(1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1); for (i = 0; i < sse_iters; ++i) { tmp = _mm_lddqu_si128((__m128i*)a); tmp = _mm_sign_epi8(tmp, conjugator); _mm_storeu_si128((__m128i*)c, tmp); a += 8; c += 8; } for (i = sse_iters * 8; i < num_points; ++i) { *c++ = lv_conj(*a++); } } #endif /* LV_HAVE_SSSE3 */ #ifdef LV_HAVE_SSE3 #include static inline void volk_gnsssdr_8ic_conjugate_8ic_u_sse3(lv_8sc_t* cVector, const lv_8sc_t* aVector, unsigned int num_points) { const unsigned int sse_iters = num_points / 8; unsigned int i; lv_8sc_t* c = cVector; const lv_8sc_t* a = aVector; __m128i tmp; __m128i conjugator1 = _mm_setr_epi8(0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255); __m128i conjugator2 = _mm_setr_epi8(0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1); for (i = 0; i < sse_iters; ++i) { tmp = _mm_lddqu_si128((__m128i*)a); tmp = _mm_xor_si128(tmp, conjugator1); tmp = _mm_add_epi8(tmp, conjugator2); _mm_storeu_si128((__m128i*)c, tmp); a += 8; c += 8; } for (i = sse_iters * 8; i < num_points; ++i) { *c++ = lv_conj(*a++); } } #endif /* LV_HAVE_SSE3 */ #ifdef LV_HAVE_GENERIC static inline void volk_gnsssdr_8ic_conjugate_8ic_generic(lv_8sc_t* cVector, const lv_8sc_t* aVector, unsigned int num_points) { lv_8sc_t* cPtr = cVector; const lv_8sc_t* aPtr = aVector; unsigned int number; for(number = 0; number < num_points; number++) { *cPtr++ = lv_conj(*aPtr++); } } #endif /* LV_HAVE_GENERIC */ #ifdef LV_HAVE_AVX #include static inline void volk_gnsssdr_8ic_conjugate_8ic_a_avx(lv_8sc_t* cVector, const lv_8sc_t* aVector, unsigned int num_points) { const unsigned int sse_iters = num_points / 16; unsigned int i; lv_8sc_t* c = cVector; const lv_8sc_t* a = aVector; __m256 tmp; __m128i tmp128lo, tmp128hi; __m256 conjugator1 = _mm256_castsi256_ps(_mm256_setr_epi8(0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255)); __m128i conjugator2 = _mm_setr_epi8(0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1); for (i = 0; i < sse_iters; ++i) { tmp = _mm256_load_ps((float*)a); tmp = _mm256_xor_ps(tmp, conjugator1); tmp128lo = _mm256_castsi256_si128(_mm256_castps_si256(tmp)); tmp128lo = _mm_add_epi8(tmp128lo, conjugator2); tmp128hi = _mm256_extractf128_si256(_mm256_castps_si256(tmp),1); tmp128hi = _mm_add_epi8(tmp128hi, conjugator2); //tmp = _mm256_set_m128i(tmp128hi , tmp128lo); //not defined in some versions of immintrin.h tmp = _mm256_castsi256_ps(_mm256_insertf128_si256(_mm256_castsi128_si256(tmp128lo),(tmp128hi),1)); _mm256_store_ps((float*)c, tmp); a += 16; c += 16; } for (i = sse_iters * 16; i < num_points; ++i) { *c++ = lv_conj(*a++); } } #endif /* LV_HAVE_AVX */ #ifdef LV_HAVE_SSSE3 #include static inline void volk_gnsssdr_8ic_conjugate_8ic_a_ssse3(lv_8sc_t* cVector, const lv_8sc_t* aVector, unsigned int num_points) { const unsigned int sse_iters = num_points / 8; unsigned int i; lv_8sc_t* c = cVector; const lv_8sc_t* a = aVector; __m128i tmp; __m128i conjugator = _mm_setr_epi8(1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1); for (i = 0; i < sse_iters; ++i) { tmp = _mm_load_si128((__m128i*)a); tmp = _mm_sign_epi8(tmp, conjugator); _mm_store_si128((__m128i*)c, tmp); a += 8; c += 8; } for (i = sse_iters * 8; i < num_points; ++i) { *c++ = lv_conj(*a++); } } #endif /* LV_HAVE_SSSE3 */ #ifdef LV_HAVE_SSE3 #include static inline void volk_gnsssdr_8ic_conjugate_8ic_a_sse3(lv_8sc_t* cVector, const lv_8sc_t* aVector, unsigned int num_points) { const unsigned int sse_iters = num_points / 8; unsigned int i; lv_8sc_t* c = cVector; const lv_8sc_t* a = aVector; __m128i tmp; __m128i conjugator1 = _mm_setr_epi8(0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255); __m128i conjugator2 = _mm_setr_epi8(0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1); for (i = 0; i < sse_iters; ++i) { tmp = _mm_load_si128((__m128i*)a); tmp = _mm_xor_si128(tmp, conjugator1); tmp = _mm_add_epi8(tmp, conjugator2); _mm_store_si128((__m128i*)c, tmp); a += 8; c += 8; } for (i = sse_iters * 8; i < num_points; ++i) { *c++ = lv_conj(*a++); } } #endif /* LV_HAVE_SSE3 */ #ifdef LV_HAVE_ORC extern void volk_gnsssdr_8ic_conjugate_8ic_a_orc_impl(lv_8sc_t* cVector, const lv_8sc_t* aVector, unsigned int num_points); static inline void volk_gnsssdr_8ic_conjugate_8ic_u_orc(lv_8sc_t* cVector, const lv_8sc_t* aVector, unsigned int num_points) { volk_gnsssdr_8ic_conjugate_8ic_a_orc_impl(cVector, aVector, num_points); } #endif /* LV_HAVE_ORC */ #ifdef LV_HAVE_NEON #include static inline void volk_gnsssdr_8ic_conjugate_8ic_neon(lv_8sc_t* cVector, const lv_8sc_t* aVector, unsigned int num_points) { const unsigned int sse_iters = num_points / 8; unsigned int i; lv_8sc_t* c = cVector; const lv_8sc_t* a = aVector; int8x8x2_t a_val; for (i = 0; i < sse_iters; ++i) { a_val = vld2_s8((const int8_t*)a); __VOLK_GNSSSDR_PREFETCH(a + 16); a_val.val[1] = vneg_s8(a_val.val[1]); vst2_s8((int8_t*)c, a_val); a += 8; c += 8; } for (i = sse_iters * 8; i < num_points; ++i) { *c++ = lv_conj(*a++); } } #endif /* LV_HAVE_NEON */ #endif /* INCLUDED_volk_gnsssdr_8ic_conjugate_8ic_H */ volk_gnsssdr_8ic_magnitude_squared_8i.h000066400000000000000000000250111305042567700416770ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/*! * \file volk_gnsssdr_8ic_magnitude_squared_8i.h * \brief VOLK_GNSSSDR kernel: calculates the magnitude squared of a 16 bits vector. * \authors
      *
    • Andres Cecilia, 2014. a.cecilia.luque(at)gmail.com *
    * * VOLK_GNSSSDR kernel that calculates the magnitude squared of a * 16 bits vector (8 bits the real part and 8 bits the imaginary part) * result = (real*real) + (imag*imag) * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ /*! * \page volk_gnsssdr_8ic_magnitude_squared_8i * * \b Overview * * Calculates the magnitude squared of the complex data items in \p complexVector and stores the results in \p magnitudeVector * * Dispatcher Prototype * \code * void volk_gnsssdr_8ic_magnitude_squared_8i(char* magnitudeVector, const lv_8sc_t* complexVector, unsigned int num_points); * \endcode * * \b Inputs * \li complexVector: The vector containing the complex input values * \li num_points: The number of complex data points. * * \b Outputs * \li magnitudeVector: The vector containing the real output values * */ #ifndef INCLUDED_volk_gnsssdr_8ic_magnitude_squared_8i_H #define INCLUDED_volk_gnsssdr_8ic_magnitude_squared_8i_H #ifdef LV_HAVE_SSSE3 #include static inline void volk_gnsssdr_8ic_magnitude_squared_8i_u_sse3(char* magnitudeVector, const lv_8sc_t* complexVector, unsigned int num_points) { const unsigned int sse_iters = num_points / 16; unsigned int number; unsigned int i; const char* complexVectorPtr = (char*)complexVector; char* magnitudeVectorPtr = magnitudeVector; __m128i zero, result8; __m128i avector, avectorhi, avectorlo, avectorlomult, avectorhimult, aadded, maska; __m128i bvector, bvectorhi, bvectorlo, bvectorlomult, bvectorhimult, badded, maskb; zero = _mm_setzero_si128(); maska = _mm_set_epi8(0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 14, 12, 10, 8, 6, 4, 2, 0); maskb = _mm_set_epi8(14, 12, 10, 8, 6, 4, 2, 0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80); for(number = 0; number < sse_iters; number++) { avector = _mm_lddqu_si128((__m128i*)complexVectorPtr); avectorlo = _mm_unpacklo_epi8 (avector, zero); avectorhi = _mm_unpackhi_epi8 (avector, zero); avectorlomult = _mm_mullo_epi16 (avectorlo, avectorlo); avectorhimult = _mm_mullo_epi16 (avectorhi, avectorhi); aadded = _mm_hadd_epi16 (avectorlomult, avectorhimult); complexVectorPtr += 16; bvector = _mm_lddqu_si128((__m128i*)complexVectorPtr); bvectorlo = _mm_unpacklo_epi8 (bvector, zero); bvectorhi = _mm_unpackhi_epi8 (bvector, zero); bvectorlomult = _mm_mullo_epi16 (bvectorlo, bvectorlo); bvectorhimult = _mm_mullo_epi16 (bvectorhi, bvectorhi); badded = _mm_hadd_epi16 (bvectorlomult, bvectorhimult); complexVectorPtr += 16; result8 = _mm_or_si128(_mm_shuffle_epi8(aadded, maska), _mm_shuffle_epi8(badded, maskb)); _mm_storeu_si128((__m128i*)magnitudeVectorPtr, result8); magnitudeVectorPtr += 16; } for (i = sse_iters * 16; i < num_points; ++i) { const char valReal = *complexVectorPtr++; const char valImag = *complexVectorPtr++; *magnitudeVectorPtr++ = (valReal * valReal) + (valImag * valImag); } } #endif /* LV_HAVE_SSSE3 */ //#ifdef LV_HAVE_SSE //#include // //static inline void volk_gnsssdr_8ic_magnitude_squared_8i_u_sse(float* magnitudeVector, const lv_32fc_t* complexVector, unsigned int num_points){ // unsigned int number = 0; // const unsigned int quarterPoints = num_points / 4; // // const float* complexVectorPtr = (float*)complexVector; // float* magnitudeVectorPtr = magnitudeVector; // // __m128 cplxValue1, cplxValue2, iValue, qValue, result; // for(;number < quarterPoints; number++){ // cplxValue1 = _mm_loadu_ps(complexVectorPtr); // complexVectorPtr += 4; // // cplxValue2 = _mm_loadu_ps(complexVectorPtr); // complexVectorPtr += 4; // // // Arrange in i1i2i3i4 format // iValue = _mm_shuffle_ps(cplxValue1, cplxValue2, _MM_SHUFFLE(2,0,2,0)); // // Arrange in q1q2q3q4 format // qValue = _mm_shuffle_ps(cplxValue1, cplxValue2, _MM_SHUFFLE(3,1,3,1)); // // iValue = _mm_mul_ps(iValue, iValue); // Square the I values // qValue = _mm_mul_ps(qValue, qValue); // Square the Q Values // // result = _mm_add_ps(iValue, qValue); // Add the I2 and Q2 values // // _mm_storeu_ps(magnitudeVectorPtr, result); // magnitudeVectorPtr += 4; // } // // number = quarterPoints * 4; // for(; number < num_points; number++){ // float val1Real = *complexVectorPtr++; // float val1Imag = *complexVectorPtr++; // *magnitudeVectorPtr++ = (val1Real * val1Real) + (val1Imag * val1Imag); // } //} //#endif /* LV_HAVE_SSE */ #ifdef LV_HAVE_GENERIC static inline void volk_gnsssdr_8ic_magnitude_squared_8i_generic(char* magnitudeVector, const lv_8sc_t* complexVector, unsigned int num_points) { const char* complexVectorPtr = (char*)complexVector; char* magnitudeVectorPtr = magnitudeVector; unsigned int number; for(number = 0; number < num_points; number++) { const char real = *complexVectorPtr++; const char imag = *complexVectorPtr++; *magnitudeVectorPtr++ = (real*real) + (imag*imag); } } #endif /* LV_HAVE_GENERIC */ #ifdef LV_HAVE_SSSE3 #include static inline void volk_gnsssdr_8ic_magnitude_squared_8i_a_sse3(char* magnitudeVector, const lv_8sc_t* complexVector, unsigned int num_points) { const unsigned int sse_iters = num_points / 16; const char* complexVectorPtr = (char*)complexVector; char* magnitudeVectorPtr = magnitudeVector; unsigned int number; unsigned int i; __m128i zero, result8; __m128i avector, avectorhi, avectorlo, avectorlomult, avectorhimult, aadded, maska; __m128i bvector, bvectorhi, bvectorlo, bvectorlomult, bvectorhimult, badded, maskb; zero = _mm_setzero_si128(); maska = _mm_set_epi8(0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 14, 12, 10, 8, 6, 4, 2, 0); maskb = _mm_set_epi8(14, 12, 10, 8, 6, 4, 2, 0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80); for(number = 0; number < sse_iters; number++) { avector = _mm_load_si128((__m128i*)complexVectorPtr); avectorlo = _mm_unpacklo_epi8 (avector, zero); avectorhi = _mm_unpackhi_epi8 (avector, zero); avectorlomult = _mm_mullo_epi16 (avectorlo, avectorlo); avectorhimult = _mm_mullo_epi16 (avectorhi, avectorhi); aadded = _mm_hadd_epi16 (avectorlomult, avectorhimult); complexVectorPtr += 16; bvector = _mm_load_si128((__m128i*)complexVectorPtr); bvectorlo = _mm_unpacklo_epi8 (bvector, zero); bvectorhi = _mm_unpackhi_epi8 (bvector, zero); bvectorlomult = _mm_mullo_epi16 (bvectorlo, bvectorlo); bvectorhimult = _mm_mullo_epi16 (bvectorhi, bvectorhi); badded = _mm_hadd_epi16 (bvectorlomult, bvectorhimult); complexVectorPtr += 16; result8 = _mm_or_si128(_mm_shuffle_epi8(aadded, maska), _mm_shuffle_epi8(badded, maskb)); _mm_store_si128((__m128i*)magnitudeVectorPtr, result8); magnitudeVectorPtr += 16; } for (i = sse_iters * 16; i < num_points; ++i) { const char valReal = *complexVectorPtr++; const char valImag = *complexVectorPtr++; *magnitudeVectorPtr++ = (valReal * valReal) + (valImag * valImag); } } #endif /* LV_HAVE_SSSE3 */ //#ifdef LV_HAVE_SSE //#include // //static inline void volk_gnsssdr_8ic_magnitude_squared_8i_a_sse(float* magnitudeVector, const lv_32fc_t* complexVector, unsigned int num_points){ // unsigned int number = 0; // const unsigned int quarterPoints = num_points / 4; // // const float* complexVectorPtr = (float*)complexVector; // float* magnitudeVectorPtr = magnitudeVector; // // __m128 cplxValue1, cplxValue2, iValue, qValue, result; // for(;number < quarterPoints; number++){ // cplxValue1 = _mm_load_ps(complexVectorPtr); // complexVectorPtr += 4; // // cplxValue2 = _mm_load_ps(complexVectorPtr); // complexVectorPtr += 4; // // // Arrange in i1i2i3i4 format // iValue = _mm_shuffle_ps(cplxValue1, cplxValue2, _MM_SHUFFLE(2,0,2,0)); // // Arrange in q1q2q3q4 format // qValue = _mm_shuffle_ps(cplxValue1, cplxValue2, _MM_SHUFFLE(3,1,3,1)); // // iValue = _mm_mul_ps(iValue, iValue); // Square the I values // qValue = _mm_mul_ps(qValue, qValue); // Square the Q Values // // result = _mm_add_ps(iValue, qValue); // Add the I2 and Q2 values // // _mm_store_ps(magnitudeVectorPtr, result); // magnitudeVectorPtr += 4; // } // // number = quarterPoints * 4; // for(; number < num_points; number++){ // float val1Real = *complexVectorPtr++; // float val1Imag = *complexVectorPtr++; // *magnitudeVectorPtr++ = (val1Real * val1Real) + (val1Imag * val1Imag); // } //} //#endif /* LV_HAVE_SSE */ #ifdef LV_HAVE_ORC extern void volk_gnsssdr_8ic_magnitude_squared_8i_a_orc_impl(char* magnitudeVector, const lv_8sc_t* complexVector, unsigned int num_points); static inline void volk_gnsssdr_8ic_magnitude_squared_8i_u_orc(char* magnitudeVector, const lv_8sc_t* complexVector, unsigned int num_points) { volk_gnsssdr_8ic_magnitude_squared_8i_a_orc_impl(magnitudeVector, complexVector, num_points); } #endif /* LV_HAVE_ORC */ #endif /* INCLUDED_volk_gnsssdr_32fc_magnitude_32f_H */ volk_gnsssdr_8ic_s8ic_multiply_8ic.h000066400000000000000000000163401305042567700411530ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/*! * \file volk_gnsssdr_8ic_s8ic_multiply_8ic.h * \brief VOLK_GNSSSDR kernel: multiplies a group of 16 bits vectors by one constant vector. * \authors
      *
    • Andres Cecilia, 2014. a.cecilia.luque(at)gmail.com *
    * * VOLK_GNSSSDR kernel that multiplies a group of 16 bits vectors * (8 bits the real part and 8 bits the imaginary part) by one constant vector * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ /*! * \page volk_gnsssdr_8ic_s8ic_multiply_8ic * * \b Overview * * Multiplies the input vector by a scalar and stores the results in the third vector * * Dispatcher Prototype * \code * void volk_gnsssdr_8ic_s8ic_multiply_8ic(lv_8sc_t* cVector, const lv_8sc_t* aVector, const lv_8sc_t scalar, unsigned int num_points); * \endcode * * \b Inputs * \li aVector: The vector to be multiplied. * \li scalar The complex scalar to multiply \p aVector * \li num_points: The number of complex values in \p aVector to be multiplied by \p scalar and stored into \p cVector. * * \b Outputs * \li cVector: The vector where the results will be stored * */ #ifndef INCLUDED_volk_gnsssdr_8ic_s8ic_multiply_8ic_H #define INCLUDED_volk_gnsssdr_8ic_s8ic_multiply_8ic_H #include #ifdef LV_HAVE_SSE3 #include static inline void volk_gnsssdr_8ic_s8ic_multiply_8ic_u_sse3(lv_8sc_t* cVector, const lv_8sc_t* aVector, const lv_8sc_t scalar, unsigned int num_points) { unsigned int number = 0; const unsigned int sse_iters = num_points / 8; __m128i x, y, mult1, realx, imagx, realy, imagy, realx_mult_realy, imagx_mult_imagy, realx_mult_imagy, imagx_mult_realy, realc, imagc, totalc; lv_8sc_t* c = cVector; const lv_8sc_t* a = aVector; mult1 = _mm_set_epi8(0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255); y = _mm_set1_epi16(*(short*)&scalar); imagy = _mm_srli_si128(y, 1); imagy = _mm_and_si128(imagy, mult1); realy = _mm_and_si128(y, mult1); for(; number < sse_iters; number++) { x = _mm_lddqu_si128((__m128i*)a); imagx = _mm_srli_si128(x, 1); imagx = _mm_and_si128(imagx, mult1); realx = _mm_and_si128(x, mult1); realx_mult_realy = _mm_mullo_epi16(realx, realy); imagx_mult_imagy = _mm_mullo_epi16(imagx, imagy); realx_mult_imagy = _mm_mullo_epi16(realx, imagy); imagx_mult_realy = _mm_mullo_epi16(imagx, realy); realc = _mm_sub_epi16(realx_mult_realy, imagx_mult_imagy); realc = _mm_and_si128(realc, mult1); imagc = _mm_add_epi16(realx_mult_imagy, imagx_mult_realy); imagc = _mm_and_si128(imagc, mult1); imagc = _mm_slli_si128(imagc, 1); totalc = _mm_or_si128(realc, imagc); _mm_storeu_si128((__m128i*)c, totalc); a += 8; c += 8; } for (number = sse_iters * 8; number < num_points; ++number) { *c++ = (*a++) * scalar; } } #endif /* LV_HAVE_SSE3 */ #ifdef LV_HAVE_GENERIC static inline void volk_gnsssdr_8ic_s8ic_multiply_8ic_generic(lv_8sc_t* cVector, const lv_8sc_t* aVector, const lv_8sc_t scalar, unsigned int num_points) { /*lv_8sc_t* cPtr = cVector; const lv_8sc_t* aPtr = aVector; for (int i = 0; i= 8) { *cPtr++ = (*aPtr++) * scalar; *cPtr++ = (*aPtr++) * scalar; *cPtr++ = (*aPtr++) * scalar; *cPtr++ = (*aPtr++) * scalar; *cPtr++ = (*aPtr++) * scalar; *cPtr++ = (*aPtr++) * scalar; *cPtr++ = (*aPtr++) * scalar; *cPtr++ = (*aPtr++) * scalar; number -= 8; } // clean up any remaining while (number-- > 0) *cPtr++ = *aPtr++ * scalar; } #endif /* LV_HAVE_GENERIC */ #ifdef LV_HAVE_SSE3 #include static inline void volk_gnsssdr_8ic_s8ic_multiply_8ic_a_sse3(lv_8sc_t* cVector, const lv_8sc_t* aVector, const lv_8sc_t scalar, unsigned int num_points) { unsigned int number = 0; const unsigned int sse_iters = num_points / 8; __m128i x, y, mult1, realx, imagx, realy, imagy, realx_mult_realy, imagx_mult_imagy, realx_mult_imagy, imagx_mult_realy, realc, imagc, totalc; lv_8sc_t* c = cVector; const lv_8sc_t* a = aVector; mult1 = _mm_set_epi8(0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255); y = _mm_set1_epi16(*(short*)&scalar); imagy = _mm_srli_si128(y, 1); imagy = _mm_and_si128(imagy, mult1); realy = _mm_and_si128(y, mult1); for(; number < sse_iters; number++) { x = _mm_load_si128((__m128i*)a); imagx = _mm_srli_si128(x, 1); imagx = _mm_and_si128(imagx, mult1); realx = _mm_and_si128(x, mult1); realx_mult_realy = _mm_mullo_epi16(realx, realy); imagx_mult_imagy = _mm_mullo_epi16(imagx, imagy); realx_mult_imagy = _mm_mullo_epi16(realx, imagy); imagx_mult_realy = _mm_mullo_epi16(imagx, realy); realc = _mm_sub_epi16(realx_mult_realy, imagx_mult_imagy); realc = _mm_and_si128(realc, mult1); imagc = _mm_add_epi16(realx_mult_imagy, imagx_mult_realy); imagc = _mm_and_si128(imagc, mult1); imagc = _mm_slli_si128(imagc, 1); totalc = _mm_or_si128(realc, imagc); _mm_store_si128((__m128i*)c, totalc); a += 8; c += 8; } for (number = sse_iters * 8; number < num_points; ++number) { *c++ = (*a++) * scalar; } } #endif /* LV_HAVE_SSE3 */ #ifdef LV_HAVE_ORC extern void volk_gnsssdr_8ic_s8ic_multiply_8ic_a_orc_impl(lv_8sc_t* cVector, const lv_8sc_t* aVector, const char scalarreal, const char scalarimag, unsigned int num_points); static inline void volk_gnsssdr_8ic_s8ic_multiply_8ic_u_orc(lv_8sc_t* cVector, const lv_8sc_t* aVector, const lv_8sc_t scalar, unsigned int num_points) { volk_gnsssdr_8ic_s8ic_multiply_8ic_a_orc_impl(cVector, aVector, lv_creal(scalar), lv_cimag(scalar), num_points); } #endif /* LV_HAVE_ORC */ #endif /* INCLUDED_volk_gnsssdr_32fc_x2_multiply_32fc_H */ volk_gnsssdr_8ic_x2_dot_prod_8ic.h000066400000000000000000000407701305042567700405750ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/*! * \file volk_gnsssdr_8ic_x2_dot_prod_8ic.h * \brief VOLK_GNSSSDR kernel: multiplies two 16 bits vectors and accumulates them. * \authors
      *
    • Andres Cecilia, 2014. a.cecilia.luque(at)gmail.com *
    * * VOLK_GNSSSDR kernel that multiplies two 16 bits vectors (8 bits the real part * and 8 bits the imaginary part) and accumulates them. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ /*! * \page volk_gnsssdr_8ic_x2_dot_prod_8ic * * \b Overview * * Multiplies two input complex vectors (8-bit integer each component) and accumulates them, * storing the result. * * Dispatcher Prototype * \code * void volk_gnsssdr_16ic_x2_dot_prod_16ic(lv_16sc_t* result, const lv_16sc_t* in_a, const lv_16sc_t* in_b, unsigned int num_points); * \endcode * * \b Inputs * \li in_a: One of the vectors to be multiplied and accumulated * \li in_b: The other vector to be multiplied and accumulated * \li num_points: The Number of complex values to be multiplied together, accumulated and stored into \p result * * \b Outputs * \li result: Value of the accumulated result * */ #ifndef INCLUDED_volk_gnsssdr_8ic_x2_dot_prod_8ic_H #define INCLUDED_volk_gnsssdr_8ic_x2_dot_prod_8ic_H #include #include #include #ifdef LV_HAVE_GENERIC static inline void volk_gnsssdr_8ic_x2_dot_prod_8ic_generic(lv_8sc_t* result, const lv_8sc_t* in_a, const lv_8sc_t* in_b, unsigned int num_points) { /*lv_8sc_t* cPtr = result; const lv_8sc_t* aPtr = in_a; const lv_8sc_t* bPtr = in_b; for(int number = 0; number < num_points; number++){ *cPtr += (*aPtr++) * (*bPtr++); }*/ char * res = (char*) result; char * in = (char*) in_a; char * tp = (char*) in_b; unsigned int n_2_ccomplex_blocks = num_points/2; unsigned int isodd = num_points & 1; char sum0[2] = {0,0}; char sum1[2] = {0,0}; unsigned int i = 0; for(i = 0; i < n_2_ccomplex_blocks; ++i) { sum0[0] += in[0] * tp[0] - in[1] * tp[1]; sum0[1] += in[0] * tp[1] + in[1] * tp[0]; sum1[0] += in[2] * tp[2] - in[3] * tp[3]; sum1[1] += in[2] * tp[3] + in[3] * tp[2]; in += 4; tp += 4; } res[0] = sum0[0] + sum1[0]; res[1] = sum0[1] + sum1[1]; // Cleanup if we had an odd number of points for(i = 0; i < isodd; ++i) { *result += in_a[num_points - 1] * in_b[num_points - 1]; } } #endif /*LV_HAVE_GENERIC*/ #ifdef LV_HAVE_SSE2 #include static inline void volk_gnsssdr_8ic_x2_dot_prod_8ic_u_sse2(lv_8sc_t* result, const lv_8sc_t* in_a, const lv_8sc_t* in_b, unsigned int num_points) { lv_8sc_t dotProduct; memset(&dotProduct, 0x0, 2*sizeof(char)); unsigned int number; unsigned int i; const lv_8sc_t* a = in_a; const lv_8sc_t* b = in_b; const unsigned int sse_iters = num_points/8; if (sse_iters > 0) { __m128i x, y, mult1, realx, imagx, realy, imagy, realx_mult_realy, imagx_mult_imagy, realx_mult_imagy, imagx_mult_realy, realc, imagc, totalc, realcacc, imagcacc; mult1 = _mm_set_epi8(0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255); realcacc = _mm_setzero_si128(); imagcacc = _mm_setzero_si128(); for(number = 0; number < sse_iters; number++) { x = _mm_loadu_si128((__m128i*)a); y = _mm_loadu_si128((__m128i*)b); imagx = _mm_srli_si128(x, 1); imagx = _mm_and_si128(imagx, mult1); realx = _mm_and_si128(x, mult1); imagy = _mm_srli_si128(y, 1); imagy = _mm_and_si128(imagy, mult1); realy = _mm_and_si128(y, mult1); realx_mult_realy = _mm_mullo_epi16(realx, realy); imagx_mult_imagy = _mm_mullo_epi16(imagx, imagy); realx_mult_imagy = _mm_mullo_epi16(realx, imagy); imagx_mult_realy = _mm_mullo_epi16(imagx, realy); realc = _mm_sub_epi16(realx_mult_realy, imagx_mult_imagy); imagc = _mm_add_epi16(realx_mult_imagy, imagx_mult_realy); realcacc = _mm_add_epi16(realcacc, realc); imagcacc = _mm_add_epi16(imagcacc, imagc); a += 8; b += 8; } realcacc = _mm_and_si128(realcacc, mult1); imagcacc = _mm_and_si128(imagcacc, mult1); imagcacc = _mm_slli_si128(imagcacc, 1); totalc = _mm_or_si128(realcacc, imagcacc); __VOLK_ATTR_ALIGNED(16) lv_8sc_t dotProductVector[8]; _mm_storeu_si128((__m128i*)dotProductVector, totalc); // Store the results back into the dot product vector for (i = 0; i < 8; ++i) { dotProduct += dotProductVector[i]; } } for (i = sse_iters * 8; i < num_points; ++i) { dotProduct += (*a++) * (*b++); } *result = dotProduct; } #endif /*LV_HAVE_SSE2*/ #ifdef LV_HAVE_SSE4_1 #include static inline void volk_gnsssdr_8ic_x2_dot_prod_8ic_u_sse4_1(lv_8sc_t* result, const lv_8sc_t* in_a, const lv_8sc_t* in_b, unsigned int num_points) { lv_8sc_t dotProduct; memset(&dotProduct, 0x0, 2*sizeof(char)); unsigned int number; unsigned int i; const lv_8sc_t* a = in_a; const lv_8sc_t* b = in_b; const unsigned int sse_iters = num_points/8; if (sse_iters > 0) { __m128i x, y, mult1, realx, imagx, realy, imagy, realx_mult_realy, imagx_mult_imagy, realx_mult_imagy, imagx_mult_realy, realc, imagc, totalc, realcacc, imagcacc; mult1 = _mm_set_epi8(0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255); realcacc = _mm_setzero_si128(); imagcacc = _mm_setzero_si128(); for(number = 0; number < sse_iters; number++) { x = _mm_lddqu_si128((__m128i*)a); y = _mm_lddqu_si128((__m128i*)b); imagx = _mm_srli_si128(x, 1); imagx = _mm_and_si128(imagx, mult1); realx = _mm_and_si128(x, mult1); imagy = _mm_srli_si128(y, 1); imagy = _mm_and_si128(imagy, mult1); realy = _mm_and_si128(y, mult1); realx_mult_realy = _mm_mullo_epi16(realx, realy); imagx_mult_imagy = _mm_mullo_epi16(imagx, imagy); realx_mult_imagy = _mm_mullo_epi16(realx, imagy); imagx_mult_realy = _mm_mullo_epi16(imagx, realy); realc = _mm_sub_epi16(realx_mult_realy, imagx_mult_imagy); imagc = _mm_add_epi16(realx_mult_imagy, imagx_mult_realy); realcacc = _mm_add_epi16(realcacc, realc); imagcacc = _mm_add_epi16(imagcacc, imagc); a += 8; b += 8; } imagcacc = _mm_slli_si128 (imagcacc, 1); totalc = _mm_blendv_epi8 (imagcacc, realcacc, mult1); __VOLK_ATTR_ALIGNED(16) lv_8sc_t dotProductVector[8]; _mm_storeu_si128((__m128i*)dotProductVector, totalc); // Store the results back into the dot product vector for (i = 0; i < 8; ++i) { dotProduct += dotProductVector[i]; } } for (i = sse_iters * 8; i < num_points; ++i) { dotProduct += (*a++) * (*b++); } *result = dotProduct; } #endif /*LV_HAVE_SSE4_1*/ #ifdef LV_HAVE_SSE2 #include static inline void volk_gnsssdr_8ic_x2_dot_prod_8ic_a_sse2(lv_8sc_t* result, const lv_8sc_t* in_a, const lv_8sc_t* in_b, unsigned int num_points) { lv_8sc_t dotProduct; memset(&dotProduct, 0x0, 2*sizeof(char)); unsigned int number; unsigned int i; const lv_8sc_t* a = in_a; const lv_8sc_t* b = in_b; const unsigned int sse_iters = num_points/8; if (sse_iters > 0) { __m128i x, y, mult1, realx, imagx, realy, imagy, realx_mult_realy, imagx_mult_imagy, realx_mult_imagy, imagx_mult_realy, realc, imagc, totalc, realcacc, imagcacc; mult1 = _mm_set_epi8(0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255); realcacc = _mm_setzero_si128(); imagcacc = _mm_setzero_si128(); for(number = 0; number < sse_iters; number++) { x = _mm_load_si128((__m128i*)a); y = _mm_load_si128((__m128i*)b); imagx = _mm_srli_si128(x, 1); imagx = _mm_and_si128(imagx, mult1); realx = _mm_and_si128(x, mult1); imagy = _mm_srli_si128(y, 1); imagy = _mm_and_si128(imagy, mult1); realy = _mm_and_si128(y, mult1); realx_mult_realy = _mm_mullo_epi16(realx, realy); imagx_mult_imagy = _mm_mullo_epi16(imagx, imagy); realx_mult_imagy = _mm_mullo_epi16(realx, imagy); imagx_mult_realy = _mm_mullo_epi16(imagx, realy); realc = _mm_sub_epi16(realx_mult_realy, imagx_mult_imagy); imagc = _mm_add_epi16(realx_mult_imagy, imagx_mult_realy); realcacc = _mm_add_epi16(realcacc, realc); imagcacc = _mm_add_epi16(imagcacc, imagc); a += 8; b += 8; } realcacc = _mm_and_si128(realcacc, mult1); imagcacc = _mm_and_si128(imagcacc, mult1); imagcacc = _mm_slli_si128(imagcacc, 1); totalc = _mm_or_si128(realcacc, imagcacc); __VOLK_ATTR_ALIGNED(16) lv_8sc_t dotProductVector[8]; _mm_store_si128((__m128i*)dotProductVector, totalc); // Store the results back into the dot product vector for (i = 0; i < 8; ++i) { dotProduct += dotProductVector[i]; } } for (i = sse_iters * 8; i < num_points; ++i) { dotProduct += (*a++) * (*b++); } *result = dotProduct; } #endif /*LV_HAVE_SSE2*/ #ifdef LV_HAVE_SSE4_1 #include static inline void volk_gnsssdr_8ic_x2_dot_prod_8ic_a_sse4_1(lv_8sc_t* result, const lv_8sc_t* in_a, const lv_8sc_t* in_b, unsigned int num_points) { lv_8sc_t dotProduct; memset(&dotProduct, 0x0, 2*sizeof(char)); unsigned int number; unsigned int i; const lv_8sc_t* a = in_a; const lv_8sc_t* b = in_b; const unsigned int sse_iters = num_points / 8; if (sse_iters > 0) { __m128i x, y, mult1, realx, imagx, realy, imagy, realx_mult_realy, imagx_mult_imagy, realx_mult_imagy, imagx_mult_realy, realc, imagc, totalc, realcacc, imagcacc; mult1 = _mm_set_epi8(0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255); realcacc = _mm_setzero_si128(); imagcacc = _mm_setzero_si128(); for(number = 0; number < sse_iters; number++) { x = _mm_load_si128((__m128i*)a); y = _mm_load_si128((__m128i*)b); imagx = _mm_srli_si128(x, 1); imagx = _mm_and_si128(imagx, mult1); realx = _mm_and_si128(x, mult1); imagy = _mm_srli_si128(y, 1); imagy = _mm_and_si128(imagy, mult1); realy = _mm_and_si128(y, mult1); realx_mult_realy = _mm_mullo_epi16(realx, realy); imagx_mult_imagy = _mm_mullo_epi16(imagx, imagy); realx_mult_imagy = _mm_mullo_epi16(realx, imagy); imagx_mult_realy = _mm_mullo_epi16(imagx, realy); realc = _mm_sub_epi16(realx_mult_realy, imagx_mult_imagy); imagc = _mm_add_epi16(realx_mult_imagy, imagx_mult_realy); realcacc = _mm_add_epi16(realcacc, realc); imagcacc = _mm_add_epi16(imagcacc, imagc); a += 8; b += 8; } imagcacc = _mm_slli_si128 (imagcacc, 1); totalc = _mm_blendv_epi8 (imagcacc, realcacc, mult1); __VOLK_ATTR_ALIGNED(16) lv_8sc_t dotProductVector[8]; _mm_store_si128((__m128i*)dotProductVector, totalc); // Store the results back into the dot product vector for (i = 0; i < 8; ++i) { dotProduct += dotProductVector[i]; } } for (i = sse_iters * 8; i < num_points; ++i) { dotProduct += (*a++) * (*b++); } *result = dotProduct; } #endif /*LV_HAVE_SSE4_1*/ #ifdef LV_HAVE_ORC extern void volk_gnsssdr_8ic_x2_dot_prod_8ic_a_orc_impl(short* resRealShort, short* resImagShort, const lv_8sc_t* in_a, const lv_8sc_t* in_b, unsigned int num_points); static inline void volk_gnsssdr_8ic_x2_dot_prod_8ic_u_orc(lv_8sc_t* result, const lv_8sc_t* in_a, const lv_8sc_t* in_b, unsigned int num_points) { short resReal = 0; char* resRealChar = (char*)&resReal; resRealChar++; short resImag = 0; char* resImagChar = (char*)&resImag; resImagChar++; volk_gnsssdr_8ic_x2_dot_prod_8ic_a_orc_impl(&resReal, &resImag, in_a, in_b, num_points); *result = lv_cmake(*resRealChar, *resImagChar); } #endif /* LV_HAVE_ORC */ #ifdef LV_HAVE_NEON #include static inline void volk_gnsssdr_8ic_x2_dot_prod_8ic_neon(lv_8sc_t* result, const lv_8sc_t* in_a, const lv_8sc_t* in_b, unsigned int num_points) { lv_8sc_t dotProduct; dotProduct = lv_cmake(0,0); *result = lv_cmake(0,0); const lv_8sc_t* a = in_a; const lv_8sc_t* b = in_b; // for 2-lane vectors, 1st lane holds the real part, // 2nd lane holds the imaginary part int8x8x2_t a_val, b_val, c_val, accumulator, tmp_real, tmp_imag; __VOLK_ATTR_ALIGNED(16) lv_8sc_t accum_result[8] = { lv_cmake(0,0) }; accumulator.val[0] = vdup_n_s8(0); accumulator.val[1] = vdup_n_s8(0); unsigned int number; const unsigned int neon_iters = num_points / 8; for(number = 0; number < neon_iters; ++number) { a_val = vld2_s8((const int8_t*)a); b_val = vld2_s8((const int8_t*)b); __VOLK_GNSSSDR_PREFETCH(a + 16); __VOLK_GNSSSDR_PREFETCH(b + 16); // multiply the real*real and imag*imag to get real result tmp_real.val[0] = vmul_s8(a_val.val[0], b_val.val[0]); tmp_real.val[1] = vmul_s8(a_val.val[1], b_val.val[1]); // Multiply cross terms to get the imaginary result tmp_imag.val[0] = vmul_s8(a_val.val[0], b_val.val[1]); tmp_imag.val[1] = vmul_s8(a_val.val[1], b_val.val[0]); c_val.val[0] = vsub_s8(tmp_real.val[0], tmp_real.val[1]); c_val.val[1] = vadd_s8(tmp_imag.val[0], tmp_imag.val[1]); accumulator.val[0] = vadd_s8(accumulator.val[0], c_val.val[0]); accumulator.val[1] = vadd_s8(accumulator.val[1], c_val.val[1]); a += 8; b += 8; } vst2_s8((int8_t*)accum_result, accumulator); for(number = 0; number < 8; ++number) { *result += accum_result[number]; } for (number = neon_iters * 8; number < num_points; ++number) { dotProduct += (*a++) * (*b++); } *result += dotProduct; } #endif /* LV_HAVE_NEON */ #endif /*INCLUDED_volk_gnsssdr_8ic_x2_dot_prod_8ic_H*/ volk_gnsssdr_8ic_x2_multiply_8ic.h000066400000000000000000000244751305042567700406460ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/*! * \file volk_gnsssdr_8ic_x2_multiply_8ic.h * \brief VOLK_GNSSSDR kernel: multiplies two 16 bits vectors. * \authors
      *
    • Andres Cecilia, 2014. a.cecilia.luque(at)gmail.com *
    * * VOLK_GNSSSDR kernel that multiplies two 16 bits vectors (8 bits the real part * and 8 bits the imaginary part) * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ /*! * \page volk_gnsssdr_8ic_x2_multiply_8ic * * \b Overview * * Multiplies two input complex vectors, point-by-point, storing the result in the third vector * * Dispatcher Prototype * \code * void volk_gnsssdr_8ic_x2_multiply_8ic(lv_8sc_t* cVector, const lv_8sc_t* aVector, const lv_8sc_t* bVector, unsigned int num_points); * \endcode * * \b Inputs * \li aVector: One of the vectors to be multiplied * \li bVector: The other vector to be multiplied * \li num_points: The number of complex data points. * * \b Outputs * \li cVector: The vector where the result will be stored * */ #ifndef INCLUDED_volk_gnsssdr_8ic_x2_multiply_8ic_H #define INCLUDED_volk_gnsssdr_8ic_x2_multiply_8ic_H #include #ifdef LV_HAVE_SSE2 #include static inline void volk_gnsssdr_8ic_x2_multiply_8ic_u_sse2(lv_8sc_t* cVector, const lv_8sc_t* aVector, const lv_8sc_t* bVector, unsigned int num_points) { const unsigned int sse_iters = num_points / 8; unsigned int number; unsigned int i; __m128i x, y, mult1, realx, imagx, realy, imagy, realx_mult_realy, imagx_mult_imagy, realx_mult_imagy, imagx_mult_realy, realc, imagc, totalc; lv_8sc_t* c = cVector; const lv_8sc_t* a = aVector; const lv_8sc_t* b = bVector; mult1 = _mm_set_epi8(0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255); for(number = 0; number < sse_iters; number++) { x = _mm_loadu_si128((__m128i*)a); y = _mm_loadu_si128((__m128i*)b); imagx = _mm_srli_si128(x, 1); imagx = _mm_and_si128(imagx, mult1); realx = _mm_and_si128(x, mult1); imagy = _mm_srli_si128(y, 1); imagy = _mm_and_si128(imagy, mult1); realy = _mm_and_si128(y, mult1); realx_mult_realy = _mm_mullo_epi16(realx, realy); imagx_mult_imagy = _mm_mullo_epi16(imagx, imagy); realx_mult_imagy = _mm_mullo_epi16(realx, imagy); imagx_mult_realy = _mm_mullo_epi16(imagx, realy); realc = _mm_sub_epi16(realx_mult_realy, imagx_mult_imagy); realc = _mm_and_si128(realc, mult1); imagc = _mm_add_epi16(realx_mult_imagy, imagx_mult_realy); imagc = _mm_and_si128(imagc, mult1); imagc = _mm_slli_si128(imagc, 1); totalc = _mm_or_si128(realc, imagc); _mm_storeu_si128((__m128i*)c, totalc); a += 8; b += 8; c += 8; } for (i = sse_iters * 8; i < num_points; ++i) { *c++ = (*a++) * (*b++); } } #endif /* LV_HAVE_SSE2 */ #ifdef LV_HAVE_SSE4_1 #include static inline void volk_gnsssdr_8ic_x2_multiply_8ic_u_sse4_1(lv_8sc_t* cVector, const lv_8sc_t* aVector, const lv_8sc_t* bVector, unsigned int num_points) { const unsigned int sse_iters = num_points / 8; unsigned int number; unsigned int i; __m128i x, y; __m128i mult1, realx, imagx, realy, imagy, realx_mult_realy, imagx_mult_imagy, realx_mult_imagy, imagx_mult_realy, realc, imagc, totalc; lv_8sc_t* c = cVector; const lv_8sc_t* a = aVector; const lv_8sc_t* b = bVector; _mm_setzero_si128(); mult1 = _mm_set_epi8(0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255); for(number = 0; number < sse_iters; number++) { x = _mm_lddqu_si128((__m128i*)a); y = _mm_lddqu_si128((__m128i*)b); imagx = _mm_srli_si128(x, 1); imagx = _mm_and_si128(imagx, mult1); realx = _mm_and_si128(x, mult1); imagy = _mm_srli_si128(y, 1); imagy = _mm_and_si128(imagy, mult1); realy = _mm_and_si128(y, mult1); realx_mult_realy = _mm_mullo_epi16(realx, realy); imagx_mult_imagy = _mm_mullo_epi16(imagx, imagy); realx_mult_imagy = _mm_mullo_epi16(realx, imagy); imagx_mult_realy = _mm_mullo_epi16(imagx, realy); realc = _mm_sub_epi16(realx_mult_realy, imagx_mult_imagy); imagc = _mm_add_epi16(realx_mult_imagy, imagx_mult_realy); imagc = _mm_slli_si128(imagc, 1); totalc = _mm_blendv_epi8(imagc, realc, mult1); _mm_storeu_si128((__m128i*)c, totalc); a += 8; b += 8; c += 8; } for (i = sse_iters * 8; i < num_points; ++i) { *c++ = (*a++) * (*b++); } } #endif /* LV_HAVE_SSE4_1 */ #ifdef LV_HAVE_GENERIC static inline void volk_gnsssdr_8ic_x2_multiply_8ic_generic(lv_8sc_t* cVector, const lv_8sc_t* aVector, const lv_8sc_t* bVector, unsigned int num_points) { lv_8sc_t* cPtr = cVector; const lv_8sc_t* aPtr = aVector; const lv_8sc_t* bPtr = bVector; unsigned int number; for(number = 0; number < num_points; number++) { *cPtr++ = (*aPtr++) * (*bPtr++); } } #endif /* LV_HAVE_GENERIC */ #ifdef LV_HAVE_SSE2 #include static inline void volk_gnsssdr_8ic_x2_multiply_8ic_a_sse2(lv_8sc_t* cVector, const lv_8sc_t* aVector, const lv_8sc_t* bVector, unsigned int num_points) { const unsigned int sse_iters = num_points / 8; unsigned int number; unsigned int i; __m128i x, y, mult1, realx, imagx, realy, imagy, realx_mult_realy, imagx_mult_imagy, realx_mult_imagy, imagx_mult_realy, realc, imagc, totalc; lv_8sc_t* c = cVector; const lv_8sc_t* a = aVector; const lv_8sc_t* b = bVector; mult1 = _mm_set_epi8(0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255); for(number = 0; number < sse_iters; number++) { x = _mm_load_si128((__m128i*)a); y = _mm_load_si128((__m128i*)b); imagx = _mm_srli_si128(x, 1); imagx = _mm_and_si128(imagx, mult1); realx = _mm_and_si128(x, mult1); imagy = _mm_srli_si128(y, 1); imagy = _mm_and_si128(imagy, mult1); realy = _mm_and_si128(y, mult1); realx_mult_realy = _mm_mullo_epi16(realx, realy); imagx_mult_imagy = _mm_mullo_epi16(imagx, imagy); realx_mult_imagy = _mm_mullo_epi16(realx, imagy); imagx_mult_realy = _mm_mullo_epi16(imagx, realy); realc = _mm_sub_epi16(realx_mult_realy, imagx_mult_imagy); realc = _mm_and_si128(realc, mult1); imagc = _mm_add_epi16(realx_mult_imagy, imagx_mult_realy); imagc = _mm_and_si128(imagc, mult1); imagc = _mm_slli_si128(imagc, 1); totalc = _mm_or_si128 (realc, imagc); _mm_store_si128((__m128i*)c, totalc); a += 8; b += 8; c += 8; } for (i = sse_iters * 8; i < num_points; ++i) { *c++ = (*a++) * (*b++); } } #endif /* LV_HAVE_SSE2 */ #ifdef LV_HAVE_SSE4_1 #include static inline void volk_gnsssdr_8ic_x2_multiply_8ic_a_sse4_1(lv_8sc_t* cVector, const lv_8sc_t* aVector, const lv_8sc_t* bVector, unsigned int num_points) { const unsigned int sse_iters = num_points / 8; unsigned int number; unsigned int i; __m128i x, y; __m128i mult1, realx, imagx, realy, imagy, realx_mult_realy, imagx_mult_imagy, realx_mult_imagy, imagx_mult_realy, realc, imagc, totalc; lv_8sc_t* c = cVector; const lv_8sc_t* a = aVector; const lv_8sc_t* b = bVector; _mm_setzero_si128(); mult1 = _mm_set_epi8(0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255); for(number = 0; number < sse_iters; number++) { x = _mm_load_si128((__m128i*)a); y = _mm_load_si128((__m128i*)b); imagx = _mm_srli_si128(x, 1); imagx = _mm_and_si128(imagx, mult1); realx = _mm_and_si128(x, mult1); imagy = _mm_srli_si128(y, 1); imagy = _mm_and_si128(imagy, mult1); realy = _mm_and_si128(y, mult1); realx_mult_realy = _mm_mullo_epi16(realx, realy); imagx_mult_imagy = _mm_mullo_epi16(imagx, imagy); realx_mult_imagy = _mm_mullo_epi16(realx, imagy); imagx_mult_realy = _mm_mullo_epi16(imagx, realy); realc = _mm_sub_epi16(realx_mult_realy, imagx_mult_imagy); imagc = _mm_add_epi16(realx_mult_imagy, imagx_mult_realy); imagc = _mm_slli_si128(imagc, 1); totalc = _mm_blendv_epi8(imagc, realc, mult1); _mm_store_si128((__m128i*)c, totalc); a += 8; b += 8; c += 8; } for (i = sse_iters * 8; i < num_points; ++i) { *c++ = (*a++) * (*b++); } } #endif /* LV_HAVE_SSE4_1 */ #ifdef LV_HAVE_ORC extern void volk_gnsssdr_8ic_x2_multiply_8ic_a_orc_impl(lv_8sc_t* cVector, const lv_8sc_t* aVector, const lv_8sc_t* bVector, unsigned int num_points); static inline void volk_gnsssdr_8ic_x2_multiply_8ic_u_orc(lv_8sc_t* cVector, const lv_8sc_t* aVector, const lv_8sc_t* bVector, unsigned int num_points) { volk_gnsssdr_8ic_x2_multiply_8ic_a_orc_impl(cVector, aVector, bVector, num_points); } #endif /* LV_HAVE_ORC */ #endif /* INCLUDED_volk_gnsssdr_8ic_x2_multiply_8ic_H */ volk_gnsssdr_8u_x2_multiply_8u.h000066400000000000000000000137521305042567700403640ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/*! * \file volk_gnsssdr_8u_x2_multiply_8u.h * \brief VOLK_GNSSSDR kernel: multiplies unsigned char values. * \authors
      *
    • Andres Cecilia, 2014. a.cecilia.luque(at)gmail.com *
    * * VOLK_GNSSSDR kernel that multiplies unsigned char values (8 bits data) * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ /*! * \page volk_gnsssdr_8u_x2_multiply_8u * * \b Overview * * Multiplies two input vectors of unsigned char, point-by-point, storing the result in the third vector * * Dispatcher Prototype * \code * void volk_gnsssdr_8u_x2_multiply_8u(unsigned char* cChar, const unsigned char* aChar, const unsigned char* bChar, unsigned int num_points); * \endcode * * \b Inputs * \li aChar: One of the vectors to be multiplied * \li bChar: The other vector to be multiplied * \li num_points: The number of complex data points. * * \b Outputs * \li cChar: The vector where the result will be stored * */ #ifndef INCLUDED_volk_gnsssdr_8u_x2_multiply_8u_H #define INCLUDED_volk_gnsssdr_8u_x2_multiply_8u_H #ifdef LV_HAVE_SSE3 #include static inline void volk_gnsssdr_8u_x2_multiply_8u_u_sse3(unsigned char* cChar, const unsigned char* aChar, const unsigned char* bChar, unsigned int num_points) { const unsigned int sse_iters = num_points / 16; unsigned int number; unsigned int i; __m128i x, y, x1, x2, y1, y2, mult1, x1_mult_y1, x2_mult_y2, tmp, tmp1, tmp2, totalc; unsigned char* c = cChar; const unsigned char* a = aChar; const unsigned char* b = bChar; for(number = 0; number < sse_iters; number++) { x = _mm_lddqu_si128((__m128i*)a); y = _mm_lddqu_si128((__m128i*)b); mult1 = _mm_set_epi8(0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255); x1 = _mm_srli_si128(x, 1); x1 = _mm_and_si128(x1, mult1); x2 = _mm_and_si128(x, mult1); y1 = _mm_srli_si128(y, 1); y1 = _mm_and_si128(y1, mult1); y2 = _mm_and_si128(y, mult1); x1_mult_y1 = _mm_mullo_epi16(x1, y1); x2_mult_y2 = _mm_mullo_epi16(x2, y2); tmp = _mm_and_si128(x1_mult_y1, mult1); tmp1 = _mm_slli_si128(tmp, 1); tmp2 = _mm_and_si128(x2_mult_y2, mult1); totalc = _mm_or_si128(tmp1, tmp2); _mm_storeu_si128((__m128i*)c, totalc); a += 16; b += 16; c += 16; } for (i = sse_iters * 16; i < num_points ; ++i) { *c++ = (*a++) * (*b++); } } #endif /* LV_HAVE_SSE3 */ #ifdef LV_HAVE_GENERIC static inline void volk_gnsssdr_8u_x2_multiply_8u_generic(unsigned char* cChar, const unsigned char* aChar, const unsigned char* bChar, unsigned int num_points) { unsigned char* cPtr = cChar; const unsigned char* aPtr = aChar; const unsigned char* bPtr = bChar; unsigned int number; for(number = 0; number < num_points; number++) { *cPtr++ = (*aPtr++) * (*bPtr++); } } #endif /* LV_HAVE_GENERIC */ #ifdef LV_HAVE_SSE3 #include static inline void volk_gnsssdr_8u_x2_multiply_8u_a_sse3(unsigned char* cChar, const unsigned char* aChar, const unsigned char* bChar, unsigned int num_points) { const unsigned int sse_iters = num_points / 16; unsigned int number; unsigned int i; __m128i x, y, x1, x2, y1, y2, mult1, x1_mult_y1, x2_mult_y2, tmp, tmp1, tmp2, totalc; unsigned char* c = cChar; const unsigned char* a = aChar; const unsigned char* b = bChar; for(number = 0; number < sse_iters; number++) { x = _mm_load_si128((__m128i*)a); y = _mm_load_si128((__m128i*)b); mult1 = _mm_set_epi8(0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255); x1 = _mm_srli_si128(x, 1); x1 = _mm_and_si128(x1, mult1); x2 = _mm_and_si128(x, mult1); y1 = _mm_srli_si128(y, 1); y1 = _mm_and_si128(y1, mult1); y2 = _mm_and_si128(y, mult1); x1_mult_y1 = _mm_mullo_epi16(x1, y1); x2_mult_y2 = _mm_mullo_epi16(x2, y2); tmp = _mm_and_si128(x1_mult_y1, mult1); tmp1 = _mm_slli_si128(tmp, 1); tmp2 = _mm_and_si128(x2_mult_y2, mult1); totalc = _mm_or_si128(tmp1, tmp2); _mm_store_si128((__m128i*)c, totalc); a += 16; b += 16; c += 16; } for (i = sse_iters * 16; i < num_points; ++i) { *c++ = (*a++) * (*b++); } } #endif /* LV_HAVE_SSE */ #ifdef LV_HAVE_ORC extern void volk_gnsssdr_8u_x2_multiply_8u_a_orc_impl(unsigned char* cVector, const unsigned char* aVector, const unsigned char* bVector, unsigned int num_points); static inline void volk_gnsssdr_8u_x2_multiply_8u_u_orc(unsigned char* cVector, const unsigned char* aVector, const unsigned char* bVector, unsigned int num_points) { volk_gnsssdr_8u_x2_multiply_8u_a_orc_impl(cVector, aVector, bVector, num_points); } #endif /* LV_HAVE_ORC */ #endif /* INCLUDED_volk_gnsssdr_8u_x2_multiply_8u_H */ volk_gnsssdr_s32f_sincos_32fc.h000066400000000000000000001225751305042567700400200ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/*! * \file volk_gnsssdr_s32f_sincos_32fc.h * \brief VOLK_GNSSSDR kernel: Computes the sine and cosine of a vector of floats. * \authors
      *
    • Julien Pommier, 2007 *
    • Carles Fernandez-Prades, 2016. cfernandez(at)cttc.es *
    * * VOLK_GNSSSDR kernel that computes the sine and cosine of a vector of floats. * * ------------------------------------------------------------------------- * * Copyright (C) 2007 Julien Pommier * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. * * (this is the zlib license) */ /*! * \page volk_gnsssdr_s32f_sincos_32fc * * \b Overview * * VOLK_GNSSSDR kernel that computes the sine and cosine with a fixed * phase increment \p phase_inc per sample, providing the output in a complex vector (cosine, sine). * WARNING: it is not IEEE compliant, but the max absolute error on sines is 2^-24 on the range [-8192, 8192]. * To be safe, keep initial phase + phase_inc * num_points within that range. * * Dispatcher Prototype * \code * void volk_gnsssdr_s32f_sincos_32fc(lv_32fc_t* out, const float phase_inc, float* phase, unsigned int num_points) * \endcode * * \b Inputs * \li phase_inc: Phase increment per sample, in radians. * \li phase: Pointer to a float containing the initial phase, in radians. * \li num_points: Number of components in \p in to be computed. * * \b Outputs * \li out: Vector of the form lv_32fc_t out[n] = lv_cmake(cos(in[n]), sin(in[n])) * \li phase: Pointer to a float containing the final phase, in radians. * */ #ifndef INCLUDED_volk_gnsssdr_s32f_sincos_32fc_H #define INCLUDED_volk_gnsssdr_s32f_sincos_32fc_H #include #include #include #ifdef LV_HAVE_SSE2 #include /* Adapted from http://gruntthepeon.free.fr/ssemath/sse_mathfun.h, original code from Julien Pommier */ /* Based on algorithms from the cephes library http://www.netlib.org/cephes/ */ static inline void volk_gnsssdr_s32f_sincos_32fc_a_sse2(lv_32fc_t* out, const float phase_inc, float* phase, unsigned int num_points) { lv_32fc_t* bPtr = out; const unsigned int sse_iters = num_points / 4; unsigned int number = 0; float _phase = (*phase); __m128 sine, cosine, aux, x, four_phases_reg; __m128 xmm1, xmm2, xmm3 = _mm_setzero_ps(), sign_bit_sin, y; __m128i emm0, emm2, emm4; /* declare some SSE constants */ static const int _ps_inv_sign_mask[4] = { ~0x80000000, ~0x80000000, ~0x80000000, ~0x80000000 }; static const int _ps_sign_mask[4] = { (int)0x80000000, (int)0x80000000, (int)0x80000000, (int)0x80000000 }; static const float _ps_cephes_FOPI[4] = { 1.27323954473516, 1.27323954473516, 1.27323954473516, 1.27323954473516 }; static const int _pi32_1[4] = { 1, 1, 1, 1 }; static const int _pi32_inv1[4] = { ~1, ~1, ~1, ~1 }; static const int _pi32_2[4] = { 2, 2, 2, 2}; static const int _pi32_4[4] = { 4, 4, 4, 4}; static const float _ps_minus_cephes_DP1[4] = { -0.78515625, -0.78515625, -0.78515625, -0.78515625 }; static const float _ps_minus_cephes_DP2[4] = { -2.4187564849853515625e-4, -2.4187564849853515625e-4, -2.4187564849853515625e-4, -2.4187564849853515625e-4 }; static const float _ps_minus_cephes_DP3[4] = { -3.77489497744594108e-8, -3.77489497744594108e-8, -3.77489497744594108e-8, -3.77489497744594108e-8 }; static const float _ps_coscof_p0[4] = { 2.443315711809948E-005, 2.443315711809948E-005, 2.443315711809948E-005, 2.443315711809948E-005 }; static const float _ps_coscof_p1[4] = { -1.388731625493765E-003, -1.388731625493765E-003, -1.388731625493765E-003, -1.388731625493765E-003 }; static const float _ps_coscof_p2[4] = { 4.166664568298827E-002, 4.166664568298827E-002, 4.166664568298827E-002, 4.166664568298827E-002 }; static const float _ps_sincof_p0[4] = { -1.9515295891E-4, -1.9515295891E-4, -1.9515295891E-4, -1.9515295891E-4 }; static const float _ps_sincof_p1[4] = { 8.3321608736E-3, 8.3321608736E-3, 8.3321608736E-3, 8.3321608736E-3 }; static const float _ps_sincof_p2[4] = { -1.6666654611E-1, -1.6666654611E-1, -1.6666654611E-1, -1.6666654611E-1 }; static const float _ps_0p5[4] = { 0.5f, 0.5f, 0.5f, 0.5f }; static const float _ps_1[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; float four_phases[4] = { _phase, _phase + phase_inc, _phase + 2 * phase_inc, _phase + 3 * phase_inc }; float four_phases_inc[4] = { 4 * phase_inc, 4 * phase_inc, 4 * phase_inc, 4 * phase_inc }; four_phases_reg = _mm_load_ps(four_phases); const __m128 four_phases_inc_reg = _mm_load_ps(four_phases_inc); for(;number < sse_iters; number++) { x = four_phases_reg; sign_bit_sin = x; /* take the absolute value */ x = _mm_and_ps(x, *(__m128*)_ps_inv_sign_mask); /* extract the sign bit (upper one) */ sign_bit_sin = _mm_and_ps(sign_bit_sin, *(__m128*)_ps_sign_mask); /* scale by 4/Pi */ y = _mm_mul_ps(x, *(__m128*)_ps_cephes_FOPI); /* store the integer part of y in emm2 */ emm2 = _mm_cvttps_epi32(y); /* j=(j+1) & (~1) (see the cephes sources) */ emm2 = _mm_add_epi32(emm2, *(__m128i *)_pi32_1); emm2 = _mm_and_si128(emm2, *(__m128i *)_pi32_inv1); y = _mm_cvtepi32_ps(emm2); emm4 = emm2; /* get the swap sign flag for the sine */ emm0 = _mm_and_si128(emm2, *(__m128i *)_pi32_4); emm0 = _mm_slli_epi32(emm0, 29); __m128 swap_sign_bit_sin = _mm_castsi128_ps(emm0); /* get the polynom selection mask for the sine*/ emm2 = _mm_and_si128(emm2, *(__m128i *)_pi32_2); emm2 = _mm_cmpeq_epi32(emm2, _mm_setzero_si128()); __m128 poly_mask = _mm_castsi128_ps(emm2); /* The magic pass: "Extended precision modular arithmetic†x = ((x - y * DP1) - y * DP2) - y * DP3; */ xmm1 = *(__m128*)_ps_minus_cephes_DP1; xmm2 = *(__m128*)_ps_minus_cephes_DP2; xmm3 = *(__m128*)_ps_minus_cephes_DP3; xmm1 = _mm_mul_ps(y, xmm1); xmm2 = _mm_mul_ps(y, xmm2); xmm3 = _mm_mul_ps(y, xmm3); x = _mm_add_ps(x, xmm1); x = _mm_add_ps(x, xmm2); x = _mm_add_ps(x, xmm3); emm4 = _mm_sub_epi32(emm4, *(__m128i *)_pi32_2); emm4 = _mm_andnot_si128(emm4, *(__m128i *)_pi32_4); emm4 = _mm_slli_epi32(emm4, 29); __m128 sign_bit_cos = _mm_castsi128_ps(emm4); sign_bit_sin = _mm_xor_ps(sign_bit_sin, swap_sign_bit_sin); /* Evaluate the first polynom (0 <= x <= Pi/4) */ __m128 z = _mm_mul_ps(x,x); y = *(__m128*)_ps_coscof_p0; y = _mm_mul_ps(y, z); y = _mm_add_ps(y, *(__m128*)_ps_coscof_p1); y = _mm_mul_ps(y, z); y = _mm_add_ps(y, *(__m128*)_ps_coscof_p2); y = _mm_mul_ps(y, z); y = _mm_mul_ps(y, z); __m128 tmp = _mm_mul_ps(z, *(__m128*)_ps_0p5); y = _mm_sub_ps(y, tmp); y = _mm_add_ps(y, *(__m128*)_ps_1); /* Evaluate the second polynom (Pi/4 <= x <= 0) */ __m128 y2 = *(__m128*)_ps_sincof_p0; y2 = _mm_mul_ps(y2, z); y2 = _mm_add_ps(y2, *(__m128*)_ps_sincof_p1); y2 = _mm_mul_ps(y2, z); y2 = _mm_add_ps(y2, *(__m128*)_ps_sincof_p2); y2 = _mm_mul_ps(y2, z); y2 = _mm_mul_ps(y2, x); y2 = _mm_add_ps(y2, x); /* select the correct result from the two polynoms */ xmm3 = poly_mask; __m128 ysin2 = _mm_and_ps(xmm3, y2); __m128 ysin1 = _mm_andnot_ps(xmm3, y); y2 = _mm_sub_ps(y2,ysin2); y = _mm_sub_ps(y, ysin1); xmm1 = _mm_add_ps(ysin1,ysin2); xmm2 = _mm_add_ps(y,y2); /* update the sign */ sine = _mm_xor_ps(xmm1, sign_bit_sin); cosine = _mm_xor_ps(xmm2, sign_bit_cos); /* write the output */ aux = _mm_unpacklo_ps(cosine, sine); _mm_store_ps((float*)bPtr, aux); bPtr += 2; aux = _mm_unpackhi_ps(cosine, sine); _mm_store_ps((float*)bPtr, aux); bPtr += 2; four_phases_reg = _mm_add_ps(four_phases_reg, four_phases_inc_reg); } _phase = _phase + phase_inc * (sse_iters * 4); for(number = sse_iters * 4; number < num_points; number++) { *bPtr++ = lv_cmake((float)cos((_phase)), (float)sin((_phase)) ); _phase += phase_inc; } (*phase) = _phase; } #endif /* LV_HAVE_SSE2 */ #ifdef LV_HAVE_SSE2 #include /* Adapted from http://gruntthepeon.free.fr/ssemath/sse_mathfun.h, original code from Julien Pommier */ /* Based on algorithms from the cephes library http://www.netlib.org/cephes/ */ static inline void volk_gnsssdr_s32f_sincos_32fc_u_sse2(lv_32fc_t* out, const float phase_inc, float* phase, unsigned int num_points) { lv_32fc_t* bPtr = out; const unsigned int sse_iters = num_points / 4; unsigned int number = 0; float _phase = (*phase); __m128 sine, cosine, aux, x, four_phases_reg; __m128 xmm1, xmm2, xmm3 = _mm_setzero_ps(), sign_bit_sin, y; __m128i emm0, emm2, emm4; /* declare some SSE constants */ __VOLK_ATTR_ALIGNED(16) static const int _ps_inv_sign_mask[4] = { ~0x80000000, ~0x80000000, ~0x80000000, ~0x80000000 }; __VOLK_ATTR_ALIGNED(16) static const int _ps_sign_mask[4] = { (int)0x80000000, (int)0x80000000, (int)0x80000000, (int)0x80000000 }; __VOLK_ATTR_ALIGNED(16) static const float _ps_cephes_FOPI[4] = { 1.27323954473516, 1.27323954473516, 1.27323954473516, 1.27323954473516 }; __VOLK_ATTR_ALIGNED(16) static const int _pi32_1[4] = { 1, 1, 1, 1 }; __VOLK_ATTR_ALIGNED(16) static const int _pi32_inv1[4] = { ~1, ~1, ~1, ~1 }; __VOLK_ATTR_ALIGNED(16) static const int _pi32_2[4] = { 2, 2, 2, 2}; __VOLK_ATTR_ALIGNED(16) static const int _pi32_4[4] = { 4, 4, 4, 4}; __VOLK_ATTR_ALIGNED(16) static const float _ps_minus_cephes_DP1[4] = { -0.78515625, -0.78515625, -0.78515625, -0.78515625 }; __VOLK_ATTR_ALIGNED(16) static const float _ps_minus_cephes_DP2[4] = { -2.4187564849853515625e-4, -2.4187564849853515625e-4, -2.4187564849853515625e-4, -2.4187564849853515625e-4 }; __VOLK_ATTR_ALIGNED(16) static const float _ps_minus_cephes_DP3[4] = { -3.77489497744594108e-8, -3.77489497744594108e-8, -3.77489497744594108e-8, -3.77489497744594108e-8 }; __VOLK_ATTR_ALIGNED(16) static const float _ps_coscof_p0[4] = { 2.443315711809948E-005, 2.443315711809948E-005, 2.443315711809948E-005, 2.443315711809948E-005 }; __VOLK_ATTR_ALIGNED(16) static const float _ps_coscof_p1[4] = { -1.388731625493765E-003, -1.388731625493765E-003, -1.388731625493765E-003, -1.388731625493765E-003 }; __VOLK_ATTR_ALIGNED(16) static const float _ps_coscof_p2[4] = { 4.166664568298827E-002, 4.166664568298827E-002, 4.166664568298827E-002, 4.166664568298827E-002 }; __VOLK_ATTR_ALIGNED(16) static const float _ps_sincof_p0[4] = { -1.9515295891E-4, -1.9515295891E-4, -1.9515295891E-4, -1.9515295891E-4 }; __VOLK_ATTR_ALIGNED(16) static const float _ps_sincof_p1[4] = { 8.3321608736E-3, 8.3321608736E-3, 8.3321608736E-3, 8.3321608736E-3 }; __VOLK_ATTR_ALIGNED(16) static const float _ps_sincof_p2[4] = { -1.6666654611E-1, -1.6666654611E-1, -1.6666654611E-1, -1.6666654611E-1 }; __VOLK_ATTR_ALIGNED(16) static const float _ps_0p5[4] = { 0.5f, 0.5f, 0.5f, 0.5f }; __VOLK_ATTR_ALIGNED(16) static const float _ps_1[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; __VOLK_ATTR_ALIGNED(16) float four_phases[4] = { _phase, _phase + phase_inc, _phase + 2 * phase_inc, _phase + 3 * phase_inc }; __VOLK_ATTR_ALIGNED(16) float four_phases_inc[4] = { 4 * phase_inc, 4 * phase_inc, 4 * phase_inc, 4 * phase_inc }; four_phases_reg = _mm_load_ps(four_phases); const __m128 four_phases_inc_reg = _mm_load_ps(four_phases_inc); for(;number < sse_iters; number++) { x = four_phases_reg; sign_bit_sin = x; /* take the absolute value */ x = _mm_and_ps(x, *(__m128*)_ps_inv_sign_mask); /* extract the sign bit (upper one) */ sign_bit_sin = _mm_and_ps(sign_bit_sin, *(__m128*)_ps_sign_mask); /* scale by 4/Pi */ y = _mm_mul_ps(x, *(__m128*)_ps_cephes_FOPI); /* store the integer part of y in emm2 */ emm2 = _mm_cvttps_epi32(y); /* j=(j+1) & (~1) (see the cephes sources) */ emm2 = _mm_add_epi32(emm2, *(__m128i *)_pi32_1); emm2 = _mm_and_si128(emm2, *(__m128i *)_pi32_inv1); y = _mm_cvtepi32_ps(emm2); emm4 = emm2; /* get the swap sign flag for the sine */ emm0 = _mm_and_si128(emm2, *(__m128i *)_pi32_4); emm0 = _mm_slli_epi32(emm0, 29); __m128 swap_sign_bit_sin = _mm_castsi128_ps(emm0); /* get the polynom selection mask for the sine*/ emm2 = _mm_and_si128(emm2, *(__m128i *)_pi32_2); emm2 = _mm_cmpeq_epi32(emm2, _mm_setzero_si128()); __m128 poly_mask = _mm_castsi128_ps(emm2); /* The magic pass: "Extended precision modular arithmetic†x = ((x - y * DP1) - y * DP2) - y * DP3; */ xmm1 = *(__m128*)_ps_minus_cephes_DP1; xmm2 = *(__m128*)_ps_minus_cephes_DP2; xmm3 = *(__m128*)_ps_minus_cephes_DP3; xmm1 = _mm_mul_ps(y, xmm1); xmm2 = _mm_mul_ps(y, xmm2); xmm3 = _mm_mul_ps(y, xmm3); x = _mm_add_ps(x, xmm1); x = _mm_add_ps(x, xmm2); x = _mm_add_ps(x, xmm3); emm4 = _mm_sub_epi32(emm4, *(__m128i *)_pi32_2); emm4 = _mm_andnot_si128(emm4, *(__m128i *)_pi32_4); emm4 = _mm_slli_epi32(emm4, 29); __m128 sign_bit_cos = _mm_castsi128_ps(emm4); sign_bit_sin = _mm_xor_ps(sign_bit_sin, swap_sign_bit_sin); /* Evaluate the first polynom (0 <= x <= Pi/4) */ __m128 z = _mm_mul_ps(x,x); y = *(__m128*)_ps_coscof_p0; y = _mm_mul_ps(y, z); y = _mm_add_ps(y, *(__m128*)_ps_coscof_p1); y = _mm_mul_ps(y, z); y = _mm_add_ps(y, *(__m128*)_ps_coscof_p2); y = _mm_mul_ps(y, z); y = _mm_mul_ps(y, z); __m128 tmp = _mm_mul_ps(z, *(__m128*)_ps_0p5); y = _mm_sub_ps(y, tmp); y = _mm_add_ps(y, *(__m128*)_ps_1); /* Evaluate the second polynom (Pi/4 <= x <= 0) */ __m128 y2 = *(__m128*)_ps_sincof_p0; y2 = _mm_mul_ps(y2, z); y2 = _mm_add_ps(y2, *(__m128*)_ps_sincof_p1); y2 = _mm_mul_ps(y2, z); y2 = _mm_add_ps(y2, *(__m128*)_ps_sincof_p2); y2 = _mm_mul_ps(y2, z); y2 = _mm_mul_ps(y2, x); y2 = _mm_add_ps(y2, x); /* select the correct result from the two polynoms */ xmm3 = poly_mask; __m128 ysin2 = _mm_and_ps(xmm3, y2); __m128 ysin1 = _mm_andnot_ps(xmm3, y); y2 = _mm_sub_ps(y2,ysin2); y = _mm_sub_ps(y, ysin1); xmm1 = _mm_add_ps(ysin1,ysin2); xmm2 = _mm_add_ps(y,y2); /* update the sign */ sine = _mm_xor_ps(xmm1, sign_bit_sin); cosine = _mm_xor_ps(xmm2, sign_bit_cos); /* write the output */ aux = _mm_unpacklo_ps(cosine, sine); _mm_storeu_ps((float*)bPtr, aux); bPtr += 2; aux = _mm_unpackhi_ps(cosine, sine); _mm_storeu_ps((float*)bPtr, aux); bPtr += 2; four_phases_reg = _mm_add_ps(four_phases_reg, four_phases_inc_reg); } _phase = _phase + phase_inc * (sse_iters * 4); for(number = sse_iters * 4; number < num_points; number++) { *bPtr++ = lv_cmake((float)cos(_phase), (float)sin(_phase) ); _phase += phase_inc; } (*phase) = _phase; } #endif /* LV_HAVE_SSE2 */ #ifdef LV_HAVE_GENERIC static inline void volk_gnsssdr_s32f_sincos_32fc_generic(lv_32fc_t* out, const float phase_inc, float* phase, unsigned int num_points) { float _phase = (*phase); unsigned int i; for(i = 0; i < num_points; i++) { *out++ = lv_cmake((float)cos(_phase), (float)sin(_phase) ); _phase += phase_inc; } (*phase) = _phase; } #endif /* LV_HAVE_GENERIC */ #ifdef LV_HAVE_GENERIC #include #include static inline void volk_gnsssdr_s32f_sincos_32fc_generic_fxpt(lv_32fc_t* out, const float phase_inc, float* phase, unsigned int num_points) { float _in, s, c; unsigned int i; int32_t x, sin_index, cos_index, d; const float PI = 3.14159265358979323846; const float TWO_TO_THE_31_DIV_PI = 2147483648.0 / PI; const float TWO_PI = PI * 2; const int32_t bitlength = 32; const int32_t Nbits = 10; const int32_t diffbits = bitlength - Nbits; uint32_t ux; float _phase = (*phase); for(i = 0; i < num_points; i++) { _in = _phase; d = (int32_t)floor(_in / TWO_PI + 0.5); _in -= d * TWO_PI; x = (int32_t) ((float)_in * TWO_TO_THE_31_DIV_PI); ux = x; sin_index = ux >> diffbits; s = sine_table_10bits[sin_index][0] * (ux >> 1) + sine_table_10bits[sin_index][1]; ux = x + 0x40000000; cos_index = ux >> diffbits; c = sine_table_10bits[cos_index][0] * (ux >> 1) + sine_table_10bits[cos_index][1]; *out++ = lv_cmake((float)c, (float)s ); _phase += phase_inc; } (*phase) = _phase; } #endif /* LV_HAVE_GENERIC */ #ifdef LV_HAVE_AVX2 #include /* Based on algorithms from the cephes library http://www.netlib.org/cephes/ * Adapted to AVX2 by Carles Fernandez, based on original SSE2 code by Julien Pommier*/ static inline void volk_gnsssdr_s32f_sincos_32fc_a_avx2(lv_32fc_t* out, const float phase_inc, float* phase, unsigned int num_points) { lv_32fc_t* bPtr = out; const unsigned int avx_iters = num_points / 8; unsigned int number = 0; float _phase = (*phase); __m256 sine, cosine, x, eight_phases_reg; __m256 xmm1, xmm2, xmm3 = _mm256_setzero_ps(), sign_bit_sin, y; __m256i emm0, emm2, emm4; __m128 aux, c1, s1; /* declare some AXX2 constants */ __VOLK_ATTR_ALIGNED(32) static const int _ps_inv_sign_mask[8] = { ~0x80000000, ~0x80000000, ~0x80000000, ~0x80000000, ~0x80000000, ~0x80000000, ~0x80000000, ~0x80000000 }; __VOLK_ATTR_ALIGNED(32) static const int _ps_sign_mask[8] = { (int)0x80000000, (int)0x80000000, (int)0x80000000, (int)0x80000000, (int)0x80000000, (int)0x80000000, (int)0x80000000, (int)0x80000000 }; __VOLK_ATTR_ALIGNED(32) static const float _ps_cephes_FOPI[8] = { 1.27323954473516, 1.27323954473516, 1.27323954473516, 1.27323954473516, 1.27323954473516, 1.27323954473516, 1.27323954473516, 1.27323954473516 }; __VOLK_ATTR_ALIGNED(32) static const int _pi32_1[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; __VOLK_ATTR_ALIGNED(32) static const int _pi32_inv1[8] = { ~1, ~1, ~1, ~1, ~1, ~1, ~1, ~1 }; __VOLK_ATTR_ALIGNED(32) static const int _pi32_2[8] = { 2, 2, 2, 2, 2, 2, 2, 2 }; __VOLK_ATTR_ALIGNED(32) static const int _pi32_4[8] = { 4, 4, 4, 4, 4, 4, 4, 4 }; __VOLK_ATTR_ALIGNED(32) static const float _ps_minus_cephes_DP1[8] = { -0.78515625, -0.78515625, -0.78515625, -0.78515625, -0.78515625, -0.78515625, -0.78515625, -0.78515625 }; __VOLK_ATTR_ALIGNED(32) static const float _ps_minus_cephes_DP2[8] = { -2.4187564849853515625e-4, -2.4187564849853515625e-4, -2.4187564849853515625e-4, -2.4187564849853515625e-4, -2.4187564849853515625e-4, -2.4187564849853515625e-4, -2.4187564849853515625e-4, -2.4187564849853515625e-4 }; __VOLK_ATTR_ALIGNED(32) static const float _ps_minus_cephes_DP3[8] = { -3.77489497744594108e-8, -3.77489497744594108e-8, -3.77489497744594108e-8, -3.77489497744594108e-8, -3.77489497744594108e-8, -3.77489497744594108e-8, -3.77489497744594108e-8, -3.77489497744594108e-8 }; __VOLK_ATTR_ALIGNED(32) static const float _ps_coscof_p0[8] = { 2.443315711809948E-005, 2.443315711809948E-005, 2.443315711809948E-005, 2.443315711809948E-005, 2.443315711809948E-005, 2.443315711809948E-005, 2.443315711809948E-005, 2.443315711809948E-005 }; __VOLK_ATTR_ALIGNED(32) static const float _ps_coscof_p1[8] = { -1.388731625493765E-003, -1.388731625493765E-003, -1.388731625493765E-003, -1.388731625493765E-003, -1.388731625493765E-003, -1.388731625493765E-003, -1.388731625493765E-003, -1.388731625493765E-003 }; __VOLK_ATTR_ALIGNED(32) static const float _ps_coscof_p2[8] = { 4.166664568298827E-002, 4.166664568298827E-002, 4.166664568298827E-002, 4.166664568298827E-002, 4.166664568298827E-002, 4.166664568298827E-002, 4.166664568298827E-002, 4.166664568298827E-002 }; __VOLK_ATTR_ALIGNED(32) static const float _ps_sincof_p0[8] = { -1.9515295891E-4, -1.9515295891E-4, -1.9515295891E-4, -1.9515295891E-4, -1.9515295891E-4, -1.9515295891E-4, -1.9515295891E-4, -1.9515295891E-4 }; __VOLK_ATTR_ALIGNED(32) static const float _ps_sincof_p1[8] = { 8.3321608736E-3, 8.3321608736E-3, 8.3321608736E-3, 8.3321608736E-3, 8.3321608736E-3, 8.3321608736E-3, 8.3321608736E-3, 8.3321608736E-3 }; __VOLK_ATTR_ALIGNED(32) static const float _ps_sincof_p2[8] = { -1.6666654611E-1, -1.6666654611E-1, -1.6666654611E-1, -1.6666654611E-1, -1.6666654611E-1, -1.6666654611E-1, -1.6666654611E-1, -1.6666654611E-1 }; __VOLK_ATTR_ALIGNED(32) static const float _ps_0p5[8] = { 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f }; __VOLK_ATTR_ALIGNED(32) static const float _ps_1[8] = { 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f }; __VOLK_ATTR_ALIGNED(32) float eight_phases[8] = { _phase, _phase + phase_inc, _phase + 2 * phase_inc, _phase + 3 * phase_inc, _phase + 4 * phase_inc, _phase + 5 * phase_inc, _phase + 6 * phase_inc, _phase + 7 * phase_inc }; __VOLK_ATTR_ALIGNED(32) float eight_phases_inc[8] = { 8 * phase_inc, 8 * phase_inc, 8 * phase_inc, 8 * phase_inc, 8 * phase_inc, 8 * phase_inc, 8 * phase_inc, 8 * phase_inc }; eight_phases_reg = _mm256_load_ps(eight_phases); const __m256 eight_phases_inc_reg = _mm256_load_ps(eight_phases_inc); for(;number < avx_iters; number++) { x = eight_phases_reg; sign_bit_sin = x; /* take the absolute value */ x = _mm256_and_ps(x, *(__m256*)_ps_inv_sign_mask); /* extract the sign bit (upper one) */ sign_bit_sin = _mm256_and_ps(sign_bit_sin, *(__m256*)_ps_sign_mask); /* scale by 4/Pi */ y = _mm256_mul_ps(x, *(__m256*)_ps_cephes_FOPI); /* store the integer part of y in emm2 */ emm2 = _mm256_cvttps_epi32(y); /* j=(j+1) & (~1) (see the cephes sources) */ emm2 = _mm256_add_epi32(emm2, *(__m256i *)_pi32_1); emm2 = _mm256_and_si256(emm2, *(__m256i *)_pi32_inv1); y = _mm256_cvtepi32_ps(emm2); emm4 = emm2; /* get the swap sign flag for the sine */ emm0 = _mm256_and_si256(emm2, *(__m256i *)_pi32_4); emm0 = _mm256_slli_epi32(emm0, 29); __m256 swap_sign_bit_sin = _mm256_castsi256_ps(emm0); /* get the polynom selection mask for the sine*/ emm2 = _mm256_and_si256(emm2, *(__m256i *)_pi32_2); emm2 = _mm256_cmpeq_epi32(emm2, _mm256_setzero_si256()); __m256 poly_mask = _mm256_castsi256_ps(emm2); /* The magic pass: "Extended precision modular arithmetic†x = ((x - y * DP1) - y * DP2) - y * DP3; */ xmm1 = *(__m256*)_ps_minus_cephes_DP1; xmm2 = *(__m256*)_ps_minus_cephes_DP2; xmm3 = *(__m256*)_ps_minus_cephes_DP3; xmm1 = _mm256_mul_ps(y, xmm1); xmm2 = _mm256_mul_ps(y, xmm2); xmm3 = _mm256_mul_ps(y, xmm3); x = _mm256_add_ps(x, xmm1); x = _mm256_add_ps(x, xmm2); x = _mm256_add_ps(x, xmm3); emm4 = _mm256_sub_epi32(emm4, *(__m256i *)_pi32_2); emm4 = _mm256_andnot_si256(emm4, *(__m256i *)_pi32_4); emm4 = _mm256_slli_epi32(emm4, 29); __m256 sign_bit_cos = _mm256_castsi256_ps(emm4); sign_bit_sin = _mm256_xor_ps(sign_bit_sin, swap_sign_bit_sin); /* Evaluate the first polynom (0 <= x <= Pi/4) */ __m256 z = _mm256_mul_ps(x, x); y = *(__m256*)_ps_coscof_p0; y = _mm256_mul_ps(y, z); y = _mm256_add_ps(y, *(__m256*)_ps_coscof_p1); y = _mm256_mul_ps(y, z); y = _mm256_add_ps(y, *(__m256*)_ps_coscof_p2); y = _mm256_mul_ps(y, z); y = _mm256_mul_ps(y, z); __m256 tmp = _mm256_mul_ps(z, *(__m256*)_ps_0p5); y = _mm256_sub_ps(y, tmp); y = _mm256_add_ps(y, *(__m256*)_ps_1); /* Evaluate the second polynom (Pi/4 <= x <= 0) */ __m256 y2 = *(__m256*)_ps_sincof_p0; y2 = _mm256_mul_ps(y2, z); y2 = _mm256_add_ps(y2, *(__m256*)_ps_sincof_p1); y2 = _mm256_mul_ps(y2, z); y2 = _mm256_add_ps(y2, *(__m256*)_ps_sincof_p2); y2 = _mm256_mul_ps(y2, z); y2 = _mm256_mul_ps(y2, x); y2 = _mm256_add_ps(y2, x); /* select the correct result from the two polynoms */ xmm3 = poly_mask; __m256 ysin2 = _mm256_and_ps(xmm3, y2); __m256 ysin1 = _mm256_andnot_ps(xmm3, y); y2 = _mm256_sub_ps(y2, ysin2); y = _mm256_sub_ps(y, ysin1); xmm1 = _mm256_add_ps(ysin1, ysin2); xmm2 = _mm256_add_ps(y, y2); /* update the sign */ sine = _mm256_xor_ps(xmm1, sign_bit_sin); cosine = _mm256_xor_ps(xmm2, sign_bit_cos); /* write the output */ s1 = _mm256_extractf128_ps(sine, 0); c1 = _mm256_extractf128_ps(cosine, 0); aux = _mm_unpacklo_ps(c1, s1); _mm_store_ps((float*)bPtr, aux); bPtr += 2; aux = _mm_unpackhi_ps(c1, s1); _mm_store_ps((float*)bPtr, aux); bPtr += 2; s1 = _mm256_extractf128_ps(sine, 1); c1 = _mm256_extractf128_ps(cosine, 1); aux = _mm_unpacklo_ps(c1, s1); _mm_store_ps((float*)bPtr, aux); bPtr += 2; aux = _mm_unpackhi_ps(c1, s1); _mm_store_ps((float*)bPtr, aux); bPtr += 2; eight_phases_reg = _mm256_add_ps(eight_phases_reg, eight_phases_inc_reg); } _mm256_zeroupper(); _phase = _phase + phase_inc * (avx_iters * 8); for(number = avx_iters * 8; number < num_points; number++) { out[number] = lv_cmake((float)cos(_phase), (float)sin(_phase) ); _phase += phase_inc; } (*phase) = _phase; } #endif /* LV_HAVE_AVX2 */ #ifdef LV_HAVE_AVX2 #include /* Based on algorithms from the cephes library http://www.netlib.org/cephes/ * Adapted to AVX2 by Carles Fernandez, based on original SSE2 code by Julien Pommier*/ static inline void volk_gnsssdr_s32f_sincos_32fc_u_avx2(lv_32fc_t* out, const float phase_inc, float* phase, unsigned int num_points) { lv_32fc_t* bPtr = out; const unsigned int avx_iters = num_points / 8; unsigned int number = 0; float _phase = (*phase); __m256 sine, cosine, x, eight_phases_reg; __m256 xmm1, xmm2, xmm3 = _mm256_setzero_ps(), sign_bit_sin, y; __m256i emm0, emm2, emm4; __m128 aux, c1, s1; /* declare some AXX2 constants */ __VOLK_ATTR_ALIGNED(32) static const int _ps_inv_sign_mask[8] = { ~0x80000000, ~0x80000000, ~0x80000000, ~0x80000000, ~0x80000000, ~0x80000000, ~0x80000000, ~0x80000000 }; __VOLK_ATTR_ALIGNED(32) static const int _ps_sign_mask[8] = { (int)0x80000000, (int)0x80000000, (int)0x80000000, (int)0x80000000, (int)0x80000000, (int)0x80000000, (int)0x80000000, (int)0x80000000 }; __VOLK_ATTR_ALIGNED(32) static const float _ps_cephes_FOPI[8] = { 1.27323954473516, 1.27323954473516, 1.27323954473516, 1.27323954473516, 1.27323954473516, 1.27323954473516, 1.27323954473516, 1.27323954473516 }; __VOLK_ATTR_ALIGNED(32) static const int _pi32_1[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; __VOLK_ATTR_ALIGNED(32) static const int _pi32_inv1[8] = { ~1, ~1, ~1, ~1, ~1, ~1, ~1, ~1 }; __VOLK_ATTR_ALIGNED(32) static const int _pi32_2[8] = { 2, 2, 2, 2, 2, 2, 2, 2 }; __VOLK_ATTR_ALIGNED(32) static const int _pi32_4[8] = { 4, 4, 4, 4, 4, 4, 4, 4 }; __VOLK_ATTR_ALIGNED(32) static const float _ps_minus_cephes_DP1[8] = { -0.78515625, -0.78515625, -0.78515625, -0.78515625, -0.78515625, -0.78515625, -0.78515625, -0.78515625 }; __VOLK_ATTR_ALIGNED(32) static const float _ps_minus_cephes_DP2[8] = { -2.4187564849853515625e-4, -2.4187564849853515625e-4, -2.4187564849853515625e-4, -2.4187564849853515625e-4, -2.4187564849853515625e-4, -2.4187564849853515625e-4, -2.4187564849853515625e-4, -2.4187564849853515625e-4 }; __VOLK_ATTR_ALIGNED(32) static const float _ps_minus_cephes_DP3[8] = { -3.77489497744594108e-8, -3.77489497744594108e-8, -3.77489497744594108e-8, -3.77489497744594108e-8, -3.77489497744594108e-8, -3.77489497744594108e-8, -3.77489497744594108e-8, -3.77489497744594108e-8 }; __VOLK_ATTR_ALIGNED(32) static const float _ps_coscof_p0[8] = { 2.443315711809948E-005, 2.443315711809948E-005, 2.443315711809948E-005, 2.443315711809948E-005, 2.443315711809948E-005, 2.443315711809948E-005, 2.443315711809948E-005, 2.443315711809948E-005 }; __VOLK_ATTR_ALIGNED(32) static const float _ps_coscof_p1[8] = { -1.388731625493765E-003, -1.388731625493765E-003, -1.388731625493765E-003, -1.388731625493765E-003, -1.388731625493765E-003, -1.388731625493765E-003, -1.388731625493765E-003, -1.388731625493765E-003 }; __VOLK_ATTR_ALIGNED(32) static const float _ps_coscof_p2[8] = { 4.166664568298827E-002, 4.166664568298827E-002, 4.166664568298827E-002, 4.166664568298827E-002, 4.166664568298827E-002, 4.166664568298827E-002, 4.166664568298827E-002, 4.166664568298827E-002 }; __VOLK_ATTR_ALIGNED(32) static const float _ps_sincof_p0[8] = { -1.9515295891E-4, -1.9515295891E-4, -1.9515295891E-4, -1.9515295891E-4, -1.9515295891E-4, -1.9515295891E-4, -1.9515295891E-4, -1.9515295891E-4 }; __VOLK_ATTR_ALIGNED(32) static const float _ps_sincof_p1[8] = { 8.3321608736E-3, 8.3321608736E-3, 8.3321608736E-3, 8.3321608736E-3, 8.3321608736E-3, 8.3321608736E-3, 8.3321608736E-3, 8.3321608736E-3 }; __VOLK_ATTR_ALIGNED(32) static const float _ps_sincof_p2[8] = { -1.6666654611E-1, -1.6666654611E-1, -1.6666654611E-1, -1.6666654611E-1, -1.6666654611E-1, -1.6666654611E-1, -1.6666654611E-1, -1.6666654611E-1 }; __VOLK_ATTR_ALIGNED(32) static const float _ps_0p5[8] = { 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f }; __VOLK_ATTR_ALIGNED(32) static const float _ps_1[8] = { 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f }; __VOLK_ATTR_ALIGNED(32) float eight_phases[8] = { _phase, _phase + phase_inc, _phase + 2 * phase_inc, _phase + 3 * phase_inc, _phase + 4 * phase_inc, _phase + 5 * phase_inc, _phase + 6 * phase_inc, _phase + 7 * phase_inc }; __VOLK_ATTR_ALIGNED(32) float eight_phases_inc[8] = { 8 * phase_inc, 8 * phase_inc, 8 * phase_inc, 8 * phase_inc, 8 * phase_inc, 8 * phase_inc, 8 * phase_inc, 8 * phase_inc }; eight_phases_reg = _mm256_load_ps(eight_phases); const __m256 eight_phases_inc_reg = _mm256_load_ps(eight_phases_inc); for(;number < avx_iters; number++) { x = eight_phases_reg; sign_bit_sin = x; /* take the absolute value */ x = _mm256_and_ps(x, *(__m256*)_ps_inv_sign_mask); /* extract the sign bit (upper one) */ sign_bit_sin = _mm256_and_ps(sign_bit_sin, *(__m256*)_ps_sign_mask); /* scale by 4/Pi */ y = _mm256_mul_ps(x, *(__m256*)_ps_cephes_FOPI); /* store the integer part of y in emm2 */ emm2 = _mm256_cvttps_epi32(y); /* j=(j+1) & (~1) (see the cephes sources) */ emm2 = _mm256_add_epi32(emm2, *(__m256i *)_pi32_1); emm2 = _mm256_and_si256(emm2, *(__m256i *)_pi32_inv1); y = _mm256_cvtepi32_ps(emm2); emm4 = emm2; /* get the swap sign flag for the sine */ emm0 = _mm256_and_si256(emm2, *(__m256i *)_pi32_4); emm0 = _mm256_slli_epi32(emm0, 29); __m256 swap_sign_bit_sin = _mm256_castsi256_ps(emm0); /* get the polynom selection mask for the sine*/ emm2 = _mm256_and_si256(emm2, *(__m256i *)_pi32_2); emm2 = _mm256_cmpeq_epi32(emm2, _mm256_setzero_si256()); __m256 poly_mask = _mm256_castsi256_ps(emm2); /* The magic pass: "Extended precision modular arithmetic†x = ((x - y * DP1) - y * DP2) - y * DP3; */ xmm1 = *(__m256*)_ps_minus_cephes_DP1; xmm2 = *(__m256*)_ps_minus_cephes_DP2; xmm3 = *(__m256*)_ps_minus_cephes_DP3; xmm1 = _mm256_mul_ps(y, xmm1); xmm2 = _mm256_mul_ps(y, xmm2); xmm3 = _mm256_mul_ps(y, xmm3); x = _mm256_add_ps(x, xmm1); x = _mm256_add_ps(x, xmm2); x = _mm256_add_ps(x, xmm3); emm4 = _mm256_sub_epi32(emm4, *(__m256i *)_pi32_2); emm4 = _mm256_andnot_si256(emm4, *(__m256i *)_pi32_4); emm4 = _mm256_slli_epi32(emm4, 29); __m256 sign_bit_cos = _mm256_castsi256_ps(emm4); sign_bit_sin = _mm256_xor_ps(sign_bit_sin, swap_sign_bit_sin); /* Evaluate the first polynom (0 <= x <= Pi/4) */ __m256 z = _mm256_mul_ps(x, x); y = *(__m256*)_ps_coscof_p0; y = _mm256_mul_ps(y, z); y = _mm256_add_ps(y, *(__m256*)_ps_coscof_p1); y = _mm256_mul_ps(y, z); y = _mm256_add_ps(y, *(__m256*)_ps_coscof_p2); y = _mm256_mul_ps(y, z); y = _mm256_mul_ps(y, z); __m256 tmp = _mm256_mul_ps(z, *(__m256*)_ps_0p5); y = _mm256_sub_ps(y, tmp); y = _mm256_add_ps(y, *(__m256*)_ps_1); /* Evaluate the second polynom (Pi/4 <= x <= 0) */ __m256 y2 = *(__m256*)_ps_sincof_p0; y2 = _mm256_mul_ps(y2, z); y2 = _mm256_add_ps(y2, *(__m256*)_ps_sincof_p1); y2 = _mm256_mul_ps(y2, z); y2 = _mm256_add_ps(y2, *(__m256*)_ps_sincof_p2); y2 = _mm256_mul_ps(y2, z); y2 = _mm256_mul_ps(y2, x); y2 = _mm256_add_ps(y2, x); /* select the correct result from the two polynoms */ xmm3 = poly_mask; __m256 ysin2 = _mm256_and_ps(xmm3, y2); __m256 ysin1 = _mm256_andnot_ps(xmm3, y); y2 = _mm256_sub_ps(y2, ysin2); y = _mm256_sub_ps(y, ysin1); xmm1 = _mm256_add_ps(ysin1, ysin2); xmm2 = _mm256_add_ps(y, y2); /* update the sign */ sine = _mm256_xor_ps(xmm1, sign_bit_sin); cosine = _mm256_xor_ps(xmm2, sign_bit_cos); /* write the output */ s1 = _mm256_extractf128_ps(sine, 0); c1 = _mm256_extractf128_ps(cosine, 0); aux = _mm_unpacklo_ps(c1, s1); _mm_storeu_ps((float*)bPtr, aux); bPtr += 2; aux = _mm_unpackhi_ps(c1, s1); _mm_storeu_ps((float*)bPtr, aux); bPtr += 2; s1 = _mm256_extractf128_ps(sine, 1); c1 = _mm256_extractf128_ps(cosine, 1); aux = _mm_unpacklo_ps(c1, s1); _mm_storeu_ps((float*)bPtr, aux); bPtr += 2; aux = _mm_unpackhi_ps(c1, s1); _mm_storeu_ps((float*)bPtr, aux); bPtr += 2; eight_phases_reg = _mm256_add_ps(eight_phases_reg, eight_phases_inc_reg); } _mm256_zeroupper(); _phase = _phase + phase_inc * (avx_iters * 8); for(number = avx_iters * 8; number < num_points; number++) { out[number] = lv_cmake((float)cos(_phase), (float)sin(_phase) ); _phase += phase_inc; } (*phase) = _phase; } #endif /* LV_HAVE_AVX2 */ #ifdef LV_HAVE_NEON #include /* Adapted from http://gruntthepeon.free.fr/ssemath/neon_mathfun.h, original code from Julien Pommier */ /* Based on algorithms from the cephes library http://www.netlib.org/cephes/ */ static inline void volk_gnsssdr_s32f_sincos_32fc_neon(lv_32fc_t* out, const float phase_inc, float* phase, unsigned int num_points) { lv_32fc_t* bPtr = out; const unsigned int neon_iters = num_points / 4; float _phase = (*phase); __VOLK_ATTR_ALIGNED(16) float32_t four_phases[4] = { _phase, _phase + phase_inc, _phase + 2 * phase_inc, _phase + 3 * phase_inc }; float four_inc = 4 * phase_inc; __VOLK_ATTR_ALIGNED(16) float32_t four_phases_inc[4] = { four_inc, four_inc, four_inc, four_inc }; float32x4_t four_phases_reg = vld1q_f32(four_phases); float32x4_t four_phases_inc_reg = vld1q_f32(four_phases_inc); const float32_t c_minus_cephes_DP1 = -0.78515625; const float32_t c_minus_cephes_DP2 = -2.4187564849853515625e-4; const float32_t c_minus_cephes_DP3 = -3.77489497744594108e-8; const float32_t c_sincof_p0 = -1.9515295891E-4; const float32_t c_sincof_p1 = 8.3321608736E-3; const float32_t c_sincof_p2 = -1.6666654611E-1; const float32_t c_coscof_p0 = 2.443315711809948E-005; const float32_t c_coscof_p1 = -1.388731625493765E-003; const float32_t c_coscof_p2 = 4.166664568298827E-002; const float32_t c_cephes_FOPI = 1.27323954473516; unsigned int number = 0; float32x4_t x, xmm1, xmm2, xmm3, y, y1, y2, ys, yc, z; float32x4x2_t result; uint32x4_t emm2, poly_mask, sign_mask_sin, sign_mask_cos; for(;number < neon_iters; number++) { x = four_phases_reg; sign_mask_sin = vcltq_f32(x, vdupq_n_f32(0)); x = vabsq_f32(x); /* scale by 4/Pi */ y = vmulq_f32(x, vdupq_n_f32(c_cephes_FOPI)); /* store the integer part of y in mm0 */ emm2 = vcvtq_u32_f32(y); /* j=(j+1) & (~1) (see the cephes sources) */ emm2 = vaddq_u32(emm2, vdupq_n_u32(1)); emm2 = vandq_u32(emm2, vdupq_n_u32(~1)); y = vcvtq_f32_u32(emm2); /* get the polynom selection mask there is one polynom for 0 <= x <= Pi/4 and another one for Pi/4 *
  • Carles Fernandez Prades 2016 cfernandez at cttc dot cat * * * VOLK_GNSSSDR puppet for integrating the sincos kernel into the test system * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 INCLUDED_volk_gnsssdr_s32f_sincospuppet_32fc_H #define INCLUDED_volk_gnsssdr_s32f_sincospuppet_32fc_H #include #include "volk_gnsssdr/volk_gnsssdr_s32f_sincos_32fc.h" #include #ifdef LV_HAVE_GENERIC static inline void volk_gnsssdr_s32f_sincospuppet_32fc_generic(lv_32fc_t* out, const float phase_inc, unsigned int num_points) { float phase[1]; phase[0] = 3; volk_gnsssdr_s32f_sincos_32fc_generic(out, phase_inc, phase, num_points); } #endif /* LV_HAVE_GENERIC */ #ifdef LV_HAVE_GENERIC static inline void volk_gnsssdr_s32f_sincospuppet_32fc_generic_fxpt(lv_32fc_t* out, const float phase_inc, unsigned int num_points) { float phase[1]; phase[0] = 3; volk_gnsssdr_s32f_sincos_32fc_generic_fxpt(out, phase_inc, phase, num_points); } #endif /* LV_HAVE_GENERIC */ #ifdef LV_HAVE_SSE2 static inline void volk_gnsssdr_s32f_sincospuppet_32fc_a_sse2(lv_32fc_t* out, const float phase_inc, unsigned int num_points) { float phase[1]; phase[0] = 3; volk_gnsssdr_s32f_sincos_32fc_a_sse2(out, phase_inc, phase, num_points); } #endif /* LV_HAVE_SSE2 */ #ifdef LV_HAVE_SSE2 static inline void volk_gnsssdr_s32f_sincospuppet_32fc_u_sse2(lv_32fc_t* out, const float phase_inc, unsigned int num_points) { float phase[1]; phase[0] = 3; volk_gnsssdr_s32f_sincos_32fc_u_sse2(out, phase_inc, phase, num_points); } #endif /* LV_HAVE_SSE2 */ #ifdef LV_HAVE_AVX2 static inline void volk_gnsssdr_s32f_sincospuppet_32fc_a_avx2(lv_32fc_t* out, const float phase_inc, unsigned int num_points) { float phase[1]; phase[0] = 3; volk_gnsssdr_s32f_sincos_32fc_a_avx2(out, phase_inc, phase, num_points); } #endif /* LV_HAVE_AVX2 */ #ifdef LV_HAVE_AVX2 static inline void volk_gnsssdr_s32f_sincospuppet_32fc_u_avx2(lv_32fc_t* out, const float phase_inc, unsigned int num_points) { float phase[1]; phase[0] = 3; volk_gnsssdr_s32f_sincos_32fc_u_avx2(out, phase_inc, phase, num_points); } #endif /* LV_HAVE_AVX2 */ #ifdef LV_HAVE_NEON static inline void volk_gnsssdr_s32f_sincospuppet_32fc_neon(lv_32fc_t* out, const float phase_inc, unsigned int num_points) { float phase[1]; phase[0] = 3; volk_gnsssdr_s32f_sincos_32fc_neon(out, phase_inc, phase, num_points); } #endif /* LV_HAVE_NEON */ #endif /* INCLUDED_volk_gnsssdr_s32f_sincospuppet_32fc_H */ gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/000077500000000000000000000000001305042567700265315ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/CMakeLists.txt000066400000000000000000000642431305042567700313020ustar00rootroot00000000000000# # Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) # # 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 . # ######################################################################## # header file detection ######################################################################## include(CheckIncludeFile) CHECK_INCLUDE_FILE(cpuid.h HAVE_CPUID_H) if(HAVE_CPUID_H) add_definitions(-DHAVE_CPUID_H) endif() CHECK_INCLUDE_FILE(intrin.h HAVE_INTRIN_H) if(HAVE_INTRIN_H) add_definitions(-DHAVE_INTRIN_H) endif() CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H) if(HAVE_FENV_H) add_definitions(-DHAVE_FENV_H) endif() CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H) if(HAVE_DLFCN_H) add_definitions(-DHAVE_DLFCN_H) list(APPEND volk_gnsssdr_libraries ${CMAKE_DL_LIBS}) endif() ######################################################################## # Setup the compiler name ######################################################################## set(COMPILER_NAME ${CMAKE_C_COMPILER_ID}) if(MSVC) #its not set otherwise set(COMPILER_NAME MSVC) endif() message(STATUS "Compiler name: ${COMPILER_NAME}") if(NOT DEFINED COMPILER_NAME) message(FATAL_ERROR "COMPILER_NAME undefined. Volk-gnsssdr build may not support this compiler.") endif() ######################################################################## # Special clang flag so flag checks can fail ######################################################################## if(COMPILER_NAME MATCHES "GNU") include(CheckCXXCompilerFlag) CHECK_CXX_COMPILER_FLAG("-Werror=unused-command-line-argument" HAVE_WERROR_UNUSED_CMD_LINE_ARG) if(HAVE_WERROR_UNUSED_CMD_LINE_ARG) set(VOLK_FLAG_CHECK_FLAGS "-Werror=unused-command-line-argument") endif() endif() ######################################################################## # check for posix_memalign, since some OSs do not internally define # _XOPEN_SOURCE or _POSIX_C_SOURCE; they leave this to the user. ######################################################################## include(CheckSymbolExists) CHECK_SYMBOL_EXISTS(posix_memalign stdlib.h HAVE_POSIX_MEMALIGN) if(HAVE_POSIX_MEMALIGN) add_definitions(-DHAVE_POSIX_MEMALIGN) endif(HAVE_POSIX_MEMALIGN) if(NOT DEFINED _XOPEN_SOURCE) add_definitions(-D_XOPEN_SOURCE=700) endif(NOT DEFINED _XOPEN_SOURCE) ######################################################################## # detect x86 flavor of CPU ######################################################################## if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(i.86|x86|x86_64|amd64|AMD64)$") message(STATUS "x86* CPU detected") set(CPU_IS_x86 TRUE) endif() ######################################################################## # determine passing architectures based on compile flag tests ######################################################################## execute_process( COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B} ${PROJECT_SOURCE_DIR}/gen/volk_gnsssdr_compile_utils.py --mode "arch_flags" --compiler "${COMPILER_NAME}" OUTPUT_VARIABLE arch_flag_lines OUTPUT_STRIP_TRAILING_WHITESPACE ) macro(check_arch arch_name) set(flags ${ARGN}) set(have_${arch_name} TRUE) foreach(flag ${flags}) if (MSVC AND (${flag} STREQUAL "/arch:SSE2" OR ${flag} STREQUAL "/arch:SSE" )) # SSE/SSE2 is supported in MSVC since VS 2005 but flag not available when compiling 64-bit so do not check else() include(CheckCXXCompilerFlag) set(have_flag have${flag}) #make the have_flag have nice alphanum chars (just for looks/not necessary) execute_process( COMMAND ${PYTHON_EXECUTABLE} -c "import re; print(re.sub('\\W', '_', '${have_flag}'))" OUTPUT_VARIABLE have_flag OUTPUT_STRIP_TRAILING_WHITESPACE ) if(VOLK_FLAG_CHECK_FLAGS) set(CMAKE_REQUIRED_FLAGS ${VOLK_FLAG_CHECK_FLAGS}) endif() CHECK_CXX_COMPILER_FLAG(${flag} ${have_flag}) unset(CMAKE_REQUIRED_FLAGS) if (NOT ${have_flag}) set(have_${arch_name} FALSE) endif() endif() endforeach() if (have_${arch_name}) list(APPEND available_archs ${arch_name}) endif() endmacro(check_arch) foreach(line ${arch_flag_lines}) string(REGEX REPLACE "," ";" arch_flags ${line}) check_arch(${arch_flags}) endforeach(line) macro(OVERRULE_ARCH arch reason) message(STATUS "${reason}, Overruled arch ${arch}") list(REMOVE_ITEM available_archs ${arch}) endmacro(OVERRULE_ARCH) ######################################################################## # eliminate AVX on if not on x86, or if the compiler does not accept # the xgetbv instruction, or {if not cross-compiling and the xgetbv # executable does not function correctly}. ######################################################################## set(HAVE_XGETBV 0) set(HAVE_AVX_CVTPI32_PS 0) if(CPU_IS_x86) # check to see if the compiler/linker works with xgetb instruction if (NOT MSVC) file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/test_xgetbv.c "unsigned long long _xgetbv(unsigned int index) { unsigned int eax, edx; __asm__ __volatile__(\"xgetbv\" : \"=a\"(eax), \"=d\"(edx) : \"c\"(index)); return ((unsigned long long)edx << 32) | eax; } int main (void) { (void) _xgetbv(0); return (0); }") else (NOT MSVC) #MSVC defines an intrinsic file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/test_xgetbv.c "#include \n #include \n int main() { int avxSupported = 0; \n#if (_MSC_FULL_VER >= 160040219) \nint cpuInfo[4]; __cpuid(cpuInfo, 1);\nif ((cpuInfo[2] & (1 << 27) || 0) && (cpuInfo[2] & (1 << 28) || 0)) \n{\nunsigned long long xcrFeatureMask = _xgetbv(_XCR_XFEATURE_ENABLED_MASK);\n avxSupported = (xcrFeatureMask & 0x6) == 6;}\n#endif \n return 1- avxSupported; }") endif(NOT MSVC) execute_process(COMMAND ${CMAKE_C_COMPILER} -o ${CMAKE_CURRENT_BINARY_DIR}/test_xgetbv ${CMAKE_CURRENT_BINARY_DIR}/test_xgetbv.c OUTPUT_QUIET ERROR_QUIET RESULT_VARIABLE avx_compile_result) if(NOT ${avx_compile_result} EQUAL 0) OVERRULE_ARCH(avx "Compiler or linker missing xgetbv instruction") elseif(NOT CROSSCOMPILE_MULTILIB) execute_process(COMMAND ${CMAKE_CURRENT_BINARY_DIR}/test_xgetbv OUTPUT_QUIET ERROR_QUIET RESULT_VARIABLE avx_exe_result) if(NOT ${avx_exe_result} EQUAL 0) OVERRULE_ARCH(avx "CPU missing xgetbv") else() set(HAVE_XGETBV 1) endif() else() # cross compiling and compiler/linker seems to work; assume working set(HAVE_XGETBV 1) endif() file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/test_xgetbv ${CMAKE_CURRENT_BINARY_DIR}/test_xgetbv.c) ######################################################################### # eliminate AVX if cvtpi32_ps intrinsic fails like some versions of clang ######################################################################### # check to see if the compiler/linker works with cvtpi32_ps instrinsic when using AVX if (CMAKE_SIZEOF_VOID_P EQUAL 4) file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/test_cvtpi32_ps.c "#include \nint main (void) {__m128 __a; __m64 __b; __m128 foo = _mm_cvtpi32_ps(__a, __b); return (0); }") execute_process(COMMAND ${CMAKE_C_COMPILER} -mavx -o ${CMAKE_CURRENT_BINARY_DIR}/test_cvtpi32_ps ${CMAKE_CURRENT_BINARY_DIR}/test_cvtpi32_ps.c OUTPUT_QUIET ERROR_QUIET RESULT_VARIABLE avx_compile_result) if(NOT ${avx_compile_result} EQUAL 0) OVERRULE_ARCH(avx "Compiler missing cvtpi32_ps instrinsic") elseif(NOT CROSSCOMPILE_MULTILIB) execute_process(COMMAND ${CMAKE_CURRENT_BINARY_DIR}/test_cvtpi32_ps OUTPUT_QUIET ERROR_QUIET RESULT_VARIABLE avx_exe_result) if(NOT ${avx_exe_result} EQUAL 0) OVERRULE_ARCH(avx "CPU missing cvtpi32_ps") else() set(HAVE_AVX_CVTPI32_PS 1) endif() else() set(HAVE_AVX_CVTPI32_PS 1) endif() file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/test_cvtpi32_ps ${CMAKE_CURRENT_BINARY_DIR}/test_cvtpi32_ps.c) else(CMAKE_SIZEOF_VOID_P EQUAL 4) # 64-bit compilations won't need this command so don't overrule AVX set(HAVE_AVX_CVTPI32_PS 0) endif(CMAKE_SIZEOF_VOID_P EQUAL 4) # Disable SSE4a if Clang is less than version 3.2 if("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang") # Figure out the version of Clang if(CMAKE_VERSION VERSION_LESS "2.8.10") # Exctract the Clang version from the --version string. # In cmake 2.8.10, we can just use CMAKE_C_COMPILER_VERSION # without having to go through these string manipulations execute_process(COMMAND ${CMAKE_C_COMPILER} --version OUTPUT_VARIABLE clang_version) string(REGEX MATCH "[0-9].[0-9]" CMAKE_C_COMPILER_VERSION ${clang_version}) endif(CMAKE_VERSION VERSION_LESS "2.8.10") if(CMAKE_C_COMPILER_VERSION VERSION_LESS "3.2") OVERRULE_ARCH(sse4_a "Clang >= 3.2 required for SSE4a") endif(CMAKE_C_COMPILER_VERSION VERSION_LESS "3.2") endif("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang") endif(CPU_IS_x86) if(${HAVE_XGETBV}) add_definitions(-DHAVE_XGETBV) endif() if(${HAVE_AVX_CVTPI32_PS}) add_definitions(-DHAVE_AVX_CVTPI32_PS) endif() ######################################################################## # if the CPU is not x86, eliminate all Intel SIMD ######################################################################## if(NOT CPU_IS_x86) OVERRULE_ARCH(3dnow "Architecture is not x86 or x86_64") OVERRULE_ARCH(mmx "Architecture is not x86 or x86_64") OVERRULE_ARCH(sse "Architecture is not x86 or x86_64") OVERRULE_ARCH(sse2 "Architecture is not x86 or x86_64") OVERRULE_ARCH(sse3 "Architecture is not x86 or x86_64") OVERRULE_ARCH(ssse3 "Architecture is not x86 or x86_64") OVERRULE_ARCH(sse4_a "Architecture is not x86 or x86_64") OVERRULE_ARCH(sse4_1 "Architecture is not x86 or x86_64") OVERRULE_ARCH(sse4_2 "Architecture is not x86 or x86_64") OVERRULE_ARCH(avx "Architecture is not x86 or x86_64") endif(NOT CPU_IS_x86) ######################################################################## # implement overruling in the ORC case, # since ORC always passes flag detection ######################################################################## if(NOT ORC_FOUND) OVERRULE_ARCH(orc "ORC support not found") endif() ######################################################################## # implement overruling in the non-multilib case # this makes things work when both -m32 and -m64 pass ######################################################################## if(NOT CROSSCOMPILE_MULTILIB AND CPU_IS_x86) include(CheckTypeSize) check_type_size("void*[8]" SIZEOF_CPU BUILTIN_TYPES_ONLY) if (${SIZEOF_CPU} EQUAL 64) OVERRULE_ARCH(32 "CPU width is 64 bits") endif() if (${SIZEOF_CPU} EQUAL 32) OVERRULE_ARCH(64 "CPU width is 32 bits") endif() #MSVC 64 bit does not have MMX, overrule it if (${SIZEOF_CPU} EQUAL 64 AND MSVC) OVERRULE_ARCH(mmx "No MMX for Win64") endif() endif() ######################################################################## # done overrules! print the result ######################################################################## message(STATUS "Available architectures: ${available_archs}") ######################################################################## # determine available machines given the available architectures ######################################################################## execute_process( COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B} ${PROJECT_SOURCE_DIR}/gen/volk_gnsssdr_compile_utils.py --mode "machines" --archs "${available_archs}" OUTPUT_VARIABLE available_machines OUTPUT_STRIP_TRAILING_WHITESPACE ) ######################################################################## # Implement machine overruling for redundant machines: # A machine is redundant when expansion rules occur, # and the arch superset passes configuration checks. # When this occurs, eliminate the redundant machines # to avoid unnecessary compilation of subset machines. ######################################################################## foreach(arch mmx orc 64 32) foreach(machine_name ${available_machines}) string(REPLACE "_${arch}" "" machine_name_no_arch ${machine_name}) if (${machine_name} STREQUAL ${machine_name_no_arch}) else() list(REMOVE_ITEM available_machines ${machine_name_no_arch}) endif() endforeach(machine_name) endforeach(arch) ######################################################################## # done overrules! print the result ######################################################################## message(STATUS "Available machines: ${available_machines}") ######################################################################## # Create rules to run the volk_gnsssdr generator ######################################################################## #dependencies are all python, xml, and header implementation files file(GLOB xml_files ${PROJECT_SOURCE_DIR}/gen/*.xml) list(SORT xml_files) file(GLOB py_files ${PROJECT_SOURCE_DIR}/gen/*.py) list(SORT py_files) file(GLOB h_files ${PROJECT_SOURCE_DIR}/kernels/volk_gnsssdr/*.h) list(SORT h_files) macro(gen_template tmpl output) list(APPEND volk_gnsssdr_gen_sources ${output}) add_custom_command( OUTPUT ${output} DEPENDS ${xml_files} ${py_files} ${h_files} ${tmpl} COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B} ${PROJECT_SOURCE_DIR}/gen/volk_gnsssdr_tmpl_utils.py --input ${tmpl} --output ${output} ${ARGN} ) endmacro(gen_template) make_directory(${PROJECT_BINARY_DIR}/include/volk_gnsssdr) gen_template(${PROJECT_SOURCE_DIR}/tmpl/volk_gnsssdr.tmpl.h ${PROJECT_BINARY_DIR}/include/volk_gnsssdr/volk_gnsssdr.h) gen_template(${PROJECT_SOURCE_DIR}/tmpl/volk_gnsssdr.tmpl.c ${PROJECT_BINARY_DIR}/lib/volk_gnsssdr.c) gen_template(${PROJECT_SOURCE_DIR}/tmpl/volk_gnsssdr_typedefs.tmpl.h ${PROJECT_BINARY_DIR}/include/volk_gnsssdr/volk_gnsssdr_typedefs.h) gen_template(${PROJECT_SOURCE_DIR}/tmpl/volk_gnsssdr_cpu.tmpl.h ${PROJECT_BINARY_DIR}/include/volk_gnsssdr/volk_gnsssdr_cpu.h) gen_template(${PROJECT_SOURCE_DIR}/tmpl/volk_gnsssdr_cpu.tmpl.c ${PROJECT_BINARY_DIR}/lib/volk_gnsssdr_cpu.c) gen_template(${PROJECT_SOURCE_DIR}/tmpl/volk_gnsssdr_config_fixed.tmpl.h ${PROJECT_BINARY_DIR}/include/volk_gnsssdr/volk_gnsssdr_config_fixed.h) gen_template(${PROJECT_SOURCE_DIR}/tmpl/volk_gnsssdr_machines.tmpl.h ${PROJECT_BINARY_DIR}/lib/volk_gnsssdr_machines.h) gen_template(${PROJECT_SOURCE_DIR}/tmpl/volk_gnsssdr_machines.tmpl.c ${PROJECT_BINARY_DIR}/lib/volk_gnsssdr_machines.c) set(BASE_CFLAGS NONE) string(TOUPPER ${CMAKE_BUILD_TYPE} CBTU) message(STATUS "BUILD TYPE = ${CBTU}") message(STATUS "Base cflags = ${CMAKE_C_FLAGS_${CBTU}} ${CMAKE_C_FLAGS}") set(COMPILER_INFO "") if(MSVC) if(MSVC90) #Visual Studio 9 set(cmake_c_compiler_version "Microsoft Visual Studio 9.0") elseif(MSVC10) #Visual Studio 10 set(cmake_c_compiler_version "Microsoft Visual Studio 10.0") elseif(MSVC11) #Visual Studio 11 set(cmake_c_compiler_version "Microsoft Visual Studio 11.0") elseif(MSVC12) #Visual Studio 12 SET(cmake_c_compiler_version "Microsoft Visual Studio 12.0") endif() else() execute_process(COMMAND ${CMAKE_C_COMPILER} --version OUTPUT_VARIABLE cmake_c_compiler_version) endif(MSVC) set(COMPILER_INFO "${CMAKE_C_COMPILER}:::${CMAKE_C_FLAGS_${GRCBTU}} ${CMAKE_C_FLAGS}\n${CMAKE_CXX_COMPILER}:::${CMAKE_CXX_FLAGS_${GRCBTU}} ${CMAKE_CXX_FLAGS}\n" ) foreach(machine_name ${available_machines}) #generate machine source set(machine_source ${CMAKE_CURRENT_BINARY_DIR}/volk_gnsssdr_machine_${machine_name}.c) gen_template(${PROJECT_SOURCE_DIR}/tmpl/volk_gnsssdr_machine_xxx.tmpl.c ${machine_source} ${machine_name}) #determine machine flags execute_process( COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B} ${PROJECT_SOURCE_DIR}/gen/volk_gnsssdr_compile_utils.py --mode "machine_flags" --machine "${machine_name}" --compiler "${COMPILER_NAME}" OUTPUT_VARIABLE ${machine_name}_flags OUTPUT_STRIP_TRAILING_WHITESPACE ) MESSAGE(STATUS "BUILD INFO ::: ${machine_name} ::: ${COMPILER_NAME} ::: ${CMAKE_C_FLAGS_${CBTU}} ${CMAKE_C_FLAGS} ${${machine_name}_flags}") set(COMPILER_INFO "${COMPILER_INFO}${machine_name}:::${COMPILER_NAME}:::${CMAKE_C_FLAGS_${CBTU}} ${CMAKE_C_FLAGS} ${${machine_name}_flags}\n" ) if(${machine_name}_flags AND NOT MSVC) set_source_files_properties(${machine_source} PROPERTIES COMPILE_FLAGS "${${machine_name}_flags}") endif() #add to available machine defs string(TOUPPER LV_MACHINE_${machine_name} machine_def) list(APPEND machine_defs ${machine_def}) endforeach(machine_name) # Convert to a C string to compile and display properly string(STRIP "${cmake_c_compiler_version}" cmake_c_compiler_version) string(STRIP ${COMPILER_INFO} COMPILER_INFO) MESSAGE(STATUS "Compiler Version: ${cmake_c_compiler_version}") string(REPLACE "\n" " \\n" cmake_c_compiler_version ${cmake_c_compiler_version}) string(REPLACE "\n" " \\n" COMPILER_INFO ${COMPILER_INFO}) ######################################################################## # Set local include directories first ######################################################################## include_directories( ${PROJECT_BINARY_DIR}/include ${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/kernels ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ) ######################################################################## # Handle ASM support # on by default, but let users turn it off ######################################################################## if(${CMAKE_VERSION} VERSION_GREATER "2.8.9") set(ASM_ARCHS_AVAILABLE "neon") set(FULL_C_FLAGS "${CMAKE_C_FLAGS}" "${CMAKE_CXX_COMPILER_ARG1}") # sort through a list of all architectures we have ASM for # if we find one that matches our current system architecture # set up the assembler flags and include the source files foreach(ARCH ${ASM_ARCHS_AVAILABLE}) string(REGEX MATCH "${ARCH}" ASM_ARCH "${available_archs}") if( ASM_ARCH STREQUAL "neon" ) message(STATUS "---- Adding ASM files") # we always use ATT syntax message(STATUS "-- Detected neon architecture; enabling ASM") # setup architecture specific assembler flags set(ARCH_ASM_FLAGS "-mfpu=neon -g") # then add the files include_directories(${PROJECT_SOURCE_DIR}/kernels/volk_gnsssdr/asm/neon) file(GLOB asm_files ${PROJECT_SOURCE_DIR}/kernels/volk_gnsssdr/asm/neon/*.s) list(SORT asm_files) foreach(asm_file ${asm_files}) list(APPEND volk_gnsssdr_sources ${asm_file}) message(STATUS "Adding source file: ${asm_file}") endforeach(asm_file) endif() enable_language(ASM) set(CMAKE_ASM_FLAGS ${ARCH_ASM_FLAGS}) message(STATUS "c flags: ${FULL_C_FLAGS}") message(STATUS "asm flags: ${CMAKE_ASM_FLAGS}") endforeach(ARCH) else(${CMAKE_VERSION} VERSION_GREATER "2.8.9") message(STATUS "Not enabling ASM support. CMake >= 2.8.10 required.") foreach(machine_name ${available_machines}) string(REGEX MATCH "neon" NEON_MACHINE ${machine_name}) if( NEON_MACHINE STREQUAL "neon") message(FATAL_ERROR "CMake >= 2.8.10 is required for ARM NEON support") endif() endforeach() endif(${CMAKE_VERSION} VERSION_GREATER "2.8.9") ######################################################################## # Handle orc support ######################################################################## if(ORC_FOUND) #setup orc library usage include_directories(${ORC_INCLUDE_DIRS}) link_directories(${ORC_LIBRARY_DIRS}) list(APPEND volk_gnsssdr_libraries ${ORC_LIBRARIES}) #setup orc functions file(GLOB orc_files ${PROJECT_SOURCE_DIR}/kernels/volk_gnsssdr/asm/orc/*.orc) list(SORT orc_files) foreach(orc_file ${orc_files}) #extract the name for the generated c source from the orc file get_filename_component(orc_file_name_we ${orc_file} NAME_WE) set(orcc_gen ${CMAKE_CURRENT_BINARY_DIR}/${orc_file_name_we}.c) #create a rule to generate the source and add to the list of sources add_custom_command( COMMAND ${ORCC_EXECUTABLE} --include math.h --implementation -o ${orcc_gen} ${orc_file} DEPENDS ${orc_file} OUTPUT ${orcc_gen} ) list(APPEND volk_gnsssdr_sources ${orcc_gen}) endforeach(orc_file) else() message(STATUS "Did not find liborc and orcc, disabling orc support...") endif() ######################################################################## # Handle the generated constants ######################################################################## message(STATUS "Loading version ${VERSION} into constants...") #double escape for windows backslash path separators string(REPLACE "\\" "\\\\" prefix "${prefix}") configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/constants.c.in ${CMAKE_CURRENT_BINARY_DIR}/constants.c @ONLY) list(APPEND volk_gnsssdr_sources ${CMAKE_CURRENT_BINARY_DIR}/constants.c) ######################################################################## # Setup the volk_gnsssdr sources list and library ######################################################################## if(NOT WIN32) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden") endif() list(APPEND volk_gnsssdr_sources ${CMAKE_CURRENT_SOURCE_DIR}/volk_gnsssdr_prefs.c ${CMAKE_CURRENT_SOURCE_DIR}/volk_gnsssdr_rank_archs.c ${CMAKE_CURRENT_SOURCE_DIR}/volk_gnsssdr_malloc.c ${volk_gnsssdr_gen_sources} ) #set the machine definitions where applicable set_source_files_properties( ${CMAKE_CURRENT_BINARY_DIR}/volk_gnsssdr.c ${CMAKE_CURRENT_BINARY_DIR}/volk_gnsssdr_machines.c PROPERTIES COMPILE_DEFINITIONS "${machine_defs}") if(MSVC) #add compatibility includes for stdint types include_directories(${PROJECT_SOURCE_DIR}/cmake/msvc) add_definitions(-DHAVE_CONFIG_H) #compile the sources as C++ due to the lack of complex.h under MSVC set_source_files_properties(${volk_gnsssdr_sources} PROPERTIES LANGUAGE CXX) endif() #Use object library for faster overall build in newer versions of cmake if(CMAKE_VERSION VERSION_GREATER "2.8.7") #Create a volk_gnsssdr object library (requires cmake >= 2.8.8) add_library(volk_gnsssdr_obj OBJECT ${volk_gnsssdr_sources}) #Add dynamic library add_library(volk_gnsssdr SHARED $) target_link_libraries(volk_gnsssdr ${volk_gnsssdr_libraries} ${Boost_LIBRARIES}) #Configure target properties set_target_properties(volk_gnsssdr_obj PROPERTIES COMPILE_FLAGS "-fPIC") set_target_properties(volk_gnsssdr PROPERTIES SOVERSION ${LIBVER}) set_target_properties(volk_gnsssdr PROPERTIES DEFINE_SYMBOL "volk_gnsssdr_EXPORTS") #Install locations install(TARGETS volk_gnsssdr LIBRARY DESTINATION lib${LIB_SUFFIX} COMPONENT "volk_gnsssdr_runtime" # .so file ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT "volk_gnsssdr_devel" # .lib file RUNTIME DESTINATION bin COMPONENT "volk_gnsssdr_runtime" # .dll file ) #Configure static library if(ENABLE_STATIC_LIBS) add_library(volk_gnsssdr_static STATIC $) set_target_properties(volk_gnsssdr_static PROPERTIES OUTPUT_NAME volk_gnsssdr) install(TARGETS volk_gnsssdr_static ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT "volk_gnsssdr_devel" ) endif(ENABLE_STATIC_LIBS) #Older cmake versions (slower to build when building dynamic/static libs) else() #create the volk_gnsssdr runtime library add_library(volk_gnsssdr SHARED ${volk_gnsssdr_sources}) target_link_libraries(volk_gnsssdr ${volk_gnsssdr_libraries}) set_target_properties(volk_gnsssdr PROPERTIES SOVERSION ${LIBVER}) set_target_properties(volk_gnsssdr PROPERTIES DEFINE_SYMBOL "volk_gnsssdr_EXPORTS") install(TARGETS volk_gnsssdr LIBRARY DESTINATION lib${LIB_SUFFIX} COMPONENT "volk_gnsssdr_runtime" # .so file ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT "volk_gnsssdr_devel" # .lib file RUNTIME DESTINATION bin COMPONENT "volk_gnsssdr_runtime" # .dll file ) if(ENABLE_STATIC_LIBS) add_library(volk_gnsssdr_static STATIC ${volk_gnsssdr_sources}) if(NOT WIN32) set_target_properties(volk_gnsssdr_static PROPERTIES OUTPUT_NAME volk_gnsssdr) endif(NOT WIN32) install(TARGETS volk_gnsssdr_static ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT "volk_gnsssdr_devel" # .lib file ) endif(ENABLE_STATIC_LIBS) endif(CMAKE_VERSION VERSION_GREATER "2.8.7") ######################################################################## # Build the QA test application ######################################################################## if(ENABLE_TESTING) #include Boost headers include_directories(${Boost_INCLUDE_DIRS}) link_directories(${Boost_LIBRARY_DIRS}) make_directory(${CMAKE_CURRENT_BINARY_DIR}/.unittest) set_source_files_properties( ${CMAKE_CURRENT_SOURCE_DIR}/testqa.cc PROPERTIES COMPILE_DEFINITIONS "BOOST_TEST_DYN_LINK;BOOST_TEST_MAIN" ) include(VolkAddTest) VOLK_ADD_TEST(test_all SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/testqa.cc ${CMAKE_CURRENT_SOURCE_DIR}/qa_utils.cc TARGET_DEPS volk_gnsssdr ) endif(ENABLE_TESTING) gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/constants.c.in000066400000000000000000000024551305042567700313240ustar00rootroot00000000000000/* -*- c++ -*- */ /* Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) * * 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 . */ #if HAVE_CONFIG_H #include #endif #include #include const char* volk_gnsssdr_prefix() { const char *prefix = getenv("VOLK_GNSSSDR_PREFIX"); if (prefix != NULL) return prefix; return "@prefix@"; } const char* volk_gnsssdr_version() { return "@VERSION@"; } const char* volk_gnsssdr_c_compiler() { return "@cmake_c_compiler_version@"; } const char* volk_gnsssdr_compiler_flags() { return "@COMPILER_INFO@"; } const char* volk_gnsssdr_available_machines() { return "@available_machines@"; } gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/kernel_tests.h000066400000000000000000000133321305042567700314060ustar00rootroot00000000000000/*! * \file kernel_tests.h * \author Carles Fernandez-Prades, 2015. cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "qa_utils.h" #include #include #include // macros for initializing volk_gnsssdr_test_case_t. Macros are needed to generate // function names of the pattern kernel_name_* // for puppets we need to get all the func_variants for the puppet and just // keep track of the actual function name to write to results #define VOLK_INIT_PUPP(func, puppet_master_func, test_params)\ volk_gnsssdr_test_case_t(func##_get_func_desc(), (void(*)())func##_manual, std::string(#func),\ std::string(#puppet_master_func), test_params) #define VOLK_INIT_TEST(func, test_params)\ volk_gnsssdr_test_case_t(func##_get_func_desc(), (void(*)())func##_manual, std::string(#func),\ test_params) std::vector init_test_list(volk_gnsssdr_test_params_t test_params) { // Some kernels need a lower tolerance volk_gnsssdr_test_params_t test_params_inacc = volk_gnsssdr_test_params_t(1e-3, test_params.scalar(), test_params.vlen(), test_params.iter(), test_params.benchmark_mode(), test_params.kernel_regex()); volk_gnsssdr_test_params_t test_params_int1 = volk_gnsssdr_test_params_t(1, test_params.scalar(), test_params.vlen(), test_params.iter(), test_params.benchmark_mode(), test_params.kernel_regex()); // some others need more iterations ***** ADDED BY GNSS-SDR volk_gnsssdr_test_params_t test_params_more_iters = volk_gnsssdr_test_params_t(test_params.tol(), test_params.scalar(), test_params.vlen(), 100000, test_params.benchmark_mode(), test_params.kernel_regex()); // ... or more tolerance ***** ADDED BY GNSS-SDR volk_gnsssdr_test_params_t test_params_int16 = volk_gnsssdr_test_params_t(16, test_params.scalar(), test_params.vlen(), test_params.iter(), test_params.benchmark_mode(), test_params.kernel_regex()); volk_gnsssdr_test_params_t test_params_inacc2 = volk_gnsssdr_test_params_t(2e-1, test_params.scalar(), test_params.vlen(), test_params.iter(), test_params.benchmark_mode(), test_params.kernel_regex()); std::vector test_cases = boost::assign::list_of (VOLK_INIT_TEST(volk_gnsssdr_8i_accumulator_s8i, test_params_more_iters)) (VOLK_INIT_TEST(volk_gnsssdr_8i_index_max_16u, test_params_more_iters)) (VOLK_INIT_TEST(volk_gnsssdr_8i_max_s8i, test_params_more_iters)) (VOLK_INIT_TEST(volk_gnsssdr_8i_x2_add_8i, test_params_more_iters)) (VOLK_INIT_TEST(volk_gnsssdr_8ic_conjugate_8ic, test_params_more_iters)) (VOLK_INIT_TEST(volk_gnsssdr_8ic_magnitude_squared_8i, test_params_more_iters)) (VOLK_INIT_TEST(volk_gnsssdr_8ic_x2_dot_prod_8ic, test_params)) (VOLK_INIT_TEST(volk_gnsssdr_8ic_x2_multiply_8ic, test_params)) (VOLK_INIT_TEST(volk_gnsssdr_8ic_s8ic_multiply_8ic, test_params)) (VOLK_INIT_TEST(volk_gnsssdr_8u_x2_multiply_8u, test_params_more_iters)) (VOLK_INIT_TEST(volk_gnsssdr_64f_accumulator_64f, test_params)) (VOLK_INIT_TEST(volk_gnsssdr_32f_sincos_32fc, test_params_inacc)) (VOLK_INIT_TEST(volk_gnsssdr_32f_index_max_32u, test_params)) (VOLK_INIT_TEST(volk_gnsssdr_32fc_convert_8ic, test_params)) (VOLK_INIT_TEST(volk_gnsssdr_32fc_convert_16ic, test_params_more_iters)) (VOLK_INIT_TEST(volk_gnsssdr_16ic_x2_dot_prod_16ic, test_params)) (VOLK_INIT_TEST(volk_gnsssdr_16ic_x2_multiply_16ic, test_params_more_iters)) (VOLK_INIT_TEST(volk_gnsssdr_16ic_convert_32fc, test_params_more_iters)) (VOLK_INIT_PUPP(volk_gnsssdr_s32f_sincospuppet_32fc, volk_gnsssdr_s32f_sincos_32fc, test_params_inacc2)) (VOLK_INIT_PUPP(volk_gnsssdr_16ic_rotatorpuppet_16ic, volk_gnsssdr_16ic_s32fc_x2_rotator_16ic, test_params_int1)) (VOLK_INIT_PUPP(volk_gnsssdr_16ic_resamplerfastpuppet_16ic, volk_gnsssdr_16ic_resampler_fast_16ic, test_params)) (VOLK_INIT_PUPP(volk_gnsssdr_16ic_resamplerfastxnpuppet_16ic, volk_gnsssdr_16ic_xn_resampler_fast_16ic_xn, test_params)) (VOLK_INIT_PUPP(volk_gnsssdr_16ic_resamplerxnpuppet_16ic, volk_gnsssdr_16ic_xn_resampler_16ic_xn, test_params)) (VOLK_INIT_PUPP(volk_gnsssdr_32fc_resamplerxnpuppet_32fc, volk_gnsssdr_32fc_xn_resampler_32fc_xn, test_params)) (VOLK_INIT_PUPP(volk_gnsssdr_16ic_x2_dotprodxnpuppet_16ic, volk_gnsssdr_16ic_x2_dot_prod_16ic_xn, test_params)) (VOLK_INIT_PUPP(volk_gnsssdr_16ic_x2_rotator_dotprodxnpuppet_16ic, volk_gnsssdr_16ic_x2_rotator_dot_prod_16ic_xn, test_params_int16)) (VOLK_INIT_PUPP(volk_gnsssdr_32fc_x2_rotator_dotprodxnpuppet_32fc, volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn, test_params_int1)) ; return test_cases; } gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/qa_utils.cc000066400000000000000000001061521305042567700306660ustar00rootroot00000000000000/* Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) * * 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 . */ #include "qa_utils.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include float uniform() { return 2.0f * ((float) rand() / RAND_MAX - 0.5f); // uniformly (-1, 1) } template void random_floats (t *buf, unsigned n) { for (unsigned i = 0; i < n; i++) buf[i] = uniform (); } void load_random_data(void *data, volk_gnsssdr_type_t type, unsigned int n) { if(type.is_complex) n *= 2; if(type.is_float) { if(type.size == 8) random_floats((double *)data, n); else random_floats((float *)data, n); } else { float int_max = float(uint64_t(2) << (type.size*8)); if(type.is_signed) int_max /= 2.0; for(unsigned int i = 0; i < n; i++) { float scaled_rand = (((float) (rand() - (RAND_MAX/2))) / static_cast((RAND_MAX/2))) * int_max; //man i really don't know how to do this in a more clever way, you have to cast down at some point switch(type.size) { case 8: if(type.is_signed) ((int64_t *)data)[i] = (int64_t) scaled_rand; else ((uint64_t *)data)[i] = (uint64_t) scaled_rand; break; case 4: if(type.is_signed) ((int32_t *)data)[i] = (int32_t) scaled_rand; else ((uint32_t *)data)[i] = (uint32_t) scaled_rand; break; case 2: // 16 bit multiplication saturates very fast // we produce here only 3 bits input range if(type.is_signed) ((int16_t *)data)[i] = (int16_t)((int16_t) scaled_rand % 8); else ((uint16_t *)data)[i] = (uint16_t) (int16_t)((int16_t) scaled_rand % 8); break; case 1: if(type.is_signed) ((int8_t *)data)[i] = (int8_t) scaled_rand; else ((uint8_t *)data)[i] = (uint8_t) scaled_rand; break; default: throw "load_random_data: no support for data size > 8 or < 1"; //no shenanigans here } } } } static std::vector get_arch_list(volk_gnsssdr_func_desc_t desc) { std::vector archlist; for(size_t i = 0; i < desc.n_impls; i++) { archlist.push_back(std::string(desc.impl_names[i])); } return archlist; } volk_gnsssdr_type_t volk_gnsssdr_type_from_string(std::string name) { volk_gnsssdr_type_t type; type.is_float = false; type.is_scalar = false; type.is_complex = false; type.is_signed = false; type.size = 0; type.str = name; if(name.size() < 2) { throw std::string("name too short to be a datatype"); } //is it a scalar? if(name[0] == 's') { type.is_scalar = true; name = name.substr(1, name.size()-1); } //get the data size size_t last_size_pos = name.find_last_of("0123456789"); if(last_size_pos == std::string::npos) { throw std::string("no size spec in type ").append(name); } //will throw if malformed int size = boost::lexical_cast(name.substr(0, last_size_pos+1)); assert(((size % 8) == 0) && (size <= 64) && (size != 0)); type.size = size/8; //in bytes for(size_t i=last_size_pos+1; i < name.size(); i++) { switch (name[i]) { case 'f': type.is_float = true; break; case 'i': type.is_signed = true; break; case 'c': type.is_complex = true; break; case 'u': type.is_signed = false; break; default: throw; } } return type; } static void get_signatures_from_name(std::vector &inputsig, std::vector &outputsig, std::string name) { boost::char_separator sep("_"); boost::tokenizer > tok(name, sep); std::vector toked; tok.assign(name); toked.assign(tok.begin(), tok.end()); assert(toked[0] == "volk"); toked.erase(toked.begin()); toked.erase(toked.begin()); //ok. we're assuming a string in the form //(sig)_(multiplier-opt)_..._(name)_(sig)_(multiplier-opt)_..._(alignment) enum { SIDE_INPUT, SIDE_NAME, SIDE_OUTPUT } side = SIDE_INPUT; std::string fn_name; volk_gnsssdr_type_t type; BOOST_FOREACH(std::string token, toked) { try { type = volk_gnsssdr_type_from_string(token); if(side == SIDE_NAME) side = SIDE_OUTPUT; //if this is the first one after the name... if(side == SIDE_INPUT) inputsig.push_back(type); else outputsig.push_back(type); } catch (...){ if(token[0] == 'x' && (token.size() > 1) && (token[1] > '0' || token[1] < '9')) { if(side == SIDE_INPUT) assert(inputsig.size() > 0); else assert(outputsig.size() > 0); int multiplier = boost::lexical_cast(token.substr(1, token.size()-1)); //will throw if invalid /////////// for(int i=1; i &buffs, unsigned int vlen, unsigned int iter, std::string arch) { while(iter--) func(buffs[0], vlen, arch.c_str()); } inline void run_cast_test2(volk_gnsssdr_fn_2arg func, std::vector &buffs, unsigned int vlen, unsigned int iter, std::string arch) { while(iter--) func(buffs[0], buffs[1], vlen, arch.c_str()); } inline void run_cast_test3(volk_gnsssdr_fn_3arg func, std::vector &buffs, unsigned int vlen, unsigned int iter, std::string arch) { while(iter--) func(buffs[0], buffs[1], buffs[2], vlen, arch.c_str()); } inline void run_cast_test4(volk_gnsssdr_fn_4arg func, std::vector &buffs, unsigned int vlen, unsigned int iter, std::string arch) { while(iter--) func(buffs[0], buffs[1], buffs[2], buffs[3], vlen, arch.c_str()); } inline void run_cast_test1_s32f(volk_gnsssdr_fn_1arg_s32f func, std::vector &buffs, float scalar, unsigned int vlen, unsigned int iter, std::string arch) { while(iter--) func(buffs[0], scalar, vlen, arch.c_str()); } inline void run_cast_test2_s32f(volk_gnsssdr_fn_2arg_s32f func, std::vector &buffs, float scalar, unsigned int vlen, unsigned int iter, std::string arch) { while(iter--) func(buffs[0], buffs[1], scalar, vlen, arch.c_str()); } inline void run_cast_test3_s32f(volk_gnsssdr_fn_3arg_s32f func, std::vector &buffs, float scalar, unsigned int vlen, unsigned int iter, std::string arch) { while(iter--) func(buffs[0], buffs[1], buffs[2], scalar, vlen, arch.c_str()); } inline void run_cast_test1_s32fc(volk_gnsssdr_fn_1arg_s32fc func, std::vector &buffs, lv_32fc_t scalar, unsigned int vlen, unsigned int iter, std::string arch) { while(iter--) func(buffs[0], scalar, vlen, arch.c_str()); } inline void run_cast_test2_s32fc(volk_gnsssdr_fn_2arg_s32fc func, std::vector &buffs, lv_32fc_t scalar, unsigned int vlen, unsigned int iter, std::string arch) { while(iter--) func(buffs[0], buffs[1], scalar, vlen, arch.c_str()); } inline void run_cast_test3_s32fc(volk_gnsssdr_fn_3arg_s32fc func, std::vector &buffs, lv_32fc_t scalar, unsigned int vlen, unsigned int iter, std::string arch) { while(iter--) func(buffs[0], buffs[1], buffs[2], scalar, vlen, arch.c_str()); } // *************** ADDED BY GNSS-SDR. START inline void run_cast_test1_s8i(volk_gnsssdr_fn_1arg_s8i func, std::vector &buffs, char scalar, unsigned int vlen, unsigned int iter, std::string arch) { while(iter--) func(buffs[0], scalar, vlen, arch.c_str()); } inline void run_cast_test2_s8i(volk_gnsssdr_fn_2arg_s8i func, std::vector &buffs, char scalar, unsigned int vlen, unsigned int iter, std::string arch) { while(iter--) func(buffs[0], buffs[1], scalar, vlen, arch.c_str()); } inline void run_cast_test3_s8i(volk_gnsssdr_fn_3arg_s8i func, std::vector &buffs, char scalar, unsigned int vlen, unsigned int iter, std::string arch) { while(iter--) func(buffs[0], buffs[1], buffs[2], scalar, vlen, arch.c_str()); } inline void run_cast_test1_s8ic(volk_gnsssdr_fn_1arg_s8ic func, std::vector &buffs, lv_8sc_t scalar, unsigned int vlen, unsigned int iter, std::string arch) { while(iter--) func(buffs[0], scalar, vlen, arch.c_str()); } inline void run_cast_test2_s8ic(volk_gnsssdr_fn_2arg_s8ic func, std::vector &buffs, lv_8sc_t scalar, unsigned int vlen, unsigned int iter, std::string arch) { while(iter--) func(buffs[0], buffs[1], scalar, vlen, arch.c_str()); } inline void run_cast_test3_s8ic(volk_gnsssdr_fn_3arg_s8ic func, std::vector &buffs, lv_8sc_t scalar, unsigned int vlen, unsigned int iter, std::string arch) { while(iter--) func(buffs[0], buffs[1], buffs[2], scalar, vlen, arch.c_str()); } inline void run_cast_test1_s16ic(volk_gnsssdr_fn_1arg_s16ic func, std::vector &buffs, lv_16sc_t scalar, unsigned int vlen, unsigned int iter, std::string arch) { while(iter--) func(buffs[0], scalar, vlen, arch.c_str()); } inline void run_cast_test2_s16ic(volk_gnsssdr_fn_2arg_s16ic func, std::vector &buffs, lv_16sc_t scalar, unsigned int vlen, unsigned int iter, std::string arch) { while(iter--) func(buffs[0], buffs[1], scalar, vlen, arch.c_str()); } inline void run_cast_test3_s16ic(volk_gnsssdr_fn_3arg_s16ic func, std::vector &buffs, lv_16sc_t scalar, unsigned int vlen, unsigned int iter, std::string arch) { while(iter--) func(buffs[0], buffs[1], buffs[2], scalar, vlen, arch.c_str()); } // *************** ADDED BY GNSS-SDR. END template bool fcompare(t *in1, t *in2, unsigned int vlen, float tol) { bool fail = false; int print_max_errs = 10; for(unsigned int i=0; i tol ) { fail=true; if(print_max_errs-- > 0) { std::cout << "offset " << i << " in1: " << t(((t *)(in1))[i]) << " in2: " << t(((t *)(in2))[i]); std::cout << " tolerance was: " << tol << std::endl; } } } // the primary test is the percent different greater than given tol else if(fabs(((t *)(in1))[i] - ((t *)(in2))[i])/fabs(((t *)in1)[i]) > tol) { fail=true; if(print_max_errs-- > 0) { std::cout << "offset " << i << " in1: " << t(((t *)(in1))[i]) << " in2: " << t(((t *)(in2))[i]); std::cout << " tolerance was: " << tol << std::endl; } } } return fail; } template bool ccompare(t *in1, t *in2, unsigned int vlen, float tol) { bool fail = false; int print_max_errs = 10; for(unsigned int i=0; i<2*vlen; i+=2) { t diff[2] = { in1[i] - in2[i], in1[i+1] - in2[i+1] }; t err = std::sqrt(diff[0] * diff[0] + diff[1] * diff[1]); t norm = std::sqrt(in1[i] * in1[i] + in1[i+1] * in1[i+1]); // for very small numbers we'll see round off errors due to limited // precision. So a special test case... if (norm < 1e-30) { if (err > tol) { fail=true; if(print_max_errs-- > 0) { std::cout << "offset " << i/2 << " in1: " << in1[i] << " + " << in1[i+1] << "j in2: " << in2[i] << " + " << in2[i+1] << "j"; std::cout << " tolerance was: " << tol << std::endl; } } } // the primary test is the percent different greater than given tol else if((err / norm) > tol) { fail=true; if(print_max_errs-- > 0) { std::cout << "offset " << i/2 << " in1: " << in1[i] << " + " << in1[i+1] << "j in2: " << in2[i] << " + " << in2[i+1] << "j"; std::cout << " tolerance was: " << tol << std::endl; } } } return fail; } template bool icompare(t *in1, t *in2, unsigned int vlen, unsigned int tol) { bool fail = false; int print_max_errs = 10; for(unsigned int i=0; i tol) { fail=true; if(print_max_errs-- > 0) { std::cout << "offset " << i << " in1: " << static_cast(t(((t *)(in1))[i])) << " in2: " << static_cast(t(((t *)(in2))[i])); std::cout << " tolerance was: " << tol << std::endl; } } } return fail; } class volk_gnsssdr_qa_aligned_mem_pool{ public: void *get_new(size_t size){ size_t alignment = volk_gnsssdr_get_alignment(); void* ptr = volk_gnsssdr_malloc(size, alignment); memset(ptr, 0x00, size); _mems.push_back(ptr); return ptr; } ~volk_gnsssdr_qa_aligned_mem_pool() { for(unsigned int ii = 0; ii < _mems.size(); ++ii) { volk_gnsssdr_free(_mems[ii]); } } private: std::vector _mems; }; bool run_volk_gnsssdr_tests(volk_gnsssdr_func_desc_t desc, void (*manual_func)(), std::string name, volk_gnsssdr_test_params_t test_params, std::vector *results, std::string puppet_master_name ) { return run_volk_gnsssdr_tests(desc, manual_func, name, test_params.tol(), test_params.scalar(), test_params.vlen(), test_params.iter(), results, puppet_master_name, test_params.benchmark_mode()); } bool run_volk_gnsssdr_tests(volk_gnsssdr_func_desc_t desc, void (*manual_func)(), std::string name, float tol, lv_32fc_t scalar, unsigned int vlen, unsigned int iter, std::vector *results, std::string puppet_master_name, bool benchmark_mode) { // Initialize this entry in results vector results->push_back(volk_gnsssdr_test_results_t()); results->back().name = name; results->back().vlen = vlen; results->back().iter = iter; std::cout << "RUN_VOLK_GNSSSDR_TESTS: " << name << "(" << vlen << "," << iter << ")" << std::endl; // vlen_twiddle will increase vlen for malloc and data generation // but kernels will still be called with the user provided vlen. // This is useful for causing errors in kernels that do bad reads const unsigned int vlen_twiddle = 5; vlen = vlen + vlen_twiddle; const float tol_f = tol; const unsigned int tol_i = static_cast(tol); //first let's get a list of available architectures for the test std::vector arch_list = get_arch_list(desc); if((!benchmark_mode) && (arch_list.size() < 2)) { std::cout << "no architectures to test" << std::endl; return false; } //something that can hang onto memory and cleanup when this function exits volk_gnsssdr_qa_aligned_mem_pool mem_pool; //now we have to get a function signature by parsing the name std::vector inputsig, outputsig; try { get_signatures_from_name(inputsig, outputsig, name); } catch (boost::bad_lexical_cast& error) { std::cerr << "Error: unable to get function signature from kernel name" << std::endl; std::cerr << " - " << name << std::endl; return false; } //pull the input scalars into their own vector std::vector inputsc; for(size_t i=0; i inbuffs; BOOST_FOREACH(volk_gnsssdr_type_t sig, inputsig) { if(!sig.is_scalar) //we don't make buffers for scalars inbuffs.push_back(mem_pool.get_new(vlen*sig.size*(sig.is_complex ? 2 : 1))); } for(size_t i=0; i > test_data; for(size_t i=0; i arch_buffs; for(size_t j=0; j both_sigs; both_sigs.insert(both_sigs.end(), outputsig.begin(), outputsig.end()); both_sigs.insert(both_sigs.end(), inputsig.begin(), inputsig.end()); //now run the test vlen = vlen - vlen_twiddle; clock_t start, end; std::vector profile_times; for(size_t i = 0; i < arch_list.size(); i++) { start = clock(); switch(both_sigs.size()) { case 1: if(inputsc.size() == 0) { run_cast_test1((volk_gnsssdr_fn_1arg)(manual_func), test_data[i], vlen, iter, arch_list[i]); } else if(inputsc.size() == 1 && inputsc[0].is_float) { if(inputsc[0].is_complex) { run_cast_test1_s32fc((volk_gnsssdr_fn_1arg_s32fc)(manual_func), test_data[i], scalar, vlen, iter, arch_list[i]); } else { run_cast_test1_s32f((volk_gnsssdr_fn_1arg_s32f)(manual_func), test_data[i], scalar.real(), vlen, iter, arch_list[i]); } } //ADDED BY GNSS-SDR. START else if(inputsc.size() == 1 && !inputsc[0].is_float) { if(inputsc[0].is_complex) { if(inputsc[0].size == 2) { run_cast_test1_s16ic((volk_gnsssdr_fn_1arg_s16ic)(manual_func), test_data[i], scalar, vlen, iter, arch_list[i]); } else { run_cast_test1_s8ic((volk_gnsssdr_fn_1arg_s8ic)(manual_func), test_data[i], scalar, vlen, iter, arch_list[i]); } } else { run_cast_test1_s8i((volk_gnsssdr_fn_1arg_s8i)(manual_func), test_data[i], scalar.real(), vlen, iter, arch_list[i]); } } //ADDED BY GNSS-SDR. END else throw "unsupported 1 arg function >1 scalars"; break; case 2: if(inputsc.size() == 0) { run_cast_test2((volk_gnsssdr_fn_2arg)(manual_func), test_data[i], vlen, iter, arch_list[i]); } else if(inputsc.size() == 1 && inputsc[0].is_float) { if(inputsc[0].is_complex) { run_cast_test2_s32fc((volk_gnsssdr_fn_2arg_s32fc)(manual_func), test_data[i], scalar, vlen, iter, arch_list[i]); } else { run_cast_test2_s32f((volk_gnsssdr_fn_2arg_s32f)(manual_func), test_data[i], scalar.real(), vlen, iter, arch_list[i]); } } //ADDED BY GNSS-SDR. START else if(inputsc.size() == 1 && !inputsc[0].is_float) { if(inputsc[0].is_complex) { if(inputsc[0].size == 2) { run_cast_test2_s16ic((volk_gnsssdr_fn_2arg_s16ic)(manual_func), test_data[i], scalar, vlen, iter, arch_list[i]); } else { run_cast_test2_s8ic((volk_gnsssdr_fn_2arg_s8ic)(manual_func), test_data[i], scalar, vlen, iter, arch_list[i]); } } else { run_cast_test2_s8i((volk_gnsssdr_fn_2arg_s8i)(manual_func), test_data[i], scalar.real(), vlen, iter, arch_list[i]); } } //ADDED BY GNSS-SDR. END else throw "unsupported 2 arg function >1 scalars"; break; case 3: if(inputsc.size() == 0) { run_cast_test3((volk_gnsssdr_fn_3arg)(manual_func), test_data[i], vlen, iter, arch_list[i]); } else if(inputsc.size() == 1 && inputsc[0].is_float) { if(inputsc[0].is_complex) { run_cast_test3_s32fc((volk_gnsssdr_fn_3arg_s32fc)(manual_func), test_data[i], scalar, vlen, iter, arch_list[i]); } else { run_cast_test3_s32f((volk_gnsssdr_fn_3arg_s32f)(manual_func), test_data[i], scalar.real(), vlen, iter, arch_list[i]); } } //ADDED BY GNSS-SDR. START else if(inputsc.size() == 1 && !inputsc[0].is_float) { if(inputsc[0].is_complex) { { if(inputsc[0].size == 4) { run_cast_test3_s16ic((volk_gnsssdr_fn_3arg_s16ic)(manual_func), test_data[i], scalar, vlen, iter, arch_list[i]); } else { run_cast_test3_s8ic((volk_gnsssdr_fn_3arg_s8ic)(manual_func), test_data[i], scalar, vlen, iter, arch_list[i]); } } } else { run_cast_test3_s8i((volk_gnsssdr_fn_3arg_s8i)(manual_func), test_data[i], scalar.real(), vlen, iter, arch_list[i]); } } //ADDED BY GNSS-SDR. END else throw "unsupported 3 arg function >1 scalars"; break; default: throw "no function handler for this signature"; break; } end = clock(); double arch_time = 1000.0 * (double)(end-start)/(double)CLOCKS_PER_SEC; std::cout << arch_list[i] << " completed in " << arch_time << "ms" << std::endl; volk_gnsssdr_test_time_t result; result.name = arch_list[i]; result.time = arch_time; result.units = "ms"; result.pass = true; results->back().results[result.name] = result; profile_times.push_back(arch_time); } //and now compare each output to the generic output //first we have to know which output is the generic one, they aren't in order... size_t generic_offset=0; for(size_t i=0; i arch_results; for(size_t i = 0; i < arch_list.size(); i++) { fail = false; if(i != generic_offset) { for(size_t j=0; jback().results[arch_list[i]]; result->pass = !fail; fail_global = true; std::cout << name << ": fail on arch " << arch_list[i] << std::endl; } } } arch_results.push_back(!fail); } double best_time_a = std::numeric_limits::max(); double best_time_u = std::numeric_limits::max(); std::string best_arch_a = "generic"; std::string best_arch_u = "generic"; for(size_t i=0; i < arch_list.size(); i++) { if((profile_times[i] < best_time_u) && arch_results[i] && desc.impl_alignment[i] == 0) { best_time_u = profile_times[i]; best_arch_u = arch_list[i]; } if((profile_times[i] < best_time_a) && arch_results[i]) { best_time_a = profile_times[i]; best_arch_a = arch_list[i]; } } std::cout << "Best aligned arch: " << best_arch_a << std::endl; std::cout << "Best unaligned arch: " << best_arch_u << std::endl; if(puppet_master_name == "NULL") { results->back().config_name = name; } else { results->back().config_name = puppet_master_name; } results->back().best_arch_a = best_arch_a; results->back().best_arch_u = best_arch_u; return fail_global; } gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/qa_utils.h000066400000000000000000000166561305042567700305410ustar00rootroot00000000000000/* Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) * * 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_VOLK_QA_UTILS_H #define GNSS_SDR_VOLK_QA_UTILS_H #include #include #include #include #include #include #include #include /************************************************ * VOLK QA type definitions * ************************************************/ struct volk_gnsssdr_type_t { bool is_float; bool is_scalar; bool is_signed; bool is_complex; int size; std::string str; }; class volk_gnsssdr_test_time_t { public: std::string name; double time; std::string units; bool pass; }; class volk_gnsssdr_test_results_t { public: std::string name; std::string config_name; unsigned int vlen; unsigned int iter; std::map results; std::string best_arch_a; std::string best_arch_u; }; class volk_gnsssdr_test_params_t { private: float _tol; lv_32fc_t _scalar; unsigned int _vlen; unsigned int _iter; bool _benchmark_mode; std::string _kernel_regex; public: // ctor volk_gnsssdr_test_params_t(float tol, lv_32fc_t scalar, unsigned int vlen, unsigned int iter, bool benchmark_mode, std::string kernel_regex) : _tol(tol), _scalar(scalar), _vlen(vlen), _iter(iter), _benchmark_mode(benchmark_mode), _kernel_regex(kernel_regex) {}; // getters float tol() {return _tol;}; lv_32fc_t scalar() {return _scalar;}; unsigned int vlen() {return _vlen;}; unsigned int iter() {return _iter;}; bool benchmark_mode() {return _benchmark_mode;}; std::string kernel_regex() {return _kernel_regex;}; }; class volk_gnsssdr_test_case_t { private: volk_gnsssdr_func_desc_t _desc; void(*_kernel_ptr)(); std::string _name; volk_gnsssdr_test_params_t _test_parameters; std::string _puppet_master_name; public: volk_gnsssdr_func_desc_t desc() {return _desc;}; void (*kernel_ptr()) () {return _kernel_ptr;}; std::string name() {return _name;}; std::string puppet_master_name() {return _puppet_master_name;}; volk_gnsssdr_test_params_t test_parameters() {return _test_parameters;}; // normal ctor volk_gnsssdr_test_case_t(volk_gnsssdr_func_desc_t desc, void(*kernel_ptr)(), std::string name, volk_gnsssdr_test_params_t test_parameters) : _desc(desc), _kernel_ptr(kernel_ptr), _name(name), _test_parameters(test_parameters), _puppet_master_name("NULL") {}; // ctor for puppets volk_gnsssdr_test_case_t(volk_gnsssdr_func_desc_t desc, void(*kernel_ptr)(), std::string name, std::string puppet_master_name, volk_gnsssdr_test_params_t test_parameters) : _desc(desc), _kernel_ptr(kernel_ptr), _name(name), _test_parameters(test_parameters), _puppet_master_name(puppet_master_name) {}; }; /************************************************ * VOLK QA functions * ************************************************/ volk_gnsssdr_type_t volk_gnsssdr_type_from_string(std::string); float uniform(void); void random_floats(float *buf, unsigned n); bool run_volk_gnsssdr_tests( volk_gnsssdr_func_desc_t, void(*)(), std::string, volk_gnsssdr_test_params_t, std::vector *results = NULL, std::string puppet_master_name = "NULL" ); bool run_volk_gnsssdr_tests( volk_gnsssdr_func_desc_t, void(*)(), std::string, float, lv_32fc_t, unsigned int, unsigned int, std::vector *results = NULL, std::string puppet_master_name = "NULL", bool benchmark_mode = false ); #define VOLK_RUN_TESTS(func, tol, scalar, len, iter) \ BOOST_AUTO_TEST_CASE(func##_test) { \ BOOST_CHECK_EQUAL(run_volk_gnsssdr_tests( \ func##_get_func_desc(), (void (*)())func##_manual, \ std::string(#func), tol, scalar, len, iter, 0, "NULL"), \ 0); \ } #define VOLK_PROFILE(func, test_params, results) run_volk_gnsssdr_tests(func##_get_func_desc(), (void (*)())func##_manual, std::string(#func), test_params, results, "NULL") #define VOLK_PUPPET_PROFILE(func, puppet_master_func, test_params, results) run_volk_gnsssdr_tests(func##_get_func_desc(), (void (*)())func##_manual, std::string(#func), test_params, results, std::string(#puppet_master_func)) typedef void (*volk_gnsssdr_fn_1arg)(void *, unsigned int, const char*); //one input, operate in place typedef void (*volk_gnsssdr_fn_2arg)(void *, void *, unsigned int, const char*); typedef void (*volk_gnsssdr_fn_3arg)(void *, void *, void *, unsigned int, const char*); typedef void (*volk_gnsssdr_fn_4arg)(void *, void *, void *, void *, unsigned int, const char*); typedef void (*volk_gnsssdr_fn_1arg_s32f)(void *, float, unsigned int, const char*); //one input vector, one scalar float input typedef void (*volk_gnsssdr_fn_2arg_s32f)(void *, void *, float, unsigned int, const char*); typedef void (*volk_gnsssdr_fn_3arg_s32f)(void *, void *, void *, float, unsigned int, const char*); typedef void (*volk_gnsssdr_fn_1arg_s32fc)(void *, lv_32fc_t, unsigned int, const char*); //one input vector, one scalar float input typedef void (*volk_gnsssdr_fn_2arg_s32fc)(void *, void *, lv_32fc_t, unsigned int, const char*); typedef void (*volk_gnsssdr_fn_3arg_s32fc)(void *, void *, void *, lv_32fc_t, unsigned int, const char*); //ADDED BY GNSS-SDR. START typedef void (*volk_gnsssdr_fn_1arg_s8i)(void *, char, unsigned int, const char*); //one input vector, one scalar char input typedef void (*volk_gnsssdr_fn_2arg_s8i)(void *, void *, char, unsigned int, const char*); typedef void (*volk_gnsssdr_fn_3arg_s8i)(void *, void *, void *, char, unsigned int, const char*); typedef void (*volk_gnsssdr_fn_1arg_s8ic)(void *, lv_8sc_t, unsigned int, const char*); //one input vector, one scalar lv_8sc_t vector input typedef void (*volk_gnsssdr_fn_2arg_s8ic)(void *, void *, lv_8sc_t, unsigned int, const char*); typedef void (*volk_gnsssdr_fn_3arg_s8ic)(void *, void *, void *, lv_8sc_t, unsigned int, const char*); typedef void (*volk_gnsssdr_fn_1arg_s16ic)(void *, lv_16sc_t, unsigned int, const char*); //one input vector, one scalar lv_16sc_t vector input typedef void (*volk_gnsssdr_fn_2arg_s16ic)(void *, void *, lv_16sc_t, unsigned int, const char*); typedef void (*volk_gnsssdr_fn_3arg_s16ic)(void *, void *, void *, lv_16sc_t, unsigned int, const char*); //ADDED BY GNSS-SDR. END #endif // GNSS_SDR_VOLK_QA_UTILS_H gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/testqa.cc000066400000000000000000000111061305042567700303400ustar00rootroot00000000000000/* * Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) * * 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 . */ #include "qa_utils.h" #include "kernel_tests.h" #include #include #include #include #include void print_qa_xml(std::vector results, unsigned int nfails); int main() { bool qa_ret_val = 0; float def_tol = 1e-6; lv_32fc_t def_scalar = 327.0; int def_iter = 1; int def_vlen = 131071; bool def_benchmark_mode = true; std::string def_kernel_regex = ""; volk_gnsssdr_test_params_t test_params(def_tol, def_scalar, def_vlen, def_iter, def_benchmark_mode, def_kernel_regex); std::vector test_cases = init_test_list(test_params); std::vector qa_failures; std::vector results; // Test every kernel reporting failures when they occur for(unsigned int ii = 0; ii < test_cases.size(); ++ii) { bool qa_result = false; volk_gnsssdr_test_case_t test_case = test_cases[ii]; try { qa_result = run_volk_gnsssdr_tests(test_case.desc(), test_case.kernel_ptr(), test_case.name(), test_case.test_parameters(), &results, test_case.puppet_master_name()); } catch(...) { // TODO: what exceptions might we need to catch and how do we handle them? std::cerr << "Exception found on kernel: " << test_case.name() << std::endl; qa_result = false; } if(qa_result) { std::cerr << "Failure on " << test_case.name() << std::endl; qa_failures.push_back(test_case.name()); } } // Generate XML results print_qa_xml(results, qa_failures.size()); // Summarize QA results std::cerr << "Kernel QA finished: " << qa_failures.size() << " failures out of " << test_cases.size() << " tests." << std::endl; if(qa_failures.size() > 0) { std::cerr << "The following kernels failed QA:" << std::endl; for(unsigned int ii = 0; ii < qa_failures.size(); ++ii) { std::cerr << " " << qa_failures[ii] << std::endl; } qa_ret_val = 1; } return qa_ret_val; } /* * This function prints qa results as XML output similar to output * from Junit. For reference output see http://llg.cubic.org/docs/junit/ */ void print_qa_xml(std::vector results, unsigned int nfails) { std::ofstream qa_file; qa_file.open(".unittest/kernels.xml"); qa_file << "" << std::endl; qa_file << "" << std::endl; // Results are in a vector by kernel. Each element has a result // map containing time and arch name with test result for(unsigned int ii=0; ii < results.size(); ++ii) { volk_gnsssdr_test_results_t result = results[ii]; qa_file << " " << std::endl; std::map::iterator kernel_time_pair; for(kernel_time_pair = result.results.begin(); kernel_time_pair != result.results.end(); ++kernel_time_pair) { volk_gnsssdr_test_time_t test_time = kernel_time_pair->second; qa_file << " " << std::endl; if(!test_time.pass) qa_file << " " << "" << std::endl; qa_file << " " << std::endl; } qa_file << " " << std::endl; } qa_file << "" << std::endl; qa_file.close(); } gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/volk_gnsssdr_malloc.c000066400000000000000000000067211305042567700327500ustar00rootroot00000000000000/* * Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) * * 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 . */ #include "volk_gnsssdr/volk_gnsssdr_malloc.h" #include #include #include /* * For #defines used to determine support for allocation functions, * see: http://linux.die.net/man/3/aligned_alloc */ // Otherwise, test if we are a POSIX or X/Open system // This only has a restriction that alignment be a power of 2and a // multiple of sizeof(void *). #if _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || HAVE_POSIX_MEMALIGN void *volk_gnsssdr_malloc(size_t size, size_t alignment) { void *ptr; // quoting posix_memalign() man page: // "alignment must be a power of two and a multiple of sizeof(void *)" // volk_get_alignment() could return 1 for some machines (e.g. generic_orc) if (alignment == 1) return malloc(size); int err = posix_memalign(&ptr, alignment, size); if(err == 0) { return ptr; } else { fprintf(stderr, "VOLK: Error allocating memory " "(posix_memalign: error %d: %s)\n", err, strerror(err)); return NULL; } } void volk_gnsssdr_free(void *ptr) { free(ptr); } // _aligned_malloc has no restriction on size, // available on Windows since Visual C++ 2005 #elif _MSC_VER >= 1400 void *volk_gnsssdr_malloc(size_t size, size_t alignment) { void *ptr = _aligned_malloc(size, alignment); if(ptr == NULL) { fprintf(stderr, "VOLK: Error allocating memory (_aligned_malloc)\n"); } return ptr; } void volk_gnsssdr_free(void *ptr) { _aligned_free(ptr); } // No standard handlers; we'll do it ourselves. #else // _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || HAVE_POSIX_MEMALIGN struct block_info { void *real; }; void * volk_gnsssdr_malloc(size_t size, size_t alignment) { void *real, *user; struct block_info *info; /* At least align to sizeof our struct */ if (alignment < sizeof(struct block_info)) alignment = sizeof(struct block_info); /* Alloc */ real = malloc(size + (2 * alignment - 1)); /* Get pointer to the various zones */ user = (void *)((((uintptr_t) real) + sizeof(struct block_info) + alignment - 1) & ~(alignment - 1)); info = (struct block_info *)(((uintptr_t)user) - sizeof(struct block_info)); /* Store the info for the free */ info->real = real; /* Return pointer to user */ return user; } void volk_gnsssdr_free(void *ptr) { struct block_info *info; /* Get the real pointer */ info = (struct block_info *)(((uintptr_t)ptr) - sizeof(struct block_info)); /* Release real pointer */ free(info->real); } #endif // _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || HAVE_POSIX_MEMALIGN //#endif // _ISOC11_SOURCE gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/volk_gnsssdr_prefs.c000066400000000000000000000047431305042567700326220ustar00rootroot00000000000000/* Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) * * 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 . */ #include #include #include #include void volk_gnsssdr_get_config_path(char *path) { if (!path) return; const char *suffix = "/.volk_gnsssdr/volk_gnsssdr_config"; const char *suffix2 = "/volk_gnsssdr/volk_gnsssdr_config"; //non-hidden char *home = NULL; //allows config redirection via env variable home = getenv("VOLK_CONFIGPATH"); if(home!=NULL){ strncpy(path,home,512); strcat(path,suffix2); return; } if (home == NULL) home = getenv("HOME"); if (home == NULL) home = getenv("APPDATA"); if (home == NULL) { path[0] = 0; return; } strncpy(path, home, 512); strcat(path, suffix); } size_t volk_gnsssdr_load_preferences(volk_gnsssdr_arch_pref_t **prefs_res) { FILE *config_file; char path[512], line[512]; size_t n_arch_prefs = 0; volk_gnsssdr_arch_pref_t *prefs = NULL; //get the config path volk_gnsssdr_get_config_path(path); if (!path[0]) return n_arch_prefs; //no prefs found config_file = fopen(path, "r"); if(!config_file) return n_arch_prefs; //no prefs found //reset the file pointer and write the prefs into volk_gnsssdr_arch_prefs while(fgets(line, sizeof(line), config_file) != NULL) { prefs = (volk_gnsssdr_arch_pref_t *) realloc(prefs, (n_arch_prefs+1) * sizeof(*prefs)); volk_gnsssdr_arch_pref_t *p = prefs + n_arch_prefs; if(sscanf(line, "%s %s %s", p->name, p->impl_a, p->impl_u) == 3 && !strncmp(p->name, "volk_gnsssdr_", 5)) { n_arch_prefs++; } } fclose(config_file); *prefs_res = prefs; return n_arch_prefs; } gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/volk_gnsssdr_rank_archs.c000066400000000000000000000101071305042567700336050ustar00rootroot00000000000000/* Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) * * 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 . */ #include #include #include #include #include #if __GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ >= 4 #define __popcnt __builtin_popcount #else inline unsigned __popcnt(unsigned num) { unsigned pop = 0; while(num) { if (num & 0x1) pop++; num >>= 1; } return pop; } #endif int volk_gnsssdr_get_index( const char *impl_names[], //list of implementations by name const size_t n_impls, //number of implementations available const char *impl_name //the implementation name to find ) { unsigned int i; for (i = 0; i < n_impls; i++) { if(!strncmp(impl_names[i], impl_name, 20)) { return i; } } //TODO return -1; //something terrible should happen here fprintf(stderr, "VOLK_GNSSSDR warning: no arch found, returning generic impl\n"); return volk_gnsssdr_get_index(impl_names, n_impls, "generic"); //but we'll fake it for now } int volk_gnsssdr_rank_archs( const char *kern_name, //name of the kernel to rank const char *impl_names[], //list of implementations by name const int* impl_deps, //requirement mask per implementation const bool* alignment, //alignment status of each implementation size_t n_impls, //number of implementations available const bool align //if false, filter aligned implementations ) { size_t i; static volk_gnsssdr_arch_pref_t *volk_gnsssdr_arch_prefs; static size_t n_arch_prefs = 0; static int prefs_loaded = 0; if(!prefs_loaded) { n_arch_prefs = volk_gnsssdr_load_preferences(&volk_gnsssdr_arch_prefs); prefs_loaded = 1; } // If we've defined VOLK_GENERIC to be anything, always return the // 'generic' kernel. Used in GR's QA code. char *gen_env = getenv("VOLK_GENERIC"); if(gen_env) { return volk_gnsssdr_get_index(impl_names, n_impls, "generic"); } //now look for the function name in the prefs list for(i = 0; i < n_arch_prefs; i++) { if(!strncmp(kern_name, volk_gnsssdr_arch_prefs[i].name, sizeof(volk_gnsssdr_arch_prefs[i].name))) //found it { const char *impl_name = align? volk_gnsssdr_arch_prefs[i].impl_a : volk_gnsssdr_arch_prefs[i].impl_u; return volk_gnsssdr_get_index(impl_names, n_impls, impl_name); } } //return the best index with the largest deps size_t best_index_a = 0; size_t best_index_u = 0; int best_value_a = -1; int best_value_u = -1; for(i = 0; i < n_impls; i++) { const signed val = __popcnt(impl_deps[i]); if (alignment[i] && val > best_value_a) { best_index_a = i; best_value_a = val; } if (!alignment[i] && val > best_value_u) { best_index_u = i; best_value_u = val; } } //when align and we found a best aligned, use it if (align && best_value_a != -1) return best_index_a; //otherwise return the best unaligned return best_index_u; } gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/volk_gnsssdr_rank_archs.h000066400000000000000000000031761305042567700336220ustar00rootroot00000000000000/* Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) * * 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_VOLK_GNSSSDR_RANK_ARCHS_H #define GNSS_SDR_VOLK_GNSSSDR_RANK_ARCHS_H #include #include #ifdef __cplusplus extern "C" { #endif int volk_gnsssdr_get_index( const char *impl_names[], //list of implementations by name const size_t n_impls, //number of implementations available const char *impl_name //the implementation name to find ); int volk_gnsssdr_rank_archs( const char *kern_name, //name of the kernel to rank const char *impl_names[], //list of implementations by name const int* impl_deps, //requirement mask per implementation const bool* alignment, //alignment status of each implementation size_t n_impls, //number of implementations available const bool align //if false, filter aligned implementations ); #ifdef __cplusplus } #endif #endif /* GNSS_SDR_VOLK_GNSSSDR_RANK_ARCHS_H */ gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/python/000077500000000000000000000000001305042567700273045ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/python/volk_gnsssdr_modtool/000077500000000000000000000000001305042567700335575ustar00rootroot00000000000000CMakeLists.txt000066400000000000000000000023301305042567700362360ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/python/volk_gnsssdr_modtool# Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) # # 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 . # ######################################################################## # Install python files and apps ######################################################################## include(VolkPython) VOLK_PYTHON_INSTALL( FILES __init__.py cfg.py volk_gnsssdr_modtool_generate.py DESTINATION ${VOLK_PYTHON_DIR}/volk_gnsssdr_modtool COMPONENT "volk_gnsssdr" ) VOLK_PYTHON_INSTALL( PROGRAMS volk_gnsssdr_modtool DESTINATION ${VOLK_RUNTIME_DIR} COMPONENT "volk_gnsssdr" )README000066400000000000000000000106661305042567700343710ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/python/volk_gnsssdr_modtoolThe volk_gnsssdr_modtool tool is installed along with VOLK as a way of helping to construct, add to, and interogate the VOLK library or companion libraries. volk_gnsssdr_modtool is installed into $prefix/bin. VOLK modtool enables creating standalone (out-of-tree) VOLK modules and provides a few tools for sharing VOLK kernels between VOLK modules. If you need to design or work with VOLK kernels away from the canonical VOLK library, this is the tool. If you need to tailor your own VOLK library for whatever reason, this is the tool. The canonical VOLK library installs a volk_gnsssdr.h and a libvolk_gnsssdr.so. Your own library will install volk_gnsssdr_$name.h and libvolk_gnsssdr_$name.so. Ya Gronk? Good. There isn't a substantial difference between the canonical VOLK module and any other VOLK module. They're all peers. Any module created via VOLK modtool will come complete with a default volk_gnsssdr_modtool.cfg file associating the module with the base from which it came, its distinctive $name and its destination (or path). These values (created from user input if VOLK modtool runs without a user-supplied config file or a default config file) serve as default values for some VOLK modtool actions. It's more or less intended for the user to change directories to the top level of a created VOLK module and then run volk_gnsssdr_modtool to take advantage of the values stored in the default volk_gnsssdr_modtool.cfg file. Apart from creating new VOLK modules, VOLK modtool allows you to list the names of kernels in other modules, list the names of kernels in the current module, add kernels from another module into the current module, and remove kernels from the current module. When moving kernels between modules, VOLK modtool does its best to keep the qa and profiling code for those kernels intact. If the base has a test or a profiling call for some kernel, those calls will follow the kernel when VOLK modtool adds that kernel. If QA or profiling requires a puppet kernel, the puppet kernel will follow the original kernel when VOLK modtool adds that original kernel. VOLK modtool respects puppets. ====================================================================== Installing a new VOLK Library: Run the command "volk_gnsssdr_modtool -i". This will ask you three questions: name: // the name to give your VOLK library: volk_gnsssdr_ destination: // directory new source tree is built under -- must exists. // It will create /volk_gnsssdr_ base: // the directory containing the original VOLK source code The name provided must be alphanumeric (and cannot start with a number). No special characters including dashes and underscores are allowed. This will build a new skeleton directory in the destination provided with the name volk_gnsssdr_. It will contain the necessary structure to build: mkdir build cd build cmake -DCMAKE_INSTALL_PREFIX=/opt/volk_gnsssdr ../ make sudo make install Right now, the library is empty and contains no kernels. Kernels can be added from another VOLK library using the '-a' option. If not specified, the kernel will be extracted from the base VOLK directory. Using the '-b' allows us to specify another VOLK library to use for this purpose. volk_gnsssdr_modtool -a -n 32fc_x2_conjugate_dot_prod_32fc This will put the code for the new kernel into /volk_gnsssdr_/kernels/volk_gnsssdr_/ Other kernels must be added by hand. See the following webpages for more information about creating VOLK kernels: http://gnuradio.org/doc/doxygen/volk_gnsssdr_guide.html http://gnuradio.org/redmine/projects/gnuradio/wiki/Volk ====================================================================== OPTIONS Options for Adding and Removing Kernels: -a, --add_kernel Add kernel from existing VOLK module. Uses the base VOLK module unless -b is used. Use -n to specify the kernel name. Requires: -n. Optional: -b -A, --add_all_kernels Add all kernels from existing VOLK module. Uses the base VOLK module unless -b is used. Optional: -b -x, --remove_kernel Remove kernel from module. Required: -n. Optional: -b Options for Listing Kernels: -l, --list Lists all kernels available in the base VOLK module. -k, --kernels Lists all kernels in this VOLK module. -r, --remote-list Lists all kernels in another VOLK module that is specified using the -b option. __init__.py000066400000000000000000000015421305042567700356130ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/python/volk_gnsssdr_modtool#!/usr/bin/env python # # Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) # # 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 . # # from cfg import volk_gnsssdr_modtool_config from volk_gnsssdr_modtool_generate import volk_gnsssdr_modtool cfg.py000066400000000000000000000070331305042567700346140ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/python/volk_gnsssdr_modtool#!/usr/bin/env python # # Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) # # 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 . # # from __future__ import print_function import ConfigParser import sys import os import exceptions import re class volk_gnsssdr_modtool_config: def key_val_sub(self, num, stuff, section): return re.sub('\$' + 'k' + str(num), stuff[num][0], (re.sub('\$' + str(num), stuff[num][1], section[1][num]))); def verify(self): for i in self.verification: self.verify_section(i) def remap(self): for i in self.remapification: self.verify_section(i) def verify_section(self, section): stuff = self.cfg.items(section[0]) for i in range(len(section[1])): eval(self.key_val_sub(i, stuff, section)) try: val = eval(self.key_val_sub(i, stuff, section)) if val == False: raise exceptions.ValueError except ValueError: raise exceptions.ValueError('Verification function returns False... key:%s, val:%s'%(stuff[i][0], stuff[i][1])) except: raise exceptions.IOError('bad configuration... key:%s, val:%s'%(stuff[i][0], stuff[i][1])) def __init__(self, cfg=None): self.config_name = 'config' self.config_defaults = ['name', 'destination', 'base'] self.config_defaults_remap = ['1', 'self.cfg.set(self.config_name, \'$k1\', os.path.realpath(os.path.expanduser(\'$1\')))', 'self.cfg.set(self.config_name, \'$k2\', os.path.realpath(os.path.expanduser(\'$2\')))'] self.config_defaults_verify = ['re.match(\'[a-zA-Z0-9]+$\', \'$0\')', 'os.path.exists(\'$1\')', 'os.path.exists(\'$2\')'] self.remapification = [(self.config_name, self.config_defaults_remap)] self.verification = [(self.config_name, self.config_defaults_verify)] default = os.path.join(os.getcwd(), 'volk_gnsssdr_modtool.cfg') icfg = ConfigParser.RawConfigParser() if cfg: icfg.read(cfg) elif os.path.exists(default): icfg.read(default) else: print("Initializing config file...") icfg.add_section(self.config_name) for kn in self.config_defaults: rv = raw_input("%s: "%(kn)) icfg.set(self.config_name, kn, rv) self.cfg = icfg self.remap() self.verify() def read_map(self, name, inp): if self.cfg.has_section(name): self.cfg.remove_section(name) self.cfg.add_section(name) for i in inp: self.cfg.set(name, i, inp[i]) def get_map(self, name): retval = {} stuff = self.cfg.items(name) for i in stuff: retval[i[0]] = i[1] return retval volk_gnsssdr_modtool000066400000000000000000000122661305042567700377050ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/python/volk_gnsssdr_modtool#!/usr/bin/env python # # Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) # # 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 . # from volk_gnsssdr_modtool import volk_gnsssdr_modtool, volk_gnsssdr_modtool_config from optparse import OptionParser, OptionGroup import exceptions import os import sys if __name__ == '__main__': parser = OptionParser(); actions = OptionGroup(parser, 'Actions'); actions.add_option('-i', '--install', action='store_true', help='Create a new volk_gnsssdr module.') parser.add_option('-b', '--base_path', action='store', default=None, help='Base path for action. By default, volk_gnsssdr_modtool.cfg loads this value.') parser.add_option('-n', '--kernel_name', action='store', default=None, help='Kernel name for action. No default') parser.add_option('-c', '--config', action='store', dest='config_file', default=None, help='Config file for volk_gnsssdr_modtool. By default, volk_gnsssdr_modtool.cfg in the local directory will be used/created.') actions.add_option('-a', '--add_kernel', action='store_true', help='Add kernel from existing volk_gnsssdr module. Requires: -n. Optional: -b') actions.add_option('-A', '--add_all_kernels', action='store_true', help='Add all kernels from existing volk_gnsssdr module. Optional: -b') actions.add_option('-x', '--remove_kernel', action='store_true', help='Remove kernel from module. Required: -n. Optional: -b') actions.add_option('-l', '--list', action='store_true', help='List all kernels in the base.') actions.add_option('-k', '--kernels', action='store_true', help='List all kernels in the module.') actions.add_option('-r', '--remote_list', action='store_true', help='List all available kernels in remote volk_gnsssdr module. Requires: -b.') actions.add_option('-m', '--moo', action='store_true', help='Have you mooed today?') parser.add_option_group(actions) (options, args) = parser.parse_args(); if len(sys.argv) < 2: parser.print_help() elif options.moo: print " (__) " print " (oo) " print " /------\/ " print " / | || " print " * /\---/\ " print " ~~ ~~ " else: my_cfg = volk_gnsssdr_modtool_config(options.config_file); my_modtool = volk_gnsssdr_modtool(my_cfg.get_map(my_cfg.config_name)); if options.install: my_modtool.make_module_skeleton(); my_modtool.write_default_cfg(my_cfg.cfg); if options.add_kernel: if not options.kernel_name: raise exceptions.IOError("This action requires the -n option."); else: name = options.kernel_name; if options.base_path: base = options.base_path; else: base = my_cfg.cfg.get(my_cfg.config_name, 'base'); my_modtool.import_kernel(name, base); if options.remove_kernel: if not options.kernel_name: raise exceptions.IOError("This action requires the -n option."); else: name = options.kernel_name; my_modtool.remove_kernel(name); if options.add_all_kernels: if options.base_path: base = options.base_path; else: base = my_cfg.cfg.get(my_cfg.config_name, 'base'); kernelset = my_modtool.get_current_kernels(base); for i in kernelset: my_modtool.import_kernel(i, base); if options.remote_list: if not options.base_path: raise exceptions.IOError("This action requires the -b option. Try -l or -k for listing kernels in the base or the module.") else: base = options.base_path; kernelset = my_modtool.get_current_kernels(base); for i in kernelset: print i; if options.list: kernelset = my_modtool.get_current_kernels(); for i in kernelset: print i; if options.kernels: dest = my_cfg.cfg.get(my_cfg.config_name, 'destination'); name = my_cfg.cfg.get(my_cfg.config_name, 'name'); base = os.path.join(dest, 'volk_gnsssdr_' + name); kernelset = my_modtool.get_current_kernels(base); for i in kernelset: print i; volk_gnsssdr_modtool_generate.py000066400000000000000000000347601305042567700422110ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/python/volk_gnsssdr_modtool# # Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) # # 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, 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. # from __future__ import print_function import os import glob import sys import re import glob import shutil import exceptions from sets import Set class volk_gnsssdr_modtool: def __init__(self, cfg): self.volk_gnsssdr = re.compile('volk_gnsssdr'); self.remove_after_underscore = re.compile("_.*"); self.volk_gnsssdr_run_tests = re.compile('^\s*VOLK_RUN_TESTS.*\n', re.MULTILINE); self.volk_gnsssdr_profile = re.compile('^\s*(VOLK_PROFILE|VOLK_PUPPET_PROFILE).*\n', re.MULTILINE); self.my_dict = cfg; self.lastline = re.compile('\s*char path\[1024\];.*'); self.badassert = re.compile('^\s*assert\(toked\[0\] == "volk_gnsssdr_.*\n', re.MULTILINE); self.goodassert = ' assert(toked[0] == "volk_gnsssdr");\n' self.baderase = re.compile('^\s*toked.erase\(toked.begin\(\)\);.*\n', re.MULTILINE); self.gooderase = ' toked.erase(toked.begin());\n toked.erase(toked.begin());\n'; def get_basename(self, base=None): if not base: base = self.my_dict['base'] candidate = base.split('/')[-1]; if len(candidate.split('_')) == 1: return ''; else: return candidate.split('_')[-1]; def get_current_kernels(self, base=None): if not base: base = self.my_dict['base'] name = self.get_basename(); else: name = self.get_basename(base); if name == '': hdr_files = glob.glob(os.path.join(base, "kernels/volk_gnsssdr/*.h")); begins = re.compile("(?<=volk_gnsssdr_).*") else: hdr_files = glob.glob(os.path.join(base, "kernels/volk_gnsssdr_" + name + "/*.h")); begins = re.compile("(?<=volk_gnsssdr_" + name + "_).*") datatypes = []; functions = []; for line in hdr_files: subline = re.search(".*\.h.*", os.path.basename(line)) if subline: subsubline = begins.search(subline.group(0)); if subsubline: dtype = self.remove_after_underscore.sub("", subsubline.group(0)); subdtype = re.search("[0-9]+[A-z]+", dtype); if subdtype: datatypes.append(subdtype.group(0)); datatypes = set(datatypes); for line in hdr_files: for dt in datatypes: if dt in line: #subline = re.search("(?<=volk_gnsssdr_)" + dt + ".*(?=\.h)", line); subline = re.search(begins.pattern[:-2] + dt + ".*(?=\.h)", line); if subline: functions.append(subline.group(0)); return set(functions); def make_module_skeleton(self): dest = os.path.join(self.my_dict['destination'], 'volk_gnsssdr_' + self.my_dict['name']) if os.path.exists(dest): raise exceptions.IOError("Destination %s already exits!"%(dest)); if not os.path.exists(os.path.join(self.my_dict['destination'], 'volk_gnsssdr_' + self.my_dict['name'], 'kernels/volk_gnsssdr_' + self.my_dict['name'])): os.makedirs(os.path.join(self.my_dict['destination'], 'volk_gnsssdr_' + self.my_dict['name'], 'kernels/volk_gnsssdr_' + self.my_dict['name'])) current_kernel_names = self.get_current_kernels(); for root, dirnames, filenames in os.walk(self.my_dict['base']): for name in filenames: t_table = map(lambda a: re.search(a, name), current_kernel_names); t_table = set(t_table); if t_table == set([None]): infile = os.path.join(root, name); instring = open(infile, 'r').read(); outstring = re.sub(self.volk_gnsssdr, 'volk_gnsssdr_' + self.my_dict['name'], instring); newname = re.sub(self.volk_gnsssdr, 'volk_gnsssdr_' + self.my_dict['name'], name); relpath = os.path.relpath(infile, self.my_dict['base']); newrelpath = re.sub(self.volk_gnsssdr, 'volk_gnsssdr_' + self.my_dict['name'], relpath); dest = os.path.join(self.my_dict['destination'], 'volk_gnsssdr_' + self.my_dict['name'], os.path.dirname(newrelpath), newname); if not os.path.exists(os.path.dirname(dest)): os.makedirs(os.path.dirname(dest)) open(dest, 'w+').write(outstring); infile = os.path.join(self.my_dict['destination'], 'volk_gnsssdr_' + self.my_dict['name'], 'lib/testqa.cc'); instring = open(infile, 'r').read(); outstring = re.sub(self.volk_gnsssdr_run_tests, '', instring); open(infile, 'w+').write(outstring); infile = os.path.join(self.my_dict['destination'], 'volk_gnsssdr_' + self.my_dict['name'], 'apps/volk_gnsssdr_' + self.my_dict['name'] + '_profile.cc'); instring = open(infile, 'r').read(); outstring = re.sub(self.volk_gnsssdr_profile, '', instring); open(infile, 'w+').write(outstring); infile = os.path.join(self.my_dict['destination'], 'volk_gnsssdr_' + self.my_dict['name'], 'lib/qa_utils.cc'); instring = open(infile, 'r').read(); outstring = re.sub(self.badassert, self.goodassert, instring); outstring = re.sub(self.baderase, self.gooderase, outstring); open(infile, 'w+').write(outstring); def write_default_cfg(self, cfg): outfile = open(os.path.join(self.my_dict['destination'], 'volk_gnsssdr_' + self.my_dict['name'], 'volk_gnsssdr_modtool.cfg'), 'wb'); cfg.write(outfile); outfile.close(); def convert_kernel(self, oldvolk_gnsssdr, name, base, inpath, top): infile = os.path.join(inpath, 'kernels/' + top[:-1] + '/' + top + name + '.h'); instring = open(infile, 'r').read(); outstring = re.sub(oldvolk_gnsssdr, 'volk_gnsssdr_' + self.my_dict['name'], instring); newname = 'volk_gnsssdr_' + self.my_dict['name'] + '_' + name + '.h'; relpath = os.path.relpath(infile, base); newrelpath = re.sub(oldvolk_gnsssdr, 'volk_gnsssdr_' + self.my_dict['name'], relpath); dest = os.path.join(self.my_dict['destination'], 'volk_gnsssdr_' + self.my_dict['name'], os.path.dirname(newrelpath), newname); if not os.path.exists(os.path.dirname(dest)): os.makedirs(os.path.dirname(dest)) open(dest, 'w+').write(outstring); # copy orc proto-kernels if they exist for orcfile in glob.glob(inpath + '/orc/' + top + name + '*.orc'): if os.path.isfile(orcfile): instring = open(orcfile, 'r').read(); outstring = re.sub(oldvolk_gnsssdr, 'volk_gnsssdr_' + self.my_dict['name'], instring); newname = 'volk_gnsssdr_' + self.my_dict['name'] + '_' + name + '.orc'; relpath = os.path.relpath(orcfile, base); newrelpath = re.sub(oldvolk_gnsssdr, 'volk_gnsssdr_' + self.my_dict['name'], relpath); dest = os.path.join(self.my_dict['destination'], 'volk_gnsssdr_' + self.my_dict['name'], os.path.dirname(newrelpath), newname); if not os.path.exists(os.path.dirname(dest)): os.makedirs(os.path.dirname(dest)); open(dest, 'w+').write(outstring) def remove_kernel(self, name): basename = self.my_dict['name']; if len(basename) > 0: top = 'volk_gnsssdr_' + basename + '_'; else: top = 'volk_gnsssdr_' base = os.path.join(self.my_dict['destination'], top[:-1]) ; if not name in self.get_current_kernels(): raise exceptions.IOError("Requested kernel %s is not in module %s"%(name,base)); inpath = os.path.abspath(base); kernel = re.compile(name) search_kernels = Set([kernel]) profile = re.compile('^\s*VOLK_PROFILE') puppet = re.compile('^\s*VOLK_PUPPET') src_dest = os.path.join(inpath, 'apps/', top[:-1] + '_profile.cc'); infile = open(src_dest); otherlines = infile.readlines(); open(src_dest, 'w+').write(''); for otherline in otherlines: write_okay = True; if kernel.search(otherline): write_okay = False; if puppet.match(otherline): args = re.search("(?<=VOLK_PUPPET_PROFILE).*", otherline) m_func = args.group(0).split(',')[0]; func = re.search('(?<=' + top + ').*', m_func); search_kernels.add(re.compile(func.group(0))); if write_okay: open(src_dest, 'a').write(otherline); src_dest = os.path.join(inpath, 'lib/testqa.cc') infile = open(src_dest); otherlines = infile.readlines(); open(src_dest, 'w+').write(''); for otherline in otherlines: write_okay = True; for kernel in search_kernels: if kernel.search(otherline): write_okay = False; if write_okay: open(src_dest, 'a').write(otherline); for kernel in search_kernels: infile = os.path.join(inpath, 'kernels/' + top[:-1] + '/' + top + kernel.pattern + '.h'); print("Removing kernel %s" % kernel.pattern) if os.path.exists(infile): os.remove(infile); # remove the orc proto-kernels if they exist. There are no puppets here # so just need to glob for files matching kernel name print(glob.glob(inpath + '/kernel/volk/asm/orc/' + top + name + '*.orc')) for orcfile in glob.glob(inpath + '/orc/' + top + name + '*.orc'): print(orcfile) if(os.path.exists(orcfile)): os.remove(orcfile); def import_kernel(self, name, base): if not (base): base = self.my_dict['base']; basename = self.getbasename(); else: basename = self.get_basename(base); if not name in self.get_current_kernels(base): raise exceptions.IOError("Requested kernel %s is not in module %s"%(name,base)); inpath = os.path.abspath(base); if len(basename) > 0: top = 'volk_gnsssdr_' + basename + '_'; else: top = 'volk_gnsssdr_' oldvolk_gnsssdr = re.compile(top[:-1]); self.convert_kernel(oldvolk_gnsssdr, name, base, inpath, top); kernel = re.compile(name) search_kernels = Set([kernel]) profile = re.compile('^\s*VOLK_PROFILE') puppet = re.compile('^\s*VOLK_PUPPET') infile = open(os.path.join(inpath, 'apps/', oldvolk_gnsssdr.pattern + '_profile.cc')); otherinfile = open(os.path.join(self.my_dict['destination'], 'volk_gnsssdr_' + self.my_dict['name'], 'apps/volk_gnsssdr_' + self.my_dict['name'] + '_profile.cc')); dest = os.path.join(self.my_dict['destination'], 'volk_gnsssdr_' + self.my_dict['name'], 'apps/volk_gnsssdr_' + self.my_dict['name'] + '_profile.cc'); lines = infile.readlines(); otherlines = otherinfile.readlines(); open(dest, 'w+').write(''); insert = False; inserted = False for otherline in otherlines: if self.lastline.match(otherline): insert = True; if insert and not inserted: inserted = True; for line in lines: if kernel.search(line): if profile.match(line): outline = re.sub(oldvolk_gnsssdr, 'volk_gnsssdr_' + self.my_dict['name'], line); open(dest, 'a').write(outline); elif puppet.match(line): outline = re.sub(oldvolk_gnsssdr, 'volk_gnsssdr_' + self.my_dict['name'], line); open(dest, 'a').write(outline); args = re.search("(?<=VOLK_PUPPET_PROFILE).*", line) m_func = args.group(0).split(',')[0]; func = re.search('(?<=' + top + ').*', m_func); search_kernels.add(re.compile(func.group(0))); self.convert_kernel(oldvolk_gnsssdr, func.group(0), base, inpath, top); write_okay = True; for kernel in search_kernels: if kernel.search(otherline): write_okay = False if write_okay: open(dest, 'a').write(otherline); for kernel in search_kernels: print("Adding kernel %s from module %s" % (kernel.pattern, base)) infile = open(os.path.join(inpath, 'lib/testqa.cc')); otherinfile = open(os.path.join(self.my_dict['destination'], 'volk_gnsssdr_' + self.my_dict['name'], 'lib/testqa.cc')); dest = os.path.join(self.my_dict['destination'], 'volk_gnsssdr_' + self.my_dict['name'], 'lib/testqa.cc'); lines = infile.readlines(); otherlines = otherinfile.readlines(); open(dest, 'w+').write(''); inserted = False; insert = False for otherline in otherlines: if (re.match('\s*', otherline) == None or re.match('\s*#.*', otherline) == None): insert = True; if insert and not inserted: inserted = True; for line in lines: for kernel in search_kernels: if kernel.search(line): if self.volk_gnsssdr_run_tests.match(line): outline = re.sub(oldvolk_gnsssdr, 'volk_gnsssdr_' + self.my_dict['name'], line); open(dest, 'a').write(outline); write_okay = True; for kernel in search_kernels: if kernel.search(otherline): write_okay = False if write_okay: open(dest, 'a').write(otherline); gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/tmpl/000077500000000000000000000000001305042567700267375ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/tmpl/volk_gnsssdr.tmpl.c000066400000000000000000000142111305042567700325730ustar00rootroot00000000000000/* Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) * * 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 . */ #include #include "volk_gnsssdr_machines.h" #include #include #include "volk_gnsssdr_rank_archs.h" #include #include #include #include static size_t __alignment = 0; static intptr_t __alignment_mask = 0; struct volk_gnsssdr_machine *get_machine(void) { extern struct volk_gnsssdr_machine *volk_gnsssdr_machines[]; extern unsigned int n_volk_gnsssdr_machines; static struct volk_gnsssdr_machine *machine = NULL; if(machine != NULL) return machine; else { unsigned int max_score = 0; unsigned int i; struct volk_gnsssdr_machine *max_machine = NULL; for(i=0; icaps & (~volk_gnsssdr_get_lvarch()))) { if(volk_gnsssdr_machines[i]->caps > max_score) { max_score = volk_gnsssdr_machines[i]->caps; max_machine = volk_gnsssdr_machines[i]; } } } machine = max_machine; //printf("Using Volk machine: %s\n", machine->name); __alignment = machine->alignment; __alignment_mask = (intptr_t)(__alignment-1); return machine; } } void volk_gnsssdr_list_machines(void) { extern struct volk_gnsssdr_machine *volk_gnsssdr_machines[]; extern unsigned int n_volk_gnsssdr_machines; unsigned int i; for(i=0; icaps & (~volk_gnsssdr_get_lvarch()))) { printf("%s;", volk_gnsssdr_machines[i]->name); } } printf("\n"); } const char* volk_gnsssdr_get_machine(void) { extern struct volk_gnsssdr_machine *volk_gnsssdr_machines[]; extern unsigned int n_volk_gnsssdr_machines; static struct volk_gnsssdr_machine *machine = NULL; if(machine != NULL) return machine->name; else { unsigned int max_score = 0; unsigned int i; struct volk_gnsssdr_machine *max_machine = NULL; for(i=0; icaps & (~volk_gnsssdr_get_lvarch()))) { if(volk_gnsssdr_machines[i]->caps > max_score) { max_score = volk_gnsssdr_machines[i]->caps; max_machine = volk_gnsssdr_machines[i]; } } } machine = max_machine; return machine->name; } } size_t volk_gnsssdr_get_alignment(void) { get_machine(); //ensures alignment is set return __alignment; } bool volk_gnsssdr_is_aligned(const void *ptr) { return ((intptr_t)(ptr) & __alignment_mask) == 0; } #define LV_HAVE_GENERIC #define LV_HAVE_DISPATCHER %for kern in kernels: %if kern.has_dispatcher: #include //pulls in the dispatcher %endif static inline void __${kern.name}_d(${kern.arglist_full}) { %if kern.has_dispatcher: ${kern.name}_dispatcher(${kern.arglist_names}); return; %endif if (volk_gnsssdr_is_aligned(<% num_open_parens = 0 %> %for arg_type, arg_name in kern.args: %if '*' in arg_type: VOLK_OR_PTR(${arg_name},<% num_open_parens += 1 %> %endif %endfor 0<% end_open_parens = ')'*num_open_parens %>${end_open_parens} )){ ${kern.name}_a(${kern.arglist_names}); } else{ ${kern.name}_u(${kern.arglist_names}); } } static inline void __init_${kern.name}(void) { const char *name = get_machine()->${kern.name}_name; const char **impl_names = get_machine()->${kern.name}_impl_names; const int *impl_deps = get_machine()->${kern.name}_impl_deps; const bool *alignment = get_machine()->${kern.name}_impl_alignment; const size_t n_impls = get_machine()->${kern.name}_n_impls; const size_t index_a = volk_gnsssdr_rank_archs(name, impl_names, impl_deps, alignment, n_impls, true/*aligned*/); const size_t index_u = volk_gnsssdr_rank_archs(name, impl_names, impl_deps, alignment, n_impls, false/*unaligned*/); ${kern.name}_a = get_machine()->${kern.name}_impls[index_a]; ${kern.name}_u = get_machine()->${kern.name}_impls[index_u]; assert(${kern.name}_a); assert(${kern.name}_u); ${kern.name} = &__${kern.name}_d; } static inline void __${kern.name}_a(${kern.arglist_full}) { __init_${kern.name}(); ${kern.name}_a(${kern.arglist_names}); } static inline void __${kern.name}_u(${kern.arglist_full}) { __init_${kern.name}(); ${kern.name}_u(${kern.arglist_names}); } static inline void __${kern.name}(${kern.arglist_full}) { __init_${kern.name}(); ${kern.name}(${kern.arglist_names}); } ${kern.pname} ${kern.name}_a = &__${kern.name}_a; ${kern.pname} ${kern.name}_u = &__${kern.name}_u; ${kern.pname} ${kern.name} = &__${kern.name}; void ${kern.name}_manual(${kern.arglist_full}, const char* impl_name) { const int index = volk_gnsssdr_get_index( get_machine()->${kern.name}_impl_names, get_machine()->${kern.name}_n_impls, impl_name ); get_machine()->${kern.name}_impls[index]( ${kern.arglist_names} ); } volk_gnsssdr_func_desc_t ${kern.name}_get_func_desc(void) { const char **impl_names = get_machine()->${kern.name}_impl_names; const int *impl_deps = get_machine()->${kern.name}_impl_deps; const bool *alignment = get_machine()->${kern.name}_impl_alignment; const size_t n_impls = get_machine()->${kern.name}_n_impls; volk_gnsssdr_func_desc_t desc = { impl_names, impl_deps, alignment, n_impls }; return desc; } %endfor gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/tmpl/volk_gnsssdr.tmpl.h000066400000000000000000000055741305042567700326140ustar00rootroot00000000000000/* Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) * * 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 INCLUDED_VOLK_GNSSSDR_RUNTIME #define INCLUDED_VOLK_GNSSSDR_RUNTIME #include #include #include #include #include #include #include __VOLK_DECL_BEGIN typedef struct volk_gnsssdr_func_desc { const char **impl_names; const int *impl_deps; const bool *impl_alignment; const size_t n_impls; } volk_gnsssdr_func_desc_t; //! Prints a list of machines available VOLK_API void volk_gnsssdr_list_machines(void); //! Returns the name of the machine this instance will use VOLK_API const char* volk_gnsssdr_get_machine(void); //! Get the machine alignment in bytes VOLK_API size_t volk_gnsssdr_get_alignment(void); /*! * The VOLK_OR_PTR macro is a convenience macro * for checking the alignment of a set of pointers. * Example usage: * volk_gnsssdr_is_aligned(VOLK_OR_PTR((VOLK_OR_PTR(p0, p1), p2))) */ #define VOLK_OR_PTR(ptr0, ptr1) \ (const void *)(((intptr_t)(ptr0)) | ((intptr_t)(ptr1))) /*! * Is the pointer on a machine alignment boundary? * * Note: for performance reasons, this function * is not usable until another volk_gnsssdr API call is made * which will perform certain initialization tasks. * * \param ptr the pointer to some memory buffer * \return 1 for alignment boundary, else 0 */ VOLK_API bool volk_gnsssdr_is_aligned(const void *ptr); %for kern in kernels: //! A function pointer to the dispatcher implementation extern VOLK_API ${kern.pname} ${kern.name}; //! A function pointer to the fastest aligned implementation extern VOLK_API ${kern.pname} ${kern.name}_a; //! A function pointer to the fastest unaligned implementation extern VOLK_API ${kern.pname} ${kern.name}_u; //! Call into a specific implementation given by name extern VOLK_API void ${kern.name}_manual(${kern.arglist_full}, const char* impl_name); //! Get description paramaters for this kernel extern VOLK_API volk_gnsssdr_func_desc_t ${kern.name}_get_func_desc(void); %endfor __VOLK_DECL_END #endif /*INCLUDED_VOLK_GNSSSDR_RUNTIME*/ volk_gnsssdr_config_fixed.tmpl.h000066400000000000000000000017631305042567700352350ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/tmpl/* Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) * * 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 INCLUDED_VOLK_GNSSSDR_CONFIG_FIXED_H #define INCLUDED_VOLK_GNSSSDR_CONFIG_FIXED_H %for i, arch in enumerate(archs): //#ifndef LV_${arch.name.upper()} #define LV_${arch.name.upper()} ${i} //#endif %endfor #endif /*INCLUDED_VOLK_GNSSSDR_CONFIG_FIXED*/ gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/tmpl/volk_gnsssdr_cpu.tmpl.c000066400000000000000000000130441305042567700334450ustar00rootroot00000000000000/* Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) * * 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 . */ #include #include #include #include struct VOLK_CPU volk_gnsssdr_cpu; #if defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64) #define VOLK_CPU_x86 #endif #if defined(VOLK_CPU_x86) //implement get cpuid for gcc compilers using a system or local copy of cpuid.h #if defined(__GNUC__) #include #define cpuid_x86(op, r) __get_cpuid(op, (unsigned int *)r+0, (unsigned int *)r+1, (unsigned int *)r+2, (unsigned int *)r+3) #define cpuid_x86_count(op, count, regs) __cpuid_count(op, count, *((unsigned int*)regs), *((unsigned int*)regs+1), *((unsigned int*)regs+2), *((unsigned int*)regs+3)) /* Return Intel AVX extended CPU capabilities register. * This function will bomb on non-AVX-capable machines, so * check for AVX capability before executing. */ #if ((__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ >= 2) || (__clang_major__ >= 3)) && defined(HAVE_XGETBV) static inline unsigned long long _xgetbv(unsigned int index){ unsigned int eax, edx; __asm__ __volatile__("xgetbv" : "=a"(eax), "=d"(edx) : "c"(index)); return ((unsigned long long)edx << 32) | eax; } #define __xgetbv() _xgetbv(0) #else #define __xgetbv() 0 #endif //implement get cpuid for MSVC compilers using __cpuid intrinsic #elif defined(_MSC_VER) && defined(HAVE_INTRIN_H) #include #define cpuid_x86(op, r) __cpuid(((int*)r), op) #if defined(_XCR_XFEATURE_ENABLED_MASK) #define __xgetbv() _xgetbv(_XCR_XFEATURE_ENABLED_MASK) #else #define __xgetbv() 0 #endif #else #error "A get cpuid for volk_gnsssdr is not available on this compiler..." #endif //defined(__GNUC__) #endif //defined(VOLK_CPU_x86) static inline unsigned int cpuid_count_x86_bit(unsigned int level, unsigned int count, unsigned int reg, unsigned int bit) { #if defined(VOLK_CPU_x86) unsigned int regs[4] = {0}; cpuid_x86_count(level, count, regs); return regs[reg] >> bit & 0x01; #else return 0; #endif } static inline unsigned int cpuid_x86_bit(unsigned int reg, unsigned int op, unsigned int bit) { #if defined(VOLK_CPU_x86) unsigned int regs[4]; memset(regs, 0, sizeof(unsigned int)*4); cpuid_x86(op, regs); return regs[reg] >> bit & 0x01; #else return 0; #endif } static inline unsigned int check_extended_cpuid(unsigned int val) { #if defined(VOLK_CPU_x86) unsigned int regs[4]; memset(regs, 0, sizeof(unsigned int)*4); cpuid_x86(0x80000000, regs); return regs[0] >= val; #else return 0; #endif } static inline unsigned int get_avx_enabled(void) { #if defined(VOLK_CPU_x86) return __xgetbv() & 0x6; #else return 0; #endif } static inline unsigned int get_avx2_enabled(void) { #if defined(VOLK_CPU_x86) return __xgetbv() & 0x6; #else return 0; #endif } //neon detection is linux specific #if defined(__arm__) && defined(__linux__) #include #include #include #define VOLK_CPU_ARM #endif static int has_neon(void){ #if defined(VOLK_CPU_ARM) FILE *auxvec_f; unsigned long auxvec[2]; unsigned int found_neon = 0; auxvec_f = fopen("/proc/self/auxv", "rb"); if(!auxvec_f) return 0; size_t r = 1; //so auxv is basically 32b of ID and 32b of value //so it goes like this while(!found_neon && r) { r = fread(auxvec, sizeof(unsigned long), 2, auxvec_f); if((auxvec[0] == AT_HWCAP) && (auxvec[1] & HWCAP_NEON)) found_neon = 1; } fclose(auxvec_f); return found_neon; #else return 0; #endif } %for arch in archs: static int i_can_has_${arch.name} (void) { %for check, params in arch.checks: if (${check}(<% joined_params = ', '.join(params)%>${joined_params}) == 0) return 0; %endfor return 1; } %endfor #if defined(HAVE_FENV_H) #if defined(FE_TONEAREST) #include static inline void set_float_rounding(void){ fesetround(FE_TONEAREST); } #else static inline void set_float_rounding(void){ //do nothing } #endif #elif defined(_MSC_VER) #include static inline void set_float_rounding(void){ unsigned int cwrd; _controlfp_s(&cwrd, 0, 0); _controlfp_s(&cwrd, _RC_NEAR, _MCW_RC); } #else static inline void set_float_rounding(void){ //do nothing } #endif void volk_gnsssdr_cpu_init() { %for arch in archs: volk_gnsssdr_cpu.has_${arch.name} = &i_can_has_${arch.name}; %endfor set_float_rounding(); } unsigned int volk_gnsssdr_get_lvarch() { unsigned int retval = 0; volk_gnsssdr_cpu_init(); %for arch in archs: retval += volk_gnsssdr_cpu.has_${arch.name}() << LV_${arch.name.upper()}; %endfor return retval; } gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/tmpl/volk_gnsssdr_cpu.tmpl.h000066400000000000000000000021771305042567700334570ustar00rootroot00000000000000/* Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) * * 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 INCLUDED_VOLK_GNSSSDR_CPU_H #define INCLUDED_VOLK_GNSSSDR_CPU_H #include __VOLK_DECL_BEGIN struct VOLK_CPU { %for arch in archs: int (*has_${arch.name}) (); %endfor }; extern struct VOLK_CPU volk_gnsssdr_cpu; void volk_gnsssdr_cpu_init (); unsigned int volk_gnsssdr_get_lvarch (); __VOLK_DECL_END #endif /*INCLUDED_VOLK_GNSSSDR_CPU_H*/ volk_gnsssdr_machine_xxx.tmpl.c000066400000000000000000000045631305042567700351200ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/tmpl/* Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) * * 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 . */ <% this_machine = machine_dict[args[0]] %> <% arch_names = this_machine.arch_names %> %for arch in this_machine.archs: #define LV_HAVE_${arch.name.upper()} 1 %endfor #include #include "volk_gnsssdr_machines.h" #include #ifdef HAVE_CONFIG_H #include "config.h" #endif %for kern in kernels: #include %endfor struct volk_gnsssdr_machine volk_gnsssdr_machine_${this_machine.name} = { <% make_arch_have_list = (' | '.join(['(1 << LV_%s)'%a.name.upper() for a in this_machine.archs])) %> ${make_arch_have_list}, <% this_machine_name = "\""+this_machine.name+"\"" %> ${this_machine_name}, ${this_machine.alignment}, ##//list all kernels %for kern in kernels: <% impls = kern.get_impls(arch_names) %> ##//kernel name <% kern_name = "\""+kern.name+"\"" %> ${kern_name}, ##//list of kernel implementations by name <% make_impl_name_list = "{"+', '.join(['"%s"'%i.name for i in impls])+"}" %> ${make_impl_name_list}, ##//list of arch dependencies per implementation <% make_impl_deps_list = "{"+', '.join([' | '.join(['(1 << LV_%s)'%d.upper() for d in i.deps]) for i in impls])+"}" %> ${make_impl_deps_list}, ##//alignment required? for each implementation <% make_impl_align_list = "{"+', '.join(['true' if i.is_aligned else 'false' for i in impls])+"}" %> ${make_impl_align_list}, ##//pointer to each implementation <% make_impl_fcn_list = "{"+', '.join(['%s_%s'%(kern.name, i.name) for i in impls])+"}" %> ${make_impl_fcn_list}, ##//number of implementations listed here <% len_impls = len(impls) %> ${len_impls}, %endfor }; volk_gnsssdr_machines.tmpl.c000066400000000000000000000022151305042567700343640ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/tmpl/* Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) * * 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 . */ #include #include #include "volk_gnsssdr_machines.h" struct volk_gnsssdr_machine *volk_gnsssdr_machines[] = { %for machine in machines: #ifdef LV_MACHINE_${machine.name.upper()} &volk_gnsssdr_machine_${machine.name}, #endif %endfor }; unsigned int n_volk_gnsssdr_machines = sizeof(volk_gnsssdr_machines)/sizeof(*volk_gnsssdr_machines); volk_gnsssdr_machines.tmpl.h000066400000000000000000000034741305042567700344010ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/tmpl/* * Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) * * 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 INCLUDED_LIBVOLK_GNSSSDR_MACHINES_H #define INCLUDED_LIBVOLK_GNSSSDR_MACHINES_H #include #include #include #include __VOLK_DECL_BEGIN struct volk_gnsssdr_machine { const unsigned int caps; //capabilities (i.e., archs compiled into this machine, in the volk_gnsssdr_get_lvarch format) const char *name; const size_t alignment; //the maximum byte alignment required for functions in this library %for kern in kernels: const char *${kern.name}_name; const char *${kern.name}_impl_names[<%len_archs=len(archs)%>${len_archs}]; const int ${kern.name}_impl_deps[${len_archs}]; const bool ${kern.name}_impl_alignment[${len_archs}]; const ${kern.pname} ${kern.name}_impls[${len_archs}]; const size_t ${kern.name}_n_impls; %endfor }; %for machine in machines: #ifdef LV_MACHINE_${machine.name.upper()} extern struct volk_gnsssdr_machine volk_gnsssdr_machine_${machine.name}; #endif %endfor __VOLK_DECL_END #endif //INCLUDED_LIBVOLK_GNSSSDR_MACHINES_H volk_gnsssdr_typedefs.tmpl.h000066400000000000000000000020031305042567700344200ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/tmpl/* Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) * * 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 INCLUDED_VOLK_GNSSSDR_TYPEDEFS #define INCLUDED_VOLK_GNSSSDR_TYPEDEFS #include #include %for kern in kernels: typedef void (*${kern.pname})(${kern.arglist_types}); %endfor #endif /*INCLUDED_VOLK_GNSSSDR_TYPEDEFS*/ gnss-sdr-0.0.9/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/volk_gnsssdr.pc.in000066400000000000000000000004731305042567700314360ustar00rootroot00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ LV_CXXFLAGS=@LV_CXXFLAGS@ Name: volk_gnsssdr Description: VOLK_GNSSSDR: Vector Optimized Library of Kernels specific for GNSS-SDR Requires: Version: @LIBVER@ Libs: -L${libdir} -lvolk_gnsssdr Cflags: -I${includedir} ${LV_CXXFLAGS} gnss-sdr-0.0.9/src/algorithms/observables/000077500000000000000000000000001305042567700205405ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/observables/CMakeLists.txt000066400000000000000000000014321305042567700233000ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # add_subdirectory(adapters) add_subdirectory(gnuradio_blocks)gnss-sdr-0.0.9/src/algorithms/observables/adapters/000077500000000000000000000000001305042567700223435ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/observables/adapters/CMakeLists.txt000066400000000000000000000030411305042567700251010ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # set(OBS_ADAPTER_SOURCES gps_l1_ca_observables.cc gps_l2c_observables.cc galileo_e1_observables.cc galileo_e5a_observables.cc hybrid_observables.cc ) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/interfaces ${CMAKE_SOURCE_DIR}/src/core/receiver ${CMAKE_SOURCE_DIR}/src/algorithms/observables/gnuradio_blocks ${CMAKE_SOURCE_DIR}/src/algorithms/PVT/libs ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ) file(GLOB OBS_ADAPTER_HEADERS "*.h") list(SORT OBS_ADAPTER_HEADERS) add_library(obs_adapters ${OBS_ADAPTER_SOURCES} ${OBS_ADAPTER_HEADERS}) source_group(Headers FILES ${OBS_ADAPTER_HEADERS}) target_link_libraries(obs_adapters obs_gr_blocks ${GNURADIO_RUNTIME_LIBRARIES}) gnss-sdr-0.0.9/src/algorithms/observables/adapters/galileo_e1_observables.cc000066400000000000000000000053531305042567700272500ustar00rootroot00000000000000/*! * \file galileo_e1_observables.cc * \brief Implementation of an adapter of a Galileo E1 observables block * to a ObservablesInterface * \author Javier Arribas, 2011. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_e1_observables.h" #include #include "configuration_interface.h" #include "Galileo_E1.h" using google::LogMessage; GalileoE1Observables::GalileoE1Observables(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { std::string default_dump_filename = "./observables.dat"; DLOG(INFO) << "role " << role; dump_ = configuration->property(role + ".dump", false); dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename); unsigned int history_deep = configuration->property(role + ".averaging_depth", GALILEO_E1_HISTORY_DEEP); observables_ = galileo_e1_make_observables_cc(in_streams_, dump_, dump_filename_, history_deep); DLOG(INFO) << "pseudorange(" << observables_->unique_id() << ")"; } GalileoE1Observables::~GalileoE1Observables() {} void GalileoE1Observables::connect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to connect internally DLOG(INFO) << "nothing to connect internally"; } void GalileoE1Observables::disconnect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to disconnect } gr::basic_block_sptr GalileoE1Observables::get_left_block() { return observables_; } gr::basic_block_sptr GalileoE1Observables::get_right_block() { return observables_; } gnss-sdr-0.0.9/src/algorithms/observables/adapters/galileo_e1_observables.h000066400000000000000000000050341305042567700271060ustar00rootroot00000000000000/*! * \file galileo_e1_observables.h * \brief Implementation of an adapter of a Galileo E1 observables block * to a ObservablesInterface * \author Mara Branzanti 2013. mara.branzanti(at)gmail.com * \author Javier Arribas 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_E1_OBSERVABLES_H_ #define GNSS_SDR_GALILEO_E1_OBSERVABLES_H_ #include #include "observables_interface.h" #include "galileo_e1_observables_cc.h" class ConfigurationInterface; /*! * \brief This class implements an ObservablesInterface for Galileo E1B */ class GalileoE1Observables : public ObservablesInterface { public: GalileoE1Observables(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GalileoE1Observables(); std::string role() { return role_; } //! Returns "Galileo_E1B_Observables" std::string implementation() { return "Galileo_E1B_Observables"; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); void reset() { return; } //! All blocks must have an item_size() function implementation size_t item_size() { return sizeof(gr_complex); } private: galileo_e1_observables_cc_sptr observables_; bool dump_; std::string dump_filename_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; }; #endif gnss-sdr-0.0.9/src/algorithms/observables/adapters/galileo_e5a_observables.cc000066400000000000000000000055601305042567700274150ustar00rootroot00000000000000/*! * \file galileo_e5a_observables.cc * \brief Implementation of an adapter of a Galileo E5a observables block * to a ObservablesInterface * \author Carles Fernandez 2016. carles.fernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2016 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_e5a_observables.h" #include "configuration_interface.h" #include #include "Galileo_E5a.h" using google::LogMessage; GalileoE5aObservables::GalileoE5aObservables(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { std::string default_dump_filename = "./observables.dat"; DLOG(INFO) << "role " << role; dump_ = configuration->property(role + ".dump", false); dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename); unsigned int default_depth = GALILEO_E5A_HISTORY_DEEP; unsigned int history_deep = configuration->property(role + ".averaging_depth", default_depth); observables_ = hybrid_make_observables_cc(in_streams_, dump_, dump_filename_, history_deep); DLOG(INFO) << "pseudorange(" << observables_->unique_id() << ")"; } GalileoE5aObservables::~GalileoE5aObservables() {} void GalileoE5aObservables::connect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to connect internally DLOG(INFO) << "nothing to connect internally"; } void GalileoE5aObservables::disconnect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to disconnect } gr::basic_block_sptr GalileoE5aObservables::get_left_block() { return observables_; } gr::basic_block_sptr GalileoE5aObservables::get_right_block() { return observables_; } gnss-sdr-0.0.9/src/algorithms/observables/adapters/galileo_e5a_observables.h000066400000000000000000000047511305042567700272600ustar00rootroot00000000000000/*! * \file galileo_e5a_observables.h * \brief Implementation of an adapter of a Galileo E5a observables block * to a ObservablesInterface * \author Carles Fernandez 2016. carles.fernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2016 (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_GALILEO_E5A_OBSERVABLES_H_ #define GNSS_SDR_GALILEO_E5A_OBSERVABLES_H_ #include #include "observables_interface.h" #include "hybrid_observables_cc.h" class ConfigurationInterface; /*! * \brief This class implements an ObservablesInterface for Galileo E5A */ class GalileoE5aObservables : public ObservablesInterface { public: GalileoE5aObservables(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GalileoE5aObservables(); std::string role() { return role_; } //! Returns "Galileo_E5A_Observables" std::string implementation() { return "Galileo_E5A_Observables"; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); void reset() { return; } //! All blocks must have an item_size() function implementation size_t item_size() { return sizeof(gr_complex); } private: hybrid_observables_cc_sptr observables_; bool dump_; std::string dump_filename_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; }; #endif gnss-sdr-0.0.9/src/algorithms/observables/adapters/gps_l1_ca_observables.cc000066400000000000000000000053261305042567700270770ustar00rootroot00000000000000/*! * \file gps_l1_ca_observables.cc * \brief Implementation of an adapter of a GPS L1 C/A observables block * to a ObservablesInterface * \author Javier Arribas, 2011. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l1_ca_observables.h" #include "configuration_interface.h" #include #include "GPS_L1_CA.h" using google::LogMessage; GpsL1CaObservables::GpsL1CaObservables(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { std::string default_dump_filename = "./observables.dat"; DLOG(INFO) << "role " << role; dump_ = configuration->property(role + ".dump", false); dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename); unsigned int history_deep = configuration->property(role + ".averaging_depth", GPS_L1_CA_HISTORY_DEEP); observables_ = gps_l1_ca_make_observables_cc(in_streams_, dump_, dump_filename_, history_deep); DLOG(INFO) << "pseudorange(" << observables_->unique_id() << ")"; } GpsL1CaObservables::~GpsL1CaObservables() {} void GpsL1CaObservables::connect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to connect internally DLOG(INFO) << "nothing to connect internally"; } void GpsL1CaObservables::disconnect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to disconnect } gr::basic_block_sptr GpsL1CaObservables::get_left_block() { return observables_; } gr::basic_block_sptr GpsL1CaObservables::get_right_block() { return observables_; } gnss-sdr-0.0.9/src/algorithms/observables/adapters/gps_l1_ca_observables.h000066400000000000000000000050101305042567700267270ustar00rootroot00000000000000/*! * \file gps_l1_ca_observables.h * \brief Interface of an adapter of a GPS L1 C/A observables block * to a ObservablesInterface * \author Javier Arribas, 2011. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L1_CA_OBSERVABLES_H_ #define GNSS_SDR_GPS_L1_CA_OBSERVABLES_H_ #include #include "observables_interface.h" #include "gps_l1_ca_observables_cc.h" class ConfigurationInterface; /*! * \brief This class implements an ObservablesInterface for GPS L1 C/A */ class GpsL1CaObservables : public ObservablesInterface { public: GpsL1CaObservables(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GpsL1CaObservables(); std::string role() { return role_; } //! Returns "GPS_L1_CA_Observables" std::string implementation() { return "GPS_L1_CA_Observables"; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); void reset() { return; } //! All blocks must have an item_size() function implementation size_t item_size() { return sizeof(gr_complex); } private: gps_l1_ca_observables_cc_sptr observables_; bool dump_; //unsigned int fs_in_; std::string dump_filename_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; }; #endif gnss-sdr-0.0.9/src/algorithms/observables/adapters/gps_l2c_observables.cc000066400000000000000000000054141305042567700265760ustar00rootroot00000000000000/*! * \file gps_l2c_observables.cc * \brief Implementation of an adapter of a GPS L2 C(M) observables block * to a ObservablesInterface * \author Carles Fernandez 2016. carles.fernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2016 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l2c_observables.h" #include "configuration_interface.h" #include #include "GPS_L2C.h" using google::LogMessage; GpsL2CObservables::GpsL2CObservables(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { std::string default_dump_filename = "./observables.dat"; DLOG(INFO) << "role " << role; dump_ = configuration->property(role + ".dump", false); dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename); unsigned int default_depth = GPS_L2C_HISTORY_DEEP; unsigned int history_deep = configuration->property(role + ".averaging_depth", default_depth); observables_ = hybrid_make_observables_cc(in_streams_, dump_, dump_filename_, history_deep); DLOG(INFO) << "pseudorange(" << observables_->unique_id() << ")"; } GpsL2CObservables::~GpsL2CObservables() {} void GpsL2CObservables::connect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to connect internally DLOG(INFO) << "nothing to connect internally"; } void GpsL2CObservables::disconnect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to disconnect } gr::basic_block_sptr GpsL2CObservables::get_left_block() { return observables_; } gr::basic_block_sptr GpsL2CObservables::get_right_block() { return observables_; } gnss-sdr-0.0.9/src/algorithms/observables/adapters/gps_l2c_observables.h000066400000000000000000000047041305042567700264410ustar00rootroot00000000000000/*! * \file gps_l2c_observables.h * \brief Implementation of an adapter of a GPS L2C(M) observables block * to a ObservablesInterface * \author Carles Fernandez 2016. carles.fernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2016 (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_L2C_OBSERVABLES_H_ #define GNSS_SDR_GPS_L2C_OBSERVABLES_H_ #include #include "observables_interface.h" #include "hybrid_observables_cc.h" class ConfigurationInterface; /*! * \brief This class implements an ObservablesInterface for GPS L2C */ class GpsL2CObservables : public ObservablesInterface { public: GpsL2CObservables(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GpsL2CObservables(); std::string role() { return role_; } //! Returns "GPS_L2C_Observables" std::string implementation() { return "GPS_L2C_Observables"; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); void reset() { return; } //! All blocks must have an item_size() function implementation size_t item_size() { return sizeof(gr_complex); } private: hybrid_observables_cc_sptr observables_; bool dump_; std::string dump_filename_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; }; #endif gnss-sdr-0.0.9/src/algorithms/observables/adapters/hybrid_observables.cc000066400000000000000000000057211305042567700265270ustar00rootroot00000000000000/*! * \file hybrid_observables.cc * \brief Implementation of an adapter of a Galileo E1 observables block * to a ObservablesInterface * \author Javier Arribas, 2011. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "hybrid_observables.h" #include "configuration_interface.h" #include #include "GPS_L1_CA.h" #include "Galileo_E1.h" using google::LogMessage; HybridObservables::HybridObservables(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { std::string default_dump_filename = "./observables.dat"; DLOG(INFO) << "role " << role; dump_ = configuration->property(role + ".dump", false); dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename); unsigned int default_depth = 0; if (GPS_L1_CA_HISTORY_DEEP == GALILEO_E1_HISTORY_DEEP) { default_depth = GPS_L1_CA_HISTORY_DEEP; } else { default_depth = 100; } unsigned int history_deep = configuration->property(role + ".averaging_depth", default_depth); observables_ = hybrid_make_observables_cc(in_streams_, dump_, dump_filename_, history_deep); DLOG(INFO) << "pseudorange(" << observables_->unique_id() << ")"; } HybridObservables::~HybridObservables() {} void HybridObservables::connect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to connect internally DLOG(INFO) << "nothing to connect internally"; } void HybridObservables::disconnect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to disconnect } gr::basic_block_sptr HybridObservables::get_left_block() { return observables_; } gr::basic_block_sptr HybridObservables::get_right_block() { return observables_; } gnss-sdr-0.0.9/src/algorithms/observables/adapters/hybrid_observables.h000066400000000000000000000050451305042567700263700ustar00rootroot00000000000000/*! * \file hybrid_observables.h * \brief Implementation of an adapter of an observables block accepting all kind * of signals to a ObservablesInterface * \author Mara Branzanti 2013. mara.branzanti(at)gmail.com * \author Javier Arribas 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_HYBRID_OBSERVABLES_H_ #define GNSS_SDR_HYBRID_OBSERVABLES_H_ #include #include "observables_interface.h" #include "hybrid_observables_cc.h" class ConfigurationInterface; /*! * \brief This class implements an ObservablesInterface for observables of all kind of GNSS signals */ class HybridObservables : public ObservablesInterface { public: HybridObservables(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~HybridObservables(); std::string role() { return role_; } //! Returns "Hybrid_Observables" std::string implementation() { return "Hybrid_Observables"; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); void reset() { return; } //! All blocks must have an item_size() function implementation size_t item_size() { return sizeof(gr_complex); } private: hybrid_observables_cc_sptr observables_; bool dump_; std::string dump_filename_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; }; #endif gnss-sdr-0.0.9/src/algorithms/observables/gnuradio_blocks/000077500000000000000000000000001305042567700237055ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/observables/gnuradio_blocks/CMakeLists.txt000066400000000000000000000031501305042567700264440ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # set(OBS_GR_BLOCKS_SOURCES gps_l1_ca_observables_cc.cc galileo_e1_observables_cc.cc hybrid_observables_cc.cc ) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/interfaces ${CMAKE_SOURCE_DIR}/src/core/receiver ${CMAKE_SOURCE_DIR}/src/algorithms/libs ${CMAKE_SOURCE_DIR}/src/algorithms/PVT/libs ${GNURADIO_RUNTIME_INCLUDE_DIRS} ${ARMADILLO_INCLUDE_DIRS} ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ) 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}) target_link_libraries(obs_gr_blocks ${GNURADIO_RUNTIME_LIBRARIES} ${ARMADILLO_LIBRARIES}) gnss-sdr-0.0.9/src/algorithms/observables/gnuradio_blocks/galileo_e1_observables_cc.cc000066400000000000000000000323661305042567700312630ustar00rootroot00000000000000/*! * \file galileo_e1_observables_cc.cc * \brief Implementation of the pseudorange computation block for Galileo E1 * \author Mara Branzanti 2013. mara.branzanti(at)gmail.com * \author Javier Arribas 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_e1_observables_cc.h" #include #include #include #include #include #include #include #include #include #include "gnss_synchro.h" #include "Galileo_E1.h" #include "galileo_navigation_message.h" using google::LogMessage; galileo_e1_observables_cc_sptr galileo_e1_make_observables_cc(unsigned int nchannels, bool dump, std::string dump_filename, unsigned int deep_history) { return galileo_e1_observables_cc_sptr(new galileo_e1_observables_cc(nchannels, dump, dump_filename, deep_history)); } galileo_e1_observables_cc::galileo_e1_observables_cc(unsigned int nchannels, bool dump, std::string dump_filename, unsigned int deep_history) : gr::block("galileo_e1_observables_cc", gr::io_signature::make(nchannels, nchannels, sizeof(Gnss_Synchro)), gr::io_signature::make(nchannels, nchannels, sizeof(Gnss_Synchro))) { // initialize internal vars d_dump = dump; d_nchannels = nchannels; d_dump_filename = dump_filename; history_deep = deep_history; for (unsigned int i = 0; i < d_nchannels; i++) { d_acc_carrier_phase_queue_rads.push_back(std::deque(d_nchannels)); d_carrier_doppler_queue_hz.push_back(std::deque(d_nchannels)); d_symbol_TOW_queue_s.push_back(std::deque(d_nchannels)); } // ############# ENABLE DATA FILE LOG ################# if (d_dump == true) { if (d_dump_file.is_open() == false) { try { d_dump_file.exceptions (std::ifstream::failbit | std::ifstream::badbit ); d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); LOG(INFO) << "Observables dump enabled Log file: " << d_dump_filename.c_str(); } catch (const std::ifstream::failure & e) { LOG(WARNING) << "Exception opening observables dump file " << e.what(); } } } } galileo_e1_observables_cc::~galileo_e1_observables_cc() { d_dump_file.close(); } bool Galileo_pairCompare_gnss_synchro_Prn_delay_ms(const std::pair& a, const std::pair& b) { return (a.second.Prn_timestamp_ms) < (b.second.Prn_timestamp_ms); } bool Galileo_pairCompare_gnss_synchro_d_TOW_at_current_symbol(const std::pair& a, const std::pair& b) { return (a.second.d_TOW_at_current_symbol) < (b.second.d_TOW_at_current_symbol); } int galileo_e1_observables_cc::general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { Gnss_Synchro **in = (Gnss_Synchro **) &input_items[0]; // Get the input pointer Gnss_Synchro **out = (Gnss_Synchro **) &output_items[0]; // Get the output pointer Gnss_Synchro current_gnss_synchro[d_nchannels]; std::map current_gnss_synchro_map; std::map::iterator gnss_synchro_iter; if (d_nchannels != ninput_items.size()) { LOG(WARNING) << "The Observables block is not well connected"; } /* * 1. Read the GNSS SYNCHRO objects from available channels */ for (unsigned int i = 0; i < d_nchannels; i++) { //Copy the telemetry decoder data to local copy current_gnss_synchro[i] = in[i][0]; /* * 1.2 Assume no valid pseudoranges */ current_gnss_synchro[i].Flag_valid_pseudorange = false; current_gnss_synchro[i].Pseudorange_m = 0.0; if (current_gnss_synchro[i].Flag_valid_word) //if this channel have valid word { //record the word structure in a map for pseudorange computation current_gnss_synchro_map.insert(std::pair(current_gnss_synchro[i].Channel_ID, current_gnss_synchro[i])); //################### SAVE DOPPLER AND ACC CARRIER PHASE HISTORIC DATA FOR INTERPOLATION IN OBSERVABLE MODULE ####### d_carrier_doppler_queue_hz[i].push_back(current_gnss_synchro[i].Carrier_Doppler_hz); d_acc_carrier_phase_queue_rads[i].push_back(current_gnss_synchro[i].Carrier_phase_rads); // save TOW history d_symbol_TOW_queue_s[i].push_back(current_gnss_synchro[i].d_TOW_at_current_symbol); if (d_carrier_doppler_queue_hz[i].size() > history_deep) { d_carrier_doppler_queue_hz[i].pop_front(); } if (d_acc_carrier_phase_queue_rads[i].size() > history_deep) { d_acc_carrier_phase_queue_rads[i].pop_front(); } if (d_symbol_TOW_queue_s[i].size() > history_deep) { d_symbol_TOW_queue_s[i].pop_front(); } } else { // Clear the observables history for this channel if (d_symbol_TOW_queue_s[i].size() > 0) { d_symbol_TOW_queue_s[i].clear(); d_carrier_doppler_queue_hz[i].clear(); d_acc_carrier_phase_queue_rads[i].clear(); } } } /* * 2. Compute RAW pseudoranges using COMMON RECEPTION TIME algorithm. Use only the valid channels (channels that are tracking a satellite) */ if(current_gnss_synchro_map.size() > 0) { /* * 2.1 Use CURRENT set of measurements and find the nearest satellite * common RX time algorithm */ // what is the most recent symbol TOW in the current set? -> this will be the reference symbol gnss_synchro_iter = max_element(current_gnss_synchro_map.begin(), current_gnss_synchro_map.end(), Galileo_pairCompare_gnss_synchro_d_TOW_at_current_symbol); double d_TOW_reference = gnss_synchro_iter->second.d_TOW_at_current_symbol; double d_ref_PRN_rx_time_ms = gnss_synchro_iter->second.Prn_timestamp_ms; //int reference_channel= gnss_synchro_iter->second.Channel_ID; // Now compute RX time differences due to the PRN alignment in the correlators double traveltime_ms; double pseudorange_m; double delta_rx_time_ms; arma::vec symbol_TOW_vec_s; arma::vec dopper_vec_hz; arma::vec dopper_vec_interp_hz; arma::vec acc_phase_vec_rads; arma::vec acc_phase_vec_interp_rads; arma::vec desired_symbol_TOW(1); for(gnss_synchro_iter = current_gnss_synchro_map.begin(); gnss_synchro_iter != current_gnss_synchro_map.end(); gnss_synchro_iter++) { // compute the required symbol history shift in order to match the reference symbol delta_rx_time_ms = gnss_synchro_iter->second.Prn_timestamp_ms - d_ref_PRN_rx_time_ms; //compute the pseudorange traveltime_ms = (d_TOW_reference-gnss_synchro_iter->second.d_TOW_at_current_symbol) * 1000.0 + delta_rx_time_ms + GALILEO_STARTOFFSET_ms; pseudorange_m = traveltime_ms * GALILEO_C_m_ms; // [m] // update the pseudorange object current_gnss_synchro[gnss_synchro_iter->second.Channel_ID] = gnss_synchro_iter->second; current_gnss_synchro[gnss_synchro_iter->second.Channel_ID].Pseudorange_m = pseudorange_m; current_gnss_synchro[gnss_synchro_iter->second.Channel_ID].Flag_valid_pseudorange = true; current_gnss_synchro[gnss_synchro_iter->second.Channel_ID].d_TOW_at_current_symbol = round(d_TOW_reference * 1000.0) / 1000.0 + GALILEO_STARTOFFSET_ms / 1000.0; if (d_symbol_TOW_queue_s[gnss_synchro_iter->second.Channel_ID].size() >= history_deep) { // compute interpolated observation values for Doppler and Accumulate carrier phase symbol_TOW_vec_s = arma::vec(std::vector(d_symbol_TOW_queue_s[gnss_synchro_iter->second.Channel_ID].begin(), d_symbol_TOW_queue_s[gnss_synchro_iter->second.Channel_ID].end())); acc_phase_vec_rads = arma::vec(std::vector(d_acc_carrier_phase_queue_rads[gnss_synchro_iter->second.Channel_ID].begin(), d_acc_carrier_phase_queue_rads[gnss_synchro_iter->second.Channel_ID].end())); dopper_vec_hz = arma::vec(std::vector(d_carrier_doppler_queue_hz[gnss_synchro_iter->second.Channel_ID].begin(), d_carrier_doppler_queue_hz[gnss_synchro_iter->second.Channel_ID].end())); desired_symbol_TOW[0] = symbol_TOW_vec_s[history_deep - 1] + delta_rx_time_ms / 1000.0; // Curve fitting to cuadratic function arma::mat A = arma::ones(history_deep, 2); A.col(1) = symbol_TOW_vec_s; //A.col(2)=symbol_TOW_vec_s % symbol_TOW_vec_s; arma::mat coef_acc_phase(1,3); arma::mat pinv_A = arma::pinv(A.t() * A) * A.t(); coef_acc_phase = pinv_A * acc_phase_vec_rads; arma::mat coef_doppler(1,3); coef_doppler = pinv_A * dopper_vec_hz; arma::vec acc_phase_lin; arma::vec carrier_doppler_lin; acc_phase_lin = coef_acc_phase[0] + coef_acc_phase[1] * desired_symbol_TOW[0];//+coef_acc_phase[2]*desired_symbol_TOW[0]*desired_symbol_TOW[0]; carrier_doppler_lin = coef_doppler[0] + coef_doppler[1] * desired_symbol_TOW[0];//+coef_doppler[2]*desired_symbol_TOW[0]*desired_symbol_TOW[0]; current_gnss_synchro[gnss_synchro_iter->second.Channel_ID].Carrier_phase_rads = acc_phase_lin[0]; current_gnss_synchro[gnss_synchro_iter->second.Channel_ID].Carrier_Doppler_hz = carrier_doppler_lin[0]; } } } if(d_dump == true) { // MULTIPLEXED FILE RECORDING - Record results to file try { double tmp_double; for (unsigned int i = 0; i < d_nchannels ; i++) { tmp_double = current_gnss_synchro[i].d_TOW_at_current_symbol; d_dump_file.write((char*)&tmp_double, sizeof(double)); tmp_double = current_gnss_synchro[i].Prn_timestamp_ms; d_dump_file.write((char*)&tmp_double, sizeof(double)); tmp_double = current_gnss_synchro[i].Pseudorange_m; d_dump_file.write((char*)&tmp_double, sizeof(double)); tmp_double = (double)(current_gnss_synchro[i].Flag_valid_pseudorange==true); d_dump_file.write((char*)&tmp_double, sizeof(double)); tmp_double = current_gnss_synchro[i].PRN; d_dump_file.write((char*)&tmp_double, sizeof(double)); } } catch (const std::ifstream::failure& e) { LOG(WARNING) << "Exception writing observables dump file " << e.what(); } } consume_each(1); //one by one for (unsigned int i = 0; i < d_nchannels ; i++) { *out[i] = current_gnss_synchro[i]; } if (noutput_items == 0) { LOG(WARNING) << "noutput_items = 0"; } return 1; } gnss-sdr-0.0.9/src/algorithms/observables/gnuradio_blocks/galileo_e1_observables_cc.h000066400000000000000000000052231305042567700311150ustar00rootroot00000000000000/*! * \file galileo_e1_observables_cc.h * \brief Interface of the observables computation block for Galileo E1 * \author Mara Branzanti 2013. mara.branzanti(at)gmail.com * \author Javier Arribas 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_E1_OBSERVABLES_CC_H #define GNSS_SDR_GALILEO_E1_OBSERVABLES_CC_H #include #include #include class galileo_e1_observables_cc; typedef boost::shared_ptr galileo_e1_observables_cc_sptr; galileo_e1_observables_cc_sptr galileo_e1_make_observables_cc(unsigned int n_channels, bool dump, std::string dump_filename, unsigned int deep_history); /*! * \brief This class implements a block that computes Galileo observables */ class galileo_e1_observables_cc : public gr::block { public: ~galileo_e1_observables_cc (); int general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); private: friend galileo_e1_observables_cc_sptr galileo_e1_make_observables_cc(unsigned int nchannels, bool dump, std::string dump_filename, unsigned int deep_history); galileo_e1_observables_cc(unsigned int nchannels, bool dump, std::string dump_filename, unsigned int deep_history); //Tracking observable history std::vector> d_acc_carrier_phase_queue_rads; std::vector> d_carrier_doppler_queue_hz; std::vector> d_symbol_TOW_queue_s; // class private vars bool d_dump; unsigned int d_nchannels; unsigned int history_deep; std::string d_dump_filename; std::ofstream d_dump_file; }; #endif gnss-sdr-0.0.9/src/algorithms/observables/gnuradio_blocks/gps_l1_ca_observables_cc.cc000066400000000000000000000325021305042567700311020ustar00rootroot00000000000000/*! * \file gps_l1_ca_observables_cc.cc * \brief Implementation of the pseudorange computation block for GPS L1 C/A * \author Javier Arribas, 2011. jarribas(at)cttc.es * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l1_ca_observables_cc.h" #include #include #include #include #include #include #include #include #include #include "control_message_factory.h" #include "gnss_synchro.h" #include "GPS_L1_CA.h" using google::LogMessage; gps_l1_ca_observables_cc_sptr gps_l1_ca_make_observables_cc(unsigned int nchannels, bool dump, std::string dump_filename, unsigned int deep_history) { return gps_l1_ca_observables_cc_sptr(new gps_l1_ca_observables_cc(nchannels, dump, dump_filename, deep_history)); } gps_l1_ca_observables_cc::gps_l1_ca_observables_cc(unsigned int nchannels, bool dump, std::string dump_filename, unsigned int deep_history) : gr::block("gps_l1_ca_observables_cc", gr::io_signature::make(nchannels, nchannels, sizeof(Gnss_Synchro)), gr::io_signature::make(nchannels, nchannels, sizeof(Gnss_Synchro))) { // initialize internal vars d_dump = dump; d_nchannels = nchannels; d_dump_filename = dump_filename; history_deep = deep_history; for (unsigned int i = 0; i < d_nchannels; i++) { d_acc_carrier_phase_queue_rads.push_back(std::deque(d_nchannels)); d_carrier_doppler_queue_hz.push_back(std::deque(d_nchannels)); d_symbol_TOW_queue_s.push_back(std::deque(d_nchannels)); } // ############# ENABLE DATA FILE LOG ################# if (d_dump == true) { if (d_dump_file.is_open() == false) { try { d_dump_file.exceptions (std::ifstream::failbit | std::ifstream::badbit ); d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); LOG(INFO) << "Observables dump enabled Log file: " << d_dump_filename.c_str(); } catch (const std::ifstream::failure & e) { LOG(WARNING) << "Exception opening observables dump file " << e.what(); } } } } gps_l1_ca_observables_cc::~gps_l1_ca_observables_cc() { d_dump_file.close(); } bool pairCompare_gnss_synchro_Prn_delay_ms(const std::pair& a, const std::pair& b) { return (a.second.Prn_timestamp_ms) < (b.second.Prn_timestamp_ms); } bool pairCompare_gnss_synchro_d_TOW_at_current_symbol(const std::pair& a, const std::pair& b) { return (a.second.d_TOW_at_current_symbol) < (b.second.d_TOW_at_current_symbol); } int gps_l1_ca_observables_cc::general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { Gnss_Synchro **in = (Gnss_Synchro **) &input_items[0]; // Get the input pointer Gnss_Synchro **out = (Gnss_Synchro **) &output_items[0]; // Get the output pointer Gnss_Synchro current_gnss_synchro[d_nchannels]; std::map current_gnss_synchro_map; std::map::iterator gnss_synchro_iter; if (d_nchannels != ninput_items.size()) { LOG(WARNING) << "The Observables block is not well connected"; } /* * 1. Read the GNSS SYNCHRO objects from available channels */ for (unsigned int i = 0; i < d_nchannels; i++) { //Copy the telemetry decoder data to local copy current_gnss_synchro[i] = in[i][0]; /* * 1.2 Assume no valid pseudoranges */ current_gnss_synchro[i].Flag_valid_pseudorange = false; current_gnss_synchro[i].Pseudorange_m = 0.0; if (current_gnss_synchro[i].Flag_valid_word) //if this channel have valid word { //record the word structure in a map for pseudorange computation current_gnss_synchro_map.insert(std::pair(current_gnss_synchro[i].Channel_ID, current_gnss_synchro[i])); //################### SAVE DOPPLER AND ACC CARRIER PHASE HISTORIC DATA FOR INTERPOLATION IN OBSERVABLE MODULE ####### d_carrier_doppler_queue_hz[i].push_back(current_gnss_synchro[i].Carrier_Doppler_hz); d_acc_carrier_phase_queue_rads[i].push_back(current_gnss_synchro[i].Carrier_phase_rads); // save TOW history d_symbol_TOW_queue_s[i].push_back(current_gnss_synchro[i].d_TOW_at_current_symbol); if (d_carrier_doppler_queue_hz[i].size() > history_deep) { d_carrier_doppler_queue_hz[i].pop_front(); } if (d_acc_carrier_phase_queue_rads[i].size() > history_deep) { d_acc_carrier_phase_queue_rads[i].pop_front(); } if (d_symbol_TOW_queue_s[i].size() > history_deep) { d_symbol_TOW_queue_s[i].pop_front(); } } else { // Clear the observables history for this channel if (d_symbol_TOW_queue_s[i].size() > 0) { d_symbol_TOW_queue_s[i].clear(); d_carrier_doppler_queue_hz[i].clear(); d_acc_carrier_phase_queue_rads[i].clear(); } } } /* * 2. Compute RAW pseudoranges using COMMON RECEPTION TIME algorithm. Use only the valid channels (channels that are tracking a satellite) */ if(current_gnss_synchro_map.size() > 0) { /* * 2.1 Use CURRENT set of measurements and find the nearest satellite * common RX time algorithm */ // what is the most recent symbol TOW in the current set? -> this will be the reference symbol gnss_synchro_iter = max_element(current_gnss_synchro_map.begin(), current_gnss_synchro_map.end(), pairCompare_gnss_synchro_d_TOW_at_current_symbol); double d_TOW_reference = gnss_synchro_iter->second.d_TOW_at_current_symbol; double d_ref_PRN_rx_time_ms = gnss_synchro_iter->second.Prn_timestamp_ms; // Now compute RX time differences due to the PRN alignment in the correlators double traveltime_ms; double pseudorange_m; double delta_rx_time_ms; arma::vec symbol_TOW_vec_s; arma::vec dopper_vec_hz; arma::vec dopper_vec_interp_hz; arma::vec acc_phase_vec_rads; arma::vec acc_phase_vec_interp_rads; arma::vec desired_symbol_TOW(1); for(gnss_synchro_iter = current_gnss_synchro_map.begin(); gnss_synchro_iter != current_gnss_synchro_map.end(); gnss_synchro_iter++) { // compute the required symbol history shift in order to match the reference symbol delta_rx_time_ms = gnss_synchro_iter->second.Prn_timestamp_ms - d_ref_PRN_rx_time_ms; //compute the pseudorange traveltime_ms = (d_TOW_reference - gnss_synchro_iter->second.d_TOW_at_current_symbol) * 1000.0 + delta_rx_time_ms + GPS_STARTOFFSET_ms; //convert to meters and remove the receiver time offset in meters pseudorange_m = traveltime_ms * GPS_C_m_ms; // [m] // update the pseudorange object current_gnss_synchro[gnss_synchro_iter->second.Channel_ID] = gnss_synchro_iter->second; current_gnss_synchro[gnss_synchro_iter->second.Channel_ID].Pseudorange_m = pseudorange_m; current_gnss_synchro[gnss_synchro_iter->second.Channel_ID].Flag_valid_pseudorange = true; current_gnss_synchro[gnss_synchro_iter->second.Channel_ID].d_TOW_at_current_symbol = round(d_TOW_reference * 1000.0) / 1000.0 + GPS_STARTOFFSET_ms / 1000.0; if (d_symbol_TOW_queue_s[gnss_synchro_iter->second.Channel_ID].size() >= history_deep) { // compute interpolated observation values for Doppler and Accumulate carrier phase symbol_TOW_vec_s = arma::vec(std::vector(d_symbol_TOW_queue_s[gnss_synchro_iter->second.Channel_ID].begin(), d_symbol_TOW_queue_s[gnss_synchro_iter->second.Channel_ID].end())); acc_phase_vec_rads = arma::vec(std::vector(d_acc_carrier_phase_queue_rads[gnss_synchro_iter->second.Channel_ID].begin(), d_acc_carrier_phase_queue_rads[gnss_synchro_iter->second.Channel_ID].end())); dopper_vec_hz = arma::vec(std::vector(d_carrier_doppler_queue_hz[gnss_synchro_iter->second.Channel_ID].begin(), d_carrier_doppler_queue_hz[gnss_synchro_iter->second.Channel_ID].end())); desired_symbol_TOW[0] = symbol_TOW_vec_s[history_deep - 1] + delta_rx_time_ms / 1000.0; // arma::interp1(symbol_TOW_vec_s,dopper_vec_hz,desired_symbol_TOW,dopper_vec_interp_hz); // arma::interp1(symbol_TOW_vec_s,acc_phase_vec_rads,desired_symbol_TOW,acc_phase_vec_interp_rads); // Curve fitting to quadratic function arma::mat A = arma::ones (history_deep, 2); A.col(1) = symbol_TOW_vec_s; arma::mat coef_acc_phase(1,3); arma::mat pinv_A = arma::pinv(A.t() * A) * A.t(); coef_acc_phase = pinv_A * acc_phase_vec_rads; arma::mat coef_doppler(1,3); coef_doppler = pinv_A * dopper_vec_hz; arma::vec acc_phase_lin; arma::vec carrier_doppler_lin; acc_phase_lin = coef_acc_phase[0] + coef_acc_phase[1] * desired_symbol_TOW[0]; carrier_doppler_lin = coef_doppler[0] + coef_doppler[1] * desired_symbol_TOW[0]; current_gnss_synchro[gnss_synchro_iter->second.Channel_ID].Carrier_phase_rads = acc_phase_lin[0]; current_gnss_synchro[gnss_synchro_iter->second.Channel_ID].Carrier_Doppler_hz = carrier_doppler_lin[0]; } } } if(d_dump == true) { // MULTIPLEXED FILE RECORDING - Record results to file try { double tmp_double; for (unsigned int i = 0; i < d_nchannels; i++) { tmp_double = current_gnss_synchro[i].d_TOW_at_current_symbol; d_dump_file.write((char*)&tmp_double, sizeof(double)); //tmp_double = current_gnss_synchro[i].Prn_timestamp_ms; tmp_double = current_gnss_synchro[i].Carrier_Doppler_hz; d_dump_file.write((char*)&tmp_double, sizeof(double)); tmp_double = current_gnss_synchro[i].Carrier_phase_rads/GPS_TWO_PI; d_dump_file.write((char*)&tmp_double, sizeof(double)); tmp_double = current_gnss_synchro[i].Pseudorange_m; d_dump_file.write((char*)&tmp_double, sizeof(double)); tmp_double = current_gnss_synchro[i].PRN; d_dump_file.write((char*)&tmp_double, sizeof(double)); } } catch (const std::ifstream::failure& e) { LOG(WARNING) << "Exception writing observables dump file " << e.what(); } } consume_each(1); //one by one for (unsigned int i = 0; i < d_nchannels; i++) { *out[i] = current_gnss_synchro[i]; } if (noutput_items == 0) { LOG(WARNING) << "noutput_items = 0"; } return 1; } gnss-sdr-0.0.9/src/algorithms/observables/gnuradio_blocks/gps_l1_ca_observables_cc.h000066400000000000000000000053171305042567700307500ustar00rootroot00000000000000/*! * \file gps_l1_ca_observables_cc.h * \brief Interface of the pseudorange computation block for GPS L1 C/A * \author Javier Arribas, 2011. jarribas(at)cttc.es * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L1_CA_OBSERVABLES_CC_H #define GNSS_SDR_GPS_L1_CA_OBSERVABLES_CC_H #include #include #include #include #include #include class gps_l1_ca_observables_cc; typedef boost::shared_ptr gps_l1_ca_observables_cc_sptr; gps_l1_ca_observables_cc_sptr gps_l1_ca_make_observables_cc(unsigned int n_channels, bool dump, std::string dump_filename, unsigned int deep_history); /*! * \brief This class implements a block that computes GPS L1 C/A observables */ class gps_l1_ca_observables_cc : public gr::block { public: ~gps_l1_ca_observables_cc (); //void set_fs_in(unsigned long int fs_in) {d_fs_in = fs_in;}; int general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); private: friend gps_l1_ca_observables_cc_sptr gps_l1_ca_make_observables_cc(unsigned int nchannels, bool dump, std::string dump_filename, unsigned int deep_history); gps_l1_ca_observables_cc(unsigned int nchannels, bool dump, std::string dump_filename, unsigned int deep_history); //Tracking observable history std::vector> d_acc_carrier_phase_queue_rads; std::vector> d_carrier_doppler_queue_hz; std::vector> d_symbol_TOW_queue_s; // class private vars bool d_dump; unsigned int d_nchannels; unsigned int history_deep; std::string d_dump_filename; std::ofstream d_dump_file; }; #endif gnss-sdr-0.0.9/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc000066400000000000000000000347211305042567700305400ustar00rootroot00000000000000/*! * \file hybrid_observables_cc.cc * \brief Implementation of the pseudorange computation block for Galileo E1 * \author Mara Branzanti 2013. mara.branzanti(at)gmail.com * \author Javier Arribas 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "hybrid_observables_cc.h" #include #include #include #include #include #include #include #include #include #include "gnss_synchro.h" #include "Galileo_E1.h" #include "GPS_L1_CA.h" using google::LogMessage; hybrid_observables_cc_sptr hybrid_make_observables_cc(unsigned int nchannels, bool dump, std::string dump_filename, unsigned int deep_history) { return hybrid_observables_cc_sptr(new hybrid_observables_cc(nchannels, dump, dump_filename, deep_history)); } hybrid_observables_cc::hybrid_observables_cc(unsigned int nchannels, bool dump, std::string dump_filename, unsigned int deep_history) : gr::block("hybrid_observables_cc", gr::io_signature::make(nchannels, nchannels, sizeof(Gnss_Synchro)), gr::io_signature::make(nchannels, nchannels, sizeof(Gnss_Synchro))) { // initialize internal vars d_dump = dump; d_nchannels = nchannels; d_dump_filename = dump_filename; history_deep = deep_history; for (unsigned int i = 0; i < d_nchannels; i++) { d_acc_carrier_phase_queue_rads.push_back(std::deque(d_nchannels)); d_carrier_doppler_queue_hz.push_back(std::deque(d_nchannels)); d_symbol_TOW_queue_s.push_back(std::deque(d_nchannels)); } // ############# ENABLE DATA FILE LOG ################# if (d_dump == true) { if (d_dump_file.is_open() == false) { try { d_dump_file.exceptions (std::ifstream::failbit | std::ifstream::badbit ); d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); LOG(INFO) << "Observables dump enabled Log file: " << d_dump_filename.c_str(); } catch (const std::ifstream::failure & e) { LOG(WARNING) << "Exception opening observables dump file " << e.what(); } } } } hybrid_observables_cc::~hybrid_observables_cc() { d_dump_file.close(); } bool Hybrid_pairCompare_gnss_synchro_d_TOW_hybrid_at_current_symbol(const std::pair& a, const std::pair& b) { return (a.second.d_TOW_hybrid_at_current_symbol) < (b.second.d_TOW_hybrid_at_current_symbol); } int hybrid_observables_cc::general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { Gnss_Synchro **in = (Gnss_Synchro **) &input_items[0]; // Get the input pointer Gnss_Synchro **out = (Gnss_Synchro **) &output_items[0]; // Get the output pointer Gnss_Synchro current_gnss_synchro[d_nchannels]; std::map current_gnss_synchro_map; std::map::iterator gnss_synchro_iter; if (d_nchannels != ninput_items.size()) { LOG(WARNING) << "The Observables block is not well connected"; } /* * 1. Read the GNSS SYNCHRO objects from available channels */ for (unsigned int i = 0; i < d_nchannels; i++) { //Copy the telemetry decoder data to local copy current_gnss_synchro[i] = in[i][0]; /* * 1.2 Assume no valid pseudoranges */ current_gnss_synchro[i].Flag_valid_pseudorange = false; current_gnss_synchro[i].Pseudorange_m = 0.0; if (current_gnss_synchro[i].Flag_valid_word) { //record the word structure in a map for pseudorange computation current_gnss_synchro_map.insert(std::pair(current_gnss_synchro[i].Channel_ID, current_gnss_synchro[i])); //################### SAVE DOPPLER AND ACC CARRIER PHASE HISTORIC DATA FOR INTERPOLATION IN OBSERVABLE MODULE ####### d_carrier_doppler_queue_hz[i].push_back(current_gnss_synchro[i].Carrier_Doppler_hz); d_acc_carrier_phase_queue_rads[i].push_back(current_gnss_synchro[i].Carrier_phase_rads); // save TOW history d_symbol_TOW_queue_s[i].push_back(current_gnss_synchro[i].d_TOW_at_current_symbol); if (d_carrier_doppler_queue_hz[i].size() > history_deep) { d_carrier_doppler_queue_hz[i].pop_front(); } if (d_acc_carrier_phase_queue_rads[i].size() > history_deep) { d_acc_carrier_phase_queue_rads[i].pop_front(); } if (d_symbol_TOW_queue_s[i].size() > history_deep) { d_symbol_TOW_queue_s[i].pop_front(); } } else { // Clear the observables history for this channel if (d_symbol_TOW_queue_s[i].size() > 0) { d_symbol_TOW_queue_s[i].clear(); d_carrier_doppler_queue_hz[i].clear(); d_acc_carrier_phase_queue_rads[i].clear(); } } } /* * 2. Compute RAW pseudoranges using COMMON RECEPTION TIME algorithm. Use only the valid channels (channels that are tracking a satellite) */ DLOG(INFO) << "gnss_synchro set size=" << current_gnss_synchro_map.size(); double traveltime_ms; double pseudorange_m; double delta_rx_time_ms; double delta_TOW_ms; arma::vec symbol_TOW_vec_s; arma::vec dopper_vec_hz; arma::vec dopper_vec_interp_hz; arma::vec acc_phase_vec_rads; arma::vec acc_phase_vec_interp_rads; arma::vec desired_symbol_TOW(1); double start_offset_ms = 0.0; if(current_gnss_synchro_map.size() > 0) { /* * 2.1 Use CURRENT set of measurements and find the nearest satellite * common RX time algorithm */ // what is the most recent symbol TOW in the current set? -> this will be the reference symbol gnss_synchro_iter = max_element(current_gnss_synchro_map.begin(), current_gnss_synchro_map.end(), Hybrid_pairCompare_gnss_synchro_d_TOW_hybrid_at_current_symbol); //gnss_synchro_iter = max_element(current_gnss_synchro_map_gps_only.begin(), current_gnss_synchro_map_gps_only.end(), Hybrid_pairCompare_gnss_synchro_d_TOW_hybrid_at_current_symbol); double d_TOW_reference = gnss_synchro_iter->second.d_TOW_hybrid_at_current_symbol; DLOG(INFO) << "d_TOW_hybrid_reference [ms] = " << d_TOW_reference * 1000; double d_ref_PRN_rx_time_ms = gnss_synchro_iter->second.Prn_timestamp_ms; DLOG(INFO) << "ref_PRN_rx_time_ms [ms] = " << d_ref_PRN_rx_time_ms; // Now compute RX time differences due to the PRN alignment in the correlators for(gnss_synchro_iter = current_gnss_synchro_map.begin(); gnss_synchro_iter != current_gnss_synchro_map.end(); gnss_synchro_iter++) { // check and correct synchronization in cross-system pseudoranges! delta_rx_time_ms = gnss_synchro_iter->second.Prn_timestamp_ms - d_ref_PRN_rx_time_ms; delta_TOW_ms = (d_TOW_reference - gnss_synchro_iter->second.d_TOW_hybrid_at_current_symbol) * 1000.0; if(gnss_synchro_iter->second.System == 'E') { start_offset_ms = GALILEO_STARTOFFSET_ms; } if(gnss_synchro_iter->second.System == 'G') { start_offset_ms = GPS_STARTOFFSET_ms; } //compute the pseudorange traveltime_ms = delta_TOW_ms + delta_rx_time_ms + start_offset_ms; pseudorange_m = traveltime_ms * GALILEO_C_m_ms; // [m] DLOG(INFO) << "CH " << gnss_synchro_iter->second.Channel_ID << " tracking GNSS System " << gnss_synchro_iter->second.System << " has PRN start at= " << gnss_synchro_iter->second.Prn_timestamp_ms << " [ms], d_TOW_at_current_symbol = " << (gnss_synchro_iter->second.d_TOW_at_current_symbol) * 1000 << " [ms], d_TOW_hybrid_at_current_symbol = "<< (gnss_synchro_iter->second.d_TOW_hybrid_at_current_symbol) * 1000 << "[ms], delta_rx_time_ms = " << delta_rx_time_ms << "[ms], travel_time = " << traveltime_ms << ", pseudorange[m] = "<< pseudorange_m; // update the pseudorange object //current_gnss_synchro[gnss_synchro_iter->second.Channel_ID] = gnss_synchro_iter->second; current_gnss_synchro[gnss_synchro_iter->second.Channel_ID].Pseudorange_m = pseudorange_m; current_gnss_synchro[gnss_synchro_iter->second.Channel_ID].Flag_valid_pseudorange = true; current_gnss_synchro[gnss_synchro_iter->second.Channel_ID].d_TOW_hybrid_at_current_symbol = round(d_TOW_reference * 1000) / 1000 + start_offset_ms / 1000.0; if (d_symbol_TOW_queue_s[gnss_synchro_iter->second.Channel_ID].size() >= history_deep) { // compute interpolated observation values for Doppler and Accumulate carrier phase symbol_TOW_vec_s = arma::vec(std::vector(d_symbol_TOW_queue_s[gnss_synchro_iter->second.Channel_ID].begin(), d_symbol_TOW_queue_s[gnss_synchro_iter->second.Channel_ID].end())); acc_phase_vec_rads = arma::vec(std::vector(d_acc_carrier_phase_queue_rads[gnss_synchro_iter->second.Channel_ID].begin(), d_acc_carrier_phase_queue_rads[gnss_synchro_iter->second.Channel_ID].end())); dopper_vec_hz = arma::vec(std::vector(d_carrier_doppler_queue_hz[gnss_synchro_iter->second.Channel_ID].begin(), d_carrier_doppler_queue_hz[gnss_synchro_iter->second.Channel_ID].end())); desired_symbol_TOW[0] = symbol_TOW_vec_s[history_deep - 1] + delta_rx_time_ms / 1000.0; // Curve fitting to cuadratic function arma::mat A = arma::ones (history_deep, 2); A.col(1) = symbol_TOW_vec_s; arma::mat coef_acc_phase(1,3); arma::mat pinv_A = arma::pinv(A.t() * A) * A.t(); coef_acc_phase = pinv_A * acc_phase_vec_rads; arma::mat coef_doppler(1,3); coef_doppler = pinv_A * dopper_vec_hz; arma::vec acc_phase_lin; arma::vec carrier_doppler_lin; acc_phase_lin = coef_acc_phase[0] + coef_acc_phase[1] * desired_symbol_TOW[0]; carrier_doppler_lin = coef_doppler[0] + coef_doppler[1] * desired_symbol_TOW[0]; current_gnss_synchro[gnss_synchro_iter->second.Channel_ID].Carrier_phase_rads = acc_phase_lin[0]; current_gnss_synchro[gnss_synchro_iter->second.Channel_ID].Carrier_Doppler_hz = carrier_doppler_lin[0]; } } } if(d_dump == true) { // MULTIPLEXED FILE RECORDING - Record results to file try { double tmp_double; for (unsigned int i = 0; i < d_nchannels ; i++) { tmp_double = current_gnss_synchro[i].d_TOW_at_current_symbol; d_dump_file.write((char*)&tmp_double, sizeof(double)); tmp_double = current_gnss_synchro[i].d_TOW_hybrid_at_current_symbol; d_dump_file.write((char*)&tmp_double, sizeof(double)); tmp_double = current_gnss_synchro[i].Prn_timestamp_ms; d_dump_file.write((char*)&tmp_double, sizeof(double)); tmp_double = current_gnss_synchro[i].Pseudorange_m; d_dump_file.write((char*)&tmp_double, sizeof(double)); tmp_double = (double)(current_gnss_synchro[i].Flag_valid_pseudorange==true); d_dump_file.write((char*)&tmp_double, sizeof(double)); tmp_double = current_gnss_synchro[i].PRN; d_dump_file.write((char*)&tmp_double, sizeof(double)); } } catch (const std::ifstream::failure& e) { LOG(WARNING) << "Exception writing observables dump file " << e.what(); } } consume_each(1); //consume one by one for (unsigned int i = 0; i < d_nchannels ; i++) { *out[i] = current_gnss_synchro[i]; } if (noutput_items == 0) { LOG(WARNING) << "noutput_items = 0"; } return 1; } gnss-sdr-0.0.9/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.h000066400000000000000000000051351305042567700303770ustar00rootroot00000000000000/*! * \file hybrid_observables_cc.h * \brief Interface of the observables computation block for Galileo E1 * \author Mara Branzanti 2013. mara.branzanti(at)gmail.com * \author Javier Arribas 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_HYBRID_OBSERVABLES_CC_H #define GNSS_SDR_HYBRID_OBSERVABLES_CC_H #include #include #include class hybrid_observables_cc; typedef boost::shared_ptr hybrid_observables_cc_sptr; hybrid_observables_cc_sptr hybrid_make_observables_cc(unsigned int n_channels, bool dump, std::string dump_filename, unsigned int deep_history); /*! * \brief This class implements a block that computes Galileo observables */ class hybrid_observables_cc : public gr::block { public: ~hybrid_observables_cc (); int general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); private: friend hybrid_observables_cc_sptr hybrid_make_observables_cc(unsigned int nchannels, bool dump, std::string dump_filename, unsigned int deep_history); hybrid_observables_cc(unsigned int nchannels, bool dump, std::string dump_filename, unsigned int deep_history); //Tracking observable history std::vector> d_acc_carrier_phase_queue_rads; std::vector> d_carrier_doppler_queue_hz; std::vector> d_symbol_TOW_queue_s; // class private vars bool d_dump; unsigned int d_nchannels; unsigned int history_deep; std::string d_dump_filename; std::ofstream d_dump_file; }; #endif gnss-sdr-0.0.9/src/algorithms/resampler/000077500000000000000000000000001305042567700202235ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/resampler/CMakeLists.txt000066400000000000000000000014321305042567700227630ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # add_subdirectory(adapters) add_subdirectory(gnuradio_blocks)gnss-sdr-0.0.9/src/algorithms/resampler/adapters/000077500000000000000000000000001305042567700220265ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/resampler/adapters/CMakeLists.txt000066400000000000000000000025361305042567700245740ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # set(RESAMPLER_ADAPTER_SOURCES direct_resampler_conditioner.cc ) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${CMAKE_SOURCE_DIR}/src/core/interfaces ${CMAKE_SOURCE_DIR}/src/algorithms/resampler/gnuradio_blocks ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ${VOLK_INCLUDE_DIRS} ) file(GLOB RESAMPLER_ADAPTER_HEADERS "*.h") list(SORT RESAMPLER_ADAPTER_HEADERS) add_library(resampler_adapters ${RESAMPLER_ADAPTER_SOURCES} ${RESAMPLER_ADAPTER_HEADERS}) source_group(Headers FILES ${RESAMPLER_ADAPTER_HEADERS}) target_link_libraries(resampler_adapters resampler_gr_blocks) gnss-sdr-0.0.9/src/algorithms/resampler/adapters/direct_resampler_conditioner.cc000066400000000000000000000125251305042567700302630ustar00rootroot00000000000000/*! * \file direct_resampler_conditioner.cc * \brief Implementation of an adapter of a direct resampler conditioner block * to a SignalConditionerInterface * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "direct_resampler_conditioner.h" #include #include #include #include #include #include "direct_resampler_conditioner_cc.h" #include "direct_resampler_conditioner_cs.h" #include "direct_resampler_conditioner_cb.h" #include "configuration_interface.h" using google::LogMessage; DirectResamplerConditioner::DirectResamplerConditioner( ConfigurationInterface* configuration, std::string role, unsigned int in_stream, unsigned int out_stream) : role_(role), in_stream_(in_stream), out_stream_(out_stream) { std::string default_item_type = "short"; std::string default_dump_file = "./data/signal_conditioner.dat"; double fs_in; fs_in = configuration->property("GNSS-SDR.internal_fs_hz", 2048000.0); sample_freq_in_ = configuration->property(role_ + ".sample_freq_in", (double)4000000.0); sample_freq_out_ = configuration->property(role_ + ".sample_freq_out", fs_in); if(std::fabs(fs_in - sample_freq_out_) > std::numeric_limits::epsilon()) { std::string aux_warn = "CONFIGURATION WARNING: Parameters GNSS-SDR.internal_fs_hz and " + role_ + ".sample_freq_out are not set to the same value!" ; LOG(WARNING) << aux_warn; std::cout << aux_warn << std::endl; } item_type_ = configuration->property(role + ".item_type", default_item_type); dump_ = configuration->property(role + ".dump", false); DLOG(INFO) << "dump_ is " << dump_; dump_filename_ = configuration->property(role + ".dump_filename", default_dump_file); if (item_type_.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); resampler_ = direct_resampler_make_conditioner_cc(sample_freq_in_, sample_freq_out_); DLOG(INFO) << "sample_freq_in " << sample_freq_in_; DLOG(INFO) << "sample_freq_out" << sample_freq_out_; DLOG(INFO) << "Item size " << item_size_; DLOG(INFO) << "resampler(" << resampler_->unique_id() << ")"; } else if (item_type_.compare("cshort") == 0) { item_size_ = sizeof(lv_16sc_t); resampler_ = direct_resampler_make_conditioner_cs(sample_freq_in_, sample_freq_out_); DLOG(INFO) << "sample_freq_in " << sample_freq_in_; DLOG(INFO) << "sample_freq_out" << sample_freq_out_; DLOG(INFO) << "Item size " << item_size_; DLOG(INFO) << "resampler(" << resampler_->unique_id() << ")"; } else if (item_type_.compare("cbyte") == 0) { item_size_ = sizeof(lv_8sc_t); resampler_ = direct_resampler_make_conditioner_cb(sample_freq_in_, sample_freq_out_); DLOG(INFO) << "sample_freq_in " << sample_freq_in_; DLOG(INFO) << "sample_freq_out" << sample_freq_out_; DLOG(INFO) << "Item size " << item_size_; DLOG(INFO) << "resampler(" << resampler_->unique_id() << ")"; } else { LOG(WARNING) << item_type_ << " unrecognized item type for resampler"; item_size_ = sizeof(short); } if (dump_) { DLOG(INFO) << "Dumping output into file " << dump_filename_; file_sink_ = gr::blocks::file_sink::make(item_size_, dump_filename_.c_str()); DLOG(INFO) << "file_sink(" << file_sink_->unique_id() << ")"; } } DirectResamplerConditioner::~DirectResamplerConditioner() {} void DirectResamplerConditioner::connect(gr::top_block_sptr top_block) { if (dump_) { top_block->connect(resampler_, 0, file_sink_, 0); DLOG(INFO) << "connected resampler to file sink"; } else { DLOG(INFO) << "nothing to connect internally"; } } void DirectResamplerConditioner::disconnect(gr::top_block_sptr top_block) { if (dump_) { top_block->disconnect(resampler_, 0, file_sink_, 0); } } gr::basic_block_sptr DirectResamplerConditioner::get_left_block() { return resampler_; } gr::basic_block_sptr DirectResamplerConditioner::get_right_block() { return resampler_; } gnss-sdr-0.0.9/src/algorithms/resampler/adapters/direct_resampler_conditioner.h000066400000000000000000000051001305042567700301140ustar00rootroot00000000000000/*! * \file direct_resampler_conditioner.h * \brief Interface of an adapter of a direct resampler conditioner block * to a SignalConditionerInterface * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_DIRECT_RESAMPLER_CONDITIONER_H_ #define GNSS_SDR_DIRECT_RESAMPLER_CONDITIONER_H_ #include #include #include "gnss_block_interface.h" class ConfigurationInterface; /*! * \brief Interface of an adapter of a direct resampler conditioner block * to a SignalConditionerInterface */ class DirectResamplerConditioner: public GNSSBlockInterface { public: DirectResamplerConditioner(ConfigurationInterface* configuration, std::string role, unsigned int in_stream, unsigned int out_stream); virtual ~DirectResamplerConditioner(); std::string role() { return role_; } //! returns "Direct_Resampler" std::string implementation() { return "Direct_Resampler"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); private: std::string role_; unsigned int in_stream_; unsigned int out_stream_; std::string item_type_; size_t item_size_; bool dump_; std::string dump_filename_; double sample_freq_in_; double sample_freq_out_; gr::block_sptr resampler_; gr::block_sptr file_sink_; }; #endif /*GNSS_SDR_DIRECT_RESAMPLER_CONDITIONER_H_*/ gnss-sdr-0.0.9/src/algorithms/resampler/gnuradio_blocks/000077500000000000000000000000001305042567700233705ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/resampler/gnuradio_blocks/CMakeLists.txt000066400000000000000000000025221305042567700261310ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # set(RESAMPLER_GR_BLOCKS_SOURCES direct_resampler_conditioner_cc.cc direct_resampler_conditioner_cs.cc direct_resampler_conditioner_cb.cc ) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ${VOLK_INCLUDE_DIRS} ) file(GLOB RESAMPLER_GR_BLOCKS_HEADERS "*.h") list(SORT RESAMPLER_GR_BLOCKS_HEADERS) add_library(resampler_gr_blocks ${RESAMPLER_GR_BLOCKS_SOURCES} ${RESAMPLER_GR_BLOCKS_HEADERS}) source_group(Headers FILES ${RESAMPLER_GR_BLOCKS_HEADERS}) add_dependencies(resampler_gr_blocks glog-${glog_RELEASE})gnss-sdr-0.0.9/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cb.cc000066400000000000000000000102421305042567700322630ustar00rootroot00000000000000/*! * \file direct_resampler_conditioner_cb.cc * \brief Nearest neighborhood resampler with std::complex * input and std::complex output * \author Luis Esteve, 2011. luis(at)epsilon-formacion.com * * Detailed description of the file here if needed. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "direct_resampler_conditioner_cb.h" #include #include #include #include using google::LogMessage; direct_resampler_conditioner_cb_sptr direct_resampler_make_conditioner_cb( double sample_freq_in, double sample_freq_out) { return direct_resampler_conditioner_cb_sptr( new direct_resampler_conditioner_cb(sample_freq_in, sample_freq_out)); } direct_resampler_conditioner_cb::direct_resampler_conditioner_cb( double sample_freq_in, double sample_freq_out) : gr::block("direct_resampler_make_conditioner_cb", gr::io_signature::make(1, 1, sizeof(lv_8sc_t)), gr::io_signature::make(1, 1, sizeof(lv_8sc_t))), d_sample_freq_in(sample_freq_in), d_sample_freq_out( sample_freq_out), d_phase(0), d_lphase(0), d_history(1) { const double two_32 = 4294967296.0; // Computes the phase step multiplying the resampling ratio by 2^32 = 4294967296 if (d_sample_freq_in >= d_sample_freq_out) { d_phase_step = static_cast(floor(two_32 * sample_freq_out / sample_freq_in)); } else { d_phase_step = static_cast(floor(two_32 * sample_freq_in / sample_freq_out)); } set_relative_rate(1.0 * sample_freq_out / sample_freq_in); set_output_multiple(1); } direct_resampler_conditioner_cb::~direct_resampler_conditioner_cb() { } void direct_resampler_conditioner_cb::forecast(int noutput_items, gr_vector_int &ninput_items_required) { int nreqd = std::max(static_cast(1), static_cast(static_cast(noutput_items + 1) * sample_freq_in() / sample_freq_out()) + history() - 1); unsigned ninputs = ninput_items_required.size(); for (unsigned i = 0; i < ninputs; i++) { ninput_items_required[i] = nreqd; } } int direct_resampler_conditioner_cb::general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { const lv_8sc_t *in = (const lv_8sc_t *)input_items[0]; lv_8sc_t *out = (lv_8sc_t *)output_items[0]; int lcv = 0; int count = 0; if (d_sample_freq_in >= d_sample_freq_out) { while ((lcv < noutput_items)) { if (d_phase <= d_lphase) { out[lcv] = *in; lcv++; } d_lphase = d_phase; d_phase += d_phase_step; in++; count++; } } else { while ((lcv < noutput_items)) { d_lphase = d_phase; d_phase += d_phase_step; if (d_phase <= d_lphase) { in++; count++; } out[lcv] = *in; lcv++; } } consume_each(std::min(count, ninput_items[0])); return lcv; } gnss-sdr-0.0.9/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cb.h000066400000000000000000000054051305042567700321320ustar00rootroot00000000000000/*! * \file direct_resampler_conditioner_cb.h * \brief Nearest neighborhood resampler with * std::complex input and std::complex output * \author Luis Esteve, 2011. luis(at)epsilon-formacion.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_DIRECT_RESAMPLER_CONDITIONER_CB_H #define GNSS_SDR_DIRECT_RESAMPLER_CONDITIONER_CB_H #include #include class direct_resampler_conditioner_cb; typedef boost::shared_ptr direct_resampler_conditioner_cb_sptr; direct_resampler_conditioner_cb_sptr direct_resampler_make_conditioner_cb(double sample_freq_in, double sample_freq_out); /*! * \brief This class implements a direct resampler conditioner for std::complex * * Direct resampling without interpolation */ class direct_resampler_conditioner_cb: public gr::block { private: friend direct_resampler_conditioner_cb_sptr direct_resampler_make_conditioner_cb(double sample_freq_in, double sample_freq_out); double d_sample_freq_in; double d_sample_freq_out; uint32_t d_phase; uint32_t d_lphase; uint32_t d_phase_step; unsigned int d_history; direct_resampler_conditioner_cb(double sample_freq_in, double sample_freq_out); public: ~direct_resampler_conditioner_cb(); unsigned int sample_freq_in() const { return d_sample_freq_in; } unsigned int sample_freq_out() const { return d_sample_freq_out; } void forecast(int noutput_items, gr_vector_int &ninput_items_required); int general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; #endif /* GNSS_SDR_DIRECT_RESAMPLER_CONDITIONER_CS_H */ gnss-sdr-0.0.9/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cc.cc000066400000000000000000000107221305042567700322670ustar00rootroot00000000000000/*! * \file direct_resampler_conditioner_cc.cc * \brief Nearest neighborhood resampler with * gr_complex input and gr_complex output * \author Luis Esteve, 2011. luis(at)epsilon-formacion.com * * Detailed description of the file here if needed. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "direct_resampler_conditioner_cc.h" #include #include #include #include using google::LogMessage; direct_resampler_conditioner_cc_sptr direct_resampler_make_conditioner_cc( double sample_freq_in, double sample_freq_out) { return direct_resampler_conditioner_cc_sptr( new direct_resampler_conditioner_cc(sample_freq_in, sample_freq_out)); } direct_resampler_conditioner_cc::direct_resampler_conditioner_cc( double sample_freq_in, double sample_freq_out) : gr::block("direct_resampler_conditioner_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(1, 1, sizeof(gr_complex))), d_sample_freq_in(sample_freq_in), d_sample_freq_out(sample_freq_out), d_phase(0), d_lphase(0), d_history(1) { // Computes the phase step multiplying the resampling ratio by 2^32 = 4294967296 const double two_32 = 4294967296.0; if (d_sample_freq_in >= d_sample_freq_out) { d_phase_step = static_cast(floor(two_32 * sample_freq_out / sample_freq_in)); } else { d_phase_step = static_cast(floor(two_32 * sample_freq_in / sample_freq_out)); } set_relative_rate(1.0 * sample_freq_out / sample_freq_in); set_output_multiple(1); } direct_resampler_conditioner_cc::~direct_resampler_conditioner_cc() { } void direct_resampler_conditioner_cc::forecast(int noutput_items, gr_vector_int &ninput_items_required) { int nreqd = std::max(static_cast(1), static_cast(static_cast(noutput_items + 1) * sample_freq_in() / sample_freq_out()) + history() - 1); unsigned ninputs = ninput_items_required.size(); for (unsigned i = 0; i < ninputs; i++) { ninput_items_required[i] = nreqd; } } int direct_resampler_conditioner_cc::general_work(int noutput_items, gr_vector_int &ninput_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]; int lcv = 0; int count = 0; if (d_sample_freq_in >= d_sample_freq_out) { while ((lcv < noutput_items)) { if (d_phase <= d_lphase) { out[lcv] = *in; lcv++; } d_lphase = d_phase; d_phase += d_phase_step; in++; count++; } } else { while ((lcv < noutput_items)) { d_lphase = d_phase; d_phase += d_phase_step; if (d_phase <= d_lphase) { in++; count++; } out[lcv] = *in; lcv++; } } consume_each(std::min(count, ninput_items[0])); return lcv; } gnss-sdr-0.0.9/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cc.h000066400000000000000000000057511305042567700321370ustar00rootroot00000000000000/*! * \file direct_resampler_conditioner_cc.h * * \brief Nearest neighborhood resampler with * gr_complex input and gr_complex output * \author Luis Esteve, 2011. luis(at)epsilon-formacion.com * * This block takes in a signal stream and performs direct * resampling. * The theory behind this block can be found in Chapter 7.5 of * the following book. * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_DIRECT_RESAMPLER_CONDITIONER_CC_H #define GNSS_SDR_DIRECT_RESAMPLER_CONDITIONER_CC_H #include #include class direct_resampler_conditioner_cc; typedef boost::shared_ptr direct_resampler_conditioner_cc_sptr; direct_resampler_conditioner_cc_sptr direct_resampler_make_conditioner_cc(double sample_freq_in, double sample_freq_out); /*! * \brief This class implements a direct resampler conditioner for complex data * * Direct resampling without interpolation */ class direct_resampler_conditioner_cc: public gr::block { private: friend direct_resampler_conditioner_cc_sptr direct_resampler_make_conditioner_cc(double sample_freq_in, double sample_freq_out); double d_sample_freq_in; //! Specifies the sampling frequency of the input signal double d_sample_freq_out; //! Specifies the sampling frequency of the output signal uint32_t d_phase; uint32_t d_lphase; uint32_t d_phase_step; unsigned int d_history; direct_resampler_conditioner_cc(double sample_freq_in, double sample_freq_out); public: ~direct_resampler_conditioner_cc(); unsigned int sample_freq_in() const { return d_sample_freq_in; } unsigned int sample_freq_out() const { return d_sample_freq_out; } void forecast(int noutput_items, gr_vector_int &ninput_items_required); int general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; #endif /* GNSS_SDR_DIRECT_RESAMPLER_CONDITIONER_CC_H */ gnss-sdr-0.0.9/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cs.cc000066400000000000000000000102261305042567700323060ustar00rootroot00000000000000/*! * \file direct_resampler_conditioner_cs.cc * \brief Nearest neighborhood resampler with * complex short input and complex short output * \author Luis Esteve, 2011. luis(at)epsilon-formacion.com * * Detailed description of the file here if needed. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "direct_resampler_conditioner_cs.h" #include #include #include #include using google::LogMessage; direct_resampler_conditioner_cs_sptr direct_resampler_make_conditioner_cs( double sample_freq_in, double sample_freq_out) { return direct_resampler_conditioner_cs_sptr( new direct_resampler_conditioner_cs(sample_freq_in, sample_freq_out)); } direct_resampler_conditioner_cs::direct_resampler_conditioner_cs( double sample_freq_in, double sample_freq_out) : gr::block("direct_resampler_make_conditioner_cs", gr::io_signature::make(1, 1, sizeof(lv_16sc_t)), gr::io_signature::make(1, 1, sizeof(lv_16sc_t))), d_sample_freq_in(sample_freq_in), d_sample_freq_out( sample_freq_out), d_phase(0), d_lphase(0), d_history(1) { const double two_32 = 4294967296.0; // Computes the phase step multiplying the resampling ratio by 2^32 = 4294967296 if (d_sample_freq_in >= d_sample_freq_out) { d_phase_step = static_cast(floor(two_32 * sample_freq_out / sample_freq_in)); } else { d_phase_step = static_cast(floor(two_32 * sample_freq_in / sample_freq_out)); } set_relative_rate(1.0 * sample_freq_out / sample_freq_in); set_output_multiple(1); } direct_resampler_conditioner_cs::~direct_resampler_conditioner_cs() { } void direct_resampler_conditioner_cs::forecast(int noutput_items, gr_vector_int &ninput_items_required) { int nreqd = std::max(static_cast(1), static_cast(static_cast(noutput_items + 1) * sample_freq_in() / sample_freq_out()) + history() - 1); unsigned ninputs = ninput_items_required.size(); for (unsigned i = 0; i < ninputs; i++) { ninput_items_required[i] = nreqd; } } int direct_resampler_conditioner_cs::general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { const lv_16sc_t *in = (const lv_16sc_t *)input_items[0]; lv_16sc_t *out = (lv_16sc_t *)output_items[0]; int lcv = 0; int count = 0; if (d_sample_freq_in >= d_sample_freq_out) { while ((lcv < noutput_items)) { if (d_phase <= d_lphase) { out[lcv] = *in; lcv++; } d_lphase = d_phase; d_phase += d_phase_step; in++; count++; } } else { while ((lcv < noutput_items)) { d_lphase = d_phase; d_phase += d_phase_step; if (d_phase <= d_lphase) { in++; count++; } out[lcv] = *in; lcv++; } } consume_each(std::min(count, ninput_items[0])); return lcv; } gnss-sdr-0.0.9/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cs.h000066400000000000000000000053631305042567700321560ustar00rootroot00000000000000/*! * \file direct_resampler_conditioner_cs.h * \brief Nearest neighborhood resampler with * std::complex input and std::complex output * \author Luis Esteve, 2011. luis(at)epsilon-formacion.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_DIRECT_RESAMPLER_CONDITIONER_CS_H #define GNSS_SDR_DIRECT_RESAMPLER_CONDITIONER_CS_H #include #include class direct_resampler_conditioner_cs; typedef boost::shared_ptr direct_resampler_conditioner_cs_sptr; direct_resampler_conditioner_cs_sptr direct_resampler_make_conditioner_cs(double sample_freq_in, double sample_freq_out); /*! * \brief This class implements a direct resampler conditioner for std::complex * * Direct resampling without interpolation */ class direct_resampler_conditioner_cs: public gr::block { private: friend direct_resampler_conditioner_cs_sptr direct_resampler_make_conditioner_cs(double sample_freq_in, double sample_freq_out); double d_sample_freq_in; double d_sample_freq_out; uint32_t d_phase; uint32_t d_lphase; uint32_t d_phase_step; unsigned int d_history; direct_resampler_conditioner_cs(double sample_freq_in, double sample_freq_out); public: ~direct_resampler_conditioner_cs(); unsigned int sample_freq_in() const { return d_sample_freq_in; } unsigned int sample_freq_out() const { return d_sample_freq_out; } void forecast(int noutput_items, gr_vector_int &ninput_items_required); int general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; #endif /* GNSS_SDR_DIRECT_RESAMPLER_CONDITIONER_CS_H */ gnss-sdr-0.0.9/src/algorithms/signal_generator/000077500000000000000000000000001305042567700215545ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/signal_generator/CMakeLists.txt000066400000000000000000000014331305042567700243150ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # add_subdirectory(adapters) add_subdirectory(gnuradio_blocks) gnss-sdr-0.0.9/src/algorithms/signal_generator/adapters/000077500000000000000000000000001305042567700233575ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/signal_generator/adapters/CMakeLists.txt000066400000000000000000000034601305042567700261220ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # set(SIGNAL_GENERATOR_ADAPTER_SOURCES signal_generator.cc) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/interfaces ${CMAKE_SOURCE_DIR}/src/core/receiver ${CMAKE_SOURCE_DIR}/src/algorithms/signal_generator/gnuradio_blocks ${CMAKE_SOURCE_DIR}/src/algorithms/libs ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ) file(GLOB SIGNAL_GENERATOR_ADAPTER_HEADERS "*.h") list(SORT SIGNAL_GENERATOR_ADAPTER_HEADERS) add_library(signal_generator_adapters ${SIGNAL_GENERATOR_ADAPTER_SOURCES} ${SIGNAL_GENERATOR_ADAPTER_HEADERS}) source_group(Headers FILES ${SIGNAL_GENERATOR_ADAPTER_HEADERS}) target_link_libraries(signal_generator_adapters gnss_sp_libs signal_generator_blocks ${GNURADIO_RUNTIME_LIBRARIES} ${GNURADIO_BLOCKS_LIBRARIES} ${GNURADIO_FILTER_LIBRARIES} ) gnss-sdr-0.0.9/src/algorithms/signal_generator/adapters/signal_generator.cc000066400000000000000000000152121305042567700272120ustar00rootroot00000000000000/*! * \file signal_generator.cc * \brief Adapter of a class that generates synthesized GNSS signal. * \author Marc Molina, 2013. marc.molina.pena@gmail.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "signal_generator.h" #include #include "configuration_interface.h" #include "Galileo_E1.h" #include "GPS_L1_CA.h" #include "Galileo_E5a.h" using google::LogMessage; SignalGenerator::SignalGenerator(ConfigurationInterface* configuration, std::string role, unsigned int in_stream, unsigned int out_stream, boost::shared_ptr queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(queue) { std::string default_item_type = "gr_complex"; std::string default_dump_file = "./data/gen_source.dat"; std::string default_system = "G"; std::string default_signal = "1C"; item_type_ = configuration->property(role + ".item_type", default_item_type); dump_ = configuration->property(role + ".dump", false); dump_filename_ = configuration->property(role + ".dump_filename", default_dump_file); unsigned int fs_in = configuration->property("SignalSource.fs_hz", 4e6); bool data_flag = configuration->property("SignalSource.data_flag", false); bool noise_flag = configuration->property("SignalSource.noise_flag", false); float BW_BB = configuration->property("SignalSource.BW_BB", 1.0); unsigned int num_satellites = configuration->property("SignalSource.num_satellites", 1); std::vector signal1; std::vector system; std::vector PRN; std::vector CN0_dB; std::vector doppler_Hz; std::vector delay_chips; std::vector delay_sec; for (unsigned int sat_idx = 0; sat_idx < num_satellites; sat_idx++) { std::string sat = std::to_string(sat_idx); signal1.push_back(configuration->property("SignalSource.signal_" + sat, default_signal)); system.push_back(configuration->property("SignalSource.system_" + sat, default_system)); PRN.push_back(configuration->property("SignalSource.PRN_" + sat, 1)); CN0_dB.push_back(configuration->property("SignalSource.CN0_dB_" + sat, 10)); doppler_Hz.push_back(configuration->property("SignalSource.doppler_Hz_" + sat, 0)); delay_chips.push_back(configuration->property("SignalSource.delay_chips_" + sat, 0)); delay_sec.push_back(configuration->property("SignalSource.delay_sec_" + sat, 0)); } // If Galileo signal is present -> vector duration = 100 ms (25 * 4 ms) // If there is only GPS signal (Galileo signal not present) -> vector duration = 1 ms unsigned int vector_length = 0; if (std::find(system.begin(), system.end(), "E") != system.end()) { if (signal1[0].at(0)=='5') { vector_length = round((float) fs_in / (Galileo_E5a_CODE_CHIP_RATE_HZ / Galileo_E5a_CODE_LENGTH_CHIPS)); } else { vector_length = round((float)fs_in / (Galileo_E1_CODE_CHIP_RATE_HZ / Galileo_E1_B_CODE_LENGTH_CHIPS)) * Galileo_E1_C_SECONDARY_CODE_LENGTH; } } else if (std::find(system.begin(), system.end(), "G") != system.end()) { vector_length = round((float)fs_in / (GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS)); } if (item_type_.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); DLOG(INFO) << "Item size " << item_size_; gen_source_ = signal_make_generator_c(signal1, system, PRN, CN0_dB, doppler_Hz, delay_chips, delay_sec, data_flag, noise_flag, fs_in, vector_length, BW_BB); vector_to_stream_ = gr::blocks::vector_to_stream::make(item_size_, vector_length); DLOG(INFO) << "vector_to_stream(" << vector_to_stream_->unique_id() << ")"; DLOG(INFO) << "gen_source(" << gen_source_->unique_id() << ")"; } else { LOG(WARNING) << item_type_ << " unrecognized item type for resampler"; item_size_ = sizeof(short); } if (dump_) { DLOG(INFO) << "Dumping output into file " << dump_filename_; file_sink_ = gr::blocks::file_sink::make(item_size_, dump_filename_.c_str()); } if (dump_) { DLOG(INFO) << "file_sink(" << file_sink_->unique_id() << ")"; } } SignalGenerator::~SignalGenerator() {} void SignalGenerator::connect(gr::top_block_sptr top_block) { if (item_type_.compare("gr_complex") == 0) { top_block->connect(gen_source_, 0, vector_to_stream_, 0); DLOG(INFO) << "connected gen_source to vector_to_stream"; if (dump_) { top_block->connect(vector_to_stream_, 0, file_sink_, 0); DLOG(INFO) << "connected vector_to_stream_ to file sink"; } } } void SignalGenerator::disconnect(gr::top_block_sptr top_block) { if (item_type_.compare("gr_complex") == 0) { top_block->disconnect(gen_source_, 0, vector_to_stream_, 0); if (dump_) { top_block->disconnect(vector_to_stream_, 0, file_sink_, 0); } } } gr::basic_block_sptr SignalGenerator::get_left_block() { LOG(WARNING) << "Left block of a signal source should not be retrieved"; return gr::block_sptr(); } gr::basic_block_sptr SignalGenerator::get_right_block() { return vector_to_stream_; } gnss-sdr-0.0.9/src/algorithms/signal_generator/adapters/signal_generator.h000066400000000000000000000052731305042567700270620ustar00rootroot00000000000000/*! * \file signal_generator.h * \brief Adapter of a class that generates synthesized GNSS signal. * \author Marc Molina, 2013. marc.molina.pena@gmail.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_SIGNAL_GENERATOR_H_ #define GNSS_SDR_SIGNAL_GENERATOR_H_ #include #include #include #include #include #include #include "gnss_block_interface.h" #include "signal_generator_c.h" class ConfigurationInterface; /*! * \brief This class generates synthesized GNSS signal. * */ class SignalGenerator: public GNSSBlockInterface { public: SignalGenerator(ConfigurationInterface* configuration, std::string role, unsigned int in_stream, unsigned int out_stream, boost::shared_ptr queue); virtual ~SignalGenerator(); std::string role() { return role_; } /*! * \brief Returns "GNSSSignalGenerator". */ std::string implementation() { return "GNSSSignalGenerator"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); private: std::string role_; unsigned int in_stream_; unsigned int out_stream_; std::string item_type_; size_t item_size_; bool dump_; std::string dump_filename_; boost::shared_ptr gen_source_; gr::blocks::vector_to_stream::sptr vector_to_stream_; gr::blocks::file_sink::sptr file_sink_; boost::shared_ptr queue_; }; #endif /*GNSS_SDR_SIGNAL_GENERATOR_H_*/ gnss-sdr-0.0.9/src/algorithms/signal_generator/gnuradio_blocks/000077500000000000000000000000001305042567700247215ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/signal_generator/gnuradio_blocks/CMakeLists.txt000066400000000000000000000036121305042567700274630ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # set(SIGNAL_GENERATOR_BLOCK_SOURCES signal_generator_c.cc) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/interfaces ${CMAKE_SOURCE_DIR}/src/core/receiver ${CMAKE_SOURCE_DIR}/src/algorithms/libs ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ${VOLK_GNSSSDR_INCLUDE_DIRS} ) file(GLOB SIGNAL_GENERATOR_BLOCK_HEADERS "*.h") list(SORT SIGNAL_GENERATOR_BLOCK_HEADERS) add_library(signal_generator_blocks ${SIGNAL_GENERATOR_BLOCK_SOURCES} ${SIGNAL_GENERATOR_BLOCK_HEADERS}) source_group(Headers FILES ${SIGNAL_GENERATOR_BLOCK_HEADERS}) target_link_libraries(signal_generator_blocks gnss_system_parameters gnss_sp_libs ${GNURADIO_RUNTIME_LIBRARIES} ${GNURADIO_FFT_LIBRARIES} ${VOLK_GNSSSDR_LIBRARIES} ${ORC_LIBRARIES} ) if(VOLK_GNSSSDR_FOUND) # add_dependencies(signal_generator_blocks glog-${glog_RELEASE}) else(VOLK_GNSSSDR_FOUND) add_dependencies(signal_generator_blocks volk_gnsssdr_module) endif()gnss-sdr-0.0.9/src/algorithms/signal_generator/gnuradio_blocks/signal_generator_c.cc000066400000000000000000000447061305042567700310700ustar00rootroot00000000000000/*! * \file signal_generator_c.cc * \brief GNU Radio source block that generates synthesized GNSS signal. * \author Marc Molina, 2013. marc.molina.pena@gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "signal_generator_c.h" #include #include #include #include //#include #include #include "gps_sdr_signal_processing.h" #include "galileo_e1_signal_processing.h" #include "galileo_e5_signal_processing.h" #include "Galileo_E1.h" #include "Galileo_E5a.h" #include "GPS_L1_CA.h" /* * Create a new instance of signal_generator_c and return * a boost shared_ptr. This is effectively the public constructor. */ signal_generator_c_sptr signal_make_generator_c (std::vector signal1, std::vector system, const std::vector &PRN, const std::vector &CN0_dB, const std::vector &doppler_Hz, const std::vector &delay_chips, const std::vector &delay_sec,bool data_flag, bool noise_flag, unsigned int fs_in, unsigned int vector_length, float BW_BB) { return gnuradio::get_initial_sptr(new signal_generator_c(signal1, system, PRN, CN0_dB, doppler_Hz, delay_chips,delay_sec, data_flag, noise_flag, fs_in, vector_length, BW_BB)); } /* * The private constructor */ signal_generator_c::signal_generator_c (std::vector signal1, std::vector system, const std::vector &PRN, const std::vector &CN0_dB, const std::vector &doppler_Hz, const std::vector &delay_chips,const std::vector &delay_sec ,bool data_flag, bool noise_flag, unsigned int fs_in, unsigned int vector_length, float BW_BB) : gr::block ("signal_gen_cc", gr::io_signature::make(0, 0, sizeof(gr_complex)), gr::io_signature::make(1, 1, sizeof(gr_complex) * vector_length)), signal_(signal1), system_(system), PRN_(PRN), CN0_dB_(CN0_dB), doppler_Hz_(doppler_Hz), delay_chips_(delay_chips), delay_sec_(delay_sec), data_flag_(data_flag), noise_flag_(noise_flag), fs_in_(fs_in), num_sats_(PRN.size()), vector_length_(vector_length), BW_BB_(BW_BB * static_cast(fs_in) / 2.0) { init(); generate_codes(); } void signal_generator_c::init() { work_counter_ = 0; complex_phase_ = static_cast(volk_gnsssdr_malloc(vector_length_ * sizeof(gr_complex), volk_gnsssdr_get_alignment())); // True if Galileo satellites are present bool galileo_signal = std::find(system_.begin(), system_.end(), "E") != system_.end(); for (unsigned int sat = 0; sat < num_sats_; sat++) { start_phase_rad_.push_back(0); current_data_bit_int_.push_back(1); current_data_bits_.push_back(gr_complex(1, 0)); ms_counter_.push_back(0); data_modulation_.push_back((Galileo_E5a_I_SECONDARY_CODE.at(0) == '0' ? 1 : -1)); pilot_modulation_.push_back((Galileo_E5a_Q_SECONDARY_CODE[PRN_[sat]].at(0) == '0' ? 1 : -1)); if (system_[sat] == "G") { samples_per_code_.push_back(round(static_cast(fs_in_) / (GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS))); num_of_codes_per_vector_.push_back(galileo_signal ? 4 * static_cast(Galileo_E1_C_SECONDARY_CODE_LENGTH) : 1); data_bit_duration_ms_.push_back(1e3 / GPS_CA_TELEMETRY_RATE_BITS_SECOND); } else if (system_[sat] == "E") { if (signal_[sat].at(0) == '5') { int codelen = static_cast(Galileo_E5a_CODE_LENGTH_CHIPS); samples_per_code_.push_back(round(static_cast(fs_in_) / (Galileo_E5a_CODE_CHIP_RATE_HZ / codelen))); num_of_codes_per_vector_.push_back(1); data_bit_duration_ms_.push_back(1e3/Galileo_E5a_SYMBOL_RATE_BPS); } else { samples_per_code_.push_back(round(static_cast(fs_in_) / (Galileo_E1_CODE_CHIP_RATE_HZ / Galileo_E1_B_CODE_LENGTH_CHIPS))); num_of_codes_per_vector_.push_back(static_cast(Galileo_E1_C_SECONDARY_CODE_LENGTH)); data_bit_duration_ms_.push_back(1e3 / Galileo_E1_B_SYMBOL_RATE_BPS); } } } random_ = new gr::random(); } void signal_generator_c::generate_codes() { sampled_code_data_.reset(new gr_complex*[num_sats_]); sampled_code_pilot_.reset(new gr_complex*[num_sats_]); for (unsigned int sat = 0; sat < num_sats_; sat++) { sampled_code_data_[sat] = static_cast(std::malloc(vector_length_ * sizeof(gr_complex))); gr_complex code[64000]; //[samples_per_code_[sat]]; if (system_[sat] == "G") { // Generate one code-period of 1C signal gps_l1_ca_code_gen_complex_sampled(code, PRN_[sat], fs_in_, static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS) - delay_chips_[sat]); // Obtain the desired CN0 assuming that Pn = 1. if (noise_flag_) { for (unsigned int i = 0; i < samples_per_code_[sat]; i++) { code[i] *= sqrt(pow(10,CN0_dB_[sat] / 10) / BW_BB_); } } // Concatenate "num_of_codes_per_vector_" codes for (unsigned int i = 0; i < num_of_codes_per_vector_[sat]; i++) { memcpy(&(sampled_code_data_[sat][i * samples_per_code_[sat]]), code, sizeof(gr_complex) * samples_per_code_[sat]); } } else if (system_[sat] == "E") { if(signal_[sat].at(0) == '5') { char signal[3]; strcpy(signal, "5X"); galileo_e5_a_code_gen_complex_sampled(sampled_code_data_[sat] , signal, PRN_[sat], fs_in_, static_cast(Galileo_E5a_CODE_LENGTH_CHIPS) - delay_chips_[sat]); //noise if (noise_flag_) { for (unsigned int i = 0; i < vector_length_; i++) { sampled_code_data_[sat][i] *= sqrt(pow(10, CN0_dB_[sat] / 10) / BW_BB_ / 2); } } } else { // Generate one code-period of E1B signal bool cboc = true; char signal[3]; strcpy(signal, "1B"); galileo_e1_code_gen_complex_sampled(code, signal, cboc, PRN_[sat], fs_in_, static_cast(Galileo_E1_B_CODE_LENGTH_CHIPS) - delay_chips_[sat]); // Obtain the desired CN0 assuming that Pn = 1. if (noise_flag_) { for (unsigned int i = 0; i < samples_per_code_[sat]; i++) { code[i] *= sqrt(pow(10, CN0_dB_[sat] / 10) / BW_BB_ / 2); } } // Concatenate "num_of_codes_per_vector_" codes for (unsigned int i = 0; i < num_of_codes_per_vector_[sat]; i++) { memcpy(&(sampled_code_data_[sat][i * samples_per_code_[sat]]), code, sizeof(gr_complex) * samples_per_code_[sat]); } // Generate E1C signal (25 code-periods, with secondary code) sampled_code_pilot_[sat] = static_cast(std::malloc(vector_length_ * sizeof(gr_complex))); strcpy(signal, "1C"); galileo_e1_code_gen_complex_sampled(sampled_code_pilot_[sat], signal, cboc, PRN_[sat], fs_in_, static_cast(Galileo_E1_B_CODE_LENGTH_CHIPS) - delay_chips_[sat], true); // Obtain the desired CN0 assuming that Pn = 1. if (noise_flag_) { for (unsigned int i = 0; i < vector_length_; i++) { sampled_code_pilot_[sat][i] *= sqrt(pow(10, CN0_dB_[sat] / 10) / BW_BB_ / 2); } } } } } } signal_generator_c::~signal_generator_c() { /* for (unsigned int sat = 0; sat < num_sats_; sat++) { std::free(sampled_code_data_[sat]); if (system_[sat] == "E" && signal_[sat].at(0) != '5') { std::free(sampled_code_pilot_[sat]); } } */ volk_gnsssdr_free(complex_phase_); delete random_; } int signal_generator_c::general_work (int noutput_items __attribute__((unused)), gr_vector_int &ninput_items __attribute__((unused)), gr_vector_const_void_star &input_items __attribute__((unused)), gr_vector_void_star &output_items) { gr_complex *out = (gr_complex *) output_items[0]; work_counter_++; unsigned int out_idx = 0; unsigned int i = 0; unsigned int k = 0; for (out_idx = 0; out_idx < vector_length_; out_idx++) { out[out_idx] = gr_complex(0.0,0.0); } for (unsigned int sat = 0; sat < num_sats_; sat++) { float phase_step_rad = -static_cast(GPS_TWO_PI) * doppler_Hz_[sat] / static_cast(fs_in_); float _phase[1]; _phase[0] = -start_phase_rad_[sat]; volk_gnsssdr_s32f_sincos_32fc(complex_phase_, -phase_step_rad, _phase, vector_length_); start_phase_rad_[sat] += vector_length_ * phase_step_rad; out_idx = 0; if (system_[sat] == "G") { unsigned int delay_samples = (delay_chips_[sat] % static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS)) * samples_per_code_[sat] / GPS_L1_CA_CODE_LENGTH_CHIPS; for (i = 0; i < num_of_codes_per_vector_[sat]; i++) { for (k = 0; k < delay_samples; k++) { out[out_idx] += sampled_code_data_[sat][out_idx] * current_data_bits_[sat] * complex_phase_[out_idx]; out_idx++; } if (ms_counter_[sat] == 0 && data_flag_) { // New random data bit current_data_bits_[sat] = gr_complex((rand() % 2) == 0 ? 1 : -1, 0); } for (k = delay_samples; k < samples_per_code_[sat]; k++) { out[out_idx] += sampled_code_data_[sat][out_idx] * current_data_bits_[sat] * complex_phase_[out_idx]; out_idx++; } ms_counter_[sat] = (ms_counter_[sat] + static_cast(round(1e3*GPS_L1_CA_CODE_PERIOD))) % data_bit_duration_ms_[sat]; } } else if (system_[sat] == "E") { if(signal_[sat].at(0)=='5') { // EACH WORK outputs 1 modulated primary code int codelen = static_cast(Galileo_E5a_CODE_LENGTH_CHIPS); unsigned int delay_samples = (delay_chips_[sat] % codelen) * samples_per_code_[sat] / codelen; for (k = 0; k < delay_samples; k++) { out[out_idx] += (gr_complex(sampled_code_data_[sat][out_idx].real()*data_modulation_[sat], sampled_code_data_[sat][out_idx].imag()*pilot_modulation_[sat]) ) * complex_phase_[out_idx]; out_idx++; } if (ms_counter_[sat]%data_bit_duration_ms_[sat] == 0 && data_flag_) { // New random data bit current_data_bit_int_[sat] = (rand()%2) == 0 ? 1 : -1; } data_modulation_[sat] = current_data_bit_int_[sat] * (Galileo_E5a_I_SECONDARY_CODE.at((ms_counter_[sat]+delay_sec_[sat]) % 20) == '0' ? 1 : -1); pilot_modulation_[sat] = (Galileo_E5a_Q_SECONDARY_CODE[PRN_[sat] - 1].at((ms_counter_[sat] + delay_sec_[sat]) % 100) == '0' ? 1 : -1); ms_counter_[sat] = ms_counter_[sat] + static_cast(round(1e3*GALILEO_E5a_CODE_PERIOD)); for (k = delay_samples; k < samples_per_code_[sat]; k++) { out[out_idx] += (gr_complex(sampled_code_data_[sat][out_idx].real() * data_modulation_[sat] , sampled_code_data_[sat][out_idx].imag() * pilot_modulation_[sat]) ) * complex_phase_[out_idx]; out_idx++; } } else { unsigned int delay_samples = (delay_chips_[sat] % static_cast(Galileo_E1_B_CODE_LENGTH_CHIPS)) * samples_per_code_[sat] / Galileo_E1_B_CODE_LENGTH_CHIPS; for (i = 0; i < num_of_codes_per_vector_[sat]; i++) { for (k = 0; k < delay_samples; k++) { out[out_idx] += (sampled_code_data_[sat][out_idx] * current_data_bits_[sat] - sampled_code_pilot_[sat][out_idx]) * complex_phase_[out_idx]; out_idx++; } if (ms_counter_[sat] == 0 && data_flag_) { // New random data bit current_data_bits_[sat] = gr_complex((rand() % 2) == 0 ? 1 : -1, 0); } for (k = delay_samples; k < samples_per_code_[sat]; k++) { out[out_idx] += (sampled_code_data_[sat][out_idx] * current_data_bits_[sat] - sampled_code_pilot_[sat][out_idx]) * complex_phase_[out_idx]; out_idx++; } ms_counter_[sat] = (ms_counter_[sat] + static_cast(round(1e3 * Galileo_E1_CODE_PERIOD))) % data_bit_duration_ms_[sat]; } } } } if (noise_flag_) { for (out_idx = 0; out_idx < vector_length_; out_idx++) { out[out_idx] += gr_complex(random_->gasdev(),random_->gasdev()); } } // Tell runtime system how many output items we produced. return 1; } gnss-sdr-0.0.9/src/algorithms/signal_generator/gnuradio_blocks/signal_generator_c.h000066400000000000000000000121341305042567700307200ustar00rootroot00000000000000/*! * \file signal_generator_c.h * \brief GNU Radio source block that generates synthesized GNSS signal. * \author Marc Molina, 2013. marc.molina.pena@gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_SIGNAL_GENERATOR_C_H #define GNSS_SDR_SIGNAL_GENERATOR_C_H #include #include #include #include #include #include "gnss_signal.h" class signal_generator_c; /* * We use boost::shared_ptr's instead of raw pointers for all access * to gr_blocks (and many other data structures). The shared_ptr gets * us transparent reference counting, which greatly simplifies storage * management issues. * * See http://www.boost.org/libs/smart_ptr/smart_ptr.htm * * As a convention, the _sptr suffix indicates a boost::shared_ptr */ typedef boost::shared_ptr signal_generator_c_sptr; /*! * \brief Return a shared_ptr to a new instance of gen_source. * * To avoid accidental use of raw pointers, gen_source's * constructor is private. signal_make_generator_c is the public * interface for creating new instances. */ signal_generator_c_sptr signal_make_generator_c (std::vector signal1, std::vector system, const std::vector &PRN, const std::vector &CN0_dB, const std::vector &doppler_Hz, const std::vector &delay_chips,const std::vector &delay_sec, bool data_flag, bool noise_flag, unsigned int fs_in, unsigned int vector_length, float BW_BB); /*! * \brief This class generates synthesized GNSS signal. * \ingroup block * * \sa gen_source for a version that subclasses gr_block. */ class signal_generator_c : public gr::block { private: // The friend declaration allows gen_source to // access the private constructor. /* Create the signal_generator_c object*/ friend signal_generator_c_sptr signal_make_generator_c (std::vector signal1, std::vector system, const std::vector &PRN, const std::vector &CN0_dB, const std::vector &doppler_Hz, const std::vector &delay_chips,const std::vector &delay_sec, bool data_flag, bool noise_flag, unsigned int fs_in, unsigned int vector_length, float BW_BB); signal_generator_c (std::vector signal1, std::vector system, const std::vector &PRN, const std::vector &CN0_dB, const std::vector &doppler_Hz, const std::vector &delay_chips,const std::vector &delay_sec, bool data_flag, bool noise_flag, unsigned int fs_in, unsigned int vector_length, float BW_BB); void init(); void generate_codes(); std::vector signal_; std::vector system_; std::vector PRN_; std::vector CN0_dB_; std::vector doppler_Hz_; std::vector delay_chips_; std::vector delay_sec_; bool data_flag_; bool noise_flag_; unsigned int fs_in_; unsigned int num_sats_; unsigned int vector_length_; float BW_BB_; std::vector samples_per_code_; std::vector num_of_codes_per_vector_; std::vector data_bit_duration_ms_; std::vector ms_counter_; std::vector start_phase_rad_; std::vector current_data_bits_; std::vector current_data_bit_int_; std::vector data_modulation_; std::vector pilot_modulation_; boost::scoped_array sampled_code_data_; boost::scoped_array sampled_code_pilot_; gr::random* random_; gr_complex* complex_phase_; unsigned int work_counter_; public: ~signal_generator_c(); // public destructor // Where all the action really happens int general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; #endif /* GNSS_SDR_SIGNAL_GENERATOR_C_H */ gnss-sdr-0.0.9/src/algorithms/signal_source/000077500000000000000000000000001305042567700210665ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/signal_source/CMakeLists.txt000066400000000000000000000014621305042567700236310ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # add_subdirectory(libs) add_subdirectory(adapters) add_subdirectory(gnuradio_blocks) gnss-sdr-0.0.9/src/algorithms/signal_source/adapters/000077500000000000000000000000001305042567700226715ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/signal_source/adapters/CMakeLists.txt000066400000000000000000000134751305042567700254430ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # # Optional drivers if(ENABLE_GN3S) ############################################## # GN3S (USB dongle) ############################################## find_package(GrGN3S REQUIRED) if(NOT GR_GN3S_FOUND) message(" gr-gn3s not found, install it from https://github.com/gnss-sdr/gr-gn3s ") message(FATAL_ERROR "gr-gn3s required for building gnss-sdr with this option enabled") endif(NOT GR_GN3S_FOUND) set(OPT_LIBRARIES ${OPT_LIBRARIES} ${GR_GN3S_LIBRARIES}) set(OPT_DRIVER_INCLUDE_DIRS ${OPT_DRIVER_INCLUDE_DIRS} ${GR_GN3S_INCLUDE_DIRS}) set(OPT_DRIVER_SOURCES ${OPT_DRIVER_SOURCES} gn3s_signal_source.cc) endif(ENABLE_GN3S) if(ENABLE_FLEXIBAND) ############################################## # TELEORBIT FLEXIBAND FRONTEND ADAPTER ############################################## find_package(Teleorbit REQUIRED) if(NOT TELEORBIT_FOUND) message(FATAL_ERROR "Teleorbit Flexiband GNU Radio driver required to build gnss-sdr with the optional FLEXIBAND adapter") endif(NOT TELEORBIT_FOUND) # Set up variables set(FLEXIBAND_DRIVER_INCLUDE_DIRS ${OPT_DRIVER_INCLUDE_DIRS} ${TELEORBIT_INCLUDE_DIR}/teleorbit ) set(OPT_LIBRARIES ${OPT_LIBRARIES} ${TELEORBIT_LIBRARIES}) set(OPT_DRIVER_INCLUDE_DIRS ${OPT_DRIVER_INCLUDE_DIRS} ${FLEXIBAND_DRIVER_INCLUDE_DIRS}) set(OPT_DRIVER_SOURCES ${OPT_DRIVER_SOURCES} flexiband_signal_source.cc) endif(ENABLE_FLEXIBAND) if(ENABLE_ARRAY) ############################################## # DBFCTTC GNSS EXPERIMENTAL ARRAY PROTOTYPE ############################################## find_package(GrDbfcttc REQUIRED) if(NOT GR_DBFCTTC_FOUND) message(" gr-dbfcttc not found, install it from https://github.com/gnss-sdr/gr-dbfcttc ") message(FATAL_ERROR "gr-dbfcttc required for building gnss-sdr with this option enabled") endif(NOT GR_DBFCTTC_FOUND) set(OPT_LIBRARIES ${OPT_LIBRARIES} ${GR_DBFCTTC_LIBRARIES}) set(OPT_DRIVER_INCLUDE_DIRS ${OPT_DRIVER_INCLUDE_DIRS} ${GR_DBFCTTC_INCLUDE_DIRS}) set(OPT_DRIVER_SOURCES ${OPT_DRIVER_SOURCES} raw_array_signal_source.cc) endif(ENABLE_ARRAY) if(ENABLE_OSMOSDR) ################################################################################ # OsmoSDR - http://sdr.osmocom.org/trac/ ################################################################################ find_package(GrOsmoSDR REQUIRED) if(NOT GROSMOSDR_FOUND) message(FATAL_ERROR "gr-osmosdr required to build gnss-sdr with the optional OSMOSDR driver") endif(NOT GROSMOSDR_FOUND) # set OSMO include dirs set(OSMO_DRIVER_INCLUDE_DIRS ${OPT_DRIVER_INCLUDE_DIRS} ${GROSMOSDR_INCLUDE_DIR}/osmosdr ) set(OPT_DRIVER_SOURCES ${OPT_DRIVER_SOURCES} osmosdr_signal_source.cc) set(OPT_LIBRARIES ${OPT_LIBRARIES} ${GROSMOSDR_LIBRARIES}) set(OPT_DRIVER_INCLUDE_DIRS ${OPT_DRIVER_INCLUDE_DIRS} ${OSMO_DRIVER_INCLUDE_DIRS}) endif(ENABLE_OSMOSDR) if(ENABLE_UHD) set(OPT_DRIVER_SOURCES ${OPT_DRIVER_SOURCES} uhd_signal_source.cc) set(OPT_LIBRARIES ${OPT_LIBRARIES} ${UHD_LIBRARIES} ${GNURADIO_UHD_LIBRARIES}) set(OPT_DRIVER_INCLUDE_DIRS ${OPT_DRIVER_INCLUDE_DIRS} ${UHD_INCLUDE_DIRS}) endif(ENABLE_UHD) set(SIGNAL_SOURCE_ADAPTER_SOURCES file_signal_source.cc gen_signal_source.cc nsr_file_signal_source.cc spir_file_signal_source.cc rtl_tcp_signal_source.cc ${OPT_DRIVER_SOURCES} ) if(PC_GNURADIO_RUNTIME_VERSION VERSION_GREATER 3.7.3) set(SIGNAL_SOURCE_ADAPTER_SOURCES ${SIGNAL_SOURCE_ADAPTER_SOURCES} two_bit_cpx_file_signal_source.cc two_bit_packed_file_signal_source.cc ) endif(PC_GNURADIO_RUNTIME_VERSION VERSION_GREATER 3.7.3) include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${OPT_DRIVER_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/interfaces ${CMAKE_SOURCE_DIR}/src/algorithms/libs ${CMAKE_SOURCE_DIR}/src/algorithms/signal_source/libs ${CMAKE_SOURCE_DIR}/src/algorithms/signal_source/gnuradio_blocks ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ${VOLK_INCLUDE_DIRS} ) if(ARCH_64BITS) add_definitions(-DARCH_64BITS=1) endif(ARCH_64BITS) add_definitions(-DGNSSSDR_INSTALL_DIR="${CMAKE_INSTALL_PREFIX}") file(GLOB SIGNAL_SOURCE_ADAPTER_HEADERS "*.h") list(SORT SIGNAL_SOURCE_ADAPTER_HEADERS) add_library(signal_source_adapters ${SIGNAL_SOURCE_ADAPTER_SOURCES} ${SIGNAL_SOURCE_ADAPTER_HEADERS}) source_group(Headers FILES ${SIGNAL_SOURCE_ADAPTER_HEADERS}) target_link_libraries(signal_source_adapters signal_source_gr_blocks ${Boost_LIBRARIES} ${GNURADIO_PMT_LIBRARIES} ${GNURADIO_BLOCKS_LIBRARIES} ${OPT_LIBRARIES} gnss_sp_libs ) gnss-sdr-0.0.9/src/algorithms/signal_source/adapters/file_signal_source.cc000066400000000000000000000342471305042567700270460ustar00rootroot00000000000000/*! * \file file_signal_source.cc * \brief Implementation of a class that reads signals samples from a file * and adapts it to a SignalSourceInterface * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Javier Arribas, 2011 jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "file_signal_source.h" #include #include #include #include #include #include #include #include #include "gnss_sdr_valve.h" #include "configuration_interface.h" using google::LogMessage; DEFINE_string(signal_source, "-", "If defined, path to the file containing the signal samples (overrides the configuration file)"); FileSignalSource::FileSignalSource(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams, boost::shared_ptr queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(queue) { std::string default_filename = "./example_capture.dat"; std::string default_item_type = "short"; std::string default_dump_filename = "./my_capture.dat"; double default_seconds_to_skip = 0.0; size_t header_size = 0; samples_ = configuration->property(role + ".samples", 0); sampling_frequency_ = configuration->property(role + ".sampling_frequency", 0); filename_ = configuration->property(role + ".filename", default_filename); // override value with commandline flag, if present if (FLAGS_signal_source.compare("-") != 0) filename_= FLAGS_signal_source; item_type_ = configuration->property(role + ".item_type", default_item_type); repeat_ = configuration->property(role + ".repeat", false); dump_ = configuration->property(role + ".dump", false); dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename); enable_throttle_control_ = configuration->property(role + ".enable_throttle_control", false); std::string s = "InputFilter"; //double IF = configuration->property(s + ".IF", 0.0); double seconds_to_skip = configuration->property(role + ".seconds_to_skip", default_seconds_to_skip ); header_size = configuration->property( role + ".header_size", 0 ); long samples_to_skip = 0; bool is_complex = false; if (item_type_.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); } else if (item_type_.compare("float") == 0) { item_size_ = sizeof(float); } else if (item_type_.compare("short") == 0) { item_size_ = sizeof(int16_t); } else if (item_type_.compare("ishort") == 0) { item_size_ = sizeof(int16_t); is_complex = true; } else if (item_type_.compare("byte") == 0) { item_size_ = sizeof(int8_t); } else if (item_type_.compare("ibyte") == 0) { item_size_ = sizeof(int8_t); is_complex = true; } else { LOG(WARNING) << item_type_ << " unrecognized item type. Using gr_complex."; item_size_ = sizeof(gr_complex); } try { file_source_ = gr::blocks::file_source::make(item_size_, filename_.c_str(), repeat_); if( seconds_to_skip > 0 ) { samples_to_skip = static_cast< long >( seconds_to_skip * sampling_frequency_ ); if( is_complex ) { samples_to_skip *= 2; } } if( header_size > 0 ) { samples_to_skip += header_size; } if( samples_to_skip > 0 ) { LOG(INFO) << "Skipping " << samples_to_skip << " samples of the input file"; if( not file_source_->seek( samples_to_skip, SEEK_SET ) ) { LOG(INFO) << "Error skipping bytes!"; } } } catch (const std::exception &e) { if (filename_.compare(default_filename) == 0) { std::cerr << "The configuration file has not been found." << std::endl << "Please create a configuration file based on the examples at the 'conf/' folder " << std::endl << "and then generate your own GNSS Software Defined Receiver by doing:" << std::endl << "$ gnss-sdr --config_file=/path/to/my_GNSS_SDR_configuration.conf" << std::endl; } else { std::cerr << "The receiver was configured to work with a file signal source " << std::endl << "but the specified file is unreachable by GNSS-SDR." << std::endl << "Please modify your configuration file" << std::endl << "and point SignalSource.filename to a valid raw data file. Then:" << std::endl << "$ gnss-sdr --config_file=/path/to/my_GNSS_SDR_configuration.conf" << std::endl << "Examples of configuration files available at:" << std::endl << GNSSSDR_INSTALL_DIR "/share/gnss-sdr/conf/" << std::endl; } LOG(INFO) << "file_signal_source: Unable to open the samples file " << filename_.c_str() << ", exiting the program."; throw(e); } DLOG(INFO) << "file_source(" << file_source_->unique_id() << ")"; if (samples_ == 0) // read all file { /*! * BUG workaround: The GNU Radio file source does not stop the receiver after reaching the End of File. * A possible solution is to compute the file length in samples using file size, excluding the last 100 milliseconds, and enable always the * valve block */ std::ifstream file (filename_.c_str(), std::ios::in | std::ios::binary | std::ios::ate); std::ifstream::pos_type size; if (file.is_open()) { size = file.tellg(); DLOG(INFO) << "Total samples in the file= " << floor(static_cast(size) / static_cast(item_size())); } else { std::cout << "file_signal_source: Unable to open the samples file " << filename_.c_str() << std::endl; LOG(ERROR) << "file_signal_source: Unable to open the samples file " << filename_.c_str(); } std::streamsize ss = std::cout.precision(); std::cout << std::setprecision(16); std::cout << "Processing file " << filename_ << ", which contains " << static_cast(size) << " [bytes]" << std::endl; std::cout.precision (ss); if (size > 0) { long bytes_to_skip = samples_to_skip*item_size_; long bytes_to_process = static_cast(size) - bytes_to_skip; samples_ = floor(static_cast(bytes_to_process) / static_cast(item_size()) - ceil(0.002 * static_cast(sampling_frequency_))); //process all the samples available in the file excluding at least the last 1 ms } } CHECK(samples_ > 0) << "File does not contain enough samples to process."; double signal_duration_s; signal_duration_s = static_cast(samples_) * ( 1 / static_cast(sampling_frequency_)); if( is_complex ) { signal_duration_s /= 2.0; } DLOG(INFO) << "Total number samples to be processed= " << samples_ << " GNSS signal duration= " << signal_duration_s << " [s]"; std::cout << "GNSS signal recorded time to be processed: " << signal_duration_s << " [s]" << std::endl; valve_ = gnss_sdr_make_valve(item_size_, samples_, queue_); DLOG(INFO) << "valve(" << valve_->unique_id() << ")"; if (dump_) { sink_ = gr::blocks::file_sink::make(item_size_, dump_filename_.c_str()); DLOG(INFO) << "file_sink(" << sink_->unique_id() << ")"; } if (enable_throttle_control_) { throttle_ = gr::blocks::throttle::make(item_size_, sampling_frequency_); } DLOG(INFO) << "File source filename " << filename_; DLOG(INFO) << "Samples " << samples_; DLOG(INFO) << "Sampling frequency " << sampling_frequency_; DLOG(INFO) << "Item type " << item_type_; DLOG(INFO) << "Item size " << item_size_; DLOG(INFO) << "Repeat " << repeat_; DLOG(INFO) << "Dump " << dump_; DLOG(INFO) << "Dump filename " << dump_filename_; } FileSignalSource::~FileSignalSource() {} void FileSignalSource::connect(gr::top_block_sptr top_block) { if (samples_ > 0) { if (enable_throttle_control_ == true) { top_block->connect(file_source_, 0, throttle_, 0); DLOG(INFO) << "connected file source to throttle"; top_block->connect(throttle_, 0, valve_, 0); DLOG(INFO) << "connected throttle to valve"; if (dump_) { top_block->connect(valve_, 0, sink_, 0); DLOG(INFO) << "connected valve to file sink"; } } else { top_block->connect(file_source_, 0, valve_, 0); DLOG(INFO) << "connected file source to valve"; if (dump_) { top_block->connect(valve_, 0, sink_, 0); DLOG(INFO) << "connected valve to file sink"; } } } else { if (enable_throttle_control_ == true) { top_block->connect(file_source_, 0, throttle_, 0); DLOG(INFO) << "connected file source to throttle"; if (dump_) { top_block->connect(file_source_, 0, sink_, 0); DLOG(INFO) << "connected file source to sink"; } } else { if (dump_) { top_block->connect(file_source_, 0, sink_, 0); DLOG(INFO) << "connected file source to sink"; } } } } void FileSignalSource::disconnect(gr::top_block_sptr top_block) { if (samples_ > 0) { if (enable_throttle_control_ == true) { top_block->disconnect(file_source_, 0, throttle_, 0); DLOG(INFO) << "disconnected file source to throttle"; top_block->disconnect(throttle_, 0, valve_, 0); DLOG(INFO) << "disconnected throttle to valve"; if (dump_) { top_block->disconnect(valve_, 0, sink_, 0); DLOG(INFO) << "disconnected valve to file sink"; } } else { top_block->disconnect(file_source_, 0, valve_, 0); DLOG(INFO) << "disconnected file source to valve"; if (dump_) { top_block->disconnect(valve_, 0, sink_, 0); DLOG(INFO) << "disconnected valve to file sink"; } } } else { if (enable_throttle_control_ == true) { top_block->disconnect(file_source_, 0, throttle_, 0); DLOG(INFO) << "disconnected file source to throttle"; if (dump_) { top_block->disconnect(file_source_, 0, sink_, 0); DLOG(INFO) << "disconnected file source to sink"; } } else { if (dump_) { top_block->disconnect(file_source_, 0, sink_, 0); DLOG(INFO) << "disconnected file source to sink"; } } } } gr::basic_block_sptr FileSignalSource::get_left_block() { LOG(WARNING) << "Left block of a signal source should not be retrieved"; return gr::blocks::file_source::sptr(); } gr::basic_block_sptr FileSignalSource::get_right_block() { if (samples_ > 0) { return valve_; } else { if (enable_throttle_control_ == true) { return throttle_; } else { return file_source_; } } } gnss-sdr-0.0.9/src/algorithms/signal_source/adapters/file_signal_source.h000066400000000000000000000066341305042567700267070ustar00rootroot00000000000000/*! * \file file_signal_source.h * \brief Interface of a class that reads signals samples from a file * and adapts it to a SignalSourceInterface * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * * This class represents a file signal source. Internally it uses a GNU Radio's * gr_file_source as a connector to the data. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_FILE_SIGNAL_SOURCE_H_ #define GNSS_SDR_FILE_SIGNAL_SOURCE_H_ #include #include #include #include #include #include #include "gnss_block_interface.h" class ConfigurationInterface; /*! * \brief Class that reads signals samples from a file * and adapts it to a SignalSourceInterface */ class FileSignalSource: public GNSSBlockInterface { public: FileSignalSource(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams, boost::shared_ptr queue); virtual ~FileSignalSource(); std::string role() { return role_; } /*! * \brief Returns "File_Signal_Source". */ std::string implementation() { return "File_Signal_Source"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); std::string filename() { return filename_; } std::string item_type() { return item_type_; } bool repeat() { return repeat_; } long sampling_frequency() { return sampling_frequency_; } long samples() { return samples_; } private: unsigned long long samples_; long sampling_frequency_; std::string filename_; std::string item_type_; bool repeat_; bool dump_; std::string dump_filename_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; gr::blocks::file_source::sptr file_source_; boost::shared_ptr valve_; gr::blocks::file_sink::sptr sink_; gr::blocks::throttle::sptr throttle_; boost::shared_ptr queue_; size_t item_size_; // Throttle control bool enable_throttle_control_; }; #endif /*GNSS_SDR_FILE_SIGNAL_SOURCE_H_*/ gnss-sdr-0.0.9/src/algorithms/signal_source/adapters/flexiband_signal_source.cc000066400000000000000000000127441305042567700300610ustar00rootroot00000000000000/*! * \file raw_array_signal_source.cc * \brief CTTC Experimental GNSS 8 channels array signal source * \author Javier Arribas, jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "flexiband_signal_source.h" #include #include #include #include #include "configuration_interface.h" using google::LogMessage; FlexibandSignalSource::FlexibandSignalSource(ConfigurationInterface* configuration, std::string role, unsigned int in_stream, unsigned int out_stream, gr::msg_queue::sptr queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(queue) { std::string default_item_type = "byte"; item_type_ = configuration->property(role + ".item_type", default_item_type); std::string default_firmware_file = "flexiband_I-1b.bit"; firmware_filename_ = configuration->property(role + ".firmware_file", default_firmware_file); gain1_ = configuration->property(role + ".gain1", 0); // check gain DAC values for Flexiband frontend! gain2_ = configuration->property(role + ".gain2", 0); // check gain DAC values for Flexiband frontend! gain3_ = configuration->property(role + ".gain3", 0); // check gain DAC values for Flexiband frontend! AGC_ = configuration->property(role + ".AGC", true); // enabled AGC by default flag_read_file = configuration->property(role + ".flag_read_file", false); //disable read samples from file by default std::string default_signal_file = "flexiband_frame_samples.bin"; signal_file = configuration->property(role + ".signal_file", default_signal_file); usb_packet_buffer_size_ = configuration->property(role + ".usb_packet_buffer", 128); RF_channels_ = configuration->property(role + ".RF_channels", 1); if (item_type_.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); flexiband_source_ = gr::teleorbit::frontend::make(firmware_filename_.c_str(), gain1_, gain2_, gain3_, AGC_, usb_packet_buffer_size_, signal_file.c_str(), flag_read_file); //create I, Q -> gr_complex type conversion blocks for (int n = 0; n < (RF_channels_ * 2); n++) { char_to_float.push_back(gr::blocks::char_to_float::make()); } for (int n = 0; n < RF_channels_; n++) { float_to_complex_.push_back(gr::blocks::float_to_complex::make()); } DLOG(INFO) << "Item size " << item_size_; DLOG(INFO) << "Firmware file " << firmware_filename_; DLOG(INFO) << "flexiband_source_(" << flexiband_source_->unique_id() << ")"; } else { LOG(WARNING) << item_type_ << " unrecognized item type for flexiband_source_"; item_size_ = sizeof(gr_complex); } } FlexibandSignalSource::~FlexibandSignalSource() {} void FlexibandSignalSource::connect(gr::top_block_sptr top_block) { for (int n = 0; n < (RF_channels_ * 2); n++) { top_block->connect(flexiband_source_, n, char_to_float.at(n), 0); DLOG(INFO) << "connected flexiband_source_ to char_to_float CH" << n; } for (int n = 0; n < RF_channels_; n++) { top_block->connect(char_to_float.at(n * 2), 0, float_to_complex_.at(n), 0); top_block->connect(char_to_float.at(n * 2 + 1), 0, float_to_complex_.at(n), 1); DLOG(INFO) << "connected char_to_float to float_to_complex_ CH" << n; } } void FlexibandSignalSource::disconnect(gr::top_block_sptr top_block) { for (int n = 0; n < (RF_channels_ * 2); n++) { top_block->disconnect(flexiband_source_, n, char_to_float.at(n), 0); DLOG(INFO) << "disconnect flexiband_source_ to char_to_float CH" << n; } for (int n = 0; n < RF_channels_; n++) { top_block->disconnect(char_to_float.at(n * 2), 0, float_to_complex_.at(n), 0); top_block->disconnect(char_to_float.at(n * 2 + 1), 0, float_to_complex_.at(n), 1); DLOG(INFO) << "disconnect char_to_float to float_to_complex_ CH" << n; } } gr::basic_block_sptr FlexibandSignalSource::get_left_block() { LOG(WARNING) << "Left block of a signal source should not be retrieved"; return gr::block_sptr(); } gr::basic_block_sptr FlexibandSignalSource::get_right_block() { return get_right_block(0); } gr::basic_block_sptr FlexibandSignalSource::get_right_block(int RF_channel) { return float_to_complex_.at(RF_channel); } gnss-sdr-0.0.9/src/algorithms/signal_source/adapters/flexiband_signal_source.h000066400000000000000000000062421305042567700277170ustar00rootroot00000000000000/*! * \file raw_array_signal_source.h * \brief Signal Source adapter for the Teleorbit Flexiband front-end device. * This adapter requires a Flexiband GNURadio driver installed (not included with GNSS-SDR) * \author Javier Arribas, jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 FLEXIBAND_SIGNAL_SOURCE_H_ #define FLEXIBAND_SIGNAL_SOURCE_H_ #include #include #include #include #include #include #include #include "gnss_block_interface.h" class ConfigurationInterface; /*! * \brief This class configures and reads samples from Teleorbit Flexiband front-end. * This software requires a Flexiband GNU Radio driver installed (not included with GNSS-SDR). */ class FlexibandSignalSource: public GNSSBlockInterface { public: FlexibandSignalSource(ConfigurationInterface* configuration, std::string role, unsigned int in_stream, unsigned int out_stream, gr::msg_queue::sptr queue); virtual ~FlexibandSignalSource(); std::string role() { return role_; } /*! * \brief Returns "Flexiband_Signal_Source". */ std::string implementation() { return "Flexiband_Signal_Source"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); gr::basic_block_sptr get_right_block(int RF_channel); private: std::string role_; unsigned int in_stream_; unsigned int out_stream_; std::string item_type_; size_t item_size_; std::string firmware_filename_; int gain1_; int gain2_; int gain3_; int usb_packet_buffer_size_; bool AGC_; std::string signal_file; bool flag_read_file; int RF_channels_; gr::block_sptr flexiband_source_; std::vector> char_to_float; std::vector> float_to_complex_; boost::shared_ptr queue_; }; #endif /*FLEXIBAND_SIGNAL_SOURCE_H_*/ gnss-sdr-0.0.9/src/algorithms/signal_source/adapters/gen_signal_source.cc000066400000000000000000000056551305042567700267010ustar00rootroot00000000000000/*! * \file gen_signal_source.cc * \brief It wraps blocks that generates synthesized GNSS signal and filters * it. * \author Marc Molina, 2013. marc.molina.pena@gmail.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gen_signal_source.h" #include #include #include #include #include #include #include using google::LogMessage; // Constructor GenSignalSource::GenSignalSource(GNSSBlockInterface *signal_generator, GNSSBlockInterface *filter, std::string role, boost::shared_ptr queue) : signal_generator_(signal_generator), filter_(filter), role_(role), queue_(queue) { connected_ = false; } // Destructor GenSignalSource::~GenSignalSource() { delete signal_generator_; delete filter_; } void GenSignalSource::connect(gr::top_block_sptr top_block) { if (connected_) { LOG(WARNING) << "Signal conditioner already connected internally"; return; } signal_generator_->connect(top_block); filter_->connect(top_block); top_block->connect(signal_generator_->get_right_block(), 0, filter_->get_left_block(), 0); DLOG(INFO) << "signal_generator -> filter"; connected_ = true; } void GenSignalSource::disconnect(gr::top_block_sptr top_block) { if (!connected_) { LOG(WARNING) << "Signal conditioner already disconnected internally"; return; } top_block->disconnect(signal_generator_->get_right_block(), 0, filter_->get_left_block(), 0); signal_generator_->disconnect(top_block); filter_->disconnect(top_block); connected_ = false; } gr::basic_block_sptr GenSignalSource::get_left_block() { return signal_generator_->get_left_block(); } gr::basic_block_sptr GenSignalSource::get_right_block() { return filter_->get_right_block(); } gnss-sdr-0.0.9/src/algorithms/signal_source/adapters/gen_signal_source.h000066400000000000000000000046041305042567700265340ustar00rootroot00000000000000/*! * \file gen_signal_source.h * \brief It wraps blocks that generates synthesized GNSS signal and filters * it. * \author Marc Molina, 2013. marc.molina.pena@gmail.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GEN_SIGNAL_SOURCE_H_ #define GNSS_SDR_GEN_SIGNAL_SOURCE_H_ #include #include #include "gnss_block_interface.h" /*! * \brief This class wraps blocks that generates synthesized GNSS signal and * filters the signal. */ class GenSignalSource: public GNSSBlockInterface { public: //! Constructor GenSignalSource(GNSSBlockInterface *signal_generator, GNSSBlockInterface *filter, std::string role, boost::shared_ptr queue); //! Virtual destructor virtual ~GenSignalSource(); void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); std::string role(){ return role_; } //! Returns "Signal Source" std::string implementation(){ return "Signal Source"; } size_t item_size(){ return 0; } GNSSBlockInterface *signal_generator(){ return signal_generator_; } private: GNSSBlockInterface *signal_generator_; GNSSBlockInterface *filter_; std::string role_; std::string implementation_; bool connected_; boost::shared_ptr queue_; }; #endif /*GNSS_SDR_GEN_SIGNAL_SOURCE_H*/ gnss-sdr-0.0.9/src/algorithms/signal_source/adapters/gn3s_signal_source.cc000066400000000000000000000074031305042567700267730ustar00rootroot00000000000000/*! * \file gn3s_signal_source.cc * \brief GN3S USB dongle GPS RF front-end signal sampler driver * \author Javier Arribas, jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gn3s_signal_source.h" #include #include #include #include #include #include "configuration_interface.h" using google::LogMessage; Gn3sSignalSource::Gn3sSignalSource(ConfigurationInterface* configuration, std::string role, unsigned int in_stream, unsigned int out_stream, gr::msg_queue::sptr queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(queue) { std::string default_item_type = "short"; std::string default_dump_file = "./data/gn3s_source.dat"; item_type_ = configuration->property(role + ".item_type", default_item_type); dump_ = configuration->property(role + ".dump", false); dump_filename_ = configuration->property(role + ".dump_filename", default_dump_file); if (item_type_.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); gn3s_source_ = gn3s_make_source_cc(); DLOG(INFO) << "Item size " << item_size_; DLOG(INFO) << "gn3s_source(" << gn3s_source_->unique_id() << ")"; } // else if (item_type_.compare("short") == 0) // { // item_size_ = sizeof(short); // resampler_ = direct_resampler_make_conditioner_ss(sample_freq_in_, // sample_freq_out_); // } else { LOG(WARNING) << item_type_ << " unrecognized item type for resampler"; item_size_ = sizeof(short); } if (dump_) { DLOG(INFO) << "Dumping output into file " << dump_filename_; file_sink_ = gr::blocks::file_sink::make(item_size_, dump_filename_.c_str()); } if (dump_) { DLOG(INFO) << "file_sink(" << file_sink_->unique_id() << ")"; } } Gn3sSignalSource::~Gn3sSignalSource() {} void Gn3sSignalSource::connect(gr::top_block_sptr top_block) { if (dump_) { top_block->connect(gn3s_source_, 0, file_sink_, 0); DLOG(INFO) << "connected gn3s_source to file sink"; } else { DLOG(INFO) << "nothing to connect internally"; } } void Gn3sSignalSource::disconnect(gr::top_block_sptr top_block) { if (dump_) { top_block->disconnect(gn3s_source_, 0, file_sink_, 0); } } gr::basic_block_sptr Gn3sSignalSource::get_left_block() { LOG(WARNING) << "Left block of a signal source should not be retrieved"; return gr::block_sptr(); } gr::basic_block_sptr Gn3sSignalSource::get_right_block() { return gn3s_source_; } gnss-sdr-0.0.9/src/algorithms/signal_source/adapters/gn3s_signal_source.h000066400000000000000000000050361305042567700266350ustar00rootroot00000000000000/*! * \file gn3s_signal_source.h * \brief GN3S USB dongle GPS RF front-end signal sampler driver * \author Javier Arribas, jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 GN3S_SIGNAL_SOURCE_H_ #define GN3S_SIGNAL_SOURCE_H_ #include #include #include #include #include "gnss_block_interface.h" class ConfigurationInterface; /*! * \brief This class reads samples from a GN3S USB dongle, a RF front-end signal sampler */ class Gn3sSignalSource: public GNSSBlockInterface { public: Gn3sSignalSource(ConfigurationInterface* configuration, std::string role, unsigned int in_stream, unsigned int out_stream, gr::msg_queue::sptr queue); virtual ~Gn3sSignalSource(); std::string role() { return role_; } /*! * \brief Returns "Gn3sSignalSource". */ std::string implementation() { return "Gn3sSignalSource"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); private: std::string role_; unsigned int in_stream_; unsigned int out_stream_; std::string item_type_; size_t item_size_; long samples_; bool dump_; std::string dump_filename_; gr::block_sptr gn3s_source_; gr::blocks::file_sink::sptr file_sink_; boost::shared_ptr queue_; }; #endif /*GN3S_SIGNAL_SOURCE_H_*/ gnss-sdr-0.0.9/src/algorithms/signal_source/adapters/nsr_file_signal_source.cc000066400000000000000000000312501305042567700277170ustar00rootroot00000000000000/*! * \file nsr_file_signal_source.cc * \brief Implementation of a class that reads signals samples from a NSR 2 bits sampler front-end file * and adapts it to a SignalSourceInterface. More information about the front-end here * http://www.ifen.com/products/sx-scientific-gnss-solutions/nsr-software-receiver.html * \author Javier Arribas, 2013 jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "nsr_file_signal_source.h" #include #include #include #include #include #include #include #include "gnss_sdr_valve.h" #include "configuration_interface.h" using google::LogMessage; DEFINE_string(nsr_signal_source, "-", "If defined, path to the file containing the NSR (byte to 2-bit packed) signal samples (overrides the configuration file)"); NsrFileSignalSource::NsrFileSignalSource(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams, boost::shared_ptr queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(queue) { std::string default_filename = "../data/my_capture.dat"; std::string default_item_type = "byte"; std::string default_dump_filename = "../data/my_capture_dump.dat"; samples_ = configuration->property(role + ".samples", 0); sampling_frequency_ = configuration->property(role + ".sampling_frequency", 0); filename_ = configuration->property(role + ".filename", default_filename); // override value with commandline flag, if present if (FLAGS_nsr_signal_source.compare("-") != 0) filename_= FLAGS_nsr_signal_source; item_type_ = configuration->property(role + ".item_type", default_item_type); repeat_ = configuration->property(role + ".repeat", false); dump_ = configuration->property(role + ".dump", false); dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename); enable_throttle_control_ = configuration->property(role + ".enable_throttle_control", false); if (item_type_.compare("byte") == 0) { item_size_ = sizeof(char); } else { LOG(WARNING) << item_type_ << " unrecognized item type. Using byte."; item_size_ = sizeof(char); } try { file_source_ = gr::blocks::file_source::make(item_size_, filename_.c_str(), repeat_); unpack_byte_ = make_unpack_byte_2bit_samples(); } catch (const std::exception &e) { std::cerr << "The receiver was configured to work with a file signal source " << std::endl << "but the specified file is unreachable by GNSS-SDR." << std::endl << "Please modify your configuration file" << std::endl << "and point SignalSource.filename to a valid raw data file. Then:" << std::endl << "$ gnss-sdr --config_file=/path/to/my_GNSS_SDR_configuration.conf" << std::endl << "Examples of configuration files available at:" << std::endl << GNSSSDR_INSTALL_DIR "/share/gnss-sdr/conf/" << std::endl; LOG(WARNING) << "file_signal_source: Unable to open the samples file " << filename_.c_str() << ", exiting the program."; throw(e); } DLOG(INFO) << "file_source(" << file_source_->unique_id() << ")"; if (samples_ == 0) // read all file { /*! * BUG workaround: The GNU Radio file source does not stop the receiver after reaching the End of File. * A possible solution is to compute the file length in samples using file size, excluding the last 2 milliseconds, and enable always the * valve block */ std::ifstream file (filename_.c_str(), std::ios::in | std::ios::binary | std::ios::ate); std::ifstream::pos_type size; if (file.is_open()) { size = file.tellg(); LOG(INFO) << "Total samples in the file= " << floor((double)size / (double)item_size()); } else { std::cout << "file_signal_source: Unable to open the samples file " << filename_.c_str() << std::endl; LOG(ERROR) << "file_signal_source: Unable to open the samples file " << filename_.c_str(); } std::streamsize ss = std::cout.precision(); std::cout << std::setprecision(16); std::cout << "Processing file " << filename_ << ", which contains " << (double)size << " [bytes]" << std::endl; std::cout.precision (ss); if (size > 0) { int sample_packet_factor = 4; // 1 byte -> 4 samples samples_ = floor((double)size / (double)item_size())*sample_packet_factor; samples_ = samples_- ceil(0.002 * (double)sampling_frequency_); //process all the samples available in the file excluding the last 2 ms } } CHECK(samples_ > 0) << "File does not contain enough samples to process."; double signal_duration_s; signal_duration_s = (double)samples_ * ( 1 /(double)sampling_frequency_); LOG(INFO) << "Total number samples to be processed= " << samples_ << " GNSS signal duration= " << signal_duration_s << " [s]"; std::cout << "GNSS signal recorded time to be processed: " << signal_duration_s << " [s]" << std::endl; valve_ = gnss_sdr_make_valve(sizeof(float), samples_, queue_); DLOG(INFO) << "valve(" << valve_->unique_id() << ")"; if (dump_) { //sink_ = gr_make_file_sink(item_size_, dump_filename_.c_str()); sink_ = gr::blocks::file_sink::make(sizeof(float), dump_filename_.c_str()); DLOG(INFO) << "file_sink(" << sink_->unique_id() << ")"; } if (enable_throttle_control_) { throttle_ = gr::blocks::throttle::make(sizeof(float), sampling_frequency_); } DLOG(INFO) << "File source filename " << filename_; DLOG(INFO) << "Samples " << samples_; DLOG(INFO) << "Sampling frequency " << sampling_frequency_; DLOG(INFO) << "Item type " << item_type_; DLOG(INFO) << "Item size " << item_size_; DLOG(INFO) << "Repeat " << repeat_; DLOG(INFO) << "Dump " << dump_; DLOG(INFO) << "Dump filename " << dump_filename_; } NsrFileSignalSource::~NsrFileSignalSource() {} void NsrFileSignalSource::connect(gr::top_block_sptr top_block) { if (samples_ > 0) { if (enable_throttle_control_ == true) { top_block->connect(file_source_, 0, unpack_byte_, 0); top_block->connect(unpack_byte_, 0,throttle_,0); DLOG(INFO) << "connected file source to throttle"; top_block->connect(throttle_, 0, valve_, 0); DLOG(INFO) << "connected throttle to valve"; if (dump_) { top_block->connect(valve_, 0, sink_, 0); DLOG(INFO) << "connected valve to file sink"; } } else { top_block->connect(file_source_, 0, unpack_byte_, 0); top_block->connect(unpack_byte_, 0,valve_,0); DLOG(INFO) << "connected file source to valve"; if (dump_) { top_block->connect(valve_, 0, sink_, 0); DLOG(INFO) << "connected valve to file sink"; } } } else { if (enable_throttle_control_ == true) { top_block->connect(file_source_, 0, unpack_byte_, 0); top_block->connect(unpack_byte_, 0,throttle_,0); DLOG(INFO) << "connected file source to throttle"; if (dump_) { top_block->connect(throttle_, 0, sink_, 0); DLOG(INFO) << "connected file source to sink"; } } else { if (dump_) { top_block->connect(file_source_, 0, unpack_byte_, 0); top_block->connect(unpack_byte_, 0, sink_, 0); DLOG(INFO) << "connected file source to sink"; } } } } void NsrFileSignalSource::disconnect(gr::top_block_sptr top_block) { if (samples_ > 0) { if (enable_throttle_control_ == true) { top_block->disconnect(file_source_, 0, unpack_byte_, 0); DLOG(INFO) << "disconnected file source to unpack_byte_"; top_block->connect(unpack_byte_, 0,throttle_,0); DLOG(INFO) << "disconnected unpack_byte_ to throttle_"; top_block->disconnect(throttle_, 0, valve_, 0); DLOG(INFO) << "disconnected throttle to valve"; if (dump_) { top_block->disconnect(valve_, 0, sink_, 0); DLOG(INFO) << "disconnected valve to file sink"; } } else { top_block->disconnect(file_source_, 0, unpack_byte_, 0); DLOG(INFO) << "disconnected file source to unpack_byte_"; top_block->disconnect(unpack_byte_, 0, valve_, 0); DLOG(INFO) << "disconnected unpack_byte_ to valve"; if (dump_) { top_block->disconnect(valve_, 0, sink_, 0); DLOG(INFO) << "disconnected valve to file sink"; } } } else { if (enable_throttle_control_ == true) { top_block->disconnect(file_source_, 0, unpack_byte_, 0); DLOG(INFO) << "disconnected file source to unpack_byte_"; top_block->disconnect(unpack_byte_, 0, throttle_, 0); DLOG(INFO) << "disconnected unpack_byte_ to throttle"; if (dump_) { top_block->disconnect(unpack_byte_, 0, sink_, 0); DLOG(INFO) << "disconnected funpack_byte_ to sink"; } } else { if (dump_) { top_block->disconnect(file_source_, 0, unpack_byte_, 0); DLOG(INFO) << "disconnected file source to unpack_byte_"; top_block->disconnect(unpack_byte_, 0, sink_, 0); DLOG(INFO) << "disconnected unpack_byte_ to sink"; } } } } gr::basic_block_sptr NsrFileSignalSource::get_left_block() { LOG(WARNING) << "Left block of a signal source should not be retrieved"; //return gr_block_sptr(); return gr::blocks::file_source::sptr(); } gr::basic_block_sptr NsrFileSignalSource::get_right_block() { if (samples_ > 0) { return valve_; } else { if (enable_throttle_control_ == true) { return throttle_; } else { return unpack_byte_; } } } gnss-sdr-0.0.9/src/algorithms/signal_source/adapters/nsr_file_signal_source.h000066400000000000000000000071341305042567700275650ustar00rootroot00000000000000/*! * \file nsr_file_signal_source.h * \brief Implementation of a class that reads signals samples from a NSR 2 bits sampler front-end file * and adapts it to a SignalSourceInterface. More information about the front-end here * http://www.ifen.com/products/sx-scientific-gnss-solutions/nsr-software-receiver.html * \author Javier Arribas, 2013 jarribas(at)cttc.es * * This class represents a file signal source. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_NSR_FILE_SIGNAL_SOURCE_H_ #define GNSS_SDR_NSR_FILE_SIGNAL_SOURCE_H_ #include #include #include #include #include #include #include "gnss_block_interface.h" #include "unpack_byte_2bit_samples.h" class ConfigurationInterface; /*! * \brief Class that reads signals samples from a file * and adapts it to a SignalSourceInterface */ class NsrFileSignalSource: public GNSSBlockInterface { public: NsrFileSignalSource(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams, boost::shared_ptr queue); virtual ~NsrFileSignalSource(); std::string role() { return role_; } /*! * \brief Returns "Nsr_File_Signal_Source". */ std::string implementation() { return "Nsr_File_Signal_Source"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); std::string filename() { return filename_; } std::string item_type() { return item_type_; } bool repeat() { return repeat_; } long sampling_frequency() { return sampling_frequency_; } long samples() { return samples_; } private: unsigned long long samples_; long sampling_frequency_; std::string filename_; std::string item_type_; bool repeat_; bool dump_; std::string dump_filename_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; gr::blocks::file_source::sptr file_source_; unpack_byte_2bit_samples_sptr unpack_byte_; boost::shared_ptr valve_; gr::blocks::file_sink::sptr sink_; gr::blocks::throttle::sptr throttle_; boost::shared_ptr queue_; size_t item_size_; // Throttle control bool enable_throttle_control_; }; #endif /*GNSS_SDR_NSR_FILE_SIGNAL_SOURCE_H_*/ gnss-sdr-0.0.9/src/algorithms/signal_source/adapters/osmosdr_signal_source.cc000066400000000000000000000170161305042567700276100ustar00rootroot00000000000000/*! * \file osmosdr_signal_source.cc * \brief Signal source for the Realtek RTL2832U USB dongle DVB-T receiver * (see http://sdr.osmocom.org/trac/wiki/rtl-sdr for more information) * \author Javier Arribas, 2012. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "osmosdr_signal_source.h" #include #include #include #include #include "configuration_interface.h" #include "gnss_sdr_valve.h" #include "GPS_L1_CA.h" using google::LogMessage; OsmosdrSignalSource::OsmosdrSignalSource(ConfigurationInterface* configuration, std::string role, unsigned int in_stream, unsigned int out_stream, boost::shared_ptr queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(queue) { // DUMP PARAMETERS std::string empty = ""; std::string default_dump_file = "./data/signal_source.dat"; std::string default_item_type = "gr_complex"; samples_ = configuration->property(role + ".samples", 0); dump_ = configuration->property(role + ".dump", false); dump_filename_ = configuration->property(role + ".dump_filename", default_dump_file); // OSMOSDR Driver parameters AGC_enabled_ = configuration->property(role + ".AGC_enabled", true); freq_ = configuration->property(role + ".freq", GPS_L1_FREQ_HZ); gain_ = configuration->property(role + ".gain", (double)40.0); rf_gain_ = configuration->property(role + ".rf_gain", (double)40.0); if_gain_ = configuration->property(role + ".if_gain", (double)40.0); sample_rate_ = configuration->property(role + ".sampling_frequency", (double)2.0e6); item_type_ = configuration->property(role + ".item_type", default_item_type); osmosdr_args_ = configuration->property(role + ".osmosdr_args", std::string( )); if (item_type_.compare("short") == 0) { item_size_ = sizeof(short); } else if (item_type_.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); // 1. Make the driver instance try { if (!osmosdr_args_.empty()) { std::cout << "OsmoSdr arguments: " << osmosdr_args_ << std::endl; LOG(INFO) << "OsmoSdr arguments: " << osmosdr_args_; } osmosdr_source_ = osmosdr::source::make(osmosdr_args_); } catch( boost::exception & e ) { DLOG(FATAL) << "Boost exception: " << boost::diagnostic_information(e); } // 2 set sampling rate osmosdr_source_->set_sample_rate(sample_rate_); std::cout << boost::format("Actual RX Rate: %f [SPS]...") % (osmosdr_source_->get_sample_rate()) << std::endl ; LOG(INFO) << boost::format("Actual RX Rate: %f [SPS]...") % (osmosdr_source_->get_sample_rate()); // 3. set rx frequency osmosdr_source_->set_center_freq(freq_); std::cout << boost::format("Actual RX Freq: %f [Hz]...") % (osmosdr_source_->get_center_freq()) << std::endl ; LOG(INFO) << boost::format("Actual RX Freq: %f [Hz]...") % (osmosdr_source_->get_center_freq()); // TODO: Assign the remnant IF from the PLL tune error std::cout << boost::format("PLL Frequency tune error %f [Hz]...") % (osmosdr_source_->get_center_freq() - freq_) ; LOG(INFO) << boost::format("PLL Frequency tune error %f [Hz]...") % (osmosdr_source_->get_center_freq() - freq_) ; // 4. set rx gain if (this->AGC_enabled_ == true) { osmosdr_source_->set_gain_mode(true); std::cout << "AGC enabled" << std::endl; LOG(INFO) << "AGC enabled"; } else { osmosdr_source_->set_gain_mode(false); osmosdr_source_->set_gain(gain_, 0); osmosdr_source_->set_if_gain(rf_gain_, 0); osmosdr_source_->set_bb_gain(if_gain_, 0); std::cout << boost::format("Actual RX Gain: %f dB...") % osmosdr_source_->get_gain() << std::endl; LOG(INFO) << boost::format("Actual RX Gain: %f dB...") % osmosdr_source_->get_gain(); } } else { LOG(WARNING) << item_type_ << " unrecognized item type. Using short."; item_size_ = sizeof(short); } if (samples_ != 0) { DLOG(INFO) << "Send STOP signal after " << samples_ << " samples"; valve_ = gnss_sdr_make_valve(item_size_, samples_, queue_); DLOG(INFO) << "valve(" << valve_->unique_id() << ")"; } if (dump_) { DLOG(INFO) << "Dumping output into file " << dump_filename_; file_sink_ = gr::blocks::file_sink::make(item_size_, dump_filename_.c_str()); DLOG(INFO) << "file_sink(" << file_sink_->unique_id() << ")"; } } OsmosdrSignalSource::~OsmosdrSignalSource() {} void OsmosdrSignalSource::connect(gr::top_block_sptr top_block) { if (samples_ != 0) { top_block->connect(osmosdr_source_, 0, valve_, 0); DLOG(INFO) << "connected osmosdr source to valve"; if (dump_) { top_block->connect(valve_, 0, file_sink_, 0); DLOG(INFO) << "connected valve to file sink"; } } else { if (dump_) { top_block->connect(osmosdr_source_, 0, file_sink_, 0); DLOG(INFO) << "connected osmosdr source to file sink"; } } } void OsmosdrSignalSource::disconnect(gr::top_block_sptr top_block) { if (samples_ != 0) { top_block->disconnect(osmosdr_source_, 0, valve_, 0); if (dump_) { top_block->disconnect(valve_, 0, file_sink_, 0); } } else { if (dump_) { top_block->disconnect(osmosdr_source_, 0, file_sink_, 0); } } } gr::basic_block_sptr OsmosdrSignalSource::get_left_block() { LOG(WARNING) << "Trying to get signal source left block."; return gr::basic_block_sptr(); } gr::basic_block_sptr OsmosdrSignalSource::get_right_block() { if (samples_ != 0) { return valve_; } else { return osmosdr_source_; } } gnss-sdr-0.0.9/src/algorithms/signal_source/adapters/osmosdr_signal_source.h000066400000000000000000000061521305042567700274510ustar00rootroot00000000000000/*! * \file osmosdr_signal_source.h * \brief Signal source wrapper for OsmoSDR-compatible front-ends, such as * HackRF or Realtek's RTL2832U-based USB dongle DVB-T receivers * (see http://sdr.osmocom.org/trac/wiki/rtl-sdr for more information) * \author Javier Arribas, 2012. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_OSMOSDR_SIGNAL_SOURCE_H_ #define GNSS_SDR_OSMOSDR_SIGNAL_SOURCE_H_ #include #include #include #include #include #include "gnss_block_interface.h" class ConfigurationInterface; /*! * \brief This class reads samples OsmoSDR-compatible front-ends, such as * HackRF or Realtek's RTL2832U-based USB dongle DVB-T receivers * (see http://sdr.osmocom.org/trac/wiki/rtl-sdr) */ class OsmosdrSignalSource: public GNSSBlockInterface { public: OsmosdrSignalSource(ConfigurationInterface* configuration, std::string role, unsigned int in_stream, unsigned int out_stream, boost::shared_ptr queue); virtual ~OsmosdrSignalSource(); std::string role() { return role_; } /*! * \brief Returns "Osmosdr_Signal_Source" */ std::string implementation() { return "Osmosdr_Signal_Source"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); private: std::string role_; // Front-end settings bool AGC_enabled_; double sample_rate_; unsigned int in_stream_; unsigned int out_stream_; double freq_; double gain_; double if_gain_; double rf_gain_; std::string item_type_; size_t item_size_; long samples_; bool dump_; std::string dump_filename_; osmosdr::source::sptr osmosdr_source_; std::string osmosdr_args_; boost::shared_ptr valve_; gr::blocks::file_sink::sptr file_sink_; boost::shared_ptr queue_; }; #endif /*GNSS_SDR_OSMOSDR_SIGNAL_SOURCE_H_*/ gnss-sdr-0.0.9/src/algorithms/signal_source/adapters/raw_array_signal_source.cc000066400000000000000000000111271305042567700301060ustar00rootroot00000000000000/*! * \file raw_array_signal_source.cc * \brief CTTC Experimental GNSS 8 channels array signal source * \author Javier Arribas, jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "raw_array_signal_source.h" #include #include #include #include #include "configuration_interface.h" using google::LogMessage; RawArraySignalSource::RawArraySignalSource(ConfigurationInterface* configuration, std::string role, unsigned int in_stream, unsigned int out_stream, gr::msg_queue::sptr queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(queue) { std::string default_item_type = "gr_complex"; std::string default_dump_file = "./data/raw_array_source.dat"; item_type_ = configuration->property(role + ".item_type", default_item_type); //dump_ = configuration->property(role + ".dump", false); //dump_filename_ = configuration->property(role + ".dump_filename", default_dump_file); dump_ = false; std::string default_ethernet_dev = "eth0"; eth_device_ = configuration->property(role + ".ethernet_dev", default_ethernet_dev); int channels_; channels_ = configuration->property(role + ".channels", 8); int snapshots_per_frame_; snapshots_per_frame_ = configuration->property(role + ".snapshots_per_frame", 80); int inter_frame_delay_; inter_frame_delay_ = configuration->property(role + ".inter_frame_delay", 10); int sampling_freq_; sampling_freq_ = configuration->property(role + ".sampling_freq", 5000000); if (item_type_.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); raw_array_source_ = gr::dbfcttc::raw_array::make(eth_device_.c_str(),channels_,snapshots_per_frame_,inter_frame_delay_,sampling_freq_); DLOG(INFO) << "Item size " << item_size_; DLOG(INFO) << "raw_array_source(" << raw_array_source_->unique_id() << ")"; } // else if (item_type_.compare("short") == 0) // { // item_size_ = sizeof(short); // resampler_ = direct_resampler_make_conditioner_ss(sample_freq_in_, // sample_freq_out_); // } else { LOG(WARNING) << item_type_ << " unrecognized item type for raw_array_source_"; item_size_ = sizeof(gr_complex); } if (dump_) { //TODO: multichannel recorder DLOG(INFO) << "Dumping output into file " << dump_filename_; file_sink_ = gr::blocks::file_sink::make(item_size_, dump_filename_.c_str()); } if (dump_) { DLOG(INFO) << "file_sink(" << file_sink_->unique_id() << ")"; } } RawArraySignalSource::~RawArraySignalSource() {} void RawArraySignalSource::connect(gr::top_block_sptr top_block) { if (dump_) { //TODO: multichannel recorder top_block->connect(raw_array_source_, 0, file_sink_, 0); DLOG(INFO) << "connected raw_array_source_ to file sink"; } else { DLOG(INFO) << "nothing to connect internally"; } } void RawArraySignalSource::disconnect(gr::top_block_sptr top_block) { if (dump_) { //TODO: multichannel recorder top_block->disconnect(raw_array_source_, 0, file_sink_, 0); } } gr::basic_block_sptr RawArraySignalSource::get_left_block() { LOG(WARNING) << "Left block of a signal source should not be retrieved"; return gr::block_sptr(); } gr::basic_block_sptr RawArraySignalSource::get_right_block() { return raw_array_source_; } gnss-sdr-0.0.9/src/algorithms/signal_source/adapters/raw_array_signal_source.h000066400000000000000000000051521305042567700277510ustar00rootroot00000000000000/*! * \file raw_array_signal_source.h * \brief CTTC Experimental GNSS 8 channels array signal source * \author Javier Arribas, jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 RAW_ARRAY_SIGNAL_SOURCE_H_ #define RAW_ARRAY_SIGNAL_SOURCE_H_ #include #include #include #include #include "gnss_block_interface.h" class ConfigurationInterface; /*! * \brief This class reads samples from a GN3S USB dongle, a RF front-end signal sampler */ class RawArraySignalSource: public GNSSBlockInterface { public: RawArraySignalSource(ConfigurationInterface* configuration, std::string role, unsigned int in_stream, unsigned int out_stream, gr::msg_queue::sptr queue); virtual ~RawArraySignalSource(); std::string role() { return role_; } /*! * \brief Returns "RawArraySignalSource". */ std::string implementation() { return "Raw_Array_Signal_Source"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); private: std::string role_; unsigned int in_stream_; unsigned int out_stream_; std::string item_type_; size_t item_size_; long samples_; bool dump_; std::string dump_filename_; std::string eth_device_; gr::block_sptr raw_array_source_; gr::blocks::file_sink::sptr file_sink_; boost::shared_ptr queue_; }; #endif /*RAW_ARRAY_SIGNAL_SOURCE_H_*/ gnss-sdr-0.0.9/src/algorithms/signal_source/adapters/rtl_tcp_signal_source.cc000066400000000000000000000155551305042567700275770ustar00rootroot00000000000000/*! * \file rtl_tcp_signal_source.cc * \brief Signal source for the Realtek RTL2832U USB dongle DVB-T receiver * over TCP. * (see http://sdr.osmocom.org/trac/wiki/rtl-sdr for more information) * \author Anthony Arnold, 2015. anthony.arnold(at)uqconnect.edu.au * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "rtl_tcp_signal_source.h" #include #include #include #include "configuration_interface.h" #include "gnss_sdr_valve.h" #include "GPS_L1_CA.h" using google::LogMessage; RtlTcpSignalSource::RtlTcpSignalSource(ConfigurationInterface* configuration, std::string role, unsigned int in_stream, unsigned int out_stream, boost::shared_ptr queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(queue) { // DUMP PARAMETERS std::string empty = ""; std::string default_dump_file = "./data/signal_source.dat"; std::string default_item_type = "gr_complex"; samples_ = configuration->property(role + ".samples", 0); dump_ = configuration->property(role + ".dump", false); dump_filename_ = configuration->property(role + ".dump_filename", default_dump_file); // rtl_tcp PARAMTERS std::string default_address = "127.0.0.1"; short default_port = 1234; AGC_enabled_ = configuration->property(role + ".AGC_enabled", true); freq_ = configuration->property(role + ".freq", GPS_L1_FREQ_HZ); gain_ = configuration->property(role + ".gain", (double)40.0); rf_gain_ = configuration->property(role + ".rf_gain", (double)40.0); if_gain_ = configuration->property(role + ".if_gain", (double)40.0); sample_rate_ = configuration->property(role + ".sampling_frequency", (double)2.0e6); item_type_ = configuration->property(role + ".item_type", default_item_type); address_ = configuration->property(role + ".address", default_address); port_ = configuration->property(role + ".port", default_port); flip_iq_ = configuration->property(role + ".flip_iq", false); if (item_type_.compare("short") == 0) { item_size_ = sizeof(short); } else if (item_type_.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); // 1. Make the gr block try { std::cout << "Connecting to " << address_ << ":" << port_ << std::endl; LOG (INFO) << "Connecting to " << address_ << ":" << port_; signal_source_ = rtl_tcp_make_signal_source_c (address_, port_, flip_iq_); } catch( boost::exception & e ) { DLOG(FATAL) << "Boost exception: " << boost::diagnostic_information(e); } // 2 set sampling rate signal_source_->set_sample_rate(sample_rate_); // 3. set rx frequency signal_source_->set_frequency(freq_); // 4. set rx gain signal_source_->set_agc_mode(true); if (this->AGC_enabled_ == true) { std::cout << "AGC enabled" << std::endl; LOG(INFO) << "AGC enabled"; signal_source_->set_agc_mode(true); } else { std::cout << "AGC disabled" << std::endl; LOG(INFO) << "AGC disabled"; signal_source_->set_agc_mode(false); std::cout << "Setting gain to " << gain_ << std::endl; LOG(INFO) << "Setting gain to " << gain_; signal_source_->set_gain(gain_); std::cout << "Setting IF gain to " << if_gain_ << std::endl; LOG(INFO) << "Setting IF gain to " << if_gain_; signal_source_->set_if_gain(if_gain_); } } else { LOG(WARNING) << item_type_ << " unrecognized item type. Using short."; item_size_ = sizeof(short); } if (samples_ != 0) { DLOG(INFO) << "Send STOP signal after " << samples_ << " samples"; valve_ = gnss_sdr_make_valve(item_size_, samples_, queue_); DLOG(INFO) << "valve(" << valve_->unique_id() << ")"; } if (dump_) { DLOG(INFO) << "Dumping output into file " << dump_filename_; file_sink_ = gr::blocks::file_sink::make(item_size_, dump_filename_.c_str()); DLOG(INFO) << "file_sink(" << file_sink_->unique_id() << ")"; } } RtlTcpSignalSource::~RtlTcpSignalSource() {} void RtlTcpSignalSource::connect(gr::top_block_sptr top_block) { if ( samples_ ) { top_block->connect (signal_source_, 0, valve_, 0); DLOG(INFO) << "connected rtl tcp source to valve"; if ( dump_ ) { top_block->connect(valve_, 0, file_sink_, 0); DLOG(INFO) << "connected valve to file sink"; } } else if ( dump_ ) { top_block->connect(signal_source_, 0, file_sink_, 0); DLOG(INFO) << "connected rtl tcp source to file sink"; } } void RtlTcpSignalSource::disconnect(gr::top_block_sptr top_block) { if ( samples_ ) { top_block->disconnect (signal_source_, 0, valve_, 0); if ( dump_ ) { top_block->disconnect(valve_, 0, file_sink_, 0); } } else if ( dump_ ) { top_block->disconnect(signal_source_, 0, file_sink_, 0); } } gr::basic_block_sptr RtlTcpSignalSource::get_left_block() { LOG(WARNING) << "Trying to get signal source left block."; return gr::basic_block_sptr(); } gr::basic_block_sptr RtlTcpSignalSource::get_right_block() { if (samples_ != 0) { return valve_; } else { return signal_source_; } } gnss-sdr-0.0.9/src/algorithms/signal_source/adapters/rtl_tcp_signal_source.h000066400000000000000000000061551305042567700274350ustar00rootroot00000000000000/*! * \file rtl_tcp_signal_source.h * \brief Signal source which reads from rtl_tcp. * (see http://sdr.osmocom.org/trac/wiki/rtl-sdr for more information) * \author Anthony Arnold, 2015. anthony.arnold(at)uqconnect.edu.au * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_RTL_TCP_SIGNAL_SOURCE_H #define GNSS_SDR_RTL_TCP_SIGNAL_SOURCE_H #include #include #include #include #include #include #include "rtl_tcp_signal_source_c.h" #include "gnss_block_interface.h" class ConfigurationInterface; /*! * \brief This class reads from rtl_tcp, which streams interleaved * I/Q samples over TCP. * (see http://sdr.osmocom.org/trac/wiki/rtl-sdr) */ class RtlTcpSignalSource: public GNSSBlockInterface { public: RtlTcpSignalSource(ConfigurationInterface* configuration, std::string role, unsigned int in_stream, unsigned int out_stream, boost::shared_ptr queue); virtual ~RtlTcpSignalSource(); std::string role() { return role_; } /*! * \brief Returns "RtlTcp_Signal_Source" */ std::string implementation() { return "RtlTcp_Signal_Source"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); private: std::string role_; // rtl_tcp settings std::string address_; short port_; bool AGC_enabled_; double sample_rate_; bool flip_iq_; unsigned int in_stream_; unsigned int out_stream_; double freq_; double gain_; double if_gain_; double rf_gain_; std::string item_type_; size_t item_size_; long samples_; bool dump_; std::string dump_filename_; rtl_tcp_signal_source_c_sptr signal_source_; boost::shared_ptr valve_; gr::blocks::file_sink::sptr file_sink_; boost::shared_ptr queue_; }; #endif /*GNSS_SDR_RTL_TCP_SIGNAL_SOURCE_H */ gnss-sdr-0.0.9/src/algorithms/signal_source/adapters/spir_file_signal_source.cc000066400000000000000000000311621305042567700300740ustar00rootroot00000000000000/*! * \file spir_file_signal_source.cc * \brief Implementation of a class that reads signals samples from a SPIR file * and adapts it to a SignalSourceInterface. * \author Fran Fabra, 2014 fabra(at)ice.csic.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) * * GNSS-SDR is a software defined Global Navigation * Satellite Systems receiver * * This file is not 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 . * * ------------------------------------------------------------------------- */ #include "spir_file_signal_source.h" #include #include #include #include #include #include #include #include "gnss_sdr_valve.h" #include "configuration_interface.h" using google::LogMessage; DEFINE_string(spir_signal_source, "-", "If defined, path to the file containing the NSR (byte to 2-bit packed) signal samples (overrides the configuration file)"); SpirFileSignalSource::SpirFileSignalSource(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams, boost::shared_ptr queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(queue) { std::string default_filename = "../data/my_capture.dat"; std::string default_item_type = "int"; std::string default_dump_filename = "../data/my_capture_dump.dat"; samples_ = configuration->property(role + ".samples", 0); sampling_frequency_ = configuration->property(role + ".sampling_frequency", 0); filename_ = configuration->property(role + ".filename", default_filename); // override value with commandline flag, if present if (FLAGS_spir_signal_source.compare("-") != 0) filename_= FLAGS_spir_signal_source; item_type_ = configuration->property(role + ".item_type", default_item_type); repeat_ = configuration->property(role + ".repeat", false); dump_ = configuration->property(role + ".dump", false); dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename); enable_throttle_control_ = configuration->property(role + ".enable_throttle_control", false); if (item_type_.compare("int") == 0) { item_size_ = sizeof(int); } else { LOG(WARNING) << item_type_ << " unrecognized item type. Using int."; item_size_ = sizeof(int); } try { file_source_ = gr::blocks::file_source::make(item_size_, filename_.c_str(), repeat_); unpack_intspir_ = make_unpack_intspir_1bit_samples(); } catch (const std::exception &e) { std::cerr << "The receiver was configured to work with a file signal source " << std::endl << "but the specified file is unreachable by GNSS-SDR." << std::endl << "Please modify your configuration file" << std::endl << "and point SignalSource.filename to a valid raw data file. Then:" << std::endl << "$ gnss-sdr --config_file=/path/to/my_GNSS_SDR_configuration.conf" << std::endl << "Examples of configuration files available at:" << std::endl << GNSSSDR_INSTALL_DIR "/share/gnss-sdr/conf/" << std::endl; LOG(WARNING) << "file_signal_source: Unable to open the samples file " << filename_.c_str() << ", exiting the program."; throw(e); } DLOG(INFO) << "file_source(" << file_source_->unique_id() << ")"; if (samples_ == 0) // read all file { /*! * BUG workaround: The GNU Radio file source does not stop the receiver after reaching the End of File. * A possible solution is to compute the file length in samples using file size, excluding the last 100 milliseconds, and enable always the * valve block */ std::ifstream file (filename_.c_str(), std::ios::in | std::ios::binary | std::ios::ate); std::ifstream::pos_type size; if (file.is_open()) { size = file.tellg(); LOG(INFO) << "Total samples in the file= " << floor((double)size / (double)item_size()); } else { std::cout << "file_signal_source: Unable to open the samples file " << filename_.c_str() << std::endl; LOG(ERROR) << "file_signal_source: Unable to open the samples file " << filename_.c_str(); } std::streamsize ss = std::cout.precision(); std::cout << std::setprecision(16); std::cout << "Processing file " << filename_ << ", which contains " << (double)size << " [bytes]" << std::endl; std::cout.precision (ss); if (size > 0) { int sample_packet_factor = 1; // 1 int -> 1 complex sample (I&Q from 1 channel) samples_ = floor((double)size / (double)item_size())*sample_packet_factor; samples_ = samples_- ceil(0.002 * (double)sampling_frequency_); //process all the samples available in the file excluding the last 2 ms } } CHECK(samples_ > 0) << "File does not contain enough samples to process."; double signal_duration_s; signal_duration_s = (double)samples_ * ( 1 /(double)sampling_frequency_); LOG(INFO) << "Total number samples to be processed= " << samples_ << " GNSS signal duration= " << signal_duration_s << " [s]"; std::cout << "GNSS signal recorded time to be processed: " << signal_duration_s << " [s]" << std::endl; valve_ = gnss_sdr_make_valve(sizeof(float), samples_, queue_); DLOG(INFO) << "valve(" << valve_->unique_id() << ")"; if (dump_) { //sink_ = gr_make_file_sink(item_size_, dump_filename_.c_str()); sink_ = gr::blocks::file_sink::make(sizeof(float), dump_filename_.c_str()); DLOG(INFO) << "file_sink(" << sink_->unique_id() << ")"; } if (enable_throttle_control_) { throttle_ = gr::blocks::throttle::make(sizeof(float), sampling_frequency_); } DLOG(INFO) << "File source filename " << filename_; DLOG(INFO) << "Samples " << samples_; DLOG(INFO) << "Sampling frequency " << sampling_frequency_; DLOG(INFO) << "Item type " << item_type_; DLOG(INFO) << "Item size " << item_size_; DLOG(INFO) << "Repeat " << repeat_; DLOG(INFO) << "Dump " << dump_; DLOG(INFO) << "Dump filename " << dump_filename_; } SpirFileSignalSource::~SpirFileSignalSource() {} void SpirFileSignalSource::connect(gr::top_block_sptr top_block) { if (samples_ > 0) { if (enable_throttle_control_ == true) { top_block->connect(file_source_, 0, unpack_intspir_, 0); top_block->connect(unpack_intspir_, 0,throttle_,0); DLOG(INFO) << "connected file source to throttle"; top_block->connect(throttle_, 0, valve_, 0); DLOG(INFO) << "connected throttle to valve"; if (dump_) { top_block->connect(valve_, 0, sink_, 0); DLOG(INFO) << "connected valve to file sink"; } } else { top_block->connect(file_source_, 0, unpack_intspir_, 0); top_block->connect(unpack_intspir_, 0,valve_,0); DLOG(INFO) << "connected file source to valve"; if (dump_) { top_block->connect(valve_, 0, sink_, 0); DLOG(INFO) << "connected valve to file sink"; } } } else { if (enable_throttle_control_ == true) { top_block->connect(file_source_, 0, unpack_intspir_, 0); top_block->connect(unpack_intspir_, 0,throttle_,0); DLOG(INFO) << "connected file source to throttle"; if (dump_) { top_block->connect(throttle_, 0, sink_, 0); DLOG(INFO) << "connected file source to sink"; } } else { if (dump_) { top_block->connect(file_source_, 0, unpack_intspir_, 0); top_block->connect(unpack_intspir_, 0, sink_, 0); DLOG(INFO) << "connected file source to sink"; } } } } void SpirFileSignalSource::disconnect(gr::top_block_sptr top_block) { if (samples_ > 0) { if (enable_throttle_control_ == true) { top_block->disconnect(file_source_, 0, unpack_intspir_, 0); DLOG(INFO) << "disconnected file source to unpack_intspir_"; top_block->connect(unpack_intspir_, 0,throttle_,0); DLOG(INFO) << "disconnected unpack_intspir_ to throttle_"; top_block->disconnect(throttle_, 0, valve_, 0); DLOG(INFO) << "disconnected throttle to valve"; if (dump_) { top_block->disconnect(valve_, 0, sink_, 0); DLOG(INFO) << "disconnected valve to file sink"; } } else { top_block->disconnect(file_source_, 0, unpack_intspir_, 0); DLOG(INFO) << "disconnected file source to unpack_intspir_"; top_block->disconnect(unpack_intspir_, 0, valve_, 0); DLOG(INFO) << "disconnected unpack_intspir_ to valve"; if (dump_) { top_block->disconnect(valve_, 0, sink_, 0); DLOG(INFO) << "disconnected valve to file sink"; } } } else { if (enable_throttle_control_ == true) { top_block->disconnect(file_source_, 0, unpack_intspir_, 0); DLOG(INFO) << "disconnected file source to unpack_intspir_"; top_block->disconnect(unpack_intspir_, 0, throttle_, 0); DLOG(INFO) << "disconnected unpack_intspir_ to throttle"; if (dump_) { top_block->disconnect(unpack_intspir_, 0, sink_, 0); DLOG(INFO) << "disconnected funpack_intspir_ to sink"; } } else { if (dump_) { top_block->disconnect(file_source_, 0, unpack_intspir_, 0); DLOG(INFO) << "disconnected file source to unpack_intspir_"; top_block->disconnect(unpack_intspir_, 0, sink_, 0); DLOG(INFO) << "disconnected unpack_intspir_ to sink"; } } } } gr::basic_block_sptr SpirFileSignalSource::get_left_block() { LOG(WARNING) << "Left block of a signal source should not be retrieved"; //return gr_block_sptr(); return gr::blocks::file_source::sptr(); } gr::basic_block_sptr SpirFileSignalSource::get_right_block() { if (samples_ > 0) { return valve_; } else { if (enable_throttle_control_ == true) { return throttle_; } else { return unpack_intspir_; } } } gnss-sdr-0.0.9/src/algorithms/signal_source/adapters/spir_file_signal_source.h000066400000000000000000000066431305042567700277440ustar00rootroot00000000000000/*! * \file spir_file_signal_source.h * \brief Implementation of a class that reads signals samples from a SPIR file * and adapts it to a SignalSourceInterface. * \author Fran Fabra, 2014 fabra(at)ice.csic.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) * * GNSS-SDR is a software defined Global Navigation * Satellite Systems receiver * * This file is not 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_SPIR_FILE_SIGNAL_SOURCE_H_ #define GNSS_SDR_SPIR_FILE_SIGNAL_SOURCE_H_ #include #include #include #include #include #include #include "gnss_block_interface.h" #include "unpack_intspir_1bit_samples.h" class ConfigurationInterface; /*! * \brief Class that reads signals samples from a file * and adapts it to a SignalSourceInterface */ class SpirFileSignalSource: public GNSSBlockInterface { public: SpirFileSignalSource(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams, boost::shared_ptr queue); virtual ~SpirFileSignalSource(); std::string role() { return role_; } /*! * \brief Returns "Spir_File_Signal_Source". */ std::string implementation() { return "Spir_File_Signal_Source"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); std::string filename() { return filename_; } std::string item_type() { return item_type_; } bool repeat() { return repeat_; } long sampling_frequency() { return sampling_frequency_; } long samples() { return samples_; } private: unsigned long long samples_; long sampling_frequency_; std::string filename_; std::string item_type_; bool repeat_; bool dump_; std::string dump_filename_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; gr::blocks::file_source::sptr file_source_; unpack_intspir_1bit_samples_sptr unpack_intspir_; boost::shared_ptr valve_; gr::blocks::file_sink::sptr sink_; gr::blocks::throttle::sptr throttle_; boost::shared_ptr queue_; size_t item_size_; // Throttle control bool enable_throttle_control_; }; #endif /*GNSS_SDR_SPIR_FILE_SIGNAL_SOURCE_H_*/ gnss-sdr-0.0.9/src/algorithms/signal_source/adapters/two_bit_cpx_file_signal_source.cc000066400000000000000000000321261305042567700314410ustar00rootroot00000000000000/*! * \file two_bit_cpx_file_signal_source.cc * \brief Implementation of a class that reads signals samples from a 2 bit complex sampler front-end file * and adapts it to a SignalSourceInterface. * \author Javier Arribas, 2015 jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "two_bit_cpx_file_signal_source.h" #include #include #include #include #include #include #include #include "gnss_sdr_valve.h" #include "configuration_interface.h" using google::LogMessage; //DEFINE_string(two_bit_cpx_signal_source, "-", // "If defined, path to the file containing the NSR (byte to 2-bit packed) signal samples (overrides the configuration file)"); TwoBitCpxFileSignalSource::TwoBitCpxFileSignalSource(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams, boost::shared_ptr queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(queue) { std::string default_filename = "../data/my_capture.dat"; std::string default_item_type = "byte"; std::string default_dump_filename = "../data/my_capture_dump.dat"; samples_ = configuration->property(role + ".samples", 0); sampling_frequency_ = configuration->property(role + ".sampling_frequency", 0); filename_ = configuration->property(role + ".filename", default_filename); // override value with commandline flag, if present //if (FLAGS_nsr_signal_source.compare("-") != 0) filename_= FLAGS_nsr_signal_source; item_type_ = configuration->property(role + ".item_type", default_item_type); repeat_ = configuration->property(role + ".repeat", false); dump_ = configuration->property(role + ".dump", false); dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename); enable_throttle_control_ = configuration->property(role + ".enable_throttle_control", false); if (item_type_.compare("byte") == 0) { item_size_ = sizeof(char); } else { LOG(WARNING) << item_type_ << " unrecognized item type. Using byte."; item_size_ = sizeof(char); } try { file_source_ = gr::blocks::file_source::make(item_size_, filename_.c_str(), repeat_); unpack_byte_ = make_unpack_byte_2bit_cpx_samples(); inter_shorts_to_cpx_ = gr::blocks::interleaved_short_to_complex::make(false,true); //I/Q swap enabled } catch (const std::exception &e) { std::cerr << "The receiver was configured to work with a file signal source " << std::endl << "but the specified file is unreachable by GNSS-SDR." << std::endl << "Please modify your configuration file" << std::endl << "and point SignalSource.filename to a valid raw data file. Then:" << std::endl << "$ gnss-sdr --config_file=/path/to/my_GNSS_SDR_configuration.conf" << std::endl << "Examples of configuration files available at:" << std::endl << GNSSSDR_INSTALL_DIR "/share/gnss-sdr/conf/" << std::endl; LOG(WARNING) << "file_signal_source: Unable to open the samples file " << filename_.c_str() << ", exiting the program."; throw(e); } DLOG(INFO) << "file_source(" << file_source_->unique_id() << ")"; if (samples_ == 0) // read all file { /*! * BUG workaround: The GNU Radio file source does not stop the receiver after reaching the End of File. * A possible solution is to compute the file length in samples using file size, excluding the last 2 milliseconds, and enable always the * valve block */ std::ifstream file (filename_.c_str(), std::ios::in | std::ios::binary | std::ios::ate); std::ifstream::pos_type size; if (file.is_open()) { size = file.tellg(); LOG(INFO) << "Total samples in the file= " << floor((double)size / (double)item_size()); } else { std::cout << "file_signal_source: Unable to open the samples file " << filename_.c_str() << std::endl; LOG(ERROR) << "file_signal_source: Unable to open the samples file " << filename_.c_str(); } std::streamsize ss = std::cout.precision(); std::cout << std::setprecision(16); std::cout << "Processing file " << filename_ << ", which contains " << (double)size << " [bytes]" << std::endl; std::cout.precision (ss); if (size > 0) { int sample_packet_factor = 2; // 1 byte -> 2 samples samples_ = floor((double)size / (double)item_size())*sample_packet_factor; samples_ = samples_- ceil(0.002 * (double)sampling_frequency_); //process all the samples available in the file excluding the last 2 ms } } CHECK(samples_ > 0) << "File does not contain enough samples to process."; double signal_duration_s; signal_duration_s = (double)samples_ * ( 1 /(double)sampling_frequency_); LOG(INFO) << "Total number samples to be processed= " << samples_ << " GNSS signal duration= " << signal_duration_s << " [s]"; std::cout << "GNSS signal recorded time to be processed: " << signal_duration_s << " [s]" << std::endl; valve_ = gnss_sdr_make_valve(sizeof(gr_complex), samples_, queue_); DLOG(INFO) << "valve(" << valve_->unique_id() << ")"; if (dump_) { //sink_ = gr_make_file_sink(item_size_, dump_filename_.c_str()); sink_ = gr::blocks::file_sink::make(sizeof(gr_complex), dump_filename_.c_str()); DLOG(INFO) << "file_sink(" << sink_->unique_id() << ")"; } if (enable_throttle_control_) { throttle_ = gr::blocks::throttle::make(sizeof(gr_complex), sampling_frequency_); } DLOG(INFO) << "File source filename " << filename_; DLOG(INFO) << "Samples " << samples_; DLOG(INFO) << "Sampling frequency " << sampling_frequency_; DLOG(INFO) << "Item type " << item_type_; DLOG(INFO) << "Item size " << item_size_; DLOG(INFO) << "Repeat " << repeat_; DLOG(INFO) << "Dump " << dump_; DLOG(INFO) << "Dump filename " << dump_filename_; } TwoBitCpxFileSignalSource::~TwoBitCpxFileSignalSource() {} void TwoBitCpxFileSignalSource::connect(gr::top_block_sptr top_block) { if (samples_ > 0) { if (enable_throttle_control_ == true) { top_block->connect(file_source_, 0, unpack_byte_, 0); top_block->connect(unpack_byte_, 0,inter_shorts_to_cpx_,0); top_block->connect(inter_shorts_to_cpx_, 0,throttle_,0); DLOG(INFO) << "connected file source to throttle"; top_block->connect(throttle_, 0, valve_, 0); DLOG(INFO) << "connected throttle to valve"; if (dump_) { top_block->connect(valve_, 0, sink_, 0); DLOG(INFO) << "connected valve to file sink"; } } else { top_block->connect(file_source_, 0, unpack_byte_, 0); top_block->connect(unpack_byte_, 0,inter_shorts_to_cpx_,0); top_block->connect(inter_shorts_to_cpx_, 0,valve_,0); DLOG(INFO) << "connected file source to valve"; if (dump_) { top_block->connect(valve_, 0, sink_, 0); DLOG(INFO) << "connected valve to file sink"; } } } else { if (enable_throttle_control_ == true) { top_block->connect(file_source_, 0, unpack_byte_, 0); top_block->connect(unpack_byte_, 0,inter_shorts_to_cpx_,0); top_block->connect(inter_shorts_to_cpx_, 0,throttle_,0); DLOG(INFO) << "connected file source to throttle"; if (dump_) { top_block->connect(throttle_, 0, sink_, 0); DLOG(INFO) << "connected file source to sink"; } } else { if (dump_) { top_block->connect(file_source_, 0, unpack_byte_, 0); top_block->connect(unpack_byte_, 0,inter_shorts_to_cpx_,0); top_block->connect(inter_shorts_to_cpx_, 0, sink_, 0); DLOG(INFO) << "connected file source to sink"; } } } } void TwoBitCpxFileSignalSource::disconnect(gr::top_block_sptr top_block) { if (samples_ > 0) { if (enable_throttle_control_ == true) { top_block->disconnect(file_source_, 0, unpack_byte_, 0); DLOG(INFO) << "disconnected file source to unpack_byte_"; top_block->connect(unpack_byte_, 0,throttle_,0); DLOG(INFO) << "disconnected unpack_byte_ to throttle_"; top_block->disconnect(throttle_, 0, valve_, 0); DLOG(INFO) << "disconnected throttle to valve"; if (dump_) { top_block->disconnect(valve_, 0, sink_, 0); DLOG(INFO) << "disconnected valve to file sink"; } } else { top_block->disconnect(file_source_, 0, unpack_byte_, 0); DLOG(INFO) << "disconnected file source to unpack_byte_"; top_block->disconnect(unpack_byte_, 0, valve_, 0); DLOG(INFO) << "disconnected unpack_byte_ to valve"; if (dump_) { top_block->disconnect(valve_, 0, sink_, 0); DLOG(INFO) << "disconnected valve to file sink"; } } } else { if (enable_throttle_control_ == true) { top_block->disconnect(file_source_, 0, unpack_byte_, 0); DLOG(INFO) << "disconnected file source to unpack_byte_"; top_block->disconnect(unpack_byte_, 0, throttle_, 0); DLOG(INFO) << "disconnected unpack_byte_ to throttle"; if (dump_) { top_block->disconnect(unpack_byte_, 0, sink_, 0); DLOG(INFO) << "disconnected funpack_byte_ to sink"; } } else { if (dump_) { top_block->disconnect(file_source_, 0, unpack_byte_, 0); DLOG(INFO) << "disconnected file source to unpack_byte_"; top_block->disconnect(unpack_byte_, 0, sink_, 0); DLOG(INFO) << "disconnected unpack_byte_ to sink"; } } } } gr::basic_block_sptr TwoBitCpxFileSignalSource::get_left_block() { LOG(WARNING) << "Left block of a signal source should not be retrieved"; //return gr_block_sptr(); return gr::blocks::file_source::sptr(); } gr::basic_block_sptr TwoBitCpxFileSignalSource::get_right_block() { if (samples_ > 0) { return valve_; } else { if (enable_throttle_control_ == true) { return throttle_; } else { return unpack_byte_; } } } gnss-sdr-0.0.9/src/algorithms/signal_source/adapters/two_bit_cpx_file_signal_source.h000066400000000000000000000072461305042567700313100ustar00rootroot00000000000000/*! * \file two_bit_cpx_file_signal_source.h * \brief Interface of a class that reads signals samples from a 2 bit complex sampler front-end file * and adapts it to a SignalSourceInterface. * \author Javier Arribas, 2015 jarribas(at)cttc.es * * This class represents a file signal source. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_TWO_BIT_CPX_FILE_SIGNAL_SOURCE_H_ #define GNSS_SDR_TWO_BIT_CPX_FILE_SIGNAL_SOURCE_H_ #include #include #include #include #include #include #include #include "gnss_block_interface.h" #include "unpack_byte_2bit_cpx_samples.h" class ConfigurationInterface; /*! * \brief Class that reads signals samples from a file * and adapts it to a SignalSourceInterface */ class TwoBitCpxFileSignalSource: public GNSSBlockInterface { public: TwoBitCpxFileSignalSource(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams, boost::shared_ptr queue); virtual ~TwoBitCpxFileSignalSource(); std::string role() { return role_; } /*! * \brief Returns "Two_Bit_Cpx_File_Signal_Source". */ std::string implementation() { return "Two_Bit_Cpx_File_Signal_Source"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); std::string filename() { return filename_; } std::string item_type() { return item_type_; } bool repeat() { return repeat_; } long sampling_frequency() { return sampling_frequency_; } long samples() { return samples_; } private: unsigned long long samples_; long sampling_frequency_; std::string filename_; std::string item_type_; bool repeat_; bool dump_; std::string dump_filename_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; gr::blocks::file_source::sptr file_source_; unpack_byte_2bit_cpx_samples_sptr unpack_byte_; gr::blocks::interleaved_short_to_complex::sptr inter_shorts_to_cpx_; boost::shared_ptr valve_; gr::blocks::file_sink::sptr sink_; gr::blocks::throttle::sptr throttle_; boost::shared_ptr queue_; size_t item_size_; // Throttle control bool enable_throttle_control_; }; #endif /*GNSS_SDR_TWO_BIT_CPX_FILE_SIGNAL_SOURCE_H_*/ gnss-sdr-0.0.9/src/algorithms/signal_source/adapters/two_bit_packed_file_signal_source.cc000066400000000000000000000272701305042567700321020ustar00rootroot00000000000000/*! * \file two_bit_packed_file_signal_source.cc * \brief Interface of a class that reads signals samples from a file. Each * sample is two bits, which are packed into bytes or shorts. * * \author Cillian O'Driscoll, 2015 cillian.odriscoll (at) gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "two_bit_packed_file_signal_source.h" #include #include #include #include #include #include #include #include "gnss_sdr_valve.h" #include "configuration_interface.h" #include using google::LogMessage; //DEFINE_string(two_bit_packed_signal_source, "-", // "If defined, path to the file containing the NSR (byte to 2-bit packed) signal samples (overrides the configuration file)"); TwoBitPackedFileSignalSource::TwoBitPackedFileSignalSource(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams, boost::shared_ptr queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(queue) { std::string default_filename = "../data/my_capture.dat"; std::string default_item_type = "byte"; std::string default_dump_filename = "../data/my_capture_dump.dat"; std::string default_sample_type = "real"; double default_seconds_to_skip = 0.0; samples_ = configuration->property(role + ".samples", 0L); sampling_frequency_ = configuration->property(role + ".sampling_frequency", 0); filename_ = configuration->property(role + ".filename", default_filename); // override value with commandline flag, if present //if (FLAGS_nsr_signal_source.compare("-") != 0) filename_= FLAGS_nsr_signal_source; item_type_ = configuration->property(role + ".item_type", default_item_type); big_endian_items_ = configuration->property(role + ".big_endian_items", true); big_endian_bytes_ = configuration->property(role + ".big_endian_bytes", false); sample_type_ = configuration->property(role + ".sample_type", default_sample_type ); // options: "real", "iq", "qi" repeat_ = configuration->property(role + ".repeat", false); dump_ = configuration->property(role + ".dump", false); dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename); enable_throttle_control_ = configuration->property(role + ".enable_throttle_control", false); double seconds_to_skip = configuration->property(role + ".seconds_to_skip", default_seconds_to_skip ); long bytes_to_skip = 0; if (item_type_.compare("byte") == 0) { item_size_ = sizeof(char); } else if( item_type_.compare("short") == 0) { // If we have shorts stored in little endian format, might as // well read them in as bytes. if( big_endian_items_ ) { item_size_ = sizeof(short); } else { item_size_ = sizeof(char); } } else { LOG(WARNING) << item_type_ << " unrecognized item type. Using byte."; item_size_ = sizeof(char); } if( sample_type_.compare("real") == 0 ) { is_complex_ = false; } else if( sample_type_.compare("iq" ) == 0 ) { is_complex_ = true; reverse_interleaving_ = false; } else if( sample_type_.compare("qi") == 0 ) { is_complex_ = true; reverse_interleaving_ = true; } else { LOG(WARNING) << sample_type_ << " unrecognized sample type. Assuming: " << ( is_complex_ ? ( reverse_interleaving_ ? "qi" : "iq" ) : "real" ); } try { file_source_ = gr::blocks::file_source::make(item_size_, filename_.c_str(), repeat_); if( seconds_to_skip > 0 ) { bytes_to_skip = static_cast< long >( seconds_to_skip * sampling_frequency_ / 4 ); if( is_complex_ ) { bytes_to_skip <<= 1; } file_source_->seek( bytes_to_skip, SEEK_SET ); } unpack_samples_ = make_unpack_2bit_samples( big_endian_bytes_, item_size_, big_endian_items_, reverse_interleaving_); if( is_complex_ ) { char_to_float_ = gr::blocks::interleaved_char_to_complex::make(false); } else { char_to_float_ = gr::blocks::char_to_float::make(); } } catch (const std::exception &e) { std::cerr << "The receiver was configured to work with a file signal source " << std::endl << "but the specified file is unreachable by GNSS-SDR." << std::endl << "Please modify your configuration file" << std::endl << "and point SignalSource.filename to a valid raw data file. Then:" << std::endl << "$ gnss-sdr --config_file=/path/to/my_GNSS_SDR_configuration.conf" << std::endl << "Examples of configuration files available at:" << std::endl << GNSSSDR_INSTALL_DIR "/share/gnss-sdr/conf/" << std::endl; LOG(WARNING) << "file_signal_source: Unable to open the samples file " << filename_.c_str() << ", exiting the program."; throw(e); } DLOG(INFO) << "file_source(" << file_source_->unique_id() << ")"; if (samples_ == 0) // read all file { /*! * BUG workaround: The GNU Radio file source does not stop the receiver after reaching the End of File. * A possible solution is to compute the file length in samples using file size, excluding the last 2 milliseconds, and enable always the * valve block */ std::ifstream file (filename_.c_str(), std::ios::in | std::ios::binary | std::ios::ate); std::ifstream::pos_type size; if (file.is_open()) { size = file.tellg(); samples_ = floor((double)size * ( is_complex_ ? 2.0 : 4.0 ) ); LOG(INFO) << "Total samples in the file= " << samples_; // 4 samples per byte samples_ -= bytes_to_skip; //Also skip the last two milliseconds: samples_ -= ceil( 0.002 * sampling_frequency_ / (is_complex_ ? 2.0 : 4.0 ) ); } else { std::cout << "file_signal_source: Unable to open the samples file " << filename_.c_str() << std::endl; LOG(ERROR) << "file_signal_source: Unable to open the samples file " << filename_.c_str(); } std::streamsize ss = std::cout.precision(); std::cout << std::setprecision(16); std::cout << "Processing file " << filename_ << ", which contains " << (double)size << " [bytes]" << std::endl; std::cout.precision (ss); } CHECK(samples_ > 0) << "File does not contain enough samples to process."; double signal_duration_s; signal_duration_s = (double)samples_ * ( 1 /(double)sampling_frequency_); LOG(INFO) << "Total number samples to be processed= " << samples_ << " GNSS signal duration= " << signal_duration_s << " [s]"; std::cout << "GNSS signal recorded time to be processed: " << signal_duration_s << " [s]" << std::endl; valve_ = gnss_sdr_make_valve(sizeof(gr_complex), samples_, queue_); DLOG(INFO) << "valve(" << valve_->unique_id() << ")"; if (dump_) { //sink_ = gr_make_file_sink(item_size_, dump_filename_.c_str()); sink_ = gr::blocks::file_sink::make(sizeof(gr_complex), dump_filename_.c_str()); DLOG(INFO) << "file_sink(" << sink_->unique_id() << ")"; } if (enable_throttle_control_) { throttle_ = gr::blocks::throttle::make(sizeof(gr_complex), sampling_frequency_); } DLOG(INFO) << "File source filename " << filename_; DLOG(INFO) << "Samples " << samples_; DLOG(INFO) << "Sampling frequency " << sampling_frequency_; DLOG(INFO) << "Item type " << item_type_; DLOG(INFO) << "Item size " << item_size_; DLOG(INFO) << "Repeat " << repeat_; DLOG(INFO) << "Dump " << dump_; DLOG(INFO) << "Dump filename " << dump_filename_; } TwoBitPackedFileSignalSource::~TwoBitPackedFileSignalSource() {} void TwoBitPackedFileSignalSource::connect(gr::top_block_sptr top_block) { gr::basic_block_sptr left_block = file_source_; gr::basic_block_sptr right_block = unpack_samples_; top_block->connect(file_source_, 0, unpack_samples_, 0); left_block = right_block; DLOG(INFO) << "connected file source to unpack samples"; right_block = char_to_float_; top_block->connect( left_block, 0, right_block, 0 ); left_block = right_block; DLOG(INFO) << "connected unpack samples to char to float"; if( enable_throttle_control_ ) { right_block = throttle_; top_block->connect( left_block, 0, right_block, 0 ); left_block = right_block; DLOG(INFO) << " connected to throttle"; } top_block->connect(left_block, 0, valve_, 0); DLOG(INFO) << "connected to valve"; if (dump_) { top_block->connect(valve_, 0, sink_, 0); DLOG(INFO) << "connected valve to file sink"; } } void TwoBitPackedFileSignalSource::disconnect(gr::top_block_sptr top_block) { gr::basic_block_sptr left_block = file_source_; gr::basic_block_sptr right_block = unpack_samples_; top_block->disconnect(file_source_, 0, unpack_samples_, 0); left_block = right_block; DLOG(INFO) << "disconnected file source to unpack samples"; right_block = char_to_float_; top_block->disconnect( left_block, 0, right_block, 0 ); left_block = right_block; DLOG(INFO) << "disconnected unpack samples to char to float"; if( enable_throttle_control_ ) { right_block = throttle_; top_block->disconnect( left_block, 0, right_block, 0 ); left_block = right_block; DLOG(INFO) << " disconnected to throttle"; } top_block->disconnect(left_block, 0, valve_, 0); DLOG(INFO) << "disconnected to valve"; if (dump_) { top_block->disconnect(valve_, 0, sink_, 0); DLOG(INFO) << "disconnected valve to file sink"; } } gr::basic_block_sptr TwoBitPackedFileSignalSource::get_left_block() { LOG(WARNING) << "Left block of a signal source should not be retrieved"; //return gr_block_sptr(); return gr::blocks::file_source::sptr(); } gr::basic_block_sptr TwoBitPackedFileSignalSource::get_right_block() { return valve_; } gnss-sdr-0.0.9/src/algorithms/signal_source/adapters/two_bit_packed_file_signal_source.h000066400000000000000000000101121305042567700317270ustar00rootroot00000000000000/*! * \file two_bit_packed_file_signal_source.h * \brief Interface of a class that reads signals samples from a file. Each * sample is two bits, which are packed into bytes or shorts. * * \author Cillian O'Driscoll, 2015 cillian.odriscoll (at) gmail.com * * This class represents a file signal source. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_TWO_BIT_PACKED_FILE_SIGNAL_SOURCE_H_ #define GNSS_SDR_TWO_BIT_PACKED_FILE_SIGNAL_SOURCE_H_ #include #include #include #include #include #include #include #include "gnss_block_interface.h" #include "unpack_2bit_samples.h" class ConfigurationInterface; /*! * \brief Class that reads signals samples from a file * and adapts it to a SignalSourceInterface */ class TwoBitPackedFileSignalSource: public GNSSBlockInterface { public: TwoBitPackedFileSignalSource(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams, boost::shared_ptr queue); virtual ~TwoBitPackedFileSignalSource(); std::string role() { return role_; } /*! * \brief Returns "Two_Bit_Packed_File_Signal_Source". */ std::string implementation() { return "Two_Bit_Packed_File_Signal_Source"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); std::string filename() { return filename_; } std::string item_type() { return item_type_; } bool repeat() { return repeat_; } long sampling_frequency() { return sampling_frequency_; } long samples() { return samples_; } bool big_endian_items() { return big_endian_items_; } bool big_endian_bytes() { return big_endian_bytes_; } bool is_complex() { return is_complex_; } bool reverse_interleaving() { return reverse_interleaving_; } private: unsigned long long samples_; long sampling_frequency_; std::string filename_; std::string item_type_; bool repeat_; bool dump_; std::string dump_filename_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; gr::blocks::file_source::sptr file_source_; unpack_2bit_samples_sptr unpack_samples_; gr::basic_block_sptr char_to_float_; boost::shared_ptr valve_; gr::blocks::file_sink::sptr sink_; gr::blocks::throttle::sptr throttle_; boost::shared_ptr queue_; size_t item_size_; bool big_endian_items_; bool big_endian_bytes_; bool is_complex_; bool reverse_interleaving_; std::string sample_type_; // Throttle control bool enable_throttle_control_; }; #endif /*GNSS_SDR_TWO_BIT_CPX_FILE_SIGNAL_SOURCE_H_*/ gnss-sdr-0.0.9/src/algorithms/signal_source/adapters/uhd_signal_source.cc000066400000000000000000000316441305042567700267050ustar00rootroot00000000000000/*! * \file uhd_signal_source.cc * \brief Universal Hardware Driver signal source * \author Javier Arribas, 2012. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "uhd_signal_source.h" #include #include #include #include #include #include "configuration_interface.h" #include "gnss_sdr_valve.h" #include "GPS_L1_CA.h" using google::LogMessage; UhdSignalSource::UhdSignalSource(ConfigurationInterface* configuration, std::string role, unsigned int in_stream, unsigned int out_stream, boost::shared_ptr queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(queue) { // DUMP PARAMETERS std::string empty = ""; std::string default_dump_file = "./data/signal_source.dat"; std::string default_item_type = "cshort"; // UHD COMMON PARAMETERS uhd::device_addr_t dev_addr; device_address_ = configuration->property(role + ".device_address", empty); // When left empty, the device discovery routines will search all // available transports on the system (ethernet, usb...). // To narrow down the discovery process to a particular device, // specify a transport key/value pair specific to your device. if (empty.compare(device_address_) != 0) // if not empty { dev_addr["addr"] = device_address_; } subdevice_ = configuration->property(role + ".subdevice", empty); clock_source_ = configuration->property(role + ".clock_source", std::string("internal")); RF_channels_ = configuration->property(role + ".RF_channels", 1); sample_rate_ = configuration->property(role + ".sampling_frequency", (double)4.0e6); item_type_ = configuration->property(role + ".item_type", default_item_type); if (RF_channels_ == 1) { // Single RF channel UHD operation (backward compatible config file format) samples_.push_back(configuration->property(role + ".samples", 0)); dump_.push_back(configuration->property(role + ".dump", false)); dump_filename_.push_back(configuration->property(role + ".dump_filename", default_dump_file)); freq_.push_back(configuration->property(role + ".freq", GPS_L1_FREQ_HZ)); gain_.push_back(configuration->property(role + ".gain", (double)50.0)); IF_bandwidth_hz_.push_back(configuration->property(role + ".IF_bandwidth_hz", sample_rate_/2)); } else { // multiple RF channels selected for (int i = 0; i < RF_channels_; i++) { // Single RF channel UHD operation (backward compatible config file format) samples_.push_back(configuration->property(role + ".samples" + boost::lexical_cast(i), 0)); dump_.push_back(configuration->property(role + ".dump" + boost::lexical_cast(i), false)); dump_filename_.push_back(configuration->property(role + ".dump_filename" + boost::lexical_cast(i), default_dump_file)); freq_.push_back(configuration->property(role + ".freq" + boost::lexical_cast(i), GPS_L1_FREQ_HZ)); gain_.push_back(configuration->property(role + ".gain" + boost::lexical_cast(i), (double)50.0)); IF_bandwidth_hz_.push_back(configuration->property(role + ".IF_bandwidth_hz" + boost::lexical_cast(i), sample_rate_/2)); } } // 1. Make the uhd driver instance //uhd_source_= uhd::usrp::multi_usrp::make(dev_addr); // single source // param: device_addr the address to identify the hardware // param: io_type the desired output data type // fc64: Complex floating point (64-bit floats) range [-1.0, +1.0]. // fc32: Complex floating point (32-bit floats) range [-1.0, +1.0]. // sc16: Complex signed integer (16-bit integers) range [-32768, +32767]. // sc8: Complex signed integer (8-bit integers) range [-128, 127]. if (item_type_.compare("cbyte") == 0) { item_size_ = sizeof(lv_8sc_t); uhd_stream_args_ = uhd::stream_args_t("sc8"); } else if (item_type_.compare("cshort") == 0) { item_size_ = sizeof(lv_16sc_t); uhd_stream_args_ = uhd::stream_args_t("sc16"); } else if (item_type_.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); uhd_stream_args_ = uhd::stream_args_t("fc32"); } else { LOG(WARNING) << item_type_ << " unrecognized item type. Using cshort."; item_size_ = sizeof(lv_16sc_t); uhd_stream_args_ = uhd::stream_args_t("sc16"); } // select the number of channels and the subdevice specifications for (int i = 0; i < RF_channels_; i++) { uhd_stream_args_.channels.push_back(i); } // 1.2 Make the UHD source object uhd_source_ = gr::uhd::usrp_source::make(dev_addr, uhd_stream_args_); // Set subdevice specification string for USRP family devices. It is composed of: // : // For motherboards: All USRP family motherboards have a first slot named A:. // The USRP1 has two daughterboard subdevice slots, known as A: and B:. // For daughterboards, see http://files.ettus.com/uhd_docs/manual/html/dboards.html // "0" is valid for DBSRX, DBSRX2, WBX Series // Dual channel example: "A:0 B:0" // TODO: Add support for multiple motherboards (i.e. four channels "A:0 B:0 A:1 B1") uhd_source_->set_subdev_spec(subdevice_, 0); // 2.1 set sampling clock reference // Set the clock source for the usrp device. // Options: internal, external, or MIMO uhd_source_->set_clock_source(clock_source_); // 2.2 set the sample rate for the usrp device uhd_source_->set_samp_rate(sample_rate_); // the actual sample rate may differ from the rate set std::cout << boost::format("Sampling Rate for the USRP device: %f [sps]...") % (uhd_source_->get_samp_rate()) << std::endl; LOG(INFO) << boost::format("Sampling Rate for the USRP device: %f [sps]...") % (uhd_source_->get_samp_rate()); std::vector sensor_names; for (int i = 0; i < RF_channels_; i++) { std::cout << "UHD RF CHANNEL #" << i << " SETTINGS" << std::endl; // 3. Tune the usrp device to the desired center frequency uhd_source_->set_center_freq(freq_.at(i), i); std::cout << boost::format("Actual USRP center freq.: %f [Hz]...") % (uhd_source_->get_center_freq(i)) << std::endl; LOG(INFO) << boost::format("Actual USRP center freq. set to: %f [Hz]...") % (uhd_source_->get_center_freq(i)); // TODO: Assign the remnant IF from the PLL tune error std::cout << boost::format("PLL Frequency tune error %f [Hz]...") % (uhd_source_->get_center_freq(i) - freq_.at(i)) << std::endl; LOG(INFO) << boost::format("PLL Frequency tune error %f [Hz]...") % (uhd_source_->get_center_freq(i) - freq_.at(i)); // 4. set the gain for the daughterboard uhd_source_->set_gain(gain_.at(i), i); std::cout << boost::format("Actual daughterboard gain set to: %f dB...") % uhd_source_->get_gain(i) << std::endl; LOG(INFO) << boost::format("Actual daughterboard gain set to: %f dB...") % uhd_source_->get_gain(i); //5. Set the bandpass filter on the RF frontend std::cout << boost::format("Setting RF bandpass filter bandwidth to: %f [Hz]...") % IF_bandwidth_hz_.at(i) << std::endl; uhd_source_->set_bandwidth(IF_bandwidth_hz_.at(i), i); //set the antenna (optional) //uhd_source_->set_antenna(ant); // We should wait? #include // boost::this_thread::sleep(boost::posix_time::seconds(1)); // Check out the status of the lo_locked sensor (boolean for LO lock state) sensor_names = uhd_source_->get_sensor_names(i); if (std::find(sensor_names.begin(), sensor_names.end(), "lo_locked") != sensor_names.end()) { uhd::sensor_value_t lo_locked = uhd_source_->get_sensor("lo_locked", i); std::cout << boost::format("Check for front-end %s ...") % lo_locked.to_pp_string() << " is "; if (lo_locked.to_bool() == true) { std::cout << "Locked" << std::endl; } else { std::cout << "UNLOCKED!" << std::endl; } //UHD_ASSERT_THROW(lo_locked.to_bool()); } } for (int i = 0; i < RF_channels_; i++) { if (samples_.at(i) != 0) { LOG(INFO) << "RF_channel "<< i << " Send STOP signal after " << samples_.at(i) << " samples"; valve_.push_back(gnss_sdr_make_valve(item_size_, samples_.at(i), queue_)); DLOG(INFO) << "valve(" << valve_.at(i)->unique_id() << ")"; } if (dump_.at(i)) { LOG(INFO) << "RF_channel "<< i << "Dumping output into file " << dump_filename_.at(i); file_sink_.push_back(gr::blocks::file_sink::make(item_size_, dump_filename_.at(i).c_str())); DLOG(INFO) << "file_sink(" << file_sink_.at(i)->unique_id() << ")"; } } } UhdSignalSource::~UhdSignalSource() {} void UhdSignalSource::connect(gr::top_block_sptr top_block) { for (int i = 0; i < RF_channels_; i++) { if (samples_.at(i) != 0) { top_block->connect(uhd_source_, i, valve_.at(i), 0); DLOG(INFO) << "connected usrp source to valve RF Channel " << i; if (dump_.at(i)) { top_block->connect(valve_.at(i), 0, file_sink_.at(i), 0); DLOG(INFO) << "connected valve to file sink RF Channel " << i; } } else { if (dump_.at(i)) { top_block->connect(uhd_source_, i, file_sink_.at(i), 0); DLOG(INFO) << "connected usrp source to file sink RF Channel " << i; } } } } void UhdSignalSource::disconnect(gr::top_block_sptr top_block) { for (int i = 0; i < RF_channels_; i++) { if (samples_.at(i) != 0) { top_block->disconnect(uhd_source_, i, valve_.at(i), 0); LOG(INFO) << "UHD source disconnected"; if (dump_.at(i)) { top_block->disconnect(valve_.at(i), 0, file_sink_.at(i), 0); } } else { if (dump_.at(i)) { top_block->disconnect(uhd_source_, i, file_sink_.at(i), 0); } } } } gr::basic_block_sptr UhdSignalSource::get_left_block() { LOG(WARNING) << "Trying to get signal source left block."; //return gr_basic_block_sptr(); return gr::uhd::usrp_source::sptr(); } gr::basic_block_sptr UhdSignalSource::get_right_block() { return get_right_block(0); } gr::basic_block_sptr UhdSignalSource::get_right_block(int RF_channel) { //TODO: There is a incoherence here: Multichannel UHD is a single block with multiple outputs, but if the sample limit is enabled, the output is a multiple block! if (samples_.at(RF_channel) != 0) { return valve_.at(RF_channel); } else { return uhd_source_; } } gnss-sdr-0.0.9/src/algorithms/signal_source/adapters/uhd_signal_source.h000066400000000000000000000062371305042567700265470ustar00rootroot00000000000000/*! * \file uhd_signal_source.h * \brief Interface for the Universal Hardware Driver signal source * \author Javier Arribas, 2012. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_UHD_SIGNAL_SOURCE_H_ #define GNSS_SDR_UHD_SIGNAL_SOURCE_H_ #include #include #include #include #include #include #include #include "gnss_block_interface.h" class ConfigurationInterface; /*! * \brief This class reads samples from a UHD device (see http://code.ettus.com/redmine/ettus/projects/uhd/wiki) */ class UhdSignalSource: public GNSSBlockInterface { public: UhdSignalSource(ConfigurationInterface* configuration, std::string role, unsigned int in_stream, unsigned int out_stream, boost::shared_ptr queue); virtual ~UhdSignalSource(); std::string role() { return role_; } /*! * \brief Returns "UHD_Signal_Source" */ std::string implementation() { return "UHD_Signal_Source"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); gr::basic_block_sptr get_right_block(int RF_channel); private: std::string role_; unsigned int in_stream_; unsigned int out_stream_; gr::uhd::usrp_source::sptr uhd_source_; // UHD SETTINGS uhd::stream_args_t uhd_stream_args_; std::string device_address_; double sample_rate_; int RF_channels_; std::string item_type_; size_t item_size_; std::string subdevice_; std::string clock_source_; std::vector freq_; std::vector gain_; std::vector IF_bandwidth_hz_; std::vector samples_; std::vector dump_; std::vector dump_filename_; std::vector> valve_; std::vector file_sink_; boost::shared_ptr queue_; }; #endif /*GNSS_SDR_UHD_SIGNAL_SOURCE_H_*/ gnss-sdr-0.0.9/src/algorithms/signal_source/gnuradio_blocks/000077500000000000000000000000001305042567700242335ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/signal_source/gnuradio_blocks/CMakeLists.txt000066400000000000000000000031161305042567700267740ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # set(SIGNAL_SOURCE_GR_BLOCKS_SOURCES unpack_byte_2bit_samples.cc unpack_byte_2bit_cpx_samples.cc unpack_intspir_1bit_samples.cc rtl_tcp_signal_source_c.cc unpack_2bit_samples.cc ) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${CMAKE_SOURCE_DIR}/src/algorithms/signal_source/libs ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ) file(GLOB SIGNAL_SOURCE_GR_BLOCKS_HEADERS "*.h") list(SORT SIGNAL_SOURCE_GR_BLOCKS_HEADERS) add_library(signal_source_gr_blocks ${SIGNAL_SOURCE_GR_BLOCKS_SOURCES} ${SIGNAL_SOURCE_GR_BLOCKS_HEADERS}) source_group(Headers FILES ${SIGNAL_SOURCE_GR_BLOCKS_HEADERS}) target_link_libraries(signal_source_gr_blocks signal_source_lib ${GNURADIO_RUNTIME_LIBRARIES} ${Boost_LIBRARIES}) add_dependencies(signal_source_gr_blocks glog-${glog_RELEASE}) gnss-sdr-0.0.9/src/algorithms/signal_source/gnuradio_blocks/rtl_tcp_signal_source_c.cc000066400000000000000000000261601305042567700314350ustar00rootroot00000000000000/*! * \file rtl_tcp_signal_source_c.cc * \brief An rtl_tcp signal source reader. * \author Anthony Arnold, 2015. anthony.arnold(at)uqconnect.edu.au * * This module contains logic taken from gr-omsosdr * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "rtl_tcp_signal_source_c.h" #include "rtl_tcp_commands.h" #include #include #include using google::LogMessage; namespace ip = boost::asio::ip; using boost::asio::ip::tcp; // Buffer constants // TODO: Make these configurable enum { RTL_TCP_BUFFER_SIZE = 1024 * 16, // 16 KB RTL_TCP_PAYLOAD_SIZE = 1024 * 4 // 4 KB }; rtl_tcp_signal_source_c_sptr rtl_tcp_make_signal_source_c(const std::string &address, short port, bool flip_iq) { return gnuradio::get_initial_sptr (new rtl_tcp_signal_source_c (address, port, flip_iq)); } rtl_tcp_signal_source_c::rtl_tcp_signal_source_c(const std::string &address, short port, bool flip_iq) : gr::sync_block ("rtl_tcp_signal_source_c", gr::io_signature::make(0, 0, 0), gr::io_signature::make(1, 1, sizeof(gr_complex))), socket_ (io_service_), data_ (RTL_TCP_PAYLOAD_SIZE), flip_iq_(flip_iq), buffer_ (RTL_TCP_BUFFER_SIZE), unread_ (0) { boost::system::error_code ec; // 1. Setup lookup table for (unsigned i = 0; i < 0xff; i++) { lookup_[i] = ((float)(i & 0xff) - 127.4f) * (1.0f / 128.0f); } // 2. Set socket options ip::address addr = ip::address::from_string (address, ec); if (ec) { std::cout << address << " is not an IP address" << std::endl; LOG (ERROR) << address << " is not an IP address"; return; } ip::tcp::endpoint ep (addr, port); socket_.open (ep.protocol( ), ec); if (ec) { std::cout << "Failed to open socket." << std::endl; LOG (ERROR) << "Failed to open socket."; } socket_.set_option (boost::asio::socket_base::reuse_address (true), ec); if (ec) { std::cout << "Failed to set reuse address option: " << ec << std::endl; LOG (WARNING) << "Failed to set reuse address option"; } socket_.set_option (boost::asio::socket_base::linger (true, 0), ec); if (ec) { std::cout << "Failed to set linger option: " << ec << std::endl; LOG (WARNING) << "Failed to set linger option"; } // 3. Connect socket socket_.connect(ep, ec); if (ec) { std::cout << "Failed to connect to " << addr << ":" << port << "(" << ec << ")" << std::endl; LOG (ERROR) << "Failed to connect to " << addr << ":" << port << "(" << ec << ")"; return; } std::cout << "Connected to " << addr << ":" << port << std::endl; LOG (INFO) << "Connected to " << addr << ":" << port; // 4. Set nodelay socket_.set_option (tcp::no_delay (true), ec); if (ec) { std::cout << "Failed to set no delay option." << std::endl; LOG (WARNING) << "Failed to set no delay option"; } // 5. Receive dongle info ec = info_.read (socket_); if (ec) { std::cout << "Failed to read dongle info." << std::endl; LOG (WARNING) << "Failed to read dongle info"; } else if (info_.is_valid ()) { std::cout << "Found " << info_.get_type_name() << " tuner." << std::endl; LOG (INFO) << "Found " << info_.get_type_name() << " tuner."; } // 6. Start reading boost::asio::async_read (socket_, boost::asio::buffer (data_), boost::bind (&rtl_tcp_signal_source_c::handle_read, this, _1, _2)); boost::thread (boost::bind (&boost::asio::io_service::run, &io_service_)); } rtl_tcp_signal_source_c::~rtl_tcp_signal_source_c() { io_service_.stop (); } int rtl_tcp_signal_source_c::work (int noutput_items, gr_vector_const_void_star &/*input_items*/, gr_vector_void_star &output_items) { gr_complex *out = reinterpret_cast ( output_items[0] ); int i = 0; if (io_service_.stopped ()) { return -1; } { boost::mutex::scoped_lock lock (mutex_); not_empty_.wait (lock, boost::bind (&rtl_tcp_signal_source_c::not_empty, this)); for ( ; i < noutput_items && unread_ > 1; i++ ) { float re = buffer_[--unread_]; float im = buffer_[--unread_]; if (flip_iq_) { out[i] = gr_complex (im, re); } else { out[i] = gr_complex (re, im); } } } not_full_.notify_one (); return i == 0 ? -1 : i; } void rtl_tcp_signal_source_c::set_frequency (int frequency) { boost::system::error_code ec = rtl_tcp_command (RTL_TCP_SET_FREQUENCY, frequency, socket_); if (ec) { std::cout << "Failed to set frequency" << std::endl; LOG (WARNING) << "Failed to set frequency"; } } void rtl_tcp_signal_source_c::set_sample_rate (int sample_rate) { boost::system::error_code ec = rtl_tcp_command (RTL_TCP_SET_SAMPLE_RATE, sample_rate, socket_); if (ec) { std::cout << "Failed to set sample rate" << std::endl; LOG (WARNING) << "Failed to set sample rate"; } } void rtl_tcp_signal_source_c::set_agc_mode (bool agc) { boost::system::error_code ec = rtl_tcp_command (RTL_TCP_SET_GAIN_MODE, !agc, socket_); if (ec) { std::cout << "Failed to set gain mode" << std::endl; LOG (WARNING) << "Failed to set gain mode"; } ec = rtl_tcp_command (RTL_TCP_SET_AGC_MODE, agc, socket_); if (ec) { std::cout << "Failed to set gain mode" << std::endl; LOG (WARNING) << "Failed to set gain mode"; } } void rtl_tcp_signal_source_c::set_gain (int gain) { unsigned clipped = static_cast (info_.clip_gain (gain) * 10.0); boost::system::error_code ec = rtl_tcp_command (RTL_TCP_SET_GAIN, clipped, socket_); if (ec) { std::cout << "Failed to set gain" << std::endl; LOG (WARNING) << "Failed to set gain"; } } void rtl_tcp_signal_source_c::set_if_gain (int gain) { // from gr-osmosdr struct range { double start, stop, step; }; if (info_.get_tuner_type () != rtl_tcp_dongle_info::TUNER_E4000) { return; } std::vector ranges = { { -3, 6, 9 }, { 0, 9, 3 }, { 0, 9, 3 }, { 0, 2, 1 }, { 3, 15, 3}, { 3, 15, 3} }; std::map gains; for (int i = 0; i < static_cast(ranges.size ()); i++) { gains[i+1] = ranges[i].start; } for (int i = ranges.size() - 1; i >= 0; i--) { const range &r = ranges[i]; double error = gain; for (double g = r.start; g < r.stop; g += r.step) { double sum = 0; for (int j = 0; j < static_cast ( gains.size() ); j++) { if (i == j) { sum += g; } else { sum += gains[j + 1]; } } double err = std::abs (gain - sum); if (err < error) { error = err; gains[i+1] = g; } } } for (unsigned stage = 1; stage <= gains.size(); stage++) { int stage_gain = static_cast( gains[stage] * 10 ); unsigned param = (stage << 16) | (stage_gain & 0xffff); boost::system::error_code ec = rtl_tcp_command (RTL_TCP_SET_IF_GAIN, param, socket_); if (ec) { std::cout << "Failed to set if gain" << std::endl; LOG (WARNING) << "Failed to set if gain"; } } } void rtl_tcp_signal_source_c::handle_read (const boost::system::error_code &ec, size_t bytes_transferred) { if (ec) { std::cout << "Error during read: " << ec << std::endl; LOG (WARNING) << "Error during read: " << ec; boost::mutex::scoped_lock lock (mutex_); io_service_.stop (); not_empty_.notify_one (); } else { { // Unpack read data boost::mutex::scoped_lock lock (mutex_); not_full_.wait (lock, boost::bind (&rtl_tcp_signal_source_c::not_full, this)); for (size_t i = 0; i < bytes_transferred; i++) { while (!not_full( )) { // uh-oh, buffer overflow // wait until there's space for more not_empty_.notify_one (); // needed? not_full_.wait (lock, boost::bind (&rtl_tcp_signal_source_c::not_full, this)); } buffer_.push_front (lookup_[data_[i]]); unread_++; } } // let woker know that more data is available not_empty_.notify_one (); // Read some more boost::asio::async_read (socket_, boost::asio::buffer (data_), boost::bind (&rtl_tcp_signal_source_c::handle_read, this, _1, _2)); } } gnss-sdr-0.0.9/src/algorithms/signal_source/gnuradio_blocks/rtl_tcp_signal_source_c.h000066400000000000000000000074601305042567700313010ustar00rootroot00000000000000/*! * \file rtl_tcp_signal_source_c.h * \brief Interface of an rtl_tcp signal source reader. * \author Anthony Arnold, 2015. anthony.arnold(at)uqconnect.edu.au * * The implementation of this block is a combination of various helpful * sources. The data format and command structure is taken from the * original Osmocom rtl_tcp_source_f (http://git.osmocom.org/gr-osmosdr). * The aynchronous reading code comes from the examples provides * by Boost.Asio and the bounded buffer producer-consumer solution is * taken from the Boost.CircularBuffer examples (http://boost.org/). * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_RTL_TCP_SIGNAL_SOURCE_C_H #define GNSS_SDR_RTL_TCP_SIGNAL_SOURCE_C_H #include "rtl_tcp_dongle_info.h" #include #include #include #include #include #include #include class rtl_tcp_signal_source_c; typedef boost::shared_ptr rtl_tcp_signal_source_c_sptr; rtl_tcp_signal_source_c_sptr rtl_tcp_make_signal_source_c(const std::string &address, short port, bool flip_iq = false); /*! * \brief This class reads interleaved I/Q samples * from an rtl_tcp server and outputs complex types. */ class rtl_tcp_signal_source_c : public gr::sync_block { public: ~rtl_tcp_signal_source_c(); int work (int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); void set_frequency (int frequency); void set_sample_rate (int sample_rate); void set_agc_mode (bool agc); void set_gain (int gain); void set_if_gain (int gain); private: typedef boost::circular_buffer_space_optimized buffer_type; friend rtl_tcp_signal_source_c_sptr rtl_tcp_make_signal_source_c(const std::string &address, short port, bool flip_iq); rtl_tcp_signal_source_c(const std::string &address, short port, bool flip_iq); rtl_tcp_dongle_info info_; // IO members boost::asio::io_service io_service_; boost::asio::ip::tcp::socket socket_; std::vector data_; bool flip_iq_; // producer-consumer helpers boost::mutex mutex_; boost::condition not_full_; boost::condition not_empty_; buffer_type buffer_; size_t unread_; // lookup for scaling data boost::array lookup_; // async read callback void handle_read (const boost::system::error_code &ec, size_t bytes_transferred); inline bool not_full ( ) const { return unread_ < buffer_.capacity( ); } inline bool not_empty ( ) const { return unread_ > 0 || io_service_.stopped (); } }; #endif //GNSS_SDR_RTL_TCP_SIGNAL_SOURCE_C_H gnss-sdr-0.0.9/src/algorithms/signal_source/gnuradio_blocks/unpack_2bit_samples.cc000066400000000000000000000160111305042567700304660ustar00rootroot00000000000000/*! * \file unpack_2bit_samples.cc * * \brief Unpacks 2 bit samples that have been packed into bytes or shorts * \author Cillian O'Driscoll cillian.odriscoll (at) gmail.com * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "unpack_2bit_samples.h" #include struct byte_2bit_struct { signed sample_0:2; // <- 2 bits wide only signed sample_1:2; // <- 2 bits wide only signed sample_2:2; // <- 2 bits wide only signed sample_3:2; // <- 2 bits wide only }; union byte_and_samples { int8_t byte; byte_2bit_struct samples; }; bool systemIsBigEndian() { union { uint32_t i; char c[4]; } test_int = {0x01020304}; return test_int.c[0] == 1; } bool systemBytesAreBigEndian() { byte_and_samples b; b.byte = static_cast(0x01); if(*(char *)&b.byte == 1) return false; else return true; } void swapEndianness( int8_t const *in, std::vector< int8_t > &out, size_t item_size, unsigned int ninput_items ) { unsigned int i; unsigned int j = 0; int k = 0; int l = 0; size_t skip = item_size - 1; for( i = 0; i < ninput_items; ++i ) { k = j + skip; l = j; while( k >= l ) { out[j++] = in[k--]; } } } unpack_2bit_samples_sptr make_unpack_2bit_samples( bool big_endian_bytes, size_t item_size, bool big_endian_items, bool reverse_interleaving ) { return unpack_2bit_samples_sptr( new unpack_2bit_samples( big_endian_bytes, item_size, big_endian_items, reverse_interleaving ) ); } unpack_2bit_samples::unpack_2bit_samples( bool big_endian_bytes, size_t item_size, bool big_endian_items, bool reverse_interleaving ) : sync_interpolator("unpack_2bit_samples", gr::io_signature::make(1, 1, item_size), gr::io_signature::make(1, 1, sizeof(char)), 4*item_size ), // we make 4 bytes out for every byte in big_endian_bytes_(big_endian_bytes), item_size_(item_size), big_endian_items_(big_endian_items), swap_endian_items_(false), reverse_interleaving_(reverse_interleaving) { bool big_endian_system = systemIsBigEndian(); // Only swap the item bytes if the item size > 1 byte and the system // endianess is not the same as the item endianness: swap_endian_items_ = ( item_size_ > 1 ) && ( big_endian_system != big_endian_items); bool big_endian_bytes_system = systemBytesAreBigEndian(); swap_endian_bytes_ = ( big_endian_bytes_system != big_endian_bytes_ ); } unpack_2bit_samples::~unpack_2bit_samples() {} int unpack_2bit_samples::work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { signed char const *in = (signed char const *)input_items[0]; int8_t *out = (int8_t*)output_items[0]; size_t ninput_bytes = noutput_items/4; size_t ninput_items = ninput_bytes/item_size_; // Handle endian swap if needed if( swap_endian_items_ ) { work_buffer_.reserve( ninput_bytes ); swapEndianness( in, work_buffer_, item_size_, ninput_items ); in = const_cast< signed char const *> ( &work_buffer_[0] ); } // Here the in pointer can be interpreted as a stream of bytes to be // converted. But we now have two possibilities: // 1) The samples in a byte are in big endian order // 2) The samples in a byte are in little endian order byte_and_samples raw_byte; int n = 0; if( !reverse_interleaving_ ) { if( swap_endian_bytes_ ) { for(unsigned int i = 0; i < ninput_bytes; ++i) { // Read packed input sample (1 byte = 4 samples) raw_byte.byte = in[i]; out[n++] = (int8_t)( 2*raw_byte.samples.sample_3 + 1 ); out[n++] = (int8_t)( 2*raw_byte.samples.sample_2 + 1 ); out[n++] = (int8_t)( 2*raw_byte.samples.sample_1 + 1 ); out[n++] = (int8_t)( 2*raw_byte.samples.sample_0 + 1 ); } } else { for(unsigned int i = 0; i < ninput_bytes; ++i ) { // Read packed input sample (1 byte = 4 samples) raw_byte.byte = in[i]; out[n++] = (int8_t)( 2*raw_byte.samples.sample_0 + 1 ); out[n++] = (int8_t)( 2*raw_byte.samples.sample_1 + 1 ); out[n++] = (int8_t)( 2*raw_byte.samples.sample_2 + 1 ); out[n++] = (int8_t)( 2*raw_byte.samples.sample_3 + 1 ); } } } else { if( swap_endian_bytes_ ) { for(unsigned int i = 0; i < ninput_bytes; ++i) { // Read packed input sample (1 byte = 4 samples) raw_byte.byte = in[i]; out[n++] = (int8_t)( 2*raw_byte.samples.sample_2 + 1 ); out[n++] = (int8_t)( 2*raw_byte.samples.sample_3 + 1 ); out[n++] = (int8_t)( 2*raw_byte.samples.sample_0 + 1 ); out[n++] = (int8_t)( 2*raw_byte.samples.sample_1 + 1 ); } } else { for(unsigned int i = 0; i < ninput_bytes; ++i ) { // Read packed input sample (1 byte = 4 samples) raw_byte.byte = in[i]; out[n++] = (int8_t)( 2*raw_byte.samples.sample_1 + 1 ); out[n++] = (int8_t)( 2*raw_byte.samples.sample_0 + 1 ); out[n++] = (int8_t)( 2*raw_byte.samples.sample_3 + 1 ); out[n++] = (int8_t)( 2*raw_byte.samples.sample_2 + 1 ); } } } return noutput_items; } gnss-sdr-0.0.9/src/algorithms/signal_source/gnuradio_blocks/unpack_2bit_samples.h000066400000000000000000000103011305042567700303240ustar00rootroot00000000000000/*! * \file unpack_2bit_samples.h * * \brief Unpacks 2 bit samples * samples may be packed in any of the following ways: * 1) Into bytes [ item == byte ] * 1a) Big endian ordering within the byte * 1b) Little endian ordering within the byte * 2) Into shorts [ item == short ] * 2a) Big endian ordering of bytes, big endian within the byte * 2b) Big endian ordering of bytes, little endian within the byte * 2c) Little endian ordering of bytes, big endian within the byte * 2d) Little endian ordering of bytes, little endian within the byte * * Within a byte the two possibilities look like this: * 7 6 5 4 3 2 1 0 : Bit number * x_n,1 x_n,0 x_n+1,1 x_n+1,0 x_n+2,1 x_n+2,0 x_n+3,1 x_n+3,0 : Little endian * x_n+3,1 x_n+3,0 x_n+2,1 x_n+2,0 x_n+1,0 x_n+1,0 x_n,1 x_n, 0 : Big Endian * * For a short (uint16_t) the bytes are either transmitted as follows: * * 1 0 : Byte number * Byte_n Byte_n+1 : Little endian * Byte_n+1 Byte_n : Bit endian * * The two bit values are assumed to have the following mapping: * * x_1 x_0 Value * 0 0 +1 * 0 1 +3 * 1 0 -3 * 1 1 -1 * * Letting x denote the two's complement interpretation of x_1 x_0, then: * * Value = 2*x + 1 * * We want to output the data in the order: * * Value_0, Value_1, Value_2, ..., Value_n, Value_n+1, Value_n+2, ... * * \author Cillian O'Driscoll cillian.odriscoll (at) gmail . com * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_UNPACK_2BIT_SAMPLES_H #define GNSS_SDR_UNPACK_2BIT_SAMPLES_H #include #include class unpack_2bit_samples; typedef boost::shared_ptr unpack_2bit_samples_sptr; unpack_2bit_samples_sptr make_unpack_2bit_samples( bool big_endian_bytes, size_t item_size, bool big_endian_items, bool reverse_interleaving = false ); /*! * \brief This class takes 2 bit samples that have been packed into bytes or * shorts as input and generates a byte for each sample. It generates eight * times as much data as is input (every two bits become 16 bits) */ class unpack_2bit_samples: public gr::sync_interpolator { private: friend unpack_2bit_samples_sptr make_unpack_2bit_samples_sptr( bool big_endian_bytes, size_t item_size, bool big_endian_items, bool reverse_interleaving); bool big_endian_bytes_; size_t item_size_; bool big_endian_items_; bool swap_endian_items_; bool swap_endian_bytes_; bool reverse_interleaving_; std::vector< int8_t > work_buffer_; public: unpack_2bit_samples( bool big_endianBytes, size_t item_size, bool big_endian_items, bool reverse_interleaving ); ~unpack_2bit_samples(); int work (int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; #endif gnss-sdr-0.0.9/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_2bit_cpx_samples.cc000066400000000000000000000073221305042567700323700ustar00rootroot00000000000000/*! * \file unpack_byte_2bit_cpx_samples.cc * * \brief Unpacks byte samples to 2 bits complex samples. * Packing Order * Most Significant Nibble - Sample n * Least Significant Nibble - Sample n+1 * Packing order in Nibble Q1 Q0 I1 I0 * \author Javier Arribas jarribas (at) cttc.es * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "unpack_byte_2bit_cpx_samples.h" #include struct byte_2bit_struct { signed two_bit_sample:2; // <- 2 bits wide only }; unpack_byte_2bit_cpx_samples_sptr make_unpack_byte_2bit_cpx_samples() { return unpack_byte_2bit_cpx_samples_sptr(new unpack_byte_2bit_cpx_samples()); } unpack_byte_2bit_cpx_samples::unpack_byte_2bit_cpx_samples() : sync_interpolator("unpack_byte_2bit_cpx_samples", gr::io_signature::make(1, 1, sizeof(signed char)), gr::io_signature::make(1, 1, sizeof(short)), 4) {} unpack_byte_2bit_cpx_samples::~unpack_byte_2bit_cpx_samples() {} int unpack_byte_2bit_cpx_samples::work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { const signed char *in = (const signed char *)input_items[0]; short *out = (short*)output_items[0]; byte_2bit_struct sample; int n = 0; for(int i = 0; i < noutput_items/4; i++) { // Read packed input sample (1 byte = 2 complex samples) //* Packing Order //* Most Significant Nibble - Sample n //* Least Significant Nibble - Sample n+1 //* Packing order in Nibble Q1 Q0 I1 I0 //normal // signed char c = in[i]; // //Q[n] // sample.two_bit_sample = (c>>6) & 3; // out[n++] = (2*(short)sample.two_bit_sample+1); // //I[n] // sample.two_bit_sample = (c>>4) & 3; // out[n++] = (2*(short)sample.two_bit_sample+1); // //Q[n+1] // sample.two_bit_sample = (c>>2) & 3; // out[n++] = (2*(short)sample.two_bit_sample+1); // //I[n+1] // sample.two_bit_sample = c & 3; // out[n++] = (2*(short)sample.two_bit_sample+1); //I/Q swap signed char c = in[i]; //I[n] sample.two_bit_sample = (c >> 4) & 3; out[n++] = (2*(short)sample.two_bit_sample + 1); //Q[n] sample.two_bit_sample = (c >> 6) & 3; out[n++] = (2*(short)sample.two_bit_sample + 1); //I[n+1] sample.two_bit_sample = c & 3; out[n++] = (2*(short)sample.two_bit_sample + 1); //Q[n+1] sample.two_bit_sample = (c >> 2) & 3; out[n++] = (2*(short)sample.two_bit_sample + 1); } return noutput_items; } gnss-sdr-0.0.9/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_2bit_cpx_samples.h000066400000000000000000000042201305042567700322240ustar00rootroot00000000000000/*! * \file unpack_byte_2bit_cpx_samples.h * * \brief Unpacks byte samples to 2 bits complex samples. * Packing Order * Most Significant Nibble - Sample n * Least Significant Nibble - Sample n+1 * Packing order in Nibble Q1 Q0 I1 I0 * \author Javier Arribas jarribas (at) cttc.es * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_UNPACK_BYTE_2BIT_CPX_SAMPLES_H #define GNSS_SDR_UNPACK_BYTE_2BIT_CPX_SAMPLES_H #include class unpack_byte_2bit_cpx_samples; typedef boost::shared_ptr unpack_byte_2bit_cpx_samples_sptr; unpack_byte_2bit_cpx_samples_sptr make_unpack_byte_2bit_cpx_samples(); /*! * \brief This class implements conversion between byte packet samples to 2bit_cpx samples * 1 byte = 2 x complex 2bit I, + 2bit Q samples */ class unpack_byte_2bit_cpx_samples: public gr::sync_interpolator { private: friend unpack_byte_2bit_cpx_samples_sptr make_unpack_byte_2bit_cpx_samples_sptr(); public: unpack_byte_2bit_cpx_samples(); ~unpack_byte_2bit_cpx_samples(); int work (int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; #endif gnss-sdr-0.0.9/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_2bit_samples.cc000066400000000000000000000051061305042567700315140ustar00rootroot00000000000000/*! * \file unpack_byte_2bit_samples.cc * * \brief Unpacks byte samples to NSR 2 bits samples * \author Javier Arribas jarribas (at) cttc.es * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "unpack_byte_2bit_samples.h" #include struct byte_2bit_struct { signed two_bit_sample:2; // <- 2 bits wide only }; unpack_byte_2bit_samples_sptr make_unpack_byte_2bit_samples() { return unpack_byte_2bit_samples_sptr(new unpack_byte_2bit_samples()); } unpack_byte_2bit_samples::unpack_byte_2bit_samples() : sync_interpolator("unpack_byte_2bit_samples", gr::io_signature::make(1, 1, sizeof(signed char)), gr::io_signature::make(1, 1, sizeof(float)), 4) {} unpack_byte_2bit_samples::~unpack_byte_2bit_samples() {} int unpack_byte_2bit_samples::work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { const signed char *in = (const signed char *)input_items[0]; float *out = (float*)output_items[0]; byte_2bit_struct sample; int n = 0; for(int i = 0; i < noutput_items/4; i++) { // Read packed input sample (1 byte = 4 samples) signed char c = in[i]; sample.two_bit_sample = c & 3; out[n++] = (float)sample.two_bit_sample; sample.two_bit_sample = (c>>2) & 3; out[n++] = (float)sample.two_bit_sample; sample.two_bit_sample = (c>>4) & 3; out[n++] = (float)sample.two_bit_sample; sample.two_bit_sample = (c>>6) & 3; out[n++] = (float)sample.two_bit_sample; } return noutput_items; } gnss-sdr-0.0.9/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_2bit_samples.h000066400000000000000000000036511305042567700313610ustar00rootroot00000000000000/*! * \file unpack_byte_2bit_samples.h * * \brief Unpacks byte samples to NSR 2 bits samples * \author Javier Arribas jarribas (at) cttc.es * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_UNPACK_BYTE_2BIT_SAMPLES_H #define GNSS_SDR_UNPACK_BYTE_2BIT_SAMPLES_H #include class unpack_byte_2bit_samples; typedef boost::shared_ptr unpack_byte_2bit_samples_sptr; unpack_byte_2bit_samples_sptr make_unpack_byte_2bit_samples(); /*! * \brief This class implements conversion between byte packet samples to 2bit samples * 1 byte = 4 2bit samples */ class unpack_byte_2bit_samples: public gr::sync_interpolator { private: friend unpack_byte_2bit_samples_sptr make_unpack_byte_2bit_samples_sptr(); public: unpack_byte_2bit_samples(); ~unpack_byte_2bit_samples(); int work (int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; #endif gnss-sdr-0.0.9/src/algorithms/signal_source/gnuradio_blocks/unpack_intspir_1bit_samples.cc000066400000000000000000000053531305042567700322440ustar00rootroot00000000000000/*! * \file unpack_intspir_1bit_samples.cc * * \brief Unpacks SPIR int samples to NSR 1 bit samples * \author Fran Fabra fabra (at) ice.csic.es * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) * * GNSS-SDR is a software defined Global Navigation * Satellite Systems receiver * * This file is not 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 . * * ------------------------------------------------------------------------- */ #include "unpack_intspir_1bit_samples.h" #include unpack_intspir_1bit_samples_sptr make_unpack_intspir_1bit_samples() { return unpack_intspir_1bit_samples_sptr(new unpack_intspir_1bit_samples()); } unpack_intspir_1bit_samples::unpack_intspir_1bit_samples() : sync_interpolator("unpack_intspir_1bit_samples", gr::io_signature::make(1, 1, sizeof(int)), gr::io_signature::make(1, 1, sizeof(float)), 2) {} unpack_intspir_1bit_samples::~unpack_intspir_1bit_samples() {} int unpack_intspir_1bit_samples::work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { const signed int *in = (const signed int *)input_items[0]; float *out = (float*)output_items[0]; int n = 0; int channel = 1; for(int i = 0; i < noutput_items/2; i++) { // Read packed input sample (1 byte = 1 complex sample) // For historical reasons, values are float versions of short int limits (32767) signed int val = in[i]; if(((val >> ((channel - 1)*2)) & 1) == 1) { out[n++] = static_cast(32767.0); } else { out[n++] = static_cast(-32767.0); } if(((val >> (2*channel - 1)) & 1) == 1) { out[n++] = static_cast(32767.0); } else { out[n++] = static_cast(-32767.0); } } return noutput_items; } gnss-sdr-0.0.9/src/algorithms/signal_source/gnuradio_blocks/unpack_intspir_1bit_samples.h000066400000000000000000000037241305042567700321060ustar00rootroot00000000000000/*! * \file unpack_intspir_1bit_samples.h * * \brief Unpacks SPIR int samples to NSR 1 bit samples * \author Fran Fabra fabra (at) ice.csic.es * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) * * GNSS-SDR is a software defined Global Navigation * Satellite Systems receiver * * This file is not 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_UNPACK_INTSPIR_1BIT_SAMPLES_H #define GNSS_SDR_UNPACK_INTSPIR_1BIT_SAMPLES_H #include class unpack_intspir_1bit_samples; typedef boost::shared_ptr unpack_intspir_1bit_samples_sptr; unpack_intspir_1bit_samples_sptr make_unpack_intspir_1bit_samples(); /*! * \brief This class implements conversion between byte packet samples to 2bit samples * 1 byte = 4 2bit samples */ class unpack_intspir_1bit_samples: public gr::sync_interpolator { private: friend unpack_intspir_1bit_samples_sptr make_unpack_intspir_1bit_samples_sptr(); public: unpack_intspir_1bit_samples(); ~unpack_intspir_1bit_samples(); int work (int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; #endif gnss-sdr-0.0.9/src/algorithms/signal_source/libs/000077500000000000000000000000001305042567700220175ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/signal_source/libs/CMakeLists.txt000066400000000000000000000021431305042567700245570ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # set (SIGNAL_SOURCE_LIB_SOURCES rtl_tcp_commands.cc rtl_tcp_dongle_info.cc) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${Boost_INCLUDE_DIRS} ) file(GLOB SIGNAL_SOURCE_LIB_HEADERS "*.h") list(SORT SIGNAL_SOURCE_LIB_HEADERS) add_library(signal_source_lib ${SIGNAL_SOURCE_LIB_SOURCES} ${SIGNAL_SOURCE_LIB_HEADERS}) source_group(Headers FILES ${SIGNAL_SOURCE_LIB_HEADERS})gnss-sdr-0.0.9/src/algorithms/signal_source/libs/rtl_tcp_commands.cc000066400000000000000000000034431305042567700256620ustar00rootroot00000000000000/*! * \file rtl_tcp_commands.cc * \brief Defines methods for communicating with rtl_tcp * \author Anthony Arnold, 2015. anthony.arnold(at)uqconnect.edu.au * * This file contains information taken from librtlsdr: * http://git.osmocom.org/rtl-sdr/ * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "rtl_tcp_commands.h" #include using boost::asio::ip::tcp; boost::system::error_code rtl_tcp_command (RTL_TCP_COMMAND id, unsigned param, tcp::socket &socket) { // Data payload unsigned char data[sizeof (unsigned char) + sizeof (unsigned)]; data[0] = static_cast (id); unsigned nparam = boost::asio::detail::socket_ops::host_to_network_long (param); ::memcpy (&data[1], &nparam, sizeof (nparam)); boost::system::error_code ec; socket.send (boost::asio::buffer (data), 0, ec); return ec; } gnss-sdr-0.0.9/src/algorithms/signal_source/libs/rtl_tcp_commands.h000066400000000000000000000035171305042567700255260ustar00rootroot00000000000000/*! * \file rtl_tcp_commands.h * \brief Defines structures and constants for communicating with rtl_tcp * \author Anthony Arnold, 2015. anthony.arnold(at)uqconnect.edu.au * * This file contains information taken from librtlsdr: * http://git.osmocom.org/rtl-sdr/ * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_RTL_TCP_COMMANDS_H #define GNSS_SDR_RTL_TCP_COMMANDS_H #include /// Command IDs for configuration rtl_tcp enum RTL_TCP_COMMAND { RTL_TCP_SET_FREQUENCY = 1, RTL_TCP_SET_SAMPLE_RATE = 2, RTL_TCP_SET_GAIN_MODE = 3, RTL_TCP_SET_GAIN = 4, RTL_TCP_SET_IF_GAIN = 6, RTL_TCP_SET_AGC_MODE = 8 }; /*! * \brief Send a command to rtl_tcp over the given socket. */ boost::system::error_code rtl_tcp_command (RTL_TCP_COMMAND id, unsigned param, boost::asio::ip::tcp::socket &socket); #endif // GNSS_SDR_RTL_TCP_COMMANDS_H gnss-sdr-0.0.9/src/algorithms/signal_source/libs/rtl_tcp_dongle_info.cc000066400000000000000000000101411305042567700263350ustar00rootroot00000000000000/*! * \file rtl_tcp_dongle_info.cc * \brief Defines methods for retrieving and validating rtl_tcp donle * info. * \author Anthony Arnold, 2015. anthony.arnold(at)uqconnect.edu.au * * This file contains information taken from librtlsdr: * http://git.osmocom.org/rtl-sdr/ * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "rtl_tcp_dongle_info.h" #include #include using boost::asio::ip::tcp; rtl_tcp_dongle_info::rtl_tcp_dongle_info () : tuner_type_ (0), tuner_gain_count_ (0) { ::memset (magic_, 0, sizeof (magic_)); } boost::system::error_code rtl_tcp_dongle_info::read (tcp::socket &socket) { boost::system::error_code ec; unsigned char data[sizeof (char) * 4 + sizeof (uint32_t) * 2]; socket.receive (boost::asio::buffer (data), 0, ec); if (!ec) { ::memcpy (magic_, data, 4); uint32_t type; ::memcpy (&type, &data[4], 4); tuner_type_ = boost::asio::detail::socket_ops::network_to_host_long (type); uint32_t count; ::memcpy (&count, &data[8], 4); tuner_gain_count_ = boost::asio::detail::socket_ops::network_to_host_long (count); } return ec; } const char *rtl_tcp_dongle_info::get_type_name () const { switch (get_tuner_type()) { default: return "UNKNOWN"; case TUNER_E4000: return "E4000"; case TUNER_FC0012: return "FC0012"; case TUNER_FC0013: return "FC0013"; case TUNER_FC2580: return "FC2580"; case TUNER_R820T: return "R820T"; case TUNER_R828D: return "R828D"; } } double rtl_tcp_dongle_info::clip_gain (int gain) const { // the following gain values have been copied from librtlsdr // all gain values are expressed in tenths of a dB std::vector gains; switch (get_tuner_type()) { case TUNER_E4000: gains = { -10, 15, 40, 65, 90, 115, 140, 165, 190, 215, 240, 290, 340, 420 }; break; case TUNER_FC0012: gains = { -99, -40, 71, 179, 192 }; break; case TUNER_FC0013: gains = { -99, -73, -65, -63, -60, -58, -54, 58, 61, 63, 65, 67, 68, 70, 71, 179, 181, 182, 184, 186, 188, 191, 197 }; break; case TUNER_R820T: gains = { 0, 9, 14, 27, 37, 77, 87, 125, 144, 157, 166, 197, 207, 229, 254, 280, 297, 328, 338, 364, 372, 386, 402, 421, 434, 439, 445, 480, 496 }; break; default: // no gains break; } // clip if (gains.size() == 0) { // no defined gains to clip to return gain; } else { double last_stop = gains.front (); BOOST_FOREACH (double g, gains) { g /= 10.0; if (gain < g) { if (std::abs (gain - g) < std::abs (gain - last_stop)) { return g; } else { return last_stop; } } last_stop = g; } return last_stop; } } bool rtl_tcp_dongle_info::is_valid () const { return ::memcmp (magic_, "RTL0", 4) == 0; } gnss-sdr-0.0.9/src/algorithms/signal_source/libs/rtl_tcp_dongle_info.h000066400000000000000000000042761305042567700262130ustar00rootroot00000000000000/*! * \file rtl_tcp_dongle_info.h * \brief Interface for a structure sent by rtl_tcp defining the hardware. * \author Anthony Arnold, 2015. anthony.arnold(at)uqconnect.edu.au * * This file contains information taken from librtlsdr: * http://git.osmocom.org/rtl-sdr/ * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_RTL_TCP_DONGLE_INFO_H #define GNSS_SDR_RTL_TCP_DONGLE_INFO_H #include /*! * \brief This class represents the dongle information * which is sent by rtl_tcp. */ class rtl_tcp_dongle_info { public: enum { TUNER_UNKNOWN = 0, TUNER_E4000, TUNER_FC0012, TUNER_FC0013, TUNER_FC2580, TUNER_R820T, TUNER_R828D }; private: char magic_[4]; uint32_t tuner_type_; uint32_t tuner_gain_count_; public: rtl_tcp_dongle_info (); boost::system::error_code read ( boost::asio::ip::tcp::socket &socket); bool is_valid () const; const char *get_type_name () const; double clip_gain (int gain) const; inline uint32_t get_tuner_type () const { return tuner_type_; } inline uint32_t get_tuner_gain_count () const { return tuner_gain_count_; } }; #endif // GNSS_SDR_RTL_TCP_DONGLE_INFO_H gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/000077500000000000000000000000001305042567700217305ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/CMakeLists.txt000066400000000000000000000014611305042567700244720ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # add_subdirectory(adapters) add_subdirectory(gnuradio_blocks) add_subdirectory(libs)gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/adapters/000077500000000000000000000000001305042567700235335ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/adapters/CMakeLists.txt000066400000000000000000000034241305042567700262760ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # set(TELEMETRY_DECODER_ADAPTER_SOURCES gps_l1_ca_telemetry_decoder.cc gps_l2c_telemetry_decoder.cc galileo_e1b_telemetry_decoder.cc sbas_l1_telemetry_decoder.cc galileo_e5a_telemetry_decoder.cc ) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/interfaces ${CMAKE_SOURCE_DIR}/src/core/receiver ${CMAKE_SOURCE_DIR}/src/algorithms/telemetry_decoder/gnuradio_blocks ${CMAKE_SOURCE_DIR}/src/algorithms/telemetry_decoder/libs ${Boost_INCLUDE_DIRS} ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ) file(GLOB TELEMETRY_DECODER_ADAPTER_HEADERS "*.h") list(SORT TELEMETRY_DECODER_ADAPTER_HEADERS) add_library(telemetry_decoder_adapters ${TELEMETRY_DECODER_ADAPTER_SOURCES} ${TELEMETRY_DECODER_ADAPTER_HEADERS}) source_group(Headers FILES ${TELEMETRY_DECODER_ADAPTER_HEADERS}) target_link_libraries(telemetry_decoder_adapters telemetry_decoder_gr_blocks gnss_system_parameters ${GNURADIO_RUNTIME_LIBRARIES}) gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/adapters/galileo_e1b_telemetry_decoder.cc000066400000000000000000000065771305042567700320030ustar00rootroot00000000000000/*! * \file galileo_e1b_telemetry_decoder.cc * \brief Implementation of an adapter of a Galileo INAV data decoder block * to a TelemetryDecoderInterface * \author Javier Arribas 2013. jarribas(at)cttc.es, * Mara Branzanti 2013. mara.branzanti(at)gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_e1b_telemetry_decoder.h" #include #include #include "configuration_interface.h" #include "concurrent_queue.h" #include "galileo_ephemeris.h" #include "galileo_almanac.h" #include "galileo_iono.h" #include "galileo_utc_model.h" using google::LogMessage; GalileoE1BTelemetryDecoder::GalileoE1BTelemetryDecoder(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { std::string default_dump_filename = "./navigation.dat"; DLOG(INFO) << "role " << role; dump_ = configuration->property(role + ".dump", false); dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename); // make telemetry decoder object telemetry_decoder_ = galileo_e1b_make_telemetry_decoder_cc(satellite_, dump_); // TODO fix me DLOG(INFO) << "telemetry_decoder(" << telemetry_decoder_->unique_id() << ")"; //decimation factor int decimation_factor = configuration->property(role + ".decimation_factor", 1); telemetry_decoder_->set_decimation(decimation_factor); channel_ = 0; } GalileoE1BTelemetryDecoder::~GalileoE1BTelemetryDecoder() {} void GalileoE1BTelemetryDecoder::set_satellite(Gnss_Satellite satellite) { satellite_ = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); telemetry_decoder_->set_satellite(satellite_); DLOG(INFO) << "GALILEO TELEMETRY DECODER: satellite set to " << satellite_; } void GalileoE1BTelemetryDecoder::connect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to connect internally DLOG(INFO) << "nothing to connect internally"; } void GalileoE1BTelemetryDecoder::disconnect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to disconnect } gr::basic_block_sptr GalileoE1BTelemetryDecoder::get_left_block() { return telemetry_decoder_; } gr::basic_block_sptr GalileoE1BTelemetryDecoder::get_right_block() { return telemetry_decoder_; } gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/adapters/galileo_e1b_telemetry_decoder.h000066400000000000000000000054171305042567700316350ustar00rootroot00000000000000/*! * \file galileo_e1b_telemetry_decoder.h * \brief Interface of an adapter of a GALILEO E1B NAV data decoder block * to a TelemetryDecoderInterface * \author Javier Arribas 2013 jarribas(at)cttc.es, * Mara Branzanti 2013. mara.branzanti(at)gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_E1B_TELEMETRY_DECODER_H_ #define GNSS_SDR_GALILEO_E1B_TELEMETRY_DECODER_H_ #include #include "telemetry_decoder_interface.h" #include "galileo_e1b_telemetry_decoder_cc.h" #include "gnss_satellite.h" class ConfigurationInterface; /*! * \brief This class implements a NAV data decoder for Galileo INAV frames in E1B radio link */ class GalileoE1BTelemetryDecoder : public TelemetryDecoderInterface { public: GalileoE1BTelemetryDecoder(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GalileoE1BTelemetryDecoder(); std::string role() { return role_; } /*! * \brief Returns "Galileo_E1B_Telemetry_Decoder" */ std::string implementation() { return "Galileo_E1B_Telemetry_Decoder"; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); void set_satellite(Gnss_Satellite satellite); void set_channel(int channel){telemetry_decoder_->set_channel(channel);} void reset() { return; } size_t item_size() { return 0; } private: galileo_e1b_telemetry_decoder_cc_sptr telemetry_decoder_; Gnss_Satellite satellite_; int channel_; bool dump_; std::string dump_filename_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; }; #endif gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/adapters/galileo_e5a_telemetry_decoder.cc000066400000000000000000000066151305042567700317770ustar00rootroot00000000000000/*! * \file galileo_e5a_telemetry_decoder.h * \brief Interface of an adapter of a GALILEO E5a FNAV data decoder block * to a TelemetryDecoderInterface * \author Marc Sales, 2014. marcsales92(at)gmail.com * \based on work from: *
      *
    • Javier Arribas, 2011. jarribas(at)cttc.es *
    * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_e5a_telemetry_decoder.h" #include #include #include "concurrent_queue.h" #include "galileo_ephemeris.h" #include "galileo_almanac.h" #include "galileo_iono.h" #include "galileo_utc_model.h" #include "configuration_interface.h" using google::LogMessage; GalileoE5aTelemetryDecoder::GalileoE5aTelemetryDecoder(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { std::string default_dump_filename = "./navigation.dat"; DLOG(INFO) << "role " << role; dump_ = configuration->property(role + ".dump", false); dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename); // make telemetry decoder object telemetry_decoder_ = galileo_e5a_make_telemetry_decoder_cc(satellite_, dump_); // TODO fix me DLOG(INFO) << "telemetry_decoder(" << telemetry_decoder_->unique_id() << ")"; DLOG(INFO) << "global navigation message queue assigned to telemetry_decoder ("<< telemetry_decoder_->unique_id() << ")"; channel_ = 0; } GalileoE5aTelemetryDecoder::~GalileoE5aTelemetryDecoder() {} void GalileoE5aTelemetryDecoder::set_satellite(Gnss_Satellite satellite) { satellite_ = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); telemetry_decoder_->set_satellite(satellite_); DLOG(INFO) << "TELEMETRY DECODER: satellite set to " << satellite_; } void GalileoE5aTelemetryDecoder::connect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to connect internally DLOG(INFO) << "nothing to connect internally"; } void GalileoE5aTelemetryDecoder::disconnect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to disconnect } gr::basic_block_sptr GalileoE5aTelemetryDecoder::get_left_block() { return telemetry_decoder_; } gr::basic_block_sptr GalileoE5aTelemetryDecoder::get_right_block() { return telemetry_decoder_; } gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/adapters/galileo_e5a_telemetry_decoder.h000066400000000000000000000055461305042567700316430ustar00rootroot00000000000000/*! * \file galileo_e5a_telemetry_decoder.h * \brief Interface of an adapter of a GALILEO E5a FNAV data decoder block * to a TelemetryDecoderInterface * \author Marc Sales, 2014. marcsales92(at)gmail.com * \based on work from: *
      *
    • Javier Arribas, 2011. jarribas(at)cttc.es *
    * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_E5A_TELEMETRY_DECODER_H_ #define GNSS_SDR_GALILEO_E5A_TELEMETRY_DECODER_H_ #include #include "telemetry_decoder_interface.h" #include "galileo_e5a_telemetry_decoder_cc.h" class ConfigurationInterface; /*! * \brief This class implements a NAV data decoder for Galileo INAV frames in E1B radio link */ class GalileoE5aTelemetryDecoder: public TelemetryDecoderInterface { public: GalileoE5aTelemetryDecoder(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GalileoE5aTelemetryDecoder(); std::string role() { return role_; } /*! * \brief Returns "Galileo_E5a_Telemetry_Decoder" */ std::string implementation() { return "Galileo_E5A_Telemetry_Decoder"; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); void set_satellite(Gnss_Satellite satellite); void set_channel(int channel){telemetry_decoder_->set_channel(channel);} void reset() { return; } size_t item_size() { return 0; } private: galileo_e5a_telemetry_decoder_cc_sptr telemetry_decoder_; Gnss_Satellite satellite_; int channel_; bool dump_; std::string dump_filename_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; }; #endif /* GNSS_SDR_GALILEO_E5A_TELEMETRY_DECODER_H_ */ gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/adapters/gps_l1_ca_telemetry_decoder.cc000066400000000000000000000066211305042567700314560ustar00rootroot00000000000000/*! * \file gps_l1_ca_telemetry_decoder.cc * \brief Implementation of an adapter of a GPS L1 C/A NAV data decoder block * to a TelemetryDecoderInterface * \author Javier Arribas, 2011. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l1_ca_telemetry_decoder.h" #include #include #include "concurrent_queue.h" #include "gps_ephemeris.h" #include "gps_almanac.h" #include "gps_iono.h" #include "gps_utc_model.h" #include "configuration_interface.h" using google::LogMessage; GpsL1CaTelemetryDecoder::GpsL1CaTelemetryDecoder(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { std::string default_dump_filename = "./navigation.dat"; DLOG(INFO) << "role " << role; dump_ = configuration->property(role + ".dump", false); dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename); // make telemetry decoder object telemetry_decoder_ = gps_l1_ca_make_telemetry_decoder_cc(satellite_, dump_); // TODO fix me DLOG(INFO) << "telemetry_decoder(" << telemetry_decoder_->unique_id() << ")"; //decimation factor int decimation_factor = configuration->property(role + ".decimation_factor", 1); telemetry_decoder_->set_decimation(decimation_factor); DLOG(INFO) << "global navigation message queue assigned to telemetry_decoder ("<< telemetry_decoder_->unique_id() << ")"; channel_ = 0; } GpsL1CaTelemetryDecoder::~GpsL1CaTelemetryDecoder() {} void GpsL1CaTelemetryDecoder::set_satellite(Gnss_Satellite satellite) { satellite_ = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); telemetry_decoder_->set_satellite(satellite_); DLOG(INFO) << "TELEMETRY DECODER: satellite set to " << satellite_; } void GpsL1CaTelemetryDecoder::connect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to connect internally DLOG(INFO) << "nothing to connect internally"; } void GpsL1CaTelemetryDecoder::disconnect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to disconnect } gr::basic_block_sptr GpsL1CaTelemetryDecoder::get_left_block() { return telemetry_decoder_; } gr::basic_block_sptr GpsL1CaTelemetryDecoder::get_right_block() { return telemetry_decoder_; } gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/adapters/gps_l1_ca_telemetry_decoder.h000066400000000000000000000051651305042567700313220ustar00rootroot00000000000000/*! * \file gps_l1_ca_telemetry_decoder.h * \brief Interface of an adapter of a GPS L1 C/A NAV data decoder block * to a TelemetryDecoderInterface * \author Javier Arribas, 2011. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L1_CA_TELEMETRY_DECODER_H_ #define GNSS_SDR_GPS_L1_CA_TELEMETRY_DECODER_H_ #include #include "telemetry_decoder_interface.h" #include "gps_l1_ca_telemetry_decoder_cc.h" class ConfigurationInterface; /*! * \brief This class implements a NAV data decoder for GPS L1 C/A */ class GpsL1CaTelemetryDecoder : public TelemetryDecoderInterface { public: GpsL1CaTelemetryDecoder(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GpsL1CaTelemetryDecoder(); std::string role() { return role_; } //! Returns "GPS_L1_CA_Telemetry_Decoder" std::string implementation() { return "GPS_L1_CA_Telemetry_Decoder"; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); void set_satellite(Gnss_Satellite satellite); void set_channel(int channel){telemetry_decoder_->set_channel(channel);} void reset() { return; } size_t item_size() { return 0; } private: gps_l1_ca_telemetry_decoder_cc_sptr telemetry_decoder_; Gnss_Satellite satellite_; int channel_; bool dump_; std::string dump_filename_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; }; #endif gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/adapters/gps_l2c_telemetry_decoder.cc000066400000000000000000000066441305042567700311640ustar00rootroot00000000000000/*! * \file gps_l2c_telemetry_decoder.cc * \brief Implementation of an adapter of a GPS L2C M NAV data decoder block * to a TelemetryDecoderInterface * \author Javier Arribas, 2015. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l2c_telemetry_decoder.h" #include #include #include "concurrent_queue.h" #include "gps_cnav_ephemeris.h" #include "gps_almanac.h" #include "gps_cnav_iono.h" #include "gps_cnav_utc_model.h" #include "configuration_interface.h" using google::LogMessage; GpsL2CTelemetryDecoder::GpsL2CTelemetryDecoder(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { std::string default_dump_filename = "./navigation.dat"; DLOG(INFO) << "role " << role; dump_ = configuration->property(role + ".dump", false); dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename); // make telemetry decoder object telemetry_decoder_ = gps_l2c_make_telemetry_decoder_cc(satellite_, dump_); // TODO fix me DLOG(INFO) << "telemetry_decoder(" << telemetry_decoder_->unique_id() << ")"; //decimation factor int decimation_factor = configuration->property(role + ".decimation_factor", 1); telemetry_decoder_->set_decimation(decimation_factor); LOG(INFO) << "global navigation message queue assigned to telemetry_decoder (" << telemetry_decoder_->unique_id() << ")" << "role " << role; channel_ = 0; } GpsL2CTelemetryDecoder::~GpsL2CTelemetryDecoder() {} void GpsL2CTelemetryDecoder::set_satellite(Gnss_Satellite satellite) { satellite_ = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); telemetry_decoder_->set_satellite(satellite_); DLOG(INFO) << "TELEMETRY DECODER: satellite set to " << satellite_; } void GpsL2CTelemetryDecoder::connect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to connect internally DLOG(INFO) << "nothing to connect internally"; } void GpsL2CTelemetryDecoder::disconnect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to disconnect } gr::basic_block_sptr GpsL2CTelemetryDecoder::get_left_block() { return telemetry_decoder_; } gr::basic_block_sptr GpsL2CTelemetryDecoder::get_right_block() { return telemetry_decoder_; } gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/adapters/gps_l2c_telemetry_decoder.h000066400000000000000000000051421305042567700310160ustar00rootroot00000000000000/*! * \file gps_l2c_telemetry_decoder.h * \brief Interface of an adapter of a GPS L2C (CNAV) data decoder block * to a TelemetryDecoderInterface * \author Javier Arribas, 2015. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L2C_TELEMETRY_DECODER_H_ #define GNSS_SDR_GPS_L2C_TELEMETRY_DECODER_H_ #include #include "telemetry_decoder_interface.h" #include "gps_l2c_telemetry_decoder_cc.h" class ConfigurationInterface; /*! * \brief This class implements a NAV data decoder for GPS L2 M */ class GpsL2CTelemetryDecoder : public TelemetryDecoderInterface { public: GpsL2CTelemetryDecoder(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GpsL2CTelemetryDecoder(); std::string role() { return role_; } //! Returns "GPS_L2C_Telemetry_Decoder" std::string implementation() { return "GPS_L2C_Telemetry_Decoder"; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); void set_satellite(Gnss_Satellite satellite); void set_channel(int channel){telemetry_decoder_->set_channel(channel);} void reset() { return; } size_t item_size() { return 0; } private: gps_l2c_telemetry_decoder_cc_sptr telemetry_decoder_; Gnss_Satellite satellite_; int channel_; bool dump_; std::string dump_filename_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; }; #endif gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/adapters/sbas_l1_telemetry_decoder.cc000066400000000000000000000062621305042567700311530ustar00rootroot00000000000000/*! * \file sbas_l1_telemetry_decoder.cc * \brief Implementation of an adapter of a SBAS telemetry data decoder block * to a TelemetryDecoderInterface * \author Daniel Fehr 2013. daniel.co(at)bluewin.ch * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "sbas_l1_telemetry_decoder.h" #include #include #include "concurrent_queue.h" #include "sbas_telemetry_data.h" #include "sbas_ionospheric_correction.h" #include "sbas_satellite_correction.h" #include "sbas_ephemeris.h" #include "configuration_interface.h" #include "sbas_l1_telemetry_decoder_cc.h" using google::LogMessage; SbasL1TelemetryDecoder::SbasL1TelemetryDecoder(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { std::string default_dump_filename = "./navigation.dat"; DLOG(INFO) << "role " << role; dump_ = configuration->property(role + ".dump", false); dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename); // make telemetry decoder object telemetry_decoder_ = sbas_l1_make_telemetry_decoder_cc(satellite_, dump_); // TODO fix me channel_ = 0; DLOG(INFO) << "telemetry_decoder(" << telemetry_decoder_->unique_id() << ")"; } SbasL1TelemetryDecoder::~SbasL1TelemetryDecoder() {} void SbasL1TelemetryDecoder::set_satellite(Gnss_Satellite satellite) { satellite_ = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); telemetry_decoder_->set_satellite(satellite_); DLOG(INFO) << "SBAS TELEMETRY DECODER: satellite set to " << satellite_; } void SbasL1TelemetryDecoder::connect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to connect internally DLOG(INFO) << "nothing to connect internally"; } void SbasL1TelemetryDecoder::disconnect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; // Nothing to disconnect } gr::basic_block_sptr SbasL1TelemetryDecoder::get_left_block() { return telemetry_decoder_; } gr::basic_block_sptr SbasL1TelemetryDecoder::get_right_block() { return telemetry_decoder_; } gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/adapters/sbas_l1_telemetry_decoder.h000066400000000000000000000052171305042567700310140ustar00rootroot00000000000000/*! * \file sbas_l1_telemetry_decoder.h * \brief Interface of an adapter of a SBAS telemetry data decoder block * to a TelemetryDecoderInterface * \author Daniel Fehr 2013. daniel.co(at)bluewin.ch * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_SBAS_L1_TELEMETRY_DECODER_H_ #define GNSS_SDR_SBAS_L1_TELEMETRY_DECODER_H_ #include #include "telemetry_decoder_interface.h" #include "sbas_l1_telemetry_decoder_cc.h" class ConfigurationInterface; /*! * \brief This class implements a NAV data decoder for SBAS frames in L1 radio link */ class SbasL1TelemetryDecoder : public TelemetryDecoderInterface { public: SbasL1TelemetryDecoder(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~SbasL1TelemetryDecoder(); std::string role() { return role_; } /*! * \brief Returns "SBAS_L1_Telemetry_Decoder" */ std::string implementation() { return "SBAS_L1_Telemetry_Decoder"; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); void set_satellite(Gnss_Satellite satellite); void set_channel(int channel){ telemetry_decoder_->set_channel(channel); } void reset() { return; } size_t item_size() { return 0; } private: sbas_l1_telemetry_decoder_cc_sptr telemetry_decoder_; Gnss_Satellite satellite_; int channel_; bool dump_; std::string dump_filename_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; }; #endif gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/gnuradio_blocks/000077500000000000000000000000001305042567700250755ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/gnuradio_blocks/CMakeLists.txt000066400000000000000000000032751305042567700276440ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # set(TELEMETRY_DECODER_GR_BLOCKS_SOURCES gps_l1_ca_telemetry_decoder_cc.cc gps_l2c_telemetry_decoder_cc.cc galileo_e1b_telemetry_decoder_cc.cc sbas_l1_telemetry_decoder_cc.cc galileo_e5a_telemetry_decoder_cc.cc ) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/receiver ${CMAKE_SOURCE_DIR}/src/algorithms/telemetry_decoder/libs ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ) file(GLOB TELEMETRY_DECODER_GR_BLOCKS_HEADERS "*.h") list(SORT TELEMETRY_DECODER_GR_BLOCKS_HEADERS) add_library(telemetry_decoder_gr_blocks ${TELEMETRY_DECODER_GR_BLOCKS_SOURCES} ${TELEMETRY_DECODER_GR_BLOCKS_HEADERS}) source_group(Headers FILES ${TELEMETRY_DECODER_GR_BLOCKS_HEADERS}) target_link_libraries(telemetry_decoder_gr_blocks telemetry_decoder_lib gnss_system_parameters ${GNURADIO_RUNTIME_LIBRARIES}) gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e1b_telemetry_decoder_cc.cc000066400000000000000000000551261305042567700340040ustar00rootroot00000000000000/*! * \file galileo_e1b_telemetry_decoder_cc.cc * \brief Implementation of a Galileo INAV message demodulator block * \author Mara Branzanti 2013. mara.branzanti(at)gmail.com * \author Javier Arribas 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_e1b_telemetry_decoder_cc.h" #include #include #include #include #include #include #include "control_message_factory.h" #include "gnss_synchro.h" #include "convolutional.h" #define CRC_ERROR_LIMIT 6 using google::LogMessage; galileo_e1b_telemetry_decoder_cc_sptr galileo_e1b_make_telemetry_decoder_cc(Gnss_Satellite satellite, bool dump) { return galileo_e1b_telemetry_decoder_cc_sptr(new galileo_e1b_telemetry_decoder_cc(satellite, dump)); } void galileo_e1b_telemetry_decoder_cc::forecast (int noutput_items, gr_vector_int &ninput_items_required) { if(noutput_items != 0) { ninput_items_required[0] = GALILEO_INAV_PAGE_SYMBOLS; // set the required sample history } } void galileo_e1b_telemetry_decoder_cc::viterbi_decoder(double *page_part_symbols, int *page_part_bits) { int CodeLength = 240; int DataLength; int nn, KK, mm, max_states; int g_encoder[2]; nn = 2; // Coding rate 1/n KK = 7; // Constraint Length g_encoder[0] = 121; // Polynomial G1 g_encoder[1] = 91; // Polynomial G2 mm = KK - 1; max_states = 1 << mm; /* 2^mm */ DataLength = (CodeLength/nn) - mm; /* create appropriate transition matrices */ int *out0, *out1, *state0, *state1; out0 = (int*)calloc( max_states, sizeof(int) ); out1 = (int*)calloc( max_states, sizeof(int) ); state0 = (int*)calloc( max_states, sizeof(int) ); state1 = (int*)calloc( max_states, sizeof(int) ); nsc_transit( out0, state0, 0, g_encoder, KK, nn ); nsc_transit( out1, state1, 1, g_encoder, KK, nn ); Viterbi(page_part_bits, out0, state0, out1, state1, page_part_symbols, KK, nn, DataLength ); /* Clean up memory */ free( out0 ); free( out1 ); free( state0 ); free( state1 ); } void galileo_e1b_telemetry_decoder_cc::deinterleaver(int rows, int cols, double *in, double *out) { for (int r = 0; r < rows; r++) { for(int c = 0; c < cols; c++) { out[c*rows + r] = in[r*cols + c]; } } } galileo_e1b_telemetry_decoder_cc::galileo_e1b_telemetry_decoder_cc( Gnss_Satellite satellite, bool dump) : gr::block("galileo_e1b_telemetry_decoder_cc", gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { // Telemetry Bit transition synchronization port out this->message_port_register_out(pmt::mp("preamble_timestamp_s")); // Ephemeris data port out this->message_port_register_out(pmt::mp("telemetry")); // initialize internal vars d_dump = dump; d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); LOG(INFO) << "Initializing GALILEO E1B TELEMETRY PROCESSING"; d_samples_per_symbol = ( Galileo_E1_CODE_CHIP_RATE_HZ / Galileo_E1_B_CODE_LENGTH_CHIPS ) / Galileo_E1_B_SYMBOL_RATE_BPS; // set the preamble unsigned short int preambles_bits[GALILEO_INAV_PREAMBLE_LENGTH_BITS] = GALILEO_INAV_PREAMBLE; d_symbols_per_preamble = GALILEO_INAV_PREAMBLE_LENGTH_BITS * d_samples_per_symbol; memcpy((unsigned short int*)this->d_preambles_bits, (unsigned short int*)preambles_bits, GALILEO_INAV_PREAMBLE_LENGTH_BITS*sizeof(unsigned short int)); // preamble bits to sampled symbols d_preambles_symbols = (signed int*)malloc(sizeof(signed int) * d_symbols_per_preamble); int n = 0; for (int i = 0; i < GALILEO_INAV_PREAMBLE_LENGTH_BITS; i++) { for (unsigned int j = 0; j < d_samples_per_symbol; j++) { if (d_preambles_bits[i] == 1) { d_preambles_symbols[n] = 1; } else { d_preambles_symbols[n] = -1; } n++; } } d_sample_counter = 0; d_stat = 0; d_preamble_index = 0; d_preamble_time_seconds = 0; d_flag_frame_sync = false; d_flag_parity = false; d_TOW_at_Preamble = 0; d_TOW_at_current_symbol = 0; delta_t = 0; d_CRC_error_counter = 0; flag_even_word_arrived = 0; d_flag_preamble = false; d_channel = 0; Prn_timestamp_at_preamble_ms = 0.0; flag_TOW_set = false; d_average_count = 0; d_decimation_output_factor = 1; } galileo_e1b_telemetry_decoder_cc::~galileo_e1b_telemetry_decoder_cc() { delete d_preambles_symbols; d_dump_file.close(); } void galileo_e1b_telemetry_decoder_cc::decode_word(double *page_part_symbols,int frame_length) { double page_part_symbols_deint[frame_length]; // 1. De-interleave deinterleaver(GALILEO_INAV_INTERLEAVER_ROWS, GALILEO_INAV_INTERLEAVER_COLS, page_part_symbols, page_part_symbols_deint); // 2. Viterbi decoder // 2.1 Take into account the NOT gate in G2 polynomial (Galileo ICD Figure 13, FEC encoder) // 2.2 Take into account the possible inversion of the polarity due to PLL lock at 180� for (int i = 0; i < frame_length; i++) { if ((i + 1) % 2 == 0) { page_part_symbols_deint[i] = -page_part_symbols_deint[i]; } } int page_part_bits[frame_length/2]; viterbi_decoder(page_part_symbols_deint, page_part_bits); // 3. Call the Galileo page decoder std::string page_String; for(int i = 0; i < (frame_length/2); i++) { if (page_part_bits[i] > 0) { page_String.push_back('1'); } else { page_String.push_back('0'); } } if (page_part_bits[0] == 1) { // DECODE COMPLETE WORD (even + odd) and TEST CRC d_nav.split_page(page_String, flag_even_word_arrived); if(d_nav.flag_CRC_test == true) { LOG(INFO) << "Galileo CRC correct on channel " << d_channel << " from satellite " << d_satellite; std::cout << "Galileo CRC correct on channel " << d_channel << " from satellite " << d_satellite << std::endl; } else { std::cout << "Galileo CRC error on channel " << d_channel << " from satellite " << d_satellite << std::endl; LOG(INFO) << "Galileo CRC error on channel " << d_channel << " from satellite " << d_satellite; } flag_even_word_arrived = 0; } else { // STORE HALF WORD (even page) d_nav.split_page(page_String.c_str(), flag_even_word_arrived); flag_even_word_arrived = 1; } // 4. Push the new navigation data to the queues if (d_nav.have_new_ephemeris() == true) { // get object for this SV (mandatory) std::shared_ptr tmp_obj = std::make_shared(d_nav.get_ephemeris()); this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); } if (d_nav.have_new_iono_and_GST() == true) { // get object for this SV (mandatory) std::shared_ptr tmp_obj = std::make_shared(d_nav.get_iono()); this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); } if (d_nav.have_new_utc_model() == true) { // get object for this SV (mandatory) std::shared_ptr tmp_obj = std::make_shared(d_nav.get_utc_model()); this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); } if (d_nav.have_new_almanac() == true) { std::shared_ptr tmp_obj= std::make_shared(d_nav.get_almanac()); this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); //debug std::cout << "Galileo almanac received!" << std::endl; LOG(INFO) << "GPS_to_Galileo time conversion:"; LOG(INFO) << "A0G=" << tmp_obj->A_0G_10; LOG(INFO) << "A1G=" << tmp_obj->A_1G_10; LOG(INFO) << "T0G=" << tmp_obj->t_0G_10; LOG(INFO) << "WN_0G_10=" << tmp_obj->WN_0G_10; LOG(INFO) << "Current parameters:"; LOG(INFO) << "d_TOW_at_current_symbol=" << d_TOW_at_current_symbol; LOG(INFO) << "d_nav.WN_0=" << d_nav.WN_0; delta_t = tmp_obj->A_0G_10 + tmp_obj->A_1G_10 * (d_TOW_at_current_symbol - tmp_obj->t_0G_10 + 604800 * (fmod((d_nav.WN_0 - tmp_obj->WN_0G_10), 64))); LOG(INFO) << "delta_t=" << delta_t << "[s]"; } } int galileo_e1b_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) { int corr_value = 0; int preamble_diff = 0; Gnss_Synchro **out = (Gnss_Synchro **) &output_items[0]; d_sample_counter++; //count for the processed samples // ########### Output the tracking data to navigation and PVT ########## const Gnss_Synchro **in = (const Gnss_Synchro **) &input_items[0]; //Get the input samples pointer // TODO Optimize me! //******* preamble correlation ******** for (int i = 0; i < d_symbols_per_preamble; i++) { if (in[0][i].Prompt_I < 0) // symbols clipping { corr_value -= d_preambles_symbols[i]; } else { corr_value += d_preambles_symbols[i]; } } d_flag_preamble = false; //******* frame sync ****************** if (d_stat == 0) //no preamble information { if (abs(corr_value) >= d_symbols_per_preamble) { d_preamble_index = d_sample_counter;//record the preamble sample stamp LOG(INFO) << "Preamble detection for Galileo SAT " << this->d_satellite; d_stat = 1; // enter into frame pre-detection status } } else if (d_stat == 1) // posible preamble lock { if (abs(corr_value) >= d_symbols_per_preamble) { //check preamble separation preamble_diff = d_sample_counter - d_preamble_index; if (abs(preamble_diff - GALILEO_INAV_PREAMBLE_PERIOD_SYMBOLS) == 0) { //try to decode frame LOG(INFO) << "Starting page decoder for Galileo SAT " << this->d_satellite; d_preamble_index = d_sample_counter; //record the preamble sample stamp d_stat = 2; } else { if (preamble_diff > GALILEO_INAV_PREAMBLE_PERIOD_SYMBOLS) { d_stat = 0; // start again } } } } else if (d_stat == 2) { if (d_sample_counter == d_preamble_index + GALILEO_INAV_PREAMBLE_PERIOD_SYMBOLS) { // NEW Galileo page part is received // 0. fetch the symbols into an array int frame_length = GALILEO_INAV_PAGE_PART_SYMBOLS - d_symbols_per_preamble; double page_part_symbols[frame_length]; for (int i = 0; i < frame_length; i++) { if (corr_value > 0) { page_part_symbols[i] = in[0][i + d_symbols_per_preamble].Prompt_I; // because last symbol of the preamble is just received now! } else { page_part_symbols[i] = -in[0][i + d_symbols_per_preamble].Prompt_I; // because last symbol of the preamble is just received now! } } //call the decoder decode_word(page_part_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) d_preamble_time_seconds = in[0][0].Tracking_timestamp_secs; // - d_preamble_duration_seconds; //record the PRN start sample index associated to the preamble if (!d_flag_frame_sync) { d_flag_frame_sync = true; LOG(INFO) << " Frame sync SAT " << this->d_satellite << " with preamble start at " << d_preamble_time_seconds << " [s]"; } } else { d_CRC_error_counter++; d_preamble_index = d_sample_counter; //record the preamble sample stamp if (d_CRC_error_counter > CRC_ERROR_LIMIT) { LOG(INFO) << "Lost of frame sync SAT " << this->d_satellite; d_flag_frame_sync = false; d_stat = 0; } } } } consume_each(1); //one by one // 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][0]; //2. Add the telemetry decoder information if (this->d_flag_preamble == true and d_nav.flag_TOW_set == true) //update TOW at the preamble instant // JAVI: 30/06/2014 // TOW, in Galileo, is referred to the START of the PAGE PART, that is, THE FIRST SYMBOL OF THAT PAGE, NOT THE PREAMBLE. // thus, no correction should be done. d_TOW_at_Preamble should be renamed to d_TOW_at_page_start. // Since we detected the preamble, then, we are in the last symbol of that preamble, or just at the start of the first page symbol. //flag preamble is true after the all page (even and odd) is received. I/NAV page period is 2 SECONDS { Prn_timestamp_at_preamble_ms = in[0][0].Tracking_timestamp_secs * 1000.0; if(d_nav.flag_TOW_5 == true) //page 5 arrived and decoded, so we are in the odd page (since Tow refers to the even page, we have to add 1 sec) { //std::cout<< "Using TOW_5 for timestamping" << std::endl; d_TOW_at_Preamble = d_nav.TOW_5 + GALILEO_INAV_PAGE_PART_SECONDS; //TOW_5 refers to the even preamble, but when we decode it we are in the odd part, so 1 second later /* 1 sec (GALILEO_INAV_PAGE_PART_SYMBOLS*GALILEO_E1_CODE_PERIOD) is added because * if we have a TOW value it means that we are at the beginning of the last page part * (GNU Radio history keeps in a buffer the rest of the incoming frame part)*/ d_TOW_at_current_symbol = d_TOW_at_Preamble;//-GALILEO_E1_CODE_PERIOD;//+ (double)GALILEO_INAV_PREAMBLE_LENGTH_BITS/(double)GALILEO_TELEMETRY_RATE_BITS_SECOND; d_nav.flag_TOW_5 = false; } else if(d_nav.flag_TOW_6 == true) //page 6 arrived and decoded, so we are in the odd page (since Tow refers to the even page, we have to add 1 sec) { //std::cout<< "Using TOW_6 for timestamping" << std::endl; d_TOW_at_Preamble = d_nav.TOW_6 + GALILEO_INAV_PAGE_PART_SECONDS; //TOW_6 refers to the even preamble, but when we decode it we are in the odd part, so 1 second later /* 1 sec (GALILEO_INAV_PAGE_PART_SYMBOLS*GALILEO_E1_CODE_PERIOD) is added because * if we have a TOW value it means that we are at the beginning of the last page part * (GNU Radio history keeps in a buffer the rest of the incoming frame part)*/ d_TOW_at_current_symbol = d_TOW_at_Preamble;//-GALILEO_E1_CODE_PERIOD;//+ (double)GALILEO_INAV_PREAMBLE_LENGTH_BITS/(double)GALILEO_TELEMETRY_RATE_BITS_SECOND; d_nav.flag_TOW_6 = false; } else { //this page has no timing information d_TOW_at_Preamble = d_TOW_at_Preamble + GALILEO_INAV_PAGE_SECONDS; d_TOW_at_current_symbol = d_TOW_at_current_symbol + GALILEO_E1_CODE_PERIOD;// + GALILEO_INAV_PAGE_PART_SYMBOLS*GALILEO_E1_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_E1_CODE_PERIOD; } //if (d_flag_frame_sync == true and d_nav.flag_TOW_set==true and d_nav.flag_CRC_test == true) if(d_nav.flag_GGTO_1 == true and d_nav.flag_GGTO_2 == true and d_nav.flag_GGTO_3 == true and d_nav.flag_GGTO_4 == true) //all GGTO parameters arrived { delta_t = d_nav.A_0G_10 + d_nav.A_1G_10 * (d_TOW_at_current_symbol - d_nav.t_0G_10 + 604800.0 * (fmod((d_nav.WN_0 - d_nav.WN_0G_10), 64))); } if (d_flag_frame_sync == true and d_nav.flag_TOW_set == true) { current_synchro_data.Flag_valid_word = true; } else { current_synchro_data.Flag_valid_word = false; } current_synchro_data.d_TOW = d_TOW_at_Preamble; current_synchro_data.d_TOW_at_current_symbol = d_TOW_at_current_symbol; current_synchro_data.d_TOW_hybrid_at_current_symbol = current_synchro_data.d_TOW_at_current_symbol - delta_t; //delta_t = t_gal - t_gps ----> t_gps = t_gal -delta_t current_synchro_data.Flag_preamble = d_flag_preamble; current_synchro_data.Prn_timestamp_ms = in[0][0].Tracking_timestamp_secs * 1000.0; current_synchro_data.Prn_timestamp_at_preamble_ms = Prn_timestamp_at_preamble_ms; if(d_dump == true) { // MULTIPLEXED FILE RECORDING - Record results to file try { double tmp_double; tmp_double = d_TOW_at_current_symbol; d_dump_file.write((char*)&tmp_double, sizeof(double)); tmp_double = current_synchro_data.Prn_timestamp_ms; d_dump_file.write((char*)&tmp_double, sizeof(double)); tmp_double = d_TOW_at_Preamble; d_dump_file.write((char*)&tmp_double, sizeof(double)); } catch (const std::ifstream::failure& e) { LOG(WARNING) << "Exception writing observables dump file " << e.what(); } } //todo: implement averaging d_average_count++; if (d_average_count == d_decimation_output_factor) { d_average_count = 0; //3. Make the output (copy the object contents to the GNURadio reserved memory) *out[0] = current_synchro_data; //std::cout<<"GPS L1 TLM output on CH="<d_channel << " SAMPLE STAMP="<(d_channel)); d_dump_filename.append(".dat"); d_dump_file.exceptions ( std::ifstream::failbit | std::ifstream::badbit ); d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); LOG(INFO) << "Telemetry decoder dump enabled on channel " << d_channel << " Log file: " << d_dump_filename.c_str(); } catch (const std::ifstream::failure& e) { LOG(WARNING) << "channel " << d_channel << " Exception opening trk dump file " << e.what(); } } } } gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e1b_telemetry_decoder_cc.h000066400000000000000000000102621305042567700336360ustar00rootroot00000000000000/*! * \file galileo_e1b_telemetry_decoder_cc.h * \brief Interface of a Galileo INAV message demodulator block * \author Javier Arribas 2013 jarribas(at)cttc.es, * Mara Branzanti 2013 mara.branzanti(at)gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_E1B_TELEMETRY_DECODER_CC_H #define GNSS_SDR_GALILEO_E1B_TELEMETRY_DECODER_CC_H #include #include #include #include "Galileo_E1.h" #include "concurrent_queue.h" #include "gnss_satellite.h" #include "galileo_navigation_message.h" #include "galileo_ephemeris.h" #include "galileo_almanac.h" #include "galileo_iono.h" #include "galileo_utc_model.h" class galileo_e1b_telemetry_decoder_cc; typedef boost::shared_ptr galileo_e1b_telemetry_decoder_cc_sptr; galileo_e1b_telemetry_decoder_cc_sptr galileo_e1b_make_telemetry_decoder_cc(Gnss_Satellite satellite, bool dump); /*! * \brief This class implements a block that decodes the INAV data defined in Galileo ICD * */ class galileo_e1b_telemetry_decoder_cc : public gr::block { public: ~galileo_e1b_telemetry_decoder_cc(); void set_satellite(Gnss_Satellite satellite); //!< Set satellite PRN void set_channel(int channel); //!< Set receiver's channel int flag_even_word_arrived; /*! * \brief Set decimation factor to average the GPS synchronization estimation output from the tracking module. */ void set_decimation(int decimation); /*! * \brief This is where all signal processing takes place */ int general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); /*! * \brief Function which tells the scheduler how many input items * are required to produce noutput_items output items. */ void forecast (int noutput_items, gr_vector_int &ninput_items_required); private: friend galileo_e1b_telemetry_decoder_cc_sptr galileo_e1b_make_telemetry_decoder_cc(Gnss_Satellite satellite, bool dump); galileo_e1b_telemetry_decoder_cc(Gnss_Satellite satellite, bool dump); void viterbi_decoder(double *page_part_symbols, int *page_part_bits); void deinterleaver(int rows, int cols, double *in, double *out); void decode_word(double *symbols,int frame_length); unsigned short int d_preambles_bits[GALILEO_INAV_PREAMBLE_LENGTH_BITS]; int *d_preambles_symbols; unsigned int d_samples_per_symbol; int d_symbols_per_preamble; long unsigned int d_sample_counter; long unsigned int d_preamble_index; unsigned int d_stat; bool d_flag_frame_sync; bool d_flag_parity; bool d_flag_preamble; int d_CRC_error_counter; // navigation message vars Galileo_Navigation_Message d_nav; bool d_dump; Gnss_Satellite d_satellite; int d_channel; // output averaging and decimation int d_average_count; int d_decimation_output_factor; double d_preamble_time_seconds; double d_TOW_at_Preamble; double d_TOW_at_current_symbol; double Prn_timestamp_at_preamble_ms; bool flag_TOW_set; double delta_t; //GPS-GALILEO time offset std::string d_dump_filename; std::ofstream d_dump_file; }; #endif gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e5a_telemetry_decoder_cc.cc000066400000000000000000000643571305042567700340150ustar00rootroot00000000000000/*! * \file galileo_e5a_telemetry_decoder_cc.cc * \brief Implementation of a Galileo FNAV message demodulator block * \author Marc Sales, 2014. marcsales92(at)gmail.com * \based on work from: *
      *
    • Javier Arribas, 2011. jarribas(at)cttc.es *
    * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_e5a_telemetry_decoder_cc.h" #include #include #include #include #include #include #include "control_message_factory.h" #include "gnss_synchro.h" #include "convolutional.h" #define CRC_ERROR_LIMIT 6 using google::LogMessage; galileo_e5a_telemetry_decoder_cc_sptr galileo_e5a_make_telemetry_decoder_cc(Gnss_Satellite satellite, bool dump) { return galileo_e5a_telemetry_decoder_cc_sptr(new galileo_e5a_telemetry_decoder_cc(satellite, dump)); } void galileo_e5a_telemetry_decoder_cc::forecast (int noutput_items, gr_vector_int &ninput_items_required) { //ninput_items_required[0] = GALILEO_FNAV_SAMPLES_PER_PAGE; // set the required sample history if (noutput_items != 0) { ninput_items_required[0] = GALILEO_FNAV_CODES_PER_PREAMBLE; } } void galileo_e5a_telemetry_decoder_cc::viterbi_decoder(double *page_part_symbols, int *page_part_bits) { // int CodeLength = 240; int CodeLength = 488; int DataLength; int nn, KK, mm, max_states; int g_encoder[2]; nn = 2; // Coding rate 1/n KK = 7; // Constraint Length g_encoder[0] = 121; // Polynomial G1 g_encoder[1] = 91; // Polynomial G2 // g_encoder[0] = 171; // Polynomial G1 // g_encoder[1] = 133; // Polynomial G2 mm = KK - 1; max_states = 1 << mm; // 2^mm DataLength = (CodeLength/nn) - mm; //create appropriate transition matrices int *out0, *out1, *state0, *state1; out0 = (int*)calloc( max_states, sizeof(int) ); out1 = (int*)calloc( max_states, sizeof(int) ); state0 = (int*)calloc( max_states, sizeof(int) ); state1 = (int*)calloc( max_states, sizeof(int) ); nsc_transit( out0, state0, 0, g_encoder, KK, nn ); nsc_transit( out1, state1, 1, g_encoder, KK, nn ); Viterbi(page_part_bits, out0, state0, out1, state1, page_part_symbols, KK, nn, DataLength ); //Clean up memory free( out0 ); free( out1 ); free( state0 ); free( state1 ); } void galileo_e5a_telemetry_decoder_cc::deinterleaver(int rows, int cols, double *in, double *out) { for (int r = 0; r < rows; r++) { for(int c = 0; c < cols; c++) { out[c*rows + r] = in[r*cols + c]; } } } void galileo_e5a_telemetry_decoder_cc::decode_word(double *page_symbols,int frame_length) { 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); // 2. Viterbi decoder // 2.1 Take into account the NOT gate in G2 polynomial (Galileo ICD Figure 13, FEC encoder) // 2.2 Take into account the possible inversion of the polarity due to PLL lock at 180� for (int i = 0; i < frame_length; i++) { if ((i + 1) % 2 == 0) { page_symbols_deint[i] = -page_symbols_deint[i]; } } int page_bits[frame_length/2]; galileo_e5a_telemetry_decoder_cc::viterbi_decoder(page_symbols_deint, page_bits); // 3. Call the Galileo page decoder std::string page_String; for(int i = 0; i < frame_length; i++) { if (page_bits[i] > 0) { page_String.push_back('1'); } else { page_String.push_back('0'); } } // DECODE COMPLETE WORD (even + odd) and TEST CRC d_nav.split_page(page_String); if(d_nav.flag_CRC_test == true) { LOG(INFO) << "Galileo CRC correct on channel " << d_channel << " from satellite " << d_satellite; std::cout << "Galileo CRC correct on channel " << d_channel << " from satellite " << d_satellite << std::endl; } else { std::cout << "Galileo CRC error on channel " << d_channel << " from satellite " << d_satellite << std::endl; LOG(INFO)<< "Galileo CRC error on channel " << d_channel << " from satellite " << d_satellite; } // 4. Push the new navigation data to the queues if (d_nav.have_new_ephemeris() == true) { std::shared_ptr tmp_obj= std::make_shared(d_nav.get_ephemeris()); this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); } if (d_nav.have_new_iono_and_GST() == true) { std::shared_ptr tmp_obj= std::make_shared(d_nav.get_iono()); this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); } if (d_nav.have_new_utc_model() == true) { std::shared_ptr tmp_obj= std::make_shared(d_nav.get_utc_model()); this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); } } galileo_e5a_telemetry_decoder_cc::galileo_e5a_telemetry_decoder_cc( Gnss_Satellite satellite, bool dump) : gr::block("galileo_e5a_telemetry_decoder_cc", gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { // Telemetry Bit transition synchronization port out this->message_port_register_out(pmt::mp("preamble_timestamp_s")); // Ephemeris data port out this->message_port_register_out(pmt::mp("telemetry")); // initialize internal vars d_dump = dump; d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); LOG(INFO) << "GALILEO E5A TELEMETRY PROCESSING: satellite " << d_satellite; //d_samples_per_symbol = ( Galileo_E5a_CODE_CHIP_RATE_HZ / Galileo_E5a_CODE_LENGTH_CHIPS ) / Galileo_E1_B_SYMBOL_RATE_BPS; // set the preamble //unsigned short int preambles_bits[GALILEO_FNAV_PREAMBLE_LENGTH_BITS] = GALILEO_FNAV_PREAMBLE; for (int i = 0; i < GALILEO_FNAV_PREAMBLE_LENGTH_BITS; i++) { if (GALILEO_FNAV_PREAMBLE.at(i) == '0') { d_preamble_bits[i] = 1; } else { d_preamble_bits[i] = -1; } } // memcpy((unsigned short int*)this->d_preambles_bits, (unsigned short int*)preambles_bits, GALILEO_FNAV_PREAMBLE_LENGTH_BITS*sizeof(unsigned short int)); // // preamble bits to sampled symbols // d_preambles_symbols = (signed int*)malloc(sizeof(signed int) * GALILEO_FNAV_SAMPLES_PER_PREAMBLE); // int n = 0; // for (int i = 0; i < GALILEO_FNAV_PREAMBLE_LENGTH_BITS; i++) // { // for (unsigned int j = 0; j < GALILEO_FNAV_SAMPLES_PER_SYMBOL; j++) // { // if (d_preambles_bits[i] == 1) // { // d_preambles_symbols[n] = 1; // } // else // { // d_preambles_symbols[n] = -1; // } // n++; // } // } // d_sample_counter = 0; d_state = 0; d_preamble_lock = false; d_preamble_index = 0; d_preamble_time_seconds = 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; Prn_timestamp_at_preamble_ms = 0; flag_TOW_set = false; } galileo_e5a_telemetry_decoder_cc::~galileo_e5a_telemetry_decoder_cc() { d_dump_file.close(); } 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) { // const Gnss_Synchro **in = (const Gnss_Synchro **) &input_items[0]; //Get the input samples pointer Gnss_Synchro **out = (Gnss_Synchro **) &output_items[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) { case 0: { if (in[0][0].Prompt_I != 0) { d_current_symbol += in[0][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][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 for Galileo SAT " << 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][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 // corr_sign = d_preamble_bits[0] * d_page_symbols[d_symbol_counter - GALILEO_FNAV_PREAMBLE_LENGTH_BITS]; // for (int i = 1; i < GALILEO_FNAV_PREAMBLE_LENGTH_BITS; i++) // { // if ((d_preamble_bits[i] * d_page_symbols[i + d_symbol_counter - GALILEO_FNAV_PREAMBLE_LENGTH_BITS]) != corr_sign) // { // //exit for if one bit doesn't correlate // corr_flag = false; // break; // } // } // 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) // 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()) d_preamble_time_seconds = in[0][0].Tracking_timestamp_secs - (static_cast(GALILEO_FNAV_CODES_PER_PAGE+GALILEO_FNAV_CODES_PER_PREAMBLE) * GALILEO_E5a_CODE_PERIOD); //record the PRN start sample index associated to the preamble start. if (!d_flag_frame_sync) { d_flag_frame_sync = true; LOG(INFO) <<" Frame sync SAT " << this->d_satellite << " with preamble start at " << d_preamble_time_seconds << " [s]"; } 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 > 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; } } consume_each(1); // 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][0]; //2. Add the telemetry decoder information if (this->d_flag_preamble == true and d_nav.flag_TOW_set == true) //update TOW at the preamble instant //We expect a preamble each 10 seconds (FNAV page period) { Prn_timestamp_at_preamble_ms = d_preamble_time_seconds * 1000; //Prn_timestamp_at_preamble_ms = in[0][0].Tracking_timestamp_secs * 1000.0; 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_nav.flag_TOW_1 = false; } 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_nav.flag_TOW_2 = false; } 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_nav.flag_TOW_3 = false; } 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_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; } } 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; } //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) { current_synchro_data.Flag_valid_word = true; } else { current_synchro_data.Flag_valid_word = false; } current_synchro_data.d_TOW = d_TOW_at_Preamble; current_synchro_data.d_TOW_at_current_symbol = d_TOW_at_current_symbol; current_synchro_data.Flag_preamble = d_flag_preamble; current_synchro_data.Prn_timestamp_ms = in[0][0].Tracking_timestamp_secs * 1000.0; current_synchro_data.Prn_timestamp_at_preamble_ms = Prn_timestamp_at_preamble_ms; if(d_dump == true) { // MULTIPLEXED FILE RECORDING - Record results to file try { double tmp_double; tmp_double = d_TOW_at_current_symbol; d_dump_file.write((char*)&tmp_double, sizeof(double)); tmp_double = current_synchro_data.Prn_timestamp_ms; d_dump_file.write((char*)&tmp_double, sizeof(double)); tmp_double = d_TOW_at_Preamble; d_dump_file.write((char*)&tmp_double, sizeof(double)); } catch (const std::ifstream::failure& e) { LOG(WARNING) << "Exception writing observables 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; return 1; } void galileo_e5a_telemetry_decoder_cc::set_satellite(Gnss_Satellite satellite) { d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); DLOG(INFO) << "Setting decoder Finite State Machine to satellite " << d_satellite; DLOG(INFO) << "Navigation Satellite set to " << d_satellite; } void galileo_e5a_telemetry_decoder_cc::set_channel(int channel) { d_channel = channel; LOG(INFO) << "Navigation channel set to " << channel; // ############# ENABLE DATA FILE LOG ################# if (d_dump == true) { if (d_dump_file.is_open() == false) { try { d_dump_filename = "telemetry"; d_dump_filename.append(boost::lexical_cast(d_channel)); d_dump_filename.append(".dat"); d_dump_file.exceptions ( std::ifstream::failbit | std::ifstream::badbit ); d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); LOG(INFO) << "Telemetry decoder dump enabled on channel " << d_channel << " Log file: " << d_dump_filename.c_str(); } catch (const std::ifstream::failure& e) { LOG(WARNING) << "channel " << d_channel << " Exception opening trk dump file " << e.what(); } } } } gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e5a_telemetry_decoder_cc.h000066400000000000000000000103061305042567700336400ustar00rootroot00000000000000/*! * \file galileo_e5a_telemetry_decoder_cc.cc * \brief Implementation of a Galileo FNAV message demodulator block * \author Marc Sales, 2014. marcsales92(at)gmail.com * \based on work from: *
      *
    • Javier Arribas, 2011. jarribas(at)cttc.es *
    * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_E5A_TELEMETRY_DECODER_CC_H_ #define GNSS_SDR_GALILEO_E5A_TELEMETRY_DECODER_CC_H_ #include #include #include #include "Galileo_E5a.h" #include "concurrent_queue.h" #include "gnss_satellite.h" #include "galileo_fnav_message.h" #include "galileo_ephemeris.h" #include "galileo_almanac.h" #include "galileo_iono.h" #include "galileo_utc_model.h" //#include "convolutional.h" class galileo_e5a_telemetry_decoder_cc; typedef boost::shared_ptr galileo_e5a_telemetry_decoder_cc_sptr; galileo_e5a_telemetry_decoder_cc_sptr galileo_e5a_make_telemetry_decoder_cc(Gnss_Satellite satellite, bool dump); /*! * \brief This class implements a block that decodes the FNAV data defined in Galileo ICD * */ class galileo_e5a_telemetry_decoder_cc : public gr::block { public: ~galileo_e5a_telemetry_decoder_cc(); void set_satellite(Gnss_Satellite satellite); //!< Set satellite PRN void set_channel(int channel); //!< Set receiver's channel /*! * \brief This is where all signal processing takes place */ int general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); /*! * \brief Function which tells the scheduler how many input items * are required to produce noutput_items output items. */ void forecast (int noutput_items, gr_vector_int &ninput_items_required); private: friend galileo_e5a_telemetry_decoder_cc_sptr galileo_e5a_make_telemetry_decoder_cc(Gnss_Satellite satellite, bool dump); galileo_e5a_telemetry_decoder_cc(Gnss_Satellite satellite, bool dump); void viterbi_decoder(double *page_part_symbols, int *page_part_bits); void deinterleaver(int rows, int cols, double *in, double *out); void decode_word(double *page_symbols,int frame_length); int d_preamble_bits[GALILEO_FNAV_PREAMBLE_LENGTH_BITS]; // signed int d_page_symbols[GALILEO_FNAV_SYMBOLS_PER_PAGE + GALILEO_FNAV_PREAMBLE_LENGTH_BITS]; double d_page_symbols[GALILEO_FNAV_SYMBOLS_PER_PAGE + GALILEO_FNAV_PREAMBLE_LENGTH_BITS]; // signed int *d_preamble_symbols; double d_current_symbol; long unsigned int d_symbol_counter; int d_prompt_counter; int d_sign_init; 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_preamble_time_seconds; double d_TOW_at_Preamble; double d_TOW_at_current_symbol; double Prn_timestamp_at_preamble_ms; bool flag_TOW_set; std::string d_dump_filename; std::ofstream d_dump_file; }; #endif /* GNSS_SDR_GALILEO_E5A_TELEMETRY_DECODER_CC_H_ */ gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc000066400000000000000000000500511305042567700334610ustar00rootroot00000000000000/*! * \file gps_l1_ca_telemetry_decoder_cc.cc * \brief Implementation of a NAV message demodulator block based on * Kay Borre book MATLAB-based GPS receiver * \author Javier Arribas, 2011. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l1_ca_telemetry_decoder_cc.h" #include #include #include #include #include "control_message_factory.h" #include "gnss_synchro.h" #ifndef _rotl #define _rotl(X,N) ((X << N) ^ (X >> (32-N))) // Used in the parity check algorithm #endif using google::LogMessage; gps_l1_ca_telemetry_decoder_cc_sptr gps_l1_ca_make_telemetry_decoder_cc(Gnss_Satellite satellite, bool dump) { return gps_l1_ca_telemetry_decoder_cc_sptr(new gps_l1_ca_telemetry_decoder_cc(satellite, dump)); } void gps_l1_ca_telemetry_decoder_cc::forecast (int noutput_items __attribute__((unused)), gr_vector_int &ninput_items_required) { ninput_items_required[0] = GPS_CA_PREAMBLE_LENGTH_SYMBOLS; //set the required sample history } gps_l1_ca_telemetry_decoder_cc::gps_l1_ca_telemetry_decoder_cc( Gnss_Satellite satellite, bool dump) : gr::block("gps_navigation_cc", gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { // Telemetry Bit transition synchronization port out this->message_port_register_out(pmt::mp("preamble_timestamp_s")); // Ephemeris data port out this->message_port_register_out(pmt::mp("telemetry")); // initialize internal vars d_dump = dump; d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); // set the preamble unsigned short int preambles_bits[GPS_CA_PREAMBLE_LENGTH_BITS] = GPS_PREAMBLE; //memcpy((unsigned short int*)this->d_preambles_bits, (unsigned short int*)preambles_bits, GPS_CA_PREAMBLE_LENGTH_BITS*sizeof(unsigned short int)); // preamble bits to sampled symbols d_preambles_symbols = (signed int*)malloc(sizeof(signed int) * GPS_CA_PREAMBLE_LENGTH_SYMBOLS); int n = 0; for (int i = 0; i < GPS_CA_PREAMBLE_LENGTH_BITS; i++) { for (unsigned int j = 0; j < GPS_CA_TELEMETRY_SYMBOLS_PER_BIT; j++) { if (preambles_bits[i] == 1) { d_preambles_symbols[n] = 1; } else { d_preambles_symbols[n] = -1; } n++; } } d_stat = 0; d_symbol_accumulator = 0; d_symbol_accumulator_counter = 0; d_frame_bit_index = 0; d_preamble_time_seconds = 0; d_flag_frame_sync = false; d_GPS_frame_4bytes = 0; d_prev_GPS_frame_4bytes = 0; d_flag_parity = false; d_TOW_at_Preamble = 0; d_TOW_at_current_symbol = 0; flag_TOW_set = false; d_average_count = 0; d_flag_preamble = false; d_word_number = 0; d_decimation_output_factor = 1; d_channel = 0; Prn_timestamp_at_preamble_ms = 0.0; flag_PLL_180_deg_phase_locked = false; } gps_l1_ca_telemetry_decoder_cc::~gps_l1_ca_telemetry_decoder_cc() { delete d_preambles_symbols; d_dump_file.close(); } bool gps_l1_ca_telemetry_decoder_cc::gps_word_parityCheck(unsigned int gpsword) { unsigned int d1, d2, d3, d4, d5, d6, d7, t, parity; /* XOR as many bits in parallel as possible. The magic constants pick up bits which are to be XOR'ed together to implement the GPS parity check algorithm described in IS-GPS-200E. This avoids lengthy shift- and-xor loops. */ d1 = gpsword & 0xFBFFBF00; d2 = _rotl(gpsword,1) & 0x07FFBF01; d3 = _rotl(gpsword,2) & 0xFC0F8100; d4 = _rotl(gpsword,3) & 0xF81FFE02; d5 = _rotl(gpsword,4) & 0xFC00000E; d6 = _rotl(gpsword,5) & 0x07F00001; d7 = _rotl(gpsword,6) & 0x00003000; t = d1 ^ d2 ^ d3 ^ d4 ^ d5 ^ d6 ^ d7; // Now XOR the 5 6-bit fields together to produce the 6-bit final result. parity = t ^ _rotl(t,6) ^ _rotl(t,12) ^ _rotl(t,18) ^ _rotl(t,24); parity = parity & 0x3F; if (parity == (gpsword & 0x3F)) return(true); else return(false); } int gps_l1_ca_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) { int corr_value = 0; int preamble_diff_ms = 0; Gnss_Synchro **out = (Gnss_Synchro **) &output_items[0]; // ########### Output the tracking data to navigation and PVT ########## const Gnss_Synchro **in = (const Gnss_Synchro **) &input_items[0]; //Get the input samples pointer //******* preamble correlation ******** for (unsigned int i = 0; i < GPS_CA_PREAMBLE_LENGTH_SYMBOLS; i++) { if (in[0][i].Flag_valid_symbol_output == true) { if (in[0][i].Prompt_I < 0) // symbols clipping { corr_value -= d_preambles_symbols[i] * in[0][i].correlation_length_ms; } else { corr_value += d_preambles_symbols[i] * in[0][i].correlation_length_ms; } } if (corr_value >= GPS_CA_PREAMBLE_LENGTH_SYMBOLS) break; } d_flag_preamble = false; //******* frame sync ****************** if (abs(corr_value) == GPS_CA_PREAMBLE_LENGTH_SYMBOLS) { //TODO: Rewrite with state machine if (d_stat == 0) { d_GPS_FSM.Event_gps_word_preamble(); //record the preamble sample stamp d_preamble_time_seconds = in[0][0].Tracking_timestamp_secs; // record the preamble sample stamp DLOG(INFO) << "Preamble detection for SAT " << this->d_satellite << "in[0][0].Tracking_timestamp_secs=" << round(in[0][0].Tracking_timestamp_secs * 1000.0); //sync the symbol to bits integrator d_symbol_accumulator = 0; d_symbol_accumulator_counter = 0; d_frame_bit_index = 0; d_stat = 1; // enter into frame pre-detection status } else if (d_stat == 1) //check 6 seconds of preamble separation { preamble_diff_ms = round((in[0][0].Tracking_timestamp_secs - d_preamble_time_seconds) * 1000.0); if (abs(preamble_diff_ms - GPS_SUBFRAME_MS) < 1) { DLOG(INFO) << "Preamble confirmation for SAT " << this->d_satellite << "in[0][0].Tracking_timestamp_secs=" << round(in[0][0].Tracking_timestamp_secs * 1000.0); d_GPS_FSM.Event_gps_word_preamble(); d_flag_preamble = true; d_preamble_time_seconds = in[0][0].Tracking_timestamp_secs; // record the PRN start sample index associated to the preamble if (!d_flag_frame_sync) { // send asynchronous message to tracking to inform of frame sync and extend correlation time pmt::pmt_t value = pmt::from_double(d_preamble_time_seconds - 0.001); this->message_port_pub(pmt::mp("preamble_timestamp_s"), value); d_flag_frame_sync = true; if (corr_value < 0) { flag_PLL_180_deg_phase_locked = true; // PLL is locked to opposite phase! DLOG(INFO) << " PLL in opposite phase for Sat "<< this->d_satellite.get_PRN(); } else { flag_PLL_180_deg_phase_locked = false; } DLOG(INFO) << " Frame sync SAT " << this->d_satellite << " with preamble start at " << d_preamble_time_seconds << " [s]"; } } } } else { if (d_stat == 1) { preamble_diff_ms = round((in[0][0].Tracking_timestamp_secs - d_preamble_time_seconds) * 1000.0); if (preamble_diff_ms > GPS_SUBFRAME_MS+1) { DLOG(INFO) << "Lost of frame sync SAT " << this->d_satellite << " preamble_diff= " << preamble_diff_ms; d_stat = 0; //lost of frame sync d_flag_frame_sync = false; flag_TOW_set = false; } } } //******* SYMBOL TO BIT ******* if (in[0][0].Flag_valid_symbol_output == true) { // extended correlation to bit period is enabled in tracking! d_symbol_accumulator += in[0][0].Prompt_I; // accumulate the input value in d_symbol_accumulator d_symbol_accumulator_counter += in[0][0].correlation_length_ms; } if (d_symbol_accumulator_counter >= 20) { if (d_symbol_accumulator > 0) { //symbol to bit d_GPS_frame_4bytes += 1; //insert the telemetry bit in LSB } d_symbol_accumulator = 0; d_symbol_accumulator_counter = 0; //******* bits to words ****** d_frame_bit_index++; if (d_frame_bit_index == 30) { d_frame_bit_index = 0; // parity check // Each word in wordbuff is composed of: // Bits 0 to 29 = the GPS data word // Bits 30 to 31 = 2 LSBs of the GPS word ahead. // prepare the extended frame [-2 -1 0 ... 30] if (d_prev_GPS_frame_4bytes & 0x00000001) { d_GPS_frame_4bytes = d_GPS_frame_4bytes | 0x40000000; } if (d_prev_GPS_frame_4bytes & 0x00000002) { d_GPS_frame_4bytes = d_GPS_frame_4bytes | 0x80000000; } /* Check that the 2 most recently logged words pass parity. Have to first invert the data bits according to bit 30 of the previous word. */ if(d_GPS_frame_4bytes & 0x40000000) { d_GPS_frame_4bytes ^= 0x3FFFFFC0; // invert the data bits (using XOR) } if (gps_l1_ca_telemetry_decoder_cc::gps_word_parityCheck(d_GPS_frame_4bytes)) { memcpy(&d_GPS_FSM.d_GPS_frame_4bytes, &d_GPS_frame_4bytes, sizeof(char)*4); d_GPS_FSM.d_preamble_time_ms = d_preamble_time_seconds * 1000.0; d_GPS_FSM.Event_gps_word_valid(); // send TLM data to PVT using asynchronous message queues if (d_GPS_FSM.d_flag_new_subframe == true) { switch (d_GPS_FSM.d_subframe_ID) { case 3: //we have a new set of ephemeris data for the current SV if (d_GPS_FSM.d_nav.satellite_validation() == true) { // get ephemeris object for this SV (mandatory) std::shared_ptr tmp_obj = std::make_shared(d_GPS_FSM.d_nav.get_ephemeris()); this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); } break; case 4: // Possible IONOSPHERE and UTC model update (page 18) if (d_GPS_FSM.d_nav.flag_iono_valid == true) { std::shared_ptr tmp_obj = std::make_shared( d_GPS_FSM.d_nav.get_iono()); this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); } if (d_GPS_FSM.d_nav.flag_utc_model_valid == true) { std::shared_ptr tmp_obj = std::make_shared(d_GPS_FSM.d_nav.get_utc_model()); this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); } break; case 5: // get almanac (if available) //TODO: implement almanac reader in navigation_message break; default: break; } d_GPS_FSM.clear_flag_new_subframe(); } d_flag_parity = true; } else { d_GPS_FSM.Event_gps_word_invalid(); d_flag_parity = false; } d_prev_GPS_frame_4bytes = d_GPS_frame_4bytes; // save the actual frame d_GPS_frame_4bytes = d_GPS_frame_4bytes & 0; } else { d_GPS_frame_4bytes <<= 1; //shift 1 bit left the telemetry word } } // output the frame consume_each(1); // one by one 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][0]; //2. Add the telemetry decoder information if (this->d_flag_preamble == true and d_GPS_FSM.d_nav.d_TOW > 0) { // update TOW at the preamble instant d_TOW_at_Preamble = d_GPS_FSM.d_nav.d_TOW + GPS_L1_CA_CODE_PERIOD; Prn_timestamp_at_preamble_ms = in[0][0].Tracking_timestamp_secs * 1000.0; d_TOW_at_current_symbol = d_TOW_at_Preamble; if (flag_TOW_set == false) { flag_TOW_set = true; } } else { d_TOW_at_current_symbol = d_TOW_at_current_symbol + GPS_L1_CA_CODE_PERIOD; } current_synchro_data.d_TOW = d_TOW_at_Preamble; current_synchro_data.d_TOW_at_current_symbol = d_TOW_at_current_symbol; current_synchro_data.d_TOW_hybrid_at_current_symbol = current_synchro_data.d_TOW_at_current_symbol; // to be used in the hybrid configuration current_synchro_data.Flag_valid_word = (d_flag_frame_sync == true and d_flag_parity == true and flag_TOW_set == true); current_synchro_data.Flag_preamble = d_flag_preamble; current_synchro_data.Prn_timestamp_ms = in[0][0].Tracking_timestamp_secs * 1000.0; current_synchro_data.Prn_timestamp_at_preamble_ms = Prn_timestamp_at_preamble_ms; if (flag_PLL_180_deg_phase_locked == true) { //correct the accumulated phase for the Costas loop phase shift, if required current_synchro_data.Carrier_phase_rads += GPS_PI; } if(d_dump == true) { // MULTIPLEXED FILE RECORDING - Record results to file try { double tmp_double; tmp_double = d_TOW_at_current_symbol; d_dump_file.write((char*)&tmp_double, sizeof(double)); tmp_double = current_synchro_data.Prn_timestamp_ms; d_dump_file.write((char*)&tmp_double, sizeof(double)); tmp_double = d_TOW_at_Preamble; d_dump_file.write((char*)&tmp_double, sizeof(double)); } catch (const std::ifstream::failure & e) { LOG(WARNING) << "Exception writing observables dump file " << e.what(); } } //todo: implement averaging d_average_count++; if (d_average_count == d_decimation_output_factor) { d_average_count = 0; //3. Make the output (copy the object contents to the GNURadio reserved memory) *out[0] = current_synchro_data; //std::cout<<"GPS L1 TLM output on CH="<d_channel << " SAMPLE STAMP="<(d_channel)); d_dump_filename.append(".dat"); d_dump_file.exceptions ( std::ifstream::failbit | std::ifstream::badbit ); d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); LOG(INFO) << "Telemetry decoder dump enabled on channel " << d_channel << " Log file: " << d_dump_filename.c_str(); } catch (const std::ifstream::failure &e) { LOG(WARNING) << "channel " << d_channel << " Exception opening trk dump file " << e.what(); } } } } gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.h000066400000000000000000000102101305042567700333140ustar00rootroot00000000000000/*! * \file gps_l1_ca_telemetry_decoder_cc.h * \brief Interface of a NAV message demodulator block based on * Kay Borre book MATLAB-based GPS receiver * \author Javier Arribas, 2011. jarribas(at)cttc.es * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L1_CA_TELEMETRY_DECODER_CC_H #define GNSS_SDR_GPS_L1_CA_TELEMETRY_DECODER_CC_H #include #include #include #include #include "GPS_L1_CA.h" #include "gps_l1_ca_subframe_fsm.h" #include "concurrent_queue.h" #include "gnss_satellite.h" class gps_l1_ca_telemetry_decoder_cc; typedef boost::shared_ptr gps_l1_ca_telemetry_decoder_cc_sptr; gps_l1_ca_telemetry_decoder_cc_sptr gps_l1_ca_make_telemetry_decoder_cc(Gnss_Satellite satellite, bool dump); /*! * \brief This class implements a block that decodes the NAV data defined in IS-GPS-200E * */ class gps_l1_ca_telemetry_decoder_cc : public gr::block { public: ~gps_l1_ca_telemetry_decoder_cc(); void set_satellite(Gnss_Satellite satellite); //!< Set satellite PRN void set_channel(int channel); //!< Set receiver's channel /*! * \brief Set decimation factor to average the GPS synchronization estimation output from the tracking module. */ void set_decimation(int decimation); /*! * \brief This is where all signal processing takes place */ int general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); /*! * \brief Function which tells the scheduler how many input items * are required to produce noutput_items output items. */ void forecast (int noutput_items, gr_vector_int &ninput_items_required); private: friend gps_l1_ca_telemetry_decoder_cc_sptr gps_l1_ca_make_telemetry_decoder_cc(Gnss_Satellite satellite, bool dump); gps_l1_ca_telemetry_decoder_cc(Gnss_Satellite satellite, bool dump); bool gps_word_parityCheck(unsigned int gpsword); // constants //unsigned short int d_preambles_bits[GPS_CA_PREAMBLE_LENGTH_BITS]; // class private vars int *d_preambles_symbols; unsigned int d_stat; bool d_flag_frame_sync; // symbols std::deque d_symbol_history; std::deque d_correlation_length_ms_history; double d_symbol_accumulator; short int d_symbol_accumulator_counter; //bits and frame unsigned short int d_frame_bit_index; unsigned int d_GPS_frame_4bytes; unsigned int d_prev_GPS_frame_4bytes; bool d_flag_parity; bool d_flag_preamble; int d_word_number; // output averaging and decimation int d_average_count; int d_decimation_output_factor; //double d_preamble_duration_seconds; // navigation message vars Gps_Navigation_Message d_nav; GpsL1CaSubframeFsm d_GPS_FSM; bool d_dump; Gnss_Satellite d_satellite; int d_channel; double d_preamble_time_seconds; long double d_TOW_at_Preamble; long double d_TOW_at_current_symbol; double Prn_timestamp_at_preamble_ms; bool flag_TOW_set; bool flag_PLL_180_deg_phase_locked; std::string d_dump_filename; std::ofstream d_dump_file; }; #endif gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.cc000066400000000000000000000574121305042567700331720ustar00rootroot00000000000000/*! * \file gps_l2c_telemetry_decoder_cc.cc * \brief Implementation of a NAV message demodulator block based on * Kay Borre book MATLAB-based GPS receiver * \author Javier Arribas, 2015. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include "gnss_synchro.h" #include "gps_l2c_telemetry_decoder_cc.h" using google::LogMessage; // logging levels #define EVENT 2 // logs important events which don't occur every block #define FLOW 3 // logs the function calls of block processing functions #define SAMP_SYNC 4 // about 1 log entry per sample -> high output #define LMORE 5 // gps_l2c_telemetry_decoder_cc_sptr gps_l2c_make_telemetry_decoder_cc(Gnss_Satellite satellite, bool dump) { return gps_l2c_telemetry_decoder_cc_sptr(new gps_l2c_telemetry_decoder_cc(satellite, dump)); } gps_l2c_telemetry_decoder_cc::gps_l2c_telemetry_decoder_cc( Gnss_Satellite satellite, bool dump) : gr::block("gps_l2c_telemetry_decoder_cc", gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { // Telemetry Bit transition synchronization port out this->message_port_register_out(pmt::mp("preamble_timestamp_s")); // Ephemeris data port out this->message_port_register_out(pmt::mp("telemetry")); // initialize internal vars d_dump = dump; d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); LOG(INFO) << "GPS L2C M TELEMETRY PROCESSING: satellite " << d_satellite; d_block_size = GPS_L2_SAMPLES_PER_SYMBOL * GPS_L2_SYMBOLS_PER_BIT * GPS_L2_CNAV_DATA_PAGE_BITS * 2; // two CNAV frames d_decimation_output_factor = 0; //set_output_multiple (1); d_average_count = 0; d_flag_invert_buffer_symbols = false; d_flag_invert_input_symbols = false; d_channel = 0; d_flag_valid_word = false; d_TOW_at_current_symbol = 0; d_TOW_at_Preamble = 0; //set_history(d_samples_per_bit*8); // At least a history of 8 bits are needed to correlate with the preamble } gps_l2c_telemetry_decoder_cc::~gps_l2c_telemetry_decoder_cc() { d_dump_file.close(); } void gps_l2c_telemetry_decoder_cc::forecast (int noutput_items, gr_vector_int &ninput_items_required) { if (noutput_items != 0) { unsigned ninputs = ninput_items_required.size (); for (unsigned i = 0; i < ninputs; i++) ninput_items_required[i] = noutput_items; } //LOG(INFO) << "forecast(): " << "noutput_items=" << noutput_items << "\tninput_items_required ninput_items_required.size()=" << ninput_items_required.size(); } void gps_l2c_telemetry_decoder_cc::set_decimation(int decimation) { d_decimation_output_factor = decimation; } int gps_l2c_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) { // get pointers on in- and output gnss-synchro objects const Gnss_Synchro *in = (const Gnss_Synchro *) input_items[0]; // input Gnss_Synchro *out = (Gnss_Synchro *) output_items[0]; // output bool flag_new_cnav_frame = false; int last_frame_preamble_start = 0; // copy correlation samples into samples vector d_sample_buf.push_back(in[0].Prompt_I); consume_each(1); //one by one // decode only if enough samples in buffer if(d_sample_buf.size() >= d_block_size) { if (in[0].Flag_valid_symbol_output == false) // check if the tracking is locked { LOG(INFO) << "Discarting channel " << d_channel << " tracking not ready!" << std::endl; d_flag_valid_word = false; } else { d_flag_invert_buffer_symbols = d_flag_invert_input_symbols; while (true) { if (d_flag_invert_buffer_symbols == true) { for (std::vector::iterator symbol_it = d_sample_buf.begin(); symbol_it != d_sample_buf.end(); symbol_it++) { *symbol_it = -(*symbol_it); } //LOG(INFO)<<"Inverting buffer symbols"; } // align symbols in pairs // and obtain the bits by decoding the symbols (viterbi decoder) // they can be already aligned or shifted by one position std::vector bits; d_symbol_aligner_and_decoder.get_bits(d_sample_buf, bits); //std::stringstream ss; //for (std::vector::const_iterator bit_it = bits.begin(); bit_it < bits.end(); ++bit_it) // { // ss << *bit_it; // } //LOG(INFO) << "get_bits=" << ss.str() << std::endl; // search for preambles // and extract the corresponding message candidates std::vector msg_candidates; d_frame_detector.get_frame_candidates(bits, msg_candidates); // verify checksum // and return the valid messages std::vector valid_msgs; d_crc_verifier.get_valid_frames(msg_candidates, valid_msgs); if (valid_msgs.size() == 0) { if (d_flag_invert_buffer_symbols == d_flag_invert_input_symbols) { d_flag_invert_buffer_symbols = not d_flag_invert_buffer_symbols; } else {//already tested the symbol inversion but CRC still fail LOG(INFO) << "Discarting this buffer, no CNAV frames detected CH " << this->d_channel; break; } } else { //at least one frame has good CRC, keep the invert sign for the next frames d_flag_invert_input_symbols = d_flag_invert_buffer_symbols; std::vector tmp_msg; std::string msg; //todo: now the symbol buffer size is two CNAV frames because the preamble is not detected. // Use the first valid frame to realign the bufer symbols with the preamble start and not miss a frame LOG(INFO) << valid_msgs.size() << " GOOD L2C CNAV FRAME DETECTED! CH " <d_channel; for (unsigned int i = 0;i < valid_msgs.size(); i++) { tmp_msg = valid_msgs.at(i).second; d_CNAV_Message.decode_page(tmp_msg); std::cout << "Valid CNAV frame with relative preamble start at " << valid_msgs.at(i).first << std::endl; flag_new_cnav_frame = true; d_flag_valid_word = true; last_frame_preamble_start = valid_msgs.at(i).first; // 4. Push the new navigation data to the queues if (d_CNAV_Message.have_new_ephemeris() == true) { // get ephemeris object for this SV std::shared_ptr tmp_obj= std::make_shared(d_CNAV_Message.get_ephemeris()); std::cout << "New GPS CNAV Ephemeris received for SV " << tmp_obj->i_satellite_PRN << std::endl; this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); } if (d_CNAV_Message.have_new_iono() == true) { std::shared_ptr tmp_obj= std::make_shared(d_CNAV_Message.get_iono()); std::cout << "New GPS CNAV IONO model received for SV " << d_satellite.get_PRN() << std::endl; this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); } } break; } } } // clear all processed samples in the input buffer d_sample_buf.clear(); } // 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]; if (d_flag_valid_word == true) { double Prn_timestamp_at_preamble_ms = 0; //2. Add the telemetry decoder information if (flag_new_cnav_frame == true) { //update TOW at the preamble instant Prn_timestamp_at_preamble_ms = (in[0].Tracking_timestamp_secs * 1000.0) - (d_block_size - last_frame_preamble_start) * GPS_L2_M_PERIOD; d_TOW_at_Preamble = d_CNAV_Message.d_TOW - GPS_L2_CNAV_DATA_PAGE_DURATION_S; d_TOW_at_current_symbol = d_TOW_at_Preamble + (d_block_size - last_frame_preamble_start) * GPS_L2_M_PERIOD; current_synchro_data.d_TOW = d_TOW_at_Preamble; current_synchro_data.d_TOW_at_current_symbol = d_TOW_at_current_symbol; current_synchro_data.d_TOW_hybrid_at_current_symbol = current_synchro_data.d_TOW_at_current_symbol; current_synchro_data.Flag_preamble = false; current_synchro_data.Prn_timestamp_ms = in[0].Tracking_timestamp_secs * 1000.0; current_synchro_data.Prn_timestamp_at_preamble_ms = Prn_timestamp_at_preamble_ms; } else { d_TOW_at_current_symbol = d_TOW_at_Preamble + (d_block_size - last_frame_preamble_start) * GPS_L2_M_PERIOD; current_synchro_data.d_TOW = d_TOW_at_Preamble; current_synchro_data.d_TOW_at_current_symbol = d_TOW_at_current_symbol; current_synchro_data.d_TOW_hybrid_at_current_symbol = current_synchro_data.d_TOW_at_current_symbol; current_synchro_data.Flag_preamble = false; current_synchro_data.Prn_timestamp_ms = in[0].Tracking_timestamp_secs * 1000.0; current_synchro_data.Prn_timestamp_at_preamble_ms = Prn_timestamp_at_preamble_ms; } current_synchro_data.Flag_valid_word = true; } else { current_synchro_data.Flag_valid_word = false; } d_average_count++; if (d_average_count == d_decimation_output_factor) { d_average_count = 0; //3. Make the output (copy the object contents to the GNURadio reserved memory) out[0] = current_synchro_data; //std::cout<<"GPS L2 TLM output on CH="<d_channel << " SAMPLE STAMP="<d_channel << " set to satellite " << d_satellite; } void gps_l2c_telemetry_decoder_cc::set_channel(int channel) { d_channel = channel; LOG(INFO) << "GPS L2C CNAV channel set to " << channel; } // ### helper class for symbol alignment and viterbi decoding ### gps_l2c_telemetry_decoder_cc::symbol_aligner_and_decoder::symbol_aligner_and_decoder() { // convolutional code properties d_KK = 7; int nn = 2; int g_encoder[nn]; g_encoder[0] = 121; //171o g_encoder[1] = 91; //133o d_vd1 = new Viterbi_Decoder(g_encoder, d_KK, nn); d_vd2 = new Viterbi_Decoder(g_encoder, d_KK, nn); d_past_symbol = 0; } gps_l2c_telemetry_decoder_cc::symbol_aligner_and_decoder::~symbol_aligner_and_decoder() { delete d_vd1; delete d_vd2; } void gps_l2c_telemetry_decoder_cc::symbol_aligner_and_decoder::reset() { d_past_symbol = 0; d_vd1->reset(); d_vd2->reset(); } bool gps_l2c_telemetry_decoder_cc::symbol_aligner_and_decoder::get_bits(const std::vector & symbols, std::vector & bits) { const int traceback_depth = 5 * d_KK; int nbits_requested = symbols.size() / GPS_L2_SYMBOLS_PER_BIT; int nbits_decoded; // fill two vectors with the two possible symbol alignments std::vector symbols_vd1(symbols); // aligned symbol vector -> copy input symbol vector std::vector symbols_vd2; // shifted symbol vector -> add past sample in front of input vector symbols_vd2.push_back(d_past_symbol); for (std::vector::const_iterator symbol_it = symbols.begin(); symbol_it != symbols.end() - 1; ++symbol_it) { symbols_vd2.push_back(*symbol_it); } // arrays for decoded bits int * bits_vd1 = new int[nbits_requested]; int * bits_vd2 = new int[nbits_requested]; // decode float metric_vd1 = d_vd1->decode_continuous(symbols_vd1.data(), traceback_depth, bits_vd1, nbits_requested, nbits_decoded); float metric_vd2 = d_vd2->decode_continuous(symbols_vd2.data(), traceback_depth, bits_vd2, nbits_requested, nbits_decoded); //LOG(INFO)<<"metric_vd1="<::const_iterator bit_it = bits.begin(); bit_it < bits.end(); ++bit_it) { d_buffer.push_back(*bit_it); //ss << *bit_it; count++; } //LOG(INFO) << ss.str() << " into working buffer (" << count << " bits)"; int relative_preamble_start = 0; while(d_buffer.size() >= cnav_msg_length) { // compare with all preambles for (std::vector>::iterator preample_it = preambles.begin(); preample_it < preambles.end(); ++preample_it) { bool preamble_detected = true; bool inv_preamble_detected = true; // compare the buffer bits with the preamble bits for (std::vector::iterator preample_bit_it = preample_it->begin(); preample_bit_it < preample_it->end(); ++preample_bit_it) { preamble_detected = *preample_bit_it == d_buffer[preample_bit_it - preample_it->begin()] ? preamble_detected : false ; inv_preamble_detected = *preample_bit_it != d_buffer[preample_bit_it - preample_it->begin()] ? inv_preamble_detected : false ; } if (preamble_detected || inv_preamble_detected) { // copy candidate std::vector candidate; std::copy(d_buffer.begin(), d_buffer.begin() + cnav_msg_length, std::back_inserter(candidate)); if(inv_preamble_detected) { // invert bits for (std::vector::iterator candidate_bit_it = candidate.begin(); candidate_bit_it != candidate.end(); candidate_bit_it++) *candidate_bit_it = *candidate_bit_it == 0 ? 1 : 0; } msg_candidates.push_back(std::pair>(relative_preamble_start, candidate)); //ss.str(""); //ss << "preamble " << preample_it - preambles.begin() << (inv_preamble_detected?" inverted":" normal") << " detected! candidate="; //for (std::vector::iterator bit_it = candidate.begin(); bit_it < candidate.end(); ++bit_it) // ss << *bit_it; //LOG(INFO) << ss.str(); } } relative_preamble_start++; // remove bit in front d_buffer.pop_front(); } } // ### helper class for checking the CRC of the message candidates ### void gps_l2c_telemetry_decoder_cc::crc_verifier::reset() { } void gps_l2c_telemetry_decoder_cc::crc_verifier::get_valid_frames(const std::vector & msg_candidates, std::vector & valid_msgs) { std::vector tmp_msg; LOG(INFO) << "get_valid_frames(): " << "msg_candidates.size()=" << msg_candidates.size(); // for each candidate for (std::vector::const_iterator candidate_it = msg_candidates.begin(); candidate_it < msg_candidates.end(); ++candidate_it) { // convert to bytes std::vector candidate_bytes; zerropad_back_and_convert_to_bytes(candidate_it->second, candidate_bytes); // verify CRC d_checksum_agent.reset(0); d_checksum_agent.process_bytes(candidate_bytes.data(), candidate_bytes.size()); unsigned int crc = d_checksum_agent.checksum(); //LOG(INFO) << "candidate " << ": final crc remainder= " << std::hex << crc // << std::setfill(' ') << std::resetiosflags(std::ios::hex); // the final remainder must be zero for a valid message, because the CRC is done over the received CRC value if (crc == 0) { valid_msgs.push_back(msg_candiate_int_t(candidate_it->first, candidate_it->second)); std::cout << "Valid CNAV message found!"< & msg_candidate, std::vector & bytes) { //std::stringstream ss; const size_t bits_per_byte = 8; unsigned char byte = 0; //LOG(INFO) << "zerropad_back_and_convert_to_bytes():" << byte; for (std::vector::const_iterator candidate_bit_it = msg_candidate.begin(); candidate_bit_it < msg_candidate.end(); ++candidate_bit_it) { int idx_bit = candidate_bit_it - msg_candidate.begin(); int bit_pos_in_current_byte = (bits_per_byte - 1) - (idx_bit % bits_per_byte); byte |= (unsigned char)(*candidate_bit_it) << bit_pos_in_current_byte; // ss << *candidate_bit_it; if (idx_bit % bits_per_byte == bits_per_byte - 1) { bytes.push_back(byte); //LOG(INFO) << ss.str() << " -> byte=" << std::setw(2) << std::setfill('0') << std::hex << (unsigned int)byte; ss.str(""); byte = 0; } } bytes.push_back(byte); // implies: insert 6 zeros at the end to fit the 250bits into a multiple of bytes //LOG(INFO) << " -> byte=" << std::setw(2) // << std::setfill('0') << std::hex << (unsigned int)byte // << std::setfill(' ') << std::resetiosflags(std::ios::hex); } void gps_l2c_telemetry_decoder_cc::crc_verifier::zerropad_front_and_convert_to_bytes(const std::vector & msg_candidate, std::vector & bytes) { //std::stringstream ss; const size_t bits_per_byte = 8; unsigned char byte = 0; int idx_bit = 6; // insert 6 zeros at the front to fit the 250bits into a multiple of bytes //LOG(INFO) << "zerropad_front_and_convert_to_bytes():" << byte; for (std::vector::const_iterator candidate_bit_it = msg_candidate.begin(); candidate_bit_it < msg_candidate.end(); ++candidate_bit_it) { int bit_pos_in_current_byte = (bits_per_byte - 1) - (idx_bit % bits_per_byte); byte |= (unsigned char)(*candidate_bit_it) << bit_pos_in_current_byte; // ss << *candidate_bit_it; if (idx_bit % bits_per_byte == bits_per_byte - 1) { bytes.push_back(byte); //LOG(INFO) << ss.str() << " -> byte=" << std::setw(2) // << std::setfill('0') << std::hex << (unsigned int)byte; ss.str(""); byte = 0; } idx_bit++; } //LOG(INFO) << " -> byte=" << std::setw(2) // << std::setfill('0') << std::hex << (unsigned int)byte // << std::setfill(' ') << std::resetiosflags(std::ios::hex); } gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_cc.h000066400000000000000000000124701305042567700330270ustar00rootroot00000000000000/*! * \file gps_l2c_telemetry_decoder_cc.h * \brief Interface of a CNAV message demodulator block based on * Kay Borre book MATLAB-based GPS receiver * \author Javier Arribas, 2015. jarribas(at)cttc.es * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L2C_TELEMETRY_DECODER_CC_H #define GNSS_SDR_GPS_L2C_TELEMETRY_DECODER_CC_H #include // for copy #include #include #include #include // for pair #include #include #include #include "gnss_satellite.h" #include "viterbi_decoder.h" #include "gps_cnav_navigation_message.h" #include "gps_cnav_ephemeris.h" #include "gps_cnav_iono.h" #include "concurrent_queue.h" #include "GPS_L2C.h" class gps_l2c_telemetry_decoder_cc; typedef boost::shared_ptr gps_l2c_telemetry_decoder_cc_sptr; gps_l2c_telemetry_decoder_cc_sptr gps_l2c_make_telemetry_decoder_cc(Gnss_Satellite satellite, bool dump); /*! * \brief This class implements a block that decodes the SBAS integrity and corrections data defined in RTCA MOPS DO-229 * */ class gps_l2c_telemetry_decoder_cc : public gr::block { public: ~gps_l2c_telemetry_decoder_cc(); void set_satellite(Gnss_Satellite satellite); //!< Set satellite PRN void set_channel(int channel); //!< Set receiver's channel void set_decimation(int decimation); /*! * \brief This is where all signal processing takes place */ int general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); /*! * \brief Function which tells the scheduler how many input items * are required to produce noutput_items output items. */ void forecast (int noutput_items, gr_vector_int &ninput_items_required); private: friend gps_l2c_telemetry_decoder_cc_sptr gps_l2c_make_telemetry_decoder_cc(Gnss_Satellite satellite, bool dump); gps_l2c_telemetry_decoder_cc(Gnss_Satellite satellite, bool dump); void viterbi_decoder(double *page_part_symbols, int *page_part_bits); void align_samples(); bool d_dump; Gnss_Satellite d_satellite; int d_channel; std::string d_dump_filename; std::ofstream d_dump_file; double d_TOW_at_current_symbol; double d_TOW_at_Preamble; bool d_flag_valid_word; bool d_flag_invert_input_symbols; bool d_flag_invert_buffer_symbols; int d_decimation_output_factor; int d_average_count; size_t d_block_size; //!< number of samples which are processed during one invocation of the algorithms std::vector d_sample_buf; //!< input buffer holding the samples to be processed in one block typedef std::pair> msg_candiate_int_t; typedef std::pair> msg_candiate_char_t; // helper class for symbol alignment and Viterbi decoding class symbol_aligner_and_decoder { public: symbol_aligner_and_decoder(); ~symbol_aligner_and_decoder(); void reset(); bool get_bits(const std::vector & symbols, std::vector & bits); private: int d_KK; Viterbi_Decoder * d_vd1; Viterbi_Decoder * d_vd2; double d_past_symbol; } d_symbol_aligner_and_decoder; // helper class for detecting the preamble and collect the corresponding message candidates class frame_detector { public: void reset(); void get_frame_candidates(const std::vector & bits, std::vector>> & msg_candidates); private: std::deque d_buffer; } d_frame_detector; // helper class for checking the CRC of the message candidates class crc_verifier { public: void reset(); void get_valid_frames(const std::vector & msg_candidates, std::vector & valid_msgs); private: typedef boost::crc_optimal<24, 0x1864CFBu, 0x0, 0x0, false, false> crc_24_q_type; crc_24_q_type d_checksum_agent; void zerropad_front_and_convert_to_bytes(const std::vector & msg_candidate, std::vector & bytes); void zerropad_back_and_convert_to_bytes(const std::vector & msg_candidate, std::vector & bytes); } d_crc_verifier; Gps_CNAV_Navigation_Message d_CNAV_Message; }; #endif gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/gnuradio_blocks/sbas_l1_telemetry_decoder_cc.cc000066400000000000000000000536431305042567700331670ustar00rootroot00000000000000/*! * \file sbas_l1_telemetry_decoder_cc.cc * \brief Implementation of a SBAS telemetry data decoder block * \author Daniel Fehr 2013. daniel.co(at)bluewin.ch * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include "control_message_factory.h" #include "gnss_synchro.h" #include "sbas_l1_telemetry_decoder_cc.h" using google::LogMessage; // logging levels #define EVENT 2 // logs important events which don't occur every block #define FLOW 3 // logs the function calls of block processing functions #define SAMP_SYNC 4 // about 1 log entry per sample -> high output #define LMORE 5 // sbas_l1_telemetry_decoder_cc_sptr sbas_l1_make_telemetry_decoder_cc(Gnss_Satellite satellite, bool dump) { return sbas_l1_telemetry_decoder_cc_sptr(new sbas_l1_telemetry_decoder_cc(satellite, dump)); } sbas_l1_telemetry_decoder_cc::sbas_l1_telemetry_decoder_cc( Gnss_Satellite satellite, bool dump) : gr::block("sbas_l1_telemetry_decoder_cc", gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { // Telemetry Bit transition synchronization port out this->message_port_register_out(pmt::mp("preamble_timestamp_s")); // Ephemeris data port out this->message_port_register_out(pmt::mp("telemetry")); // initialize internal vars d_dump = dump; d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); LOG(INFO) << "SBAS L1 TELEMETRY PROCESSING: satellite " << d_satellite; d_block_size = d_samples_per_symbol * d_symbols_per_bit * d_block_size_in_bits; d_channel = 0; set_output_multiple (1); } sbas_l1_telemetry_decoder_cc::~sbas_l1_telemetry_decoder_cc() { d_dump_file.close(); } void sbas_l1_telemetry_decoder_cc::forecast (int noutput_items, gr_vector_int &ninput_items_required) { unsigned ninputs = ninput_items_required.size (); for (unsigned i = 0; i < ninputs; i++) ninput_items_required[i] = noutput_items; VLOG(LMORE) << "forecast(): " << "noutput_items=" << noutput_items << "\tninput_items_required ninput_items_required.size()=" << ninput_items_required.size(); } int sbas_l1_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) { VLOG(FLOW) << "general_work(): " << "noutput_items=" << noutput_items << "\toutput_items real size=" << output_items.size() << "\tninput_items size=" << ninput_items.size() << "\tinput_items real size=" << input_items.size() << "\tninput_items[0]=" << ninput_items[0]; // get pointers on in- and output gnss-synchro objects const Gnss_Synchro *in = (const Gnss_Synchro *) input_items[0]; // input Gnss_Synchro *out = (Gnss_Synchro *) output_items[0]; // output // store the time stamp of the first sample in the processed sample block double sample_stamp = in[0].Tracking_timestamp_secs; // copy correlation samples into samples vector for (int i = 0; i < noutput_items; i++) { // check if channel is in tracking state //if(in[i].Prompt_I != in[i].Prompt_Q) // TODO: check for real condition { d_sample_buf.push_back(in[i].Prompt_I); } } // decode only if enough samples in buffer if(d_sample_buf.size() >= d_block_size) { // align correlation samples in pairs // and obtain the symbols by summing the paired correlation samples std::vector symbols; bool sample_alignment = d_sample_aligner.get_symbols(d_sample_buf, symbols); // align symbols in pairs // and obtain the bits by decoding the symbol pairs std::vector bits; bool symbol_alignment = d_symbol_aligner_and_decoder.get_bits(symbols, bits); // search for preambles // and extract the corresponding message candidates std::vector msg_candidates; d_frame_detector.get_frame_candidates(bits, msg_candidates); // verify checksum // and return the valid messages std::vector valid_msgs; d_crc_verifier.get_valid_frames(msg_candidates, valid_msgs); // compute message sample stamp // and fill messages in SBAS raw message objects std::vector sbas_raw_msgs; for(std::vector::const_iterator it = valid_msgs.begin(); it != valid_msgs.end(); ++it) { int message_sample_offset = (sample_alignment ? 0 : -1) + d_samples_per_symbol*(symbol_alignment ? -1 : 0) + d_samples_per_symbol * d_symbols_per_bit * it->first; double message_sample_stamp = sample_stamp + ((double)message_sample_offset)/1000; VLOG(EVENT) << "message_sample_stamp=" << message_sample_stamp << " (sample_stamp=" << sample_stamp << " sample_alignment=" << sample_alignment << " symbol_alignment=" << symbol_alignment << " relative_preamble_start=" << it->first << " message_sample_offset=" << message_sample_offset << ")"; Sbas_Raw_Msg sbas_raw_msg(message_sample_stamp, this->d_satellite.get_PRN(), it->second); sbas_raw_msgs.push_back(sbas_raw_msg); } // parse messages // and send them to the SBAS raw message queue for(std::vector::iterator it = sbas_raw_msgs.begin(); it != sbas_raw_msgs.end(); it++) { std::cout << "SBAS message type " << it->get_msg_type() << " from PRN" << it->get_prn() << " received" << std::endl; sbas_telemetry_data.update(*it); } // clear all processed samples in the input buffer d_sample_buf.clear(); } // UPDATE GNSS SYNCHRO DATA // actually the SBAS telemetry decoder doesn't support ranging Gnss_Synchro * current_synchro_data = out; //structure to save the synchronization information and send the output object to the next block for (int i = 0; i < noutput_items; i++) { //1. Copy the current tracking output current_synchro_data[i] = in[i]; //2. Add the telemetry decoder information current_synchro_data[i].Flag_valid_word = false; // indicate to observable block that this synchro object isn't valid for pseudorange computation } consume_each(noutput_items); // tell scheduler input items consumed return noutput_items; // tell scheduler output items produced } void sbas_l1_telemetry_decoder_cc::set_satellite(Gnss_Satellite satellite) { d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); LOG(INFO) << "SBAS telemetry decoder in channel " << this->d_channel << " set to satellite " << d_satellite; } void sbas_l1_telemetry_decoder_cc::set_channel(int channel) { d_channel = channel; LOG(INFO) << "SBAS channel set to " << channel; } // ### helper class for sample alignment ### sbas_l1_telemetry_decoder_cc::sample_aligner::sample_aligner() { d_n_smpls_in_history = 3; d_iir_par = 0.05; reset(); } sbas_l1_telemetry_decoder_cc::sample_aligner::~sample_aligner() {} void sbas_l1_telemetry_decoder_cc::sample_aligner::reset() { d_past_sample = 0; d_corr_paired = 0; d_corr_shifted = 0; d_aligned = true; } /* * samples length must be a multiple of two */ bool sbas_l1_telemetry_decoder_cc::sample_aligner::get_symbols(const std::vector samples, std::vector &symbols) { double smpls[3] = { }; double corr_diff; bool stand_by = true; double sym; VLOG(FLOW) << "get_symbols(): " << "d_past_sample=" << d_past_sample << "\tsamples size=" << samples.size(); for (unsigned int i_sym = 0; i_sym < samples.size()/sbas_l1_telemetry_decoder_cc::d_samples_per_symbol; i_sym++) { // get the next samples for (int i = 0; i < d_n_smpls_in_history; i++) { smpls[i] = ((int)i_sym)*sbas_l1_telemetry_decoder_cc::d_samples_per_symbol + i - 1 == -1 ? d_past_sample : samples[i_sym*sbas_l1_telemetry_decoder_cc::d_samples_per_symbol + i - 1]; } // update the pseudo correlations (IIR method) of the two possible alignments d_corr_paired = d_iir_par*smpls[1]*smpls[2] + (1 - d_iir_par)*d_corr_paired; d_corr_shifted = d_iir_par*smpls[0]*smpls[1] + (1 - d_iir_par)*d_corr_shifted; // decide which alignment is the correct one corr_diff = std::abs(d_corr_paired - d_corr_shifted); stand_by = d_aligned ? corr_diff < d_corr_paired/2 : corr_diff < d_corr_shifted/2; if (!stand_by) { d_aligned = d_corr_paired >= d_corr_shifted; } // sum the correct pair of samples to a symbol, depending on the current alignment d_align sym = smpls[0 + int(d_aligned)*2] + smpls[1]; symbols.push_back(sym); // sample alignment debug output VLOG(SAMP_SYNC) << std::setprecision(5) << "smplp: " << std::setw(6) << smpls[0] << " " << "smpl0: " << std::setw(6) << smpls[1] << " " << "smpl1: " << std::setw(6) << smpls[2] << "\t" //<< "Flag_valid_tracking: " << std::setw(1) << in[0][0].Flag_valid_tracking << " " << std::setw(1) << in[0][0].Flag_valid_tracking << "\t" << "d_corr_paired: " << std::setw(10) << d_corr_paired << "\t" << "d_corr_shifted: " << std::setw(10) << d_corr_shifted << "\t" << "corr_diff: " << std::setw(10) << corr_diff << "\t" << "stand_by: " << std::setw(1) << stand_by << "\t" << "d_aligned: " << std::setw(1) << d_aligned << "\t" << "sym: " << std::setw(10) << sym << "\t"; } // save last sample for next block double temp; temp = samples.back(); d_past_sample = (temp); return d_aligned; } // ### helper class for symbol alignment and viterbi decoding ### sbas_l1_telemetry_decoder_cc::symbol_aligner_and_decoder::symbol_aligner_and_decoder() { // convolutional code properties d_KK = 7; int nn = 2; int g_encoder[nn]; g_encoder[0] = 121; g_encoder[1] = 91; d_vd1 = new Viterbi_Decoder(g_encoder, d_KK, nn); d_vd2 = new Viterbi_Decoder(g_encoder, d_KK, nn); d_past_symbol = 0; } sbas_l1_telemetry_decoder_cc::symbol_aligner_and_decoder::~symbol_aligner_and_decoder() { delete d_vd1; delete d_vd2; } void sbas_l1_telemetry_decoder_cc::symbol_aligner_and_decoder::reset() { d_past_symbol = 0; d_vd1->reset(); d_vd2->reset(); } bool sbas_l1_telemetry_decoder_cc::symbol_aligner_and_decoder::get_bits(const std::vector symbols, std::vector &bits) { const int traceback_depth = 5*d_KK; int nbits_requested = symbols.size()/d_symbols_per_bit; int nbits_decoded; // fill two vectors with the two possible symbol alignments std::vector symbols_vd1(symbols); // aligned symbol vector -> copy input symbol vector std::vector symbols_vd2; // shifted symbol vector -> add past sample in front of input vector symbols_vd2.push_back(d_past_symbol); for (std::vector::const_iterator symbol_it = symbols.begin(); symbol_it != symbols.end() - 1; ++symbol_it) { symbols_vd2.push_back(*symbol_it); } // arrays for decoded bits int * bits_vd1 = new int[nbits_requested]; int * bits_vd2 = new int[nbits_requested]; // decode float metric_vd1 = d_vd1->decode_continuous(symbols_vd1.data(), traceback_depth, bits_vd1, nbits_requested, nbits_decoded); float metric_vd2 = d_vd2->decode_continuous(symbols_vd2.data(), traceback_depth, bits_vd2, nbits_requested, nbits_decoded); // choose the bits with the better metric for (int i = 0; i < nbits_decoded; i++) { if (metric_vd1 > metric_vd2) {// symbols aligned bits.push_back(bits_vd1[i]); } else {// symbols shifted bits.push_back(bits_vd2[i]); } } d_past_symbol = symbols.back(); delete[] bits_vd1; delete[] bits_vd2; return metric_vd1 > metric_vd2; } // ### helper class for detecting the preamble and collect the corresponding message candidates ### void sbas_l1_telemetry_decoder_cc::frame_detector::reset() { d_buffer.clear(); } void sbas_l1_telemetry_decoder_cc::frame_detector::get_frame_candidates(const std::vector bits, std::vector>> &msg_candidates) { std::stringstream ss; unsigned int sbas_msg_length = 250; std::vector> preambles = {{0, 1, 0, 1, 0, 0, 1 ,1}, {1, 0, 0, 1, 1, 0, 1, 0}, {1, 1, 0, 0, 0, 1, 1, 0}}; VLOG(FLOW) << "get_frame_candidates(): " << "d_buffer.size()=" << d_buffer.size() << "\tbits.size()=" << bits.size(); ss << "copy bits "; int count = 0; // copy new bits into the working buffer for (std::vector::const_iterator bit_it = bits.begin(); bit_it < bits.end(); ++bit_it) { d_buffer.push_back(*bit_it); ss << *bit_it; count++; } VLOG(SAMP_SYNC) << ss.str() << " into working buffer (" << count << " bits)"; int relative_preamble_start = 0; while(d_buffer.size() >= sbas_msg_length) { // compare with all preambles for (std::vector>::iterator preample_it = preambles.begin(); preample_it < preambles.end(); ++preample_it) { bool preamble_detected = true; bool inv_preamble_detected = true; // compare the buffer bits with the preamble bits for (std::vector::iterator preample_bit_it = preample_it->begin(); preample_bit_it < preample_it->end(); ++preample_bit_it) { preamble_detected = *preample_bit_it == d_buffer[preample_bit_it - preample_it->begin()] ? preamble_detected : false ; inv_preamble_detected = *preample_bit_it != d_buffer[preample_bit_it - preample_it->begin()] ? inv_preamble_detected : false ; } if (preamble_detected || inv_preamble_detected) { // copy candidate std::vector candidate; std::copy(d_buffer.begin(), d_buffer.begin() + sbas_msg_length, std::back_inserter(candidate)); if(inv_preamble_detected) { // invert bits for (std::vector::iterator candidate_bit_it = candidate.begin(); candidate_bit_it != candidate.end(); candidate_bit_it++) *candidate_bit_it = *candidate_bit_it == 0 ? 1 : 0; } msg_candidates.push_back(std::pair>(relative_preamble_start, candidate)); ss.str(""); ss << "preamble " << preample_it - preambles.begin() << (inv_preamble_detected?" inverted":" normal") << " detected! candidate="; for (std::vector::iterator bit_it = candidate.begin(); bit_it < candidate.end(); ++bit_it) ss << *bit_it; VLOG(EVENT) << ss.str(); } } relative_preamble_start++; // remove bit in front d_buffer.pop_front(); } } // ### helper class for checking the CRC of the message candidates ### void sbas_l1_telemetry_decoder_cc::crc_verifier::reset() { } void sbas_l1_telemetry_decoder_cc::crc_verifier::get_valid_frames(const std::vector msg_candidates, std::vector &valid_msgs) { std::stringstream ss; VLOG(FLOW) << "get_valid_frames(): " << "msg_candidates.size()=" << msg_candidates.size(); // for each candidate for (std::vector::const_iterator candidate_it = msg_candidates.begin(); candidate_it < msg_candidates.end(); ++candidate_it) { // convert to bytes std::vector candidate_bytes; zerropad_back_and_convert_to_bytes(candidate_it->second, candidate_bytes); // verify CRC d_checksum_agent.reset(0); d_checksum_agent.process_bytes(candidate_bytes.data(), candidate_bytes.size()); unsigned int crc = d_checksum_agent.checksum(); VLOG(SAMP_SYNC) << "candidate " << candidate_it - msg_candidates.begin() << ": final crc remainder= " << std::hex << crc << std::setfill(' ') << std::resetiosflags(std::ios::hex); // the final remainder must be zero for a valid message, because the CRC is done over the received CRC value if (crc == 0) { valid_msgs.push_back(msg_candiate_char_t(candidate_it->first, candidate_bytes)); ss << "Valid message found!"; } else { ss << "Not a valid message."; } ss << " Relbitoffset=" << candidate_it->first << " content="; for (std::vector::iterator byte_it = candidate_bytes.begin(); byte_it < candidate_bytes.end(); ++byte_it) { ss << std::setw(2) << std::setfill('0') << std::hex << (unsigned int)(*byte_it); } VLOG(SAMP_SYNC) << ss.str() << std::setfill(' ') << std::resetiosflags(std::ios::hex) << std::endl; } } void sbas_l1_telemetry_decoder_cc::crc_verifier::zerropad_back_and_convert_to_bytes(const std::vector msg_candidate, std::vector &bytes) { std::stringstream ss; const size_t bits_per_byte = 8; unsigned char byte = 0; VLOG(LMORE) << "zerropad_back_and_convert_to_bytes():" << byte; for (std::vector::const_iterator candidate_bit_it = msg_candidate.begin(); candidate_bit_it < msg_candidate.end(); ++candidate_bit_it) { int idx_bit = candidate_bit_it - msg_candidate.begin(); int bit_pos_in_current_byte = (bits_per_byte - 1) - (idx_bit % bits_per_byte); byte |= (unsigned char)(*candidate_bit_it) << bit_pos_in_current_byte; ss << *candidate_bit_it; if (idx_bit % bits_per_byte == bits_per_byte - 1) { bytes.push_back(byte); VLOG(LMORE) << ss.str() << " -> byte=" << std::setw(2) << std::setfill('0') << std::hex << (unsigned int)byte; ss.str(""); byte = 0; } } bytes.push_back(byte); // implies: insert 6 zeros at the end to fit the 250bits into a multiple of bytes VLOG(LMORE) << " -> byte=" << std::setw(2) << std::setfill('0') << std::hex << (unsigned int)byte << std::setfill(' ') << std::resetiosflags(std::ios::hex); } void sbas_l1_telemetry_decoder_cc::crc_verifier::zerropad_front_and_convert_to_bytes(const std::vector msg_candidate, std::vector &bytes) { std::stringstream ss; const size_t bits_per_byte = 8; unsigned char byte = 0; int idx_bit = 6; // insert 6 zeros at the front to fit the 250bits into a multiple of bytes VLOG(LMORE) << "zerropad_front_and_convert_to_bytes():" << byte; for (std::vector::const_iterator candidate_bit_it = msg_candidate.begin(); candidate_bit_it < msg_candidate.end(); ++candidate_bit_it) { int bit_pos_in_current_byte = (bits_per_byte - 1) - (idx_bit % bits_per_byte); byte |= (unsigned char)(*candidate_bit_it) << bit_pos_in_current_byte; ss << *candidate_bit_it; if (idx_bit % bits_per_byte == bits_per_byte - 1) { bytes.push_back(byte); VLOG(LMORE) << ss.str() << " -> byte=" << std::setw(2) << std::setfill('0') << std::hex << (unsigned int)byte; ss.str(""); byte = 0; } idx_bit++; } VLOG(LMORE) << " -> byte=" << std::setw(2) << std::setfill('0') << std::hex << (unsigned int)byte << std::setfill(' ') << std::resetiosflags(std::ios::hex); } gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/gnuradio_blocks/sbas_l1_telemetry_decoder_cc.h000066400000000000000000000130651305042567700330230ustar00rootroot00000000000000/*! * \file sbas_l1_telemetry_decoder_cc.h * \brief Interface of a SBAS telemetry data decoder block * \author Daniel Fehr 2013. daniel.co(at)bluewin.ch * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_SBAS_L1_TELEMETRY_DECODER_CC_H #define GNSS_SDR_SBAS_L1_TELEMETRY_DECODER_CC_H #include // for copy #include #include #include #include // for pair #include #include #include #include "gnss_satellite.h" #include "viterbi_decoder.h" #include "sbas_telemetry_data.h" class sbas_l1_telemetry_decoder_cc; typedef boost::shared_ptr sbas_l1_telemetry_decoder_cc_sptr; sbas_l1_telemetry_decoder_cc_sptr sbas_l1_make_telemetry_decoder_cc(Gnss_Satellite satellite, bool dump); /*! * \brief This class implements a block that decodes the SBAS integrity and corrections data defined in RTCA MOPS DO-229 * */ class sbas_l1_telemetry_decoder_cc : public gr::block { public: ~sbas_l1_telemetry_decoder_cc(); void set_satellite(Gnss_Satellite satellite); //!< Set satellite PRN void set_channel(int channel); //!< Set receiver's channel /*! * \brief This is where all signal processing takes place */ int general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); /*! * \brief Function which tells the scheduler how many input items * are required to produce noutput_items output items. */ void forecast (int noutput_items, gr_vector_int &ninput_items_required); private: friend sbas_l1_telemetry_decoder_cc_sptr sbas_l1_make_telemetry_decoder_cc(Gnss_Satellite satellite, bool dump); sbas_l1_telemetry_decoder_cc(Gnss_Satellite satellite, bool dump); void viterbi_decoder(double *page_part_symbols, int *page_part_bits); void align_samples(); static const int d_samples_per_symbol = 2; static const int d_symbols_per_bit = 2; static const int d_block_size_in_bits = 30; bool d_dump; Gnss_Satellite d_satellite; int d_channel; std::string d_dump_filename; std::ofstream d_dump_file; size_t d_block_size; //!< number of samples which are processed during one invocation of the algorithms std::vector d_sample_buf; //!< input buffer holding the samples to be processed in one block typedef std::pair> msg_candiate_int_t; typedef std::pair> msg_candiate_char_t; // helper class for sample alignment class sample_aligner { public: sample_aligner(); ~sample_aligner(); void reset(); /* * samples length must be a multiple of two * for block operation */ bool get_symbols(const std::vector samples, std::vector &symbols); private: int d_n_smpls_in_history ; double d_iir_par; double d_corr_paired; double d_corr_shifted; bool d_aligned; double d_past_sample; } d_sample_aligner; // helper class for symbol alignment and Viterbi decoding class symbol_aligner_and_decoder { public: symbol_aligner_and_decoder(); ~symbol_aligner_and_decoder(); void reset(); bool get_bits(const std::vector symbols, std::vector &bits); private: int d_KK; Viterbi_Decoder * d_vd1; Viterbi_Decoder * d_vd2; double d_past_symbol; } d_symbol_aligner_and_decoder; // helper class for detecting the preamble and collect the corresponding message candidates class frame_detector { public: void reset(); void get_frame_candidates(const std::vector bits, std::vector>> &msg_candidates); private: std::deque d_buffer; } d_frame_detector; // helper class for checking the CRC of the message candidates class crc_verifier { public: void reset(); void get_valid_frames(const std::vector msg_candidates, std::vector &valid_msgs); private: typedef boost::crc_optimal<24, 0x1864CFBu, 0x0, 0x0, false, false> crc_24_q_type; crc_24_q_type d_checksum_agent; void zerropad_front_and_convert_to_bytes(const std::vector msg_candidate, std::vector &bytes); void zerropad_back_and_convert_to_bytes(const std::vector msg_candidate, std::vector &bytes); } d_crc_verifier; Sbas_Telemetry_Data sbas_telemetry_data; }; #endif gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/libs/000077500000000000000000000000001305042567700226615ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/libs/CMakeLists.txt000066400000000000000000000027251305042567700254270ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # set(TELEMETRY_DECODER_LIB_SOURCES gps_l1_ca_subframe_fsm.cc viterbi_decoder.cc ) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/interfaces ${CMAKE_SOURCE_DIR}/src/core/receiver ${CMAKE_SOURCE_DIR}/src/algorithms/telemetry_decoder/adapters ${Boost_INCLUDE_DIRS} ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ) file(GLOB TELEMETRY_DECODER_LIB_HEADERS "*.h") list(SORT TELEMETRY_DECODER_LIB_HEADERS) add_library(telemetry_decoder_lib ${TELEMETRY_DECODER_LIB_SOURCES} ${TELEMETRY_DECODER_LIB_HEADERS}) source_group(Headers FILES ${TELEMETRY_DECODER_LIB_HEADERS}) target_link_libraries(telemetry_decoder_lib gnss_system_parameters)gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/libs/convolutional.h000066400000000000000000000240361305042567700257330ustar00rootroot00000000000000/*! * \file convolutional.h * \brief General functions used to implement convolutional encoding. * \author Matthew C. Valenti * * ------------------------------------------------------------------------- * * Copyright (C) 2006-2008 Matthew C. Valenti * * 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. * * This file is a derived work of the original file, which had this note: * * Last updated on May 22, 2008 * * The functions in this file are part of the Iterative Solutions * Coded Modulation Library. The Iterative Solutions Coded Modulation * Library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2.1 of the License, * or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef GNSS_SDR_CONVOLUTIONAL_H_ #define GNSS_SDR_CONVOLUTIONAL_H_ #include // for calloc /* define constants used throughout the library */ const float MAXLOG = 1e7; /* Define infinity */ /*! * \brief Determines if a symbol has odd (1) or even (0) parity * Output parameters: * \return (returned int): The symbol's parity = 1 for odd and 0 for even * * \param[in] symbol The integer-valued symbol * \param[in] length The highest bit position in the symbol * * This function is used by nsc_enc_bit(), rsc_enc_bit(), and rsc_tail() */ static int parity_counter(int symbol, int length) { int counter; int temp_parity = 0; for (counter = 0; counter < length; counter++) { temp_parity = temp_parity^(symbol & 1); symbol = symbol >> 1; } return(temp_parity); } /*! * \brief Convolutionally encodes a single bit using a rate 1/n encoder. * Takes in one input bit at a time, and produces a n-bit output. * * \param[in] input The input data bit (i.e. a 0 or 1). * \param[in] state_in The starting state of the encoder (an int from 0 to 2^m-1). * \param[in] g[] An n-element vector containing the code generators in binary form. * \param[in] KK The constraint length of the convolutional code. * \param[out] output_p[] An n-element vector containing the encoded bits. * \param[out] state_out_p[] An integer containing the final state of the encoder * (i.e. the state after encoding this bit) * * This function is used by nsc_transit() */ static int nsc_enc_bit(int state_out_p[], int input, int state_in, int g[], int KK, int nn) { /* declare variables */ int state, i; int out_ = 0; /* create a word made up of state and new input */ state = (input << (KK - 1))^state_in; /* AND the word with the generators */ for (i = 0; i < nn; i++) { /* update output symbol */ out_ = (out_ << 1) + parity_counter(state & g[i], KK); } /* shift the state to make the new state */ state_out_p[0] = state >> 1; return(out_); } /*! * \brief Function that creates the transit and output vectors */ static void nsc_transit(int output_p[], int trans_p[], int input, int g[], int KK, int nn) { int nextstate[1]; int state, states; states = (1 << (KK - 1)); /* The number of states: 2^mm */ /* Determine the output and next state for each possible starting state */ for(state = 0; state < states; state++) { output_p[state] = nsc_enc_bit(nextstate, input, state, g, KK, nn); trans_p[state] = nextstate[0]; } return; } /*! * \brief Computes the branch metric used for decoding. * \return (returned float) The metric between the hypothetical symbol and the received vector * \param[in] rec_array The received vector, of length nn * \param[in] symbol The hypothetical symbol * \param[in] nn The length of the received vector * */ static float Gamma(float rec_array[], int symbol, int nn) { float rm = 0; int i; int mask = 1; for (i = 0; i < nn; i++) { if (symbol & mask) rm += rec_array[nn - i - 1]; mask = mask << 1; } return(rm); } /*! * \brief Uses the Viterbi algorithm to perform hard-decision decoding of a convolutional code. * \param[in] out0[] The output bits for each state if input is a 0. * \param[in] state0[] The next state if input is a 0. * \param[in] out1[] The output bits for each state if input is a 1. * \param[in] state1[] The next state if input is a 1. * \param[in] r[] The received signal in LLR-form. For BPSK, must be in form r = 2*a*y/(sigma^2). * \param[in] KK The constraint length of the convolutional code. * \param[in] LL The number of data bits. * \param[out] output_u_int[] Hard decisions on the data bits * */ static void Viterbi(int output_u_int[], int out0[], int state0[], int out1[], int state1[], double input_c[], int KK, int nn, int LL) { int i, t, state, mm, states; int number_symbols; float metric; float *prev_section, *next_section; int *prev_bit; int *prev_state; float *metric_c; /* Set of all possible branch metrics */ float *rec_array; /* Received values for one trellis section */ float max_val; /* some derived constants */ mm = KK - 1; states = 1 << mm; /* 2^mm */ number_symbols = 1 << nn; /* 2^nn */ /* dynamically allocate memory */ prev_section = static_cast(calloc( states, sizeof(float) )); next_section = static_cast(calloc( states, sizeof(float) )); prev_bit = static_cast(calloc( states*(LL + mm), sizeof(int) )); prev_state = static_cast(calloc( states*(LL + mm), sizeof(int) )); rec_array = static_cast(calloc( nn, sizeof(float) )); metric_c = static_cast(calloc( number_symbols, sizeof(float) )); /* initialize trellis */ for (state = 0; state < states; state++) { prev_section[state] = -MAXLOG; next_section[state] = -MAXLOG; } prev_section[0] = 0; /* start in all-zeros state */ /* go through trellis */ for (t = 0; t < LL + mm; t++) { for (i = 0; i < nn; i++) rec_array[i] = static_cast(input_c[nn*t + i]); /* precompute all possible branch metrics */ for (i = 0; i < number_symbols; i++) metric_c[i] = Gamma( rec_array, i, nn ); /* step through all states */ for (state = 0; state < states; state++) { /* hypothesis: info bit is a zero */ metric = prev_section[state] + metric_c[ out0[ state ] ]; /* store new metric if more than metric in storage */ if ( metric > next_section[state0[state]] ) { next_section[state0[state]] = metric; prev_state[t*states + state0[state]] = state; prev_bit[t*states + state0[state]] = 0; } /* hypothesis: info bit is a one */ metric = prev_section[state] + metric_c[ out1[ state ] ]; /* store new metric if more than metric in storage */ if ( metric > next_section[state1[state]] ) { next_section[state1[state]] = metric; prev_state[t*states + state1[state]] = state; prev_bit[t*states + state1[state]] = 1; } } /* normalize */ max_val = 0; for (state = 0; state < states; state++) { if (next_section[state] > max_val) { max_val = next_section[state]; } } for (state = 0; state < states; state++) { prev_section[state] = next_section[state] - max_val; next_section[state] = -MAXLOG; } } /* trace-back operation */ state = 0; /* tail, no need to output */ for (t = LL + mm - 1; t >= LL; t--) { state = prev_state[t*states + state]; } for (t = LL - 1; t >= 0; t--) { output_u_int[t] = prev_bit[t*states + state]; state = prev_state[t*states + state]; } /* free the dynamically allocated memory */ free(prev_section); free(next_section); free(prev_bit); free(prev_state); free(rec_array); free(metric_c); } #endif gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/libs/gps_l1_ca_subframe_fsm.cc000066400000000000000000000203661305042567700275600ustar00rootroot00000000000000/*! * \file gps_l1_ca_subframe_fsm.cc * \brief Implementation of a GPS NAV message word-to-subframe decoder state machine * \author Javier Arribas, 2011. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l1_ca_subframe_fsm.h" #include #include #include #include #include #include #include "gnss_satellite.h" //************ GPS WORD TO SUBFRAME DECODER STATE MACHINE ********** struct Ev_gps_word_valid : sc::event {}; struct Ev_gps_word_invalid : sc::event{}; struct Ev_gps_word_preamble : sc::event{}; struct gps_subframe_fsm_S0: public sc::state { public: // sc::transition(event,next_status) typedef sc::transition< Ev_gps_word_preamble, gps_subframe_fsm_S1 > reactions; gps_subframe_fsm_S0(my_context ctx): my_base( ctx ) { //std::cout<<"Enter S0 "< { public: typedef mpl::list, sc::transition< Ev_gps_word_valid, gps_subframe_fsm_S2 > > reactions; gps_subframe_fsm_S1(my_context ctx): my_base( ctx ) { //std::cout<<"Enter S1 "< { public: typedef mpl::list, sc::transition< Ev_gps_word_valid, gps_subframe_fsm_S3 > > reactions; gps_subframe_fsm_S2(my_context ctx): my_base( ctx ) { //std::cout<<"Enter S2 "<().gps_word_to_subframe(0); } }; struct gps_subframe_fsm_S3: public sc::state { public: typedef mpl::list, sc::transition< Ev_gps_word_valid, gps_subframe_fsm_S4 > > reactions; gps_subframe_fsm_S3(my_context ctx): my_base( ctx ) { //std::cout<<"Enter S3 "<().gps_word_to_subframe(1); } }; struct gps_subframe_fsm_S4: public sc::state { public: typedef mpl::list, sc::transition< Ev_gps_word_valid, gps_subframe_fsm_S5 > > reactions; gps_subframe_fsm_S4(my_context ctx): my_base( ctx ) { //std::cout<<"Enter S4 "<().gps_word_to_subframe(2); } }; struct gps_subframe_fsm_S5: public sc::state { public: typedef mpl::list, sc::transition< Ev_gps_word_valid, gps_subframe_fsm_S6 > > reactions; gps_subframe_fsm_S5(my_context ctx): my_base( ctx ) { //std::cout<<"Enter S5 "<().gps_word_to_subframe(3); } }; struct gps_subframe_fsm_S6: public sc::state { public: typedef mpl::list, sc::transition< Ev_gps_word_valid, gps_subframe_fsm_S7 > > reactions; gps_subframe_fsm_S6(my_context ctx): my_base( ctx ) { //std::cout<<"Enter S6 "<().gps_word_to_subframe(4); } }; struct gps_subframe_fsm_S7: public sc::state { public: typedef mpl::list, sc::transition< Ev_gps_word_valid, gps_subframe_fsm_S8 > > reactions; gps_subframe_fsm_S7(my_context ctx): my_base( ctx ) { //std::cout<<"Enter S7 "<().gps_word_to_subframe(5); } }; struct gps_subframe_fsm_S8: public sc::state { public: typedef mpl::list, sc::transition< Ev_gps_word_valid, gps_subframe_fsm_S9 > > reactions; gps_subframe_fsm_S8(my_context ctx): my_base( ctx ) { //std::cout<<"Enter S8 "<().gps_word_to_subframe(6); } }; struct gps_subframe_fsm_S9: public sc::state { public: typedef mpl::list, sc::transition< Ev_gps_word_valid, gps_subframe_fsm_S10 > > reactions; gps_subframe_fsm_S9(my_context ctx): my_base( ctx ) { //std::cout<<"Enter S9 "<().gps_word_to_subframe(7); } }; struct gps_subframe_fsm_S10: public sc::state { public: typedef mpl::list, sc::transition< Ev_gps_word_valid, gps_subframe_fsm_S11 > > reactions; gps_subframe_fsm_S10(my_context ctx): my_base( ctx ) { //std::cout<<"Enter S10 "<().gps_word_to_subframe(8); } }; struct gps_subframe_fsm_S11: public sc::state { public: typedef sc::transition< Ev_gps_word_preamble, gps_subframe_fsm_S1 > reactions; gps_subframe_fsm_S11(my_context ctx): my_base( ctx ) { //std::cout<<"Completed GPS Subframe!"<().gps_word_to_subframe(9); context< GpsL1CaSubframeFsm >().gps_subframe_to_nav_msg(); //decode the subframe // DECODE SUBFRAME //std::cout<<"Enter S11"<d_subframe); //decode the subframe std::cout << "NAV Message: received subframe " << d_subframe_ID << " from satellite " << Gnss_Satellite(std::string("GPS"), i_satellite_PRN) << std::endl; d_nav.i_satellite_PRN = i_satellite_PRN; d_nav.i_channel_ID = i_channel_ID; d_nav.d_subframe_timestamp_ms = this->d_preamble_time_ms; d_flag_new_subframe=true; } void GpsL1CaSubframeFsm::Event_gps_word_valid() { this->process_event(Ev_gps_word_valid()); } void GpsL1CaSubframeFsm::Event_gps_word_invalid() { this->process_event(Ev_gps_word_invalid()); } void GpsL1CaSubframeFsm::Event_gps_word_preamble() { this->process_event(Ev_gps_word_preamble()); } gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/libs/gps_l1_ca_subframe_fsm.h000066400000000000000000000067041305042567700274220ustar00rootroot00000000000000/*! * \file gps_l1_ca_subframe_fsm.h * \brief Interface of a GPS NAV message word-to-subframe decoder state machine * \author Javier Arribas, 2011. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L1_CA_SUBFRAME_FSM_H_ #define GNSS_SDR_GPS_L1_CA_SUBFRAME_FSM_H_ #include #include "concurrent_queue.h" #include "GPS_L1_CA.h" #include "gps_navigation_message.h" #include "gps_ephemeris.h" #include "gps_iono.h" #include "gps_almanac.h" #include "gps_utc_model.h" namespace sc = boost::statechart; namespace mpl = boost::mpl; struct gps_subframe_fsm_S0; struct gps_subframe_fsm_S1; struct gps_subframe_fsm_S2; struct gps_subframe_fsm_S3; struct gps_subframe_fsm_S4; struct gps_subframe_fsm_S5; struct gps_subframe_fsm_S6; struct gps_subframe_fsm_S7; struct gps_subframe_fsm_S8; struct gps_subframe_fsm_S9; struct gps_subframe_fsm_S10; struct gps_subframe_fsm_S11; /*! * \brief This class implements a Finite State Machine that handles the decoding * of the GPS L1 C/A NAV message */ class GpsL1CaSubframeFsm : public sc::state_machine< GpsL1CaSubframeFsm, gps_subframe_fsm_S0 > { public: GpsL1CaSubframeFsm(); //!< The constructor starts the Finite State Machine void clear_flag_new_subframe(); // channel and satellite info int i_channel_ID; //!< Channel id unsigned int i_satellite_PRN; //!< Satellite PRN number Gps_Navigation_Message d_nav; //!< GPS L1 C/A navigation message object // GPS SV and System parameters Gps_Ephemeris ephemeris; //!< Object that handles GPS ephemeris parameters Gps_Almanac almanac; //!< Object that handles GPS almanac data Gps_Utc_Model utc_model; //!< Object that handles UTM model parameters Gps_Iono iono; //!< Object that handles ionospheric parameters char d_subframe[GPS_SUBFRAME_LENGTH]; int d_subframe_ID; bool d_flag_new_subframe; char d_GPS_frame_4bytes[GPS_WORD_LENGTH]; double d_preamble_time_ms; void gps_word_to_subframe(int position); //!< inserts the word in the correct position of the subframe /*! * \brief This function decodes a NAv message subframe and pushes the information to the right queues */ void gps_subframe_to_nav_msg(); //FSM EVENTS void Event_gps_word_valid(); //!< FSM event: the received word is valid void Event_gps_word_invalid(); //!< FSM event: the received word is not valid void Event_gps_word_preamble(); //!< FSM event: word preamble detected }; #endif gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/libs/viterbi_decoder.cc000066400000000000000000000471231305042567700263300ustar00rootroot00000000000000/*! * \file viterbi_decoder.cc * \brief Implementation of a Viterbi decoder class based on the Iterative Solutions * Coded Modulation Library by Matthew C. Valenti * \author Daniel Fehr 2013. daniel.co(at)bluewin.ch * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "viterbi_decoder.h" #include #include // logging #define EVENT 2 // logs important events which don't occur every block #define FLOW 3 // logs the function calls of block processing functions #define BLOCK 4 // once per block #define SAMPLE 5 // about one log entry per sample #define LMORE 6 // many entries per sample / very specific stuff const float MAXLOG = 1e7; /* Define infinity */ Viterbi_Decoder::Viterbi_Decoder(const int g_encoder[], const int KK, const int nn) { d_nn = nn; // Coding rate 1/n d_KK = KK; // Constraint Length // derived code properties d_mm = d_KK - 1; d_states = 1 << d_mm; /* 2^mm */ d_number_symbols = 1 << d_nn; /* 2^nn */ /* create appropriate transition matrices (trellis) */ d_out0 = new int[d_states]; d_out1 = new int[d_states]; d_state0 = new int[d_states]; d_state1 = new int[d_states]; nsc_transit(d_out0, d_state0, 0, g_encoder, d_KK, d_nn); nsc_transit(d_out1, d_state1, 1, g_encoder, d_KK, d_nn); // initialise trellis state d_trellis_state_is_initialised = false; Viterbi_Decoder::init_trellis_state(); } Viterbi_Decoder::~Viterbi_Decoder() { // trellis definition delete[] d_out0; delete[] d_out1; delete[] d_state0; delete[] d_state1; // init trellis state delete[] d_pm_t; delete[] d_rec_array; delete[] d_metric_c; } void Viterbi_Decoder::reset() { init_trellis_state(); } /* Function decode_block() Description: Uses the Viterbi algorithm to perform hard-decision decoding of a convolutional code. Input parameters: r[] The received signal in LLR-form. For BPSK, must be in form r = 2*a*y/(sigma^2). LL The number of data bits to be decoded (doesn't include the mm zero-tail-bits) Output parameters: output_u_int[] Hard decisions on the data bits (without the mm zero-tail-bits) */ float Viterbi_Decoder::decode_block(const double input_c[], int output_u_int[], const int LL) { int state; int decoding_length_mismatch; VLOG(FLOW) << "decode_block(): LL=" << LL; // init init_trellis_state(); // do add compare select do_acs(input_c, LL + d_mm); // tail, no need to output -> traceback, but don't decode state = do_traceback(d_mm); // traceback and decode decoding_length_mismatch = do_tb_and_decode(d_mm, LL, state, output_u_int, d_indicator_metric); VLOG(FLOW) << "decoding length mismatch: " << decoding_length_mismatch; return d_indicator_metric; } float Viterbi_Decoder::decode_continuous(const double sym[], const int traceback_depth, int bits[], const int nbits_requested, int &nbits_decoded) { int state; int decoding_length_mismatch; VLOG(FLOW) << "decode_continuous(): nbits_requested=" << nbits_requested; // do add compare select do_acs(sym, nbits_requested); // the ML sequence in the newest part of the trellis can not be decoded // since it depends on the future values -> traceback, but don't decode state = do_traceback(traceback_depth); // traceback and decode decoding_length_mismatch = do_tb_and_decode(traceback_depth, nbits_requested, state, bits, d_indicator_metric); nbits_decoded = nbits_requested + decoding_length_mismatch; VLOG(FLOW) << "decoding length mismatch (continuous decoding): " << decoding_length_mismatch; return d_indicator_metric; } void Viterbi_Decoder::init_trellis_state() { int state; // if trellis state has been initialised, free old state memory if(d_trellis_state_is_initialised) { // init trellis state delete[] d_pm_t; delete[] d_rec_array; delete[] d_metric_c; } // reserve new trellis state memory d_pm_t = new float[d_states]; d_trellis_paths = std::deque(); d_rec_array = new float[d_nn]; d_metric_c = new float[d_number_symbols]; d_trellis_state_is_initialised = true; /* initialize trellis */ for (state = 0; state < d_states; state++) { d_pm_t[state] = -MAXLOG; //d_pm_t_next[state] = -MAXLOG; } d_pm_t[0] = 0; /* start in all-zeros state */ d_indicator_metric = 0; } int Viterbi_Decoder::do_acs(const double sym[], int nbits) { int t, i, state_at_t; float metric; float max_val; float * pm_t_next = new float[d_states]; /* t: * - state: state at t * - d_prev_section[state_at_t]: path metric at t for state state_at_t * - d_out0[state_at_t]: sent symbols for a data bit 0 if state is state_at_t at time t * */ for (state_at_t = 0; state_at_t < d_states; state_at_t++) { pm_t_next[state_at_t] = -MAXLOG; } /* go through trellis */ for (t = 0; t < nbits; t++) { /* Temporarily store the received symbols current decoding step */ for (i = 0; i < d_nn; i++) d_rec_array[i] = static_cast(sym[d_nn * t + i]); /* precompute all possible branch metrics */ for (i = 0; i < d_number_symbols; i++) { d_metric_c[i] = gamma(d_rec_array, i, d_nn); VLOG(LMORE) << "metric for (tx_sym=" << i << "|ry_sym=(" << d_rec_array[0] << ", " << d_rec_array[1] << ") = " << d_metric_c[i]; } // find the survivor branches leading the trellis states at t+1 Prev next_trellis_states(d_states, t+1); /* step through all states */ for (state_at_t = 0; state_at_t < d_states; state_at_t++) { int next_state_if_0 = d_state0[state_at_t]; int next_state_if_1 = d_state1[state_at_t]; /* hypothesis: info bit is a zero */ int bm_0 = d_metric_c[d_out0[state_at_t]]; metric = d_pm_t[state_at_t] + bm_0; // path metric + zerobranch metric /* store new metric if more than metric in storage */ if (metric > pm_t_next[next_state_if_0]) { pm_t_next[next_state_if_0] = metric; next_trellis_states.set_current_state_as_ancestor_of_next_state(next_state_if_0, state_at_t); next_trellis_states.set_decoded_bit_for_next_state(next_state_if_0, 0); next_trellis_states.set_survivor_branch_metric_of_next_state(next_state_if_0, bm_0); } /* hypothesis: info bit is a one */ int bm_1 = d_metric_c[d_out1[state_at_t]]; metric = d_pm_t[state_at_t] + bm_1; // path metric + onebranch metric /* store new metric if more than metric in storage */ if (metric > pm_t_next[next_state_if_1]) { pm_t_next[next_state_if_1] = metric; next_trellis_states.set_current_state_as_ancestor_of_next_state(next_state_if_1, state_at_t); next_trellis_states.set_decoded_bit_for_next_state(next_state_if_1, 1); next_trellis_states.set_survivor_branch_metric_of_next_state(next_state_if_1, bm_1); } } d_trellis_paths.push_front(next_trellis_states); /* normalize -> afterwards, the largest metric value is always 0 */ //max_val = 0; max_val = -MAXLOG; for (state_at_t = 0; state_at_t < d_states; state_at_t++) { if (pm_t_next[state_at_t] > max_val) { max_val = pm_t_next[state_at_t]; } } VLOG(LMORE) << "max_val at t=" << t << ": " << max_val; for (state_at_t = 0; state_at_t < d_states; state_at_t++) { d_pm_t[state_at_t] = pm_t_next[state_at_t] - max_val; pm_t_next[state_at_t] = -MAXLOG; } } delete[] pm_t_next; return t; } int Viterbi_Decoder::do_traceback(size_t traceback_length) { // traceback_length is in bits int state; std::deque::iterator it; VLOG(FLOW) << "do_traceback(): traceback_length=" << traceback_length << std::endl; if (d_trellis_paths.size() < traceback_length) { traceback_length = d_trellis_paths.size(); } state = 0; // maybe start not at state 0, but at state with best metric for (it = d_trellis_paths.begin(); it < d_trellis_paths.begin() + traceback_length; ++it) { state = it->get_anchestor_state_of_current_state(state); } return state; } int Viterbi_Decoder::do_tb_and_decode(int traceback_length, int requested_decoding_length, int state, int output_u_int[], float& indicator_metric) { int n_of_branches_for_indicator_metric = 500; int t_out; std::deque::iterator it; int decoding_length_mismatch; int overstep_length; int n_im = 0; VLOG(FLOW) << "do_tb_and_decode(): requested_decoding_length=" << requested_decoding_length; // decode only decode_length bits -> overstep newer bits which are too much decoding_length_mismatch = d_trellis_paths.size() - (traceback_length + requested_decoding_length); VLOG(BLOCK) << "decoding_length_mismatch=" << decoding_length_mismatch; overstep_length = decoding_length_mismatch >= 0 ? decoding_length_mismatch : 0; VLOG(BLOCK) << "overstep_length=" << overstep_length; for (it = d_trellis_paths.begin() + traceback_length; it < d_trellis_paths.begin() + traceback_length + overstep_length; ++it) { state = it->get_anchestor_state_of_current_state(state); } t_out = d_trellis_paths.end() - (d_trellis_paths.begin() + traceback_length + overstep_length) - 1;//requested_decoding_length-1; indicator_metric = 0; for (it = d_trellis_paths.begin() + traceback_length + overstep_length; it < d_trellis_paths.end(); ++it) { if(it - (d_trellis_paths.begin() + traceback_length + overstep_length) < n_of_branches_for_indicator_metric) { n_im++; indicator_metric += it->get_metric_of_current_state(state); VLOG(SAMPLE) << "@t=" << it->get_t() << " b=" << it->get_bit_of_current_state(state) << " sm=" << indicator_metric << " d=" << it->get_metric_of_current_state(state); } output_u_int[t_out] = it->get_bit_of_current_state(state); state = it->get_anchestor_state_of_current_state(state); t_out--; } if(n_im > 0) { indicator_metric /= n_im; } VLOG(BLOCK) << "indicator metric: " << indicator_metric; // remove old states if (d_trellis_paths.begin() + traceback_length + overstep_length <= d_trellis_paths.end()) { d_trellis_paths.erase(d_trellis_paths.begin() + traceback_length+overstep_length, d_trellis_paths.end()); } return decoding_length_mismatch; } /* function Gamma() Description: Computes the branch metric used for decoding. Output parameters: (returned float) The metric between the hypothetical symbol and the recevieved vector Input parameters: rec_array The received vector, of length nn symbol The hypothetical symbol nn The length of the received vector This function is used by siso() */ float Viterbi_Decoder::gamma(float rec_array[], int symbol, int nn) { float rm = 0; int i; int mask; float txsym; mask = 1; for (i = 0; i < nn; i++) { //if (symbol & mask) rm += rec_array[nn - i - 1]; txsym = symbol & mask ? 1 : -1; rm += txsym * rec_array[nn - i - 1]; mask = mask << 1; } //rm = rm > 50 ? rm : -1000; return (rm); } /* function that creates the transit and output vectors */ void Viterbi_Decoder::nsc_transit(int output_p[], int trans_p[], int input, const int g[], int KK, int nn) { int nextstate[1]; int state, states; states = (1 << (KK - 1)); /* The number of states: 2^mm */ /* Determine the output and next state for each possible starting state */ for (state = 0; state < states; state++) { output_p[state] = nsc_enc_bit(nextstate, input, state, g, KK, nn); trans_p[state] = nextstate[0]; } return; } /* Function nsc_enc_bit() Description: Convolutionally encodes a single bit using a rate 1/n encoder. Takes in one input bit at a time, and produces a n-bit output. Input parameters: input The input data bit (i.e. a 0 or 1). state_in The starting state of the encoder (an int from 0 to 2^m-1). g[] An n-element vector containing the code generators in binary form. KK The constraint length of the convolutional code. nn number of symbols bits per input bits (rate 1/nn) Output parameters: output_p[] An n-element vector containing the encoded bits. state_out_p[] An integer containing the final state of the encoder (i.e. the state after encoding this bit) This function is used by rsc_encode(), nsc_transit(), rsc_transit(), and nsc_transit() */ int Viterbi_Decoder::nsc_enc_bit(int state_out_p[], int input, int state_in, const int g[], int KK, int nn) { /* declare variables */ int state, i; int out = 0; /* create a word made up of state and new input */ state = (input << (KK - 1)) ^ state_in; /* AND the word with the generators */ for (i = 0; i < nn; i++) { /* update output symbol */ out = (out << 1) + parity_counter(state & g[i], KK); } /* shift the state to make the new state */ state_out_p[0] = state >> 1; return (out); } /* function parity_counter() Description: Determines if a symbol has odd (1) or even (0) parity Output parameters: (returned int): The symbol's parity = 1 for odd and 0 for even Input parameters: symbol: The integer-valued symbol length: The highest bit position in the symbol This function is used by nsc_enc_bit(), rsc_enc_bit(), and rsc_tail() */ int Viterbi_Decoder::parity_counter(int symbol, int length) { int counter; int temp_parity = 0; for (counter = 0; counter < length; counter++) { temp_parity = temp_parity ^ (symbol & 1); symbol = symbol >> 1; } return (temp_parity); } // prev helper class Viterbi_Decoder::Prev::Prev(int states, int t) { this->t = t; num_states = states; state = new int[states]; bit = new int[states]; metric = new float[states]; refcount = new int; *refcount = 1; memset(state, 0, sizeof(int) * num_states); memset(bit, 0, sizeof(int) * num_states); memset(metric, 0, sizeof(float) * num_states); } // copy constructor Viterbi_Decoder::Prev::Prev(const Prev& prev) { refcount = prev.refcount; (*refcount)++; t = prev.t; state = prev.state; num_states = prev.num_states; bit = prev.bit; metric = prev.metric; VLOG(LMORE) << "Prev(" << "?" << ", " << t << ")" << " copy, new refcount = " << *refcount; } // assignment constructor Viterbi_Decoder::Prev& Viterbi_Decoder::Prev::operator=(const Prev& other) { // check for self-assignment if(&other == this) { return *this; } // handle old resources if(*refcount == 1) { // if they are not used anymore -> unallocate them delete[] state; delete[] bit; delete[] metric; delete refcount; } else { // this object is not anymore using them (*refcount)--; } // increase ref counter for this resource set refcount = other.refcount; (*refcount)++; // take over resources t = other.t; state = other.state; bit = other.bit; metric = other.metric; VLOG(LMORE) << "Prev(" << "?" << ", " << t << ")" << " assignment, new refcount = " << *refcount; return *this; } Viterbi_Decoder::Prev::~Prev() { if (*refcount == 1) { delete[] state; delete[] bit; delete[] metric; delete refcount; //std::cout << "~Prev(" << "?" << ", " << t << ")" << " destructor with delete" << std::endl; } else { (*refcount)--; VLOG(LMORE) << "~Prev(" << "?" << ", " << t << ")" << " destructor after copy, new refcount = " << *refcount; } } int Viterbi_Decoder::Prev::get_anchestor_state_of_current_state(int current_state) { //std::cout << "get prev state: for state " << current_state << " at time " << t << ", the prev state at time " << t-1 << " is " << state[current_state] << std::endl; if (num_states > current_state) { return state[current_state]; } else { //std::cout<<"alarm "<<"num_states="< current_state) { return bit[current_state]; } else { return 0; } } float Viterbi_Decoder::Prev::get_metric_of_current_state(int current_state) { if (num_states > current_state) { return metric[current_state]; } else { return 0; } } int Viterbi_Decoder::Prev::get_t() { return t; } void Viterbi_Decoder::Prev::set_current_state_as_ancestor_of_next_state(int next_state, int current_state) { if (num_states > next_state) { state[next_state] = current_state; } } void Viterbi_Decoder::Prev::set_decoded_bit_for_next_state(int next_state, int bit) { if (num_states > next_state) { this->bit[next_state] = bit; } } void Viterbi_Decoder::Prev::set_survivor_branch_metric_of_next_state(int next_state, float metric) { if (num_states > next_state) { this->metric[next_state] = metric; } } gnss-sdr-0.0.9/src/algorithms/telemetry_decoder/libs/viterbi_decoder.h000066400000000000000000000102261305042567700261640ustar00rootroot00000000000000/*! * \file viterbi_decoder.h * \brief Interface of a Viterbi decoder class based on the Iterative Solutions * Coded Modulation Library by Matthew C. Valenti * \author Daniel Fehr 2013. daniel.co(at)bluewin.ch * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_VITERBI_DECODER_H_ #define GNSS_SDR_VITERBI_DECODER_H_ #include #include /*! * \brief Class that implements a Viterbi decoder */ class Viterbi_Decoder { public: Viterbi_Decoder(const int g_encoder[], const int KK, const int nn); ~Viterbi_Decoder(); void reset(); /*! * \brief Uses the Viterbi algorithm to perform hard-decision decoding of a convolutional code. * * \param[in] input_c[] The received signal in LLR-form. For BPSK, must be in form r = 2*a*y/(sigma^2). * \param[in] LL The number of data bits to be decoded (does not include the mm zero-tail-bits) * * \return output_u_int[] Hard decisions on the data bits (without the mm zero-tail-bits) */ float decode_block(const double input_c[], int* output_u_int, const int LL); float decode_continuous(const double sym[], const int traceback_depth, int output_u_int[], const int nbits_requested, int &nbits_decoded); private: class Prev { public: int num_states; Prev(int states, int t); Prev(const Prev& prev); Prev& operator=(const Prev& other); ~Prev(); int get_anchestor_state_of_current_state(int current_state); int get_bit_of_current_state(int current_state); float get_metric_of_current_state(int current_state); int get_t(); void set_current_state_as_ancestor_of_next_state(int next_state, int current_state); void set_decoded_bit_for_next_state(int next_state, int bit); void set_survivor_branch_metric_of_next_state(int next_state, float metric); private: int t; int * state; int * bit; float * metric; int * refcount; }; // code properties int d_KK; int d_nn; // derived code properties int d_mm; int d_states; int d_number_symbols; // trellis definition int* d_out0; int* d_state0; int* d_out1; int* d_state1; // trellis state float *d_pm_t; std::deque d_trellis_paths; float *d_metric_c; /* Set of all possible branch metrics */ float *d_rec_array; /* Received values for one trellis section */ bool d_trellis_state_is_initialised; // measures float d_indicator_metric; // operations on the trellis (change decoder state) void init_trellis_state(); int do_acs(const double sym[], int nbits); int do_traceback(size_t traceback_length); int do_tb_and_decode(int traceback_length, int requested_decoding_length, int state, int bits[], float& indicator_metric); // branch metric function float gamma(float rec_array[], int symbol, int nn); // trellis generation void nsc_transit(int output_p[], int trans_p[], int input, const int g[], int KK, int nn); int nsc_enc_bit(int state_out_p[], int input, int state_in, const int g[], int KK, int nn); int parity_counter(int symbol, int length); }; #endif /* GNSS_SDR_VITERBI_DECODER_H_ */ gnss-sdr-0.0.9/src/algorithms/tracking/000077500000000000000000000000001305042567700200335ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/tracking/CMakeLists.txt000066400000000000000000000014611305042567700225750ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # add_subdirectory(adapters) add_subdirectory(gnuradio_blocks) add_subdirectory(libs)gnss-sdr-0.0.9/src/algorithms/tracking/adapters/000077500000000000000000000000001305042567700216365ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/tracking/adapters/CMakeLists.txt000066400000000000000000000040611305042567700243770ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # if(ENABLE_CUDA) set(OPT_TRACKING_ADAPTERS ${OPT_TRACKING_ADAPTERS} gps_l1_ca_dll_pll_tracking_gpu.cc) set(OPT_TRACKING_INCLUDE_DIRS ${OPT_TRACKING_INCLUDE_DIRS} ${CUDA_INCLUDE_DIRS}) endif(ENABLE_CUDA) set(TRACKING_ADAPTER_SOURCES galileo_e1_dll_pll_veml_tracking.cc galileo_e1_tcp_connector_tracking.cc gps_l1_ca_dll_pll_tracking.cc gps_l1_ca_dll_pll_c_aid_tracking.cc gps_l1_ca_tcp_connector_tracking.cc galileo_e5a_dll_pll_tracking.cc gps_l2_m_dll_pll_tracking.cc ${OPT_TRACKING_ADAPTERS} ) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/interfaces ${CMAKE_SOURCE_DIR}/src/core/receiver ${CMAKE_SOURCE_DIR}/src/algorithms/tracking/gnuradio_blocks ${CMAKE_SOURCE_DIR}/src/algorithms/tracking/libs ${CMAKE_SOURCE_DIR}/src/algorithms/libs ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ${VOLK_GNSSSDR_INCLUDE_DIRS} ${OPT_TRACKING_INCLUDE_DIRS} ) file(GLOB TRACKING_ADAPTER_HEADERS "*.h") list(SORT TRACKING_ADAPTER_HEADERS) add_library(tracking_adapters ${TRACKING_ADAPTER_SOURCES} ${TRACKING_ADAPTER_HEADERS}) source_group(Headers FILES ${TRACKING_ADAPTER_HEADERS}) target_link_libraries(tracking_adapters tracking_gr_blocks gnss_sp_libs) gnss-sdr-0.0.9/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking.cc000077500000000000000000000116141305042567700305630ustar00rootroot00000000000000/*! * \file galileo_e1_dll_pll_veml_tracking.cc * \brief Adapts a DLL+PLL VEML (Very Early Minus Late) tracking loop block * to a TrackingInterface for Galileo E1 signals * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach, Birkhauser, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_e1_dll_pll_veml_tracking.h" #include #include "Galileo_E1.h" #include "configuration_interface.h" using google::LogMessage; GalileoE1DllPllVemlTracking::GalileoE1DllPllVemlTracking( ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { DLOG(INFO) << "role " << role; //################# CONFIGURATION PARAMETERS ######################## int fs_in; int vector_length; int f_if; bool dump; std::string dump_filename; std::string item_type; std::string default_item_type = "gr_complex"; float pll_bw_hz; float dll_bw_hz; float early_late_space_chips; float very_early_late_space_chips; item_type = configuration->property(role + ".item_type", default_item_type); fs_in = configuration->property("GNSS-SDR.internal_fs_hz", 2048000); f_if = configuration->property(role + ".if", 0); dump = configuration->property(role + ".dump", false); pll_bw_hz = configuration->property(role + ".pll_bw_hz", 50.0); dll_bw_hz = configuration->property(role + ".dll_bw_hz", 2.0); early_late_space_chips = configuration->property(role + ".early_late_space_chips", 0.15); very_early_late_space_chips = configuration->property(role + ".very_early_late_space_chips", 0.6); std::string default_dump_filename = "./track_ch"; dump_filename = configuration->property(role + ".dump_filename", default_dump_filename); //unused! vector_length = std::round(fs_in / (Galileo_E1_CODE_CHIP_RATE_HZ / Galileo_E1_B_CODE_LENGTH_CHIPS)); //################# MAKE TRACKING GNURadio object ################### if (item_type.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); tracking_ = galileo_e1_dll_pll_veml_make_tracking_cc( f_if, fs_in, vector_length, dump, dump_filename, pll_bw_hz, dll_bw_hz, early_late_space_chips, very_early_late_space_chips); } else { item_size_ = sizeof(gr_complex); LOG(WARNING) << item_type << " unknown tracking item type."; } channel_ = 0; DLOG(INFO) << "tracking(" << tracking_->unique_id() << ")"; } GalileoE1DllPllVemlTracking::~GalileoE1DllPllVemlTracking() {} void GalileoE1DllPllVemlTracking::start_tracking() { tracking_->start_tracking(); } /* * Set tracking channel unique ID */ void GalileoE1DllPllVemlTracking::set_channel(unsigned int channel) { channel_ = channel; tracking_->set_channel(channel); } void GalileoE1DllPllVemlTracking::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { tracking_->set_gnss_synchro(p_gnss_synchro); } void GalileoE1DllPllVemlTracking::connect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; //nothing to connect, now the tracking uses gr_sync_decimator } void GalileoE1DllPllVemlTracking::disconnect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; //nothing to disconnect, now the tracking uses gr_sync_decimator } gr::basic_block_sptr GalileoE1DllPllVemlTracking::get_left_block() { return tracking_; } gr::basic_block_sptr GalileoE1DllPllVemlTracking::get_right_block() { return tracking_; } gnss-sdr-0.0.9/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking.h000077500000000000000000000062621305042567700304300ustar00rootroot00000000000000/*! * \file galileo_e1_dll_pll_veml_tracking.h * \brief Adapts a DLL+PLL VEML (Very Early Minus Late) tracking loop block * to a TrackingInterface for Galileo E1 signals * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach, Birkha user, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_E1_DLL_PLL_VEML_TRACKING_H_ #define GNSS_SDR_GALILEO_E1_DLL_PLL_VEML_TRACKING_H_ #include #include "tracking_interface.h" #include "galileo_e1_dll_pll_veml_tracking_cc.h" class ConfigurationInterface; /*! * \brief This class Adapts a DLL+PLL VEML (Very Early Minus Late) tracking * loop block to a TrackingInterface for Galileo E1 signals */ class GalileoE1DllPllVemlTracking : public TrackingInterface { public: GalileoE1DllPllVemlTracking(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GalileoE1DllPllVemlTracking(); std::string role() { return role_; } //! Returns "Galileo_E1_DLL_PLL_VEML_Tracking" std::string implementation() { return "Galileo_E1_DLL_PLL_VEML_Tracking"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); /*! * \brief Set tracking channel unique ID */ void set_channel(unsigned int channel); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to efficiently exchange synchronization data between acquisition and * tracking blocks */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); void start_tracking(); private: galileo_e1_dll_pll_veml_tracking_cc_sptr tracking_; size_t item_size_; unsigned int channel_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; }; #endif // GNSS_SDR_GALILEO_E1_DLL_PLL_VEML_TRACKING_H_ gnss-sdr-0.0.9/src/algorithms/tracking/adapters/galileo_e1_tcp_connector_tracking.cc000066400000000000000000000121211305042567700307450ustar00rootroot00000000000000/*! * \file gps_l1_ca_tcp_connector_tracking.cc * \brief Implementation of an adapter of a TCP connector block based on code DLL + carrier PLL * \author David Pubill, 2012. dpubill(at)cttc.es * Luis Esteve, 2012. luis(at)epsilon-formacion.com * Javier Arribas, 2011. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach, Birkhauser, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_e1_tcp_connector_tracking.h" #include #include "Galileo_E1.h" #include "configuration_interface.h" using google::LogMessage; GalileoE1TcpConnectorTracking::GalileoE1TcpConnectorTracking( ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { DLOG(INFO) << "role " << role; //################# CONFIGURATION PARAMETERS ######################## int fs_in; int vector_length; int f_if; bool dump; std::string dump_filename; std::string item_type; std::string default_item_type = "gr_complex"; float pll_bw_hz; float dll_bw_hz; float early_late_space_chips; float very_early_late_space_chips; size_t port_ch0; item_type = configuration->property(role + ".item_type",default_item_type); fs_in = configuration->property("GNSS-SDR.internal_fs_hz", 2048000); f_if = configuration->property(role + ".if", 0); dump = configuration->property(role + ".dump", false); pll_bw_hz = configuration->property(role + ".pll_bw_hz", 50.0); dll_bw_hz = configuration->property(role + ".dll_bw_hz", 2.0); early_late_space_chips = configuration->property(role + ".early_late_space_chips", 0.15); very_early_late_space_chips = configuration->property(role + ".very_early_late_space_chips", 0.6); port_ch0 = configuration->property(role + ".port_ch0", 2060); std::string default_dump_filename = "./track_ch"; dump_filename = configuration->property(role + ".dump_filename", default_dump_filename); //unused! vector_length = std::round(fs_in / (Galileo_E1_CODE_CHIP_RATE_HZ / Galileo_E1_B_CODE_LENGTH_CHIPS)); //################# MAKE TRACKING GNURadio object ################### if (item_type.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); tracking_ = galileo_e1_tcp_connector_make_tracking_cc( f_if, fs_in, vector_length, dump, dump_filename, pll_bw_hz, dll_bw_hz, early_late_space_chips, very_early_late_space_chips, port_ch0); } else { item_size_ = sizeof(gr_complex); LOG(WARNING) << item_type << " unknown tracking item type."; } channel_ = 0; DLOG(INFO) << "tracking(" << tracking_->unique_id() << ")"; } GalileoE1TcpConnectorTracking::~GalileoE1TcpConnectorTracking() {} void GalileoE1TcpConnectorTracking::start_tracking() { tracking_->start_tracking(); } /* * Set tracking channel unique ID */ void GalileoE1TcpConnectorTracking::set_channel(unsigned int channel) { channel_ = channel; tracking_->set_channel(channel); } void GalileoE1TcpConnectorTracking::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { tracking_->set_gnss_synchro(p_gnss_synchro); } void GalileoE1TcpConnectorTracking::connect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; //nothing to connect, now the tracking uses gr_sync_decimator } void GalileoE1TcpConnectorTracking::disconnect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; //nothing to disconnect, now the tracking uses gr_sync_decimator } gr::basic_block_sptr GalileoE1TcpConnectorTracking::get_left_block() { return tracking_; } gr::basic_block_sptr GalileoE1TcpConnectorTracking::get_right_block() { return tracking_; } gnss-sdr-0.0.9/src/algorithms/tracking/adapters/galileo_e1_tcp_connector_tracking.h000066400000000000000000000063511305042567700306170ustar00rootroot00000000000000/*! * \file galileo_e1_tcp_connector_tracking.h * \brief Interface of an adapter of a TCP connector block based on code DLL + carrier PLL * for Galileo E1 to a TrackingInterface * \author David Pubill, 2012. dpubill(at)cttc.es * Luis Esteve, 2012. luis(at)epsilon-formacion.com * Javier Arribas, 2011. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach, Birkhauser, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2012-2015 (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_GALILEO_E1_TCP_CONNECTOR_TRACKING_H_ #define GNSS_SDR_GALILEO_E1_TCP_CONNECTOR_TRACKING_H_ #include #include "tracking_interface.h" #include "galileo_e1_tcp_connector_tracking_cc.h" class ConfigurationInterface; /*! * \brief This class implements a code DLL + carrier PLL tracking loop */ class GalileoE1TcpConnectorTracking : public TrackingInterface { public: GalileoE1TcpConnectorTracking(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GalileoE1TcpConnectorTracking(); std::string role() { return role_; } //! Returns "Galileo_E1_TCP_CONNECTOR_Tracking" std::string implementation() { return "Galileo_E1_TCP_CONNECTOR_Tracking"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); /*! * \brief Set tracking channel unique ID */ void set_channel(unsigned int channel); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to efficiently exchange synchronization data between acquisition and * tracking blocks */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); void start_tracking(); private: galileo_e1_tcp_connector_tracking_cc_sptr tracking_; size_t item_size_; unsigned int channel_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; }; #endif // GNSS_SDR_GALILEO_E1_TCP_CONNECTOR_TRACKING_H_ gnss-sdr-0.0.9/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking.cc000066400000000000000000000122321305042567700276770ustar00rootroot00000000000000/*! * \file galileo_e5a_dll_pll_tracking.cc * \brief Adapts a code DLL + carrier PLL * tracking block to a TrackingInterface for Galileo E5a signals * \brief Adapts a PCPS acquisition block to an AcquisitionInterface for * Galileo E5a data and pilot Signals * \author Marc Sales, 2014. marcsales92(at)gmail.com * \based on work from: *
      *
    • Javier Arribas, 2011. jarribas(at)cttc.es *
    • Luis Esteve, 2012. luis(at)epsilon-formacion.com *
    * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_e5a_dll_pll_tracking.h" #include #include "Galileo_E5a.h" #include "configuration_interface.h" using google::LogMessage; GalileoE5aDllPllTracking::GalileoE5aDllPllTracking( ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { DLOG(INFO) << "role " << role; //################# CONFIGURATION PARAMETERS ######################## int fs_in; int vector_length; int f_if; bool dump; std::string dump_filename; std::string item_type; std::string default_item_type = "gr_complex"; float pll_bw_hz; float dll_bw_hz; float pll_bw_init_hz; float dll_bw_init_hz; int ti_ms; float early_late_space_chips; item_type = configuration->property(role + ".item_type", default_item_type); //vector_length = configuration->property(role + ".vector_length", 2048); fs_in = configuration->property("GNSS-SDR.internal_fs_hz", 12000000); f_if = configuration->property(role + ".if", 0); dump = configuration->property(role + ".dump", false); pll_bw_hz = configuration->property(role + ".pll_bw_hz", 5.0); dll_bw_hz = configuration->property(role + ".dll_bw_hz", 2.0); pll_bw_init_hz = configuration->property(role + ".pll_bw_init_hz", 20.0); dll_bw_init_hz = configuration->property(role + ".dll_bw_init_hz", 20.0); ti_ms = configuration->property(role + ".ti_ms", 3); early_late_space_chips = configuration->property(role + ".early_late_space_chips", 0.5); std::string default_dump_filename = "./track_ch"; dump_filename = configuration->property(role + ".dump_filename", default_dump_filename); //unused! vector_length = std::round(fs_in / (Galileo_E5a_CODE_CHIP_RATE_HZ / Galileo_E5a_CODE_LENGTH_CHIPS)); //################# MAKE TRACKING GNURadio object ################### if (item_type.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); tracking_ = galileo_e5a_dll_pll_make_tracking_cc( f_if, fs_in, vector_length, dump, dump_filename, pll_bw_hz, dll_bw_hz, pll_bw_init_hz, dll_bw_init_hz, ti_ms, early_late_space_chips); } else { item_size_ = sizeof(gr_complex); LOG(WARNING) << item_type << " unknown tracking item type."; } channel_ = 0; DLOG(INFO) << "tracking(" << tracking_->unique_id() << ")"; } GalileoE5aDllPllTracking::~GalileoE5aDllPllTracking() {} void GalileoE5aDllPllTracking::start_tracking() { tracking_->start_tracking(); } /* * Set tracking channel unique ID */ void GalileoE5aDllPllTracking::set_channel(unsigned int channel) { channel_ = channel; tracking_->set_channel(channel); } void GalileoE5aDllPllTracking::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { tracking_->set_gnss_synchro(p_gnss_synchro); } void GalileoE5aDllPllTracking::connect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; //nothing to connect, now the tracking uses gr_sync_decimator } void GalileoE5aDllPllTracking::disconnect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; //nothing to disconnect, now the tracking uses gr_sync_decimator } gr::basic_block_sptr GalileoE5aDllPllTracking::get_left_block() { return tracking_; } gr::basic_block_sptr GalileoE5aDllPllTracking::get_right_block() { return tracking_; } gnss-sdr-0.0.9/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking.h000066400000000000000000000061511305042567700275440ustar00rootroot00000000000000/*! * \file galileo_e5a_dll_pll_tracking.h * \brief Adapts a code DLL + carrier PLL * tracking block to a TrackingInterface for Galileo E5a signals * \brief Adapts a PCPS acquisition block to an AcquisitionInterface for * Galileo E5a data and pilot Signals * \author Marc Sales, 2014. marcsales92(at)gmail.com * \based on work from: *
      *
    • Javier Arribas, 2011. jarribas(at)cttc.es *
    • Luis Esteve, 2012. luis(at)epsilon-formacion.com *
    * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_E5A_DLL_PLL_TRACKING_H_ #define GNSS_SDR_GALILEO_E5A_DLL_PLL_TRACKING_H_ #include #include "tracking_interface.h" #include "galileo_e5a_dll_pll_tracking_cc.h" class ConfigurationInterface; /*! * \brief This class implements a code DLL + carrier PLL tracking loop */ class GalileoE5aDllPllTracking : public TrackingInterface { public: GalileoE5aDllPllTracking(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GalileoE5aDllPllTracking(); std::string role() { return role_; } //! Returns "Galileo_E5a_DLL_PLL_Tracking" std::string implementation() { return "Galileo_E5a_DLL_PLL_Tracking"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); /*! * \brief Set tracking channel unique ID */ void set_channel(unsigned int channel); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to efficiently exchange synchronization data between acquisition and tracking blocks */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); void start_tracking(); private: galileo_e5a_dll_pll_tracking_cc_sptr tracking_; size_t item_size_; unsigned int channel_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; }; #endif /* GNSS_SDR_GALILEO_E5A_DLL_PLL_TRACKING_H_ */ gnss-sdr-0.0.9/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_c_aid_tracking.cc000066400000000000000000000164771305042567700305170ustar00rootroot00000000000000/*! * \file gps_l1_ca_dll_pll_c_aid_tracking.cc * \brief Implementation of an adapter of a DLL+PLL tracking loop block * for GPS L1 C/A to a TrackingInterface * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Javier Arribas, 2011. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach, Birkhauser, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l1_ca_dll_pll_c_aid_tracking.h" #include #include "GPS_L1_CA.h" #include "configuration_interface.h" using google::LogMessage; GpsL1CaDllPllCAidTracking::GpsL1CaDllPllCAidTracking( ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { DLOG(INFO) << "role " << role; //################# CONFIGURATION PARAMETERS ######################## int fs_in; int vector_length; int f_if; bool dump; std::string dump_filename; std::string default_item_type = "gr_complex"; float pll_bw_hz; float pll_bw_narrow_hz; float dll_bw_hz; float dll_bw_narrow_hz; float early_late_space_chips; item_type_ = configuration->property(role + ".item_type", default_item_type); //vector_length = configuration->property(role + ".vector_length", 2048); fs_in = configuration->property("GNSS-SDR.internal_fs_hz", 2048000); f_if = configuration->property(role + ".if", 0); dump = configuration->property(role + ".dump", false); pll_bw_hz = configuration->property(role + ".pll_bw_hz", 50.0); dll_bw_hz = configuration->property(role + ".dll_bw_hz", 2.0); pll_bw_narrow_hz = configuration->property(role + ".pll_bw_narrow_hz", 20.0); dll_bw_narrow_hz = configuration->property(role + ".dll_bw_narrow_hz", 2.0); int extend_correlation_ms; extend_correlation_ms = configuration->property(role + ".extend_correlation_ms", 1); early_late_space_chips = configuration->property(role + ".early_late_space_chips", 0.5); std::string default_dump_filename = "./track_ch"; dump_filename = configuration->property(role + ".dump_filename", default_dump_filename); //unused! vector_length = std::round(fs_in / (GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS)); //################# MAKE TRACKING GNURadio object ################### if (item_type_.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); tracking_cc = gps_l1_ca_dll_pll_c_aid_make_tracking_cc( f_if, fs_in, vector_length, dump, dump_filename, pll_bw_hz, dll_bw_hz, pll_bw_narrow_hz, dll_bw_narrow_hz, extend_correlation_ms, early_late_space_chips); DLOG(INFO) << "tracking(" << tracking_cc->unique_id() << ")"; } else if(item_type_.compare("cshort") == 0) { item_size_ = sizeof(lv_16sc_t); tracking_sc = gps_l1_ca_dll_pll_c_aid_make_tracking_sc( f_if, fs_in, vector_length, dump, dump_filename, pll_bw_hz, dll_bw_hz, pll_bw_narrow_hz, dll_bw_narrow_hz, extend_correlation_ms, early_late_space_chips); DLOG(INFO) << "tracking(" << tracking_sc->unique_id() << ")"; } else { item_size_ = sizeof(gr_complex); LOG(WARNING) << item_type_ << " unknown tracking item type."; } channel_ = 0; } GpsL1CaDllPllCAidTracking::~GpsL1CaDllPllCAidTracking() {} void GpsL1CaDllPllCAidTracking::start_tracking() { if (item_type_.compare("gr_complex") == 0) { tracking_cc->start_tracking(); } else if (item_type_.compare("cshort") == 0) { tracking_sc->start_tracking(); } else { LOG(WARNING) << item_type_ << " unknown tracking item type"; } } /* * Set tracking channel unique ID */ void GpsL1CaDllPllCAidTracking::set_channel(unsigned int channel) { channel_ = channel; if (item_type_.compare("gr_complex") == 0) { tracking_cc->set_channel(channel); } else if (item_type_.compare("cshort") == 0) { tracking_sc->set_channel(channel); } else { LOG(WARNING) << item_type_ << " unknown tracking item type"; } } void GpsL1CaDllPllCAidTracking::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { if (item_type_.compare("gr_complex") == 0) { tracking_cc->set_gnss_synchro(p_gnss_synchro); } else if (item_type_.compare("cshort") == 0) { tracking_sc->set_gnss_synchro(p_gnss_synchro); } else { LOG(WARNING) << item_type_ << " unknown tracking item type"; } } void GpsL1CaDllPllCAidTracking::connect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; //nothing to connect, now the tracking uses gr_sync_decimator } void GpsL1CaDllPllCAidTracking::disconnect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; //nothing to disconnect, now the tracking uses gr_sync_decimator } gr::basic_block_sptr GpsL1CaDllPllCAidTracking::get_left_block() { if (item_type_.compare("gr_complex") == 0) { return tracking_cc; } else if (item_type_.compare("cshort") == 0) { return tracking_sc; } else { LOG(WARNING) << item_type_ << " unknown tracking item type"; return nullptr; } } gr::basic_block_sptr GpsL1CaDllPllCAidTracking::get_right_block() { if (item_type_.compare("gr_complex") == 0) { return tracking_cc; } else if (item_type_.compare("cshort") == 0) { return tracking_sc; } else { LOG(WARNING) << item_type_ << " unknown tracking item type"; return nullptr; } } gnss-sdr-0.0.9/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_c_aid_tracking.h000066400000000000000000000064211305042567700303450ustar00rootroot00000000000000/*! * \file gps_l1_ca_dll_pll_c_aid_tracking.h * \brief Interface of an adapter of a DLL+PLL tracking loop block * for GPS L1 C/A to a TrackingInterface * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Javier Arribas, 2011. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach, Birkha user, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L1_CA_DLL_PLL_C_AID_TRACKING_H_ #define GNSS_SDR_GPS_L1_CA_DLL_PLL_C_AID_TRACKING_H_ #include #include "tracking_interface.h" #include "gps_l1_ca_dll_pll_c_aid_tracking_cc.h" #include "gps_l1_ca_dll_pll_c_aid_tracking_sc.h" class ConfigurationInterface; /*! * \brief This class implements a code DLL + carrier PLL tracking loop */ class GpsL1CaDllPllCAidTracking : public TrackingInterface { public: GpsL1CaDllPllCAidTracking(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GpsL1CaDllPllCAidTracking(); std::string role() { return role_; } //! Returns "GPS_L1_CA_DLL_PLL_C_Aid_Tracking" std::string implementation() { return "GPS_L1_CA_DLL_PLL_C_Aid_Tracking"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); /*! * \brief Set tracking channel unique ID */ void set_channel(unsigned int channel); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to efficiently exchange synchronization data between acquisition and tracking blocks */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); void start_tracking(); private: gps_l1_ca_dll_pll_c_aid_tracking_cc_sptr tracking_cc; gps_l1_ca_dll_pll_c_aid_tracking_sc_sptr tracking_sc; size_t item_size_; std::string item_type_; unsigned int channel_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; }; #endif // GNSS_SDR_GPS_L1_CA_DLL_PLL_C_AID_TRACKING_H_ gnss-sdr-0.0.9/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.cc000066400000000000000000000112311305042567700273570ustar00rootroot00000000000000/*! * \file gps_l1_ca_dll_pll_tracking.cc * \brief Implementation of an adapter of a DLL+PLL tracking loop block * for GPS L1 C/A to a TrackingInterface * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Javier Arribas, 2011. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach, Birkhauser, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l1_ca_dll_pll_tracking.h" #include #include "GPS_L1_CA.h" #include "configuration_interface.h" using google::LogMessage; GpsL1CaDllPllTracking::GpsL1CaDllPllTracking( ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { DLOG(INFO) << "role " << role; //################# CONFIGURATION PARAMETERS ######################## int fs_in; int vector_length; int f_if; bool dump; std::string dump_filename; std::string item_type; std::string default_item_type = "gr_complex"; float pll_bw_hz; float dll_bw_hz; float early_late_space_chips; item_type = configuration->property(role + ".item_type", default_item_type); fs_in = configuration->property("GNSS-SDR.internal_fs_hz", 2048000); f_if = configuration->property(role + ".if", 0); dump = configuration->property(role + ".dump", false); pll_bw_hz = configuration->property(role + ".pll_bw_hz", 50.0); dll_bw_hz = configuration->property(role + ".dll_bw_hz", 2.0); early_late_space_chips = configuration->property(role + ".early_late_space_chips", 0.5); std::string default_dump_filename = "./track_ch"; dump_filename = configuration->property(role + ".dump_filename", default_dump_filename); //unused! vector_length = std::round(fs_in / (GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS)); //################# MAKE TRACKING GNURadio object ################### if (item_type.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); tracking_ = gps_l1_ca_dll_pll_make_tracking_cc( f_if, fs_in, vector_length, dump, dump_filename, pll_bw_hz, dll_bw_hz, early_late_space_chips); } else { item_size_ = sizeof(gr_complex); LOG(WARNING) << item_type << " unknown tracking item type."; } channel_ = 0; DLOG(INFO) << "tracking(" << tracking_->unique_id() << ")"; } GpsL1CaDllPllTracking::~GpsL1CaDllPllTracking() {} void GpsL1CaDllPllTracking::start_tracking() { tracking_->start_tracking(); } /* * Set tracking channel unique ID */ void GpsL1CaDllPllTracking::set_channel(unsigned int channel) { channel_ = channel; tracking_->set_channel(channel); } void GpsL1CaDllPllTracking::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { tracking_->set_gnss_synchro(p_gnss_synchro); } void GpsL1CaDllPllTracking::connect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; //nothing to connect, now the tracking uses gr_sync_decimator } void GpsL1CaDllPllTracking::disconnect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; //nothing to disconnect, now the tracking uses gr_sync_decimator } gr::basic_block_sptr GpsL1CaDllPllTracking::get_left_block() { return tracking_; } gr::basic_block_sptr GpsL1CaDllPllTracking::get_right_block() { return tracking_; } gnss-sdr-0.0.9/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.h000066400000000000000000000061141305042567700272250ustar00rootroot00000000000000/*! * \file gps_l1_ca_dll_pll_tracking.h * \brief Interface of an adapter of a DLL+PLL tracking loop block * for GPS L1 C/A to a TrackingInterface * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Javier Arribas, 2011. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach, Birkha user, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L1_CA_DLL_PLL_TRACKING_H_ #define GNSS_SDR_GPS_L1_CA_DLL_PLL_TRACKING_H_ #include #include "tracking_interface.h" #include "gps_l1_ca_dll_pll_tracking_cc.h" class ConfigurationInterface; /*! * \brief This class implements a code DLL + carrier PLL tracking loop */ class GpsL1CaDllPllTracking : public TrackingInterface { public: GpsL1CaDllPllTracking(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GpsL1CaDllPllTracking(); std::string role() { return role_; } //! Returns "GPS_L1_CA_DLL_PLL_Tracking" std::string implementation() { return "GPS_L1_CA_DLL_PLL_Tracking"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); /*! * \brief Set tracking channel unique ID */ void set_channel(unsigned int channel); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to efficiently exchange synchronization data between acquisition and tracking blocks */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); void start_tracking(); private: gps_l1_ca_dll_pll_tracking_cc_sptr tracking_; size_t item_size_; unsigned int channel_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; }; #endif // GNSS_SDR_GPS_L1_CA_DLL_PLL_TRACKING_H_ gnss-sdr-0.0.9/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking_gpu.cc000066400000000000000000000113711305042567700302370ustar00rootroot00000000000000/*! * \file gps_l1_ca_dll_pll_tracking_gpu.cc * \brief Implementation of an adapter of a DLL+PLL tracking loop block using GPU accelerated functions * for GPS L1 C/A to a TrackingInterface * \author Javier Arribas, 2015. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach, Birkhauser, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l1_ca_dll_pll_tracking_gpu.h" #include #include "GPS_L1_CA.h" #include "configuration_interface.h" using google::LogMessage; GpsL1CaDllPllTrackingGPU::GpsL1CaDllPllTrackingGPU( ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { DLOG(INFO) << "role " << role; //################# CONFIGURATION PARAMETERS ######################## int fs_in; int vector_length; int f_if; bool dump; std::string dump_filename; std::string item_type; std::string default_item_type = "gr_complex"; float pll_bw_hz; float dll_bw_hz; float early_late_space_chips; item_type = configuration->property(role + ".item_type", default_item_type); //vector_length = configuration->property(role + ".vector_length", 2048); fs_in = configuration->property("GNSS-SDR.internal_fs_hz", 2048000); f_if = configuration->property(role + ".if", 0); dump = configuration->property(role + ".dump", false); pll_bw_hz = configuration->property(role + ".pll_bw_hz", 50.0); dll_bw_hz = configuration->property(role + ".dll_bw_hz", 2.0); early_late_space_chips = configuration->property(role + ".early_late_space_chips", 0.5); std::string default_dump_filename = "./track_ch"; dump_filename = configuration->property(role + ".dump_filename", default_dump_filename); //unused! vector_length = std::round(fs_in / (GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS)); //################# MAKE TRACKING GNURadio object ################### if (item_type.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); tracking_ = gps_l1_ca_dll_pll_make_tracking_gpu_cc( f_if, fs_in, vector_length, dump, dump_filename, pll_bw_hz, dll_bw_hz, early_late_space_chips); } else { item_size_ = sizeof(gr_complex); LOG(WARNING) << item_type << " unknown tracking item type."; } channel_ = 0; DLOG(INFO) << "tracking(" << tracking_->unique_id() << ")"; } GpsL1CaDllPllTrackingGPU::~GpsL1CaDllPllTrackingGPU() {} void GpsL1CaDllPllTrackingGPU::start_tracking() { tracking_->start_tracking(); } /* * Set tracking channel unique ID */ void GpsL1CaDllPllTrackingGPU::set_channel(unsigned int channel) { channel_ = channel; tracking_->set_channel(channel); } void GpsL1CaDllPllTrackingGPU::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { tracking_->set_gnss_synchro(p_gnss_synchro); } void GpsL1CaDllPllTrackingGPU::connect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; //nothing to connect, now the tracking uses gr_sync_decimator } void GpsL1CaDllPllTrackingGPU::disconnect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; //nothing to disconnect, now the tracking uses gr_sync_decimator } gr::basic_block_sptr GpsL1CaDllPllTrackingGPU::get_left_block() { return tracking_; } gr::basic_block_sptr GpsL1CaDllPllTrackingGPU::get_right_block() { return tracking_; } gnss-sdr-0.0.9/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking_gpu.h000066400000000000000000000061651305042567700301060ustar00rootroot00000000000000/*! * \file gps_l1_ca_dll_pll_tracking_gpu.h * \brief Implementation of an adapter of a DLL+PLL tracking loop block using GPU accelerated functions * for GPS L1 C/A to a TrackingInterface * \author Javier Arribas, 2015. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach, Birkha user, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L1_CA_DLL_PLL_TRACKING_GPU_H_ #define GNSS_SDR_GPS_L1_CA_DLL_PLL_TRACKING_GPU_H_ #include #include "tracking_interface.h" #include "gps_l1_ca_dll_pll_tracking_gpu_cc.h" class ConfigurationInterface; /*! * \brief This class implements a code DLL + carrier PLL tracking loop using GPU accelerated functions */ class GpsL1CaDllPllTrackingGPU : public TrackingInterface { public: GpsL1CaDllPllTrackingGPU(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GpsL1CaDllPllTrackingGPU(); std::string role() { return role_; } //! Returns "GPS_L1_CA_DLL_PLL_Tracking_GPU" std::string implementation() { return "GPS_L1_CA_DLL_PLL_Tracking_GPU"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); /*! * \brief Set tracking channel unique ID */ void set_channel(unsigned int channel); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to efficiently exchange synchronization data between acquisition and tracking blocks */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); void start_tracking(); private: gps_l1_ca_dll_pll_tracking_gpu_cc_sptr tracking_; size_t item_size_; unsigned int channel_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; }; #endif // GNSS_SDR_GPS_L1_CA_DLL_PLL_TRACKING_GPU_H_ gnss-sdr-0.0.9/src/algorithms/tracking/adapters/gps_l1_ca_tcp_connector_tracking.cc000066400000000000000000000113321305042567700305770ustar00rootroot00000000000000/*! * \file gps_l1_ca_tcp_connector_tracking.cc * \brief Implementation of an adapter of a TCP connector block based on code DLL + carrier PLL * \author David Pubill, 2012. dpubill(at)cttc.es * Luis Esteve, 2012. luis(at)epsilon-formacion.com * Javier Arribas, 2011. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach, Birkhauser, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l1_ca_tcp_connector_tracking.h" #include #include "GPS_L1_CA.h" #include "configuration_interface.h" using google::LogMessage; GpsL1CaTcpConnectorTracking::GpsL1CaTcpConnectorTracking( ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { DLOG(INFO) << "role " << role; //################# CONFIGURATION PARAMETERS ######################## int fs_in; int vector_length; int f_if; bool dump; std::string dump_filename; std::string item_type; std::string default_item_type = "gr_complex"; float early_late_space_chips; size_t port_ch0; item_type = configuration->property(role + ".item_type",default_item_type); //vector_length = configuration->property(role + ".vector_length", 2048); fs_in = configuration->property("GNSS-SDR.internal_fs_hz", 2048000); f_if = configuration->property(role + ".if", 0); dump = configuration->property(role + ".dump", false); early_late_space_chips = configuration->property(role + ".early_late_space_chips", 0.5); port_ch0 = configuration->property(role + ".port_ch0", 2060); std::string default_dump_filename = "./track_ch"; dump_filename = configuration->property(role + ".dump_filename", default_dump_filename); //unused! vector_length = std::round(fs_in / (GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS)); //################# MAKE TRACKING GNURadio object ################### if (item_type.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); tracking_ = gps_l1_ca_tcp_connector_make_tracking_cc( f_if, fs_in, vector_length, dump, dump_filename, early_late_space_chips, port_ch0); } else { item_size_ = sizeof(gr_complex); LOG(WARNING) << item_type << " unknown tracking item type."; } channel_ = 0; DLOG(INFO) << "tracking(" << tracking_->unique_id() << ")"; } GpsL1CaTcpConnectorTracking::~GpsL1CaTcpConnectorTracking() {} void GpsL1CaTcpConnectorTracking::start_tracking() { tracking_->start_tracking(); } /* * Set tracking channel unique ID */ void GpsL1CaTcpConnectorTracking::set_channel(unsigned int channel) { channel_ = channel; tracking_->set_channel(channel); } void GpsL1CaTcpConnectorTracking::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { tracking_->set_gnss_synchro(p_gnss_synchro); } void GpsL1CaTcpConnectorTracking::connect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; //nothing to connect, now the tracking uses gr_sync_decimator } void GpsL1CaTcpConnectorTracking::disconnect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; //nothing to disconnect, now the tracking uses gr_sync_decimator } gr::basic_block_sptr GpsL1CaTcpConnectorTracking::get_left_block() { return tracking_; } gr::basic_block_sptr GpsL1CaTcpConnectorTracking::get_right_block() { return tracking_; } gnss-sdr-0.0.9/src/algorithms/tracking/adapters/gps_l1_ca_tcp_connector_tracking.h000066400000000000000000000062331305042567700304450ustar00rootroot00000000000000/*! * \file gps_l1_ca_tcp_connector_tracking.h * \brief Interface of an adapter of a TCP connector block based on code DLL + carrier PLL * for GPS L1 C/A to a TrackingInterface * \author David Pubill, 2012. dpubill(at)cttc.es * Javier Arribas, 2011. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach, Birkha user, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L1_CA_TCP_CONNECTOR_TRACKING_H_ #define GNSS_SDR_GPS_L1_CA_TCP_CONNECTOR_TRACKING_H_ #include #include "tracking_interface.h" #include "gps_l1_ca_tcp_connector_tracking_cc.h" class ConfigurationInterface; /*! * \brief This class implements a code DLL + carrier PLL tracking loop */ class GpsL1CaTcpConnectorTracking : public TrackingInterface { public: GpsL1CaTcpConnectorTracking(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GpsL1CaTcpConnectorTracking(); std::string role() { return role_; } //! Returns "GPS_L1_CA_TCP_CONNECTOR_Tracking" std::string implementation() { return "GPS_L1_CA_TCP_CONNECTOR_Tracking"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); /*! * \brief Set tracking channel unique ID */ void set_channel(unsigned int channel); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to efficiently exchange synchronization data between acquisition and tracking blocks */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); void start_tracking(); private: gps_l1_ca_tcp_connector_tracking_cc_sptr tracking_; size_t item_size_; unsigned int channel_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; }; #endif // GNSS_SDR_GPS_L1_CA_TCP_CONNECTOR_TRACKING_H_ gnss-sdr-0.0.9/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.cc000066400000000000000000000111151305042567700272320ustar00rootroot00000000000000/*! * \file gps_l2_m_dll_pll_tracking.cc * \brief Implementation of an adapter of a DLL+PLL tracking loop block * for GPS L1 C/A to a TrackingInterface * \author Javier Arribas, 2015. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach, Birkhauser, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l2_m_dll_pll_tracking.h" #include #include "GPS_L2C.h" #include "configuration_interface.h" using google::LogMessage; GpsL2MDllPllTracking::GpsL2MDllPllTracking( ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { DLOG(INFO) << "role " << role; //################# CONFIGURATION PARAMETERS ######################## int fs_in; int vector_length; int f_if; bool dump; std::string dump_filename; std::string item_type; std::string default_item_type = "gr_complex"; float pll_bw_hz; float dll_bw_hz; float early_late_space_chips; item_type = configuration->property(role + ".item_type", default_item_type); fs_in = configuration->property("GNSS-SDR.internal_fs_hz", 2048000); f_if = configuration->property(role + ".if", 0); dump = configuration->property(role + ".dump", false); pll_bw_hz = configuration->property(role + ".pll_bw_hz", 50.0); dll_bw_hz = configuration->property(role + ".dll_bw_hz", 2.0); early_late_space_chips = configuration->property(role + ".early_late_space_chips", 0.5); std::string default_dump_filename = "./track_ch"; dump_filename = configuration->property(role + ".dump_filename", default_dump_filename); //unused! vector_length = std::round(fs_in / (GPS_L2_M_CODE_RATE_HZ / GPS_L2_M_CODE_LENGTH_CHIPS)); //################# MAKE TRACKING GNURadio object ################### if (item_type.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); tracking_ = gps_l2_m_dll_pll_make_tracking_cc( f_if, fs_in, vector_length, dump, dump_filename, pll_bw_hz, dll_bw_hz, early_late_space_chips); } else { item_size_ = sizeof(gr_complex); LOG(WARNING) << item_type << " unknown tracking item type."; } channel_ = 0; DLOG(INFO) << "tracking(" << tracking_->unique_id() << ")"; } GpsL2MDllPllTracking::~GpsL2MDllPllTracking() {} void GpsL2MDllPllTracking::start_tracking() { tracking_->start_tracking(); } /* * Set tracking channel unique ID */ void GpsL2MDllPllTracking::set_channel(unsigned int channel) { channel_ = channel; tracking_->set_channel(channel); } void GpsL2MDllPllTracking::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { tracking_->set_gnss_synchro(p_gnss_synchro); } void GpsL2MDllPllTracking::connect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; //nothing to connect, now the tracking uses gr_sync_decimator } void GpsL2MDllPllTracking::disconnect(gr::top_block_sptr top_block) { if(top_block) { /* top_block is not null */}; //nothing to disconnect, now the tracking uses gr_sync_decimator } gr::basic_block_sptr GpsL2MDllPllTracking::get_left_block() { return tracking_; } gr::basic_block_sptr GpsL2MDllPllTracking::get_right_block() { return tracking_; } gnss-sdr-0.0.9/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.h000066400000000000000000000061021305042567700270740ustar00rootroot00000000000000/*! * \file gps_l2_m_dll_pll_tracking.h * \brief Interface of an adapter of a DLL+PLL tracking loop block * for GPS L1 C/A to a TrackingInterface * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Javier Arribas, 2011. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach, Birkha user, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_l2_m_dll_pll_tracking_H_ #define GNSS_SDR_gps_l2_m_dll_pll_tracking_H_ #include #include "tracking_interface.h" #include "gps_l2_m_dll_pll_tracking_cc.h" class ConfigurationInterface; /*! * \brief This class implements a code DLL + carrier PLL tracking loop */ class GpsL2MDllPllTracking : public TrackingInterface { public: GpsL2MDllPllTracking(ConfigurationInterface* configuration, std::string role, unsigned int in_streams, unsigned int out_streams); virtual ~GpsL2MDllPllTracking(); std::string role() { return role_; } //! Returns "GPS_L2_M_DLL_PLL_Tracking" std::string implementation() { return "GPS_L2_M_DLL_PLL_Tracking"; } size_t item_size() { return item_size_; } void connect(gr::top_block_sptr top_block); void disconnect(gr::top_block_sptr top_block); gr::basic_block_sptr get_left_block(); gr::basic_block_sptr get_right_block(); /*! * \brief Set tracking channel unique ID */ void set_channel(unsigned int channel); /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer * to efficiently exchange synchronization data between acquisition and tracking blocks */ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); void start_tracking(); private: gps_l2_m_dll_pll_tracking_cc_sptr tracking_; size_t item_size_; unsigned int channel_; std::string role_; unsigned int in_streams_; unsigned int out_streams_; }; #endif // GNSS_SDR_gps_l2_m_dll_pll_tracking_H_ gnss-sdr-0.0.9/src/algorithms/tracking/gnuradio_blocks/000077500000000000000000000000001305042567700232005ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/tracking/gnuradio_blocks/CMakeLists.txt000066400000000000000000000047151305042567700257470ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # if(ENABLE_CUDA) set(OPT_TRACKING_BLOCKS ${OPT_TRACKING_BLOCKS} gps_l1_ca_dll_pll_tracking_gpu_cc.cc) set(OPT_TRACKING_INCLUDES ${OPT_TRACKING_INCLUDES} ${CUDA_INCLUDE_DIRS}) set(OPT_TRACKING_LIBRARIES ${OPT_TRACKING_LIBRARIES} ${CUDA_LIBRARIES}) endif(ENABLE_CUDA) set(TRACKING_GR_BLOCKS_SOURCES galileo_e1_dll_pll_veml_tracking_cc.cc galileo_e1_tcp_connector_tracking_cc.cc gps_l1_ca_dll_pll_tracking_cc.cc gps_l1_ca_tcp_connector_tracking_cc.cc galileo_e5a_dll_pll_tracking_cc.cc gps_l2_m_dll_pll_tracking_cc.cc gps_l1_ca_dll_pll_c_aid_tracking_cc.cc gps_l1_ca_dll_pll_c_aid_tracking_sc.cc ${OPT_TRACKING_BLOCKS} ) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/interfaces ${CMAKE_SOURCE_DIR}/src/core/receiver ${CMAKE_SOURCE_DIR}/src/algorithms/tracking/libs ${CMAKE_SOURCE_DIR}/src/algorithms/libs ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ${VOLK_GNSSSDR_INCLUDE_DIRS} ${OPT_TRACKING_INCLUDES} ) if(ENABLE_GENERIC_ARCH) add_definitions( -DGENERIC_ARCH=1 ) endif(ENABLE_GENERIC_ARCH) file(GLOB TRACKING_GR_BLOCKS_HEADERS "*.h") list(SORT TRACKING_GR_BLOCKS_HEADERS) add_library(tracking_gr_blocks ${TRACKING_GR_BLOCKS_SOURCES} ${TRACKING_GR_BLOCKS_HEADERS}) 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} ${OPT_TRACKING_LIBRARIES}) if(NOT VOLK_GNSSSDR_FOUND) add_dependencies(tracking_gr_blocks volk_gnsssdr_module) endif(NOT VOLK_GNSSSDR_FOUND) gnss-sdr-0.0.9/src/algorithms/tracking/gnuradio_blocks/galileo_e1_dll_pll_veml_tracking_cc.cc000077500000000000000000000600131305042567700325670ustar00rootroot00000000000000/*! * \file galileo_e1_dll_pll_veml_tracking_cc.cc * \brief Implementation of a code DLL + carrier PLL VEML (Very Early * Minus Late) tracking block for Galileo E1 signals * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com * * Code DLL + carrier PLL according to the algorithms described in: * [1] K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach, Birkhauser, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_e1_dll_pll_veml_tracking_cc.h" #include #include #include #include #include #include #include #include #include "galileo_e1_signal_processing.h" #include "tracking_discriminators.h" #include "lock_detectors.h" #include "Galileo_E1.h" #include "control_message_factory.h" /*! * \todo Include in definition header file */ #define CN0_ESTIMATION_SAMPLES 20 #define MINIMUM_VALID_CN0 25 #define MAXIMUM_LOCK_FAIL_COUNTER 50 #define CARRIER_LOCK_THRESHOLD 0.85 using google::LogMessage; galileo_e1_dll_pll_veml_tracking_cc_sptr galileo_e1_dll_pll_veml_make_tracking_cc( long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float early_late_space_chips, float very_early_late_space_chips) { return galileo_e1_dll_pll_veml_tracking_cc_sptr(new galileo_e1_dll_pll_veml_tracking_cc(if_freq, fs_in, vector_length, dump, dump_filename, pll_bw_hz, dll_bw_hz, early_late_space_chips, very_early_late_space_chips)); } void galileo_e1_dll_pll_veml_tracking_cc::forecast (int noutput_items, gr_vector_int &ninput_items_required) { if (noutput_items != 0) { ninput_items_required[0] = static_cast(d_vector_length) * 2; //set the required available samples in each call } } galileo_e1_dll_pll_veml_tracking_cc::galileo_e1_dll_pll_veml_tracking_cc( long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float early_late_space_chips, float very_early_late_space_chips): gr::block("galileo_e1_dll_pll_veml_tracking_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { // Telemetry bit synchronization message port input this->message_port_register_in(pmt::mp("preamble_timestamp_s")); this->set_relative_rate(1.0 / vector_length); this->message_port_register_out(pmt::mp("events")); // initialize internal vars d_dump = dump; d_if_freq = if_freq; d_fs_in = fs_in; d_vector_length = vector_length; d_dump_filename = dump_filename; d_code_loop_filter = Tracking_2nd_DLL_filter(Galileo_E1_CODE_PERIOD); d_carrier_loop_filter = Tracking_2nd_PLL_filter(Galileo_E1_CODE_PERIOD); // Initialize tracking ========================================== // Set bandwidth of code and carrier loop filters d_code_loop_filter.set_DLL_BW(dll_bw_hz); d_carrier_loop_filter.set_PLL_BW(pll_bw_hz); // Correlator spacing d_early_late_spc_chips = early_late_space_chips; // Define early-late offset (in chips) d_very_early_late_spc_chips = very_early_late_space_chips; // Define very-early-late offset (in chips) // Initialization of local code replica // Get space for a vector with the sinboc(1,1) replica sampled 2x/chip d_ca_code = static_cast(volk_gnsssdr_malloc((2 * Galileo_E1_B_CODE_LENGTH_CHIPS) * sizeof(gr_complex), volk_gnsssdr_get_alignment())); // correlator outputs (scalar) d_n_correlator_taps = 5; // Very-Early, Early, Prompt, Late, Very-Late d_correlator_outs = static_cast(volk_gnsssdr_malloc(d_n_correlator_taps * sizeof(gr_complex), volk_gnsssdr_get_alignment())); for (int n = 0; n < d_n_correlator_taps; n++) { d_correlator_outs[n] = gr_complex(0,0); } // map memory pointers of correlator outputs d_Very_Early = &d_correlator_outs[0]; d_Early = &d_correlator_outs[1]; d_Prompt = &d_correlator_outs[2]; d_Late = &d_correlator_outs[3]; d_Very_Late = &d_correlator_outs[4]; d_local_code_shift_chips = static_cast(volk_gnsssdr_malloc(d_n_correlator_taps * sizeof(float), volk_gnsssdr_get_alignment())); // Set TAPs delay values [chips] d_local_code_shift_chips[0] = - d_very_early_late_spc_chips; d_local_code_shift_chips[1] = - d_early_late_spc_chips; d_local_code_shift_chips[2] = 0.0; d_local_code_shift_chips[3] = d_early_late_spc_chips; d_local_code_shift_chips[4] = d_very_early_late_spc_chips; d_correlation_length_samples = d_vector_length; multicorrelator_cpu.init(2 * d_correlation_length_samples, d_n_correlator_taps); //--- Initializations ------------------------------ // Initial code frequency basis of NCO d_code_freq_chips = static_cast(Galileo_E1_CODE_CHIP_RATE_HZ); // Residual code phase (in chips) d_rem_code_phase_samples = 0.0; // Residual carrier phase d_rem_carr_phase_rad = 0.0; // sample synchronization d_sample_counter = 0; //d_sample_counter_seconds = 0; d_acq_sample_stamp = 0; d_enable_tracking = false; d_pull_in = false; d_current_prn_length_samples = static_cast(d_vector_length); // CN0 estimation and lock detector buffers d_cn0_estimation_counter = 0; d_Prompt_buffer = new gr_complex[CN0_ESTIMATION_SAMPLES]; d_carrier_lock_test = 1; d_CN0_SNV_dB_Hz = 0; d_carrier_lock_fail_counter = 0; d_carrier_lock_threshold = CARRIER_LOCK_THRESHOLD; systemName["E"] = std::string("Galileo"); *d_Very_Early = gr_complex(0,0); *d_Early = gr_complex(0,0); *d_Prompt = gr_complex(0,0); *d_Late = gr_complex(0,0); *d_Very_Late = gr_complex(0,0); d_acquisition_gnss_synchro = 0; d_channel = 0; d_acq_code_phase_samples = 0.0; d_acq_carrier_doppler_hz = 0.0; d_carrier_doppler_hz = 0.0; d_acc_carrier_phase_rad = 0.0; d_acc_code_phase_secs = 0.0; } void galileo_e1_dll_pll_veml_tracking_cc::start_tracking() { d_acq_code_phase_samples = d_acquisition_gnss_synchro->Acq_delay_samples; d_acq_carrier_doppler_hz = d_acquisition_gnss_synchro->Acq_doppler_hz; d_acq_sample_stamp = d_acquisition_gnss_synchro->Acq_samplestamp_samples; // DLL/PLL filter initialization d_carrier_loop_filter.initialize(); // initialize the carrier filter d_code_loop_filter.initialize(); // initialize the code filter // generate local reference ALWAYS starting at chip 1 (2 samples per chip) galileo_e1_code_gen_complex_sampled(d_ca_code, d_acquisition_gnss_synchro->Signal, false, d_acquisition_gnss_synchro->PRN, 2 * Galileo_E1_CODE_CHIP_RATE_HZ, 0); multicorrelator_cpu.set_local_code_and_taps(static_cast(2 * Galileo_E1_B_CODE_LENGTH_CHIPS), d_ca_code, d_local_code_shift_chips); for (int n = 0; n < d_n_correlator_taps; n++) { d_correlator_outs[n] = gr_complex(0,0); } d_carrier_lock_fail_counter = 0; d_rem_code_phase_samples = 0.0; d_rem_carr_phase_rad = 0.0; d_acc_carrier_phase_rad = 0.0; d_acc_code_phase_secs = 0.0; d_carrier_doppler_hz = d_acq_carrier_doppler_hz; d_current_prn_length_samples = d_vector_length; std::string sys_ = &d_acquisition_gnss_synchro->System; sys = sys_.substr(0, 1); // DEBUG OUTPUT std::cout << "Tracking start on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << std::endl; LOG(INFO) << "Starting tracking of satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << " on channel " << d_channel; // enable tracking d_pull_in = true; d_enable_tracking = true; LOG(INFO) << "PULL-IN Doppler [Hz]=" << d_carrier_doppler_hz << " PULL-IN Code Phase [samples]=" << d_acq_code_phase_samples; } galileo_e1_dll_pll_veml_tracking_cc::~galileo_e1_dll_pll_veml_tracking_cc() { d_dump_file.close(); volk_gnsssdr_free(d_local_code_shift_chips); volk_gnsssdr_free(d_correlator_outs); volk_gnsssdr_free(d_ca_code); delete[] d_Prompt_buffer; multicorrelator_cpu.free(); } int galileo_e1_dll_pll_veml_tracking_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) { double carr_error_hz = 0.0; double carr_error_filt_hz = 0.0; double code_error_chips = 0.0; double code_error_filt_chips = 0.0; // Block input data and block output stream pointers const gr_complex* in = (gr_complex*) input_items[0]; Gnss_Synchro **out = (Gnss_Synchro **) &output_items[0]; // GNSS_SYNCHRO OBJECT to interchange data between tracking->telemetry_decoder Gnss_Synchro current_synchro_data = Gnss_Synchro(); if (d_enable_tracking == true) { // Fill the acquisition data current_synchro_data = *d_acquisition_gnss_synchro; if (d_pull_in == true) { /* * Signal alignment (skip samples until the incoming signal is aligned with local replica) */ int samples_offset; double acq_trk_shif_correction_samples; int acq_to_trk_delay_samples; acq_to_trk_delay_samples = d_sample_counter - d_acq_sample_stamp; acq_trk_shif_correction_samples = d_current_prn_length_samples - std::fmod(static_cast(acq_to_trk_delay_samples), static_cast(d_current_prn_length_samples)); samples_offset = std::round(d_acq_code_phase_samples + acq_trk_shif_correction_samples); current_synchro_data.Tracking_timestamp_secs = (static_cast(d_sample_counter) + static_cast(d_rem_code_phase_samples)) / static_cast(d_fs_in); *out[0] = current_synchro_data; d_sample_counter = d_sample_counter + samples_offset; //count for the processed samples d_pull_in = false; consume_each(samples_offset); //shift input to perform alignment with local replica return 1; } // ################# CARRIER WIPEOFF AND CORRELATORS ############################## // perform carrier wipe-off and compute Early, Prompt and Late correlation multicorrelator_cpu.set_input_output_vectors(d_correlator_outs,in); double carr_phase_step_rad = GALILEO_TWO_PI * d_carrier_doppler_hz / static_cast(d_fs_in); double code_phase_step_half_chips = (2.0 * d_code_freq_chips) / (static_cast(d_fs_in)); double rem_code_phase_half_chips = d_rem_code_phase_samples * (2.0*d_code_freq_chips / d_fs_in); multicorrelator_cpu.Carrier_wipeoff_multicorrelator_resampler( d_rem_carr_phase_rad, carr_phase_step_rad, rem_code_phase_half_chips, code_phase_step_half_chips, d_correlation_length_samples); // ################## PLL ########################################################## // PLL discriminator carr_error_hz = pll_cloop_two_quadrant_atan(*d_Prompt) / GALILEO_TWO_PI; // Carrier discriminator filter carr_error_filt_hz = d_carrier_loop_filter.get_carrier_nco(carr_error_hz); // New carrier Doppler frequency estimation d_carrier_doppler_hz = d_acq_carrier_doppler_hz + carr_error_filt_hz; // New code Doppler frequency estimation d_code_freq_chips = Galileo_E1_CODE_CHIP_RATE_HZ + ((d_carrier_doppler_hz * Galileo_E1_CODE_CHIP_RATE_HZ) / Galileo_E1_FREQ_HZ); //carrier phase accumulator for (K) Doppler estimation- d_acc_carrier_phase_rad -= GALILEO_TWO_PI * d_carrier_doppler_hz * static_cast(d_current_prn_length_samples) / static_cast(d_fs_in); //remnant carrier phase to prevent overflow in the code NCO d_rem_carr_phase_rad = d_rem_carr_phase_rad + GALILEO_TWO_PI * d_carrier_doppler_hz * static_cast(d_current_prn_length_samples) / static_cast(d_fs_in); d_rem_carr_phase_rad = std::fmod(d_rem_carr_phase_rad, GALILEO_TWO_PI); // ################## DLL ########################################################## // DLL discriminator code_error_chips = dll_nc_vemlp_normalized(*d_Very_Early, *d_Early, *d_Late, *d_Very_Late); //[chips/Ti] // Code discriminator filter code_error_filt_chips = d_code_loop_filter.get_code_nco(code_error_chips); //[chips/second] //Code phase accumulator double code_error_filt_secs; code_error_filt_secs = (Galileo_E1_CODE_PERIOD * code_error_filt_chips) / Galileo_E1_CODE_CHIP_RATE_HZ; //[seconds] //code_error_filt_secs=T_prn_seconds*code_error_filt_chips*T_chip_seconds*static_cast(d_fs_in); //[seconds] d_acc_code_phase_secs = d_acc_code_phase_secs + code_error_filt_secs; // ################## CARRIER AND CODE NCO BUFFER ALIGNEMENT ####################### // keep alignment parameters for the next input buffer double T_chip_seconds; double T_prn_seconds; double T_prn_samples; double K_blk_samples; // Compute the next buffer length based in the new period of the PRN sequence and the code phase error estimation T_chip_seconds = 1.0 / d_code_freq_chips; T_prn_seconds = T_chip_seconds * Galileo_E1_B_CODE_LENGTH_CHIPS; T_prn_samples = T_prn_seconds * static_cast(d_fs_in); K_blk_samples = T_prn_samples + d_rem_code_phase_samples + code_error_filt_secs * static_cast(d_fs_in); d_current_prn_length_samples = std::round(K_blk_samples); //round to a discrete samples //d_rem_code_phase_samples = K_blk_samples - d_current_prn_length_samples; //rounding error < 1 sample // ####### CN0 ESTIMATION AND LOCK DETECTORS ###### if (d_cn0_estimation_counter < CN0_ESTIMATION_SAMPLES) { // fill buffer with prompt correlator output values d_Prompt_buffer[d_cn0_estimation_counter] = *d_Prompt; d_cn0_estimation_counter++; } else { d_cn0_estimation_counter = 0; // Code lock indicator d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES, d_fs_in, Galileo_E1_B_CODE_LENGTH_CHIPS); // Carrier lock indicator d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES); // Loss of lock detection if (d_carrier_lock_test < d_carrier_lock_threshold or d_CN0_SNV_dB_Hz < MINIMUM_VALID_CN0) { d_carrier_lock_fail_counter++; } else { if (d_carrier_lock_fail_counter > 0) d_carrier_lock_fail_counter--; } if (d_carrier_lock_fail_counter > MAXIMUM_LOCK_FAIL_COUNTER) { std::cout << "Loss of lock in channel " << d_channel << "!" << std::endl; LOG(INFO) << "Loss of lock in channel " << d_channel << "!"; this->message_port_pub(pmt::mp("events"), pmt::from_long(3));//3 -> loss of lock d_carrier_lock_fail_counter = 0; d_enable_tracking = false; // TODO: check if disabling tracking is consistent with the channel state machine } } // ########### Output the tracking results to Telemetry block ########## current_synchro_data.Prompt_I = static_cast((*d_Prompt).real()); current_synchro_data.Prompt_Q = static_cast((*d_Prompt).imag()); // Tracking_timestamp_secs is aligned with the CURRENT PRN start sample (Hybridization OK!) current_synchro_data.Tracking_timestamp_secs = (static_cast(d_sample_counter) + static_cast(d_rem_code_phase_samples)) / static_cast(d_fs_in); //compute remnant code phase samples AFTER the Tracking timestamp d_rem_code_phase_samples = K_blk_samples - d_current_prn_length_samples; //rounding error < 1 sample current_synchro_data.Carrier_phase_rads = d_acc_carrier_phase_rad; current_synchro_data.Carrier_Doppler_hz = d_carrier_doppler_hz; current_synchro_data.CN0_dB_hz = d_CN0_SNV_dB_Hz; current_synchro_data.Flag_valid_symbol_output = true; current_synchro_data.correlation_length_ms = 4; } else { *d_Early = gr_complex(0,0); *d_Prompt = gr_complex(0,0); *d_Late = gr_complex(0,0); // GNSS_SYNCHRO OBJECT to interchange data between tracking->telemetry_decoder current_synchro_data.Tracking_timestamp_secs = (static_cast(d_sample_counter) + static_cast(d_rem_code_phase_samples)) / static_cast(d_fs_in); } //assign the GNURadio block output data current_synchro_data.System = {'E'}; std::string str_aux = "1B"; const char * str = str_aux.c_str(); // get a C style null terminated string std::memcpy((void*)current_synchro_data.Signal, str, 3); *out[0] = current_synchro_data; if(d_dump) { // Dump results to file float prompt_I; float prompt_Q; float tmp_VE, tmp_E, tmp_P, tmp_L, tmp_VL; float tmp_float; double tmp_double; prompt_I = (*d_Prompt).real(); prompt_Q = (*d_Prompt).imag(); tmp_VE = std::abs(*d_Very_Early); tmp_E = std::abs(*d_Early); tmp_P = std::abs(*d_Prompt); tmp_L = std::abs(*d_Late); tmp_VL = std::abs(*d_Very_Late); try { // Dump correlators output d_dump_file.write(reinterpret_cast(&tmp_VE), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_E), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_P), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_L), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_VL), sizeof(float)); // PROMPT I and Q (to analyze navigation symbols) d_dump_file.write(reinterpret_cast(&prompt_I), sizeof(float)); d_dump_file.write(reinterpret_cast(&prompt_Q), sizeof(float)); // PRN start sample stamp d_dump_file.write(reinterpret_cast(&d_sample_counter), sizeof(unsigned long int)); // accumulated carrier phase tmp_float = d_acc_carrier_phase_rad; d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // carrier and code frequency tmp_float = d_carrier_doppler_hz; d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); tmp_float = d_code_freq_chips; d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); //PLL commands tmp_float = carr_error_hz; d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); tmp_float = carr_error_filt_hz; d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); //DLL commands tmp_float = code_error_chips; d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); tmp_float = code_error_filt_chips; d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // CN0 and carrier lock test tmp_float = d_CN0_SNV_dB_Hz; d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); tmp_float = d_carrier_lock_test; d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); // AUX vars (for debug purposes) tmp_float = d_rem_code_phase_samples; d_dump_file.write(reinterpret_cast(&tmp_float), sizeof(float)); tmp_double = static_cast(d_sample_counter + d_current_prn_length_samples); d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); } catch (const std::ifstream::failure &e) { LOG(WARNING) << "Exception writing trk dump file " << e.what() << std::endl; } } consume_each(d_current_prn_length_samples); // this is required for gr_block derivates d_sample_counter += d_current_prn_length_samples; //count for the processed samples return 1; //output tracking result ALWAYS even in the case of d_enable_tracking==false } void galileo_e1_dll_pll_veml_tracking_cc::set_channel(unsigned int channel) { d_channel = channel; LOG(INFO) << "Tracking Channel set to " << d_channel; // ############# ENABLE DATA FILE LOG ################# if (d_dump == true) { if (d_dump_file.is_open() == false) { try { d_dump_filename.append(boost::lexical_cast(d_channel)); d_dump_filename.append(".dat"); d_dump_file.exceptions (std::ifstream::failbit | std::ifstream::badbit); d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); LOG(INFO) << "Tracking dump enabled on channel " << d_channel << " Log file: " << d_dump_filename.c_str(); } catch (const std::ifstream::failure &e) { LOG(WARNING) << "channel " << d_channel << " Exception opening trk dump file " << e.what() << std::endl; } } } } void galileo_e1_dll_pll_veml_tracking_cc::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { d_acquisition_gnss_synchro = p_gnss_synchro; } gnss-sdr-0.0.9/src/algorithms/tracking/gnuradio_blocks/galileo_e1_dll_pll_veml_tracking_cc.h000077500000000000000000000133131305042567700324320ustar00rootroot00000000000000/*! * \file galileo_e1_dll_pll_veml_tracking_cc.h * \brief Implementation of a code DLL + carrier PLL VEML (Very Early * Minus Late) tracking block for Galileo E1 signals * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_E1_DLL_PLL_VEML_TRACKING_CC_H #define GNSS_SDR_GALILEO_E1_DLL_PLL_VEML_TRACKING_CC_H #include #include #include #include #include "gnss_synchro.h" #include "tracking_2nd_DLL_filter.h" #include "tracking_2nd_PLL_filter.h" #include "cpu_multicorrelator.h" class galileo_e1_dll_pll_veml_tracking_cc; typedef boost::shared_ptr galileo_e1_dll_pll_veml_tracking_cc_sptr; galileo_e1_dll_pll_veml_tracking_cc_sptr galileo_e1_dll_pll_veml_make_tracking_cc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float early_late_space_chips, float very_early_late_space_chips); /*! * \brief This class implements a code DLL + carrier PLL VEML (Very Early * Minus Late) tracking block for Galileo E1 signals */ class galileo_e1_dll_pll_veml_tracking_cc: public gr::block { public: ~galileo_e1_dll_pll_veml_tracking_cc(); void set_channel(unsigned int channel); void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); void start_tracking(); /*! * \brief Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency Approach, * Birkhauser, 2007 */ int general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); void forecast (int noutput_items, gr_vector_int &ninput_items_required); private: friend galileo_e1_dll_pll_veml_tracking_cc_sptr galileo_e1_dll_pll_veml_make_tracking_cc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float early_late_space_chips, float very_early_late_space_chips); galileo_e1_dll_pll_veml_tracking_cc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float early_late_space_chips, float very_early_late_space_chips); void update_local_code(); void update_local_carrier(); // tracking configuration vars unsigned int d_vector_length; bool d_dump; Gnss_Synchro* d_acquisition_gnss_synchro; unsigned int d_channel; long d_if_freq; long d_fs_in; //Integration period in samples int d_correlation_length_samples; int d_n_correlator_taps; double d_early_late_spc_chips; double d_very_early_late_spc_chips; gr_complex* d_ca_code; float* d_local_code_shift_chips; gr_complex* d_correlator_outs; cpu_multicorrelator multicorrelator_cpu; gr_complex *d_Very_Early; gr_complex *d_Early; gr_complex *d_Prompt; gr_complex *d_Late; gr_complex *d_Very_Late; // remaining code phase and carrier phase between tracking loops double d_rem_code_phase_samples; double d_rem_carr_phase_rad; // PLL and DLL filter library Tracking_2nd_DLL_filter d_code_loop_filter; Tracking_2nd_PLL_filter d_carrier_loop_filter; // acquisition double d_acq_code_phase_samples; double d_acq_carrier_doppler_hz; // tracking vars double d_code_freq_chips; double d_carrier_doppler_hz; double d_acc_carrier_phase_rad; double d_acc_code_phase_secs; //PRN period in samples int d_current_prn_length_samples; //processing samples counters unsigned long int d_sample_counter; unsigned long int d_acq_sample_stamp; // CN0 estimation and lock detector int d_cn0_estimation_counter; gr_complex* d_Prompt_buffer; double d_carrier_lock_test; double d_CN0_SNV_dB_Hz; double d_carrier_lock_threshold; int d_carrier_lock_fail_counter; // control vars bool d_enable_tracking; bool d_pull_in; // file dump std::string d_dump_filename; std::ofstream d_dump_file; std::map systemName; std::string sys; }; #endif //GNSS_SDR_GALILEO_E1_DLL_PLL_VEML_TRACKING_CC_H gnss-sdr-0.0.9/src/algorithms/tracking/gnuradio_blocks/galileo_e1_tcp_connector_tracking_cc.cc000066400000000000000000000617111305042567700327650ustar00rootroot00000000000000/*! * \file galileo_e1_tcp_connector_tracking_cc.cc * \brief Implementation of a TCP connector block based on Code DLL + carrier PLL * \author David Pubill, 2012. dpubill(at)cttc.es * Luis Esteve, 2012. luis(at)epsilon-formacion.com * Javier Arribas, 2011. jarribas(at)cttc.es * * * Code DLL + carrier PLL according to the algorithms described in: * [1] K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach, Birkha user, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_e1_tcp_connector_tracking_cc.h" #include #include #include #include #include #include #include #include #include #include "galileo_e1_signal_processing.h" #include "tracking_discriminators.h" #include "lock_detectors.h" #include "GPS_L1_CA.h" #include "Galileo_E1.h" #include "control_message_factory.h" #include "tcp_communication.h" #include "tcp_packet_data.h" /*! * \todo Include in definition header file */ #define CN0_ESTIMATION_SAMPLES 20 #define MINIMUM_VALID_CN0 25 #define MAXIMUM_LOCK_FAIL_COUNTER 50 #define CARRIER_LOCK_THRESHOLD 0.85 using google::LogMessage; galileo_e1_tcp_connector_tracking_cc_sptr galileo_e1_tcp_connector_make_tracking_cc( long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float early_late_space_chips, float very_early_late_space_chips, size_t port_ch0) { return galileo_e1_tcp_connector_tracking_cc_sptr(new Galileo_E1_Tcp_Connector_Tracking_cc(if_freq, fs_in, vector_length, dump, dump_filename, pll_bw_hz, dll_bw_hz, early_late_space_chips, very_early_late_space_chips, port_ch0)); } void Galileo_E1_Tcp_Connector_Tracking_cc::forecast (int noutput_items, gr_vector_int &ninput_items_required) { if (noutput_items != 0) { ninput_items_required[0] = (int)d_vector_length*2; // set the required available samples in each call } } Galileo_E1_Tcp_Connector_Tracking_cc::Galileo_E1_Tcp_Connector_Tracking_cc( long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz __attribute__((unused)), float dll_bw_hz __attribute__((unused)), float early_late_space_chips, float very_early_late_space_chips, size_t port_ch0): gr::block("Galileo_E1_Tcp_Connector_Tracking_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { // Telemetry bit synchronization message port input this->message_port_register_in(pmt::mp("preamble_timestamp_s")); this->message_port_register_out(pmt::mp("events")); this->set_relative_rate(1.0/vector_length); // initialize internal vars d_dump = dump; d_if_freq = if_freq; d_fs_in = fs_in; d_vector_length = vector_length; d_dump_filename = dump_filename; // Initialize tracking ========================================== //--- DLL variables -------------------------------------------------------- d_early_late_spc_chips = early_late_space_chips; // Define early-late offset (in chips) d_very_early_late_spc_chips = very_early_late_space_chips; // Define very-early-late offset (in chips) //--- TCP CONNECTOR variables -------------------------------------------------------- d_port_ch0 = port_ch0; d_port = 0; d_listen_connection = true; d_control_id = 0; // Initialization of local code replica // Get space for a vector with the sinboc(1,1) replica sampled 2x/chip d_ca_code = static_cast(volk_gnsssdr_malloc((2*Galileo_E1_B_CODE_LENGTH_CHIPS) * sizeof(gr_complex), volk_gnsssdr_get_alignment())); // correlator outputs (scalar) d_n_correlator_taps = 5; // Very-Early, Early, Prompt, Late, Very-Late d_correlator_outs = static_cast(volk_gnsssdr_malloc(d_n_correlator_taps*sizeof(gr_complex), volk_gnsssdr_get_alignment())); for (int n = 0; n < d_n_correlator_taps; n++) { d_correlator_outs[n] = gr_complex(0,0); } // map memory pointers of correlator outputs d_Very_Early = &d_correlator_outs[0]; d_Early = &d_correlator_outs[1]; d_Prompt = &d_correlator_outs[2]; d_Late = &d_correlator_outs[3]; d_Very_Late = &d_correlator_outs[4]; d_local_code_shift_chips = static_cast(volk_gnsssdr_malloc(d_n_correlator_taps * sizeof(float), volk_gnsssdr_get_alignment())); // Set TAPs delay values [chips] d_local_code_shift_chips[0] = - d_very_early_late_spc_chips; d_local_code_shift_chips[1] = - d_early_late_spc_chips; d_local_code_shift_chips[2] = 0.0; d_local_code_shift_chips[3] = d_early_late_spc_chips; d_local_code_shift_chips[4] = d_very_early_late_spc_chips; d_correlation_length_samples = d_vector_length; multicorrelator_cpu.init(2 * d_correlation_length_samples, d_n_correlator_taps); //--- Perform initializations ------------------------------ // define initial code frequency basis of NCO d_code_freq_chips = Galileo_E1_CODE_CHIP_RATE_HZ; // define residual code phase (in chips) d_rem_code_phase_samples = 0.0; // define residual carrier phase d_rem_carr_phase_rad = 0.0; // sample synchronization d_sample_counter = 0; d_acq_sample_stamp = 0; d_enable_tracking = false; d_pull_in = false; d_current_prn_length_samples = (int)d_vector_length; // CN0 estimation and lock detector buffers d_cn0_estimation_counter = 0; d_Prompt_buffer = new gr_complex[CN0_ESTIMATION_SAMPLES]; d_carrier_lock_test = 1; d_CN0_SNV_dB_Hz = 0; d_carrier_lock_fail_counter = 0; d_carrier_lock_threshold = CARRIER_LOCK_THRESHOLD; systemName["E"] = std::string("Galileo"); d_acquisition_gnss_synchro = 0; d_channel = 0; d_next_rem_code_phase_samples = 0; d_acq_code_phase_samples = 0.0; d_acq_carrier_doppler_hz = 0.0; d_acc_carrier_phase_rad = 0.0; d_acc_code_phase_secs = 0.0; d_code_phase_samples = 0; d_next_prn_length_samples = 0; d_carrier_doppler_hz = 0.0; } void Galileo_E1_Tcp_Connector_Tracking_cc::start_tracking() { d_acq_code_phase_samples = d_acquisition_gnss_synchro->Acq_delay_samples; d_acq_carrier_doppler_hz = d_acquisition_gnss_synchro->Acq_doppler_hz; d_acq_sample_stamp = d_acquisition_gnss_synchro->Acq_samplestamp_samples; // generate local reference ALWAYS starting at chip 1 (2 samples per chip) galileo_e1_code_gen_complex_sampled(d_ca_code, d_acquisition_gnss_synchro->Signal, false, d_acquisition_gnss_synchro->PRN, 2 * Galileo_E1_CODE_CHIP_RATE_HZ, 0); multicorrelator_cpu.set_local_code_and_taps(static_cast(2*Galileo_E1_B_CODE_LENGTH_CHIPS), d_ca_code, d_local_code_shift_chips); for (int n = 0; n < d_n_correlator_taps; n++) { d_correlator_outs[n] = gr_complex(0,0); } d_carrier_lock_fail_counter = 0; d_rem_code_phase_samples = 0.0; d_rem_carr_phase_rad = 0; d_acc_carrier_phase_rad = 0; d_acc_code_phase_secs = 0; d_carrier_doppler_hz = d_acq_carrier_doppler_hz; d_current_prn_length_samples = d_vector_length; std::string sys_ = &d_acquisition_gnss_synchro->System; sys = sys_.substr(0,1); // DEBUG OUTPUT std::cout << "Tracking start on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << std::endl; LOG(INFO) << "Starting tracking of satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << " on channel " << d_channel; // enable tracking d_pull_in = true; d_enable_tracking = true; LOG(INFO) << "PULL-IN Doppler [Hz]=" << d_carrier_doppler_hz << " PULL-IN Code Phase [samples]=" << d_acq_code_phase_samples; } Galileo_E1_Tcp_Connector_Tracking_cc::~Galileo_E1_Tcp_Connector_Tracking_cc() { d_dump_file.close(); delete[] d_Prompt_buffer; volk_gnsssdr_free(d_ca_code); volk_gnsssdr_free(d_local_code_shift_chips); volk_gnsssdr_free(d_correlator_outs); d_tcp_com.close_tcp_connection(d_port); multicorrelator_cpu.free(); } int Galileo_E1_Tcp_Connector_Tracking_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) { // process vars float carr_error_filt_hz; float code_error_filt_chips; tcp_packet_data tcp_data; // GNSS_SYNCHRO OBJECT to interchange data between tracking->telemetry_decoder Gnss_Synchro current_synchro_data = Gnss_Synchro(); // Block input data and block output stream pointers const gr_complex* in = (gr_complex*) input_items[0]; Gnss_Synchro **out = (Gnss_Synchro **) &output_items[0]; if (d_enable_tracking == true) { // Fill the acquisition data current_synchro_data = *d_acquisition_gnss_synchro; if (d_pull_in == true) { /* * Signal alignment (skip samples until the incoming signal is aligned with local replica) */ int samples_offset; float acq_trk_shif_correction_samples; int acq_to_trk_delay_samples; acq_to_trk_delay_samples = d_sample_counter - d_acq_sample_stamp; acq_trk_shif_correction_samples = d_current_prn_length_samples - fmod((float)acq_to_trk_delay_samples, (float)d_current_prn_length_samples); samples_offset = round(d_acq_code_phase_samples + acq_trk_shif_correction_samples); current_synchro_data.Tracking_timestamp_secs = (static_cast(d_sample_counter) + static_cast(d_rem_code_phase_samples)) / static_cast(d_fs_in); *out[0] = current_synchro_data; d_sample_counter = d_sample_counter + samples_offset; //count for the processed samples d_pull_in = false; consume_each(samples_offset); //shift input to perform alignment with local replica return 1; } // ################# CARRIER WIPEOFF AND CORRELATORS ############################## // perform carrier wipe-off and compute Early, Prompt and Late correlation multicorrelator_cpu.set_input_output_vectors(d_correlator_outs,in); double carr_phase_step_rad = GALILEO_TWO_PI * d_carrier_doppler_hz / static_cast(d_fs_in); double code_phase_step_half_chips = (2.0 * d_code_freq_chips) / (static_cast(d_fs_in)); double rem_code_phase_half_chips = d_rem_code_phase_samples * (2.0*d_code_freq_chips / d_fs_in); multicorrelator_cpu.Carrier_wipeoff_multicorrelator_resampler( d_rem_carr_phase_rad, carr_phase_step_rad, rem_code_phase_half_chips, code_phase_step_half_chips, d_correlation_length_samples); // ################## TCP CONNECTOR ########################################################## //! Variable used for control d_control_id++; //! Send and receive a TCP packet boost::array tx_variables_array = {{d_control_id, (*d_Very_Early).real(), (*d_Very_Early).imag(), (*d_Early).real(), (*d_Early).imag(), (*d_Late).real(), (*d_Late).imag(), (*d_Very_Late).real(), (*d_Very_Late).imag(), (*d_Prompt).real(), (*d_Prompt).imag(), d_acq_carrier_doppler_hz, 1}}; d_tcp_com.send_receive_tcp_packet_galileo_e1(tx_variables_array, &tcp_data); // ################## PLL ########################################################## // PLL discriminator, carrier loop filter implementation and NCO command generation (TCP_connector) carr_error_filt_hz = tcp_data.proc_pack_carr_error; // New carrier Doppler frequency estimation d_carrier_doppler_hz = d_acq_carrier_doppler_hz + carr_error_filt_hz; // New code Doppler frequency estimation d_code_freq_chips = Galileo_E1_CODE_CHIP_RATE_HZ + ((d_carrier_doppler_hz * Galileo_E1_CODE_CHIP_RATE_HZ) / Galileo_E1_FREQ_HZ); //carrier phase accumulator for (K) doppler estimation d_acc_carrier_phase_rad -= GPS_TWO_PI*d_carrier_doppler_hz*Galileo_E1_CODE_PERIOD; //remnant carrier phase to prevent overflow in the code NCO d_rem_carr_phase_rad = d_rem_carr_phase_rad + GPS_TWO_PI*d_carrier_doppler_hz*Galileo_E1_CODE_PERIOD; d_rem_carr_phase_rad = fmod(d_rem_carr_phase_rad, GPS_TWO_PI); // ################## DLL ########################################################## // DLL discriminator, carrier loop filter implementation and NCO command generation (TCP_connector) code_error_filt_chips = tcp_data.proc_pack_code_error; //Code phase accumulator float code_error_filt_secs; code_error_filt_secs = (Galileo_E1_CODE_PERIOD * code_error_filt_chips) / Galileo_E1_CODE_CHIP_RATE_HZ; //[seconds] d_acc_code_phase_secs = d_acc_code_phase_secs + code_error_filt_secs; // ################## CARRIER AND CODE NCO BUFFER ALIGNEMENT ####################### // keep alignment parameters for the next input buffer double T_chip_seconds; double T_prn_seconds; double T_prn_samples; double K_blk_samples; // Compute the next buffer lenght based in the new period of the PRN sequence and the code phase error estimation T_chip_seconds = 1 / (double)d_code_freq_chips; T_prn_seconds = T_chip_seconds * Galileo_E1_B_CODE_LENGTH_CHIPS; T_prn_samples = T_prn_seconds * (double)d_fs_in; K_blk_samples = T_prn_samples + d_rem_code_phase_samples + code_error_filt_secs * (double)d_fs_in; d_current_prn_length_samples = round(K_blk_samples); //round to a discrete samples //d_rem_code_phase_samples = K_blk_samples - d_current_prn_length_samples; //rounding error < 1 sample // ####### CN0 ESTIMATION AND LOCK DETECTORS ###### if (d_cn0_estimation_counter < CN0_ESTIMATION_SAMPLES) { // fill buffer with prompt correlator output values d_Prompt_buffer[d_cn0_estimation_counter] = *d_Prompt; d_cn0_estimation_counter++; } else { d_cn0_estimation_counter = 0; // Code lock indicator d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES, d_fs_in, Galileo_E1_B_CODE_LENGTH_CHIPS); // Carrier lock indicator d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES); // Loss of lock detection if (d_carrier_lock_test < d_carrier_lock_threshold or d_CN0_SNV_dB_Hz < MINIMUM_VALID_CN0) { d_carrier_lock_fail_counter++; } else { if (d_carrier_lock_fail_counter > 0) d_carrier_lock_fail_counter--; } if (d_carrier_lock_fail_counter > MAXIMUM_LOCK_FAIL_COUNTER) { std::cout << "Loss of lock in channel " << d_channel << "!" << std::endl; LOG(INFO) << "Loss of lock in channel " << d_channel << "!"; this->message_port_pub(pmt::mp("events"), pmt::from_long(3));//3 -> loss of lock d_carrier_lock_fail_counter = 0; d_enable_tracking = false; // TODO: check if disabling tracking is consistent with the channel state machine } } // ########### Output the tracking data to navigation and PVT ########## current_synchro_data.Prompt_I = (double)(*d_Prompt).real(); current_synchro_data.Prompt_Q = (double)(*d_Prompt).imag(); // Tracking_timestamp_secs is aligned with the PRN start sample //current_synchro_data.Tracking_timestamp_secs = ((double)d_sample_counter + (double)d_next_prn_length_samples + (double)d_next_rem_code_phase_samples)/(double)d_fs_in; current_synchro_data.Tracking_timestamp_secs = ((double)d_sample_counter + (double)d_rem_code_phase_samples)/(double)d_fs_in; d_rem_code_phase_samples = K_blk_samples - d_current_prn_length_samples; //rounding error < 1 sample // This tracking block aligns the Tracking_timestamp_secs with the start sample of the PRN, thus, Code_phase_secs=0 current_synchro_data.Carrier_phase_rads = (double)d_acc_carrier_phase_rad; current_synchro_data.Carrier_Doppler_hz = (double)d_carrier_doppler_hz; current_synchro_data.CN0_dB_hz = (double)d_CN0_SNV_dB_Hz; current_synchro_data.Flag_valid_symbol_output = true; current_synchro_data.correlation_length_ms = 4; } else { *d_Early = gr_complex(0,0); *d_Prompt = gr_complex(0,0); *d_Late = gr_complex(0,0); current_synchro_data.Tracking_timestamp_secs = (static_cast(d_sample_counter) + static_cast(d_rem_code_phase_samples)) / static_cast(d_fs_in); //! When tracking is disabled an array of 1's is sent to maintain the TCP connection boost::array tx_variables_array = {{1,1,1,1,1,1,1,1,1,1,1,1,0}}; d_tcp_com.send_receive_tcp_packet_galileo_e1(tx_variables_array, &tcp_data); } //assign the GNURadio block output data current_synchro_data.System = {'E'}; std::string str_aux = "1B"; const char * str = str_aux.c_str(); // get a C style null terminated string std::memcpy((void*)current_synchro_data.Signal, str, 3); *out[0] = current_synchro_data; if(d_dump) { // MULTIPLEXED FILE RECORDING - Record results to file float prompt_I; float prompt_Q; float tmp_VE, tmp_E, tmp_P, tmp_L, tmp_VL; float tmp_float; tmp_float = 0; double tmp_double; prompt_I = (*d_Prompt).real(); prompt_Q = (*d_Prompt).imag(); tmp_VE = std::abs(*d_Very_Early); tmp_E = std::abs(*d_Early); tmp_P = std::abs(*d_Prompt); tmp_L = std::abs(*d_Late); tmp_VL = std::abs(*d_Very_Late); try { // EPR d_dump_file.write((char*)&tmp_VE, sizeof(float)); d_dump_file.write((char*)&tmp_E, sizeof(float)); d_dump_file.write((char*)&tmp_P, sizeof(float)); d_dump_file.write((char*)&tmp_L, sizeof(float)); d_dump_file.write((char*)&tmp_VL, sizeof(float)); // PROMPT I and Q (to analyze navigation symbols) d_dump_file.write((char*)&prompt_I, sizeof(float)); d_dump_file.write((char*)&prompt_Q, sizeof(float)); // PRN start sample stamp d_dump_file.write((char*)&d_sample_counter, sizeof(unsigned long int)); // accumulated carrier phase d_dump_file.write((char*)&d_acc_carrier_phase_rad, sizeof(float)); // carrier and code frequency d_dump_file.write((char*)&d_carrier_doppler_hz, sizeof(float)); d_dump_file.write((char*)&d_code_freq_chips, sizeof(float)); //PLL commands d_dump_file.write((char*)&tmp_float, sizeof(float)); d_dump_file.write((char*)&carr_error_filt_hz, sizeof(float)); //DLL commands d_dump_file.write((char*)&tmp_float, sizeof(float)); d_dump_file.write((char*)&code_error_filt_chips, sizeof(float)); // CN0 and carrier lock test d_dump_file.write((char*)&d_CN0_SNV_dB_Hz, sizeof(float)); d_dump_file.write((char*)&d_carrier_lock_test, sizeof(float)); // AUX vars (for debug purposes) tmp_float = d_rem_code_phase_samples; d_dump_file.write((char*)&tmp_float, sizeof(float)); tmp_double = (double)(d_sample_counter+d_current_prn_length_samples); d_dump_file.write((char*)&tmp_double, sizeof(double)); } catch (const std::ifstream::failure &e) { LOG(WARNING) << "Exception writing trk dump file " << e.what(); } } consume_each(d_current_prn_length_samples); // this is needed in gr::block derivates d_sample_counter += d_current_prn_length_samples; //count for the processed samples return 1; //output tracking result ALWAYS even in the case of d_enable_tracking==false } void Galileo_E1_Tcp_Connector_Tracking_cc::set_channel(unsigned int channel) { d_channel = channel; LOG(INFO) << "Tracking Channel set to " << d_channel; // ############# ENABLE DATA FILE LOG ################# if (d_dump == true) { if (d_dump_file.is_open() == false) { try { d_dump_filename.append(boost::lexical_cast(d_channel)); d_dump_filename.append(".dat"); d_dump_file.exceptions (std::ifstream::failbit | std::ifstream::badbit); d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); LOG(INFO) << "Tracking dump enabled on channel " << d_channel << " Log file: " << d_dump_filename.c_str(); } catch (const std::ifstream::failure &e) { LOG(WARNING) << "channel " << d_channel << " Exception opening trk dump file " << e.what(); } } } //! Listen for connections on a TCP port if (d_listen_connection == true) { d_port = d_port_ch0 + d_channel; d_listen_connection = d_tcp_com.listen_tcp_connection(d_port, d_port_ch0); } } void Galileo_E1_Tcp_Connector_Tracking_cc::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { d_acquisition_gnss_synchro = p_gnss_synchro; } gnss-sdr-0.0.9/src/algorithms/tracking/gnuradio_blocks/galileo_e1_tcp_connector_tracking_cc.h000066400000000000000000000137321305042567700326270ustar00rootroot00000000000000/*! * \file galileo_e1_tcp_connector_tracking_cc.h * \brief Interface of a TCP connector block based on code DLL + carrier PLL VEML (Very Early * Minus Late) tracking block for Galileo E1 signals * \author David Pubill, 2012. dpubill(at)cttc.es * Luis Esteve, 2012. luis(at)epsilon-formacion.com * Javier Arribas, 2011. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency Approach, * Birkhauser, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_E1_TCP_CONNECTOR_TRACKING_CC_H #define GNSS_SDR_GALILEO_E1_TCP_CONNECTOR_TRACKING_CC_H #include #include #include #include #include #include "gnss_synchro.h" #include "cpu_multicorrelator.h" #include "tcp_communication.h" class Galileo_E1_Tcp_Connector_Tracking_cc; typedef boost::shared_ptr galileo_e1_tcp_connector_tracking_cc_sptr; galileo_e1_tcp_connector_tracking_cc_sptr galileo_e1_tcp_connector_make_tracking_cc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float early_late_space_chips, float very_early_late_space_chips, size_t port_ch0); /*! * \brief This class implements a code DLL + carrier PLL VEML (Very Early * Minus Late) tracking block for Galileo E1 signals */ class Galileo_E1_Tcp_Connector_Tracking_cc: public gr::block { public: ~Galileo_E1_Tcp_Connector_Tracking_cc(); void set_channel(unsigned int channel); void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); void start_tracking(); int general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); void forecast (int noutput_items, gr_vector_int &ninput_items_required); private: friend galileo_e1_tcp_connector_tracking_cc_sptr galileo_e1_tcp_connector_make_tracking_cc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float early_late_space_chips, float very_early_late_space_chips, size_t port_ch0); Galileo_E1_Tcp_Connector_Tracking_cc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float early_late_space_chips, float very_early_late_space_chips, size_t port_ch0); void update_local_code(); void update_local_carrier(); // tracking configuration vars unsigned int d_vector_length; bool d_dump; Gnss_Synchro* d_acquisition_gnss_synchro; unsigned int d_channel; long d_if_freq; long d_fs_in; int d_correlation_length_samples; int d_n_correlator_taps; float d_early_late_spc_chips; float d_very_early_late_spc_chips; gr_complex* d_ca_code; gr_complex *d_Very_Early; gr_complex *d_Early; gr_complex *d_Prompt; gr_complex *d_Late; gr_complex *d_Very_Late; // remaining code phase and carrier phase between tracking loops double d_rem_code_phase_samples; float d_next_rem_code_phase_samples; float d_rem_carr_phase_rad; // acquisition float d_acq_code_phase_samples; float d_acq_carrier_doppler_hz; // correlator float* d_local_code_shift_chips; gr_complex* d_correlator_outs; cpu_multicorrelator multicorrelator_cpu; // tracking vars double d_code_freq_chips; float d_carrier_doppler_hz; float d_acc_carrier_phase_rad; float d_acc_code_phase_secs; float d_code_phase_samples; size_t d_port_ch0; size_t d_port; int d_listen_connection; float d_control_id; tcp_communication d_tcp_com; //PRN period in samples int d_current_prn_length_samples; int d_next_prn_length_samples; //processing samples counters unsigned long int d_sample_counter; unsigned long int d_acq_sample_stamp; // CN0 estimation and lock detector int d_cn0_estimation_counter; gr_complex* d_Prompt_buffer; float d_carrier_lock_test; float d_CN0_SNV_dB_Hz; float d_carrier_lock_threshold; int d_carrier_lock_fail_counter; // control vars bool d_enable_tracking; bool d_pull_in; // file dump std::string d_dump_filename; std::ofstream d_dump_file; std::map systemName; std::string sys; }; #endif //GNSS_SDR_GALILEO_E1_TCP_CONNECTOR_TRACKING_CC_H gnss-sdr-0.0.9/src/algorithms/tracking/gnuradio_blocks/galileo_e5a_dll_pll_tracking_cc.cc000066400000000000000000001032051305042567700317070ustar00rootroot00000000000000/*! * \file galileo_e5a_dll_pll_tracking_cc.h * \brief Implementation of a code DLL + carrier PLL * tracking block for Galileo E5a signals * \author Marc Sales, 2014. marcsales92(at)gmail.com * \based on work from: *
      *
    • Javier Arribas, 2011. jarribas(at)cttc.es *
    • Luis Esteve, 2012. luis(at)epsilon-formacion.com *
    * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_e5a_dll_pll_tracking_cc.h" #include #include #include #include #include #include #include #include "galileo_e5_signal_processing.h" #include "tracking_discriminators.h" #include "lock_detectors.h" #include "Galileo_E5a.h" #include "Galileo_E1.h" #include "control_message_factory.h" /*! * \todo Include in definition header file */ #define CN0_ESTIMATION_SAMPLES 20 #define MINIMUM_VALID_CN0 25 #define MAXIMUM_LOCK_FAIL_COUNTER 50 #define CARRIER_LOCK_THRESHOLD 0.85 using google::LogMessage; galileo_e5a_dll_pll_tracking_cc_sptr galileo_e5a_dll_pll_make_tracking_cc( long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float pll_bw_init_hz, float dll_bw_init_hz, int ti_ms, float early_late_space_chips) { return galileo_e5a_dll_pll_tracking_cc_sptr(new Galileo_E5a_Dll_Pll_Tracking_cc(if_freq, fs_in, vector_length, dump, dump_filename, pll_bw_hz, dll_bw_hz, pll_bw_init_hz, dll_bw_init_hz, ti_ms, early_late_space_chips)); } void Galileo_E5a_Dll_Pll_Tracking_cc::forecast (int noutput_items, gr_vector_int &ninput_items_required) { if (noutput_items != 0) { ninput_items_required[0] = static_cast(d_vector_length) * 2; //set the required available samples in each call } } Galileo_E5a_Dll_Pll_Tracking_cc::Galileo_E5a_Dll_Pll_Tracking_cc( long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float pll_bw_init_hz, float dll_bw_init_hz, int ti_ms, float early_late_space_chips) : gr::block("Galileo_E5a_Dll_Pll_Tracking_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { // Telemetry bit synchronization message port input this->message_port_register_in(pmt::mp("preamble_timestamp_s")); this->message_port_register_out(pmt::mp("events")); this->set_relative_rate(1.0 / vector_length); // initialize internal vars d_dump = dump; d_if_freq = if_freq; d_fs_in = fs_in; d_vector_length = vector_length; d_dump_filename = dump_filename; d_code_loop_filter = Tracking_2nd_DLL_filter(GALILEO_E5a_CODE_PERIOD); d_carrier_loop_filter = Tracking_2nd_PLL_filter(GALILEO_E5a_CODE_PERIOD); d_current_ti_ms = 1; // initializes with 1ms of integration time until secondary code lock d_ti_ms = ti_ms; d_dll_bw_hz = dll_bw_hz; d_pll_bw_hz = pll_bw_hz; d_dll_bw_init_hz = dll_bw_init_hz; d_pll_bw_init_hz = pll_bw_init_hz; // Initialize tracking ========================================== d_code_loop_filter.set_DLL_BW(d_dll_bw_init_hz); d_carrier_loop_filter.set_PLL_BW(d_pll_bw_init_hz); //--- DLL variables -------------------------------------------------------- d_early_late_spc_chips = early_late_space_chips; // Define early-late offset (in chips) // Initialization of local code replica // Get space for a vector with the E5a primary code replicas sampled 1x/chip d_codeQ = static_cast(volk_gnsssdr_malloc(Galileo_E5a_CODE_LENGTH_CHIPS * sizeof(gr_complex), volk_gnsssdr_get_alignment())); d_codeI = static_cast(volk_gnsssdr_malloc(Galileo_E5a_CODE_LENGTH_CHIPS * sizeof(gr_complex), volk_gnsssdr_get_alignment())); // correlator Q outputs (scalar) d_n_correlator_taps = 3; // Early, Prompt, Late d_correlator_outs = static_cast(volk_gnsssdr_malloc(d_n_correlator_taps*sizeof(gr_complex), volk_gnsssdr_get_alignment())); for (int n = 0; n < d_n_correlator_taps; n++) { d_correlator_outs[n] = gr_complex(0,0); } // map memory pointers of correlator outputs d_Single_Early = &d_correlator_outs[0]; d_Single_Prompt = &d_correlator_outs[1]; d_Single_Late = &d_correlator_outs[2]; d_local_code_shift_chips = static_cast(volk_gnsssdr_malloc(d_n_correlator_taps * sizeof(float), volk_gnsssdr_get_alignment())); // Set TAPs delay values [chips] d_local_code_shift_chips[0] = - d_early_late_spc_chips; d_local_code_shift_chips[1] = 0.0; d_local_code_shift_chips[2] = d_early_late_spc_chips; multicorrelator_cpu_Q.init(2 * d_vector_length, d_n_correlator_taps); // correlator I single output for data (scalar) d_Single_Prompt_data=static_cast(volk_gnsssdr_malloc(sizeof(gr_complex), volk_gnsssdr_get_alignment())); *d_Single_Prompt_data = gr_complex(0,0); multicorrelator_cpu_I.init(2 * d_vector_length, 1); // single correlator for data channel //--- Perform initializations ------------------------------ // define initial code frequency basis of NCO d_code_freq_chips = Galileo_E5a_CODE_CHIP_RATE_HZ; // define residual code phase (in chips) d_rem_code_phase_samples = 0.0; // define residual carrier phase d_rem_carr_phase_rad = 0.0; //Filter error vars d_code_error_filt_secs = 0.0; // sample synchronization d_sample_counter = 0; d_acq_sample_stamp = 0; d_first_transition = false; d_secondary_lock = false; d_secondary_delay = 0; d_integration_counter = 0; d_current_prn_length_samples = static_cast(d_vector_length); // CN0 estimation and lock detector buffers d_cn0_estimation_counter = 0; d_Prompt_buffer = new gr_complex[CN0_ESTIMATION_SAMPLES]; d_carrier_lock_test = 1; d_CN0_SNV_dB_Hz = 0; d_carrier_lock_fail_counter = 0; d_carrier_lock_threshold = CARRIER_LOCK_THRESHOLD; d_acquisition_gnss_synchro = 0; d_channel = 0; tmp_E = 0; tmp_P = 0; tmp_L = 0; d_acq_code_phase_samples = 0; d_acq_carrier_doppler_hz = 0; d_carrier_doppler_hz = 0; d_acc_carrier_phase_rad = 0; d_code_phase_samples = 0; d_acc_code_phase_secs = 0; d_state = 0; d_rem_code_phase_chips = 0.0; d_code_phase_step_chips = 0.0; d_carrier_phase_step_rad = 0.0; systemName["E"] = std::string("Galileo"); } Galileo_E5a_Dll_Pll_Tracking_cc::~Galileo_E5a_Dll_Pll_Tracking_cc () { d_dump_file.close(); delete[] d_codeI; delete[] d_codeQ; delete[] d_Prompt_buffer; d_dump_file.close(); volk_gnsssdr_free(d_local_code_shift_chips); volk_gnsssdr_free(d_correlator_outs); volk_gnsssdr_free(d_Single_Prompt_data); multicorrelator_cpu_Q.free(); multicorrelator_cpu_I.free(); } void Galileo_E5a_Dll_Pll_Tracking_cc::start_tracking() { /* * correct the code phase according to the delay between acq and trk */ d_acq_code_phase_samples = d_acquisition_gnss_synchro->Acq_delay_samples; d_acq_carrier_doppler_hz = d_acquisition_gnss_synchro->Acq_doppler_hz; d_acq_sample_stamp = d_acquisition_gnss_synchro->Acq_samplestamp_samples; long int acq_trk_diff_samples; double acq_trk_diff_seconds; acq_trk_diff_samples = static_cast(d_sample_counter) - static_cast(d_acq_sample_stamp);//-d_vector_length; LOG(INFO) << "Number of samples between Acquisition and Tracking =" << acq_trk_diff_samples; acq_trk_diff_seconds = static_cast(acq_trk_diff_samples) / static_cast(d_fs_in); //doppler effect // Fd=(C/(C+Vr))*F double radial_velocity; radial_velocity = (Galileo_E5a_FREQ_HZ + d_acq_carrier_doppler_hz)/Galileo_E5a_FREQ_HZ; // new chip and prn sequence periods based on acq Doppler double T_chip_mod_seconds; double T_prn_mod_seconds; double T_prn_mod_samples; d_code_freq_chips = radial_velocity * Galileo_E5a_CODE_CHIP_RATE_HZ; T_chip_mod_seconds = 1/d_code_freq_chips; T_prn_mod_seconds = T_chip_mod_seconds * Galileo_E5a_CODE_LENGTH_CHIPS; T_prn_mod_samples = T_prn_mod_seconds * static_cast(d_fs_in); d_current_prn_length_samples = round(T_prn_mod_samples); double T_prn_true_seconds = Galileo_E5a_CODE_LENGTH_CHIPS / Galileo_E5a_CODE_CHIP_RATE_HZ; double T_prn_true_samples = T_prn_true_seconds * static_cast(d_fs_in); double T_prn_diff_seconds; T_prn_diff_seconds = T_prn_true_seconds - T_prn_mod_seconds; double N_prn_diff; N_prn_diff = acq_trk_diff_seconds / T_prn_true_seconds; double corrected_acq_phase_samples, delay_correction_samples; corrected_acq_phase_samples = fmod((d_acq_code_phase_samples + T_prn_diff_seconds * N_prn_diff * static_cast(d_fs_in)), T_prn_true_samples); if (corrected_acq_phase_samples < 0) { corrected_acq_phase_samples = T_prn_mod_samples + corrected_acq_phase_samples; } delay_correction_samples = d_acq_code_phase_samples - corrected_acq_phase_samples; d_acq_code_phase_samples = corrected_acq_phase_samples; d_carrier_doppler_hz = d_acq_carrier_doppler_hz; // DLL/PLL filter initialization d_carrier_loop_filter.initialize(); // initialize the carrier filter d_code_loop_filter.initialize(); // initialize the code filter // generate local reference ALWAYS starting at chip 1 (1 sample per chip) char sig[3]; strcpy(sig,"5Q"); galileo_e5_a_code_gen_complex_primary(d_codeQ, d_acquisition_gnss_synchro->PRN, sig); strcpy(sig,"5I"); galileo_e5_a_code_gen_complex_primary(d_codeI, d_acquisition_gnss_synchro->PRN, sig); d_carrier_lock_fail_counter = 0; d_rem_code_phase_samples = 0; d_rem_carr_phase_rad = 0; d_acc_carrier_phase_rad = 0; d_acc_code_phase_secs = 0; d_code_phase_samples = d_acq_code_phase_samples; std::string sys_ = &d_acquisition_gnss_synchro->System; sys = sys_.substr(0,1); // DEBUG OUTPUT std::cout << "Tracking start on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << std::endl; LOG(INFO) << "Starting tracking of satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << " on channel " << d_channel; // enable tracking d_state = 1; LOG(INFO) << "PULL-IN Doppler [Hz]=" << d_carrier_doppler_hz << " Code Phase correction [samples]=" << delay_correction_samples << " PULL-IN Code Phase [samples]=" << d_acq_code_phase_samples; } void Galileo_E5a_Dll_Pll_Tracking_cc::acquire_secondary() { // 1. Transform replica to 1 and -1 int sec_code_signed[Galileo_E5a_Q_SECONDARY_CODE_LENGTH]; for (unsigned int i = 0; i < Galileo_E5a_Q_SECONDARY_CODE_LENGTH; i++) { if (Galileo_E5a_Q_SECONDARY_CODE[d_acquisition_gnss_synchro->PRN - 1].at(i) == '0') { sec_code_signed[i] = 1; } else { sec_code_signed[i] = -1; } } // 2. Transform buffer to 1 and -1 int in_corr[CN0_ESTIMATION_SAMPLES]; for (unsigned int i = 0; i < CN0_ESTIMATION_SAMPLES; i++) { if (d_Prompt_buffer[i].real() >0) { in_corr[i] = 1; } else { in_corr[i] = -1; } } // 3. Serial search int out_corr; int current_best_ = 0; for (unsigned int i = 0; i < Galileo_E5a_Q_SECONDARY_CODE_LENGTH; i++) { out_corr = 0; for (unsigned int j = 0; j < CN0_ESTIMATION_SAMPLES; j++) { //reverse replica sign since i*i=-1 (conjugated complex) out_corr += in_corr[j] * -sec_code_signed[(j + i) % Galileo_E5a_Q_SECONDARY_CODE_LENGTH]; } if (abs(out_corr) > current_best_) { current_best_ = abs(out_corr); d_secondary_delay = i; } } if (current_best_ == CN0_ESTIMATION_SAMPLES) // all bits correlate { d_secondary_lock = true; d_secondary_delay = (d_secondary_delay + CN0_ESTIMATION_SAMPLES - 1) % Galileo_E5a_Q_SECONDARY_CODE_LENGTH; } } int Galileo_E5a_Dll_Pll_Tracking_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) { // process vars double carr_error_hz; double carr_error_filt_hz; double code_error_chips; double code_error_filt_chips; // GNSS_SYNCHRO OBJECT to interchange data between tracking->telemetry_decoder Gnss_Synchro **out = (Gnss_Synchro **) &output_items[0]; //block output streams pointer // GNSS_SYNCHRO OBJECT to interchange data between tracking->telemetry_decoder Gnss_Synchro current_synchro_data; // Fill the acquisition data current_synchro_data = *d_acquisition_gnss_synchro; /* States: 0 Tracking not enabled * 1 Pull-in of primary code (alignment). * 3 Tracking algorithm. Correlates EPL each loop and accumulates the result * until it reaches integration time. */ switch (d_state) { case 0: { d_Early = gr_complex(0,0); d_Prompt = gr_complex(0,0); d_Late = gr_complex(0,0); d_Prompt_data = gr_complex(0,0); current_synchro_data.Tracking_timestamp_secs = static_cast(d_sample_counter) / static_cast(d_fs_in); *out[0] = current_synchro_data; break; } case 1: { int samples_offset; double acq_trk_shif_correction_samples; int acq_to_trk_delay_samples; acq_to_trk_delay_samples = d_sample_counter - d_acq_sample_stamp; acq_trk_shif_correction_samples = d_current_prn_length_samples - fmod(static_cast(acq_to_trk_delay_samples), static_cast(d_current_prn_length_samples)); samples_offset = round(d_acq_code_phase_samples + acq_trk_shif_correction_samples); d_sample_counter = d_sample_counter + samples_offset; //count for the processed samples DLOG(INFO) << " samples_offset=" << samples_offset; d_state = 2; // start in Ti = 1 code, until secondary code lock. // make an output to not stop the rest of the processing blocks current_synchro_data.Prompt_I = 0.0; current_synchro_data.Prompt_Q = 0.0; current_synchro_data.Tracking_timestamp_secs = static_cast(d_sample_counter) / static_cast(d_fs_in); current_synchro_data.Carrier_phase_rads = 0.0; current_synchro_data.CN0_dB_hz = 0.0; *out[0] = current_synchro_data; consume_each(samples_offset); //shift input to perform alignment with local replica return 1; break; } case 2: { // Block input data and block output stream pointers const gr_complex* in = (gr_complex*) input_items[0]; //PRN start block alignment gr_complex sec_sign_Q; gr_complex sec_sign_I; // Secondary code Chip if (d_secondary_lock) { // sec_sign_Q = gr_complex((Galileo_E5a_Q_SECONDARY_CODE[d_acquisition_gnss_synchro->PRN-1].at(d_secondary_delay)=='0' ? 1 : -1),0); // sec_sign_I = gr_complex((Galileo_E5a_I_SECONDARY_CODE.at(d_secondary_delay%Galileo_E5a_I_SECONDARY_CODE_LENGTH)=='0' ? 1 : -1),0); sec_sign_Q = gr_complex((Galileo_E5a_Q_SECONDARY_CODE[d_acquisition_gnss_synchro->PRN-1].at(d_secondary_delay) == '0' ? -1 : 1), 0); sec_sign_I = gr_complex((Galileo_E5a_I_SECONDARY_CODE.at(d_secondary_delay % Galileo_E5a_I_SECONDARY_CODE_LENGTH) == '0' ? -1 : 1), 0); } else { sec_sign_Q = gr_complex(1.0, 0.0); sec_sign_I = gr_complex(1.0, 0.0); } // Reset integration counter if (d_integration_counter == d_current_ti_ms) { d_integration_counter = 0; } //Generate local code and carrier replicas (using \hat{f}_d(k-1)) if (d_integration_counter == 0) { // Reset accumulated values d_Early = gr_complex(0,0); d_Prompt = gr_complex(0,0); d_Late = gr_complex(0,0); } // perform carrier wipe-off and compute Early, Prompt and Late // correlation of 1 primary code multicorrelator_cpu_Q.set_local_code_and_taps(Galileo_E5a_CODE_LENGTH_CHIPS, d_codeQ, d_local_code_shift_chips); multicorrelator_cpu_I.set_local_code_and_taps(Galileo_E5a_CODE_LENGTH_CHIPS, d_codeI, &d_local_code_shift_chips[1]); // ################# CARRIER WIPEOFF AND CORRELATORS ############################## // perform carrier wipe-off and compute Early, Prompt and Late correlation multicorrelator_cpu_Q.set_input_output_vectors(d_correlator_outs,in); multicorrelator_cpu_I.set_input_output_vectors(d_Single_Prompt_data,in); double carr_phase_step_rad = GALILEO_TWO_PI * d_carrier_doppler_hz / static_cast(d_fs_in); double code_phase_step_chips = d_code_freq_chips / (static_cast(d_fs_in)); double rem_code_phase_chips = d_rem_code_phase_samples * (d_code_freq_chips / d_fs_in); multicorrelator_cpu_Q.Carrier_wipeoff_multicorrelator_resampler( d_rem_carr_phase_rad, carr_phase_step_rad, rem_code_phase_chips, code_phase_step_chips, d_current_prn_length_samples); multicorrelator_cpu_I.Carrier_wipeoff_multicorrelator_resampler( d_rem_carr_phase_rad, carr_phase_step_rad, rem_code_phase_chips, code_phase_step_chips, d_current_prn_length_samples); // Accumulate results (coherent integration since there are no bit transitions in pilot signal) d_Early += (*d_Single_Early) * sec_sign_Q; d_Prompt += (*d_Single_Prompt) * sec_sign_Q; d_Late += (*d_Single_Late) * sec_sign_Q; d_Prompt_data=(*d_Single_Prompt_data); d_Prompt_data *= sec_sign_I; d_integration_counter++; // ################## PLL ########################################################## // PLL discriminator if (d_integration_counter == d_current_ti_ms) { if (d_secondary_lock == true) { carr_error_hz = pll_four_quadrant_atan(d_Prompt) / GALILEO_PI * 2.0; } else { carr_error_hz = pll_cloop_two_quadrant_atan(d_Prompt) / GALILEO_PI * 2.0; } // Carrier discriminator filter carr_error_filt_hz = d_carrier_loop_filter.get_carrier_nco(carr_error_hz); // New carrier Doppler frequency estimation d_carrier_doppler_hz = d_acq_carrier_doppler_hz + carr_error_filt_hz; // New code Doppler frequency estimation d_code_freq_chips = Galileo_E5a_CODE_CHIP_RATE_HZ + ((d_carrier_doppler_hz * Galileo_E5a_CODE_CHIP_RATE_HZ) / Galileo_E5a_FREQ_HZ); } //carrier phase accumulator for (K) doppler estimation d_acc_carrier_phase_rad -= 2.0 * GALILEO_PI * d_carrier_doppler_hz * GALILEO_E5a_CODE_PERIOD; //remanent carrier phase to prevent overflow in the code NCO d_rem_carr_phase_rad = d_rem_carr_phase_rad + 2.0 * GALILEO_PI * d_carrier_doppler_hz * GALILEO_E5a_CODE_PERIOD; d_rem_carr_phase_rad = fmod(d_rem_carr_phase_rad, 2.0 * GALILEO_PI); // ################## DLL ########################################################## if (d_integration_counter == d_current_ti_ms) { // DLL discriminator code_error_chips = dll_nc_e_minus_l_normalized(d_Early, d_Late); //[chips/Ti] // Code discriminator filter code_error_filt_chips = d_code_loop_filter.get_code_nco(code_error_chips); //[chips/second] //Code phase accumulator d_code_error_filt_secs = (GALILEO_E5a_CODE_PERIOD * code_error_filt_chips) / Galileo_E5a_CODE_CHIP_RATE_HZ; //[seconds] } d_acc_code_phase_secs = d_acc_code_phase_secs + d_code_error_filt_secs; // ################## CARRIER AND CODE NCO BUFFER ALIGNMENT ####################### // keep alignment parameters for the next input buffer double T_chip_seconds; double T_prn_seconds; double T_prn_samples; double K_blk_samples; // Compute the next buffer length based in the new period of the PRN sequence and the code phase error estimation T_chip_seconds = 1.0 / d_code_freq_chips; T_prn_seconds = T_chip_seconds * Galileo_E5a_CODE_LENGTH_CHIPS; T_prn_samples = T_prn_seconds * static_cast(d_fs_in); K_blk_samples = T_prn_samples + d_rem_code_phase_samples + d_code_error_filt_secs * static_cast(d_fs_in); d_current_prn_length_samples = round(K_blk_samples); //round to a discrete samples d_rem_code_phase_samples = K_blk_samples - d_current_prn_length_samples; //rounding error < 1 sample // ####### CN0 ESTIMATION AND LOCK DETECTORS ###### if (d_cn0_estimation_counter < CN0_ESTIMATION_SAMPLES-1) { // fill buffer with prompt correlator output values d_Prompt_buffer[d_cn0_estimation_counter] = d_Prompt; d_cn0_estimation_counter++; } else { d_Prompt_buffer[d_cn0_estimation_counter] = d_Prompt; // ATTEMPT SECONDARY CODE ACQUISITION if (d_secondary_lock == false) { acquire_secondary(); // changes d_secondary_lock and d_secondary_delay if (d_secondary_lock == true) { std::cout << "Secondary code locked." << std::endl; d_current_ti_ms = d_ti_ms; // Change loop parameters ========================================== d_code_loop_filter.set_pdi(d_current_ti_ms * GALILEO_E5a_CODE_PERIOD); d_carrier_loop_filter.set_pdi(d_current_ti_ms * GALILEO_E5a_CODE_PERIOD); d_code_loop_filter.set_DLL_BW(d_dll_bw_hz); d_carrier_loop_filter.set_PLL_BW(d_pll_bw_hz); } else { std::cout << "Secondary code delay couldn't be resolved." << std::endl; d_carrier_lock_fail_counter++; if (d_carrier_lock_fail_counter > MAXIMUM_LOCK_FAIL_COUNTER) { std::cout << "Loss of lock in channel " << d_channel << "!" << std::endl; LOG(INFO) << "Loss of lock in channel " << d_channel << "!"; this->message_port_pub(pmt::mp("events"), pmt::from_long(3));//3 -> loss of lock d_carrier_lock_fail_counter = 0; d_state = 0; // TODO: check if disabling tracking is consistent with the channel state machine } } } else // Secondary lock achieved, monitor carrier lock. { // Code lock indicator d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES, d_fs_in,d_current_ti_ms * Galileo_E5a_CODE_LENGTH_CHIPS); // Carrier lock indicator d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES); // Loss of lock detection if (d_carrier_lock_test < d_carrier_lock_threshold or d_CN0_SNV_dB_Hz < MINIMUM_VALID_CN0) { d_carrier_lock_fail_counter++; } else { if (d_carrier_lock_fail_counter > 0) d_carrier_lock_fail_counter--; if (d_carrier_lock_fail_counter > MAXIMUM_LOCK_FAIL_COUNTER) { std::cout << "Loss of lock in channel " << d_channel << "!" << std::endl; LOG(INFO) << "Loss of lock in channel " << d_channel << "!"; this->message_port_pub(pmt::mp("events"), pmt::from_long(3));//3 -> loss of lock d_carrier_lock_fail_counter = 0; d_state = 0; } } } d_cn0_estimation_counter = 0; } if (d_secondary_lock && (d_secondary_delay % Galileo_E5a_I_SECONDARY_CODE_LENGTH) == 0) { d_first_transition = true; } // ########### Output the tracking data to navigation and PVT ########## // The first Prompt output not equal to 0 is synchronized with the transition of a navigation data bit. if (d_secondary_lock && d_first_transition) { current_synchro_data.Prompt_I = static_cast((d_Prompt_data).real()); current_synchro_data.Prompt_Q = static_cast((d_Prompt_data).imag()); // Tracking_timestamp_secs is aligned with the PRN start sample current_synchro_data.Tracking_timestamp_secs = (static_cast(d_sample_counter) + static_cast(d_current_prn_length_samples) + static_cast(d_rem_code_phase_samples)) / static_cast(d_fs_in); // This tracking block aligns the Tracking_timestamp_secs with the start sample of the PRN, thus, Code_phase_secs=0 current_synchro_data.Carrier_phase_rads = d_acc_carrier_phase_rad; current_synchro_data.Carrier_Doppler_hz = d_carrier_doppler_hz; current_synchro_data.CN0_dB_hz = d_CN0_SNV_dB_Hz; } else { // make an output to not stop the rest of the processing blocks current_synchro_data.Prompt_I = 0.0; current_synchro_data.Prompt_Q = 0.0; current_synchro_data.Tracking_timestamp_secs = static_cast(d_sample_counter) / static_cast(d_fs_in); current_synchro_data.Carrier_phase_rads = 0.0; current_synchro_data.CN0_dB_hz = 0.0; } *out[0] = current_synchro_data; break; } } if(d_dump) { // MULTIPLEXED FILE RECORDING - Record results to file float prompt_I; float prompt_Q; double tmp_double; prompt_I = (d_Prompt_data).real(); prompt_Q = (d_Prompt_data).imag(); if (d_integration_counter == d_current_ti_ms) { tmp_E = std::abs(d_Early); tmp_P = std::abs(d_Prompt); tmp_L = std::abs(d_Late); } try { // EPR d_dump_file.write(reinterpret_cast(&tmp_E), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_P), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_L), sizeof(float)); // PROMPT I and Q (to analyze navigation symbols) d_dump_file.write(reinterpret_cast(&prompt_I), sizeof(float)); d_dump_file.write(reinterpret_cast(&prompt_Q), sizeof(float)); // PRN start sample stamp //tmp_float=(float)d_sample_counter; d_dump_file.write(reinterpret_cast(&d_sample_counter), sizeof(unsigned long int)); // accumulated carrier phase d_dump_file.write(reinterpret_cast(&d_acc_carrier_phase_rad), sizeof(double)); // carrier and code frequency d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); d_dump_file.write(reinterpret_cast(&d_code_freq_chips), sizeof(double)); //PLL commands d_dump_file.write(reinterpret_cast(&carr_error_hz), sizeof(double)); d_dump_file.write(reinterpret_cast(&carr_error_filt_hz), sizeof(double)); //DLL commands d_dump_file.write(reinterpret_cast(&code_error_chips), sizeof(double)); d_dump_file.write(reinterpret_cast(&code_error_filt_chips), sizeof(double)); // CN0 and carrier lock test d_dump_file.write(reinterpret_cast(&d_CN0_SNV_dB_Hz), sizeof(double)); d_dump_file.write(reinterpret_cast(&d_carrier_lock_test), sizeof(double)); // AUX vars (for debug purposes) tmp_double = d_rem_code_phase_samples; d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); tmp_double = static_cast(d_sample_counter + d_current_prn_length_samples); d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); } catch (const std::ifstream::failure & e) { LOG(WARNING) << "Exception writing trk dump file " << e.what(); } } d_secondary_delay = (d_secondary_delay + 1) % Galileo_E5a_Q_SECONDARY_CODE_LENGTH; d_sample_counter += d_current_prn_length_samples; //count for the processed samples consume_each(d_current_prn_length_samples); // this is necessary in gr::block derivates return 1; //output tracking result ALWAYS even in the case of d_enable_tracking==false } void Galileo_E5a_Dll_Pll_Tracking_cc::set_channel(unsigned int channel) { d_channel = channel; LOG(INFO) << "Tracking Channel set to " << d_channel; // ############# ENABLE DATA FILE LOG ################# if (d_dump == true) { if (d_dump_file.is_open() == false) { try { d_dump_filename.append(boost::lexical_cast(d_channel)); d_dump_filename.append(".dat"); d_dump_file.exceptions (std::ifstream::failbit | std::ifstream::badbit); d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); LOG(INFO) << "Tracking dump enabled on channel " << d_channel << " Log file: " << d_dump_filename.c_str() << std::endl; } catch (const std::ifstream::failure &e) { LOG(WARNING) << "channel " << d_channel << " Exception opening trk dump file " << e.what() << std::endl; } } } } void Galileo_E5a_Dll_Pll_Tracking_cc::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { d_acquisition_gnss_synchro = p_gnss_synchro; } gnss-sdr-0.0.9/src/algorithms/tracking/gnuradio_blocks/galileo_e5a_dll_pll_tracking_cc.h000066400000000000000000000142771305042567700315630ustar00rootroot00000000000000/*! * \file galileo_e5a_dll_pll_tracking_cc.h * \brief Implementation of a code DLL + carrier PLL * tracking block for Galileo E5a signals * \author Marc Sales, 2014. marcsales92(at)gmail.com * \based on work from: *
      *
    • Javier Arribas, 2011. jarribas(at)cttc.es *
    • Luis Esteve, 2012. luis(at)epsilon-formacion.com *
    * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_E5A_DLL_PLL_TRACKING_CC_H_ #define GNSS_SDR_GALILEO_E5A_DLL_PLL_TRACKING_CC_H_ #include #include #include #include #include "gnss_synchro.h" #include "tracking_2nd_DLL_filter.h" #include "tracking_2nd_PLL_filter.h" #include "cpu_multicorrelator.h" class Galileo_E5a_Dll_Pll_Tracking_cc; typedef boost::shared_ptr galileo_e5a_dll_pll_tracking_cc_sptr; galileo_e5a_dll_pll_tracking_cc_sptr galileo_e5a_dll_pll_make_tracking_cc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float pll_bw_init_hz, float dll_bw_init_hz, int ti_ms, float early_late_space_chips); /*! * \brief This class implements a DLL + PLL tracking loop block */ class Galileo_E5a_Dll_Pll_Tracking_cc: public gr::block { public: ~Galileo_E5a_Dll_Pll_Tracking_cc(); void set_channel(unsigned int channel); void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); void start_tracking(); int general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); void forecast (int noutput_items, gr_vector_int &ninput_items_required); private: friend galileo_e5a_dll_pll_tracking_cc_sptr galileo_e5a_dll_pll_make_tracking_cc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float pll_bw_init_hz, float dll_bw_init_hz, int ti_ms, float early_late_space_chips); Galileo_E5a_Dll_Pll_Tracking_cc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float pll_bw_init_hz, float dll_bw_init_hz, int ti_ms, float early_late_space_chips); void acquire_secondary(); // tracking configuration vars unsigned int d_vector_length; int d_current_ti_ms; int d_ti_ms; bool d_dump; Gnss_Synchro* d_acquisition_gnss_synchro; unsigned int d_channel; long d_if_freq; long d_fs_in; double d_early_late_spc_chips; double d_dll_bw_hz; double d_pll_bw_hz; double d_dll_bw_init_hz; double d_pll_bw_init_hz; gr_complex* d_codeQ; gr_complex* d_codeI; gr_complex d_Early; gr_complex d_Prompt; gr_complex d_Late; gr_complex d_Prompt_data; gr_complex* d_Single_Early; gr_complex* d_Single_Prompt; gr_complex* d_Single_Late; gr_complex* d_Single_Prompt_data; float tmp_E; float tmp_P; float tmp_L; // remaining code phase and carrier phase between tracking loops double d_rem_code_phase_samples; double d_rem_code_phase_chips; double d_rem_carr_phase_rad; // PLL and DLL filter library Tracking_2nd_DLL_filter d_code_loop_filter; Tracking_2nd_PLL_filter d_carrier_loop_filter; // acquisition double d_acq_code_phase_samples; double d_acq_carrier_doppler_hz; // correlator int d_n_correlator_taps; float* d_local_code_shift_chips; gr_complex* d_correlator_outs; cpu_multicorrelator multicorrelator_cpu_I; cpu_multicorrelator multicorrelator_cpu_Q; // tracking vars double d_code_freq_chips; double d_carrier_doppler_hz; double d_acc_carrier_phase_rad; double d_code_phase_samples; double d_acc_code_phase_secs; double d_code_error_filt_secs; double d_code_phase_step_chips; double d_carrier_phase_step_rad; //PRN period in samples int d_current_prn_length_samples; //processing samples counters unsigned long int d_sample_counter; unsigned long int d_acq_sample_stamp; // CN0 estimation and lock detector int d_cn0_estimation_counter; gr_complex* d_Prompt_buffer; double d_carrier_lock_test; double d_CN0_SNV_dB_Hz; double d_carrier_lock_threshold; int d_carrier_lock_fail_counter; // control vars int d_state; bool d_first_transition; // Secondary code acquisition bool d_secondary_lock; int d_secondary_delay; int d_integration_counter; // file dump std::string d_dump_filename; std::ofstream d_dump_file; std::map systemName; std::string sys; }; #endif /* GNSS_SDR_GALILEO_E5A_DLL_PLL_TRACKING_CC_H_ */ gnss-sdr-0.0.9/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc000066400000000000000000001056171305042567700325210ustar00rootroot00000000000000/*! * \file gps_l1_ca_dll_pll_c_aid_tracking_cc.cc * \brief Implementation of a code DLL + carrier PLL tracking block * \author Javier Arribas, 2015. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l1_ca_dll_pll_c_aid_tracking_cc.h" #include #include #include #include #include #include #include #include #include #include #include "gps_sdr_signal_processing.h" #include "tracking_discriminators.h" #include "lock_detectors.h" #include "GPS_L1_CA.h" #include "control_message_factory.h" /*! * \todo Include in definition header file */ #define CN0_ESTIMATION_SAMPLES 20 #define MINIMUM_VALID_CN0 25 #define MAXIMUM_LOCK_FAIL_COUNTER 50 #define CARRIER_LOCK_THRESHOLD 0.85 using google::LogMessage; gps_l1_ca_dll_pll_c_aid_tracking_cc_sptr gps_l1_ca_dll_pll_c_aid_make_tracking_cc( long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float pll_bw_narrow_hz, float dll_bw_narrow_hz, int extend_correlation_ms, float early_late_space_chips) { return gps_l1_ca_dll_pll_c_aid_tracking_cc_sptr(new gps_l1_ca_dll_pll_c_aid_tracking_cc(if_freq, fs_in, vector_length, dump, dump_filename, pll_bw_hz, dll_bw_hz,pll_bw_narrow_hz, dll_bw_narrow_hz, extend_correlation_ms, early_late_space_chips)); } void gps_l1_ca_dll_pll_c_aid_tracking_cc::forecast (int noutput_items, gr_vector_int &ninput_items_required) { if (noutput_items != 0) { ninput_items_required[0] = static_cast(d_vector_length) * 2; //set the required available samples in each call } } void gps_l1_ca_dll_pll_c_aid_tracking_cc::msg_handler_preamble_index(pmt::pmt_t msg) { //pmt::print(msg); DLOG(INFO) << "Extended correlation enabled for Tracking CH " << d_channel << ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN); if (d_enable_extended_integration == false) //avoid re-setting preamble indicator { d_preamble_timestamp_s = pmt::to_double(msg); d_enable_extended_integration = true; d_preamble_synchronized = false; } } gps_l1_ca_dll_pll_c_aid_tracking_cc::gps_l1_ca_dll_pll_c_aid_tracking_cc( long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float pll_bw_narrow_hz, float dll_bw_narrow_hz, int extend_correlation_ms, float early_late_space_chips) : gr::block("gps_l1_ca_dll_pll_c_aid_tracking_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { // Telemetry bit synchronization message port input this->message_port_register_in(pmt::mp("preamble_timestamp_s")); this->set_msg_handler(pmt::mp("preamble_timestamp_s"), boost::bind(&gps_l1_ca_dll_pll_c_aid_tracking_cc::msg_handler_preamble_index, this, _1)); this->message_port_register_out(pmt::mp("events")); // initialize internal vars d_dump = dump; d_if_freq = if_freq; d_fs_in = fs_in; d_vector_length = vector_length; d_dump_filename = dump_filename; d_correlation_length_samples = static_cast(d_vector_length); // Initialize tracking ========================================== d_pll_bw_hz = pll_bw_hz; d_dll_bw_hz = dll_bw_hz; d_pll_bw_narrow_hz = pll_bw_narrow_hz; d_dll_bw_narrow_hz = dll_bw_narrow_hz; d_extend_correlation_ms = extend_correlation_ms; d_code_loop_filter.set_DLL_BW(d_dll_bw_hz); d_carrier_loop_filter.set_params(10.0, d_pll_bw_hz, 2); // --- DLL variables -------------------------------------------------------- d_early_late_spc_chips = early_late_space_chips; // Define early-late offset (in chips) // Initialization of local code replica // Get space for a vector with the C/A code replica sampled 1x/chip d_ca_code = static_cast(volk_gnsssdr_malloc(static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS) * sizeof(gr_complex), volk_gnsssdr_get_alignment())); // correlator outputs (scalar) d_n_correlator_taps = 3; // Early, Prompt, and Late d_correlator_outs = static_cast(volk_gnsssdr_malloc(d_n_correlator_taps*sizeof(gr_complex), volk_gnsssdr_get_alignment())); for (int n = 0; n < d_n_correlator_taps; n++) { d_correlator_outs[n] = gr_complex(0,0); } d_local_code_shift_chips = static_cast(volk_gnsssdr_malloc(d_n_correlator_taps*sizeof(float), volk_gnsssdr_get_alignment())); // Set TAPs delay values [chips] d_local_code_shift_chips[0] = - d_early_late_spc_chips; d_local_code_shift_chips[1] = 0.0; d_local_code_shift_chips[2] = d_early_late_spc_chips; multicorrelator_cpu.init(2 * d_correlation_length_samples, d_n_correlator_taps); //--- Perform initializations ------------------------------ // define initial code frequency basis of NCO d_code_freq_chips = GPS_L1_CA_CODE_RATE_HZ; // define residual code phase (in chips) d_rem_code_phase_samples = 0.0; // define residual carrier phase d_rem_carrier_phase_rad = 0.0; // sample synchronization d_sample_counter = 0; //(from trk to tlm) d_acq_sample_stamp = 0; d_enable_tracking = false; d_pull_in = false; // CN0 estimation and lock detector buffers d_cn0_estimation_counter = 0; d_Prompt_buffer = new gr_complex[CN0_ESTIMATION_SAMPLES]; d_carrier_lock_test = 1; d_CN0_SNV_dB_Hz = 0; d_carrier_lock_fail_counter = 0; d_carrier_lock_threshold = CARRIER_LOCK_THRESHOLD; systemName["G"] = std::string("GPS"); systemName["S"] = std::string("SBAS"); set_relative_rate(1.0 / static_cast(d_vector_length)); d_acquisition_gnss_synchro = 0; d_channel = 0; d_acq_code_phase_samples = 0.0; d_acq_carrier_doppler_hz = 0.0; d_carrier_doppler_hz = 0.0; d_code_error_filt_chips_Ti = 0.0; d_acc_carrier_phase_cycles = 0.0; d_code_phase_samples = 0.0; d_pll_to_dll_assist_secs_Ti = 0.0; d_rem_code_phase_chips = 0.0; d_code_phase_step_chips = 0.0; d_carrier_phase_step_rad = 0.0; d_enable_extended_integration = false; d_preamble_synchronized = false; d_rem_code_phase_integer_samples = 0; d_code_error_chips_Ti = 0.0; d_code_error_filt_chips_s = 0.0; d_carr_phase_error_secs_Ti = 0.0; d_preamble_timestamp_s = 0.0; //set_min_output_buffer((long int)300); } void gps_l1_ca_dll_pll_c_aid_tracking_cc::start_tracking() { /* * correct the code phase according to the delay between acq and trk */ d_acq_code_phase_samples = d_acquisition_gnss_synchro->Acq_delay_samples; d_acq_carrier_doppler_hz = d_acquisition_gnss_synchro->Acq_doppler_hz; d_acq_sample_stamp = d_acquisition_gnss_synchro->Acq_samplestamp_samples; long int acq_trk_diff_samples; double acq_trk_diff_seconds; acq_trk_diff_samples = static_cast(d_sample_counter) - static_cast(d_acq_sample_stamp);//-d_vector_length; DLOG(INFO) << "Number of samples between Acquisition and Tracking =" << acq_trk_diff_samples; acq_trk_diff_seconds = static_cast(acq_trk_diff_samples) / static_cast(d_fs_in); // Doppler effect // Fd=(C/(C+Vr))*F double radial_velocity = (GPS_L1_FREQ_HZ + d_acq_carrier_doppler_hz) / GPS_L1_FREQ_HZ; // new chip and prn sequence periods based on acq Doppler double T_chip_mod_seconds; double T_prn_mod_seconds; double T_prn_mod_samples; d_code_freq_chips = radial_velocity * GPS_L1_CA_CODE_RATE_HZ; d_code_phase_step_chips = static_cast(d_code_freq_chips) / static_cast(d_fs_in); T_chip_mod_seconds = 1.0 / d_code_freq_chips; T_prn_mod_seconds = T_chip_mod_seconds * GPS_L1_CA_CODE_LENGTH_CHIPS; T_prn_mod_samples = T_prn_mod_seconds * static_cast(d_fs_in); d_correlation_length_samples = round(T_prn_mod_samples); double T_prn_true_seconds = GPS_L1_CA_CODE_LENGTH_CHIPS / GPS_L1_CA_CODE_RATE_HZ; double T_prn_true_samples = T_prn_true_seconds * static_cast(d_fs_in); double T_prn_diff_seconds = T_prn_true_seconds - T_prn_mod_seconds; double N_prn_diff = acq_trk_diff_seconds / T_prn_true_seconds; double corrected_acq_phase_samples, delay_correction_samples; corrected_acq_phase_samples = fmod((d_acq_code_phase_samples + T_prn_diff_seconds * N_prn_diff * static_cast(d_fs_in)), T_prn_true_samples); if (corrected_acq_phase_samples < 0) { corrected_acq_phase_samples = T_prn_mod_samples + corrected_acq_phase_samples; } delay_correction_samples = d_acq_code_phase_samples - corrected_acq_phase_samples; d_acq_code_phase_samples = corrected_acq_phase_samples; d_carrier_doppler_hz = d_acq_carrier_doppler_hz; d_carrier_phase_step_rad = GPS_TWO_PI * d_carrier_doppler_hz / static_cast(d_fs_in); // DLL/PLL filter initialization d_carrier_loop_filter.initialize(d_acq_carrier_doppler_hz); // The carrier loop filter implements the Doppler accumulator d_code_loop_filter.initialize(); // initialize the code filter // generate local reference ALWAYS starting at chip 1 (1 sample per chip) gps_l1_ca_code_gen_complex(d_ca_code, d_acquisition_gnss_synchro->PRN, 0); multicorrelator_cpu.set_local_code_and_taps(static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS), d_ca_code, d_local_code_shift_chips); for (int n = 0; n < d_n_correlator_taps; n++) { d_correlator_outs[n] = gr_complex(0,0); } d_carrier_lock_fail_counter = 0; d_rem_code_phase_samples = 0.0; d_rem_carrier_phase_rad = 0.0; d_rem_code_phase_chips = 0.0; d_acc_carrier_phase_cycles = 0.0; d_pll_to_dll_assist_secs_Ti = 0.0; d_code_phase_samples = d_acq_code_phase_samples; std::string sys_ = &d_acquisition_gnss_synchro->System; sys = sys_.substr(0,1); // DEBUG OUTPUT std::cout << "Tracking start on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << std::endl; LOG(INFO) << "Starting tracking of satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << " on channel " << d_channel; // enable tracking d_pull_in = true; d_enable_tracking = true; d_enable_extended_integration = false; d_preamble_synchronized = false; LOG(INFO) << "PULL-IN Doppler [Hz]=" << d_carrier_doppler_hz << " Code Phase correction [samples]=" << delay_correction_samples << " PULL-IN Code Phase [samples]=" << d_acq_code_phase_samples; } gps_l1_ca_dll_pll_c_aid_tracking_cc::~gps_l1_ca_dll_pll_c_aid_tracking_cc() { d_dump_file.close(); volk_gnsssdr_free(d_local_code_shift_chips); volk_gnsssdr_free(d_correlator_outs); volk_gnsssdr_free(d_ca_code); delete[] d_Prompt_buffer; multicorrelator_cpu.free(); } int gps_l1_ca_dll_pll_c_aid_tracking_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) { // Block input data and block output stream pointers const gr_complex* in = (gr_complex*) input_items[0]; //PRN start block alignment Gnss_Synchro **out = (Gnss_Synchro **) &output_items[0]; // GNSS_SYNCHRO OBJECT to interchange data between tracking->telemetry_decoder Gnss_Synchro current_synchro_data = Gnss_Synchro(); // process vars double code_error_filt_secs_Ti = 0.0; double CURRENT_INTEGRATION_TIME_S = 0.0; double CORRECTED_INTEGRATION_TIME_S = 0.0; if (d_enable_tracking == true) { // Fill the acquisition data current_synchro_data = *d_acquisition_gnss_synchro; // Receiver signal alignment if (d_pull_in == true) { int samples_offset; double acq_trk_shif_correction_samples; int acq_to_trk_delay_samples; acq_to_trk_delay_samples = d_sample_counter - d_acq_sample_stamp; acq_trk_shif_correction_samples = d_correlation_length_samples - fmod(static_cast(acq_to_trk_delay_samples), static_cast(d_correlation_length_samples)); samples_offset = round(d_acq_code_phase_samples + acq_trk_shif_correction_samples); current_synchro_data.Tracking_timestamp_secs = (static_cast(d_sample_counter) + static_cast(d_rem_code_phase_samples)) / static_cast(d_fs_in); d_sample_counter += samples_offset; // count for the processed samples d_pull_in = false; d_acc_carrier_phase_cycles -= d_carrier_phase_step_rad * samples_offset / GPS_TWO_PI; current_synchro_data.Carrier_phase_rads = d_acc_carrier_phase_cycles * GPS_TWO_PI; current_synchro_data.Carrier_Doppler_hz = d_carrier_doppler_hz; *out[0] = current_synchro_data; consume_each(samples_offset); // shift input to perform alignment with local replica return 1; } // ################# CARRIER WIPEOFF AND CORRELATORS ############################## // perform carrier wipe-off and compute Early, Prompt and Late correlation multicorrelator_cpu.set_input_output_vectors(d_correlator_outs,in); multicorrelator_cpu.Carrier_wipeoff_multicorrelator_resampler(d_rem_carrier_phase_rad, d_carrier_phase_step_rad, d_rem_code_phase_chips, d_code_phase_step_chips, d_correlation_length_samples); // ####### coherent intergration extension // keep the last symbols d_E_history.push_back(d_correlator_outs[0]); // save early output d_P_history.push_back(d_correlator_outs[1]); // save prompt output d_L_history.push_back(d_correlator_outs[2]); // save late output if (static_cast(d_P_history.size()) > d_extend_correlation_ms) { d_E_history.pop_front(); d_P_history.pop_front(); d_L_history.pop_front(); } bool enable_dll_pll; if (d_enable_extended_integration == true) { long int symbol_diff = round(1000.0 * ((static_cast(d_sample_counter) + d_rem_code_phase_samples) / static_cast(d_fs_in) - d_preamble_timestamp_s)); if (symbol_diff > 0 and symbol_diff % d_extend_correlation_ms == 0) { // compute coherent integration and enable tracking loop // perform coherent integration using correlator output history // std::cout<<"##### RESET COHERENT INTEGRATION ####"<PRN) << " pll_bw = " << d_pll_bw_hz << " [Hz], pll_narrow_bw = " << d_pll_bw_narrow_hz << " [Hz]" << std::endl << " dll_bw = " << d_dll_bw_hz << " [Hz], dll_narrow_bw = " << d_dll_bw_narrow_hz << " [Hz]" << std::endl; } // UPDATE INTEGRATION TIME CURRENT_INTEGRATION_TIME_S = static_cast(d_extend_correlation_ms) * GPS_L1_CA_CODE_PERIOD; enable_dll_pll = true; } else { if(d_preamble_synchronized == true) { // continue extended coherent correlation // Compute the next buffer length based on the period of the PRN sequence and the code phase error estimation double T_chip_seconds = 1.0 / d_code_freq_chips; double T_prn_seconds = T_chip_seconds * GPS_L1_CA_CODE_LENGTH_CHIPS; double T_prn_samples = T_prn_seconds * static_cast(d_fs_in); int K_prn_samples = round(T_prn_samples); double K_T_prn_error_samples = K_prn_samples - T_prn_samples; d_rem_code_phase_samples = d_rem_code_phase_samples - K_T_prn_error_samples; d_rem_code_phase_integer_samples = round(d_rem_code_phase_samples); // round to a discrete number of samples d_correlation_length_samples = K_prn_samples + d_rem_code_phase_integer_samples; d_rem_code_phase_samples = d_rem_code_phase_samples - d_rem_code_phase_integer_samples; // code phase step (Code resampler phase increment per sample) [chips/sample] d_code_phase_step_chips = d_code_freq_chips / static_cast(d_fs_in); // remnant code phase [chips] d_rem_code_phase_chips = d_rem_code_phase_samples * (d_code_freq_chips / static_cast(d_fs_in)); d_rem_carrier_phase_rad = fmod(d_rem_carrier_phase_rad + d_carrier_phase_step_rad * static_cast(d_correlation_length_samples), GPS_TWO_PI); // UPDATE ACCUMULATED CARRIER PHASE CORRECTED_INTEGRATION_TIME_S = (static_cast(d_correlation_length_samples) / static_cast(d_fs_in)); d_acc_carrier_phase_cycles -= d_carrier_phase_step_rad * d_correlation_length_samples / GPS_TWO_PI; // disable tracking loop and inform telemetry decoder enable_dll_pll = false; } else { // perform basic (1ms) correlation // UPDATE INTEGRATION TIME CURRENT_INTEGRATION_TIME_S = static_cast(d_correlation_length_samples) / static_cast(d_fs_in); enable_dll_pll = true; } } } else { // UPDATE INTEGRATION TIME CURRENT_INTEGRATION_TIME_S = static_cast(d_correlation_length_samples) / static_cast(d_fs_in); enable_dll_pll = true; } if (enable_dll_pll == true) { // ################## PLL ########################################################## // Update PLL discriminator [rads/Ti -> Secs/Ti] d_carr_phase_error_secs_Ti = pll_cloop_two_quadrant_atan(d_correlator_outs[1]) / GPS_TWO_PI; // prompt output // Carrier discriminator filter // NOTICE: The carrier loop filter includes the Carrier Doppler accumulator, as described in Kaplan // Input [s/Ti] -> output [Hz] d_carrier_doppler_hz = d_carrier_loop_filter.get_carrier_error(0.0, d_carr_phase_error_secs_Ti, CURRENT_INTEGRATION_TIME_S); // PLL to DLL assistance [Secs/Ti] d_pll_to_dll_assist_secs_Ti = (d_carrier_doppler_hz * CURRENT_INTEGRATION_TIME_S) / GPS_L1_FREQ_HZ; // code Doppler frequency update d_code_freq_chips = GPS_L1_CA_CODE_RATE_HZ + ((d_carrier_doppler_hz * GPS_L1_CA_CODE_RATE_HZ) / GPS_L1_FREQ_HZ); // ################## DLL ########################################################## // DLL discriminator d_code_error_chips_Ti = dll_nc_e_minus_l_normalized(d_correlator_outs[0], d_correlator_outs[2]); // [chips/Ti] //early and late // Code discriminator filter d_code_error_filt_chips_s = d_code_loop_filter.get_code_nco(d_code_error_chips_Ti); // input [chips/Ti] -> output [chips/second] d_code_error_filt_chips_Ti = d_code_error_filt_chips_s * CURRENT_INTEGRATION_TIME_S; code_error_filt_secs_Ti = d_code_error_filt_chips_Ti / d_code_freq_chips; // [s/Ti] // ################## CARRIER AND CODE NCO BUFFER ALIGNEMENT ####################### // keep alignment parameters for the next input buffer // Compute the next buffer length based in the new period of the PRN sequence and the code phase error estimation double T_chip_seconds = 1.0 / d_code_freq_chips; double T_prn_seconds = T_chip_seconds * GPS_L1_CA_CODE_LENGTH_CHIPS; double T_prn_samples = T_prn_seconds * static_cast(d_fs_in); double K_prn_samples = round(T_prn_samples); double K_T_prn_error_samples = K_prn_samples - T_prn_samples; d_rem_code_phase_samples = d_rem_code_phase_samples - K_T_prn_error_samples + code_error_filt_secs_Ti * static_cast(d_fs_in); //(code_error_filt_secs_Ti + d_pll_to_dll_assist_secs_Ti) * static_cast(d_fs_in); d_rem_code_phase_integer_samples = round(d_rem_code_phase_samples); // round to a discrete number of samples d_correlation_length_samples = K_prn_samples + d_rem_code_phase_integer_samples; d_rem_code_phase_samples = d_rem_code_phase_samples - d_rem_code_phase_integer_samples; //################### PLL COMMANDS ################################################# //carrier phase step (NCO phase increment per sample) [rads/sample] d_carrier_phase_step_rad = GPS_TWO_PI * d_carrier_doppler_hz / static_cast(d_fs_in); d_acc_carrier_phase_cycles -= d_carrier_phase_step_rad * d_correlation_length_samples / GPS_TWO_PI; // UPDATE ACCUMULATED CARRIER PHASE CORRECTED_INTEGRATION_TIME_S = (static_cast(d_correlation_length_samples) / static_cast(d_fs_in)); //remnant carrier phase [rad] d_rem_carrier_phase_rad = fmod(d_rem_carrier_phase_rad + GPS_TWO_PI * d_carrier_doppler_hz * CORRECTED_INTEGRATION_TIME_S, GPS_TWO_PI); //################### DLL COMMANDS ################################################# //code phase step (Code resampler phase increment per sample) [chips/sample] d_code_phase_step_chips = d_code_freq_chips / static_cast(d_fs_in); //remnant code phase [chips] d_rem_code_phase_chips = d_rem_code_phase_samples * (d_code_freq_chips / static_cast(d_fs_in)); // ####### CN0 ESTIMATION AND LOCK DETECTORS ####################################### if (d_cn0_estimation_counter < CN0_ESTIMATION_SAMPLES) { // fill buffer with prompt correlator output values d_Prompt_buffer[d_cn0_estimation_counter] = d_correlator_outs[1]; // prompt d_cn0_estimation_counter++; } else { d_cn0_estimation_counter = 0; // Code lock indicator d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES, d_fs_in, GPS_L1_CA_CODE_LENGTH_CHIPS); // Carrier lock indicator d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES); // Loss of lock detection if (d_carrier_lock_test < d_carrier_lock_threshold or d_CN0_SNV_dB_Hz < MINIMUM_VALID_CN0) { d_carrier_lock_fail_counter++; } else { if (d_carrier_lock_fail_counter > 0) d_carrier_lock_fail_counter--; } if (d_carrier_lock_fail_counter > MAXIMUM_LOCK_FAIL_COUNTER) { std::cout << "Loss of lock in channel " << d_channel << "!" << std::endl; LOG(INFO) << "Loss of lock in channel " << d_channel << "!"; this->message_port_pub(pmt::mp("events"), pmt::from_long(3));//3 -> loss of lock d_carrier_lock_fail_counter = 0; d_enable_tracking = false; // TODO: check if disabling tracking is consistent with the channel state machine } } // ########### Output the tracking data to navigation and PVT ########## current_synchro_data.Prompt_I = static_cast((d_correlator_outs[1]).real()); current_synchro_data.Prompt_Q = static_cast((d_correlator_outs[1]).imag()); // Tracking_timestamp_secs is aligned with the CURRENT PRN start sample (Hybridization OK!) current_synchro_data.Tracking_timestamp_secs = (static_cast(d_sample_counter) + d_correlation_length_samples + d_rem_code_phase_samples) / static_cast(d_fs_in); current_synchro_data.Rem_code_phase_secs = d_rem_code_phase_samples / static_cast(d_fs_in); current_synchro_data.Carrier_phase_rads = GPS_TWO_PI * d_acc_carrier_phase_cycles; current_synchro_data.Carrier_Doppler_hz = d_carrier_doppler_hz; current_synchro_data.CN0_dB_hz = d_CN0_SNV_dB_Hz; current_synchro_data.Flag_valid_symbol_output = true; if (d_preamble_synchronized == true) { current_synchro_data.correlation_length_ms = d_extend_correlation_ms; } else { current_synchro_data.correlation_length_ms = 1; } } else { current_synchro_data.Prompt_I = static_cast((d_correlator_outs[1]).real()); current_synchro_data.Prompt_Q = static_cast((d_correlator_outs[1]).imag()); // Tracking_timestamp_secs is aligned with the CURRENT PRN start sample (Hybridization OK!) current_synchro_data.Tracking_timestamp_secs = (static_cast(d_sample_counter) + d_correlation_length_samples + d_rem_code_phase_samples) / static_cast(d_fs_in); current_synchro_data.Rem_code_phase_secs = d_rem_code_phase_samples / static_cast(d_fs_in); current_synchro_data.Carrier_phase_rads = GPS_TWO_PI * d_acc_carrier_phase_cycles; current_synchro_data.Carrier_Doppler_hz = d_carrier_doppler_hz;// todo: project the carrier doppler current_synchro_data.CN0_dB_hz = d_CN0_SNV_dB_Hz; } } else { for (int n = 0; n < d_n_correlator_taps; n++) { d_correlator_outs[n] = gr_complex(0,0); } current_synchro_data.System = {'G'}; current_synchro_data.Tracking_timestamp_secs = (static_cast(d_sample_counter) + d_correlation_length_samples + static_cast(d_rem_code_phase_samples)) / static_cast(d_fs_in); current_synchro_data.Rem_code_phase_secs = d_rem_code_phase_samples / static_cast(d_fs_in); } //assign the GNURadio block output data *out[0] = current_synchro_data; if(d_dump) { // MULTIPLEXED FILE RECORDING - Record results to file float prompt_I; float prompt_Q; float tmp_E, tmp_P, tmp_L; double tmp_double; prompt_I = d_correlator_outs[1].real(); prompt_Q = d_correlator_outs[1].imag(); tmp_E = std::abs(d_correlator_outs[0]); tmp_P = std::abs(d_correlator_outs[1]); tmp_L = std::abs(d_correlator_outs[2]); try { // EPR d_dump_file.write(reinterpret_cast(&tmp_E), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_P), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_L), sizeof(float)); // PROMPT I and Q (to analyze navigation symbols) d_dump_file.write(reinterpret_cast(&prompt_I), sizeof(float)); d_dump_file.write(reinterpret_cast(&prompt_Q), sizeof(float)); // PRN start sample stamp //tmp_float=(float)d_sample_counter; d_dump_file.write(reinterpret_cast(&d_sample_counter), sizeof(unsigned long int)); // accumulated carrier phase d_dump_file.write(reinterpret_cast(&d_acc_carrier_phase_cycles), sizeof(double)); // carrier and code frequency d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); d_dump_file.write(reinterpret_cast(&d_code_freq_chips), sizeof(double)); //PLL commands d_dump_file.write(reinterpret_cast(&d_carr_phase_error_secs_Ti), sizeof(double)); d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); //DLL commands d_dump_file.write(reinterpret_cast(&d_code_error_chips_Ti), sizeof(double)); d_dump_file.write(reinterpret_cast(&d_code_error_filt_chips_Ti), sizeof(double)); // CN0 and carrier lock test d_dump_file.write(reinterpret_cast(&d_CN0_SNV_dB_Hz), sizeof(double)); d_dump_file.write(reinterpret_cast(&d_carrier_lock_test), sizeof(double)); // AUX vars (for debug purposes) tmp_double = d_code_error_chips_Ti * CURRENT_INTEGRATION_TIME_S; d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); tmp_double = static_cast(d_sample_counter + d_correlation_length_samples); d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); } catch (const std::ifstream::failure* e) { LOG(WARNING) << "Exception writing trk dump file " << e->what(); } } consume_each(d_correlation_length_samples); // this is necessary in gr::block derivates d_sample_counter += d_correlation_length_samples; //count for the processed samples return 1; //output tracking result ALWAYS even in the case of d_enable_tracking==false } void gps_l1_ca_dll_pll_c_aid_tracking_cc::set_channel(unsigned int channel) { d_channel = channel; LOG(INFO) << "Tracking Channel set to " << d_channel; // ############# ENABLE DATA FILE LOG ################# if (d_dump == true) { if (d_dump_file.is_open() == false) { try { d_dump_filename.append(boost::lexical_cast(d_channel)); d_dump_filename.append(".dat"); d_dump_file.exceptions (std::ifstream::failbit | std::ifstream::badbit); d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); LOG(INFO) << "Tracking dump enabled on channel " << d_channel << " Log file: " << d_dump_filename.c_str() << std::endl; } catch (const std::ifstream::failure* e) { LOG(WARNING) << "channel " << d_channel << " Exception opening trk dump file " << e->what() << std::endl; } } } } void gps_l1_ca_dll_pll_c_aid_tracking_cc::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { d_acquisition_gnss_synchro = p_gnss_synchro; } gnss-sdr-0.0.9/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.h000066400000000000000000000147251305042567700323620ustar00rootroot00000000000000/*! * \file gps_l1_ca_dll_pll_c_aid_tracking_cc.h * \brief Interface of a code DLL + carrier PLL tracking block * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Javier Arribas, 2011. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency Approach, * Birkhauser, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L1_CA_DLL_PLL_C_AID_TRACKING_CC_H #define GNSS_SDR_GPS_L1_CA_DLL_PLL_C_AID_TRACKING_CC_H #include #include #include #include #include #include #include "gnss_synchro.h" #include "tracking_2nd_DLL_filter.h" #include "tracking_FLL_PLL_filter.h" //#include "tracking_loop_filter.h" #include "cpu_multicorrelator.h" class gps_l1_ca_dll_pll_c_aid_tracking_cc; typedef boost::shared_ptr gps_l1_ca_dll_pll_c_aid_tracking_cc_sptr; gps_l1_ca_dll_pll_c_aid_tracking_cc_sptr gps_l1_ca_dll_pll_c_aid_make_tracking_cc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float pll_bw_narrow_hz, float dll_bw_narrow_hz, int extend_correlation_ms, float early_late_space_chips); /*! * \brief This class implements a DLL + PLL tracking loop block */ class gps_l1_ca_dll_pll_c_aid_tracking_cc: public gr::block { public: ~gps_l1_ca_dll_pll_c_aid_tracking_cc(); void set_channel(unsigned int channel); void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); void start_tracking(); int general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); void forecast (int noutput_items, gr_vector_int &ninput_items_required); private: friend gps_l1_ca_dll_pll_c_aid_tracking_cc_sptr gps_l1_ca_dll_pll_c_aid_make_tracking_cc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float pll_bw_narrow_hz, float dll_bw_narrow_hz, int extend_correlation_ms, float early_late_space_chips); gps_l1_ca_dll_pll_c_aid_tracking_cc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float pll_bw_narrow_hz, float dll_bw_narrow_hz, int extend_correlation_ms, float early_late_space_chips); // tracking configuration vars unsigned int d_vector_length; bool d_dump; Gnss_Synchro* d_acquisition_gnss_synchro; unsigned int d_channel; long d_if_freq; long d_fs_in; double d_early_late_spc_chips; int d_n_correlator_taps; gr_complex* d_ca_code; float* d_local_code_shift_chips; gr_complex* d_correlator_outs; cpu_multicorrelator multicorrelator_cpu; // remaining code phase and carrier phase between tracking loops double d_rem_code_phase_samples; double d_rem_code_phase_chips; double d_rem_carrier_phase_rad; int d_rem_code_phase_integer_samples; // PLL and DLL filter library //Tracking_2nd_DLL_filter d_code_loop_filter; Tracking_2nd_DLL_filter d_code_loop_filter; Tracking_FLL_PLL_filter d_carrier_loop_filter; // acquisition double d_acq_code_phase_samples; double d_acq_carrier_doppler_hz; // tracking vars float d_dll_bw_hz; float d_pll_bw_hz; float d_dll_bw_narrow_hz; float d_pll_bw_narrow_hz; double d_code_freq_chips; double d_code_phase_step_chips; double d_carrier_doppler_hz; double d_carrier_phase_step_rad; double d_acc_carrier_phase_cycles; double d_code_phase_samples; double d_pll_to_dll_assist_secs_Ti; double d_code_error_chips_Ti; double d_code_error_filt_chips_s; double d_code_error_filt_chips_Ti; double d_carr_phase_error_secs_Ti; // symbol history to detect bit transition std::deque d_E_history; std::deque d_P_history; std::deque d_L_history; double d_preamble_timestamp_s; int d_extend_correlation_ms; bool d_enable_extended_integration; bool d_preamble_synchronized; void msg_handler_preamble_index(pmt::pmt_t msg); //Integration period in samples int d_correlation_length_samples; //processing samples counters unsigned long int d_sample_counter; unsigned long int d_acq_sample_stamp; // CN0 estimation and lock detector int d_cn0_estimation_counter; gr_complex* d_Prompt_buffer; double d_carrier_lock_test; double d_CN0_SNV_dB_Hz; double d_carrier_lock_threshold; int d_carrier_lock_fail_counter; // control vars bool d_enable_tracking; bool d_pull_in; // file dump std::string d_dump_filename; std::ofstream d_dump_file; std::map systemName; std::string sys; }; #endif //GNSS_SDR_GPS_L1_CA_DLL_PLL_C_AID_TRACKING_CC_H gnss-sdr-0.0.9/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_sc.cc000066400000000000000000001073731305042567700325420ustar00rootroot00000000000000/*! * \file gps_l1_ca_dll_pll_c_aid_tracking_sc.cc * \brief Implementation of a code DLL + carrier PLL tracking block * \author Javier Arribas, 2015. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l1_ca_dll_pll_c_aid_tracking_sc.h" #include #include #include #include #include #include #include #include #include #include #include "gnss_synchro.h" #include "gps_sdr_signal_processing.h" #include "tracking_discriminators.h" #include "lock_detectors.h" #include "GPS_L1_CA.h" #include "control_message_factory.h" /*! * \todo Include in definition header file */ #define CN0_ESTIMATION_SAMPLES 20 #define MINIMUM_VALID_CN0 25 #define MAXIMUM_LOCK_FAIL_COUNTER 50 #define CARRIER_LOCK_THRESHOLD 0.85 using google::LogMessage; gps_l1_ca_dll_pll_c_aid_tracking_sc_sptr gps_l1_ca_dll_pll_c_aid_make_tracking_sc( long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float pll_bw_narrow_hz, float dll_bw_narrow_hz, int extend_correlation_ms, float early_late_space_chips) { return gps_l1_ca_dll_pll_c_aid_tracking_sc_sptr(new gps_l1_ca_dll_pll_c_aid_tracking_sc(if_freq, fs_in, vector_length, dump, dump_filename, pll_bw_hz, dll_bw_hz, pll_bw_narrow_hz, dll_bw_narrow_hz, extend_correlation_ms, early_late_space_chips)); } void gps_l1_ca_dll_pll_c_aid_tracking_sc::forecast (int noutput_items, gr_vector_int &ninput_items_required) { if (noutput_items != 0) { ninput_items_required[0] = static_cast(d_vector_length) * 2; //set the required available samples in each call } } void gps_l1_ca_dll_pll_c_aid_tracking_sc::msg_handler_preamble_index(pmt::pmt_t msg) { //pmt::print(msg); DLOG(INFO) << "Extended correlation enabled for Tracking CH " << d_channel << ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN); if (d_enable_extended_integration == false) //avoid re-setting preamble indicator { d_preamble_timestamp_s = pmt::to_double(msg); d_enable_extended_integration = true; d_preamble_synchronized = false; } } gps_l1_ca_dll_pll_c_aid_tracking_sc::gps_l1_ca_dll_pll_c_aid_tracking_sc( long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float pll_bw_narrow_hz, float dll_bw_narrow_hz, int extend_correlation_ms, float early_late_space_chips) : gr::block("gps_l1_ca_dll_pll_c_aid_tracking_sc", gr::io_signature::make(1, 1, sizeof(lv_16sc_t)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { // Telemetry bit synchronization message port input this->message_port_register_in(pmt::mp("preamble_timestamp_s")); this->set_msg_handler(pmt::mp("preamble_timestamp_s"), boost::bind(&gps_l1_ca_dll_pll_c_aid_tracking_sc::msg_handler_preamble_index, this, _1)); this->message_port_register_out(pmt::mp("events")); // initialize internal vars d_dump = dump; d_if_freq = if_freq; d_fs_in = fs_in; d_vector_length = vector_length; d_dump_filename = dump_filename; d_correlation_length_samples = static_cast(d_vector_length); // Initialize tracking ========================================== d_pll_bw_hz = pll_bw_hz; d_dll_bw_hz = dll_bw_hz; d_pll_bw_narrow_hz = pll_bw_narrow_hz; d_dll_bw_narrow_hz = dll_bw_narrow_hz; d_code_loop_filter.set_DLL_BW(d_dll_bw_hz); d_carrier_loop_filter.set_params(10.0, d_pll_bw_hz, 2); d_extend_correlation_ms = extend_correlation_ms; // --- DLL variables -------------------------------------------------------- d_early_late_spc_chips = early_late_space_chips; // Define early-late offset (in chips) // Initialization of local code replica // Get space for a vector with the C/A code replica sampled 1x/chip d_ca_code = static_cast(volk_gnsssdr_malloc(static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS) * sizeof(gr_complex), volk_gnsssdr_get_alignment())); d_ca_code_16sc = static_cast(volk_gnsssdr_malloc(static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS) * sizeof(lv_16sc_t), volk_gnsssdr_get_alignment())); // correlator outputs (scalar) d_n_correlator_taps = 3; // Early, Prompt, and Late d_correlator_outs_16sc = static_cast(volk_gnsssdr_malloc(d_n_correlator_taps*sizeof(lv_16sc_t), volk_gnsssdr_get_alignment())); for (int n = 0; n < d_n_correlator_taps; n++) { d_correlator_outs_16sc[n] = lv_cmake(0,0); } d_local_code_shift_chips = static_cast(volk_gnsssdr_malloc(d_n_correlator_taps*sizeof(float), volk_gnsssdr_get_alignment())); // Set TAPs delay values [chips] d_local_code_shift_chips[0] = - d_early_late_spc_chips; d_local_code_shift_chips[1] = 0.0; d_local_code_shift_chips[2] = d_early_late_spc_chips; multicorrelator_cpu_16sc.init(2 * d_correlation_length_samples, d_n_correlator_taps); //--- Perform initializations ------------------------------ // define initial code frequency basis of NCO d_code_freq_chips = GPS_L1_CA_CODE_RATE_HZ; // define residual code phase (in chips) d_rem_code_phase_samples = 0.0; // define residual carrier phase d_rem_carrier_phase_rad = 0.0; // sample synchronization d_sample_counter = 0; //(from trk to tlm) d_acq_sample_stamp = 0; d_enable_tracking = false; d_pull_in = false; // CN0 estimation and lock detector buffers d_cn0_estimation_counter = 0; d_Prompt_buffer = new gr_complex[CN0_ESTIMATION_SAMPLES]; d_carrier_lock_test = 1; d_CN0_SNV_dB_Hz = 0; d_carrier_lock_fail_counter = 0; d_carrier_lock_threshold = CARRIER_LOCK_THRESHOLD; systemName["G"] = std::string("GPS"); systemName["S"] = std::string("SBAS"); set_relative_rate(1.0 / static_cast(d_vector_length)); d_acquisition_gnss_synchro = 0; d_channel = 0; d_acq_code_phase_samples = 0.0; d_acq_carrier_doppler_hz = 0.0; d_carrier_doppler_hz = 0.0; d_acc_carrier_phase_cycles = 0.0; d_code_phase_samples = 0.0; d_enable_extended_integration = false; d_preamble_synchronized = false; d_rem_code_phase_integer_samples = 0; d_code_error_chips_Ti = 0.0; d_pll_to_dll_assist_secs_Ti = 0.0; d_rem_code_phase_chips = 0.0; d_code_phase_step_chips = 0.0; d_carrier_phase_step_rad = 0.0; d_code_error_filt_chips_s = 0.0; d_code_error_filt_chips_Ti = 0.0; d_preamble_timestamp_s = 0.0; d_carr_phase_error_secs_Ti = 0.0; //set_min_output_buffer((long int)300); } void gps_l1_ca_dll_pll_c_aid_tracking_sc::start_tracking() { /* * correct the code phase according to the delay between acq and trk */ d_acq_code_phase_samples = d_acquisition_gnss_synchro->Acq_delay_samples; d_acq_carrier_doppler_hz = d_acquisition_gnss_synchro->Acq_doppler_hz; d_acq_sample_stamp = d_acquisition_gnss_synchro->Acq_samplestamp_samples; long int acq_trk_diff_samples; double acq_trk_diff_seconds; acq_trk_diff_samples = static_cast(d_sample_counter) - static_cast(d_acq_sample_stamp);//-d_vector_length; DLOG(INFO) << "Number of samples between Acquisition and Tracking =" << acq_trk_diff_samples; acq_trk_diff_seconds = static_cast(acq_trk_diff_samples) / static_cast(d_fs_in); // Doppler effect // Fd=(C/(C+Vr))*F double radial_velocity = (GPS_L1_FREQ_HZ + d_acq_carrier_doppler_hz) / GPS_L1_FREQ_HZ; // new chip and prn sequence periods based on acq Doppler double T_chip_mod_seconds; double T_prn_mod_seconds; double T_prn_mod_samples; d_code_freq_chips = radial_velocity * GPS_L1_CA_CODE_RATE_HZ; d_code_phase_step_chips = static_cast(d_code_freq_chips) / static_cast(d_fs_in); T_chip_mod_seconds = 1.0 / d_code_freq_chips; T_prn_mod_seconds = T_chip_mod_seconds * GPS_L1_CA_CODE_LENGTH_CHIPS; T_prn_mod_samples = T_prn_mod_seconds * static_cast(d_fs_in); d_correlation_length_samples = round(T_prn_mod_samples); double T_prn_true_seconds = GPS_L1_CA_CODE_LENGTH_CHIPS / GPS_L1_CA_CODE_RATE_HZ; double T_prn_true_samples = T_prn_true_seconds * static_cast(d_fs_in); double T_prn_diff_seconds = T_prn_true_seconds - T_prn_mod_seconds; double N_prn_diff = acq_trk_diff_seconds / T_prn_true_seconds; double corrected_acq_phase_samples, delay_correction_samples; corrected_acq_phase_samples = fmod((d_acq_code_phase_samples + T_prn_diff_seconds * N_prn_diff * static_cast(d_fs_in)), T_prn_true_samples); if (corrected_acq_phase_samples < 0) { corrected_acq_phase_samples = T_prn_mod_samples + corrected_acq_phase_samples; } delay_correction_samples = d_acq_code_phase_samples - corrected_acq_phase_samples; d_acq_code_phase_samples = corrected_acq_phase_samples; d_carrier_doppler_hz = d_acq_carrier_doppler_hz; d_carrier_phase_step_rad = GPS_TWO_PI * d_carrier_doppler_hz / static_cast(d_fs_in); // DLL/PLL filter initialization d_carrier_loop_filter.initialize(d_acq_carrier_doppler_hz); // The carrier loop filter implements the Doppler accumulator d_code_loop_filter.initialize(); // initialize the code filter // generate local reference ALWAYS starting at chip 1 (1 sample per chip) gps_l1_ca_code_gen_complex(d_ca_code, d_acquisition_gnss_synchro->PRN, 0); volk_gnsssdr_32fc_convert_16ic(d_ca_code_16sc, d_ca_code, static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS)); multicorrelator_cpu_16sc.set_local_code_and_taps(static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS), d_ca_code_16sc, d_local_code_shift_chips); for (int n = 0; n < d_n_correlator_taps; n++) { d_correlator_outs_16sc[n] = lv_16sc_t(0,0); } d_carrier_lock_fail_counter = 0; d_rem_code_phase_samples = 0.0; d_rem_carrier_phase_rad = 0.0; d_rem_code_phase_chips = 0.0; d_acc_carrier_phase_cycles = 0.0; d_pll_to_dll_assist_secs_Ti = 0.0; d_code_phase_samples = d_acq_code_phase_samples; std::string sys_ = &d_acquisition_gnss_synchro->System; sys = sys_.substr(0,1); // DEBUG OUTPUT std::cout << "Tracking start on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << std::endl; LOG(INFO) << "Starting tracking of satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << " on channel " << d_channel; // enable tracking d_pull_in = true; d_enable_tracking = true; d_enable_extended_integration = false; d_preamble_synchronized = false; LOG(INFO) << "PULL-IN Doppler [Hz]=" << d_carrier_doppler_hz << " Code Phase correction [samples]=" << delay_correction_samples << " PULL-IN Code Phase [samples]=" << d_acq_code_phase_samples; } gps_l1_ca_dll_pll_c_aid_tracking_sc::~gps_l1_ca_dll_pll_c_aid_tracking_sc() { d_dump_file.close(); volk_gnsssdr_free(d_local_code_shift_chips); volk_gnsssdr_free(d_ca_code); volk_gnsssdr_free(d_ca_code_16sc); volk_gnsssdr_free(d_correlator_outs_16sc); delete[] d_Prompt_buffer; multicorrelator_cpu_16sc.free(); } int gps_l1_ca_dll_pll_c_aid_tracking_sc::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) { // Block input data and block output stream pointers const lv_16sc_t* in = (lv_16sc_t*) input_items[0]; //PRN start block alignment Gnss_Synchro **out = (Gnss_Synchro **) &output_items[0]; // GNSS_SYNCHRO OBJECT to interchange data between tracking->telemetry_decoder Gnss_Synchro current_synchro_data = Gnss_Synchro(); // process vars double code_error_filt_secs_Ti = 0.0; double CURRENT_INTEGRATION_TIME_S = 0.0; double CORRECTED_INTEGRATION_TIME_S = 0.0; if (d_enable_tracking == true) { // Fill the acquisition data current_synchro_data = *d_acquisition_gnss_synchro; // Receiver signal alignment if (d_pull_in == true) { int samples_offset; double acq_trk_shif_correction_samples; int acq_to_trk_delay_samples; acq_to_trk_delay_samples = d_sample_counter - d_acq_sample_stamp; acq_trk_shif_correction_samples = d_correlation_length_samples - fmod(static_cast(acq_to_trk_delay_samples), static_cast(d_correlation_length_samples)); samples_offset = round(d_acq_code_phase_samples + acq_trk_shif_correction_samples); current_synchro_data.Tracking_timestamp_secs = (static_cast(d_sample_counter) + static_cast(d_rem_code_phase_samples)) / static_cast(d_fs_in); d_sample_counter += samples_offset; // count for the processed samples d_pull_in = false; d_acc_carrier_phase_cycles -= d_carrier_phase_step_rad * samples_offset / GPS_TWO_PI; current_synchro_data.Carrier_phase_rads = d_acc_carrier_phase_cycles * GPS_TWO_PI; current_synchro_data.Carrier_Doppler_hz = d_carrier_doppler_hz; *out[0] = current_synchro_data; consume_each(samples_offset); // shift input to perform alignment with local replica return 1; } // ################# CARRIER WIPEOFF AND CORRELATORS ############################## // perform carrier wipe-off and compute Early, Prompt and Late correlation multicorrelator_cpu_16sc.set_input_output_vectors(d_correlator_outs_16sc, in); multicorrelator_cpu_16sc.Carrier_wipeoff_multicorrelator_resampler(d_rem_carrier_phase_rad, d_carrier_phase_step_rad, d_rem_code_phase_chips, d_code_phase_step_chips, d_correlation_length_samples); // ####### coherent intergration extension // keep the last symbols d_E_history.push_back(d_correlator_outs_16sc[0]); // save early output d_P_history.push_back(d_correlator_outs_16sc[1]); // save prompt output d_L_history.push_back(d_correlator_outs_16sc[2]); // save late output if (static_cast(d_P_history.size()) > d_extend_correlation_ms) { d_E_history.pop_front(); d_P_history.pop_front(); d_L_history.pop_front(); } bool enable_dll_pll; if (d_enable_extended_integration == true) { long int symbol_diff = round(1000.0 * ((static_cast(d_sample_counter) + d_rem_code_phase_samples) / static_cast(d_fs_in) - d_preamble_timestamp_s)); if (symbol_diff > 0 and symbol_diff % d_extend_correlation_ms == 0) { // compute coherent integration and enable tracking loop // perform coherent integration using correlator output history // std::cout<<"##### RESET COHERENT INTEGRATION ####"<PRN) << " pll_bw = " << d_pll_bw_hz << " [Hz], pll_narrow_bw = " << d_pll_bw_narrow_hz << " [Hz]" << std::endl << " dll_bw = " << d_dll_bw_hz << " [Hz], dll_narrow_bw = " << d_dll_bw_narrow_hz << " [Hz]" << std::endl; } // UPDATE INTEGRATION TIME CURRENT_INTEGRATION_TIME_S = static_cast(d_extend_correlation_ms) * GPS_L1_CA_CODE_PERIOD; enable_dll_pll = true; } else { if(d_preamble_synchronized == true) { // continue extended coherent correlation // Compute the next buffer length based on the period of the PRN sequence and the code phase error estimation double T_chip_seconds = 1.0 / d_code_freq_chips; double T_prn_seconds = T_chip_seconds * GPS_L1_CA_CODE_LENGTH_CHIPS; double T_prn_samples = T_prn_seconds * static_cast(d_fs_in); int K_prn_samples = round(T_prn_samples); double K_T_prn_error_samples = K_prn_samples - T_prn_samples; d_rem_code_phase_samples = d_rem_code_phase_samples - K_T_prn_error_samples; d_rem_code_phase_integer_samples = round(d_rem_code_phase_samples); // round to a discrete number of samples d_correlation_length_samples = K_prn_samples + d_rem_code_phase_integer_samples; d_rem_code_phase_samples = d_rem_code_phase_samples - d_rem_code_phase_integer_samples; // code phase step (Code resampler phase increment per sample) [chips/sample] d_code_phase_step_chips = d_code_freq_chips / static_cast(d_fs_in); // remnant code phase [chips] d_rem_code_phase_chips = d_rem_code_phase_samples * (d_code_freq_chips / static_cast(d_fs_in)); d_rem_carrier_phase_rad = fmod(d_rem_carrier_phase_rad + d_carrier_phase_step_rad * static_cast(d_correlation_length_samples), GPS_TWO_PI); // UPDATE ACCUMULATED CARRIER PHASE CORRECTED_INTEGRATION_TIME_S = (static_cast(d_correlation_length_samples) / static_cast(d_fs_in)); d_acc_carrier_phase_cycles -= d_carrier_phase_step_rad * d_correlation_length_samples / GPS_TWO_PI; // disable tracking loop and inform telemetry decoder enable_dll_pll = false; } else { // perform basic (1ms) correlation // UPDATE INTEGRATION TIME CURRENT_INTEGRATION_TIME_S = static_cast(d_correlation_length_samples) / static_cast(d_fs_in); enable_dll_pll = true; } } } else { // UPDATE INTEGRATION TIME CURRENT_INTEGRATION_TIME_S = static_cast(d_correlation_length_samples) / static_cast(d_fs_in); enable_dll_pll = true; } if (enable_dll_pll == true) { // ################## PLL ########################################################## // Update PLL discriminator [rads/Ti -> Secs/Ti] d_carr_phase_error_secs_Ti = pll_cloop_two_quadrant_atan(std::complex(d_correlator_outs_16sc[1].real(),d_correlator_outs_16sc[1].imag())) / GPS_TWO_PI; //prompt output // Carrier discriminator filter // NOTICE: The carrier loop filter includes the Carrier Doppler accumulator, as described in Kaplan // Input [s/Ti] -> output [Hz] d_carrier_doppler_hz = d_carrier_loop_filter.get_carrier_error(0.0, d_carr_phase_error_secs_Ti, CURRENT_INTEGRATION_TIME_S); // PLL to DLL assistance [Secs/Ti] d_pll_to_dll_assist_secs_Ti = (d_carrier_doppler_hz * CURRENT_INTEGRATION_TIME_S) / GPS_L1_FREQ_HZ; // code Doppler frequency update d_code_freq_chips = GPS_L1_CA_CODE_RATE_HZ + ((d_carrier_doppler_hz * GPS_L1_CA_CODE_RATE_HZ) / GPS_L1_FREQ_HZ); // ################## DLL ########################################################## // DLL discriminator d_code_error_chips_Ti = dll_nc_e_minus_l_normalized(std::complex(d_correlator_outs_16sc[0].real(),d_correlator_outs_16sc[0].imag()), std::complex(d_correlator_outs_16sc[2].real(),d_correlator_outs_16sc[2].imag())); // [chips/Ti] //early and late // Code discriminator filter d_code_error_filt_chips_s = d_code_loop_filter.get_code_nco(d_code_error_chips_Ti); // input [chips/Ti] -> output [chips/second] d_code_error_filt_chips_Ti = d_code_error_filt_chips_s * CURRENT_INTEGRATION_TIME_S; code_error_filt_secs_Ti = d_code_error_filt_chips_Ti / d_code_freq_chips; // [s/Ti] // ################## CARRIER AND CODE NCO BUFFER ALIGNEMENT ####################### // keep alignment parameters for the next input buffer // Compute the next buffer length based in the new period of the PRN sequence and the code phase error estimation double T_chip_seconds = 1.0 / d_code_freq_chips; double T_prn_seconds = T_chip_seconds * GPS_L1_CA_CODE_LENGTH_CHIPS; double T_prn_samples = T_prn_seconds * static_cast(d_fs_in); double K_prn_samples = round(T_prn_samples); double K_T_prn_error_samples = K_prn_samples - T_prn_samples; d_rem_code_phase_samples = d_rem_code_phase_samples - K_T_prn_error_samples + code_error_filt_secs_Ti * static_cast(d_fs_in); //(code_error_filt_secs_Ti + d_pll_to_dll_assist_secs_Ti) * static_cast(d_fs_in); d_rem_code_phase_integer_samples = round(d_rem_code_phase_samples); // round to a discrete number of samples d_correlation_length_samples = K_prn_samples + d_rem_code_phase_integer_samples; d_rem_code_phase_samples = d_rem_code_phase_samples - d_rem_code_phase_integer_samples; //################### PLL COMMANDS ################################################# //carrier phase step (NCO phase increment per sample) [rads/sample] d_carrier_phase_step_rad = GPS_TWO_PI * d_carrier_doppler_hz / static_cast(d_fs_in); d_acc_carrier_phase_cycles -= d_carrier_phase_step_rad * d_correlation_length_samples / GPS_TWO_PI; // UPDATE ACCUMULATED CARRIER PHASE CORRECTED_INTEGRATION_TIME_S = (static_cast(d_correlation_length_samples) / static_cast(d_fs_in)); //remnant carrier phase [rad] d_rem_carrier_phase_rad = fmod(d_rem_carrier_phase_rad + GPS_TWO_PI * d_carrier_doppler_hz * CORRECTED_INTEGRATION_TIME_S, GPS_TWO_PI); //################### DLL COMMANDS ################################################# //code phase step (Code resampler phase increment per sample) [chips/sample] d_code_phase_step_chips = d_code_freq_chips / static_cast(d_fs_in); //remnant code phase [chips] d_rem_code_phase_chips = d_rem_code_phase_samples * (d_code_freq_chips / static_cast(d_fs_in)); // ####### CN0 ESTIMATION AND LOCK DETECTORS ####################################### if (d_cn0_estimation_counter < CN0_ESTIMATION_SAMPLES) { // fill buffer with prompt correlator output values d_Prompt_buffer[d_cn0_estimation_counter] = lv_cmake(static_cast(d_correlator_outs_16sc[1].real()), static_cast(d_correlator_outs_16sc[1].imag()) ); // prompt d_cn0_estimation_counter++; } else { d_cn0_estimation_counter = 0; // Code lock indicator d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES, d_fs_in, GPS_L1_CA_CODE_LENGTH_CHIPS); // Carrier lock indicator d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES); // Loss of lock detection if (d_carrier_lock_test < d_carrier_lock_threshold or d_CN0_SNV_dB_Hz < MINIMUM_VALID_CN0) { d_carrier_lock_fail_counter++; } else { if (d_carrier_lock_fail_counter > 0) d_carrier_lock_fail_counter--; } if (d_carrier_lock_fail_counter > MAXIMUM_LOCK_FAIL_COUNTER) { std::cout << "Loss of lock in channel " << d_channel << "!" << std::endl; LOG(INFO) << "Loss of lock in channel " << d_channel << "!"; this->message_port_pub(pmt::mp("events"), pmt::from_long(3));//3 -> loss of lock d_carrier_lock_fail_counter = 0; d_enable_tracking = false; // TODO: check if disabling tracking is consistent with the channel state machine } } // ########### Output the tracking data to navigation and PVT ########## current_synchro_data.Prompt_I = static_cast((d_correlator_outs_16sc[1]).real()); current_synchro_data.Prompt_Q = static_cast((d_correlator_outs_16sc[1]).imag()); // Tracking_timestamp_secs is aligned with the CURRENT PRN start sample (Hybridization OK!) current_synchro_data.Tracking_timestamp_secs = (static_cast(d_sample_counter) + d_correlation_length_samples + d_rem_code_phase_samples) / static_cast(d_fs_in); current_synchro_data.Rem_code_phase_secs = d_rem_code_phase_samples / static_cast(d_fs_in); current_synchro_data.Carrier_phase_rads = GPS_TWO_PI * d_acc_carrier_phase_cycles; current_synchro_data.Carrier_Doppler_hz = d_carrier_doppler_hz; current_synchro_data.CN0_dB_hz = d_CN0_SNV_dB_Hz; current_synchro_data.Flag_valid_symbol_output = true; if (d_preamble_synchronized == true) { current_synchro_data.correlation_length_ms = d_extend_correlation_ms; } else { current_synchro_data.correlation_length_ms = 1; } } else { current_synchro_data.Prompt_I = static_cast((d_correlator_outs_16sc[1]).real()); current_synchro_data.Prompt_Q = static_cast((d_correlator_outs_16sc[1]).imag()); // Tracking_timestamp_secs is aligned with the CURRENT PRN start sample (Hybridization OK!) current_synchro_data.Tracking_timestamp_secs = (static_cast(d_sample_counter) + d_correlation_length_samples + d_rem_code_phase_samples) / static_cast(d_fs_in); current_synchro_data.Rem_code_phase_secs = d_rem_code_phase_samples / static_cast(d_fs_in); current_synchro_data.Carrier_phase_rads = GPS_TWO_PI * d_acc_carrier_phase_cycles; current_synchro_data.Carrier_Doppler_hz = d_carrier_doppler_hz;// todo: project the carrier doppler current_synchro_data.CN0_dB_hz = d_CN0_SNV_dB_Hz; } } else { for (int n = 0; n < d_n_correlator_taps; n++) { d_correlator_outs_16sc[n] = lv_cmake(0,0); } current_synchro_data.System = {'G'}; current_synchro_data.Tracking_timestamp_secs = (static_cast(d_sample_counter) + d_correlation_length_samples + static_cast(d_rem_code_phase_samples)) / static_cast(d_fs_in); current_synchro_data.Rem_code_phase_secs = d_rem_code_phase_samples / static_cast(d_fs_in); } *out[0] = current_synchro_data; if(d_dump) { // MULTIPLEXED FILE RECORDING - Record results to file float prompt_I; float prompt_Q; float tmp_E, tmp_P, tmp_L; double tmp_double; prompt_I = d_correlator_outs_16sc[1].real(); prompt_Q = d_correlator_outs_16sc[1].imag(); tmp_E = std::abs(std::complex(d_correlator_outs_16sc[0].real(),d_correlator_outs_16sc[0].imag())); tmp_P = std::abs(std::complex(d_correlator_outs_16sc[1].real(),d_correlator_outs_16sc[1].imag())); tmp_L = std::abs(std::complex(d_correlator_outs_16sc[2].real(),d_correlator_outs_16sc[2].imag())); try { // EPR d_dump_file.write(reinterpret_cast(&tmp_E), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_P), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_L), sizeof(float)); // PROMPT I and Q (to analyze navigation symbols) d_dump_file.write(reinterpret_cast(&prompt_I), sizeof(float)); d_dump_file.write(reinterpret_cast(&prompt_Q), sizeof(float)); // PRN start sample stamp //tmp_float=(float)d_sample_counter; d_dump_file.write(reinterpret_cast(&d_sample_counter), sizeof(unsigned long int)); // accumulated carrier phase d_dump_file.write(reinterpret_cast(&d_acc_carrier_phase_cycles), sizeof(double)); // carrier and code frequency d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); d_dump_file.write(reinterpret_cast(&d_code_freq_chips), sizeof(double)); //PLL commands d_dump_file.write(reinterpret_cast(&d_carr_phase_error_secs_Ti), sizeof(double)); d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); //DLL commands d_dump_file.write(reinterpret_cast(&d_code_error_chips_Ti), sizeof(double)); d_dump_file.write(reinterpret_cast(&d_code_error_filt_chips_Ti), sizeof(double)); // CN0 and carrier lock test d_dump_file.write(reinterpret_cast(&d_CN0_SNV_dB_Hz), sizeof(double)); d_dump_file.write(reinterpret_cast(&d_carrier_lock_test), sizeof(double)); // AUX vars (for debug purposes) tmp_double = d_code_error_chips_Ti * CURRENT_INTEGRATION_TIME_S; d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); tmp_double = static_cast(d_sample_counter + d_correlation_length_samples); d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); } catch (const std::ifstream::failure* e) { LOG(WARNING) << "Exception writing trk dump file " << e->what(); } } consume_each(d_correlation_length_samples); // this is necessary in gr::block derivates d_sample_counter += d_correlation_length_samples; //count for the processed samples return 1; //output tracking result ALWAYS even in the case of d_enable_tracking==false } void gps_l1_ca_dll_pll_c_aid_tracking_sc::set_channel(unsigned int channel) { d_channel = channel; LOG(INFO) << "Tracking Channel set to " << d_channel; // ############# ENABLE DATA FILE LOG ################# if (d_dump == true) { if (d_dump_file.is_open() == false) { try { d_dump_filename.append(boost::lexical_cast(d_channel)); d_dump_filename.append(".dat"); d_dump_file.exceptions (std::ifstream::failbit | std::ifstream::badbit); d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); LOG(INFO) << "Tracking dump enabled on channel " << d_channel << " Log file: " << d_dump_filename.c_str() << std::endl; } catch (const std::ifstream::failure* e) { LOG(WARNING) << "channel " << d_channel << " Exception opening trk dump file " << e->what() << std::endl; } } } } void gps_l1_ca_dll_pll_c_aid_tracking_sc::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { d_acquisition_gnss_synchro = p_gnss_synchro; } gnss-sdr-0.0.9/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_sc.h000066400000000000000000000151401305042567700323720ustar00rootroot00000000000000/*! * \file gps_l1_ca_dll_pll_c_aid_tracking_sc.h * \brief Interface of a code DLL + carrier PLL tracking block * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Javier Arribas, 2011. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency Approach, * Birkhauser, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L1_CA_DLL_PLL_C_AID_TRACKING_SC_H #define GNSS_SDR_GPS_L1_CA_DLL_PLL_C_AID_TRACKING_SC_H #include #include #include #include #include #include #include #include "gps_sdr_signal_processing.h" #include "gnss_synchro.h" #include "tracking_2nd_DLL_filter.h" #include "tracking_FLL_PLL_filter.h" #include "cpu_multicorrelator_16sc.h" class gps_l1_ca_dll_pll_c_aid_tracking_sc; typedef boost::shared_ptr gps_l1_ca_dll_pll_c_aid_tracking_sc_sptr; gps_l1_ca_dll_pll_c_aid_tracking_sc_sptr gps_l1_ca_dll_pll_c_aid_make_tracking_sc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float pll_bw_narrow_hz, float dll_bw_narrow_hz, int extend_correlation_ms, float early_late_space_chips); /*! * \brief This class implements a DLL + PLL tracking loop block */ class gps_l1_ca_dll_pll_c_aid_tracking_sc: public gr::block { public: ~gps_l1_ca_dll_pll_c_aid_tracking_sc(); void set_channel(unsigned int channel); void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); void start_tracking(); int general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); void forecast (int noutput_items, gr_vector_int &ninput_items_required); private: friend gps_l1_ca_dll_pll_c_aid_tracking_sc_sptr gps_l1_ca_dll_pll_c_aid_make_tracking_sc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float pll_bw_narrow_hz, float dll_bw_narrow_hz, int extend_correlation_ms, float early_late_space_chips); gps_l1_ca_dll_pll_c_aid_tracking_sc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float pll_bw_narrow_hz, float dll_bw_narrow_hz, int extend_correlation_ms, float early_late_space_chips); // tracking configuration vars unsigned int d_vector_length; bool d_dump; Gnss_Synchro* d_acquisition_gnss_synchro; unsigned int d_channel; long d_if_freq; long d_fs_in; double d_early_late_spc_chips; int d_n_correlator_taps; gr_complex* d_ca_code; lv_16sc_t* d_ca_code_16sc; float* d_local_code_shift_chips; //gr_complex* d_correlator_outs; lv_16sc_t* d_correlator_outs_16sc; //cpu_multicorrelator multicorrelator_cpu; cpu_multicorrelator_16sc multicorrelator_cpu_16sc; // remaining code phase and carrier phase between tracking loops double d_rem_code_phase_samples; double d_rem_code_phase_chips; double d_rem_carrier_phase_rad; int d_rem_code_phase_integer_samples; // PLL and DLL filter library Tracking_2nd_DLL_filter d_code_loop_filter; Tracking_FLL_PLL_filter d_carrier_loop_filter; // acquisition double d_acq_code_phase_samples; double d_acq_carrier_doppler_hz; // tracking vars float d_dll_bw_hz; float d_pll_bw_hz; float d_dll_bw_narrow_hz; float d_pll_bw_narrow_hz; double d_code_freq_chips; double d_code_phase_step_chips; double d_carrier_doppler_hz; double d_carrier_phase_step_rad; double d_acc_carrier_phase_cycles; double d_code_phase_samples; double d_pll_to_dll_assist_secs_Ti; double d_carr_phase_error_secs_Ti; double d_code_error_chips_Ti; double d_preamble_timestamp_s; int d_extend_correlation_ms; bool d_enable_extended_integration; bool d_preamble_synchronized; double d_code_error_filt_chips_s; double d_code_error_filt_chips_Ti; void msg_handler_preamble_index(pmt::pmt_t msg); // symbol history to detect bit transition std::deque d_E_history; std::deque d_P_history; std::deque d_L_history; //Integration period in samples int d_correlation_length_samples; //processing samples counters unsigned long int d_sample_counter; unsigned long int d_acq_sample_stamp; // CN0 estimation and lock detector int d_cn0_estimation_counter; gr_complex* d_Prompt_buffer; double d_carrier_lock_test; double d_CN0_SNV_dB_Hz; double d_carrier_lock_threshold; int d_carrier_lock_fail_counter; // control vars bool d_enable_tracking; bool d_pull_in; // file dump std::string d_dump_filename; std::ofstream d_dump_file; std::map systemName; std::string sys; }; #endif //GNSS_SDR_GPS_L1_CA_DLL_PLL_C_AID_TRACKING_SC_H gnss-sdr-0.0.9/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.cc000066400000000000000000000606641305042567700314040ustar00rootroot00000000000000/*! * \file gps_l1_ca_dll_pll_tracking_cc.cc * \brief Implementation of a code DLL + carrier PLL tracking block * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Javier Arribas, 2011. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * [1] K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach, Birkhauser, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l1_ca_dll_pll_tracking_cc.h" #include #include #include #include #include #include #include #include #include "gps_sdr_signal_processing.h" #include "tracking_discriminators.h" #include "lock_detectors.h" #include "GPS_L1_CA.h" #include "control_message_factory.h" /*! * \todo Include in definition header file */ #define CN0_ESTIMATION_SAMPLES 20 #define MINIMUM_VALID_CN0 25 #define MAXIMUM_LOCK_FAIL_COUNTER 50 #define CARRIER_LOCK_THRESHOLD 0.85 using google::LogMessage; gps_l1_ca_dll_pll_tracking_cc_sptr gps_l1_ca_dll_pll_make_tracking_cc( long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float early_late_space_chips) { return gps_l1_ca_dll_pll_tracking_cc_sptr(new Gps_L1_Ca_Dll_Pll_Tracking_cc(if_freq, fs_in, vector_length, dump, dump_filename, pll_bw_hz, dll_bw_hz, early_late_space_chips)); } void Gps_L1_Ca_Dll_Pll_Tracking_cc::forecast (int noutput_items, gr_vector_int &ninput_items_required) { if (noutput_items != 0) { ninput_items_required[0] = static_cast(d_vector_length) * 2; //set the required available samples in each call } } Gps_L1_Ca_Dll_Pll_Tracking_cc::Gps_L1_Ca_Dll_Pll_Tracking_cc( long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float early_late_space_chips) : gr::block("Gps_L1_Ca_Dll_Pll_Tracking_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { // Telemetry bit synchronization message port input this->message_port_register_in(pmt::mp("preamble_timestamp_s")); this->message_port_register_out(pmt::mp("events")); // initialize internal vars d_dump = dump; d_if_freq = if_freq; d_fs_in = fs_in; d_vector_length = vector_length; d_dump_filename = dump_filename; d_current_prn_length_samples = static_cast(d_vector_length); // Initialize tracking ========================================== d_code_loop_filter.set_DLL_BW(dll_bw_hz); d_carrier_loop_filter.set_PLL_BW(pll_bw_hz); //--- DLL variables -------------------------------------------------------- d_early_late_spc_chips = early_late_space_chips; // Define early-late offset (in chips) // Initialization of local code replica // Get space for a vector with the C/A code replica sampled 1x/chip d_ca_code = static_cast(volk_gnsssdr_malloc(static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS) * sizeof(gr_complex), volk_gnsssdr_get_alignment())); // correlator outputs (scalar) d_n_correlator_taps = 3; // Early, Prompt, and Late d_correlator_outs = static_cast(volk_gnsssdr_malloc(d_n_correlator_taps*sizeof(gr_complex), volk_gnsssdr_get_alignment())); for (int n = 0; n < d_n_correlator_taps; n++) { d_correlator_outs[n] = gr_complex(0,0); } d_local_code_shift_chips = static_cast(volk_gnsssdr_malloc(d_n_correlator_taps*sizeof(float), volk_gnsssdr_get_alignment())); // Set TAPs delay values [chips] d_local_code_shift_chips[0] = - d_early_late_spc_chips; d_local_code_shift_chips[1] = 0.0; d_local_code_shift_chips[2] = d_early_late_spc_chips; multicorrelator_cpu.init(2 * d_current_prn_length_samples, d_n_correlator_taps); //--- Perform initializations ------------------------------ // define initial code frequency basis of NCO d_code_freq_chips = GPS_L1_CA_CODE_RATE_HZ; // define residual code phase (in chips) d_rem_code_phase_samples = 0.0; // define residual carrier phase d_rem_carr_phase_rad = 0.0; // sample synchronization d_sample_counter = 0; //d_sample_counter_seconds = 0; d_acq_sample_stamp = 0; d_enable_tracking = false; d_pull_in = false; // CN0 estimation and lock detector buffers d_cn0_estimation_counter = 0; d_Prompt_buffer = new gr_complex[CN0_ESTIMATION_SAMPLES]; d_carrier_lock_test = 1; d_CN0_SNV_dB_Hz = 0; d_carrier_lock_fail_counter = 0; d_carrier_lock_threshold = CARRIER_LOCK_THRESHOLD; systemName["G"] = std::string("GPS"); systemName["S"] = std::string("SBAS"); d_acquisition_gnss_synchro = 0; d_channel = 0; d_acq_code_phase_samples = 0.0; d_acq_carrier_doppler_hz = 0.0; d_carrier_doppler_hz = 0.0; d_acc_carrier_phase_rad = 0.0; d_code_phase_samples = 0.0; d_rem_code_phase_chips = 0.0; d_code_phase_step_chips = 0.0; d_carrier_phase_step_rad = 0.0; set_relative_rate(1.0 / static_cast(d_vector_length)); } void Gps_L1_Ca_Dll_Pll_Tracking_cc::start_tracking() { /* * correct the code phase according to the delay between acq and trk */ d_acq_code_phase_samples = d_acquisition_gnss_synchro->Acq_delay_samples; d_acq_carrier_doppler_hz = d_acquisition_gnss_synchro->Acq_doppler_hz; d_acq_sample_stamp = d_acquisition_gnss_synchro->Acq_samplestamp_samples; long int acq_trk_diff_samples; double acq_trk_diff_seconds; acq_trk_diff_samples = static_cast(d_sample_counter) - static_cast(d_acq_sample_stamp); //-d_vector_length; DLOG(INFO) << "Number of samples between Acquisition and Tracking =" << acq_trk_diff_samples; acq_trk_diff_seconds = static_cast(acq_trk_diff_samples) / static_cast(d_fs_in); // Doppler effect // Fd=(C/(C+Vr))*F double radial_velocity = (GPS_L1_FREQ_HZ + d_acq_carrier_doppler_hz) / GPS_L1_FREQ_HZ; // new chip and prn sequence periods based on acq Doppler double T_chip_mod_seconds; double T_prn_mod_seconds; double T_prn_mod_samples; d_code_freq_chips = radial_velocity * GPS_L1_CA_CODE_RATE_HZ; d_code_phase_step_chips = static_cast(d_code_freq_chips) / static_cast(d_fs_in); T_chip_mod_seconds = 1/d_code_freq_chips; T_prn_mod_seconds = T_chip_mod_seconds * GPS_L1_CA_CODE_LENGTH_CHIPS; T_prn_mod_samples = T_prn_mod_seconds * static_cast(d_fs_in); d_current_prn_length_samples = round(T_prn_mod_samples); double T_prn_true_seconds = GPS_L1_CA_CODE_LENGTH_CHIPS / GPS_L1_CA_CODE_RATE_HZ; double T_prn_true_samples = T_prn_true_seconds * static_cast(d_fs_in); double T_prn_diff_seconds = T_prn_true_seconds - T_prn_mod_seconds; double N_prn_diff = acq_trk_diff_seconds / T_prn_true_seconds; double corrected_acq_phase_samples, delay_correction_samples; corrected_acq_phase_samples = fmod((d_acq_code_phase_samples + T_prn_diff_seconds * N_prn_diff * static_cast(d_fs_in)), T_prn_true_samples); if (corrected_acq_phase_samples < 0) { corrected_acq_phase_samples = T_prn_mod_samples + corrected_acq_phase_samples; } delay_correction_samples = d_acq_code_phase_samples - corrected_acq_phase_samples; d_acq_code_phase_samples = corrected_acq_phase_samples; d_carrier_doppler_hz = d_acq_carrier_doppler_hz; d_carrier_phase_step_rad = GPS_TWO_PI * d_carrier_doppler_hz / static_cast(d_fs_in); // DLL/PLL filter initialization d_carrier_loop_filter.initialize(); // initialize the carrier filter d_code_loop_filter.initialize(); // initialize the code filter // generate local reference ALWAYS starting at chip 1 (1 sample per chip) gps_l1_ca_code_gen_complex(d_ca_code, d_acquisition_gnss_synchro->PRN, 0); multicorrelator_cpu.set_local_code_and_taps(static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS), d_ca_code, d_local_code_shift_chips); for (int n = 0; n < d_n_correlator_taps; n++) { d_correlator_outs[n] = gr_complex(0,0); } d_carrier_lock_fail_counter = 0; d_rem_code_phase_samples = 0; d_rem_carr_phase_rad = 0.0; d_rem_code_phase_chips = 0.0; d_acc_carrier_phase_rad = 0.0; d_code_phase_samples = d_acq_code_phase_samples; std::string sys_ = &d_acquisition_gnss_synchro->System; sys = sys_.substr(0,1); // DEBUG OUTPUT std::cout << "Tracking start on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << std::endl; LOG(INFO) << "Starting tracking of satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << " on channel " << d_channel; // enable tracking d_pull_in = true; d_enable_tracking = true; LOG(INFO) << "PULL-IN Doppler [Hz]=" << d_carrier_doppler_hz << " Code Phase correction [samples]=" << delay_correction_samples << " PULL-IN Code Phase [samples]=" << d_acq_code_phase_samples; } Gps_L1_Ca_Dll_Pll_Tracking_cc::~Gps_L1_Ca_Dll_Pll_Tracking_cc() { d_dump_file.close(); volk_gnsssdr_free(d_local_code_shift_chips); volk_gnsssdr_free(d_correlator_outs); volk_gnsssdr_free(d_ca_code); delete[] d_Prompt_buffer; multicorrelator_cpu.free(); } int Gps_L1_Ca_Dll_Pll_Tracking_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) { // process vars double carr_error_hz = 0.0; double carr_error_filt_hz = 0.0; double code_error_chips = 0.0; double code_error_filt_chips = 0.0; // Block input data and block output stream pointers const gr_complex* in = (gr_complex*) input_items[0]; //PRN start block alignment Gnss_Synchro **out = (Gnss_Synchro **) &output_items[0]; // GNSS_SYNCHRO OBJECT to interchange data between tracking->telemetry_decoder Gnss_Synchro current_synchro_data = Gnss_Synchro(); if (d_enable_tracking == true) { // Fill the acquisition data current_synchro_data = *d_acquisition_gnss_synchro; // Receiver signal alignment if (d_pull_in == true) { int samples_offset; double acq_trk_shif_correction_samples; int acq_to_trk_delay_samples; acq_to_trk_delay_samples = d_sample_counter - d_acq_sample_stamp; acq_trk_shif_correction_samples = d_current_prn_length_samples - fmod(static_cast(acq_to_trk_delay_samples), static_cast(d_current_prn_length_samples)); samples_offset = round(d_acq_code_phase_samples + acq_trk_shif_correction_samples); current_synchro_data.Tracking_timestamp_secs = (static_cast(d_sample_counter) + static_cast(d_rem_code_phase_samples)) / static_cast(d_fs_in); d_sample_counter = d_sample_counter + samples_offset; // count for the processed samples d_pull_in = false; // take into account the carrier cycles accumulated in the pull in signal alignment d_acc_carrier_phase_rad -= d_carrier_phase_step_rad * samples_offset; current_synchro_data.Carrier_phase_rads = d_acc_carrier_phase_rad; current_synchro_data.Carrier_Doppler_hz = d_carrier_doppler_hz; *out[0] = current_synchro_data; consume_each(samples_offset); // shift input to perform alignment with local replica return 1; } // ################# CARRIER WIPEOFF AND CORRELATORS ############################## // perform carrier wipe-off and compute Early, Prompt and Late correlation multicorrelator_cpu.set_input_output_vectors(d_correlator_outs, in); multicorrelator_cpu.Carrier_wipeoff_multicorrelator_resampler(d_rem_carr_phase_rad, d_carrier_phase_step_rad, d_rem_code_phase_chips, d_code_phase_step_chips, d_current_prn_length_samples); // ################## PLL ########################################################## // PLL discriminator // Update PLL discriminator [rads/Ti -> Secs/Ti] carr_error_hz = pll_cloop_two_quadrant_atan(d_correlator_outs[1]) / GPS_TWO_PI; // prompt output // Carrier discriminator filter carr_error_filt_hz = d_carrier_loop_filter.get_carrier_nco(carr_error_hz); // New carrier Doppler frequency estimation d_carrier_doppler_hz = d_acq_carrier_doppler_hz + carr_error_filt_hz; // New code Doppler frequency estimation d_code_freq_chips = GPS_L1_CA_CODE_RATE_HZ + ((d_carrier_doppler_hz * GPS_L1_CA_CODE_RATE_HZ) / GPS_L1_FREQ_HZ); // ################## DLL ########################################################## // DLL discriminator code_error_chips = dll_nc_e_minus_l_normalized(d_correlator_outs[0], d_correlator_outs[2]); // [chips/Ti] //early and late // Code discriminator filter code_error_filt_chips = d_code_loop_filter.get_code_nco(code_error_chips); // [chips/second] double code_error_filt_secs = (GPS_L1_CA_CODE_PERIOD * code_error_filt_chips) / GPS_L1_CA_CODE_RATE_HZ; // [seconds] // ################## CARRIER AND CODE NCO BUFFER ALIGNEMENT ####################### // keep alignment parameters for the next input buffer // Compute the next buffer length based in the new period of the PRN sequence and the code phase error estimation double T_chip_seconds = 1.0 / static_cast(d_code_freq_chips); double T_prn_seconds = T_chip_seconds * GPS_L1_CA_CODE_LENGTH_CHIPS; double T_prn_samples = T_prn_seconds * static_cast(d_fs_in); double K_blk_samples = T_prn_samples + d_rem_code_phase_samples + code_error_filt_secs * static_cast(d_fs_in); d_current_prn_length_samples = round(K_blk_samples); // round to a discrete number of samples //################### PLL COMMANDS ################################################# // carrier phase step (NCO phase increment per sample) [rads/sample] d_carrier_phase_step_rad = GPS_TWO_PI * d_carrier_doppler_hz / static_cast(d_fs_in); // remnant carrier phase to prevent overflow in the code NCO d_rem_carr_phase_rad = d_rem_carr_phase_rad + d_carrier_phase_step_rad * d_current_prn_length_samples; d_rem_carr_phase_rad = fmod(d_rem_carr_phase_rad, GPS_TWO_PI); // carrier phase accumulator d_acc_carrier_phase_rad -= d_carrier_phase_step_rad * d_current_prn_length_samples; //################### DLL COMMANDS ################################################# // code phase step (Code resampler phase increment per sample) [chips/sample] d_code_phase_step_chips = d_code_freq_chips / static_cast(d_fs_in); // remnant code phase [chips] d_rem_code_phase_samples = K_blk_samples - d_current_prn_length_samples; // rounding error < 1 sample d_rem_code_phase_chips = d_code_freq_chips * (d_rem_code_phase_samples / static_cast(d_fs_in)); // ####### CN0 ESTIMATION AND LOCK DETECTORS ###### if (d_cn0_estimation_counter < CN0_ESTIMATION_SAMPLES) { // fill buffer with prompt correlator output values d_Prompt_buffer[d_cn0_estimation_counter] = d_correlator_outs[1]; //prompt d_cn0_estimation_counter++; } else { d_cn0_estimation_counter = 0; // Code lock indicator d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES, d_fs_in, GPS_L1_CA_CODE_LENGTH_CHIPS); // Carrier lock indicator d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES); // Loss of lock detection if (d_carrier_lock_test < d_carrier_lock_threshold or d_CN0_SNV_dB_Hz < MINIMUM_VALID_CN0) { d_carrier_lock_fail_counter++; } else { if (d_carrier_lock_fail_counter > 0) d_carrier_lock_fail_counter--; } if (d_carrier_lock_fail_counter > MAXIMUM_LOCK_FAIL_COUNTER) { std::cout << "Loss of lock in channel " << d_channel << "!" << std::endl; LOG(INFO) << "Loss of lock in channel " << d_channel << "!"; this->message_port_pub(pmt::mp("events"), pmt::from_long(3)); // 3 -> loss of lock d_carrier_lock_fail_counter = 0; d_enable_tracking = false; // TODO: check if disabling tracking is consistent with the channel state machine } } // ########### Output the tracking data to navigation and PVT ########## current_synchro_data.Prompt_I = static_cast((d_correlator_outs[1]).real()); current_synchro_data.Prompt_Q = static_cast((d_correlator_outs[1]).imag()); // Tracking_timestamp_secs is aligned with the CURRENT PRN start sample current_synchro_data.Tracking_timestamp_secs = (static_cast(d_sample_counter + d_current_prn_length_samples) + static_cast(d_rem_code_phase_samples)) / static_cast(d_fs_in); current_synchro_data.Rem_code_phase_secs = d_rem_code_phase_samples / static_cast(d_fs_in); current_synchro_data.Carrier_phase_rads = d_acc_carrier_phase_rad; current_synchro_data.Carrier_Doppler_hz = d_carrier_doppler_hz; current_synchro_data.CN0_dB_hz = d_CN0_SNV_dB_Hz; current_synchro_data.Flag_valid_symbol_output = true; current_synchro_data.correlation_length_ms = 1; } else { for (int n = 0; n < d_n_correlator_taps; n++) { d_correlator_outs[n] = gr_complex(0,0); } current_synchro_data.Tracking_timestamp_secs = (static_cast(d_sample_counter + d_current_prn_length_samples) + static_cast(d_rem_code_phase_samples)) / static_cast(d_fs_in); current_synchro_data.Rem_code_phase_secs = d_rem_code_phase_samples / static_cast(d_fs_in); current_synchro_data.System = {'G'}; } //assign the GNURadio block output data *out[0] = current_synchro_data; if(d_dump) { // MULTIPLEXED FILE RECORDING - Record results to file float prompt_I; float prompt_Q; float tmp_E, tmp_P, tmp_L; double tmp_double; unsigned long int tmp_long; prompt_I = d_correlator_outs[1].real(); prompt_Q = d_correlator_outs[1].imag(); tmp_E = std::abs(d_correlator_outs[0]); tmp_P = std::abs(d_correlator_outs[1]); tmp_L = std::abs(d_correlator_outs[2]); try { // EPR d_dump_file.write(reinterpret_cast(&tmp_E), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_P), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_L), sizeof(float)); // PROMPT I and Q (to analyze navigation symbols) d_dump_file.write(reinterpret_cast(&prompt_I), sizeof(float)); d_dump_file.write(reinterpret_cast(&prompt_Q), sizeof(float)); // PRN start sample stamp tmp_long = d_sample_counter + d_current_prn_length_samples; d_dump_file.write(reinterpret_cast(&tmp_long), sizeof(unsigned long int)); // accumulated carrier phase d_dump_file.write(reinterpret_cast(&d_acc_carrier_phase_rad), sizeof(double)); // carrier and code frequency d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); d_dump_file.write(reinterpret_cast(&d_code_freq_chips), sizeof(double)); // PLL commands d_dump_file.write(reinterpret_cast(&carr_error_hz), sizeof(double)); d_dump_file.write(reinterpret_cast(&carr_error_filt_hz), sizeof(double)); // DLL commands d_dump_file.write(reinterpret_cast(&code_error_chips), sizeof(double)); d_dump_file.write(reinterpret_cast(&code_error_filt_chips), sizeof(double)); // CN0 and carrier lock test d_dump_file.write(reinterpret_cast(&d_CN0_SNV_dB_Hz), sizeof(double)); d_dump_file.write(reinterpret_cast(&d_carrier_lock_test), sizeof(double)); // AUX vars (for debug purposes) tmp_double = d_rem_code_phase_samples; d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); tmp_double = static_cast(d_sample_counter); d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); } catch (const std::ifstream::failure &e) { LOG(WARNING) << "Exception writing trk dump file " << e.what(); } } consume_each(d_current_prn_length_samples); // this is necessary in gr::block derivates d_sample_counter += d_current_prn_length_samples; // count for the processed samples return 1; // output tracking result ALWAYS even in the case of d_enable_tracking==false } void Gps_L1_Ca_Dll_Pll_Tracking_cc::set_channel(unsigned int channel) { d_channel = channel; LOG(INFO) << "Tracking Channel set to " << d_channel; // ############# ENABLE DATA FILE LOG ################# if (d_dump == true) { if (d_dump_file.is_open() == false) { try { d_dump_filename.append(boost::lexical_cast(d_channel)); d_dump_filename.append(".dat"); d_dump_file.exceptions (std::ifstream::failbit | std::ifstream::badbit); d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); LOG(INFO) << "Tracking dump enabled on channel " << d_channel << " Log file: " << d_dump_filename.c_str(); } catch (const std::ifstream::failure &e) { LOG(WARNING) << "channel " << d_channel << " Exception opening trk dump file " << e.what(); } } } } void Gps_L1_Ca_Dll_Pll_Tracking_cc::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { d_acquisition_gnss_synchro = p_gnss_synchro; } gnss-sdr-0.0.9/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.h000066400000000000000000000122731305042567700312370ustar00rootroot00000000000000/*! * \file gps_l1_ca_dll_pll_tracking_cc.h * \brief Interface of a code DLL + carrier PLL tracking block * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Javier Arribas, 2011. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency Approach, * Birkhauser, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L1_CA_DLL_PLL_TRACKING_CC_H #define GNSS_SDR_GPS_L1_CA_DLL_PLL_TRACKING_CC_H #include #include #include #include #include "gnss_synchro.h" #include "tracking_2nd_DLL_filter.h" #include "tracking_2nd_PLL_filter.h" #include "cpu_multicorrelator.h" class Gps_L1_Ca_Dll_Pll_Tracking_cc; typedef boost::shared_ptr gps_l1_ca_dll_pll_tracking_cc_sptr; gps_l1_ca_dll_pll_tracking_cc_sptr gps_l1_ca_dll_pll_make_tracking_cc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float early_late_space_chips); /*! * \brief This class implements a DLL + PLL tracking loop block */ class Gps_L1_Ca_Dll_Pll_Tracking_cc: public gr::block { public: ~Gps_L1_Ca_Dll_Pll_Tracking_cc(); void set_channel(unsigned int channel); void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); void start_tracking(); int general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); void forecast (int noutput_items, gr_vector_int &ninput_items_required); private: friend gps_l1_ca_dll_pll_tracking_cc_sptr gps_l1_ca_dll_pll_make_tracking_cc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float early_late_space_chips); Gps_L1_Ca_Dll_Pll_Tracking_cc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float early_late_space_chips); // tracking configuration vars unsigned int d_vector_length; bool d_dump; Gnss_Synchro* d_acquisition_gnss_synchro; unsigned int d_channel; long d_if_freq; long d_fs_in; double d_early_late_spc_chips; // remaining code phase and carrier phase between tracking loops double d_rem_code_phase_samples; double d_rem_code_phase_chips; double d_rem_carr_phase_rad; // PLL and DLL filter library Tracking_2nd_DLL_filter d_code_loop_filter; Tracking_2nd_PLL_filter d_carrier_loop_filter; // acquisition double d_acq_code_phase_samples; double d_acq_carrier_doppler_hz; // correlator int d_n_correlator_taps; gr_complex* d_ca_code; float* d_local_code_shift_chips; gr_complex* d_correlator_outs; cpu_multicorrelator multicorrelator_cpu; // tracking vars double d_code_freq_chips; double d_code_phase_step_chips; double d_carrier_doppler_hz; double d_carrier_phase_step_rad; double d_acc_carrier_phase_rad; double d_code_phase_samples; //PRN period in samples int d_current_prn_length_samples; //processing samples counters unsigned long int d_sample_counter; unsigned long int d_acq_sample_stamp; // CN0 estimation and lock detector int d_cn0_estimation_counter; gr_complex* d_Prompt_buffer; double d_carrier_lock_test; double d_CN0_SNV_dB_Hz; double d_carrier_lock_threshold; int d_carrier_lock_fail_counter; // control vars bool d_enable_tracking; bool d_pull_in; // file dump std::string d_dump_filename; std::ofstream d_dump_file; std::map systemName; std::string sys; }; #endif //GNSS_SDR_GPS_L1_CA_DLL_PLL_TRACKING_CC_H gnss-sdr-0.0.9/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_gpu_cc.cc000066400000000000000000000642731305042567700322570ustar00rootroot00000000000000/*! * \file gps_l1_ca_dll_pll_tracking_gpu_cc.cc * \brief Implementation of a code DLL + carrier PLL tracking block GPU ACCELERATED * \author Javier Arribas, 2015. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l1_ca_dll_pll_tracking_gpu_cc.h" #include #include #include #include #include #include #include #include "gps_sdr_signal_processing.h" #include "tracking_discriminators.h" #include "lock_detectors.h" #include "GPS_L1_CA.h" #include "control_message_factory.h" // includes #include /*! * \todo Include in definition header file */ #define CN0_ESTIMATION_SAMPLES 20 #define MINIMUM_VALID_CN0 25 #define MAXIMUM_LOCK_FAIL_COUNTER 50 #define CARRIER_LOCK_THRESHOLD 0.85 using google::LogMessage; gps_l1_ca_dll_pll_tracking_gpu_cc_sptr gps_l1_ca_dll_pll_make_tracking_gpu_cc( long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float early_late_space_chips) { return gps_l1_ca_dll_pll_tracking_gpu_cc_sptr(new Gps_L1_Ca_Dll_Pll_Tracking_GPU_cc(if_freq, fs_in, vector_length, dump, dump_filename, pll_bw_hz, dll_bw_hz, early_late_space_chips)); } void Gps_L1_Ca_Dll_Pll_Tracking_GPU_cc::forecast (int noutput_items, gr_vector_int &ninput_items_required) { if (noutput_items != 0) { ninput_items_required[0] = static_cast(d_vector_length) * 2; //set the required available samples in each call } } Gps_L1_Ca_Dll_Pll_Tracking_GPU_cc::Gps_L1_Ca_Dll_Pll_Tracking_GPU_cc( long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float early_late_space_chips) : gr::block("Gps_L1_Ca_Dll_Pll_Tracking_GPU_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { // Telemetry bit synchronization message port input this->message_port_register_in(pmt::mp("preamble_timestamp_s")); this->message_port_register_out(pmt::mp("events")); // initialize internal vars d_dump = dump; d_if_freq = if_freq; d_fs_in = fs_in; d_vector_length = vector_length; d_dump_filename = dump_filename; d_correlation_length_samples = static_cast(d_vector_length); // Initialize tracking ========================================== d_code_loop_filter.set_DLL_BW(dll_bw_hz); d_carrier_loop_filter.set_params(10.0, pll_bw_hz,2); //--- DLL variables -------------------------------------------------------- d_early_late_spc_chips = early_late_space_chips; // Define early-late offset (in chips) // Set GPU flags cudaSetDeviceFlags(cudaDeviceMapHost); //allocate host memory //pinned memory mode - use special function to get OS-pinned memory d_n_correlator_taps = 3; // Early, Prompt, and Late // Get space for a vector with the C/A code replica sampled 1x/chip cudaHostAlloc((void**)&d_ca_code, (static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS)* sizeof(gr_complex)), cudaHostAllocMapped || cudaHostAllocWriteCombined); // Get space for the resampled early / prompt / late local replicas cudaHostAlloc((void**)&d_local_code_shift_chips, d_n_correlator_taps * sizeof(float), cudaHostAllocMapped || cudaHostAllocWriteCombined); cudaHostAlloc((void**)&in_gpu, 2 * d_vector_length * sizeof(gr_complex), cudaHostAllocMapped || cudaHostAllocWriteCombined); // correlator outputs (scalar) cudaHostAlloc((void**)&d_correlator_outs ,sizeof(gr_complex)*d_n_correlator_taps, cudaHostAllocMapped || cudaHostAllocWriteCombined ); // Set TAPs delay values [chips] d_local_code_shift_chips[0] = - d_early_late_spc_chips; d_local_code_shift_chips[1] = 0.0; d_local_code_shift_chips[2] = d_early_late_spc_chips; //--- Perform initializations ------------------------------ multicorrelator_gpu = new cuda_multicorrelator(); //local code resampler on GPU multicorrelator_gpu->init_cuda_integrated_resampler(2 * d_vector_length, GPS_L1_CA_CODE_LENGTH_CHIPS, d_n_correlator_taps); multicorrelator_gpu->set_input_output_vectors(d_correlator_outs, in_gpu); // define initial code frequency basis of NCO d_code_freq_chips = GPS_L1_CA_CODE_RATE_HZ; // define residual code phase (in chips) d_rem_code_phase_samples = 0.0; // define residual carrier phase d_rem_carrier_phase_rad = 0.0; // sample synchronization d_sample_counter = 0; //d_sample_counter_seconds = 0; d_acq_sample_stamp = 0; d_enable_tracking = false; d_pull_in = false; // CN0 estimation and lock detector buffers d_cn0_estimation_counter = 0; d_Prompt_buffer = new gr_complex[CN0_ESTIMATION_SAMPLES]; d_carrier_lock_test = 1; d_CN0_SNV_dB_Hz = 0; d_carrier_lock_fail_counter = 0; d_carrier_lock_threshold = CARRIER_LOCK_THRESHOLD; systemName["G"] = std::string("GPS"); systemName["S"] = std::string("SBAS"); set_relative_rate(1.0 / (static_cast(d_vector_length) * 2.0)); d_acquisition_gnss_synchro = 0; d_channel = 0; d_acq_code_phase_samples = 0.0; d_acq_carrier_doppler_hz = 0.0; d_carrier_doppler_hz = 0.0; d_acc_carrier_phase_cycles = 0.0; d_code_phase_samples = 0.0; d_pll_to_dll_assist_secs_Ti = 0.0; d_rem_code_phase_chips = 0.0; d_code_phase_step_chips = 0.0; d_carrier_phase_step_rad = 0.0; //set_min_output_buffer((long int)300); } void Gps_L1_Ca_Dll_Pll_Tracking_GPU_cc::start_tracking() { /* * correct the code phase according to the delay between acq and trk */ d_acq_code_phase_samples = d_acquisition_gnss_synchro->Acq_delay_samples; d_acq_carrier_doppler_hz = d_acquisition_gnss_synchro->Acq_doppler_hz; d_acq_sample_stamp = d_acquisition_gnss_synchro->Acq_samplestamp_samples; long int acq_trk_diff_samples; double acq_trk_diff_seconds; acq_trk_diff_samples = static_cast(d_sample_counter) - static_cast(d_acq_sample_stamp);//-d_vector_length; DLOG(INFO) << "Number of samples between Acquisition and Tracking =" << acq_trk_diff_samples; acq_trk_diff_seconds = static_cast(acq_trk_diff_samples) / static_cast(d_fs_in); //doppler effect // Fd=(C/(C+Vr))*F double radial_velocity = (GPS_L1_FREQ_HZ + d_acq_carrier_doppler_hz) / GPS_L1_FREQ_HZ; // new chip and prn sequence periods based on acq Doppler double T_chip_mod_seconds; double T_prn_mod_seconds; double T_prn_mod_samples; d_code_freq_chips = radial_velocity * GPS_L1_CA_CODE_RATE_HZ; d_code_phase_step_chips = static_cast(d_code_freq_chips) / static_cast(d_fs_in); T_chip_mod_seconds = 1/d_code_freq_chips; T_prn_mod_seconds = T_chip_mod_seconds * GPS_L1_CA_CODE_LENGTH_CHIPS; T_prn_mod_samples = T_prn_mod_seconds * static_cast(d_fs_in); d_correlation_length_samples = round(T_prn_mod_samples); double T_prn_true_seconds = GPS_L1_CA_CODE_LENGTH_CHIPS / GPS_L1_CA_CODE_RATE_HZ; double T_prn_true_samples = T_prn_true_seconds * static_cast(d_fs_in); double T_prn_diff_seconds = T_prn_true_seconds - T_prn_mod_seconds; double N_prn_diff = acq_trk_diff_seconds / T_prn_true_seconds; double corrected_acq_phase_samples, delay_correction_samples; corrected_acq_phase_samples = fmod((d_acq_code_phase_samples + T_prn_diff_seconds * N_prn_diff * static_cast(d_fs_in)), T_prn_true_samples); if (corrected_acq_phase_samples < 0) { corrected_acq_phase_samples = T_prn_mod_samples + corrected_acq_phase_samples; } delay_correction_samples = d_acq_code_phase_samples - corrected_acq_phase_samples; d_acq_code_phase_samples = corrected_acq_phase_samples; d_carrier_doppler_hz = d_acq_carrier_doppler_hz; d_carrier_phase_step_rad = GPS_TWO_PI * d_carrier_doppler_hz / static_cast(d_fs_in); // DLL/PLL filter initialization d_carrier_loop_filter.initialize(d_acq_carrier_doppler_hz); //The carrier loop filter implements the Doppler accumulator d_code_loop_filter.initialize(); // initialize the code filter // generate local reference ALWAYS starting at chip 1 (1 sample per chip) gps_l1_ca_code_gen_complex(d_ca_code, d_acquisition_gnss_synchro->PRN, 0); multicorrelator_gpu->set_local_code_and_taps(static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS), d_ca_code, d_local_code_shift_chips, d_n_correlator_taps); for (int n = 0; n < d_n_correlator_taps; n++) { d_correlator_outs[n] = gr_complex(0,0); } d_carrier_lock_fail_counter = 0; d_rem_code_phase_samples = 0.0; d_rem_carrier_phase_rad = 0.0; d_rem_code_phase_chips = 0.0; d_acc_carrier_phase_cycles = 0.0; d_pll_to_dll_assist_secs_Ti = 0.0; d_code_phase_samples = d_acq_code_phase_samples; std::string sys_ = &d_acquisition_gnss_synchro->System; sys = sys_.substr(0,1); // DEBUG OUTPUT std::cout << "Tracking start on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << std::endl; LOG(INFO) << "Starting tracking of satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << " on channel " << d_channel; // enable tracking d_pull_in = true; d_enable_tracking = true; LOG(INFO) << "PULL-IN Doppler [Hz]=" << d_carrier_doppler_hz << " Code Phase correction [samples]=" << delay_correction_samples << " PULL-IN Code Phase [samples]=" << d_acq_code_phase_samples; } Gps_L1_Ca_Dll_Pll_Tracking_GPU_cc::~Gps_L1_Ca_Dll_Pll_Tracking_GPU_cc() { d_dump_file.close(); cudaFreeHost(in_gpu); cudaFreeHost(d_correlator_outs); cudaFreeHost(d_local_code_shift_chips); cudaFreeHost(d_ca_code); multicorrelator_gpu->free_cuda(); delete[] d_Prompt_buffer; delete(multicorrelator_gpu); } int Gps_L1_Ca_Dll_Pll_Tracking_GPU_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) { // Block input data and block output stream pointers const gr_complex* in = (gr_complex*) input_items[0]; //PRN start block alignment Gnss_Synchro **out = (Gnss_Synchro **) &output_items[0]; // GNSS_SYNCHRO OBJECT to interchange data between tracking->telemetry_decoder Gnss_Synchro current_synchro_data = Gnss_Synchro(); // process vars double code_error_chips_Ti = 0.0; double code_error_filt_chips = 0.0; double code_error_filt_secs_Ti = 0.0; double CURRENT_INTEGRATION_TIME_S; double CORRECTED_INTEGRATION_TIME_S; double dll_code_error_secs_Ti = 0.0; double carr_phase_error_secs_Ti = 0.0; double old_d_rem_code_phase_samples; if (d_enable_tracking == true) { // Fill the acquisition data current_synchro_data = *d_acquisition_gnss_synchro; // Receiver signal alignment if (d_pull_in == true) { int samples_offset; double acq_trk_shif_correction_samples; int acq_to_trk_delay_samples; acq_to_trk_delay_samples = d_sample_counter - d_acq_sample_stamp; acq_trk_shif_correction_samples = d_correlation_length_samples - fmod(static_cast(acq_to_trk_delay_samples), static_cast(d_correlation_length_samples)); samples_offset = round(d_acq_code_phase_samples + acq_trk_shif_correction_samples); current_synchro_data.Tracking_timestamp_secs = (static_cast(d_sample_counter) + static_cast(d_rem_code_phase_samples)) / static_cast(d_fs_in); *out[0] = current_synchro_data; d_sample_counter += samples_offset; //count for the processed samples d_pull_in = false; consume_each(samples_offset); //shift input to perform alignment with local replica return 1; } // ################# CARRIER WIPEOFF AND CORRELATORS ############################## // perform carrier wipe-off and compute Early, Prompt and Late correlation memcpy(in_gpu, in, sizeof(gr_complex) * d_correlation_length_samples); cudaProfilerStart(); multicorrelator_gpu->Carrier_wipeoff_multicorrelator_resampler_cuda( static_cast(d_rem_carrier_phase_rad), static_cast(d_carrier_phase_step_rad), static_cast(d_code_phase_step_chips), static_cast(d_rem_code_phase_chips), d_correlation_length_samples, d_n_correlator_taps); cudaProfilerStop(); //std::cout<<"c_out[0]="<(d_correlation_length_samples) / static_cast(d_fs_in); // ################## PLL ########################################################## // Update PLL discriminator [rads/Ti -> Secs/Ti] carr_phase_error_secs_Ti = pll_cloop_two_quadrant_atan(d_correlator_outs[1]) / GPS_TWO_PI; //prompt output // Carrier discriminator filter // NOTICE: The carrier loop filter includes the Carrier Doppler accumulator, as described in Kaplan //d_carrier_doppler_hz = d_acq_carrier_doppler_hz + carr_phase_error_filt_secs_ti/INTEGRATION_TIME; // Input [s/Ti] -> output [Hz] d_carrier_doppler_hz = d_carrier_loop_filter.get_carrier_error(0.0, carr_phase_error_secs_Ti, CURRENT_INTEGRATION_TIME_S); // PLL to DLL assistance [Secs/Ti] d_pll_to_dll_assist_secs_Ti = (d_carrier_doppler_hz * CURRENT_INTEGRATION_TIME_S) / GPS_L1_FREQ_HZ; // code Doppler frequency update d_code_freq_chips = GPS_L1_CA_CODE_RATE_HZ + ((d_carrier_doppler_hz * GPS_L1_CA_CODE_RATE_HZ) / GPS_L1_FREQ_HZ); // ################## DLL ########################################################## // DLL discriminator code_error_chips_Ti = dll_nc_e_minus_l_normalized(d_correlator_outs[0], d_correlator_outs[2]); //[chips/Ti] //early and late // Code discriminator filter code_error_filt_chips = d_code_loop_filter.get_code_nco(code_error_chips_Ti); //input [chips/Ti] -> output [chips/second] code_error_filt_secs_Ti = code_error_filt_chips*CURRENT_INTEGRATION_TIME_S/d_code_freq_chips; // [s/Ti] // DLL code error estimation [s/Ti] // TODO: PLL carrier aid to DLL is disabled. Re-enable it and measure performance dll_code_error_secs_Ti = - code_error_filt_secs_Ti + d_pll_to_dll_assist_secs_Ti; // ################## CARRIER AND CODE NCO BUFFER ALIGNEMENT ####################### // keep alignment parameters for the next input buffer double T_chip_seconds; double T_prn_seconds; double T_prn_samples; double K_blk_samples; // Compute the next buffer length based in the new period of the PRN sequence and the code phase error estimation T_chip_seconds = 1 / d_code_freq_chips; T_prn_seconds = T_chip_seconds * GPS_L1_CA_CODE_LENGTH_CHIPS; T_prn_samples = T_prn_seconds * static_cast(d_fs_in); K_blk_samples = T_prn_samples + d_rem_code_phase_samples - dll_code_error_secs_Ti * static_cast(d_fs_in); d_correlation_length_samples = round(K_blk_samples); //round to a discrete samples old_d_rem_code_phase_samples=d_rem_code_phase_samples; d_rem_code_phase_samples = K_blk_samples - static_cast(d_correlation_length_samples); //rounding error < 1 sample // UPDATE REMNANT CARRIER PHASE CORRECTED_INTEGRATION_TIME_S = (static_cast(d_correlation_length_samples)/static_cast(d_fs_in)); //remnant carrier phase [rad] d_rem_carrier_phase_rad = fmod(d_rem_carrier_phase_rad + GPS_TWO_PI * d_carrier_doppler_hz * CORRECTED_INTEGRATION_TIME_S, GPS_TWO_PI); // UPDATE CARRIER PHASE ACCUULATOR //carrier phase accumulator prior to update the PLL estimators (accumulated carrier in this loop depends on the old estimations!) d_acc_carrier_phase_cycles -= d_carrier_doppler_hz * CORRECTED_INTEGRATION_TIME_S; //################### PLL COMMANDS ################################################# //carrier phase step (NCO phase increment per sample) [rads/sample] d_carrier_phase_step_rad = GPS_TWO_PI * d_carrier_doppler_hz / static_cast(d_fs_in); //################### DLL COMMANDS ################################################# //code phase step (Code resampler phase increment per sample) [chips/sample] d_code_phase_step_chips = d_code_freq_chips / static_cast(d_fs_in); //remnant code phase [chips] d_rem_code_phase_chips = d_rem_code_phase_samples * (d_code_freq_chips / static_cast(d_fs_in)); // ####### CN0 ESTIMATION AND LOCK DETECTORS ####################################### if (d_cn0_estimation_counter < CN0_ESTIMATION_SAMPLES) { // fill buffer with prompt correlator output values d_Prompt_buffer[d_cn0_estimation_counter] = d_correlator_outs[1]; //prompt d_cn0_estimation_counter++; } else { d_cn0_estimation_counter = 0; // Code lock indicator d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES, d_fs_in, GPS_L1_CA_CODE_LENGTH_CHIPS); // Carrier lock indicator d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES); // Loss of lock detection if (d_carrier_lock_test < d_carrier_lock_threshold or d_CN0_SNV_dB_Hz < MINIMUM_VALID_CN0) { d_carrier_lock_fail_counter++; } else { if (d_carrier_lock_fail_counter > 0) d_carrier_lock_fail_counter--; } if (d_carrier_lock_fail_counter > MAXIMUM_LOCK_FAIL_COUNTER) { std::cout << "Loss of lock in channel " << d_channel << "!" << std::endl; LOG(INFO) << "Loss of lock in channel " << d_channel << "!"; this->message_port_pub(pmt::mp("events"), pmt::from_long(3));//3 -> loss of lock d_carrier_lock_fail_counter = 0; d_enable_tracking = false; // TODO: check if disabling tracking is consistent with the channel state machine } } // ########### Output the tracking data to navigation and PVT ########## current_synchro_data.Prompt_I = static_cast((d_correlator_outs[1]).real()); current_synchro_data.Prompt_Q = static_cast((d_correlator_outs[1]).imag()); // Tracking_timestamp_secs is aligned with the CURRENT PRN start sample (Hybridization OK!) current_synchro_data.Tracking_timestamp_secs = (static_cast(d_sample_counter) + old_d_rem_code_phase_samples) / static_cast(d_fs_in); // This tracking block aligns the Tracking_timestamp_secs with the start sample of the PRN, thus, Code_phase_secs=0 current_synchro_data.Code_phase_secs = 0; current_synchro_data.Carrier_phase_rads = GPS_TWO_PI * d_acc_carrier_phase_cycles; current_synchro_data.Carrier_Doppler_hz = d_carrier_doppler_hz; current_synchro_data.CN0_dB_hz = d_CN0_SNV_dB_Hz; current_synchro_data.Flag_valid_symbol_output = true; current_synchro_data.correlation_length_ms=1; } else { for (int n = 0; n < d_n_correlator_taps; n++) { d_correlator_outs[n] = gr_complex(0,0); } current_synchro_data.System = {'G'}; current_synchro_data.Tracking_timestamp_secs = (static_cast(d_sample_counter) + static_cast(d_rem_code_phase_samples)) / static_cast(d_fs_in); } //assign the GNURadio block output data *out[0] = current_synchro_data; if(d_dump) { // MULTIPLEXED FILE RECORDING - Record results to file float prompt_I; float prompt_Q; float tmp_E, tmp_P, tmp_L; double tmp_double; prompt_I = d_correlator_outs[1].real(); prompt_Q = d_correlator_outs[1].imag(); tmp_E = std::abs(d_correlator_outs[0]); tmp_P = std::abs(d_correlator_outs[1]); tmp_L = std::abs(d_correlator_outs[2]); try { // EPR d_dump_file.write(reinterpret_cast(&tmp_E), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_P), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_L), sizeof(float)); // PROMPT I and Q (to analyze navigation symbols) d_dump_file.write(reinterpret_cast(&prompt_I), sizeof(float)); d_dump_file.write(reinterpret_cast(&prompt_Q), sizeof(float)); // PRN start sample stamp //tmp_float=(float)d_sample_counter; d_dump_file.write(reinterpret_cast(&d_sample_counter), sizeof(unsigned long int)); // accumulated carrier phase d_dump_file.write(reinterpret_cast(&d_acc_carrier_phase_cycles), sizeof(double)); // carrier and code frequency d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); d_dump_file.write(reinterpret_cast(&d_code_freq_chips), sizeof(double)); //PLL commands d_dump_file.write(reinterpret_cast(&carr_phase_error_secs_Ti), sizeof(double)); d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); //DLL commands d_dump_file.write(reinterpret_cast(&code_error_chips_Ti), sizeof(double)); d_dump_file.write(reinterpret_cast(&code_error_filt_chips), sizeof(double)); // CN0 and carrier lock test d_dump_file.write(reinterpret_cast(&d_CN0_SNV_dB_Hz), sizeof(double)); d_dump_file.write(reinterpret_cast(&d_carrier_lock_test), sizeof(double)); // AUX vars (for debug purposes) tmp_double = d_rem_code_phase_samples; d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); tmp_double = static_cast(d_sample_counter + d_correlation_length_samples); d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); } catch (const std::ifstream::failure* e) { LOG(WARNING) << "Exception writing trk dump file " << e->what(); } } consume_each(d_correlation_length_samples); // this is necessary in gr::block derivates d_sample_counter += d_correlation_length_samples; //count for the processed samples return 1; //output tracking result ALWAYS even in the case of d_enable_tracking==false } void Gps_L1_Ca_Dll_Pll_Tracking_GPU_cc::set_channel(unsigned int channel) { d_channel = channel; LOG(INFO) << "Tracking Channel set to " << d_channel; // ############# ENABLE DATA FILE LOG ################# if (d_dump == true) { if (d_dump_file.is_open() == false) { try { d_dump_filename.append(boost::lexical_cast(d_channel)); d_dump_filename.append(".dat"); d_dump_file.exceptions (std::ifstream::failbit | std::ifstream::badbit); d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); LOG(INFO) << "Tracking dump enabled on channel " << d_channel << " Log file: " << d_dump_filename.c_str() << std::endl; } catch (const std::ifstream::failure* e) { LOG(WARNING) << "channel " << d_channel << " Exception opening trk dump file " << e->what() << std::endl; } } } } void Gps_L1_Ca_Dll_Pll_Tracking_GPU_cc::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { d_acquisition_gnss_synchro = p_gnss_synchro; } gnss-sdr-0.0.9/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_gpu_cc.h000066400000000000000000000127021305042567700321070ustar00rootroot00000000000000/*! * \file gps_l1_ca_dll_pll_tracking_gpu_cc.h * \brief Implementation of a code DLL + carrier PLL tracking block, GPU ACCELERATED * \author Javier Arribas, 2015. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency Approach, * Birkhauser, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L1_CA_DLL_PLL_TRACKING_GPU_CC_H #define GNSS_SDR_GPS_L1_CA_DLL_PLL_TRACKING_GPU_CC_H #include #include #include #include #include "gnss_synchro.h" #include "tracking_2nd_DLL_filter.h" #include "tracking_FLL_PLL_filter.h" #include "cuda_multicorrelator.h" class Gps_L1_Ca_Dll_Pll_Tracking_GPU_cc; typedef boost::shared_ptr gps_l1_ca_dll_pll_tracking_gpu_cc_sptr; gps_l1_ca_dll_pll_tracking_gpu_cc_sptr gps_l1_ca_dll_pll_make_tracking_gpu_cc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float early_late_space_chips); /*! * \brief This class implements a DLL + PLL tracking loop block */ class Gps_L1_Ca_Dll_Pll_Tracking_GPU_cc: public gr::block { public: ~Gps_L1_Ca_Dll_Pll_Tracking_GPU_cc(); void set_channel(unsigned int channel); void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); void start_tracking(); int general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); void forecast (int noutput_items, gr_vector_int &ninput_items_required); private: friend gps_l1_ca_dll_pll_tracking_gpu_cc_sptr gps_l1_ca_dll_pll_make_tracking_gpu_cc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float early_late_space_chips); Gps_L1_Ca_Dll_Pll_Tracking_GPU_cc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float early_late_space_chips); void update_local_code(); void update_local_carrier(); // tracking configuration vars unsigned int d_vector_length; bool d_dump; Gnss_Synchro* d_acquisition_gnss_synchro; unsigned int d_channel; long d_if_freq; long d_fs_in; double d_early_late_spc_chips; int d_n_correlator_taps; //GPU HOST PINNED MEMORY IN/OUT VECTORS gr_complex* in_gpu; float* d_local_code_shift_chips; gr_complex* d_correlator_outs; cuda_multicorrelator *multicorrelator_gpu; gr_complex* d_ca_code; gr_complex *d_Early; gr_complex *d_Prompt; gr_complex *d_Late; // remaining code phase and carrier phase between tracking loops double d_rem_code_phase_samples; double d_rem_code_phase_chips; double d_rem_carrier_phase_rad; // PLL and DLL filter library Tracking_2nd_DLL_filter d_code_loop_filter; Tracking_FLL_PLL_filter d_carrier_loop_filter; // acquisition double d_acq_code_phase_samples; double d_acq_carrier_doppler_hz; // tracking vars double d_code_freq_chips; double d_code_phase_step_chips; double d_carrier_doppler_hz; double d_carrier_phase_step_rad; double d_acc_carrier_phase_cycles; double d_code_phase_samples; double d_pll_to_dll_assist_secs_Ti; //Integration period in samples int d_correlation_length_samples; //processing samples counters unsigned long int d_sample_counter; unsigned long int d_acq_sample_stamp; // CN0 estimation and lock detector int d_cn0_estimation_counter; gr_complex* d_Prompt_buffer; double d_carrier_lock_test; double d_CN0_SNV_dB_Hz; double d_carrier_lock_threshold; int d_carrier_lock_fail_counter; // control vars bool d_enable_tracking; bool d_pull_in; // file dump std::string d_dump_filename; std::ofstream d_dump_file; std::map systemName; std::string sys; }; #endif //GNSS_SDR_GPS_L1_CA_DLL_PLL_TRACKING_GPU_CC_H gnss-sdr-0.0.9/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_tcp_connector_tracking_cc.cc000066400000000000000000000632041305042567700326130ustar00rootroot00000000000000/*! * \file gps_l1_ca_tcp_connector_tracking_cc.cc * \brief Implementation of a TCP connector block based on Code DLL + carrier PLL * \author David Pubill, 2012. dpubill(at)cttc.es * Javier Arribas, 2011. jarribas(at)cttc.es * * * Code DLL + carrier PLL according to the algorithms described in: * [1] K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach, Birkhauser, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l1_ca_tcp_connector_tracking_cc.h" #include #include #include #include #include #include #include #include #include "gps_sdr_signal_processing.h" #include "tracking_discriminators.h" #include "lock_detectors.h" #include "GPS_L1_CA.h" #include "control_message_factory.h" #include "tcp_communication.h" #include "tcp_packet_data.h" /*! * \todo Include in definition header file */ #define CN0_ESTIMATION_SAMPLES 20 #define MINIMUM_VALID_CN0 25 #define MAXIMUM_LOCK_FAIL_COUNTER 50 #define CARRIER_LOCK_THRESHOLD 0.85 using google::LogMessage; gps_l1_ca_tcp_connector_tracking_cc_sptr gps_l1_ca_tcp_connector_make_tracking_cc( long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float early_late_space_chips, size_t port_ch0) { return gps_l1_ca_tcp_connector_tracking_cc_sptr(new Gps_L1_Ca_Tcp_Connector_Tracking_cc(if_freq, fs_in, vector_length, dump, dump_filename, early_late_space_chips, port_ch0)); } void Gps_L1_Ca_Tcp_Connector_Tracking_cc::forecast (int noutput_items, gr_vector_int &ninput_items_required) { if (noutput_items != 0) { ninput_items_required[0] = (int)d_vector_length*2; //set the required available samples in each call } } Gps_L1_Ca_Tcp_Connector_Tracking_cc::Gps_L1_Ca_Tcp_Connector_Tracking_cc( long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float early_late_space_chips, size_t port_ch0) : gr::block("Gps_L1_Ca_Tcp_Connector_Tracking_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { // Telemetry bit synchronization message port input this->message_port_register_in(pmt::mp("preamble_timestamp_s")); this->message_port_register_out(pmt::mp("events")); // initialize internal vars d_dump = dump; d_if_freq = if_freq; d_fs_in = fs_in; d_vector_length = vector_length; d_dump_filename = dump_filename; //--- DLL variables -------------------------------------------------------- d_early_late_spc_chips = early_late_space_chips; // Define early-late offset (in chips) //--- TCP CONNECTOR variables -------------------------------------------------------- d_port_ch0 = port_ch0; d_port = 0; d_listen_connection = true; d_control_id = 0; // Initialization of local code replica // Get space for a vector with the C/A code replica sampled 1x/chip d_ca_code = static_cast(volk_gnsssdr_malloc((GPS_L1_CA_CODE_LENGTH_CHIPS) * sizeof(gr_complex), volk_gnsssdr_get_alignment())); // correlator outputs (scalar) d_n_correlator_taps = 3; // Very-Early, Early, Prompt, Late, Very-Late d_correlator_outs = static_cast(volk_gnsssdr_malloc(d_n_correlator_taps*sizeof(gr_complex), volk_gnsssdr_get_alignment())); for (int n = 0; n < d_n_correlator_taps; n++) { d_correlator_outs[n] = gr_complex(0,0); } // map memory pointers of correlator outputs d_Early = &d_correlator_outs[0]; d_Prompt = &d_correlator_outs[1]; d_Late = &d_correlator_outs[2]; d_local_code_shift_chips = static_cast(volk_gnsssdr_malloc(d_n_correlator_taps * sizeof(float), volk_gnsssdr_get_alignment())); // Set TAPs delay values [chips] d_local_code_shift_chips[0] = - d_early_late_spc_chips; d_local_code_shift_chips[1] = 0.0; d_local_code_shift_chips[2] = d_early_late_spc_chips; d_correlation_length_samples=d_vector_length; multicorrelator_cpu.init(2 * d_correlation_length_samples, d_n_correlator_taps); //--- Perform initializations ------------------------------ // define initial code frequency basis of NCO d_code_freq_hz = GPS_L1_CA_CODE_RATE_HZ; // define residual code phase (in chips) d_rem_code_phase_samples = 0.0; // define residual carrier phase d_rem_carr_phase_rad = 0.0; // sample synchronization d_sample_counter = 0; d_sample_counter_seconds = 0; d_acq_sample_stamp = 0; d_enable_tracking = false; d_pull_in = false; d_current_prn_length_samples = (int)d_vector_length; // CN0 estimation and lock detector buffers d_cn0_estimation_counter = 0; d_Prompt_buffer = new gr_complex[CN0_ESTIMATION_SAMPLES]; d_carrier_lock_test = 1; d_CN0_SNV_dB_Hz = 0; d_carrier_lock_fail_counter = 0; d_carrier_lock_threshold = CARRIER_LOCK_THRESHOLD; systemName["G"] = std::string("GPS"); systemName["R"] = std::string("GLONASS"); systemName["S"] = std::string("SBAS"); systemName["E"] = std::string("Galileo"); systemName["C"] = std::string("Compass"); d_acquisition_gnss_synchro = 0; d_channel = 0; d_next_rem_code_phase_samples = 0; d_acq_code_phase_samples = 0.0; d_acq_carrier_doppler_hz = 0.0; d_carrier_doppler_hz = 0.0; d_acc_carrier_phase_rad = 0.0; d_code_phase_samples = 0; d_next_prn_length_samples = 0; d_code_phase_step_chips = 0.0; } void Gps_L1_Ca_Tcp_Connector_Tracking_cc::start_tracking() { /* * correct the code phase according to the delay between acq and trk */ d_acq_code_phase_samples = d_acquisition_gnss_synchro->Acq_delay_samples; d_acq_carrier_doppler_hz = d_acquisition_gnss_synchro->Acq_doppler_hz; d_acq_sample_stamp = d_acquisition_gnss_synchro->Acq_samplestamp_samples; long int acq_trk_diff_samples; float acq_trk_diff_seconds; // jarribas: this patch correct a situation where the tracking sample counter // is equal to 0 (remains in the initial state) at the first acquisition to tracking transition // of the receiver operation when is connecting to simulink server. // if (d_sample_counterPRN) << std::endl; LOG(INFO) << "Starting tracking of satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << " on channel " << d_channel; // enable tracking d_pull_in = true; d_enable_tracking = true; LOG(INFO) << "PULL-IN Doppler [Hz]=" << d_carrier_doppler_hz << " Code Phase correction [samples]=" << delay_correction_samples << " PULL-IN Code Phase [samples]=" << d_acq_code_phase_samples; } Gps_L1_Ca_Tcp_Connector_Tracking_cc::~Gps_L1_Ca_Tcp_Connector_Tracking_cc() { d_dump_file.close(); delete[] d_Prompt_buffer; volk_gnsssdr_free(d_ca_code); volk_gnsssdr_free(d_local_code_shift_chips); volk_gnsssdr_free(d_correlator_outs); d_tcp_com.close_tcp_connection(d_port); multicorrelator_cpu.free(); } int Gps_L1_Ca_Tcp_Connector_Tracking_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) { // process vars float carr_error; float carr_nco; float code_error; float code_nco; tcp_packet_data tcp_data; // GNSS_SYNCHRO OBJECT to interchange data between tracking->telemetry_decoder Gnss_Synchro current_synchro_data = Gnss_Synchro(); // Block input data and block output stream pointers const gr_complex* in = (gr_complex*) input_items[0]; Gnss_Synchro **out = (Gnss_Synchro **) &output_items[0]; if (d_enable_tracking == true) { // Fill the acquisition data current_synchro_data = *d_acquisition_gnss_synchro; /* * Receiver signal alignment */ if (d_pull_in == true) { int samples_offset; // 28/11/2011 ACQ to TRK transition BUG CORRECTION float acq_trk_shif_correction_samples; int acq_to_trk_delay_samples; acq_to_trk_delay_samples = d_sample_counter - d_acq_sample_stamp; acq_trk_shif_correction_samples = d_next_prn_length_samples - fmod((float)acq_to_trk_delay_samples, (float)d_next_prn_length_samples); samples_offset = round(d_acq_code_phase_samples + acq_trk_shif_correction_samples); // /todo: Check if the sample counter sent to the next block as a time reference should be incremented AFTER sended or BEFORE current_synchro_data.Tracking_timestamp_secs = (static_cast(d_sample_counter) + static_cast(d_rem_code_phase_samples)) / static_cast(d_fs_in); *out[0] = current_synchro_data; d_sample_counter_seconds = d_sample_counter_seconds + (((double)samples_offset) / (double)d_fs_in); d_sample_counter = d_sample_counter + samples_offset; //count for the processed samples d_pull_in = false; consume_each(samples_offset); //shift input to perform alignement with local replica return 1; } // Update the prn length based on code freq (variable) and // sampling frequency (fixed) // variable code PRN sample block size d_current_prn_length_samples = d_next_prn_length_samples; // ################# CARRIER WIPEOFF AND CORRELATORS ############################## // perform carrier wipe-off and compute Early, Prompt and Late correlation multicorrelator_cpu.set_input_output_vectors(d_correlator_outs,in); double carr_phase_step_rad = GPS_TWO_PI * d_carrier_doppler_hz / static_cast(d_fs_in); double rem_code_phase_chips = d_rem_code_phase_samples * (d_code_freq_hz / d_fs_in); multicorrelator_cpu.Carrier_wipeoff_multicorrelator_resampler(d_rem_carr_phase_rad, carr_phase_step_rad, rem_code_phase_chips, d_code_phase_step_chips, d_current_prn_length_samples); //! Variable used for control d_control_id++; //! Send and receive a TCP packet boost::array tx_variables_array = {{d_control_id, (*d_Early).real(), (*d_Early).imag(), (*d_Late).real(), (*d_Late).imag(), (*d_Prompt).real(), (*d_Prompt).imag(), d_acq_carrier_doppler_hz, 1}}; d_tcp_com.send_receive_tcp_packet_gps_l1_ca(tx_variables_array, &tcp_data); //! Recover the tracking data code_error = tcp_data.proc_pack_code_error; carr_error = tcp_data.proc_pack_carr_error; // Modify carrier freq based on NCO command d_carrier_doppler_hz = tcp_data.proc_pack_carrier_doppler_hz; // Modify code freq based on NCO command code_nco = 1/(1/GPS_L1_CA_CODE_RATE_HZ - code_error/GPS_L1_CA_CODE_LENGTH_CHIPS); d_code_freq_hz = code_nco; // Update the phasestep based on code freq (variable) and // sampling frequency (fixed) d_code_phase_step_chips = d_code_freq_hz / (float)d_fs_in; //[chips] // variable code PRN sample block size double T_chip_seconds; double T_prn_seconds; double T_prn_samples; double K_blk_samples; T_chip_seconds = 1 / (double)d_code_freq_hz; T_prn_seconds = T_chip_seconds * GPS_L1_CA_CODE_LENGTH_CHIPS; T_prn_samples = T_prn_seconds * (double)d_fs_in; d_rem_code_phase_samples = d_next_rem_code_phase_samples; K_blk_samples = T_prn_samples + d_rem_code_phase_samples;//-code_error*(double)d_fs_in; // Update the current PRN delay (code phase in samples) double T_prn_true_seconds = GPS_L1_CA_CODE_LENGTH_CHIPS / GPS_L1_CA_CODE_RATE_HZ; double T_prn_true_samples = T_prn_true_seconds * (double)d_fs_in; d_code_phase_samples = d_code_phase_samples + T_prn_samples - T_prn_true_samples; if (d_code_phase_samples < 0) { d_code_phase_samples = T_prn_true_samples + d_code_phase_samples; } d_code_phase_samples = fmod(d_code_phase_samples, T_prn_true_samples); d_next_prn_length_samples = round(K_blk_samples); //round to a discrete samples d_next_rem_code_phase_samples = K_blk_samples - d_next_prn_length_samples; //rounding error /*! * \todo Improve the lock detection algorithm! */ // ####### CN0 ESTIMATION AND LOCK DETECTORS ###### if (d_cn0_estimation_counter < CN0_ESTIMATION_SAMPLES) { // fill buffer with prompt correlator output values d_Prompt_buffer[d_cn0_estimation_counter] = *d_Prompt; d_cn0_estimation_counter++; } else { d_cn0_estimation_counter = 0; d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES, d_fs_in, GPS_L1_CA_CODE_LENGTH_CHIPS); d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES); // ###### TRACKING UNLOCK NOTIFICATION ##### if (d_carrier_lock_test < d_carrier_lock_threshold or d_CN0_SNV_dB_Hz < MINIMUM_VALID_CN0) { d_carrier_lock_fail_counter++; } else { if (d_carrier_lock_fail_counter > 0) d_carrier_lock_fail_counter--; } if (d_carrier_lock_fail_counter > MAXIMUM_LOCK_FAIL_COUNTER) { std::cout << "Loss of lock in channel " << d_channel << "!" << std::endl; LOG(INFO) << "Loss of lock in channel " << d_channel << "!"; this->message_port_pub(pmt::mp("events"), pmt::from_long(3));//3 -> loss of lock d_carrier_lock_fail_counter = 0; d_enable_tracking = false; // TODO: check if disabling tracking is consistent with the channel state machine } } // ########### Output the tracking data to navigation and PVT ########## current_synchro_data.Prompt_I = (double)(*d_Prompt).real(); current_synchro_data.Prompt_Q = (double)(*d_Prompt).imag(); // Tracking_timestamp_secs is aligned with the CURRENT PRN start sample (Hybridization OK!, but some glitches??) current_synchro_data.Tracking_timestamp_secs = ((double)d_sample_counter + (double)d_rem_code_phase_samples)/(double)d_fs_in; //compute remnant code phase samples AFTER the Tracking timestamp d_rem_code_phase_samples = K_blk_samples - d_current_prn_length_samples; //rounding error < 1 sample // This tracking block aligns the Tracking_timestamp_secs with the start sample of the PRN, thus, Code_phase_secs=0 current_synchro_data.Tracking_timestamp_secs = d_sample_counter_seconds; current_synchro_data.Carrier_phase_rads = (double)d_acc_carrier_phase_rad; current_synchro_data.Carrier_Doppler_hz = (double)d_carrier_doppler_hz; current_synchro_data.CN0_dB_hz = (double)d_CN0_SNV_dB_Hz; current_synchro_data.Flag_valid_symbol_output = true; current_synchro_data.correlation_length_ms=1; } else { *d_Early = gr_complex(0,0); *d_Prompt = gr_complex(0,0); *d_Late = gr_complex(0,0); // GNSS_SYNCHRO OBJECT to interchange data between tracking->telemetry_decoder current_synchro_data.Tracking_timestamp_secs = ((double)d_sample_counter + (double)d_rem_code_phase_samples)/(double)d_fs_in; //! When tracking is disabled an array of 1's is sent to maintain the TCP connection boost::array tx_variables_array = {{1,1,1,1,1,1,1,1,0}}; d_tcp_com.send_receive_tcp_packet_gps_l1_ca(tx_variables_array, &tcp_data); } //assign the GNURadio block output data current_synchro_data.System = {'G'}; std::string str_aux = "1C"; const char * str = str_aux.c_str(); // get a C style null terminated string std::memcpy((void*)current_synchro_data.Signal, str, 3); *out[0] = current_synchro_data; if(d_dump) { // MULTIPLEXED FILE RECORDING - Record results to file float prompt_I; float prompt_Q; float tmp_E, tmp_P, tmp_L; float tmp_float; prompt_I = (*d_Prompt).real(); prompt_Q = (*d_Prompt).imag(); tmp_E = std::abs(*d_Early); tmp_P = std::abs(*d_Prompt); tmp_L = std::abs(*d_Late); try { // EPR d_dump_file.write((char*)&tmp_E, sizeof(float)); d_dump_file.write((char*)&tmp_P, sizeof(float)); d_dump_file.write((char*)&tmp_L, sizeof(float)); // PROMPT I and Q (to analyze navigation symbols) d_dump_file.write((char*)&prompt_I, sizeof(float)); d_dump_file.write((char*)&prompt_Q, sizeof(float)); // PRN start sample stamp //tmp_float=(float)d_sample_counter; d_dump_file.write((char*)&d_sample_counter, sizeof(unsigned long int)); // accumulated carrier phase d_dump_file.write((char*)&d_acc_carrier_phase_rad, sizeof(float)); // carrier and code frequency d_dump_file.write((char*)&d_carrier_doppler_hz, sizeof(float)); d_dump_file.write((char*)&d_code_freq_hz, sizeof(float)); //PLL commands d_dump_file.write((char*)&carr_error, sizeof(float)); d_dump_file.write((char*)&carr_nco, sizeof(float)); //DLL commands d_dump_file.write((char*)&code_error, sizeof(float)); d_dump_file.write((char*)&code_nco, sizeof(float)); // CN0 and carrier lock test d_dump_file.write((char*)&d_CN0_SNV_dB_Hz, sizeof(float)); d_dump_file.write((char*)&d_carrier_lock_test, sizeof(float)); // AUX vars (for debug purposes) tmp_float = 0; d_dump_file.write((char*)&tmp_float, sizeof(float)); d_dump_file.write((char*)&d_sample_counter_seconds, sizeof(double)); } catch (const std::ifstream::failure &e) { LOG(WARNING) << "Exception writing trk dump file " << e.what(); } } consume_each(d_current_prn_length_samples); // this is necessary in gr::block derivates d_sample_counter_seconds = d_sample_counter_seconds + ( ((double)d_current_prn_length_samples) / (double)d_fs_in ); d_sample_counter += d_current_prn_length_samples; //count for the processed samples return 1; //output tracking result ALWAYS even in the case of d_enable_tracking==false } void Gps_L1_Ca_Tcp_Connector_Tracking_cc::set_channel(unsigned int channel) { d_channel = channel; LOG(INFO) << "Tracking Channel set to " << d_channel; // ############# ENABLE DATA FILE LOG ################# if (d_dump == true) { if (d_dump_file.is_open() == false) { try { d_dump_filename.append(boost::lexical_cast(d_channel)); d_dump_filename.append(".dat"); d_dump_file.exceptions (std::ifstream::failbit | std::ifstream::badbit); d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); LOG(INFO) << "Tracking dump enabled on channel " << d_channel << " Log file: " << d_dump_filename.c_str(); } catch (const std::ifstream::failure &e) { LOG(WARNING) << "channel " << d_channel << " Exception opening trk dump file " << e.what(); } } } //! Listen for connections on a TCP port if (d_listen_connection == true) { d_port = d_port_ch0 + d_channel; d_listen_connection = d_tcp_com.listen_tcp_connection(d_port, d_port_ch0); } } void Gps_L1_Ca_Tcp_Connector_Tracking_cc::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { d_acquisition_gnss_synchro = p_gnss_synchro; } gnss-sdr-0.0.9/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_tcp_connector_tracking_cc.h000066400000000000000000000126701305042567700324560ustar00rootroot00000000000000/*! * \file gps_l1_ca_tcp_connector_tracking_cc.h * \brief Interface of a TCP connector block based on code DLL + carrier PLL * \author David Pubill, 2012. dpubill(at)cttc.es * Javier Arribas, 2011. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency Approach, * Birkhauser, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L1_CA_TCP_CONNECTOR_TRACKING_CC_H #define GNSS_SDR_GPS_L1_CA_TCP_CONNECTOR_TRACKING_CC_H #include #include #include #include #include "gnss_synchro.h" #include "cpu_multicorrelator.h" #include "tcp_communication.h" class Gps_L1_Ca_Tcp_Connector_Tracking_cc; typedef boost::shared_ptr gps_l1_ca_tcp_connector_tracking_cc_sptr; gps_l1_ca_tcp_connector_tracking_cc_sptr gps_l1_ca_tcp_connector_make_tracking_cc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float early_late_space_chips, size_t port_ch0); /*! * \brief This class implements a DLL + PLL tracking loop block */ class Gps_L1_Ca_Tcp_Connector_Tracking_cc: public gr::block { public: ~Gps_L1_Ca_Tcp_Connector_Tracking_cc(); void set_channel(unsigned int channel); void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); void start_tracking(); /* * \brief just like gr_block::general_work, only this arranges to call consume_each for you * * The user must override work to define the signal processing code */ int general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); void forecast (int noutput_items, gr_vector_int &ninput_items_required); private: friend gps_l1_ca_tcp_connector_tracking_cc_sptr gps_l1_ca_tcp_connector_make_tracking_cc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float early_late_space_chips, size_t port_ch0); Gps_L1_Ca_Tcp_Connector_Tracking_cc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float early_late_space_chips, size_t port_ch0); // tracking configuration vars unsigned int d_vector_length; bool d_dump; Gnss_Synchro* d_acquisition_gnss_synchro; unsigned int d_channel; long d_if_freq; long d_fs_in; int d_correlation_length_samples; int d_n_correlator_taps; double d_early_late_spc_chips; double d_code_phase_step_chips; gr_complex* d_ca_code; gr_complex *d_Early; gr_complex *d_Prompt; gr_complex *d_Late; // remaining code phase and carrier phase between tracking loops double d_rem_code_phase_samples; double d_next_rem_code_phase_samples; float d_rem_carr_phase_rad; // acquisition float d_acq_code_phase_samples; float d_acq_carrier_doppler_hz; // correlator float* d_local_code_shift_chips; gr_complex* d_correlator_outs; cpu_multicorrelator multicorrelator_cpu; // tracking vars double d_code_freq_hz; double d_carrier_doppler_hz; double d_acc_carrier_phase_rad; double d_code_phase_samples; size_t d_port_ch0; size_t d_port; int d_listen_connection; float d_control_id; tcp_communication d_tcp_com; //PRN period in samples int d_current_prn_length_samples; int d_next_prn_length_samples; double d_sample_counter_seconds; //processing samples counters unsigned long int d_sample_counter; unsigned long int d_acq_sample_stamp; // CN0 estimation and lock detector int d_cn0_estimation_counter; gr_complex* d_Prompt_buffer; float d_carrier_lock_test; float d_CN0_SNV_dB_Hz; float d_carrier_lock_threshold; int d_carrier_lock_fail_counter; // control vars bool d_enable_tracking; bool d_pull_in; // file dump std::string d_dump_filename; std::ofstream d_dump_file; std::map systemName; std::string sys; }; #endif //GNSS_SDR_GPS_L1_CA_TCP_CONNECTOR_TRACKING_CC_H gnss-sdr-0.0.9/src/algorithms/tracking/gnuradio_blocks/gps_l2_m_dll_pll_tracking_cc.cc000066400000000000000000000606761305042567700312610ustar00rootroot00000000000000/*! * \file gps_l2_m_dll_pll_tracking_cc.cc * \brief Implementation of a code DLL + carrier PLL tracking block * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Javier Arribas, 2011. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * [1] K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency * Approach, Birkhauser, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_l2_m_dll_pll_tracking_cc.h" #include #include #include #include #include #include #include #include #include "gps_l2c_signal.h" #include "tracking_discriminators.h" #include "lock_detectors.h" #include "GPS_L2C.h" #include "control_message_factory.h" /*! * \todo Include in definition header file */ #define GPS_L2M_CN0_ESTIMATION_SAMPLES 10 #define GPS_L2M_MINIMUM_VALID_CN0 25 #define GPS_L2M_MAXIMUM_LOCK_FAIL_COUNTER 50 #define GPS_L2M_CARRIER_LOCK_THRESHOLD 0.75 using google::LogMessage; gps_l2_m_dll_pll_tracking_cc_sptr gps_l2_m_dll_pll_make_tracking_cc( long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float early_late_space_chips) { return gps_l2_m_dll_pll_tracking_cc_sptr(new gps_l2_m_dll_pll_tracking_cc(if_freq, fs_in, vector_length, dump, dump_filename, pll_bw_hz, dll_bw_hz, early_late_space_chips)); } void gps_l2_m_dll_pll_tracking_cc::forecast (int noutput_items, gr_vector_int &ninput_items_required) { if (noutput_items != 0) { ninput_items_required[0] = static_cast(d_vector_length) * 2; //set the required available samples in each call } } gps_l2_m_dll_pll_tracking_cc::gps_l2_m_dll_pll_tracking_cc( long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float early_late_space_chips) : gr::block("gps_l2_m_dll_pll_tracking_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { // Telemetry bit synchronization message port input this->message_port_register_in(pmt::mp("preamble_timestamp_s")); this->message_port_register_out(pmt::mp("events")); // initialize internal vars d_dump = dump; d_if_freq = if_freq; d_fs_in = fs_in; d_vector_length = vector_length; d_dump_filename = dump_filename; // DLL/PLL filter initialization d_carrier_loop_filter=Tracking_2nd_PLL_filter(GPS_L2_M_PERIOD); d_code_loop_filter=Tracking_2nd_DLL_filter(GPS_L2_M_PERIOD); // Initialize tracking ========================================== d_code_loop_filter.set_DLL_BW(dll_bw_hz); d_carrier_loop_filter.set_PLL_BW(pll_bw_hz); //--- DLL variables -------------------------------------------------------- d_early_late_spc_chips = early_late_space_chips; // Define early-late offset (in chips) // Initialization of local code replica // Get space for a vector with the C/A code replica sampled 1x/chip d_ca_code = static_cast(volk_gnsssdr_malloc(static_cast(GPS_L2_M_CODE_LENGTH_CHIPS) * sizeof(gr_complex), volk_gnsssdr_get_alignment())); // correlator outputs (scalar) d_n_correlator_taps = 3; // Early, Prompt, and Late d_correlator_outs = static_cast(volk_gnsssdr_malloc(d_n_correlator_taps*sizeof(gr_complex), volk_gnsssdr_get_alignment())); for (int n = 0; n < d_n_correlator_taps; n++) { d_correlator_outs[n] = gr_complex(0,0); } d_local_code_shift_chips = static_cast(volk_gnsssdr_malloc(d_n_correlator_taps*sizeof(float), volk_gnsssdr_get_alignment())); // Set TAPs delay values [chips] d_local_code_shift_chips[0] = - d_early_late_spc_chips; d_local_code_shift_chips[1] = 0.0; d_local_code_shift_chips[2] = d_early_late_spc_chips; multicorrelator_cpu.init(2 * d_vector_length, d_n_correlator_taps); //--- Perform initializations ------------------------------ // define initial code frequency basis of NCO d_code_freq_chips = GPS_L2_M_CODE_RATE_HZ; // define residual code phase (in chips) d_rem_code_phase_samples = 0.0; // define residual carrier phase d_rem_carr_phase_rad = 0.0; // sample synchronization d_sample_counter = 0; //d_sample_counter_seconds = 0; d_acq_sample_stamp = 0; d_enable_tracking = false; d_pull_in = false; d_current_prn_length_samples = static_cast(d_vector_length); // CN0 estimation and lock detector buffers d_cn0_estimation_counter = 0; d_Prompt_buffer = new gr_complex[GPS_L2M_CN0_ESTIMATION_SAMPLES]; d_carrier_lock_test = 1; d_CN0_SNV_dB_Hz = 0; d_carrier_lock_fail_counter = 0; d_carrier_lock_threshold = GPS_L2M_CARRIER_LOCK_THRESHOLD; systemName["G"] = std::string("GPS"); set_relative_rate(1.0/((double)d_vector_length*2)); //set_min_output_buffer((long int)300); d_acquisition_gnss_synchro = 0; d_channel = 0; d_acq_code_phase_samples = 0.0; d_acq_carrier_doppler_hz = 0.0; d_carrier_doppler_hz = 0.0; d_acc_carrier_phase_rad = 0.0; d_code_phase_samples = 0.0; d_rem_code_phase_chips = 0.0; d_code_phase_step_chips = 0.0; d_carrier_phase_step_rad = 0.0; LOG(INFO) << "d_vector_length" << d_vector_length; } void gps_l2_m_dll_pll_tracking_cc::start_tracking() { /* * correct the code phase according to the delay between acq and trk */ d_acq_code_phase_samples = d_acquisition_gnss_synchro->Acq_delay_samples; d_acq_carrier_doppler_hz = d_acquisition_gnss_synchro->Acq_doppler_hz; d_acq_sample_stamp = d_acquisition_gnss_synchro->Acq_samplestamp_samples; long int acq_trk_diff_samples; float acq_trk_diff_seconds; acq_trk_diff_samples = static_cast(d_sample_counter) - static_cast(d_acq_sample_stamp);//-d_vector_length; LOG(INFO) << "Number of samples between Acquisition and Tracking =" << acq_trk_diff_samples; acq_trk_diff_seconds = static_cast(acq_trk_diff_samples) / static_cast(d_fs_in); // Doppler effect // Fd=(C/(C+Vr))*F double radial_velocity = (GPS_L2_FREQ_HZ + d_acq_carrier_doppler_hz) / GPS_L2_FREQ_HZ; // new chip and prn sequence periods based on acq Doppler double T_chip_mod_seconds; double T_prn_mod_seconds; double T_prn_mod_samples; d_code_freq_chips = radial_velocity * GPS_L2_M_CODE_RATE_HZ; d_code_phase_step_chips = static_cast(d_code_freq_chips) / static_cast(d_fs_in); T_chip_mod_seconds = 1/d_code_freq_chips; T_prn_mod_seconds = T_chip_mod_seconds * GPS_L2_M_CODE_LENGTH_CHIPS; T_prn_mod_samples = T_prn_mod_seconds * static_cast(d_fs_in); d_current_prn_length_samples = round(T_prn_mod_samples); double T_prn_true_seconds = GPS_L2_M_CODE_LENGTH_CHIPS / GPS_L2_M_CODE_RATE_HZ; double T_prn_true_samples = T_prn_true_seconds * static_cast(d_fs_in); double T_prn_diff_seconds = T_prn_true_seconds - T_prn_mod_seconds; double N_prn_diff = acq_trk_diff_seconds / T_prn_true_seconds; double corrected_acq_phase_samples, delay_correction_samples; corrected_acq_phase_samples = fmod((d_acq_code_phase_samples + T_prn_diff_seconds * N_prn_diff * static_cast(d_fs_in)), T_prn_true_samples); if (corrected_acq_phase_samples < 0) { corrected_acq_phase_samples = T_prn_mod_samples + corrected_acq_phase_samples; } delay_correction_samples = d_acq_code_phase_samples - corrected_acq_phase_samples; //TODO: debug the algorithm implementation and enable correction //d_acq_code_phase_samples = corrected_acq_phase_samples; d_carrier_doppler_hz = d_acq_carrier_doppler_hz; d_carrier_phase_step_rad = GPS_L2_TWO_PI * d_carrier_doppler_hz / static_cast(d_fs_in); // DLL/PLL filter initialization d_carrier_loop_filter.initialize(); // initialize the carrier filter d_code_loop_filter.initialize(); // initialize the code filter // generate local reference ALWAYS starting at chip 1 (1 sample per chip) gps_l2c_m_code_gen_complex(d_ca_code, d_acquisition_gnss_synchro->PRN); multicorrelator_cpu.set_local_code_and_taps(static_cast(GPS_L2_M_CODE_LENGTH_CHIPS), d_ca_code, d_local_code_shift_chips); for (int n = 0; n < d_n_correlator_taps; n++) { d_correlator_outs[n] = gr_complex(0,0); } d_carrier_lock_fail_counter = 0; d_rem_code_phase_samples = 0; d_rem_carr_phase_rad = 0; d_rem_code_phase_chips = 0.0; d_acc_carrier_phase_rad = 0; d_code_phase_samples = d_acq_code_phase_samples; std::string sys_ = &d_acquisition_gnss_synchro->System; sys = sys_.substr(0,1); // DEBUG OUTPUT std::cout << "Tracking start on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) <<" whith Doppler="<PRN) << " on channel " << d_channel; // enable tracking d_pull_in = true; d_enable_tracking = true; LOG(INFO) << "PULL-IN Doppler [Hz]=" << d_carrier_doppler_hz << " Code Phase correction [samples]=" << delay_correction_samples << " PULL-IN Code Phase [samples]=" << d_acq_code_phase_samples; } gps_l2_m_dll_pll_tracking_cc::~gps_l2_m_dll_pll_tracking_cc() { d_dump_file.close(); volk_gnsssdr_free(d_local_code_shift_chips); volk_gnsssdr_free(d_correlator_outs); volk_gnsssdr_free(d_ca_code); delete[] d_Prompt_buffer; multicorrelator_cpu.free(); } int gps_l2_m_dll_pll_tracking_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) { // process vars double carr_error_hz = 0; double carr_error_filt_hz = 0; double code_error_chips = 0; double code_error_filt_chips = 0; // GNSS_SYNCHRO OBJECT to interchange data between tracking->telemetry_decoder Gnss_Synchro current_synchro_data = Gnss_Synchro(); // Block input data and block output stream pointers const gr_complex* in = (gr_complex*) input_items[0]; //PRN start block alignment Gnss_Synchro **out = (Gnss_Synchro **) &output_items[0]; if (d_enable_tracking == true) { // Fill the acquisition data current_synchro_data = *d_acquisition_gnss_synchro; // Receiver signal alignment if (d_pull_in == true) { int samples_offset; double acq_trk_shif_correction_samples; int acq_to_trk_delay_samples; acq_to_trk_delay_samples = (d_sample_counter - (d_acq_sample_stamp-d_current_prn_length_samples)); acq_trk_shif_correction_samples = -fmod(static_cast(acq_to_trk_delay_samples), static_cast(d_current_prn_length_samples)); samples_offset = round(d_acq_code_phase_samples + acq_trk_shif_correction_samples);//+(1.5*(d_fs_in/GPS_L2_M_CODE_RATE_HZ))); current_synchro_data.Tracking_timestamp_secs = (static_cast(d_sample_counter) + static_cast(d_rem_code_phase_samples)) / static_cast(d_fs_in); d_sample_counter = d_sample_counter + samples_offset; //count for the processed samples d_acc_carrier_phase_rad -= d_carrier_phase_step_rad * samples_offset; current_synchro_data.Carrier_phase_rads = d_acc_carrier_phase_rad; current_synchro_data.Carrier_Doppler_hz = d_carrier_doppler_hz; *out[0] = current_synchro_data; d_pull_in = false; consume_each(samples_offset); //shift input to perform alignment with local replica return 1; } // ################# CARRIER WIPEOFF AND CORRELATORS ############################## // perform carrier wipe-off and compute Early, Prompt and Late correlation multicorrelator_cpu.set_input_output_vectors(d_correlator_outs, in); multicorrelator_cpu.Carrier_wipeoff_multicorrelator_resampler(d_rem_carr_phase_rad, d_carrier_phase_step_rad, d_rem_code_phase_chips, d_code_phase_step_chips, d_current_prn_length_samples); // ################## PLL ########################################################## // PLL discriminator carr_error_hz = pll_cloop_two_quadrant_atan(d_correlator_outs[1]) / GPS_L2_TWO_PI; // Carrier discriminator filter carr_error_filt_hz = d_carrier_loop_filter.get_carrier_nco(carr_error_hz); // New carrier Doppler frequency estimation d_carrier_doppler_hz = d_acq_carrier_doppler_hz + carr_error_filt_hz; // New code Doppler frequency estimation d_code_freq_chips = GPS_L2_M_CODE_RATE_HZ + ((d_carrier_doppler_hz * GPS_L2_M_CODE_RATE_HZ) / GPS_L2_FREQ_HZ); // ################## DLL ########################################################## // DLL discriminator code_error_chips = dll_nc_e_minus_l_normalized(d_correlator_outs[0], d_correlator_outs[2]); // [chips/Ti] // Code discriminator filter code_error_filt_chips = d_code_loop_filter.get_code_nco(code_error_chips); //[chips/second] //Code phase accumulator double code_error_filt_secs = (GPS_L2_M_PERIOD * code_error_filt_chips) / GPS_L2_M_CODE_RATE_HZ; //[seconds] // ################## CARRIER AND CODE NCO BUFFER ALIGNEMENT ####################### // keep alignment parameters for the next input buffer // Compute the next buffer length based in the new period of the PRN sequence and the code phase error estimation double T_chip_seconds = 1.0 / d_code_freq_chips; double T_prn_seconds = T_chip_seconds * GPS_L2_M_CODE_LENGTH_CHIPS; double T_prn_samples = T_prn_seconds * static_cast(d_fs_in); double K_blk_samples = T_prn_samples + d_rem_code_phase_samples + code_error_filt_secs * static_cast(d_fs_in); d_current_prn_length_samples = round(K_blk_samples); // round to a discrete number of samples //################### PLL COMMANDS ################################################# // carrier phase step (NCO phase increment per sample) [rads/sample] d_carrier_phase_step_rad = GPS_L2_TWO_PI * d_carrier_doppler_hz / static_cast(d_fs_in); // remnant carrier phase to prevent overflow in the code NCO d_rem_carr_phase_rad = d_rem_carr_phase_rad + d_carrier_phase_step_rad * d_current_prn_length_samples; d_rem_carr_phase_rad = fmod(d_rem_carr_phase_rad, GPS_L2_TWO_PI); // carrier phase accumulator d_acc_carrier_phase_rad -= d_carrier_phase_step_rad * d_current_prn_length_samples; //################### DLL COMMANDS ################################################# // code phase step (Code resampler phase increment per sample) [chips/sample] d_code_phase_step_chips = d_code_freq_chips / static_cast(d_fs_in); // remnant code phase [chips] d_rem_code_phase_samples = K_blk_samples - d_current_prn_length_samples; // rounding error < 1 sample d_rem_code_phase_chips = d_code_freq_chips * (d_rem_code_phase_samples / static_cast(d_fs_in)); // ####### CN0 ESTIMATION AND LOCK DETECTORS ###### if (d_cn0_estimation_counter < GPS_L2M_CN0_ESTIMATION_SAMPLES) { // fill buffer with prompt correlator output values d_Prompt_buffer[d_cn0_estimation_counter] = d_correlator_outs[1]; d_cn0_estimation_counter++; } else { d_cn0_estimation_counter = 0; // Code lock indicator d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, GPS_L2M_CN0_ESTIMATION_SAMPLES, d_fs_in, GPS_L2_M_CODE_LENGTH_CHIPS); // Carrier lock indicator d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, GPS_L2M_CN0_ESTIMATION_SAMPLES); // Loss of lock detection if (d_carrier_lock_test < d_carrier_lock_threshold or d_CN0_SNV_dB_Hz < GPS_L2M_MINIMUM_VALID_CN0) { d_carrier_lock_fail_counter++; } else { if (d_carrier_lock_fail_counter > 0) d_carrier_lock_fail_counter--; } if (d_carrier_lock_fail_counter > GPS_L2M_MAXIMUM_LOCK_FAIL_COUNTER) { std::cout << "Loss of lock in channel " << d_channel << "!" << std::endl; LOG(INFO) << "Loss of lock in channel " << d_channel << "!"; this->message_port_pub(pmt::mp("events"), pmt::from_long(3));//3 -> loss of lock d_carrier_lock_fail_counter = 0; d_enable_tracking = false; // TODO: check if disabling tracking is consistent with the channel state machine } } // ########### Output the tracking data to navigation and PVT ########## current_synchro_data.Prompt_I = static_cast(d_correlator_outs[1].real()); current_synchro_data.Prompt_Q = static_cast(d_correlator_outs[1].imag()); // Tracking_timestamp_secs is aligned with the CURRENT PRN start sample current_synchro_data.Tracking_timestamp_secs = (static_cast(d_sample_counter + d_current_prn_length_samples) + static_cast(d_rem_code_phase_samples)) / static_cast(d_fs_in); current_synchro_data.Carrier_phase_rads = d_acc_carrier_phase_rad; current_synchro_data.Carrier_Doppler_hz = d_carrier_doppler_hz; current_synchro_data.CN0_dB_hz = d_CN0_SNV_dB_Hz; current_synchro_data.Flag_valid_symbol_output = true; current_synchro_data.correlation_length_ms = 20; } else { for (int n = 0; n < d_n_correlator_taps; n++) { d_correlator_outs[n] = gr_complex(0,0); } current_synchro_data.Tracking_timestamp_secs = (static_cast(d_sample_counter + d_current_prn_length_samples) + static_cast(d_rem_code_phase_samples)) / static_cast(d_fs_in); } //assign the GNURadio block output data *out[0] = current_synchro_data; if(d_dump) { // MULTIPLEXED FILE RECORDING - Record results to file float prompt_I; float prompt_Q; float tmp_E, tmp_P, tmp_L; double tmp_double; prompt_I = d_correlator_outs[1].real(); prompt_Q = d_correlator_outs[1].imag(); tmp_E = std::abs(d_correlator_outs[0]); tmp_P = std::abs(d_correlator_outs[1]); tmp_L = std::abs(d_correlator_outs[2]); try { // EPR d_dump_file.write(reinterpret_cast(&tmp_E), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_P), sizeof(float)); d_dump_file.write(reinterpret_cast(&tmp_L), sizeof(float)); // PROMPT I and Q (to analyze navigation symbols) d_dump_file.write(reinterpret_cast(&prompt_I), sizeof(float)); d_dump_file.write(reinterpret_cast(&prompt_Q), sizeof(float)); // PRN start sample stamp //tmp_float=(float)d_sample_counter; d_dump_file.write(reinterpret_cast(&d_sample_counter), sizeof(unsigned long int)); // accumulated carrier phase d_dump_file.write(reinterpret_cast(&d_acc_carrier_phase_rad), sizeof(double)); // carrier and code frequency d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); d_dump_file.write(reinterpret_cast(&d_code_freq_chips), sizeof(double)); //PLL commands d_dump_file.write(reinterpret_cast(&carr_error_hz), sizeof(double)); d_dump_file.write(reinterpret_cast(&d_carrier_doppler_hz), sizeof(double)); //DLL commands d_dump_file.write(reinterpret_cast(&code_error_chips), sizeof(double)); d_dump_file.write(reinterpret_cast(&code_error_filt_chips), sizeof(double)); // CN0 and carrier lock test d_dump_file.write(reinterpret_cast(&d_CN0_SNV_dB_Hz), sizeof(double)); d_dump_file.write(reinterpret_cast(&d_carrier_lock_test), sizeof(double)); // AUX vars (for debug purposes) tmp_double = d_rem_code_phase_samples; d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); tmp_double = static_cast(d_sample_counter + d_current_prn_length_samples); d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); } catch (std::ifstream::failure& e) { LOG(WARNING) << "Exception writing trk dump file " << e.what(); } } consume_each(d_current_prn_length_samples); // this is necessary in gr::block derivates d_sample_counter += d_current_prn_length_samples; // count for the processed samples return 1; // output tracking result ALWAYS even in the case of d_enable_tracking==false } void gps_l2_m_dll_pll_tracking_cc::set_channel(unsigned int channel) { d_channel = channel; LOG(INFO) << "Tracking Channel set to " << d_channel; // ############# ENABLE DATA FILE LOG ################# if (d_dump == true) { if (d_dump_file.is_open() == false) { try { d_dump_filename.append(boost::lexical_cast(d_channel)); d_dump_filename.append(".dat"); d_dump_file.exceptions (std::ifstream::failbit | std::ifstream::badbit); d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); LOG(INFO) << "Tracking dump enabled on channel " << d_channel << " Log file: " << d_dump_filename.c_str(); } catch (std::ifstream::failure& e) { LOG(WARNING) << "channel " << d_channel << " Exception opening trk dump file " << e.what(); } } } } void gps_l2_m_dll_pll_tracking_cc::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) { d_acquisition_gnss_synchro = p_gnss_synchro; } gnss-sdr-0.0.9/src/algorithms/tracking/gnuradio_blocks/gps_l2_m_dll_pll_tracking_cc.h000066400000000000000000000121541305042567700311070ustar00rootroot00000000000000/*! * \file gps_l2_m_dll_pll_tracking_cc.h * \brief Interface of a code DLL + carrier PLL tracking block * \author Javier Arribas, 2015. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency Approach, * Birkhauser, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L2_M_DLL_PLL_TRACKING_CC_H #define GNSS_SDR_GPS_L2_M_DLL_PLL_TRACKING_CC_H #include #include #include #include #include "gnss_synchro.h" #include "tracking_2nd_DLL_filter.h" #include "tracking_2nd_PLL_filter.h" #include "cpu_multicorrelator.h" class gps_l2_m_dll_pll_tracking_cc; typedef boost::shared_ptr gps_l2_m_dll_pll_tracking_cc_sptr; gps_l2_m_dll_pll_tracking_cc_sptr gps_l2_m_dll_pll_make_tracking_cc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float early_late_space_chips); /*! * \brief This class implements a DLL + PLL tracking loop block */ class gps_l2_m_dll_pll_tracking_cc: public gr::block { public: ~gps_l2_m_dll_pll_tracking_cc(); void set_channel(unsigned int channel); void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); void start_tracking(); int general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); void forecast (int noutput_items, gr_vector_int &ninput_items_required); private: friend gps_l2_m_dll_pll_tracking_cc_sptr gps_l2_m_dll_pll_make_tracking_cc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float early_late_space_chips); gps_l2_m_dll_pll_tracking_cc(long if_freq, long fs_in, unsigned int vector_length, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float early_late_space_chips); // tracking configuration vars unsigned int d_vector_length; bool d_dump; Gnss_Synchro* d_acquisition_gnss_synchro; unsigned int d_channel; long d_if_freq; long d_fs_in; double d_early_late_spc_chips; // remaining code phase and carrier phase between tracking loops double d_rem_code_phase_samples; double d_rem_code_phase_chips; double d_rem_carr_phase_rad; // PLL and DLL filter library Tracking_2nd_DLL_filter d_code_loop_filter; Tracking_2nd_PLL_filter d_carrier_loop_filter; // acquisition double d_acq_code_phase_samples; double d_acq_carrier_doppler_hz; // correlator int d_n_correlator_taps; gr_complex* d_ca_code; float* d_local_code_shift_chips; gr_complex* d_correlator_outs; cpu_multicorrelator multicorrelator_cpu; // tracking vars double d_code_freq_chips; double d_code_phase_step_chips; double d_carrier_doppler_hz; double d_carrier_phase_step_rad; double d_acc_carrier_phase_rad; double d_code_phase_samples; // PRN period in samples int d_current_prn_length_samples; // processing samples counters unsigned long int d_sample_counter; unsigned long int d_acq_sample_stamp; // CN0 estimation and lock detector int d_cn0_estimation_counter; gr_complex* d_Prompt_buffer; double d_carrier_lock_test; double d_CN0_SNV_dB_Hz; double d_carrier_lock_threshold; int d_carrier_lock_fail_counter; // control vars bool d_enable_tracking; bool d_pull_in; // file dump std::string d_dump_filename; std::ofstream d_dump_file; std::map systemName; std::string sys; }; #endif //GNSS_SDR_GPS_L2_M_DLL_PLL_TRACKING_CC_H gnss-sdr-0.0.9/src/algorithms/tracking/libs/000077500000000000000000000000001305042567700207645ustar00rootroot00000000000000gnss-sdr-0.0.9/src/algorithms/tracking/libs/CMakeLists.txt000066400000000000000000000053541305042567700235330ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # if(ENABLE_CUDA) # Append current NVCC flags by something, eg comput capability # set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} --gpu-architecture sm_30) list(APPEND CUDA_NVCC_FLAGS "-gencode arch=compute_30,code=sm_30; -std=c++11;-O3; -use_fast_math -default-stream per-thread") set(CUDA_PROPAGATE_HOST_FLAGS OFF) CUDA_INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR}) set(LIB_TYPE STATIC) #set the lib type CUDA_ADD_LIBRARY(CUDA_CORRELATOR_LIB ${LIB_TYPE} cuda_multicorrelator.h cuda_multicorrelator.cu) set(OPT_TRACKING_LIBRARIES ${OPT_TRACKING_LIBRARIES} CUDA_CORRELATOR_LIB) set(OPT_TRACKING_INCLUDES ${OPT_TRACKING_INCLUDES} ${CUDA_INCLUDE_DIRS} ) endif(ENABLE_CUDA) set(TRACKING_LIB_SOURCES cpu_multicorrelator.cc cpu_multicorrelator_16sc.cc lock_detectors.cc tcp_communication.cc tcp_packet_data.cc tracking_2nd_DLL_filter.cc tracking_2nd_PLL_filter.cc tracking_discriminators.cc tracking_FLL_PLL_filter.cc tracking_loop_filter.cc ) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/interfaces ${CMAKE_SOURCE_DIR}/src/core/receiver ${VOLK_INCLUDE_DIRS} ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${OPT_TRACKING_INCLUDES} ${VOLK_GNSSSDR_INCLUDE_DIRS} ) if(ENABLE_GENERIC_ARCH) add_definitions( -DGENERIC_ARCH=1 ) endif(ENABLE_GENERIC_ARCH) if (SSE3_AVAILABLE) add_definitions( -DHAVE_SSE3=1 ) endif(SSE3_AVAILABLE) file(GLOB TRACKING_LIB_HEADERS "*.h") list(SORT TRACKING_LIB_HEADERS) add_library(tracking_lib ${TRACKING_LIB_SOURCES} ${TRACKING_LIB_HEADERS}) source_group(Headers FILES ${TRACKING_LIB_HEADERS}) target_link_libraries(tracking_lib ${OPT_TRACKING_LIBRARIES} ${VOLK_LIBRARIES} ${VOLK_GNSSSDR_LIBRARIES} ${GNURADIO_RUNTIME_LIBRARIES}) if(VOLK_GNSSSDR_FOUND) add_dependencies(tracking_lib glog-${glog_RELEASE}) else(VOLK_GNSSSDR_FOUND) add_dependencies(tracking_lib glog-${glog_RELEASE} volk_gnsssdr_module) endif() gnss-sdr-0.0.9/src/algorithms/tracking/libs/cpu_multicorrelator.cc000066400000000000000000000110401305042567700253650ustar00rootroot00000000000000/*! * \file cpu_multicorrelator.cc * \brief High optimized CPU vector multiTAP correlator class * \authors
      *
    • Javier Arribas, 2015. jarribas(at)cttc.es *
    * * Class that implements a high optimized vector multiTAP correlator class for CPUs * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "cpu_multicorrelator.h" #include #include #include cpu_multicorrelator::cpu_multicorrelator() { d_sig_in = nullptr; d_local_code_in = nullptr; d_shifts_chips = nullptr; d_corr_out = nullptr; d_local_codes_resampled = nullptr; d_code_length_chips = 0; d_n_correlators = 0; } cpu_multicorrelator::~cpu_multicorrelator() { if(d_local_codes_resampled != nullptr) { cpu_multicorrelator::free(); } } bool cpu_multicorrelator::init( int max_signal_length_samples, int n_correlators) { // ALLOCATE MEMORY FOR INTERNAL vectors size_t size = max_signal_length_samples * sizeof(std::complex); d_local_codes_resampled = static_cast**>(volk_gnsssdr_malloc(n_correlators * sizeof(std::complex*), volk_gnsssdr_get_alignment())); for (int n = 0; n < n_correlators; n++) { d_local_codes_resampled[n] = static_cast*>(volk_gnsssdr_malloc(size, volk_gnsssdr_get_alignment())); } d_n_correlators = n_correlators; return true; } bool cpu_multicorrelator::set_local_code_and_taps( int code_length_chips, const std::complex* local_code_in, float *shifts_chips) { d_local_code_in = local_code_in; d_shifts_chips = shifts_chips; d_code_length_chips = code_length_chips; return true; } bool cpu_multicorrelator::set_input_output_vectors(std::complex* corr_out, const std::complex* sig_in) { // Save CPU pointers d_sig_in = sig_in; d_corr_out = corr_out; return true; } void cpu_multicorrelator::update_local_code(int correlator_length_samples, float rem_code_phase_chips, float code_phase_step_chips) { volk_gnsssdr_32fc_xn_resampler_32fc_xn(d_local_codes_resampled, d_local_code_in, rem_code_phase_chips, code_phase_step_chips, d_shifts_chips, d_code_length_chips, d_n_correlators, correlator_length_samples); } bool cpu_multicorrelator::Carrier_wipeoff_multicorrelator_resampler( float rem_carrier_phase_in_rad, float phase_step_rad, float rem_code_phase_chips, float code_phase_step_chips, int signal_length_samples) { update_local_code(signal_length_samples, rem_code_phase_chips, code_phase_step_chips); // Regenerate phase at each call in order to avoid numerical issues lv_32fc_t phase_offset_as_complex[1]; phase_offset_as_complex[0] = lv_cmake(std::cos(rem_carrier_phase_in_rad), -std::sin(rem_carrier_phase_in_rad)); // call VOLK_GNSSSDR kernel volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn(d_corr_out, d_sig_in, std::exp(lv_32fc_t(0, - phase_step_rad)), phase_offset_as_complex, (const lv_32fc_t**)d_local_codes_resampled, d_n_correlators, signal_length_samples); return true; } bool cpu_multicorrelator::free() { // Free memory if (d_local_codes_resampled != nullptr) { for (int n = 0; n < d_n_correlators; n++) { volk_gnsssdr_free(d_local_codes_resampled[n]); } volk_gnsssdr_free(d_local_codes_resampled); d_local_codes_resampled = nullptr; } return true; } gnss-sdr-0.0.9/src/algorithms/tracking/libs/cpu_multicorrelator.h000066400000000000000000000047211305042567700252370ustar00rootroot00000000000000/*! * \file cpu_multicorrelator.h * \brief High optimized CPU vector multiTAP correlator class * \authors
      *
    • Javier Arribas, 2015. jarribas(at)cttc.es *
    * * Class that implements a high optimized vector multiTAP correlator class for CPUs * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_CPU_MULTICORRELATOR_H_ #define GNSS_SDR_CPU_MULTICORRELATOR_H_ #include /*! * \brief Class that implements carrier wipe-off and correlators. */ class cpu_multicorrelator { public: cpu_multicorrelator(); ~cpu_multicorrelator(); bool init(int max_signal_length_samples, int n_correlators); bool set_local_code_and_taps(int code_length_chips, const std::complex* local_code_in, float *shifts_chips); bool set_input_output_vectors(std::complex* corr_out, const std::complex* sig_in); void update_local_code(int correlator_length_samples, float rem_code_phase_chips, float code_phase_step_chips); bool Carrier_wipeoff_multicorrelator_resampler(float rem_carrier_phase_in_rad, float phase_step_rad, float rem_code_phase_chips, float code_phase_step_chips, int signal_length_samples); bool free(); private: // Allocate the device input vectors const std::complex *d_sig_in; std::complex **d_local_codes_resampled; const std::complex *d_local_code_in; std::complex *d_corr_out; float *d_shifts_chips; int d_code_length_chips; int d_n_correlators; }; #endif /* CPU_MULTICORRELATOR_H_ */ gnss-sdr-0.0.9/src/algorithms/tracking/libs/cpu_multicorrelator_16sc.cc000066400000000000000000000107411305042567700262300ustar00rootroot00000000000000/*! * \file cpu_multicorrelator_16sc.cc * \brief High optimized CPU vector multiTAP correlator class * \authors
      *
    • Javier Arribas, 2015. jarribas(at)cttc.es *
    * * Class that implements a high optimized vector multiTAP correlator class for CPUs * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "cpu_multicorrelator_16sc.h" #include bool cpu_multicorrelator_16sc::init( int max_signal_length_samples, int n_correlators) { // ALLOCATE MEMORY FOR INTERNAL vectors size_t size = max_signal_length_samples * sizeof(lv_16sc_t); d_n_correlators = n_correlators; d_local_codes_resampled = static_cast(volk_gnsssdr_malloc(n_correlators * sizeof(lv_16sc_t*), volk_gnsssdr_get_alignment())); for (int n = 0; n < n_correlators; n++) { d_local_codes_resampled[n] = static_cast(volk_gnsssdr_malloc(size, volk_gnsssdr_get_alignment())); } return true; } bool cpu_multicorrelator_16sc::set_local_code_and_taps( int code_length_chips, const lv_16sc_t* local_code_in, float *shifts_chips) { d_local_code_in = local_code_in; d_shifts_chips = shifts_chips; d_code_length_chips = code_length_chips; return true; } bool cpu_multicorrelator_16sc::set_input_output_vectors(lv_16sc_t* corr_out, const lv_16sc_t* sig_in) { // Save CPU pointers d_sig_in = sig_in; d_corr_out = corr_out; return true; } void cpu_multicorrelator_16sc::update_local_code(int correlator_length_samples, float rem_code_phase_chips, float code_phase_step_chips) { volk_gnsssdr_16ic_xn_resampler_16ic_xn(d_local_codes_resampled, d_local_code_in, rem_code_phase_chips, code_phase_step_chips, d_shifts_chips, d_code_length_chips, d_n_correlators, correlator_length_samples); } bool cpu_multicorrelator_16sc::Carrier_wipeoff_multicorrelator_resampler( float rem_carrier_phase_in_rad, float phase_step_rad, float rem_code_phase_chips, float code_phase_step_chips, int signal_length_samples) { update_local_code(signal_length_samples, rem_code_phase_chips, code_phase_step_chips); // Regenerate phase at each call in order to avoid numerical issues lv_32fc_t phase_offset_as_complex[1]; phase_offset_as_complex[0] = lv_cmake(std::cos(rem_carrier_phase_in_rad), -std::sin(rem_carrier_phase_in_rad)); // call VOLK_GNSSSDR kernel volk_gnsssdr_16ic_x2_rotator_dot_prod_16ic_xn(d_corr_out, d_sig_in, std::exp(lv_32fc_t(0, -phase_step_rad)), phase_offset_as_complex, (const lv_16sc_t**)d_local_codes_resampled, d_n_correlators, signal_length_samples); return true; } cpu_multicorrelator_16sc::cpu_multicorrelator_16sc() { d_sig_in = nullptr; d_local_code_in = nullptr; d_shifts_chips = nullptr; d_corr_out = nullptr; d_local_codes_resampled = nullptr; d_code_length_chips = 0; d_n_correlators = 0; } cpu_multicorrelator_16sc::~cpu_multicorrelator_16sc() { if(d_local_codes_resampled != nullptr) { cpu_multicorrelator_16sc::free(); } } bool cpu_multicorrelator_16sc::free() { // Free memory if (d_local_codes_resampled != nullptr) { for (int n = 0; n < d_n_correlators; n++) { volk_gnsssdr_free(d_local_codes_resampled[n]); } volk_gnsssdr_free(d_local_codes_resampled); d_local_codes_resampled = nullptr; } return true; } gnss-sdr-0.0.9/src/algorithms/tracking/libs/cpu_multicorrelator_16sc.h000066400000000000000000000047501305042567700260750ustar00rootroot00000000000000/*! * \file cpu_multicorrelator_16sc.h * \brief High optimized CPU vector multiTAP correlator class for lv_16sc_t (short int complex) * \authors
      *
    • Javier Arribas, 2016. jarribas(at)cttc.es *
    * * Class that implements a high optimized vector multiTAP correlator class for CPUs * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_CPU_MULTICORRELATOR_16SC_H_ #define GNSS_SDR_CPU_MULTICORRELATOR_16SC_H_ #include /*! * \brief Class that implements carrier wipe-off and correlators. */ class cpu_multicorrelator_16sc { public: cpu_multicorrelator_16sc(); ~cpu_multicorrelator_16sc(); bool init(int max_signal_length_samples, int n_correlators); bool set_local_code_and_taps(int code_length_chips, const lv_16sc_t* local_code_in, float *shifts_chips); bool set_input_output_vectors(lv_16sc_t* corr_out, const lv_16sc_t* sig_in); void update_local_code(int correlator_length_samples, float rem_code_phase_chips, float code_phase_step_chips); bool Carrier_wipeoff_multicorrelator_resampler(float rem_carrier_phase_in_rad, float phase_step_rad, float rem_code_phase_chips, float code_phase_step_chips, int signal_length_samples); bool free(); private: // Allocate the device input vectors const lv_16sc_t *d_sig_in; lv_16sc_t **d_local_codes_resampled; const lv_16sc_t *d_local_code_in; lv_16sc_t *d_corr_out; float *d_shifts_chips; int d_code_length_chips; int d_n_correlators; }; #endif /* GNSS_SDR_CPU_MULTICORRELATOR_H_ */ gnss-sdr-0.0.9/src/algorithms/tracking/libs/cuda_multicorrelator.cu000066400000000000000000000341031305042567700255410ustar00rootroot00000000000000/*! * \file cuda_multicorrelator.cu * \brief High optimized CUDA GPU vector multiTAP correlator class * \authors
      *
    • Javier Arribas, 2015. jarribas(at)cttc.es *
    * * Class that implements a high optimized vector multiTAP correlator class for NVIDIA CUDA GPUs * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "cuda_multicorrelator.h" #include #include // For the CUDA runtime routines (prefixed with "cuda_") #include #define ACCUM_N 128 __global__ void Doppler_wippe_scalarProdGPUCPXxN_shifts_chips( GPU_Complex *d_corr_out, GPU_Complex *d_sig_in, GPU_Complex *d_sig_wiped, GPU_Complex *d_local_code_in, float *d_shifts_chips, int code_length_chips, float code_phase_step_chips, float rem_code_phase_chips, int vectorN, int elementN, float rem_carrier_phase_in_rad, float phase_step_rad ) { //Accumulators cache __shared__ GPU_Complex accumResult[ACCUM_N]; // CUDA version of floating point NCO and vector dot product integrated float sin; float cos; for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < elementN; i += blockDim.x * gridDim.x) { __sincosf(rem_carrier_phase_in_rad + i*phase_step_rad, &sin, &cos); d_sig_wiped[i] = d_sig_in[i] * GPU_Complex(cos,-sin); } __syncthreads(); //////////////////////////////////////////////////////////////////////////// // Cycle through every pair of vectors, // taking into account that vector counts can be different // from total number of thread blocks //////////////////////////////////////////////////////////////////////////// for (int vec = blockIdx.x; vec < vectorN; vec += gridDim.x) { //int vectorBase = IMUL(elementN, vec); //int vectorEnd = elementN; //////////////////////////////////////////////////////////////////////// // Each accumulator cycles through vectors with // stride equal to number of total number of accumulators ACCUM_N // At this stage ACCUM_N is only preferred be a multiple of warp size // to meet memory coalescing alignment constraints. //////////////////////////////////////////////////////////////////////// for (int iAccum = threadIdx.x; iAccum < ACCUM_N; iAccum += blockDim.x) { GPU_Complex sum = GPU_Complex(0,0); float local_code_chip_index=0.0;; //float code_phase; for (int pos = iAccum; pos < elementN; pos += ACCUM_N) { //original sample code //sum = sum + d_sig_in[pos-vectorBase] * d_nco_in[pos-vectorBase] * d_local_codes_in[pos]; //sum = sum + d_sig_in[pos-vectorBase] * d_local_codes_in[pos]; //sum.multiply_acc(d_sig_in[pos],d_local_codes_in[pos+d_shifts_samples[vec]]); //custom code for multitap correlator // 1.resample local code for the current shift local_code_chip_index= fmodf(code_phase_step_chips*__int2float_rd(pos)+ d_shifts_chips[vec] - rem_code_phase_chips, code_length_chips); //Take into account that in multitap correlators, the shifts can be negative! if (local_code_chip_index<0.0) local_code_chip_index+=(code_length_chips-1); //printf("vec= %i, pos %i, chip_idx=%i chip_shift=%f \r\n",vec, pos,__float2int_rd(local_code_chip_index),local_code_chip_index); // 2.correlate sum.multiply_acc(d_sig_wiped[pos],d_local_code_in[__float2int_rd(local_code_chip_index)]); } accumResult[iAccum] = sum; } //////////////////////////////////////////////////////////////////////// // Perform tree-like reduction of accumulators' results. // ACCUM_N has to be power of two at this stage //////////////////////////////////////////////////////////////////////// for (int stride = ACCUM_N / 2; stride > 0; stride >>= 1) { __syncthreads(); for (int iAccum = threadIdx.x; iAccum < stride; iAccum += blockDim.x) { accumResult[iAccum] += accumResult[stride + iAccum]; } } if (threadIdx.x == 0) { d_corr_out[vec] = accumResult[0]; } } } bool cuda_multicorrelator::init_cuda_integrated_resampler( int signal_length_samples, int code_length_chips, int n_correlators ) { // use command-line specified CUDA device, otherwise use device with highest Gflops/s // findCudaDevice(argc, (const char **)argv); cudaDeviceProp prop; int num_devices, device; cudaGetDeviceCount(&num_devices); if (num_devices > 1) { int max_multiprocessors = 0, max_device = 0; for (device = 0; device < num_devices; device++) { cudaDeviceProp properties; cudaGetDeviceProperties(&properties, device); if (max_multiprocessors < properties.multiProcessorCount) { max_multiprocessors = properties.multiProcessorCount; max_device = device; } printf("Found GPU device # %i\n",device); } //cudaSetDevice(max_device); //set random device! selected_gps_device=rand() % num_devices;//generates a random number between 0 and num_devices to split the threads between GPUs cudaSetDevice(selected_gps_device); cudaGetDeviceProperties( &prop, max_device ); //debug code if (prop.canMapHostMemory != 1) { printf( "Device can not map memory.\n" ); } printf("L2 Cache size= %u \n",prop.l2CacheSize); printf("maxThreadsPerBlock= %u \n",prop.maxThreadsPerBlock); printf("maxGridSize= %i \n",prop.maxGridSize[0]); printf("sharedMemPerBlock= %lu \n",prop.sharedMemPerBlock); printf("deviceOverlap= %i \n",prop.deviceOverlap); printf("multiProcessorCount= %i \n",prop.multiProcessorCount); }else{ cudaGetDevice( &selected_gps_device); cudaGetDeviceProperties( &prop, selected_gps_device ); //debug code if (prop.canMapHostMemory != 1) { printf( "Device can not map memory.\n" ); } printf("L2 Cache size= %u \n",prop.l2CacheSize); printf("maxThreadsPerBlock= %u \n",prop.maxThreadsPerBlock); printf("maxGridSize= %i \n",prop.maxGridSize[0]); printf("sharedMemPerBlock= %lu \n",prop.sharedMemPerBlock); printf("deviceOverlap= %i \n",prop.deviceOverlap); printf("multiProcessorCount= %i \n",prop.multiProcessorCount); } // (cudaFuncSetCacheConfig(CUDA_32fc_x2_multiply_x2_dot_prod_32fc_, cudaFuncCachePreferShared)); // ALLOCATE GPU MEMORY FOR INPUT/OUTPUT and INTERNAL vectors size_t size = signal_length_samples * sizeof(GPU_Complex); //********* ZERO COPY VERSION ************ // Set flag to enable zero copy access // Optimal in shared memory devices (like Jetson K1) //cudaSetDeviceFlags(cudaDeviceMapHost); //******** CudaMalloc version *********** // input signal GPU memory (can be mapped to CPU memory in shared memory devices!) // cudaMalloc((void **)&d_sig_in, size); // cudaMemset(d_sig_in,0,size); // Doppler-free signal (internal GPU memory) cudaMalloc((void **)&d_sig_doppler_wiped, size); cudaMemset(d_sig_doppler_wiped,0,size); // Local code GPU memory (can be mapped to CPU memory in shared memory devices!) cudaMalloc((void **)&d_local_codes_in, sizeof(std::complex)*code_length_chips); cudaMemset(d_local_codes_in,0,sizeof(std::complex)*code_length_chips); d_code_length_chips=code_length_chips; // Vector with the chip shifts for each correlator tap //GPU memory (can be mapped to CPU memory in shared memory devices!) cudaMalloc((void **)&d_shifts_chips, sizeof(float)*n_correlators); cudaMemset(d_shifts_chips,0,sizeof(float)*n_correlators); //scalars //cudaMalloc((void **)&d_corr_out, sizeof(std::complex)*n_correlators); //cudaMemset(d_corr_out,0,sizeof(std::complex)*n_correlators); // Launch the Vector Add CUDA Kernel // TODO: write a smart load balance using device info! threadsPerBlock = 64; blocksPerGrid = 128;//(int)(signal_length_samples+threadsPerBlock-1)/threadsPerBlock; cudaStreamCreate (&stream1) ; //cudaStreamCreate (&stream2) ; return true; } bool cuda_multicorrelator::set_local_code_and_taps( int code_length_chips, const std::complex* local_codes_in, float *shifts_chips, int n_correlators ) { cudaSetDevice(selected_gps_device); //********* ZERO COPY VERSION ************ // // Get device pointer from host memory. No allocation or memcpy // cudaError_t code; // // local code CPU -> GPU copy memory // code=cudaHostGetDevicePointer((void **)&d_local_codes_in, (void *) local_codes_in, 0); // if (code!=cudaSuccess) // { // printf("cuda cudaHostGetDevicePointer error in set_local_code_and_taps \r\n"); // } // // Correlator shifts vector CPU -> GPU copy memory (fractional chip shifts are allowed!) // code=cudaHostGetDevicePointer((void **)&d_shifts_chips, (void *) shifts_chips, 0); // if (code!=cudaSuccess) // { // printf("cuda cudaHostGetDevicePointer error in set_local_code_and_taps \r\n"); // } //******** CudaMalloc version *********** //local code CPU -> GPU copy memory cudaMemcpyAsync(d_local_codes_in, local_codes_in, sizeof(GPU_Complex)*code_length_chips, cudaMemcpyHostToDevice,stream1); d_code_length_chips=code_length_chips; //Correlator shifts vector CPU -> GPU copy memory (fractional chip shifts are allowed!) cudaMemcpyAsync(d_shifts_chips, shifts_chips, sizeof(float)*n_correlators, cudaMemcpyHostToDevice,stream1); return true; } bool cuda_multicorrelator::set_input_output_vectors( std::complex* corr_out, std::complex* sig_in ) { cudaSetDevice(selected_gps_device); // Save CPU pointers d_sig_in_cpu =sig_in; d_corr_out_cpu = corr_out; // Zero Copy version // Get device pointer from host memory. No allocation or memcpy cudaError_t code; code=cudaHostGetDevicePointer((void **)&d_sig_in, (void *) sig_in, 0); code=cudaHostGetDevicePointer((void **)&d_corr_out, (void *) corr_out, 0); if (code!=cudaSuccess) { printf("cuda cudaHostGetDevicePointer error \r\n"); } return true; } #define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); } inline void gpuAssert(cudaError_t code, const char *file, int line, bool abort=true) { if (code != cudaSuccess) { fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line); if (abort) exit(code); } } bool cuda_multicorrelator::Carrier_wipeoff_multicorrelator_resampler_cuda( float rem_carrier_phase_in_rad, float phase_step_rad, float code_phase_step_chips, float rem_code_phase_chips, int signal_length_samples, int n_correlators) { cudaSetDevice(selected_gps_device); // cudaMemCpy version //size_t memSize = signal_length_samples * sizeof(std::complex); // input signal CPU -> GPU copy memory //cudaMemcpyAsync(d_sig_in, d_sig_in_cpu, memSize, // cudaMemcpyHostToDevice, stream2); //***** NOTICE: NCO is computed on-the-fly, not need to copy NCO into GPU! **** //launch the multitap correlator with integrated local code resampler! Doppler_wippe_scalarProdGPUCPXxN_shifts_chips<<>>( d_corr_out, d_sig_in, d_sig_doppler_wiped, d_local_codes_in, d_shifts_chips, d_code_length_chips, code_phase_step_chips, rem_code_phase_chips, n_correlators, signal_length_samples, rem_carrier_phase_in_rad, phase_step_rad ); gpuErrchk( cudaPeekAtLastError() ); gpuErrchk( cudaStreamSynchronize(stream1)); // cudaMemCpy version // Copy the device result vector in device memory to the host result vector // in host memory. //scalar products (correlators outputs) //cudaMemcpyAsync(d_corr_out_cpu, d_corr_out, sizeof(std::complex)*n_correlators, // cudaMemcpyDeviceToHost,stream1); return true; } cuda_multicorrelator::cuda_multicorrelator() { d_sig_in=NULL; d_nco_in=NULL; d_sig_doppler_wiped=NULL; d_local_codes_in=NULL; d_shifts_samples=NULL; d_shifts_chips=NULL; d_corr_out=NULL; threadsPerBlock=0; blocksPerGrid=0; d_code_length_chips=0; } bool cuda_multicorrelator::free_cuda() { // Free device global memory if (d_sig_in!=NULL) cudaFree(d_sig_in); if (d_nco_in!=NULL) cudaFree(d_nco_in); if (d_sig_doppler_wiped!=NULL) cudaFree(d_sig_doppler_wiped); if (d_local_codes_in!=NULL) cudaFree(d_local_codes_in); if (d_corr_out!=NULL) cudaFree(d_corr_out); if (d_shifts_samples!=NULL) cudaFree(d_shifts_samples); if (d_shifts_chips!=NULL) cudaFree(d_shifts_chips); // Reset the device and exit // cudaDeviceReset causes the driver to clean up all state. While // not mandatory in normal operation, it is good practice. It is also // needed to ensure correct operation when the application is being // profiled. Calling cudaDeviceReset causes all profile data to be // flushed before the application exits cudaDeviceReset(); return true; } gnss-sdr-0.0.9/src/algorithms/tracking/libs/cuda_multicorrelator.h000066400000000000000000000117061305042567700253650ustar00rootroot00000000000000/*! * \file cuda_multicorrelator.h * \brief High optimized CUDA GPU vector multiTAP correlator class * \authors
      *
    • Javier Arribas, 2015. jarribas(at)cttc.es *
    * * Class that implements a high optimized vector multiTAP correlator class for NVIDIA CUDA GPUs * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_CUDA_MULTICORRELATOR_H_ #define GNSS_SDR_CUDA_MULTICORRELATOR_H_ #ifdef __CUDACC__ #define CUDA_CALLABLE_MEMBER_GLOBAL __global__ #define CUDA_CALLABLE_MEMBER_DEVICE __device__ #else #define CUDA_CALLABLE_MEMBER_GLOBAL #define CUDA_CALLABLE_MEMBER_DEVICE #endif #include #include #include // GPU new internal data types for complex numbers struct GPU_Complex { float r; float i; CUDA_CALLABLE_MEMBER_DEVICE GPU_Complex() {}; CUDA_CALLABLE_MEMBER_DEVICE GPU_Complex( float a, float b ) : r(a), i(b) {} CUDA_CALLABLE_MEMBER_DEVICE float magnitude2( void ) { return r * r + i * i; } CUDA_CALLABLE_MEMBER_DEVICE GPU_Complex operator*(const GPU_Complex& a) { #ifdef __CUDACC__ return GPU_Complex(__fmul_rn(r, a.r) - __fmul_rn(i, a.i), __fmul_rn(i, a.r) + __fmul_rn(r, a.i)); #else return GPU_Complex(r*a.r - i*a.i, i*a.r + r*a.i); #endif } CUDA_CALLABLE_MEMBER_DEVICE GPU_Complex operator+(const GPU_Complex& a) { return GPU_Complex(r + a.r, i + a.i); } CUDA_CALLABLE_MEMBER_DEVICE void operator+=(const GPU_Complex& a) { r += a.r; i += a.i; } CUDA_CALLABLE_MEMBER_DEVICE void multiply_acc(const GPU_Complex& a, const GPU_Complex& b) { //c=a*b+c //real part //c.r=(a.r*b.r - a.i*b.i)+c.r #ifdef __CUDACC__ r = __fmaf_rn(a.r, b.r, r); r = __fmaf_rn(-a.i, b.i, r); //imag part i = __fmaf_rn(a.i, b.r, i); i = __fmaf_rn(a.r, b.i, i); #else r = (a.r*b.r - a.i*b.i) + r; i = (a.i*b.r - a.r*b.i) + i; #endif } }; struct GPU_Complex_Short { float r; float i; CUDA_CALLABLE_MEMBER_DEVICE GPU_Complex_Short( short int a, short int b ) : r(a), i(b) {} CUDA_CALLABLE_MEMBER_DEVICE float magnitude2( void ) { return r * r + i * i; } CUDA_CALLABLE_MEMBER_DEVICE GPU_Complex_Short operator*(const GPU_Complex_Short& a) { return GPU_Complex_Short(r*a.r - i*a.i, i*a.r + r*a.i); } CUDA_CALLABLE_MEMBER_DEVICE GPU_Complex_Short operator+(const GPU_Complex_Short& a) { return GPU_Complex_Short(r+a.r, i+a.i); } }; /*! * \brief Class that implements carrier wipe-off and correlators using NVIDIA CUDA GPU accelerators. */ class cuda_multicorrelator { public: cuda_multicorrelator(); bool init_cuda_integrated_resampler( int signal_length_samples, int code_length_chips, int n_correlators ); bool set_local_code_and_taps( int code_length_chips, const std::complex* local_codes_in, float *shifts_chips, int n_correlators ); bool set_input_output_vectors( std::complex* corr_out, std::complex* sig_in ); bool free_cuda(); bool Carrier_wipeoff_multicorrelator_resampler_cuda( float rem_carrier_phase_in_rad, float phase_step_rad, float code_phase_step_chips, float rem_code_phase_chips, int signal_length_samples, int n_correlators); private: // Allocate the device input vectors GPU_Complex *d_sig_in; GPU_Complex *d_nco_in; GPU_Complex *d_sig_doppler_wiped; GPU_Complex *d_local_codes_in; GPU_Complex *d_corr_out; // std::complex *d_sig_in_cpu; std::complex *d_corr_out_cpu; int *d_shifts_samples; float *d_shifts_chips; int d_code_length_chips; int selected_gps_device; int threadsPerBlock; int blocksPerGrid; cudaStream_t stream1; //cudaStream_t stream2; int num_gpu_devices; int selected_device; }; #endif /* GNSS_SDR_CUDA_MULTICORRELATOR_H_ */ gnss-sdr-0.0.9/src/algorithms/tracking/libs/lock_detectors.cc000066400000000000000000000107551305042567700243070ustar00rootroot00000000000000/*! * \file lock_detectors.cc * \brief Implementation of a library with a set of code and carrier phase lock detectors. * * SNV_CN0 is a Carrier-to-Noise (CN0) estimator * based on the Signal-to-Noise Variance (SNV) estimator [1]. * Carrier lock detector using normalised estimate of the cosine * of twice the carrier phase error [2]. * * [1] Marco Pini, Emanuela Falletti and Maurizio Fantino, "Performance * Evaluation of C/N0 Estimators using a Real Time GNSS Software Receiver," * IEEE 10th International Symposium on Spread Spectrum Techniques and * Applications, pp.28-30, August 2008. * * [2] Van Dierendonck, A.J. (1996), Global Positioning System: Theory and * Applications, * Volume I, Chapter 8: GPS Receivers, AJ Systems, Los Altos, CA 94024. * Inc.: 329-407. * \authors
      *
    • Javier Arribas, 2011. jarribas(at)cttc.es *
    • Luis Esteve, 2012. luis(at)epsilon-formacion.com *
    * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "lock_detectors.h" #include /* * Signal-to-Noise (SNR) (\f$\rho\f$) estimator using the Signal-to-Noise Variance (SNV) estimator: * \f{equation} * \hat{\rho}=\frac{\hat{P}_s}{\hat{P}_n}=\frac{\hat{P}_s}{\hat{P}_{tot}-\hat{P}_s}, * \f} * where \f$\hat{P}_s=\left(\frac{1}{N}\sum^{N-1}_{i=0}|Re(Pc(i))|\right)^2\f$ is the estimation of the signal power, * \f$\hat{P}_{tot}=\frac{1}{N}\sum^{N-1}_{i=0}|Pc(i)|^2\f$ is the estimator of the total power, \f$|\cdot|\f$ is the absolute value, * \f$Re(\cdot)\f$ stands for the real part of the value, and \f$Pc(i)\f$ is the prompt correlator output for the sample index i. * * The SNR value is converted to CN0 [dB-Hz], taking to account the receiver bandwidth and the PRN code gain, using the following formula: * \f{equation} * CN0_{dB}=10*log(\hat{\rho})+10*log(\frac{f_s}{2})-10*log(L_{PRN}), * \f} * where \f$f_s\f$ is the sampling frequency and \f$L_{PRN}\f$ is the PRN sequence length. * */ float cn0_svn_estimator(gr_complex* Prompt_buffer, int length, long fs_in, double code_length) { double SNR = 0; double SNR_dB_Hz = 0; double Psig = 0; double Ptot = 0; for (int i=0; i(Prompt_buffer[i].real())); Ptot += static_cast(Prompt_buffer[i].imag()) * static_cast(Prompt_buffer[i].imag()) + static_cast(Prompt_buffer[i].real()) * static_cast(Prompt_buffer[i].real()); } Psig = Psig / static_cast(length); Psig = Psig * Psig; Ptot = Ptot / static_cast(length); SNR = Psig / (Ptot - Psig); SNR_dB_Hz = 10 * log10(SNR) + 10 * log10(static_cast(fs_in)/2) - 10 * log10(code_length); return static_cast(SNR_dB_Hz); } /* * The estimate of the cosine of twice the carrier phase error is given by * \f{equation} * \cos(2\phi)=\frac{NBD}{NBP}, * \f} * where \f$NBD=(\sum^{N-1}_{i=0}Im(Pc(i)))^2-(\sum^{N-1}_{i=0}Re(Pc(i)))^2\f$, * \f$NBP=(\sum^{N-1}_{i=0}Im(Pc(i)))^2+(\sum^{N-1}_{i=0}Re(Pc(i)))^2\f$, and * \f$Pc(i)\f$ is the prompt correlator output for the sample index i. */ float carrier_lock_detector(gr_complex* Prompt_buffer, int length) { float tmp_sum_I = 0; float tmp_sum_Q = 0; float NBD = 0; float NBP = 0; for (int i=0; i *
  • Javier Arribas, 2011. jarribas(at)cttc.es *
  • Luis Esteve, 2012. luis(at)epsilon-formacion.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_LOCK_DETECTORS_H_ #define GNSS_SDR_LOCK_DETECTORS_H_ #include /*! \brief CN0_SNV is a Carrier-to-Noise (CN0) estimator * based on the Signal-to-Noise Variance (SNV) estimator * * Signal-to-Noise (SNR) (\f$\rho\f$) estimator using the Signal-to-Noise Variance (SNV) estimator: * \f{equation} * \hat{\rho}=\frac{\hat{P}_s}{\hat{P}_n}=\frac{\hat{P}_s}{\hat{P}_{tot}-\hat{P}_s}, * \f} * where \f$\hat{P}_s=\left(\frac{1}{N}\sum^{N-1}_{i=0}|Re(Pc(i))|\right)^2\f$ is the estimation of the signal power, * \f$\hat{P}_{tot}=\frac{1}{N}\sum^{N-1}_{i=0}|Pc(i)|^2\f$ is the estimator of the total power, \f$|\cdot|\f$ is the absolute value, * \f$Re(\cdot)\f$ stands for the real part of the value, and \f$Pc(i)\f$ is the prompt correlator output for the sample index i. * * The SNR value is converted to CN0 [dB-Hz], taking to account the receiver bandwidth and the PRN code gain, using the following formula: * \f{equation} * CN0_{dB}=10*log(\hat{\rho})+10*log(\frac{f_s}{2})-10*log(L_{PRN}), * \f} * where \f$f_s\f$ is the sampling frequency and \f$L_{PRN}\f$ is the PRN sequence length. * Ref: Marco Pini, Emanuela Falletti and Maurizio Fantino, "Performance * Evaluation of C/N0 Estimators using a Real Time GNSS Software Receiver," * IEEE 10th International Symposium on Spread Spectrum Techniques and * Applications, pp.28-30, August 2008. */ float cn0_svn_estimator(gr_complex* Prompt_buffer, int length, long fs_in, double code_length); /*! \brief A carrier lock detector * * The Carrier Phase Lock Detector block uses the estimate of the cosine of twice the carrier phase error is given by * \f{equation} * C2\phi=\frac{NBD}{NBP}, * \f} * where \f$NBD=(\sum^{N-1}_{i=0}|Im(Pc(i))|)^2+(\sum^{N-1}_{i=0}|Re(Pc(i))|)^2\f$, * \f$NBP=\sum^{N-1}_{i=0}Im(Pc(i))^2-\sum^{N-1}_{i=0}Re(Pc(i))^2\f$, and * \f$Pc(i)\f$ is the prompt correlator output for the sample index i. * Ref: Van Dierendonck, A.J. (1996), Global Positioning System: Theory and * Applications, * Volume I, Chapter 8: GPS Receivers, AJ Systems, Los Altos, CA 94024. * Inc.: 329-407. */ float carrier_lock_detector(gr_complex* Prompt_buffer, int length); #endif gnss-sdr-0.0.9/src/algorithms/tracking/libs/tcp_communication.cc000066400000000000000000000113641305042567700250130ustar00rootroot00000000000000/*! * \file tcp_communication.cc * \brief Implementation of the TCP communication class * \author David Pubill, 2011. dpubill(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "tcp_packet_data.h" #include "tcp_communication.h" #include #include tcp_communication::tcp_communication() : tcp_socket_(io_service_) {} tcp_communication::~tcp_communication() {} int tcp_communication::listen_tcp_connection(size_t d_port_, size_t d_port_ch0_) { try { // Specify IP type and port boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), d_port_); boost::asio::ip::tcp::acceptor acceptor(io_service_, endpoint); if (d_port_ == d_port_ch0_) { std::cout << "Server ready. Listening for TCP connections..." << std::endl; } // Reuse the IP address for each connection acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true)); // Listen for a connection and accept it acceptor.listen(12); acceptor.accept(tcp_socket_); std::cout << "Socket accepted on port " << d_port_ << std::endl; } catch(std::exception& e) { std::cerr << "Exception: " << e.what() << std::endl; } return false; } void tcp_communication::send_receive_tcp_packet_galileo_e1(boost::array buf, tcp_packet_data *tcp_data_) { int controlc = 0; boost::array readbuf; float d_control_id_ = buf.data()[0]; try { // Send a TCP packet tcp_socket_.write_some(boost::asio::buffer(buf)); // Read the received TCP packet tcp_socket_.read_some(boost::asio::buffer(readbuf)); //! Control. The GNSS-SDR program ends if an error in a TCP packet is detected. if (d_control_id_ != readbuf.data()[0]) { throw "Packet error!"; } // Recover the variables received tcp_data_->proc_pack_code_error = readbuf.data()[1]; tcp_data_->proc_pack_carr_error = readbuf.data()[2]; tcp_data_->proc_pack_carrier_doppler_hz = readbuf.data()[3]; } catch(std::exception& e) { std::cerr << "Exception: " << e.what() << ". Please press Ctrl+C to end the program." << std::endl; std::cin >> controlc; } return; } void tcp_communication::send_receive_tcp_packet_gps_l1_ca(boost::array buf, tcp_packet_data *tcp_data_) { int controlc = 0; boost::array readbuf; float d_control_id_ = buf.data()[0]; try { // Send a TCP packet tcp_socket_.write_some(boost::asio::buffer(buf)); // Read the received TCP packet tcp_socket_.read_some(boost::asio::buffer(readbuf)); //! Control. The GNSS-SDR program ends if an error in a TCP packet is detected. if (d_control_id_ != readbuf.data()[0]) { throw "Packet error!"; } // Recover the variables received tcp_data_->proc_pack_code_error = readbuf.data()[1]; tcp_data_->proc_pack_carr_error = readbuf.data()[2]; tcp_data_->proc_pack_carrier_doppler_hz = readbuf.data()[3]; } catch(std::exception& e) { std::cerr << "Exception: " << e.what() << ". Please press Ctrl+C to end the program." << std::endl; std::cin >> controlc; } return; } void tcp_communication::close_tcp_connection(size_t d_port_) { // Close the TCP connection tcp_socket_.close(); std::cout << "Socket closed on port " << d_port_ << std::endl; return; } gnss-sdr-0.0.9/src/algorithms/tracking/libs/tcp_communication.h000066400000000000000000000037341305042567700246570ustar00rootroot00000000000000/*! * \file tcp_communication.h * \brief Interface of the TCP communication class * \author David Pubill, 2011. dpubill(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_TCP_COMMUNICATION_H_ #define GNSS_SDR_TCP_COMMUNICATION_H_ #include #include #include "tcp_packet_data.h" #define NUM_TX_VARIABLES_GALILEO_E1 13 #define NUM_TX_VARIABLES_GPS_L1_CA 9 #define NUM_RX_VARIABLES 4 /*! * \brief TCP communication class */ class tcp_communication { public: tcp_communication(); ~tcp_communication(); int listen_tcp_connection(size_t d_port_, size_t d_port_ch0_); void send_receive_tcp_packet_galileo_e1(boost::array buf, tcp_packet_data *tcp_data_); void send_receive_tcp_packet_gps_l1_ca(boost::array buf, tcp_packet_data *tcp_data_); void close_tcp_connection(size_t d_port_); private: boost::asio::io_service io_service_; boost::asio::ip::tcp::socket tcp_socket_; }; #endif gnss-sdr-0.0.9/src/algorithms/tracking/libs/tcp_packet_data.cc000066400000000000000000000025051305042567700244030ustar00rootroot00000000000000/*! * \file tcp_packet_data.cc * \brief Interface of the TCP packet data class * \author David Pubill, 2011. dpubill(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "tcp_packet_data.h" tcp_packet_data::tcp_packet_data() { proc_pack_code_error = 0; proc_pack_carr_error = 0; proc_pack_carrier_doppler_hz = 0; } tcp_packet_data::~tcp_packet_data() {} gnss-sdr-0.0.9/src/algorithms/tracking/libs/tcp_packet_data.h000066400000000000000000000026731305042567700242530ustar00rootroot00000000000000/*! * \file tcp_packet_data.h * \brief Interface of the TCP data packet class * \author David Pubill, 2011. dpubill(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_TCP_PACKET_DATA_H_ #define GNSS_SDR_TCP_PACKET_DATA_H_ /*! * \brief Class that implements a TCP data packet */ class tcp_packet_data { public: tcp_packet_data(); ~tcp_packet_data(); float proc_pack_code_error; float proc_pack_carr_error; float proc_pack_carrier_doppler_hz; }; #endif gnss-sdr-0.0.9/src/algorithms/tracking/libs/tracking_2nd_DLL_filter.cc000066400000000000000000000062211305042567700257010ustar00rootroot00000000000000/*! * \file tracking_2nd_DLL_filter.cc * \brief Implementation of a 2nd order DLL filter for code tracking loop. * \author Javier Arribas, 2011. jarribas(at)cttc.es * * Class that implements 2 order PLL filter for code tracking loop. * The algorithm is described in : * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.~H.~Jensen, A Software-Defined * GPS and Galileo Receiver. A Single-Frequency Approach, * Birkhauser, 2007, Applied and Numerical Harmonic Analysis. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "tracking_2nd_DLL_filter.h" void Tracking_2nd_DLL_filter::calculate_lopp_coef(float* tau1,float* tau2, float lbw, float zeta, float k) { // Solve natural frequency float Wn; Wn = lbw*8*zeta / (4*zeta*zeta + 1); // solve for t1 & t2 *tau1 = k / (Wn * Wn); *tau2 = (2.0 * zeta) / Wn; } void Tracking_2nd_DLL_filter::set_DLL_BW(float dll_bw_hz) { //Calculate filter coefficient values d_dllnoisebandwidth = dll_bw_hz; calculate_lopp_coef(&d_tau1_code, &d_tau2_code, d_dllnoisebandwidth, d_dlldampingratio, 1.0);// Calculate filter coefficient values } void Tracking_2nd_DLL_filter::initialize() { // code tracking loop parameters d_old_code_nco = 0.0; d_old_code_error = 0.0; } float Tracking_2nd_DLL_filter::get_code_nco(float DLL_discriminator) { float code_nco; code_nco = d_old_code_nco + (d_tau2_code/d_tau1_code)*(DLL_discriminator - d_old_code_error) + (DLL_discriminator+d_old_code_error) * (d_pdi_code/(2*d_tau1_code)); //code_nco = d_old_code_nco + (d_tau2_code/d_tau1_code)*(DLL_discriminator - d_old_code_error) + DLL_discriminator * (d_pdi_code/d_tau1_code); d_old_code_nco = code_nco; d_old_code_error = DLL_discriminator; //[chips] return code_nco; } Tracking_2nd_DLL_filter::Tracking_2nd_DLL_filter (float pdi_code) { d_pdi_code = pdi_code;// Summation interval for code d_dlldampingratio = 0.7; } Tracking_2nd_DLL_filter::Tracking_2nd_DLL_filter () { d_pdi_code = 0.001;// Summation interval for code d_dlldampingratio = 0.7; } Tracking_2nd_DLL_filter::~Tracking_2nd_DLL_filter () {} void Tracking_2nd_DLL_filter::set_pdi(float pdi_code) { d_pdi_code = pdi_code; // Summation interval for code } gnss-sdr-0.0.9/src/algorithms/tracking/libs/tracking_2nd_DLL_filter.h000066400000000000000000000052331305042567700255450ustar00rootroot00000000000000/*! * \file tracking_2nd_DLL_filter.h * \brief Interface of a 2nd order DLL filter for code tracking loop. * \author Javier Arribas, 2011. jarribas(at)cttc.es * * Class that implements a 2nd order PLL filter for code tracking loop. * The algorithm is described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S. H. Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency Approach, * Birkhauser, 2007, Applied and Numerical Harmonic Analysis. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_TRACKING_2ND_DLL_FILTER_H_ #define GNSS_SDR_TRACKING_2ND_DLL_FILTER_H_ /*! * \brief This class implements a 2nd order DLL filter for code tracking loop. * * The algorithm is described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S. H. Jensen, A Software-Defined GPS * and Galileo Receiver. A Single-Frequency Approach, * Birkhauser, 2007, Applied and Numerical Harmonic Analysis. */ class Tracking_2nd_DLL_filter { private: // PLL filter parameters float d_tau1_code = 0; float d_tau2_code = 0; float d_pdi_code = 0; float d_dllnoisebandwidth = 0; float d_dlldampingratio = 0; float d_old_code_error = 0; float d_old_code_nco = 0; void calculate_lopp_coef(float* tau1,float* tau2, float lbw, float zeta, float k); public: void set_DLL_BW(float dll_bw_hz); //! Set DLL filter bandwidth [Hz] void set_pdi(float pdi_code); //! Set Summation interval for code [s] void initialize(); //! Start tracking with acquisition information float get_code_nco(float DLL_discriminator); //! Numerically controlled oscillator Tracking_2nd_DLL_filter(float pdi_code); Tracking_2nd_DLL_filter(); ~Tracking_2nd_DLL_filter(); }; #endif gnss-sdr-0.0.9/src/algorithms/tracking/libs/tracking_2nd_PLL_filter.cc000066400000000000000000000066671305042567700257330ustar00rootroot00000000000000/*! * \file tracking_2nd_PLL_filter.cc * \brief Implementation of a 2nd order PLL filter for tracking carrier loop. * \author Javier Arribas, 2011. jarribas(at)cttc.es * * Class that implements 2 order PLL filter for tracking carrier loop. The algorithm * is described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.~H.~Jensen, A Software-Defined * GPS and Galileo Receiver. A Single-Frequency Approach, * Birkhauser, 2007, Applied and Numerical Harmonic Analysis. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "tracking_2nd_PLL_filter.h" void Tracking_2nd_PLL_filter::calculate_lopp_coef(float* tau1,float* tau2, float lbw, float zeta, float k) { // Solve natural frequency float Wn; Wn = lbw*8*zeta / (4*zeta*zeta + 1); // solve for t1 & t2 *tau1 = k / (Wn * Wn); *tau2 = (2.0 * zeta) / Wn; } void Tracking_2nd_PLL_filter::set_PLL_BW(float pll_bw_hz) { //Calculate filter coefficient values d_pllnoisebandwidth = pll_bw_hz; calculate_lopp_coef(&d_tau1_carr, &d_tau2_carr, d_pllnoisebandwidth, d_plldampingratio, 0.25); // Calculate filter coefficient values } void Tracking_2nd_PLL_filter::initialize() { // carrier/Costas loop parameters d_old_carr_nco = 0.0; d_old_carr_error = 0.0; } /* * PLL second order FIR filter * Req Input in [Hz/Ti] * The output is in [Hz/s]. */ float Tracking_2nd_PLL_filter::get_carrier_nco(float PLL_discriminator) { float carr_nco; carr_nco = d_old_carr_nco + (d_tau2_carr/d_tau1_carr)*(PLL_discriminator - d_old_carr_error) + (PLL_discriminator + d_old_carr_error) * (d_pdi_carr/(2*d_tau1_carr)); //carr_nco = d_old_carr_nco + (d_tau2_carr/d_tau1_carr)*(PLL_discriminator - d_old_carr_error) + PLL_discriminator * (d_pdi_carr/d_tau1_carr); d_old_carr_nco = carr_nco; d_old_carr_error = PLL_discriminator; return carr_nco; } Tracking_2nd_PLL_filter::Tracking_2nd_PLL_filter (float pdi_carr) { //--- PLL variables -------------------------------------------------------- d_pdi_carr = pdi_carr;// Summation interval for carrier //d_plldampingratio = 0.65; d_plldampingratio = 0.7; } Tracking_2nd_PLL_filter::Tracking_2nd_PLL_filter () { //--- PLL variables -------------------------------------------------------- d_pdi_carr = 0.001;// Summation interval for carrier d_plldampingratio = 0.7; } Tracking_2nd_PLL_filter::~Tracking_2nd_PLL_filter () {} void Tracking_2nd_PLL_filter::set_pdi(float pdi_carr) { d_pdi_carr = pdi_carr; // Summation interval for code } gnss-sdr-0.0.9/src/algorithms/tracking/libs/tracking_2nd_PLL_filter.h000066400000000000000000000050661305042567700255650ustar00rootroot00000000000000/*! * \file tracking_2nd_PLL_filter.h * \brief Interface of a 2nd order PLL filter for carrier tracking loop * \author Javier Arribas, 2011. jarribas(at)cttc.es * * Class that implements 2 order PLL filter for tracking carrier loop. * The algorithm is described in * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H. Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency Approach, * Birkhauser, 2007, Applied and Numerical Harmonic Analysis. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_TRACKING_2ND_PLL_FILTER_H_ #define GNSS_SDR_TRACKING_2ND_PLL_FILTER_H_ /*! * \brief This class implements a 2nd order PLL filter for carrier tracking loop. * * The algorithm is described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S. H. Jensen, A Software-Defined GPS and Galileo Receiver. A Single-Frequency Approach, * Birkhauser, 2007, Applied and Numerical Harmonic Analysis. */ class Tracking_2nd_PLL_filter { private: // PLL filter parameters float d_tau1_carr = 0; float d_tau2_carr = 0; float d_pdi_carr = 0; float d_pllnoisebandwidth = 0; float d_plldampingratio = 0; float d_old_carr_error = 0; float d_old_carr_nco = 0; void calculate_lopp_coef(float* tau1,float* tau2, float lbw, float zeta, float k); public: void set_PLL_BW(float pll_bw_hz); //! Set PLL loop bandwidth [Hz] void set_pdi(float pdi_carr); //! Set Summation interval for code [s] void initialize(); float get_carrier_nco(float PLL_discriminator); Tracking_2nd_PLL_filter(float pdi_carr); Tracking_2nd_PLL_filter(); ~Tracking_2nd_PLL_filter(); }; #endif gnss-sdr-0.0.9/src/algorithms/tracking/libs/tracking_FLL_PLL_filter.cc000066400000000000000000000103261305042567700256500ustar00rootroot00000000000000/*! * \file tracking_FLL_PLL_filter.cc * \brief Implementation of a hybrid FLL and PLL filter for tracking carrier loop * \author Javier Arribas, 2011. jarribas(at)cttc.es * * Class that implements hybrid FLL and PLL filter for tracking carrier loop * Filter design (Kaplan 2nd ed., Pag. 181 Fig. 181) * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "tracking_FLL_PLL_filter.h" #include void Tracking_FLL_PLL_filter::set_params(float fll_bw_hz, float pll_bw_hz, int order) { /* * Filter design (Kaplan 2nd ed., Pag. 181 Fig. 181) */ d_order = order; if (d_order == 3) { /* * 3rd order PLL with 2nd order FLL assist */ d_pll_b3 = 2.400; d_pll_a3 = 1.100; d_pll_a2 = 1.414; d_pll_w0p = pll_bw_hz / 0.7845; d_pll_w0p2 = d_pll_w0p * d_pll_w0p; d_pll_w0p3 = d_pll_w0p2 * d_pll_w0p; d_pll_w0f = fll_bw_hz / 0.53; d_pll_w0f2 = d_pll_w0f * d_pll_w0f; } else { /* * 2nd order PLL with 1st order FLL assist */ d_pll_a2 = 1.414; d_pll_w0p = pll_bw_hz / 0.53; d_pll_w0p2 = d_pll_w0p * d_pll_w0p; d_pll_w0f = fll_bw_hz / 0.25; } } void Tracking_FLL_PLL_filter::initialize(float d_acq_carrier_doppler_hz) { if (d_order == 3) { d_pll_x = 2.0 * d_acq_carrier_doppler_hz; d_pll_w = 0; } else { d_pll_w = d_acq_carrier_doppler_hz; d_pll_x = 0; } } float Tracking_FLL_PLL_filter::get_carrier_error(float FLL_discriminator, float PLL_discriminator, float correlation_time_s) { float carrier_error_hz; if (d_order == 3) { /* * 3rd order PLL with 2nd order FLL assist */ d_pll_w = d_pll_w + correlation_time_s * (d_pll_w0p3 * PLL_discriminator + d_pll_w0f2 * FLL_discriminator); d_pll_x = d_pll_x + correlation_time_s * (0.5*d_pll_w + d_pll_a2 * d_pll_w0f * FLL_discriminator + d_pll_a3 * d_pll_w0p2 * PLL_discriminator); carrier_error_hz = 0.5*d_pll_x + d_pll_b3 * d_pll_w0p * PLL_discriminator; } else { /* * 2nd order PLL with 1st order FLL assist */ float pll_w_new; pll_w_new = d_pll_w + PLL_discriminator * d_pll_w0p2 * correlation_time_s + FLL_discriminator * d_pll_w0f * correlation_time_s; carrier_error_hz = 0.5 * (pll_w_new + d_pll_w) + d_pll_a2 * d_pll_w0p * PLL_discriminator; d_pll_w = pll_w_new; /*std::cout<<" d_pll_w = "<. * * ------------------------------------------------------------------------- */ #ifndef GNSS_SDR_TRACKING_FLL_PLL_FILTER_H_ #define GNSS_SDR_TRACKING_FLL_PLL_FILTER_H_ /*! * \brief This class implements a hybrid FLL and PLL filter for tracking carrier loop */ class Tracking_FLL_PLL_filter { private: // FLL + PLL filter parameters int d_order; float d_pll_w; float d_pll_w0p3; float d_pll_w0f2; float d_pll_x; float d_pll_a2; float d_pll_w0f; float d_pll_a3; float d_pll_w0p2; float d_pll_b3; float d_pll_w0p; public: void set_params(float fll_bw_hz, float pll_bw_hz, int order); void initialize(float d_acq_carrier_doppler_hz); float get_carrier_error(float FLL_discriminator, float PLL_discriminator, float correlation_time_s); Tracking_FLL_PLL_filter(); ~Tracking_FLL_PLL_filter(); }; #endif gnss-sdr-0.0.9/src/algorithms/tracking/libs/tracking_discriminators.cc000066400000000000000000000111111305042567700262020ustar00rootroot00000000000000/*! * \file tracking_discriminators.cc * \brief Implementation of a library with a set of code tracking * and carrier tracking discriminators that is used by the tracking algorithms. * \authors
      *
    • Javier Arribas, 2011. jarribas(at)cttc.es *
    • Luis Esteve, 2012. luis(at)epsilon-formacion.com *
    * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "tracking_discriminators.h" #include // All the outputs are in RADIANS /* * FLL four quadrant arctan discriminator: * \f{equation} * \frac{\phi_2-\phi_1}{t_2-t1}=\frac{ATAN2(cross,dot)}{t_1-t_2}, * \f} * where \f$cross=I_{PS1}Q_{PS2}-I_{PS2}Q_{PS1}\f$ and \f$dot=I_{PS1}I_{PS2}+Q_{PS1}Q_{PS2}\f$, * \f$I_{PS1},Q_{PS1}\f$ are the inphase and quadrature prompt correlator outputs respectively at sample time \f$t_1\f$, and * \f$I_{PS2},Q_{PS2}\f$ are the inphase and quadrature prompt correlator outputs respectively at sample time \f$t_2\f$. The output is in [radians/second]. */ double fll_four_quadrant_atan(gr_complex prompt_s1, gr_complex prompt_s2, double t1, double t2) { double cross, dot; dot = prompt_s1.real()*prompt_s2.real() + prompt_s1.imag()*prompt_s2.imag(); cross = prompt_s1.real()*prompt_s2.imag() - prompt_s2.real()*prompt_s1.imag(); return atan2(cross, dot) / (t2-t1); } /* * PLL four quadrant arctan discriminator: * \f{equation} * \phi=ATAN2(Q_{PS},I_{PS}), * \f} * where \f$I_{PS1},Q_{PS1}\f$ are the inphase and quadrature prompt correlator outputs respectively. The output is in [radians]. */ double pll_four_quadrant_atan(gr_complex prompt_s1) { return atan2(prompt_s1.imag(), prompt_s1.real()); } /* * PLL Costas loop two quadrant arctan discriminator: * \f{equation} * \phi=ATAN\left(\frac{Q_{PS}}{I_{PS}}\right), * \f} * where \f$I_{PS1},Q_{PS1}\f$ are the inphase and quadrature prompt correlator outputs respectively. The output is in [radians]. */ double pll_cloop_two_quadrant_atan(gr_complex prompt_s1) { if (prompt_s1.real() != 0.0) { return atan(prompt_s1.imag() / prompt_s1.real()); } else { return 0; } } /* * DLL Noncoherent Early minus Late envelope normalized discriminator: * \f{equation} * error=\frac{1}{2}\frac{E-L}{E+L}, * \f} * where \f$E=\sqrt{I_{ES}^2+Q_{ES}^2}\f$ is the Early correlator output absolute value and * \f$L=\sqrt{I_{LS}^2+Q_{LS}^2}\f$ is the Late correlator output absolute value. The output is in [chips]. */ double dll_nc_e_minus_l_normalized(gr_complex early_s1, gr_complex late_s1) { double P_early, P_late; P_early = std::abs(early_s1); P_late = std::abs(late_s1); if( P_early + P_late == 0.0 ) { return 0.0; } else { return 0.5 * (P_early - P_late) / ((P_early + P_late)); } } /* * DLL Noncoherent Very Early Minus Late Power (VEMLP) normalized discriminator, using the outputs * of four correlators, Very Early (VE), Early (E), Late (L) and Very Late (VL): * \f{equation} * error=\frac{E-L}{E+L}, * \f} * where \f$E=\sqrt{I_{VE}^2+Q_{VE}^2+I_{E}^2+Q_{E}^2}\f$ and * \f$L=\sqrt{I_{VL}^2+Q_{VL}^2+I_{L}^2+Q_{L}^2}\f$ . The output is in [chips]. */ double dll_nc_vemlp_normalized(gr_complex very_early_s1, gr_complex early_s1, gr_complex late_s1, gr_complex very_late_s1) { double P_early, P_late; P_early = std::sqrt(std::norm(very_early_s1) + std::norm(early_s1)); P_late = std::sqrt(std::norm(very_late_s1) + std::norm(late_s1)); if( P_early + P_late == 0.0 ) { return 0.0; } else { return (P_early - P_late) / ((P_early + P_late)); } } gnss-sdr-0.0.9/src/algorithms/tracking/libs/tracking_discriminators.h000066400000000000000000000077071305042567700260640ustar00rootroot00000000000000/*! * \file tracking_discriminators.h * \brief Interface of a library with a set of code tracking and carrier * tracking discriminators. * \authors
      *
    • Javier Arribas, 2011. jarribas(at)cttc.es *
    • Luis Esteve, 2012. luis(at)epsilon-formacion.com *
    * * Library with a set of code tracking and carrier tracking discriminators * that is used by the tracking algorithms. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_TRACKING_DISCRIMINATORS_H_ #define GNSS_SDR_TRACKING_DISCRIMINATORS_H_ #include /*! brief FLL four quadrant arctan discriminator * * FLL four quadrant arctan discriminator: * \f{equation} * \frac{\phi_2-\phi_1}{t_2-t1}=\frac{ATAN2(cross,dot)}{t_1-t_2}, * \f} * where \f$cross=I_{PS1}Q_{PS2}-I_{PS2}Q_{PS1}\f$ and \f$dot=I_{PS1}I_{PS2}+Q_{PS1}Q_{PS2}\f$, * \f$I_{PS1},Q_{PS1}\f$ are the inphase and quadrature prompt correlator outputs respectively at sample time \f$t_1\f$, and * \f$I_{PS2},Q_{PS2}\f$ are the inphase and quadrature prompt correlator outputs respectively at sample time \f$t_2\f$. The output is in [radians/second]. */ double fll_four_quadrant_atan(gr_complex prompt_s1, gr_complex prompt_s2, double t1, double t2); /*! \brief PLL four quadrant arctan discriminator * * PLL four quadrant arctan discriminator: * \f{equation} * \phi=ATAN2(Q_{PS},I_{PS}), * \f} * where \f$I_{PS1},Q_{PS1}\f$ are the inphase and quadrature prompt correlator outputs respectively. The output is in [radians]. */ double pll_four_quadrant_atan(gr_complex prompt_s1); /*! \brief PLL Costas loop two quadrant arctan discriminator * * PLL Costas loop two quadrant arctan discriminator: * \f{equation} * \phi=ATAN\left(\frac{Q_{PS}}{I_{PS}}\right), * \f} * where \f$I_{PS1},Q_{PS1}\f$ are the inphase and quadrature prompt correlator outputs respectively. The output is in [radians]. */ double pll_cloop_two_quadrant_atan(gr_complex prompt_s1); /*! \brief DLL Noncoherent Early minus Late envelope normalized discriminator * * DLL Noncoherent Early minus Late envelope normalized discriminator: * \f{equation} * error=\frac{E-L}{E+L}, * \f} * where \f$E=\sqrt{I_{ES}^2+Q_{ES}^2}\f$ is the Early correlator output absolute value and * \f$L=\sqrt{I_{LS}^2+Q_{LS}^2}\f$ is the Late correlator output absolute value. The output is in [chips]. */ double dll_nc_e_minus_l_normalized(gr_complex early_s1, gr_complex late_s1); /*! \brief DLL Noncoherent Very Early Minus Late Power (VEMLP) normalized discriminator * * DLL Noncoherent Very Early Minus Late Power (VEMLP) normalized discriminator, using the outputs * of four correlators, Very Early (VE), Early (E), Late (L) and Very Late (VL): * \f{equation} * error=\frac{E-L}{E+L}, * \f} * where \f$E=\sqrt{I_{VE}^2+Q_{VE}^2+I_{E}^2+Q_{E}^2}\f$ and * \f$L=\sqrt{I_{VL}^2+Q_{VL}^2+I_{L}^2+Q_{L}^2}\f$ . The output is in [chips]. */ double dll_nc_vemlp_normalized(gr_complex very_early_s1, gr_complex early_s1, gr_complex late_s1, gr_complex very_late_s1); #endif gnss-sdr-0.0.9/src/algorithms/tracking/libs/tracking_loop_filter.cc000066400000000000000000000205021305042567700254720ustar00rootroot00000000000000/*! * \file tracking_loop_filter.cc * \brief Generic 1st to 3rd order loop filter implementation * \author Cillian O'Driscoll, 2015. cillian.odriscoll(at)gmail.com * * Class implementing a generic 1st, 2nd or 3rd order loop filter. Based * on the bilinear transform of the standard Weiner filter. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "tracking_loop_filter.h" #include #include #define MAX_LOOP_ORDER 3 #define MAX_HISTORY_LENGTH 4 Tracking_loop_filter::Tracking_loop_filter( float update_interval, float noise_bandwidth, int loop_order, bool include_last_integrator ) : d_loop_order( loop_order ), d_current_index( 0 ), d_include_last_integrator( include_last_integrator ), d_noise_bandwidth( noise_bandwidth ), d_update_interval( update_interval ) { d_inputs.resize( MAX_HISTORY_LENGTH, 0.0 ); d_outputs.resize( MAX_HISTORY_LENGTH, 0.0 ); update_coefficients(); } Tracking_loop_filter::Tracking_loop_filter() : d_loop_order( 2 ), d_current_index( 0 ), d_include_last_integrator( false ), d_noise_bandwidth( 15.0 ), d_update_interval( 0.001 ) { d_inputs.resize( MAX_HISTORY_LENGTH, 0.0 ); d_outputs.resize( MAX_HISTORY_LENGTH, 0.0 ); update_coefficients(); } Tracking_loop_filter::~Tracking_loop_filter() { // Don't need to do anything here } float Tracking_loop_filter::apply( float current_input ) { // Now apply the filter coefficients: float result = 0; // Hanlde the old outputs first: for( unsigned int ii=0; ii < d_output_coefficients.size(); ++ii ) { result += d_output_coefficients[ii] * d_outputs[ (d_current_index+ii)%MAX_HISTORY_LENGTH ]; } // Now update the index to handle the inputs. // DO NOT CHANGE THE ORDER OF THE ABOVE AND BELOW CODE // SNIPPETS!!!!!!! // Implementing a sort of circular buffer for the inputs and outputs // the current input/output is at d_current_index, the nth previous // input/output is at (d_current_index+n)%d_loop_order d_current_index--; if( d_current_index < 0 ) { d_current_index += MAX_HISTORY_LENGTH; } d_inputs[d_current_index] = current_input; for( unsigned int ii=0; ii < d_input_coefficients.size(); ++ii ) { result += d_input_coefficients[ii] * d_inputs[ (d_current_index+ii)%MAX_HISTORY_LENGTH ]; } d_outputs[d_current_index] = result; return result; } void Tracking_loop_filter::update_coefficients( void ) { // Analog gains: float g1; float g2; float g3; // Natural frequency float wn; float T = d_update_interval; float zeta = 1/std::sqrt(2); // The following is based on the bilinear transform approximation of // the analog integrator. The loop format is from Kaplan & Hegarty // Table 5.6. The basic concept is that the loop has a cascade of // integrators: // 1 for a 1st order loop // 2 for a 2nd order loop // 3 for a 3rd order loop // The bilinear transform approximates 1/s as // T/2(1 + z^-1)/(1-z^-1) in the z domain. switch( d_loop_order ) { case 1: wn = d_noise_bandwidth*4.0; g1 = wn; if( d_include_last_integrator ) { d_input_coefficients.resize(2); d_input_coefficients[0] = g1*T/2.0; d_input_coefficients[1] = g1*T/2.0; d_output_coefficients.resize(1); d_output_coefficients[0] = 1; } else { d_input_coefficients.resize(1); d_input_coefficients[0] = g1; d_output_coefficients.resize(0); } break; case 2: wn = d_noise_bandwidth * (8*zeta)/ (4*zeta*zeta + 1 ); g1 = wn*wn; g2 = wn*2*zeta; if( d_include_last_integrator ) { d_input_coefficients.resize(3); d_input_coefficients[0] = T/2*( g1*T/2 + g2 ); d_input_coefficients[1] = T*T/2*g1; d_input_coefficients[2] = T/2*( g1*T/2 - g2 ); d_output_coefficients.resize(2); d_output_coefficients[0] = 2; d_output_coefficients[1] = -1; } else { d_input_coefficients.resize(2); d_input_coefficients[0] = ( g1*T/2.0+g2 ); d_input_coefficients[1] = g1*T/2-g2; d_output_coefficients.resize(1); d_output_coefficients[0] = 1; } break; case 3: wn = d_noise_bandwidth / 0.7845; // From Kaplan float a3 = 1.1; float b3 = 2.4; g1 = wn*wn*wn; g2 = a3*wn*wn; g3 = b3*wn; if( d_include_last_integrator ) { d_input_coefficients.resize(4); d_input_coefficients[0] = T/2*( g3 + T/2*( g2 + T/2*g1 ) ); d_input_coefficients[1] = T/2*( -g3 + T/2*( g2 + 3*T/2*g1 ) ); d_input_coefficients[2] = T/2*( -g3 - T/2*( g2 - 3*T/2*g1 ) ); d_input_coefficients[3] = T/2*( g3 - T/2*( g2 - T/2*g1 ) ); d_output_coefficients.resize(3); d_output_coefficients[0] = 3; d_output_coefficients[1] = -3; d_output_coefficients[2] = 1; } else { d_input_coefficients.resize(3); d_input_coefficients[0] = g3 + T/2*( g2 + T/2*g1 ); d_input_coefficients[1] = g1*T*T/2 -2*g3; d_input_coefficients[2] = g3 + T/2*( -g2 + T/2*g1 ); d_output_coefficients.resize(2); d_output_coefficients[0] = 2; d_output_coefficients[1] = -1; } break; }; } void Tracking_loop_filter::set_noise_bandwidth( float noise_bandwidth ) { d_noise_bandwidth = noise_bandwidth; update_coefficients(); } float Tracking_loop_filter::get_noise_bandwidth( void ) const { return d_noise_bandwidth; } void Tracking_loop_filter::set_update_interval( float update_interval ) { d_update_interval = update_interval; update_coefficients(); } float Tracking_loop_filter::get_update_interval( void ) const { return d_update_interval; } void Tracking_loop_filter::set_include_last_integrator( bool include_last_integrator ) { d_include_last_integrator = include_last_integrator; update_coefficients(); } bool Tracking_loop_filter::get_include_last_integrator( void ) const { return d_include_last_integrator; } void Tracking_loop_filter::set_order( int loop_order ) { if( loop_order < 1 || loop_order > MAX_LOOP_ORDER ) { LOG(ERROR) << "Ignoring attempt to set loop order to " << loop_order << ". Maximum allowed order is: " << MAX_LOOP_ORDER << ". Not changing current value of " << d_loop_order; return; } d_loop_order = loop_order; update_coefficients(); } int Tracking_loop_filter::get_order( void ) const { return d_loop_order; } void Tracking_loop_filter::initialize( float initial_output ) { d_inputs.assign( MAX_HISTORY_LENGTH, 0.0 ); d_outputs.assign( MAX_HISTORY_LENGTH, initial_output ); d_current_index = MAX_HISTORY_LENGTH - 1; } gnss-sdr-0.0.9/src/algorithms/tracking/libs/tracking_loop_filter.h000066400000000000000000000057151305042567700253450ustar00rootroot00000000000000/*! * \file tracking_loop_filter.h * \brief Generic 1st to 3rd order loop filter implementation * \author Cillian O'Driscoll, 2015. cillian.odriscoll(at)gmail.com * * Class implementing a generic 1st, 2nd or 3rd order loop filter. Based * on the bilinear transform of the standard Weiner filter. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_TRACKING_LOOP_FILTER_H_ #define GNSS_SDR_TRACKING_LOOP_FILTER_H_ #include /*! * \brief This class implements a generic 1st, 2nd or 3rd order loop filter * */ class Tracking_loop_filter { private: // Store the last inputs and outputs: std::vector< float > d_inputs; std::vector< float > d_outputs; // Store the filter coefficients: std::vector< float > d_input_coefficients; std::vector< float > d_output_coefficients; // The loop order: int d_loop_order; // The current index in the i/o arrays: int d_current_index; // Should the last integrator be included? bool d_include_last_integrator; // The noise bandwidth (in Hz) // Note this is an approximation only valid when the product of this // number and the update interval (T) is small. float d_noise_bandwidth; // Loop update interval float d_update_interval; // Compute the filter coefficients: void update_coefficients(void); public: float get_noise_bandwidth(void) const; float get_update_interval(void) const; bool get_include_last_integrator(void) const; int get_order(void) const; void set_noise_bandwidth( float noise_bandwidth ); void set_update_interval( float update_interval ); void set_include_last_integrator( bool include_last_integrator ); void set_order( int loop_order ); void initialize(float initial_output = 0.0); float apply(float current_input ); Tracking_loop_filter(float update_interval, float noise_bandwidth, int loop_order = 2, bool include_last_integrator = false ); Tracking_loop_filter(); ~Tracking_loop_filter(); }; #endif gnss-sdr-0.0.9/src/core/000077500000000000000000000000001305042567700150105ustar00rootroot00000000000000gnss-sdr-0.0.9/src/core/CMakeLists.txt000066400000000000000000000014651305042567700175560ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # add_subdirectory(system_parameters) add_subdirectory(libs) add_subdirectory(receiver) gnss-sdr-0.0.9/src/core/interfaces/000077500000000000000000000000001305042567700171335ustar00rootroot00000000000000gnss-sdr-0.0.9/src/core/interfaces/acquisition_interface.h000066400000000000000000000052501305042567700236560ustar00rootroot00000000000000/*! * \file acquisition_interface.h * \brief Header file of the interface to an acquisition GNSS block. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Luis Esteve, 2011. luis(at)epsilon-formacion.com * * This header file contains the interface to an abstract class * for acquisition algorithms. Since all its methods are virtual, * this class cannot be instantiated directly, and a subclass can only be * instantiated directly if all inherited pure virtual methods have been * implemented by that class or a parent class. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_ACQUISITION_INTERFACE_H_ #define GNSS_SDR_ACQUISITION_INTERFACE_H_ #include "gnss_block_interface.h" #include "gnss_synchro.h" templateclass concurrent_queue; /*! \brief This abstract class represents an interface to an acquisition GNSS block. * * Abstract class for acquisition algorithms. Since all its methods are virtual, * this class cannot be instantiated directly, and a subclass can only be * instantiated directly if all inherited pure virtual methods have been * implemented by that class or a parent class. */ class AcquisitionInterface: public GNSSBlockInterface { public: //virtual void set_active(bool active) = 0; virtual void set_gnss_synchro(Gnss_Synchro* gnss_synchro) = 0; virtual void set_channel(unsigned int channel) = 0; virtual void set_threshold(float threshold) = 0; virtual void set_doppler_max(unsigned int doppler_max) = 0; virtual void set_doppler_step(unsigned int doppler_step) = 0; virtual void init() = 0; virtual void set_local_code() = 0; virtual signed int mag() = 0; virtual void reset() = 0; }; #endif /* GNSS_SDR_ACQUISITION_INTERFACE */ gnss-sdr-0.0.9/src/core/interfaces/channel_interface.h000066400000000000000000000043221305042567700227350ustar00rootroot00000000000000/*! * \file channel_interface.h * \brief This class represents an interface to a channel GNSS block. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Luis Esteve, 2011. luis(at)epsilon-formacion.com * * Abstract class for channel blocks. Since all its methods are virtual, * this class cannot be instantiated directly, and a subclass can only be * instantiated directly if all inherited pure virtual methods have been * implemented by that class or a parent class. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_CHANNEL_INTERFACE_H_ #define GNSS_SDR_CHANNEL_INTERFACE_H_ #include "gnss_block_interface.h" #include "gnss_signal.h" /*! * \brief This abstract class represents an interface to a channel GNSS block. * * Abstract class for channel blocks. Since all its methods are pure virtual, * this class cannot be instantiated directly, and a subclass can only be * instantiated directly if all inherited pure virtual methods have been * implemented by that class or a parent class. */ class ChannelInterface: public GNSSBlockInterface { public: virtual Gnss_Signal get_signal() const = 0; virtual void start_acquisition() = 0; virtual void set_signal(const Gnss_Signal&) = 0; }; #endif /* GNSS_SDR_CHANNEL_INTERFACE_H_ */ gnss-sdr-0.0.9/src/core/interfaces/configuration_interface.h000066400000000000000000000056251305042567700242030ustar00rootroot00000000000000/*! * \file configuration_interface.h * \brief This class represents an interface to configuration parameters. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * * The interface defines an accessor method that gets a parameter name as input * and returns the value of this parameter, a string, as output. * Property names are defined here. This is an abstract class for interfaces. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_CONFIGURATION_INTERFACE_H_ #define GNSS_SDR_CONFIGURATION_INTERFACE_H_ #include /*! * \brief This abstract class represents an interface to configuration parameters. * * The interface defines an accessor method that gets a parameter name as input * and returns the value of this parameter, a string, as output. * Property names are defined here. This is an abstract class for interfaces. * Since all its methods are virtual, * this class cannot be instantiated directly, and a subclass can only be * instantiated directly if all inherited pure virtual methods have been * implemented by that class or a parent class. */ class ConfigurationInterface { public: virtual ~ConfigurationInterface() {} virtual std::string property(std::string property_name, std::string default_value) = 0; virtual bool property(std::string property_name, bool default_value) = 0; virtual long property(std::string property_name, long default_value) = 0; virtual int property(std::string property_name, int default_value) = 0; virtual unsigned int property(std::string property_name, unsigned int default_value) = 0; virtual unsigned short property(std::string property_name, unsigned short default_value) = 0; virtual float property(std::string property_name, float default_value) = 0; virtual double property(std::string property_name, double default_value) = 0; virtual void set_property(std::string property_name, std::string value) = 0; }; #endif /*GNSS_SDR_CONFIGURATION_INTERFACE_H_*/ gnss-sdr-0.0.9/src/core/interfaces/gnss_block_interface.h000066400000000000000000000056621305042567700234610ustar00rootroot00000000000000/*! * \file gnss_block_interface.h * \brief This interface represents a GNSS block. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * * Abstract class for GNSS block interfaces. Since all its methods are virtual, * this class cannot be instantiated directly, and a subclass can only be * instantiated directly if all inherited pure virtual methods have been * implemented by that class or a parent class. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GNSS_BLOCK_INTERFACE_H_ #define GNSS_SDR_GNSS_BLOCK_INTERFACE_H_ #include #include #include /*! * \brief This abstract class represents an interface to GNSS blocks. * * Abstract class for GNSS block interfaces. Since all its methods are virtual, * this class cannot be instantiated directly, and a subclass can only be * instantiated directly if all inherited pure virtual methods have been * implemented by that class or a parent class. */ class GNSSBlockInterface { public: virtual ~GNSSBlockInterface() {} virtual std::string role() = 0; virtual std::string implementation() = 0; virtual size_t item_size() = 0; virtual void connect(gr::top_block_sptr top_block) = 0; virtual void disconnect(gr::top_block_sptr top_block) = 0; virtual gr::basic_block_sptr get_left_block() = 0; virtual gr::basic_block_sptr get_right_block() = 0; virtual gr::basic_block_sptr get_left_block(int RF_channel) { assert(RF_channel >= 0); if (RF_channel == 0){}; // avoid unused param warning return nullptr; // added to support raw array access (non pure virtual to allow left unimplemented)= 0; } virtual gr::basic_block_sptr get_right_block(int RF_channel) { assert(RF_channel >= 0); if (RF_channel == 0){}; // avoid unused param warning return nullptr; // added to support raw array access (non pure virtual to allow left unimplemented)= 0; } }; #endif /*GNSS_SDR_GNSS_BLOCK_INTERFACE_H_*/ gnss-sdr-0.0.9/src/core/interfaces/observables_interface.h000066400000000000000000000041011305042567700236270ustar00rootroot00000000000000/*! * \file observables_interface.h * \brief This class represents an interface to an Observables block. * \author Javier Arribas, 2011. jarribas(at)cttc.es * * Abstract class for Observables modules. Since all its methods are virtual, * this class cannot be instantiated directly, and a subclass can only be * instantiated directly if all inherited pure virtual methods have been * implemented by that class or a parent class. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_OBSERVABLES_INTERFACE_H_ #define GNSS_SDR_OBSERVABLES_INTERFACE_H_ #include "gnss_block_interface.h" /*! * \brief This abstract class represents an interface to an observables block. * * Abstract class for pseudorange_intefaces, derived from GNSSBlockInterface. * Since all its methods are virtual, * this class cannot be instantiated directly, and a subclass can only be * instantiated directly if all inherited pure virtual methods have been * implemented by that class or a parent class. */ class ObservablesInterface : public GNSSBlockInterface { public: virtual void reset() = 0; }; #endif /* GNSS_SDR_OBSERVABLES_INTERFACE_H_ */ gnss-sdr-0.0.9/src/core/interfaces/pvt_interface.h000066400000000000000000000037571305042567700221510ustar00rootroot00000000000000/*! * \file pvt_interface.h * \brief This class represents an interface to a PVT block. * \author Javier Arribas, 2011. jarribas(at)cttc.es * * Abstract class for PVT solvers. Since all its methods are virtual, * this class cannot be instantiated directly, and a subclass can only be * instantiated directly if all inherited pure virtual methods have been * implemented by that class or a parent class. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_PVT_INTERFACE_H_ #define GNSS_SDR_PVT_INTERFACE_H_ #include "gnss_block_interface.h" /*! * \brief This class represents an interface to a PVT block. * * Abstract class for PVT interfaces, derived from GNSSBlockInterface. * Since all its methods are virtual, * this class cannot be instantiated directly, and a subclass can only be * instantiated directly if all inherited pure virtual methods have been * implemented by that class or a parent class. */ class PvtInterface : public GNSSBlockInterface { public: virtual void reset() = 0; }; #endif /* GNSS_SDR_PVT_INTERFACE_H_ */ gnss-sdr-0.0.9/src/core/interfaces/telemetry_decoder_interface.h000066400000000000000000000043041305042567700250240ustar00rootroot00000000000000/*! * \file telemetry_decoder_interface.h * \brief This class represents an interface to a telemetry decoder block. * \author Javier Arribas, 2011. jarribas(at)cttc.es * * Abstract class for telemetry decoders. Since all its methods are virtual, * this class cannot be instantiated directly, and a subclass can only be * instantiated directly if all inherited pure virtual methods have been * implemented by that class or a parent class. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_TELEMETRY_DECODER_INTERFACE_H_ #define GNSS_SDR_TELEMETRY_DECODER_INTERFACE_H_ #include "gnss_block_interface.h" #include "gnss_satellite.h" /*! * \brief This abstract class represents an interface to a navigation GNSS block. * * Abstract class for navigation interfaces. Since all its methods are virtual, * this class cannot be instantiated directly, and a subclass can only be * instantiated directly if all inherited pure virtual methods have been * implemented by that class or a parent class. */ class TelemetryDecoderInterface : public GNSSBlockInterface { public: virtual void reset() = 0; virtual void set_satellite(Gnss_Satellite sat) = 0; virtual void set_channel(int channel) = 0; }; #endif /* GNSS_SDR_TELEMETRY_DECODER_INTERFACE_H_ */ gnss-sdr-0.0.9/src/core/interfaces/tracking_interface.h000066400000000000000000000043411305042567700231300ustar00rootroot00000000000000/*! * \file tracking_interface.h * \brief This class represents an interface to a tracking block. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * * Abstract class for tracking interfaces. Since all its methods are virtual, * this class cannot be instantiated directly, and a subclass can only be * instantiated directly if all inherited pure virtual methods have been * implemented by that class or a parent class. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_TRACKING_INTERFACE_H_ #define GNSS_SDR_TRACKING_INTERFACE_H_ #include "gnss_block_interface.h" #include "gnss_synchro.h" templateclass concurrent_queue; /*! * \brief This abstract class represents an interface to a tracking block. * * Abstract class for tracking interfaces. Since all its methods are virtual, * this class cannot be instantiated directly, and a subclass can only be * instantiated directly if all inherited pure virtual methods have been * implemented by that class or a parent class. * */ class TrackingInterface : public GNSSBlockInterface { public: virtual void start_tracking() = 0; virtual void set_gnss_synchro(Gnss_Synchro* gnss_synchro) = 0; virtual void set_channel(unsigned int channel) = 0; }; #endif /* GNSS_SDR_TRACKING_INTERFACE_H_ */ gnss-sdr-0.0.9/src/core/libs/000077500000000000000000000000001305042567700157415ustar00rootroot00000000000000gnss-sdr-0.0.9/src/core/libs/CMakeLists.txt000066400000000000000000000027541305042567700205110ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # add_subdirectory(supl) if(OPENSSL_FOUND) add_definitions( -DUSE_OPENSSL_FALLBACK=1 ) endif(OPENSSL_FOUND) set(CORE_LIBS_SOURCES ini.cc INIReader.cc string_converter.cc gnss_sdr_supl_client.cc ) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/libs/supl ${CMAKE_SOURCE_DIR}/src/core/libs/supl/asn-rrlp ${CMAKE_SOURCE_DIR}/src/core/libs/supl/asn-supl ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ) file(GLOB CORE_LIBS_HEADERS "*.h") list(SORT CORE_LIBS_HEADERS) add_library(rx_core_lib ${CORE_LIBS_SOURCES} ${CORE_LIBS_HEADERS}) source_group(Headers FILES ${CORE_LIBS_HEADERS}) target_link_libraries(rx_core_lib supl_library) gnss-sdr-0.0.9/src/core/libs/INIReader.cc000066400000000000000000000074101305042567700200140ustar00rootroot00000000000000/*! * \file INIReader.cc * \brief This class reads an INI file into easy-to-access name/value pairs. * \author Brush Technologies, 2009. * * inih (INI Not Invented Here) is a simple .INI file parser written in C++. * It's only a couple of pages of code, and it was designed to be small * and simple, so it's good for embedded systems. To use it, just give * ini_parse() an INI file, and it will call a callback for every * name=value pair parsed, giving you strings for the section, name, * and value. It's done this way because it works well on low-memory * embedded systems, but also because it makes for a KISS implementation. * * ------------------------------------------------------------------------- * inih and INIReader are released under the New BSD license: * * Copyright (c) 2009, Brush Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Brush Technology nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY BRUSH TECHNOLOGY ''AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL BRUSH TECHNOLOGY BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Go to the project home page for more info: * * http://code.google.com/p/inih/ * ------------------------------------------------------------------------- */ #include #include #include "ini.h" #include "INIReader.h" using std::string; INIReader::INIReader(string filename) { _error = ini_parse(filename.c_str(), ValueHandler, this); } int INIReader::ParseError() { return _error; } string INIReader::Get(string section, string name, string default_value) { string key = MakeKey(section, name); return _values.count(key) ? _values[key] : default_value; } long INIReader::GetInteger(string section, string name, long default_value) { string valstr = Get(section, name, ""); const char* value = valstr.c_str(); char* end; // This parses "1234" (decimal) and also "0x4D2" (hex) long n = strtol(value, &end, 0); return end > value ? n : default_value; } string INIReader::MakeKey(string section, string name) { string key = section + "." + name; // Convert to lower case to make lookups case-insensitive for (unsigned int i = 0; i < key.length(); i++) key[i] = tolower(key[i]); return key; } int INIReader::ValueHandler(void* user, const char* section, const char* name, const char* value) { INIReader* reader = (INIReader*)user; reader->_values[MakeKey(section, name)] = value; return 1; } gnss-sdr-0.0.9/src/core/libs/INIReader.h000066400000000000000000000073321305042567700176610ustar00rootroot00000000000000/*! * \file INIReader.h * \brief This class reads an INI file into easy-to-access name/value pairs. * \author Brush Technologies, 2009. * * inih (INI Not Invented Here) is a simple .INI file parser written in C++. * It's only a couple of pages of code, and it was designed to be small * and simple, so it's good for embedded systems. To use it, just give * ini_parse() an INI file, and it will call a callback for every * name=value pair parsed, giving you strings for the section, name, * and value. It's done this way because it works well on low-memory * embedded systems, but also because it makes for a KISS implementation. * * ------------------------------------------------------------------------- * inih and INIReader are released under the New BSD license: * * Copyright (c) 2009, Brush Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Brush Technology nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY BRUSH TECHNOLOGY ''AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL BRUSH TECHNOLOGY BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Go to the project home page for more info: * * http://code.google.com/p/inih/ * ------------------------------------------------------------------------- */ #ifndef __INIREADER_H__ #define __INIREADER_H__ #include #include /*! * \brief Read an INI file into easy-to-access name/value pairs. (Note that I've gone * for simplicity here rather than speed, but it should be pretty decent.) */ class INIReader { public: //! Construct INIReader and parse given filename. See ini.h for more info about the parsing. INIReader(std::string filename); //! Return the result of ini_parse(), i.e., 0 on success, line number of first error on parse error, or -1 on file open error. int ParseError(); //! Get a string value from INI file, returning default_value if not found. std::string Get(std::string section, std::string name, std::string default_value); //! Get an integer (long) value from INI file, returning default_value if not found. long GetInteger(std::string section, std::string name, long default_value); private: int _error; std::map _values; static std::string MakeKey(std::string section, std::string name); static int ValueHandler(void* user, const char* section, const char* name, const char* value); }; #endif // __INIREADER_H__ gnss-sdr-0.0.9/src/core/libs/gnss_sdr_supl_client.cc000066400000000000000000000553561305042567700225110ustar00rootroot00000000000000/*! * \file gnss_sdr_supl_client.c * \brief class that implements a C++ interface to external Secure User Location Protocol (SUPL) client library. * \author Javier Arribas, 2013. jarribas(at)cttc.es * * TODO: put here supl.c author info * class that implements a C++ interface to external Secure User Location Protocol (SUPL) client library. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gnss_sdr_supl_client.h" #include #include gnss_sdr_supl_client::gnss_sdr_supl_client() { mcc = 0; mns = 0; lac = 0; ci = 0; supl_ctx_new(&ctx); assist = supl_assist_t(); server_port = 0; request = 0; } gnss_sdr_supl_client::~gnss_sdr_supl_client() {} void gnss_sdr_supl_client::print_assistance() { if (assist.set & SUPL_RRLP_ASSIST_REFTIME) { fprintf(stdout, "T %ld %ld %ld %ld\n", assist.time.gps_week, assist.time.gps_tow, assist.time.stamp.tv_sec, static_cast(assist.time.stamp.tv_usec)); } if (assist.set & SUPL_RRLP_ASSIST_UTC) { fprintf(stdout, "U %d %d %d %d %d %d %d %d\n", assist.utc.a0, assist.utc.a1, assist.utc.delta_tls, assist.utc.tot, assist.utc.wnt, assist.utc.wnlsf, assist.utc.dn, assist.utc.delta_tlsf); } if (assist.set & SUPL_RRLP_ASSIST_REFLOC) { fprintf(stdout, "L %f %f %d\n", assist.pos.lat, assist.pos.lon, assist.pos.uncertainty); } if (assist.set & SUPL_RRLP_ASSIST_IONO) { fprintf(stdout, "I %d %d %d %d %d %d %d %d\n", assist.iono.a0, assist.iono.a1, assist.iono.a2, assist.iono.a3, assist.iono.b0, assist.iono.b1, assist.iono.b2, assist.iono.b3); } if (assist.cnt_eph) { int i; fprintf(stdout, "E %d\n", assist.cnt_eph); for (i = 0; i < assist.cnt_eph; i++) { struct supl_ephemeris_s *e = &assist.eph[i]; fprintf(stdout, "e %d %d %d %d %d %d %d %d %d %d", e->prn, e->delta_n, e->M0, e->A_sqrt, e->OMEGA_0, e->i0, e->w, e->OMEGA_dot, e->i_dot, e->e); fprintf(stdout, " %d %d %d %d %d %d", e->Cuc, e->Cus, e->Crc, e->Crs, e->Cic, e->Cis); fprintf(stdout, " %d %d %d %d %d %d", e->toe, e->IODC, e->toc, e->AF0, e->AF1, e->AF2); fprintf(stdout, " %d %d %d %d %d\n", e->bits, e->ura, e->health, e->tgd, e->AODA); } } if (assist.cnt_alm) { int i; fprintf(stdout, "A %d\n", assist.cnt_alm); for (i = 0; i < assist.cnt_alm; i++) { struct supl_almanac_s *a = &assist.alm[i]; fprintf(stdout, "a %d %d %d %d %d ", a->prn, a->e, a->toa, a->Ksii, a->OMEGA_dot); fprintf(stdout, "%d %d %d %d %d %d\n", a->A_sqrt, a->OMEGA_0, a->w, a->M0, a->AF0, a->AF1); } } if (assist.cnt_acq) { int i; fprintf(stdout, "Q %d %d\n", assist.cnt_acq, assist.acq_time); for (i = 0; i < assist.cnt_acq; i++) { struct supl_acquis_s *q = &assist.acq[i]; fprintf(stdout, "q %d %d %d ", q->prn, q->parts, q->doppler0); if (q->parts & SUPL_ACQUIS_DOPPLER) { fprintf(stdout, "%d %d ", q->doppler1, q->d_win); } else { fprintf(stdout, "0 0 "); } fprintf(stdout, "%d %d %d %d ", q->code_ph, q->code_ph_int, q->bit_num, q->code_ph_win); if (q->parts & SUPL_ACQUIS_ANGLE) { fprintf(stdout, "%d %d\n", q->az, q->el); } else { fprintf(stdout, "0 0\n"); } } } } int gnss_sdr_supl_client::get_assistance(int i_mcc, int i_mns, int i_lac, int i_ci) { // SET SUPL CLIENT INFORMATION // GSM CELL PARAMETERS mcc = i_mcc; mns = i_mns; lac = i_lac; ci = i_ci; if (supl_ctx_new(&ctx)) {} // clean it before using supl_set_gsm_cell(&ctx, mcc, mns, lac, ci); // PERFORM SUPL COMMUNICATION char *cstr = new char[server_name.length() + 1]; strcpy(cstr, server_name.c_str()); int err; ctx.p.request = request; // select assistance info request from a pre-defined set //std::cout<<"mcc="<::iterator gps_almanac_iterator; for (int i = 0; i < assist.cnt_alm; i++) { struct supl_almanac_s *a = &assist.alm[i]; // Check if the SV is present in the map gps_almanac_iterator = this->gps_almanac_map.find(a->prn); // the SV is not present in the almanac data -> insert new SV register if (gps_almanac_iterator==gps_almanac_map.end()) { Gps_Almanac gps_almanac_entry; gps_almanac_map.insert(std::pair(a->prn, gps_almanac_entry)); gps_almanac_iterator = this->gps_almanac_map.find(a->prn); } gps_almanac_iterator->second.i_satellite_PRN = a->prn; gps_almanac_iterator->second.d_A_f0 = ((double)a->AF0)*pow(2.0, -20); gps_almanac_iterator->second.d_A_f1 = ((double)a->AF1)*pow(2.0, -38); gps_almanac_iterator->second.d_Delta_i = ((double)a->Ksii)*pow(2.0, -19); gps_almanac_iterator->second.d_OMEGA = ((double)a->w)*pow(2.0, -23); gps_almanac_iterator->second.d_OMEGA0 = ((double)a->OMEGA_0)*pow(2.0, -23); gps_almanac_iterator->second.d_sqrt_A = ((double)a->A_sqrt)*pow(2.0, -11); gps_almanac_iterator->second.d_OMEGA_DOT = ((double)a->OMEGA_dot)*pow(2.0, -38); gps_almanac_iterator->second.d_Toa = ((double)a->toa)*pow(2.0, 12); gps_almanac_iterator->second.d_e_eccentricity = ((double)a->toa)*pow(2.0, -21); gps_almanac_iterator->second.d_M_0 = ((double)a->M0)*pow(2.0, -23); } } // READ SV EPHEMERIS if (assist.cnt_eph) { std::map::iterator gps_eph_iterator; for (int i = 0; i < assist.cnt_eph; i++) { struct supl_ephemeris_s *e = &assist.eph[i]; // Check if the SV is present in the map gps_eph_iterator = this->gps_ephemeris_map.find(e->prn); // the SV is not present in the assistance data -> insert new SV register if (gps_eph_iterator == gps_ephemeris_map.end()) { Gps_Ephemeris gps_eph; gps_ephemeris_map.insert(std::pair(e->prn, gps_eph)); gps_eph_iterator = this->gps_ephemeris_map.find(e->prn); } if (gps_time.valid) { gps_eph_iterator->second.i_GPS_week = assist.time.gps_week; /* TS 44.031: GPSTOW, range 0-604799.92, resolution 0.08 sec, 23-bit presentation */ gps_eph_iterator->second.d_TOW = ((double)assist.time.gps_tow)*0.08; } else { gps_eph_iterator->second.i_GPS_week = 0; gps_eph_iterator->second.d_TOW = 0; } gps_eph_iterator->second.i_satellite_PRN = e->prn; // SV navigation model gps_eph_iterator->second.i_code_on_L2 = e->bits; gps_eph_iterator->second.i_SV_accuracy = e->ura; //User Range Accuracy (URA) gps_eph_iterator->second.i_SV_health = e->health; gps_eph_iterator->second.d_IODC = (double)e->IODC; //miss P flag (1 bit) //miss SF1 Reserved (87 bits) gps_eph_iterator->second.d_TGD = ((double)e->tgd)*T_GD_LSB; gps_eph_iterator->second.d_Toc = ((double)e->toc)*T_OC_LSB; gps_eph_iterator->second.d_A_f0 = ((double)e->AF0)*A_F0_LSB; gps_eph_iterator->second.d_A_f1 = ((double)e->AF1)*A_F1_LSB; gps_eph_iterator->second.d_A_f2 = ((double)e->AF2)*A_F2_LSB; gps_eph_iterator->second.d_Crc = ((double)e->Crc)*C_RC_LSB; gps_eph_iterator->second.d_Delta_n = ((double)e->delta_n)*DELTA_N_LSB; gps_eph_iterator->second.d_M_0 = ((double)e->M0)*M_0_LSB; gps_eph_iterator->second.d_Cuc = ((double)e->Cuc)*C_UC_LSB; gps_eph_iterator->second.d_e_eccentricity = ((double)e->e)*E_LSB; gps_eph_iterator->second.d_Cus = ((double)e->Cus)*C_US_LSB; gps_eph_iterator->second.d_sqrt_A = ((double)e->A_sqrt)*SQRT_A_LSB; gps_eph_iterator->second.d_Toe = ((double)e->toe)*T_OE_LSB; //miss fit interval flag (1 bit) gps_eph_iterator->second.i_AODO = e->AODA * AODO_LSB; gps_eph_iterator->second.d_Cic = ((double)e->Cic)*C_IC_LSB; gps_eph_iterator->second.d_OMEGA0 = ((double)e->OMEGA_0)*OMEGA_0_LSB; gps_eph_iterator->second.d_Cis = ((double)e->Cis)*C_IS_LSB; gps_eph_iterator->second.d_i_0 = ((double)e->i0)*I_0_LSB; gps_eph_iterator->second.d_Crs = ((double)e->Crs)*C_RS_LSB; gps_eph_iterator->second.d_OMEGA = ((double)e->w)*OMEGA_LSB; gps_eph_iterator->second.d_OMEGA_DOT = (double)e->OMEGA_dot*OMEGA_DOT_LSB; gps_eph_iterator->second.d_IDOT = ((double)e->i_dot)*I_DOT_LSB; } } // READ SV ACQUISITION ASSISTANCE if (assist.cnt_acq) { std::map::iterator gps_acq_iterator; for (int i = 0; i < assist.cnt_acq; i++) { struct supl_acquis_s *e = &assist.acq[i]; // Check if the SV is present in the map gps_acq_iterator=this->gps_acq_map.find(e->prn); // the SV is not present in the assistance data -> insert new SV register if (gps_acq_iterator == gps_acq_map.end()) { Gps_Acq_Assist gps_acq_assist; gps_acq_map.insert(std::pair(e->prn, gps_acq_assist)); gps_acq_iterator = this->gps_acq_map.find(e->prn); } // fill the acquisition assistance structure gps_acq_iterator->second.i_satellite_PRN = e->prn; gps_acq_iterator->second.d_TOW = (double)assist.acq_time; gps_acq_iterator->second.d_Doppler0 = (double)e->doppler0; gps_acq_iterator->second.d_Doppler1 = (double)e->doppler1; gps_acq_iterator->second.dopplerUncertainty = (double)e->d_win; gps_acq_iterator->second.Code_Phase = (double)e->code_ph; gps_acq_iterator->second.Code_Phase_int = (double)e->code_ph_int; gps_acq_iterator->second.Code_Phase_window = (double)e->code_ph_win; gps_acq_iterator->second.Azimuth = (double)e->az; gps_acq_iterator->second.Elevation = (double)e->el; gps_acq_iterator->second.GPS_Bit_Number = (double)e->bit_num; } } } bool gnss_sdr_supl_client::load_ephemeris_xml(const std::string file_name) { try { std::ifstream ifs(file_name.c_str(), std::ifstream::binary | std::ifstream::in); boost::archive::xml_iarchive xml(ifs); gps_ephemeris_map.clear(); xml >> boost::serialization::make_nvp("GNSS-SDR_ephemeris_map", this->gps_ephemeris_map); ifs.close(); LOG(INFO) << "Loaded Ephemeris map data with "<gps_ephemeris_map.size()<<" satellites"; } catch (std::exception& e) { LOG(WARNING) << e.what() << "File: " << file_name; return false; } return true; } bool gnss_sdr_supl_client::save_ephemeris_map_xml(const std::string file_name, std::map eph_map) { if (eph_map.size() > 0) { try { std::ofstream ofs(file_name.c_str(), std::ofstream::trunc | std::ofstream::out); boost::archive::xml_oarchive xml(ofs); xml << boost::serialization::make_nvp("GNSS-SDR_ephemeris_map", eph_map); ofs.close(); LOG(INFO) << "Saved Ephemeris map data"; } catch (std::exception& e) { LOG(WARNING) << e.what(); return false; } return true; } else { LOG(WARNING) << "Failed to save Ephemeris, map is empty"; return false; } } bool gnss_sdr_supl_client::load_utc_xml(const std::string file_name) { try { std::ifstream ifs(file_name.c_str(), std::ifstream::binary | std::ifstream::in); boost::archive::xml_iarchive xml(ifs); xml >> boost::serialization::make_nvp("GNSS-SDR_utc_map", this->gps_utc); ifs.close(); LOG(INFO) << "Loaded UTC model data"; } catch (std::exception& e) { LOG(WARNING) << e.what() << "File: " << file_name; return false; } return true; } bool gnss_sdr_supl_client::save_utc_map_xml(const std::string file_name, std::map utc_map) { if (utc_map.size() > 0) { try { std::ofstream ofs(file_name.c_str(), std::ofstream::trunc | std::ofstream::out); boost::archive::xml_oarchive xml(ofs); xml << boost::serialization::make_nvp("GNSS-SDR_utc_map", utc_map); ofs.close(); LOG(INFO) << "Saved UTC Model data"; } catch (std::exception& e) { LOG(WARNING) << e.what(); return false; } return true; } else { LOG(WARNING) << "Failed to save UTC model, map is empty"; return false; } } bool gnss_sdr_supl_client::load_iono_xml(const std::string file_name) { try { std::ifstream ifs(file_name.c_str(), std::ifstream::binary | std::ifstream::in); boost::archive::xml_iarchive xml(ifs); xml >> boost::serialization::make_nvp("GNSS-SDR_iono_map", this->gps_iono); ifs.close(); LOG(INFO) << "Loaded IONO model data"; } catch (std::exception& e) { LOG(WARNING) << e.what() << "File: " << file_name; return false; } return true; } bool gnss_sdr_supl_client::save_iono_map_xml(const std::string file_name, std::map iono_map) { if (iono_map.size() > 0) { try { std::ofstream ofs(file_name.c_str(), std::ofstream::trunc | std::ofstream::out); boost::archive::xml_oarchive xml(ofs); xml << boost::serialization::make_nvp("GNSS-SDR_iono_map", iono_map); ofs.close(); LOG(INFO) << "Saved IONO Model data"; } catch (std::exception& e) { LOG(WARNING) << e.what(); return false; } return true; } else { LOG(WARNING) << "Failed to save IONO model, map is empty"; return false; } } bool gnss_sdr_supl_client::load_ref_time_xml(const std::string file_name) { try { std::ifstream ifs(file_name.c_str(), std::ifstream::binary | std::ifstream::in); boost::archive::xml_iarchive xml(ifs); xml >> boost::serialization::make_nvp("GNSS-SDR_ref_time_map", this->gps_time); ifs.close(); LOG(INFO) << "Loaded Ref Time data"; } catch (std::exception& e) { LOG(WARNING) << e.what() << "File: " << file_name; return false; } return true; } bool gnss_sdr_supl_client::save_ref_time_map_xml(const std::string file_name, std::map ref_time_map) { if (ref_time_map.size() > 0) { try { std::ofstream ofs(file_name.c_str(), std::ofstream::trunc | std::ofstream::out); boost::archive::xml_oarchive xml(ofs); xml << boost::serialization::make_nvp("GNSS-SDR_ref_time_map", ref_time_map); ofs.close(); LOG(INFO) << "Saved Ref Time data"; } catch (std::exception& e) { LOG(WARNING) << e.what(); return false; } return true; } else { LOG(WARNING) << "Failed to save Ref Time, map is empty"; return false; } } bool gnss_sdr_supl_client::load_ref_location_xml(const std::string file_name) { try { std::ifstream ifs(file_name.c_str(), std::ifstream::binary | std::ifstream::in); boost::archive::xml_iarchive xml(ifs); xml >> boost::serialization::make_nvp("GNSS-SDR_ref_location_map", this->gps_ref_loc); ifs.close(); LOG(INFO) << "Loaded Ref Location data"; } catch (std::exception& e) { LOG(WARNING) << e.what() << "File: " << file_name; return false; } return true; } bool gnss_sdr_supl_client::save_ref_location_map_xml(const std::string file_name, std::map ref_location_map) { if (ref_location_map.size() > 0) { try { std::ofstream ofs(file_name.c_str(), std::ofstream::trunc | std::ofstream::out); boost::archive::xml_oarchive xml(ofs); xml << boost::serialization::make_nvp("GNSS-SDR_ref_location_map", ref_location_map); ofs.close(); LOG(INFO) << "Saved Ref Location data"; } catch (std::exception& e) { LOG(WARNING) << e.what(); return false; } return true; } else { LOG(WARNING) << "Failed to save Ref Location, map is empty"; return false; } } gnss-sdr-0.0.9/src/core/libs/gnss_sdr_supl_client.h000066400000000000000000000123601305042567700223370ustar00rootroot00000000000000/*! * \file gnss_sdr_supl_client.h * \brief class that implements a C++ interface to external Secure User Location Protocol (SUPL) client library. * \author Javier Arribas, 2013. jarribas(at)cttc.es * * TODO: put here supl.c author info * class that implements a C++ interface to external Secure User Location Protocol (SUPL) client library. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_SUPL_CLIENT_H_ #define GNSS_SDR_SUPL_CLIENT_H_ #include #include #include #include #include #include #include #include extern "C" { #include "supl.h" } #include "GPS_L1_CA.h" #include "gps_ephemeris.h" #include "gps_iono.h" #include "gps_almanac.h" #include "gps_utc_model.h" #include "gps_acq_assist.h" #include "gps_ref_time.h" #include "gps_ref_location.h" /*! * \brief class that implements a C++ interface to external Secure User Location Protocol (SUPL) client library.. */ class gnss_sdr_supl_client { private: // GSM CELL INFO int mcc; int mns; int lac; int ci; // assistance protocol structure supl_ctx_t ctx; // assistance data supl_assist_t assist; public: // SUPL SERVER INFO std::string server_name; int server_port; int request; // ephemeris map std::map gps_ephemeris_map; // almanac map std::map gps_almanac_map; // ionospheric model Gps_Iono gps_iono; // reference time Gps_Ref_Time gps_time; // UTC model Gps_Utc_Model gps_utc; // reference location Gps_Ref_Location gps_ref_loc; // Acquisition Assistance map std::map gps_acq_map; /* * \brief Initiates the TCP SSL SUPL connection to the SUPL server and request assistance data using the provided GSM Base station parameters * \param i_mcc Current network MCC (Mobile country code), 3 digits. * \param i_mns Current network MNC (Mobile Network code), 2 or 3 digits. * \param i_lac Current network LAC (Location area code),16 bits, 1-65520 are valid values. * \param i_ci Cell Identity (16 bits, 0-65535 are valid values). * \return Error code -> 0 no errors. */ int get_assistance(int i_mcc, int i_mns, int i_lac, int i_ci); /* * \brief Read the received SUPL data and stores it into the corresponding class members (gps_ephemeris_map, gps_almanac_map, gps_iono, gps_time, gps_utc, gps_acq_map, and gps_ref_loc) * */ void read_supl_data(); /*! * \brief Read ephemeris map from XML file */ bool load_ephemeris_xml(const std::string file_name); /*! * \brief Save ephemeris map to XML file. */ bool save_ephemeris_map_xml(const std::string file_name, std::map eph_map); /*! * \brief Read utc model from XML file */ bool load_utc_xml(const std::string file_name); /*! * \brief Save utc model map to XML file * To be called by ControlThread::gps_utc_model_data_write_to_XML() */ bool save_utc_map_xml(const std::string file_name, std::map utc_map); /*! * \brief Read iono from XML file */ bool load_iono_xml(const std::string file_name); /*! * \brief Save iono map to XML file */ bool save_iono_map_xml(const std::string file_name, std::map iono_map); /*! * \brief Read ref time from XML file */ bool load_ref_time_xml(const std::string file_name); /*! * \brief Save ref time map to XML file */ bool save_ref_time_map_xml(const std::string file_name, std::map ref_time_map); /*! * \brief Read ref location from XML file */ bool load_ref_location_xml(const std::string file_name); /*! * \brief Save ref location map to XML file */ bool save_ref_location_map_xml(std::string file_name, std::map ref_location_map); /* * Prints SUPL data to std::cout. Use it for debug purposes only. */ void print_assistance(); gnss_sdr_supl_client(); ~gnss_sdr_supl_client(); }; #endif gnss-sdr-0.0.9/src/core/libs/ini.cc000066400000000000000000000146211305042567700170330ustar00rootroot00000000000000/*! * \file ini.cc * \brief This function parses an INI file into easy-to-access name/value pairs. * \author Brush Technologies, 2009. * * inih (INI Not Invented Here) is a simple .INI file parser written in C++. * It's only a couple of pages of code, and it was designed to be small * and simple, so it's good for embedded systems. To use it, just give * ini_parse() an INI file, and it will call a callback for every * name=value pair parsed, giving you strings for the section, name, * and value. It's done this way because it works well on low-memory * embedded systems, but also because it makes for a KISS implementation. * Parse given INI-style file. May have [section]s, name=value pairs * (whitespace stripped), and comments starting with ';' (semicolon). * Section is "" if name=value pair parsed before any section heading. * For each name=value pair parsed, call handler function with given user * pointer as well as section, name, and value (data only valid for duration * of handler call). Handler should return nonzero on success, zero on error. * Returns 0 on success, line number of first error on parse error, or -1 on * file open error * * ------------------------------------------------------------------------- * inih and INIReader are released under the New BSD license: * * Copyright (c) 2009, Brush Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Brush Technology nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY BRUSH TECHNOLOGY ''AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL BRUSH TECHNOLOGY BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Go to the project home page for more info: * * http://code.google.com/p/inih/ * ------------------------------------------------------------------------- */ #include #include #include #include "ini.h" #define MAX_LINE 200 #define MAX_SECTION 50 #define MAX_NAME 50 /* Strip whitespace chars off end of given string, in place. Return s. */ static char* rstrip(char* s) { char* p = s + strlen(s); while (p > s && isspace(*--p)) *p = '\0'; return s; } /* Return pointer to first non-whitespace char in given string. */ static char* lskip(const char* s) { while (*s && isspace(*s)) s++; return (char*)s; } /* Return pointer to first char c or ';' in given string, or pointer to null at end of string if neither found. */ static char* find_char_or_comment(const char* s, char c) { while (*s && *s != c && *s != ';') s++; return (char*)s; } /* Version of strncpy that ensures dest (size bytes) is null-terminated. */ static char* strncpy0(char* dest, const char* src, size_t size) { strncpy(dest, src, size); dest[size - 1] = '\0'; return dest; } /* See documentation in header file. */ int ini_parse(const char* filename, int (*handler)(void*, const char*, const char*, const char*), void* user) { /* Uses a fair bit of stack (use heap instead if you need to) */ char line[MAX_LINE]; char section[MAX_SECTION] = ""; char prev_name[MAX_NAME] = ""; FILE* file; char* start; char* end; char* name; char* value; int lineno = 0; int error = 0; file = fopen(filename, "r"); if (!file) return -1; /* Scan through file line by line */ while (fgets(line, sizeof(line), file) != NULL) { lineno++; start = lskip(rstrip(line)); #if INI_ALLOW_MULTILINE if (*prev_name && *start && start > line) { /* Non-black line with leading whitespace, treat as continuation of previous name's value (as per Python ConfigParser). */ if (!handler(user, section, prev_name, start) && !error) error = lineno; } else #endif if (*start == '[') { /* A "[section]" line */ end = find_char_or_comment(start + 1, ']'); if (*end == ']') { *end = '\0'; strncpy0(section, start + 1, sizeof(section)); *prev_name = '\0'; } else if (!error) { /* No ']' found on section line */ error = lineno; } } else if (*start && *start != ';') { /* Not a comment, must be a name=value pair */ end = find_char_or_comment(start, '='); if (*end == '=') { *end = '\0'; name = rstrip(start); value = lskip(end + 1); end = find_char_or_comment(value, ';'); if (*end == ';') *end = '\0'; rstrip(value); /* Valid name=value pair found, call handler */ strncpy0(prev_name, name, sizeof(prev_name)); if (!handler(user, section, name, value) && !error) error = lineno; } else if (!error) { /* No '=' found on name=value line */ error = lineno; } } } fclose(file); return error; } gnss-sdr-0.0.9/src/core/libs/ini.h000066400000000000000000000103101305042567700166640ustar00rootroot00000000000000/*! * \file ini.h * \brief This function parses an INI file into easy-to-access name/value pairs. * \author Brush Technologies, 2009. * * inih (INI Not Invented Here) is a simple .INI file parser written in C++. * It's only a couple of pages of code, and it was designed to be small * and simple, so it's good for embedded systems. To use it, just give * ini_parse() an INI file, and it will call a callback for every * name=value pair parsed, giving you strings for the section, name, * and value. It's done this way because it works well on low-memory * embedded systems, but also because it makes for a KISS implementation. * Parse given INI-style file. May have [section]s, name=value pairs * (whitespace stripped), and comments starting with ';' (semicolon). * Section is "" if name=value pair parsed before any section heading. * For each name=value pair parsed, call handler function with given user * pointer as well as section, name, and value (data only valid for duration * of handler call). Handler should return nonzero on success, zero on error. * Returns 0 on success, line number of first error on parse error, or -1 on * file open error * * ------------------------------------------------------------------------- * inih and INIReader are released under the New BSD license: * * Copyright (c) 2009, Brush Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Brush Technology nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY BRUSH TECHNOLOGY ''AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL BRUSH TECHNOLOGY BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Go to the project home page for more info: * * http://code.google.com/p/inih/ * ------------------------------------------------------------------------- */ #ifndef __INI_H__ #define __INI_H__ /* Make this header file easier to include in C++ code */ #ifdef __cplusplus extern "C" { #endif /* Parse given INI-style file. May have [section]s, name=value pairs (whitespace stripped), and comments starting with ';' (semicolon). Section is "" if name=value pair parsed before any section heading. For each name=value pair parsed, call handler function with given user pointer as well as section, name, and value (data only valid for duration of handler call). Handler should return nonzero on success, zero on error. Returns 0 on success, line number of first error on parse error, or -1 on file open error. */ int ini_parse(const char* filename, int (*handler)(void* user, const char* section, const char* name, const char* value), void* user); /* Nonzero to allow multi-line value parsing, in the style of Python's ConfigParser. If allowed, ini_parse() will call the handler with the same name for each subsequent line parsed. */ #ifndef INI_ALLOW_MULTILINE #define INI_ALLOW_MULTILINE 1 #endif #ifdef __cplusplus } #endif #endif /* __INI_H__ */ gnss-sdr-0.0.9/src/core/libs/string_converter.cc000066400000000000000000000066611305042567700216560ustar00rootroot00000000000000/*! * \file string_converter.cc * \brief Implementation of a class that interprets the contents of a string * and converts it into different types. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "string_converter.h" #include #include StringConverter::StringConverter() {} StringConverter::~StringConverter() {} bool StringConverter::convert(const std::string& value, bool default_value) { if(value.compare("true") == 0) { return true; } else if(value.compare("false") == 0) { return false; } else { return default_value; } } long StringConverter::convert(const std::string& value, long default_value) { std::stringstream stream(value); long result; stream >> result; if(stream.fail()) { return default_value; } else { return result; } } int StringConverter::convert(const std::string& value, int default_value) { std::stringstream stream(value); int result; stream >> result; if(stream.fail()) { return default_value; } else { return result; } } unsigned int StringConverter::convert(const std::string& value, unsigned int default_value) { std::stringstream stream(value); unsigned int result; stream >> result; if(stream.fail()) { return default_value; } else { return result; } } unsigned short StringConverter::convert(const std::string& value, unsigned short default_value) { std::stringstream stream(value); unsigned short result; stream >> result; if(stream.fail()) { return default_value; } else { return result; } } float StringConverter::convert(const std::string& value, float default_value) { std::stringstream stream(value); float result; stream >> result; if(stream.fail()) { return default_value; } else { return result; } } double StringConverter::convert(const std::string& value, double default_value) { std::stringstream stream(value); double result; stream >> result; if(stream.fail()) { return default_value; } else { return result; } } gnss-sdr-0.0.9/src/core/libs/string_converter.h000066400000000000000000000037701305042567700215160ustar00rootroot00000000000000/*! * \file string_converter.h * \brief Interface of a class that interprets the contents of a string * and converts it into different types. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_STRING_CONVERTER_H_ #define GNSS_SDR_STRING_CONVERTER_H_ #include /*! * \brief Class that interprets the contents of a string * and converts it into different types. */ class StringConverter { public: StringConverter(); virtual ~StringConverter(); bool convert(const std::string& value, bool default_value); long convert(const std::string& value, long default_value); int convert(const std::string& value, int default_value); unsigned int convert(const std::string& value, unsigned int default_value); unsigned short convert(const std::string& value, unsigned short default_value); float convert(const std::string& value, float default_value); double convert(const std::string& value, double default_value); }; #endif /*GNSS_SDR_STRING_CONVERTER_H_*/ gnss-sdr-0.0.9/src/core/libs/supl/000077500000000000000000000000001305042567700167245ustar00rootroot00000000000000gnss-sdr-0.0.9/src/core/libs/supl/CMakeLists.txt000066400000000000000000000035141305042567700214670ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # file(GLOB ASN_RRLP_SOURCES "${CMAKE_SOURCE_DIR}/src/core/libs/supl/asn-rrlp/*.c") list(SORT ASN_RRLP_SOURCES) file(GLOB ASN_SUPL_SOURCES "${CMAKE_SOURCE_DIR}/src/core/libs/supl/asn-supl/*.c") list(SORT ASN_SUPL_SOURCES) set (SUPL_SOURCES supl.c ) if(OPENSSL_FOUND) add_definitions( -DUSE_OPENSSL_FALLBACK=1 ) endif(OPENSSL_FOUND) include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/src/core/libs/supl ${CMAKE_SOURCE_DIR}/src/core/libs/supl/asn-rrlp ${CMAKE_SOURCE_DIR}/src/core/libs/supl/asn-supl ${GNUTLS_INCLUDE_DIR} ) if(CMAKE_C_COMPILER_ID MATCHES "Clang") if(CMAKE_BUILD_TYPE MATCHES "Release") set(MY_C_FLAGS "${MY_C_FLAGS} -Wno-parentheses-equality") endif(CMAKE_BUILD_TYPE MATCHES "Release") endif(CMAKE_C_COMPILER_ID MATCHES "Clang") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${MY_C_FLAGS}") add_library (supl_library STATIC ${ASN_RRLP_SOURCES} ${ASN_SUPL_SOURCES} ${SUPL_SOURCES}) target_link_libraries (supl_library ${GNUTLS_LIBRARIES} ${GNUTLS_OPENSSL_LIBRARY} gnss_system_parameters) set_target_properties(supl_library PROPERTIES LINKER_LANGUAGE C) gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/000077500000000000000000000000001305042567700204625ustar00rootroot00000000000000gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Accuracy.c000066400000000000000000000107611305042567700223650ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "Accuracy.h" int Accuracy_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void Accuracy_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void Accuracy_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { Accuracy_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int Accuracy_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { Accuracy_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t Accuracy_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { Accuracy_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t Accuracy_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { Accuracy_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t Accuracy_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { Accuracy_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t Accuracy_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { Accuracy_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t Accuracy_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { Accuracy_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t Accuracy_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { Accuracy_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_Accuracy_constr_1 = { { APC_CONSTRAINED, 7, 7, 0, 127 } /* (0..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_Accuracy_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Accuracy = { "Accuracy", "Accuracy", Accuracy_free, Accuracy_print, Accuracy_constraint, Accuracy_decode_ber, Accuracy_encode_der, Accuracy_decode_xer, Accuracy_encode_xer, Accuracy_decode_uper, Accuracy_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_Accuracy_tags_1, sizeof(asn_DEF_Accuracy_tags_1) /sizeof(asn_DEF_Accuracy_tags_1[0]), /* 1 */ asn_DEF_Accuracy_tags_1, /* Same as above */ sizeof(asn_DEF_Accuracy_tags_1) /sizeof(asn_DEF_Accuracy_tags_1[0]), /* 1 */ &asn_PER_type_Accuracy_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Accuracy.h000066400000000000000000000015371305042567700223730ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _Accuracy_H_ #define _Accuracy_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Accuracy */ typedef long Accuracy_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Accuracy; asn_struct_free_f Accuracy_free; asn_struct_print_f Accuracy_print; asn_constr_check_f Accuracy_constraint; ber_type_decoder_f Accuracy_decode_ber; der_type_encoder_f Accuracy_encode_der; xer_type_decoder_f Accuracy_decode_xer; xer_type_encoder_f Accuracy_encode_xer; per_type_decoder_f Accuracy_decode_uper; per_type_encoder_f Accuracy_encode_uper; #ifdef __cplusplus } #endif #endif /* _Accuracy_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/AccuracyOpt.c000066400000000000000000000034401305042567700230440ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "AccuracyOpt.h" static asn_TYPE_member_t asn_MBR_AccuracyOpt_1[] = { { ATF_POINTER, 1, offsetof(struct AccuracyOpt, accuracy), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Accuracy, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "accuracy" }, }; static int asn_MAP_AccuracyOpt_oms_1[] = { 0 }; static ber_tlv_tag_t asn_DEF_AccuracyOpt_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_AccuracyOpt_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* accuracy at 125 */ }; static asn_SEQUENCE_specifics_t asn_SPC_AccuracyOpt_specs_1 = { sizeof(struct AccuracyOpt), offsetof(struct AccuracyOpt, _asn_ctx), asn_MAP_AccuracyOpt_tag2el_1, 1, /* Count of tags in the map */ asn_MAP_AccuracyOpt_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_AccuracyOpt = { "AccuracyOpt", "AccuracyOpt", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_AccuracyOpt_tags_1, sizeof(asn_DEF_AccuracyOpt_tags_1) /sizeof(asn_DEF_AccuracyOpt_tags_1[0]), /* 1 */ asn_DEF_AccuracyOpt_tags_1, /* Same as above */ sizeof(asn_DEF_AccuracyOpt_tags_1) /sizeof(asn_DEF_AccuracyOpt_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_AccuracyOpt_1, 1, /* Elements count */ &asn_SPC_AccuracyOpt_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/AccuracyOpt.h000066400000000000000000000012641305042567700230530ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _AccuracyOpt_H_ #define _AccuracyOpt_H_ #include /* Including external dependencies */ #include "Accuracy.h" #include #ifdef __cplusplus extern "C" { #endif /* AccuracyOpt */ typedef struct AccuracyOpt { Accuracy_t *accuracy /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } AccuracyOpt_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_AccuracyOpt; #ifdef __cplusplus } #endif #endif /* _AccuracyOpt_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/AcquisAssist.c000066400000000000000000000041461305042567700232470ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "AcquisAssist.h" static asn_TYPE_member_t asn_MBR_AcquisAssist_1[] = { { ATF_NOFLAGS, 0, offsetof(struct AcquisAssist, timeRelation), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_TimeRelation, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "timeRelation" }, { ATF_NOFLAGS, 0, offsetof(struct AcquisAssist, acquisList), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfAcquisElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "acquisList" }, }; static ber_tlv_tag_t asn_DEF_AcquisAssist_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_AcquisAssist_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* timeRelation at 817 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* acquisList at 822 */ }; static asn_SEQUENCE_specifics_t asn_SPC_AcquisAssist_specs_1 = { sizeof(struct AcquisAssist), offsetof(struct AcquisAssist, _asn_ctx), asn_MAP_AcquisAssist_tag2el_1, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_AcquisAssist = { "AcquisAssist", "AcquisAssist", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_AcquisAssist_tags_1, sizeof(asn_DEF_AcquisAssist_tags_1) /sizeof(asn_DEF_AcquisAssist_tags_1[0]), /* 1 */ asn_DEF_AcquisAssist_tags_1, /* Same as above */ sizeof(asn_DEF_AcquisAssist_tags_1) /sizeof(asn_DEF_AcquisAssist_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_AcquisAssist_1, 2, /* Elements count */ &asn_SPC_AcquisAssist_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/AcquisAssist.h000066400000000000000000000013731305042567700232530ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _AcquisAssist_H_ #define _AcquisAssist_H_ #include /* Including external dependencies */ #include "TimeRelation.h" #include "SeqOfAcquisElement.h" #include #ifdef __cplusplus extern "C" { #endif /* AcquisAssist */ typedef struct AcquisAssist { TimeRelation_t timeRelation; SeqOfAcquisElement_t acquisList; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } AcquisAssist_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_AcquisAssist; #ifdef __cplusplus } #endif #endif /* _AcquisAssist_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/AcquisElement.c000066400000000000000000000176201305042567700233730ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "AcquisElement.h" static int memb_doppler0_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -2048 && value <= 2047)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_codePhase_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1022)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_intCodePhase_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 19)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_gpsBitNumber_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 3)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_codePhaseSearchWindow_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 15)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_doppler0_constr_3 = { { APC_CONSTRAINED, 12, 12, -2048, 2047 } /* (-2048..2047) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_codePhase_constr_5 = { { APC_CONSTRAINED, 10, 10, 0, 1022 } /* (0..1022) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_intCodePhase_constr_6 = { { APC_CONSTRAINED, 5, 5, 0, 19 } /* (0..19) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_gpsBitNumber_constr_7 = { { APC_CONSTRAINED, 2, 2, 0, 3 } /* (0..3) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_codePhaseSearchWindow_constr_8 = { { APC_CONSTRAINED, 4, 4, 0, 15 } /* (0..15) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_AcquisElement_1[] = { { ATF_NOFLAGS, 0, offsetof(struct AcquisElement, svid), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SatelliteID, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "svid" }, { ATF_NOFLAGS, 0, offsetof(struct AcquisElement, doppler0), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_doppler0_constraint_1, &asn_PER_memb_doppler0_constr_3, 0, "doppler0" }, { ATF_POINTER, 1, offsetof(struct AcquisElement, addionalDoppler), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_AddionalDopplerFields, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "addionalDoppler" }, { ATF_NOFLAGS, 0, offsetof(struct AcquisElement, codePhase), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_codePhase_constraint_1, &asn_PER_memb_codePhase_constr_5, 0, "codePhase" }, { ATF_NOFLAGS, 0, offsetof(struct AcquisElement, intCodePhase), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_intCodePhase_constraint_1, &asn_PER_memb_intCodePhase_constr_6, 0, "intCodePhase" }, { ATF_NOFLAGS, 0, offsetof(struct AcquisElement, gpsBitNumber), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_gpsBitNumber_constraint_1, &asn_PER_memb_gpsBitNumber_constr_7, 0, "gpsBitNumber" }, { ATF_NOFLAGS, 0, offsetof(struct AcquisElement, codePhaseSearchWindow), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_codePhaseSearchWindow_constraint_1, &asn_PER_memb_codePhaseSearchWindow_constr_8, 0, "codePhaseSearchWindow" }, { ATF_POINTER, 1, offsetof(struct AcquisElement, addionalAngle), (ASN_TAG_CLASS_CONTEXT | (7 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_AddionalAngleFields, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "addionalAngle" }, }; static int asn_MAP_AcquisElement_oms_1[] = { 2, 7 }; static ber_tlv_tag_t asn_DEF_AcquisElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_AcquisElement_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* svid at 834 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* doppler0 at 838 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* addionalDoppler at 839 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* codePhase at 840 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* intCodePhase at 841 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* gpsBitNumber at 842 */ { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* codePhaseSearchWindow at 843 */ { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 } /* addionalAngle at 844 */ }; static asn_SEQUENCE_specifics_t asn_SPC_AcquisElement_specs_1 = { sizeof(struct AcquisElement), offsetof(struct AcquisElement, _asn_ctx), asn_MAP_AcquisElement_tag2el_1, 8, /* Count of tags in the map */ asn_MAP_AcquisElement_oms_1, /* Optional members */ 2, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_AcquisElement = { "AcquisElement", "AcquisElement", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_AcquisElement_tags_1, sizeof(asn_DEF_AcquisElement_tags_1) /sizeof(asn_DEF_AcquisElement_tags_1[0]), /* 1 */ asn_DEF_AcquisElement_tags_1, /* Same as above */ sizeof(asn_DEF_AcquisElement_tags_1) /sizeof(asn_DEF_AcquisElement_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_AcquisElement_1, 8, /* Elements count */ &asn_SPC_AcquisElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/AcquisElement.h000066400000000000000000000021561305042567700233760ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _AcquisElement_H_ #define _AcquisElement_H_ #include /* Including external dependencies */ #include "SatelliteID.h" #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct AddionalDopplerFields; struct AddionalAngleFields; /* AcquisElement */ typedef struct AcquisElement { SatelliteID_t svid; long doppler0; struct AddionalDopplerFields *addionalDoppler /* OPTIONAL */; long codePhase; long intCodePhase; long gpsBitNumber; long codePhaseSearchWindow; struct AddionalAngleFields *addionalAngle /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } AcquisElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_AcquisElement; #ifdef __cplusplus } #endif /* Referred external types */ #include "AddionalDopplerFields.h" #include "AddionalAngleFields.h" #endif /* _AcquisElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/AddionalAngleFields.c000066400000000000000000000071141305042567700244420ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "AddionalAngleFields.h" static int memb_azimuth_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 31)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_elevation_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 7)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_azimuth_constr_2 = { { APC_CONSTRAINED, 5, 5, 0, 31 } /* (0..31) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_elevation_constr_3 = { { APC_CONSTRAINED, 3, 3, 0, 7 } /* (0..7) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_AddionalAngleFields_1[] = { { ATF_NOFLAGS, 0, offsetof(struct AddionalAngleFields, azimuth), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_azimuth_constraint_1, &asn_PER_memb_azimuth_constr_2, 0, "azimuth" }, { ATF_NOFLAGS, 0, offsetof(struct AddionalAngleFields, elevation), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_elevation_constraint_1, &asn_PER_memb_elevation_constr_3, 0, "elevation" }, }; static ber_tlv_tag_t asn_DEF_AddionalAngleFields_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_AddionalAngleFields_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* azimuth at 858 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* elevation at 860 */ }; static asn_SEQUENCE_specifics_t asn_SPC_AddionalAngleFields_specs_1 = { sizeof(struct AddionalAngleFields), offsetof(struct AddionalAngleFields, _asn_ctx), asn_MAP_AddionalAngleFields_tag2el_1, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_AddionalAngleFields = { "AddionalAngleFields", "AddionalAngleFields", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_AddionalAngleFields_tags_1, sizeof(asn_DEF_AddionalAngleFields_tags_1) /sizeof(asn_DEF_AddionalAngleFields_tags_1[0]), /* 1 */ asn_DEF_AddionalAngleFields_tags_1, /* Same as above */ sizeof(asn_DEF_AddionalAngleFields_tags_1) /sizeof(asn_DEF_AddionalAngleFields_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_AddionalAngleFields_1, 2, /* Elements count */ &asn_SPC_AddionalAngleFields_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/AddionalAngleFields.h000066400000000000000000000013551305042567700244500ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _AddionalAngleFields_H_ #define _AddionalAngleFields_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* AddionalAngleFields */ typedef struct AddionalAngleFields { long azimuth; long elevation; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } AddionalAngleFields_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_AddionalAngleFields; #ifdef __cplusplus } #endif #endif /* _AddionalAngleFields_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/AddionalDopplerFields.c000066400000000000000000000072741305042567700250300ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "AddionalDopplerFields.h" static int memb_doppler1_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 63)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_dopplerUncertainty_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 7)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_doppler1_constr_2 = { { APC_CONSTRAINED, 6, 6, 0, 63 } /* (0..63) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_dopplerUncertainty_constr_3 = { { APC_CONSTRAINED, 3, 3, 0, 7 } /* (0..7) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_AddionalDopplerFields_1[] = { { ATF_NOFLAGS, 0, offsetof(struct AddionalDopplerFields, doppler1), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_doppler1_constraint_1, &asn_PER_memb_doppler1_constr_2, 0, "doppler1" }, { ATF_NOFLAGS, 0, offsetof(struct AddionalDopplerFields, dopplerUncertainty), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_dopplerUncertainty_constraint_1, &asn_PER_memb_dopplerUncertainty_constr_3, 0, "dopplerUncertainty" }, }; static ber_tlv_tag_t asn_DEF_AddionalDopplerFields_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_AddionalDopplerFields_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* doppler1 at 850 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* dopplerUncertainty at 851 */ }; static asn_SEQUENCE_specifics_t asn_SPC_AddionalDopplerFields_specs_1 = { sizeof(struct AddionalDopplerFields), offsetof(struct AddionalDopplerFields, _asn_ctx), asn_MAP_AddionalDopplerFields_tag2el_1, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_AddionalDopplerFields = { "AddionalDopplerFields", "AddionalDopplerFields", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_AddionalDopplerFields_tags_1, sizeof(asn_DEF_AddionalDopplerFields_tags_1) /sizeof(asn_DEF_AddionalDopplerFields_tags_1[0]), /* 1 */ asn_DEF_AddionalDopplerFields_tags_1, /* Same as above */ sizeof(asn_DEF_AddionalDopplerFields_tags_1) /sizeof(asn_DEF_AddionalDopplerFields_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_AddionalDopplerFields_1, 2, /* Elements count */ &asn_SPC_AddionalDopplerFields_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/AddionalDopplerFields.h000066400000000000000000000014051305042567700250230ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _AddionalDopplerFields_H_ #define _AddionalDopplerFields_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* AddionalDopplerFields */ typedef struct AddionalDopplerFields { long doppler1; long dopplerUncertainty; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } AddionalDopplerFields_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_AddionalDopplerFields; #ifdef __cplusplus } #endif #endif /* _AddionalDopplerFields_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/AdditionalAssistanceData.c000066400000000000000000000056261305042567700255170ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "AdditionalAssistanceData.h" static asn_TYPE_member_t asn_MBR_AdditionalAssistanceData_1[] = { { ATF_POINTER, 3, offsetof(struct AdditionalAssistanceData, gpsAssistanceData), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GPSAssistanceData, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "gpsAssistanceData" }, { ATF_POINTER, 2, offsetof(struct AdditionalAssistanceData, extensionContainer), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_ExtensionContainer, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "extensionContainer" }, { ATF_POINTER, 1, offsetof(struct AdditionalAssistanceData, ganssAssistanceData), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSSAssistanceData, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssAssistanceData" }, }; static int asn_MAP_AdditionalAssistanceData_oms_1[] = { 0, 1, 2 }; static ber_tlv_tag_t asn_DEF_AdditionalAssistanceData_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_AdditionalAssistanceData_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* gpsAssistanceData at 520 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* extensionContainer at 521 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* ganssAssistanceData at 523 */ }; static asn_SEQUENCE_specifics_t asn_SPC_AdditionalAssistanceData_specs_1 = { sizeof(struct AdditionalAssistanceData), offsetof(struct AdditionalAssistanceData, _asn_ctx), asn_MAP_AdditionalAssistanceData_tag2el_1, 3, /* Count of tags in the map */ asn_MAP_AdditionalAssistanceData_oms_1, /* Optional members */ 2, 1, /* Root/Additions */ 1, /* Start extensions */ 4 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_AdditionalAssistanceData = { "AdditionalAssistanceData", "AdditionalAssistanceData", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_AdditionalAssistanceData_tags_1, sizeof(asn_DEF_AdditionalAssistanceData_tags_1) /sizeof(asn_DEF_AdditionalAssistanceData_tags_1[0]), /* 1 */ asn_DEF_AdditionalAssistanceData_tags_1, /* Same as above */ sizeof(asn_DEF_AdditionalAssistanceData_tags_1) /sizeof(asn_DEF_AdditionalAssistanceData_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_AdditionalAssistanceData_1, 3, /* Elements count */ &asn_SPC_AdditionalAssistanceData_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/AdditionalAssistanceData.h000066400000000000000000000020521305042567700255120ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _AdditionalAssistanceData_H_ #define _AdditionalAssistanceData_H_ #include /* Including external dependencies */ #include "GPSAssistanceData.h" #include "ExtensionContainer.h" #include "GANSSAssistanceData.h" #include #ifdef __cplusplus extern "C" { #endif /* AdditionalAssistanceData */ typedef struct AdditionalAssistanceData { GPSAssistanceData_t *gpsAssistanceData /* OPTIONAL */; ExtensionContainer_t *extensionContainer /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ GANSSAssistanceData_t *ganssAssistanceData /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } AdditionalAssistanceData_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_AdditionalAssistanceData; #ifdef __cplusplus } #endif #endif /* _AdditionalAssistanceData_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/AdditionalDopplerFields.c000066400000000000000000000073501305042567700253600ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "AdditionalDopplerFields.h" static int memb_doppler1_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 63)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_dopplerUncertainty_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 4)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_doppler1_constr_2 = { { APC_CONSTRAINED, 6, 6, 0, 63 } /* (0..63) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_dopplerUncertainty_constr_3 = { { APC_CONSTRAINED, 3, 3, 0, 4 } /* (0..4) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_AdditionalDopplerFields_1[] = { { ATF_NOFLAGS, 0, offsetof(struct AdditionalDopplerFields, doppler1), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_doppler1_constraint_1, &asn_PER_memb_doppler1_constr_2, 0, "doppler1" }, { ATF_NOFLAGS, 0, offsetof(struct AdditionalDopplerFields, dopplerUncertainty), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_dopplerUncertainty_constraint_1, &asn_PER_memb_dopplerUncertainty_constr_3, 0, "dopplerUncertainty" }, }; static ber_tlv_tag_t asn_DEF_AdditionalDopplerFields_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_AdditionalDopplerFields_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* doppler1 at 1342 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* dopplerUncertainty at 1343 */ }; static asn_SEQUENCE_specifics_t asn_SPC_AdditionalDopplerFields_specs_1 = { sizeof(struct AdditionalDopplerFields), offsetof(struct AdditionalDopplerFields, _asn_ctx), asn_MAP_AdditionalDopplerFields_tag2el_1, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_AdditionalDopplerFields = { "AdditionalDopplerFields", "AdditionalDopplerFields", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_AdditionalDopplerFields_tags_1, sizeof(asn_DEF_AdditionalDopplerFields_tags_1) /sizeof(asn_DEF_AdditionalDopplerFields_tags_1[0]), /* 1 */ asn_DEF_AdditionalDopplerFields_tags_1, /* Same as above */ sizeof(asn_DEF_AdditionalDopplerFields_tags_1) /sizeof(asn_DEF_AdditionalDopplerFields_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_AdditionalDopplerFields_1, 2, /* Elements count */ &asn_SPC_AdditionalDopplerFields_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/AdditionalDopplerFields.h000066400000000000000000000014231305042567700253600ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _AdditionalDopplerFields_H_ #define _AdditionalDopplerFields_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* AdditionalDopplerFields */ typedef struct AdditionalDopplerFields { long doppler1; long dopplerUncertainty; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } AdditionalDopplerFields_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_AdditionalDopplerFields; #ifdef __cplusplus } #endif #endif /* _AdditionalDopplerFields_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/AlertFlag.c000066400000000000000000000110231305042567700224640ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "AlertFlag.h" int AlertFlag_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void AlertFlag_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void AlertFlag_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { AlertFlag_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int AlertFlag_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { AlertFlag_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t AlertFlag_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { AlertFlag_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t AlertFlag_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { AlertFlag_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t AlertFlag_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { AlertFlag_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t AlertFlag_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { AlertFlag_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t AlertFlag_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { AlertFlag_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t AlertFlag_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { AlertFlag_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_AlertFlag_constr_1 = { { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_AlertFlag_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_AlertFlag = { "AlertFlag", "AlertFlag", AlertFlag_free, AlertFlag_print, AlertFlag_constraint, AlertFlag_decode_ber, AlertFlag_encode_der, AlertFlag_decode_xer, AlertFlag_encode_xer, AlertFlag_decode_uper, AlertFlag_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_AlertFlag_tags_1, sizeof(asn_DEF_AlertFlag_tags_1) /sizeof(asn_DEF_AlertFlag_tags_1[0]), /* 1 */ asn_DEF_AlertFlag_tags_1, /* Same as above */ sizeof(asn_DEF_AlertFlag_tags_1) /sizeof(asn_DEF_AlertFlag_tags_1[0]), /* 1 */ &asn_PER_type_AlertFlag_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/AlertFlag.h000066400000000000000000000015561305042567700225030ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _AlertFlag_H_ #define _AlertFlag_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* AlertFlag */ typedef long AlertFlag_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_AlertFlag; asn_struct_free_f AlertFlag_free; asn_struct_print_f AlertFlag_print; asn_constr_check_f AlertFlag_constraint; ber_type_decoder_f AlertFlag_decode_ber; der_type_encoder_f AlertFlag_encode_der; xer_type_decoder_f AlertFlag_decode_xer; xer_type_encoder_f AlertFlag_encode_xer; per_type_decoder_f AlertFlag_decode_uper; per_type_encoder_f AlertFlag_encode_uper; #ifdef __cplusplus } #endif #endif /* _AlertFlag_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Almanac-KeplerianSet.c000066400000000000000000000307761305042567700245630ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "Almanac-KeplerianSet.h" static int memb_kepAlmanacE_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 2047)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_kepAlmanacDeltaI_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -1024 && value <= 1023)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_kepAlmanacOmegaDot_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -1024 && value <= 1023)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_kepSVHealth_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 15)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_kepAlmanacAPowerHalf_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -65536 && value <= 65535)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_kepAlmanacOmega0_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -32768 && value <= 32767)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_kepAlmanacW_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -32768 && value <= 32767)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_kepAlmanacM0_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -32768 && value <= 32767)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_kepAlmanacAF0_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -8192 && value <= 8191)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_kepAlmanacAF1_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -1024 && value <= 1023)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_kepAlmanacE_constr_2 = { { APC_CONSTRAINED, 11, 11, 0, 2047 } /* (0..2047) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_kepAlmanacDeltaI_constr_3 = { { APC_CONSTRAINED, 11, 11, -1024, 1023 } /* (-1024..1023) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_kepAlmanacOmegaDot_constr_4 = { { APC_CONSTRAINED, 11, 11, -1024, 1023 } /* (-1024..1023) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_kepSVHealth_constr_5 = { { APC_CONSTRAINED, 4, 4, 0, 15 } /* (0..15) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_kepAlmanacAPowerHalf_constr_6 = { { APC_CONSTRAINED, 17, -1, -65536, 65535 } /* (-65536..65535) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_kepAlmanacOmega0_constr_7 = { { APC_CONSTRAINED, 16, 16, -32768, 32767 } /* (-32768..32767) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_kepAlmanacW_constr_8 = { { APC_CONSTRAINED, 16, 16, -32768, 32767 } /* (-32768..32767) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_kepAlmanacM0_constr_9 = { { APC_CONSTRAINED, 16, 16, -32768, 32767 } /* (-32768..32767) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_kepAlmanacAF0_constr_10 = { { APC_CONSTRAINED, 14, 14, -8192, 8191 } /* (-8192..8191) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_kepAlmanacAF1_constr_11 = { { APC_CONSTRAINED, 11, 11, -1024, 1023 } /* (-1024..1023) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_Almanac_KeplerianSet_1[] = { { ATF_NOFLAGS, 0, offsetof(struct Almanac_KeplerianSet, kepAlmanacE), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_kepAlmanacE_constraint_1, &asn_PER_memb_kepAlmanacE_constr_2, 0, "kepAlmanacE" }, { ATF_NOFLAGS, 0, offsetof(struct Almanac_KeplerianSet, kepAlmanacDeltaI), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_kepAlmanacDeltaI_constraint_1, &asn_PER_memb_kepAlmanacDeltaI_constr_3, 0, "kepAlmanacDeltaI" }, { ATF_NOFLAGS, 0, offsetof(struct Almanac_KeplerianSet, kepAlmanacOmegaDot), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_kepAlmanacOmegaDot_constraint_1, &asn_PER_memb_kepAlmanacOmegaDot_constr_4, 0, "kepAlmanacOmegaDot" }, { ATF_NOFLAGS, 0, offsetof(struct Almanac_KeplerianSet, kepSVHealth), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_kepSVHealth_constraint_1, &asn_PER_memb_kepSVHealth_constr_5, 0, "kepSVHealth" }, { ATF_NOFLAGS, 0, offsetof(struct Almanac_KeplerianSet, kepAlmanacAPowerHalf), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_kepAlmanacAPowerHalf_constraint_1, &asn_PER_memb_kepAlmanacAPowerHalf_constr_6, 0, "kepAlmanacAPowerHalf" }, { ATF_NOFLAGS, 0, offsetof(struct Almanac_KeplerianSet, kepAlmanacOmega0), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_kepAlmanacOmega0_constraint_1, &asn_PER_memb_kepAlmanacOmega0_constr_7, 0, "kepAlmanacOmega0" }, { ATF_NOFLAGS, 0, offsetof(struct Almanac_KeplerianSet, kepAlmanacW), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_kepAlmanacW_constraint_1, &asn_PER_memb_kepAlmanacW_constr_8, 0, "kepAlmanacW" }, { ATF_NOFLAGS, 0, offsetof(struct Almanac_KeplerianSet, kepAlmanacM0), (ASN_TAG_CLASS_CONTEXT | (7 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_kepAlmanacM0_constraint_1, &asn_PER_memb_kepAlmanacM0_constr_9, 0, "kepAlmanacM0" }, { ATF_NOFLAGS, 0, offsetof(struct Almanac_KeplerianSet, kepAlmanacAF0), (ASN_TAG_CLASS_CONTEXT | (8 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_kepAlmanacAF0_constraint_1, &asn_PER_memb_kepAlmanacAF0_constr_10, 0, "kepAlmanacAF0" }, { ATF_NOFLAGS, 0, offsetof(struct Almanac_KeplerianSet, kepAlmanacAF1), (ASN_TAG_CLASS_CONTEXT | (9 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_kepAlmanacAF1_constraint_1, &asn_PER_memb_kepAlmanacAF1_constr_11, 0, "kepAlmanacAF1" }, }; static ber_tlv_tag_t asn_DEF_Almanac_KeplerianSet_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_Almanac_KeplerianSet_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* kepAlmanacE at 1368 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* kepAlmanacDeltaI at 1369 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* kepAlmanacOmegaDot at 1370 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* kepSVHealth at 1371 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* kepAlmanacAPowerHalf at 1372 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* kepAlmanacOmega0 at 1373 */ { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* kepAlmanacW at 1374 */ { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 }, /* kepAlmanacM0 at 1375 */ { (ASN_TAG_CLASS_CONTEXT | (8 << 2)), 8, 0, 0 }, /* kepAlmanacAF0 at 1376 */ { (ASN_TAG_CLASS_CONTEXT | (9 << 2)), 9, 0, 0 } /* kepAlmanacAF1 at 1377 */ }; static asn_SEQUENCE_specifics_t asn_SPC_Almanac_KeplerianSet_specs_1 = { sizeof(struct Almanac_KeplerianSet), offsetof(struct Almanac_KeplerianSet, _asn_ctx), asn_MAP_Almanac_KeplerianSet_tag2el_1, 10, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Almanac_KeplerianSet = { "Almanac-KeplerianSet", "Almanac-KeplerianSet", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_Almanac_KeplerianSet_tags_1, sizeof(asn_DEF_Almanac_KeplerianSet_tags_1) /sizeof(asn_DEF_Almanac_KeplerianSet_tags_1[0]), /* 1 */ asn_DEF_Almanac_KeplerianSet_tags_1, /* Same as above */ sizeof(asn_DEF_Almanac_KeplerianSet_tags_1) /sizeof(asn_DEF_Almanac_KeplerianSet_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_Almanac_KeplerianSet_1, 10, /* Elements count */ &asn_SPC_Almanac_KeplerianSet_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Almanac-KeplerianSet.h000066400000000000000000000016711305042567700245600ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _Almanac_KeplerianSet_H_ #define _Almanac_KeplerianSet_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Almanac-KeplerianSet */ typedef struct Almanac_KeplerianSet { long kepAlmanacE; long kepAlmanacDeltaI; long kepAlmanacOmegaDot; long kepSVHealth; long kepAlmanacAPowerHalf; long kepAlmanacOmega0; long kepAlmanacW; long kepAlmanacM0; long kepAlmanacAF0; long kepAlmanacAF1; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } Almanac_KeplerianSet_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Almanac_KeplerianSet; #ifdef __cplusplus } #endif #endif /* _Almanac_KeplerianSet_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Almanac.c000066400000000000000000000053041305042567700221640ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "Almanac.h" static int memb_alamanacWNa_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 255)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_alamanacWNa_constr_2 = { { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_Almanac_1[] = { { ATF_NOFLAGS, 0, offsetof(struct Almanac, alamanacWNa), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_alamanacWNa_constraint_1, &asn_PER_memb_alamanacWNa_constr_2, 0, "alamanacWNa" }, { ATF_NOFLAGS, 0, offsetof(struct Almanac, almanacList), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfAlmanacElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "almanacList" }, }; static ber_tlv_tag_t asn_DEF_Almanac_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_Almanac_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* alamanacWNa at 789 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* almanacList at 794 */ }; static asn_SEQUENCE_specifics_t asn_SPC_Almanac_specs_1 = { sizeof(struct Almanac), offsetof(struct Almanac, _asn_ctx), asn_MAP_Almanac_tag2el_1, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Almanac = { "Almanac", "Almanac", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_Almanac_tags_1, sizeof(asn_DEF_Almanac_tags_1) /sizeof(asn_DEF_Almanac_tags_1[0]), /* 1 */ asn_DEF_Almanac_tags_1, /* Same as above */ sizeof(asn_DEF_Almanac_tags_1) /sizeof(asn_DEF_Almanac_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_Almanac_1, 2, /* Elements count */ &asn_SPC_Almanac_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Almanac.h000066400000000000000000000013211305042567700221640ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _Almanac_H_ #define _Almanac_H_ #include /* Including external dependencies */ #include #include "SeqOfAlmanacElement.h" #include #ifdef __cplusplus extern "C" { #endif /* Almanac */ typedef struct Almanac { long alamanacWNa; SeqOfAlmanacElement_t almanacList; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } Almanac_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Almanac; #ifdef __cplusplus } #endif #endif /* _Almanac_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/AlmanacElement.c000066400000000000000000000331661305042567700235050ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "AlmanacElement.h" static int memb_almanacE_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 65535)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_alamanacToa_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 255)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_almanacKsii_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -32768 && value <= 32767)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_almanacOmegaDot_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -32768 && value <= 32767)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_almanacSVhealth_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 255)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_almanacAPowerHalf_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 16777215)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_almanacOmega0_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -8388608 && value <= 8388607)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_almanacW_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -8388608 && value <= 8388607)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_almanacM0_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -8388608 && value <= 8388607)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_almanacAF0_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -1024 && value <= 1023)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_almanacAF1_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -1024 && value <= 1023)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_almanacE_constr_3 = { { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_alamanacToa_constr_4 = { { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_almanacKsii_constr_5 = { { APC_CONSTRAINED, 16, 16, -32768, 32767 } /* (-32768..32767) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_almanacOmegaDot_constr_6 = { { APC_CONSTRAINED, 16, 16, -32768, 32767 } /* (-32768..32767) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_almanacSVhealth_constr_7 = { { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_almanacAPowerHalf_constr_8 = { { APC_CONSTRAINED, 24, -1, 0, 16777215 } /* (0..16777215) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_almanacOmega0_constr_9 = { { APC_CONSTRAINED, 24, -1, -8388608, 8388607 } /* (-8388608..8388607) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_almanacW_constr_10 = { { APC_CONSTRAINED, 24, -1, -8388608, 8388607 } /* (-8388608..8388607) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_almanacM0_constr_11 = { { APC_CONSTRAINED, 24, -1, -8388608, 8388607 } /* (-8388608..8388607) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_almanacAF0_constr_12 = { { APC_CONSTRAINED, 11, 11, -1024, 1023 } /* (-1024..1023) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_almanacAF1_constr_13 = { { APC_CONSTRAINED, 11, 11, -1024, 1023 } /* (-1024..1023) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_AlmanacElement_1[] = { { ATF_NOFLAGS, 0, offsetof(struct AlmanacElement, satelliteID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SatelliteID, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "satelliteID" }, { ATF_NOFLAGS, 0, offsetof(struct AlmanacElement, almanacE), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_almanacE_constraint_1, &asn_PER_memb_almanacE_constr_3, 0, "almanacE" }, { ATF_NOFLAGS, 0, offsetof(struct AlmanacElement, alamanacToa), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_alamanacToa_constraint_1, &asn_PER_memb_alamanacToa_constr_4, 0, "alamanacToa" }, { ATF_NOFLAGS, 0, offsetof(struct AlmanacElement, almanacKsii), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_almanacKsii_constraint_1, &asn_PER_memb_almanacKsii_constr_5, 0, "almanacKsii" }, { ATF_NOFLAGS, 0, offsetof(struct AlmanacElement, almanacOmegaDot), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_almanacOmegaDot_constraint_1, &asn_PER_memb_almanacOmegaDot_constr_6, 0, "almanacOmegaDot" }, { ATF_NOFLAGS, 0, offsetof(struct AlmanacElement, almanacSVhealth), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_almanacSVhealth_constraint_1, &asn_PER_memb_almanacSVhealth_constr_7, 0, "almanacSVhealth" }, { ATF_NOFLAGS, 0, offsetof(struct AlmanacElement, almanacAPowerHalf), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_almanacAPowerHalf_constraint_1, &asn_PER_memb_almanacAPowerHalf_constr_8, 0, "almanacAPowerHalf" }, { ATF_NOFLAGS, 0, offsetof(struct AlmanacElement, almanacOmega0), (ASN_TAG_CLASS_CONTEXT | (7 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_almanacOmega0_constraint_1, &asn_PER_memb_almanacOmega0_constr_9, 0, "almanacOmega0" }, { ATF_NOFLAGS, 0, offsetof(struct AlmanacElement, almanacW), (ASN_TAG_CLASS_CONTEXT | (8 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_almanacW_constraint_1, &asn_PER_memb_almanacW_constr_10, 0, "almanacW" }, { ATF_NOFLAGS, 0, offsetof(struct AlmanacElement, almanacM0), (ASN_TAG_CLASS_CONTEXT | (9 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_almanacM0_constraint_1, &asn_PER_memb_almanacM0_constr_11, 0, "almanacM0" }, { ATF_NOFLAGS, 0, offsetof(struct AlmanacElement, almanacAF0), (ASN_TAG_CLASS_CONTEXT | (10 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_almanacAF0_constraint_1, &asn_PER_memb_almanacAF0_constr_12, 0, "almanacAF0" }, { ATF_NOFLAGS, 0, offsetof(struct AlmanacElement, almanacAF1), (ASN_TAG_CLASS_CONTEXT | (11 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_almanacAF1_constraint_1, &asn_PER_memb_almanacAF1_constr_13, 0, "almanacAF1" }, }; static ber_tlv_tag_t asn_DEF_AlmanacElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_AlmanacElement_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* satelliteID at 799 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* almanacE at 800 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* alamanacToa at 801 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* almanacKsii at 802 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* almanacOmegaDot at 803 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* almanacSVhealth at 804 */ { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* almanacAPowerHalf at 805 */ { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 }, /* almanacOmega0 at 806 */ { (ASN_TAG_CLASS_CONTEXT | (8 << 2)), 8, 0, 0 }, /* almanacW at 807 */ { (ASN_TAG_CLASS_CONTEXT | (9 << 2)), 9, 0, 0 }, /* almanacM0 at 808 */ { (ASN_TAG_CLASS_CONTEXT | (10 << 2)), 10, 0, 0 }, /* almanacAF0 at 809 */ { (ASN_TAG_CLASS_CONTEXT | (11 << 2)), 11, 0, 0 } /* almanacAF1 at 810 */ }; static asn_SEQUENCE_specifics_t asn_SPC_AlmanacElement_specs_1 = { sizeof(struct AlmanacElement), offsetof(struct AlmanacElement, _asn_ctx), asn_MAP_AlmanacElement_tag2el_1, 12, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_AlmanacElement = { "AlmanacElement", "AlmanacElement", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_AlmanacElement_tags_1, sizeof(asn_DEF_AlmanacElement_tags_1) /sizeof(asn_DEF_AlmanacElement_tags_1[0]), /* 1 */ asn_DEF_AlmanacElement_tags_1, /* Same as above */ sizeof(asn_DEF_AlmanacElement_tags_1) /sizeof(asn_DEF_AlmanacElement_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_AlmanacElement_1, 12, /* Elements count */ &asn_SPC_AlmanacElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/AlmanacElement.h000066400000000000000000000017001305042567700234770ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _AlmanacElement_H_ #define _AlmanacElement_H_ #include /* Including external dependencies */ #include "SatelliteID.h" #include #include #ifdef __cplusplus extern "C" { #endif /* AlmanacElement */ typedef struct AlmanacElement { SatelliteID_t satelliteID; long almanacE; long alamanacToa; long almanacKsii; long almanacOmegaDot; long almanacSVhealth; long almanacAPowerHalf; long almanacOmega0; long almanacW; long almanacM0; long almanacAF0; long almanacAF1; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } AlmanacElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_AlmanacElement; #ifdef __cplusplus } #endif #endif /* _AlmanacElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/AntiSpoofFlag.c000066400000000000000000000112631305042567700233250ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "AntiSpoofFlag.h" int AntiSpoofFlag_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void AntiSpoofFlag_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void AntiSpoofFlag_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { AntiSpoofFlag_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int AntiSpoofFlag_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { AntiSpoofFlag_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t AntiSpoofFlag_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { AntiSpoofFlag_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t AntiSpoofFlag_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { AntiSpoofFlag_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t AntiSpoofFlag_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { AntiSpoofFlag_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t AntiSpoofFlag_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { AntiSpoofFlag_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t AntiSpoofFlag_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { AntiSpoofFlag_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t AntiSpoofFlag_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { AntiSpoofFlag_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_AntiSpoofFlag_constr_1 = { { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_AntiSpoofFlag_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_AntiSpoofFlag = { "AntiSpoofFlag", "AntiSpoofFlag", AntiSpoofFlag_free, AntiSpoofFlag_print, AntiSpoofFlag_constraint, AntiSpoofFlag_decode_ber, AntiSpoofFlag_encode_der, AntiSpoofFlag_decode_xer, AntiSpoofFlag_encode_xer, AntiSpoofFlag_decode_uper, AntiSpoofFlag_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_AntiSpoofFlag_tags_1, sizeof(asn_DEF_AntiSpoofFlag_tags_1) /sizeof(asn_DEF_AntiSpoofFlag_tags_1[0]), /* 1 */ asn_DEF_AntiSpoofFlag_tags_1, /* Same as above */ sizeof(asn_DEF_AntiSpoofFlag_tags_1) /sizeof(asn_DEF_AntiSpoofFlag_tags_1[0]), /* 1 */ &asn_PER_type_AntiSpoofFlag_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/AntiSpoofFlag.h000066400000000000000000000016521305042567700233330ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _AntiSpoofFlag_H_ #define _AntiSpoofFlag_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* AntiSpoofFlag */ typedef long AntiSpoofFlag_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_AntiSpoofFlag; asn_struct_free_f AntiSpoofFlag_free; asn_struct_print_f AntiSpoofFlag_print; asn_constr_check_f AntiSpoofFlag_constraint; ber_type_decoder_f AntiSpoofFlag_decode_ber; der_type_encoder_f AntiSpoofFlag_encode_der; xer_type_decoder_f AntiSpoofFlag_decode_xer; xer_type_encoder_f AntiSpoofFlag_encode_xer; per_type_decoder_f AntiSpoofFlag_decode_uper; per_type_encoder_f AntiSpoofFlag_encode_uper; #ifdef __cplusplus } #endif #endif /* _AntiSpoofFlag_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/AssistBTSData-R98-ExpOTD.c000066400000000000000000000045621305042567700247270ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "AssistBTSData-R98-ExpOTD.h" static asn_TYPE_member_t asn_MBR_AssistBTSData_R98_ExpOTD_1[] = { { ATF_NOFLAGS, 0, offsetof(struct AssistBTSData_R98_ExpOTD, expectedOTD), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_ExpectedOTD, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "expectedOTD" }, { ATF_NOFLAGS, 0, offsetof(struct AssistBTSData_R98_ExpOTD, expOTDuncertainty), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_ExpOTDUncertainty, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "expOTDuncertainty" }, }; static ber_tlv_tag_t asn_DEF_AssistBTSData_R98_ExpOTD_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_AssistBTSData_R98_ExpOTD_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* expectedOTD at 933 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* expOTDuncertainty at 935 */ }; static asn_SEQUENCE_specifics_t asn_SPC_AssistBTSData_R98_ExpOTD_specs_1 = { sizeof(struct AssistBTSData_R98_ExpOTD), offsetof(struct AssistBTSData_R98_ExpOTD, _asn_ctx), asn_MAP_AssistBTSData_R98_ExpOTD_tag2el_1, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_AssistBTSData_R98_ExpOTD = { "AssistBTSData-R98-ExpOTD", "AssistBTSData-R98-ExpOTD", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_AssistBTSData_R98_ExpOTD_tags_1, sizeof(asn_DEF_AssistBTSData_R98_ExpOTD_tags_1) /sizeof(asn_DEF_AssistBTSData_R98_ExpOTD_tags_1[0]), /* 1 */ asn_DEF_AssistBTSData_R98_ExpOTD_tags_1, /* Same as above */ sizeof(asn_DEF_AssistBTSData_R98_ExpOTD_tags_1) /sizeof(asn_DEF_AssistBTSData_R98_ExpOTD_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_AssistBTSData_R98_ExpOTD_1, 2, /* Elements count */ &asn_SPC_AssistBTSData_R98_ExpOTD_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/AssistBTSData-R98-ExpOTD.h000066400000000000000000000015211305042567700247240ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _AssistBTSData_R98_ExpOTD_H_ #define _AssistBTSData_R98_ExpOTD_H_ #include /* Including external dependencies */ #include "ExpectedOTD.h" #include "ExpOTDUncertainty.h" #include #ifdef __cplusplus extern "C" { #endif /* AssistBTSData-R98-ExpOTD */ typedef struct AssistBTSData_R98_ExpOTD { ExpectedOTD_t expectedOTD; ExpOTDUncertainty_t expOTDuncertainty; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } AssistBTSData_R98_ExpOTD_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_AssistBTSData_R98_ExpOTD; #ifdef __cplusplus } #endif #endif /* _AssistBTSData_R98_ExpOTD_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/AssistBTSData.c000066400000000000000000000064441305042567700232470ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "AssistBTSData.h" static asn_TYPE_member_t asn_MBR_AssistBTSData_1[] = { { ATF_NOFLAGS, 0, offsetof(struct AssistBTSData, bsic), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BSIC, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "bsic" }, { ATF_NOFLAGS, 0, offsetof(struct AssistBTSData, multiFrameOffset), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_MultiFrameOffset, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "multiFrameOffset" }, { ATF_NOFLAGS, 0, offsetof(struct AssistBTSData, timeSlotScheme), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_TimeSlotScheme, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "timeSlotScheme" }, { ATF_NOFLAGS, 0, offsetof(struct AssistBTSData, roughRTD), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_RoughRTD, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "roughRTD" }, { ATF_POINTER, 1, offsetof(struct AssistBTSData, calcAssistanceBTS), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_CalcAssistanceBTS, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "calcAssistanceBTS" }, }; static int asn_MAP_AssistBTSData_oms_1[] = { 4 }; static ber_tlv_tag_t asn_DEF_AssistBTSData_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_AssistBTSData_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* bsic at 229 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* multiFrameOffset at 230 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* timeSlotScheme at 231 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* roughRTD at 232 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* calcAssistanceBTS at 235 */ }; static asn_SEQUENCE_specifics_t asn_SPC_AssistBTSData_specs_1 = { sizeof(struct AssistBTSData), offsetof(struct AssistBTSData, _asn_ctx), asn_MAP_AssistBTSData_tag2el_1, 5, /* Count of tags in the map */ asn_MAP_AssistBTSData_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_AssistBTSData = { "AssistBTSData", "AssistBTSData", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_AssistBTSData_tags_1, sizeof(asn_DEF_AssistBTSData_tags_1) /sizeof(asn_DEF_AssistBTSData_tags_1[0]), /* 1 */ asn_DEF_AssistBTSData_tags_1, /* Same as above */ sizeof(asn_DEF_AssistBTSData_tags_1) /sizeof(asn_DEF_AssistBTSData_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_AssistBTSData_1, 5, /* Elements count */ &asn_SPC_AssistBTSData_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/AssistBTSData.h000066400000000000000000000020111305042567700232360ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _AssistBTSData_H_ #define _AssistBTSData_H_ #include /* Including external dependencies */ #include "BSIC.h" #include "MultiFrameOffset.h" #include "TimeSlotScheme.h" #include "RoughRTD.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct CalcAssistanceBTS; /* AssistBTSData */ typedef struct AssistBTSData { BSIC_t bsic; MultiFrameOffset_t multiFrameOffset; TimeSlotScheme_t timeSlotScheme; RoughRTD_t roughRTD; struct CalcAssistanceBTS *calcAssistanceBTS /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } AssistBTSData_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_AssistBTSData; #ifdef __cplusplus } #endif /* Referred external types */ #include "CalcAssistanceBTS.h" #endif /* _AssistBTSData_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/AssistanceData.c000066400000000000000000000112611305042567700235160ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "AssistanceData.h" static asn_TYPE_member_t asn_MBR_AssistanceData_1[] = { { ATF_POINTER, 8, offsetof(struct AssistanceData, referenceAssistData), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_ReferenceAssistData, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "referenceAssistData" }, { ATF_POINTER, 7, offsetof(struct AssistanceData, msrAssistData), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_MsrAssistData, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "msrAssistData" }, { ATF_POINTER, 6, offsetof(struct AssistanceData, systemInfoAssistData), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SystemInfoAssistData, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "systemInfoAssistData" }, { ATF_POINTER, 5, offsetof(struct AssistanceData, gps_AssistData), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GPS_AssistData, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "gps-AssistData" }, { ATF_POINTER, 4, offsetof(struct AssistanceData, moreAssDataToBeSent), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_MoreAssDataToBeSent, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "moreAssDataToBeSent" }, { ATF_POINTER, 3, offsetof(struct AssistanceData, extensionContainer), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_ExtensionContainer, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "extensionContainer" }, { ATF_POINTER, 2, offsetof(struct AssistanceData, rel98_AssistanceData_Extension), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Rel98_AssistanceData_Extension, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "rel98-AssistanceData-Extension" }, { ATF_POINTER, 1, offsetof(struct AssistanceData, rel5_AssistanceData_Extension), (ASN_TAG_CLASS_CONTEXT | (7 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Rel5_AssistanceData_Extension, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "rel5-AssistanceData-Extension" }, }; static int asn_MAP_AssistanceData_oms_1[] = { 0, 1, 2, 3, 4, 5, 6, 7 }; static ber_tlv_tag_t asn_DEF_AssistanceData_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_AssistanceData_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* referenceAssistData at 75 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* msrAssistData at 76 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* systemInfoAssistData at 77 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* gps-AssistData at 78 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* moreAssDataToBeSent at 79 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* extensionContainer at 83 */ { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* rel98-AssistanceData-Extension at 86 */ { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 } /* rel5-AssistanceData-Extension at 87 */ }; static asn_SEQUENCE_specifics_t asn_SPC_AssistanceData_specs_1 = { sizeof(struct AssistanceData), offsetof(struct AssistanceData, _asn_ctx), asn_MAP_AssistanceData_tag2el_1, 8, /* Count of tags in the map */ asn_MAP_AssistanceData_oms_1, /* Optional members */ 6, 2, /* Root/Additions */ 5, /* Start extensions */ 9 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_AssistanceData = { "AssistanceData", "AssistanceData", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_AssistanceData_tags_1, sizeof(asn_DEF_AssistanceData_tags_1) /sizeof(asn_DEF_AssistanceData_tags_1[0]), /* 1 */ asn_DEF_AssistanceData_tags_1, /* Same as above */ sizeof(asn_DEF_AssistanceData_tags_1) /sizeof(asn_DEF_AssistanceData_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_AssistanceData_1, 8, /* Elements count */ &asn_SPC_AssistanceData_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/AssistanceData.h000066400000000000000000000033501305042567700235230ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _AssistanceData_H_ #define _AssistanceData_H_ #include /* Including external dependencies */ #include "MoreAssDataToBeSent.h" #include "ExtensionContainer.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct ReferenceAssistData; struct MsrAssistData; struct SystemInfoAssistData; struct GPS_AssistData; struct Rel98_AssistanceData_Extension; struct Rel5_AssistanceData_Extension; /* AssistanceData */ typedef struct AssistanceData { struct ReferenceAssistData *referenceAssistData /* OPTIONAL */; struct MsrAssistData *msrAssistData /* OPTIONAL */; struct SystemInfoAssistData *systemInfoAssistData /* OPTIONAL */; struct GPS_AssistData *gps_AssistData /* OPTIONAL */; MoreAssDataToBeSent_t *moreAssDataToBeSent /* OPTIONAL */; ExtensionContainer_t *extensionContainer /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ struct Rel98_AssistanceData_Extension *rel98_AssistanceData_Extension /* OPTIONAL */; struct Rel5_AssistanceData_Extension *rel5_AssistanceData_Extension /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } AssistanceData_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_AssistanceData; #ifdef __cplusplus } #endif /* Referred external types */ #include "ReferenceAssistData.h" #include "MsrAssistData.h" #include "SystemInfoAssistData.h" #include "GPS-AssistData.h" #include "Rel98-AssistanceData-Extension.h" #include "Rel5-AssistanceData-Extension.h" #endif /* _AssistanceData_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/BCCHCarrier.c000066400000000000000000000111561305042567700226410ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "BCCHCarrier.h" int BCCHCarrier_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1023)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void BCCHCarrier_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void BCCHCarrier_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { BCCHCarrier_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int BCCHCarrier_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { BCCHCarrier_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t BCCHCarrier_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { BCCHCarrier_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t BCCHCarrier_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { BCCHCarrier_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t BCCHCarrier_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { BCCHCarrier_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t BCCHCarrier_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { BCCHCarrier_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t BCCHCarrier_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { BCCHCarrier_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t BCCHCarrier_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { BCCHCarrier_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_BCCHCarrier_constr_1 = { { APC_CONSTRAINED, 10, 10, 0, 1023 } /* (0..1023) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_BCCHCarrier_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_BCCHCarrier = { "BCCHCarrier", "BCCHCarrier", BCCHCarrier_free, BCCHCarrier_print, BCCHCarrier_constraint, BCCHCarrier_decode_ber, BCCHCarrier_encode_der, BCCHCarrier_decode_xer, BCCHCarrier_encode_xer, BCCHCarrier_decode_uper, BCCHCarrier_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_BCCHCarrier_tags_1, sizeof(asn_DEF_BCCHCarrier_tags_1) /sizeof(asn_DEF_BCCHCarrier_tags_1[0]), /* 1 */ asn_DEF_BCCHCarrier_tags_1, /* Same as above */ sizeof(asn_DEF_BCCHCarrier_tags_1) /sizeof(asn_DEF_BCCHCarrier_tags_1[0]), /* 1 */ &asn_PER_type_BCCHCarrier_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/BCCHCarrier.h000066400000000000000000000016141305042567700226440ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _BCCHCarrier_H_ #define _BCCHCarrier_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* BCCHCarrier */ typedef long BCCHCarrier_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_BCCHCarrier; asn_struct_free_f BCCHCarrier_free; asn_struct_print_f BCCHCarrier_print; asn_constr_check_f BCCHCarrier_constraint; ber_type_decoder_f BCCHCarrier_decode_ber; der_type_encoder_f BCCHCarrier_encode_der; xer_type_decoder_f BCCHCarrier_decode_xer; xer_type_encoder_f BCCHCarrier_encode_xer; per_type_decoder_f BCCHCarrier_decode_uper; per_type_encoder_f BCCHCarrier_encode_uper; #ifdef __cplusplus } #endif #endif /* _BCCHCarrier_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/BIT_STRING.c000066400000000000000000000107401305042567700223340ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include /* * BIT STRING basic type description. */ static ber_tlv_tag_t asn_DEF_BIT_STRING_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)) }; static asn_OCTET_STRING_specifics_t asn_DEF_BIT_STRING_specs = { sizeof(BIT_STRING_t), offsetof(BIT_STRING_t, _asn_ctx), ASN_OSUBV_BIT }; asn_TYPE_descriptor_t asn_DEF_BIT_STRING = { "BIT STRING", "BIT_STRING", OCTET_STRING_free, /* Implemented in terms of OCTET STRING */ BIT_STRING_print, BIT_STRING_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ OCTET_STRING_decode_xer_binary, BIT_STRING_encode_xer, OCTET_STRING_decode_uper, /* Unaligned PER decoder */ OCTET_STRING_encode_uper, /* Unaligned PER encoder */ 0, /* Use generic outmost tag fetcher */ asn_DEF_BIT_STRING_tags, sizeof(asn_DEF_BIT_STRING_tags) / sizeof(asn_DEF_BIT_STRING_tags[0]), asn_DEF_BIT_STRING_tags, /* Same as above */ sizeof(asn_DEF_BIT_STRING_tags) / sizeof(asn_DEF_BIT_STRING_tags[0]), 0, /* No PER visible constraints */ 0, 0, /* No members */ &asn_DEF_BIT_STRING_specs }; /* * BIT STRING generic constraint. */ int BIT_STRING_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; if(st && st->buf) { if((st->size == 0 && st->bits_unused) || st->bits_unused < 0 || st->bits_unused > 7) { _ASN_CTFAIL(app_key, td, sptr, "%s: invalid padding byte (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } else { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } return 0; } static char *_bit_pattern[16] = { "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111" }; asn_enc_rval_t BIT_STRING_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t er; char scratch[128]; char *p = scratch; char *scend = scratch + (sizeof(scratch) - 10); const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; int xcan = (flags & XER_F_CANONICAL); uint8_t *buf; uint8_t *end; if(!st || !st->buf) _ASN_ENCODE_FAILED; er.encoded = 0; buf = st->buf; end = buf + st->size - 1; /* Last byte is special */ /* * Binary dump */ for(; buf < end; buf++) { int v = *buf; int nline = xcan?0:(((buf - st->buf) % 8) == 0); if(p >= scend || nline) { er.encoded += p - scratch; _ASN_CALLBACK(scratch, p - scratch); p = scratch; if(nline) _i_ASN_TEXT_INDENT(1, ilevel); } memcpy(p + 0, _bit_pattern[v >> 4], 4); memcpy(p + 4, _bit_pattern[v & 0x0f], 4); p += 8; } if(!xcan && ((buf - st->buf) % 8) == 0) _i_ASN_TEXT_INDENT(1, ilevel); er.encoded += p - scratch; _ASN_CALLBACK(scratch, p - scratch); p = scratch; if(buf == end) { int v = *buf; int ubits = st->bits_unused; int i; for(i = 7; i >= ubits; i--) *p++ = (v & (1 << i)) ? 0x31 : 0x30; er.encoded += p - scratch; _ASN_CALLBACK(scratch, p - scratch); } if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel - 1); _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } /* * BIT STRING specific contents printer. */ int BIT_STRING_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { static const char *h2c = "0123456789ABCDEF"; char scratch[64]; const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; uint8_t *buf; uint8_t *end; char *p = scratch; (void)td; /* Unused argument */ if(!st || !st->buf) return (cb("", 8, app_key) < 0) ? -1 : 0; ilevel++; buf = st->buf; end = buf + st->size; /* * Hexadecimal dump. */ for(; buf < end; buf++) { if((buf - st->buf) % 16 == 0 && (st->size > 16) && buf != st->buf) { _i_INDENT(1); /* Dump the string */ if(cb(scratch, p - scratch, app_key) < 0) return -1; p = scratch; } *p++ = h2c[*buf >> 4]; *p++ = h2c[*buf & 0x0F]; *p++ = 0x20; } if(p > scratch) { p--; /* Eat the tailing space */ if((st->size > 16)) { _i_INDENT(1); } /* Dump the incomplete 16-bytes row */ if(cb(scratch, p - scratch, app_key) < 0) return -1; } return 0; } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/BIT_STRING.h000066400000000000000000000014701305042567700223410ustar00rootroot00000000000000/*- * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _BIT_STRING_H_ #define _BIT_STRING_H_ #include /* Some help from OCTET STRING */ #ifdef __cplusplus extern "C" { #endif typedef struct BIT_STRING_s { uint8_t *buf; /* BIT STRING body */ int size; /* Size of the above buffer */ int bits_unused;/* Unused trailing bits in the last octet (0..7) */ asn_struct_ctx_t _asn_ctx; /* Parsing across buffer boundaries */ } BIT_STRING_t; extern asn_TYPE_descriptor_t asn_DEF_BIT_STRING; asn_struct_print_f BIT_STRING_print; /* Human-readable output */ asn_constr_check_f BIT_STRING_constraint; xer_type_encoder_f BIT_STRING_encode_xer; #ifdef __cplusplus } #endif #endif /* _BIT_STRING_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/BOOLEAN.c000066400000000000000000000142231305042567700217070ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2005 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include /* * BOOLEAN basic type description. */ static ber_tlv_tag_t asn_DEF_BOOLEAN_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)) }; asn_TYPE_descriptor_t asn_DEF_BOOLEAN = { "BOOLEAN", "BOOLEAN", BOOLEAN_free, BOOLEAN_print, asn_generic_no_constraint, BOOLEAN_decode_ber, BOOLEAN_encode_der, BOOLEAN_decode_xer, BOOLEAN_encode_xer, BOOLEAN_decode_uper, /* Unaligned PER decoder */ BOOLEAN_encode_uper, /* Unaligned PER encoder */ 0, /* Use generic outmost tag fetcher */ asn_DEF_BOOLEAN_tags, sizeof(asn_DEF_BOOLEAN_tags) / sizeof(asn_DEF_BOOLEAN_tags[0]), asn_DEF_BOOLEAN_tags, /* Same as above */ sizeof(asn_DEF_BOOLEAN_tags) / sizeof(asn_DEF_BOOLEAN_tags[0]), 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; /* * Decode BOOLEAN type. */ asn_dec_rval_t BOOLEAN_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **bool_value, const void *buf_ptr, size_t size, int tag_mode) { BOOLEAN_t *st = (BOOLEAN_t *)*bool_value; asn_dec_rval_t rval; ber_tlv_len_t length; ber_tlv_len_t lidx; if(st == NULL) { st = (BOOLEAN_t *)(*bool_value = CALLOC(1, sizeof(*st))); if(st == NULL) { rval.code = RC_FAIL; rval.consumed = 0; return rval; } } ASN_DEBUG("Decoding %s as BOOLEAN (tm=%d)", td->name, tag_mode); /* * Check tags. */ rval = ber_check_tags(opt_codec_ctx, td, 0, buf_ptr, size, tag_mode, 0, &length, 0); if(rval.code != RC_OK) return rval; ASN_DEBUG("Boolean length is %d bytes", (int)length); buf_ptr = ((const char *)buf_ptr) + rval.consumed; size -= rval.consumed; if(length > (ber_tlv_len_t)size) { rval.code = RC_WMORE; rval.consumed = 0; return rval; } /* * Compute boolean value. */ for(*st = 0, lidx = 0; (lidx < length) && *st == 0; lidx++) { /* * Very simple approach: read bytes until the end or * value is already TRUE. * BOOLEAN is not supposed to contain meaningful data anyway. */ *st |= ((const uint8_t *)buf_ptr)[lidx]; } rval.code = RC_OK; rval.consumed += length; ASN_DEBUG("Took %ld/%ld bytes to encode %s, value=%d", (long)rval.consumed, (long)length, td->name, *st); return rval; } asn_enc_rval_t BOOLEAN_encode_der(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t erval; BOOLEAN_t *st = (BOOLEAN_t *)sptr; erval.encoded = der_write_tags(td, 1, tag_mode, 0, tag, cb, app_key); if(erval.encoded == -1) { erval.failed_type = td; erval.structure_ptr = sptr; return erval; } if(cb) { uint8_t bool_value; bool_value = *st ? 0xff : 0; /* 0xff mandated by DER */ if(cb(&bool_value, 1, app_key) < 0) { erval.encoded = -1; erval.failed_type = td; erval.structure_ptr = sptr; return erval; } } erval.encoded += 1; _ASN_ENCODED_OK(erval); } /* * Decode the chunk of XML text encoding INTEGER. */ static enum xer_pbd_rval BOOLEAN__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void *chunk_buf, size_t chunk_size) { BOOLEAN_t *st = (BOOLEAN_t *)sptr; const char *p = (const char *)chunk_buf; (void)td; if(chunk_size && p[0] == 0x3c /* '<' */) { switch(xer_check_tag(chunk_buf, chunk_size, "false")) { case XCT_BOTH: /* "" */ *st = 0; break; case XCT_UNKNOWN_BO: if(xer_check_tag(chunk_buf, chunk_size, "true") != XCT_BOTH) return XPBD_BROKEN_ENCODING; /* "" */ *st = 1; /* Or 0xff as in DER?.. */ break; default: return XPBD_BROKEN_ENCODING; } return XPBD_BODY_CONSUMED; } else { if(xer_is_whitespace(chunk_buf, chunk_size)) return XPBD_NOT_BODY_IGNORE; else return XPBD_BROKEN_ENCODING; } } asn_dec_rval_t BOOLEAN_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, const void *buf_ptr, size_t size) { return xer_decode_primitive(opt_codec_ctx, td, sptr, sizeof(BOOLEAN_t), opt_mname, buf_ptr, size, BOOLEAN__xer_body_decode); } asn_enc_rval_t BOOLEAN_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { const BOOLEAN_t *st = (const BOOLEAN_t *)sptr; asn_enc_rval_t er; (void)ilevel; (void)flags; if(!st) _ASN_ENCODE_FAILED; if(*st) { _ASN_CALLBACK("", 7); er.encoded = 7; } else { _ASN_CALLBACK("", 8); er.encoded = 8; } _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } int BOOLEAN_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const BOOLEAN_t *st = (const BOOLEAN_t *)sptr; const char *buf; size_t buflen; (void)td; /* Unused argument */ (void)ilevel; /* Unused argument */ if(st) { if(*st) { buf = "TRUE"; buflen = 4; } else { buf = "FALSE"; buflen = 5; } } else { buf = ""; buflen = 8; } return (cb(buf, buflen, app_key) < 0) ? -1 : 0; } void BOOLEAN_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { if(td && ptr && !contents_only) { FREEMEM(ptr); } } asn_dec_rval_t BOOLEAN_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { asn_dec_rval_t rv; BOOLEAN_t *st = (BOOLEAN_t *)*sptr; (void)opt_codec_ctx; (void)constraints; if(!st) { st = (BOOLEAN_t *)(*sptr = MALLOC(sizeof(*st))); if(!st) _ASN_DECODE_FAILED; } /* * Extract a single bit */ switch(per_get_few_bits(pd, 1)) { case 1: *st = 1; break; case 0: *st = 0; break; case -1: default: _ASN_DECODE_STARVED; } ASN_DEBUG("%s decoded as %s", td->name, *st ? "TRUE" : "FALSE"); rv.code = RC_OK; rv.consumed = 1; return rv; } asn_enc_rval_t BOOLEAN_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { const BOOLEAN_t *st = (const BOOLEAN_t *)sptr; asn_enc_rval_t er; (void)constraints; if(!st) _ASN_ENCODE_FAILED; per_put_few_bits(po, *st ? 1 : 0, 1); _ASN_ENCODED_OK(er); } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/BOOLEAN.h000066400000000000000000000015731305042567700217200ustar00rootroot00000000000000/*- * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _BOOLEAN_H_ #define _BOOLEAN_H_ #include #ifdef __cplusplus extern "C" { #endif /* * The underlying integer may contain various values, but everything * non-zero is capped to 0xff by the DER encoder. The BER decoder may * yield non-zero values different from 1, beware. */ typedef int BOOLEAN_t; extern asn_TYPE_descriptor_t asn_DEF_BOOLEAN; asn_struct_free_f BOOLEAN_free; asn_struct_print_f BOOLEAN_print; ber_type_decoder_f BOOLEAN_decode_ber; der_type_encoder_f BOOLEAN_encode_der; xer_type_decoder_f BOOLEAN_decode_xer; xer_type_encoder_f BOOLEAN_encode_xer; per_type_decoder_f BOOLEAN_decode_uper; per_type_encoder_f BOOLEAN_encode_uper; #ifdef __cplusplus } #endif #endif /* _BOOLEAN_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/BSIC.c000066400000000000000000000105161305042567700213510ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "BSIC.h" int BSIC_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 63)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void BSIC_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void BSIC_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { BSIC_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int BSIC_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { BSIC_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t BSIC_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { BSIC_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t BSIC_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { BSIC_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t BSIC_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { BSIC_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t BSIC_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { BSIC_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t BSIC_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { BSIC_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t BSIC_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { BSIC_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_BSIC_constr_1 = { { APC_CONSTRAINED, 6, 6, 0, 63 } /* (0..63) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_BSIC_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_BSIC = { "BSIC", "BSIC", BSIC_free, BSIC_print, BSIC_constraint, BSIC_decode_ber, BSIC_encode_der, BSIC_decode_xer, BSIC_encode_xer, BSIC_decode_uper, BSIC_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_BSIC_tags_1, sizeof(asn_DEF_BSIC_tags_1) /sizeof(asn_DEF_BSIC_tags_1[0]), /* 1 */ asn_DEF_BSIC_tags_1, /* Same as above */ sizeof(asn_DEF_BSIC_tags_1) /sizeof(asn_DEF_BSIC_tags_1[0]), /* 1 */ &asn_PER_type_BSIC_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/BSIC.h000066400000000000000000000014431305042567700213550ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _BSIC_H_ #define _BSIC_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* BSIC */ typedef long BSIC_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_BSIC; asn_struct_free_f BSIC_free; asn_struct_print_f BSIC_print; asn_constr_check_f BSIC_constraint; ber_type_decoder_f BSIC_decode_ber; der_type_encoder_f BSIC_encode_der; xer_type_decoder_f BSIC_decode_xer; xer_type_encoder_f BSIC_encode_xer; per_type_decoder_f BSIC_decode_uper; per_type_encoder_f BSIC_encode_uper; #ifdef __cplusplus } #endif #endif /* _BSIC_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/BSICAndCarrier.c000066400000000000000000000041401305042567700233000ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "BSICAndCarrier.h" static asn_TYPE_member_t asn_MBR_BSICAndCarrier_1[] = { { ATF_NOFLAGS, 0, offsetof(struct BSICAndCarrier, carrier), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BCCHCarrier, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "carrier" }, { ATF_NOFLAGS, 0, offsetof(struct BSICAndCarrier, bsic), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BSIC, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "bsic" }, }; static ber_tlv_tag_t asn_DEF_BSICAndCarrier_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_BSICAndCarrier_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* carrier at 304 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* bsic at 306 */ }; static asn_SEQUENCE_specifics_t asn_SPC_BSICAndCarrier_specs_1 = { sizeof(struct BSICAndCarrier), offsetof(struct BSICAndCarrier, _asn_ctx), asn_MAP_BSICAndCarrier_tag2el_1, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_BSICAndCarrier = { "BSICAndCarrier", "BSICAndCarrier", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_BSICAndCarrier_tags_1, sizeof(asn_DEF_BSICAndCarrier_tags_1) /sizeof(asn_DEF_BSICAndCarrier_tags_1[0]), /* 1 */ asn_DEF_BSICAndCarrier_tags_1, /* Same as above */ sizeof(asn_DEF_BSICAndCarrier_tags_1) /sizeof(asn_DEF_BSICAndCarrier_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_BSICAndCarrier_1, 2, /* Elements count */ &asn_SPC_BSICAndCarrier_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/BSICAndCarrier.h000066400000000000000000000013401305042567700233040ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _BSICAndCarrier_H_ #define _BSICAndCarrier_H_ #include /* Including external dependencies */ #include "BCCHCarrier.h" #include "BSIC.h" #include #ifdef __cplusplus extern "C" { #endif /* BSICAndCarrier */ typedef struct BSICAndCarrier { BCCHCarrier_t carrier; BSIC_t bsic; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } BSICAndCarrier_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_BSICAndCarrier; #ifdef __cplusplus } #endif #endif /* _BSICAndCarrier_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/BTSPosition.c000066400000000000000000000112471305042567700230100ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "BTSPosition.h" int BTSPosition_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const Ext_GeographicalInformation_t *st = (const Ext_GeographicalInformation_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } size = st->size; if((size >= 1 && size <= 20)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using Ext_GeographicalInformation, * so here we adjust the DEF accordingly. */ static void BTSPosition_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_Ext_GeographicalInformation.free_struct; td->print_struct = asn_DEF_Ext_GeographicalInformation.print_struct; td->ber_decoder = asn_DEF_Ext_GeographicalInformation.ber_decoder; td->der_encoder = asn_DEF_Ext_GeographicalInformation.der_encoder; td->xer_decoder = asn_DEF_Ext_GeographicalInformation.xer_decoder; td->xer_encoder = asn_DEF_Ext_GeographicalInformation.xer_encoder; td->uper_decoder = asn_DEF_Ext_GeographicalInformation.uper_decoder; td->uper_encoder = asn_DEF_Ext_GeographicalInformation.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_Ext_GeographicalInformation.per_constraints; td->elements = asn_DEF_Ext_GeographicalInformation.elements; td->elements_count = asn_DEF_Ext_GeographicalInformation.elements_count; td->specifics = asn_DEF_Ext_GeographicalInformation.specifics; } void BTSPosition_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { BTSPosition_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int BTSPosition_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { BTSPosition_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t BTSPosition_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { BTSPosition_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t BTSPosition_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { BTSPosition_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t BTSPosition_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { BTSPosition_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t BTSPosition_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { BTSPosition_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t BTSPosition_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { BTSPosition_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t BTSPosition_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { BTSPosition_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static ber_tlv_tag_t asn_DEF_BTSPosition_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) }; asn_TYPE_descriptor_t asn_DEF_BTSPosition = { "BTSPosition", "BTSPosition", BTSPosition_free, BTSPosition_print, BTSPosition_constraint, BTSPosition_decode_ber, BTSPosition_encode_der, BTSPosition_decode_xer, BTSPosition_encode_xer, BTSPosition_decode_uper, BTSPosition_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_BTSPosition_tags_1, sizeof(asn_DEF_BTSPosition_tags_1) /sizeof(asn_DEF_BTSPosition_tags_1[0]), /* 1 */ asn_DEF_BTSPosition_tags_1, /* Same as above */ sizeof(asn_DEF_BTSPosition_tags_1) /sizeof(asn_DEF_BTSPosition_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/BTSPosition.h000066400000000000000000000016631305042567700230160ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _BTSPosition_H_ #define _BTSPosition_H_ #include /* Including external dependencies */ #include "Ext-GeographicalInformation.h" #ifdef __cplusplus extern "C" { #endif /* BTSPosition */ typedef Ext_GeographicalInformation_t BTSPosition_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_BTSPosition; asn_struct_free_f BTSPosition_free; asn_struct_print_f BTSPosition_print; asn_constr_check_f BTSPosition_constraint; ber_type_decoder_f BTSPosition_decode_ber; der_type_encoder_f BTSPosition_encode_der; xer_type_decoder_f BTSPosition_decode_xer; xer_type_encoder_f BTSPosition_encode_xer; per_type_decoder_f BTSPosition_decode_uper; per_type_encoder_f BTSPosition_encode_uper; #ifdef __cplusplus } #endif #endif /* _BTSPosition_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/BadSignalElement.c000066400000000000000000000056741305042567700240000ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "BadSignalElement.h" static int memb_badSignalID_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 3)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_badSignalID_constr_3 = { { APC_CONSTRAINED, 2, 2, 0, 3 } /* (0..3) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_BadSignalElement_1[] = { { ATF_NOFLAGS, 0, offsetof(struct BadSignalElement, badSVID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SVID, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "badSVID" }, { ATF_POINTER, 1, offsetof(struct BadSignalElement, badSignalID), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_badSignalID_constraint_1, &asn_PER_memb_badSignalID_constr_3, 0, "badSignalID" }, }; static int asn_MAP_BadSignalElement_oms_1[] = { 1 }; static ber_tlv_tag_t asn_DEF_BadSignalElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_BadSignalElement_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* badSVID at 1300 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* badSignalID at 1301 */ }; static asn_SEQUENCE_specifics_t asn_SPC_BadSignalElement_specs_1 = { sizeof(struct BadSignalElement), offsetof(struct BadSignalElement, _asn_ctx), asn_MAP_BadSignalElement_tag2el_1, 2, /* Count of tags in the map */ asn_MAP_BadSignalElement_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_BadSignalElement = { "BadSignalElement", "BadSignalElement", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_BadSignalElement_tags_1, sizeof(asn_DEF_BadSignalElement_tags_1) /sizeof(asn_DEF_BadSignalElement_tags_1[0]), /* 1 */ asn_DEF_BadSignalElement_tags_1, /* Same as above */ sizeof(asn_DEF_BadSignalElement_tags_1) /sizeof(asn_DEF_BadSignalElement_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_BadSignalElement_1, 2, /* Elements count */ &asn_SPC_BadSignalElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/BadSignalElement.h000066400000000000000000000013751305042567700237770ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _BadSignalElement_H_ #define _BadSignalElement_H_ #include /* Including external dependencies */ #include "SVID.h" #include #include #ifdef __cplusplus extern "C" { #endif /* BadSignalElement */ typedef struct BadSignalElement { SVID_t badSVID; long *badSignalID /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } BadSignalElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_BadSignalElement; #ifdef __cplusplus } #endif #endif /* _BadSignalElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/BitNumber.c000066400000000000000000000110311305042567700225110ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "BitNumber.h" int BitNumber_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 156)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void BitNumber_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void BitNumber_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { BitNumber_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int BitNumber_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { BitNumber_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t BitNumber_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { BitNumber_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t BitNumber_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { BitNumber_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t BitNumber_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { BitNumber_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t BitNumber_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { BitNumber_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t BitNumber_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { BitNumber_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t BitNumber_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { BitNumber_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_BitNumber_constr_1 = { { APC_CONSTRAINED, 8, 8, 0, 156 } /* (0..156) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_BitNumber_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_BitNumber = { "BitNumber", "BitNumber", BitNumber_free, BitNumber_print, BitNumber_constraint, BitNumber_decode_ber, BitNumber_encode_der, BitNumber_decode_xer, BitNumber_encode_xer, BitNumber_decode_uper, BitNumber_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_BitNumber_tags_1, sizeof(asn_DEF_BitNumber_tags_1) /sizeof(asn_DEF_BitNumber_tags_1[0]), /* 1 */ asn_DEF_BitNumber_tags_1, /* Same as above */ sizeof(asn_DEF_BitNumber_tags_1) /sizeof(asn_DEF_BitNumber_tags_1[0]), /* 1 */ &asn_PER_type_BitNumber_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/BitNumber.h000066400000000000000000000015561305042567700225310ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _BitNumber_H_ #define _BitNumber_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* BitNumber */ typedef long BitNumber_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_BitNumber; asn_struct_free_f BitNumber_free; asn_struct_print_f BitNumber_print; asn_constr_check_f BitNumber_constraint; ber_type_decoder_f BitNumber_decode_ber; der_type_encoder_f BitNumber_encode_der; xer_type_decoder_f BitNumber_decode_xer; xer_type_encoder_f BitNumber_encode_xer; per_type_decoder_f BitNumber_decode_uper; per_type_encoder_f BitNumber_encode_uper; #ifdef __cplusplus } #endif #endif /* _BitNumber_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/CalcAssistanceBTS.c000066400000000000000000000043031305042567700240570ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "CalcAssistanceBTS.h" static asn_TYPE_member_t asn_MBR_CalcAssistanceBTS_1[] = { { ATF_NOFLAGS, 0, offsetof(struct CalcAssistanceBTS, fineRTD), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_FineRTD, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "fineRTD" }, { ATF_NOFLAGS, 0, offsetof(struct CalcAssistanceBTS, referenceWGS84), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_ReferenceWGS84, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "referenceWGS84" }, }; static ber_tlv_tag_t asn_DEF_CalcAssistanceBTS_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_CalcAssistanceBTS_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* fineRTD at 241 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* referenceWGS84 at 243 */ }; static asn_SEQUENCE_specifics_t asn_SPC_CalcAssistanceBTS_specs_1 = { sizeof(struct CalcAssistanceBTS), offsetof(struct CalcAssistanceBTS, _asn_ctx), asn_MAP_CalcAssistanceBTS_tag2el_1, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_CalcAssistanceBTS = { "CalcAssistanceBTS", "CalcAssistanceBTS", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_CalcAssistanceBTS_tags_1, sizeof(asn_DEF_CalcAssistanceBTS_tags_1) /sizeof(asn_DEF_CalcAssistanceBTS_tags_1[0]), /* 1 */ asn_DEF_CalcAssistanceBTS_tags_1, /* Same as above */ sizeof(asn_DEF_CalcAssistanceBTS_tags_1) /sizeof(asn_DEF_CalcAssistanceBTS_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_CalcAssistanceBTS_1, 2, /* Elements count */ &asn_SPC_CalcAssistanceBTS_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/CalcAssistanceBTS.h000066400000000000000000000014131305042567700240630ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _CalcAssistanceBTS_H_ #define _CalcAssistanceBTS_H_ #include /* Including external dependencies */ #include "FineRTD.h" #include "ReferenceWGS84.h" #include #ifdef __cplusplus extern "C" { #endif /* CalcAssistanceBTS */ typedef struct CalcAssistanceBTS { FineRTD_t fineRTD; ReferenceWGS84_t referenceWGS84; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } CalcAssistanceBTS_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_CalcAssistanceBTS; #ifdef __cplusplus } #endif #endif /* _CalcAssistanceBTS_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/CellID.c000066400000000000000000000106511305042567700217250ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "CellID.h" int CellID_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 65535)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void CellID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void CellID_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { CellID_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int CellID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { CellID_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t CellID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { CellID_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t CellID_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { CellID_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t CellID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { CellID_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t CellID_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { CellID_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t CellID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { CellID_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t CellID_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { CellID_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_CellID_constr_1 = { { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_CellID_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_CellID = { "CellID", "CellID", CellID_free, CellID_print, CellID_constraint, CellID_decode_ber, CellID_encode_der, CellID_decode_xer, CellID_encode_xer, CellID_decode_uper, CellID_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_CellID_tags_1, sizeof(asn_DEF_CellID_tags_1) /sizeof(asn_DEF_CellID_tags_1[0]), /* 1 */ asn_DEF_CellID_tags_1, /* Same as above */ sizeof(asn_DEF_CellID_tags_1) /sizeof(asn_DEF_CellID_tags_1[0]), /* 1 */ &asn_PER_type_CellID_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/CellID.h000066400000000000000000000015011305042567700217240ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _CellID_H_ #define _CellID_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* CellID */ typedef long CellID_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_CellID; asn_struct_free_f CellID_free; asn_struct_print_f CellID_print; asn_constr_check_f CellID_constraint; ber_type_decoder_f CellID_decode_ber; der_type_encoder_f CellID_encode_der; xer_type_decoder_f CellID_decode_xer; xer_type_encoder_f CellID_encode_xer; per_type_decoder_f CellID_decode_uper; per_type_encoder_f CellID_encode_uper; #ifdef __cplusplus } #endif #endif /* _CellID_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/CellIDAndLAC.c000066400000000000000000000041241305042567700226660ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "CellIDAndLAC.h" static asn_TYPE_member_t asn_MBR_CellIDAndLAC_1[] = { { ATF_NOFLAGS, 0, offsetof(struct CellIDAndLAC, referenceLAC), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_LAC, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "referenceLAC" }, { ATF_NOFLAGS, 0, offsetof(struct CellIDAndLAC, referenceCI), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_CellID, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "referenceCI" }, }; static ber_tlv_tag_t asn_DEF_CellIDAndLAC_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_CellIDAndLAC_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* referenceLAC at 313 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* referenceCI at 315 */ }; static asn_SEQUENCE_specifics_t asn_SPC_CellIDAndLAC_specs_1 = { sizeof(struct CellIDAndLAC), offsetof(struct CellIDAndLAC, _asn_ctx), asn_MAP_CellIDAndLAC_tag2el_1, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_CellIDAndLAC = { "CellIDAndLAC", "CellIDAndLAC", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_CellIDAndLAC_tags_1, sizeof(asn_DEF_CellIDAndLAC_tags_1) /sizeof(asn_DEF_CellIDAndLAC_tags_1[0]), /* 1 */ asn_DEF_CellIDAndLAC_tags_1, /* Same as above */ sizeof(asn_DEF_CellIDAndLAC_tags_1) /sizeof(asn_DEF_CellIDAndLAC_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_CellIDAndLAC_1, 2, /* Elements count */ &asn_SPC_CellIDAndLAC_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/CellIDAndLAC.h000066400000000000000000000013221305042567700226700ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _CellIDAndLAC_H_ #define _CellIDAndLAC_H_ #include /* Including external dependencies */ #include "LAC.h" #include "CellID.h" #include #ifdef __cplusplus extern "C" { #endif /* CellIDAndLAC */ typedef struct CellIDAndLAC { LAC_t referenceLAC; CellID_t referenceCI; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } CellIDAndLAC_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_CellIDAndLAC; #ifdef __cplusplus } #endif #endif /* _CellIDAndLAC_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ControlHeader.c000066400000000000000000000114501305042567700233600ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "ControlHeader.h" static asn_TYPE_member_t asn_MBR_ControlHeader_1[] = { { ATF_POINTER, 9, offsetof(struct ControlHeader, referenceTime), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_ReferenceTime, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "referenceTime" }, { ATF_POINTER, 8, offsetof(struct ControlHeader, refLocation), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_RefLocation, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "refLocation" }, { ATF_POINTER, 7, offsetof(struct ControlHeader, dgpsCorrections), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_DGPSCorrections, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "dgpsCorrections" }, { ATF_POINTER, 6, offsetof(struct ControlHeader, navigationModel), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NavigationModel, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "navigationModel" }, { ATF_POINTER, 5, offsetof(struct ControlHeader, ionosphericModel), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_IonosphericModel, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ionosphericModel" }, { ATF_POINTER, 4, offsetof(struct ControlHeader, utcModel), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_UTCModel, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "utcModel" }, { ATF_POINTER, 3, offsetof(struct ControlHeader, almanac), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Almanac, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "almanac" }, { ATF_POINTER, 2, offsetof(struct ControlHeader, acquisAssist), (ASN_TAG_CLASS_CONTEXT | (7 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_AcquisAssist, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "acquisAssist" }, { ATF_POINTER, 1, offsetof(struct ControlHeader, realTimeIntegrity), (ASN_TAG_CLASS_CONTEXT | (8 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOf_BadSatelliteSet, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "realTimeIntegrity" }, }; static int asn_MAP_ControlHeader_oms_1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; static ber_tlv_tag_t asn_DEF_ControlHeader_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_ControlHeader_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* referenceTime at 574 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* refLocation at 575 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* dgpsCorrections at 576 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* navigationModel at 577 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* ionosphericModel at 578 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* utcModel at 579 */ { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* almanac at 580 */ { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 }, /* acquisAssist at 581 */ { (ASN_TAG_CLASS_CONTEXT | (8 << 2)), 8, 0, 0 } /* realTimeIntegrity at 582 */ }; static asn_SEQUENCE_specifics_t asn_SPC_ControlHeader_specs_1 = { sizeof(struct ControlHeader), offsetof(struct ControlHeader, _asn_ctx), asn_MAP_ControlHeader_tag2el_1, 9, /* Count of tags in the map */ asn_MAP_ControlHeader_oms_1, /* Optional members */ 9, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_ControlHeader = { "ControlHeader", "ControlHeader", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_ControlHeader_tags_1, sizeof(asn_DEF_ControlHeader_tags_1) /sizeof(asn_DEF_ControlHeader_tags_1[0]), /* 1 */ asn_DEF_ControlHeader_tags_1, /* Same as above */ sizeof(asn_DEF_ControlHeader_tags_1) /sizeof(asn_DEF_ControlHeader_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_ControlHeader_1, 9, /* Elements count */ &asn_SPC_ControlHeader_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ControlHeader.h000066400000000000000000000031271305042567700233670ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _ControlHeader_H_ #define _ControlHeader_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct ReferenceTime; struct RefLocation; struct DGPSCorrections; struct NavigationModel; struct IonosphericModel; struct UTCModel; struct Almanac; struct AcquisAssist; struct SeqOf_BadSatelliteSet; /* ControlHeader */ typedef struct ControlHeader { struct ReferenceTime *referenceTime /* OPTIONAL */; struct RefLocation *refLocation /* OPTIONAL */; struct DGPSCorrections *dgpsCorrections /* OPTIONAL */; struct NavigationModel *navigationModel /* OPTIONAL */; struct IonosphericModel *ionosphericModel /* OPTIONAL */; struct UTCModel *utcModel /* OPTIONAL */; struct Almanac *almanac /* OPTIONAL */; struct AcquisAssist *acquisAssist /* OPTIONAL */; struct SeqOf_BadSatelliteSet *realTimeIntegrity /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } ControlHeader_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_ControlHeader; #ifdef __cplusplus } #endif /* Referred external types */ #include "ReferenceTime.h" #include "RefLocation.h" #include "DGPSCorrections.h" #include "NavigationModel.h" #include "IonosphericModel.h" #include "UTCModel.h" #include "Almanac.h" #include "AcquisAssist.h" #include "SeqOf-BadSatelliteSet.h" #endif /* _ControlHeader_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/DGANSSSgnElement.c000066400000000000000000000137271305042567700236010ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "DGANSSSgnElement.h" static int memb_iod_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1023)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_udre_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 3)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_pseudoRangeCor_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -2047 && value <= 2047)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_rangeRateCor_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -127 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_iod_constr_3 = { { APC_CONSTRAINED, 10, 10, 0, 1023 } /* (0..1023) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_udre_constr_4 = { { APC_CONSTRAINED, 2, 2, 0, 3 } /* (0..3) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_pseudoRangeCor_constr_5 = { { APC_CONSTRAINED, 12, 12, -2047, 2047 } /* (-2047..2047) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_rangeRateCor_constr_6 = { { APC_CONSTRAINED, 8, 8, -127, 127 } /* (-127..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_DGANSSSgnElement_1[] = { { ATF_NOFLAGS, 0, offsetof(struct DGANSSSgnElement, svID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SVID, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "svID" }, { ATF_NOFLAGS, 0, offsetof(struct DGANSSSgnElement, iod), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_iod_constraint_1, &asn_PER_memb_iod_constr_3, 0, "iod" }, { ATF_NOFLAGS, 0, offsetof(struct DGANSSSgnElement, udre), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_udre_constraint_1, &asn_PER_memb_udre_constr_4, 0, "udre" }, { ATF_NOFLAGS, 0, offsetof(struct DGANSSSgnElement, pseudoRangeCor), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_pseudoRangeCor_constraint_1, &asn_PER_memb_pseudoRangeCor_constr_5, 0, "pseudoRangeCor" }, { ATF_NOFLAGS, 0, offsetof(struct DGANSSSgnElement, rangeRateCor), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_rangeRateCor_constraint_1, &asn_PER_memb_rangeRateCor_constr_6, 0, "rangeRateCor" }, }; static ber_tlv_tag_t asn_DEF_DGANSSSgnElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_DGANSSSgnElement_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* svID at 1207 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* iod at 1210 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* udre at 1213 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* pseudoRangeCor at 1217 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* rangeRateCor at 1221 */ }; static asn_SEQUENCE_specifics_t asn_SPC_DGANSSSgnElement_specs_1 = { sizeof(struct DGANSSSgnElement), offsetof(struct DGANSSSgnElement, _asn_ctx), asn_MAP_DGANSSSgnElement_tag2el_1, 5, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_DGANSSSgnElement = { "DGANSSSgnElement", "DGANSSSgnElement", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_DGANSSSgnElement_tags_1, sizeof(asn_DEF_DGANSSSgnElement_tags_1) /sizeof(asn_DEF_DGANSSSgnElement_tags_1[0]), /* 1 */ asn_DEF_DGANSSSgnElement_tags_1, /* Same as above */ sizeof(asn_DEF_DGANSSSgnElement_tags_1) /sizeof(asn_DEF_DGANSSSgnElement_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_DGANSSSgnElement_1, 5, /* Elements count */ &asn_SPC_DGANSSSgnElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/DGANSSSgnElement.h000066400000000000000000000014341305042567700235760ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _DGANSSSgnElement_H_ #define _DGANSSSgnElement_H_ #include /* Including external dependencies */ #include "SVID.h" #include #include #ifdef __cplusplus extern "C" { #endif /* DGANSSSgnElement */ typedef struct DGANSSSgnElement { SVID_t svID; long iod; long udre; long pseudoRangeCor; long rangeRateCor; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } DGANSSSgnElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_DGANSSSgnElement; #ifdef __cplusplus } #endif #endif /* _DGANSSSgnElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/DGPSCorrections.c000066400000000000000000000075221305042567700236040ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "DGPSCorrections.h" static int memb_gpsTOW_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 604799)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_status_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 7)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_gpsTOW_constr_2 = { { APC_CONSTRAINED, 20, -1, 0, 604799 } /* (0..604799) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_status_constr_3 = { { APC_CONSTRAINED, 3, 3, 0, 7 } /* (0..7) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_DGPSCorrections_1[] = { { ATF_NOFLAGS, 0, offsetof(struct DGPSCorrections, gpsTOW), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_gpsTOW_constraint_1, &asn_PER_memb_gpsTOW_constr_2, 0, "gpsTOW" }, { ATF_NOFLAGS, 0, offsetof(struct DGPSCorrections, status), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_status_constraint_1, &asn_PER_memb_status_constr_3, 0, "status" }, { ATF_NOFLAGS, 0, offsetof(struct DGPSCorrections, satList), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfSatElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "satList" }, }; static ber_tlv_tag_t asn_DEF_DGPSCorrections_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_DGPSCorrections_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* gpsTOW at 655 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* status at 656 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* satList at 659 */ }; static asn_SEQUENCE_specifics_t asn_SPC_DGPSCorrections_specs_1 = { sizeof(struct DGPSCorrections), offsetof(struct DGPSCorrections, _asn_ctx), asn_MAP_DGPSCorrections_tag2el_1, 3, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_DGPSCorrections = { "DGPSCorrections", "DGPSCorrections", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_DGPSCorrections_tags_1, sizeof(asn_DEF_DGPSCorrections_tags_1) /sizeof(asn_DEF_DGPSCorrections_tags_1[0]), /* 1 */ asn_DEF_DGPSCorrections_tags_1, /* Same as above */ sizeof(asn_DEF_DGPSCorrections_tags_1) /sizeof(asn_DEF_DGPSCorrections_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_DGPSCorrections_1, 3, /* Elements count */ &asn_SPC_DGPSCorrections_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/DGPSCorrections.h000066400000000000000000000014071305042567700236050ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _DGPSCorrections_H_ #define _DGPSCorrections_H_ #include /* Including external dependencies */ #include #include "SeqOfSatElement.h" #include #ifdef __cplusplus extern "C" { #endif /* DGPSCorrections */ typedef struct DGPSCorrections { long gpsTOW; long status; SeqOfSatElement_t satList; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } DGPSCorrections_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_DGPSCorrections; #ifdef __cplusplus } #endif #endif /* _DGPSCorrections_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ENUMERATED.c000066400000000000000000000041241305042567700222600ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2005, 2006 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include #include /* Encoder and decoder of a primitive type */ /* * ENUMERATED basic type description. */ static ber_tlv_tag_t asn_DEF_ENUMERATED_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; asn_TYPE_descriptor_t asn_DEF_ENUMERATED = { "ENUMERATED", "ENUMERATED", ASN__PRIMITIVE_TYPE_free, INTEGER_print, /* Implemented in terms of INTEGER */ asn_generic_no_constraint, ber_decode_primitive, INTEGER_encode_der, /* Implemented in terms of INTEGER */ INTEGER_decode_xer, /* This is temporary! */ INTEGER_encode_xer, ENUMERATED_decode_uper, /* Unaligned PER decoder */ ENUMERATED_encode_uper, /* Unaligned PER encoder */ 0, /* Use generic outmost tag fetcher */ asn_DEF_ENUMERATED_tags, sizeof(asn_DEF_ENUMERATED_tags) / sizeof(asn_DEF_ENUMERATED_tags[0]), asn_DEF_ENUMERATED_tags, /* Same as above */ sizeof(asn_DEF_ENUMERATED_tags) / sizeof(asn_DEF_ENUMERATED_tags[0]), 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; asn_dec_rval_t ENUMERATED_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { asn_dec_rval_t rval; ENUMERATED_t *st = (ENUMERATED_t *)*sptr; long value; void *vptr = &value; if(!st) { st = (ENUMERATED_t *)(*sptr = CALLOC(1, sizeof(*st))); if(!st) _ASN_DECODE_FAILED; } rval = NativeEnumerated_decode_uper(opt_codec_ctx, td, constraints, (void **)&vptr, pd); if(rval.code == RC_OK) if(asn_long2INTEGER(st, value)) rval.code = RC_FAIL; return rval; } asn_enc_rval_t ENUMERATED_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { ENUMERATED_t *st = (ENUMERATED_t *)sptr; long value; if(asn_INTEGER2long(st, &value)) _ASN_ENCODE_FAILED; return NativeEnumerated_encode_uper(td, constraints, &value, po); } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ENUMERATED.h000066400000000000000000000010201305042567700222550ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2005 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _ENUMERATED_H_ #define _ENUMERATED_H_ #include #ifdef __cplusplus extern "C" { #endif typedef INTEGER_t ENUMERATED_t; /* Implemented via INTEGER */ extern asn_TYPE_descriptor_t asn_DEF_ENUMERATED; per_type_decoder_f ENUMERATED_decode_uper; per_type_encoder_f ENUMERATED_encode_uper; #ifdef __cplusplus } #endif #endif /* _ENUMERATED_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/EOTDQuality.c000066400000000000000000000067521305042567700227440ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "EOTDQuality.h" static int memb_nbrOfMeasurements_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 7)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_stdOfEOTD_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 31)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_nbrOfMeasurements_constr_2 = { { APC_CONSTRAINED, 3, 3, 0, 7 } /* (0..7) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_stdOfEOTD_constr_3 = { { APC_CONSTRAINED, 5, 5, 0, 31 } /* (0..31) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_EOTDQuality_1[] = { { ATF_NOFLAGS, 0, offsetof(struct EOTDQuality, nbrOfMeasurements), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_nbrOfMeasurements_constraint_1, &asn_PER_memb_nbrOfMeasurements_constr_2, 0, "nbrOfMeasurements" }, { ATF_NOFLAGS, 0, offsetof(struct EOTDQuality, stdOfEOTD), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_stdOfEOTD_constraint_1, &asn_PER_memb_stdOfEOTD_constr_3, 0, "stdOfEOTD" }, }; static ber_tlv_tag_t asn_DEF_EOTDQuality_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_EOTDQuality_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* nbrOfMeasurements at 393 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* stdOfEOTD at 394 */ }; static asn_SEQUENCE_specifics_t asn_SPC_EOTDQuality_specs_1 = { sizeof(struct EOTDQuality), offsetof(struct EOTDQuality, _asn_ctx), asn_MAP_EOTDQuality_tag2el_1, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_EOTDQuality = { "EOTDQuality", "EOTDQuality", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_EOTDQuality_tags_1, sizeof(asn_DEF_EOTDQuality_tags_1) /sizeof(asn_DEF_EOTDQuality_tags_1[0]), /* 1 */ asn_DEF_EOTDQuality_tags_1, /* Same as above */ sizeof(asn_DEF_EOTDQuality_tags_1) /sizeof(asn_DEF_EOTDQuality_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_EOTDQuality_1, 2, /* Elements count */ &asn_SPC_EOTDQuality_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/EOTDQuality.h000066400000000000000000000012771305042567700227460ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _EOTDQuality_H_ #define _EOTDQuality_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* EOTDQuality */ typedef struct EOTDQuality { long nbrOfMeasurements; long stdOfEOTD; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } EOTDQuality_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_EOTDQuality; #ifdef __cplusplus } #endif #endif /* _EOTDQuality_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/EnvironmentCharacter.c000066400000000000000000000127701305042567700247560ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "EnvironmentCharacter.h" int EnvironmentCharacter_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { /* Replace with underlying type checker */ td->check_constraints = asn_DEF_ENUMERATED.check_constraints; return td->check_constraints(td, sptr, ctfailcb, app_key); } /* * This type is implemented using ENUMERATED, * so here we adjust the DEF accordingly. */ static void EnvironmentCharacter_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_ENUMERATED.free_struct; td->print_struct = asn_DEF_ENUMERATED.print_struct; td->ber_decoder = asn_DEF_ENUMERATED.ber_decoder; td->der_encoder = asn_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; td->uper_encoder = asn_DEF_ENUMERATED.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_ENUMERATED.per_constraints; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ } void EnvironmentCharacter_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { EnvironmentCharacter_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int EnvironmentCharacter_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { EnvironmentCharacter_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t EnvironmentCharacter_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { EnvironmentCharacter_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t EnvironmentCharacter_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { EnvironmentCharacter_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t EnvironmentCharacter_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { EnvironmentCharacter_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t EnvironmentCharacter_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { EnvironmentCharacter_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t EnvironmentCharacter_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { EnvironmentCharacter_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t EnvironmentCharacter_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { EnvironmentCharacter_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_EnvironmentCharacter_constr_1 = { { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 2 } /* (0..2,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_INTEGER_enum_map_t asn_MAP_EnvironmentCharacter_value2enum_1[] = { { 0, 7, "badArea" }, { 1, 10, "notBadArea" }, { 2, 9, "mixedArea" } /* This list is extensible */ }; static unsigned int asn_MAP_EnvironmentCharacter_enum2value_1[] = { 0, /* badArea(0) */ 2, /* mixedArea(2) */ 1 /* notBadArea(1) */ /* This list is extensible */ }; static asn_INTEGER_specifics_t asn_SPC_EnvironmentCharacter_specs_1 = { asn_MAP_EnvironmentCharacter_value2enum_1, /* "tag" => N; sorted by tag */ asn_MAP_EnvironmentCharacter_enum2value_1, /* N => "tag"; sorted by N */ 3, /* Number of elements in the maps */ 4, /* Extensions before this member */ 1, /* Strict enumeration */ 0, /* Native long size */ 0 }; static ber_tlv_tag_t asn_DEF_EnvironmentCharacter_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; asn_TYPE_descriptor_t asn_DEF_EnvironmentCharacter = { "EnvironmentCharacter", "EnvironmentCharacter", EnvironmentCharacter_free, EnvironmentCharacter_print, EnvironmentCharacter_constraint, EnvironmentCharacter_decode_ber, EnvironmentCharacter_encode_der, EnvironmentCharacter_decode_xer, EnvironmentCharacter_encode_xer, EnvironmentCharacter_decode_uper, EnvironmentCharacter_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_EnvironmentCharacter_tags_1, sizeof(asn_DEF_EnvironmentCharacter_tags_1) /sizeof(asn_DEF_EnvironmentCharacter_tags_1[0]), /* 1 */ asn_DEF_EnvironmentCharacter_tags_1, /* Same as above */ sizeof(asn_DEF_EnvironmentCharacter_tags_1) /sizeof(asn_DEF_EnvironmentCharacter_tags_1[0]), /* 1 */ &asn_PER_type_EnvironmentCharacter_constr_1, 0, 0, /* Defined elsewhere */ &asn_SPC_EnvironmentCharacter_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/EnvironmentCharacter.h000066400000000000000000000023761305042567700247640ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _EnvironmentCharacter_H_ #define _EnvironmentCharacter_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum EnvironmentCharacter { EnvironmentCharacter_badArea = 0, EnvironmentCharacter_notBadArea = 1, EnvironmentCharacter_mixedArea = 2 /* * Enumeration is extensible */ } e_EnvironmentCharacter; /* EnvironmentCharacter */ typedef ENUMERATED_t EnvironmentCharacter_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_EnvironmentCharacter; asn_struct_free_f EnvironmentCharacter_free; asn_struct_print_f EnvironmentCharacter_print; asn_constr_check_f EnvironmentCharacter_constraint; ber_type_decoder_f EnvironmentCharacter_decode_ber; der_type_encoder_f EnvironmentCharacter_encode_der; xer_type_decoder_f EnvironmentCharacter_decode_xer; xer_type_encoder_f EnvironmentCharacter_encode_xer; per_type_decoder_f EnvironmentCharacter_decode_uper; per_type_encoder_f EnvironmentCharacter_encode_uper; #ifdef __cplusplus } #endif #endif /* _EnvironmentCharacter_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/EphemerisSubframe1Reserved.c000066400000000000000000000136251305042567700260240ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "EphemerisSubframe1Reserved.h" static int memb_reserved1_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 8388607)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_reserved2_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 16777215)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_reserved3_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 16777215)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_reserved4_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 65535)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_reserved1_constr_2 = { { APC_CONSTRAINED, 23, -1, 0, 8388607 } /* (0..8388607) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_reserved2_constr_3 = { { APC_CONSTRAINED, 24, -1, 0, 16777215 } /* (0..16777215) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_reserved3_constr_4 = { { APC_CONSTRAINED, 24, -1, 0, 16777215 } /* (0..16777215) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_reserved4_constr_5 = { { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_EphemerisSubframe1Reserved_1[] = { { ATF_NOFLAGS, 0, offsetof(struct EphemerisSubframe1Reserved, reserved1), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_reserved1_constraint_1, &asn_PER_memb_reserved1_constr_2, 0, "reserved1" }, { ATF_NOFLAGS, 0, offsetof(struct EphemerisSubframe1Reserved, reserved2), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_reserved2_constraint_1, &asn_PER_memb_reserved2_constr_3, 0, "reserved2" }, { ATF_NOFLAGS, 0, offsetof(struct EphemerisSubframe1Reserved, reserved3), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_reserved3_constraint_1, &asn_PER_memb_reserved3_constr_4, 0, "reserved3" }, { ATF_NOFLAGS, 0, offsetof(struct EphemerisSubframe1Reserved, reserved4), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_reserved4_constraint_1, &asn_PER_memb_reserved4_constr_5, 0, "reserved4" }, }; static ber_tlv_tag_t asn_DEF_EphemerisSubframe1Reserved_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_EphemerisSubframe1Reserved_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* reserved1 at 755 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* reserved2 at 756 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* reserved3 at 757 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* reserved4 at 758 */ }; static asn_SEQUENCE_specifics_t asn_SPC_EphemerisSubframe1Reserved_specs_1 = { sizeof(struct EphemerisSubframe1Reserved), offsetof(struct EphemerisSubframe1Reserved, _asn_ctx), asn_MAP_EphemerisSubframe1Reserved_tag2el_1, 4, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_EphemerisSubframe1Reserved = { "EphemerisSubframe1Reserved", "EphemerisSubframe1Reserved", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_EphemerisSubframe1Reserved_tags_1, sizeof(asn_DEF_EphemerisSubframe1Reserved_tags_1) /sizeof(asn_DEF_EphemerisSubframe1Reserved_tags_1[0]), /* 1 */ asn_DEF_EphemerisSubframe1Reserved_tags_1, /* Same as above */ sizeof(asn_DEF_EphemerisSubframe1Reserved_tags_1) /sizeof(asn_DEF_EphemerisSubframe1Reserved_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_EphemerisSubframe1Reserved_1, 4, /* Elements count */ &asn_SPC_EphemerisSubframe1Reserved_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/EphemerisSubframe1Reserved.h000066400000000000000000000015041305042567700260220ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _EphemerisSubframe1Reserved_H_ #define _EphemerisSubframe1Reserved_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* EphemerisSubframe1Reserved */ typedef struct EphemerisSubframe1Reserved { long reserved1; long reserved2; long reserved3; long reserved4; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } EphemerisSubframe1Reserved_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_EphemerisSubframe1Reserved; #ifdef __cplusplus } #endif #endif /* _EphemerisSubframe1Reserved_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ErrorCodes.c000066400000000000000000000124331305042567700227000ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "ErrorCodes.h" int ErrorCodes_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { /* Replace with underlying type checker */ td->check_constraints = asn_DEF_ENUMERATED.check_constraints; return td->check_constraints(td, sptr, ctfailcb, app_key); } /* * This type is implemented using ENUMERATED, * so here we adjust the DEF accordingly. */ static void ErrorCodes_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_ENUMERATED.free_struct; td->print_struct = asn_DEF_ENUMERATED.print_struct; td->ber_decoder = asn_DEF_ENUMERATED.ber_decoder; td->der_encoder = asn_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; td->uper_encoder = asn_DEF_ENUMERATED.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_ENUMERATED.per_constraints; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ } void ErrorCodes_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { ErrorCodes_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int ErrorCodes_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { ErrorCodes_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t ErrorCodes_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { ErrorCodes_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t ErrorCodes_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { ErrorCodes_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t ErrorCodes_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { ErrorCodes_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t ErrorCodes_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { ErrorCodes_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t ErrorCodes_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { ErrorCodes_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t ErrorCodes_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { ErrorCodes_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_ErrorCodes_constr_1 = { { APC_CONSTRAINED | APC_EXTENSIBLE, 3, 3, 0, 5 } /* (0..5,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_INTEGER_enum_map_t asn_MAP_ErrorCodes_value2enum_1[] = { { 0, 9, "unDefined" }, { 1, 15, "missingComponet" }, { 2, 13, "incorrectData" }, { 3, 27, "missingIEorComponentElement" }, { 4, 15, "messageTooShort" }, { 5, 21, "unknowReferenceNumber" } /* This list is extensible */ }; static unsigned int asn_MAP_ErrorCodes_enum2value_1[] = { 2, /* incorrectData(2) */ 4, /* messageTooShort(4) */ 1, /* missingComponet(1) */ 3, /* missingIEorComponentElement(3) */ 0, /* unDefined(0) */ 5 /* unknowReferenceNumber(5) */ /* This list is extensible */ }; static asn_INTEGER_specifics_t asn_SPC_ErrorCodes_specs_1 = { asn_MAP_ErrorCodes_value2enum_1, /* "tag" => N; sorted by tag */ asn_MAP_ErrorCodes_enum2value_1, /* N => "tag"; sorted by N */ 6, /* Number of elements in the maps */ 7, /* Extensions before this member */ 1, /* Strict enumeration */ 0, /* Native long size */ 0 }; static ber_tlv_tag_t asn_DEF_ErrorCodes_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; asn_TYPE_descriptor_t asn_DEF_ErrorCodes = { "ErrorCodes", "ErrorCodes", ErrorCodes_free, ErrorCodes_print, ErrorCodes_constraint, ErrorCodes_decode_ber, ErrorCodes_encode_der, ErrorCodes_decode_xer, ErrorCodes_encode_xer, ErrorCodes_decode_uper, ErrorCodes_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_ErrorCodes_tags_1, sizeof(asn_DEF_ErrorCodes_tags_1) /sizeof(asn_DEF_ErrorCodes_tags_1[0]), /* 1 */ asn_DEF_ErrorCodes_tags_1, /* Same as above */ sizeof(asn_DEF_ErrorCodes_tags_1) /sizeof(asn_DEF_ErrorCodes_tags_1[0]), /* 1 */ &asn_PER_type_ErrorCodes_constr_1, 0, 0, /* Defined elsewhere */ &asn_SPC_ErrorCodes_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ErrorCodes.h000066400000000000000000000022661305042567700227100ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _ErrorCodes_H_ #define _ErrorCodes_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum ErrorCodes { ErrorCodes_unDefined = 0, ErrorCodes_missingComponet = 1, ErrorCodes_incorrectData = 2, ErrorCodes_missingIEorComponentElement = 3, ErrorCodes_messageTooShort = 4, ErrorCodes_unknowReferenceNumber = 5 /* * Enumeration is extensible */ } e_ErrorCodes; /* ErrorCodes */ typedef ENUMERATED_t ErrorCodes_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_ErrorCodes; asn_struct_free_f ErrorCodes_free; asn_struct_print_f ErrorCodes_print; asn_constr_check_f ErrorCodes_constraint; ber_type_decoder_f ErrorCodes_decode_ber; der_type_encoder_f ErrorCodes_encode_der; xer_type_decoder_f ErrorCodes_decode_xer; xer_type_encoder_f ErrorCodes_encode_xer; per_type_decoder_f ErrorCodes_decode_uper; per_type_encoder_f ErrorCodes_encode_uper; #ifdef __cplusplus } #endif #endif /* _ErrorCodes_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ExpOTDUncertainty.c000066400000000000000000000115231305042567700241610ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "ExpOTDUncertainty.h" int ExpOTDUncertainty_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 7)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void ExpOTDUncertainty_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void ExpOTDUncertainty_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { ExpOTDUncertainty_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int ExpOTDUncertainty_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { ExpOTDUncertainty_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t ExpOTDUncertainty_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { ExpOTDUncertainty_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t ExpOTDUncertainty_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { ExpOTDUncertainty_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t ExpOTDUncertainty_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { ExpOTDUncertainty_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t ExpOTDUncertainty_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { ExpOTDUncertainty_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t ExpOTDUncertainty_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { ExpOTDUncertainty_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t ExpOTDUncertainty_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { ExpOTDUncertainty_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_ExpOTDUncertainty_constr_1 = { { APC_CONSTRAINED, 3, 3, 0, 7 } /* (0..7) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_ExpOTDUncertainty_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_ExpOTDUncertainty = { "ExpOTDUncertainty", "ExpOTDUncertainty", ExpOTDUncertainty_free, ExpOTDUncertainty_print, ExpOTDUncertainty_constraint, ExpOTDUncertainty_decode_ber, ExpOTDUncertainty_encode_der, ExpOTDUncertainty_decode_xer, ExpOTDUncertainty_encode_xer, ExpOTDUncertainty_decode_uper, ExpOTDUncertainty_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_ExpOTDUncertainty_tags_1, sizeof(asn_DEF_ExpOTDUncertainty_tags_1) /sizeof(asn_DEF_ExpOTDUncertainty_tags_1[0]), /* 1 */ asn_DEF_ExpOTDUncertainty_tags_1, /* Same as above */ sizeof(asn_DEF_ExpOTDUncertainty_tags_1) /sizeof(asn_DEF_ExpOTDUncertainty_tags_1[0]), /* 1 */ &asn_PER_type_ExpOTDUncertainty_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ExpOTDUncertainty.h000066400000000000000000000017461305042567700241740ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _ExpOTDUncertainty_H_ #define _ExpOTDUncertainty_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* ExpOTDUncertainty */ typedef long ExpOTDUncertainty_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_ExpOTDUncertainty; asn_struct_free_f ExpOTDUncertainty_free; asn_struct_print_f ExpOTDUncertainty_print; asn_constr_check_f ExpOTDUncertainty_constraint; ber_type_decoder_f ExpOTDUncertainty_decode_ber; der_type_encoder_f ExpOTDUncertainty_encode_der; xer_type_decoder_f ExpOTDUncertainty_decode_xer; xer_type_encoder_f ExpOTDUncertainty_encode_xer; per_type_decoder_f ExpOTDUncertainty_decode_uper; per_type_encoder_f ExpOTDUncertainty_encode_uper; #ifdef __cplusplus } #endif #endif /* _ExpOTDUncertainty_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ExpectedOTD.c000066400000000000000000000111561305042567700227420ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "ExpectedOTD.h" int ExpectedOTD_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1250)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void ExpectedOTD_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void ExpectedOTD_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { ExpectedOTD_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int ExpectedOTD_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { ExpectedOTD_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t ExpectedOTD_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { ExpectedOTD_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t ExpectedOTD_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { ExpectedOTD_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t ExpectedOTD_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { ExpectedOTD_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t ExpectedOTD_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { ExpectedOTD_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t ExpectedOTD_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { ExpectedOTD_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t ExpectedOTD_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { ExpectedOTD_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_ExpectedOTD_constr_1 = { { APC_CONSTRAINED, 11, 11, 0, 1250 } /* (0..1250) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_ExpectedOTD_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_ExpectedOTD = { "ExpectedOTD", "ExpectedOTD", ExpectedOTD_free, ExpectedOTD_print, ExpectedOTD_constraint, ExpectedOTD_decode_ber, ExpectedOTD_encode_der, ExpectedOTD_decode_xer, ExpectedOTD_encode_xer, ExpectedOTD_decode_uper, ExpectedOTD_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_ExpectedOTD_tags_1, sizeof(asn_DEF_ExpectedOTD_tags_1) /sizeof(asn_DEF_ExpectedOTD_tags_1[0]), /* 1 */ asn_DEF_ExpectedOTD_tags_1, /* Same as above */ sizeof(asn_DEF_ExpectedOTD_tags_1) /sizeof(asn_DEF_ExpectedOTD_tags_1[0]), /* 1 */ &asn_PER_type_ExpectedOTD_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ExpectedOTD.h000066400000000000000000000016141305042567700227450ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _ExpectedOTD_H_ #define _ExpectedOTD_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* ExpectedOTD */ typedef long ExpectedOTD_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_ExpectedOTD; asn_struct_free_f ExpectedOTD_free; asn_struct_print_f ExpectedOTD_print; asn_constr_check_f ExpectedOTD_constraint; ber_type_decoder_f ExpectedOTD_decode_ber; der_type_encoder_f ExpectedOTD_encode_der; xer_type_decoder_f ExpectedOTD_decode_xer; xer_type_encoder_f ExpectedOTD_encode_xer; per_type_decoder_f ExpectedOTD_decode_uper; per_type_encoder_f ExpectedOTD_encode_uper; #ifdef __cplusplus } #endif #endif /* _ExpectedOTD_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Ext-GeographicalInformation.c000066400000000000000000000124141305042567700261610ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "Ext-GeographicalInformation.h" int Ext_GeographicalInformation_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } size = st->size; if((size >= 1 && size <= 20)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using OCTET_STRING, * so here we adjust the DEF accordingly. */ static void Ext_GeographicalInformation_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_OCTET_STRING.free_struct; td->print_struct = asn_DEF_OCTET_STRING.print_struct; td->ber_decoder = asn_DEF_OCTET_STRING.ber_decoder; td->der_encoder = asn_DEF_OCTET_STRING.der_encoder; td->xer_decoder = asn_DEF_OCTET_STRING.xer_decoder; td->xer_encoder = asn_DEF_OCTET_STRING.xer_encoder; td->uper_decoder = asn_DEF_OCTET_STRING.uper_decoder; td->uper_encoder = asn_DEF_OCTET_STRING.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_OCTET_STRING.per_constraints; td->elements = asn_DEF_OCTET_STRING.elements; td->elements_count = asn_DEF_OCTET_STRING.elements_count; td->specifics = asn_DEF_OCTET_STRING.specifics; } void Ext_GeographicalInformation_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { Ext_GeographicalInformation_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int Ext_GeographicalInformation_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { Ext_GeographicalInformation_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t Ext_GeographicalInformation_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { Ext_GeographicalInformation_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t Ext_GeographicalInformation_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { Ext_GeographicalInformation_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t Ext_GeographicalInformation_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { Ext_GeographicalInformation_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t Ext_GeographicalInformation_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { Ext_GeographicalInformation_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t Ext_GeographicalInformation_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { Ext_GeographicalInformation_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t Ext_GeographicalInformation_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { Ext_GeographicalInformation_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_Ext_GeographicalInformation_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 5, 5, 1, 20 } /* (SIZE(1..20)) */, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_Ext_GeographicalInformation_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Ext_GeographicalInformation = { "Ext-GeographicalInformation", "Ext-GeographicalInformation", Ext_GeographicalInformation_free, Ext_GeographicalInformation_print, Ext_GeographicalInformation_constraint, Ext_GeographicalInformation_decode_ber, Ext_GeographicalInformation_encode_der, Ext_GeographicalInformation_decode_xer, Ext_GeographicalInformation_encode_xer, Ext_GeographicalInformation_decode_uper, Ext_GeographicalInformation_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_Ext_GeographicalInformation_tags_1, sizeof(asn_DEF_Ext_GeographicalInformation_tags_1) /sizeof(asn_DEF_Ext_GeographicalInformation_tags_1[0]), /* 1 */ asn_DEF_Ext_GeographicalInformation_tags_1, /* Same as above */ sizeof(asn_DEF_Ext_GeographicalInformation_tags_1) /sizeof(asn_DEF_Ext_GeographicalInformation_tags_1[0]), /* 1 */ &asn_PER_type_Ext_GeographicalInformation_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Ext-GeographicalInformation.h000066400000000000000000000022051305042567700261630ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _Ext_GeographicalInformation_H_ #define _Ext_GeographicalInformation_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Ext-GeographicalInformation */ typedef OCTET_STRING_t Ext_GeographicalInformation_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Ext_GeographicalInformation; asn_struct_free_f Ext_GeographicalInformation_free; asn_struct_print_f Ext_GeographicalInformation_print; asn_constr_check_f Ext_GeographicalInformation_constraint; ber_type_decoder_f Ext_GeographicalInformation_decode_ber; der_type_encoder_f Ext_GeographicalInformation_encode_der; xer_type_decoder_f Ext_GeographicalInformation_decode_xer; xer_type_encoder_f Ext_GeographicalInformation_encode_xer; per_type_decoder_f Ext_GeographicalInformation_decode_uper; per_type_encoder_f Ext_GeographicalInformation_encode_uper; #ifdef __cplusplus } #endif #endif /* _Ext_GeographicalInformation_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Extended-reference.c000066400000000000000000000071711305042567700243300ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "Extended-reference.h" static int memb_smlc_code_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 63)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_transaction_ID_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 262143)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_smlc_code_constr_2 = { { APC_CONSTRAINED, 6, 6, 0, 63 } /* (0..63) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_transaction_ID_constr_3 = { { APC_CONSTRAINED, 18, -1, 0, 262143 } /* (0..262143) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_Extended_reference_1[] = { { ATF_NOFLAGS, 0, offsetof(struct Extended_reference, smlc_code), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_smlc_code_constraint_1, &asn_PER_memb_smlc_code_constr_2, 0, "smlc-code" }, { ATF_NOFLAGS, 0, offsetof(struct Extended_reference, transaction_ID), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_transaction_ID_constraint_1, &asn_PER_memb_transaction_ID_constr_3, 0, "transaction-ID" }, }; static ber_tlv_tag_t asn_DEF_Extended_reference_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_Extended_reference_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* smlc-code at 999 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* transaction-ID at 1000 */ }; static asn_SEQUENCE_specifics_t asn_SPC_Extended_reference_specs_1 = { sizeof(struct Extended_reference), offsetof(struct Extended_reference, _asn_ctx), asn_MAP_Extended_reference_tag2el_1, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Extended_reference = { "Extended-reference", "Extended-reference", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_Extended_reference_tags_1, sizeof(asn_DEF_Extended_reference_tags_1) /sizeof(asn_DEF_Extended_reference_tags_1[0]), /* 1 */ asn_DEF_Extended_reference_tags_1, /* Same as above */ sizeof(asn_DEF_Extended_reference_tags_1) /sizeof(asn_DEF_Extended_reference_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_Extended_reference_1, 2, /* Elements count */ &asn_SPC_Extended_reference_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Extended-reference.h000066400000000000000000000013551305042567700243330ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _Extended_reference_H_ #define _Extended_reference_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Extended-reference */ typedef struct Extended_reference { long smlc_code; long transaction_ID; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } Extended_reference_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Extended_reference; #ifdef __cplusplus } #endif #endif /* _Extended_reference_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ExtensionContainer.c000066400000000000000000000106001305042567700244420ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "ExtensionContainer.h" int ExtensionContainer_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { /* Replace with underlying type checker */ td->check_constraints = asn_DEF_INTEGER.check_constraints; return td->check_constraints(td, sptr, ctfailcb, app_key); } /* * This type is implemented using INTEGER, * so here we adjust the DEF accordingly. */ static void ExtensionContainer_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_INTEGER.free_struct; td->print_struct = asn_DEF_INTEGER.print_struct; td->ber_decoder = asn_DEF_INTEGER.ber_decoder; td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; td->uper_decoder = asn_DEF_INTEGER.uper_decoder; td->uper_encoder = asn_DEF_INTEGER.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; } void ExtensionContainer_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { ExtensionContainer_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int ExtensionContainer_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { ExtensionContainer_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t ExtensionContainer_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { ExtensionContainer_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t ExtensionContainer_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { ExtensionContainer_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t ExtensionContainer_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { ExtensionContainer_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t ExtensionContainer_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { ExtensionContainer_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t ExtensionContainer_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { ExtensionContainer_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t ExtensionContainer_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { ExtensionContainer_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static ber_tlv_tag_t asn_DEF_ExtensionContainer_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_ExtensionContainer = { "ExtensionContainer", "ExtensionContainer", ExtensionContainer_free, ExtensionContainer_print, ExtensionContainer_constraint, ExtensionContainer_decode_ber, ExtensionContainer_encode_der, ExtensionContainer_decode_xer, ExtensionContainer_encode_xer, ExtensionContainer_decode_uper, ExtensionContainer_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_ExtensionContainer_tags_1, sizeof(asn_DEF_ExtensionContainer_tags_1) /sizeof(asn_DEF_ExtensionContainer_tags_1[0]), /* 1 */ asn_DEF_ExtensionContainer_tags_1, /* Same as above */ sizeof(asn_DEF_ExtensionContainer_tags_1) /sizeof(asn_DEF_ExtensionContainer_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ExtensionContainer.h000066400000000000000000000017641305042567700244620ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _ExtensionContainer_H_ #define _ExtensionContainer_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* ExtensionContainer */ typedef INTEGER_t ExtensionContainer_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_ExtensionContainer; asn_struct_free_f ExtensionContainer_free; asn_struct_print_f ExtensionContainer_print; asn_constr_check_f ExtensionContainer_constraint; ber_type_decoder_f ExtensionContainer_decode_ber; der_type_encoder_f ExtensionContainer_encode_der; xer_type_decoder_f ExtensionContainer_decode_xer; xer_type_encoder_f ExtensionContainer_encode_xer; per_type_decoder_f ExtensionContainer_decode_uper; per_type_encoder_f ExtensionContainer_encode_uper; #ifdef __cplusplus } #endif #endif /* _ExtensionContainer_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/FineRTD.c000066400000000000000000000107111305042567700220610ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "FineRTD.h" int FineRTD_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 255)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void FineRTD_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void FineRTD_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { FineRTD_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int FineRTD_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { FineRTD_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t FineRTD_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { FineRTD_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t FineRTD_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { FineRTD_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t FineRTD_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { FineRTD_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t FineRTD_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { FineRTD_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t FineRTD_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { FineRTD_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t FineRTD_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { FineRTD_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_FineRTD_constr_1 = { { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_FineRTD_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_FineRTD = { "FineRTD", "FineRTD", FineRTD_free, FineRTD_print, FineRTD_constraint, FineRTD_decode_ber, FineRTD_encode_der, FineRTD_decode_xer, FineRTD_encode_xer, FineRTD_decode_uper, FineRTD_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_FineRTD_tags_1, sizeof(asn_DEF_FineRTD_tags_1) /sizeof(asn_DEF_FineRTD_tags_1[0]), /* 1 */ asn_DEF_FineRTD_tags_1, /* Same as above */ sizeof(asn_DEF_FineRTD_tags_1) /sizeof(asn_DEF_FineRTD_tags_1[0]), /* 1 */ &asn_PER_type_FineRTD_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/FineRTD.h000066400000000000000000000015201305042567700220640ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _FineRTD_H_ #define _FineRTD_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* FineRTD */ typedef long FineRTD_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_FineRTD; asn_struct_free_f FineRTD_free; asn_struct_print_f FineRTD_print; asn_constr_check_f FineRTD_constraint; ber_type_decoder_f FineRTD_decode_ber; der_type_encoder_f FineRTD_encode_der; xer_type_decoder_f FineRTD_decode_xer; xer_type_encoder_f FineRTD_encode_xer; per_type_decoder_f FineRTD_decode_uper; per_type_encoder_f FineRTD_encode_uper; #ifdef __cplusplus } #endif #endif /* _FineRTD_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/FixType.c000066400000000000000000000107121305042567700222170ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "FixType.h" int FixType_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void FixType_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void FixType_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { FixType_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int FixType_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { FixType_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t FixType_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { FixType_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t FixType_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { FixType_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t FixType_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { FixType_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t FixType_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { FixType_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t FixType_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { FixType_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t FixType_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { FixType_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_FixType_constr_1 = { { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_FixType_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_FixType = { "FixType", "FixType", FixType_free, FixType_print, FixType_constraint, FixType_decode_ber, FixType_encode_der, FixType_decode_xer, FixType_encode_xer, FixType_decode_uper, FixType_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_FixType_tags_1, sizeof(asn_DEF_FixType_tags_1) /sizeof(asn_DEF_FixType_tags_1[0]), /* 1 */ asn_DEF_FixType_tags_1, /* Same as above */ sizeof(asn_DEF_FixType_tags_1) /sizeof(asn_DEF_FixType_tags_1[0]), /* 1 */ &asn_PER_type_FixType_constr_1, 0, 0, /* Defined elsewhere */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/FixType.h000066400000000000000000000016651305042567700222330ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _FixType_H_ #define _FixType_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum FixType { FixType_twoDFix = 0, FixType_threeDFix = 1 } e_FixType; /* FixType */ typedef long FixType_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_FixType; asn_struct_free_f FixType_free; asn_struct_print_f FixType_print; asn_constr_check_f FixType_constraint; ber_type_decoder_f FixType_decode_ber; der_type_encoder_f FixType_encode_der; xer_type_decoder_f FixType_decode_xer; xer_type_encoder_f FixType_encode_xer; per_type_decoder_f FixType_decode_uper; per_type_encoder_f FixType_encode_uper; #ifdef __cplusplus } #endif #endif /* _FixType_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/FrameDrift.c000066400000000000000000000111031305042567700226450ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "FrameDrift.h" int FrameDrift_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -64 && value <= 63)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void FrameDrift_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void FrameDrift_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { FrameDrift_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int FrameDrift_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { FrameDrift_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t FrameDrift_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { FrameDrift_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t FrameDrift_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { FrameDrift_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t FrameDrift_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { FrameDrift_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t FrameDrift_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { FrameDrift_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t FrameDrift_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { FrameDrift_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t FrameDrift_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { FrameDrift_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_FrameDrift_constr_1 = { { APC_CONSTRAINED, 7, 7, -64, 63 } /* (-64..63) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_FrameDrift_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_FrameDrift = { "FrameDrift", "FrameDrift", FrameDrift_free, FrameDrift_print, FrameDrift_constraint, FrameDrift_decode_ber, FrameDrift_encode_der, FrameDrift_decode_xer, FrameDrift_encode_xer, FrameDrift_decode_uper, FrameDrift_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_FrameDrift_tags_1, sizeof(asn_DEF_FrameDrift_tags_1) /sizeof(asn_DEF_FrameDrift_tags_1[0]), /* 1 */ asn_DEF_FrameDrift_tags_1, /* Same as above */ sizeof(asn_DEF_FrameDrift_tags_1) /sizeof(asn_DEF_FrameDrift_tags_1[0]), /* 1 */ &asn_PER_type_FrameDrift_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/FrameDrift.h000066400000000000000000000015751305042567700226660ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _FrameDrift_H_ #define _FrameDrift_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* FrameDrift */ typedef long FrameDrift_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_FrameDrift; asn_struct_free_f FrameDrift_free; asn_struct_print_f FrameDrift_print; asn_constr_check_f FrameDrift_constraint; ber_type_decoder_f FrameDrift_decode_ber; der_type_encoder_f FrameDrift_encode_der; xer_type_decoder_f FrameDrift_decode_xer; xer_type_encoder_f FrameDrift_encode_xer; per_type_decoder_f FrameDrift_decode_uper; per_type_encoder_f FrameDrift_encode_uper; #ifdef __cplusplus } #endif #endif /* _FrameDrift_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/FrameNumber.c000066400000000000000000000111661305042567700230360ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "FrameNumber.h" int FrameNumber_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 2097151)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void FrameNumber_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void FrameNumber_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { FrameNumber_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int FrameNumber_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { FrameNumber_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t FrameNumber_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { FrameNumber_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t FrameNumber_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { FrameNumber_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t FrameNumber_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { FrameNumber_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t FrameNumber_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { FrameNumber_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t FrameNumber_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { FrameNumber_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t FrameNumber_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { FrameNumber_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_FrameNumber_constr_1 = { { APC_CONSTRAINED, 21, -1, 0, 2097151 } /* (0..2097151) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_FrameNumber_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_FrameNumber = { "FrameNumber", "FrameNumber", FrameNumber_free, FrameNumber_print, FrameNumber_constraint, FrameNumber_decode_ber, FrameNumber_encode_der, FrameNumber_decode_xer, FrameNumber_encode_xer, FrameNumber_decode_uper, FrameNumber_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_FrameNumber_tags_1, sizeof(asn_DEF_FrameNumber_tags_1) /sizeof(asn_DEF_FrameNumber_tags_1[0]), /* 1 */ asn_DEF_FrameNumber_tags_1, /* Same as above */ sizeof(asn_DEF_FrameNumber_tags_1) /sizeof(asn_DEF_FrameNumber_tags_1[0]), /* 1 */ &asn_PER_type_FrameNumber_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/FrameNumber.h000066400000000000000000000016141305042567700230400ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _FrameNumber_H_ #define _FrameNumber_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* FrameNumber */ typedef long FrameNumber_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_FrameNumber; asn_struct_free_f FrameNumber_free; asn_struct_print_f FrameNumber_print; asn_constr_check_f FrameNumber_constraint; ber_type_decoder_f FrameNumber_decode_ber; der_type_encoder_f FrameNumber_encode_der; xer_type_decoder_f FrameNumber_decode_xer; xer_type_encoder_f FrameNumber_encode_xer; per_type_decoder_f FrameNumber_decode_uper; per_type_encoder_f FrameNumber_encode_uper; #ifdef __cplusplus } #endif #endif /* _FrameNumber_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSS-AssistData.c000066400000000000000000000035411305042567700235420ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSS-AssistData.h" static asn_TYPE_member_t asn_MBR_GANSS_AssistData_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GANSS_AssistData, ganss_controlHeader), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSS_ControlHeader, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganss-controlHeader" }, }; static ber_tlv_tag_t asn_DEF_GANSS_AssistData_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GANSS_AssistData_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* ganss-controlHeader at 1062 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GANSS_AssistData_specs_1 = { sizeof(struct GANSS_AssistData), offsetof(struct GANSS_AssistData, _asn_ctx), asn_MAP_GANSS_AssistData_tag2el_1, 1, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GANSS_AssistData = { "GANSS-AssistData", "GANSS-AssistData", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSS_AssistData_tags_1, sizeof(asn_DEF_GANSS_AssistData_tags_1) /sizeof(asn_DEF_GANSS_AssistData_tags_1[0]), /* 1 */ asn_DEF_GANSS_AssistData_tags_1, /* Same as above */ sizeof(asn_DEF_GANSS_AssistData_tags_1) /sizeof(asn_DEF_GANSS_AssistData_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GANSS_AssistData_1, 1, /* Elements count */ &asn_SPC_GANSS_AssistData_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSS-AssistData.h000066400000000000000000000013511305042567700235440ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSS_AssistData_H_ #define _GANSS_AssistData_H_ #include /* Including external dependencies */ #include "GANSS-ControlHeader.h" #include #ifdef __cplusplus extern "C" { #endif /* GANSS-AssistData */ typedef struct GANSS_AssistData { GANSS_ControlHeader_t ganss_controlHeader; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSS_AssistData_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSS_AssistData; #ifdef __cplusplus } #endif #endif /* _GANSS_AssistData_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSS-ControlHeader.c000066400000000000000000000047021305042567700242330ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSS-ControlHeader.h" static asn_TYPE_member_t asn_MBR_GANSS_ControlHeader_1[] = { { ATF_POINTER, 2, offsetof(struct GANSS_ControlHeader, ganssCommonAssistData), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSSCommonAssistData, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssCommonAssistData" }, { ATF_POINTER, 1, offsetof(struct GANSS_ControlHeader, ganssGenericAssistDataList), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfGANSSGenericAssistDataElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssGenericAssistDataList" }, }; static int asn_MAP_GANSS_ControlHeader_oms_1[] = { 0, 1 }; static ber_tlv_tag_t asn_DEF_GANSS_ControlHeader_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GANSS_ControlHeader_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ganssCommonAssistData at 1065 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ganssGenericAssistDataList at 1066 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GANSS_ControlHeader_specs_1 = { sizeof(struct GANSS_ControlHeader), offsetof(struct GANSS_ControlHeader, _asn_ctx), asn_MAP_GANSS_ControlHeader_tag2el_1, 2, /* Count of tags in the map */ asn_MAP_GANSS_ControlHeader_oms_1, /* Optional members */ 2, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GANSS_ControlHeader = { "GANSS-ControlHeader", "GANSS-ControlHeader", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSS_ControlHeader_tags_1, sizeof(asn_DEF_GANSS_ControlHeader_tags_1) /sizeof(asn_DEF_GANSS_ControlHeader_tags_1[0]), /* 1 */ asn_DEF_GANSS_ControlHeader_tags_1, /* Same as above */ sizeof(asn_DEF_GANSS_ControlHeader_tags_1) /sizeof(asn_DEF_GANSS_ControlHeader_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GANSS_ControlHeader_1, 2, /* Elements count */ &asn_SPC_GANSS_ControlHeader_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSS-ControlHeader.h000066400000000000000000000020431305042567700242340ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSS_ControlHeader_H_ #define _GANSS_ControlHeader_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct GANSSCommonAssistData; struct SeqOfGANSSGenericAssistDataElement; /* GANSS-ControlHeader */ typedef struct GANSS_ControlHeader { struct GANSSCommonAssistData *ganssCommonAssistData /* OPTIONAL */; struct SeqOfGANSSGenericAssistDataElement *ganssGenericAssistDataList /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSS_ControlHeader_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSS_ControlHeader; #ifdef __cplusplus } #endif /* Referred external types */ #include "GANSSCommonAssistData.h" #include "SeqOfGANSSGenericAssistDataElement.h" #endif /* _GANSS_ControlHeader_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSS-MsrSetElement.c000066400000000000000000000103271305042567700242310ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSS-MsrSetElement.h" static int memb_deltaGNASSTOD_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_deltaGNASSTOD_constr_4 = { { APC_CONSTRAINED, 7, 7, 0, 127 } /* (0..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_GANSS_MsrSetElement_1[] = { { ATF_POINTER, 4, offsetof(struct GANSS_MsrSetElement, referenceFrame), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_ReferenceFrame, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "referenceFrame" }, { ATF_POINTER, 3, offsetof(struct GANSS_MsrSetElement, ganssTODm), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSSTODm, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssTODm" }, { ATF_POINTER, 2, offsetof(struct GANSS_MsrSetElement, deltaGNASSTOD), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_deltaGNASSTOD_constraint_1, &asn_PER_memb_deltaGNASSTOD_constr_4, 0, "deltaGNASSTOD" }, { ATF_POINTER, 1, offsetof(struct GANSS_MsrSetElement, ganssTODUncertainty), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSSTODUncertainty, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssTODUncertainty" }, { ATF_NOFLAGS, 0, offsetof(struct GANSS_MsrSetElement, ganss_SgnTypeList), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfGANSS_SgnTypeElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganss-SgnTypeList" }, }; static int asn_MAP_GANSS_MsrSetElement_oms_1[] = { 0, 1, 2, 3 }; static ber_tlv_tag_t asn_DEF_GANSS_MsrSetElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GANSS_MsrSetElement_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* referenceFrame at 1456 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ganssTODm at 1457 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* deltaGNASSTOD at 1458 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* ganssTODUncertainty at 1459 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* ganss-SgnTypeList at 1463 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GANSS_MsrSetElement_specs_1 = { sizeof(struct GANSS_MsrSetElement), offsetof(struct GANSS_MsrSetElement, _asn_ctx), asn_MAP_GANSS_MsrSetElement_tag2el_1, 5, /* Count of tags in the map */ asn_MAP_GANSS_MsrSetElement_oms_1, /* Optional members */ 4, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GANSS_MsrSetElement = { "GANSS-MsrSetElement", "GANSS-MsrSetElement", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSS_MsrSetElement_tags_1, sizeof(asn_DEF_GANSS_MsrSetElement_tags_1) /sizeof(asn_DEF_GANSS_MsrSetElement_tags_1[0]), /* 1 */ asn_DEF_GANSS_MsrSetElement_tags_1, /* Same as above */ sizeof(asn_DEF_GANSS_MsrSetElement_tags_1) /sizeof(asn_DEF_GANSS_MsrSetElement_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GANSS_MsrSetElement_1, 5, /* Elements count */ &asn_SPC_GANSS_MsrSetElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSS-MsrSetElement.h000066400000000000000000000022111305042567700242270ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSS_MsrSetElement_H_ #define _GANSS_MsrSetElement_H_ #include /* Including external dependencies */ #include "GANSSTODm.h" #include #include "GANSSTODUncertainty.h" #include "SeqOfGANSS-SgnTypeElement.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct ReferenceFrame; /* GANSS-MsrSetElement */ typedef struct GANSS_MsrSetElement { struct ReferenceFrame *referenceFrame /* OPTIONAL */; GANSSTODm_t *ganssTODm /* OPTIONAL */; long *deltaGNASSTOD /* OPTIONAL */; GANSSTODUncertainty_t *ganssTODUncertainty /* OPTIONAL */; SeqOfGANSS_SgnTypeElement_t ganss_SgnTypeList; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSS_MsrSetElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSS_MsrSetElement; #ifdef __cplusplus } #endif /* Referred external types */ #include "ReferenceFrame.h" #endif /* _GANSS_MsrSetElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSS-SgnElement.c000066400000000000000000000232121305042567700235400ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSS-SgnElement.h" static int memb_cNo_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 63)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_carrierQualityInd_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 3)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_codePhase_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 2097151)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_integerCodePhase_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 63)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_codePhaseRMSError_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 63)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_doppler_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -32768 && value <= 32767)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_adr_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 33554431)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_cNo_constr_3 = { { APC_CONSTRAINED, 6, 6, 0, 63 } /* (0..63) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_carrierQualityInd_constr_5 = { { APC_CONSTRAINED, 2, 2, 0, 3 } /* (0..3) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_codePhase_constr_6 = { { APC_CONSTRAINED, 21, -1, 0, 2097151 } /* (0..2097151) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_integerCodePhase_constr_7 = { { APC_CONSTRAINED, 6, 6, 0, 63 } /* (0..63) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_codePhaseRMSError_constr_8 = { { APC_CONSTRAINED, 6, 6, 0, 63 } /* (0..63) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_doppler_constr_9 = { { APC_CONSTRAINED, 16, 16, -32768, 32767 } /* (-32768..32767) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_adr_constr_10 = { { APC_CONSTRAINED, 25, -1, 0, 33554431 } /* (0..33554431) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_GANSS_SgnElement_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GANSS_SgnElement, svID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SVID, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "svID" }, { ATF_NOFLAGS, 0, offsetof(struct GANSS_SgnElement, cNo), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_cNo_constraint_1, &asn_PER_memb_cNo_constr_3, 0, "cNo" }, { ATF_NOFLAGS, 0, offsetof(struct GANSS_SgnElement, mpathDet), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_MpathIndic, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "mpathDet" }, { ATF_POINTER, 1, offsetof(struct GANSS_SgnElement, carrierQualityInd), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_carrierQualityInd_constraint_1, &asn_PER_memb_carrierQualityInd_constr_5, 0, "carrierQualityInd" }, { ATF_NOFLAGS, 0, offsetof(struct GANSS_SgnElement, codePhase), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_codePhase_constraint_1, &asn_PER_memb_codePhase_constr_6, 0, "codePhase" }, { ATF_POINTER, 1, offsetof(struct GANSS_SgnElement, integerCodePhase), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_integerCodePhase_constraint_1, &asn_PER_memb_integerCodePhase_constr_7, 0, "integerCodePhase" }, { ATF_NOFLAGS, 0, offsetof(struct GANSS_SgnElement, codePhaseRMSError), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_codePhaseRMSError_constraint_1, &asn_PER_memb_codePhaseRMSError_constr_8, 0, "codePhaseRMSError" }, { ATF_POINTER, 2, offsetof(struct GANSS_SgnElement, doppler), (ASN_TAG_CLASS_CONTEXT | (7 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_doppler_constraint_1, &asn_PER_memb_doppler_constr_9, 0, "doppler" }, { ATF_POINTER, 1, offsetof(struct GANSS_SgnElement, adr), (ASN_TAG_CLASS_CONTEXT | (8 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_adr_constraint_1, &asn_PER_memb_adr_constr_10, 0, "adr" }, }; static int asn_MAP_GANSS_SgnElement_oms_1[] = { 3, 5, 7, 8 }; static ber_tlv_tag_t asn_DEF_GANSS_SgnElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GANSS_SgnElement_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* svID at 1479 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* cNo at 1480 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* mpathDet at 1481 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* carrierQualityInd at 1482 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* codePhase at 1483 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* integerCodePhase at 1484 */ { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* codePhaseRMSError at 1485 */ { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 }, /* doppler at 1486 */ { (ASN_TAG_CLASS_CONTEXT | (8 << 2)), 8, 0, 0 } /* adr at 1487 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GANSS_SgnElement_specs_1 = { sizeof(struct GANSS_SgnElement), offsetof(struct GANSS_SgnElement, _asn_ctx), asn_MAP_GANSS_SgnElement_tag2el_1, 9, /* Count of tags in the map */ asn_MAP_GANSS_SgnElement_oms_1, /* Optional members */ 4, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GANSS_SgnElement = { "GANSS-SgnElement", "GANSS-SgnElement", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSS_SgnElement_tags_1, sizeof(asn_DEF_GANSS_SgnElement_tags_1) /sizeof(asn_DEF_GANSS_SgnElement_tags_1[0]), /* 1 */ asn_DEF_GANSS_SgnElement_tags_1, /* Same as above */ sizeof(asn_DEF_GANSS_SgnElement_tags_1) /sizeof(asn_DEF_GANSS_SgnElement_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GANSS_SgnElement_1, 9, /* Elements count */ &asn_SPC_GANSS_SgnElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSS-SgnElement.h000066400000000000000000000017131305042567700235470ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSS_SgnElement_H_ #define _GANSS_SgnElement_H_ #include /* Including external dependencies */ #include "SVID.h" #include #include "MpathIndic.h" #include #ifdef __cplusplus extern "C" { #endif /* GANSS-SgnElement */ typedef struct GANSS_SgnElement { SVID_t svID; long cNo; MpathIndic_t mpathDet; long *carrierQualityInd /* OPTIONAL */; long codePhase; long *integerCodePhase /* OPTIONAL */; long codePhaseRMSError; long *doppler /* OPTIONAL */; long *adr /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSS_SgnElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSS_SgnElement; #ifdef __cplusplus } #endif #endif /* _GANSS_SgnElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSS-SgnTypeElement.c000066400000000000000000000057521305042567700244130ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSS-SgnTypeElement.h" static int memb_ganssSignalID_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 15)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_ganssSignalID_constr_2 = { { APC_CONSTRAINED, 4, 4, 0, 15 } /* (0..15) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_GANSS_SgnTypeElement_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GANSS_SgnTypeElement, ganssSignalID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ganssSignalID_constraint_1, &asn_PER_memb_ganssSignalID_constr_2, 0, "ganssSignalID" }, { ATF_NOFLAGS, 0, offsetof(struct GANSS_SgnTypeElement, ganss_SgnList), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfGANSS_SgnElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganss-SgnList" }, }; static ber_tlv_tag_t asn_DEF_GANSS_SgnTypeElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GANSS_SgnTypeElement_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ganssSignalID at 1469 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ganss-SgnList at 1472 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GANSS_SgnTypeElement_specs_1 = { sizeof(struct GANSS_SgnTypeElement), offsetof(struct GANSS_SgnTypeElement, _asn_ctx), asn_MAP_GANSS_SgnTypeElement_tag2el_1, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GANSS_SgnTypeElement = { "GANSS-SgnTypeElement", "GANSS-SgnTypeElement", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSS_SgnTypeElement_tags_1, sizeof(asn_DEF_GANSS_SgnTypeElement_tags_1) /sizeof(asn_DEF_GANSS_SgnTypeElement_tags_1[0]), /* 1 */ asn_DEF_GANSS_SgnTypeElement_tags_1, /* Same as above */ sizeof(asn_DEF_GANSS_SgnTypeElement_tags_1) /sizeof(asn_DEF_GANSS_SgnTypeElement_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GANSS_SgnTypeElement_1, 2, /* Elements count */ &asn_SPC_GANSS_SgnTypeElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSS-SgnTypeElement.h000066400000000000000000000014641305042567700244140ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSS_SgnTypeElement_H_ #define _GANSS_SgnTypeElement_H_ #include /* Including external dependencies */ #include #include "SeqOfGANSS-SgnElement.h" #include #ifdef __cplusplus extern "C" { #endif /* GANSS-SgnTypeElement */ typedef struct GANSS_SgnTypeElement { long ganssSignalID; SeqOfGANSS_SgnElement_t ganss_SgnList; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSS_SgnTypeElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSS_SgnTypeElement; #ifdef __cplusplus } #endif #endif /* _GANSS_SgnTypeElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSAlmanacElement.c000066400000000000000000000035531305042567700242760ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSAlmanacElement.h" static asn_per_constraints_t asn_PER_type_GANSSAlmanacElement_constr_1 = { { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_GANSSAlmanacElement_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GANSSAlmanacElement, choice.keplerianAlmanacSet), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Almanac_KeplerianSet, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "keplerianAlmanacSet" }, }; static asn_TYPE_tag2member_t asn_MAP_GANSSAlmanacElement_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* keplerianAlmanacSet at 1362 */ }; static asn_CHOICE_specifics_t asn_SPC_GANSSAlmanacElement_specs_1 = { sizeof(struct GANSSAlmanacElement), offsetof(struct GANSSAlmanacElement, _asn_ctx), offsetof(struct GANSSAlmanacElement, present), sizeof(((struct GANSSAlmanacElement *)0)->present), asn_MAP_GANSSAlmanacElement_tag2el_1, 1, /* Count of tags in the map */ 0, 1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_GANSSAlmanacElement = { "GANSSAlmanacElement", "GANSSAlmanacElement", CHOICE_free, CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_decode_uper, CHOICE_encode_uper, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ &asn_PER_type_GANSSAlmanacElement_constr_1, asn_MBR_GANSSAlmanacElement_1, 1, /* Elements count */ &asn_SPC_GANSSAlmanacElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSAlmanacElement.h000066400000000000000000000021721305042567700242770ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSAlmanacElement_H_ #define _GANSSAlmanacElement_H_ #include /* Including external dependencies */ #include "Almanac-KeplerianSet.h" #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum GANSSAlmanacElement_PR { GANSSAlmanacElement_PR_NOTHING, /* No components present */ GANSSAlmanacElement_PR_keplerianAlmanacSet, /* Extensions may appear below */ } GANSSAlmanacElement_PR; /* GANSSAlmanacElement */ typedef struct GANSSAlmanacElement { GANSSAlmanacElement_PR present; union GANSSAlmanacElement_u { Almanac_KeplerianSet_t keplerianAlmanacSet; /* * This type is extensible, * possible extensions are below. */ } choice; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSSAlmanacElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSAlmanacElement; #ifdef __cplusplus } #endif #endif /* _GANSSAlmanacElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSAlmanacModel.c000066400000000000000000000125631305042567700237460ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSAlmanacModel.h" static int memb_weekNumber_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 255)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_toa_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 255)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ioda_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 3)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_weekNumber_constr_2 = { { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_toa_constr_4 = { { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ioda_constr_5 = { { APC_CONSTRAINED, 2, 2, 0, 3 } /* (0..3) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_GANSSAlmanacModel_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GANSSAlmanacModel, weekNumber), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_weekNumber_constraint_1, &asn_PER_memb_weekNumber_constr_2, 0, "weekNumber" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSAlmanacModel, svIDMask), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SVIDMASK, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "svIDMask" }, { ATF_POINTER, 2, offsetof(struct GANSSAlmanacModel, toa), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_toa_constraint_1, &asn_PER_memb_toa_constr_4, 0, "toa" }, { ATF_POINTER, 1, offsetof(struct GANSSAlmanacModel, ioda), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ioda_constraint_1, &asn_PER_memb_ioda_constr_5, 0, "ioda" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSAlmanacModel, ganssAlmanacList), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfGANSSAlmanacElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssAlmanacList" }, }; static int asn_MAP_GANSSAlmanacModel_oms_1[] = { 2, 3 }; static ber_tlv_tag_t asn_DEF_GANSSAlmanacModel_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GANSSAlmanacModel_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* weekNumber at 1348 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* svIDMask at 1349 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* toa at 1350 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* ioda at 1351 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* ganssAlmanacList at 1353 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GANSSAlmanacModel_specs_1 = { sizeof(struct GANSSAlmanacModel), offsetof(struct GANSSAlmanacModel, _asn_ctx), asn_MAP_GANSSAlmanacModel_tag2el_1, 5, /* Count of tags in the map */ asn_MAP_GANSSAlmanacModel_oms_1, /* Optional members */ 2, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GANSSAlmanacModel = { "GANSSAlmanacModel", "GANSSAlmanacModel", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSAlmanacModel_tags_1, sizeof(asn_DEF_GANSSAlmanacModel_tags_1) /sizeof(asn_DEF_GANSSAlmanacModel_tags_1[0]), /* 1 */ asn_DEF_GANSSAlmanacModel_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSAlmanacModel_tags_1) /sizeof(asn_DEF_GANSSAlmanacModel_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GANSSAlmanacModel_1, 5, /* Elements count */ &asn_SPC_GANSSAlmanacModel_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSAlmanacModel.h000066400000000000000000000016111305042567700237430ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSAlmanacModel_H_ #define _GANSSAlmanacModel_H_ #include /* Including external dependencies */ #include #include "SVIDMASK.h" #include "SeqOfGANSSAlmanacElement.h" #include #ifdef __cplusplus extern "C" { #endif /* GANSSAlmanacModel */ typedef struct GANSSAlmanacModel { long weekNumber; SVIDMASK_t svIDMask; long *toa /* OPTIONAL */; long *ioda /* OPTIONAL */; SeqOfGANSSAlmanacElement_t ganssAlmanacList; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSSAlmanacModel_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSAlmanacModel; #ifdef __cplusplus } #endif #endif /* _GANSSAlmanacModel_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSAssistanceData.c000066400000000000000000000117141305042567700243150ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSAssistanceData.h" int GANSSAssistanceData_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } size = st->size; if((size >= 1 && size <= 40)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using OCTET_STRING, * so here we adjust the DEF accordingly. */ static void GANSSAssistanceData_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_OCTET_STRING.free_struct; td->print_struct = asn_DEF_OCTET_STRING.print_struct; td->ber_decoder = asn_DEF_OCTET_STRING.ber_decoder; td->der_encoder = asn_DEF_OCTET_STRING.der_encoder; td->xer_decoder = asn_DEF_OCTET_STRING.xer_decoder; td->xer_encoder = asn_DEF_OCTET_STRING.xer_encoder; td->uper_decoder = asn_DEF_OCTET_STRING.uper_decoder; td->uper_encoder = asn_DEF_OCTET_STRING.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_OCTET_STRING.per_constraints; td->elements = asn_DEF_OCTET_STRING.elements; td->elements_count = asn_DEF_OCTET_STRING.elements_count; td->specifics = asn_DEF_OCTET_STRING.specifics; } void GANSSAssistanceData_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { GANSSAssistanceData_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int GANSSAssistanceData_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { GANSSAssistanceData_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t GANSSAssistanceData_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { GANSSAssistanceData_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t GANSSAssistanceData_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { GANSSAssistanceData_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t GANSSAssistanceData_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { GANSSAssistanceData_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t GANSSAssistanceData_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { GANSSAssistanceData_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t GANSSAssistanceData_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { GANSSAssistanceData_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t GANSSAssistanceData_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { GANSSAssistanceData_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_GANSSAssistanceData_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 6, 6, 1, 40 } /* (SIZE(1..40)) */, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_GANSSAssistanceData_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) }; asn_TYPE_descriptor_t asn_DEF_GANSSAssistanceData = { "GANSSAssistanceData", "GANSSAssistanceData", GANSSAssistanceData_free, GANSSAssistanceData_print, GANSSAssistanceData_constraint, GANSSAssistanceData_decode_ber, GANSSAssistanceData_encode_der, GANSSAssistanceData_decode_xer, GANSSAssistanceData_encode_xer, GANSSAssistanceData_decode_uper, GANSSAssistanceData_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSAssistanceData_tags_1, sizeof(asn_DEF_GANSSAssistanceData_tags_1) /sizeof(asn_DEF_GANSSAssistanceData_tags_1[0]), /* 1 */ asn_DEF_GANSSAssistanceData_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSAssistanceData_tags_1) /sizeof(asn_DEF_GANSSAssistanceData_tags_1[0]), /* 1 */ &asn_PER_type_GANSSAssistanceData_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSAssistanceData.h000066400000000000000000000020151305042567700243140ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSAssistanceData_H_ #define _GANSSAssistanceData_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* GANSSAssistanceData */ typedef OCTET_STRING_t GANSSAssistanceData_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSAssistanceData; asn_struct_free_f GANSSAssistanceData_free; asn_struct_print_f GANSSAssistanceData_print; asn_constr_check_f GANSSAssistanceData_constraint; ber_type_decoder_f GANSSAssistanceData_decode_ber; der_type_encoder_f GANSSAssistanceData_encode_der; xer_type_decoder_f GANSSAssistanceData_decode_xer; xer_type_encoder_f GANSSAssistanceData_encode_xer; per_type_decoder_f GANSSAssistanceData_decode_uper; per_type_encoder_f GANSSAssistanceData_encode_uper; #ifdef __cplusplus } #endif #endif /* _GANSSAssistanceData_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSClockModel.c000066400000000000000000000034721305042567700234440ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSClockModel.h" static asn_per_constraints_t asn_PER_type_GANSSClockModel_constr_1 = { { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_GANSSClockModel_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GANSSClockModel, choice.standardClockModelList), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfStandardClockModelElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "standardClockModelList" }, }; static asn_TYPE_tag2member_t asn_MAP_GANSSClockModel_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* standardClockModelList at 1274 */ }; static asn_CHOICE_specifics_t asn_SPC_GANSSClockModel_specs_1 = { sizeof(struct GANSSClockModel), offsetof(struct GANSSClockModel, _asn_ctx), offsetof(struct GANSSClockModel, present), sizeof(((struct GANSSClockModel *)0)->present), asn_MAP_GANSSClockModel_tag2el_1, 1, /* Count of tags in the map */ 0, 1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_GANSSClockModel = { "GANSSClockModel", "GANSSClockModel", CHOICE_free, CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_decode_uper, CHOICE_encode_uper, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ &asn_PER_type_GANSSClockModel_constr_1, asn_MBR_GANSSClockModel_1, 1, /* Elements count */ &asn_SPC_GANSSClockModel_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSClockModel.h000066400000000000000000000021401305042567700234400ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSClockModel_H_ #define _GANSSClockModel_H_ #include /* Including external dependencies */ #include "SeqOfStandardClockModelElement.h" #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum GANSSClockModel_PR { GANSSClockModel_PR_NOTHING, /* No components present */ GANSSClockModel_PR_standardClockModelList, /* Extensions may appear below */ } GANSSClockModel_PR; /* GANSSClockModel */ typedef struct GANSSClockModel { GANSSClockModel_PR present; union GANSSClockModel_u { SeqOfStandardClockModelElement_t standardClockModelList; /* * This type is extensible, * possible extensions are below. */ } choice; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSSClockModel_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSClockModel; #ifdef __cplusplus } #endif #endif /* _GANSSClockModel_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSCommonAssistData.c000066400000000000000000000055251305042567700246420ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSCommonAssistData.h" static asn_TYPE_member_t asn_MBR_GANSSCommonAssistData_1[] = { { ATF_POINTER, 3, offsetof(struct GANSSCommonAssistData, ganssReferenceTime), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSSReferenceTime, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssReferenceTime" }, { ATF_POINTER, 2, offsetof(struct GANSSCommonAssistData, ganssRefLocation), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSSRefLocation, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssRefLocation" }, { ATF_POINTER, 1, offsetof(struct GANSSCommonAssistData, ganssIonosphericModel), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSSIonosphericModel, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssIonosphericModel" }, }; static int asn_MAP_GANSSCommonAssistData_oms_1[] = { 0, 1, 2 }; static ber_tlv_tag_t asn_DEF_GANSSCommonAssistData_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GANSSCommonAssistData_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ganssReferenceTime at 1071 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ganssRefLocation at 1072 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* ganssIonosphericModel at 1073 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GANSSCommonAssistData_specs_1 = { sizeof(struct GANSSCommonAssistData), offsetof(struct GANSSCommonAssistData, _asn_ctx), asn_MAP_GANSSCommonAssistData_tag2el_1, 3, /* Count of tags in the map */ asn_MAP_GANSSCommonAssistData_oms_1, /* Optional members */ 3, 0, /* Root/Additions */ 2, /* Start extensions */ 4 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GANSSCommonAssistData = { "GANSSCommonAssistData", "GANSSCommonAssistData", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSCommonAssistData_tags_1, sizeof(asn_DEF_GANSSCommonAssistData_tags_1) /sizeof(asn_DEF_GANSSCommonAssistData_tags_1[0]), /* 1 */ asn_DEF_GANSSCommonAssistData_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSCommonAssistData_tags_1) /sizeof(asn_DEF_GANSSCommonAssistData_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GANSSCommonAssistData_1, 3, /* Elements count */ &asn_SPC_GANSSCommonAssistData_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSCommonAssistData.h000066400000000000000000000022641305042567700246440ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSCommonAssistData_H_ #define _GANSSCommonAssistData_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct GANSSReferenceTime; struct GANSSRefLocation; struct GANSSIonosphericModel; /* GANSSCommonAssistData */ typedef struct GANSSCommonAssistData { struct GANSSReferenceTime *ganssReferenceTime /* OPTIONAL */; struct GANSSRefLocation *ganssRefLocation /* OPTIONAL */; struct GANSSIonosphericModel *ganssIonosphericModel /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSSCommonAssistData_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSCommonAssistData; #ifdef __cplusplus } #endif /* Referred external types */ #include "GANSSReferenceTime.h" #include "GANSSRefLocation.h" #include "GANSSIonosphericModel.h" #endif /* _GANSSCommonAssistData_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSDataBit.c000066400000000000000000000112131305042567700227300ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSDataBit.h" int GANSSDataBit_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void GANSSDataBit_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void GANSSDataBit_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { GANSSDataBit_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int GANSSDataBit_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { GANSSDataBit_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t GANSSDataBit_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { GANSSDataBit_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t GANSSDataBit_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { GANSSDataBit_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t GANSSDataBit_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { GANSSDataBit_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t GANSSDataBit_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { GANSSDataBit_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t GANSSDataBit_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { GANSSDataBit_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t GANSSDataBit_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { GANSSDataBit_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_GANSSDataBit_constr_1 = { { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_GANSSDataBit_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_GANSSDataBit = { "GANSSDataBit", "GANSSDataBit", GANSSDataBit_free, GANSSDataBit_print, GANSSDataBit_constraint, GANSSDataBit_decode_ber, GANSSDataBit_encode_der, GANSSDataBit_decode_xer, GANSSDataBit_encode_xer, GANSSDataBit_decode_uper, GANSSDataBit_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSDataBit_tags_1, sizeof(asn_DEF_GANSSDataBit_tags_1) /sizeof(asn_DEF_GANSSDataBit_tags_1[0]), /* 1 */ asn_DEF_GANSSDataBit_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSDataBit_tags_1) /sizeof(asn_DEF_GANSSDataBit_tags_1[0]), /* 1 */ &asn_PER_type_GANSSDataBit_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSDataBit.h000066400000000000000000000016331305042567700227420ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSDataBit_H_ #define _GANSSDataBit_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* GANSSDataBit */ typedef long GANSSDataBit_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSDataBit; asn_struct_free_f GANSSDataBit_free; asn_struct_print_f GANSSDataBit_print; asn_constr_check_f GANSSDataBit_constraint; ber_type_decoder_f GANSSDataBit_decode_ber; der_type_encoder_f GANSSDataBit_encode_der; xer_type_decoder_f GANSSDataBit_decode_xer; xer_type_encoder_f GANSSDataBit_encode_xer; per_type_decoder_f GANSSDataBit_decode_uper; per_type_encoder_f GANSSDataBit_encode_uper; #ifdef __cplusplus } #endif #endif /* _GANSSDataBit_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSDataBitAssist.c000066400000000000000000000105061305042567700241230ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSDataBitAssist.h" static int memb_ganssTOD_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 59)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ganssDataTypeID_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 2)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_ganssTOD_constr_2 = { { APC_CONSTRAINED, 6, 6, 0, 59 } /* (0..59) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ganssDataTypeID_constr_4 = { { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_GANSSDataBitAssist_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GANSSDataBitAssist, ganssTOD), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ganssTOD_constraint_1, &asn_PER_memb_ganssTOD_constr_2, 0, "ganssTOD" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSDataBitAssist, svID), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SVID, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "svID" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSDataBitAssist, ganssDataTypeID), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ganssDataTypeID_constraint_1, &asn_PER_memb_ganssDataTypeID_constr_4, 0, "ganssDataTypeID" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSDataBitAssist, ganssDataBits), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOf_GANSSDataBits, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssDataBits" }, }; static ber_tlv_tag_t asn_DEF_GANSSDataBitAssist_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GANSSDataBitAssist_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ganssTOD at 1307 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* svID at 1308 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* ganssDataTypeID at 1309 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* ganssDataBits at 1313 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GANSSDataBitAssist_specs_1 = { sizeof(struct GANSSDataBitAssist), offsetof(struct GANSSDataBitAssist, _asn_ctx), asn_MAP_GANSSDataBitAssist_tag2el_1, 4, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GANSSDataBitAssist = { "GANSSDataBitAssist", "GANSSDataBitAssist", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSDataBitAssist_tags_1, sizeof(asn_DEF_GANSSDataBitAssist_tags_1) /sizeof(asn_DEF_GANSSDataBitAssist_tags_1[0]), /* 1 */ asn_DEF_GANSSDataBitAssist_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSDataBitAssist_tags_1) /sizeof(asn_DEF_GANSSDataBitAssist_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GANSSDataBitAssist_1, 4, /* Elements count */ &asn_SPC_GANSSDataBitAssist_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSDataBitAssist.h000066400000000000000000000015261305042567700241320ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSDataBitAssist_H_ #define _GANSSDataBitAssist_H_ #include /* Including external dependencies */ #include #include "SVID.h" #include "SeqOf-GANSSDataBits.h" #include #ifdef __cplusplus extern "C" { #endif /* GANSSDataBitAssist */ typedef struct GANSSDataBitAssist { long ganssTOD; SVID_t svID; long ganssDataTypeID; SeqOf_GANSSDataBits_t ganssDataBits; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSSDataBitAssist_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSDataBitAssist; #ifdef __cplusplus } #endif #endif /* _GANSSDataBitAssist_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSDiffCorrections.c000066400000000000000000000057451305042567700245200ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSDiffCorrections.h" static int memb_dganssRefTime_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 119)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_dganssRefTime_constr_2 = { { APC_CONSTRAINED, 7, 7, 0, 119 } /* (0..119) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_GANSSDiffCorrections_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GANSSDiffCorrections, dganssRefTime), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_dganssRefTime_constraint_1, &asn_PER_memb_dganssRefTime_constr_2, 0, "dganssRefTime" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSDiffCorrections, sgnTypeList), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfSgnTypeElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "sgnTypeList" }, }; static ber_tlv_tag_t asn_DEF_GANSSDiffCorrections_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GANSSDiffCorrections_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* dganssRefTime at 1186 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* sgnTypeList at 1190 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GANSSDiffCorrections_specs_1 = { sizeof(struct GANSSDiffCorrections), offsetof(struct GANSSDiffCorrections, _asn_ctx), asn_MAP_GANSSDiffCorrections_tag2el_1, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GANSSDiffCorrections = { "GANSSDiffCorrections", "GANSSDiffCorrections", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSDiffCorrections_tags_1, sizeof(asn_DEF_GANSSDiffCorrections_tags_1) /sizeof(asn_DEF_GANSSDiffCorrections_tags_1[0]), /* 1 */ asn_DEF_GANSSDiffCorrections_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSDiffCorrections_tags_1) /sizeof(asn_DEF_GANSSDiffCorrections_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GANSSDiffCorrections_1, 2, /* Elements count */ &asn_SPC_GANSSDiffCorrections_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSDiffCorrections.h000066400000000000000000000014561305042567700245200ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSDiffCorrections_H_ #define _GANSSDiffCorrections_H_ #include /* Including external dependencies */ #include #include "SeqOfSgnTypeElement.h" #include #ifdef __cplusplus extern "C" { #endif /* GANSSDiffCorrections */ typedef struct GANSSDiffCorrections { long dganssRefTime; SeqOfSgnTypeElement_t sgnTypeList; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSSDiffCorrections_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSDiffCorrections; #ifdef __cplusplus } #endif #endif /* _GANSSDiffCorrections_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSGenericAssistDataElement.c000066400000000000000000000141471305042567700263000ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSGenericAssistDataElement.h" static int memb_ganssID_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 7)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_ganssID_constr_2 = { { APC_CONSTRAINED, 3, 3, 0, 7 } /* (0..7) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_GANSSGenericAssistDataElement_1[] = { { ATF_POINTER, 9, offsetof(struct GANSSGenericAssistDataElement, ganssID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ganssID_constraint_1, &asn_PER_memb_ganssID_constr_2, 0, "ganssID" }, { ATF_POINTER, 8, offsetof(struct GANSSGenericAssistDataElement, ganssTimeModel), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfGANSSTimeModel, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssTimeModel" }, { ATF_POINTER, 7, offsetof(struct GANSSGenericAssistDataElement, ganssDiffCorrections), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSSDiffCorrections, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssDiffCorrections" }, { ATF_POINTER, 6, offsetof(struct GANSSGenericAssistDataElement, ganssNavigationModel), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSSNavModel, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssNavigationModel" }, { ATF_POINTER, 5, offsetof(struct GANSSGenericAssistDataElement, ganssRealTimeIntegrity), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSSRealTimeIntegrity, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssRealTimeIntegrity" }, { ATF_POINTER, 4, offsetof(struct GANSSGenericAssistDataElement, ganssDataBitAssist), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSSDataBitAssist, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssDataBitAssist" }, { ATF_POINTER, 3, offsetof(struct GANSSGenericAssistDataElement, ganssRefMeasurementAssist), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSSRefMeasurementAssist, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssRefMeasurementAssist" }, { ATF_POINTER, 2, offsetof(struct GANSSGenericAssistDataElement, ganssAlmanacModel), (ASN_TAG_CLASS_CONTEXT | (7 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSSAlmanacModel, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssAlmanacModel" }, { ATF_POINTER, 1, offsetof(struct GANSSGenericAssistDataElement, ganssUTCModel), (ASN_TAG_CLASS_CONTEXT | (8 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSSUTCModel, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssUTCModel" }, }; static int asn_MAP_GANSSGenericAssistDataElement_oms_1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; static ber_tlv_tag_t asn_DEF_GANSSGenericAssistDataElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GANSSGenericAssistDataElement_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ganssID at 1082 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ganssTimeModel at 1083 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* ganssDiffCorrections at 1084 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* ganssNavigationModel at 1085 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* ganssRealTimeIntegrity at 1086 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* ganssDataBitAssist at 1087 */ { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* ganssRefMeasurementAssist at 1088 */ { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 }, /* ganssAlmanacModel at 1089 */ { (ASN_TAG_CLASS_CONTEXT | (8 << 2)), 8, 0, 0 } /* ganssUTCModel at 1090 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GANSSGenericAssistDataElement_specs_1 = { sizeof(struct GANSSGenericAssistDataElement), offsetof(struct GANSSGenericAssistDataElement, _asn_ctx), asn_MAP_GANSSGenericAssistDataElement_tag2el_1, 9, /* Count of tags in the map */ asn_MAP_GANSSGenericAssistDataElement_oms_1, /* Optional members */ 9, 0, /* Root/Additions */ 8, /* Start extensions */ 10 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GANSSGenericAssistDataElement = { "GANSSGenericAssistDataElement", "GANSSGenericAssistDataElement", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSGenericAssistDataElement_tags_1, sizeof(asn_DEF_GANSSGenericAssistDataElement_tags_1) /sizeof(asn_DEF_GANSSGenericAssistDataElement_tags_1[0]), /* 1 */ asn_DEF_GANSSGenericAssistDataElement_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSGenericAssistDataElement_tags_1) /sizeof(asn_DEF_GANSSGenericAssistDataElement_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GANSSGenericAssistDataElement_1, 9, /* Elements count */ &asn_SPC_GANSSGenericAssistDataElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSGenericAssistDataElement.h000066400000000000000000000036221305042567700263010ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSGenericAssistDataElement_H_ #define _GANSSGenericAssistDataElement_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct SeqOfGANSSTimeModel; struct GANSSDiffCorrections; struct GANSSNavModel; struct GANSSRealTimeIntegrity; struct GANSSDataBitAssist; struct GANSSRefMeasurementAssist; struct GANSSAlmanacModel; struct GANSSUTCModel; /* GANSSGenericAssistDataElement */ typedef struct GANSSGenericAssistDataElement { long *ganssID /* OPTIONAL */; struct SeqOfGANSSTimeModel *ganssTimeModel /* OPTIONAL */; struct GANSSDiffCorrections *ganssDiffCorrections /* OPTIONAL */; struct GANSSNavModel *ganssNavigationModel /* OPTIONAL */; struct GANSSRealTimeIntegrity *ganssRealTimeIntegrity /* OPTIONAL */; struct GANSSDataBitAssist *ganssDataBitAssist /* OPTIONAL */; struct GANSSRefMeasurementAssist *ganssRefMeasurementAssist /* OPTIONAL */; struct GANSSAlmanacModel *ganssAlmanacModel /* OPTIONAL */; struct GANSSUTCModel *ganssUTCModel /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSSGenericAssistDataElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSGenericAssistDataElement; #ifdef __cplusplus } #endif /* Referred external types */ #include "SeqOfGANSSTimeModel.h" #include "GANSSDiffCorrections.h" #include "GANSSNavModel.h" #include "GANSSRealTimeIntegrity.h" #include "GANSSDataBitAssist.h" #include "GANSSRefMeasurementAssist.h" #include "GANSSAlmanacModel.h" #include "GANSSUTCModel.h" #endif /* _GANSSGenericAssistDataElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSIonoStormFlags.c000066400000000000000000000156031305042567700243350ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSIonoStormFlags.h" static int memb_ionoStormFlag1_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ionoStormFlag2_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ionoStormFlag3_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ionoStormFlag4_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ionoStormFlag5_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_ionoStormFlag1_constr_2 = { { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ionoStormFlag2_constr_3 = { { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ionoStormFlag3_constr_4 = { { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ionoStormFlag4_constr_5 = { { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ionoStormFlag5_constr_6 = { { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_GANSSIonoStormFlags_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GANSSIonoStormFlags, ionoStormFlag1), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ionoStormFlag1_constraint_1, &asn_PER_memb_ionoStormFlag1_constr_2, 0, "ionoStormFlag1" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSIonoStormFlags, ionoStormFlag2), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ionoStormFlag2_constraint_1, &asn_PER_memb_ionoStormFlag2_constr_3, 0, "ionoStormFlag2" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSIonoStormFlags, ionoStormFlag3), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ionoStormFlag3_constraint_1, &asn_PER_memb_ionoStormFlag3_constr_4, 0, "ionoStormFlag3" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSIonoStormFlags, ionoStormFlag4), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ionoStormFlag4_constraint_1, &asn_PER_memb_ionoStormFlag4_constr_5, 0, "ionoStormFlag4" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSIonoStormFlags, ionoStormFlag5), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ionoStormFlag5_constraint_1, &asn_PER_memb_ionoStormFlag5_constr_6, 0, "ionoStormFlag5" }, }; static ber_tlv_tag_t asn_DEF_GANSSIonoStormFlags_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GANSSIonoStormFlags_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ionoStormFlag1 at 1152 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ionoStormFlag2 at 1153 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* ionoStormFlag3 at 1154 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* ionoStormFlag4 at 1155 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* ionoStormFlag5 at 1156 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GANSSIonoStormFlags_specs_1 = { sizeof(struct GANSSIonoStormFlags), offsetof(struct GANSSIonoStormFlags, _asn_ctx), asn_MAP_GANSSIonoStormFlags_tag2el_1, 5, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GANSSIonoStormFlags = { "GANSSIonoStormFlags", "GANSSIonoStormFlags", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSIonoStormFlags_tags_1, sizeof(asn_DEF_GANSSIonoStormFlags_tags_1) /sizeof(asn_DEF_GANSSIonoStormFlags_tags_1[0]), /* 1 */ asn_DEF_GANSSIonoStormFlags_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSIonoStormFlags_tags_1) /sizeof(asn_DEF_GANSSIonoStormFlags_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GANSSIonoStormFlags_1, 5, /* Elements count */ &asn_SPC_GANSSIonoStormFlags_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSIonoStormFlags.h000066400000000000000000000014761305042567700243450ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSIonoStormFlags_H_ #define _GANSSIonoStormFlags_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* GANSSIonoStormFlags */ typedef struct GANSSIonoStormFlags { long ionoStormFlag1; long ionoStormFlag2; long ionoStormFlag3; long ionoStormFlag4; long ionoStormFlag5; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSSIonoStormFlags_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSIonoStormFlags; #ifdef __cplusplus } #endif #endif /* _GANSSIonoStormFlags_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSIonosphereModel.c000066400000000000000000000110731305042567700245200ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSIonosphereModel.h" static int memb_ai0_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 4095)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ai1_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 4095)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ai2_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 4095)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_ai0_constr_2 = { { APC_CONSTRAINED, 12, 12, 0, 4095 } /* (0..4095) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ai1_constr_3 = { { APC_CONSTRAINED, 12, 12, 0, 4095 } /* (0..4095) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ai2_constr_4 = { { APC_CONSTRAINED, 12, 12, 0, 4095 } /* (0..4095) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_GANSSIonosphereModel_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GANSSIonosphereModel, ai0), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ai0_constraint_1, &asn_PER_memb_ai0_constr_2, 0, "ai0" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSIonosphereModel, ai1), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ai1_constraint_1, &asn_PER_memb_ai1_constr_3, 0, "ai1" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSIonosphereModel, ai2), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ai2_constraint_1, &asn_PER_memb_ai2_constr_4, 0, "ai2" }, }; static ber_tlv_tag_t asn_DEF_GANSSIonosphereModel_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GANSSIonosphereModel_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ai0 at 1145 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ai1 at 1146 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* ai2 at 1147 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GANSSIonosphereModel_specs_1 = { sizeof(struct GANSSIonosphereModel), offsetof(struct GANSSIonosphereModel, _asn_ctx), asn_MAP_GANSSIonosphereModel_tag2el_1, 3, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GANSSIonosphereModel = { "GANSSIonosphereModel", "GANSSIonosphereModel", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSIonosphereModel_tags_1, sizeof(asn_DEF_GANSSIonosphereModel_tags_1) /sizeof(asn_DEF_GANSSIonosphereModel_tags_1[0]), /* 1 */ asn_DEF_GANSSIonosphereModel_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSIonosphereModel_tags_1) /sizeof(asn_DEF_GANSSIonosphereModel_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GANSSIonosphereModel_1, 3, /* Elements count */ &asn_SPC_GANSSIonosphereModel_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSIonosphereModel.h000066400000000000000000000013661305042567700245310ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSIonosphereModel_H_ #define _GANSSIonosphereModel_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* GANSSIonosphereModel */ typedef struct GANSSIonosphereModel { long ai0; long ai1; long ai2; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSSIonosphereModel_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSIonosphereModel; #ifdef __cplusplus } #endif #endif /* _GANSSIonosphereModel_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSIonosphericModel.c000066400000000000000000000046611305042567700246740ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSIonosphericModel.h" static asn_TYPE_member_t asn_MBR_GANSSIonosphericModel_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GANSSIonosphericModel, ganssIonoModel), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSSIonosphereModel, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssIonoModel" }, { ATF_POINTER, 1, offsetof(struct GANSSIonosphericModel, ganssIonoStormFlags), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSSIonoStormFlags, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssIonoStormFlags" }, }; static int asn_MAP_GANSSIonosphericModel_oms_1[] = { 1 }; static ber_tlv_tag_t asn_DEF_GANSSIonosphericModel_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GANSSIonosphericModel_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ganssIonoModel at 1138 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ganssIonoStormFlags at 1139 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GANSSIonosphericModel_specs_1 = { sizeof(struct GANSSIonosphericModel), offsetof(struct GANSSIonosphericModel, _asn_ctx), asn_MAP_GANSSIonosphericModel_tag2el_1, 2, /* Count of tags in the map */ asn_MAP_GANSSIonosphericModel_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ 1, /* Start extensions */ 3 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GANSSIonosphericModel = { "GANSSIonosphericModel", "GANSSIonosphericModel", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSIonosphericModel_tags_1, sizeof(asn_DEF_GANSSIonosphericModel_tags_1) /sizeof(asn_DEF_GANSSIonosphericModel_tags_1[0]), /* 1 */ asn_DEF_GANSSIonosphericModel_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSIonosphericModel_tags_1) /sizeof(asn_DEF_GANSSIonosphericModel_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GANSSIonosphericModel_1, 2, /* Elements count */ &asn_SPC_GANSSIonosphericModel_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSIonosphericModel.h000066400000000000000000000020131305042567700246660ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSIonosphericModel_H_ #define _GANSSIonosphericModel_H_ #include /* Including external dependencies */ #include "GANSSIonosphereModel.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct GANSSIonoStormFlags; /* GANSSIonosphericModel */ typedef struct GANSSIonosphericModel { GANSSIonosphereModel_t ganssIonoModel; struct GANSSIonoStormFlags *ganssIonoStormFlags /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSSIonosphericModel_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSIonosphericModel; #ifdef __cplusplus } #endif /* Referred external types */ #include "GANSSIonoStormFlags.h" #endif /* _GANSSIonosphericModel_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSLocationInfo.c000066400000000000000000000160171305042567700240130ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSLocationInfo.h" static int memb_ganssTODFrac_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 16384)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ganssTimeID_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 3)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_stationaryIndication_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_ganssTODFrac_constr_4 = { { APC_CONSTRAINED, 15, 15, 0, 16384 } /* (0..16384) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ganssTimeID_constr_6 = { { APC_CONSTRAINED, 2, 2, 0, 3 } /* (0..3) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_stationaryIndication_constr_9 = { { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_GANSSLocationInfo_1[] = { { ATF_POINTER, 5, offsetof(struct GANSSLocationInfo, referenceFrame), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_ReferenceFrame, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "referenceFrame" }, { ATF_POINTER, 4, offsetof(struct GANSSLocationInfo, ganssTODm), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSSTODm, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssTODm" }, { ATF_POINTER, 3, offsetof(struct GANSSLocationInfo, ganssTODFrac), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ganssTODFrac_constraint_1, &asn_PER_memb_ganssTODFrac_constr_4, 0, "ganssTODFrac" }, { ATF_POINTER, 2, offsetof(struct GANSSLocationInfo, ganssTODUncertainty), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSSTODUncertainty, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssTODUncertainty" }, { ATF_POINTER, 1, offsetof(struct GANSSLocationInfo, ganssTimeID), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ganssTimeID_constraint_1, &asn_PER_memb_ganssTimeID_constr_6, 0, "ganssTimeID" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSLocationInfo, fixType), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_FixType, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "fixType" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSLocationInfo, posData), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_PositionData, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "posData" }, { ATF_POINTER, 1, offsetof(struct GANSSLocationInfo, stationaryIndication), (ASN_TAG_CLASS_CONTEXT | (7 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_stationaryIndication_constraint_1, &asn_PER_memb_stationaryIndication_constr_9, 0, "stationaryIndication" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSLocationInfo, posEstimate), (ASN_TAG_CLASS_CONTEXT | (8 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Ext_GeographicalInformation, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "posEstimate" }, }; static int asn_MAP_GANSSLocationInfo_oms_1[] = { 0, 1, 2, 3, 4, 7 }; static ber_tlv_tag_t asn_DEF_GANSSLocationInfo_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GANSSLocationInfo_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* referenceFrame at 1411 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ganssTODm at 1412 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* ganssTODFrac at 1413 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* ganssTODUncertainty at 1414 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* ganssTimeID at 1415 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* fixType at 1416 */ { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* posData at 1417 */ { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 }, /* stationaryIndication at 1418 */ { (ASN_TAG_CLASS_CONTEXT | (8 << 2)), 8, 0, 0 } /* posEstimate at 1424 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GANSSLocationInfo_specs_1 = { sizeof(struct GANSSLocationInfo), offsetof(struct GANSSLocationInfo, _asn_ctx), asn_MAP_GANSSLocationInfo_tag2el_1, 9, /* Count of tags in the map */ asn_MAP_GANSSLocationInfo_oms_1, /* Optional members */ 6, 0, /* Root/Additions */ 8, /* Start extensions */ 10 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GANSSLocationInfo = { "GANSSLocationInfo", "GANSSLocationInfo", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSLocationInfo_tags_1, sizeof(asn_DEF_GANSSLocationInfo_tags_1) /sizeof(asn_DEF_GANSSLocationInfo_tags_1[0]), /* 1 */ asn_DEF_GANSSLocationInfo_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSLocationInfo_tags_1) /sizeof(asn_DEF_GANSSLocationInfo_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GANSSLocationInfo_1, 9, /* Elements count */ &asn_SPC_GANSSLocationInfo_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSLocationInfo.h000066400000000000000000000025561305042567700240230ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSLocationInfo_H_ #define _GANSSLocationInfo_H_ #include /* Including external dependencies */ #include "GANSSTODm.h" #include #include "GANSSTODUncertainty.h" #include "FixType.h" #include "PositionData.h" #include "Ext-GeographicalInformation.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct ReferenceFrame; /* GANSSLocationInfo */ typedef struct GANSSLocationInfo { struct ReferenceFrame *referenceFrame /* OPTIONAL */; GANSSTODm_t *ganssTODm /* OPTIONAL */; long *ganssTODFrac /* OPTIONAL */; GANSSTODUncertainty_t *ganssTODUncertainty /* OPTIONAL */; long *ganssTimeID /* OPTIONAL */; FixType_t fixType; PositionData_t posData; long *stationaryIndication /* OPTIONAL */; Ext_GeographicalInformation_t posEstimate; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSSLocationInfo_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSLocationInfo; #ifdef __cplusplus } #endif /* Referred external types */ #include "ReferenceFrame.h" #endif /* _GANSSLocationInfo_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSMeasureInfo.c000066400000000000000000000035321305042567700236420ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSMeasureInfo.h" static asn_TYPE_member_t asn_MBR_GANSSMeasureInfo_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GANSSMeasureInfo, ganssMsrSetList), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfGANSS_MsrSetElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssMsrSetList" }, }; static ber_tlv_tag_t asn_DEF_GANSSMeasureInfo_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GANSSMeasureInfo_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* ganssMsrSetList at 1451 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GANSSMeasureInfo_specs_1 = { sizeof(struct GANSSMeasureInfo), offsetof(struct GANSSMeasureInfo, _asn_ctx), asn_MAP_GANSSMeasureInfo_tag2el_1, 1, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GANSSMeasureInfo = { "GANSSMeasureInfo", "GANSSMeasureInfo", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSMeasureInfo_tags_1, sizeof(asn_DEF_GANSSMeasureInfo_tags_1) /sizeof(asn_DEF_GANSSMeasureInfo_tags_1[0]), /* 1 */ asn_DEF_GANSSMeasureInfo_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSMeasureInfo_tags_1) /sizeof(asn_DEF_GANSSMeasureInfo_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GANSSMeasureInfo_1, 1, /* Elements count */ &asn_SPC_GANSSMeasureInfo_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSMeasureInfo.h000066400000000000000000000013571305042567700236520ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSMeasureInfo_H_ #define _GANSSMeasureInfo_H_ #include /* Including external dependencies */ #include "SeqOfGANSS-MsrSetElement.h" #include #ifdef __cplusplus extern "C" { #endif /* GANSSMeasureInfo */ typedef struct GANSSMeasureInfo { SeqOfGANSS_MsrSetElement_t ganssMsrSetList; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSSMeasureInfo_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSMeasureInfo; #ifdef __cplusplus } #endif #endif /* _GANSSMeasureInfo_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSNavModel.c000066400000000000000000000140421305042567700231300ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSNavModel.h" static int memb_nonBroadcastIndFlag_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_toeMSB_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 31)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_eMSB_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_sqrtAMBS_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 63)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_nonBroadcastIndFlag_constr_2 = { { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_toeMSB_constr_3 = { { APC_CONSTRAINED, 5, 5, 0, 31 } /* (0..31) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_eMSB_constr_4 = { { APC_CONSTRAINED, 7, 7, 0, 127 } /* (0..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_sqrtAMBS_constr_5 = { { APC_CONSTRAINED, 6, 6, 0, 63 } /* (0..63) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_GANSSNavModel_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GANSSNavModel, nonBroadcastIndFlag), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_nonBroadcastIndFlag_constraint_1, &asn_PER_memb_nonBroadcastIndFlag_constr_2, 0, "nonBroadcastIndFlag" }, { ATF_POINTER, 3, offsetof(struct GANSSNavModel, toeMSB), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_toeMSB_constraint_1, &asn_PER_memb_toeMSB_constr_3, 0, "toeMSB" }, { ATF_POINTER, 2, offsetof(struct GANSSNavModel, eMSB), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_eMSB_constraint_1, &asn_PER_memb_eMSB_constr_4, 0, "eMSB" }, { ATF_POINTER, 1, offsetof(struct GANSSNavModel, sqrtAMBS), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_sqrtAMBS_constraint_1, &asn_PER_memb_sqrtAMBS_constr_5, 0, "sqrtAMBS" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSNavModel, ganssSatelliteList), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfGANSSSatelliteElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssSatelliteList" }, }; static int asn_MAP_GANSSNavModel_oms_1[] = { 1, 2, 3 }; static ber_tlv_tag_t asn_DEF_GANSSNavModel_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GANSSNavModel_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* nonBroadcastIndFlag at 1228 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* toeMSB at 1229 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* eMSB at 1230 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* sqrtAMBS at 1231 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* ganssSatelliteList at 1233 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GANSSNavModel_specs_1 = { sizeof(struct GANSSNavModel), offsetof(struct GANSSNavModel, _asn_ctx), asn_MAP_GANSSNavModel_tag2el_1, 5, /* Count of tags in the map */ asn_MAP_GANSSNavModel_oms_1, /* Optional members */ 3, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GANSSNavModel = { "GANSSNavModel", "GANSSNavModel", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSNavModel_tags_1, sizeof(asn_DEF_GANSSNavModel_tags_1) /sizeof(asn_DEF_GANSSNavModel_tags_1[0]), /* 1 */ asn_DEF_GANSSNavModel_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSNavModel_tags_1) /sizeof(asn_DEF_GANSSNavModel_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GANSSNavModel_1, 5, /* Elements count */ &asn_SPC_GANSSNavModel_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSNavModel.h000066400000000000000000000015621305042567700231400ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSNavModel_H_ #define _GANSSNavModel_H_ #include /* Including external dependencies */ #include #include "SeqOfGANSSSatelliteElement.h" #include #ifdef __cplusplus extern "C" { #endif /* GANSSNavModel */ typedef struct GANSSNavModel { long nonBroadcastIndFlag; long *toeMSB /* OPTIONAL */; long *eMSB /* OPTIONAL */; long *sqrtAMBS /* OPTIONAL */; SeqOfGANSSSatelliteElement_t ganssSatelliteList; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSSNavModel_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSNavModel; #ifdef __cplusplus } #endif #endif /* _GANSSNavModel_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSOrbitModel.c000066400000000000000000000034231305042567700234640ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSOrbitModel.h" static asn_per_constraints_t asn_PER_type_GANSSOrbitModel_constr_1 = { { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_GANSSOrbitModel_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GANSSOrbitModel, choice.keplerianSet), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NavModel_KeplerianSet, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "keplerianSet" }, }; static asn_TYPE_tag2member_t asn_MAP_GANSSOrbitModel_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* keplerianSet at 1248 */ }; static asn_CHOICE_specifics_t asn_SPC_GANSSOrbitModel_specs_1 = { sizeof(struct GANSSOrbitModel), offsetof(struct GANSSOrbitModel, _asn_ctx), offsetof(struct GANSSOrbitModel, present), sizeof(((struct GANSSOrbitModel *)0)->present), asn_MAP_GANSSOrbitModel_tag2el_1, 1, /* Count of tags in the map */ 0, 1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_GANSSOrbitModel = { "GANSSOrbitModel", "GANSSOrbitModel", CHOICE_free, CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_decode_uper, CHOICE_encode_uper, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ &asn_PER_type_GANSSOrbitModel_constr_1, asn_MBR_GANSSOrbitModel_1, 1, /* Elements count */ &asn_SPC_GANSSOrbitModel_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSOrbitModel.h000066400000000000000000000020721305042567700234700ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSOrbitModel_H_ #define _GANSSOrbitModel_H_ #include /* Including external dependencies */ #include "NavModel-KeplerianSet.h" #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum GANSSOrbitModel_PR { GANSSOrbitModel_PR_NOTHING, /* No components present */ GANSSOrbitModel_PR_keplerianSet, /* Extensions may appear below */ } GANSSOrbitModel_PR; /* GANSSOrbitModel */ typedef struct GANSSOrbitModel { GANSSOrbitModel_PR present; union GANSSOrbitModel_u { NavModel_KeplerianSet_t keplerianSet; /* * This type is extensible, * possible extensions are below. */ } choice; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSSOrbitModel_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSOrbitModel; #ifdef __cplusplus } #endif #endif /* _GANSSOrbitModel_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSPositioningMethod.c000066400000000000000000000122171305042567700250700ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSPositioningMethod.h" int GANSSPositioningMethod_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } if(st->size > 0) { /* Size in bits */ size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } if((size >= 2 && size <= 16)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using BIT_STRING, * so here we adjust the DEF accordingly. */ static void GANSSPositioningMethod_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_BIT_STRING.free_struct; td->print_struct = asn_DEF_BIT_STRING.print_struct; td->ber_decoder = asn_DEF_BIT_STRING.ber_decoder; td->der_encoder = asn_DEF_BIT_STRING.der_encoder; td->xer_decoder = asn_DEF_BIT_STRING.xer_decoder; td->xer_encoder = asn_DEF_BIT_STRING.xer_encoder; td->uper_decoder = asn_DEF_BIT_STRING.uper_decoder; td->uper_encoder = asn_DEF_BIT_STRING.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_BIT_STRING.per_constraints; td->elements = asn_DEF_BIT_STRING.elements; td->elements_count = asn_DEF_BIT_STRING.elements_count; td->specifics = asn_DEF_BIT_STRING.specifics; } void GANSSPositioningMethod_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { GANSSPositioningMethod_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int GANSSPositioningMethod_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { GANSSPositioningMethod_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t GANSSPositioningMethod_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { GANSSPositioningMethod_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t GANSSPositioningMethod_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { GANSSPositioningMethod_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t GANSSPositioningMethod_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { GANSSPositioningMethod_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t GANSSPositioningMethod_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { GANSSPositioningMethod_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t GANSSPositioningMethod_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { GANSSPositioningMethod_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t GANSSPositioningMethod_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { GANSSPositioningMethod_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_GANSSPositioningMethod_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 4, 4, 2, 16 } /* (SIZE(2..16)) */, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_GANSSPositioningMethod_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)) }; asn_TYPE_descriptor_t asn_DEF_GANSSPositioningMethod = { "GANSSPositioningMethod", "GANSSPositioningMethod", GANSSPositioningMethod_free, GANSSPositioningMethod_print, GANSSPositioningMethod_constraint, GANSSPositioningMethod_decode_ber, GANSSPositioningMethod_encode_der, GANSSPositioningMethod_decode_xer, GANSSPositioningMethod_encode_xer, GANSSPositioningMethod_decode_uper, GANSSPositioningMethod_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSPositioningMethod_tags_1, sizeof(asn_DEF_GANSSPositioningMethod_tags_1) /sizeof(asn_DEF_GANSSPositioningMethod_tags_1[0]), /* 1 */ asn_DEF_GANSSPositioningMethod_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSPositioningMethod_tags_1) /sizeof(asn_DEF_GANSSPositioningMethod_tags_1[0]), /* 1 */ &asn_PER_type_GANSSPositioningMethod_constr_1, 0, 0, /* Defined elsewhere */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSPositioningMethod.h000066400000000000000000000023211305042567700250700ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSPositioningMethod_H_ #define _GANSSPositioningMethod_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum GANSSPositioningMethod { GANSSPositioningMethod_gps = 0, GANSSPositioningMethod_galileo = 1 } e_GANSSPositioningMethod; /* GANSSPositioningMethod */ typedef BIT_STRING_t GANSSPositioningMethod_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSPositioningMethod; asn_struct_free_f GANSSPositioningMethod_free; asn_struct_print_f GANSSPositioningMethod_print; asn_constr_check_f GANSSPositioningMethod_constraint; ber_type_decoder_f GANSSPositioningMethod_decode_ber; der_type_encoder_f GANSSPositioningMethod_encode_der; xer_type_decoder_f GANSSPositioningMethod_decode_xer; xer_type_encoder_f GANSSPositioningMethod_encode_xer; per_type_decoder_f GANSSPositioningMethod_decode_uper; per_type_encoder_f GANSSPositioningMethod_encode_uper; #ifdef __cplusplus } #endif #endif /* _GANSSPositioningMethod_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSRealTimeIntegrity.c000066400000000000000000000037301305042567700250260ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSRealTimeIntegrity.h" static asn_TYPE_member_t asn_MBR_GANSSRealTimeIntegrity_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GANSSRealTimeIntegrity, ganssBadSignalList), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfBadSignalElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssBadSignalList" }, }; static ber_tlv_tag_t asn_DEF_GANSSRealTimeIntegrity_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GANSSRealTimeIntegrity_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* ganssBadSignalList at 1295 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GANSSRealTimeIntegrity_specs_1 = { sizeof(struct GANSSRealTimeIntegrity), offsetof(struct GANSSRealTimeIntegrity, _asn_ctx), asn_MAP_GANSSRealTimeIntegrity_tag2el_1, 1, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GANSSRealTimeIntegrity = { "GANSSRealTimeIntegrity", "GANSSRealTimeIntegrity", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSRealTimeIntegrity_tags_1, sizeof(asn_DEF_GANSSRealTimeIntegrity_tags_1) /sizeof(asn_DEF_GANSSRealTimeIntegrity_tags_1[0]), /* 1 */ asn_DEF_GANSSRealTimeIntegrity_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSRealTimeIntegrity_tags_1) /sizeof(asn_DEF_GANSSRealTimeIntegrity_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GANSSRealTimeIntegrity_1, 1, /* Elements count */ &asn_SPC_GANSSRealTimeIntegrity_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSRealTimeIntegrity.h000066400000000000000000000014261305042567700250330ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSRealTimeIntegrity_H_ #define _GANSSRealTimeIntegrity_H_ #include /* Including external dependencies */ #include "SeqOfBadSignalElement.h" #include #ifdef __cplusplus extern "C" { #endif /* GANSSRealTimeIntegrity */ typedef struct GANSSRealTimeIntegrity { SeqOfBadSignalElement_t ganssBadSignalList; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSSRealTimeIntegrity_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSRealTimeIntegrity; #ifdef __cplusplus } #endif #endif /* _GANSSRealTimeIntegrity_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSRefLocation.c000066400000000000000000000035321305042567700236320ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSRefLocation.h" static asn_TYPE_member_t asn_MBR_GANSSRefLocation_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GANSSRefLocation, threeDLocation), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Ext_GeographicalInformation, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "threeDLocation" }, }; static ber_tlv_tag_t asn_DEF_GANSSRefLocation_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GANSSRefLocation_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* threeDLocation at 1132 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GANSSRefLocation_specs_1 = { sizeof(struct GANSSRefLocation), offsetof(struct GANSSRefLocation, _asn_ctx), asn_MAP_GANSSRefLocation_tag2el_1, 1, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GANSSRefLocation = { "GANSSRefLocation", "GANSSRefLocation", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSRefLocation_tags_1, sizeof(asn_DEF_GANSSRefLocation_tags_1) /sizeof(asn_DEF_GANSSRefLocation_tags_1[0]), /* 1 */ asn_DEF_GANSSRefLocation_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSRefLocation_tags_1) /sizeof(asn_DEF_GANSSRefLocation_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GANSSRefLocation_1, 1, /* Elements count */ &asn_SPC_GANSSRefLocation_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSRefLocation.h000066400000000000000000000013641305042567700236400ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSRefLocation_H_ #define _GANSSRefLocation_H_ #include /* Including external dependencies */ #include "Ext-GeographicalInformation.h" #include #ifdef __cplusplus extern "C" { #endif /* GANSSRefLocation */ typedef struct GANSSRefLocation { Ext_GeographicalInformation_t threeDLocation; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSSRefLocation_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSRefLocation; #ifdef __cplusplus } #endif #endif /* _GANSSRefLocation_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSRefMeasurementAssist.c000066400000000000000000000063361305042567700255430ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSRefMeasurementAssist.h" static int memb_ganssSignalID_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 3)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_ganssSignalID_constr_2 = { { APC_CONSTRAINED, 2, 2, 0, 3 } /* (0..3) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_GANSSRefMeasurementAssist_1[] = { { ATF_POINTER, 1, offsetof(struct GANSSRefMeasurementAssist, ganssSignalID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ganssSignalID_constraint_1, &asn_PER_memb_ganssSignalID_constr_2, 0, "ganssSignalID" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSRefMeasurementAssist, ganssRefMeasAssitList), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfGANSSRefMeasurementElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssRefMeasAssitList" }, }; static int asn_MAP_GANSSRefMeasurementAssist_oms_1[] = { 0 }; static ber_tlv_tag_t asn_DEF_GANSSRefMeasurementAssist_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GANSSRefMeasurementAssist_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ganssSignalID at 1321 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ganssRefMeasAssitList at 1323 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GANSSRefMeasurementAssist_specs_1 = { sizeof(struct GANSSRefMeasurementAssist), offsetof(struct GANSSRefMeasurementAssist, _asn_ctx), asn_MAP_GANSSRefMeasurementAssist_tag2el_1, 2, /* Count of tags in the map */ asn_MAP_GANSSRefMeasurementAssist_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GANSSRefMeasurementAssist = { "GANSSRefMeasurementAssist", "GANSSRefMeasurementAssist", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSRefMeasurementAssist_tags_1, sizeof(asn_DEF_GANSSRefMeasurementAssist_tags_1) /sizeof(asn_DEF_GANSSRefMeasurementAssist_tags_1[0]), /* 1 */ asn_DEF_GANSSRefMeasurementAssist_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSRefMeasurementAssist_tags_1) /sizeof(asn_DEF_GANSSRefMeasurementAssist_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GANSSRefMeasurementAssist_1, 2, /* Elements count */ &asn_SPC_GANSSRefMeasurementAssist_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSRefMeasurementAssist.h000066400000000000000000000016021305042567700255370ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSRefMeasurementAssist_H_ #define _GANSSRefMeasurementAssist_H_ #include /* Including external dependencies */ #include #include "SeqOfGANSSRefMeasurementElement.h" #include #ifdef __cplusplus extern "C" { #endif /* GANSSRefMeasurementAssist */ typedef struct GANSSRefMeasurementAssist { long *ganssSignalID /* OPTIONAL */; SeqOfGANSSRefMeasurementElement_t ganssRefMeasAssitList; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSSRefMeasurementAssist_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSRefMeasurementAssist; #ifdef __cplusplus } #endif #endif /* _GANSSRefMeasurementAssist_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSRefMeasurementElement.c000066400000000000000000000163241305042567700256640ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSRefMeasurementElement.h" static int memb_doppler0_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -2048 && value <= 2047)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_codePhase_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1022)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_intCodePhase_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_codePhaseSearchWindow_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 31)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_doppler0_constr_3 = { { APC_CONSTRAINED, 12, 12, -2048, 2047 } /* (-2048..2047) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_codePhase_constr_5 = { { APC_CONSTRAINED, 10, 10, 0, 1022 } /* (0..1022) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_intCodePhase_constr_6 = { { APC_CONSTRAINED, 7, 7, 0, 127 } /* (0..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_codePhaseSearchWindow_constr_7 = { { APC_CONSTRAINED, 5, 5, 0, 31 } /* (0..31) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_GANSSRefMeasurementElement_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GANSSRefMeasurementElement, svID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SVID, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "svID" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSRefMeasurementElement, doppler0), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_doppler0_constraint_1, &asn_PER_memb_doppler0_constr_3, 0, "doppler0" }, { ATF_POINTER, 1, offsetof(struct GANSSRefMeasurementElement, additionalDoppler), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_AdditionalDopplerFields, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "additionalDoppler" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSRefMeasurementElement, codePhase), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_codePhase_constraint_1, &asn_PER_memb_codePhase_constr_5, 0, "codePhase" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSRefMeasurementElement, intCodePhase), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_intCodePhase_constraint_1, &asn_PER_memb_intCodePhase_constr_6, 0, "intCodePhase" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSRefMeasurementElement, codePhaseSearchWindow), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_codePhaseSearchWindow_constraint_1, &asn_PER_memb_codePhaseSearchWindow_constr_7, 0, "codePhaseSearchWindow" }, { ATF_POINTER, 1, offsetof(struct GANSSRefMeasurementElement, additionalAngle), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_AddionalAngleFields, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "additionalAngle" }, }; static int asn_MAP_GANSSRefMeasurementElement_oms_1[] = { 2, 6 }; static ber_tlv_tag_t asn_DEF_GANSSRefMeasurementElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GANSSRefMeasurementElement_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* svID at 1328 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* doppler0 at 1331 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* additionalDoppler at 1332 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* codePhase at 1333 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* intCodePhase at 1334 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* codePhaseSearchWindow at 1335 */ { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 } /* additionalAngle at 1336 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GANSSRefMeasurementElement_specs_1 = { sizeof(struct GANSSRefMeasurementElement), offsetof(struct GANSSRefMeasurementElement, _asn_ctx), asn_MAP_GANSSRefMeasurementElement_tag2el_1, 7, /* Count of tags in the map */ asn_MAP_GANSSRefMeasurementElement_oms_1, /* Optional members */ 2, 0, /* Root/Additions */ 6, /* Start extensions */ 8 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GANSSRefMeasurementElement = { "GANSSRefMeasurementElement", "GANSSRefMeasurementElement", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSRefMeasurementElement_tags_1, sizeof(asn_DEF_GANSSRefMeasurementElement_tags_1) /sizeof(asn_DEF_GANSSRefMeasurementElement_tags_1[0]), /* 1 */ asn_DEF_GANSSRefMeasurementElement_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSRefMeasurementElement_tags_1) /sizeof(asn_DEF_GANSSRefMeasurementElement_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GANSSRefMeasurementElement_1, 7, /* Elements count */ &asn_SPC_GANSSRefMeasurementElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSRefMeasurementElement.h000066400000000000000000000023711305042567700256660ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSRefMeasurementElement_H_ #define _GANSSRefMeasurementElement_H_ #include /* Including external dependencies */ #include "SVID.h" #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct AdditionalDopplerFields; struct AddionalAngleFields; /* GANSSRefMeasurementElement */ typedef struct GANSSRefMeasurementElement { SVID_t svID; long doppler0; struct AdditionalDopplerFields *additionalDoppler /* OPTIONAL */; long codePhase; long intCodePhase; long codePhaseSearchWindow; struct AddionalAngleFields *additionalAngle /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSSRefMeasurementElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSRefMeasurementElement; #ifdef __cplusplus } #endif /* Referred external types */ #include "AdditionalDopplerFields.h" #include "AddionalAngleFields.h" #endif /* _GANSSRefMeasurementElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSRefTimeInfo.c000066400000000000000000000106061305042567700235740ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSRefTimeInfo.h" static int memb_ganssDay_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 8191)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ganssTimeID_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 7)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_ganssDay_constr_2 = { { APC_CONSTRAINED, 13, 13, 0, 8191 } /* (0..8191) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ganssTimeID_constr_5 = { { APC_CONSTRAINED, 3, 3, 0, 7 } /* (0..7) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_GANSSRefTimeInfo_1[] = { { ATF_POINTER, 1, offsetof(struct GANSSRefTimeInfo, ganssDay), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ganssDay_constraint_1, &asn_PER_memb_ganssDay_constr_2, 0, "ganssDay" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSRefTimeInfo, ganssTOD), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSSTOD, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssTOD" }, { ATF_POINTER, 2, offsetof(struct GANSSRefTimeInfo, ganssTODUncertainty), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSSTODUncertainty, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssTODUncertainty" }, { ATF_POINTER, 1, offsetof(struct GANSSRefTimeInfo, ganssTimeID), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ganssTimeID_constraint_1, &asn_PER_memb_ganssTimeID_constr_5, 0, "ganssTimeID" }, }; static int asn_MAP_GANSSRefTimeInfo_oms_1[] = { 0, 2, 3 }; static ber_tlv_tag_t asn_DEF_GANSSRefTimeInfo_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GANSSRefTimeInfo_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ganssDay at 1104 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ganssTOD at 1105 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* ganssTODUncertainty at 1106 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* ganssTimeID at 1107 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GANSSRefTimeInfo_specs_1 = { sizeof(struct GANSSRefTimeInfo), offsetof(struct GANSSRefTimeInfo, _asn_ctx), asn_MAP_GANSSRefTimeInfo_tag2el_1, 4, /* Count of tags in the map */ asn_MAP_GANSSRefTimeInfo_oms_1, /* Optional members */ 3, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GANSSRefTimeInfo = { "GANSSRefTimeInfo", "GANSSRefTimeInfo", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSRefTimeInfo_tags_1, sizeof(asn_DEF_GANSSRefTimeInfo_tags_1) /sizeof(asn_DEF_GANSSRefTimeInfo_tags_1[0]), /* 1 */ asn_DEF_GANSSRefTimeInfo_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSRefTimeInfo_tags_1) /sizeof(asn_DEF_GANSSRefTimeInfo_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GANSSRefTimeInfo_1, 4, /* Elements count */ &asn_SPC_GANSSRefTimeInfo_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSRefTimeInfo.h000066400000000000000000000016031305042567700235760ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSRefTimeInfo_H_ #define _GANSSRefTimeInfo_H_ #include /* Including external dependencies */ #include #include "GANSSTOD.h" #include "GANSSTODUncertainty.h" #include #ifdef __cplusplus extern "C" { #endif /* GANSSRefTimeInfo */ typedef struct GANSSRefTimeInfo { long *ganssDay /* OPTIONAL */; GANSSTOD_t ganssTOD; GANSSTODUncertainty_t *ganssTODUncertainty /* OPTIONAL */; long *ganssTimeID /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSSRefTimeInfo_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSRefTimeInfo; #ifdef __cplusplus } #endif #endif /* _GANSSRefTimeInfo_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSReferenceTime.c000066400000000000000000000046201305042567700241410ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSReferenceTime.h" static asn_TYPE_member_t asn_MBR_GANSSReferenceTime_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GANSSReferenceTime, ganssRefTimeInfo), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSSRefTimeInfo, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssRefTimeInfo" }, { ATF_POINTER, 1, offsetof(struct GANSSReferenceTime, ganssTOD_GSMTimeAssociation), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSSTOD_GSMTimeAssociation, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssTOD-GSMTimeAssociation" }, }; static int asn_MAP_GANSSReferenceTime_oms_1[] = { 1 }; static ber_tlv_tag_t asn_DEF_GANSSReferenceTime_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GANSSReferenceTime_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ganssRefTimeInfo at 1098 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ganssTOD-GSMTimeAssociation at 1099 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GANSSReferenceTime_specs_1 = { sizeof(struct GANSSReferenceTime), offsetof(struct GANSSReferenceTime, _asn_ctx), asn_MAP_GANSSReferenceTime_tag2el_1, 2, /* Count of tags in the map */ asn_MAP_GANSSReferenceTime_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GANSSReferenceTime = { "GANSSReferenceTime", "GANSSReferenceTime", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSReferenceTime_tags_1, sizeof(asn_DEF_GANSSReferenceTime_tags_1) /sizeof(asn_DEF_GANSSReferenceTime_tags_1[0]), /* 1 */ asn_DEF_GANSSReferenceTime_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSReferenceTime_tags_1) /sizeof(asn_DEF_GANSSReferenceTime_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GANSSReferenceTime_1, 2, /* Elements count */ &asn_SPC_GANSSReferenceTime_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSReferenceTime.h000066400000000000000000000017071305042567700241510ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSReferenceTime_H_ #define _GANSSReferenceTime_H_ #include /* Including external dependencies */ #include "GANSSRefTimeInfo.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct GANSSTOD_GSMTimeAssociation; /* GANSSReferenceTime */ typedef struct GANSSReferenceTime { GANSSRefTimeInfo_t ganssRefTimeInfo; struct GANSSTOD_GSMTimeAssociation *ganssTOD_GSMTimeAssociation /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSSReferenceTime_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSReferenceTime; #ifdef __cplusplus } #endif /* Referred external types */ #include "GANSSTOD-GSMTimeAssociation.h" #endif /* _GANSSReferenceTime_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSSatelliteElement.c000066400000000000000000000113141305042567700246620ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSSatelliteElement.h" static int memb_svHealth_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -7 && value <= 13)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_iod_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1023)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_svHealth_constr_3 = { { APC_CONSTRAINED, 5, 5, -7, 13 } /* (-7..13) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_iod_constr_4 = { { APC_CONSTRAINED, 10, 10, 0, 1023 } /* (0..1023) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_GANSSSatelliteElement_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GANSSSatelliteElement, svID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SVID, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "svID" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSSatelliteElement, svHealth), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_svHealth_constraint_1, &asn_PER_memb_svHealth_constr_3, 0, "svHealth" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSSatelliteElement, iod), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_iod_constraint_1, &asn_PER_memb_iod_constr_4, 0, "iod" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSSatelliteElement, ganssClockModel), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), +1, /* EXPLICIT tag at current level */ &asn_DEF_GANSSClockModel, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssClockModel" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSSatelliteElement, ganssOrbitModel), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), +1, /* EXPLICIT tag at current level */ &asn_DEF_GANSSOrbitModel, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssOrbitModel" }, }; static ber_tlv_tag_t asn_DEF_GANSSSatelliteElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GANSSSatelliteElement_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* svID at 1238 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* svHealth at 1239 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* iod at 1240 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* ganssClockModel at 1241 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* ganssOrbitModel at 1242 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GANSSSatelliteElement_specs_1 = { sizeof(struct GANSSSatelliteElement), offsetof(struct GANSSSatelliteElement, _asn_ctx), asn_MAP_GANSSSatelliteElement_tag2el_1, 5, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ 4, /* Start extensions */ 6 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GANSSSatelliteElement = { "GANSSSatelliteElement", "GANSSSatelliteElement", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSSatelliteElement_tags_1, sizeof(asn_DEF_GANSSSatelliteElement_tags_1) /sizeof(asn_DEF_GANSSSatelliteElement_tags_1[0]), /* 1 */ asn_DEF_GANSSSatelliteElement_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSSatelliteElement_tags_1) /sizeof(asn_DEF_GANSSSatelliteElement_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GANSSSatelliteElement_1, 5, /* Elements count */ &asn_SPC_GANSSSatelliteElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSSatelliteElement.h000066400000000000000000000017441305042567700246750ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSSatelliteElement_H_ #define _GANSSSatelliteElement_H_ #include /* Including external dependencies */ #include "SVID.h" #include #include "GANSSClockModel.h" #include "GANSSOrbitModel.h" #include #ifdef __cplusplus extern "C" { #endif /* GANSSSatelliteElement */ typedef struct GANSSSatelliteElement { SVID_t svID; long svHealth; long iod; GANSSClockModel_t ganssClockModel; GANSSOrbitModel_t ganssOrbitModel; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSSSatelliteElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSSatelliteElement; #ifdef __cplusplus } #endif #endif /* _GANSSSatelliteElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSSignalID.c000066400000000000000000000112631305042567700230570ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSSignalID.h" int GANSSSignalID_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 3)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void GANSSSignalID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void GANSSSignalID_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { GANSSSignalID_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int GANSSSignalID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { GANSSSignalID_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t GANSSSignalID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { GANSSSignalID_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t GANSSSignalID_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { GANSSSignalID_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t GANSSSignalID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { GANSSSignalID_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t GANSSSignalID_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { GANSSSignalID_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t GANSSSignalID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { GANSSSignalID_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t GANSSSignalID_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { GANSSSignalID_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_GANSSSignalID_constr_1 = { { APC_CONSTRAINED, 2, 2, 0, 3 } /* (0..3) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_GANSSSignalID_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_GANSSSignalID = { "GANSSSignalID", "GANSSSignalID", GANSSSignalID_free, GANSSSignalID_print, GANSSSignalID_constraint, GANSSSignalID_decode_ber, GANSSSignalID_encode_der, GANSSSignalID_decode_xer, GANSSSignalID_encode_xer, GANSSSignalID_decode_uper, GANSSSignalID_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSSignalID_tags_1, sizeof(asn_DEF_GANSSSignalID_tags_1) /sizeof(asn_DEF_GANSSSignalID_tags_1[0]), /* 1 */ asn_DEF_GANSSSignalID_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSSignalID_tags_1) /sizeof(asn_DEF_GANSSSignalID_tags_1[0]), /* 1 */ &asn_PER_type_GANSSSignalID_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSSignalID.h000066400000000000000000000016521305042567700230650ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSSignalID_H_ #define _GANSSSignalID_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* GANSSSignalID */ typedef long GANSSSignalID_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSSignalID; asn_struct_free_f GANSSSignalID_free; asn_struct_print_f GANSSSignalID_print; asn_constr_check_f GANSSSignalID_constraint; ber_type_decoder_f GANSSSignalID_decode_ber; der_type_encoder_f GANSSSignalID_encode_der; xer_type_decoder_f GANSSSignalID_decode_xer; xer_type_encoder_f GANSSSignalID_encode_xer; per_type_decoder_f GANSSSignalID_decode_uper; per_type_encoder_f GANSSSignalID_encode_uper; #ifdef __cplusplus } #endif #endif /* _GANSSSignalID_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSTOD-GSMTimeAssociation.c000066400000000000000000000077171305042567700255240ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSTOD-GSMTimeAssociation.h" static asn_TYPE_member_t asn_MBR_GANSSTOD_GSMTimeAssociation_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GANSSTOD_GSMTimeAssociation, bcchCarrier), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BCCHCarrier, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "bcchCarrier" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSTOD_GSMTimeAssociation, bsic), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BSIC, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "bsic" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSTOD_GSMTimeAssociation, frameNumber), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_FrameNumber, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "frameNumber" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSTOD_GSMTimeAssociation, timeSlot), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_TimeSlot, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "timeSlot" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSTOD_GSMTimeAssociation, bitNumber), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BitNumber, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "bitNumber" }, { ATF_POINTER, 1, offsetof(struct GANSSTOD_GSMTimeAssociation, frameDrift), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_FrameDrift, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "frameDrift" }, }; static int asn_MAP_GANSSTOD_GSMTimeAssociation_oms_1[] = { 5 }; static ber_tlv_tag_t asn_DEF_GANSSTOD_GSMTimeAssociation_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GANSSTOD_GSMTimeAssociation_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* bcchCarrier at 1118 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* bsic at 1119 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* frameNumber at 1120 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* timeSlot at 1121 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* bitNumber at 1122 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 } /* frameDrift at 1123 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GANSSTOD_GSMTimeAssociation_specs_1 = { sizeof(struct GANSSTOD_GSMTimeAssociation), offsetof(struct GANSSTOD_GSMTimeAssociation, _asn_ctx), asn_MAP_GANSSTOD_GSMTimeAssociation_tag2el_1, 6, /* Count of tags in the map */ asn_MAP_GANSSTOD_GSMTimeAssociation_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GANSSTOD_GSMTimeAssociation = { "GANSSTOD-GSMTimeAssociation", "GANSSTOD-GSMTimeAssociation", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSTOD_GSMTimeAssociation_tags_1, sizeof(asn_DEF_GANSSTOD_GSMTimeAssociation_tags_1) /sizeof(asn_DEF_GANSSTOD_GSMTimeAssociation_tags_1[0]), /* 1 */ asn_DEF_GANSSTOD_GSMTimeAssociation_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSTOD_GSMTimeAssociation_tags_1) /sizeof(asn_DEF_GANSSTOD_GSMTimeAssociation_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GANSSTOD_GSMTimeAssociation_1, 6, /* Elements count */ &asn_SPC_GANSSTOD_GSMTimeAssociation_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSTOD-GSMTimeAssociation.h000066400000000000000000000020241305042567700255130ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSTOD_GSMTimeAssociation_H_ #define _GANSSTOD_GSMTimeAssociation_H_ #include /* Including external dependencies */ #include "BCCHCarrier.h" #include "BSIC.h" #include "FrameNumber.h" #include "TimeSlot.h" #include "BitNumber.h" #include "FrameDrift.h" #include #ifdef __cplusplus extern "C" { #endif /* GANSSTOD-GSMTimeAssociation */ typedef struct GANSSTOD_GSMTimeAssociation { BCCHCarrier_t bcchCarrier; BSIC_t bsic; FrameNumber_t frameNumber; TimeSlot_t timeSlot; BitNumber_t bitNumber; FrameDrift_t *frameDrift /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSSTOD_GSMTimeAssociation_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSTOD_GSMTimeAssociation; #ifdef __cplusplus } #endif #endif /* _GANSSTOD_GSMTimeAssociation_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSTOD.c000066400000000000000000000107701305042567700220550ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSTOD.h" int GANSSTOD_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 86399)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void GANSSTOD_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void GANSSTOD_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { GANSSTOD_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int GANSSTOD_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { GANSSTOD_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t GANSSTOD_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { GANSSTOD_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t GANSSTOD_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { GANSSTOD_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t GANSSTOD_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { GANSSTOD_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t GANSSTOD_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { GANSSTOD_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t GANSSTOD_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { GANSSTOD_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t GANSSTOD_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { GANSSTOD_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_GANSSTOD_constr_1 = { { APC_CONSTRAINED, 17, -1, 0, 86399 } /* (0..86399) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_GANSSTOD_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_GANSSTOD = { "GANSSTOD", "GANSSTOD", GANSSTOD_free, GANSSTOD_print, GANSSTOD_constraint, GANSSTOD_decode_ber, GANSSTOD_encode_der, GANSSTOD_decode_xer, GANSSTOD_encode_xer, GANSSTOD_decode_uper, GANSSTOD_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSTOD_tags_1, sizeof(asn_DEF_GANSSTOD_tags_1) /sizeof(asn_DEF_GANSSTOD_tags_1[0]), /* 1 */ asn_DEF_GANSSTOD_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSTOD_tags_1) /sizeof(asn_DEF_GANSSTOD_tags_1[0]), /* 1 */ &asn_PER_type_GANSSTOD_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSTOD.h000066400000000000000000000015371305042567700220630ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSTOD_H_ #define _GANSSTOD_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* GANSSTOD */ typedef long GANSSTOD_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSTOD; asn_struct_free_f GANSSTOD_free; asn_struct_print_f GANSSTOD_print; asn_constr_check_f GANSSTOD_constraint; ber_type_decoder_f GANSSTOD_decode_ber; der_type_encoder_f GANSSTOD_encode_der; xer_type_decoder_f GANSSTOD_decode_xer; xer_type_encoder_f GANSSTOD_encode_xer; per_type_decoder_f GANSSTOD_decode_uper; per_type_encoder_f GANSSTOD_encode_uper; #ifdef __cplusplus } #endif #endif /* _GANSSTOD_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSTODUncertainty.c000066400000000000000000000116511305042567700243020ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSTODUncertainty.h" int GANSSTODUncertainty_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void GANSSTODUncertainty_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void GANSSTODUncertainty_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { GANSSTODUncertainty_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int GANSSTODUncertainty_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { GANSSTODUncertainty_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t GANSSTODUncertainty_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { GANSSTODUncertainty_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t GANSSTODUncertainty_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { GANSSTODUncertainty_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t GANSSTODUncertainty_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { GANSSTODUncertainty_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t GANSSTODUncertainty_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { GANSSTODUncertainty_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t GANSSTODUncertainty_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { GANSSTODUncertainty_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t GANSSTODUncertainty_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { GANSSTODUncertainty_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_GANSSTODUncertainty_constr_1 = { { APC_CONSTRAINED, 7, 7, 0, 127 } /* (0..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_GANSSTODUncertainty_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_GANSSTODUncertainty = { "GANSSTODUncertainty", "GANSSTODUncertainty", GANSSTODUncertainty_free, GANSSTODUncertainty_print, GANSSTODUncertainty_constraint, GANSSTODUncertainty_decode_ber, GANSSTODUncertainty_encode_der, GANSSTODUncertainty_decode_xer, GANSSTODUncertainty_encode_xer, GANSSTODUncertainty_decode_uper, GANSSTODUncertainty_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSTODUncertainty_tags_1, sizeof(asn_DEF_GANSSTODUncertainty_tags_1) /sizeof(asn_DEF_GANSSTODUncertainty_tags_1[0]), /* 1 */ asn_DEF_GANSSTODUncertainty_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSTODUncertainty_tags_1) /sizeof(asn_DEF_GANSSTODUncertainty_tags_1[0]), /* 1 */ &asn_PER_type_GANSSTODUncertainty_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSTODUncertainty.h000066400000000000000000000020041305042567700242770ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSTODUncertainty_H_ #define _GANSSTODUncertainty_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* GANSSTODUncertainty */ typedef long GANSSTODUncertainty_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSTODUncertainty; asn_struct_free_f GANSSTODUncertainty_free; asn_struct_print_f GANSSTODUncertainty_print; asn_constr_check_f GANSSTODUncertainty_constraint; ber_type_decoder_f GANSSTODUncertainty_decode_ber; der_type_encoder_f GANSSTODUncertainty_encode_der; xer_type_decoder_f GANSSTODUncertainty_decode_xer; xer_type_encoder_f GANSSTODUncertainty_encode_xer; per_type_decoder_f GANSSTODUncertainty_decode_uper; per_type_encoder_f GANSSTODUncertainty_encode_uper; #ifdef __cplusplus } #endif #endif /* _GANSSTODUncertainty_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSTODm.c000066400000000000000000000110461305042567700222270ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSTODm.h" int GANSSTODm_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 3599999)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void GANSSTODm_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void GANSSTODm_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { GANSSTODm_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int GANSSTODm_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { GANSSTODm_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t GANSSTODm_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { GANSSTODm_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t GANSSTODm_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { GANSSTODm_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t GANSSTODm_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { GANSSTODm_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t GANSSTODm_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { GANSSTODm_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t GANSSTODm_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { GANSSTODm_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t GANSSTODm_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { GANSSTODm_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_GANSSTODm_constr_1 = { { APC_CONSTRAINED, 22, -1, 0, 3599999 } /* (0..3599999) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_GANSSTODm_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_GANSSTODm = { "GANSSTODm", "GANSSTODm", GANSSTODm_free, GANSSTODm_print, GANSSTODm_constraint, GANSSTODm_decode_ber, GANSSTODm_encode_der, GANSSTODm_decode_xer, GANSSTODm_encode_xer, GANSSTODm_decode_uper, GANSSTODm_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSTODm_tags_1, sizeof(asn_DEF_GANSSTODm_tags_1) /sizeof(asn_DEF_GANSSTODm_tags_1[0]), /* 1 */ asn_DEF_GANSSTODm_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSTODm_tags_1) /sizeof(asn_DEF_GANSSTODm_tags_1[0]), /* 1 */ &asn_PER_type_GANSSTODm_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSTODm.h000066400000000000000000000015561305042567700222410ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSTODm_H_ #define _GANSSTODm_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* GANSSTODm */ typedef long GANSSTODm_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSTODm; asn_struct_free_f GANSSTODm_free; asn_struct_print_f GANSSTODm_print; asn_constr_check_f GANSSTODm_constraint; ber_type_decoder_f GANSSTODm_decode_ber; der_type_encoder_f GANSSTODm_encode_der; xer_type_decoder_f GANSSTODm_decode_xer; xer_type_encoder_f GANSSTODm_encode_xer; per_type_decoder_f GANSSTODm_decode_uper; per_type_encoder_f GANSSTODm_encode_uper; #ifdef __cplusplus } #endif #endif /* _GANSSTODm_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSTimeModelElement.c000066400000000000000000000136151305042567700246210ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSTimeModelElement.h" static int memb_ganssTimeModelRefTime_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 65535)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_gnssTOID_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 7)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_weekNumber_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 8191)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_ganssTimeModelRefTime_constr_2 = { { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_gnssTOID_constr_6 = { { APC_CONSTRAINED, 3, 3, 0, 7 } /* (0..7) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_weekNumber_constr_7 = { { APC_CONSTRAINED, 13, 13, 0, 8191 } /* (0..8191) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_GANSSTimeModelElement_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GANSSTimeModelElement, ganssTimeModelRefTime), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ganssTimeModelRefTime_constraint_1, &asn_PER_memb_ganssTimeModelRefTime_constr_2, 0, "ganssTimeModelRefTime" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSTimeModelElement, tA0), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_TA0, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "tA0" }, { ATF_POINTER, 2, offsetof(struct GANSSTimeModelElement, tA1), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_TA1, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "tA1" }, { ATF_POINTER, 1, offsetof(struct GANSSTimeModelElement, tA2), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_TA2, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "tA2" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSTimeModelElement, gnssTOID), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_gnssTOID_constraint_1, &asn_PER_memb_gnssTOID_constr_6, 0, "gnssTOID" }, { ATF_POINTER, 1, offsetof(struct GANSSTimeModelElement, weekNumber), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_weekNumber_constraint_1, &asn_PER_memb_weekNumber_constr_7, 0, "weekNumber" }, }; static int asn_MAP_GANSSTimeModelElement_oms_1[] = { 2, 3, 5 }; static ber_tlv_tag_t asn_DEF_GANSSTimeModelElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GANSSTimeModelElement_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ganssTimeModelRefTime at 1167 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* tA0 at 1168 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* tA1 at 1169 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* tA2 at 1170 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* gnssTOID at 1171 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 } /* weekNumber at 1172 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GANSSTimeModelElement_specs_1 = { sizeof(struct GANSSTimeModelElement), offsetof(struct GANSSTimeModelElement, _asn_ctx), asn_MAP_GANSSTimeModelElement_tag2el_1, 6, /* Count of tags in the map */ asn_MAP_GANSSTimeModelElement_oms_1, /* Optional members */ 3, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GANSSTimeModelElement = { "GANSSTimeModelElement", "GANSSTimeModelElement", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSTimeModelElement_tags_1, sizeof(asn_DEF_GANSSTimeModelElement_tags_1) /sizeof(asn_DEF_GANSSTimeModelElement_tags_1[0]), /* 1 */ asn_DEF_GANSSTimeModelElement_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSTimeModelElement_tags_1) /sizeof(asn_DEF_GANSSTimeModelElement_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GANSSTimeModelElement_1, 6, /* Elements count */ &asn_SPC_GANSSTimeModelElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSTimeModelElement.h000066400000000000000000000016421305042567700246230ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSTimeModelElement_H_ #define _GANSSTimeModelElement_H_ #include /* Including external dependencies */ #include #include "TA0.h" #include "TA1.h" #include "TA2.h" #include #ifdef __cplusplus extern "C" { #endif /* GANSSTimeModelElement */ typedef struct GANSSTimeModelElement { long ganssTimeModelRefTime; TA0_t tA0; TA1_t *tA1 /* OPTIONAL */; TA2_t *tA2 /* OPTIONAL */; long gnssTOID; long *weekNumber /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSSTimeModelElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSTimeModelElement; #ifdef __cplusplus } #endif #endif /* _GANSSTimeModelElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSUTCModel.c000066400000000000000000000240151305042567700230400ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GANSSUTCModel.h" static int memb_ganssUtcA1_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -8388608 && value <= 8388607)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ganssUtcA0_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= (-2147483647L - 1) && value <= 2147483647)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ganssUtcTot_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 255)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ganssUtcWNt_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 255)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ganssUtcDeltaTls_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -128 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ganssUtcWNlsf_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 255)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ganssUtcDN_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -128 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ganssUtcDeltaTlsf_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -128 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_ganssUtcA1_constr_2 = { { APC_CONSTRAINED, 24, -1, -8388608, 8388607 } /* (-8388608..8388607) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ganssUtcA0_constr_3 = { { APC_CONSTRAINED, 32, -1, (-2147483647L - 1), 2147483647 } /* (-2147483648..2147483647) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ganssUtcTot_constr_4 = { { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ganssUtcWNt_constr_5 = { { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ganssUtcDeltaTls_constr_6 = { { APC_CONSTRAINED, 8, 8, -128, 127 } /* (-128..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ganssUtcWNlsf_constr_7 = { { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ganssUtcDN_constr_8 = { { APC_CONSTRAINED, 8, 8, -128, 127 } /* (-128..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ganssUtcDeltaTlsf_constr_9 = { { APC_CONSTRAINED, 8, 8, -128, 127 } /* (-128..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_GANSSUTCModel_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GANSSUTCModel, ganssUtcA1), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ganssUtcA1_constraint_1, &asn_PER_memb_ganssUtcA1_constr_2, 0, "ganssUtcA1" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSUTCModel, ganssUtcA0), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ganssUtcA0_constraint_1, &asn_PER_memb_ganssUtcA0_constr_3, 0, "ganssUtcA0" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSUTCModel, ganssUtcTot), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ganssUtcTot_constraint_1, &asn_PER_memb_ganssUtcTot_constr_4, 0, "ganssUtcTot" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSUTCModel, ganssUtcWNt), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ganssUtcWNt_constraint_1, &asn_PER_memb_ganssUtcWNt_constr_5, 0, "ganssUtcWNt" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSUTCModel, ganssUtcDeltaTls), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ganssUtcDeltaTls_constraint_1, &asn_PER_memb_ganssUtcDeltaTls_constr_6, 0, "ganssUtcDeltaTls" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSUTCModel, ganssUtcWNlsf), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ganssUtcWNlsf_constraint_1, &asn_PER_memb_ganssUtcWNlsf_constr_7, 0, "ganssUtcWNlsf" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSUTCModel, ganssUtcDN), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ganssUtcDN_constraint_1, &asn_PER_memb_ganssUtcDN_constr_8, 0, "ganssUtcDN" }, { ATF_NOFLAGS, 0, offsetof(struct GANSSUTCModel, ganssUtcDeltaTlsf), (ASN_TAG_CLASS_CONTEXT | (7 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ganssUtcDeltaTlsf_constraint_1, &asn_PER_memb_ganssUtcDeltaTlsf_constr_9, 0, "ganssUtcDeltaTlsf" }, }; static ber_tlv_tag_t asn_DEF_GANSSUTCModel_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GANSSUTCModel_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ganssUtcA1 at 1382 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ganssUtcA0 at 1383 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* ganssUtcTot at 1384 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* ganssUtcWNt at 1385 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* ganssUtcDeltaTls at 1386 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* ganssUtcWNlsf at 1387 */ { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* ganssUtcDN at 1388 */ { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 } /* ganssUtcDeltaTlsf at 1389 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GANSSUTCModel_specs_1 = { sizeof(struct GANSSUTCModel), offsetof(struct GANSSUTCModel, _asn_ctx), asn_MAP_GANSSUTCModel_tag2el_1, 8, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GANSSUTCModel = { "GANSSUTCModel", "GANSSUTCModel", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GANSSUTCModel_tags_1, sizeof(asn_DEF_GANSSUTCModel_tags_1) /sizeof(asn_DEF_GANSSUTCModel_tags_1[0]), /* 1 */ asn_DEF_GANSSUTCModel_tags_1, /* Same as above */ sizeof(asn_DEF_GANSSUTCModel_tags_1) /sizeof(asn_DEF_GANSSUTCModel_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GANSSUTCModel_1, 8, /* Elements count */ &asn_SPC_GANSSUTCModel_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GANSSUTCModel.h000066400000000000000000000015131305042567700230430ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GANSSUTCModel_H_ #define _GANSSUTCModel_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* GANSSUTCModel */ typedef struct GANSSUTCModel { long ganssUtcA1; long ganssUtcA0; long ganssUtcTot; long ganssUtcWNt; long ganssUtcDeltaTls; long ganssUtcWNlsf; long ganssUtcDN; long ganssUtcDeltaTlsf; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GANSSUTCModel_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GANSSUTCModel; #ifdef __cplusplus } #endif #endif /* _GANSSUTCModel_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GPS-AssistData.c000066400000000000000000000034401305042567700233160ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GPS-AssistData.h" static asn_TYPE_member_t asn_MBR_GPS_AssistData_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GPS_AssistData, controlHeader), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_ControlHeader, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "controlHeader" }, }; static ber_tlv_tag_t asn_DEF_GPS_AssistData_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GPS_AssistData_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* controlHeader at 556 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GPS_AssistData_specs_1 = { sizeof(struct GPS_AssistData), offsetof(struct GPS_AssistData, _asn_ctx), asn_MAP_GPS_AssistData_tag2el_1, 1, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GPS_AssistData = { "GPS-AssistData", "GPS-AssistData", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GPS_AssistData_tags_1, sizeof(asn_DEF_GPS_AssistData_tags_1) /sizeof(asn_DEF_GPS_AssistData_tags_1[0]), /* 1 */ asn_DEF_GPS_AssistData_tags_1, /* Same as above */ sizeof(asn_DEF_GPS_AssistData_tags_1) /sizeof(asn_DEF_GPS_AssistData_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GPS_AssistData_1, 1, /* Elements count */ &asn_SPC_GPS_AssistData_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GPS-AssistData.h000066400000000000000000000013111305042567700233160ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GPS_AssistData_H_ #define _GPS_AssistData_H_ #include /* Including external dependencies */ #include "ControlHeader.h" #include #ifdef __cplusplus extern "C" { #endif /* GPS-AssistData */ typedef struct GPS_AssistData { ControlHeader_t controlHeader; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GPS_AssistData_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GPS_AssistData; #ifdef __cplusplus } #endif #endif /* _GPS_AssistData_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GPS-MeasureInfo.c000066400000000000000000000034751305042567700235030ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GPS-MeasureInfo.h" static asn_TYPE_member_t asn_MBR_GPS_MeasureInfo_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GPS_MeasureInfo, gpsMsrSetList), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfGPS_MsrSetElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "gpsMsrSetList" }, }; static ber_tlv_tag_t asn_DEF_GPS_MeasureInfo_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GPS_MeasureInfo_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* gpsMsrSetList at 445 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GPS_MeasureInfo_specs_1 = { sizeof(struct GPS_MeasureInfo), offsetof(struct GPS_MeasureInfo, _asn_ctx), asn_MAP_GPS_MeasureInfo_tag2el_1, 1, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GPS_MeasureInfo = { "GPS-MeasureInfo", "GPS-MeasureInfo", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GPS_MeasureInfo_tags_1, sizeof(asn_DEF_GPS_MeasureInfo_tags_1) /sizeof(asn_DEF_GPS_MeasureInfo_tags_1[0]), /* 1 */ asn_DEF_GPS_MeasureInfo_tags_1, /* Same as above */ sizeof(asn_DEF_GPS_MeasureInfo_tags_1) /sizeof(asn_DEF_GPS_MeasureInfo_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GPS_MeasureInfo_1, 1, /* Elements count */ &asn_SPC_GPS_MeasureInfo_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GPS-MeasureInfo.h000066400000000000000000000013421305042567700234770ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GPS_MeasureInfo_H_ #define _GPS_MeasureInfo_H_ #include /* Including external dependencies */ #include "SeqOfGPS-MsrSetElement.h" #include #ifdef __cplusplus extern "C" { #endif /* GPS-MeasureInfo */ typedef struct GPS_MeasureInfo { SeqOfGPS_MsrSetElement_t gpsMsrSetList; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GPS_MeasureInfo_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GPS_MeasureInfo; #ifdef __cplusplus } #endif #endif /* _GPS_MeasureInfo_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GPS-MsrElement.c000066400000000000000000000165441305042567700233420ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GPS-MsrElement.h" static int memb_cNo_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 63)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_doppler_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -32768 && value <= 32767)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_wholeChips_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1022)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_fracChips_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1024)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_pseuRangeRMSErr_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 63)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_cNo_constr_3 = { { APC_CONSTRAINED, 6, 6, 0, 63 } /* (0..63) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_doppler_constr_4 = { { APC_CONSTRAINED, 16, 16, -32768, 32767 } /* (-32768..32767) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_wholeChips_constr_5 = { { APC_CONSTRAINED, 10, 10, 0, 1022 } /* (0..1022) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_fracChips_constr_6 = { { APC_CONSTRAINED, 11, 11, 0, 1024 } /* (0..1024) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_pseuRangeRMSErr_constr_8 = { { APC_CONSTRAINED, 6, 6, 0, 63 } /* (0..63) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_GPS_MsrElement_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GPS_MsrElement, satelliteID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SatelliteID, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "satelliteID" }, { ATF_NOFLAGS, 0, offsetof(struct GPS_MsrElement, cNo), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_cNo_constraint_1, &asn_PER_memb_cNo_constr_3, 0, "cNo" }, { ATF_NOFLAGS, 0, offsetof(struct GPS_MsrElement, doppler), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_doppler_constraint_1, &asn_PER_memb_doppler_constr_4, 0, "doppler" }, { ATF_NOFLAGS, 0, offsetof(struct GPS_MsrElement, wholeChips), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_wholeChips_constraint_1, &asn_PER_memb_wholeChips_constr_5, 0, "wholeChips" }, { ATF_NOFLAGS, 0, offsetof(struct GPS_MsrElement, fracChips), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_fracChips_constraint_1, &asn_PER_memb_fracChips_constr_6, 0, "fracChips" }, { ATF_NOFLAGS, 0, offsetof(struct GPS_MsrElement, mpathIndic), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_MpathIndic, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "mpathIndic" }, { ATF_NOFLAGS, 0, offsetof(struct GPS_MsrElement, pseuRangeRMSErr), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_pseuRangeRMSErr_constraint_1, &asn_PER_memb_pseuRangeRMSErr_constr_8, 0, "pseuRangeRMSErr" }, }; static ber_tlv_tag_t asn_DEF_GPS_MsrElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GPS_MsrElement_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* satelliteID at 466 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* cNo at 467 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* doppler at 468 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* wholeChips at 469 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* fracChips at 470 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* mpathIndic at 474 */ { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 } /* pseuRangeRMSErr at 475 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GPS_MsrElement_specs_1 = { sizeof(struct GPS_MsrElement), offsetof(struct GPS_MsrElement, _asn_ctx), asn_MAP_GPS_MsrElement_tag2el_1, 7, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GPS_MsrElement = { "GPS-MsrElement", "GPS-MsrElement", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GPS_MsrElement_tags_1, sizeof(asn_DEF_GPS_MsrElement_tags_1) /sizeof(asn_DEF_GPS_MsrElement_tags_1[0]), /* 1 */ asn_DEF_GPS_MsrElement_tags_1, /* Same as above */ sizeof(asn_DEF_GPS_MsrElement_tags_1) /sizeof(asn_DEF_GPS_MsrElement_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GPS_MsrElement_1, 7, /* Elements count */ &asn_SPC_GPS_MsrElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GPS-MsrElement.h000066400000000000000000000015521305042567700233400ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GPS_MsrElement_H_ #define _GPS_MsrElement_H_ #include /* Including external dependencies */ #include "SatelliteID.h" #include #include "MpathIndic.h" #include #ifdef __cplusplus extern "C" { #endif /* GPS-MsrElement */ typedef struct GPS_MsrElement { SatelliteID_t satelliteID; long cNo; long doppler; long wholeChips; long fracChips; MpathIndic_t mpathIndic; long pseuRangeRMSErr; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GPS_MsrElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GPS_MsrElement; #ifdef __cplusplus } #endif #endif /* _GPS_MsrElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GPS-MsrSetElement.c000066400000000000000000000065071305042567700240140ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GPS-MsrSetElement.h" static int memb_refFrame_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 65535)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_refFrame_constr_2 = { { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_GPS_MsrSetElement_1[] = { { ATF_POINTER, 1, offsetof(struct GPS_MsrSetElement, refFrame), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_refFrame_constraint_1, &asn_PER_memb_refFrame_constr_2, 0, "refFrame" }, { ATF_NOFLAGS, 0, offsetof(struct GPS_MsrSetElement, gpsTOW), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GPSTOW24b, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "gpsTOW" }, { ATF_NOFLAGS, 0, offsetof(struct GPS_MsrSetElement, gps_msrList), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfGPS_MsrElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "gps-msrList" }, }; static int asn_MAP_GPS_MsrSetElement_oms_1[] = { 0 }; static ber_tlv_tag_t asn_DEF_GPS_MsrSetElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GPS_MsrSetElement_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* refFrame at 450 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* gpsTOW at 451 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* gps-msrList at 457 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GPS_MsrSetElement_specs_1 = { sizeof(struct GPS_MsrSetElement), offsetof(struct GPS_MsrSetElement, _asn_ctx), asn_MAP_GPS_MsrSetElement_tag2el_1, 3, /* Count of tags in the map */ asn_MAP_GPS_MsrSetElement_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GPS_MsrSetElement = { "GPS-MsrSetElement", "GPS-MsrSetElement", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GPS_MsrSetElement_tags_1, sizeof(asn_DEF_GPS_MsrSetElement_tags_1) /sizeof(asn_DEF_GPS_MsrSetElement_tags_1[0]), /* 1 */ asn_DEF_GPS_MsrSetElement_tags_1, /* Same as above */ sizeof(asn_DEF_GPS_MsrSetElement_tags_1) /sizeof(asn_DEF_GPS_MsrSetElement_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GPS_MsrSetElement_1, 3, /* Elements count */ &asn_SPC_GPS_MsrSetElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GPS-MsrSetElement.h000066400000000000000000000015201305042567700240070ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GPS_MsrSetElement_H_ #define _GPS_MsrSetElement_H_ #include /* Including external dependencies */ #include #include "GPSTOW24b.h" #include "SeqOfGPS-MsrElement.h" #include #ifdef __cplusplus extern "C" { #endif /* GPS-MsrSetElement */ typedef struct GPS_MsrSetElement { long *refFrame /* OPTIONAL */; GPSTOW24b_t gpsTOW; SeqOfGPS_MsrElement_t gps_msrList; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GPS_MsrSetElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GPS_MsrSetElement; #ifdef __cplusplus } #endif #endif /* _GPS_MsrSetElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GPSAssistanceData.c000066400000000000000000000115741305042567700240770ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GPSAssistanceData.h" int GPSAssistanceData_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } size = st->size; if((size >= 1 && size <= 40)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using OCTET_STRING, * so here we adjust the DEF accordingly. */ static void GPSAssistanceData_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_OCTET_STRING.free_struct; td->print_struct = asn_DEF_OCTET_STRING.print_struct; td->ber_decoder = asn_DEF_OCTET_STRING.ber_decoder; td->der_encoder = asn_DEF_OCTET_STRING.der_encoder; td->xer_decoder = asn_DEF_OCTET_STRING.xer_decoder; td->xer_encoder = asn_DEF_OCTET_STRING.xer_encoder; td->uper_decoder = asn_DEF_OCTET_STRING.uper_decoder; td->uper_encoder = asn_DEF_OCTET_STRING.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_OCTET_STRING.per_constraints; td->elements = asn_DEF_OCTET_STRING.elements; td->elements_count = asn_DEF_OCTET_STRING.elements_count; td->specifics = asn_DEF_OCTET_STRING.specifics; } void GPSAssistanceData_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { GPSAssistanceData_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int GPSAssistanceData_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { GPSAssistanceData_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t GPSAssistanceData_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { GPSAssistanceData_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t GPSAssistanceData_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { GPSAssistanceData_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t GPSAssistanceData_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { GPSAssistanceData_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t GPSAssistanceData_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { GPSAssistanceData_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t GPSAssistanceData_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { GPSAssistanceData_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t GPSAssistanceData_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { GPSAssistanceData_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_GPSAssistanceData_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 6, 6, 1, 40 } /* (SIZE(1..40)) */, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_GPSAssistanceData_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) }; asn_TYPE_descriptor_t asn_DEF_GPSAssistanceData = { "GPSAssistanceData", "GPSAssistanceData", GPSAssistanceData_free, GPSAssistanceData_print, GPSAssistanceData_constraint, GPSAssistanceData_decode_ber, GPSAssistanceData_encode_der, GPSAssistanceData_decode_xer, GPSAssistanceData_encode_xer, GPSAssistanceData_decode_uper, GPSAssistanceData_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GPSAssistanceData_tags_1, sizeof(asn_DEF_GPSAssistanceData_tags_1) /sizeof(asn_DEF_GPSAssistanceData_tags_1[0]), /* 1 */ asn_DEF_GPSAssistanceData_tags_1, /* Same as above */ sizeof(asn_DEF_GPSAssistanceData_tags_1) /sizeof(asn_DEF_GPSAssistanceData_tags_1[0]), /* 1 */ &asn_PER_type_GPSAssistanceData_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GPSAssistanceData.h000066400000000000000000000017571305042567700241060ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GPSAssistanceData_H_ #define _GPSAssistanceData_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* GPSAssistanceData */ typedef OCTET_STRING_t GPSAssistanceData_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GPSAssistanceData; asn_struct_free_f GPSAssistanceData_free; asn_struct_print_f GPSAssistanceData_print; asn_constr_check_f GPSAssistanceData_constraint; ber_type_decoder_f GPSAssistanceData_decode_ber; der_type_encoder_f GPSAssistanceData_encode_der; xer_type_decoder_f GPSAssistanceData_decode_xer; xer_type_encoder_f GPSAssistanceData_encode_xer; per_type_decoder_f GPSAssistanceData_decode_uper; per_type_encoder_f GPSAssistanceData_encode_uper; #ifdef __cplusplus } #endif #endif /* _GPSAssistanceData_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GPSReferenceTimeUncertainty.c000066400000000000000000000123511305042567700261450ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GPSReferenceTimeUncertainty.h" int GPSReferenceTimeUncertainty_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void GPSReferenceTimeUncertainty_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void GPSReferenceTimeUncertainty_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { GPSReferenceTimeUncertainty_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int GPSReferenceTimeUncertainty_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { GPSReferenceTimeUncertainty_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t GPSReferenceTimeUncertainty_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { GPSReferenceTimeUncertainty_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t GPSReferenceTimeUncertainty_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { GPSReferenceTimeUncertainty_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t GPSReferenceTimeUncertainty_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { GPSReferenceTimeUncertainty_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t GPSReferenceTimeUncertainty_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { GPSReferenceTimeUncertainty_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t GPSReferenceTimeUncertainty_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { GPSReferenceTimeUncertainty_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t GPSReferenceTimeUncertainty_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { GPSReferenceTimeUncertainty_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_GPSReferenceTimeUncertainty_constr_1 = { { APC_CONSTRAINED, 7, 7, 0, 127 } /* (0..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_GPSReferenceTimeUncertainty_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_GPSReferenceTimeUncertainty = { "GPSReferenceTimeUncertainty", "GPSReferenceTimeUncertainty", GPSReferenceTimeUncertainty_free, GPSReferenceTimeUncertainty_print, GPSReferenceTimeUncertainty_constraint, GPSReferenceTimeUncertainty_decode_ber, GPSReferenceTimeUncertainty_encode_der, GPSReferenceTimeUncertainty_decode_xer, GPSReferenceTimeUncertainty_encode_xer, GPSReferenceTimeUncertainty_decode_uper, GPSReferenceTimeUncertainty_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GPSReferenceTimeUncertainty_tags_1, sizeof(asn_DEF_GPSReferenceTimeUncertainty_tags_1) /sizeof(asn_DEF_GPSReferenceTimeUncertainty_tags_1[0]), /* 1 */ asn_DEF_GPSReferenceTimeUncertainty_tags_1, /* Same as above */ sizeof(asn_DEF_GPSReferenceTimeUncertainty_tags_1) /sizeof(asn_DEF_GPSReferenceTimeUncertainty_tags_1[0]), /* 1 */ &asn_PER_type_GPSReferenceTimeUncertainty_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GPSReferenceTimeUncertainty.h000066400000000000000000000021741305042567700261540ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GPSReferenceTimeUncertainty_H_ #define _GPSReferenceTimeUncertainty_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* GPSReferenceTimeUncertainty */ typedef long GPSReferenceTimeUncertainty_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GPSReferenceTimeUncertainty; asn_struct_free_f GPSReferenceTimeUncertainty_free; asn_struct_print_f GPSReferenceTimeUncertainty_print; asn_constr_check_f GPSReferenceTimeUncertainty_constraint; ber_type_decoder_f GPSReferenceTimeUncertainty_decode_ber; der_type_encoder_f GPSReferenceTimeUncertainty_encode_der; xer_type_decoder_f GPSReferenceTimeUncertainty_decode_xer; xer_type_encoder_f GPSReferenceTimeUncertainty_encode_xer; per_type_decoder_f GPSReferenceTimeUncertainty_decode_uper; per_type_encoder_f GPSReferenceTimeUncertainty_encode_uper; #ifdef __cplusplus } #endif #endif /* _GPSReferenceTimeUncertainty_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GPSTOW23b.c000066400000000000000000000110461305042567700221620ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GPSTOW23b.h" int GPSTOW23b_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 7559999)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void GPSTOW23b_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void GPSTOW23b_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { GPSTOW23b_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int GPSTOW23b_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { GPSTOW23b_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t GPSTOW23b_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { GPSTOW23b_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t GPSTOW23b_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { GPSTOW23b_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t GPSTOW23b_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { GPSTOW23b_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t GPSTOW23b_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { GPSTOW23b_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t GPSTOW23b_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { GPSTOW23b_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t GPSTOW23b_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { GPSTOW23b_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_GPSTOW23b_constr_1 = { { APC_CONSTRAINED, 23, -1, 0, 7559999 } /* (0..7559999) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_GPSTOW23b_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_GPSTOW23b = { "GPSTOW23b", "GPSTOW23b", GPSTOW23b_free, GPSTOW23b_print, GPSTOW23b_constraint, GPSTOW23b_decode_ber, GPSTOW23b_encode_der, GPSTOW23b_decode_xer, GPSTOW23b_encode_xer, GPSTOW23b_decode_uper, GPSTOW23b_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GPSTOW23b_tags_1, sizeof(asn_DEF_GPSTOW23b_tags_1) /sizeof(asn_DEF_GPSTOW23b_tags_1[0]), /* 1 */ asn_DEF_GPSTOW23b_tags_1, /* Same as above */ sizeof(asn_DEF_GPSTOW23b_tags_1) /sizeof(asn_DEF_GPSTOW23b_tags_1[0]), /* 1 */ &asn_PER_type_GPSTOW23b_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GPSTOW23b.h000066400000000000000000000015561305042567700221740ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GPSTOW23b_H_ #define _GPSTOW23b_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* GPSTOW23b */ typedef long GPSTOW23b_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GPSTOW23b; asn_struct_free_f GPSTOW23b_free; asn_struct_print_f GPSTOW23b_print; asn_constr_check_f GPSTOW23b_constraint; ber_type_decoder_f GPSTOW23b_decode_ber; der_type_encoder_f GPSTOW23b_encode_der; xer_type_decoder_f GPSTOW23b_decode_xer; xer_type_encoder_f GPSTOW23b_encode_xer; per_type_decoder_f GPSTOW23b_decode_uper; per_type_encoder_f GPSTOW23b_encode_uper; #ifdef __cplusplus } #endif #endif /* _GPSTOW23b_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GPSTOW24b.c000066400000000000000000000110511305042567700221570ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GPSTOW24b.h" int GPSTOW24b_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 14399999)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void GPSTOW24b_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void GPSTOW24b_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { GPSTOW24b_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int GPSTOW24b_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { GPSTOW24b_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t GPSTOW24b_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { GPSTOW24b_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t GPSTOW24b_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { GPSTOW24b_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t GPSTOW24b_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { GPSTOW24b_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t GPSTOW24b_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { GPSTOW24b_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t GPSTOW24b_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { GPSTOW24b_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t GPSTOW24b_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { GPSTOW24b_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_GPSTOW24b_constr_1 = { { APC_CONSTRAINED, 24, -1, 0, 14399999 } /* (0..14399999) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_GPSTOW24b_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_GPSTOW24b = { "GPSTOW24b", "GPSTOW24b", GPSTOW24b_free, GPSTOW24b_print, GPSTOW24b_constraint, GPSTOW24b_decode_ber, GPSTOW24b_encode_der, GPSTOW24b_decode_xer, GPSTOW24b_encode_xer, GPSTOW24b_decode_uper, GPSTOW24b_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GPSTOW24b_tags_1, sizeof(asn_DEF_GPSTOW24b_tags_1) /sizeof(asn_DEF_GPSTOW24b_tags_1[0]), /* 1 */ asn_DEF_GPSTOW24b_tags_1, /* Same as above */ sizeof(asn_DEF_GPSTOW24b_tags_1) /sizeof(asn_DEF_GPSTOW24b_tags_1[0]), /* 1 */ &asn_PER_type_GPSTOW24b_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GPSTOW24b.h000066400000000000000000000015561305042567700221750ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GPSTOW24b_H_ #define _GPSTOW24b_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* GPSTOW24b */ typedef long GPSTOW24b_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GPSTOW24b; asn_struct_free_f GPSTOW24b_free; asn_struct_print_f GPSTOW24b_print; asn_constr_check_f GPSTOW24b_constraint; ber_type_decoder_f GPSTOW24b_decode_ber; der_type_encoder_f GPSTOW24b_encode_der; xer_type_decoder_f GPSTOW24b_decode_xer; xer_type_encoder_f GPSTOW24b_encode_xer; per_type_decoder_f GPSTOW24b_decode_uper; per_type_encoder_f GPSTOW24b_encode_uper; #ifdef __cplusplus } #endif #endif /* _GPSTOW24b_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GPSTOWAssist.c000066400000000000000000000031711305042567700230420ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GPSTOWAssist.h" static asn_per_constraints_t asn_PER_type_GPSTOWAssist_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 4, 4, 1, 12 } /* (SIZE(1..12)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_GPSTOWAssist_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_GPSTOWAssistElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_GPSTOWAssist_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_GPSTOWAssist_specs_1 = { sizeof(struct GPSTOWAssist), offsetof(struct GPSTOWAssist, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_GPSTOWAssist = { "GPSTOWAssist", "GPSTOWAssist", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GPSTOWAssist_tags_1, sizeof(asn_DEF_GPSTOWAssist_tags_1) /sizeof(asn_DEF_GPSTOWAssist_tags_1[0]), /* 1 */ asn_DEF_GPSTOWAssist_tags_1, /* Same as above */ sizeof(asn_DEF_GPSTOWAssist_tags_1) /sizeof(asn_DEF_GPSTOWAssist_tags_1[0]), /* 1 */ &asn_PER_type_GPSTOWAssist_constr_1, asn_MBR_GPSTOWAssist_1, 1, /* Single element */ &asn_SPC_GPSTOWAssist_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GPSTOWAssist.h000066400000000000000000000015101305042567700230420ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GPSTOWAssist_H_ #define _GPSTOWAssist_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct GPSTOWAssistElement; /* GPSTOWAssist */ typedef struct GPSTOWAssist { A_SEQUENCE_OF(struct GPSTOWAssistElement) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GPSTOWAssist_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GPSTOWAssist; #ifdef __cplusplus } #endif /* Referred external types */ #include "GPSTOWAssistElement.h" #endif /* _GPSTOWAssist_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GPSTOWAssistElement.c000066400000000000000000000064541305042567700243630ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GPSTOWAssistElement.h" static asn_TYPE_member_t asn_MBR_GPSTOWAssistElement_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GPSTOWAssistElement, satelliteID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SatelliteID, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "satelliteID" }, { ATF_NOFLAGS, 0, offsetof(struct GPSTOWAssistElement, tlmWord), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_TLMWord, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "tlmWord" }, { ATF_NOFLAGS, 0, offsetof(struct GPSTOWAssistElement, antiSpoof), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_AntiSpoofFlag, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "antiSpoof" }, { ATF_NOFLAGS, 0, offsetof(struct GPSTOWAssistElement, alert), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_AlertFlag, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "alert" }, { ATF_NOFLAGS, 0, offsetof(struct GPSTOWAssistElement, tlmRsvdBits), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_TLMReservedBits, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "tlmRsvdBits" }, }; static ber_tlv_tag_t asn_DEF_GPSTOWAssistElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GPSTOWAssistElement_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* satelliteID at 610 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* tlmWord at 611 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* antiSpoof at 612 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* alert at 613 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* tlmRsvdBits at 615 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GPSTOWAssistElement_specs_1 = { sizeof(struct GPSTOWAssistElement), offsetof(struct GPSTOWAssistElement, _asn_ctx), asn_MAP_GPSTOWAssistElement_tag2el_1, 5, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GPSTOWAssistElement = { "GPSTOWAssistElement", "GPSTOWAssistElement", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GPSTOWAssistElement_tags_1, sizeof(asn_DEF_GPSTOWAssistElement_tags_1) /sizeof(asn_DEF_GPSTOWAssistElement_tags_1[0]), /* 1 */ asn_DEF_GPSTOWAssistElement_tags_1, /* Same as above */ sizeof(asn_DEF_GPSTOWAssistElement_tags_1) /sizeof(asn_DEF_GPSTOWAssistElement_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GPSTOWAssistElement_1, 5, /* Elements count */ &asn_SPC_GPSTOWAssistElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GPSTOWAssistElement.h000066400000000000000000000016621305042567700243640ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GPSTOWAssistElement_H_ #define _GPSTOWAssistElement_H_ #include /* Including external dependencies */ #include "SatelliteID.h" #include "TLMWord.h" #include "AntiSpoofFlag.h" #include "AlertFlag.h" #include "TLMReservedBits.h" #include #ifdef __cplusplus extern "C" { #endif /* GPSTOWAssistElement */ typedef struct GPSTOWAssistElement { SatelliteID_t satelliteID; TLMWord_t tlmWord; AntiSpoofFlag_t antiSpoof; AlertFlag_t alert; TLMReservedBits_t tlmRsvdBits; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GPSTOWAssistElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GPSTOWAssistElement; #ifdef __cplusplus } #endif #endif /* _GPSTOWAssistElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GPSTime.c000066400000000000000000000037351305042567700221060ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GPSTime.h" static asn_TYPE_member_t asn_MBR_GPSTime_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GPSTime, gpsTOW23b), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GPSTOW23b, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "gpsTOW23b" }, { ATF_NOFLAGS, 0, offsetof(struct GPSTime, gpsWeek), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GPSWeek, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "gpsWeek" }, }; static ber_tlv_tag_t asn_DEF_GPSTime_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GPSTime_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* gpsTOW23b at 594 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* gpsWeek at 596 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GPSTime_specs_1 = { sizeof(struct GPSTime), offsetof(struct GPSTime, _asn_ctx), asn_MAP_GPSTime_tag2el_1, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GPSTime = { "GPSTime", "GPSTime", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GPSTime_tags_1, sizeof(asn_DEF_GPSTime_tags_1) /sizeof(asn_DEF_GPSTime_tags_1[0]), /* 1 */ asn_DEF_GPSTime_tags_1, /* Same as above */ sizeof(asn_DEF_GPSTime_tags_1) /sizeof(asn_DEF_GPSTime_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GPSTime_1, 2, /* Elements count */ &asn_SPC_GPSTime_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GPSTime.h000066400000000000000000000012661305042567700221100ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GPSTime_H_ #define _GPSTime_H_ #include /* Including external dependencies */ #include "GPSTOW23b.h" #include "GPSWeek.h" #include #ifdef __cplusplus extern "C" { #endif /* GPSTime */ typedef struct GPSTime { GPSTOW23b_t gpsTOW23b; GPSWeek_t gpsWeek; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GPSTime_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GPSTime; #ifdef __cplusplus } #endif #endif /* _GPSTime_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GPSTimeAssistanceMeasurements.c000066400000000000000000000127471305042567700265200ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GPSTimeAssistanceMeasurements.h" static int memb_referenceFrameMSB_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 63)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_gpsTowSubms_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 9999)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_deltaTow_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_referenceFrameMSB_constr_2 = { { APC_CONSTRAINED, 6, 6, 0, 63 } /* (0..63) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_gpsTowSubms_constr_3 = { { APC_CONSTRAINED, 14, 14, 0, 9999 } /* (0..9999) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_deltaTow_constr_4 = { { APC_CONSTRAINED, 7, 7, 0, 127 } /* (0..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_GPSTimeAssistanceMeasurements_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GPSTimeAssistanceMeasurements, referenceFrameMSB), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_referenceFrameMSB_constraint_1, &asn_PER_memb_referenceFrameMSB_constr_2, 0, "referenceFrameMSB" }, { ATF_POINTER, 3, offsetof(struct GPSTimeAssistanceMeasurements, gpsTowSubms), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_gpsTowSubms_constraint_1, &asn_PER_memb_gpsTowSubms_constr_3, 0, "gpsTowSubms" }, { ATF_POINTER, 2, offsetof(struct GPSTimeAssistanceMeasurements, deltaTow), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_deltaTow_constraint_1, &asn_PER_memb_deltaTow_constr_4, 0, "deltaTow" }, { ATF_POINTER, 1, offsetof(struct GPSTimeAssistanceMeasurements, gpsReferenceTimeUncertainty), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GPSReferenceTimeUncertainty, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "gpsReferenceTimeUncertainty" }, }; static int asn_MAP_GPSTimeAssistanceMeasurements_oms_1[] = { 1, 2, 3 }; static ber_tlv_tag_t asn_DEF_GPSTimeAssistanceMeasurements_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GPSTimeAssistanceMeasurements_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* referenceFrameMSB at 950 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* gpsTowSubms at 951 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* deltaTow at 952 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* gpsReferenceTimeUncertainty at 953 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GPSTimeAssistanceMeasurements_specs_1 = { sizeof(struct GPSTimeAssistanceMeasurements), offsetof(struct GPSTimeAssistanceMeasurements, _asn_ctx), asn_MAP_GPSTimeAssistanceMeasurements_tag2el_1, 4, /* Count of tags in the map */ asn_MAP_GPSTimeAssistanceMeasurements_oms_1, /* Optional members */ 3, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GPSTimeAssistanceMeasurements = { "GPSTimeAssistanceMeasurements", "GPSTimeAssistanceMeasurements", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GPSTimeAssistanceMeasurements_tags_1, sizeof(asn_DEF_GPSTimeAssistanceMeasurements_tags_1) /sizeof(asn_DEF_GPSTimeAssistanceMeasurements_tags_1[0]), /* 1 */ asn_DEF_GPSTimeAssistanceMeasurements_tags_1, /* Same as above */ sizeof(asn_DEF_GPSTimeAssistanceMeasurements_tags_1) /sizeof(asn_DEF_GPSTimeAssistanceMeasurements_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GPSTimeAssistanceMeasurements_1, 4, /* Elements count */ &asn_SPC_GPSTimeAssistanceMeasurements_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GPSTimeAssistanceMeasurements.h000066400000000000000000000017431305042567700265170ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GPSTimeAssistanceMeasurements_H_ #define _GPSTimeAssistanceMeasurements_H_ #include /* Including external dependencies */ #include #include "GPSReferenceTimeUncertainty.h" #include #ifdef __cplusplus extern "C" { #endif /* GPSTimeAssistanceMeasurements */ typedef struct GPSTimeAssistanceMeasurements { long referenceFrameMSB; long *gpsTowSubms /* OPTIONAL */; long *deltaTow /* OPTIONAL */; GPSReferenceTimeUncertainty_t *gpsReferenceTimeUncertainty /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GPSTimeAssistanceMeasurements_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GPSTimeAssistanceMeasurements; #ifdef __cplusplus } #endif #endif /* _GPSTimeAssistanceMeasurements_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GPSWeek.c000066400000000000000000000107161305042567700221000ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GPSWeek.h" int GPSWeek_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1023)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void GPSWeek_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void GPSWeek_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { GPSWeek_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int GPSWeek_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { GPSWeek_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t GPSWeek_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { GPSWeek_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t GPSWeek_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { GPSWeek_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t GPSWeek_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { GPSWeek_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t GPSWeek_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { GPSWeek_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t GPSWeek_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { GPSWeek_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t GPSWeek_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { GPSWeek_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_GPSWeek_constr_1 = { { APC_CONSTRAINED, 10, 10, 0, 1023 } /* (0..1023) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_GPSWeek_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_GPSWeek = { "GPSWeek", "GPSWeek", GPSWeek_free, GPSWeek_print, GPSWeek_constraint, GPSWeek_decode_ber, GPSWeek_encode_der, GPSWeek_decode_xer, GPSWeek_encode_xer, GPSWeek_decode_uper, GPSWeek_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GPSWeek_tags_1, sizeof(asn_DEF_GPSWeek_tags_1) /sizeof(asn_DEF_GPSWeek_tags_1[0]), /* 1 */ asn_DEF_GPSWeek_tags_1, /* Same as above */ sizeof(asn_DEF_GPSWeek_tags_1) /sizeof(asn_DEF_GPSWeek_tags_1[0]), /* 1 */ &asn_PER_type_GPSWeek_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GPSWeek.h000066400000000000000000000015201305042567700220760ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GPSWeek_H_ #define _GPSWeek_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* GPSWeek */ typedef long GPSWeek_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GPSWeek; asn_struct_free_f GPSWeek_free; asn_struct_print_f GPSWeek_print; asn_constr_check_f GPSWeek_constraint; ber_type_decoder_f GPSWeek_decode_ber; der_type_encoder_f GPSWeek_encode_der; xer_type_decoder_f GPSWeek_decode_xer; xer_type_encoder_f GPSWeek_encode_xer; per_type_decoder_f GPSWeek_decode_uper; per_type_encoder_f GPSWeek_encode_uper; #ifdef __cplusplus } #endif #endif /* _GPSWeek_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GSMTime.c000066400000000000000000000060001305042567700220670ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "GSMTime.h" static asn_TYPE_member_t asn_MBR_GSMTime_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GSMTime, bcchCarrier), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BCCHCarrier, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "bcchCarrier" }, { ATF_NOFLAGS, 0, offsetof(struct GSMTime, bsic), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BSIC, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "bsic" }, { ATF_NOFLAGS, 0, offsetof(struct GSMTime, frameNumber), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_FrameNumber, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "frameNumber" }, { ATF_NOFLAGS, 0, offsetof(struct GSMTime, timeSlot), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_TimeSlot, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "timeSlot" }, { ATF_NOFLAGS, 0, offsetof(struct GSMTime, bitNumber), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BitNumber, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "bitNumber" }, }; static ber_tlv_tag_t asn_DEF_GSMTime_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GSMTime_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* bcchCarrier at 630 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* bsic at 631 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* frameNumber at 632 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* timeSlot at 633 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* bitNumber at 635 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GSMTime_specs_1 = { sizeof(struct GSMTime), offsetof(struct GSMTime, _asn_ctx), asn_MAP_GSMTime_tag2el_1, 5, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GSMTime = { "GSMTime", "GSMTime", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GSMTime_tags_1, sizeof(asn_DEF_GSMTime_tags_1) /sizeof(asn_DEF_GSMTime_tags_1[0]), /* 1 */ asn_DEF_GSMTime_tags_1, /* Same as above */ sizeof(asn_DEF_GSMTime_tags_1) /sizeof(asn_DEF_GSMTime_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GSMTime_1, 5, /* Elements count */ &asn_SPC_GSMTime_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/GSMTime.h000066400000000000000000000015061305042567700221020ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _GSMTime_H_ #define _GSMTime_H_ #include /* Including external dependencies */ #include "BCCHCarrier.h" #include "BSIC.h" #include "FrameNumber.h" #include "TimeSlot.h" #include "BitNumber.h" #include #ifdef __cplusplus extern "C" { #endif /* GSMTime */ typedef struct GSMTime { BCCHCarrier_t bcchCarrier; BSIC_t bsic; FrameNumber_t frameNumber; TimeSlot_t timeSlot; BitNumber_t bitNumber; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GSMTime_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GSMTime; #ifdef __cplusplus } #endif #endif /* _GSMTime_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/INTEGER.c000066400000000000000000000543541305042567700217360ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004, 2005, 2006, 2007 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include /* Encoder and decoder of a primitive type */ #include /* * INTEGER basic type description. */ static ber_tlv_tag_t asn_DEF_INTEGER_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_INTEGER = { "INTEGER", "INTEGER", ASN__PRIMITIVE_TYPE_free, INTEGER_print, asn_generic_no_constraint, ber_decode_primitive, INTEGER_encode_der, INTEGER_decode_xer, INTEGER_encode_xer, INTEGER_decode_uper, /* Unaligned PER decoder */ INTEGER_encode_uper, /* Unaligned PER encoder */ 0, /* Use generic outmost tag fetcher */ asn_DEF_INTEGER_tags, sizeof(asn_DEF_INTEGER_tags) / sizeof(asn_DEF_INTEGER_tags[0]), asn_DEF_INTEGER_tags, /* Same as above */ sizeof(asn_DEF_INTEGER_tags) / sizeof(asn_DEF_INTEGER_tags[0]), 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; /* * Encode INTEGER type using DER. */ asn_enc_rval_t INTEGER_encode_der(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { INTEGER_t *st = (INTEGER_t *)sptr; ASN_DEBUG("%s %s as INTEGER (tm=%d)", cb?"Encoding":"Estimating", td->name, tag_mode); /* * Canonicalize integer in the buffer. * (Remove too long sign extension, remove some first 0x00 bytes) */ if(st->buf) { uint8_t *buf = st->buf; uint8_t *end1 = buf + st->size - 1; int shift; /* Compute the number of superfluous leading bytes */ for(; buf < end1; buf++) { /* * If the contents octets of an integer value encoding * consist of more than one octet, then the bits of the * first octet and bit 8 of the second octet: * a) shall not all be ones; and * b) shall not all be zero. */ switch(*buf) { case 0x00: if((buf[1] & 0x80) == 0) continue; break; case 0xff: if((buf[1] & 0x80)) continue; break; } break; } /* Remove leading superfluous bytes from the integer */ shift = buf - st->buf; if(shift) { uint8_t *nb = st->buf; uint8_t *end; st->size -= shift; /* New size, minus bad bytes */ end = nb + st->size; for(; nb < end; nb++, buf++) *nb = *buf; } } /* if(1) */ return der_encode_primitive(td, sptr, tag_mode, tag, cb, app_key); } static const asn_INTEGER_enum_map_t *INTEGER_map_enum2value(asn_INTEGER_specifics_t *specs, const char *lstart, const char *lstop); /* * INTEGER specific human-readable output. */ static ssize_t INTEGER__dump(asn_TYPE_descriptor_t *td, const INTEGER_t *st, asn_app_consume_bytes_f *cb, void *app_key, int plainOrXER) { asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; char scratch[32]; /* Enough for 64-bit integer */ uint8_t *buf = st->buf; uint8_t *buf_end = st->buf + st->size; signed long accum; ssize_t wrote = 0; char *p; int ret; /* * Advance buf pointer until the start of the value's body. * This will make us able to process large integers using simple case, * when the actual value is small * (0x0000000000abcdef would yield a fine 0x00abcdef) */ /* Skip the insignificant leading bytes */ for(; buf < buf_end-1; buf++) { switch(*buf) { case 0x00: if((buf[1] & 0x80) == 0) continue; break; case 0xff: if((buf[1] & 0x80) != 0) continue; break; } break; } /* Simple case: the integer size is small */ if((size_t)(buf_end - buf) <= sizeof(accum)) { const asn_INTEGER_enum_map_t *el; size_t scrsize; char *scr; if(buf == buf_end) { accum = 0; } else { accum = (*buf & 0x80) ? -1 : 0; for(; buf < buf_end; buf++) accum = (accum << 8) | *buf; } el = INTEGER_map_value2enum(specs, accum); if(el) { scrsize = el->enum_len + 32; scr = (char *)alloca(scrsize); if(plainOrXER == 0) ret = snprintf(scr, scrsize, "%ld (%s)", accum, el->enum_name); else ret = snprintf(scr, scrsize, "<%s/>", el->enum_name); } else if(plainOrXER && specs && specs->strict_enumeration) { ASN_DEBUG("ASN.1 forbids dealing with " "unknown value of ENUMERATED type"); errno = EPERM; return -1; } else { scrsize = sizeof(scratch); scr = scratch; ret = snprintf(scr, scrsize, (specs && specs->field_unsigned) ?"%lu":"%ld", accum); } assert(ret > 0 && (size_t)ret < scrsize); return (cb(scr, ret, app_key) < 0) ? -1 : ret; } else if(plainOrXER && specs && specs->strict_enumeration) { /* * Here and earlier, we cannot encode the ENUMERATED values * if there is no corresponding identifier. */ ASN_DEBUG("ASN.1 forbids dealing with " "unknown value of ENUMERATED type"); errno = EPERM; return -1; } /* Output in the long xx:yy:zz... format */ /* TODO: replace with generic algorithm (Knuth TAOCP Vol 2, 4.3.1) */ for(p = scratch; buf < buf_end; buf++) { static const char *h2c = "0123456789ABCDEF"; if((p - scratch) >= (ssize_t)(sizeof(scratch) - 4)) { /* Flush buffer */ if(cb(scratch, p - scratch, app_key) < 0) return -1; wrote += p - scratch; p = scratch; } *p++ = h2c[*buf >> 4]; *p++ = h2c[*buf & 0x0F]; *p++ = 0x3a; /* ":" */ } if(p != scratch) p--; /* Remove the last ":" */ wrote += p - scratch; return (cb(scratch, p - scratch, app_key) < 0) ? -1 : wrote; } /* * INTEGER specific human-readable output. */ int INTEGER_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const INTEGER_t *st = (const INTEGER_t *)sptr; ssize_t ret; (void)td; (void)ilevel; if(!st || !st->buf) ret = cb("", 8, app_key); else ret = INTEGER__dump(td, st, cb, app_key, 0); return (ret < 0) ? -1 : 0; } struct e2v_key { const char *start; const char *stop; asn_INTEGER_enum_map_t *vemap; unsigned int *evmap; }; static int INTEGER__compar_enum2value(const void *kp, const void *am) { const struct e2v_key *key = (const struct e2v_key *)kp; const asn_INTEGER_enum_map_t *el = (const asn_INTEGER_enum_map_t *)am; const char *ptr, *end, *name; /* Remap the element (sort by different criterion) */ el = key->vemap + key->evmap[el - key->vemap]; /* Compare strings */ for(ptr = key->start, end = key->stop, name = el->enum_name; ptr < end; ptr++, name++) { if(*ptr != *name) return *(const unsigned char *)ptr - *(const unsigned char *)name; } return name[0] ? -1 : 0; } static const asn_INTEGER_enum_map_t * INTEGER_map_enum2value(asn_INTEGER_specifics_t *specs, const char *lstart, const char *lstop) { asn_INTEGER_enum_map_t *el_found; int count = specs ? specs->map_count : 0; struct e2v_key key; const char *lp; if(!count) return NULL; /* Guaranteed: assert(lstart < lstop); */ /* Figure out the tag name */ for(lstart++, lp = lstart; lp < lstop; lp++) { switch(*lp) { case 9: case 10: case 11: case 12: case 13: case 32: /* WSP */ case 0x2f: /* '/' */ case 0x3e: /* '>' */ break; default: continue; } break; } if(lp == lstop) return NULL; /* No tag found */ lstop = lp; key.start = lstart; key.stop = lstop; key.vemap = specs->value2enum; key.evmap = specs->enum2value; el_found = (asn_INTEGER_enum_map_t *)bsearch(&key, specs->value2enum, count, sizeof(specs->value2enum[0]), INTEGER__compar_enum2value); if(el_found) { /* Remap enum2value into value2enum */ el_found = key.vemap + key.evmap[el_found - key.vemap]; } return el_found; } static int INTEGER__compar_value2enum(const void *kp, const void *am) { long a = *(const long *)kp; const asn_INTEGER_enum_map_t *el = (const asn_INTEGER_enum_map_t *)am; long b = el->nat_value; if(a < b) return -1; else if(a == b) return 0; else return 1; } const asn_INTEGER_enum_map_t * INTEGER_map_value2enum(asn_INTEGER_specifics_t *specs, long value) { int count = specs ? specs->map_count : 0; if(!count) return 0; return (asn_INTEGER_enum_map_t *)bsearch(&value, specs->value2enum, count, sizeof(specs->value2enum[0]), INTEGER__compar_value2enum); } static int INTEGER_st_prealloc(INTEGER_t *st, int min_size) { void *p = MALLOC(min_size + 1); if(p) { void *b = st->buf; st->size = 0; st->buf = p; FREEMEM(b); return 0; } else { return -1; } } /* * Decode the chunk of XML text encoding INTEGER. */ static enum xer_pbd_rval INTEGER__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void *chunk_buf, size_t chunk_size) { INTEGER_t *st = (INTEGER_t *)sptr; long sign = 1; long value; const char *lp; const char *lstart = (const char *)chunk_buf; const char *lstop = lstart + chunk_size; enum { ST_SKIPSPACE, ST_SKIPSPHEX, ST_WAITDIGITS, ST_DIGITS, ST_HEXDIGIT1, ST_HEXDIGIT2, ST_HEXCOLON, ST_EXTRASTUFF } state = ST_SKIPSPACE; if(chunk_size) ASN_DEBUG("INTEGER body %ld 0x%2x..0x%2x", (long)chunk_size, *lstart, lstop[-1]); /* * We may have received a tag here. It will be processed inline. * Use strtoul()-like code and serialize the result. */ for(value = 0, lp = lstart; lp < lstop; lp++) { int lv = *lp; switch(lv) { case 0x09: case 0x0a: case 0x0d: case 0x20: switch(state) { case ST_SKIPSPACE: case ST_SKIPSPHEX: continue; case ST_HEXCOLON: if(xer_is_whitespace(lp, lstop - lp)) { lp = lstop - 1; continue; } break; default: break; } break; case 0x2d: /* '-' */ if(state == ST_SKIPSPACE) { sign = -1; state = ST_WAITDIGITS; continue; } break; case 0x2b: /* '+' */ if(state == ST_SKIPSPACE) { state = ST_WAITDIGITS; continue; } break; case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: switch(state) { case ST_DIGITS: break; case ST_SKIPSPHEX: /* Fall through */ case ST_HEXDIGIT1: value = (lv - 0x30) << 4; state = ST_HEXDIGIT2; continue; case ST_HEXDIGIT2: value += (lv - 0x30); state = ST_HEXCOLON; st->buf[st->size++] = (uint8_t)value; continue; case ST_HEXCOLON: return XPBD_BROKEN_ENCODING; default: state = ST_DIGITS; break; } { long new_value = value * 10; if(new_value / 10 != value) /* Overflow */ return XPBD_DECODER_LIMIT; value = new_value + (lv - 0x30); /* Check for two's complement overflow */ if(value < 0) { /* Check whether it is a LONG_MIN */ if(sign == -1 && (unsigned long)value == ~((unsigned long)-1 >> 1)) { sign = 1; } else { /* Overflow */ return XPBD_DECODER_LIMIT; } } } continue; case 0x3c: /* '<' */ if(state == ST_SKIPSPACE) { const asn_INTEGER_enum_map_t *el; el = INTEGER_map_enum2value( (asn_INTEGER_specifics_t *) td->specifics, lstart, lstop); if(el) { ASN_DEBUG("Found \"%s\" => %ld", el->enum_name, el->nat_value); state = ST_DIGITS; value = el->nat_value; lp = lstop - 1; continue; } ASN_DEBUG("Unknown identifier for INTEGER"); } return XPBD_BROKEN_ENCODING; case 0x3a: /* ':' */ if(state == ST_HEXCOLON) { /* This colon is expected */ state = ST_HEXDIGIT1; continue; } else if(state == ST_DIGITS) { /* The colon here means that we have * decoded the first two hexadecimal * places as a decimal value. * Switch decoding mode. */ ASN_DEBUG("INTEGER re-evaluate as hex form"); if(INTEGER_st_prealloc(st, (chunk_size/3) + 1)) return XPBD_SYSTEM_FAILURE; state = ST_SKIPSPHEX; lp = lstart - 1; continue; } else { ASN_DEBUG("state %d at %d", state, lp - lstart); break; } /* [A-Fa-f] */ case 0x41:case 0x42:case 0x43:case 0x44:case 0x45:case 0x46: case 0x61:case 0x62:case 0x63:case 0x64:case 0x65:case 0x66: switch(state) { case ST_SKIPSPHEX: case ST_SKIPSPACE: /* Fall through */ case ST_HEXDIGIT1: value = lv - ((lv < 0x61) ? 0x41 : 0x61); value += 10; value <<= 4; state = ST_HEXDIGIT2; continue; case ST_HEXDIGIT2: value += lv - ((lv < 0x61) ? 0x41 : 0x61); value += 10; st->buf[st->size++] = (uint8_t)value; state = ST_HEXCOLON; continue; case ST_DIGITS: ASN_DEBUG("INTEGER re-evaluate as hex form"); if(INTEGER_st_prealloc(st, (chunk_size/3) + 1)) return XPBD_SYSTEM_FAILURE; state = ST_SKIPSPHEX; lp = lstart - 1; continue; default: break; } break; } /* Found extra non-numeric stuff */ ASN_DEBUG("Found non-numeric 0x%2x at %d", lv, lp - lstart); state = ST_EXTRASTUFF; break; } switch(state) { case ST_DIGITS: /* Everything is cool */ break; case ST_HEXCOLON: st->buf[st->size] = 0; /* Just in case termination */ return XPBD_BODY_CONSUMED; case ST_HEXDIGIT1: case ST_HEXDIGIT2: case ST_SKIPSPHEX: return XPBD_BROKEN_ENCODING; default: if(xer_is_whitespace(lp, lstop - lp)) { if(state != ST_EXTRASTUFF) return XPBD_NOT_BODY_IGNORE; break; } else { ASN_DEBUG("INTEGER: No useful digits (state %d)", state); return XPBD_BROKEN_ENCODING; /* No digits */ } break; } value *= sign; /* Change sign, if needed */ if(asn_long2INTEGER(st, value)) return XPBD_SYSTEM_FAILURE; return XPBD_BODY_CONSUMED; } asn_dec_rval_t INTEGER_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, const void *buf_ptr, size_t size) { return xer_decode_primitive(opt_codec_ctx, td, sptr, sizeof(INTEGER_t), opt_mname, buf_ptr, size, INTEGER__xer_body_decode); } asn_enc_rval_t INTEGER_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { const INTEGER_t *st = (const INTEGER_t *)sptr; asn_enc_rval_t er; (void)ilevel; (void)flags; if(!st || !st->buf) _ASN_ENCODE_FAILED; er.encoded = INTEGER__dump(td, st, cb, app_key, 1); if(er.encoded < 0) _ASN_ENCODE_FAILED; _ASN_ENCODED_OK(er); } asn_dec_rval_t INTEGER_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; asn_dec_rval_t rval = { RC_OK, 0 }; INTEGER_t *st = (INTEGER_t *)*sptr; asn_per_constraint_t *ct; int repeat; (void)opt_codec_ctx; if(!st) { st = (INTEGER_t *)(*sptr = CALLOC(1, sizeof(*st))); if(!st) _ASN_DECODE_FAILED; } if(!constraints) constraints = td->per_constraints; ct = constraints ? &constraints->value : 0; if(ct && ct->flags & APC_EXTENSIBLE) { int inext = per_get_few_bits(pd, 1); if(inext < 0) _ASN_DECODE_STARVED; if(inext) ct = 0; } FREEMEM(st->buf); st->buf = 0; st->size = 0; if(ct) { if(ct->flags & APC_SEMI_CONSTRAINED) { st->buf = (uint8_t *)CALLOC(1, 2); if(!st->buf) _ASN_DECODE_FAILED; st->size = 1; } else if(ct->flags & APC_CONSTRAINED && ct->range_bits >= 0) { size_t size = (ct->range_bits + 7) >> 3; st->buf = (uint8_t *)MALLOC(1 + size + 1); if(!st->buf) _ASN_DECODE_FAILED; st->size = size; } } /* X.691, #12.2.2 */ if(ct && ct->flags != APC_UNCONSTRAINED) { /* #10.5.6 */ ASN_DEBUG("Integer with range %d bits", ct->range_bits); if(ct->range_bits >= 0) { long value; if(ct->range_bits == 32) { long lhalf; value = per_get_few_bits(pd, 16); if(value < 0) _ASN_DECODE_STARVED; lhalf = per_get_few_bits(pd, 16); if(lhalf < 0) _ASN_DECODE_STARVED; value = (value << 16) | lhalf; } else { value = per_get_few_bits(pd, ct->range_bits); if(value < 0) _ASN_DECODE_STARVED; } ASN_DEBUG("Got value %ld + low %ld", value, ct->lower_bound); value += ct->lower_bound; if((specs && specs->field_unsigned) ? asn_ulong2INTEGER(st, value) : asn_long2INTEGER(st, value)) _ASN_DECODE_FAILED; return rval; } } else { ASN_DEBUG("Decoding unconstrained integer %s", td->name); } /* X.691, #12.2.3, #12.2.4 */ do { ssize_t len; void *p; int ret; /* Get the PER length */ len = uper_get_length(pd, -1, &repeat); if(len < 0) _ASN_DECODE_STARVED; p = REALLOC(st->buf, st->size + len + 1); if(!p) _ASN_DECODE_FAILED; st->buf = (uint8_t *)p; ret = per_get_many_bits(pd, &st->buf[st->size], 0, 8 * len); if(ret < 0) _ASN_DECODE_STARVED; st->size += len; } while(repeat); st->buf[st->size] = 0; /* JIC */ /* #12.2.3 */ if(ct && ct->lower_bound) { /* * TODO: replace by in-place arithmetics. */ long value; if(asn_INTEGER2long(st, &value)) _ASN_DECODE_FAILED; if(asn_long2INTEGER(st, value + ct->lower_bound)) _ASN_DECODE_FAILED; } return rval; } asn_enc_rval_t INTEGER_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; asn_enc_rval_t er; INTEGER_t *st = (INTEGER_t *)sptr; const uint8_t *buf; const uint8_t *end; asn_per_constraint_t *ct; long value = 0; if(!st || st->size == 0) _ASN_ENCODE_FAILED; if(!constraints) constraints = td->per_constraints; ct = constraints ? &constraints->value : 0; er.encoded = 0; if(ct) { int inext = 0; if(specs && specs->field_unsigned) { unsigned long uval; if(asn_INTEGER2ulong(st, &uval)) _ASN_ENCODE_FAILED; /* Check proper range */ if(ct->flags & APC_SEMI_CONSTRAINED) { if(uval < (unsigned long)ct->lower_bound) inext = 1; } else if(ct->range_bits >= 0) { if(uval < (unsigned long)ct->lower_bound || uval > (unsigned long)ct->upper_bound) inext = 1; } ASN_DEBUG("Value %lu (%02x/%d) lb %lu ub %lu %s", uval, st->buf[0], st->size, ct->lower_bound, ct->upper_bound, inext ? "ext" : "fix"); value = uval; } else { if(asn_INTEGER2long(st, &value)) _ASN_ENCODE_FAILED; /* Check proper range */ if(ct->flags & APC_SEMI_CONSTRAINED) { if(value < ct->lower_bound) inext = 1; } else if(ct->range_bits >= 0) { if(value < ct->lower_bound || value > ct->upper_bound) inext = 1; } ASN_DEBUG("Value %ld (%02x/%d) lb %ld ub %ld %s", value, st->buf[0], st->size, ct->lower_bound, ct->upper_bound, inext ? "ext" : "fix"); } if(ct->flags & APC_EXTENSIBLE) { if(per_put_few_bits(po, inext, 1)) _ASN_ENCODE_FAILED; if(inext) ct = 0; } else if(inext) { _ASN_ENCODE_FAILED; } } /* X.691, #12.2.2 */ if(ct && ct->range_bits >= 0) { /* #10.5.6 */ ASN_DEBUG("Encoding integer with range %d bits", ct->range_bits); if(ct->range_bits == 32) { /* TODO: extend to >32 bits */ long v = value - ct->lower_bound; if(per_put_few_bits(po, v >> 1, 31) || per_put_few_bits(po, v, 1)) _ASN_ENCODE_FAILED; } else { if(per_put_few_bits(po, value - ct->lower_bound, ct->range_bits)) _ASN_ENCODE_FAILED; } _ASN_ENCODED_OK(er); } if(ct && ct->lower_bound) { ASN_DEBUG("Adjust lower bound to %ld", ct->lower_bound); /* TODO: adjust lower bound */ _ASN_ENCODE_FAILED; } for(buf = st->buf, end = st->buf + st->size; buf < end;) { ssize_t mayEncode = uper_put_length(po, end - buf); if(mayEncode < 0) _ASN_ENCODE_FAILED; if(per_put_many_bits(po, buf, 8 * mayEncode)) _ASN_ENCODE_FAILED; buf += mayEncode; } _ASN_ENCODED_OK(er); } int asn_INTEGER2long(const INTEGER_t *iptr, long *lptr) { uint8_t *b, *end; size_t size; long l; /* Sanity checking */ if(!iptr || !iptr->buf || !lptr) { errno = EINVAL; return -1; } /* Cache the begin/end of the buffer */ b = iptr->buf; /* Start of the INTEGER buffer */ size = iptr->size; end = b + size; /* Where to stop */ if(size > sizeof(long)) { uint8_t *end1 = end - 1; /* * Slightly more advanced processing, * able to >sizeof(long) bytes, * when the actual value is small * (0x0000000000abcdef would yield a fine 0x00abcdef) */ /* Skip out the insignificant leading bytes */ for(; b < end1; b++) { switch(*b) { case 0x00: if((b[1] & 0x80) == 0) continue; break; case 0xff: if((b[1] & 0x80) != 0) continue; break; } break; } size = end - b; if(size > sizeof(long)) { /* Still cannot fit the long */ errno = ERANGE; return -1; } } /* Shortcut processing of a corner case */ if(end == b) { *lptr = 0; return 0; } /* Perform the sign initialization */ /* Actually l = -(*b >> 7); gains nothing, yet unreadable! */ if((*b >> 7)) l = -1; else l = 0; /* Conversion engine */ for(; b < end; b++) l = (l << 8) | *b; *lptr = l; return 0; } int asn_INTEGER2ulong(const INTEGER_t *iptr, unsigned long *lptr) { uint8_t *b, *end; unsigned long l; size_t size; if(!iptr || !iptr->buf || !lptr) { errno = EINVAL; return -1; } b = iptr->buf; size = iptr->size; end = b + size; /* If all extra leading bytes are zeroes, ignore them */ for(; size > sizeof(unsigned long); b++, size--) { if(*b) { /* Value won't fit unsigned long */ errno = ERANGE; return -1; } } /* Conversion engine */ for(l = 0; b < end; b++) l = (l << 8) | *b; *lptr = l; return 0; } int asn_ulong2INTEGER(INTEGER_t *st, unsigned long value) { uint8_t *buf; uint8_t *end; uint8_t *b; int shr; if(value <= LONG_MAX) return asn_long2INTEGER(st, value); buf = (uint8_t *)MALLOC(1 + sizeof(value)); if(!buf) return -1; end = buf + (sizeof(value) + 1); buf[0] = 0; for(b = buf + 1, shr = (sizeof(long)-1)*8; b < end; shr -= 8, b++) *b = (uint8_t)(value >> shr); if(st->buf) FREEMEM(st->buf); st->buf = buf; st->size = 1 + sizeof(value); return 0; } int asn_long2INTEGER(INTEGER_t *st, long value) { uint8_t *buf, *bp; uint8_t *p; uint8_t *pstart; uint8_t *pend1; int littleEndian = 1; /* Run-time detection */ int add; if(!st) { errno = EINVAL; return -1; } buf = (uint8_t *)MALLOC(sizeof(value)); if(!buf) return -1; if(*(char *)&littleEndian) { pstart = (uint8_t *)&value + sizeof(value) - 1; pend1 = (uint8_t *)&value; add = -1; } else { pstart = (uint8_t *)&value; pend1 = pstart + sizeof(value) - 1; add = 1; } /* * If the contents octet consists of more than one octet, * then bits of the first octet and bit 8 of the second octet: * a) shall not all be ones; and * b) shall not all be zero. */ for(p = pstart; p != pend1; p += add) { switch(*p) { case 0x00: if((*(p+add) & 0x80) == 0) continue; break; case 0xff: if((*(p+add) & 0x80)) continue; break; } break; } /* Copy the integer body */ for(pstart = p, bp = buf, pend1 += add; p != pend1; p += add) *bp++ = *p; if(st->buf) FREEMEM(st->buf); st->buf = buf; st->size = bp - buf; return 0; } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/INTEGER.h000066400000000000000000000042671305042567700217410ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2005 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _INTEGER_H_ #define _INTEGER_H_ #include #include #ifdef __cplusplus extern "C" { #endif typedef ASN__PRIMITIVE_TYPE_t INTEGER_t; extern asn_TYPE_descriptor_t asn_DEF_INTEGER; /* Map with to integer value association */ typedef struct asn_INTEGER_enum_map_s { long nat_value; /* associated native integer value */ size_t enum_len; /* strlen("tag") */ const char *enum_name; /* "tag" */ } asn_INTEGER_enum_map_t; /* This type describes an enumeration for INTEGER and ENUMERATED types */ typedef struct asn_INTEGER_specifics_s { asn_INTEGER_enum_map_t *value2enum; /* N -> "tag"; sorted by N */ unsigned int *enum2value; /* "tag" => N; sorted by tag */ int map_count; /* Elements in either map */ int extension; /* This map is extensible */ int strict_enumeration; /* Enumeration set is fixed */ int field_width; /* Size of native integer */ int field_unsigned; /* Signed=0, unsigned=1 */ } asn_INTEGER_specifics_t; asn_struct_print_f INTEGER_print; ber_type_decoder_f INTEGER_decode_ber; der_type_encoder_f INTEGER_encode_der; xer_type_decoder_f INTEGER_decode_xer; xer_type_encoder_f INTEGER_encode_xer; per_type_decoder_f INTEGER_decode_uper; per_type_encoder_f INTEGER_encode_uper; /*********************************** * Some handy conversion routines. * ***********************************/ /* * Returns 0 if it was possible to convert, -1 otherwise. * -1/EINVAL: Mandatory argument missing * -1/ERANGE: Value encoded is out of range for long representation * -1/ENOMEM: Memory allocation failed (in asn_long2INTEGER()). */ int asn_INTEGER2long(const INTEGER_t *i, long *l); int asn_INTEGER2ulong(const INTEGER_t *i, unsigned long *l); int asn_long2INTEGER(INTEGER_t *i, long l); int asn_ulong2INTEGER(INTEGER_t *i, unsigned long l); /* * Convert the integer value into the corresponding enumeration map entry. */ const asn_INTEGER_enum_map_t *INTEGER_map_value2enum(asn_INTEGER_specifics_t *specs, long value); #ifdef __cplusplus } #endif #endif /* _INTEGER_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/IonosphericModel.c000066400000000000000000000232061305042567700240740ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "IonosphericModel.h" static int memb_alfa0_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -128 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_alfa1_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -128 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_alfa2_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -128 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_alfa3_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -128 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_beta0_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -128 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_beta1_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -128 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_beta2_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -128 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_beta3_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -128 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_alfa0_constr_2 = { { APC_CONSTRAINED, 8, 8, -128, 127 } /* (-128..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_alfa1_constr_3 = { { APC_CONSTRAINED, 8, 8, -128, 127 } /* (-128..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_alfa2_constr_4 = { { APC_CONSTRAINED, 8, 8, -128, 127 } /* (-128..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_alfa3_constr_5 = { { APC_CONSTRAINED, 8, 8, -128, 127 } /* (-128..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_beta0_constr_6 = { { APC_CONSTRAINED, 8, 8, -128, 127 } /* (-128..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_beta1_constr_7 = { { APC_CONSTRAINED, 8, 8, -128, 127 } /* (-128..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_beta2_constr_8 = { { APC_CONSTRAINED, 8, 8, -128, 127 } /* (-128..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_beta3_constr_9 = { { APC_CONSTRAINED, 8, 8, -128, 127 } /* (-128..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_IonosphericModel_1[] = { { ATF_NOFLAGS, 0, offsetof(struct IonosphericModel, alfa0), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_alfa0_constraint_1, &asn_PER_memb_alfa0_constr_2, 0, "alfa0" }, { ATF_NOFLAGS, 0, offsetof(struct IonosphericModel, alfa1), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_alfa1_constraint_1, &asn_PER_memb_alfa1_constr_3, 0, "alfa1" }, { ATF_NOFLAGS, 0, offsetof(struct IonosphericModel, alfa2), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_alfa2_constraint_1, &asn_PER_memb_alfa2_constr_4, 0, "alfa2" }, { ATF_NOFLAGS, 0, offsetof(struct IonosphericModel, alfa3), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_alfa3_constraint_1, &asn_PER_memb_alfa3_constr_5, 0, "alfa3" }, { ATF_NOFLAGS, 0, offsetof(struct IonosphericModel, beta0), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_beta0_constraint_1, &asn_PER_memb_beta0_constr_6, 0, "beta0" }, { ATF_NOFLAGS, 0, offsetof(struct IonosphericModel, beta1), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_beta1_constraint_1, &asn_PER_memb_beta1_constr_7, 0, "beta1" }, { ATF_NOFLAGS, 0, offsetof(struct IonosphericModel, beta2), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_beta2_constraint_1, &asn_PER_memb_beta2_constr_8, 0, "beta2" }, { ATF_NOFLAGS, 0, offsetof(struct IonosphericModel, beta3), (ASN_TAG_CLASS_CONTEXT | (7 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_beta3_constraint_1, &asn_PER_memb_beta3_constr_9, 0, "beta3" }, }; static ber_tlv_tag_t asn_DEF_IonosphericModel_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_IonosphericModel_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* alfa0 at 763 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* alfa1 at 764 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* alfa2 at 765 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* alfa3 at 766 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* beta0 at 767 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* beta1 at 768 */ { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* beta2 at 769 */ { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 } /* beta3 at 770 */ }; static asn_SEQUENCE_specifics_t asn_SPC_IonosphericModel_specs_1 = { sizeof(struct IonosphericModel), offsetof(struct IonosphericModel, _asn_ctx), asn_MAP_IonosphericModel_tag2el_1, 8, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_IonosphericModel = { "IonosphericModel", "IonosphericModel", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_IonosphericModel_tags_1, sizeof(asn_DEF_IonosphericModel_tags_1) /sizeof(asn_DEF_IonosphericModel_tags_1[0]), /* 1 */ asn_DEF_IonosphericModel_tags_1, /* Same as above */ sizeof(asn_DEF_IonosphericModel_tags_1) /sizeof(asn_DEF_IonosphericModel_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_IonosphericModel_1, 8, /* Elements count */ &asn_SPC_IonosphericModel_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/IonosphericModel.h000066400000000000000000000014461305042567700241030ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _IonosphericModel_H_ #define _IonosphericModel_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* IonosphericModel */ typedef struct IonosphericModel { long alfa0; long alfa1; long alfa2; long alfa3; long beta0; long beta1; long beta2; long beta3; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } IonosphericModel_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_IonosphericModel; #ifdef __cplusplus } #endif #endif /* _IonosphericModel_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/LAC.c000066400000000000000000000104611305042567700212270ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "LAC.h" int LAC_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 65535)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void LAC_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void LAC_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { LAC_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int LAC_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { LAC_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t LAC_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { LAC_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t LAC_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { LAC_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t LAC_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { LAC_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t LAC_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { LAC_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t LAC_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { LAC_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t LAC_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { LAC_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_LAC_constr_1 = { { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_LAC_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_LAC = { "LAC", "LAC", LAC_free, LAC_print, LAC_constraint, LAC_decode_ber, LAC_encode_der, LAC_decode_xer, LAC_encode_xer, LAC_decode_uper, LAC_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_LAC_tags_1, sizeof(asn_DEF_LAC_tags_1) /sizeof(asn_DEF_LAC_tags_1[0]), /* 1 */ asn_DEF_LAC_tags_1, /* Same as above */ sizeof(asn_DEF_LAC_tags_1) /sizeof(asn_DEF_LAC_tags_1[0]), /* 1 */ &asn_PER_type_LAC_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/LAC.h000066400000000000000000000014241305042567700212330ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _LAC_H_ #define _LAC_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* LAC */ typedef long LAC_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_LAC; asn_struct_free_f LAC_free; asn_struct_print_f LAC_print; asn_constr_check_f LAC_constraint; ber_type_decoder_f LAC_decode_ber; der_type_encoder_f LAC_encode_der; xer_type_decoder_f LAC_decode_xer; xer_type_encoder_f LAC_encode_xer; per_type_decoder_f LAC_decode_uper; per_type_encoder_f LAC_encode_uper; #ifdef __cplusplus } #endif #endif /* _LAC_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/LocErrorReason.c000066400000000000000000000140271305042567700235310ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "LocErrorReason.h" int LocErrorReason_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { /* Replace with underlying type checker */ td->check_constraints = asn_DEF_ENUMERATED.check_constraints; return td->check_constraints(td, sptr, ctfailcb, app_key); } /* * This type is implemented using ENUMERATED, * so here we adjust the DEF accordingly. */ static void LocErrorReason_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_ENUMERATED.free_struct; td->print_struct = asn_DEF_ENUMERATED.print_struct; td->ber_decoder = asn_DEF_ENUMERATED.ber_decoder; td->der_encoder = asn_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; td->uper_encoder = asn_DEF_ENUMERATED.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_ENUMERATED.per_constraints; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ } void LocErrorReason_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { LocErrorReason_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int LocErrorReason_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { LocErrorReason_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t LocErrorReason_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { LocErrorReason_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t LocErrorReason_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { LocErrorReason_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t LocErrorReason_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { LocErrorReason_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t LocErrorReason_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { LocErrorReason_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t LocErrorReason_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { LocErrorReason_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t LocErrorReason_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { LocErrorReason_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_LocErrorReason_constr_1 = { { APC_CONSTRAINED | APC_EXTENSIBLE, 4, 4, 0, 10 } /* (0..10,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_INTEGER_enum_map_t asn_MAP_LocErrorReason_value2enum_1[] = { { 0, 9, "unDefined" }, { 1, 13, "notEnoughBTSs" }, { 2, 13, "notEnoughSats" }, { 3, 24, "eotdLocCalAssDataMissing" }, { 4, 18, "eotdAssDataMissing" }, { 5, 23, "gpsLocCalAssDataMissing" }, { 6, 17, "gpsAssDataMissing" }, { 7, 18, "methodNotSupported" }, { 8, 12, "notProcessed" }, { 9, 25, "refBTSForGPSNotServingBTS" }, { 10, 26, "refBTSForEOTDNotServingBTS" }, { 11, 18, "notEnoughGANSSSats" }, { 12, 19, "ganssAssDataMissing" }, { 13, 27, "refBTSForGANSSNotServingBTS" } /* This list is extensible */ }; static unsigned int asn_MAP_LocErrorReason_enum2value_1[] = { 4, /* eotdAssDataMissing(4) */ 3, /* eotdLocCalAssDataMissing(3) */ 12, /* ganssAssDataMissing(12) */ 6, /* gpsAssDataMissing(6) */ 5, /* gpsLocCalAssDataMissing(5) */ 7, /* methodNotSupported(7) */ 1, /* notEnoughBTSs(1) */ 11, /* notEnoughGANSSSats(11) */ 2, /* notEnoughSats(2) */ 8, /* notProcessed(8) */ 10, /* refBTSForEOTDNotServingBTS(10) */ 13, /* refBTSForGANSSNotServingBTS(13) */ 9, /* refBTSForGPSNotServingBTS(9) */ 0 /* unDefined(0) */ /* This list is extensible */ }; static asn_INTEGER_specifics_t asn_SPC_LocErrorReason_specs_1 = { asn_MAP_LocErrorReason_value2enum_1, /* "tag" => N; sorted by tag */ asn_MAP_LocErrorReason_enum2value_1, /* N => "tag"; sorted by N */ 14, /* Number of elements in the maps */ 12, /* Extensions before this member */ 1, /* Strict enumeration */ 0, /* Native long size */ 0 }; static ber_tlv_tag_t asn_DEF_LocErrorReason_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; asn_TYPE_descriptor_t asn_DEF_LocErrorReason = { "LocErrorReason", "LocErrorReason", LocErrorReason_free, LocErrorReason_print, LocErrorReason_constraint, LocErrorReason_decode_ber, LocErrorReason_encode_der, LocErrorReason_decode_xer, LocErrorReason_encode_xer, LocErrorReason_decode_uper, LocErrorReason_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_LocErrorReason_tags_1, sizeof(asn_DEF_LocErrorReason_tags_1) /sizeof(asn_DEF_LocErrorReason_tags_1[0]), /* 1 */ asn_DEF_LocErrorReason_tags_1, /* Same as above */ sizeof(asn_DEF_LocErrorReason_tags_1) /sizeof(asn_DEF_LocErrorReason_tags_1[0]), /* 1 */ &asn_PER_type_LocErrorReason_constr_1, 0, 0, /* Defined elsewhere */ &asn_SPC_LocErrorReason_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/LocErrorReason.h000066400000000000000000000031501305042567700235310ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _LocErrorReason_H_ #define _LocErrorReason_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum LocErrorReason { LocErrorReason_unDefined = 0, LocErrorReason_notEnoughBTSs = 1, LocErrorReason_notEnoughSats = 2, LocErrorReason_eotdLocCalAssDataMissing = 3, LocErrorReason_eotdAssDataMissing = 4, LocErrorReason_gpsLocCalAssDataMissing = 5, LocErrorReason_gpsAssDataMissing = 6, LocErrorReason_methodNotSupported = 7, LocErrorReason_notProcessed = 8, LocErrorReason_refBTSForGPSNotServingBTS = 9, LocErrorReason_refBTSForEOTDNotServingBTS = 10, /* * Enumeration is extensible */ LocErrorReason_notEnoughGANSSSats = 11, LocErrorReason_ganssAssDataMissing = 12, LocErrorReason_refBTSForGANSSNotServingBTS = 13 } e_LocErrorReason; /* LocErrorReason */ typedef ENUMERATED_t LocErrorReason_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_LocErrorReason; asn_struct_free_f LocErrorReason_free; asn_struct_print_f LocErrorReason_print; asn_constr_check_f LocErrorReason_constraint; ber_type_decoder_f LocErrorReason_decode_ber; der_type_encoder_f LocErrorReason_encode_der; xer_type_decoder_f LocErrorReason_decode_xer; xer_type_encoder_f LocErrorReason_encode_xer; per_type_decoder_f LocErrorReason_decode_uper; per_type_encoder_f LocErrorReason_encode_uper; #ifdef __cplusplus } #endif #endif /* _LocErrorReason_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/LocationError.c000066400000000000000000000044051305042567700234130ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "LocationError.h" static asn_TYPE_member_t asn_MBR_LocationError_1[] = { { ATF_NOFLAGS, 0, offsetof(struct LocationError, locErrorReason), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_LocErrorReason, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "locErrorReason" }, { ATF_POINTER, 1, offsetof(struct LocationError, additionalAssistanceData), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_AdditionalAssistanceData, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "additionalAssistanceData" }, }; static int asn_MAP_LocationError_oms_1[] = { 1 }; static ber_tlv_tag_t asn_DEF_LocationError_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_LocationError_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* locErrorReason at 488 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* additionalAssistanceData at 489 */ }; static asn_SEQUENCE_specifics_t asn_SPC_LocationError_specs_1 = { sizeof(struct LocationError), offsetof(struct LocationError, _asn_ctx), asn_MAP_LocationError_tag2el_1, 2, /* Count of tags in the map */ asn_MAP_LocationError_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ 1, /* Start extensions */ 3 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_LocationError = { "LocationError", "LocationError", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_LocationError_tags_1, sizeof(asn_DEF_LocationError_tags_1) /sizeof(asn_DEF_LocationError_tags_1[0]), /* 1 */ asn_DEF_LocationError_tags_1, /* Same as above */ sizeof(asn_DEF_LocationError_tags_1) /sizeof(asn_DEF_LocationError_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_LocationError_1, 2, /* Elements count */ &asn_SPC_LocationError_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/LocationError.h000066400000000000000000000017331305042567700234210ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _LocationError_H_ #define _LocationError_H_ #include /* Including external dependencies */ #include "LocErrorReason.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct AdditionalAssistanceData; /* LocationError */ typedef struct LocationError { LocErrorReason_t locErrorReason; struct AdditionalAssistanceData *additionalAssistanceData /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } LocationError_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_LocationError; #ifdef __cplusplus } #endif /* Referred external types */ #include "AdditionalAssistanceData.h" #endif /* _LocationError_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/LocationInfo.c000066400000000000000000000103721305042567700232150ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "LocationInfo.h" static int memb_refFrame_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 65535)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_gpsTOW_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 14399999)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_refFrame_constr_2 = { { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_gpsTOW_constr_3 = { { APC_CONSTRAINED, 24, -1, 0, 14399999 } /* (0..14399999) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_LocationInfo_1[] = { { ATF_NOFLAGS, 0, offsetof(struct LocationInfo, refFrame), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_refFrame_constraint_1, &asn_PER_memb_refFrame_constr_2, 0, "refFrame" }, { ATF_POINTER, 1, offsetof(struct LocationInfo, gpsTOW), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_gpsTOW_constraint_1, &asn_PER_memb_gpsTOW_constr_3, 0, "gpsTOW" }, { ATF_NOFLAGS, 0, offsetof(struct LocationInfo, fixType), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_FixType, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "fixType" }, { ATF_NOFLAGS, 0, offsetof(struct LocationInfo, posEstimate), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Ext_GeographicalInformation, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "posEstimate" }, }; static int asn_MAP_LocationInfo_oms_1[] = { 1 }; static ber_tlv_tag_t asn_DEF_LocationInfo_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_LocationInfo_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* refFrame at 420 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* gpsTOW at 423 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* fixType at 424 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* posEstimate at 432 */ }; static asn_SEQUENCE_specifics_t asn_SPC_LocationInfo_specs_1 = { sizeof(struct LocationInfo), offsetof(struct LocationInfo, _asn_ctx), asn_MAP_LocationInfo_tag2el_1, 4, /* Count of tags in the map */ asn_MAP_LocationInfo_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_LocationInfo = { "LocationInfo", "LocationInfo", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_LocationInfo_tags_1, sizeof(asn_DEF_LocationInfo_tags_1) /sizeof(asn_DEF_LocationInfo_tags_1[0]), /* 1 */ asn_DEF_LocationInfo_tags_1, /* Same as above */ sizeof(asn_DEF_LocationInfo_tags_1) /sizeof(asn_DEF_LocationInfo_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_LocationInfo_1, 4, /* Elements count */ &asn_SPC_LocationInfo_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/LocationInfo.h000066400000000000000000000015111305042567700232150ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _LocationInfo_H_ #define _LocationInfo_H_ #include /* Including external dependencies */ #include #include "FixType.h" #include "Ext-GeographicalInformation.h" #include #ifdef __cplusplus extern "C" { #endif /* LocationInfo */ typedef struct LocationInfo { long refFrame; long *gpsTOW /* OPTIONAL */; FixType_t fixType; Ext_GeographicalInformation_t posEstimate; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } LocationInfo_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_LocationInfo; #ifdef __cplusplus } #endif #endif /* _LocationInfo_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/MeasureResponseTime.c000066400000000000000000000116431305042567700245720ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "MeasureResponseTime.h" int MeasureResponseTime_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 7)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void MeasureResponseTime_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void MeasureResponseTime_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { MeasureResponseTime_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int MeasureResponseTime_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { MeasureResponseTime_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t MeasureResponseTime_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { MeasureResponseTime_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t MeasureResponseTime_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { MeasureResponseTime_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t MeasureResponseTime_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { MeasureResponseTime_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t MeasureResponseTime_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { MeasureResponseTime_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t MeasureResponseTime_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { MeasureResponseTime_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t MeasureResponseTime_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { MeasureResponseTime_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_MeasureResponseTime_constr_1 = { { APC_CONSTRAINED, 3, 3, 0, 7 } /* (0..7) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_MeasureResponseTime_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_MeasureResponseTime = { "MeasureResponseTime", "MeasureResponseTime", MeasureResponseTime_free, MeasureResponseTime_print, MeasureResponseTime_constraint, MeasureResponseTime_decode_ber, MeasureResponseTime_encode_der, MeasureResponseTime_decode_xer, MeasureResponseTime_encode_xer, MeasureResponseTime_decode_uper, MeasureResponseTime_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_MeasureResponseTime_tags_1, sizeof(asn_DEF_MeasureResponseTime_tags_1) /sizeof(asn_DEF_MeasureResponseTime_tags_1[0]), /* 1 */ asn_DEF_MeasureResponseTime_tags_1, /* Same as above */ sizeof(asn_DEF_MeasureResponseTime_tags_1) /sizeof(asn_DEF_MeasureResponseTime_tags_1[0]), /* 1 */ &asn_PER_type_MeasureResponseTime_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/MeasureResponseTime.h000066400000000000000000000020041305042567700245660ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _MeasureResponseTime_H_ #define _MeasureResponseTime_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* MeasureResponseTime */ typedef long MeasureResponseTime_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_MeasureResponseTime; asn_struct_free_f MeasureResponseTime_free; asn_struct_print_f MeasureResponseTime_print; asn_constr_check_f MeasureResponseTime_constraint; ber_type_decoder_f MeasureResponseTime_decode_ber; der_type_encoder_f MeasureResponseTime_encode_der; xer_type_decoder_f MeasureResponseTime_decode_xer; xer_type_encoder_f MeasureResponseTime_encode_xer; per_type_decoder_f MeasureResponseTime_decode_uper; per_type_encoder_f MeasureResponseTime_encode_uper; #ifdef __cplusplus } #endif #endif /* _MeasureResponseTime_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/MethodType.c000066400000000000000000000053461305042567700227200ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "MethodType.h" static asn_per_constraints_t asn_PER_type_MethodType_constr_1 = { { APC_CONSTRAINED, 2, 2, 0, 3 } /* (0..3) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_MethodType_1[] = { { ATF_NOFLAGS, 0, offsetof(struct MethodType, choice.msAssisted), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_AccuracyOpt, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "msAssisted" }, { ATF_NOFLAGS, 0, offsetof(struct MethodType, choice.msBased), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Accuracy, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "msBased" }, { ATF_NOFLAGS, 0, offsetof(struct MethodType, choice.msBasedPref), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Accuracy, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "msBasedPref" }, { ATF_NOFLAGS, 0, offsetof(struct MethodType, choice.msAssistedPref), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Accuracy, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "msAssistedPref" }, }; static asn_TYPE_tag2member_t asn_MAP_MethodType_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* msAssisted at 117 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* msBased at 118 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* msBasedPref at 119 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* msAssistedPref at 121 */ }; static asn_CHOICE_specifics_t asn_SPC_MethodType_specs_1 = { sizeof(struct MethodType), offsetof(struct MethodType, _asn_ctx), offsetof(struct MethodType, present), sizeof(((struct MethodType *)0)->present), asn_MAP_MethodType_tag2el_1, 4, /* Count of tags in the map */ 0, -1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_MethodType = { "MethodType", "MethodType", CHOICE_free, CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_decode_uper, CHOICE_encode_uper, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ &asn_PER_type_MethodType_constr_1, asn_MBR_MethodType_1, 4, /* Elements count */ &asn_SPC_MethodType_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/MethodType.h000066400000000000000000000020471305042567700227200ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _MethodType_H_ #define _MethodType_H_ #include /* Including external dependencies */ #include "AccuracyOpt.h" #include "Accuracy.h" #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum MethodType_PR { MethodType_PR_NOTHING, /* No components present */ MethodType_PR_msAssisted, MethodType_PR_msBased, MethodType_PR_msBasedPref, MethodType_PR_msAssistedPref } MethodType_PR; /* MethodType */ typedef struct MethodType { MethodType_PR present; union MethodType_u { AccuracyOpt_t msAssisted; Accuracy_t msBased; Accuracy_t msBasedPref; Accuracy_t msAssistedPref; } choice; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } MethodType_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_MethodType; #ifdef __cplusplus } #endif #endif /* _MethodType_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ModuloTimeSlot.c000066400000000000000000000113331305042567700235470ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "ModuloTimeSlot.h" int ModuloTimeSlot_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 3)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void ModuloTimeSlot_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void ModuloTimeSlot_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { ModuloTimeSlot_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int ModuloTimeSlot_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { ModuloTimeSlot_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t ModuloTimeSlot_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { ModuloTimeSlot_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t ModuloTimeSlot_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { ModuloTimeSlot_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t ModuloTimeSlot_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { ModuloTimeSlot_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t ModuloTimeSlot_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { ModuloTimeSlot_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t ModuloTimeSlot_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { ModuloTimeSlot_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t ModuloTimeSlot_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { ModuloTimeSlot_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_ModuloTimeSlot_constr_1 = { { APC_CONSTRAINED, 2, 2, 0, 3 } /* (0..3) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_ModuloTimeSlot_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_ModuloTimeSlot = { "ModuloTimeSlot", "ModuloTimeSlot", ModuloTimeSlot_free, ModuloTimeSlot_print, ModuloTimeSlot_constraint, ModuloTimeSlot_decode_ber, ModuloTimeSlot_encode_der, ModuloTimeSlot_decode_xer, ModuloTimeSlot_encode_xer, ModuloTimeSlot_decode_uper, ModuloTimeSlot_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_ModuloTimeSlot_tags_1, sizeof(asn_DEF_ModuloTimeSlot_tags_1) /sizeof(asn_DEF_ModuloTimeSlot_tags_1[0]), /* 1 */ asn_DEF_ModuloTimeSlot_tags_1, /* Same as above */ sizeof(asn_DEF_ModuloTimeSlot_tags_1) /sizeof(asn_DEF_ModuloTimeSlot_tags_1[0]), /* 1 */ &asn_PER_type_ModuloTimeSlot_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ModuloTimeSlot.h000066400000000000000000000016711305042567700235600ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _ModuloTimeSlot_H_ #define _ModuloTimeSlot_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* ModuloTimeSlot */ typedef long ModuloTimeSlot_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_ModuloTimeSlot; asn_struct_free_f ModuloTimeSlot_free; asn_struct_print_f ModuloTimeSlot_print; asn_constr_check_f ModuloTimeSlot_constraint; ber_type_decoder_f ModuloTimeSlot_decode_ber; der_type_encoder_f ModuloTimeSlot_encode_der; xer_type_decoder_f ModuloTimeSlot_decode_xer; xer_type_encoder_f ModuloTimeSlot_encode_xer; per_type_decoder_f ModuloTimeSlot_decode_uper; per_type_encoder_f ModuloTimeSlot_encode_uper; #ifdef __cplusplus } #endif #endif /* _ModuloTimeSlot_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/MoreAssDataToBeSent.c000066400000000000000000000125531305042567700244030ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "MoreAssDataToBeSent.h" int MoreAssDataToBeSent_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { /* Replace with underlying type checker */ td->check_constraints = asn_DEF_ENUMERATED.check_constraints; return td->check_constraints(td, sptr, ctfailcb, app_key); } /* * This type is implemented using ENUMERATED, * so here we adjust the DEF accordingly. */ static void MoreAssDataToBeSent_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_ENUMERATED.free_struct; td->print_struct = asn_DEF_ENUMERATED.print_struct; td->ber_decoder = asn_DEF_ENUMERATED.ber_decoder; td->der_encoder = asn_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; td->uper_encoder = asn_DEF_ENUMERATED.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_ENUMERATED.per_constraints; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ } void MoreAssDataToBeSent_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { MoreAssDataToBeSent_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int MoreAssDataToBeSent_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { MoreAssDataToBeSent_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t MoreAssDataToBeSent_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { MoreAssDataToBeSent_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t MoreAssDataToBeSent_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { MoreAssDataToBeSent_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t MoreAssDataToBeSent_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { MoreAssDataToBeSent_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t MoreAssDataToBeSent_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { MoreAssDataToBeSent_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t MoreAssDataToBeSent_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { MoreAssDataToBeSent_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t MoreAssDataToBeSent_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { MoreAssDataToBeSent_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_MoreAssDataToBeSent_constr_1 = { { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_INTEGER_enum_map_t asn_MAP_MoreAssDataToBeSent_value2enum_1[] = { { 0, 14, "noMoreMessages" }, { 1, 20, "moreMessagesOnTheWay" } }; static unsigned int asn_MAP_MoreAssDataToBeSent_enum2value_1[] = { 1, /* moreMessagesOnTheWay(1) */ 0 /* noMoreMessages(0) */ }; static asn_INTEGER_specifics_t asn_SPC_MoreAssDataToBeSent_specs_1 = { asn_MAP_MoreAssDataToBeSent_value2enum_1, /* "tag" => N; sorted by tag */ asn_MAP_MoreAssDataToBeSent_enum2value_1, /* N => "tag"; sorted by N */ 2, /* Number of elements in the maps */ 0, /* Enumeration is not extensible */ 1, /* Strict enumeration */ 0, /* Native long size */ 0 }; static ber_tlv_tag_t asn_DEF_MoreAssDataToBeSent_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; asn_TYPE_descriptor_t asn_DEF_MoreAssDataToBeSent = { "MoreAssDataToBeSent", "MoreAssDataToBeSent", MoreAssDataToBeSent_free, MoreAssDataToBeSent_print, MoreAssDataToBeSent_constraint, MoreAssDataToBeSent_decode_ber, MoreAssDataToBeSent_encode_der, MoreAssDataToBeSent_decode_xer, MoreAssDataToBeSent_encode_xer, MoreAssDataToBeSent_decode_uper, MoreAssDataToBeSent_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_MoreAssDataToBeSent_tags_1, sizeof(asn_DEF_MoreAssDataToBeSent_tags_1) /sizeof(asn_DEF_MoreAssDataToBeSent_tags_1[0]), /* 1 */ asn_DEF_MoreAssDataToBeSent_tags_1, /* Same as above */ sizeof(asn_DEF_MoreAssDataToBeSent_tags_1) /sizeof(asn_DEF_MoreAssDataToBeSent_tags_1[0]), /* 1 */ &asn_PER_type_MoreAssDataToBeSent_constr_1, 0, 0, /* Defined elsewhere */ &asn_SPC_MoreAssDataToBeSent_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/MoreAssDataToBeSent.h000066400000000000000000000022601305042567700244020ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _MoreAssDataToBeSent_H_ #define _MoreAssDataToBeSent_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum MoreAssDataToBeSent { MoreAssDataToBeSent_noMoreMessages = 0, MoreAssDataToBeSent_moreMessagesOnTheWay = 1 } e_MoreAssDataToBeSent; /* MoreAssDataToBeSent */ typedef ENUMERATED_t MoreAssDataToBeSent_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_MoreAssDataToBeSent; asn_struct_free_f MoreAssDataToBeSent_free; asn_struct_print_f MoreAssDataToBeSent_print; asn_constr_check_f MoreAssDataToBeSent_constraint; ber_type_decoder_f MoreAssDataToBeSent_decode_ber; der_type_encoder_f MoreAssDataToBeSent_encode_der; xer_type_decoder_f MoreAssDataToBeSent_decode_xer; xer_type_encoder_f MoreAssDataToBeSent_encode_xer; per_type_decoder_f MoreAssDataToBeSent_decode_uper; per_type_encoder_f MoreAssDataToBeSent_encode_uper; #ifdef __cplusplus } #endif #endif /* _MoreAssDataToBeSent_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/MpathIndic.c000066400000000000000000000117621305042567700226550ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "MpathIndic.h" int MpathIndic_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { /* Replace with underlying type checker */ td->check_constraints = asn_DEF_ENUMERATED.check_constraints; return td->check_constraints(td, sptr, ctfailcb, app_key); } /* * This type is implemented using ENUMERATED, * so here we adjust the DEF accordingly. */ static void MpathIndic_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_ENUMERATED.free_struct; td->print_struct = asn_DEF_ENUMERATED.print_struct; td->ber_decoder = asn_DEF_ENUMERATED.ber_decoder; td->der_encoder = asn_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; td->uper_encoder = asn_DEF_ENUMERATED.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_ENUMERATED.per_constraints; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ } void MpathIndic_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { MpathIndic_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int MpathIndic_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { MpathIndic_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t MpathIndic_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { MpathIndic_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t MpathIndic_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { MpathIndic_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t MpathIndic_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { MpathIndic_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t MpathIndic_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { MpathIndic_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t MpathIndic_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { MpathIndic_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t MpathIndic_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { MpathIndic_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_MpathIndic_constr_1 = { { APC_CONSTRAINED, 2, 2, 0, 3 } /* (0..3) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_INTEGER_enum_map_t asn_MAP_MpathIndic_value2enum_1[] = { { 0, 11, "notMeasured" }, { 1, 3, "low" }, { 2, 6, "medium" }, { 3, 4, "high" } }; static unsigned int asn_MAP_MpathIndic_enum2value_1[] = { 3, /* high(3) */ 1, /* low(1) */ 2, /* medium(2) */ 0 /* notMeasured(0) */ }; static asn_INTEGER_specifics_t asn_SPC_MpathIndic_specs_1 = { asn_MAP_MpathIndic_value2enum_1, /* "tag" => N; sorted by tag */ asn_MAP_MpathIndic_enum2value_1, /* N => "tag"; sorted by N */ 4, /* Number of elements in the maps */ 0, /* Enumeration is not extensible */ 1, /* Strict enumeration */ 0, /* Native long size */ 0 }; static ber_tlv_tag_t asn_DEF_MpathIndic_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; asn_TYPE_descriptor_t asn_DEF_MpathIndic = { "MpathIndic", "MpathIndic", MpathIndic_free, MpathIndic_print, MpathIndic_constraint, MpathIndic_decode_ber, MpathIndic_encode_der, MpathIndic_decode_xer, MpathIndic_encode_xer, MpathIndic_decode_uper, MpathIndic_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_MpathIndic_tags_1, sizeof(asn_DEF_MpathIndic_tags_1) /sizeof(asn_DEF_MpathIndic_tags_1[0]), /* 1 */ asn_DEF_MpathIndic_tags_1, /* Same as above */ sizeof(asn_DEF_MpathIndic_tags_1) /sizeof(asn_DEF_MpathIndic_tags_1[0]), /* 1 */ &asn_PER_type_MpathIndic_constr_1, 0, 0, /* Defined elsewhere */ &asn_SPC_MpathIndic_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/MpathIndic.h000066400000000000000000000020371305042567700226550ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _MpathIndic_H_ #define _MpathIndic_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum MpathIndic { MpathIndic_notMeasured = 0, MpathIndic_low = 1, MpathIndic_medium = 2, MpathIndic_high = 3 } e_MpathIndic; /* MpathIndic */ typedef ENUMERATED_t MpathIndic_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_MpathIndic; asn_struct_free_f MpathIndic_free; asn_struct_print_f MpathIndic_print; asn_constr_check_f MpathIndic_constraint; ber_type_decoder_f MpathIndic_decode_ber; der_type_encoder_f MpathIndic_encode_der; xer_type_decoder_f MpathIndic_decode_xer; xer_type_encoder_f MpathIndic_encode_xer; per_type_decoder_f MpathIndic_decode_uper; per_type_encoder_f MpathIndic_encode_uper; #ifdef __cplusplus } #endif #endif /* _MpathIndic_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/MsrAssistBTS-R98-ExpOTD.c000066400000000000000000000045351305042567700246170ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "MsrAssistBTS-R98-ExpOTD.h" static asn_TYPE_member_t asn_MBR_MsrAssistBTS_R98_ExpOTD_1[] = { { ATF_NOFLAGS, 0, offsetof(struct MsrAssistBTS_R98_ExpOTD, expectedOTD), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_ExpectedOTD, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "expectedOTD" }, { ATF_NOFLAGS, 0, offsetof(struct MsrAssistBTS_R98_ExpOTD, expOTDUncertainty), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_ExpOTDUncertainty, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "expOTDUncertainty" }, }; static ber_tlv_tag_t asn_DEF_MsrAssistBTS_R98_ExpOTD_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_MsrAssistBTS_R98_ExpOTD_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* expectedOTD at 910 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* expOTDUncertainty at 912 */ }; static asn_SEQUENCE_specifics_t asn_SPC_MsrAssistBTS_R98_ExpOTD_specs_1 = { sizeof(struct MsrAssistBTS_R98_ExpOTD), offsetof(struct MsrAssistBTS_R98_ExpOTD, _asn_ctx), asn_MAP_MsrAssistBTS_R98_ExpOTD_tag2el_1, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_MsrAssistBTS_R98_ExpOTD = { "MsrAssistBTS-R98-ExpOTD", "MsrAssistBTS-R98-ExpOTD", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_MsrAssistBTS_R98_ExpOTD_tags_1, sizeof(asn_DEF_MsrAssistBTS_R98_ExpOTD_tags_1) /sizeof(asn_DEF_MsrAssistBTS_R98_ExpOTD_tags_1[0]), /* 1 */ asn_DEF_MsrAssistBTS_R98_ExpOTD_tags_1, /* Same as above */ sizeof(asn_DEF_MsrAssistBTS_R98_ExpOTD_tags_1) /sizeof(asn_DEF_MsrAssistBTS_R98_ExpOTD_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_MsrAssistBTS_R98_ExpOTD_1, 2, /* Elements count */ &asn_SPC_MsrAssistBTS_R98_ExpOTD_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/MsrAssistBTS-R98-ExpOTD.h000066400000000000000000000015121305042567700246140ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _MsrAssistBTS_R98_ExpOTD_H_ #define _MsrAssistBTS_R98_ExpOTD_H_ #include /* Including external dependencies */ #include "ExpectedOTD.h" #include "ExpOTDUncertainty.h" #include #ifdef __cplusplus extern "C" { #endif /* MsrAssistBTS-R98-ExpOTD */ typedef struct MsrAssistBTS_R98_ExpOTD { ExpectedOTD_t expectedOTD; ExpOTDUncertainty_t expOTDUncertainty; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } MsrAssistBTS_R98_ExpOTD_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_MsrAssistBTS_R98_ExpOTD; #ifdef __cplusplus } #endif #endif /* _MsrAssistBTS_R98_ExpOTD_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/MsrAssistBTS.c000066400000000000000000000071701305042567700231340ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "MsrAssistBTS.h" static asn_TYPE_member_t asn_MBR_MsrAssistBTS_1[] = { { ATF_NOFLAGS, 0, offsetof(struct MsrAssistBTS, bcchCarrier), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BCCHCarrier, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "bcchCarrier" }, { ATF_NOFLAGS, 0, offsetof(struct MsrAssistBTS, bsic), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BSIC, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "bsic" }, { ATF_NOFLAGS, 0, offsetof(struct MsrAssistBTS, multiFrameOffset), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_MultiFrameOffset, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "multiFrameOffset" }, { ATF_NOFLAGS, 0, offsetof(struct MsrAssistBTS, timeSlotScheme), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_TimeSlotScheme, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "timeSlotScheme" }, { ATF_NOFLAGS, 0, offsetof(struct MsrAssistBTS, roughRTD), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_RoughRTD, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "roughRTD" }, { ATF_POINTER, 1, offsetof(struct MsrAssistBTS, calcAssistanceBTS), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_CalcAssistanceBTS, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "calcAssistanceBTS" }, }; static int asn_MAP_MsrAssistBTS_oms_1[] = { 5 }; static ber_tlv_tag_t asn_DEF_MsrAssistBTS_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_MsrAssistBTS_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* bcchCarrier at 193 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* bsic at 194 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* multiFrameOffset at 195 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* timeSlotScheme at 196 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* roughRTD at 197 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 } /* calcAssistanceBTS at 200 */ }; static asn_SEQUENCE_specifics_t asn_SPC_MsrAssistBTS_specs_1 = { sizeof(struct MsrAssistBTS), offsetof(struct MsrAssistBTS, _asn_ctx), asn_MAP_MsrAssistBTS_tag2el_1, 6, /* Count of tags in the map */ asn_MAP_MsrAssistBTS_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_MsrAssistBTS = { "MsrAssistBTS", "MsrAssistBTS", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_MsrAssistBTS_tags_1, sizeof(asn_DEF_MsrAssistBTS_tags_1) /sizeof(asn_DEF_MsrAssistBTS_tags_1[0]), /* 1 */ asn_DEF_MsrAssistBTS_tags_1, /* Same as above */ sizeof(asn_DEF_MsrAssistBTS_tags_1) /sizeof(asn_DEF_MsrAssistBTS_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_MsrAssistBTS_1, 6, /* Elements count */ &asn_SPC_MsrAssistBTS_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/MsrAssistBTS.h000066400000000000000000000020701305042567700231330ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _MsrAssistBTS_H_ #define _MsrAssistBTS_H_ #include /* Including external dependencies */ #include "BCCHCarrier.h" #include "BSIC.h" #include "MultiFrameOffset.h" #include "TimeSlotScheme.h" #include "RoughRTD.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct CalcAssistanceBTS; /* MsrAssistBTS */ typedef struct MsrAssistBTS { BCCHCarrier_t bcchCarrier; BSIC_t bsic; MultiFrameOffset_t multiFrameOffset; TimeSlotScheme_t timeSlotScheme; RoughRTD_t roughRTD; struct CalcAssistanceBTS *calcAssistanceBTS /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } MsrAssistBTS_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_MsrAssistBTS; #ifdef __cplusplus } #endif /* Referred external types */ #include "CalcAssistanceBTS.h" #endif /* _MsrAssistBTS_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/MsrAssistData-R98-ExpOTD.c000066400000000000000000000040301305042567700250260ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "MsrAssistData-R98-ExpOTD.h" static asn_TYPE_member_t asn_MBR_MsrAssistData_R98_ExpOTD_1[] = { { ATF_NOFLAGS, 0, offsetof(struct MsrAssistData_R98_ExpOTD, msrAssistList_R98_ExpOTD), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfMsrAssistBTS_R98_ExpOTD, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "msrAssistList-R98-ExpOTD" }, }; static ber_tlv_tag_t asn_DEF_MsrAssistData_R98_ExpOTD_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_MsrAssistData_R98_ExpOTD_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* msrAssistList-R98-ExpOTD at 900 */ }; static asn_SEQUENCE_specifics_t asn_SPC_MsrAssistData_R98_ExpOTD_specs_1 = { sizeof(struct MsrAssistData_R98_ExpOTD), offsetof(struct MsrAssistData_R98_ExpOTD, _asn_ctx), asn_MAP_MsrAssistData_R98_ExpOTD_tag2el_1, 1, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_MsrAssistData_R98_ExpOTD = { "MsrAssistData-R98-ExpOTD", "MsrAssistData-R98-ExpOTD", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_MsrAssistData_R98_ExpOTD_tags_1, sizeof(asn_DEF_MsrAssistData_R98_ExpOTD_tags_1) /sizeof(asn_DEF_MsrAssistData_R98_ExpOTD_tags_1[0]), /* 1 */ asn_DEF_MsrAssistData_R98_ExpOTD_tags_1, /* Same as above */ sizeof(asn_DEF_MsrAssistData_R98_ExpOTD_tags_1) /sizeof(asn_DEF_MsrAssistData_R98_ExpOTD_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_MsrAssistData_R98_ExpOTD_1, 1, /* Elements count */ &asn_SPC_MsrAssistData_R98_ExpOTD_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/MsrAssistData-R98-ExpOTD.h000066400000000000000000000014701305042567700250400ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _MsrAssistData_R98_ExpOTD_H_ #define _MsrAssistData_R98_ExpOTD_H_ #include /* Including external dependencies */ #include "SeqOfMsrAssistBTS-R98-ExpOTD.h" #include #ifdef __cplusplus extern "C" { #endif /* MsrAssistData-R98-ExpOTD */ typedef struct MsrAssistData_R98_ExpOTD { SeqOfMsrAssistBTS_R98_ExpOTD_t msrAssistList_R98_ExpOTD; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } MsrAssistData_R98_ExpOTD_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_MsrAssistData_R98_ExpOTD; #ifdef __cplusplus } #endif #endif /* _MsrAssistData_R98_ExpOTD_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/MsrAssistData.c000066400000000000000000000034201305042567700233470ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "MsrAssistData.h" static asn_TYPE_member_t asn_MBR_MsrAssistData_1[] = { { ATF_NOFLAGS, 0, offsetof(struct MsrAssistData, msrAssistList), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfMsrAssistBTS, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "msrAssistList" }, }; static ber_tlv_tag_t asn_DEF_MsrAssistData_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_MsrAssistData_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* msrAssistList at 189 */ }; static asn_SEQUENCE_specifics_t asn_SPC_MsrAssistData_specs_1 = { sizeof(struct MsrAssistData), offsetof(struct MsrAssistData, _asn_ctx), asn_MAP_MsrAssistData_tag2el_1, 1, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_MsrAssistData = { "MsrAssistData", "MsrAssistData", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_MsrAssistData_tags_1, sizeof(asn_DEF_MsrAssistData_tags_1) /sizeof(asn_DEF_MsrAssistData_tags_1[0]), /* 1 */ asn_DEF_MsrAssistData_tags_1, /* Same as above */ sizeof(asn_DEF_MsrAssistData_tags_1) /sizeof(asn_DEF_MsrAssistData_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_MsrAssistData_1, 1, /* Elements count */ &asn_SPC_MsrAssistData_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/MsrAssistData.h000066400000000000000000000013121305042567700233520ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _MsrAssistData_H_ #define _MsrAssistData_H_ #include /* Including external dependencies */ #include "SeqOfMsrAssistBTS.h" #include #ifdef __cplusplus extern "C" { #endif /* MsrAssistData */ typedef struct MsrAssistData { SeqOfMsrAssistBTS_t msrAssistList; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } MsrAssistData_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_MsrAssistData; #ifdef __cplusplus } #endif #endif /* _MsrAssistData_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/MsrPosition-Req.c000066400000000000000000000113071305042567700236430ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "MsrPosition-Req.h" static asn_TYPE_member_t asn_MBR_MsrPosition_Req_1[] = { { ATF_NOFLAGS, 0, offsetof(struct MsrPosition_Req, positionInstruct), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_PositionInstruct, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "positionInstruct" }, { ATF_POINTER, 7, offsetof(struct MsrPosition_Req, referenceAssistData), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_ReferenceAssistData, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "referenceAssistData" }, { ATF_POINTER, 6, offsetof(struct MsrPosition_Req, msrAssistData), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_MsrAssistData, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "msrAssistData" }, { ATF_POINTER, 5, offsetof(struct MsrPosition_Req, systemInfoAssistData), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SystemInfoAssistData, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "systemInfoAssistData" }, { ATF_POINTER, 4, offsetof(struct MsrPosition_Req, gps_AssistData), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GPS_AssistData, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "gps-AssistData" }, { ATF_POINTER, 3, offsetof(struct MsrPosition_Req, extensionContainer), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_ExtensionContainer, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "extensionContainer" }, { ATF_POINTER, 2, offsetof(struct MsrPosition_Req, rel98_MsrPosition_Req_extension), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Rel98_MsrPosition_Req_Extension, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "rel98-MsrPosition-Req-extension" }, { ATF_POINTER, 1, offsetof(struct MsrPosition_Req, rel5_MsrPosition_Req_extension), (ASN_TAG_CLASS_CONTEXT | (7 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Rel5_MsrPosition_Req_Extension, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "rel5-MsrPosition-Req-extension" }, }; static int asn_MAP_MsrPosition_Req_oms_1[] = { 1, 2, 3, 4, 5, 6, 7 }; static ber_tlv_tag_t asn_DEF_MsrPosition_Req_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_MsrPosition_Req_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* positionInstruct at 31 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* referenceAssistData at 32 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* msrAssistData at 33 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* systemInfoAssistData at 34 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* gps-AssistData at 35 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* extensionContainer at 36 */ { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* rel98-MsrPosition-Req-extension at 39 */ { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 } /* rel5-MsrPosition-Req-extension at 41 */ }; static asn_SEQUENCE_specifics_t asn_SPC_MsrPosition_Req_specs_1 = { sizeof(struct MsrPosition_Req), offsetof(struct MsrPosition_Req, _asn_ctx), asn_MAP_MsrPosition_Req_tag2el_1, 8, /* Count of tags in the map */ asn_MAP_MsrPosition_Req_oms_1, /* Optional members */ 5, 2, /* Root/Additions */ 5, /* Start extensions */ 9 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_MsrPosition_Req = { "MsrPosition-Req", "MsrPosition-Req", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_MsrPosition_Req_tags_1, sizeof(asn_DEF_MsrPosition_Req_tags_1) /sizeof(asn_DEF_MsrPosition_Req_tags_1[0]), /* 1 */ asn_DEF_MsrPosition_Req_tags_1, /* Same as above */ sizeof(asn_DEF_MsrPosition_Req_tags_1) /sizeof(asn_DEF_MsrPosition_Req_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_MsrPosition_Req_1, 8, /* Elements count */ &asn_SPC_MsrPosition_Req_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/MsrPosition-Req.h000066400000000000000000000033371305042567700236540ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _MsrPosition_Req_H_ #define _MsrPosition_Req_H_ #include /* Including external dependencies */ #include "PositionInstruct.h" #include "ExtensionContainer.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct ReferenceAssistData; struct MsrAssistData; struct SystemInfoAssistData; struct GPS_AssistData; struct Rel98_MsrPosition_Req_Extension; struct Rel5_MsrPosition_Req_Extension; /* MsrPosition-Req */ typedef struct MsrPosition_Req { PositionInstruct_t positionInstruct; struct ReferenceAssistData *referenceAssistData /* OPTIONAL */; struct MsrAssistData *msrAssistData /* OPTIONAL */; struct SystemInfoAssistData *systemInfoAssistData /* OPTIONAL */; struct GPS_AssistData *gps_AssistData /* OPTIONAL */; ExtensionContainer_t *extensionContainer /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ struct Rel98_MsrPosition_Req_Extension *rel98_MsrPosition_Req_extension /* OPTIONAL */; struct Rel5_MsrPosition_Req_Extension *rel5_MsrPosition_Req_extension /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } MsrPosition_Req_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_MsrPosition_Req; #ifdef __cplusplus } #endif /* Referred external types */ #include "ReferenceAssistData.h" #include "MsrAssistData.h" #include "SystemInfoAssistData.h" #include "GPS-AssistData.h" #include "Rel98-MsrPosition-Req-Extension.h" #include "Rel5-MsrPosition-Req-Extension.h" #endif /* _MsrPosition_Req_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/MsrPosition-Rsp.c000066400000000000000000000120421305042567700236550ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "MsrPosition-Rsp.h" static asn_TYPE_member_t asn_MBR_MsrPosition_Rsp_1[] = { { ATF_POINTER, 9, offsetof(struct MsrPosition_Rsp, multipleSets), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_MultipleSets, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "multipleSets" }, { ATF_POINTER, 8, offsetof(struct MsrPosition_Rsp, referenceIdentity), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_ReferenceIdentity, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "referenceIdentity" }, { ATF_POINTER, 7, offsetof(struct MsrPosition_Rsp, otd_MeasureInfo), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_OTD_MeasureInfo, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "otd-MeasureInfo" }, { ATF_POINTER, 6, offsetof(struct MsrPosition_Rsp, locationInfo), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_LocationInfo, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "locationInfo" }, { ATF_POINTER, 5, offsetof(struct MsrPosition_Rsp, gps_MeasureInfo), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GPS_MeasureInfo, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "gps-MeasureInfo" }, { ATF_POINTER, 4, offsetof(struct MsrPosition_Rsp, locationError), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_LocationError, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "locationError" }, { ATF_POINTER, 3, offsetof(struct MsrPosition_Rsp, extensionContainer), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_ExtensionContainer, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "extensionContainer" }, { ATF_POINTER, 2, offsetof(struct MsrPosition_Rsp, rel_98_MsrPosition_Rsp_Extension), (ASN_TAG_CLASS_CONTEXT | (7 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Rel_98_MsrPosition_Rsp_Extension, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "rel-98-MsrPosition-Rsp-Extension" }, { ATF_POINTER, 1, offsetof(struct MsrPosition_Rsp, rel_5_MsrPosition_Rsp_Extension), (ASN_TAG_CLASS_CONTEXT | (8 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Rel_5_MsrPosition_Rsp_Extension, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "rel-5-MsrPosition-Rsp-Extension" }, }; static int asn_MAP_MsrPosition_Rsp_oms_1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; static ber_tlv_tag_t asn_DEF_MsrPosition_Rsp_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_MsrPosition_Rsp_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* multipleSets at 51 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* referenceIdentity at 52 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* otd-MeasureInfo at 53 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* locationInfo at 54 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* gps-MeasureInfo at 55 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* locationError at 56 */ { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* extensionContainer at 57 */ { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 }, /* rel-98-MsrPosition-Rsp-Extension at 61 */ { (ASN_TAG_CLASS_CONTEXT | (8 << 2)), 8, 0, 0 } /* rel-5-MsrPosition-Rsp-Extension at 63 */ }; static asn_SEQUENCE_specifics_t asn_SPC_MsrPosition_Rsp_specs_1 = { sizeof(struct MsrPosition_Rsp), offsetof(struct MsrPosition_Rsp, _asn_ctx), asn_MAP_MsrPosition_Rsp_tag2el_1, 9, /* Count of tags in the map */ asn_MAP_MsrPosition_Rsp_oms_1, /* Optional members */ 7, 2, /* Root/Additions */ 6, /* Start extensions */ 10 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_MsrPosition_Rsp = { "MsrPosition-Rsp", "MsrPosition-Rsp", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_MsrPosition_Rsp_tags_1, sizeof(asn_DEF_MsrPosition_Rsp_tags_1) /sizeof(asn_DEF_MsrPosition_Rsp_tags_1[0]), /* 1 */ asn_DEF_MsrPosition_Rsp_tags_1, /* Same as above */ sizeof(asn_DEF_MsrPosition_Rsp_tags_1) /sizeof(asn_DEF_MsrPosition_Rsp_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_MsrPosition_Rsp_1, 9, /* Elements count */ &asn_SPC_MsrPosition_Rsp_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/MsrPosition-Rsp.h000066400000000000000000000035161305042567700236700ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _MsrPosition_Rsp_H_ #define _MsrPosition_Rsp_H_ #include /* Including external dependencies */ #include "ExtensionContainer.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct MultipleSets; struct ReferenceIdentity; struct OTD_MeasureInfo; struct LocationInfo; struct GPS_MeasureInfo; struct LocationError; struct Rel_98_MsrPosition_Rsp_Extension; struct Rel_5_MsrPosition_Rsp_Extension; /* MsrPosition-Rsp */ typedef struct MsrPosition_Rsp { struct MultipleSets *multipleSets /* OPTIONAL */; struct ReferenceIdentity *referenceIdentity /* OPTIONAL */; struct OTD_MeasureInfo *otd_MeasureInfo /* OPTIONAL */; struct LocationInfo *locationInfo /* OPTIONAL */; struct GPS_MeasureInfo *gps_MeasureInfo /* OPTIONAL */; struct LocationError *locationError /* OPTIONAL */; ExtensionContainer_t *extensionContainer /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ struct Rel_98_MsrPosition_Rsp_Extension *rel_98_MsrPosition_Rsp_Extension /* OPTIONAL */; struct Rel_5_MsrPosition_Rsp_Extension *rel_5_MsrPosition_Rsp_Extension /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } MsrPosition_Rsp_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_MsrPosition_Rsp; #ifdef __cplusplus } #endif /* Referred external types */ #include "MultipleSets.h" #include "ReferenceIdentity.h" #include "OTD-MeasureInfo.h" #include "LocationInfo.h" #include "GPS-MeasureInfo.h" #include "LocationError.h" #include "Rel-98-MsrPosition-Rsp-Extension.h" #include "Rel-5-MsrPosition-Rsp-Extension.h" #endif /* _MsrPosition_Rsp_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/MultiFrameCarrier.c000066400000000000000000000043331305042567700242060ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "MultiFrameCarrier.h" static asn_TYPE_member_t asn_MBR_MultiFrameCarrier_1[] = { { ATF_NOFLAGS, 0, offsetof(struct MultiFrameCarrier, bcchCarrier), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BCCHCarrier, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "bcchCarrier" }, { ATF_NOFLAGS, 0, offsetof(struct MultiFrameCarrier, multiFrameOffset), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_MultiFrameOffset, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "multiFrameOffset" }, }; static ber_tlv_tag_t asn_DEF_MultiFrameCarrier_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_MultiFrameCarrier_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* bcchCarrier at 411 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* multiFrameOffset at 413 */ }; static asn_SEQUENCE_specifics_t asn_SPC_MultiFrameCarrier_specs_1 = { sizeof(struct MultiFrameCarrier), offsetof(struct MultiFrameCarrier, _asn_ctx), asn_MAP_MultiFrameCarrier_tag2el_1, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_MultiFrameCarrier = { "MultiFrameCarrier", "MultiFrameCarrier", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_MultiFrameCarrier_tags_1, sizeof(asn_DEF_MultiFrameCarrier_tags_1) /sizeof(asn_DEF_MultiFrameCarrier_tags_1[0]), /* 1 */ asn_DEF_MultiFrameCarrier_tags_1, /* Same as above */ sizeof(asn_DEF_MultiFrameCarrier_tags_1) /sizeof(asn_DEF_MultiFrameCarrier_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_MultiFrameCarrier_1, 2, /* Elements count */ &asn_SPC_MultiFrameCarrier_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/MultiFrameCarrier.h000066400000000000000000000014351305042567700242130ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _MultiFrameCarrier_H_ #define _MultiFrameCarrier_H_ #include /* Including external dependencies */ #include "BCCHCarrier.h" #include "MultiFrameOffset.h" #include #ifdef __cplusplus extern "C" { #endif /* MultiFrameCarrier */ typedef struct MultiFrameCarrier { BCCHCarrier_t bcchCarrier; MultiFrameOffset_t multiFrameOffset; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } MultiFrameCarrier_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_MultiFrameCarrier; #ifdef __cplusplus } #endif #endif /* _MultiFrameCarrier_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/MultiFrameOffset.c000066400000000000000000000114561305042567700240510ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "MultiFrameOffset.h" int MultiFrameOffset_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 51)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void MultiFrameOffset_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void MultiFrameOffset_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { MultiFrameOffset_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int MultiFrameOffset_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { MultiFrameOffset_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t MultiFrameOffset_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { MultiFrameOffset_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t MultiFrameOffset_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { MultiFrameOffset_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t MultiFrameOffset_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { MultiFrameOffset_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t MultiFrameOffset_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { MultiFrameOffset_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t MultiFrameOffset_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { MultiFrameOffset_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t MultiFrameOffset_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { MultiFrameOffset_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_MultiFrameOffset_constr_1 = { { APC_CONSTRAINED, 6, 6, 0, 51 } /* (0..51) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_MultiFrameOffset_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_MultiFrameOffset = { "MultiFrameOffset", "MultiFrameOffset", MultiFrameOffset_free, MultiFrameOffset_print, MultiFrameOffset_constraint, MultiFrameOffset_decode_ber, MultiFrameOffset_encode_der, MultiFrameOffset_decode_xer, MultiFrameOffset_encode_xer, MultiFrameOffset_decode_uper, MultiFrameOffset_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_MultiFrameOffset_tags_1, sizeof(asn_DEF_MultiFrameOffset_tags_1) /sizeof(asn_DEF_MultiFrameOffset_tags_1[0]), /* 1 */ asn_DEF_MultiFrameOffset_tags_1, /* Same as above */ sizeof(asn_DEF_MultiFrameOffset_tags_1) /sizeof(asn_DEF_MultiFrameOffset_tags_1[0]), /* 1 */ &asn_PER_type_MultiFrameOffset_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/MultiFrameOffset.h000066400000000000000000000017271305042567700240560ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _MultiFrameOffset_H_ #define _MultiFrameOffset_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* MultiFrameOffset */ typedef long MultiFrameOffset_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_MultiFrameOffset; asn_struct_free_f MultiFrameOffset_free; asn_struct_print_f MultiFrameOffset_print; asn_constr_check_f MultiFrameOffset_constraint; ber_type_decoder_f MultiFrameOffset_decode_ber; der_type_encoder_f MultiFrameOffset_encode_der; xer_type_decoder_f MultiFrameOffset_decode_xer; xer_type_encoder_f MultiFrameOffset_encode_xer; per_type_decoder_f MultiFrameOffset_decode_uper; per_type_encoder_f MultiFrameOffset_encode_uper; #ifdef __cplusplus } #endif #endif /* _MultiFrameOffset_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/MultipleSets.c000066400000000000000000000077331305042567700232720ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "MultipleSets.h" static int memb_nbrOfSets_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 2 && value <= 3)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_nbrOfReferenceBTSs_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 1 && value <= 3)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_nbrOfSets_constr_2 = { { APC_CONSTRAINED, 1, 1, 2, 3 } /* (2..3) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_nbrOfReferenceBTSs_constr_3 = { { APC_CONSTRAINED, 2, 2, 1, 3 } /* (1..3) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_MultipleSets_1[] = { { ATF_NOFLAGS, 0, offsetof(struct MultipleSets, nbrOfSets), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_nbrOfSets_constraint_1, &asn_PER_memb_nbrOfSets_constr_2, 0, "nbrOfSets" }, { ATF_NOFLAGS, 0, offsetof(struct MultipleSets, nbrOfReferenceBTSs), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_nbrOfReferenceBTSs_constraint_1, &asn_PER_memb_nbrOfReferenceBTSs_constr_3, 0, "nbrOfReferenceBTSs" }, { ATF_POINTER, 1, offsetof(struct MultipleSets, referenceRelation), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_ReferenceRelation, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "referenceRelation" }, }; static int asn_MAP_MultipleSets_oms_1[] = { 2 }; static ber_tlv_tag_t asn_DEF_MultipleSets_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_MultipleSets_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* nbrOfSets at 267 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* nbrOfReferenceBTSs at 270 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* referenceRelation at 274 */ }; static asn_SEQUENCE_specifics_t asn_SPC_MultipleSets_specs_1 = { sizeof(struct MultipleSets), offsetof(struct MultipleSets, _asn_ctx), asn_MAP_MultipleSets_tag2el_1, 3, /* Count of tags in the map */ asn_MAP_MultipleSets_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_MultipleSets = { "MultipleSets", "MultipleSets", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_MultipleSets_tags_1, sizeof(asn_DEF_MultipleSets_tags_1) /sizeof(asn_DEF_MultipleSets_tags_1[0]), /* 1 */ asn_DEF_MultipleSets_tags_1, /* Same as above */ sizeof(asn_DEF_MultipleSets_tags_1) /sizeof(asn_DEF_MultipleSets_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_MultipleSets_1, 3, /* Elements count */ &asn_SPC_MultipleSets_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/MultipleSets.h000066400000000000000000000014361305042567700232710ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _MultipleSets_H_ #define _MultipleSets_H_ #include /* Including external dependencies */ #include #include "ReferenceRelation.h" #include #ifdef __cplusplus extern "C" { #endif /* MultipleSets */ typedef struct MultipleSets { long nbrOfSets; long nbrOfReferenceBTSs; ReferenceRelation_t *referenceRelation /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } MultipleSets_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_MultipleSets; #ifdef __cplusplus } #endif #endif /* _MultipleSets_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/NULL.c000066400000000000000000000065151305042567700214070ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2005 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include #include /* Implemented in terms of BOOLEAN type */ /* * NULL basic type description. */ static ber_tlv_tag_t asn_DEF_NULL_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (5 << 2)) }; asn_TYPE_descriptor_t asn_DEF_NULL = { "NULL", "NULL", BOOLEAN_free, NULL_print, asn_generic_no_constraint, BOOLEAN_decode_ber, /* Implemented in terms of BOOLEAN */ NULL_encode_der, /* Special handling of DER encoding */ NULL_decode_xer, NULL_encode_xer, NULL_decode_uper, /* Unaligned PER decoder */ NULL_encode_uper, /* Unaligned PER encoder */ 0, /* Use generic outmost tag fetcher */ asn_DEF_NULL_tags, sizeof(asn_DEF_NULL_tags) / sizeof(asn_DEF_NULL_tags[0]), asn_DEF_NULL_tags, /* Same as above */ sizeof(asn_DEF_NULL_tags) / sizeof(asn_DEF_NULL_tags[0]), 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; asn_enc_rval_t NULL_encode_der(asn_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t erval; erval.encoded = der_write_tags(td, 0, tag_mode, 0, tag, cb, app_key); if(erval.encoded == -1) { erval.failed_type = td; erval.structure_ptr = ptr; } _ASN_ENCODED_OK(erval); } asn_enc_rval_t NULL_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t er; (void)td; (void)sptr; (void)ilevel; (void)flags; (void)cb; (void)app_key; /* XMLNullValue is empty */ er.encoded = 0; _ASN_ENCODED_OK(er); } static enum xer_pbd_rval NULL__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void *chunk_buf, size_t chunk_size) { (void)td; (void)sptr; if(xer_is_whitespace(chunk_buf, chunk_size)) return XPBD_BODY_CONSUMED; else return XPBD_BROKEN_ENCODING; } asn_dec_rval_t NULL_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, const void *buf_ptr, size_t size) { return xer_decode_primitive(opt_codec_ctx, td, sptr, sizeof(NULL_t), opt_mname, buf_ptr, size, NULL__xer_body_decode); } int NULL_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { (void)td; /* Unused argument */ (void)ilevel; /* Unused argument */ if(sptr) { return (cb("", 9, app_key) < 0) ? -1 : 0; } else { return (cb("", 8, app_key) < 0) ? -1 : 0; } } asn_dec_rval_t NULL_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { asn_dec_rval_t rv; (void)opt_codec_ctx; (void)td; (void)constraints; (void)pd; if(!*sptr) { *sptr = MALLOC(sizeof(NULL_t)); if(*sptr) { *(NULL_t *)*sptr = 0; } else { _ASN_DECODE_FAILED; } } /* * NULL type does not have content octets. */ rv.code = RC_OK; rv.consumed = 0; return rv; } asn_enc_rval_t NULL_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { asn_enc_rval_t er; (void)td; (void)constraints; (void)sptr; (void)po; er.encoded = 0; _ASN_ENCODED_OK(er); } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/NULL.h000066400000000000000000000013111305042567700214010ustar00rootroot00000000000000/*- * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef ASN_TYPE_NULL_H #define ASN_TYPE_NULL_H #include #ifdef __cplusplus extern "C" { #endif /* * The value of the NULL type is meaningless: see BOOLEAN if you want to * carry true/false semantics. */ typedef int NULL_t; extern asn_TYPE_descriptor_t asn_DEF_NULL; asn_struct_print_f NULL_print; der_type_encoder_f NULL_encode_der; xer_type_decoder_f NULL_decode_xer; xer_type_encoder_f NULL_encode_xer; per_type_decoder_f NULL_decode_uper; per_type_encoder_f NULL_encode_uper; #ifdef __cplusplus } #endif #endif /* NULL_H */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/NativeEnumerated.c000066400000000000000000000134261305042567700240740ustar00rootroot00000000000000/*- * Copyright (c) 2004, 2007 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ /* * Read the NativeInteger.h for the explanation wrt. differences between * INTEGER and NativeInteger. * Basically, both are decoders and encoders of ASN.1 INTEGER type, but this * implementation deals with the standard (machine-specific) representation * of them instead of using the platform-independent buffer. */ #include #include /* * NativeEnumerated basic type description. */ static ber_tlv_tag_t asn_DEF_NativeEnumerated_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; asn_TYPE_descriptor_t asn_DEF_NativeEnumerated = { "ENUMERATED", /* The ASN.1 type is still ENUMERATED */ "ENUMERATED", NativeInteger_free, NativeInteger_print, asn_generic_no_constraint, NativeInteger_decode_ber, NativeInteger_encode_der, NativeInteger_decode_xer, NativeEnumerated_encode_xer, NativeEnumerated_decode_uper, NativeEnumerated_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_NativeEnumerated_tags, sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]), asn_DEF_NativeEnumerated_tags, /* Same as above */ sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]), 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; asn_enc_rval_t NativeEnumerated_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; asn_enc_rval_t er; const long *native = (const long *)sptr; const asn_INTEGER_enum_map_t *el; (void)ilevel; (void)flags; if(!native) _ASN_ENCODE_FAILED; el = INTEGER_map_value2enum(specs, *native); if(el) { size_t srcsize = el->enum_len + 5; char *src = (char *)alloca(srcsize); er.encoded = snprintf(src, srcsize, "<%s/>", el->enum_name); assert(er.encoded > 0 && (size_t)er.encoded < srcsize); if(cb(src, er.encoded, app_key) < 0) _ASN_ENCODE_FAILED; _ASN_ENCODED_OK(er); } else { ASN_DEBUG("ASN.1 forbids dealing with " "unknown value of ENUMERATED type"); _ASN_ENCODE_FAILED; } } asn_dec_rval_t NativeEnumerated_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { asn_INTEGER_specifics_t *specs = (asn_INTEGER_specifics_t *)td->specifics; asn_dec_rval_t rval = { RC_OK, 0 }; long *native = (long *)*sptr; asn_per_constraint_t *ct; long value; (void)opt_codec_ctx; if(constraints) ct = &constraints->value; else if(td->per_constraints) ct = &td->per_constraints->value; else _ASN_DECODE_FAILED; /* Mandatory! */ if(!specs) _ASN_DECODE_FAILED; if(!native) { native = (long *)(*sptr = CALLOC(1, sizeof(*native))); if(!native) _ASN_DECODE_FAILED; } ASN_DEBUG("Decoding %s as NativeEnumerated", td->name); if(ct->flags & APC_EXTENSIBLE) { int inext = per_get_few_bits(pd, 1); if(inext < 0) _ASN_DECODE_STARVED; if(inext) ct = 0; } if(ct && ct->range_bits >= 0) { value = per_get_few_bits(pd, ct->range_bits); if(value < 0) _ASN_DECODE_STARVED; if(value >= (specs->extension ? specs->extension - 1 : specs->map_count)) _ASN_DECODE_FAILED; } else { if(!specs->extension) _ASN_DECODE_FAILED; /* * X.691, #10.6: normally small non-negative whole number; */ value = uper_get_nsnnwn(pd); if(value < 0) _ASN_DECODE_STARVED; value += specs->extension - 1; if(value >= specs->map_count) _ASN_DECODE_FAILED; } *native = specs->value2enum[value].nat_value; ASN_DEBUG("Decoded %s = %ld", td->name, *native); return rval; } static int NativeEnumerated__compar_value2enum(const void *ap, const void *bp) { const asn_INTEGER_enum_map_t *a = ap; const asn_INTEGER_enum_map_t *b = bp; if(a->nat_value == b->nat_value) return 0; if(a->nat_value < b->nat_value) return -1; return 1; } asn_enc_rval_t NativeEnumerated_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { asn_INTEGER_specifics_t *specs = (asn_INTEGER_specifics_t *)td->specifics; asn_enc_rval_t er; long native, value; asn_per_constraint_t *ct; int inext = 0; asn_INTEGER_enum_map_t key; asn_INTEGER_enum_map_t *kf; if(!sptr) _ASN_ENCODE_FAILED; if(!specs) _ASN_ENCODE_FAILED; if(constraints) ct = &constraints->value; else if(td->per_constraints) ct = &td->per_constraints->value; else _ASN_ENCODE_FAILED; /* Mandatory! */ ASN_DEBUG("Encoding %s as NativeEnumerated", td->name); er.encoded = 0; native = *(long *)sptr; if(native < 0) _ASN_ENCODE_FAILED; key.nat_value = native; kf = bsearch(&key, specs->value2enum, specs->map_count, sizeof(key), NativeEnumerated__compar_value2enum); if(!kf) { ASN_DEBUG("No element corresponds to %ld", native); _ASN_ENCODE_FAILED; } value = kf - specs->value2enum; if(ct->range_bits >= 0) { int cmpWith = specs->extension ? specs->extension - 1 : specs->map_count; if(value >= cmpWith) inext = 1; } if(ct->flags & APC_EXTENSIBLE) { if(per_put_few_bits(po, inext, 1)) _ASN_ENCODE_FAILED; if(inext) ct = 0; } else if(inext) { _ASN_ENCODE_FAILED; } if(ct && ct->range_bits >= 0) { if(per_put_few_bits(po, value, ct->range_bits)) _ASN_ENCODE_FAILED; _ASN_ENCODED_OK(er); } if(!specs->extension) _ASN_ENCODE_FAILED; /* * X.691, #10.6: normally small non-negative whole number; */ ASN_DEBUG("value = %ld, ext = %d, inext = %d, res = %ld", value, specs->extension, inext, value - (inext ? (specs->extension - 1) : 0)); if(uper_put_nsnnwn(po, value - (inext ? (specs->extension - 1) : 0))) _ASN_ENCODE_FAILED; _ASN_ENCODED_OK(er); } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/NativeEnumerated.h000066400000000000000000000016011305042567700240710ustar00rootroot00000000000000/*- * Copyright (c) 2004, 2005, 2006 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ /* * This type differs from the standard ENUMERATED in that it is modelled using * the fixed machine type (long, int, short), so it can hold only values of * limited length. There is no type (i.e., NativeEnumerated_t, any integer type * will do). * This type may be used when integer range is limited by subtype constraints. */ #ifndef _NativeEnumerated_H_ #define _NativeEnumerated_H_ #include #ifdef __cplusplus extern "C" { #endif extern asn_TYPE_descriptor_t asn_DEF_NativeEnumerated; xer_type_encoder_f NativeEnumerated_encode_xer; per_type_decoder_f NativeEnumerated_decode_uper; per_type_encoder_f NativeEnumerated_encode_uper; #ifdef __cplusplus } #endif #endif /* _NativeEnumerated_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/NativeInteger.c000066400000000000000000000207761305042567700234060ustar00rootroot00000000000000/*- * Copyright (c) 2004, 2005, 2006 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ /* * Read the NativeInteger.h for the explanation wrt. differences between * INTEGER and NativeInteger. * Basically, both are decoders and encoders of ASN.1 INTEGER type, but this * implementation deals with the standard (machine-specific) representation * of them instead of using the platform-independent buffer. */ #include #include /* * NativeInteger basic type description. */ static ber_tlv_tag_t asn_DEF_NativeInteger_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_NativeInteger = { "INTEGER", /* The ASN.1 type is still INTEGER */ "INTEGER", NativeInteger_free, NativeInteger_print, asn_generic_no_constraint, NativeInteger_decode_ber, NativeInteger_encode_der, NativeInteger_decode_xer, NativeInteger_encode_xer, NativeInteger_decode_uper, /* Unaligned PER decoder */ NativeInteger_encode_uper, /* Unaligned PER encoder */ 0, /* Use generic outmost tag fetcher */ asn_DEF_NativeInteger_tags, sizeof(asn_DEF_NativeInteger_tags) / sizeof(asn_DEF_NativeInteger_tags[0]), asn_DEF_NativeInteger_tags, /* Same as above */ sizeof(asn_DEF_NativeInteger_tags) / sizeof(asn_DEF_NativeInteger_tags[0]), 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; /* * Decode INTEGER type. */ asn_dec_rval_t NativeInteger_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **nint_ptr, const void *buf_ptr, size_t size, int tag_mode) { asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; long *native = (long *)*nint_ptr; asn_dec_rval_t rval; ber_tlv_len_t length; /* * If the structure is not there, allocate it. */ if(native == NULL) { native = (long *)(*nint_ptr = CALLOC(1, sizeof(*native))); if(native == NULL) { rval.code = RC_FAIL; rval.consumed = 0; return rval; } } ASN_DEBUG("Decoding %s as INTEGER (tm=%d)", td->name, tag_mode); /* * Check tags. */ rval = ber_check_tags(opt_codec_ctx, td, 0, buf_ptr, size, tag_mode, 0, &length, 0); if(rval.code != RC_OK) return rval; ASN_DEBUG("%s length is %d bytes", td->name, (int)length); /* * Make sure we have this length. */ buf_ptr = ((const char *)buf_ptr) + rval.consumed; size -= rval.consumed; if(length > (ber_tlv_len_t)size) { rval.code = RC_WMORE; rval.consumed = 0; return rval; } /* * ASN.1 encoded INTEGER: buf_ptr, length * Fill the native, at the same time checking for overflow. * If overflow occured, return with RC_FAIL. */ { INTEGER_t tmp; union { const void *constbuf; void *nonconstbuf; } unconst_buf; long l; unconst_buf.constbuf = buf_ptr; tmp.buf = (uint8_t *)unconst_buf.nonconstbuf; tmp.size = length; if((specs&&specs->field_unsigned) ? asn_INTEGER2ulong(&tmp, &l) : asn_INTEGER2long(&tmp, &l)) { rval.code = RC_FAIL; rval.consumed = 0; return rval; } *native = l; } rval.code = RC_OK; rval.consumed += length; ASN_DEBUG("Took %ld/%ld bytes to encode %s (%ld)", (long)rval.consumed, (long)length, td->name, (long)*native); return rval; } /* * Encode the NativeInteger using the standard INTEGER type DER encoder. */ asn_enc_rval_t NativeInteger_encode_der(asn_TYPE_descriptor_t *sd, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { unsigned long native = *(unsigned long *)ptr; /* Disable sign ext. */ asn_enc_rval_t erval; INTEGER_t tmp; #ifdef WORDS_BIGENDIAN /* Opportunistic optimization */ tmp.buf = (uint8_t *)&native; tmp.size = sizeof(native); #else /* Works even if WORDS_BIGENDIAN is not set where should've been */ uint8_t buf[sizeof(native)]; uint8_t *p; /* Prepare a fake INTEGER */ for(p = buf + sizeof(buf) - 1; p >= buf; p--, native >>= 8) *p = (uint8_t)native; tmp.buf = buf; tmp.size = sizeof(buf); #endif /* WORDS_BIGENDIAN */ /* Encode fake INTEGER */ erval = INTEGER_encode_der(sd, &tmp, tag_mode, tag, cb, app_key); if(erval.encoded == -1) { assert(erval.structure_ptr == &tmp); erval.structure_ptr = ptr; } return erval; } /* * Decode the chunk of XML text encoding INTEGER. */ asn_dec_rval_t NativeInteger_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, const void *buf_ptr, size_t size) { asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; asn_dec_rval_t rval; INTEGER_t st; void *st_ptr = (void *)&st; long *native = (long *)*sptr; if(!native) { native = (long *)(*sptr = CALLOC(1, sizeof(*native))); if(!native) _ASN_DECODE_FAILED; } memset(&st, 0, sizeof(st)); rval = INTEGER_decode_xer(opt_codec_ctx, td, &st_ptr, opt_mname, buf_ptr, size); if(rval.code == RC_OK) { long l; if((specs&&specs->field_unsigned) ? asn_INTEGER2ulong(&st, &l) : asn_INTEGER2long(&st, &l)) { rval.code = RC_FAIL; rval.consumed = 0; } else { *native = l; } } else { /* * Cannot restart from the middle; * there is no place to save state in the native type. * Request a continuation from the very beginning. */ rval.consumed = 0; } ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &st); return rval; } asn_enc_rval_t NativeInteger_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; char scratch[32]; /* Enough for 64-bit int */ asn_enc_rval_t er; const long *native = (const long *)sptr; (void)ilevel; (void)flags; if(!native) _ASN_ENCODE_FAILED; er.encoded = snprintf(scratch, sizeof(scratch), (specs && specs->field_unsigned) ? "%lu" : "%ld", *native); if(er.encoded <= 0 || (size_t)er.encoded >= sizeof(scratch) || cb(scratch, er.encoded, app_key) < 0) _ASN_ENCODE_FAILED; _ASN_ENCODED_OK(er); } asn_dec_rval_t NativeInteger_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; asn_dec_rval_t rval; long *native = (long *)*sptr; INTEGER_t tmpint; void *tmpintptr = &tmpint; (void)opt_codec_ctx; ASN_DEBUG("Decoding NativeInteger %s (UPER)", td->name); if(!native) { native = (long *)(*sptr = CALLOC(1, sizeof(*native))); if(!native) _ASN_DECODE_FAILED; } memset(&tmpint, 0, sizeof tmpint); rval = INTEGER_decode_uper(opt_codec_ctx, td, constraints, &tmpintptr, pd); if(rval.code == RC_OK) { if((specs&&specs->field_unsigned) ? asn_INTEGER2ulong(&tmpint, native) : asn_INTEGER2long(&tmpint, native)) rval.code = RC_FAIL; else ASN_DEBUG("NativeInteger %s got value %ld", td->name, *native); } ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); return rval; } asn_enc_rval_t NativeInteger_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; asn_enc_rval_t er; long native; INTEGER_t tmpint; if(!sptr) _ASN_ENCODE_FAILED; native = *(long *)sptr; ASN_DEBUG("Encoding NativeInteger %s %ld (UPER)", td->name, native); memset(&tmpint, 0, sizeof(tmpint)); if((specs&&specs->field_unsigned) ? asn_ulong2INTEGER(&tmpint, native) : asn_long2INTEGER(&tmpint, native)) _ASN_ENCODE_FAILED; er = INTEGER_encode_uper(td, constraints, &tmpint, po); ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); return er; } /* * INTEGER specific human-readable output. */ int NativeInteger_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; const long *native = (const long *)sptr; char scratch[32]; /* Enough for 64-bit int */ int ret; (void)td; /* Unused argument */ (void)ilevel; /* Unused argument */ if(native) { ret = snprintf(scratch, sizeof(scratch), (specs && specs->field_unsigned) ? "%lu" : "%ld", *native); assert(ret > 0 && (size_t)ret < sizeof(scratch)); return (cb(scratch, ret, app_key) < 0) ? -1 : 0; } else { return (cb("", 8, app_key) < 0) ? -1 : 0; } } void NativeInteger_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { if(!td || !ptr) return; ASN_DEBUG("Freeing %s as INTEGER (%d, %p, Native)", td->name, contents_only, ptr); if(!contents_only) { FREEMEM(ptr); } } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/NativeInteger.h000066400000000000000000000021041305042567700233740ustar00rootroot00000000000000/*- * Copyright (c) 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ /* * This type differs from the standard INTEGER in that it is modelled using * the fixed machine type (long, int, short), so it can hold only values of * limited length. There is no type (i.e., NativeInteger_t, any integer type * will do). * This type may be used when integer range is limited by subtype constraints. */ #ifndef _NativeInteger_H_ #define _NativeInteger_H_ #include #include #ifdef __cplusplus extern "C" { #endif extern asn_TYPE_descriptor_t asn_DEF_NativeInteger; asn_struct_free_f NativeInteger_free; asn_struct_print_f NativeInteger_print; ber_type_decoder_f NativeInteger_decode_ber; der_type_encoder_f NativeInteger_encode_der; xer_type_decoder_f NativeInteger_decode_xer; xer_type_encoder_f NativeInteger_encode_xer; per_type_decoder_f NativeInteger_decode_uper; per_type_encoder_f NativeInteger_encode_uper; #ifdef __cplusplus } #endif #endif /* _NativeInteger_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/NavModel-KeplerianSet.c000066400000000000000000000457521305042567700247340ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "NavModel-KeplerianSet.h" static int memb_keplerToeLSB_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 511)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_keplerW_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= (-2147483647L - 1) && value <= 2147483647)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_keplerDeltaN_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -32768 && value <= 32767)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_keplerM0_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= (-2147483647L - 1) && value <= 2147483647)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_keplerOmegaDot_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -8388608 && value <= 8388607)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_keplerELSB_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 33554431)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_keplerIDot_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -8192 && value <= 8191)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_keplerAPowerHalfLSB_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 67108863)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_keplerI0_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= (-2147483647L - 1) && value <= 2147483647)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_keplerOmega0_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= (-2147483647L - 1) && value <= 2147483647)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_keplerCrs_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -32768 && value <= 32767)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_keplerCis_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -32768 && value <= 32767)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_keplerCus_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -32768 && value <= 32767)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_keplerCrc_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -32768 && value <= 32767)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_keplerCic_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -32768 && value <= 32767)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_keplerCuc_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -32768 && value <= 32767)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_keplerToeLSB_constr_2 = { { APC_CONSTRAINED, 9, 9, 0, 511 } /* (0..511) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_keplerW_constr_3 = { { APC_CONSTRAINED, 32, -1, (-2147483647L - 1), 2147483647 } /* (-2147483648..2147483647) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_keplerDeltaN_constr_4 = { { APC_CONSTRAINED, 16, 16, -32768, 32767 } /* (-32768..32767) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_keplerM0_constr_5 = { { APC_CONSTRAINED, 32, -1, (-2147483647L - 1), 2147483647 } /* (-2147483648..2147483647) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_keplerOmegaDot_constr_6 = { { APC_CONSTRAINED, 24, -1, -8388608, 8388607 } /* (-8388608..8388607) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_keplerELSB_constr_7 = { { APC_CONSTRAINED, 25, -1, 0, 33554431 } /* (0..33554431) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_keplerIDot_constr_8 = { { APC_CONSTRAINED, 14, 14, -8192, 8191 } /* (-8192..8191) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_keplerAPowerHalfLSB_constr_9 = { { APC_CONSTRAINED, 26, -1, 0, 67108863 } /* (0..67108863) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_keplerI0_constr_10 = { { APC_CONSTRAINED, 32, -1, (-2147483647L - 1), 2147483647 } /* (-2147483648..2147483647) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_keplerOmega0_constr_11 = { { APC_CONSTRAINED, 32, -1, (-2147483647L - 1), 2147483647 } /* (-2147483648..2147483647) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_keplerCrs_constr_12 = { { APC_CONSTRAINED, 16, 16, -32768, 32767 } /* (-32768..32767) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_keplerCis_constr_13 = { { APC_CONSTRAINED, 16, 16, -32768, 32767 } /* (-32768..32767) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_keplerCus_constr_14 = { { APC_CONSTRAINED, 16, 16, -32768, 32767 } /* (-32768..32767) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_keplerCrc_constr_15 = { { APC_CONSTRAINED, 16, 16, -32768, 32767 } /* (-32768..32767) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_keplerCic_constr_16 = { { APC_CONSTRAINED, 16, 16, -32768, 32767 } /* (-32768..32767) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_keplerCuc_constr_17 = { { APC_CONSTRAINED, 16, 16, -32768, 32767 } /* (-32768..32767) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_NavModel_KeplerianSet_1[] = { { ATF_NOFLAGS, 0, offsetof(struct NavModel_KeplerianSet, keplerToeLSB), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_keplerToeLSB_constraint_1, &asn_PER_memb_keplerToeLSB_constr_2, 0, "keplerToeLSB" }, { ATF_NOFLAGS, 0, offsetof(struct NavModel_KeplerianSet, keplerW), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_keplerW_constraint_1, &asn_PER_memb_keplerW_constr_3, 0, "keplerW" }, { ATF_NOFLAGS, 0, offsetof(struct NavModel_KeplerianSet, keplerDeltaN), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_keplerDeltaN_constraint_1, &asn_PER_memb_keplerDeltaN_constr_4, 0, "keplerDeltaN" }, { ATF_NOFLAGS, 0, offsetof(struct NavModel_KeplerianSet, keplerM0), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_keplerM0_constraint_1, &asn_PER_memb_keplerM0_constr_5, 0, "keplerM0" }, { ATF_NOFLAGS, 0, offsetof(struct NavModel_KeplerianSet, keplerOmegaDot), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_keplerOmegaDot_constraint_1, &asn_PER_memb_keplerOmegaDot_constr_6, 0, "keplerOmegaDot" }, { ATF_NOFLAGS, 0, offsetof(struct NavModel_KeplerianSet, keplerELSB), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_keplerELSB_constraint_1, &asn_PER_memb_keplerELSB_constr_7, 0, "keplerELSB" }, { ATF_NOFLAGS, 0, offsetof(struct NavModel_KeplerianSet, keplerIDot), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_keplerIDot_constraint_1, &asn_PER_memb_keplerIDot_constr_8, 0, "keplerIDot" }, { ATF_NOFLAGS, 0, offsetof(struct NavModel_KeplerianSet, keplerAPowerHalfLSB), (ASN_TAG_CLASS_CONTEXT | (7 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_keplerAPowerHalfLSB_constraint_1, &asn_PER_memb_keplerAPowerHalfLSB_constr_9, 0, "keplerAPowerHalfLSB" }, { ATF_NOFLAGS, 0, offsetof(struct NavModel_KeplerianSet, keplerI0), (ASN_TAG_CLASS_CONTEXT | (8 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_keplerI0_constraint_1, &asn_PER_memb_keplerI0_constr_10, 0, "keplerI0" }, { ATF_NOFLAGS, 0, offsetof(struct NavModel_KeplerianSet, keplerOmega0), (ASN_TAG_CLASS_CONTEXT | (9 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_keplerOmega0_constraint_1, &asn_PER_memb_keplerOmega0_constr_11, 0, "keplerOmega0" }, { ATF_NOFLAGS, 0, offsetof(struct NavModel_KeplerianSet, keplerCrs), (ASN_TAG_CLASS_CONTEXT | (10 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_keplerCrs_constraint_1, &asn_PER_memb_keplerCrs_constr_12, 0, "keplerCrs" }, { ATF_NOFLAGS, 0, offsetof(struct NavModel_KeplerianSet, keplerCis), (ASN_TAG_CLASS_CONTEXT | (11 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_keplerCis_constraint_1, &asn_PER_memb_keplerCis_constr_13, 0, "keplerCis" }, { ATF_NOFLAGS, 0, offsetof(struct NavModel_KeplerianSet, keplerCus), (ASN_TAG_CLASS_CONTEXT | (12 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_keplerCus_constraint_1, &asn_PER_memb_keplerCus_constr_14, 0, "keplerCus" }, { ATF_NOFLAGS, 0, offsetof(struct NavModel_KeplerianSet, keplerCrc), (ASN_TAG_CLASS_CONTEXT | (13 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_keplerCrc_constraint_1, &asn_PER_memb_keplerCrc_constr_15, 0, "keplerCrc" }, { ATF_NOFLAGS, 0, offsetof(struct NavModel_KeplerianSet, keplerCic), (ASN_TAG_CLASS_CONTEXT | (14 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_keplerCic_constraint_1, &asn_PER_memb_keplerCic_constr_16, 0, "keplerCic" }, { ATF_NOFLAGS, 0, offsetof(struct NavModel_KeplerianSet, keplerCuc), (ASN_TAG_CLASS_CONTEXT | (15 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_keplerCuc_constraint_1, &asn_PER_memb_keplerCuc_constr_17, 0, "keplerCuc" }, }; static ber_tlv_tag_t asn_DEF_NavModel_KeplerianSet_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_NavModel_KeplerianSet_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* keplerToeLSB at 1254 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* keplerW at 1255 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* keplerDeltaN at 1256 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* keplerM0 at 1257 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* keplerOmegaDot at 1258 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* keplerELSB at 1259 */ { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* keplerIDot at 1260 */ { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 }, /* keplerAPowerHalfLSB at 1261 */ { (ASN_TAG_CLASS_CONTEXT | (8 << 2)), 8, 0, 0 }, /* keplerI0 at 1262 */ { (ASN_TAG_CLASS_CONTEXT | (9 << 2)), 9, 0, 0 }, /* keplerOmega0 at 1263 */ { (ASN_TAG_CLASS_CONTEXT | (10 << 2)), 10, 0, 0 }, /* keplerCrs at 1264 */ { (ASN_TAG_CLASS_CONTEXT | (11 << 2)), 11, 0, 0 }, /* keplerCis at 1265 */ { (ASN_TAG_CLASS_CONTEXT | (12 << 2)), 12, 0, 0 }, /* keplerCus at 1266 */ { (ASN_TAG_CLASS_CONTEXT | (13 << 2)), 13, 0, 0 }, /* keplerCrc at 1267 */ { (ASN_TAG_CLASS_CONTEXT | (14 << 2)), 14, 0, 0 }, /* keplerCic at 1268 */ { (ASN_TAG_CLASS_CONTEXT | (15 << 2)), 15, 0, 0 } /* keplerCuc at 1269 */ }; static asn_SEQUENCE_specifics_t asn_SPC_NavModel_KeplerianSet_specs_1 = { sizeof(struct NavModel_KeplerianSet), offsetof(struct NavModel_KeplerianSet, _asn_ctx), asn_MAP_NavModel_KeplerianSet_tag2el_1, 16, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_NavModel_KeplerianSet = { "NavModel-KeplerianSet", "NavModel-KeplerianSet", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_NavModel_KeplerianSet_tags_1, sizeof(asn_DEF_NavModel_KeplerianSet_tags_1) /sizeof(asn_DEF_NavModel_KeplerianSet_tags_1[0]), /* 1 */ asn_DEF_NavModel_KeplerianSet_tags_1, /* Same as above */ sizeof(asn_DEF_NavModel_KeplerianSet_tags_1) /sizeof(asn_DEF_NavModel_KeplerianSet_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_NavModel_KeplerianSet_1, 16, /* Elements count */ &asn_SPC_NavModel_KeplerianSet_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/NavModel-KeplerianSet.h000066400000000000000000000020171305042567700247240ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _NavModel_KeplerianSet_H_ #define _NavModel_KeplerianSet_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* NavModel-KeplerianSet */ typedef struct NavModel_KeplerianSet { long keplerToeLSB; long keplerW; long keplerDeltaN; long keplerM0; long keplerOmegaDot; long keplerELSB; long keplerIDot; long keplerAPowerHalfLSB; long keplerI0; long keplerOmega0; long keplerCrs; long keplerCis; long keplerCus; long keplerCrc; long keplerCic; long keplerCuc; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } NavModel_KeplerianSet_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_NavModel_KeplerianSet; #ifdef __cplusplus } #endif #endif /* _NavModel_KeplerianSet_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/NavModelElement.c000066400000000000000000000042251305042567700236500ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "NavModelElement.h" static asn_TYPE_member_t asn_MBR_NavModelElement_1[] = { { ATF_NOFLAGS, 0, offsetof(struct NavModelElement, satelliteID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SatelliteID, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "satelliteID" }, { ATF_NOFLAGS, 0, offsetof(struct NavModelElement, satStatus), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), +1, /* EXPLICIT tag at current level */ &asn_DEF_SatStatus, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "satStatus" }, }; static ber_tlv_tag_t asn_DEF_NavModelElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_NavModelElement_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* satelliteID at 703 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* satStatus at 705 */ }; static asn_SEQUENCE_specifics_t asn_SPC_NavModelElement_specs_1 = { sizeof(struct NavModelElement), offsetof(struct NavModelElement, _asn_ctx), asn_MAP_NavModelElement_tag2el_1, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_NavModelElement = { "NavModelElement", "NavModelElement", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_NavModelElement_tags_1, sizeof(asn_DEF_NavModelElement_tags_1) /sizeof(asn_DEF_NavModelElement_tags_1[0]), /* 1 */ asn_DEF_NavModelElement_tags_1, /* Same as above */ sizeof(asn_DEF_NavModelElement_tags_1) /sizeof(asn_DEF_NavModelElement_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_NavModelElement_1, 2, /* Elements count */ &asn_SPC_NavModelElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/NavModelElement.h000066400000000000000000000013721305042567700236550ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _NavModelElement_H_ #define _NavModelElement_H_ #include /* Including external dependencies */ #include "SatelliteID.h" #include "SatStatus.h" #include #ifdef __cplusplus extern "C" { #endif /* NavModelElement */ typedef struct NavModelElement { SatelliteID_t satelliteID; SatStatus_t satStatus; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } NavModelElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_NavModelElement; #ifdef __cplusplus } #endif #endif /* _NavModelElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/NavigationModel.c000066400000000000000000000034701305042567700237120ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "NavigationModel.h" static asn_TYPE_member_t asn_MBR_NavigationModel_1[] = { { ATF_NOFLAGS, 0, offsetof(struct NavigationModel, navModelList), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfNavModelElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "navModelList" }, }; static ber_tlv_tag_t asn_DEF_NavigationModel_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_NavigationModel_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* navModelList at 697 */ }; static asn_SEQUENCE_specifics_t asn_SPC_NavigationModel_specs_1 = { sizeof(struct NavigationModel), offsetof(struct NavigationModel, _asn_ctx), asn_MAP_NavigationModel_tag2el_1, 1, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_NavigationModel = { "NavigationModel", "NavigationModel", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_NavigationModel_tags_1, sizeof(asn_DEF_NavigationModel_tags_1) /sizeof(asn_DEF_NavigationModel_tags_1[0]), /* 1 */ asn_DEF_NavigationModel_tags_1, /* Same as above */ sizeof(asn_DEF_NavigationModel_tags_1) /sizeof(asn_DEF_NavigationModel_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_NavigationModel_1, 1, /* Elements count */ &asn_SPC_NavigationModel_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/NavigationModel.h000066400000000000000000000013351305042567700237150ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _NavigationModel_H_ #define _NavigationModel_H_ #include /* Including external dependencies */ #include "SeqOfNavModelElement.h" #include #ifdef __cplusplus extern "C" { #endif /* NavigationModel */ typedef struct NavigationModel { SeqOfNavModelElement_t navModelList; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } NavigationModel_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_NavigationModel; #ifdef __cplusplus } #endif #endif /* _NavigationModel_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/NeighborIdentity.c000066400000000000000000000071571305042567700241070ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "NeighborIdentity.h" static asn_per_constraints_t asn_PER_type_NeighborIdentity_constr_1 = { { APC_CONSTRAINED, 3, 3, 0, 5 } /* (0..5) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_NeighborIdentity_1[] = { { ATF_NOFLAGS, 0, offsetof(struct NeighborIdentity, choice.bsicAndCarrier), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BSICAndCarrier, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "bsicAndCarrier" }, { ATF_NOFLAGS, 0, offsetof(struct NeighborIdentity, choice.ci), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_CellID, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ci" }, { ATF_NOFLAGS, 0, offsetof(struct NeighborIdentity, choice.multiFrameCarrier), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_MultiFrameCarrier, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "multiFrameCarrier" }, { ATF_NOFLAGS, 0, offsetof(struct NeighborIdentity, choice.requestIndex), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_RequestIndex, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "requestIndex" }, { ATF_NOFLAGS, 0, offsetof(struct NeighborIdentity, choice.systemInfoIndex), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SystemInfoIndex, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "systemInfoIndex" }, { ATF_NOFLAGS, 0, offsetof(struct NeighborIdentity, choice.ciAndLAC), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_CellIDAndLAC, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ciAndLAC" }, }; static asn_TYPE_tag2member_t asn_MAP_NeighborIdentity_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* bsicAndCarrier at 398 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ci at 399 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* multiFrameCarrier at 400 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* requestIndex at 401 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* systemInfoIndex at 402 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 } /* ciAndLAC at 407 */ }; static asn_CHOICE_specifics_t asn_SPC_NeighborIdentity_specs_1 = { sizeof(struct NeighborIdentity), offsetof(struct NeighborIdentity, _asn_ctx), offsetof(struct NeighborIdentity, present), sizeof(((struct NeighborIdentity *)0)->present), asn_MAP_NeighborIdentity_tag2el_1, 6, /* Count of tags in the map */ 0, -1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_NeighborIdentity = { "NeighborIdentity", "NeighborIdentity", CHOICE_free, CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_decode_uper, CHOICE_encode_uper, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ &asn_PER_type_NeighborIdentity_constr_1, asn_MBR_NeighborIdentity_1, 6, /* Elements count */ &asn_SPC_NeighborIdentity_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/NeighborIdentity.h000066400000000000000000000026231305042567700241050ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _NeighborIdentity_H_ #define _NeighborIdentity_H_ #include /* Including external dependencies */ #include "BSICAndCarrier.h" #include "CellID.h" #include "MultiFrameCarrier.h" #include "RequestIndex.h" #include "SystemInfoIndex.h" #include "CellIDAndLAC.h" #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum NeighborIdentity_PR { NeighborIdentity_PR_NOTHING, /* No components present */ NeighborIdentity_PR_bsicAndCarrier, NeighborIdentity_PR_ci, NeighborIdentity_PR_multiFrameCarrier, NeighborIdentity_PR_requestIndex, NeighborIdentity_PR_systemInfoIndex, NeighborIdentity_PR_ciAndLAC } NeighborIdentity_PR; /* NeighborIdentity */ typedef struct NeighborIdentity { NeighborIdentity_PR present; union NeighborIdentity_u { BSICAndCarrier_t bsicAndCarrier; CellID_t ci; MultiFrameCarrier_t multiFrameCarrier; RequestIndex_t requestIndex; SystemInfoIndex_t systemInfoIndex; CellIDAndLAC_t ciAndLAC; } choice; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } NeighborIdentity_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_NeighborIdentity; #ifdef __cplusplus } #endif #endif /* _NeighborIdentity_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/NumOfMeasurements.c000066400000000000000000000115231305042567700242450ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "NumOfMeasurements.h" int NumOfMeasurements_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 7)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void NumOfMeasurements_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void NumOfMeasurements_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { NumOfMeasurements_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int NumOfMeasurements_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { NumOfMeasurements_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t NumOfMeasurements_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { NumOfMeasurements_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t NumOfMeasurements_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { NumOfMeasurements_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t NumOfMeasurements_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { NumOfMeasurements_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t NumOfMeasurements_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { NumOfMeasurements_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t NumOfMeasurements_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { NumOfMeasurements_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t NumOfMeasurements_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { NumOfMeasurements_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_NumOfMeasurements_constr_1 = { { APC_CONSTRAINED, 3, 3, 0, 7 } /* (0..7) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_NumOfMeasurements_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_NumOfMeasurements = { "NumOfMeasurements", "NumOfMeasurements", NumOfMeasurements_free, NumOfMeasurements_print, NumOfMeasurements_constraint, NumOfMeasurements_decode_ber, NumOfMeasurements_encode_der, NumOfMeasurements_decode_xer, NumOfMeasurements_encode_xer, NumOfMeasurements_decode_uper, NumOfMeasurements_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_NumOfMeasurements_tags_1, sizeof(asn_DEF_NumOfMeasurements_tags_1) /sizeof(asn_DEF_NumOfMeasurements_tags_1[0]), /* 1 */ asn_DEF_NumOfMeasurements_tags_1, /* Same as above */ sizeof(asn_DEF_NumOfMeasurements_tags_1) /sizeof(asn_DEF_NumOfMeasurements_tags_1[0]), /* 1 */ &asn_PER_type_NumOfMeasurements_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/NumOfMeasurements.h000066400000000000000000000017461305042567700242600ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _NumOfMeasurements_H_ #define _NumOfMeasurements_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* NumOfMeasurements */ typedef long NumOfMeasurements_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_NumOfMeasurements; asn_struct_free_f NumOfMeasurements_free; asn_struct_print_f NumOfMeasurements_print; asn_constr_check_f NumOfMeasurements_constraint; ber_type_decoder_f NumOfMeasurements_decode_ber; der_type_encoder_f NumOfMeasurements_encode_der; xer_type_decoder_f NumOfMeasurements_decode_xer; xer_type_encoder_f NumOfMeasurements_encode_xer; per_type_decoder_f NumOfMeasurements_decode_uper; per_type_encoder_f NumOfMeasurements_encode_uper; #ifdef __cplusplus } #endif #endif /* _NumOfMeasurements_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/OCTET_STRING.c000066400000000000000000001332351305042567700226010ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004, 2005, 2006 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include /* for .bits_unused member */ #include /* * OCTET STRING basic type description. */ static ber_tlv_tag_t asn_DEF_OCTET_STRING_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) }; static asn_OCTET_STRING_specifics_t asn_DEF_OCTET_STRING_specs = { sizeof(OCTET_STRING_t), offsetof(OCTET_STRING_t, _asn_ctx), ASN_OSUBV_STR }; static asn_per_constraints_t asn_DEF_OCTET_STRING_constraints = { { APC_CONSTRAINED, 8, 8, 0, 255 }, { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 }, 0, 0 }; asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = { "OCTET STRING", /* Canonical name */ "OCTET_STRING", /* XML tag name */ OCTET_STRING_free, OCTET_STRING_print, /* non-ascii stuff, generally */ asn_generic_no_constraint, OCTET_STRING_decode_ber, OCTET_STRING_encode_der, OCTET_STRING_decode_xer_hex, OCTET_STRING_encode_xer, OCTET_STRING_decode_uper, /* Unaligned PER decoder */ OCTET_STRING_encode_uper, /* Unaligned PER encoder */ 0, /* Use generic outmost tag fetcher */ asn_DEF_OCTET_STRING_tags, sizeof(asn_DEF_OCTET_STRING_tags) / sizeof(asn_DEF_OCTET_STRING_tags[0]), asn_DEF_OCTET_STRING_tags, /* Same as above */ sizeof(asn_DEF_OCTET_STRING_tags) / sizeof(asn_DEF_OCTET_STRING_tags[0]), 0, /* No PER visible constraints */ 0, 0, /* No members */ &asn_DEF_OCTET_STRING_specs }; #undef _CH_PHASE #undef NEXT_PHASE #undef PREV_PHASE #define _CH_PHASE(ctx, inc) do { \ if(ctx->phase == 0) \ ctx->context = 0; \ ctx->phase += inc; \ } while(0) #define NEXT_PHASE(ctx) _CH_PHASE(ctx, +1) #define PREV_PHASE(ctx) _CH_PHASE(ctx, -1) #undef ADVANCE #define ADVANCE(num_bytes) do { \ size_t num = (num_bytes); \ buf_ptr = ((const char *)buf_ptr) + num; \ size -= num; \ consumed_myself += num; \ } while(0) #undef RETURN #define RETURN(_code) do { \ asn_dec_rval_t tmprval; \ tmprval.code = _code; \ tmprval.consumed = consumed_myself; \ return tmprval; \ } while(0) #undef APPEND #define APPEND(bufptr, bufsize) do { \ size_t _bs = (bufsize); /* Append size */ \ size_t _ns = ctx->context; /* Allocated now */ \ size_t _es = st->size + _bs; /* Expected size */ \ /* int is really a typeof(st->size): */ \ if((int)_es < 0) RETURN(RC_FAIL); \ if(_ns <= _es) { \ void *ptr; \ /* Be nice and round to the memory allocator */ \ do { _ns = _ns ? _ns << 1 : 16; } \ while(_ns <= _es); \ /* int is really a typeof(st->size): */ \ if((int)_ns < 0) RETURN(RC_FAIL); \ ptr = REALLOC(st->buf, _ns); \ if(ptr) { \ st->buf = (uint8_t *)ptr; \ ctx->context = _ns; \ } else { \ RETURN(RC_FAIL); \ } \ ASN_DEBUG("Reallocating into %ld", (long)_ns); \ } \ memcpy(st->buf + st->size, bufptr, _bs); \ /* Convenient nul-termination */ \ st->buf[_es] = '\0'; \ st->size = _es; \ } while(0) /* * The main reason why ASN.1 is still alive is that too much time and effort * is necessary for learning it more or less adequately, thus creating a gut * necessity to demonstrate that aquired skill everywhere afterwards. * No, I am not going to explain what the following stuff is. */ struct _stack_el { ber_tlv_len_t left; /* What's left to read (or -1) */ ber_tlv_len_t got; /* What was actually processed */ int cont_level; /* Depth of subcontainment */ int want_nulls; /* Want null "end of content" octets? */ int bits_chopped; /* Flag in BIT STRING mode */ ber_tlv_tag_t tag; /* For debugging purposes */ struct _stack_el *prev; struct _stack_el *next; }; struct _stack { struct _stack_el *tail; struct _stack_el *cur_ptr; }; static struct _stack_el * OS__add_stack_el(struct _stack *st) { struct _stack_el *nel; /* * Reuse the old stack frame or allocate a new one. */ if(st->cur_ptr && st->cur_ptr->next) { nel = st->cur_ptr->next; nel->bits_chopped = 0; nel->got = 0; /* Retain the nel->cont_level, it's correct. */ } else { nel = (struct _stack_el *)CALLOC(1, sizeof(struct _stack_el)); if(nel == NULL) return NULL; if(st->tail) { /* Increase a subcontainment depth */ nel->cont_level = st->tail->cont_level + 1; st->tail->next = nel; } nel->prev = st->tail; st->tail = nel; } st->cur_ptr = nel; return nel; } static struct _stack * _new_stack() { return (struct _stack *)CALLOC(1, sizeof(struct _stack)); } /* * Decode OCTET STRING type. */ asn_dec_rval_t OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const void *buf_ptr, size_t size, int tag_mode) { asn_OCTET_STRING_specifics_t *specs = td->specifics ? (asn_OCTET_STRING_specifics_t *)td->specifics : &asn_DEF_OCTET_STRING_specs; BIT_STRING_t *st = (BIT_STRING_t *)*sptr; asn_dec_rval_t rval; asn_struct_ctx_t *ctx; ssize_t consumed_myself = 0; struct _stack *stck; /* Expectations stack structure */ struct _stack_el *sel = 0; /* Stack element */ int tlv_constr; enum asn_OS_Subvariant type_variant = specs->subvariant; ASN_DEBUG("Decoding %s as %s (frame %ld)", td->name, (type_variant == ASN_OSUBV_STR) ? "OCTET STRING" : "OS-SpecialCase", (long)size); /* * Create the string if does not exist. */ if(st == NULL) { st = (BIT_STRING_t *)(*sptr = CALLOC(1, specs->struct_size)); if(st == NULL) RETURN(RC_FAIL); } /* Restore parsing context */ ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); switch(ctx->phase) { case 0: /* * Check tags. */ rval = ber_check_tags(opt_codec_ctx, td, ctx, buf_ptr, size, tag_mode, -1, &ctx->left, &tlv_constr); if(rval.code != RC_OK) return rval; if(tlv_constr) { /* * Complex operation, requires stack of expectations. */ ctx->ptr = _new_stack(); if(ctx->ptr) { stck = (struct _stack *)ctx->ptr; } else { RETURN(RC_FAIL); } } else { /* * Jump into stackless primitive decoding. */ _CH_PHASE(ctx, 3); if(type_variant == ASN_OSUBV_ANY && tag_mode != 1) APPEND(buf_ptr, rval.consumed); ADVANCE(rval.consumed); goto phase3; } NEXT_PHASE(ctx); /* Fall through */ case 1: phase1: /* * Fill the stack with expectations. */ stck = (struct _stack *)ctx->ptr; sel = stck->cur_ptr; do { ber_tlv_tag_t tlv_tag; ber_tlv_len_t tlv_len; ber_tlv_tag_t expected_tag; ssize_t tl, ll, tlvl; /* This one works even if (sel->left == -1) */ ssize_t Left = ((!sel||(size_t)sel->left >= size) ?(ssize_t)size:sel->left); ASN_DEBUG("%p, s->l=%ld, s->wn=%ld, s->g=%ld\n", sel, (long)(sel?sel->left:0), (long)(sel?sel->want_nulls:0), (long)(sel?sel->got:0) ); if(sel && sel->left <= 0 && sel->want_nulls == 0) { if(sel->prev) { struct _stack_el *prev = sel->prev; if(prev->left != -1) { if(prev->left < sel->got) RETURN(RC_FAIL); prev->left -= sel->got; } prev->got += sel->got; sel = stck->cur_ptr = prev; if(!sel) break; tlv_constr = 1; continue; } else { sel = stck->cur_ptr = 0; break; /* Nothing to wait */ } } tl = ber_fetch_tag(buf_ptr, Left, &tlv_tag); ASN_DEBUG("fetch tag(size=%ld,L=%ld), %sstack, left=%ld, wn=%ld, tl=%ld", (long)size, (long)Left, sel?"":"!", (long)(sel?sel->left:0), (long)(sel?sel->want_nulls:0), (long)tl); switch(tl) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); } tlv_constr = BER_TLV_CONSTRUCTED(buf_ptr); ll = ber_fetch_length(tlv_constr, (const char *)buf_ptr + tl,Left - tl,&tlv_len); ASN_DEBUG("Got tag=%s, tc=%d, left=%ld, tl=%ld, len=%ld, ll=%ld", ber_tlv_tag_string(tlv_tag), tlv_constr, (long)Left, (long)tl, (long)tlv_len, (long)ll); switch(ll) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); } if(sel && sel->want_nulls && ((const uint8_t *)buf_ptr)[0] == 0 && ((const uint8_t *)buf_ptr)[1] == 0) { ASN_DEBUG("Eat EOC; wn=%d--", sel->want_nulls); if(type_variant == ASN_OSUBV_ANY && (tag_mode != 1 || sel->cont_level)) APPEND("\0\0", 2); ADVANCE(2); sel->got += 2; if(sel->left != -1) { sel->left -= 2; /* assert(sel->left >= 2) */ } sel->want_nulls--; if(sel->want_nulls == 0) { /* Move to the next expectation */ sel->left = 0; tlv_constr = 1; } continue; } /* * Set up expected tags, * depending on ASN.1 type being decoded. */ switch(type_variant) { case ASN_OSUBV_BIT: /* X.690: 8.6.4.1, NOTE 2 */ /* Fall through */ case ASN_OSUBV_STR: default: if(sel) { int level = sel->cont_level; if(level < td->all_tags_count) { expected_tag = td->all_tags[level]; break; } else if(td->all_tags_count) { expected_tag = td->all_tags [td->all_tags_count - 1]; break; } /* else, Fall through */ } /* Fall through */ case ASN_OSUBV_ANY: expected_tag = tlv_tag; break; } if(tlv_tag != expected_tag) { char buf[2][32]; ber_tlv_tag_snprint(tlv_tag, buf[0], sizeof(buf[0])); ber_tlv_tag_snprint(td->tags[td->tags_count-1], buf[1], sizeof(buf[1])); ASN_DEBUG("Tag does not match expectation: %s != %s", buf[0], buf[1]); RETURN(RC_FAIL); } tlvl = tl + ll; /* Combined length of T and L encoding */ if((tlv_len + tlvl) < 0) { /* tlv_len value is too big */ ASN_DEBUG("TLV encoding + length (%ld) is too big", (long)tlv_len); RETURN(RC_FAIL); } /* * Append a new expectation. */ sel = OS__add_stack_el(stck); if(!sel) RETURN(RC_FAIL); sel->tag = tlv_tag; sel->want_nulls = (tlv_len==-1); if(sel->prev && sel->prev->left != -1) { /* Check that the parent frame is big enough */ if(sel->prev->left < tlvl + (tlv_len==-1?0:tlv_len)) RETURN(RC_FAIL); if(tlv_len == -1) sel->left = sel->prev->left - tlvl; else sel->left = tlv_len; } else { sel->left = tlv_len; } if(type_variant == ASN_OSUBV_ANY && (tag_mode != 1 || sel->cont_level)) APPEND(buf_ptr, tlvl); sel->got += tlvl; ADVANCE(tlvl); ASN_DEBUG("+EXPECT2 got=%ld left=%ld, wn=%d, clvl=%d", (long)sel->got, (long)sel->left, sel->want_nulls, sel->cont_level); } while(tlv_constr); if(sel == NULL) { /* Finished operation, "phase out" */ ASN_DEBUG("Phase out"); _CH_PHASE(ctx, +3); break; } NEXT_PHASE(ctx); /* Fall through */ case 2: stck = (struct _stack *)ctx->ptr; sel = stck->cur_ptr; ASN_DEBUG("Phase 2: Need %ld bytes, size=%ld, alrg=%ld, wn=%d", (long)sel->left, (long)size, (long)sel->got, sel->want_nulls); { ber_tlv_len_t len; assert(sel->left >= 0); len = ((ber_tlv_len_t)size < sel->left) ? (ber_tlv_len_t)size : sel->left; if(len > 0) { if(type_variant == ASN_OSUBV_BIT && sel->bits_chopped == 0) { /* Put the unused-bits-octet away */ st->bits_unused = *(const uint8_t *)buf_ptr; APPEND(((const char *)buf_ptr+1), (len - 1)); sel->bits_chopped = 1; } else { APPEND(buf_ptr, len); } ADVANCE(len); sel->left -= len; sel->got += len; } if(sel->left) { ASN_DEBUG("OS left %ld, size = %ld, wn=%d\n", (long)sel->left, (long)size, sel->want_nulls); RETURN(RC_WMORE); } PREV_PHASE(ctx); goto phase1; } break; case 3: phase3: /* * Primitive form, no stack required. */ assert(ctx->left >= 0); if(size < (size_t)ctx->left) { if(!size) RETURN(RC_WMORE); if(type_variant == ASN_OSUBV_BIT && !ctx->context) { st->bits_unused = *(const uint8_t *)buf_ptr; ctx->left--; ADVANCE(1); } APPEND(buf_ptr, size); assert(ctx->context > 0); ctx->left -= size; ADVANCE(size); RETURN(RC_WMORE); } else { if(type_variant == ASN_OSUBV_BIT && !ctx->context && ctx->left) { st->bits_unused = *(const uint8_t *)buf_ptr; ctx->left--; ADVANCE(1); } APPEND(buf_ptr, ctx->left); ADVANCE(ctx->left); ctx->left = 0; NEXT_PHASE(ctx); } break; } if(sel) { ASN_DEBUG("3sel p=%p, wn=%d, l=%ld, g=%ld, size=%ld", sel->prev, sel->want_nulls, (long)sel->left, (long)sel->got, (long)size); if(sel->prev || sel->want_nulls > 1 || sel->left > 0) { RETURN(RC_WMORE); } } /* * BIT STRING-specific processing. */ if(type_variant == ASN_OSUBV_BIT && st->size) { /* Finalize BIT STRING: zero out unused bits. */ st->buf[st->size-1] &= 0xff << st->bits_unused; } ASN_DEBUG("Took %ld bytes to encode %s: [%s]:%ld", (long)consumed_myself, td->name, (type_variant == ASN_OSUBV_STR) ? (char *)st->buf : "", (long)st->size); RETURN(RC_OK); } /* * Encode OCTET STRING type using DER. */ asn_enc_rval_t OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t er; asn_OCTET_STRING_specifics_t *specs = td->specifics ? (asn_OCTET_STRING_specifics_t *)td->specifics : &asn_DEF_OCTET_STRING_specs; BIT_STRING_t *st = (BIT_STRING_t *)sptr; enum asn_OS_Subvariant type_variant = specs->subvariant; int fix_last_byte = 0; ASN_DEBUG("%s %s as OCTET STRING", cb?"Estimating":"Encoding", td->name); /* * Write tags. */ if(type_variant != ASN_OSUBV_ANY || tag_mode == 1) { er.encoded = der_write_tags(td, (type_variant == ASN_OSUBV_BIT) + st->size, tag_mode, type_variant == ASN_OSUBV_ANY, tag, cb, app_key); if(er.encoded == -1) { er.failed_type = td; er.structure_ptr = sptr; return er; } } else { /* Disallow: [] IMPLICIT ANY */ assert(type_variant != ASN_OSUBV_ANY || tag_mode != -1); er.encoded = 0; } if(!cb) { er.encoded += (type_variant == ASN_OSUBV_BIT) + st->size; _ASN_ENCODED_OK(er); } /* * Prepare to deal with the last octet of BIT STRING. */ if(type_variant == ASN_OSUBV_BIT) { uint8_t b = st->bits_unused & 0x07; if(b && st->size) fix_last_byte = 1; _ASN_CALLBACK(&b, 1); er.encoded++; } /* Invoke callback for the main part of the buffer */ _ASN_CALLBACK(st->buf, st->size - fix_last_byte); /* The last octet should be stripped off the unused bits */ if(fix_last_byte) { uint8_t b = st->buf[st->size-1] & (0xff << st->bits_unused); _ASN_CALLBACK(&b, 1); } er.encoded += st->size; _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } asn_enc_rval_t OCTET_STRING_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { static const char *h2c = "0123456789ABCDEF"; const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; asn_enc_rval_t er; char scratch[16 * 3 + 4]; char *p = scratch; uint8_t *buf; uint8_t *end; size_t i; if(!st || (!st->buf && st->size)) _ASN_ENCODE_FAILED; er.encoded = 0; /* * Dump the contents of the buffer in hexadecimal. */ buf = st->buf; end = buf + st->size; if(flags & XER_F_CANONICAL) { char *scend = scratch + (sizeof(scratch) - 2); for(; buf < end; buf++) { if(p >= scend) { _ASN_CALLBACK(scratch, p - scratch); er.encoded += p - scratch; p = scratch; } *p++ = h2c[(*buf >> 4) & 0x0F]; *p++ = h2c[*buf & 0x0F]; } _ASN_CALLBACK(scratch, p-scratch); /* Dump the rest */ er.encoded += p - scratch; } else { for(i = 0; buf < end; buf++, i++) { if(!(i % 16) && (i || st->size > 16)) { _ASN_CALLBACK(scratch, p-scratch); er.encoded += (p-scratch); p = scratch; _i_ASN_TEXT_INDENT(1, ilevel); } *p++ = h2c[(*buf >> 4) & 0x0F]; *p++ = h2c[*buf & 0x0F]; *p++ = 0x20; } if(p - scratch) { p--; /* Remove the tail space */ _ASN_CALLBACK(scratch, p-scratch); /* Dump the rest */ er.encoded += p - scratch; if(st->size > 16) _i_ASN_TEXT_INDENT(1, ilevel-1); } } _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } static struct OCTET_STRING__xer_escape_table_s { char *string; int size; } OCTET_STRING__xer_escape_table[] = { #define OSXET(s) { s, sizeof(s) - 1 } OSXET("\074\156\165\154\057\076"), /* */ OSXET("\074\163\157\150\057\076"), /* */ OSXET("\074\163\164\170\057\076"), /* */ OSXET("\074\145\164\170\057\076"), /* */ OSXET("\074\145\157\164\057\076"), /* */ OSXET("\074\145\156\161\057\076"), /* */ OSXET("\074\141\143\153\057\076"), /* */ OSXET("\074\142\145\154\057\076"), /* */ OSXET("\074\142\163\057\076"), /* */ OSXET("\011"), /* \t */ OSXET("\012"), /* \n */ OSXET("\074\166\164\057\076"), /* */ OSXET("\074\146\146\057\076"), /* */ OSXET("\015"), /* \r */ OSXET("\074\163\157\057\076"), /* */ OSXET("\074\163\151\057\076"), /* */ OSXET("\074\144\154\145\057\076"), /* */ OSXET("\074\144\143\061\057\076"), /* */ OSXET("\074\144\143\062\057\076"), /* */ OSXET("\074\144\143\063\057\076"), /* */ OSXET("\074\144\143\064\057\076"), /* */ OSXET("\074\156\141\153\057\076"), /* */ OSXET("\074\163\171\156\057\076"), /* */ OSXET("\074\145\164\142\057\076"), /* */ OSXET("\074\143\141\156\057\076"), /* */ OSXET("\074\145\155\057\076"), /* */ OSXET("\074\163\165\142\057\076"), /* */ OSXET("\074\145\163\143\057\076"), /* */ OSXET("\074\151\163\064\057\076"), /* */ OSXET("\074\151\163\063\057\076"), /* */ OSXET("\074\151\163\062\057\076"), /* */ OSXET("\074\151\163\061\057\076"), /* */ { 0, 0 }, /* " " */ { 0, 0 }, /* ! */ { 0, 0 }, /* \" */ { 0, 0 }, /* # */ { 0, 0 }, /* $ */ { 0, 0 }, /* % */ OSXET("\046\141\155\160\073"), /* & */ { 0, 0 }, /* ' */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* ()*+,-./ */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* 01234567 */ {0,0},{0,0},{0,0},{0,0}, /* 89:; */ OSXET("\046\154\164\073"), /* < */ { 0, 0 }, /* = */ OSXET("\046\147\164\073"), /* > */ }; static int OS__check_escaped_control_char(const void *buf, int size) { size_t i; /* * Inefficient algorithm which translates the escape sequences * defined above into characters. Returns -1 if not found. * TODO: replace by a faster algorithm (bsearch(), hash or * nested table lookups). */ for(i = 0; i < 32 /* Don't spend time on the bottom half */; i++) { struct OCTET_STRING__xer_escape_table_s *el; el = &OCTET_STRING__xer_escape_table[i]; if(el->size == size && memcmp(buf, el->string, size) == 0) return i; } return -1; } static int OCTET_STRING__handle_control_chars(void *struct_ptr, const void *chunk_buf, size_t chunk_size) { /* * This might be one of the escape sequences * for control characters. Check it out. * #11.15.5 */ int control_char = OS__check_escaped_control_char(chunk_buf,chunk_size); if(control_char >= 0) { OCTET_STRING_t *st = (OCTET_STRING_t *)struct_ptr; void *p = REALLOC(st->buf, st->size + 2); if(p) { st->buf = (uint8_t *)p; st->buf[st->size++] = control_char; st->buf[st->size] = '\0'; /* nul-termination */ return 0; } } return -1; /* No, it's not */ } asn_enc_rval_t OCTET_STRING_encode_xer_utf8(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; asn_enc_rval_t er; uint8_t *buf, *end; uint8_t *ss; /* Sequence start */ ssize_t encoded_len = 0; (void)ilevel; /* Unused argument */ (void)flags; /* Unused argument */ if(!st || (!st->buf && st->size)) _ASN_ENCODE_FAILED; buf = st->buf; end = buf + st->size; for(ss = buf; buf < end; buf++) { unsigned int ch = *buf; int s_len; /* Special encoding sequence length */ /* * Escape certain characters: X.680/11.15 */ if(ch < sizeof(OCTET_STRING__xer_escape_table) /sizeof(OCTET_STRING__xer_escape_table[0]) && (s_len = OCTET_STRING__xer_escape_table[ch].size)) { if(((buf - ss) && cb(ss, buf - ss, app_key) < 0) || cb(OCTET_STRING__xer_escape_table[ch].string, s_len, app_key) < 0) _ASN_ENCODE_FAILED; encoded_len += (buf - ss) + s_len; ss = buf + 1; } } encoded_len += (buf - ss); if((buf - ss) && cb(ss, buf - ss, app_key) < 0) _ASN_ENCODE_FAILED; er.encoded = encoded_len; _ASN_ENCODED_OK(er); } /* * Convert from hexadecimal format (cstring): "AB CD EF" */ static ssize_t OCTET_STRING__convert_hexadecimal(void *sptr, const void *chunk_buf, size_t chunk_size, int have_more) { OCTET_STRING_t *st = (OCTET_STRING_t *)sptr; const char *chunk_stop = (const char *)chunk_buf; const char *p = chunk_stop; const char *pend = p + chunk_size; unsigned int clv = 0; int half = 0; /* Half bit */ uint8_t *buf; /* Reallocate buffer according to high cap estimation */ ssize_t _ns = st->size + (chunk_size + 1) / 2; void *nptr = REALLOC(st->buf, _ns + 1); if(!nptr) return -1; st->buf = (uint8_t *)nptr; buf = st->buf + st->size; /* * If something like " a b c " appears here, the " a b":3 will be * converted, and the rest skipped. That is, unless buf_size is greater * than chunk_size, then it'll be equivalent to "ABC0". */ for(; p < pend; p++) { int ch = *(const unsigned char *)p; switch(ch) { case 0x09: case 0x0a: case 0x0c: case 0x0d: case 0x20: /* Ignore whitespace */ continue; case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: /*01234*/ case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: /*56789*/ clv = (clv << 4) + (ch - 0x30); break; case 0x41: case 0x42: case 0x43: /* ABC */ case 0x44: case 0x45: case 0x46: /* DEF */ clv = (clv << 4) + (ch - 0x41 + 10); break; case 0x61: case 0x62: case 0x63: /* abc */ case 0x64: case 0x65: case 0x66: /* def */ clv = (clv << 4) + (ch - 0x61 + 10); break; default: *buf = 0; /* JIC */ return -1; } if(half++) { half = 0; *buf++ = clv; chunk_stop = p + 1; } } /* * Check partial decoding. */ if(half) { if(have_more) { /* * Partial specification is fine, * because no more more PXER_TEXT data is available. */ *buf++ = clv << 4; chunk_stop = p; } } else { chunk_stop = p; } st->size = buf - st->buf; /* Adjust the buffer size */ assert(st->size <= _ns); st->buf[st->size] = 0; /* Courtesy termination */ return (chunk_stop - (const char *)chunk_buf); /* Converted size */ } /* * Convert from binary format: "00101011101" */ static ssize_t OCTET_STRING__convert_binary(void *sptr, const void *chunk_buf, size_t chunk_size, int have_more) { BIT_STRING_t *st = (BIT_STRING_t *)sptr; const char *p = (const char *)chunk_buf; const char *pend = p + chunk_size; int bits_unused = st->bits_unused & 0x7; uint8_t *buf; /* Reallocate buffer according to high cap estimation */ ssize_t _ns = st->size + (chunk_size + 7) / 8; void *nptr = REALLOC(st->buf, _ns + 1); if(!nptr) return -1; st->buf = (uint8_t *)nptr; buf = st->buf + st->size; (void)have_more; if(bits_unused == 0) bits_unused = 8; else if(st->size) buf--; /* * Convert series of 0 and 1 into the octet string. */ for(; p < pend; p++) { int ch = *(const unsigned char *)p; switch(ch) { case 0x09: case 0x0a: case 0x0c: case 0x0d: case 0x20: /* Ignore whitespace */ break; case 0x30: case 0x31: if(bits_unused-- <= 0) { *++buf = 0; /* Clean the cell */ bits_unused = 7; } *buf |= (ch&1) << bits_unused; break; default: st->bits_unused = bits_unused; return -1; } } if(bits_unused == 8) { st->size = buf - st->buf; st->bits_unused = 0; } else { st->size = buf - st->buf + 1; st->bits_unused = bits_unused; } assert(st->size <= _ns); st->buf[st->size] = 0; /* Courtesy termination */ return chunk_size; /* Converted in full */ } /* * Something like strtod(), but with stricter rules. */ static int OS__strtoent(int base, const char *buf, const char *end, int32_t *ret_value) { int32_t val = 0; const char *p; for(p = buf; p < end; p++) { int ch = *p; /* Strange huge value */ if((val * base + base) < 0) return -1; switch(ch) { case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: /*01234*/ case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: /*56789*/ val = val * base + (ch - 0x30); break; case 0x41: case 0x42: case 0x43: /* ABC */ case 0x44: case 0x45: case 0x46: /* DEF */ val = val * base + (ch - 0x41 + 10); break; case 0x61: case 0x62: case 0x63: /* abc */ case 0x64: case 0x65: case 0x66: /* def */ val = val * base + (ch - 0x61 + 10); break; case 0x3b: /* ';' */ *ret_value = val; return (p - buf) + 1; default: return -1; /* Character set error */ } } *ret_value = -1; return (p - buf); } /* * Convert from the plain UTF-8 format, expanding entity references: "2 < 3" */ static ssize_t OCTET_STRING__convert_entrefs(void *sptr, const void *chunk_buf, size_t chunk_size, int have_more) { OCTET_STRING_t *st = (OCTET_STRING_t *)sptr; const char *p = (const char *)chunk_buf; const char *pend = p + chunk_size; uint8_t *buf; /* Reallocate buffer */ ssize_t _ns = st->size + chunk_size; void *nptr = REALLOC(st->buf, _ns + 1); if(!nptr) return -1; st->buf = (uint8_t *)nptr; buf = st->buf + st->size; /* * Convert series of 0 and 1 into the octet string. */ for(; p < pend; p++) { int ch = *(const unsigned char *)p; int len; /* Length of the rest of the chunk */ if(ch != 0x26 /* '&' */) { *buf++ = ch; continue; /* That was easy... */ } /* * Process entity reference. */ len = chunk_size - (p - (const char *)chunk_buf); if(len == 1 /* "&" */) goto want_more; if(p[1] == 0x23 /* '#' */) { const char *pval; /* Pointer to start of digits */ int32_t val = 0; /* Entity reference value */ int base; if(len == 2 /* "&#" */) goto want_more; if(p[2] == 0x78 /* 'x' */) pval = p + 3, base = 16; else pval = p + 2, base = 10; len = OS__strtoent(base, pval, p + len, &val); if(len == -1) { /* Invalid charset. Just copy verbatim. */ *buf++ = ch; continue; } if(!len || pval[len-1] != 0x3b) goto want_more; assert(val > 0); p += (pval - p) + len - 1; /* Advance past entref */ if(val < 0x80) { *buf++ = (char)val; } else if(val < 0x800) { *buf++ = 0xc0 | ((val >> 6)); *buf++ = 0x80 | ((val & 0x3f)); } else if(val < 0x10000) { *buf++ = 0xe0 | ((val >> 12)); *buf++ = 0x80 | ((val >> 6) & 0x3f); *buf++ = 0x80 | ((val & 0x3f)); } else if(val < 0x200000) { *buf++ = 0xf0 | ((val >> 18)); *buf++ = 0x80 | ((val >> 12) & 0x3f); *buf++ = 0x80 | ((val >> 6) & 0x3f); *buf++ = 0x80 | ((val & 0x3f)); } else if(val < 0x4000000) { *buf++ = 0xf8 | ((val >> 24)); *buf++ = 0x80 | ((val >> 18) & 0x3f); *buf++ = 0x80 | ((val >> 12) & 0x3f); *buf++ = 0x80 | ((val >> 6) & 0x3f); *buf++ = 0x80 | ((val & 0x3f)); } else { *buf++ = 0xfc | ((val >> 30) & 0x1); *buf++ = 0x80 | ((val >> 24) & 0x3f); *buf++ = 0x80 | ((val >> 18) & 0x3f); *buf++ = 0x80 | ((val >> 12) & 0x3f); *buf++ = 0x80 | ((val >> 6) & 0x3f); *buf++ = 0x80 | ((val & 0x3f)); } } else { /* * Ugly, limited parsing of & > < */ char *sc = (char *)memchr(p, 0x3b, len > 5 ? 5 : len); if(!sc) goto want_more; if((sc - p) == 4 && p[1] == 0x61 /* 'a' */ && p[2] == 0x6d /* 'm' */ && p[3] == 0x70 /* 'p' */) { *buf++ = 0x26; p = sc; continue; } if((sc - p) == 3) { if(p[1] == 0x6c) { *buf = 0x3c; /* '<' */ } else if(p[1] == 0x67) { *buf = 0x3e; /* '>' */ } else { /* Unsupported entity reference */ *buf++ = ch; continue; } if(p[2] != 0x74) { /* Unsupported entity reference */ *buf++ = ch; continue; } buf++; p = sc; continue; } /* Unsupported entity reference */ *buf++ = ch; } continue; want_more: if(have_more) { /* * We know that no more data (of the same type) * is coming. Copy the rest verbatim. */ *buf++ = ch; continue; } chunk_size = (p - (const char *)chunk_buf); /* Processing stalled: need more data */ break; } st->size = buf - st->buf; assert(st->size <= _ns); st->buf[st->size] = 0; /* Courtesy termination */ return chunk_size; /* Converted in full */ } /* * Decode OCTET STRING from the XML element's body. */ static asn_dec_rval_t OCTET_STRING__decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, const void *buf_ptr, size_t size, int (*opt_unexpected_tag_decoder) (void *struct_ptr, const void *chunk_buf, size_t chunk_size), ssize_t (*body_receiver) (void *struct_ptr, const void *chunk_buf, size_t chunk_size, int have_more) ) { OCTET_STRING_t *st = (OCTET_STRING_t *)*sptr; asn_OCTET_STRING_specifics_t *specs = td->specifics ? (asn_OCTET_STRING_specifics_t *)td->specifics : &asn_DEF_OCTET_STRING_specs; const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; asn_struct_ctx_t *ctx; /* Per-structure parser context */ asn_dec_rval_t rval; /* Return value from the decoder */ int st_allocated; /* * Create the string if does not exist. */ if(!st) { st = (OCTET_STRING_t *)CALLOC(1, specs->struct_size); *sptr = (void *)st; if(!st) goto sta_failed; st_allocated = 1; } else { st_allocated = 0; } if(!st->buf) { /* This is separate from above section */ st->buf = (uint8_t *)CALLOC(1, 1); if(!st->buf) { if(st_allocated) { *sptr = 0; goto stb_failed; } else { goto sta_failed; } } } /* Restore parsing context */ ctx = (asn_struct_ctx_t *)(((char *)*sptr) + specs->ctx_offset); return xer_decode_general(opt_codec_ctx, ctx, *sptr, xml_tag, buf_ptr, size, opt_unexpected_tag_decoder, body_receiver); stb_failed: FREEMEM(st); sta_failed: rval.code = RC_FAIL; rval.consumed = 0; return rval; } /* * Decode OCTET STRING from the hexadecimal data. */ asn_dec_rval_t OCTET_STRING_decode_xer_hex(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, const void *buf_ptr, size_t size) { return OCTET_STRING__decode_xer(opt_codec_ctx, td, sptr, opt_mname, buf_ptr, size, 0, OCTET_STRING__convert_hexadecimal); } /* * Decode OCTET STRING from the binary (0/1) data. */ asn_dec_rval_t OCTET_STRING_decode_xer_binary(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, const void *buf_ptr, size_t size) { return OCTET_STRING__decode_xer(opt_codec_ctx, td, sptr, opt_mname, buf_ptr, size, 0, OCTET_STRING__convert_binary); } /* * Decode OCTET STRING from the string (ASCII/UTF-8) data. */ asn_dec_rval_t OCTET_STRING_decode_xer_utf8(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, const void *buf_ptr, size_t size) { return OCTET_STRING__decode_xer(opt_codec_ctx, td, sptr, opt_mname, buf_ptr, size, OCTET_STRING__handle_control_chars, OCTET_STRING__convert_entrefs); } static int OCTET_STRING_per_get_characters(asn_per_data_t *po, uint8_t *buf, size_t units, unsigned int bpc, unsigned int unit_bits, long lb, long ub, asn_per_constraints_t *pc) { uint8_t *end = buf + units * bpc; ASN_DEBUG("Expanding %d characters into (%ld..%ld):%d", (int)units, lb, ub, unit_bits); /* X.691: 27.5.4 */ if((unsigned long)ub <= ((unsigned long)2 << (unit_bits - 1))) { /* Decode without translation */ lb = 0; } else if(pc && pc->code2value) { if(unit_bits > 16) return 1; /* FATAL: can't have constrained * UniversalString with more than * 16 million code points */ for(; buf < end; buf += bpc) { int value; int code = per_get_few_bits(po, unit_bits); if(code < 0) return -1; /* WMORE */ value = pc->code2value(code); if(value < 0) { ASN_DEBUG("Code %d (0x%02x) is" " not in map (%ld..%ld)", code, code, lb, ub); return 1; /* FATAL */ } switch(bpc) { case 1: *buf = value; break; case 2: buf[0] = value >> 8; buf[1] = value; break; case 4: buf[0] = value >> 24; buf[1] = value >> 16; buf[2] = value >> 8; buf[3] = value; break; } } return 0; } /* Shortcut the no-op copying to the aligned structure */ if(lb == 0 && (unit_bits == 8 * bpc)) { return per_get_many_bits(po, buf, 0, unit_bits * units); } for(; buf < end; buf += bpc) { int code = per_get_few_bits(po, unit_bits); int ch = code + lb; if(code < 0) return -1; /* WMORE */ if(ch > ub) { ASN_DEBUG("Code %d is out of range (%ld..%ld)", ch, lb, ub); return 1; /* FATAL */ } switch(bpc) { case 1: *buf = ch; break; case 2: buf[0] = ch >> 8; buf[1] = ch; break; case 4: buf[0] = ch >> 24; buf[1] = ch >> 16; buf[2] = ch >> 8; buf[3] = ch; break; } } return 0; } static int OCTET_STRING_per_put_characters(asn_per_outp_t *po, const uint8_t *buf, size_t units, unsigned int bpc, unsigned int unit_bits, long lb, long ub, asn_per_constraints_t *pc) { const uint8_t *end = buf + units * bpc; ASN_DEBUG("Squeezing %d characters into (%ld..%ld):%d (%d bpc)", (int)units, lb, ub, unit_bits, bpc); /* X.691: 27.5.4 */ if((unsigned long)ub <= ((unsigned long)2 << (unit_bits - 1))) { /* Encode as is */ lb = 0; } else if(pc && pc->value2code) { for(; buf < end; buf += bpc) { int code; uint32_t value; switch(bpc) { case 1: value = *(const uint8_t *)buf; break; case 2: value = (buf[0] << 8) | buf[1]; break; case 4: value = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]; break; default: return -1; } code = pc->value2code(value); if(code < 0) { ASN_DEBUG("Character %d (0x%02x) is" " not in map (%ld..%ld)", *buf, *buf, lb, ub); return -1; } if(per_put_few_bits(po, code, unit_bits)) return -1; } } /* Shortcut the no-op copying to the aligned structure */ if(lb == 0 && (unit_bits == 8 * bpc)) { return per_put_many_bits(po, buf, unit_bits * units); } for(ub -= lb; buf < end; buf += bpc) { int ch; uint32_t value; switch(bpc) { case 1: value = *(const uint8_t *)buf; break; case 2: value = (buf[0] << 8) | buf[1]; break; case 4: value = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]; break; default: return -1; } ch = value - lb; if(ch < 0 || ch > ub) { ASN_DEBUG("Character %d (0x%02x)" " is out of range (%ld..%ld)", *buf, *buf, lb, ub + lb); return -1; } if(per_put_few_bits(po, ch, unit_bits)) return -1; } return 0; } asn_dec_rval_t OCTET_STRING_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { asn_OCTET_STRING_specifics_t *specs = td->specifics ? (asn_OCTET_STRING_specifics_t *)td->specifics : &asn_DEF_OCTET_STRING_specs; asn_per_constraints_t *pc = constraints ? constraints : td->per_constraints; asn_per_constraint_t *cval; asn_per_constraint_t *csiz; asn_dec_rval_t rval = { RC_OK, 0 }; BIT_STRING_t *st = (BIT_STRING_t *)*sptr; ssize_t consumed_myself = 0; int repeat; enum { OS__BPC_BIT = 0, OS__BPC_CHAR = 1, OS__BPC_U16 = 2, OS__BPC_U32 = 4 } bpc; /* Bytes per character */ unsigned int unit_bits; unsigned int canonical_unit_bits; (void)opt_codec_ctx; if(pc) { cval = &pc->value; csiz = &pc->size; } else { cval = &asn_DEF_OCTET_STRING_constraints.value; csiz = &asn_DEF_OCTET_STRING_constraints.size; } switch(specs->subvariant) { default: case ASN_OSUBV_ANY: ASN_DEBUG("Unrecognized subvariant %d", specs->subvariant); RETURN(RC_FAIL); case ASN_OSUBV_BIT: canonical_unit_bits = unit_bits = 1; bpc = OS__BPC_BIT; break; case ASN_OSUBV_STR: canonical_unit_bits = unit_bits = 8; if(cval->flags & APC_CONSTRAINED) unit_bits = cval->range_bits; bpc = OS__BPC_CHAR; break; case ASN_OSUBV_U16: canonical_unit_bits = unit_bits = 16; if(cval->flags & APC_CONSTRAINED) unit_bits = cval->range_bits; bpc = OS__BPC_U16; break; case ASN_OSUBV_U32: canonical_unit_bits = unit_bits = 32; if(cval->flags & APC_CONSTRAINED) unit_bits = cval->range_bits; bpc = OS__BPC_U32; break; } /* * Allocate the string. */ if(!st) { st = (BIT_STRING_t *)(*sptr = CALLOC(1, specs->struct_size)); if(!st) RETURN(RC_FAIL); } ASN_DEBUG("PER Decoding %s size %ld .. %ld bits %d", csiz->flags & APC_EXTENSIBLE ? "extensible" : "non-extensible", csiz->lower_bound, csiz->upper_bound, csiz->effective_bits); if(csiz->flags & APC_EXTENSIBLE) { int inext = per_get_few_bits(pd, 1); if(inext < 0) RETURN(RC_WMORE); if(inext) { csiz = &asn_DEF_OCTET_STRING_constraints.size; cval = &asn_DEF_OCTET_STRING_constraints.value; unit_bits = canonical_unit_bits; } } if(csiz->effective_bits >= 0) { FREEMEM(st->buf); if(bpc) { st->size = csiz->upper_bound * bpc; } else { st->size = (csiz->upper_bound + 7) >> 3; } st->buf = (uint8_t *)MALLOC(st->size + 1); if(!st->buf) { st->size = 0; RETURN(RC_FAIL); } } /* X.691, #16.5: zero-length encoding */ /* X.691, #16.6: short fixed length encoding (up to 2 octets) */ /* X.691, #16.7: long fixed length encoding (up to 64K octets) */ if(csiz->effective_bits == 0) { int ret; if(bpc) { ASN_DEBUG("Encoding OCTET STRING size %ld", csiz->upper_bound); ret = OCTET_STRING_per_get_characters(pd, st->buf, csiz->upper_bound, bpc, unit_bits, cval->lower_bound, cval->upper_bound, pc); if(ret > 0) RETURN(RC_FAIL); } else { ASN_DEBUG("Encoding BIT STRING size %ld", csiz->upper_bound); ret = per_get_many_bits(pd, st->buf, 0, unit_bits * csiz->upper_bound); } if(ret < 0) RETURN(RC_WMORE); consumed_myself += unit_bits * csiz->upper_bound; st->buf[st->size] = 0; if(bpc == 0) { int ubs = (csiz->upper_bound & 0x7); st->bits_unused = ubs ? 8 - ubs : 0; } RETURN(RC_OK); } st->size = 0; do { ssize_t raw_len; ssize_t len_bytes; ssize_t len_bits; void *p; int ret; /* Get the PER length */ raw_len = uper_get_length(pd, csiz->effective_bits, &repeat); if(raw_len < 0) RETURN(RC_WMORE); raw_len += csiz->lower_bound; ASN_DEBUG("Got PER length eb %ld, len %ld, %s (%s)", (long)csiz->effective_bits, (long)raw_len, repeat ? "repeat" : "once", td->name); if(bpc) { len_bytes = raw_len * bpc; len_bits = len_bytes * unit_bits; } else { len_bits = raw_len; len_bytes = (len_bits + 7) >> 3; if(len_bits & 0x7) st->bits_unused = 8 - (len_bits & 0x7); /* len_bits be multiple of 16K if repeat is set */ } p = REALLOC(st->buf, st->size + len_bytes + 1); if(!p) RETURN(RC_FAIL); st->buf = (uint8_t *)p; if(bpc) { ret = OCTET_STRING_per_get_characters(pd, &st->buf[st->size], raw_len, bpc, unit_bits, cval->lower_bound, cval->upper_bound, pc); if(ret > 0) RETURN(RC_FAIL); } else { ret = per_get_many_bits(pd, &st->buf[st->size], 0, len_bits); } if(ret < 0) RETURN(RC_WMORE); st->size += len_bytes; } while(repeat); st->buf[st->size] = 0; /* nul-terminate */ return rval; } asn_enc_rval_t OCTET_STRING_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { asn_OCTET_STRING_specifics_t *specs = td->specifics ? (asn_OCTET_STRING_specifics_t *)td->specifics : &asn_DEF_OCTET_STRING_specs; asn_per_constraints_t *pc = constraints ? constraints : td->per_constraints; asn_per_constraint_t *cval; asn_per_constraint_t *csiz; const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; asn_enc_rval_t er = { 0, 0, 0 }; int inext = 0; /* Lies not within extension root */ unsigned int unit_bits; unsigned int canonical_unit_bits; unsigned int sizeinunits; const uint8_t *buf; int ret; enum { OS__BPC_BIT = 0, OS__BPC_CHAR = 1, OS__BPC_U16 = 2, OS__BPC_U32 = 4 } bpc; /* Bytes per character */ int ct_extensible; if(!st || (!st->buf && st->size)) _ASN_ENCODE_FAILED; if(pc) { cval = &pc->value; csiz = &pc->size; } else { cval = &asn_DEF_OCTET_STRING_constraints.value; csiz = &asn_DEF_OCTET_STRING_constraints.size; } ct_extensible = csiz->flags & APC_EXTENSIBLE; switch(specs->subvariant) { default: case ASN_OSUBV_ANY: _ASN_ENCODE_FAILED; case ASN_OSUBV_BIT: canonical_unit_bits = unit_bits = 1; bpc = OS__BPC_BIT; sizeinunits = st->size * 8 - (st->bits_unused & 0x07); ASN_DEBUG("BIT STRING of %d bytes, %d bits unused", sizeinunits, st->bits_unused); break; case ASN_OSUBV_STR: canonical_unit_bits = unit_bits = 8; if(cval->flags & APC_CONSTRAINED) unit_bits = cval->range_bits; bpc = OS__BPC_CHAR; sizeinunits = st->size; break; case ASN_OSUBV_U16: canonical_unit_bits = unit_bits = 16; if(cval->flags & APC_CONSTRAINED) unit_bits = cval->range_bits; bpc = OS__BPC_U16; sizeinunits = st->size / 2; break; case ASN_OSUBV_U32: canonical_unit_bits = unit_bits = 32; if(cval->flags & APC_CONSTRAINED) unit_bits = cval->range_bits; bpc = OS__BPC_U32; sizeinunits = st->size / 4; break; } ASN_DEBUG("Encoding %s into %d units of %d bits" " (%ld..%ld, effective %d)%s", td->name, sizeinunits, unit_bits, csiz->lower_bound, csiz->upper_bound, csiz->effective_bits, ct_extensible ? " EXT" : ""); /* Figure out wheter size lies within PER visible constraint */ if(csiz->effective_bits >= 0) { if((int)sizeinunits < csiz->lower_bound || (int)sizeinunits > csiz->upper_bound) { if(ct_extensible) { cval = &asn_DEF_OCTET_STRING_constraints.value; csiz = &asn_DEF_OCTET_STRING_constraints.size; unit_bits = canonical_unit_bits; inext = 1; } else _ASN_ENCODE_FAILED; } } else { inext = 0; } if(ct_extensible) { /* Declare whether length is [not] within extension root */ if(per_put_few_bits(po, inext, 1)) _ASN_ENCODE_FAILED; } /* X.691, #16.5: zero-length encoding */ /* X.691, #16.6: short fixed length encoding (up to 2 octets) */ /* X.691, #16.7: long fixed length encoding (up to 64K octets) */ if(csiz->effective_bits >= 0) { ASN_DEBUG("Encoding %d bytes (%ld), length in %d bits", st->size, sizeinunits - csiz->lower_bound, csiz->effective_bits); ret = per_put_few_bits(po, sizeinunits - csiz->lower_bound, csiz->effective_bits); if(ret) _ASN_ENCODE_FAILED; if(bpc) { ret = OCTET_STRING_per_put_characters(po, st->buf, sizeinunits, bpc, unit_bits, cval->lower_bound, cval->upper_bound, pc); } else { ret = per_put_many_bits(po, st->buf, sizeinunits * unit_bits); } if(ret) _ASN_ENCODE_FAILED; _ASN_ENCODED_OK(er); } ASN_DEBUG("Encoding %d bytes", st->size); if(sizeinunits == 0) { if(uper_put_length(po, 0)) _ASN_ENCODE_FAILED; _ASN_ENCODED_OK(er); } buf = st->buf; while(sizeinunits) { ssize_t maySave = uper_put_length(po, sizeinunits); if(maySave < 0) _ASN_ENCODE_FAILED; ASN_DEBUG("Encoding %ld of %ld", (long)maySave, (long)sizeinunits); if(bpc) { ret = OCTET_STRING_per_put_characters(po, buf, maySave, bpc, unit_bits, cval->lower_bound, cval->upper_bound, pc); } else { ret = per_put_many_bits(po, buf, maySave * unit_bits); } if(ret) _ASN_ENCODE_FAILED; if(bpc) buf += maySave * bpc; else buf += maySave >> 3; sizeinunits -= maySave; assert(!(maySave & 0x07) || !sizeinunits); } _ASN_ENCODED_OK(er); } int OCTET_STRING_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { static const char *h2c = "0123456789ABCDEF"; const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; char scratch[16 * 3 + 4]; char *p = scratch; uint8_t *buf; uint8_t *end; size_t i; (void)td; /* Unused argument */ if(!st || (!st->buf && st->size)) return (cb("", 8, app_key) < 0) ? -1 : 0; /* * Dump the contents of the buffer in hexadecimal. */ buf = st->buf; end = buf + st->size; for(i = 0; buf < end; buf++, i++) { if(!(i % 16) && (i || st->size > 16)) { if(cb(scratch, p - scratch, app_key) < 0) return -1; _i_INDENT(1); p = scratch; } *p++ = h2c[(*buf >> 4) & 0x0F]; *p++ = h2c[*buf & 0x0F]; *p++ = 0x20; } if(p > scratch) { p--; /* Remove the tail space */ if(cb(scratch, p - scratch, app_key) < 0) return -1; } return 0; } int OCTET_STRING_print_utf8(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; (void)td; /* Unused argument */ (void)ilevel; /* Unused argument */ if(st && (st->buf || !st->size)) { return (cb(st->buf, st->size, app_key) < 0) ? -1 : 0; } else { return (cb("", 8, app_key) < 0) ? -1 : 0; } } void OCTET_STRING_free(asn_TYPE_descriptor_t *td, void *sptr, int contents_only) { OCTET_STRING_t *st = (OCTET_STRING_t *)sptr; asn_OCTET_STRING_specifics_t *specs = td->specifics ? (asn_OCTET_STRING_specifics_t *)td->specifics : &asn_DEF_OCTET_STRING_specs; asn_struct_ctx_t *ctx = (asn_struct_ctx_t *) ((char *)st + specs->ctx_offset); struct _stack *stck; if(!td || !st) return; ASN_DEBUG("Freeing %s as OCTET STRING", td->name); if(st->buf) { FREEMEM(st->buf); st->buf = 0; } /* * Remove decode-time stack. */ stck = (struct _stack *)ctx->ptr; if(stck) { while(stck->tail) { struct _stack_el *sel = stck->tail; stck->tail = sel->prev; FREEMEM(sel); } FREEMEM(stck); } if(!contents_only) { FREEMEM(st); } } /* * Conversion routines. */ int OCTET_STRING_fromBuf(OCTET_STRING_t *st, const char *str, int len) { void *buf; if(st == 0 || (str == 0 && len)) { errno = EINVAL; return -1; } /* * Clear the OCTET STRING. */ if(str == NULL) { FREEMEM(st->buf); st->buf = 0; st->size = 0; return 0; } /* Determine the original string size, if not explicitly given */ if(len < 0) len = strlen(str); /* Allocate and fill the memory */ buf = MALLOC(len + 1); if(buf == NULL) return -1; memcpy(buf, str, len); ((uint8_t *)buf)[len] = '\0'; /* Couldn't use memcpy(len+1)! */ FREEMEM(st->buf); st->buf = (uint8_t *)buf; st->size = len; return 0; } OCTET_STRING_t * OCTET_STRING_new_fromBuf(asn_TYPE_descriptor_t *td, const char *str, int len) { asn_OCTET_STRING_specifics_t *specs = td->specifics ? (asn_OCTET_STRING_specifics_t *)td->specifics : &asn_DEF_OCTET_STRING_specs; OCTET_STRING_t *st; st = (OCTET_STRING_t *)CALLOC(1, specs->struct_size); if(st && str && OCTET_STRING_fromBuf(st, str, len)) { FREEMEM(st); st = NULL; } return st; } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/OCTET_STRING.h000066400000000000000000000054031305042567700226010ustar00rootroot00000000000000/*- * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _OCTET_STRING_H_ #define _OCTET_STRING_H_ #include #ifdef __cplusplus extern "C" { #endif typedef struct OCTET_STRING { uint8_t *buf; /* Buffer with consecutive OCTET_STRING bits */ int size; /* Size of the buffer */ asn_struct_ctx_t _asn_ctx; /* Parsing across buffer boundaries */ } OCTET_STRING_t; extern asn_TYPE_descriptor_t asn_DEF_OCTET_STRING; asn_struct_free_f OCTET_STRING_free; asn_struct_print_f OCTET_STRING_print; asn_struct_print_f OCTET_STRING_print_utf8; ber_type_decoder_f OCTET_STRING_decode_ber; der_type_encoder_f OCTET_STRING_encode_der; xer_type_decoder_f OCTET_STRING_decode_xer_hex; /* Hexadecimal */ xer_type_decoder_f OCTET_STRING_decode_xer_binary; /* 01010111010 */ xer_type_decoder_f OCTET_STRING_decode_xer_utf8; /* ASCII/UTF-8 */ xer_type_encoder_f OCTET_STRING_encode_xer; xer_type_encoder_f OCTET_STRING_encode_xer_utf8; per_type_decoder_f OCTET_STRING_decode_uper; per_type_encoder_f OCTET_STRING_encode_uper; /****************************** * Handy conversion routines. * ******************************/ /* * This function clears the previous value of the OCTET STRING (if any) * and then allocates a new memory with the specified content (str/size). * If size = -1, the size of the original string will be determined * using strlen(str). * If str equals to NULL, the function will silently clear the * current contents of the OCTET STRING. * Returns 0 if it was possible to perform operation, -1 otherwise. */ int OCTET_STRING_fromBuf(OCTET_STRING_t *s, const char *str, int size); /* Handy conversion from the C string into the OCTET STRING. */ #define OCTET_STRING_fromString(s, str) OCTET_STRING_fromBuf(s, str, -1) /* * Allocate and fill the new OCTET STRING and return a pointer to the newly * allocated object. NULL is permitted in str: the function will just allocate * empty OCTET STRING. */ OCTET_STRING_t *OCTET_STRING_new_fromBuf(asn_TYPE_descriptor_t *td, const char *str, int size); /**************************** * Internally useful stuff. * ****************************/ typedef struct asn_OCTET_STRING_specifics_s { /* * Target structure description. */ int struct_size; /* Size of the structure */ int ctx_offset; /* Offset of the asn_struct_ctx_t member */ enum asn_OS_Subvariant { ASN_OSUBV_ANY, /* The open type (ANY) */ ASN_OSUBV_BIT, /* BIT STRING */ ASN_OSUBV_STR, /* String types, not {BMP,Universal}String */ ASN_OSUBV_U16, /* 16-bit character (BMPString) */ ASN_OSUBV_U32 /* 32-bit character (UniversalString) */ } subvariant; } asn_OCTET_STRING_specifics_t; #ifdef __cplusplus } #endif #endif /* _OCTET_STRING_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/OTD-FirstSetMsrs.c000066400000000000000000000110001305042567700236520ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "OTD-FirstSetMsrs.h" int OTD_FirstSetMsrs_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { /* Replace with underlying type checker */ td->check_constraints = asn_DEF_OTD_MeasurementWithID.check_constraints; return td->check_constraints(td, sptr, ctfailcb, app_key); } /* * This type is implemented using OTD_MeasurementWithID, * so here we adjust the DEF accordingly. */ static void OTD_FirstSetMsrs_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_OTD_MeasurementWithID.free_struct; td->print_struct = asn_DEF_OTD_MeasurementWithID.print_struct; td->ber_decoder = asn_DEF_OTD_MeasurementWithID.ber_decoder; td->der_encoder = asn_DEF_OTD_MeasurementWithID.der_encoder; td->xer_decoder = asn_DEF_OTD_MeasurementWithID.xer_decoder; td->xer_encoder = asn_DEF_OTD_MeasurementWithID.xer_encoder; td->uper_decoder = asn_DEF_OTD_MeasurementWithID.uper_decoder; td->uper_encoder = asn_DEF_OTD_MeasurementWithID.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_OTD_MeasurementWithID.per_constraints; td->elements = asn_DEF_OTD_MeasurementWithID.elements; td->elements_count = asn_DEF_OTD_MeasurementWithID.elements_count; td->specifics = asn_DEF_OTD_MeasurementWithID.specifics; } void OTD_FirstSetMsrs_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { OTD_FirstSetMsrs_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int OTD_FirstSetMsrs_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { OTD_FirstSetMsrs_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t OTD_FirstSetMsrs_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { OTD_FirstSetMsrs_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t OTD_FirstSetMsrs_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { OTD_FirstSetMsrs_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t OTD_FirstSetMsrs_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { OTD_FirstSetMsrs_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t OTD_FirstSetMsrs_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { OTD_FirstSetMsrs_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t OTD_FirstSetMsrs_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { OTD_FirstSetMsrs_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t OTD_FirstSetMsrs_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { OTD_FirstSetMsrs_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static ber_tlv_tag_t asn_DEF_OTD_FirstSetMsrs_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; asn_TYPE_descriptor_t asn_DEF_OTD_FirstSetMsrs = { "OTD-FirstSetMsrs", "OTD-FirstSetMsrs", OTD_FirstSetMsrs_free, OTD_FirstSetMsrs_print, OTD_FirstSetMsrs_constraint, OTD_FirstSetMsrs_decode_ber, OTD_FirstSetMsrs_encode_der, OTD_FirstSetMsrs_decode_xer, OTD_FirstSetMsrs_encode_xer, OTD_FirstSetMsrs_decode_uper, OTD_FirstSetMsrs_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_OTD_FirstSetMsrs_tags_1, sizeof(asn_DEF_OTD_FirstSetMsrs_tags_1) /sizeof(asn_DEF_OTD_FirstSetMsrs_tags_1[0]), /* 1 */ asn_DEF_OTD_FirstSetMsrs_tags_1, /* Same as above */ sizeof(asn_DEF_OTD_FirstSetMsrs_tags_1) /sizeof(asn_DEF_OTD_FirstSetMsrs_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ 0, 0, /* Defined elsewhere */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/OTD-FirstSetMsrs.h000066400000000000000000000017621305042567700236750ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _OTD_FirstSetMsrs_H_ #define _OTD_FirstSetMsrs_H_ #include /* Including external dependencies */ #include "OTD-MeasurementWithID.h" #ifdef __cplusplus extern "C" { #endif /* OTD-FirstSetMsrs */ typedef OTD_MeasurementWithID_t OTD_FirstSetMsrs_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_OTD_FirstSetMsrs; asn_struct_free_f OTD_FirstSetMsrs_free; asn_struct_print_f OTD_FirstSetMsrs_print; asn_constr_check_f OTD_FirstSetMsrs_constraint; ber_type_decoder_f OTD_FirstSetMsrs_decode_ber; der_type_encoder_f OTD_FirstSetMsrs_encode_der; xer_type_decoder_f OTD_FirstSetMsrs_decode_xer; xer_type_encoder_f OTD_FirstSetMsrs_encode_xer; per_type_decoder_f OTD_FirstSetMsrs_decode_uper; per_type_encoder_f OTD_FirstSetMsrs_encode_uper; #ifdef __cplusplus } #endif #endif /* _OTD_FirstSetMsrs_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/OTD-MeasureInfo-5-Ext.c000066400000000000000000000120401305042567700243640ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "OTD-MeasureInfo-5-Ext.h" int OTD_MeasureInfo_5_Ext_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } /* Determine the number of elements */ size = _A_CSEQUENCE_FROM_VOID(sptr)->count; if((size >= 1 && size <= 2)) { /* Perform validation of the inner elements */ return td->check_constraints(td, sptr, ctfailcb, app_key); } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using SeqOfOTD_MsrElementRest, * so here we adjust the DEF accordingly. */ static void OTD_MeasureInfo_5_Ext_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_SeqOfOTD_MsrElementRest.free_struct; td->print_struct = asn_DEF_SeqOfOTD_MsrElementRest.print_struct; td->ber_decoder = asn_DEF_SeqOfOTD_MsrElementRest.ber_decoder; td->der_encoder = asn_DEF_SeqOfOTD_MsrElementRest.der_encoder; td->xer_decoder = asn_DEF_SeqOfOTD_MsrElementRest.xer_decoder; td->xer_encoder = asn_DEF_SeqOfOTD_MsrElementRest.xer_encoder; td->uper_decoder = asn_DEF_SeqOfOTD_MsrElementRest.uper_decoder; td->uper_encoder = asn_DEF_SeqOfOTD_MsrElementRest.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_SeqOfOTD_MsrElementRest.per_constraints; td->elements = asn_DEF_SeqOfOTD_MsrElementRest.elements; td->elements_count = asn_DEF_SeqOfOTD_MsrElementRest.elements_count; td->specifics = asn_DEF_SeqOfOTD_MsrElementRest.specifics; } void OTD_MeasureInfo_5_Ext_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { OTD_MeasureInfo_5_Ext_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int OTD_MeasureInfo_5_Ext_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { OTD_MeasureInfo_5_Ext_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t OTD_MeasureInfo_5_Ext_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { OTD_MeasureInfo_5_Ext_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t OTD_MeasureInfo_5_Ext_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { OTD_MeasureInfo_5_Ext_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t OTD_MeasureInfo_5_Ext_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { OTD_MeasureInfo_5_Ext_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t OTD_MeasureInfo_5_Ext_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { OTD_MeasureInfo_5_Ext_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t OTD_MeasureInfo_5_Ext_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { OTD_MeasureInfo_5_Ext_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t OTD_MeasureInfo_5_Ext_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { OTD_MeasureInfo_5_Ext_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static ber_tlv_tag_t asn_DEF_OTD_MeasureInfo_5_Ext_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; asn_TYPE_descriptor_t asn_DEF_OTD_MeasureInfo_5_Ext = { "OTD-MeasureInfo-5-Ext", "OTD-MeasureInfo-5-Ext", OTD_MeasureInfo_5_Ext_free, OTD_MeasureInfo_5_Ext_print, OTD_MeasureInfo_5_Ext_constraint, OTD_MeasureInfo_5_Ext_decode_ber, OTD_MeasureInfo_5_Ext_encode_der, OTD_MeasureInfo_5_Ext_decode_xer, OTD_MeasureInfo_5_Ext_encode_xer, OTD_MeasureInfo_5_Ext_decode_uper, OTD_MeasureInfo_5_Ext_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_OTD_MeasureInfo_5_Ext_tags_1, sizeof(asn_DEF_OTD_MeasureInfo_5_Ext_tags_1) /sizeof(asn_DEF_OTD_MeasureInfo_5_Ext_tags_1[0]), /* 1 */ asn_DEF_OTD_MeasureInfo_5_Ext_tags_1, /* Same as above */ sizeof(asn_DEF_OTD_MeasureInfo_5_Ext_tags_1) /sizeof(asn_DEF_OTD_MeasureInfo_5_Ext_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ 0, 0, /* Defined elsewhere */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/OTD-MeasureInfo-5-Ext.h000066400000000000000000000021011305042567700243660ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _OTD_MeasureInfo_5_Ext_H_ #define _OTD_MeasureInfo_5_Ext_H_ #include /* Including external dependencies */ #include "SeqOfOTD-MsrElementRest.h" #ifdef __cplusplus extern "C" { #endif /* OTD-MeasureInfo-5-Ext */ typedef SeqOfOTD_MsrElementRest_t OTD_MeasureInfo_5_Ext_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_OTD_MeasureInfo_5_Ext; asn_struct_free_f OTD_MeasureInfo_5_Ext_free; asn_struct_print_f OTD_MeasureInfo_5_Ext_print; asn_constr_check_f OTD_MeasureInfo_5_Ext_constraint; ber_type_decoder_f OTD_MeasureInfo_5_Ext_decode_ber; der_type_encoder_f OTD_MeasureInfo_5_Ext_encode_der; xer_type_decoder_f OTD_MeasureInfo_5_Ext_decode_xer; xer_type_encoder_f OTD_MeasureInfo_5_Ext_encode_xer; per_type_decoder_f OTD_MeasureInfo_5_Ext_decode_uper; per_type_encoder_f OTD_MeasureInfo_5_Ext_encode_uper; #ifdef __cplusplus } #endif #endif /* _OTD_MeasureInfo_5_Ext_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/OTD-MeasureInfo-R98-Ext.c000066400000000000000000000040001305042567700245770ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "OTD-MeasureInfo-R98-Ext.h" static asn_TYPE_member_t asn_MBR_OTD_MeasureInfo_R98_Ext_1[] = { { ATF_NOFLAGS, 0, offsetof(struct OTD_MeasureInfo_R98_Ext, otdMsrFirstSets_R98_Ext), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_OTD_MsrElementFirst_R98_Ext, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "otdMsrFirstSets-R98-Ext" }, }; static ber_tlv_tag_t asn_DEF_OTD_MeasureInfo_R98_Ext_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_OTD_MeasureInfo_R98_Ext_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* otdMsrFirstSets-R98-Ext at 974 */ }; static asn_SEQUENCE_specifics_t asn_SPC_OTD_MeasureInfo_R98_Ext_specs_1 = { sizeof(struct OTD_MeasureInfo_R98_Ext), offsetof(struct OTD_MeasureInfo_R98_Ext, _asn_ctx), asn_MAP_OTD_MeasureInfo_R98_Ext_tag2el_1, 1, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_OTD_MeasureInfo_R98_Ext = { "OTD-MeasureInfo-R98-Ext", "OTD-MeasureInfo-R98-Ext", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_OTD_MeasureInfo_R98_Ext_tags_1, sizeof(asn_DEF_OTD_MeasureInfo_R98_Ext_tags_1) /sizeof(asn_DEF_OTD_MeasureInfo_R98_Ext_tags_1[0]), /* 1 */ asn_DEF_OTD_MeasureInfo_R98_Ext_tags_1, /* Same as above */ sizeof(asn_DEF_OTD_MeasureInfo_R98_Ext_tags_1) /sizeof(asn_DEF_OTD_MeasureInfo_R98_Ext_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_OTD_MeasureInfo_R98_Ext_1, 1, /* Elements count */ &asn_SPC_OTD_MeasureInfo_R98_Ext_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/OTD-MeasureInfo-R98-Ext.h000066400000000000000000000014561305042567700246200ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _OTD_MeasureInfo_R98_Ext_H_ #define _OTD_MeasureInfo_R98_Ext_H_ #include /* Including external dependencies */ #include "OTD-MsrElementFirst-R98-Ext.h" #include #ifdef __cplusplus extern "C" { #endif /* OTD-MeasureInfo-R98-Ext */ typedef struct OTD_MeasureInfo_R98_Ext { OTD_MsrElementFirst_R98_Ext_t otdMsrFirstSets_R98_Ext; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } OTD_MeasureInfo_R98_Ext_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_OTD_MeasureInfo_R98_Ext; #ifdef __cplusplus } #endif #endif /* _OTD_MeasureInfo_R98_Ext_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/OTD-MeasureInfo.c000066400000000000000000000044361305042567700234760ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "OTD-MeasureInfo.h" static asn_TYPE_member_t asn_MBR_OTD_MeasureInfo_1[] = { { ATF_NOFLAGS, 0, offsetof(struct OTD_MeasureInfo, otdMsrFirstSets), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_OTD_MsrElementFirst, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "otdMsrFirstSets" }, { ATF_POINTER, 1, offsetof(struct OTD_MeasureInfo, otdMsrRestSets), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfOTD_MsrElementRest, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "otdMsrRestSets" }, }; static int asn_MAP_OTD_MeasureInfo_oms_1[] = { 1 }; static ber_tlv_tag_t asn_DEF_OTD_MeasureInfo_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_OTD_MeasureInfo_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* otdMsrFirstSets at 323 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* otdMsrRestSets at 327 */ }; static asn_SEQUENCE_specifics_t asn_SPC_OTD_MeasureInfo_specs_1 = { sizeof(struct OTD_MeasureInfo), offsetof(struct OTD_MeasureInfo, _asn_ctx), asn_MAP_OTD_MeasureInfo_tag2el_1, 2, /* Count of tags in the map */ asn_MAP_OTD_MeasureInfo_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_OTD_MeasureInfo = { "OTD-MeasureInfo", "OTD-MeasureInfo", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_OTD_MeasureInfo_tags_1, sizeof(asn_DEF_OTD_MeasureInfo_tags_1) /sizeof(asn_DEF_OTD_MeasureInfo_tags_1[0]), /* 1 */ asn_DEF_OTD_MeasureInfo_tags_1, /* Same as above */ sizeof(asn_DEF_OTD_MeasureInfo_tags_1) /sizeof(asn_DEF_OTD_MeasureInfo_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_OTD_MeasureInfo_1, 2, /* Elements count */ &asn_SPC_OTD_MeasureInfo_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/OTD-MeasureInfo.h000066400000000000000000000016361305042567700235020ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _OTD_MeasureInfo_H_ #define _OTD_MeasureInfo_H_ #include /* Including external dependencies */ #include "OTD-MsrElementFirst.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct SeqOfOTD_MsrElementRest; /* OTD-MeasureInfo */ typedef struct OTD_MeasureInfo { OTD_MsrElementFirst_t otdMsrFirstSets; struct SeqOfOTD_MsrElementRest *otdMsrRestSets /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } OTD_MeasureInfo_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_OTD_MeasureInfo; #ifdef __cplusplus } #endif /* Referred external types */ #include "SeqOfOTD-MsrElementRest.h" #endif /* _OTD_MeasureInfo_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/OTD-Measurement.c000066400000000000000000000050101305042567700235330ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "OTD-Measurement.h" static asn_TYPE_member_t asn_MBR_OTD_Measurement_1[] = { { ATF_NOFLAGS, 0, offsetof(struct OTD_Measurement, nborTimeSlot), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_ModuloTimeSlot, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "nborTimeSlot" }, { ATF_NOFLAGS, 0, offsetof(struct OTD_Measurement, eotdQuality), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_EOTDQuality, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "eotdQuality" }, { ATF_NOFLAGS, 0, offsetof(struct OTD_Measurement, otdValue), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_OTDValue, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "otdValue" }, }; static ber_tlv_tag_t asn_DEF_OTD_Measurement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_OTD_Measurement_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* nborTimeSlot at 379 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* eotdQuality at 380 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* otdValue at 382 */ }; static asn_SEQUENCE_specifics_t asn_SPC_OTD_Measurement_specs_1 = { sizeof(struct OTD_Measurement), offsetof(struct OTD_Measurement, _asn_ctx), asn_MAP_OTD_Measurement_tag2el_1, 3, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_OTD_Measurement = { "OTD-Measurement", "OTD-Measurement", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_OTD_Measurement_tags_1, sizeof(asn_DEF_OTD_Measurement_tags_1) /sizeof(asn_DEF_OTD_Measurement_tags_1[0]), /* 1 */ asn_DEF_OTD_Measurement_tags_1, /* Same as above */ sizeof(asn_DEF_OTD_Measurement_tags_1) /sizeof(asn_DEF_OTD_Measurement_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_OTD_Measurement_1, 3, /* Elements count */ &asn_SPC_OTD_Measurement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/OTD-Measurement.h000066400000000000000000000014641305042567700235510ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _OTD_Measurement_H_ #define _OTD_Measurement_H_ #include /* Including external dependencies */ #include "ModuloTimeSlot.h" #include "EOTDQuality.h" #include "OTDValue.h" #include #ifdef __cplusplus extern "C" { #endif /* OTD-Measurement */ typedef struct OTD_Measurement { ModuloTimeSlot_t nborTimeSlot; EOTDQuality_t eotdQuality; OTDValue_t otdValue; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } OTD_Measurement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_OTD_Measurement; #ifdef __cplusplus } #endif #endif /* _OTD_Measurement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/OTD-MeasurementWithID.c000066400000000000000000000060271305042567700246150ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "OTD-MeasurementWithID.h" static asn_TYPE_member_t asn_MBR_OTD_MeasurementWithID_1[] = { { ATF_NOFLAGS, 0, offsetof(struct OTD_MeasurementWithID, neighborIdentity), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), +1, /* EXPLICIT tag at current level */ &asn_DEF_NeighborIdentity, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "neighborIdentity" }, { ATF_NOFLAGS, 0, offsetof(struct OTD_MeasurementWithID, nborTimeSlot), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_ModuloTimeSlot, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "nborTimeSlot" }, { ATF_NOFLAGS, 0, offsetof(struct OTD_MeasurementWithID, eotdQuality), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_EOTDQuality, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "eotdQuality" }, { ATF_NOFLAGS, 0, offsetof(struct OTD_MeasurementWithID, otdValue), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_OTDValue, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "otdValue" }, }; static ber_tlv_tag_t asn_DEF_OTD_MeasurementWithID_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_OTD_MeasurementWithID_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* neighborIdentity at 386 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* nborTimeSlot at 387 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* eotdQuality at 388 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* otdValue at 390 */ }; static asn_SEQUENCE_specifics_t asn_SPC_OTD_MeasurementWithID_specs_1 = { sizeof(struct OTD_MeasurementWithID), offsetof(struct OTD_MeasurementWithID, _asn_ctx), asn_MAP_OTD_MeasurementWithID_tag2el_1, 4, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_OTD_MeasurementWithID = { "OTD-MeasurementWithID", "OTD-MeasurementWithID", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_OTD_MeasurementWithID_tags_1, sizeof(asn_DEF_OTD_MeasurementWithID_tags_1) /sizeof(asn_DEF_OTD_MeasurementWithID_tags_1[0]), /* 1 */ asn_DEF_OTD_MeasurementWithID_tags_1, /* Same as above */ sizeof(asn_DEF_OTD_MeasurementWithID_tags_1) /sizeof(asn_DEF_OTD_MeasurementWithID_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_OTD_MeasurementWithID_1, 4, /* Elements count */ &asn_SPC_OTD_MeasurementWithID_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/OTD-MeasurementWithID.h000066400000000000000000000016431305042567700246210ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _OTD_MeasurementWithID_H_ #define _OTD_MeasurementWithID_H_ #include /* Including external dependencies */ #include "NeighborIdentity.h" #include "ModuloTimeSlot.h" #include "EOTDQuality.h" #include "OTDValue.h" #include #ifdef __cplusplus extern "C" { #endif /* OTD-MeasurementWithID */ typedef struct OTD_MeasurementWithID { NeighborIdentity_t neighborIdentity; ModuloTimeSlot_t nborTimeSlot; EOTDQuality_t eotdQuality; OTDValue_t otdValue; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } OTD_MeasurementWithID_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_OTD_MeasurementWithID; #ifdef __cplusplus } #endif #endif /* _OTD_MeasurementWithID_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/OTD-MsrElementFirst-R98-Ext.c000066400000000000000000000043051305042567700254550ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "OTD-MsrElementFirst-R98-Ext.h" static asn_TYPE_member_t asn_MBR_OTD_MsrElementFirst_R98_Ext_1[] = { { ATF_POINTER, 1, offsetof(struct OTD_MsrElementFirst_R98_Ext, otd_FirstSetMsrs_R98_Ext), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfOTD_FirstSetMsrs_R98_Ext, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "otd-FirstSetMsrs-R98-Ext" }, }; static int asn_MAP_OTD_MsrElementFirst_R98_Ext_oms_1[] = { 0 }; static ber_tlv_tag_t asn_DEF_OTD_MsrElementFirst_R98_Ext_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_OTD_MsrElementFirst_R98_Ext_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* otd-FirstSetMsrs-R98-Ext at 979 */ }; static asn_SEQUENCE_specifics_t asn_SPC_OTD_MsrElementFirst_R98_Ext_specs_1 = { sizeof(struct OTD_MsrElementFirst_R98_Ext), offsetof(struct OTD_MsrElementFirst_R98_Ext, _asn_ctx), asn_MAP_OTD_MsrElementFirst_R98_Ext_tag2el_1, 1, /* Count of tags in the map */ asn_MAP_OTD_MsrElementFirst_R98_Ext_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_OTD_MsrElementFirst_R98_Ext = { "OTD-MsrElementFirst-R98-Ext", "OTD-MsrElementFirst-R98-Ext", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_OTD_MsrElementFirst_R98_Ext_tags_1, sizeof(asn_DEF_OTD_MsrElementFirst_R98_Ext_tags_1) /sizeof(asn_DEF_OTD_MsrElementFirst_R98_Ext_tags_1[0]), /* 1 */ asn_DEF_OTD_MsrElementFirst_R98_Ext_tags_1, /* Same as above */ sizeof(asn_DEF_OTD_MsrElementFirst_R98_Ext_tags_1) /sizeof(asn_DEF_OTD_MsrElementFirst_R98_Ext_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_OTD_MsrElementFirst_R98_Ext_1, 1, /* Elements count */ &asn_SPC_OTD_MsrElementFirst_R98_Ext_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/OTD-MsrElementFirst-R98-Ext.h000066400000000000000000000017041305042567700254620ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _OTD_MsrElementFirst_R98_Ext_H_ #define _OTD_MsrElementFirst_R98_Ext_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct SeqOfOTD_FirstSetMsrs_R98_Ext; /* OTD-MsrElementFirst-R98-Ext */ typedef struct OTD_MsrElementFirst_R98_Ext { struct SeqOfOTD_FirstSetMsrs_R98_Ext *otd_FirstSetMsrs_R98_Ext /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } OTD_MsrElementFirst_R98_Ext_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_OTD_MsrElementFirst_R98_Ext; #ifdef __cplusplus } #endif /* Referred external types */ #include "SeqOfOTD-FirstSetMsrs-R98-Ext.h" #endif /* _OTD_MsrElementFirst_R98_Ext_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/OTD-MsrElementFirst.c000066400000000000000000000124721305042567700243430ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "OTD-MsrElementFirst.h" static int memb_refFrameNumber_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 42431)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_taCorrection_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 960)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_refFrameNumber_constr_2 = { { APC_CONSTRAINED, 16, 16, 0, 42431 } /* (0..42431) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_taCorrection_constr_6 = { { APC_CONSTRAINED, 10, 10, 0, 960 } /* (0..960) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_OTD_MsrElementFirst_1[] = { { ATF_NOFLAGS, 0, offsetof(struct OTD_MsrElementFirst, refFrameNumber), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_refFrameNumber_constraint_1, &asn_PER_memb_refFrameNumber_constr_2, 0, "refFrameNumber" }, { ATF_NOFLAGS, 0, offsetof(struct OTD_MsrElementFirst, referenceTimeSlot), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_ModuloTimeSlot, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "referenceTimeSlot" }, { ATF_POINTER, 1, offsetof(struct OTD_MsrElementFirst, toaMeasurementsOfRef), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_TOA_MeasurementsOfRef, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "toaMeasurementsOfRef" }, { ATF_NOFLAGS, 0, offsetof(struct OTD_MsrElementFirst, stdResolution), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_StdResolution, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "stdResolution" }, { ATF_POINTER, 2, offsetof(struct OTD_MsrElementFirst, taCorrection), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_taCorrection_constraint_1, &asn_PER_memb_taCorrection_constr_6, 0, "taCorrection" }, { ATF_POINTER, 1, offsetof(struct OTD_MsrElementFirst, otd_FirstSetMsrs), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfOTD_FirstSetMsrs, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "otd-FirstSetMsrs" }, }; static int asn_MAP_OTD_MsrElementFirst_oms_1[] = { 2, 4, 5 }; static ber_tlv_tag_t asn_DEF_OTD_MsrElementFirst_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_OTD_MsrElementFirst_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* refFrameNumber at 334 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* referenceTimeSlot at 335 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* toaMeasurementsOfRef at 336 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* stdResolution at 337 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* taCorrection at 338 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 } /* otd-FirstSetMsrs at 341 */ }; static asn_SEQUENCE_specifics_t asn_SPC_OTD_MsrElementFirst_specs_1 = { sizeof(struct OTD_MsrElementFirst), offsetof(struct OTD_MsrElementFirst, _asn_ctx), asn_MAP_OTD_MsrElementFirst_tag2el_1, 6, /* Count of tags in the map */ asn_MAP_OTD_MsrElementFirst_oms_1, /* Optional members */ 3, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_OTD_MsrElementFirst = { "OTD-MsrElementFirst", "OTD-MsrElementFirst", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_OTD_MsrElementFirst_tags_1, sizeof(asn_DEF_OTD_MsrElementFirst_tags_1) /sizeof(asn_DEF_OTD_MsrElementFirst_tags_1[0]), /* 1 */ asn_DEF_OTD_MsrElementFirst_tags_1, /* Same as above */ sizeof(asn_DEF_OTD_MsrElementFirst_tags_1) /sizeof(asn_DEF_OTD_MsrElementFirst_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_OTD_MsrElementFirst_1, 6, /* Elements count */ &asn_SPC_OTD_MsrElementFirst_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/OTD-MsrElementFirst.h000066400000000000000000000023051305042567700243420ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _OTD_MsrElementFirst_H_ #define _OTD_MsrElementFirst_H_ #include /* Including external dependencies */ #include #include "ModuloTimeSlot.h" #include "StdResolution.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct TOA_MeasurementsOfRef; struct SeqOfOTD_FirstSetMsrs; /* OTD-MsrElementFirst */ typedef struct OTD_MsrElementFirst { long refFrameNumber; ModuloTimeSlot_t referenceTimeSlot; struct TOA_MeasurementsOfRef *toaMeasurementsOfRef /* OPTIONAL */; StdResolution_t stdResolution; long *taCorrection /* OPTIONAL */; struct SeqOfOTD_FirstSetMsrs *otd_FirstSetMsrs /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } OTD_MsrElementFirst_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_OTD_MsrElementFirst; #ifdef __cplusplus } #endif /* Referred external types */ #include "TOA-MeasurementsOfRef.h" #include "SeqOfOTD-FirstSetMsrs.h" #endif /* _OTD_MsrElementFirst_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/OTD-MsrElementRest.c000066400000000000000000000124531305042567700241700ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "OTD-MsrElementRest.h" static int memb_refFrameNumber_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 42431)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_taCorrection_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 960)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_refFrameNumber_constr_2 = { { APC_CONSTRAINED, 16, 16, 0, 42431 } /* (0..42431) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_taCorrection_constr_6 = { { APC_CONSTRAINED, 10, 10, 0, 960 } /* (0..960) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_OTD_MsrElementRest_1[] = { { ATF_NOFLAGS, 0, offsetof(struct OTD_MsrElementRest, refFrameNumber), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_refFrameNumber_constraint_1, &asn_PER_memb_refFrameNumber_constr_2, 0, "refFrameNumber" }, { ATF_NOFLAGS, 0, offsetof(struct OTD_MsrElementRest, referenceTimeSlot), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_ModuloTimeSlot, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "referenceTimeSlot" }, { ATF_POINTER, 1, offsetof(struct OTD_MsrElementRest, toaMeasurementsOfRef), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_TOA_MeasurementsOfRef, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "toaMeasurementsOfRef" }, { ATF_NOFLAGS, 0, offsetof(struct OTD_MsrElementRest, stdResolution), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_StdResolution, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "stdResolution" }, { ATF_POINTER, 2, offsetof(struct OTD_MsrElementRest, taCorrection), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_taCorrection_constraint_1, &asn_PER_memb_taCorrection_constr_6, 0, "taCorrection" }, { ATF_POINTER, 1, offsetof(struct OTD_MsrElementRest, otd_MsrsOfOtherSets), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfOTD_MsrsOfOtherSets, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "otd-MsrsOfOtherSets" }, }; static int asn_MAP_OTD_MsrElementRest_oms_1[] = { 2, 4, 5 }; static ber_tlv_tag_t asn_DEF_OTD_MsrElementRest_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_OTD_MsrElementRest_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* refFrameNumber at 347 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* referenceTimeSlot at 348 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* toaMeasurementsOfRef at 349 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* stdResolution at 350 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* taCorrection at 351 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 } /* otd-MsrsOfOtherSets at 354 */ }; static asn_SEQUENCE_specifics_t asn_SPC_OTD_MsrElementRest_specs_1 = { sizeof(struct OTD_MsrElementRest), offsetof(struct OTD_MsrElementRest, _asn_ctx), asn_MAP_OTD_MsrElementRest_tag2el_1, 6, /* Count of tags in the map */ asn_MAP_OTD_MsrElementRest_oms_1, /* Optional members */ 3, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_OTD_MsrElementRest = { "OTD-MsrElementRest", "OTD-MsrElementRest", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_OTD_MsrElementRest_tags_1, sizeof(asn_DEF_OTD_MsrElementRest_tags_1) /sizeof(asn_DEF_OTD_MsrElementRest_tags_1[0]), /* 1 */ asn_DEF_OTD_MsrElementRest_tags_1, /* Same as above */ sizeof(asn_DEF_OTD_MsrElementRest_tags_1) /sizeof(asn_DEF_OTD_MsrElementRest_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_OTD_MsrElementRest_1, 6, /* Elements count */ &asn_SPC_OTD_MsrElementRest_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/OTD-MsrElementRest.h000066400000000000000000000023121305042567700241660ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _OTD_MsrElementRest_H_ #define _OTD_MsrElementRest_H_ #include /* Including external dependencies */ #include #include "ModuloTimeSlot.h" #include "StdResolution.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct TOA_MeasurementsOfRef; struct SeqOfOTD_MsrsOfOtherSets; /* OTD-MsrElementRest */ typedef struct OTD_MsrElementRest { long refFrameNumber; ModuloTimeSlot_t referenceTimeSlot; struct TOA_MeasurementsOfRef *toaMeasurementsOfRef /* OPTIONAL */; StdResolution_t stdResolution; long *taCorrection /* OPTIONAL */; struct SeqOfOTD_MsrsOfOtherSets *otd_MsrsOfOtherSets /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } OTD_MsrElementRest_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_OTD_MsrElementRest; #ifdef __cplusplus } #endif /* Referred external types */ #include "TOA-MeasurementsOfRef.h" #include "SeqOfOTD-MsrsOfOtherSets.h" #endif /* _OTD_MsrElementRest_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/OTD-MsrsOfOtherSets.c000066400000000000000000000043401305042567700243250ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "OTD-MsrsOfOtherSets.h" static asn_per_constraints_t asn_PER_type_OTD_MsrsOfOtherSets_constr_1 = { { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_OTD_MsrsOfOtherSets_1[] = { { ATF_NOFLAGS, 0, offsetof(struct OTD_MsrsOfOtherSets, choice.identityNotPresent), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_OTD_Measurement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "identityNotPresent" }, { ATF_NOFLAGS, 0, offsetof(struct OTD_MsrsOfOtherSets, choice.identityPresent), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_OTD_MeasurementWithID, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "identityPresent" }, }; static asn_TYPE_tag2member_t asn_MAP_OTD_MsrsOfOtherSets_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* identityNotPresent at 372 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* identityPresent at 374 */ }; static asn_CHOICE_specifics_t asn_SPC_OTD_MsrsOfOtherSets_specs_1 = { sizeof(struct OTD_MsrsOfOtherSets), offsetof(struct OTD_MsrsOfOtherSets, _asn_ctx), offsetof(struct OTD_MsrsOfOtherSets, present), sizeof(((struct OTD_MsrsOfOtherSets *)0)->present), asn_MAP_OTD_MsrsOfOtherSets_tag2el_1, 2, /* Count of tags in the map */ 0, -1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_OTD_MsrsOfOtherSets = { "OTD-MsrsOfOtherSets", "OTD-MsrsOfOtherSets", CHOICE_free, CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_decode_uper, CHOICE_encode_uper, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ &asn_PER_type_OTD_MsrsOfOtherSets_constr_1, asn_MBR_OTD_MsrsOfOtherSets_1, 2, /* Elements count */ &asn_SPC_OTD_MsrsOfOtherSets_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/OTD-MsrsOfOtherSets.h000066400000000000000000000021631305042567700243330ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _OTD_MsrsOfOtherSets_H_ #define _OTD_MsrsOfOtherSets_H_ #include /* Including external dependencies */ #include "OTD-Measurement.h" #include "OTD-MeasurementWithID.h" #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum OTD_MsrsOfOtherSets_PR { OTD_MsrsOfOtherSets_PR_NOTHING, /* No components present */ OTD_MsrsOfOtherSets_PR_identityNotPresent, OTD_MsrsOfOtherSets_PR_identityPresent } OTD_MsrsOfOtherSets_PR; /* OTD-MsrsOfOtherSets */ typedef struct OTD_MsrsOfOtherSets { OTD_MsrsOfOtherSets_PR present; union OTD_MsrsOfOtherSets_u { OTD_Measurement_t identityNotPresent; OTD_MeasurementWithID_t identityPresent; } choice; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } OTD_MsrsOfOtherSets_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_OTD_MsrsOfOtherSets; #ifdef __cplusplus } #endif #endif /* _OTD_MsrsOfOtherSets_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/OTDValue.c000066400000000000000000000107711305042567700222570ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "OTDValue.h" int OTDValue_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 39999)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void OTDValue_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void OTDValue_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { OTDValue_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int OTDValue_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { OTDValue_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t OTDValue_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { OTDValue_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t OTDValue_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { OTDValue_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t OTDValue_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { OTDValue_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t OTDValue_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { OTDValue_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t OTDValue_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { OTDValue_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t OTDValue_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { OTDValue_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_OTDValue_constr_1 = { { APC_CONSTRAINED, 16, 16, 0, 39999 } /* (0..39999) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_OTDValue_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_OTDValue = { "OTDValue", "OTDValue", OTDValue_free, OTDValue_print, OTDValue_constraint, OTDValue_decode_ber, OTDValue_encode_der, OTDValue_decode_xer, OTDValue_encode_xer, OTDValue_decode_uper, OTDValue_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_OTDValue_tags_1, sizeof(asn_DEF_OTDValue_tags_1) /sizeof(asn_DEF_OTDValue_tags_1[0]), /* 1 */ asn_DEF_OTDValue_tags_1, /* Same as above */ sizeof(asn_DEF_OTDValue_tags_1) /sizeof(asn_DEF_OTDValue_tags_1[0]), /* 1 */ &asn_PER_type_OTDValue_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/OTDValue.h000066400000000000000000000015371305042567700222640ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _OTDValue_H_ #define _OTDValue_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* OTDValue */ typedef long OTDValue_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_OTDValue; asn_struct_free_f OTDValue_free; asn_struct_print_f OTDValue_print; asn_constr_check_f OTDValue_constraint; ber_type_decoder_f OTDValue_decode_ber; der_type_encoder_f OTDValue_encode_der; xer_type_decoder_f OTDValue_decode_xer; xer_type_encoder_f OTDValue_encode_xer; per_type_decoder_f OTDValue_decode_uper; per_type_encoder_f OTDValue_encode_uper; #ifdef __cplusplus } #endif #endif /* _OTDValue_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/PDU.c000066400000000000000000000051651305042567700212650ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Messages" * found in "../rrlp-messages.asn" */ #include "PDU.h" static int memb_referenceNumber_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 7)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_referenceNumber_constr_2 = { { APC_CONSTRAINED, 3, 3, 0, 7 } /* (0..7) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_PDU_1[] = { { ATF_NOFLAGS, 0, offsetof(struct PDU, referenceNumber), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_referenceNumber_constraint_1, &asn_PER_memb_referenceNumber_constr_2, 0, "referenceNumber" }, { ATF_NOFLAGS, 0, offsetof(struct PDU, component), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), +1, /* EXPLICIT tag at current level */ &asn_DEF_RRLP_Component, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "component" }, }; static ber_tlv_tag_t asn_DEF_PDU_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_PDU_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* referenceNumber at 16 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* component at 18 */ }; static asn_SEQUENCE_specifics_t asn_SPC_PDU_specs_1 = { sizeof(struct PDU), offsetof(struct PDU, _asn_ctx), asn_MAP_PDU_tag2el_1, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_PDU = { "PDU", "PDU", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_PDU_tags_1, sizeof(asn_DEF_PDU_tags_1) /sizeof(asn_DEF_PDU_tags_1[0]), /* 1 */ asn_DEF_PDU_tags_1, /* Same as above */ sizeof(asn_DEF_PDU_tags_1) /sizeof(asn_DEF_PDU_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_PDU_1, 2, /* Elements count */ &asn_SPC_PDU_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/PDU.h000066400000000000000000000012511305042567700212620ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Messages" * found in "../rrlp-messages.asn" */ #ifndef _PDU_H_ #define _PDU_H_ #include /* Including external dependencies */ #include #include "RRLP-Component.h" #include #ifdef __cplusplus extern "C" { #endif /* PDU */ typedef struct PDU { long referenceNumber; RRLP_Component_t component; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } PDU_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_PDU; #ifdef __cplusplus } #endif #endif /* _PDU_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/PositionData.c000066400000000000000000000113771305042567700232350ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "PositionData.h" int PositionData_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } if(st->size > 0) { /* Size in bits */ size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } if((size >= 3 && size <= 16)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using BIT_STRING, * so here we adjust the DEF accordingly. */ static void PositionData_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_BIT_STRING.free_struct; td->print_struct = asn_DEF_BIT_STRING.print_struct; td->ber_decoder = asn_DEF_BIT_STRING.ber_decoder; td->der_encoder = asn_DEF_BIT_STRING.der_encoder; td->xer_decoder = asn_DEF_BIT_STRING.xer_decoder; td->xer_encoder = asn_DEF_BIT_STRING.xer_encoder; td->uper_decoder = asn_DEF_BIT_STRING.uper_decoder; td->uper_encoder = asn_DEF_BIT_STRING.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_BIT_STRING.per_constraints; td->elements = asn_DEF_BIT_STRING.elements; td->elements_count = asn_DEF_BIT_STRING.elements_count; td->specifics = asn_DEF_BIT_STRING.specifics; } void PositionData_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { PositionData_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int PositionData_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { PositionData_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t PositionData_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { PositionData_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t PositionData_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { PositionData_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t PositionData_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { PositionData_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t PositionData_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { PositionData_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t PositionData_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { PositionData_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t PositionData_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { PositionData_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_PositionData_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 4, 4, 3, 16 } /* (SIZE(3..16)) */, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_PositionData_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)) }; asn_TYPE_descriptor_t asn_DEF_PositionData = { "PositionData", "PositionData", PositionData_free, PositionData_print, PositionData_constraint, PositionData_decode_ber, PositionData_encode_der, PositionData_decode_xer, PositionData_encode_xer, PositionData_decode_uper, PositionData_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_PositionData_tags_1, sizeof(asn_DEF_PositionData_tags_1) /sizeof(asn_DEF_PositionData_tags_1[0]), /* 1 */ asn_DEF_PositionData_tags_1, /* Same as above */ sizeof(asn_DEF_PositionData_tags_1) /sizeof(asn_DEF_PositionData_tags_1[0]), /* 1 */ &asn_PER_type_PositionData_constr_1, 0, 0, /* Defined elsewhere */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/PositionData.h000066400000000000000000000020541305042567700232320ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _PositionData_H_ #define _PositionData_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum PositionData { PositionData_e_otd = 0, PositionData_gps = 1, PositionData_galileo = 2 } e_PositionData; /* PositionData */ typedef BIT_STRING_t PositionData_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_PositionData; asn_struct_free_f PositionData_free; asn_struct_print_f PositionData_print; asn_constr_check_f PositionData_constraint; ber_type_decoder_f PositionData_decode_ber; der_type_encoder_f PositionData_encode_der; xer_type_decoder_f PositionData_decode_xer; xer_type_encoder_f PositionData_encode_xer; per_type_decoder_f PositionData_decode_uper; per_type_encoder_f PositionData_encode_uper; #ifdef __cplusplus } #endif #endif /* _PositionData_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/PositionInstruct.c000066400000000000000000000066761305042567700242050ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "PositionInstruct.h" static asn_TYPE_member_t asn_MBR_PositionInstruct_1[] = { { ATF_NOFLAGS, 0, offsetof(struct PositionInstruct, methodType), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), +1, /* EXPLICIT tag at current level */ &asn_DEF_MethodType, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "methodType" }, { ATF_NOFLAGS, 0, offsetof(struct PositionInstruct, positionMethod), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_PositionMethod, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "positionMethod" }, { ATF_NOFLAGS, 0, offsetof(struct PositionInstruct, measureResponseTime), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_MeasureResponseTime, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "measureResponseTime" }, { ATF_NOFLAGS, 0, offsetof(struct PositionInstruct, useMultipleSets), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_UseMultipleSets, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "useMultipleSets" }, { ATF_POINTER, 1, offsetof(struct PositionInstruct, environmentCharacter), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_EnvironmentCharacter, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "environmentCharacter" }, }; static int asn_MAP_PositionInstruct_oms_1[] = { 4 }; static ber_tlv_tag_t asn_DEF_PositionInstruct_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_PositionInstruct_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* methodType at 108 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* positionMethod at 109 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* measureResponseTime at 110 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* useMultipleSets at 111 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* environmentCharacter at 112 */ }; static asn_SEQUENCE_specifics_t asn_SPC_PositionInstruct_specs_1 = { sizeof(struct PositionInstruct), offsetof(struct PositionInstruct, _asn_ctx), asn_MAP_PositionInstruct_tag2el_1, 5, /* Count of tags in the map */ asn_MAP_PositionInstruct_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_PositionInstruct = { "PositionInstruct", "PositionInstruct", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_PositionInstruct_tags_1, sizeof(asn_DEF_PositionInstruct_tags_1) /sizeof(asn_DEF_PositionInstruct_tags_1[0]), /* 1 */ asn_DEF_PositionInstruct_tags_1, /* Same as above */ sizeof(asn_DEF_PositionInstruct_tags_1) /sizeof(asn_DEF_PositionInstruct_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_PositionInstruct_1, 5, /* Elements count */ &asn_SPC_PositionInstruct_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/PositionInstruct.h000066400000000000000000000017751305042567700242050ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _PositionInstruct_H_ #define _PositionInstruct_H_ #include /* Including external dependencies */ #include "MethodType.h" #include "PositionMethod.h" #include "MeasureResponseTime.h" #include "UseMultipleSets.h" #include "EnvironmentCharacter.h" #include #ifdef __cplusplus extern "C" { #endif /* PositionInstruct */ typedef struct PositionInstruct { MethodType_t methodType; PositionMethod_t positionMethod; MeasureResponseTime_t measureResponseTime; UseMultipleSets_t useMultipleSets; EnvironmentCharacter_t *environmentCharacter /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } PositionInstruct_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_PositionInstruct; #ifdef __cplusplus } #endif #endif /* _PositionInstruct_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/PositionMethod.c000066400000000000000000000121741305042567700236000ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "PositionMethod.h" int PositionMethod_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { /* Replace with underlying type checker */ td->check_constraints = asn_DEF_ENUMERATED.check_constraints; return td->check_constraints(td, sptr, ctfailcb, app_key); } /* * This type is implemented using ENUMERATED, * so here we adjust the DEF accordingly. */ static void PositionMethod_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_ENUMERATED.free_struct; td->print_struct = asn_DEF_ENUMERATED.print_struct; td->ber_decoder = asn_DEF_ENUMERATED.ber_decoder; td->der_encoder = asn_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; td->uper_encoder = asn_DEF_ENUMERATED.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_ENUMERATED.per_constraints; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ } void PositionMethod_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { PositionMethod_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int PositionMethod_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { PositionMethod_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t PositionMethod_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { PositionMethod_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t PositionMethod_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { PositionMethod_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t PositionMethod_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { PositionMethod_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t PositionMethod_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { PositionMethod_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t PositionMethod_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { PositionMethod_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t PositionMethod_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { PositionMethod_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_PositionMethod_constr_1 = { { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_INTEGER_enum_map_t asn_MAP_PositionMethod_value2enum_1[] = { { 0, 4, "eotd" }, { 1, 3, "gps" }, { 2, 9, "gpsOrEOTD" } }; static unsigned int asn_MAP_PositionMethod_enum2value_1[] = { 0, /* eotd(0) */ 1, /* gps(1) */ 2 /* gpsOrEOTD(2) */ }; static asn_INTEGER_specifics_t asn_SPC_PositionMethod_specs_1 = { asn_MAP_PositionMethod_value2enum_1, /* "tag" => N; sorted by tag */ asn_MAP_PositionMethod_enum2value_1, /* N => "tag"; sorted by N */ 3, /* Number of elements in the maps */ 0, /* Enumeration is not extensible */ 1, /* Strict enumeration */ 0, /* Native long size */ 0 }; static ber_tlv_tag_t asn_DEF_PositionMethod_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; asn_TYPE_descriptor_t asn_DEF_PositionMethod = { "PositionMethod", "PositionMethod", PositionMethod_free, PositionMethod_print, PositionMethod_constraint, PositionMethod_decode_ber, PositionMethod_encode_der, PositionMethod_decode_xer, PositionMethod_encode_xer, PositionMethod_decode_uper, PositionMethod_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_PositionMethod_tags_1, sizeof(asn_DEF_PositionMethod_tags_1) /sizeof(asn_DEF_PositionMethod_tags_1[0]), /* 1 */ asn_DEF_PositionMethod_tags_1, /* Same as above */ sizeof(asn_DEF_PositionMethod_tags_1) /sizeof(asn_DEF_PositionMethod_tags_1[0]), /* 1 */ &asn_PER_type_PositionMethod_constr_1, 0, 0, /* Defined elsewhere */ &asn_SPC_PositionMethod_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/PositionMethod.h000066400000000000000000000021251305042567700236000ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _PositionMethod_H_ #define _PositionMethod_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum PositionMethod { PositionMethod_eotd = 0, PositionMethod_gps = 1, PositionMethod_gpsOrEOTD = 2 } e_PositionMethod; /* PositionMethod */ typedef ENUMERATED_t PositionMethod_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_PositionMethod; asn_struct_free_f PositionMethod_free; asn_struct_print_f PositionMethod_print; asn_constr_check_f PositionMethod_constraint; ber_type_decoder_f PositionMethod_decode_ber; der_type_encoder_f PositionMethod_encode_der; xer_type_decoder_f PositionMethod_decode_xer; xer_type_encoder_f PositionMethod_encode_xer; per_type_decoder_f PositionMethod_decode_uper; per_type_encoder_f PositionMethod_encode_uper; #ifdef __cplusplus } #endif #endif /* _PositionMethod_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ProtocolError.c000066400000000000000000000052251305042567700234450ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "ProtocolError.h" static asn_TYPE_member_t asn_MBR_ProtocolError_1[] = { { ATF_NOFLAGS, 0, offsetof(struct ProtocolError, errorCause), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_ErrorCodes, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "errorCause" }, { ATF_POINTER, 2, offsetof(struct ProtocolError, extensionContainer), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_ExtensionContainer, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "extensionContainer" }, { ATF_POINTER, 1, offsetof(struct ProtocolError, rel_5_ProtocolError_Extension), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Rel_5_ProtocolError_Extension, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "rel-5-ProtocolError-Extension" }, }; static int asn_MAP_ProtocolError_oms_1[] = { 1, 2 }; static ber_tlv_tag_t asn_DEF_ProtocolError_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_ProtocolError_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* errorCause at 96 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* extensionContainer at 97 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* rel-5-ProtocolError-Extension at 100 */ }; static asn_SEQUENCE_specifics_t asn_SPC_ProtocolError_specs_1 = { sizeof(struct ProtocolError), offsetof(struct ProtocolError, _asn_ctx), asn_MAP_ProtocolError_tag2el_1, 3, /* Count of tags in the map */ asn_MAP_ProtocolError_oms_1, /* Optional members */ 1, 1, /* Root/Additions */ 1, /* Start extensions */ 4 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_ProtocolError = { "ProtocolError", "ProtocolError", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_ProtocolError_tags_1, sizeof(asn_DEF_ProtocolError_tags_1) /sizeof(asn_DEF_ProtocolError_tags_1[0]), /* 1 */ asn_DEF_ProtocolError_tags_1, /* Same as above */ sizeof(asn_DEF_ProtocolError_tags_1) /sizeof(asn_DEF_ProtocolError_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_ProtocolError_1, 3, /* Elements count */ &asn_SPC_ProtocolError_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ProtocolError.h000066400000000000000000000020751305042567700234520ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _ProtocolError_H_ #define _ProtocolError_H_ #include /* Including external dependencies */ #include "ErrorCodes.h" #include "ExtensionContainer.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct Rel_5_ProtocolError_Extension; /* ProtocolError */ typedef struct ProtocolError { ErrorCodes_t errorCause; ExtensionContainer_t *extensionContainer /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ struct Rel_5_ProtocolError_Extension *rel_5_ProtocolError_Extension /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } ProtocolError_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_ProtocolError; #ifdef __cplusplus } #endif /* Referred external types */ #include "Rel-5-ProtocolError-Extension.h" #endif /* _ProtocolError_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/RRLP-Component.c000066400000000000000000000064001305042567700233450ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Messages" * found in "../rrlp-messages.asn" */ #include "RRLP-Component.h" static asn_per_constraints_t asn_PER_type_RRLP_Component_constr_1 = { { APC_CONSTRAINED | APC_EXTENSIBLE, 3, 3, 0, 4 } /* (0..4,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_RRLP_Component_1[] = { { ATF_NOFLAGS, 0, offsetof(struct RRLP_Component, choice.msrPositionReq), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_MsrPosition_Req, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "msrPositionReq" }, { ATF_NOFLAGS, 0, offsetof(struct RRLP_Component, choice.msrPositionRsp), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_MsrPosition_Rsp, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "msrPositionRsp" }, { ATF_NOFLAGS, 0, offsetof(struct RRLP_Component, choice.assistanceData), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_AssistanceData, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "assistanceData" }, { ATF_NOFLAGS, 0, offsetof(struct RRLP_Component, choice.assistanceDataAck), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NULL, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "assistanceDataAck" }, { ATF_NOFLAGS, 0, offsetof(struct RRLP_Component, choice.protocolError), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_ProtocolError, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "protocolError" }, }; static asn_TYPE_tag2member_t asn_MAP_RRLP_Component_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* msrPositionReq at 21 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* msrPositionRsp at 22 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* assistanceData at 23 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* assistanceDataAck at 24 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* protocolError at 25 */ }; static asn_CHOICE_specifics_t asn_SPC_RRLP_Component_specs_1 = { sizeof(struct RRLP_Component), offsetof(struct RRLP_Component, _asn_ctx), offsetof(struct RRLP_Component, present), sizeof(((struct RRLP_Component *)0)->present), asn_MAP_RRLP_Component_tag2el_1, 5, /* Count of tags in the map */ 0, 5 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_RRLP_Component = { "RRLP-Component", "RRLP-Component", CHOICE_free, CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_decode_uper, CHOICE_encode_uper, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ &asn_PER_type_RRLP_Component_constr_1, asn_MBR_RRLP_Component_1, 5, /* Elements count */ &asn_SPC_RRLP_Component_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/RRLP-Component.h000066400000000000000000000026351305042567700233600ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Messages" * found in "../rrlp-messages.asn" */ #ifndef _RRLP_Component_H_ #define _RRLP_Component_H_ #include /* Including external dependencies */ #include "MsrPosition-Req.h" #include "MsrPosition-Rsp.h" #include "AssistanceData.h" #include #include "ProtocolError.h" #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum RRLP_Component_PR { RRLP_Component_PR_NOTHING, /* No components present */ RRLP_Component_PR_msrPositionReq, RRLP_Component_PR_msrPositionRsp, RRLP_Component_PR_assistanceData, RRLP_Component_PR_assistanceDataAck, RRLP_Component_PR_protocolError, /* Extensions may appear below */ } RRLP_Component_PR; /* RRLP-Component */ typedef struct RRLP_Component { RRLP_Component_PR present; union RRLP_Component_u { MsrPosition_Req_t msrPositionReq; MsrPosition_Rsp_t msrPositionRsp; AssistanceData_t assistanceData; NULL_t assistanceDataAck; ProtocolError_t protocolError; /* * This type is extensible, * possible extensions are below. */ } choice; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } RRLP_Component_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_RRLP_Component; #ifdef __cplusplus } #endif #endif /* _RRLP_Component_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/RefLocation.c000066400000000000000000000033651305042567700230420ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "RefLocation.h" static asn_TYPE_member_t asn_MBR_RefLocation_1[] = { { ATF_NOFLAGS, 0, offsetof(struct RefLocation, threeDLocation), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Ext_GeographicalInformation, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "threeDLocation" }, }; static ber_tlv_tag_t asn_DEF_RefLocation_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_RefLocation_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* threeDLocation at 650 */ }; static asn_SEQUENCE_specifics_t asn_SPC_RefLocation_specs_1 = { sizeof(struct RefLocation), offsetof(struct RefLocation, _asn_ctx), asn_MAP_RefLocation_tag2el_1, 1, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_RefLocation = { "RefLocation", "RefLocation", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_RefLocation_tags_1, sizeof(asn_DEF_RefLocation_tags_1) /sizeof(asn_DEF_RefLocation_tags_1[0]), /* 1 */ asn_DEF_RefLocation_tags_1, /* Same as above */ sizeof(asn_DEF_RefLocation_tags_1) /sizeof(asn_DEF_RefLocation_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_RefLocation_1, 1, /* Elements count */ &asn_SPC_RefLocation_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/RefLocation.h000066400000000000000000000013211305042567700230350ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _RefLocation_H_ #define _RefLocation_H_ #include /* Including external dependencies */ #include "Ext-GeographicalInformation.h" #include #ifdef __cplusplus extern "C" { #endif /* RefLocation */ typedef struct RefLocation { Ext_GeographicalInformation_t threeDLocation; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } RefLocation_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_RefLocation; #ifdef __cplusplus } #endif #endif /* _RefLocation_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/RefQuality.c000066400000000000000000000110761305042567700227200ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "RefQuality.h" int RefQuality_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 31)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void RefQuality_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void RefQuality_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { RefQuality_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int RefQuality_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { RefQuality_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t RefQuality_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { RefQuality_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t RefQuality_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { RefQuality_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t RefQuality_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { RefQuality_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t RefQuality_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { RefQuality_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t RefQuality_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { RefQuality_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t RefQuality_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { RefQuality_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_RefQuality_constr_1 = { { APC_CONSTRAINED, 5, 5, 0, 31 } /* (0..31) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_RefQuality_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_RefQuality = { "RefQuality", "RefQuality", RefQuality_free, RefQuality_print, RefQuality_constraint, RefQuality_decode_ber, RefQuality_encode_der, RefQuality_decode_xer, RefQuality_encode_xer, RefQuality_decode_uper, RefQuality_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_RefQuality_tags_1, sizeof(asn_DEF_RefQuality_tags_1) /sizeof(asn_DEF_RefQuality_tags_1[0]), /* 1 */ asn_DEF_RefQuality_tags_1, /* Same as above */ sizeof(asn_DEF_RefQuality_tags_1) /sizeof(asn_DEF_RefQuality_tags_1[0]), /* 1 */ &asn_PER_type_RefQuality_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/RefQuality.h000066400000000000000000000015751305042567700227300ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _RefQuality_H_ #define _RefQuality_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* RefQuality */ typedef long RefQuality_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_RefQuality; asn_struct_free_f RefQuality_free; asn_struct_print_f RefQuality_print; asn_constr_check_f RefQuality_constraint; ber_type_decoder_f RefQuality_decode_ber; der_type_encoder_f RefQuality_encode_der; xer_type_decoder_f RefQuality_decode_xer; xer_type_encoder_f RefQuality_encode_xer; per_type_decoder_f RefQuality_decode_uper; per_type_encoder_f RefQuality_encode_uper; #ifdef __cplusplus } #endif #endif /* _RefQuality_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ReferenceAssistData.c000066400000000000000000000060531305042567700245110ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "ReferenceAssistData.h" static asn_TYPE_member_t asn_MBR_ReferenceAssistData_1[] = { { ATF_NOFLAGS, 0, offsetof(struct ReferenceAssistData, bcchCarrier), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BCCHCarrier, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "bcchCarrier" }, { ATF_NOFLAGS, 0, offsetof(struct ReferenceAssistData, bsic), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BSIC, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "bsic" }, { ATF_NOFLAGS, 0, offsetof(struct ReferenceAssistData, timeSlotScheme), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_TimeSlotScheme, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "timeSlotScheme" }, { ATF_POINTER, 1, offsetof(struct ReferenceAssistData, btsPosition), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BTSPosition, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "btsPosition" }, }; static int asn_MAP_ReferenceAssistData_oms_1[] = { 3 }; static ber_tlv_tag_t asn_DEF_ReferenceAssistData_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_ReferenceAssistData_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* bcchCarrier at 157 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* bsic at 158 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* timeSlotScheme at 159 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* btsPosition at 160 */ }; static asn_SEQUENCE_specifics_t asn_SPC_ReferenceAssistData_specs_1 = { sizeof(struct ReferenceAssistData), offsetof(struct ReferenceAssistData, _asn_ctx), asn_MAP_ReferenceAssistData_tag2el_1, 4, /* Count of tags in the map */ asn_MAP_ReferenceAssistData_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_ReferenceAssistData = { "ReferenceAssistData", "ReferenceAssistData", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_ReferenceAssistData_tags_1, sizeof(asn_DEF_ReferenceAssistData_tags_1) /sizeof(asn_DEF_ReferenceAssistData_tags_1[0]), /* 1 */ asn_DEF_ReferenceAssistData_tags_1, /* Same as above */ sizeof(asn_DEF_ReferenceAssistData_tags_1) /sizeof(asn_DEF_ReferenceAssistData_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_ReferenceAssistData_1, 4, /* Elements count */ &asn_SPC_ReferenceAssistData_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ReferenceAssistData.h000066400000000000000000000016131305042567700245130ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _ReferenceAssistData_H_ #define _ReferenceAssistData_H_ #include /* Including external dependencies */ #include "BCCHCarrier.h" #include "BSIC.h" #include "TimeSlotScheme.h" #include "BTSPosition.h" #include #ifdef __cplusplus extern "C" { #endif /* ReferenceAssistData */ typedef struct ReferenceAssistData { BCCHCarrier_t bcchCarrier; BSIC_t bsic; TimeSlotScheme_t timeSlotScheme; BTSPosition_t *btsPosition /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } ReferenceAssistData_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_ReferenceAssistData; #ifdef __cplusplus } #endif #endif /* _ReferenceAssistData_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ReferenceFrame.c000066400000000000000000000072101305042567700234770ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "ReferenceFrame.h" static int memb_referenceFN_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 65535)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_referenceFNMSB_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 63)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_referenceFN_constr_2 = { { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_referenceFNMSB_constr_3 = { { APC_CONSTRAINED, 6, 6, 0, 63 } /* (0..63) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_ReferenceFrame_1[] = { { ATF_NOFLAGS, 0, offsetof(struct ReferenceFrame, referenceFN), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_referenceFN_constraint_1, &asn_PER_memb_referenceFN_constr_2, 0, "referenceFN" }, { ATF_POINTER, 1, offsetof(struct ReferenceFrame, referenceFNMSB), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_referenceFNMSB_constraint_1, &asn_PER_memb_referenceFNMSB_constr_3, 0, "referenceFNMSB" }, }; static int asn_MAP_ReferenceFrame_oms_1[] = { 1 }; static ber_tlv_tag_t asn_DEF_ReferenceFrame_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_ReferenceFrame_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* referenceFN at 1438 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* referenceFNMSB at 1440 */ }; static asn_SEQUENCE_specifics_t asn_SPC_ReferenceFrame_specs_1 = { sizeof(struct ReferenceFrame), offsetof(struct ReferenceFrame, _asn_ctx), asn_MAP_ReferenceFrame_tag2el_1, 2, /* Count of tags in the map */ asn_MAP_ReferenceFrame_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_ReferenceFrame = { "ReferenceFrame", "ReferenceFrame", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_ReferenceFrame_tags_1, sizeof(asn_DEF_ReferenceFrame_tags_1) /sizeof(asn_DEF_ReferenceFrame_tags_1[0]), /* 1 */ asn_DEF_ReferenceFrame_tags_1, /* Same as above */ sizeof(asn_DEF_ReferenceFrame_tags_1) /sizeof(asn_DEF_ReferenceFrame_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_ReferenceFrame_1, 2, /* Elements count */ &asn_SPC_ReferenceFrame_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ReferenceFrame.h000066400000000000000000000013421305042567700235040ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _ReferenceFrame_H_ #define _ReferenceFrame_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* ReferenceFrame */ typedef struct ReferenceFrame { long referenceFN; long *referenceFNMSB /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } ReferenceFrame_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_ReferenceFrame; #ifdef __cplusplus } #endif #endif /* _ReferenceFrame_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ReferenceIdentity.c000066400000000000000000000035401305042567700242400ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "ReferenceIdentity.h" static asn_TYPE_member_t asn_MBR_ReferenceIdentity_1[] = { { ATF_NOFLAGS, 0, offsetof(struct ReferenceIdentity, refBTSList), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfReferenceIdentityType, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "refBTSList" }, }; static ber_tlv_tag_t asn_DEF_ReferenceIdentity_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_ReferenceIdentity_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* refBTSList at 289 */ }; static asn_SEQUENCE_specifics_t asn_SPC_ReferenceIdentity_specs_1 = { sizeof(struct ReferenceIdentity), offsetof(struct ReferenceIdentity, _asn_ctx), asn_MAP_ReferenceIdentity_tag2el_1, 1, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_ReferenceIdentity = { "ReferenceIdentity", "ReferenceIdentity", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_ReferenceIdentity_tags_1, sizeof(asn_DEF_ReferenceIdentity_tags_1) /sizeof(asn_DEF_ReferenceIdentity_tags_1[0]), /* 1 */ asn_DEF_ReferenceIdentity_tags_1, /* Same as above */ sizeof(asn_DEF_ReferenceIdentity_tags_1) /sizeof(asn_DEF_ReferenceIdentity_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_ReferenceIdentity_1, 1, /* Elements count */ &asn_SPC_ReferenceIdentity_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ReferenceIdentity.h000066400000000000000000000013651305042567700242500ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _ReferenceIdentity_H_ #define _ReferenceIdentity_H_ #include /* Including external dependencies */ #include "SeqOfReferenceIdentityType.h" #include #ifdef __cplusplus extern "C" { #endif /* ReferenceIdentity */ typedef struct ReferenceIdentity { SeqOfReferenceIdentityType_t refBTSList; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } ReferenceIdentity_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_ReferenceIdentity; #ifdef __cplusplus } #endif #endif /* _ReferenceIdentity_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ReferenceIdentityType.c000066400000000000000000000065071305042567700251100ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "ReferenceIdentityType.h" static asn_per_constraints_t asn_PER_type_ReferenceIdentityType_constr_1 = { { APC_CONSTRAINED, 3, 3, 0, 4 } /* (0..4) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_ReferenceIdentityType_1[] = { { ATF_NOFLAGS, 0, offsetof(struct ReferenceIdentityType, choice.bsicAndCarrier), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BSICAndCarrier, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "bsicAndCarrier" }, { ATF_NOFLAGS, 0, offsetof(struct ReferenceIdentityType, choice.ci), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_CellID, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ci" }, { ATF_NOFLAGS, 0, offsetof(struct ReferenceIdentityType, choice.requestIndex), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_RequestIndex, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "requestIndex" }, { ATF_NOFLAGS, 0, offsetof(struct ReferenceIdentityType, choice.systemInfoIndex), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SystemInfoIndex, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "systemInfoIndex" }, { ATF_NOFLAGS, 0, offsetof(struct ReferenceIdentityType, choice.ciAndLAC), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_CellIDAndLAC, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ciAndLAC" }, }; static asn_TYPE_tag2member_t asn_MAP_ReferenceIdentityType_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* bsicAndCarrier at 294 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ci at 295 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* requestIndex at 296 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* systemInfoIndex at 297 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* ciAndLAC at 301 */ }; static asn_CHOICE_specifics_t asn_SPC_ReferenceIdentityType_specs_1 = { sizeof(struct ReferenceIdentityType), offsetof(struct ReferenceIdentityType, _asn_ctx), offsetof(struct ReferenceIdentityType, present), sizeof(((struct ReferenceIdentityType *)0)->present), asn_MAP_ReferenceIdentityType_tag2el_1, 5, /* Count of tags in the map */ 0, -1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_ReferenceIdentityType = { "ReferenceIdentityType", "ReferenceIdentityType", CHOICE_free, CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_decode_uper, CHOICE_encode_uper, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ &asn_PER_type_ReferenceIdentityType_constr_1, asn_MBR_ReferenceIdentityType_1, 5, /* Elements count */ &asn_SPC_ReferenceIdentityType_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ReferenceIdentityType.h000066400000000000000000000025671305042567700251170ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _ReferenceIdentityType_H_ #define _ReferenceIdentityType_H_ #include /* Including external dependencies */ #include "BSICAndCarrier.h" #include "CellID.h" #include "RequestIndex.h" #include "SystemInfoIndex.h" #include "CellIDAndLAC.h" #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum ReferenceIdentityType_PR { ReferenceIdentityType_PR_NOTHING, /* No components present */ ReferenceIdentityType_PR_bsicAndCarrier, ReferenceIdentityType_PR_ci, ReferenceIdentityType_PR_requestIndex, ReferenceIdentityType_PR_systemInfoIndex, ReferenceIdentityType_PR_ciAndLAC } ReferenceIdentityType_PR; /* ReferenceIdentityType */ typedef struct ReferenceIdentityType { ReferenceIdentityType_PR present; union ReferenceIdentityType_u { BSICAndCarrier_t bsicAndCarrier; CellID_t ci; RequestIndex_t requestIndex; SystemInfoIndex_t systemInfoIndex; CellIDAndLAC_t ciAndLAC; } choice; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } ReferenceIdentityType_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_ReferenceIdentityType; #ifdef __cplusplus } #endif #endif /* _ReferenceIdentityType_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ReferenceRelation.c000066400000000000000000000125171305042567700242300ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "ReferenceRelation.h" int ReferenceRelation_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { /* Replace with underlying type checker */ td->check_constraints = asn_DEF_ENUMERATED.check_constraints; return td->check_constraints(td, sptr, ctfailcb, app_key); } /* * This type is implemented using ENUMERATED, * so here we adjust the DEF accordingly. */ static void ReferenceRelation_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_ENUMERATED.free_struct; td->print_struct = asn_DEF_ENUMERATED.print_struct; td->ber_decoder = asn_DEF_ENUMERATED.ber_decoder; td->der_encoder = asn_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; td->uper_encoder = asn_DEF_ENUMERATED.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_ENUMERATED.per_constraints; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ } void ReferenceRelation_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { ReferenceRelation_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int ReferenceRelation_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { ReferenceRelation_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t ReferenceRelation_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { ReferenceRelation_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t ReferenceRelation_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { ReferenceRelation_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t ReferenceRelation_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { ReferenceRelation_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t ReferenceRelation_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { ReferenceRelation_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t ReferenceRelation_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { ReferenceRelation_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t ReferenceRelation_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { ReferenceRelation_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_ReferenceRelation_constr_1 = { { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_INTEGER_enum_map_t asn_MAP_ReferenceRelation_value2enum_1[] = { { 0, 17, "secondBTSThirdSet" }, { 1, 18, "secondBTSSecondSet" }, { 2, 16, "firstBTSFirstSet" } }; static unsigned int asn_MAP_ReferenceRelation_enum2value_1[] = { 2, /* firstBTSFirstSet(2) */ 1, /* secondBTSSecondSet(1) */ 0 /* secondBTSThirdSet(0) */ }; static asn_INTEGER_specifics_t asn_SPC_ReferenceRelation_specs_1 = { asn_MAP_ReferenceRelation_value2enum_1, /* "tag" => N; sorted by tag */ asn_MAP_ReferenceRelation_enum2value_1, /* N => "tag"; sorted by N */ 3, /* Number of elements in the maps */ 0, /* Enumeration is not extensible */ 1, /* Strict enumeration */ 0, /* Native long size */ 0 }; static ber_tlv_tag_t asn_DEF_ReferenceRelation_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; asn_TYPE_descriptor_t asn_DEF_ReferenceRelation = { "ReferenceRelation", "ReferenceRelation", ReferenceRelation_free, ReferenceRelation_print, ReferenceRelation_constraint, ReferenceRelation_decode_ber, ReferenceRelation_encode_der, ReferenceRelation_decode_xer, ReferenceRelation_encode_xer, ReferenceRelation_decode_uper, ReferenceRelation_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_ReferenceRelation_tags_1, sizeof(asn_DEF_ReferenceRelation_tags_1) /sizeof(asn_DEF_ReferenceRelation_tags_1[0]), /* 1 */ asn_DEF_ReferenceRelation_tags_1, /* Same as above */ sizeof(asn_DEF_ReferenceRelation_tags_1) /sizeof(asn_DEF_ReferenceRelation_tags_1[0]), /* 1 */ &asn_PER_type_ReferenceRelation_constr_1, 0, 0, /* Defined elsewhere */ &asn_SPC_ReferenceRelation_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ReferenceRelation.h000066400000000000000000000022641305042567700242330ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _ReferenceRelation_H_ #define _ReferenceRelation_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum ReferenceRelation { ReferenceRelation_secondBTSThirdSet = 0, ReferenceRelation_secondBTSSecondSet = 1, ReferenceRelation_firstBTSFirstSet = 2 } e_ReferenceRelation; /* ReferenceRelation */ typedef ENUMERATED_t ReferenceRelation_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_ReferenceRelation; asn_struct_free_f ReferenceRelation_free; asn_struct_print_f ReferenceRelation_print; asn_constr_check_f ReferenceRelation_constraint; ber_type_decoder_f ReferenceRelation_decode_ber; der_type_encoder_f ReferenceRelation_encode_der; xer_type_decoder_f ReferenceRelation_decode_xer; xer_type_encoder_f ReferenceRelation_encode_xer; per_type_decoder_f ReferenceRelation_decode_uper; per_type_encoder_f ReferenceRelation_encode_uper; #ifdef __cplusplus } #endif #endif /* _ReferenceRelation_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ReferenceTime.c000066400000000000000000000050351305042567700233460ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "ReferenceTime.h" static asn_TYPE_member_t asn_MBR_ReferenceTime_1[] = { { ATF_NOFLAGS, 0, offsetof(struct ReferenceTime, gpsTime), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GPSTime, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "gpsTime" }, { ATF_POINTER, 2, offsetof(struct ReferenceTime, gsmTime), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GSMTime, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "gsmTime" }, { ATF_POINTER, 1, offsetof(struct ReferenceTime, gpsTowAssist), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GPSTOWAssist, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "gpsTowAssist" }, }; static int asn_MAP_ReferenceTime_oms_1[] = { 1, 2 }; static ber_tlv_tag_t asn_DEF_ReferenceTime_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_ReferenceTime_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* gpsTime at 586 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* gsmTime at 587 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* gpsTowAssist at 588 */ }; static asn_SEQUENCE_specifics_t asn_SPC_ReferenceTime_specs_1 = { sizeof(struct ReferenceTime), offsetof(struct ReferenceTime, _asn_ctx), asn_MAP_ReferenceTime_tag2el_1, 3, /* Count of tags in the map */ asn_MAP_ReferenceTime_oms_1, /* Optional members */ 2, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_ReferenceTime = { "ReferenceTime", "ReferenceTime", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_ReferenceTime_tags_1, sizeof(asn_DEF_ReferenceTime_tags_1) /sizeof(asn_DEF_ReferenceTime_tags_1[0]), /* 1 */ asn_DEF_ReferenceTime_tags_1, /* Same as above */ sizeof(asn_DEF_ReferenceTime_tags_1) /sizeof(asn_DEF_ReferenceTime_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_ReferenceTime_1, 3, /* Elements count */ &asn_SPC_ReferenceTime_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ReferenceTime.h000066400000000000000000000016331305042567700233530ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _ReferenceTime_H_ #define _ReferenceTime_H_ #include /* Including external dependencies */ #include "GPSTime.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct GSMTime; struct GPSTOWAssist; /* ReferenceTime */ typedef struct ReferenceTime { GPSTime_t gpsTime; struct GSMTime *gsmTime /* OPTIONAL */; struct GPSTOWAssist *gpsTowAssist /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } ReferenceTime_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_ReferenceTime; #ifdef __cplusplus } #endif /* Referred external types */ #include "GSMTime.h" #include "GPSTOWAssist.h" #endif /* _ReferenceTime_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ReferenceWGS84.c000066400000000000000000000051271305042567700232660ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "ReferenceWGS84.h" static asn_TYPE_member_t asn_MBR_ReferenceWGS84_1[] = { { ATF_NOFLAGS, 0, offsetof(struct ReferenceWGS84, relativeNorth), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_RelDistance, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "relativeNorth" }, { ATF_NOFLAGS, 0, offsetof(struct ReferenceWGS84, relativeEast), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_RelDistance, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "relativeEast" }, { ATF_POINTER, 1, offsetof(struct ReferenceWGS84, relativeAlt), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_RelativeAlt, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "relativeAlt" }, }; static int asn_MAP_ReferenceWGS84_oms_1[] = { 2 }; static ber_tlv_tag_t asn_DEF_ReferenceWGS84_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_ReferenceWGS84_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* relativeNorth at 247 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* relativeEast at 248 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* relativeAlt at 250 */ }; static asn_SEQUENCE_specifics_t asn_SPC_ReferenceWGS84_specs_1 = { sizeof(struct ReferenceWGS84), offsetof(struct ReferenceWGS84, _asn_ctx), asn_MAP_ReferenceWGS84_tag2el_1, 3, /* Count of tags in the map */ asn_MAP_ReferenceWGS84_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_ReferenceWGS84 = { "ReferenceWGS84", "ReferenceWGS84", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_ReferenceWGS84_tags_1, sizeof(asn_DEF_ReferenceWGS84_tags_1) /sizeof(asn_DEF_ReferenceWGS84_tags_1[0]), /* 1 */ asn_DEF_ReferenceWGS84_tags_1, /* Same as above */ sizeof(asn_DEF_ReferenceWGS84_tags_1) /sizeof(asn_DEF_ReferenceWGS84_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_ReferenceWGS84_1, 3, /* Elements count */ &asn_SPC_ReferenceWGS84_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ReferenceWGS84.h000066400000000000000000000014501305042567700232660ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _ReferenceWGS84_H_ #define _ReferenceWGS84_H_ #include /* Including external dependencies */ #include "RelDistance.h" #include "RelativeAlt.h" #include #ifdef __cplusplus extern "C" { #endif /* ReferenceWGS84 */ typedef struct ReferenceWGS84 { RelDistance_t relativeNorth; RelDistance_t relativeEast; RelativeAlt_t *relativeAlt /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } ReferenceWGS84_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_ReferenceWGS84; #ifdef __cplusplus } #endif #endif /* _ReferenceWGS84_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Rel-5-MsrPosition-Rsp-Extension.c000066400000000000000000000060721305042567700265170ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "Rel-5-MsrPosition-Rsp-Extension.h" static asn_TYPE_member_t asn_MBR_Rel_5_MsrPosition_Rsp_Extension_1[] = { { ATF_POINTER, 3, offsetof(struct Rel_5_MsrPosition_Rsp_Extension, extended_reference), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Extended_reference, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "extended-reference" }, { ATF_POINTER, 2, offsetof(struct Rel_5_MsrPosition_Rsp_Extension, otd_MeasureInfo_5_Ext), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_OTD_MeasureInfo_5_Ext, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "otd-MeasureInfo-5-Ext" }, { ATF_POINTER, 1, offsetof(struct Rel_5_MsrPosition_Rsp_Extension, ulPseudoSegInd), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_UlPseudoSegInd, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ulPseudoSegInd" }, }; static int asn_MAP_Rel_5_MsrPosition_Rsp_Extension_oms_1[] = { 0, 1, 2 }; static ber_tlv_tag_t asn_DEF_Rel_5_MsrPosition_Rsp_Extension_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_Rel_5_MsrPosition_Rsp_Extension_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* extended-reference at 985 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* otd-MeasureInfo-5-Ext at 991 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* ulPseudoSegInd at 992 */ }; static asn_SEQUENCE_specifics_t asn_SPC_Rel_5_MsrPosition_Rsp_Extension_specs_1 = { sizeof(struct Rel_5_MsrPosition_Rsp_Extension), offsetof(struct Rel_5_MsrPosition_Rsp_Extension, _asn_ctx), asn_MAP_Rel_5_MsrPosition_Rsp_Extension_tag2el_1, 3, /* Count of tags in the map */ asn_MAP_Rel_5_MsrPosition_Rsp_Extension_oms_1, /* Optional members */ 3, 0, /* Root/Additions */ 2, /* Start extensions */ 4 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Rel_5_MsrPosition_Rsp_Extension = { "Rel-5-MsrPosition-Rsp-Extension", "Rel-5-MsrPosition-Rsp-Extension", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_Rel_5_MsrPosition_Rsp_Extension_tags_1, sizeof(asn_DEF_Rel_5_MsrPosition_Rsp_Extension_tags_1) /sizeof(asn_DEF_Rel_5_MsrPosition_Rsp_Extension_tags_1[0]), /* 1 */ asn_DEF_Rel_5_MsrPosition_Rsp_Extension_tags_1, /* Same as above */ sizeof(asn_DEF_Rel_5_MsrPosition_Rsp_Extension_tags_1) /sizeof(asn_DEF_Rel_5_MsrPosition_Rsp_Extension_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_Rel_5_MsrPosition_Rsp_Extension_1, 3, /* Elements count */ &asn_SPC_Rel_5_MsrPosition_Rsp_Extension_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Rel-5-MsrPosition-Rsp-Extension.h000066400000000000000000000023321305042567700265170ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _Rel_5_MsrPosition_Rsp_Extension_H_ #define _Rel_5_MsrPosition_Rsp_Extension_H_ #include /* Including external dependencies */ #include "UlPseudoSegInd.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct Extended_reference; struct SeqOfOTD_MsrElementRest; /* Rel-5-MsrPosition-Rsp-Extension */ typedef struct Rel_5_MsrPosition_Rsp_Extension { struct Extended_reference *extended_reference /* OPTIONAL */; struct SeqOfOTD_MsrElementRest *otd_MeasureInfo_5_Ext /* OPTIONAL */; UlPseudoSegInd_t *ulPseudoSegInd /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } Rel_5_MsrPosition_Rsp_Extension_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Rel_5_MsrPosition_Rsp_Extension; #ifdef __cplusplus } #endif /* Referred external types */ #include "Extended-reference.h" #include "OTD-MeasureInfo-5-Ext.h" #endif /* _Rel_5_MsrPosition_Rsp_Extension_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Rel-5-ProtocolError-Extension.c000066400000000000000000000043231305042567700262770ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "Rel-5-ProtocolError-Extension.h" static asn_TYPE_member_t asn_MBR_Rel_5_ProtocolError_Extension_1[] = { { ATF_POINTER, 1, offsetof(struct Rel_5_ProtocolError_Extension, extended_reference), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Extended_reference, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "extended-reference" }, }; static int asn_MAP_Rel_5_ProtocolError_Extension_oms_1[] = { 0 }; static ber_tlv_tag_t asn_DEF_Rel_5_ProtocolError_Extension_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_Rel_5_ProtocolError_Extension_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* extended-reference at 1030 */ }; static asn_SEQUENCE_specifics_t asn_SPC_Rel_5_ProtocolError_Extension_specs_1 = { sizeof(struct Rel_5_ProtocolError_Extension), offsetof(struct Rel_5_ProtocolError_Extension, _asn_ctx), asn_MAP_Rel_5_ProtocolError_Extension_tag2el_1, 1, /* Count of tags in the map */ asn_MAP_Rel_5_ProtocolError_Extension_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ 0, /* Start extensions */ 2 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Rel_5_ProtocolError_Extension = { "Rel-5-ProtocolError-Extension", "Rel-5-ProtocolError-Extension", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_Rel_5_ProtocolError_Extension_tags_1, sizeof(asn_DEF_Rel_5_ProtocolError_Extension_tags_1) /sizeof(asn_DEF_Rel_5_ProtocolError_Extension_tags_1[0]), /* 1 */ asn_DEF_Rel_5_ProtocolError_Extension_tags_1, /* Same as above */ sizeof(asn_DEF_Rel_5_ProtocolError_Extension_tags_1) /sizeof(asn_DEF_Rel_5_ProtocolError_Extension_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_Rel_5_ProtocolError_Extension_1, 1, /* Elements count */ &asn_SPC_Rel_5_ProtocolError_Extension_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Rel-5-ProtocolError-Extension.h000066400000000000000000000017641305042567700263120ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _Rel_5_ProtocolError_Extension_H_ #define _Rel_5_ProtocolError_Extension_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct Extended_reference; /* Rel-5-ProtocolError-Extension */ typedef struct Rel_5_ProtocolError_Extension { struct Extended_reference *extended_reference /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } Rel_5_ProtocolError_Extension_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Rel_5_ProtocolError_Extension; #ifdef __cplusplus } #endif /* Referred external types */ #include "Extended-reference.h" #endif /* _Rel_5_ProtocolError_Extension_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Rel-7-MsrPosition-Rsp-Extension.c000066400000000000000000000060361305042567700265210ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "Rel-7-MsrPosition-Rsp-Extension.h" static asn_TYPE_member_t asn_MBR_Rel_7_MsrPosition_Rsp_Extension_1[] = { { ATF_POINTER, 3, offsetof(struct Rel_7_MsrPosition_Rsp_Extension, velEstimate), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_VelocityEstimate, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "velEstimate" }, { ATF_POINTER, 2, offsetof(struct Rel_7_MsrPosition_Rsp_Extension, ganssLocationInfo), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSSLocationInfo, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssLocationInfo" }, { ATF_POINTER, 1, offsetof(struct Rel_7_MsrPosition_Rsp_Extension, ganssMeasureInfo), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSSMeasureInfo, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssMeasureInfo" }, }; static int asn_MAP_Rel_7_MsrPosition_Rsp_Extension_oms_1[] = { 0, 1, 2 }; static ber_tlv_tag_t asn_DEF_Rel_7_MsrPosition_Rsp_Extension_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_Rel_7_MsrPosition_Rsp_Extension_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* velEstimate at 1397 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ganssLocationInfo at 1402 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* ganssMeasureInfo at 1403 */ }; static asn_SEQUENCE_specifics_t asn_SPC_Rel_7_MsrPosition_Rsp_Extension_specs_1 = { sizeof(struct Rel_7_MsrPosition_Rsp_Extension), offsetof(struct Rel_7_MsrPosition_Rsp_Extension, _asn_ctx), asn_MAP_Rel_7_MsrPosition_Rsp_Extension_tag2el_1, 3, /* Count of tags in the map */ asn_MAP_Rel_7_MsrPosition_Rsp_Extension_oms_1, /* Optional members */ 3, 0, /* Root/Additions */ 2, /* Start extensions */ 4 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Rel_7_MsrPosition_Rsp_Extension = { "Rel-7-MsrPosition-Rsp-Extension", "Rel-7-MsrPosition-Rsp-Extension", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_Rel_7_MsrPosition_Rsp_Extension_tags_1, sizeof(asn_DEF_Rel_7_MsrPosition_Rsp_Extension_tags_1) /sizeof(asn_DEF_Rel_7_MsrPosition_Rsp_Extension_tags_1[0]), /* 1 */ asn_DEF_Rel_7_MsrPosition_Rsp_Extension_tags_1, /* Same as above */ sizeof(asn_DEF_Rel_7_MsrPosition_Rsp_Extension_tags_1) /sizeof(asn_DEF_Rel_7_MsrPosition_Rsp_Extension_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_Rel_7_MsrPosition_Rsp_Extension_1, 3, /* Elements count */ &asn_SPC_Rel_7_MsrPosition_Rsp_Extension_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Rel-7-MsrPosition-Rsp-Extension.h000066400000000000000000000022771305042567700265310ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _Rel_7_MsrPosition_Rsp_Extension_H_ #define _Rel_7_MsrPosition_Rsp_Extension_H_ #include /* Including external dependencies */ #include "VelocityEstimate.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct GANSSLocationInfo; struct GANSSMeasureInfo; /* Rel-7-MsrPosition-Rsp-Extension */ typedef struct Rel_7_MsrPosition_Rsp_Extension { VelocityEstimate_t *velEstimate /* OPTIONAL */; struct GANSSLocationInfo *ganssLocationInfo /* OPTIONAL */; struct GANSSMeasureInfo *ganssMeasureInfo /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } Rel_7_MsrPosition_Rsp_Extension_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Rel_7_MsrPosition_Rsp_Extension; #ifdef __cplusplus } #endif /* Referred external types */ #include "GANSSLocationInfo.h" #include "GANSSMeasureInfo.h" #endif /* _Rel_7_MsrPosition_Rsp_Extension_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Rel-98-MsrPosition-Rsp-Extension.c000066400000000000000000000112661305042567700266140ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "Rel-98-MsrPosition-Rsp-Extension.h" static asn_TYPE_member_t asn_MBR_rel_98_Ext_MeasureInfo_2[] = { { ATF_POINTER, 1, offsetof(struct rel_98_Ext_MeasureInfo, otd_MeasureInfo_R98_Ext), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_OTD_MeasureInfo_R98_Ext, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "otd-MeasureInfo-R98-Ext" }, }; static int asn_MAP_rel_98_Ext_MeasureInfo_oms_2[] = { 0 }; static ber_tlv_tag_t asn_DEF_rel_98_Ext_MeasureInfo_tags_2[] = { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_rel_98_Ext_MeasureInfo_tag2el_2[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* otd-MeasureInfo-R98-Ext at 960 */ }; static asn_SEQUENCE_specifics_t asn_SPC_rel_98_Ext_MeasureInfo_specs_2 = { sizeof(struct rel_98_Ext_MeasureInfo), offsetof(struct rel_98_Ext_MeasureInfo, _asn_ctx), asn_MAP_rel_98_Ext_MeasureInfo_tag2el_2, 1, /* Count of tags in the map */ asn_MAP_rel_98_Ext_MeasureInfo_oms_2, /* Optional members */ 1, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_rel_98_Ext_MeasureInfo_2 = { "rel-98-Ext-MeasureInfo", "rel-98-Ext-MeasureInfo", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_rel_98_Ext_MeasureInfo_tags_2, sizeof(asn_DEF_rel_98_Ext_MeasureInfo_tags_2) /sizeof(asn_DEF_rel_98_Ext_MeasureInfo_tags_2[0]) - 1, /* 1 */ asn_DEF_rel_98_Ext_MeasureInfo_tags_2, /* Same as above */ sizeof(asn_DEF_rel_98_Ext_MeasureInfo_tags_2) /sizeof(asn_DEF_rel_98_Ext_MeasureInfo_tags_2[0]), /* 2 */ 0, /* No PER visible constraints */ asn_MBR_rel_98_Ext_MeasureInfo_2, 1, /* Elements count */ &asn_SPC_rel_98_Ext_MeasureInfo_specs_2 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_Rel_98_MsrPosition_Rsp_Extension_1[] = { { ATF_NOFLAGS, 0, offsetof(struct Rel_98_MsrPosition_Rsp_Extension, rel_98_Ext_MeasureInfo), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, &asn_DEF_rel_98_Ext_MeasureInfo_2, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "rel-98-Ext-MeasureInfo" }, { ATF_POINTER, 1, offsetof(struct Rel_98_MsrPosition_Rsp_Extension, timeAssistanceMeasurements), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GPSTimeAssistanceMeasurements, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "timeAssistanceMeasurements" }, }; static int asn_MAP_Rel_98_MsrPosition_Rsp_Extension_oms_1[] = { 1 }; static ber_tlv_tag_t asn_DEF_Rel_98_MsrPosition_Rsp_Extension_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_Rel_98_MsrPosition_Rsp_Extension_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* rel-98-Ext-MeasureInfo at 960 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* timeAssistanceMeasurements at 963 */ }; static asn_SEQUENCE_specifics_t asn_SPC_Rel_98_MsrPosition_Rsp_Extension_specs_1 = { sizeof(struct Rel_98_MsrPosition_Rsp_Extension), offsetof(struct Rel_98_MsrPosition_Rsp_Extension, _asn_ctx), asn_MAP_Rel_98_MsrPosition_Rsp_Extension_tag2el_1, 2, /* Count of tags in the map */ asn_MAP_Rel_98_MsrPosition_Rsp_Extension_oms_1, /* Optional members */ 0, 1, /* Root/Additions */ 0, /* Start extensions */ 3 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Rel_98_MsrPosition_Rsp_Extension = { "Rel-98-MsrPosition-Rsp-Extension", "Rel-98-MsrPosition-Rsp-Extension", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_Rel_98_MsrPosition_Rsp_Extension_tags_1, sizeof(asn_DEF_Rel_98_MsrPosition_Rsp_Extension_tags_1) /sizeof(asn_DEF_Rel_98_MsrPosition_Rsp_Extension_tags_1[0]), /* 1 */ asn_DEF_Rel_98_MsrPosition_Rsp_Extension_tags_1, /* Same as above */ sizeof(asn_DEF_Rel_98_MsrPosition_Rsp_Extension_tags_1) /sizeof(asn_DEF_Rel_98_MsrPosition_Rsp_Extension_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_Rel_98_MsrPosition_Rsp_Extension_1, 2, /* Elements count */ &asn_SPC_Rel_98_MsrPosition_Rsp_Extension_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Rel-98-MsrPosition-Rsp-Extension.h000066400000000000000000000025221305042567700266140ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _Rel_98_MsrPosition_Rsp_Extension_H_ #define _Rel_98_MsrPosition_Rsp_Extension_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct GPSTimeAssistanceMeasurements; struct OTD_MeasureInfo_R98_Ext; /* Rel-98-MsrPosition-Rsp-Extension */ typedef struct Rel_98_MsrPosition_Rsp_Extension { struct rel_98_Ext_MeasureInfo { struct OTD_MeasureInfo_R98_Ext *otd_MeasureInfo_R98_Ext /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } rel_98_Ext_MeasureInfo; /* * This type is extensible, * possible extensions are below. */ struct GPSTimeAssistanceMeasurements *timeAssistanceMeasurements /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } Rel_98_MsrPosition_Rsp_Extension_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Rel_98_MsrPosition_Rsp_Extension; #ifdef __cplusplus } #endif /* Referred external types */ #include "GPSTimeAssistanceMeasurements.h" #include "OTD-MeasureInfo-R98-Ext.h" #endif /* _Rel_98_MsrPosition_Rsp_Extension_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Rel5-AssistanceData-Extension.c000066400000000000000000000041371305042567700263010ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "Rel5-AssistanceData-Extension.h" static asn_TYPE_member_t asn_MBR_Rel5_AssistanceData_Extension_1[] = { { ATF_NOFLAGS, 0, offsetof(struct Rel5_AssistanceData_Extension, extended_reference), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Extended_reference, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "extended-reference" }, }; static ber_tlv_tag_t asn_DEF_Rel5_AssistanceData_Extension_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_Rel5_AssistanceData_Extension_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* extended-reference at 1023 */ }; static asn_SEQUENCE_specifics_t asn_SPC_Rel5_AssistanceData_Extension_specs_1 = { sizeof(struct Rel5_AssistanceData_Extension), offsetof(struct Rel5_AssistanceData_Extension, _asn_ctx), asn_MAP_Rel5_AssistanceData_Extension_tag2el_1, 1, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ 0, /* Start extensions */ 2 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Rel5_AssistanceData_Extension = { "Rel5-AssistanceData-Extension", "Rel5-AssistanceData-Extension", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_Rel5_AssistanceData_Extension_tags_1, sizeof(asn_DEF_Rel5_AssistanceData_Extension_tags_1) /sizeof(asn_DEF_Rel5_AssistanceData_Extension_tags_1[0]), /* 1 */ asn_DEF_Rel5_AssistanceData_Extension_tags_1, /* Same as above */ sizeof(asn_DEF_Rel5_AssistanceData_Extension_tags_1) /sizeof(asn_DEF_Rel5_AssistanceData_Extension_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_Rel5_AssistanceData_Extension_1, 1, /* Elements count */ &asn_SPC_Rel5_AssistanceData_Extension_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Rel5-AssistanceData-Extension.h000066400000000000000000000016121305042567700263010ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _Rel5_AssistanceData_Extension_H_ #define _Rel5_AssistanceData_Extension_H_ #include /* Including external dependencies */ #include "Extended-reference.h" #include #ifdef __cplusplus extern "C" { #endif /* Rel5-AssistanceData-Extension */ typedef struct Rel5_AssistanceData_Extension { Extended_reference_t extended_reference; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } Rel5_AssistanceData_Extension_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Rel5_AssistanceData_Extension; #ifdef __cplusplus } #endif #endif /* _Rel5_AssistanceData_Extension_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Rel5-MsrPosition-Req-Extension.c000066400000000000000000000041631305042567700264240ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "Rel5-MsrPosition-Req-Extension.h" static asn_TYPE_member_t asn_MBR_Rel5_MsrPosition_Req_Extension_1[] = { { ATF_NOFLAGS, 0, offsetof(struct Rel5_MsrPosition_Req_Extension, extended_reference), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Extended_reference, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "extended-reference" }, }; static ber_tlv_tag_t asn_DEF_Rel5_MsrPosition_Req_Extension_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_Rel5_MsrPosition_Req_Extension_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* extended-reference at 1017 */ }; static asn_SEQUENCE_specifics_t asn_SPC_Rel5_MsrPosition_Req_Extension_specs_1 = { sizeof(struct Rel5_MsrPosition_Req_Extension), offsetof(struct Rel5_MsrPosition_Req_Extension, _asn_ctx), asn_MAP_Rel5_MsrPosition_Req_Extension_tag2el_1, 1, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ 0, /* Start extensions */ 2 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Rel5_MsrPosition_Req_Extension = { "Rel5-MsrPosition-Req-Extension", "Rel5-MsrPosition-Req-Extension", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_Rel5_MsrPosition_Req_Extension_tags_1, sizeof(asn_DEF_Rel5_MsrPosition_Req_Extension_tags_1) /sizeof(asn_DEF_Rel5_MsrPosition_Req_Extension_tags_1[0]), /* 1 */ asn_DEF_Rel5_MsrPosition_Req_Extension_tags_1, /* Same as above */ sizeof(asn_DEF_Rel5_MsrPosition_Req_Extension_tags_1) /sizeof(asn_DEF_Rel5_MsrPosition_Req_Extension_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_Rel5_MsrPosition_Req_Extension_1, 1, /* Elements count */ &asn_SPC_Rel5_MsrPosition_Req_Extension_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Rel5-MsrPosition-Req-Extension.h000066400000000000000000000016211305042567700264250ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _Rel5_MsrPosition_Req_Extension_H_ #define _Rel5_MsrPosition_Req_Extension_H_ #include /* Including external dependencies */ #include "Extended-reference.h" #include #ifdef __cplusplus extern "C" { #endif /* Rel5-MsrPosition-Req-Extension */ typedef struct Rel5_MsrPosition_Req_Extension { Extended_reference_t extended_reference; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } Rel5_MsrPosition_Req_Extension_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Rel5_MsrPosition_Req_Extension; #ifdef __cplusplus } #endif #endif /* _Rel5_MsrPosition_Req_Extension_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Rel7-AssistanceData-Extension.c000066400000000000000000000061561305042567700263060ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "Rel7-AssistanceData-Extension.h" static asn_TYPE_member_t asn_MBR_Rel7_AssistanceData_Extension_1[] = { { ATF_POINTER, 3, offsetof(struct Rel7_AssistanceData_Extension, ganss_AssistData), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSS_AssistData, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganss-AssistData" }, { ATF_POINTER, 2, offsetof(struct Rel7_AssistanceData_Extension, ganssCarrierPhaseMeasurementRequest), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NULL, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssCarrierPhaseMeasurementRequest" }, { ATF_POINTER, 1, offsetof(struct Rel7_AssistanceData_Extension, ganssTODGSMTimeAssociationMeasurementRequest), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NULL, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssTODGSMTimeAssociationMeasurementRequest" }, }; static int asn_MAP_Rel7_AssistanceData_Extension_oms_1[] = { 0, 1, 2 }; static ber_tlv_tag_t asn_DEF_Rel7_AssistanceData_Extension_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_Rel7_AssistanceData_Extension_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ganss-AssistData at 1491 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ganssCarrierPhaseMeasurementRequest at 1492 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* ganssTODGSMTimeAssociationMeasurementRequest at 1493 */ }; static asn_SEQUENCE_specifics_t asn_SPC_Rel7_AssistanceData_Extension_specs_1 = { sizeof(struct Rel7_AssistanceData_Extension), offsetof(struct Rel7_AssistanceData_Extension, _asn_ctx), asn_MAP_Rel7_AssistanceData_Extension_tag2el_1, 3, /* Count of tags in the map */ asn_MAP_Rel7_AssistanceData_Extension_oms_1, /* Optional members */ 3, 0, /* Root/Additions */ 2, /* Start extensions */ 4 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Rel7_AssistanceData_Extension = { "Rel7-AssistanceData-Extension", "Rel7-AssistanceData-Extension", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_Rel7_AssistanceData_Extension_tags_1, sizeof(asn_DEF_Rel7_AssistanceData_Extension_tags_1) /sizeof(asn_DEF_Rel7_AssistanceData_Extension_tags_1[0]), /* 1 */ asn_DEF_Rel7_AssistanceData_Extension_tags_1, /* Same as above */ sizeof(asn_DEF_Rel7_AssistanceData_Extension_tags_1) /sizeof(asn_DEF_Rel7_AssistanceData_Extension_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_Rel7_AssistanceData_Extension_1, 3, /* Elements count */ &asn_SPC_Rel7_AssistanceData_Extension_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Rel7-AssistanceData-Extension.h000066400000000000000000000022011305042567700262760ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _Rel7_AssistanceData_Extension_H_ #define _Rel7_AssistanceData_Extension_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct GANSS_AssistData; /* Rel7-AssistanceData-Extension */ typedef struct Rel7_AssistanceData_Extension { struct GANSS_AssistData *ganss_AssistData /* OPTIONAL */; NULL_t *ganssCarrierPhaseMeasurementRequest /* OPTIONAL */; NULL_t *ganssTODGSMTimeAssociationMeasurementRequest /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } Rel7_AssistanceData_Extension_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Rel7_AssistanceData_Extension; #ifdef __cplusplus } #endif /* Referred external types */ #include "GANSS-AssistData.h" #endif /* _Rel7_AssistanceData_Extension_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Rel7-MsrPosition-Req-Extension.c000066400000000000000000000105441305042567700264260ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "Rel7-MsrPosition-Req-Extension.h" static asn_TYPE_member_t asn_MBR_Rel7_MsrPosition_Req_Extension_1[] = { { ATF_POINTER, 6, offsetof(struct Rel7_MsrPosition_Req_Extension, velocityRequested), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NULL, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "velocityRequested" }, { ATF_POINTER, 5, offsetof(struct Rel7_MsrPosition_Req_Extension, ganssPositionMethod), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSSPositioningMethod, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssPositionMethod" }, { ATF_POINTER, 4, offsetof(struct Rel7_MsrPosition_Req_Extension, ganss_AssistData), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSS_AssistData, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganss-AssistData" }, { ATF_POINTER, 3, offsetof(struct Rel7_MsrPosition_Req_Extension, ganssCarrierPhaseMeasurementRequest), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NULL, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssCarrierPhaseMeasurementRequest" }, { ATF_POINTER, 2, offsetof(struct Rel7_MsrPosition_Req_Extension, ganssTODGSMTimeAssociationMeasurementRequest), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NULL, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssTODGSMTimeAssociationMeasurementRequest" }, { ATF_POINTER, 1, offsetof(struct Rel7_MsrPosition_Req_Extension, requiredResponseTime), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_RequiredResponseTime, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "requiredResponseTime" }, }; static int asn_MAP_Rel7_MsrPosition_Req_Extension_oms_1[] = { 0, 1, 2, 3, 4, 5 }; static ber_tlv_tag_t asn_DEF_Rel7_MsrPosition_Req_Extension_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_Rel7_MsrPosition_Req_Extension_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* velocityRequested at 1045 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ganssPositionMethod at 1046 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* ganss-AssistData at 1047 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* ganssCarrierPhaseMeasurementRequest at 1048 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* ganssTODGSMTimeAssociationMeasurementRequest at 1049 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 } /* requiredResponseTime at 1050 */ }; static asn_SEQUENCE_specifics_t asn_SPC_Rel7_MsrPosition_Req_Extension_specs_1 = { sizeof(struct Rel7_MsrPosition_Req_Extension), offsetof(struct Rel7_MsrPosition_Req_Extension, _asn_ctx), asn_MAP_Rel7_MsrPosition_Req_Extension_tag2el_1, 6, /* Count of tags in the map */ asn_MAP_Rel7_MsrPosition_Req_Extension_oms_1, /* Optional members */ 6, 0, /* Root/Additions */ 5, /* Start extensions */ 7 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Rel7_MsrPosition_Req_Extension = { "Rel7-MsrPosition-Req-Extension", "Rel7-MsrPosition-Req-Extension", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_Rel7_MsrPosition_Req_Extension_tags_1, sizeof(asn_DEF_Rel7_MsrPosition_Req_Extension_tags_1) /sizeof(asn_DEF_Rel7_MsrPosition_Req_Extension_tags_1[0]), /* 1 */ asn_DEF_Rel7_MsrPosition_Req_Extension_tags_1, /* Same as above */ sizeof(asn_DEF_Rel7_MsrPosition_Req_Extension_tags_1) /sizeof(asn_DEF_Rel7_MsrPosition_Req_Extension_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_Rel7_MsrPosition_Req_Extension_1, 6, /* Elements count */ &asn_SPC_Rel7_MsrPosition_Req_Extension_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Rel7-MsrPosition-Req-Extension.h000066400000000000000000000025661305042567700264400ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _Rel7_MsrPosition_Req_Extension_H_ #define _Rel7_MsrPosition_Req_Extension_H_ #include /* Including external dependencies */ #include #include "GANSSPositioningMethod.h" #include "RequiredResponseTime.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct GANSS_AssistData; /* Rel7-MsrPosition-Req-Extension */ typedef struct Rel7_MsrPosition_Req_Extension { NULL_t *velocityRequested /* OPTIONAL */; GANSSPositioningMethod_t *ganssPositionMethod /* OPTIONAL */; struct GANSS_AssistData *ganss_AssistData /* OPTIONAL */; NULL_t *ganssCarrierPhaseMeasurementRequest /* OPTIONAL */; NULL_t *ganssTODGSMTimeAssociationMeasurementRequest /* OPTIONAL */; RequiredResponseTime_t *requiredResponseTime /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } Rel7_MsrPosition_Req_Extension_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Rel7_MsrPosition_Req_Extension; #ifdef __cplusplus } #endif /* Referred external types */ #include "GANSS-AssistData.h" #endif /* _Rel7_MsrPosition_Req_Extension_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Rel98-AssistanceData-Extension.c000066400000000000000000000061471305042567700264000ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "Rel98-AssistanceData-Extension.h" static asn_TYPE_member_t asn_MBR_Rel98_AssistanceData_Extension_1[] = { { ATF_POINTER, 3, offsetof(struct Rel98_AssistanceData_Extension, rel98_Ext_ExpOTD), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Rel98_Ext_ExpOTD, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "rel98-Ext-ExpOTD" }, { ATF_POINTER, 2, offsetof(struct Rel98_AssistanceData_Extension, gpsTimeAssistanceMeasurementRequest), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NULL, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "gpsTimeAssistanceMeasurementRequest" }, { ATF_POINTER, 1, offsetof(struct Rel98_AssistanceData_Extension, gpsReferenceTimeUncertainty), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GPSReferenceTimeUncertainty, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "gpsReferenceTimeUncertainty" }, }; static int asn_MAP_Rel98_AssistanceData_Extension_oms_1[] = { 0, 1, 2 }; static ber_tlv_tag_t asn_DEF_Rel98_AssistanceData_Extension_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_Rel98_AssistanceData_Extension_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* rel98-Ext-ExpOTD at 879 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* gpsTimeAssistanceMeasurementRequest at 881 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* gpsReferenceTimeUncertainty at 882 */ }; static asn_SEQUENCE_specifics_t asn_SPC_Rel98_AssistanceData_Extension_specs_1 = { sizeof(struct Rel98_AssistanceData_Extension), offsetof(struct Rel98_AssistanceData_Extension, _asn_ctx), asn_MAP_Rel98_AssistanceData_Extension_tag2el_1, 3, /* Count of tags in the map */ asn_MAP_Rel98_AssistanceData_Extension_oms_1, /* Optional members */ 1, 2, /* Root/Additions */ 0, /* Start extensions */ 4 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Rel98_AssistanceData_Extension = { "Rel98-AssistanceData-Extension", "Rel98-AssistanceData-Extension", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_Rel98_AssistanceData_Extension_tags_1, sizeof(asn_DEF_Rel98_AssistanceData_Extension_tags_1) /sizeof(asn_DEF_Rel98_AssistanceData_Extension_tags_1[0]), /* 1 */ asn_DEF_Rel98_AssistanceData_Extension_tags_1, /* Same as above */ sizeof(asn_DEF_Rel98_AssistanceData_Extension_tags_1) /sizeof(asn_DEF_Rel98_AssistanceData_Extension_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_Rel98_AssistanceData_Extension_1, 3, /* Elements count */ &asn_SPC_Rel98_AssistanceData_Extension_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Rel98-AssistanceData-Extension.h000066400000000000000000000022671305042567700264040ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _Rel98_AssistanceData_Extension_H_ #define _Rel98_AssistanceData_Extension_H_ #include /* Including external dependencies */ #include #include "GPSReferenceTimeUncertainty.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct Rel98_Ext_ExpOTD; /* Rel98-AssistanceData-Extension */ typedef struct Rel98_AssistanceData_Extension { struct Rel98_Ext_ExpOTD *rel98_Ext_ExpOTD /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ NULL_t *gpsTimeAssistanceMeasurementRequest /* OPTIONAL */; GPSReferenceTimeUncertainty_t *gpsReferenceTimeUncertainty /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } Rel98_AssistanceData_Extension_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Rel98_AssistanceData_Extension; #ifdef __cplusplus } #endif /* Referred external types */ #include "Rel98-Ext-ExpOTD.h" #endif /* _Rel98_AssistanceData_Extension_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Rel98-Ext-ExpOTD.c000066400000000000000000000046231305042567700233750ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "Rel98-Ext-ExpOTD.h" static asn_TYPE_member_t asn_MBR_Rel98_Ext_ExpOTD_1[] = { { ATF_POINTER, 2, offsetof(struct Rel98_Ext_ExpOTD, msrAssistData_R98_ExpOTD), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_MsrAssistData_R98_ExpOTD, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "msrAssistData-R98-ExpOTD" }, { ATF_POINTER, 1, offsetof(struct Rel98_Ext_ExpOTD, systemInfoAssistData_R98_ExpOTD), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SystemInfoAssistData_R98_ExpOTD, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "systemInfoAssistData-R98-ExpOTD" }, }; static int asn_MAP_Rel98_Ext_ExpOTD_oms_1[] = { 0, 1 }; static ber_tlv_tag_t asn_DEF_Rel98_Ext_ExpOTD_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_Rel98_Ext_ExpOTD_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* msrAssistData-R98-ExpOTD at 890 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* systemInfoAssistData-R98-ExpOTD at 894 */ }; static asn_SEQUENCE_specifics_t asn_SPC_Rel98_Ext_ExpOTD_specs_1 = { sizeof(struct Rel98_Ext_ExpOTD), offsetof(struct Rel98_Ext_ExpOTD, _asn_ctx), asn_MAP_Rel98_Ext_ExpOTD_tag2el_1, 2, /* Count of tags in the map */ asn_MAP_Rel98_Ext_ExpOTD_oms_1, /* Optional members */ 2, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Rel98_Ext_ExpOTD = { "Rel98-Ext-ExpOTD", "Rel98-Ext-ExpOTD", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_Rel98_Ext_ExpOTD_tags_1, sizeof(asn_DEF_Rel98_Ext_ExpOTD_tags_1) /sizeof(asn_DEF_Rel98_Ext_ExpOTD_tags_1[0]), /* 1 */ asn_DEF_Rel98_Ext_ExpOTD_tags_1, /* Same as above */ sizeof(asn_DEF_Rel98_Ext_ExpOTD_tags_1) /sizeof(asn_DEF_Rel98_Ext_ExpOTD_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_Rel98_Ext_ExpOTD_1, 2, /* Elements count */ &asn_SPC_Rel98_Ext_ExpOTD_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Rel98-Ext-ExpOTD.h000066400000000000000000000020261305042567700233750ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _Rel98_Ext_ExpOTD_H_ #define _Rel98_Ext_ExpOTD_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct MsrAssistData_R98_ExpOTD; struct SystemInfoAssistData_R98_ExpOTD; /* Rel98-Ext-ExpOTD */ typedef struct Rel98_Ext_ExpOTD { struct MsrAssistData_R98_ExpOTD *msrAssistData_R98_ExpOTD /* OPTIONAL */; struct SystemInfoAssistData_R98_ExpOTD *systemInfoAssistData_R98_ExpOTD /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } Rel98_Ext_ExpOTD_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Rel98_Ext_ExpOTD; #ifdef __cplusplus } #endif /* Referred external types */ #include "MsrAssistData-R98-ExpOTD.h" #include "SystemInfoAssistData-R98-ExpOTD.h" #endif /* _Rel98_Ext_ExpOTD_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Rel98-MsrPosition-Req-Extension.c000066400000000000000000000061771305042567700265270ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "Rel98-MsrPosition-Req-Extension.h" static asn_TYPE_member_t asn_MBR_Rel98_MsrPosition_Req_Extension_1[] = { { ATF_POINTER, 3, offsetof(struct Rel98_MsrPosition_Req_Extension, rel98_Ext_ExpOTD), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Rel98_Ext_ExpOTD, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "rel98-Ext-ExpOTD" }, { ATF_POINTER, 2, offsetof(struct Rel98_MsrPosition_Req_Extension, gpsTimeAssistanceMeasurementRequest), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NULL, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "gpsTimeAssistanceMeasurementRequest" }, { ATF_POINTER, 1, offsetof(struct Rel98_MsrPosition_Req_Extension, gpsReferenceTimeUncertainty), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GPSReferenceTimeUncertainty, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "gpsReferenceTimeUncertainty" }, }; static int asn_MAP_Rel98_MsrPosition_Req_Extension_oms_1[] = { 0, 1, 2 }; static ber_tlv_tag_t asn_DEF_Rel98_MsrPosition_Req_Extension_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_Rel98_MsrPosition_Req_Extension_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* rel98-Ext-ExpOTD at 871 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* gpsTimeAssistanceMeasurementRequest at 873 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* gpsReferenceTimeUncertainty at 874 */ }; static asn_SEQUENCE_specifics_t asn_SPC_Rel98_MsrPosition_Req_Extension_specs_1 = { sizeof(struct Rel98_MsrPosition_Req_Extension), offsetof(struct Rel98_MsrPosition_Req_Extension, _asn_ctx), asn_MAP_Rel98_MsrPosition_Req_Extension_tag2el_1, 3, /* Count of tags in the map */ asn_MAP_Rel98_MsrPosition_Req_Extension_oms_1, /* Optional members */ 1, 2, /* Root/Additions */ 0, /* Start extensions */ 4 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Rel98_MsrPosition_Req_Extension = { "Rel98-MsrPosition-Req-Extension", "Rel98-MsrPosition-Req-Extension", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_Rel98_MsrPosition_Req_Extension_tags_1, sizeof(asn_DEF_Rel98_MsrPosition_Req_Extension_tags_1) /sizeof(asn_DEF_Rel98_MsrPosition_Req_Extension_tags_1[0]), /* 1 */ asn_DEF_Rel98_MsrPosition_Req_Extension_tags_1, /* Same as above */ sizeof(asn_DEF_Rel98_MsrPosition_Req_Extension_tags_1) /sizeof(asn_DEF_Rel98_MsrPosition_Req_Extension_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_Rel98_MsrPosition_Req_Extension_1, 3, /* Elements count */ &asn_SPC_Rel98_MsrPosition_Req_Extension_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/Rel98-MsrPosition-Req-Extension.h000066400000000000000000000022761305042567700265300ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _Rel98_MsrPosition_Req_Extension_H_ #define _Rel98_MsrPosition_Req_Extension_H_ #include /* Including external dependencies */ #include #include "GPSReferenceTimeUncertainty.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct Rel98_Ext_ExpOTD; /* Rel98-MsrPosition-Req-Extension */ typedef struct Rel98_MsrPosition_Req_Extension { struct Rel98_Ext_ExpOTD *rel98_Ext_ExpOTD /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ NULL_t *gpsTimeAssistanceMeasurementRequest /* OPTIONAL */; GPSReferenceTimeUncertainty_t *gpsReferenceTimeUncertainty /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } Rel98_MsrPosition_Req_Extension_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Rel98_MsrPosition_Req_Extension; #ifdef __cplusplus } #endif /* Referred external types */ #include "Rel98-Ext-ExpOTD.h" #endif /* _Rel98_MsrPosition_Req_Extension_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/RelDistance.c000066400000000000000000000112041305042567700230210ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "RelDistance.h" int RelDistance_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -200000 && value <= 200000)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void RelDistance_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void RelDistance_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { RelDistance_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int RelDistance_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { RelDistance_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t RelDistance_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { RelDistance_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t RelDistance_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { RelDistance_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t RelDistance_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { RelDistance_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t RelDistance_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { RelDistance_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t RelDistance_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { RelDistance_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t RelDistance_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { RelDistance_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_RelDistance_constr_1 = { { APC_CONSTRAINED, 19, -1, -200000, 200000 } /* (-200000..200000) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_RelDistance_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_RelDistance = { "RelDistance", "RelDistance", RelDistance_free, RelDistance_print, RelDistance_constraint, RelDistance_decode_ber, RelDistance_encode_der, RelDistance_decode_xer, RelDistance_encode_xer, RelDistance_decode_uper, RelDistance_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_RelDistance_tags_1, sizeof(asn_DEF_RelDistance_tags_1) /sizeof(asn_DEF_RelDistance_tags_1[0]), /* 1 */ asn_DEF_RelDistance_tags_1, /* Same as above */ sizeof(asn_DEF_RelDistance_tags_1) /sizeof(asn_DEF_RelDistance_tags_1[0]), /* 1 */ &asn_PER_type_RelDistance_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/RelDistance.h000066400000000000000000000016141305042567700230320ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _RelDistance_H_ #define _RelDistance_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* RelDistance */ typedef long RelDistance_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_RelDistance; asn_struct_free_f RelDistance_free; asn_struct_print_f RelDistance_print; asn_constr_check_f RelDistance_constraint; ber_type_decoder_f RelDistance_decode_ber; der_type_encoder_f RelDistance_encode_der; xer_type_decoder_f RelDistance_decode_xer; xer_type_encoder_f RelDistance_encode_xer; per_type_decoder_f RelDistance_decode_uper; per_type_encoder_f RelDistance_encode_uper; #ifdef __cplusplus } #endif #endif /* _RelDistance_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/RelativeAlt.c000066400000000000000000000111711305042567700230430ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "RelativeAlt.h" int RelativeAlt_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -4000 && value <= 4000)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void RelativeAlt_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void RelativeAlt_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { RelativeAlt_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int RelativeAlt_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { RelativeAlt_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t RelativeAlt_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { RelativeAlt_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t RelativeAlt_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { RelativeAlt_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t RelativeAlt_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { RelativeAlt_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t RelativeAlt_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { RelativeAlt_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t RelativeAlt_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { RelativeAlt_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t RelativeAlt_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { RelativeAlt_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_RelativeAlt_constr_1 = { { APC_CONSTRAINED, 13, 13, -4000, 4000 } /* (-4000..4000) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_RelativeAlt_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_RelativeAlt = { "RelativeAlt", "RelativeAlt", RelativeAlt_free, RelativeAlt_print, RelativeAlt_constraint, RelativeAlt_decode_ber, RelativeAlt_encode_der, RelativeAlt_decode_xer, RelativeAlt_encode_xer, RelativeAlt_decode_uper, RelativeAlt_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_RelativeAlt_tags_1, sizeof(asn_DEF_RelativeAlt_tags_1) /sizeof(asn_DEF_RelativeAlt_tags_1[0]), /* 1 */ asn_DEF_RelativeAlt_tags_1, /* Same as above */ sizeof(asn_DEF_RelativeAlt_tags_1) /sizeof(asn_DEF_RelativeAlt_tags_1[0]), /* 1 */ &asn_PER_type_RelativeAlt_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/RelativeAlt.h000066400000000000000000000016141305042567700230510ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _RelativeAlt_H_ #define _RelativeAlt_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* RelativeAlt */ typedef long RelativeAlt_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_RelativeAlt; asn_struct_free_f RelativeAlt_free; asn_struct_print_f RelativeAlt_print; asn_constr_check_f RelativeAlt_constraint; ber_type_decoder_f RelativeAlt_decode_ber; der_type_encoder_f RelativeAlt_encode_der; xer_type_decoder_f RelativeAlt_decode_xer; xer_type_encoder_f RelativeAlt_encode_xer; per_type_decoder_f RelativeAlt_decode_uper; per_type_encoder_f RelativeAlt_encode_uper; #ifdef __cplusplus } #endif #endif /* _RelativeAlt_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/RequestIndex.c000066400000000000000000000112161305042567700232470ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "RequestIndex.h" int RequestIndex_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 1 && value <= 16)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void RequestIndex_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void RequestIndex_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { RequestIndex_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int RequestIndex_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { RequestIndex_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t RequestIndex_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { RequestIndex_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t RequestIndex_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { RequestIndex_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t RequestIndex_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { RequestIndex_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t RequestIndex_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { RequestIndex_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t RequestIndex_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { RequestIndex_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t RequestIndex_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { RequestIndex_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_RequestIndex_constr_1 = { { APC_CONSTRAINED, 4, 4, 1, 16 } /* (1..16) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_RequestIndex_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_RequestIndex = { "RequestIndex", "RequestIndex", RequestIndex_free, RequestIndex_print, RequestIndex_constraint, RequestIndex_decode_ber, RequestIndex_encode_der, RequestIndex_decode_xer, RequestIndex_encode_xer, RequestIndex_decode_uper, RequestIndex_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_RequestIndex_tags_1, sizeof(asn_DEF_RequestIndex_tags_1) /sizeof(asn_DEF_RequestIndex_tags_1[0]), /* 1 */ asn_DEF_RequestIndex_tags_1, /* Same as above */ sizeof(asn_DEF_RequestIndex_tags_1) /sizeof(asn_DEF_RequestIndex_tags_1[0]), /* 1 */ &asn_PER_type_RequestIndex_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/RequestIndex.h000066400000000000000000000016331305042567700232560ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _RequestIndex_H_ #define _RequestIndex_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* RequestIndex */ typedef long RequestIndex_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_RequestIndex; asn_struct_free_f RequestIndex_free; asn_struct_print_f RequestIndex_print; asn_constr_check_f RequestIndex_constraint; ber_type_decoder_f RequestIndex_decode_ber; der_type_encoder_f RequestIndex_encode_der; xer_type_decoder_f RequestIndex_decode_xer; xer_type_encoder_f RequestIndex_encode_xer; per_type_decoder_f RequestIndex_decode_uper; per_type_encoder_f RequestIndex_encode_uper; #ifdef __cplusplus } #endif #endif /* _RequestIndex_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/RequiredResponseTime.c000066400000000000000000000117211305042567700247460ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "RequiredResponseTime.h" int RequiredResponseTime_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 1 && value <= 128)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void RequiredResponseTime_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void RequiredResponseTime_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { RequiredResponseTime_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int RequiredResponseTime_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { RequiredResponseTime_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t RequiredResponseTime_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { RequiredResponseTime_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t RequiredResponseTime_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { RequiredResponseTime_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t RequiredResponseTime_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { RequiredResponseTime_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t RequiredResponseTime_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { RequiredResponseTime_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t RequiredResponseTime_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { RequiredResponseTime_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t RequiredResponseTime_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { RequiredResponseTime_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_RequiredResponseTime_constr_1 = { { APC_CONSTRAINED, 7, 7, 1, 128 } /* (1..128) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_RequiredResponseTime_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_RequiredResponseTime = { "RequiredResponseTime", "RequiredResponseTime", RequiredResponseTime_free, RequiredResponseTime_print, RequiredResponseTime_constraint, RequiredResponseTime_decode_ber, RequiredResponseTime_encode_der, RequiredResponseTime_decode_xer, RequiredResponseTime_encode_xer, RequiredResponseTime_decode_uper, RequiredResponseTime_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_RequiredResponseTime_tags_1, sizeof(asn_DEF_RequiredResponseTime_tags_1) /sizeof(asn_DEF_RequiredResponseTime_tags_1[0]), /* 1 */ asn_DEF_RequiredResponseTime_tags_1, /* Same as above */ sizeof(asn_DEF_RequiredResponseTime_tags_1) /sizeof(asn_DEF_RequiredResponseTime_tags_1[0]), /* 1 */ &asn_PER_type_RequiredResponseTime_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/RequiredResponseTime.h000066400000000000000000000020231305042567700247460ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _RequiredResponseTime_H_ #define _RequiredResponseTime_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* RequiredResponseTime */ typedef long RequiredResponseTime_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_RequiredResponseTime; asn_struct_free_f RequiredResponseTime_free; asn_struct_print_f RequiredResponseTime_print; asn_constr_check_f RequiredResponseTime_constraint; ber_type_decoder_f RequiredResponseTime_decode_ber; der_type_encoder_f RequiredResponseTime_encode_der; xer_type_decoder_f RequiredResponseTime_decode_xer; xer_type_encoder_f RequiredResponseTime_encode_xer; per_type_decoder_f RequiredResponseTime_decode_uper; per_type_encoder_f RequiredResponseTime_encode_uper; #ifdef __cplusplus } #endif #endif /* _RequiredResponseTime_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/RoughRTD.c000066400000000000000000000107661305042567700222760ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "RoughRTD.h" int RoughRTD_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1250)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void RoughRTD_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void RoughRTD_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { RoughRTD_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int RoughRTD_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { RoughRTD_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t RoughRTD_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { RoughRTD_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t RoughRTD_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { RoughRTD_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t RoughRTD_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { RoughRTD_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t RoughRTD_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { RoughRTD_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t RoughRTD_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { RoughRTD_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t RoughRTD_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { RoughRTD_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_RoughRTD_constr_1 = { { APC_CONSTRAINED, 11, 11, 0, 1250 } /* (0..1250) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_RoughRTD_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_RoughRTD = { "RoughRTD", "RoughRTD", RoughRTD_free, RoughRTD_print, RoughRTD_constraint, RoughRTD_decode_ber, RoughRTD_encode_der, RoughRTD_decode_xer, RoughRTD_encode_xer, RoughRTD_decode_uper, RoughRTD_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_RoughRTD_tags_1, sizeof(asn_DEF_RoughRTD_tags_1) /sizeof(asn_DEF_RoughRTD_tags_1[0]), /* 1 */ asn_DEF_RoughRTD_tags_1, /* Same as above */ sizeof(asn_DEF_RoughRTD_tags_1) /sizeof(asn_DEF_RoughRTD_tags_1[0]), /* 1 */ &asn_PER_type_RoughRTD_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/RoughRTD.h000066400000000000000000000015371305042567700222770ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _RoughRTD_H_ #define _RoughRTD_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* RoughRTD */ typedef long RoughRTD_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_RoughRTD; asn_struct_free_f RoughRTD_free; asn_struct_print_f RoughRTD_print; asn_constr_check_f RoughRTD_constraint; ber_type_decoder_f RoughRTD_decode_ber; der_type_encoder_f RoughRTD_encode_der; xer_type_decoder_f RoughRTD_decode_xer; xer_type_encoder_f RoughRTD_encode_xer; per_type_decoder_f RoughRTD_decode_uper; per_type_encoder_f RoughRTD_encode_uper; #ifdef __cplusplus } #endif #endif /* _RoughRTD_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SVID.c000066400000000000000000000105161305042567700213760ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SVID.h" int SVID_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 63)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void SVID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void SVID_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { SVID_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int SVID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { SVID_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t SVID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { SVID_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t SVID_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { SVID_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t SVID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { SVID_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t SVID_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { SVID_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t SVID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { SVID_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t SVID_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { SVID_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_SVID_constr_1 = { { APC_CONSTRAINED, 6, 6, 0, 63 } /* (0..63) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_SVID_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_SVID = { "SVID", "SVID", SVID_free, SVID_print, SVID_constraint, SVID_decode_ber, SVID_encode_der, SVID_decode_xer, SVID_encode_xer, SVID_decode_uper, SVID_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SVID_tags_1, sizeof(asn_DEF_SVID_tags_1) /sizeof(asn_DEF_SVID_tags_1[0]), /* 1 */ asn_DEF_SVID_tags_1, /* Same as above */ sizeof(asn_DEF_SVID_tags_1) /sizeof(asn_DEF_SVID_tags_1[0]), /* 1 */ &asn_PER_type_SVID_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SVID.h000066400000000000000000000014431305042567700214020ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SVID_H_ #define _SVID_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* SVID */ typedef long SVID_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SVID; asn_struct_free_f SVID_free; asn_struct_print_f SVID_print; asn_constr_check_f SVID_constraint; ber_type_decoder_f SVID_decode_ber; der_type_encoder_f SVID_encode_der; xer_type_decoder_f SVID_decode_xer; xer_type_encoder_f SVID_encode_xer; per_type_decoder_f SVID_decode_uper; per_type_encoder_f SVID_encode_uper; #ifdef __cplusplus } #endif #endif /* _SVID_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SVIDMASK.c000066400000000000000000000111301305042567700220430ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SVIDMASK.h" int SVIDMASK_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } if(st->size > 0) { /* Size in bits */ size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } if((size >= 1 && size <= 36)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using BIT_STRING, * so here we adjust the DEF accordingly. */ static void SVIDMASK_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_BIT_STRING.free_struct; td->print_struct = asn_DEF_BIT_STRING.print_struct; td->ber_decoder = asn_DEF_BIT_STRING.ber_decoder; td->der_encoder = asn_DEF_BIT_STRING.der_encoder; td->xer_decoder = asn_DEF_BIT_STRING.xer_decoder; td->xer_encoder = asn_DEF_BIT_STRING.xer_encoder; td->uper_decoder = asn_DEF_BIT_STRING.uper_decoder; td->uper_encoder = asn_DEF_BIT_STRING.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_BIT_STRING.per_constraints; td->elements = asn_DEF_BIT_STRING.elements; td->elements_count = asn_DEF_BIT_STRING.elements_count; td->specifics = asn_DEF_BIT_STRING.specifics; } void SVIDMASK_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { SVIDMASK_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int SVIDMASK_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { SVIDMASK_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t SVIDMASK_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { SVIDMASK_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t SVIDMASK_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { SVIDMASK_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t SVIDMASK_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { SVIDMASK_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t SVIDMASK_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { SVIDMASK_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t SVIDMASK_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { SVIDMASK_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t SVIDMASK_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { SVIDMASK_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_SVIDMASK_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 6, 6, 1, 36 } /* (SIZE(1..36)) */, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_SVIDMASK_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)) }; asn_TYPE_descriptor_t asn_DEF_SVIDMASK = { "SVIDMASK", "SVIDMASK", SVIDMASK_free, SVIDMASK_print, SVIDMASK_constraint, SVIDMASK_decode_ber, SVIDMASK_encode_der, SVIDMASK_decode_xer, SVIDMASK_encode_xer, SVIDMASK_decode_uper, SVIDMASK_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SVIDMASK_tags_1, sizeof(asn_DEF_SVIDMASK_tags_1) /sizeof(asn_DEF_SVIDMASK_tags_1[0]), /* 1 */ asn_DEF_SVIDMASK_tags_1, /* Same as above */ sizeof(asn_DEF_SVIDMASK_tags_1) /sizeof(asn_DEF_SVIDMASK_tags_1[0]), /* 1 */ &asn_PER_type_SVIDMASK_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SVIDMASK.h000066400000000000000000000015441305042567700220600ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SVIDMASK_H_ #define _SVIDMASK_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* SVIDMASK */ typedef BIT_STRING_t SVIDMASK_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SVIDMASK; asn_struct_free_f SVIDMASK_free; asn_struct_print_f SVIDMASK_print; asn_constr_check_f SVIDMASK_constraint; ber_type_decoder_f SVIDMASK_decode_ber; der_type_encoder_f SVIDMASK_encode_der; xer_type_decoder_f SVIDMASK_decode_xer; xer_type_encoder_f SVIDMASK_encode_xer; per_type_decoder_f SVIDMASK_decode_uper; per_type_encoder_f SVIDMASK_encode_uper; #ifdef __cplusplus } #endif #endif /* _SVIDMASK_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SatElement.c000066400000000000000000000244261305042567700226770ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SatElement.h" static int memb_iode_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 239)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_udre_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 3)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_pseudoRangeCor_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -2047 && value <= 2047)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_rangeRateCor_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -127 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_deltaPseudoRangeCor2_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -127 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_deltaRangeRateCor2_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -7 && value <= 7)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_deltaPseudoRangeCor3_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -127 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_deltaRangeRateCor3_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -7 && value <= 7)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_iode_constr_3 = { { APC_CONSTRAINED, 8, 8, 0, 239 } /* (0..239) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_udre_constr_4 = { { APC_CONSTRAINED, 2, 2, 0, 3 } /* (0..3) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_pseudoRangeCor_constr_5 = { { APC_CONSTRAINED, 12, 12, -2047, 2047 } /* (-2047..2047) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_rangeRateCor_constr_6 = { { APC_CONSTRAINED, 8, 8, -127, 127 } /* (-127..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_deltaPseudoRangeCor2_constr_7 = { { APC_CONSTRAINED, 8, 8, -127, 127 } /* (-127..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_deltaRangeRateCor2_constr_8 = { { APC_CONSTRAINED, 4, 4, -7, 7 } /* (-7..7) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_deltaPseudoRangeCor3_constr_9 = { { APC_CONSTRAINED, 8, 8, -127, 127 } /* (-127..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_deltaRangeRateCor3_constr_10 = { { APC_CONSTRAINED, 4, 4, -7, 7 } /* (-7..7) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SatElement_1[] = { { ATF_NOFLAGS, 0, offsetof(struct SatElement, satelliteID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SatelliteID, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "satelliteID" }, { ATF_NOFLAGS, 0, offsetof(struct SatElement, iode), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_iode_constraint_1, &asn_PER_memb_iode_constr_3, 0, "iode" }, { ATF_NOFLAGS, 0, offsetof(struct SatElement, udre), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_udre_constraint_1, &asn_PER_memb_udre_constr_4, 0, "udre" }, { ATF_NOFLAGS, 0, offsetof(struct SatElement, pseudoRangeCor), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_pseudoRangeCor_constraint_1, &asn_PER_memb_pseudoRangeCor_constr_5, 0, "pseudoRangeCor" }, { ATF_NOFLAGS, 0, offsetof(struct SatElement, rangeRateCor), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_rangeRateCor_constraint_1, &asn_PER_memb_rangeRateCor_constr_6, 0, "rangeRateCor" }, { ATF_NOFLAGS, 0, offsetof(struct SatElement, deltaPseudoRangeCor2), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_deltaPseudoRangeCor2_constraint_1, &asn_PER_memb_deltaPseudoRangeCor2_constr_7, 0, "deltaPseudoRangeCor2" }, { ATF_NOFLAGS, 0, offsetof(struct SatElement, deltaRangeRateCor2), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_deltaRangeRateCor2_constraint_1, &asn_PER_memb_deltaRangeRateCor2_constr_8, 0, "deltaRangeRateCor2" }, { ATF_NOFLAGS, 0, offsetof(struct SatElement, deltaPseudoRangeCor3), (ASN_TAG_CLASS_CONTEXT | (7 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_deltaPseudoRangeCor3_constraint_1, &asn_PER_memb_deltaPseudoRangeCor3_constr_9, 0, "deltaPseudoRangeCor3" }, { ATF_NOFLAGS, 0, offsetof(struct SatElement, deltaRangeRateCor3), (ASN_TAG_CLASS_CONTEXT | (8 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_deltaRangeRateCor3_constraint_1, &asn_PER_memb_deltaRangeRateCor3_constr_10, 0, "deltaRangeRateCor3" }, }; static ber_tlv_tag_t asn_DEF_SatElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_SatElement_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* satelliteID at 664 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* iode at 667 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* udre at 669 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* pseudoRangeCor at 673 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* rangeRateCor at 677 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* deltaPseudoRangeCor2 at 680 */ { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* deltaRangeRateCor2 at 683 */ { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 }, /* deltaPseudoRangeCor3 at 686 */ { (ASN_TAG_CLASS_CONTEXT | (8 << 2)), 8, 0, 0 } /* deltaRangeRateCor3 at 689 */ }; static asn_SEQUENCE_specifics_t asn_SPC_SatElement_specs_1 = { sizeof(struct SatElement), offsetof(struct SatElement, _asn_ctx), asn_MAP_SatElement_tag2el_1, 9, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_SatElement = { "SatElement", "SatElement", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SatElement_tags_1, sizeof(asn_DEF_SatElement_tags_1) /sizeof(asn_DEF_SatElement_tags_1[0]), /* 1 */ asn_DEF_SatElement_tags_1, /* Same as above */ sizeof(asn_DEF_SatElement_tags_1) /sizeof(asn_DEF_SatElement_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_SatElement_1, 9, /* Elements count */ &asn_SPC_SatElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SatElement.h000066400000000000000000000015701305042567700226770ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SatElement_H_ #define _SatElement_H_ #include /* Including external dependencies */ #include "SatelliteID.h" #include #include #ifdef __cplusplus extern "C" { #endif /* SatElement */ typedef struct SatElement { SatelliteID_t satelliteID; long iode; long udre; long pseudoRangeCor; long rangeRateCor; long deltaPseudoRangeCor2; long deltaRangeRateCor2; long deltaPseudoRangeCor3; long deltaRangeRateCor3; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SatElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SatElement; #ifdef __cplusplus } #endif #endif /* _SatElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SatStatus.c000066400000000000000000000047251305042567700225710ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SatStatus.h" static asn_per_constraints_t asn_PER_type_SatStatus_constr_1 = { { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 2 } /* (0..2,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SatStatus_1[] = { { ATF_NOFLAGS, 0, offsetof(struct SatStatus, choice.newSatelliteAndModelUC), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_UncompressedEphemeris, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "newSatelliteAndModelUC" }, { ATF_NOFLAGS, 0, offsetof(struct SatStatus, choice.oldSatelliteAndModel), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NULL, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "oldSatelliteAndModel" }, { ATF_NOFLAGS, 0, offsetof(struct SatStatus, choice.newNaviModelUC), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_UncompressedEphemeris, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "newNaviModelUC" }, }; static asn_TYPE_tag2member_t asn_MAP_SatStatus_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* newSatelliteAndModelUC at 710 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* oldSatelliteAndModel at 713 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* newNaviModelUC at 716 */ }; static asn_CHOICE_specifics_t asn_SPC_SatStatus_specs_1 = { sizeof(struct SatStatus), offsetof(struct SatStatus, _asn_ctx), offsetof(struct SatStatus, present), sizeof(((struct SatStatus *)0)->present), asn_MAP_SatStatus_tag2el_1, 3, /* Count of tags in the map */ 0, 3 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_SatStatus = { "SatStatus", "SatStatus", CHOICE_free, CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_decode_uper, CHOICE_encode_uper, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ &asn_PER_type_SatStatus_constr_1, asn_MBR_SatStatus_1, 3, /* Elements count */ &asn_SPC_SatStatus_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SatStatus.h000066400000000000000000000022371305042567700225720ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SatStatus_H_ #define _SatStatus_H_ #include /* Including external dependencies */ #include "UncompressedEphemeris.h" #include #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum SatStatus_PR { SatStatus_PR_NOTHING, /* No components present */ SatStatus_PR_newSatelliteAndModelUC, SatStatus_PR_oldSatelliteAndModel, SatStatus_PR_newNaviModelUC, /* Extensions may appear below */ } SatStatus_PR; /* SatStatus */ typedef struct SatStatus { SatStatus_PR present; union SatStatus_u { UncompressedEphemeris_t newSatelliteAndModelUC; NULL_t oldSatelliteAndModel; UncompressedEphemeris_t newNaviModelUC; /* * This type is extensible, * possible extensions are below. */ } choice; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SatStatus_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SatStatus; #ifdef __cplusplus } #endif #endif /* _SatStatus_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SatelliteID.c000066400000000000000000000111461305042567700227740ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SatelliteID.h" int SatelliteID_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 63)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void SatelliteID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void SatelliteID_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { SatelliteID_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int SatelliteID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { SatelliteID_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t SatelliteID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { SatelliteID_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t SatelliteID_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { SatelliteID_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t SatelliteID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { SatelliteID_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t SatelliteID_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { SatelliteID_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t SatelliteID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { SatelliteID_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t SatelliteID_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { SatelliteID_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_SatelliteID_constr_1 = { { APC_CONSTRAINED, 6, 6, 0, 63 } /* (0..63) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_SatelliteID_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_SatelliteID = { "SatelliteID", "SatelliteID", SatelliteID_free, SatelliteID_print, SatelliteID_constraint, SatelliteID_decode_ber, SatelliteID_encode_der, SatelliteID_decode_xer, SatelliteID_encode_xer, SatelliteID_decode_uper, SatelliteID_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SatelliteID_tags_1, sizeof(asn_DEF_SatelliteID_tags_1) /sizeof(asn_DEF_SatelliteID_tags_1[0]), /* 1 */ asn_DEF_SatelliteID_tags_1, /* Same as above */ sizeof(asn_DEF_SatelliteID_tags_1) /sizeof(asn_DEF_SatelliteID_tags_1[0]), /* 1 */ &asn_PER_type_SatelliteID_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SatelliteID.h000066400000000000000000000016141305042567700230000ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SatelliteID_H_ #define _SatelliteID_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* SatelliteID */ typedef long SatelliteID_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SatelliteID; asn_struct_free_f SatelliteID_free; asn_struct_print_f SatelliteID_print; asn_constr_check_f SatelliteID_constraint; ber_type_decoder_f SatelliteID_decode_ber; der_type_encoder_f SatelliteID_encode_der; xer_type_decoder_f SatelliteID_decode_xer; xer_type_encoder_f SatelliteID_encode_xer; per_type_decoder_f SatelliteID_decode_uper; per_type_encoder_f SatelliteID_encode_uper; #ifdef __cplusplus } #endif #endif /* _SatelliteID_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOf-BadSatelliteSet.c000066400000000000000000000034331305042567700246550ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOf-BadSatelliteSet.h" static asn_per_constraints_t asn_PER_type_SeqOf_BadSatelliteSet_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 4, 4, 1, 16 } /* (SIZE(1..16)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOf_BadSatelliteSet_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_SatelliteID, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOf_BadSatelliteSet_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOf_BadSatelliteSet_specs_1 = { sizeof(struct SeqOf_BadSatelliteSet), offsetof(struct SeqOf_BadSatelliteSet, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOf_BadSatelliteSet = { "SeqOf-BadSatelliteSet", "SeqOf-BadSatelliteSet", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOf_BadSatelliteSet_tags_1, sizeof(asn_DEF_SeqOf_BadSatelliteSet_tags_1) /sizeof(asn_DEF_SeqOf_BadSatelliteSet_tags_1[0]), /* 1 */ asn_DEF_SeqOf_BadSatelliteSet_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOf_BadSatelliteSet_tags_1) /sizeof(asn_DEF_SeqOf_BadSatelliteSet_tags_1[0]), /* 1 */ &asn_PER_type_SeqOf_BadSatelliteSet_constr_1, asn_MBR_SeqOf_BadSatelliteSet_1, 1, /* Single element */ &asn_SPC_SeqOf_BadSatelliteSet_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOf-BadSatelliteSet.h000066400000000000000000000014331305042567700246600ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOf_BadSatelliteSet_H_ #define _SeqOf_BadSatelliteSet_H_ #include /* Including external dependencies */ #include "SatelliteID.h" #include #include #ifdef __cplusplus extern "C" { #endif /* SeqOf-BadSatelliteSet */ typedef struct SeqOf_BadSatelliteSet { A_SEQUENCE_OF(SatelliteID_t) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOf_BadSatelliteSet_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOf_BadSatelliteSet; #ifdef __cplusplus } #endif #endif /* _SeqOf_BadSatelliteSet_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOf-GANSSDataBits.c000066400000000000000000000033741305042567700241370ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOf-GANSSDataBits.h" static asn_per_constraints_t asn_PER_type_SeqOf_GANSSDataBits_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 10, 10, 1, 1024 } /* (SIZE(1..1024)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOf_GANSSDataBits_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_GANSSDataBit, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOf_GANSSDataBits_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOf_GANSSDataBits_specs_1 = { sizeof(struct SeqOf_GANSSDataBits), offsetof(struct SeqOf_GANSSDataBits, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOf_GANSSDataBits = { "SeqOf-GANSSDataBits", "SeqOf-GANSSDataBits", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOf_GANSSDataBits_tags_1, sizeof(asn_DEF_SeqOf_GANSSDataBits_tags_1) /sizeof(asn_DEF_SeqOf_GANSSDataBits_tags_1[0]), /* 1 */ asn_DEF_SeqOf_GANSSDataBits_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOf_GANSSDataBits_tags_1) /sizeof(asn_DEF_SeqOf_GANSSDataBits_tags_1[0]), /* 1 */ &asn_PER_type_SeqOf_GANSSDataBits_constr_1, asn_MBR_SeqOf_GANSSDataBits_1, 1, /* Single element */ &asn_SPC_SeqOf_GANSSDataBits_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOf-GANSSDataBits.h000066400000000000000000000014171305042567700241400ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOf_GANSSDataBits_H_ #define _SeqOf_GANSSDataBits_H_ #include /* Including external dependencies */ #include "GANSSDataBit.h" #include #include #ifdef __cplusplus extern "C" { #endif /* SeqOf-GANSSDataBits */ typedef struct SeqOf_GANSSDataBits { A_SEQUENCE_OF(GANSSDataBit_t) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOf_GANSSDataBits_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOf_GANSSDataBits; #ifdef __cplusplus } #endif #endif /* _SeqOf_GANSSDataBits_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfAcquisElement.c000066400000000000000000000033451305042567700243300ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfAcquisElement.h" static asn_per_constraints_t asn_PER_type_SeqOfAcquisElement_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 4, 4, 1, 16 } /* (SIZE(1..16)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfAcquisElement_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_AcquisElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfAcquisElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfAcquisElement_specs_1 = { sizeof(struct SeqOfAcquisElement), offsetof(struct SeqOfAcquisElement, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfAcquisElement = { "SeqOfAcquisElement", "SeqOfAcquisElement", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfAcquisElement_tags_1, sizeof(asn_DEF_SeqOfAcquisElement_tags_1) /sizeof(asn_DEF_SeqOfAcquisElement_tags_1[0]), /* 1 */ asn_DEF_SeqOfAcquisElement_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfAcquisElement_tags_1) /sizeof(asn_DEF_SeqOfAcquisElement_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfAcquisElement_constr_1, asn_MBR_SeqOfAcquisElement_1, 1, /* Single element */ &asn_SPC_SeqOfAcquisElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfAcquisElement.h000066400000000000000000000015401305042567700243300ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfAcquisElement_H_ #define _SeqOfAcquisElement_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct AcquisElement; /* SeqOfAcquisElement */ typedef struct SeqOfAcquisElement { A_SEQUENCE_OF(struct AcquisElement) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfAcquisElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfAcquisElement; #ifdef __cplusplus } #endif /* Referred external types */ #include "AcquisElement.h" #endif /* _SeqOfAcquisElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfAlmanacElement.c000066400000000000000000000033711305042567700244360ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfAlmanacElement.h" static asn_per_constraints_t asn_PER_type_SeqOfAlmanacElement_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 6, 6, 1, 64 } /* (SIZE(1..64)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfAlmanacElement_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_AlmanacElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfAlmanacElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfAlmanacElement_specs_1 = { sizeof(struct SeqOfAlmanacElement), offsetof(struct SeqOfAlmanacElement, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfAlmanacElement = { "SeqOfAlmanacElement", "SeqOfAlmanacElement", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfAlmanacElement_tags_1, sizeof(asn_DEF_SeqOfAlmanacElement_tags_1) /sizeof(asn_DEF_SeqOfAlmanacElement_tags_1[0]), /* 1 */ asn_DEF_SeqOfAlmanacElement_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfAlmanacElement_tags_1) /sizeof(asn_DEF_SeqOfAlmanacElement_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfAlmanacElement_constr_1, asn_MBR_SeqOfAlmanacElement_1, 1, /* Single element */ &asn_SPC_SeqOfAlmanacElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfAlmanacElement.h000066400000000000000000000015521305042567700244420ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfAlmanacElement_H_ #define _SeqOfAlmanacElement_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct AlmanacElement; /* SeqOfAlmanacElement */ typedef struct SeqOfAlmanacElement { A_SEQUENCE_OF(struct AlmanacElement) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfAlmanacElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfAlmanacElement; #ifdef __cplusplus } #endif /* Referred external types */ #include "AlmanacElement.h" #endif /* _SeqOfAlmanacElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfBadSignalElement.c000066400000000000000000000034411305042567700247240ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfBadSignalElement.h" static asn_per_constraints_t asn_PER_type_SeqOfBadSignalElement_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 4, 4, 1, 16 } /* (SIZE(1..16)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfBadSignalElement_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_BadSignalElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfBadSignalElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfBadSignalElement_specs_1 = { sizeof(struct SeqOfBadSignalElement), offsetof(struct SeqOfBadSignalElement, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfBadSignalElement = { "SeqOfBadSignalElement", "SeqOfBadSignalElement", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfBadSignalElement_tags_1, sizeof(asn_DEF_SeqOfBadSignalElement_tags_1) /sizeof(asn_DEF_SeqOfBadSignalElement_tags_1[0]), /* 1 */ asn_DEF_SeqOfBadSignalElement_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfBadSignalElement_tags_1) /sizeof(asn_DEF_SeqOfBadSignalElement_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfBadSignalElement_constr_1, asn_MBR_SeqOfBadSignalElement_1, 1, /* Single element */ &asn_SPC_SeqOfBadSignalElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfBadSignalElement.h000066400000000000000000000015761305042567700247400ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfBadSignalElement_H_ #define _SeqOfBadSignalElement_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct BadSignalElement; /* SeqOfBadSignalElement */ typedef struct SeqOfBadSignalElement { A_SEQUENCE_OF(struct BadSignalElement) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfBadSignalElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfBadSignalElement; #ifdef __cplusplus } #endif /* Referred external types */ #include "BadSignalElement.h" #endif /* _SeqOfBadSignalElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfDGANSSSgnElement.c000066400000000000000000000034411305042567700245270ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfDGANSSSgnElement.h" static asn_per_constraints_t asn_PER_type_SeqOfDGANSSSgnElement_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 4, 4, 1, 16 } /* (SIZE(1..16)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfDGANSSSgnElement_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_DGANSSSgnElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfDGANSSSgnElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfDGANSSSgnElement_specs_1 = { sizeof(struct SeqOfDGANSSSgnElement), offsetof(struct SeqOfDGANSSSgnElement, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfDGANSSSgnElement = { "SeqOfDGANSSSgnElement", "SeqOfDGANSSSgnElement", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfDGANSSSgnElement_tags_1, sizeof(asn_DEF_SeqOfDGANSSSgnElement_tags_1) /sizeof(asn_DEF_SeqOfDGANSSSgnElement_tags_1[0]), /* 1 */ asn_DEF_SeqOfDGANSSSgnElement_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfDGANSSSgnElement_tags_1) /sizeof(asn_DEF_SeqOfDGANSSSgnElement_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfDGANSSSgnElement_constr_1, asn_MBR_SeqOfDGANSSSgnElement_1, 1, /* Single element */ &asn_SPC_SeqOfDGANSSSgnElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfDGANSSSgnElement.h000066400000000000000000000015761305042567700245430ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfDGANSSSgnElement_H_ #define _SeqOfDGANSSSgnElement_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct DGANSSSgnElement; /* SeqOfDGANSSSgnElement */ typedef struct SeqOfDGANSSSgnElement { A_SEQUENCE_OF(struct DGANSSSgnElement) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfDGANSSSgnElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfDGANSSSgnElement; #ifdef __cplusplus } #endif /* Referred external types */ #include "DGANSSSgnElement.h" #endif /* _SeqOfDGANSSSgnElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfGANSS-MsrSetElement.c000066400000000000000000000035331305042567700251700ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfGANSS-MsrSetElement.h" static asn_per_constraints_t asn_PER_type_SeqOfGANSS_MsrSetElement_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 2, 2, 1, 3 } /* (SIZE(1..3)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfGANSS_MsrSetElement_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_GANSS_MsrSetElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfGANSS_MsrSetElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfGANSS_MsrSetElement_specs_1 = { sizeof(struct SeqOfGANSS_MsrSetElement), offsetof(struct SeqOfGANSS_MsrSetElement, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfGANSS_MsrSetElement = { "SeqOfGANSS-MsrSetElement", "SeqOfGANSS-MsrSetElement", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfGANSS_MsrSetElement_tags_1, sizeof(asn_DEF_SeqOfGANSS_MsrSetElement_tags_1) /sizeof(asn_DEF_SeqOfGANSS_MsrSetElement_tags_1[0]), /* 1 */ asn_DEF_SeqOfGANSS_MsrSetElement_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfGANSS_MsrSetElement_tags_1) /sizeof(asn_DEF_SeqOfGANSS_MsrSetElement_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfGANSS_MsrSetElement_constr_1, asn_MBR_SeqOfGANSS_MsrSetElement_1, 1, /* Single element */ &asn_SPC_SeqOfGANSS_MsrSetElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfGANSS-MsrSetElement.h000066400000000000000000000016341305042567700251750ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfGANSS_MsrSetElement_H_ #define _SeqOfGANSS_MsrSetElement_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct GANSS_MsrSetElement; /* SeqOfGANSS-MsrSetElement */ typedef struct SeqOfGANSS_MsrSetElement { A_SEQUENCE_OF(struct GANSS_MsrSetElement) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfGANSS_MsrSetElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfGANSS_MsrSetElement; #ifdef __cplusplus } #endif /* Referred external types */ #include "GANSS-MsrSetElement.h" #endif /* _SeqOfGANSS_MsrSetElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfGANSS-SgnElement.c000066400000000000000000000034411305042567700245000ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfGANSS-SgnElement.h" static asn_per_constraints_t asn_PER_type_SeqOfGANSS_SgnElement_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 4, 4, 1, 16 } /* (SIZE(1..16)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfGANSS_SgnElement_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_GANSS_SgnElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfGANSS_SgnElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfGANSS_SgnElement_specs_1 = { sizeof(struct SeqOfGANSS_SgnElement), offsetof(struct SeqOfGANSS_SgnElement, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfGANSS_SgnElement = { "SeqOfGANSS-SgnElement", "SeqOfGANSS-SgnElement", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfGANSS_SgnElement_tags_1, sizeof(asn_DEF_SeqOfGANSS_SgnElement_tags_1) /sizeof(asn_DEF_SeqOfGANSS_SgnElement_tags_1[0]), /* 1 */ asn_DEF_SeqOfGANSS_SgnElement_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfGANSS_SgnElement_tags_1) /sizeof(asn_DEF_SeqOfGANSS_SgnElement_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfGANSS_SgnElement_constr_1, asn_MBR_SeqOfGANSS_SgnElement_1, 1, /* Single element */ &asn_SPC_SeqOfGANSS_SgnElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfGANSS-SgnElement.h000066400000000000000000000015761305042567700245140ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfGANSS_SgnElement_H_ #define _SeqOfGANSS_SgnElement_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct GANSS_SgnElement; /* SeqOfGANSS-SgnElement */ typedef struct SeqOfGANSS_SgnElement { A_SEQUENCE_OF(struct GANSS_SgnElement) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfGANSS_SgnElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfGANSS_SgnElement; #ifdef __cplusplus } #endif /* Referred external types */ #include "GANSS-SgnElement.h" #endif /* _SeqOfGANSS_SgnElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfGANSS-SgnTypeElement.c000066400000000000000000000035571305042567700253520ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfGANSS-SgnTypeElement.h" static asn_per_constraints_t asn_PER_type_SeqOfGANSS_SgnTypeElement_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 3, 3, 1, 6 } /* (SIZE(1..6)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfGANSS_SgnTypeElement_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_GANSS_SgnTypeElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfGANSS_SgnTypeElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfGANSS_SgnTypeElement_specs_1 = { sizeof(struct SeqOfGANSS_SgnTypeElement), offsetof(struct SeqOfGANSS_SgnTypeElement, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfGANSS_SgnTypeElement = { "SeqOfGANSS-SgnTypeElement", "SeqOfGANSS-SgnTypeElement", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfGANSS_SgnTypeElement_tags_1, sizeof(asn_DEF_SeqOfGANSS_SgnTypeElement_tags_1) /sizeof(asn_DEF_SeqOfGANSS_SgnTypeElement_tags_1[0]), /* 1 */ asn_DEF_SeqOfGANSS_SgnTypeElement_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfGANSS_SgnTypeElement_tags_1) /sizeof(asn_DEF_SeqOfGANSS_SgnTypeElement_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfGANSS_SgnTypeElement_constr_1, asn_MBR_SeqOfGANSS_SgnTypeElement_1, 1, /* Single element */ &asn_SPC_SeqOfGANSS_SgnTypeElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfGANSS-SgnTypeElement.h000066400000000000000000000016461305042567700253540ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfGANSS_SgnTypeElement_H_ #define _SeqOfGANSS_SgnTypeElement_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct GANSS_SgnTypeElement; /* SeqOfGANSS-SgnTypeElement */ typedef struct SeqOfGANSS_SgnTypeElement { A_SEQUENCE_OF(struct GANSS_SgnTypeElement) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfGANSS_SgnTypeElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfGANSS_SgnTypeElement; #ifdef __cplusplus } #endif /* Referred external types */ #include "GANSS-SgnTypeElement.h" #endif /* _SeqOfGANSS_SgnTypeElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfGANSSAlmanacElement.c000066400000000000000000000035201305042567700252260ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfGANSSAlmanacElement.h" static asn_per_constraints_t asn_PER_type_SeqOfGANSSAlmanacElement_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 6, 6, 1, 36 } /* (SIZE(1..36)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfGANSSAlmanacElement_1[] = { { ATF_POINTER, 0, 0, -1 /* Ambiguous tag (CHOICE?) */, 0, &asn_DEF_GANSSAlmanacElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfGANSSAlmanacElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfGANSSAlmanacElement_specs_1 = { sizeof(struct SeqOfGANSSAlmanacElement), offsetof(struct SeqOfGANSSAlmanacElement, _asn_ctx), 2, /* XER encoding is XMLValueList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfGANSSAlmanacElement = { "SeqOfGANSSAlmanacElement", "SeqOfGANSSAlmanacElement", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfGANSSAlmanacElement_tags_1, sizeof(asn_DEF_SeqOfGANSSAlmanacElement_tags_1) /sizeof(asn_DEF_SeqOfGANSSAlmanacElement_tags_1[0]), /* 1 */ asn_DEF_SeqOfGANSSAlmanacElement_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfGANSSAlmanacElement_tags_1) /sizeof(asn_DEF_SeqOfGANSSAlmanacElement_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfGANSSAlmanacElement_constr_1, asn_MBR_SeqOfGANSSAlmanacElement_1, 1, /* Single element */ &asn_SPC_SeqOfGANSSAlmanacElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfGANSSAlmanacElement.h000066400000000000000000000016341305042567700252370ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfGANSSAlmanacElement_H_ #define _SeqOfGANSSAlmanacElement_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct GANSSAlmanacElement; /* SeqOfGANSSAlmanacElement */ typedef struct SeqOfGANSSAlmanacElement { A_SEQUENCE_OF(struct GANSSAlmanacElement) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfGANSSAlmanacElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfGANSSAlmanacElement; #ifdef __cplusplus } #endif /* Referred external types */ #include "GANSSAlmanacElement.h" #endif /* _SeqOfGANSSAlmanacElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfGANSSGenericAssistDataElement.c000066400000000000000000000040431305042567700272300ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfGANSSGenericAssistDataElement.h" static asn_per_constraints_t asn_PER_type_SeqOfGANSSGenericAssistDataElement_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 3, 3, 1, 8 } /* (SIZE(1..8)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfGANSSGenericAssistDataElement_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_GANSSGenericAssistDataElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfGANSSGenericAssistDataElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfGANSSGenericAssistDataElement_specs_1 = { sizeof(struct SeqOfGANSSGenericAssistDataElement), offsetof(struct SeqOfGANSSGenericAssistDataElement, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfGANSSGenericAssistDataElement = { "SeqOfGANSSGenericAssistDataElement", "SeqOfGANSSGenericAssistDataElement", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfGANSSGenericAssistDataElement_tags_1, sizeof(asn_DEF_SeqOfGANSSGenericAssistDataElement_tags_1) /sizeof(asn_DEF_SeqOfGANSSGenericAssistDataElement_tags_1[0]), /* 1 */ asn_DEF_SeqOfGANSSGenericAssistDataElement_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfGANSSGenericAssistDataElement_tags_1) /sizeof(asn_DEF_SeqOfGANSSGenericAssistDataElement_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfGANSSGenericAssistDataElement_constr_1, asn_MBR_SeqOfGANSSGenericAssistDataElement_1, 1, /* Single element */ &asn_SPC_SeqOfGANSSGenericAssistDataElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfGANSSGenericAssistDataElement.h000066400000000000000000000020001305042567700272240ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfGANSSGenericAssistDataElement_H_ #define _SeqOfGANSSGenericAssistDataElement_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct GANSSGenericAssistDataElement; /* SeqOfGANSSGenericAssistDataElement */ typedef struct SeqOfGANSSGenericAssistDataElement { A_SEQUENCE_OF(struct GANSSGenericAssistDataElement) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfGANSSGenericAssistDataElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfGANSSGenericAssistDataElement; #ifdef __cplusplus } #endif /* Referred external types */ #include "GANSSGenericAssistDataElement.h" #endif /* _SeqOfGANSSGenericAssistDataElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfGANSSRefMeasurementElement.c000066400000000000000000000037511305042567700266220ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfGANSSRefMeasurementElement.h" static asn_per_constraints_t asn_PER_type_SeqOfGANSSRefMeasurementElement_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 4, 4, 1, 16 } /* (SIZE(1..16)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfGANSSRefMeasurementElement_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_GANSSRefMeasurementElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfGANSSRefMeasurementElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfGANSSRefMeasurementElement_specs_1 = { sizeof(struct SeqOfGANSSRefMeasurementElement), offsetof(struct SeqOfGANSSRefMeasurementElement, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfGANSSRefMeasurementElement = { "SeqOfGANSSRefMeasurementElement", "SeqOfGANSSRefMeasurementElement", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfGANSSRefMeasurementElement_tags_1, sizeof(asn_DEF_SeqOfGANSSRefMeasurementElement_tags_1) /sizeof(asn_DEF_SeqOfGANSSRefMeasurementElement_tags_1[0]), /* 1 */ asn_DEF_SeqOfGANSSRefMeasurementElement_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfGANSSRefMeasurementElement_tags_1) /sizeof(asn_DEF_SeqOfGANSSRefMeasurementElement_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfGANSSRefMeasurementElement_constr_1, asn_MBR_SeqOfGANSSRefMeasurementElement_1, 1, /* Single element */ &asn_SPC_SeqOfGANSSRefMeasurementElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfGANSSRefMeasurementElement.h000066400000000000000000000017421305042567700266250ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfGANSSRefMeasurementElement_H_ #define _SeqOfGANSSRefMeasurementElement_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct GANSSRefMeasurementElement; /* SeqOfGANSSRefMeasurementElement */ typedef struct SeqOfGANSSRefMeasurementElement { A_SEQUENCE_OF(struct GANSSRefMeasurementElement) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfGANSSRefMeasurementElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfGANSSRefMeasurementElement; #ifdef __cplusplus } #endif /* Referred external types */ #include "GANSSRefMeasurementElement.h" #endif /* _SeqOfGANSSRefMeasurementElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfGANSSSatelliteElement.c000066400000000000000000000036051305042567700256240ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfGANSSSatelliteElement.h" static asn_per_constraints_t asn_PER_type_SeqOfGANSSSatelliteElement_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 5, 5, 1, 32 } /* (SIZE(1..32)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfGANSSSatelliteElement_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_GANSSSatelliteElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfGANSSSatelliteElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfGANSSSatelliteElement_specs_1 = { sizeof(struct SeqOfGANSSSatelliteElement), offsetof(struct SeqOfGANSSSatelliteElement, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfGANSSSatelliteElement = { "SeqOfGANSSSatelliteElement", "SeqOfGANSSSatelliteElement", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfGANSSSatelliteElement_tags_1, sizeof(asn_DEF_SeqOfGANSSSatelliteElement_tags_1) /sizeof(asn_DEF_SeqOfGANSSSatelliteElement_tags_1[0]), /* 1 */ asn_DEF_SeqOfGANSSSatelliteElement_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfGANSSSatelliteElement_tags_1) /sizeof(asn_DEF_SeqOfGANSSSatelliteElement_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfGANSSSatelliteElement_constr_1, asn_MBR_SeqOfGANSSSatelliteElement_1, 1, /* Single element */ &asn_SPC_SeqOfGANSSSatelliteElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfGANSSSatelliteElement.h000066400000000000000000000016601305042567700256300ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfGANSSSatelliteElement_H_ #define _SeqOfGANSSSatelliteElement_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct GANSSSatelliteElement; /* SeqOfGANSSSatelliteElement */ typedef struct SeqOfGANSSSatelliteElement { A_SEQUENCE_OF(struct GANSSSatelliteElement) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfGANSSSatelliteElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfGANSSSatelliteElement; #ifdef __cplusplus } #endif /* Referred external types */ #include "GANSSSatelliteElement.h" #endif /* _SeqOfGANSSSatelliteElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfGANSSTimeModel.c000066400000000000000000000033761305042567700242500ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfGANSSTimeModel.h" static asn_per_constraints_t asn_PER_type_SeqOfGANSSTimeModel_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 3, 3, 1, 7 } /* (SIZE(1..7)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfGANSSTimeModel_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_GANSSTimeModelElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfGANSSTimeModel_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfGANSSTimeModel_specs_1 = { sizeof(struct SeqOfGANSSTimeModel), offsetof(struct SeqOfGANSSTimeModel, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfGANSSTimeModel = { "SeqOfGANSSTimeModel", "SeqOfGANSSTimeModel", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfGANSSTimeModel_tags_1, sizeof(asn_DEF_SeqOfGANSSTimeModel_tags_1) /sizeof(asn_DEF_SeqOfGANSSTimeModel_tags_1[0]), /* 1 */ asn_DEF_SeqOfGANSSTimeModel_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfGANSSTimeModel_tags_1) /sizeof(asn_DEF_SeqOfGANSSTimeModel_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfGANSSTimeModel_constr_1, asn_MBR_SeqOfGANSSTimeModel_1, 1, /* Single element */ &asn_SPC_SeqOfGANSSTimeModel_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfGANSSTimeModel.h000066400000000000000000000015771305042567700242560ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfGANSSTimeModel_H_ #define _SeqOfGANSSTimeModel_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct GANSSTimeModelElement; /* SeqOfGANSSTimeModel */ typedef struct SeqOfGANSSTimeModel { A_SEQUENCE_OF(struct GANSSTimeModelElement) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfGANSSTimeModel_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfGANSSTimeModel; #ifdef __cplusplus } #endif /* Referred external types */ #include "GANSSTimeModelElement.h" #endif /* _SeqOfGANSSTimeModel_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfGPS-MsrElement.c000066400000000000000000000033711305042567700242720ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfGPS-MsrElement.h" static asn_per_constraints_t asn_PER_type_SeqOfGPS_MsrElement_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 4, 4, 1, 16 } /* (SIZE(1..16)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfGPS_MsrElement_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_GPS_MsrElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfGPS_MsrElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfGPS_MsrElement_specs_1 = { sizeof(struct SeqOfGPS_MsrElement), offsetof(struct SeqOfGPS_MsrElement, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfGPS_MsrElement = { "SeqOfGPS-MsrElement", "SeqOfGPS-MsrElement", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfGPS_MsrElement_tags_1, sizeof(asn_DEF_SeqOfGPS_MsrElement_tags_1) /sizeof(asn_DEF_SeqOfGPS_MsrElement_tags_1[0]), /* 1 */ asn_DEF_SeqOfGPS_MsrElement_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfGPS_MsrElement_tags_1) /sizeof(asn_DEF_SeqOfGPS_MsrElement_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfGPS_MsrElement_constr_1, asn_MBR_SeqOfGPS_MsrElement_1, 1, /* Single element */ &asn_SPC_SeqOfGPS_MsrElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfGPS-MsrElement.h000066400000000000000000000015521305042567700242760ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfGPS_MsrElement_H_ #define _SeqOfGPS_MsrElement_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct GPS_MsrElement; /* SeqOfGPS-MsrElement */ typedef struct SeqOfGPS_MsrElement { A_SEQUENCE_OF(struct GPS_MsrElement) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfGPS_MsrElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfGPS_MsrElement; #ifdef __cplusplus } #endif /* Referred external types */ #include "GPS-MsrElement.h" #endif /* _SeqOfGPS_MsrElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfGPS-MsrSetElement.c000066400000000000000000000034631305042567700247500ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfGPS-MsrSetElement.h" static asn_per_constraints_t asn_PER_type_SeqOfGPS_MsrSetElement_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 2, 2, 1, 3 } /* (SIZE(1..3)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfGPS_MsrSetElement_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_GPS_MsrSetElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfGPS_MsrSetElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfGPS_MsrSetElement_specs_1 = { sizeof(struct SeqOfGPS_MsrSetElement), offsetof(struct SeqOfGPS_MsrSetElement, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfGPS_MsrSetElement = { "SeqOfGPS-MsrSetElement", "SeqOfGPS-MsrSetElement", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfGPS_MsrSetElement_tags_1, sizeof(asn_DEF_SeqOfGPS_MsrSetElement_tags_1) /sizeof(asn_DEF_SeqOfGPS_MsrSetElement_tags_1[0]), /* 1 */ asn_DEF_SeqOfGPS_MsrSetElement_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfGPS_MsrSetElement_tags_1) /sizeof(asn_DEF_SeqOfGPS_MsrSetElement_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfGPS_MsrSetElement_constr_1, asn_MBR_SeqOfGPS_MsrSetElement_1, 1, /* Single element */ &asn_SPC_SeqOfGPS_MsrSetElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfGPS-MsrSetElement.h000066400000000000000000000016101305042567700247450ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfGPS_MsrSetElement_H_ #define _SeqOfGPS_MsrSetElement_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct GPS_MsrSetElement; /* SeqOfGPS-MsrSetElement */ typedef struct SeqOfGPS_MsrSetElement { A_SEQUENCE_OF(struct GPS_MsrSetElement) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfGPS_MsrSetElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfGPS_MsrSetElement; #ifdef __cplusplus } #endif /* Referred external types */ #include "GPS-MsrSetElement.h" #endif /* _SeqOfGPS_MsrSetElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfMsrAssistBTS-R98-ExpOTD.c000066400000000000000000000036551305042567700255570ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfMsrAssistBTS-R98-ExpOTD.h" static asn_per_constraints_t asn_PER_type_SeqOfMsrAssistBTS_R98_ExpOTD_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 4, 4, 1, 15 } /* (SIZE(1..15)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfMsrAssistBTS_R98_ExpOTD_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_MsrAssistBTS_R98_ExpOTD, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfMsrAssistBTS_R98_ExpOTD_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfMsrAssistBTS_R98_ExpOTD_specs_1 = { sizeof(struct SeqOfMsrAssistBTS_R98_ExpOTD), offsetof(struct SeqOfMsrAssistBTS_R98_ExpOTD, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfMsrAssistBTS_R98_ExpOTD = { "SeqOfMsrAssistBTS-R98-ExpOTD", "SeqOfMsrAssistBTS-R98-ExpOTD", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfMsrAssistBTS_R98_ExpOTD_tags_1, sizeof(asn_DEF_SeqOfMsrAssistBTS_R98_ExpOTD_tags_1) /sizeof(asn_DEF_SeqOfMsrAssistBTS_R98_ExpOTD_tags_1[0]), /* 1 */ asn_DEF_SeqOfMsrAssistBTS_R98_ExpOTD_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfMsrAssistBTS_R98_ExpOTD_tags_1) /sizeof(asn_DEF_SeqOfMsrAssistBTS_R98_ExpOTD_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfMsrAssistBTS_R98_ExpOTD_constr_1, asn_MBR_SeqOfMsrAssistBTS_R98_ExpOTD_1, 1, /* Single element */ &asn_SPC_SeqOfMsrAssistBTS_R98_ExpOTD_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfMsrAssistBTS-R98-ExpOTD.h000066400000000000000000000017041305042567700255550ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfMsrAssistBTS_R98_ExpOTD_H_ #define _SeqOfMsrAssistBTS_R98_ExpOTD_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct MsrAssistBTS_R98_ExpOTD; /* SeqOfMsrAssistBTS-R98-ExpOTD */ typedef struct SeqOfMsrAssistBTS_R98_ExpOTD { A_SEQUENCE_OF(struct MsrAssistBTS_R98_ExpOTD) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfMsrAssistBTS_R98_ExpOTD_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfMsrAssistBTS_R98_ExpOTD; #ifdef __cplusplus } #endif /* Referred external types */ #include "MsrAssistBTS-R98-ExpOTD.h" #endif /* _SeqOfMsrAssistBTS_R98_ExpOTD_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfMsrAssistBTS.c000066400000000000000000000033211305042567700240640ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfMsrAssistBTS.h" static asn_per_constraints_t asn_PER_type_SeqOfMsrAssistBTS_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 4, 4, 1, 15 } /* (SIZE(1..15)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfMsrAssistBTS_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_MsrAssistBTS, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfMsrAssistBTS_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfMsrAssistBTS_specs_1 = { sizeof(struct SeqOfMsrAssistBTS), offsetof(struct SeqOfMsrAssistBTS, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfMsrAssistBTS = { "SeqOfMsrAssistBTS", "SeqOfMsrAssistBTS", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfMsrAssistBTS_tags_1, sizeof(asn_DEF_SeqOfMsrAssistBTS_tags_1) /sizeof(asn_DEF_SeqOfMsrAssistBTS_tags_1[0]), /* 1 */ asn_DEF_SeqOfMsrAssistBTS_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfMsrAssistBTS_tags_1) /sizeof(asn_DEF_SeqOfMsrAssistBTS_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfMsrAssistBTS_constr_1, asn_MBR_SeqOfMsrAssistBTS_1, 1, /* Single element */ &asn_SPC_SeqOfMsrAssistBTS_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfMsrAssistBTS.h000066400000000000000000000015261305042567700240760ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfMsrAssistBTS_H_ #define _SeqOfMsrAssistBTS_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct MsrAssistBTS; /* SeqOfMsrAssistBTS */ typedef struct SeqOfMsrAssistBTS { A_SEQUENCE_OF(struct MsrAssistBTS) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfMsrAssistBTS_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfMsrAssistBTS; #ifdef __cplusplus } #endif /* Referred external types */ #include "MsrAssistBTS.h" #endif /* _SeqOfMsrAssistBTS_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfNavModelElement.c000066400000000000000000000034151305042567700246060ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfNavModelElement.h" static asn_per_constraints_t asn_PER_type_SeqOfNavModelElement_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 4, 4, 1, 16 } /* (SIZE(1..16)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfNavModelElement_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_NavModelElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfNavModelElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfNavModelElement_specs_1 = { sizeof(struct SeqOfNavModelElement), offsetof(struct SeqOfNavModelElement, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfNavModelElement = { "SeqOfNavModelElement", "SeqOfNavModelElement", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfNavModelElement_tags_1, sizeof(asn_DEF_SeqOfNavModelElement_tags_1) /sizeof(asn_DEF_SeqOfNavModelElement_tags_1[0]), /* 1 */ asn_DEF_SeqOfNavModelElement_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfNavModelElement_tags_1) /sizeof(asn_DEF_SeqOfNavModelElement_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfNavModelElement_constr_1, asn_MBR_SeqOfNavModelElement_1, 1, /* Single element */ &asn_SPC_SeqOfNavModelElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfNavModelElement.h000066400000000000000000000015641305042567700246160ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfNavModelElement_H_ #define _SeqOfNavModelElement_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct NavModelElement; /* SeqOfNavModelElement */ typedef struct SeqOfNavModelElement { A_SEQUENCE_OF(struct NavModelElement) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfNavModelElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfNavModelElement; #ifdef __cplusplus } #endif /* Referred external types */ #include "NavModelElement.h" #endif /* _SeqOfNavModelElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfOTD-FirstSetMsrs-R98-Ext.c000066400000000000000000000036671305042567700257520ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfOTD-FirstSetMsrs-R98-Ext.h" static asn_per_constraints_t asn_PER_type_SeqOfOTD_FirstSetMsrs_R98_Ext_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 3, 3, 1, 5 } /* (SIZE(1..5)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfOTD_FirstSetMsrs_R98_Ext_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_OTD_FirstSetMsrs, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfOTD_FirstSetMsrs_R98_Ext_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfOTD_FirstSetMsrs_R98_Ext_specs_1 = { sizeof(struct SeqOfOTD_FirstSetMsrs_R98_Ext), offsetof(struct SeqOfOTD_FirstSetMsrs_R98_Ext, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfOTD_FirstSetMsrs_R98_Ext = { "SeqOfOTD-FirstSetMsrs-R98-Ext", "SeqOfOTD-FirstSetMsrs-R98-Ext", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfOTD_FirstSetMsrs_R98_Ext_tags_1, sizeof(asn_DEF_SeqOfOTD_FirstSetMsrs_R98_Ext_tags_1) /sizeof(asn_DEF_SeqOfOTD_FirstSetMsrs_R98_Ext_tags_1[0]), /* 1 */ asn_DEF_SeqOfOTD_FirstSetMsrs_R98_Ext_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfOTD_FirstSetMsrs_R98_Ext_tags_1) /sizeof(asn_DEF_SeqOfOTD_FirstSetMsrs_R98_Ext_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfOTD_FirstSetMsrs_R98_Ext_constr_1, asn_MBR_SeqOfOTD_FirstSetMsrs_R98_Ext_1, 1, /* Single element */ &asn_SPC_SeqOfOTD_FirstSetMsrs_R98_Ext_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfOTD-FirstSetMsrs-R98-Ext.h000066400000000000000000000017001305042567700257410ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfOTD_FirstSetMsrs_R98_Ext_H_ #define _SeqOfOTD_FirstSetMsrs_R98_Ext_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct OTD_MeasurementWithID; /* SeqOfOTD-FirstSetMsrs-R98-Ext */ typedef struct SeqOfOTD_FirstSetMsrs_R98_Ext { A_SEQUENCE_OF(struct OTD_MeasurementWithID) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfOTD_FirstSetMsrs_R98_Ext_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfOTD_FirstSetMsrs_R98_Ext; #ifdef __cplusplus } #endif /* Referred external types */ #include "OTD-FirstSetMsrs.h" #endif /* _SeqOfOTD_FirstSetMsrs_R98_Ext_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfOTD-FirstSetMsrs.c000066400000000000000000000034411305042567700246220ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfOTD-FirstSetMsrs.h" static asn_per_constraints_t asn_PER_type_SeqOfOTD_FirstSetMsrs_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 4, 4, 1, 10 } /* (SIZE(1..10)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfOTD_FirstSetMsrs_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_OTD_FirstSetMsrs, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfOTD_FirstSetMsrs_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfOTD_FirstSetMsrs_specs_1 = { sizeof(struct SeqOfOTD_FirstSetMsrs), offsetof(struct SeqOfOTD_FirstSetMsrs, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfOTD_FirstSetMsrs = { "SeqOfOTD-FirstSetMsrs", "SeqOfOTD-FirstSetMsrs", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfOTD_FirstSetMsrs_tags_1, sizeof(asn_DEF_SeqOfOTD_FirstSetMsrs_tags_1) /sizeof(asn_DEF_SeqOfOTD_FirstSetMsrs_tags_1[0]), /* 1 */ asn_DEF_SeqOfOTD_FirstSetMsrs_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfOTD_FirstSetMsrs_tags_1) /sizeof(asn_DEF_SeqOfOTD_FirstSetMsrs_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfOTD_FirstSetMsrs_constr_1, asn_MBR_SeqOfOTD_FirstSetMsrs_1, 1, /* Single element */ &asn_SPC_SeqOfOTD_FirstSetMsrs_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfOTD-FirstSetMsrs.h000066400000000000000000000016101305042567700246230ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfOTD_FirstSetMsrs_H_ #define _SeqOfOTD_FirstSetMsrs_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct OTD_MeasurementWithID; /* SeqOfOTD-FirstSetMsrs */ typedef struct SeqOfOTD_FirstSetMsrs { A_SEQUENCE_OF(struct OTD_MeasurementWithID) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfOTD_FirstSetMsrs_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfOTD_FirstSetMsrs; #ifdef __cplusplus } #endif /* Referred external types */ #include "OTD-FirstSetMsrs.h" #endif /* _SeqOfOTD_FirstSetMsrs_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfOTD-MsrElementRest.c000066400000000000000000000035071305042567700251260ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfOTD-MsrElementRest.h" static asn_per_constraints_t asn_PER_type_SeqOfOTD_MsrElementRest_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 1, 1, 1, 2 } /* (SIZE(1..2)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfOTD_MsrElementRest_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_OTD_MsrElementRest, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfOTD_MsrElementRest_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfOTD_MsrElementRest_specs_1 = { sizeof(struct SeqOfOTD_MsrElementRest), offsetof(struct SeqOfOTD_MsrElementRest, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfOTD_MsrElementRest = { "SeqOfOTD-MsrElementRest", "SeqOfOTD-MsrElementRest", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfOTD_MsrElementRest_tags_1, sizeof(asn_DEF_SeqOfOTD_MsrElementRest_tags_1) /sizeof(asn_DEF_SeqOfOTD_MsrElementRest_tags_1[0]), /* 1 */ asn_DEF_SeqOfOTD_MsrElementRest_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfOTD_MsrElementRest_tags_1) /sizeof(asn_DEF_SeqOfOTD_MsrElementRest_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfOTD_MsrElementRest_constr_1, asn_MBR_SeqOfOTD_MsrElementRest_1, 1, /* Single element */ &asn_SPC_SeqOfOTD_MsrElementRest_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfOTD-MsrElementRest.h000066400000000000000000000016221305042567700251270ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfOTD_MsrElementRest_H_ #define _SeqOfOTD_MsrElementRest_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct OTD_MsrElementRest; /* SeqOfOTD-MsrElementRest */ typedef struct SeqOfOTD_MsrElementRest { A_SEQUENCE_OF(struct OTD_MsrElementRest) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfOTD_MsrElementRest_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfOTD_MsrElementRest; #ifdef __cplusplus } #endif /* Referred external types */ #include "OTD-MsrElementRest.h" #endif /* _SeqOfOTD_MsrElementRest_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfOTD-MsrsOfOtherSets.c000066400000000000000000000035201305042567700252620ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfOTD-MsrsOfOtherSets.h" static asn_per_constraints_t asn_PER_type_SeqOfOTD_MsrsOfOtherSets_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 4, 4, 1, 10 } /* (SIZE(1..10)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfOTD_MsrsOfOtherSets_1[] = { { ATF_POINTER, 0, 0, -1 /* Ambiguous tag (CHOICE?) */, 0, &asn_DEF_OTD_MsrsOfOtherSets, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfOTD_MsrsOfOtherSets_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfOTD_MsrsOfOtherSets_specs_1 = { sizeof(struct SeqOfOTD_MsrsOfOtherSets), offsetof(struct SeqOfOTD_MsrsOfOtherSets, _asn_ctx), 2, /* XER encoding is XMLValueList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfOTD_MsrsOfOtherSets = { "SeqOfOTD-MsrsOfOtherSets", "SeqOfOTD-MsrsOfOtherSets", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfOTD_MsrsOfOtherSets_tags_1, sizeof(asn_DEF_SeqOfOTD_MsrsOfOtherSets_tags_1) /sizeof(asn_DEF_SeqOfOTD_MsrsOfOtherSets_tags_1[0]), /* 1 */ asn_DEF_SeqOfOTD_MsrsOfOtherSets_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfOTD_MsrsOfOtherSets_tags_1) /sizeof(asn_DEF_SeqOfOTD_MsrsOfOtherSets_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfOTD_MsrsOfOtherSets_constr_1, asn_MBR_SeqOfOTD_MsrsOfOtherSets_1, 1, /* Single element */ &asn_SPC_SeqOfOTD_MsrsOfOtherSets_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfOTD-MsrsOfOtherSets.h000066400000000000000000000016341305042567700252730ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfOTD_MsrsOfOtherSets_H_ #define _SeqOfOTD_MsrsOfOtherSets_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct OTD_MsrsOfOtherSets; /* SeqOfOTD-MsrsOfOtherSets */ typedef struct SeqOfOTD_MsrsOfOtherSets { A_SEQUENCE_OF(struct OTD_MsrsOfOtherSets) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfOTD_MsrsOfOtherSets_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfOTD_MsrsOfOtherSets; #ifdef __cplusplus } #endif /* Referred external types */ #include "OTD-MsrsOfOtherSets.h" #endif /* _SeqOfOTD_MsrsOfOtherSets_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfReferenceIdentityType.c000066400000000000000000000035661305042567700260500ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfReferenceIdentityType.h" static asn_per_constraints_t asn_PER_type_SeqOfReferenceIdentityType_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 2, 2, 1, 3 } /* (SIZE(1..3)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfReferenceIdentityType_1[] = { { ATF_POINTER, 0, 0, -1 /* Ambiguous tag (CHOICE?) */, 0, &asn_DEF_ReferenceIdentityType, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfReferenceIdentityType_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfReferenceIdentityType_specs_1 = { sizeof(struct SeqOfReferenceIdentityType), offsetof(struct SeqOfReferenceIdentityType, _asn_ctx), 2, /* XER encoding is XMLValueList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfReferenceIdentityType = { "SeqOfReferenceIdentityType", "SeqOfReferenceIdentityType", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfReferenceIdentityType_tags_1, sizeof(asn_DEF_SeqOfReferenceIdentityType_tags_1) /sizeof(asn_DEF_SeqOfReferenceIdentityType_tags_1[0]), /* 1 */ asn_DEF_SeqOfReferenceIdentityType_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfReferenceIdentityType_tags_1) /sizeof(asn_DEF_SeqOfReferenceIdentityType_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfReferenceIdentityType_constr_1, asn_MBR_SeqOfReferenceIdentityType_1, 1, /* Single element */ &asn_SPC_SeqOfReferenceIdentityType_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfReferenceIdentityType.h000066400000000000000000000016601305042567700260460ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfReferenceIdentityType_H_ #define _SeqOfReferenceIdentityType_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct ReferenceIdentityType; /* SeqOfReferenceIdentityType */ typedef struct SeqOfReferenceIdentityType { A_SEQUENCE_OF(struct ReferenceIdentityType) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfReferenceIdentityType_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfReferenceIdentityType; #ifdef __cplusplus } #endif /* Referred external types */ #include "ReferenceIdentityType.h" #endif /* _SeqOfReferenceIdentityType_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfSatElement.c000066400000000000000000000032511305042567700236260ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfSatElement.h" static asn_per_constraints_t asn_PER_type_SeqOfSatElement_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 4, 4, 1, 16 } /* (SIZE(1..16)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfSatElement_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_SatElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfSatElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfSatElement_specs_1 = { sizeof(struct SeqOfSatElement), offsetof(struct SeqOfSatElement, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfSatElement = { "SeqOfSatElement", "SeqOfSatElement", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfSatElement_tags_1, sizeof(asn_DEF_SeqOfSatElement_tags_1) /sizeof(asn_DEF_SeqOfSatElement_tags_1[0]), /* 1 */ asn_DEF_SeqOfSatElement_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfSatElement_tags_1) /sizeof(asn_DEF_SeqOfSatElement_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfSatElement_constr_1, asn_MBR_SeqOfSatElement_1, 1, /* Single element */ &asn_SPC_SeqOfSatElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfSatElement.h000066400000000000000000000015021305042567700236300ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfSatElement_H_ #define _SeqOfSatElement_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct SatElement; /* SeqOfSatElement */ typedef struct SeqOfSatElement { A_SEQUENCE_OF(struct SatElement) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfSatElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfSatElement; #ifdef __cplusplus } #endif /* Referred external types */ #include "SatElement.h" #endif /* _SeqOfSatElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfSgnTypeElement.c000066400000000000000000000033671305042567700245000ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfSgnTypeElement.h" static asn_per_constraints_t asn_PER_type_SeqOfSgnTypeElement_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 2, 2, 1, 3 } /* (SIZE(1..3)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfSgnTypeElement_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_SgnTypeElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfSgnTypeElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfSgnTypeElement_specs_1 = { sizeof(struct SeqOfSgnTypeElement), offsetof(struct SeqOfSgnTypeElement, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfSgnTypeElement = { "SeqOfSgnTypeElement", "SeqOfSgnTypeElement", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfSgnTypeElement_tags_1, sizeof(asn_DEF_SeqOfSgnTypeElement_tags_1) /sizeof(asn_DEF_SeqOfSgnTypeElement_tags_1[0]), /* 1 */ asn_DEF_SeqOfSgnTypeElement_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfSgnTypeElement_tags_1) /sizeof(asn_DEF_SeqOfSgnTypeElement_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfSgnTypeElement_constr_1, asn_MBR_SeqOfSgnTypeElement_1, 1, /* Single element */ &asn_SPC_SeqOfSgnTypeElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfSgnTypeElement.h000066400000000000000000000015521305042567700244770ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfSgnTypeElement_H_ #define _SeqOfSgnTypeElement_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct SgnTypeElement; /* SeqOfSgnTypeElement */ typedef struct SeqOfSgnTypeElement { A_SEQUENCE_OF(struct SgnTypeElement) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfSgnTypeElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfSgnTypeElement; #ifdef __cplusplus } #endif /* Referred external types */ #include "SgnTypeElement.h" #endif /* _SeqOfSgnTypeElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfStandardClockModelElement.c000066400000000000000000000037231305042567700266000ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfStandardClockModelElement.h" static asn_per_constraints_t asn_PER_type_SeqOfStandardClockModelElement_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 1, 1, 1, 2 } /* (SIZE(1..2)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfStandardClockModelElement_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_StandardClockModelElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfStandardClockModelElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfStandardClockModelElement_specs_1 = { sizeof(struct SeqOfStandardClockModelElement), offsetof(struct SeqOfStandardClockModelElement, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfStandardClockModelElement = { "SeqOfStandardClockModelElement", "SeqOfStandardClockModelElement", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfStandardClockModelElement_tags_1, sizeof(asn_DEF_SeqOfStandardClockModelElement_tags_1) /sizeof(asn_DEF_SeqOfStandardClockModelElement_tags_1[0]), /* 1 */ asn_DEF_SeqOfStandardClockModelElement_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfStandardClockModelElement_tags_1) /sizeof(asn_DEF_SeqOfStandardClockModelElement_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfStandardClockModelElement_constr_1, asn_MBR_SeqOfStandardClockModelElement_1, 1, /* Single element */ &asn_SPC_SeqOfStandardClockModelElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfStandardClockModelElement.h000066400000000000000000000017301305042567700266010ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfStandardClockModelElement_H_ #define _SeqOfStandardClockModelElement_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct StandardClockModelElement; /* SeqOfStandardClockModelElement */ typedef struct SeqOfStandardClockModelElement { A_SEQUENCE_OF(struct StandardClockModelElement) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfStandardClockModelElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfStandardClockModelElement; #ifdef __cplusplus } #endif /* Referred external types */ #include "StandardClockModelElement.h" #endif /* _SeqOfStandardClockModelElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfSystemInfoAssistBTS-R98-ExpOTD.c000066400000000000000000000040541305042567700271100ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfSystemInfoAssistBTS-R98-ExpOTD.h" static asn_per_constraints_t asn_PER_type_SeqOfSystemInfoAssistBTS_R98_ExpOTD_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 5, 5, 1, 32 } /* (SIZE(1..32)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfSystemInfoAssistBTS_R98_ExpOTD_1[] = { { ATF_POINTER, 0, 0, -1 /* Ambiguous tag (CHOICE?) */, 0, &asn_DEF_SystemInfoAssistBTS_R98_ExpOTD, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfSystemInfoAssistBTS_R98_ExpOTD_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfSystemInfoAssistBTS_R98_ExpOTD_specs_1 = { sizeof(struct SeqOfSystemInfoAssistBTS_R98_ExpOTD), offsetof(struct SeqOfSystemInfoAssistBTS_R98_ExpOTD, _asn_ctx), 2, /* XER encoding is XMLValueList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfSystemInfoAssistBTS_R98_ExpOTD = { "SeqOfSystemInfoAssistBTS-R98-ExpOTD", "SeqOfSystemInfoAssistBTS-R98-ExpOTD", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfSystemInfoAssistBTS_R98_ExpOTD_tags_1, sizeof(asn_DEF_SeqOfSystemInfoAssistBTS_R98_ExpOTD_tags_1) /sizeof(asn_DEF_SeqOfSystemInfoAssistBTS_R98_ExpOTD_tags_1[0]), /* 1 */ asn_DEF_SeqOfSystemInfoAssistBTS_R98_ExpOTD_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfSystemInfoAssistBTS_R98_ExpOTD_tags_1) /sizeof(asn_DEF_SeqOfSystemInfoAssistBTS_R98_ExpOTD_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfSystemInfoAssistBTS_R98_ExpOTD_constr_1, asn_MBR_SeqOfSystemInfoAssistBTS_R98_ExpOTD_1, 1, /* Single element */ &asn_SPC_SeqOfSystemInfoAssistBTS_R98_ExpOTD_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfSystemInfoAssistBTS-R98-ExpOTD.h000066400000000000000000000020121305042567700271050ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfSystemInfoAssistBTS_R98_ExpOTD_H_ #define _SeqOfSystemInfoAssistBTS_R98_ExpOTD_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct SystemInfoAssistBTS_R98_ExpOTD; /* SeqOfSystemInfoAssistBTS-R98-ExpOTD */ typedef struct SeqOfSystemInfoAssistBTS_R98_ExpOTD { A_SEQUENCE_OF(struct SystemInfoAssistBTS_R98_ExpOTD) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfSystemInfoAssistBTS_R98_ExpOTD_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfSystemInfoAssistBTS_R98_ExpOTD; #ifdef __cplusplus } #endif /* Referred external types */ #include "SystemInfoAssistBTS-R98-ExpOTD.h" #endif /* _SeqOfSystemInfoAssistBTS_R98_ExpOTD_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfSystemInfoAssistBTS.c000066400000000000000000000035201305042567700254240ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SeqOfSystemInfoAssistBTS.h" static asn_per_constraints_t asn_PER_type_SeqOfSystemInfoAssistBTS_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 5, 5, 1, 32 } /* (SIZE(1..32)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SeqOfSystemInfoAssistBTS_1[] = { { ATF_POINTER, 0, 0, -1 /* Ambiguous tag (CHOICE?) */, 0, &asn_DEF_SystemInfoAssistBTS, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SeqOfSystemInfoAssistBTS_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SeqOfSystemInfoAssistBTS_specs_1 = { sizeof(struct SeqOfSystemInfoAssistBTS), offsetof(struct SeqOfSystemInfoAssistBTS, _asn_ctx), 2, /* XER encoding is XMLValueList */ }; asn_TYPE_descriptor_t asn_DEF_SeqOfSystemInfoAssistBTS = { "SeqOfSystemInfoAssistBTS", "SeqOfSystemInfoAssistBTS", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SeqOfSystemInfoAssistBTS_tags_1, sizeof(asn_DEF_SeqOfSystemInfoAssistBTS_tags_1) /sizeof(asn_DEF_SeqOfSystemInfoAssistBTS_tags_1[0]), /* 1 */ asn_DEF_SeqOfSystemInfoAssistBTS_tags_1, /* Same as above */ sizeof(asn_DEF_SeqOfSystemInfoAssistBTS_tags_1) /sizeof(asn_DEF_SeqOfSystemInfoAssistBTS_tags_1[0]), /* 1 */ &asn_PER_type_SeqOfSystemInfoAssistBTS_constr_1, asn_MBR_SeqOfSystemInfoAssistBTS_1, 1, /* Single element */ &asn_SPC_SeqOfSystemInfoAssistBTS_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SeqOfSystemInfoAssistBTS.h000066400000000000000000000016341305042567700254350ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SeqOfSystemInfoAssistBTS_H_ #define _SeqOfSystemInfoAssistBTS_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct SystemInfoAssistBTS; /* SeqOfSystemInfoAssistBTS */ typedef struct SeqOfSystemInfoAssistBTS { A_SEQUENCE_OF(struct SystemInfoAssistBTS) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SeqOfSystemInfoAssistBTS_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SeqOfSystemInfoAssistBTS; #ifdef __cplusplus } #endif /* Referred external types */ #include "SystemInfoAssistBTS.h" #endif /* _SeqOfSystemInfoAssistBTS_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SgnTypeElement.c000066400000000000000000000065241305042567700235400ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SgnTypeElement.h" static int memb_ganssStatusHealth_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 7)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_ganssStatusHealth_constr_3 = { { APC_CONSTRAINED, 3, 3, 0, 7 } /* (0..7) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SgnTypeElement_1[] = { { ATF_POINTER, 1, offsetof(struct SgnTypeElement, ganssSignalID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GANSSSignalID, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ganssSignalID" }, { ATF_NOFLAGS, 0, offsetof(struct SgnTypeElement, ganssStatusHealth), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ganssStatusHealth_constraint_1, &asn_PER_memb_ganssStatusHealth_constr_3, 0, "ganssStatusHealth" }, { ATF_NOFLAGS, 0, offsetof(struct SgnTypeElement, dganssSgnList), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfDGANSSSgnElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "dganssSgnList" }, }; static int asn_MAP_SgnTypeElement_oms_1[] = { 0 }; static ber_tlv_tag_t asn_DEF_SgnTypeElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_SgnTypeElement_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ganssSignalID at 1196 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ganssStatusHealth at 1197 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* dganssSgnList at 1200 */ }; static asn_SEQUENCE_specifics_t asn_SPC_SgnTypeElement_specs_1 = { sizeof(struct SgnTypeElement), offsetof(struct SgnTypeElement, _asn_ctx), asn_MAP_SgnTypeElement_tag2el_1, 3, /* Count of tags in the map */ asn_MAP_SgnTypeElement_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_SgnTypeElement = { "SgnTypeElement", "SgnTypeElement", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SgnTypeElement_tags_1, sizeof(asn_DEF_SgnTypeElement_tags_1) /sizeof(asn_DEF_SgnTypeElement_tags_1[0]), /* 1 */ asn_DEF_SgnTypeElement_tags_1, /* Same as above */ sizeof(asn_DEF_SgnTypeElement_tags_1) /sizeof(asn_DEF_SgnTypeElement_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_SgnTypeElement_1, 3, /* Elements count */ &asn_SPC_SgnTypeElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SgnTypeElement.h000066400000000000000000000015311305042567700235360ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SgnTypeElement_H_ #define _SgnTypeElement_H_ #include /* Including external dependencies */ #include "GANSSSignalID.h" #include #include "SeqOfDGANSSSgnElement.h" #include #ifdef __cplusplus extern "C" { #endif /* SgnTypeElement */ typedef struct SgnTypeElement { GANSSSignalID_t *ganssSignalID /* OPTIONAL */; long ganssStatusHealth; SeqOfDGANSSSgnElement_t dganssSgnList; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SgnTypeElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SgnTypeElement; #ifdef __cplusplus } #endif #endif /* _SgnTypeElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/StandardClockModelElement.c000066400000000000000000000204141305042567700256360ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "StandardClockModelElement.h" static int memb_stanClockTocLSB_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 511)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_stanClockAF2_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -2048 && value <= 2047)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_stanClockAF1_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -131072 && value <= 131071)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_stanClockAF0_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -134217728 && value <= 134217727)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_stanClockTgd_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -512 && value <= 511)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_stanModelID_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_stanClockTocLSB_constr_2 = { { APC_CONSTRAINED, 9, 9, 0, 511 } /* (0..511) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_stanClockAF2_constr_3 = { { APC_CONSTRAINED, 12, 12, -2048, 2047 } /* (-2048..2047) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_stanClockAF1_constr_4 = { { APC_CONSTRAINED, 18, -1, -131072, 131071 } /* (-131072..131071) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_stanClockAF0_constr_5 = { { APC_CONSTRAINED, 28, -1, -134217728, 134217727 } /* (-134217728..134217727) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_stanClockTgd_constr_6 = { { APC_CONSTRAINED, 10, 10, -512, 511 } /* (-512..511) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_stanModelID_constr_7 = { { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_StandardClockModelElement_1[] = { { ATF_NOFLAGS, 0, offsetof(struct StandardClockModelElement, stanClockTocLSB), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_stanClockTocLSB_constraint_1, &asn_PER_memb_stanClockTocLSB_constr_2, 0, "stanClockTocLSB" }, { ATF_NOFLAGS, 0, offsetof(struct StandardClockModelElement, stanClockAF2), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_stanClockAF2_constraint_1, &asn_PER_memb_stanClockAF2_constr_3, 0, "stanClockAF2" }, { ATF_NOFLAGS, 0, offsetof(struct StandardClockModelElement, stanClockAF1), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_stanClockAF1_constraint_1, &asn_PER_memb_stanClockAF1_constr_4, 0, "stanClockAF1" }, { ATF_NOFLAGS, 0, offsetof(struct StandardClockModelElement, stanClockAF0), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_stanClockAF0_constraint_1, &asn_PER_memb_stanClockAF0_constr_5, 0, "stanClockAF0" }, { ATF_POINTER, 2, offsetof(struct StandardClockModelElement, stanClockTgd), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_stanClockTgd_constraint_1, &asn_PER_memb_stanClockTgd_constr_6, 0, "stanClockTgd" }, { ATF_POINTER, 1, offsetof(struct StandardClockModelElement, stanModelID), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_stanModelID_constraint_1, &asn_PER_memb_stanModelID_constr_7, 0, "stanModelID" }, }; static int asn_MAP_StandardClockModelElement_oms_1[] = { 4, 5 }; static ber_tlv_tag_t asn_DEF_StandardClockModelElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_StandardClockModelElement_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* stanClockTocLSB at 1281 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* stanClockAF2 at 1282 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* stanClockAF1 at 1283 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* stanClockAF0 at 1284 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* stanClockTgd at 1285 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 } /* stanModelID at 1286 */ }; static asn_SEQUENCE_specifics_t asn_SPC_StandardClockModelElement_specs_1 = { sizeof(struct StandardClockModelElement), offsetof(struct StandardClockModelElement, _asn_ctx), asn_MAP_StandardClockModelElement_tag2el_1, 6, /* Count of tags in the map */ asn_MAP_StandardClockModelElement_oms_1, /* Optional members */ 2, 0, /* Root/Additions */ 5, /* Start extensions */ 7 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_StandardClockModelElement = { "StandardClockModelElement", "StandardClockModelElement", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_StandardClockModelElement_tags_1, sizeof(asn_DEF_StandardClockModelElement_tags_1) /sizeof(asn_DEF_StandardClockModelElement_tags_1[0]), /* 1 */ asn_DEF_StandardClockModelElement_tags_1, /* Same as above */ sizeof(asn_DEF_StandardClockModelElement_tags_1) /sizeof(asn_DEF_StandardClockModelElement_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_StandardClockModelElement_1, 6, /* Elements count */ &asn_SPC_StandardClockModelElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/StandardClockModelElement.h000066400000000000000000000017341305042567700256470ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _StandardClockModelElement_H_ #define _StandardClockModelElement_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* StandardClockModelElement */ typedef struct StandardClockModelElement { long stanClockTocLSB; long stanClockAF2; long stanClockAF1; long stanClockAF0; long *stanClockTgd /* OPTIONAL */; long *stanModelID /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } StandardClockModelElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_StandardClockModelElement; #ifdef __cplusplus } #endif #endif /* _StandardClockModelElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/StdResolution.c000066400000000000000000000112631305042567700234470ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "StdResolution.h" int StdResolution_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 3)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void StdResolution_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void StdResolution_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { StdResolution_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int StdResolution_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { StdResolution_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t StdResolution_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { StdResolution_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t StdResolution_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { StdResolution_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t StdResolution_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { StdResolution_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t StdResolution_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { StdResolution_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t StdResolution_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { StdResolution_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t StdResolution_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { StdResolution_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_StdResolution_constr_1 = { { APC_CONSTRAINED, 2, 2, 0, 3 } /* (0..3) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_StdResolution_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_StdResolution = { "StdResolution", "StdResolution", StdResolution_free, StdResolution_print, StdResolution_constraint, StdResolution_decode_ber, StdResolution_encode_der, StdResolution_decode_xer, StdResolution_encode_xer, StdResolution_decode_uper, StdResolution_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_StdResolution_tags_1, sizeof(asn_DEF_StdResolution_tags_1) /sizeof(asn_DEF_StdResolution_tags_1[0]), /* 1 */ asn_DEF_StdResolution_tags_1, /* Same as above */ sizeof(asn_DEF_StdResolution_tags_1) /sizeof(asn_DEF_StdResolution_tags_1[0]), /* 1 */ &asn_PER_type_StdResolution_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/StdResolution.h000066400000000000000000000016521305042567700234550ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _StdResolution_H_ #define _StdResolution_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* StdResolution */ typedef long StdResolution_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_StdResolution; asn_struct_free_f StdResolution_free; asn_struct_print_f StdResolution_print; asn_constr_check_f StdResolution_constraint; ber_type_decoder_f StdResolution_decode_ber; der_type_encoder_f StdResolution_encode_der; xer_type_decoder_f StdResolution_decode_xer; xer_type_encoder_f StdResolution_encode_xer; per_type_decoder_f StdResolution_decode_uper; per_type_encoder_f StdResolution_encode_uper; #ifdef __cplusplus } #endif #endif /* _StdResolution_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SystemInfoAssistBTS-R98-ExpOTD.c000066400000000000000000000045561305042567700261610ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SystemInfoAssistBTS-R98-ExpOTD.h" static asn_per_constraints_t asn_PER_type_SystemInfoAssistBTS_R98_ExpOTD_constr_1 = { { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SystemInfoAssistBTS_R98_ExpOTD_1[] = { { ATF_NOFLAGS, 0, offsetof(struct SystemInfoAssistBTS_R98_ExpOTD, choice.notPresent), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NULL, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "notPresent" }, { ATF_NOFLAGS, 0, offsetof(struct SystemInfoAssistBTS_R98_ExpOTD, choice.present), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_AssistBTSData_R98_ExpOTD, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "present" }, }; static asn_TYPE_tag2member_t asn_MAP_SystemInfoAssistBTS_R98_ExpOTD_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* notPresent at 927 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* present at 929 */ }; static asn_CHOICE_specifics_t asn_SPC_SystemInfoAssistBTS_R98_ExpOTD_specs_1 = { sizeof(struct SystemInfoAssistBTS_R98_ExpOTD), offsetof(struct SystemInfoAssistBTS_R98_ExpOTD, _asn_ctx), offsetof(struct SystemInfoAssistBTS_R98_ExpOTD, present), sizeof(((struct SystemInfoAssistBTS_R98_ExpOTD *)0)->present), asn_MAP_SystemInfoAssistBTS_R98_ExpOTD_tag2el_1, 2, /* Count of tags in the map */ 0, -1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_SystemInfoAssistBTS_R98_ExpOTD = { "SystemInfoAssistBTS-R98-ExpOTD", "SystemInfoAssistBTS-R98-ExpOTD", CHOICE_free, CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_decode_uper, CHOICE_encode_uper, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ &asn_PER_type_SystemInfoAssistBTS_R98_ExpOTD_constr_1, asn_MBR_SystemInfoAssistBTS_R98_ExpOTD_1, 2, /* Elements count */ &asn_SPC_SystemInfoAssistBTS_R98_ExpOTD_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SystemInfoAssistBTS-R98-ExpOTD.h000066400000000000000000000023351305042567700261570ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SystemInfoAssistBTS_R98_ExpOTD_H_ #define _SystemInfoAssistBTS_R98_ExpOTD_H_ #include /* Including external dependencies */ #include #include "AssistBTSData-R98-ExpOTD.h" #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum SystemInfoAssistBTS_R98_ExpOTD_PR { SystemInfoAssistBTS_R98_ExpOTD_PR_NOTHING, /* No components present */ SystemInfoAssistBTS_R98_ExpOTD_PR_notPresent, SystemInfoAssistBTS_R98_ExpOTD_PR_present } SystemInfoAssistBTS_R98_ExpOTD_PR; /* SystemInfoAssistBTS-R98-ExpOTD */ typedef struct SystemInfoAssistBTS_R98_ExpOTD { SystemInfoAssistBTS_R98_ExpOTD_PR present; union SystemInfoAssistBTS_R98_ExpOTD_u { NULL_t notPresent; AssistBTSData_R98_ExpOTD_t present; } choice; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SystemInfoAssistBTS_R98_ExpOTD_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SystemInfoAssistBTS_R98_ExpOTD; #ifdef __cplusplus } #endif #endif /* _SystemInfoAssistBTS_R98_ExpOTD_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SystemInfoAssistBTS.c000066400000000000000000000042351305042567700244720ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SystemInfoAssistBTS.h" static asn_per_constraints_t asn_PER_type_SystemInfoAssistBTS_constr_1 = { { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SystemInfoAssistBTS_1[] = { { ATF_NOFLAGS, 0, offsetof(struct SystemInfoAssistBTS, choice.notPresent), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NULL, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "notPresent" }, { ATF_NOFLAGS, 0, offsetof(struct SystemInfoAssistBTS, choice.present), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_AssistBTSData, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "present" }, }; static asn_TYPE_tag2member_t asn_MAP_SystemInfoAssistBTS_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* notPresent at 223 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* present at 225 */ }; static asn_CHOICE_specifics_t asn_SPC_SystemInfoAssistBTS_specs_1 = { sizeof(struct SystemInfoAssistBTS), offsetof(struct SystemInfoAssistBTS, _asn_ctx), offsetof(struct SystemInfoAssistBTS, present), sizeof(((struct SystemInfoAssistBTS *)0)->present), asn_MAP_SystemInfoAssistBTS_tag2el_1, 2, /* Count of tags in the map */ 0, -1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_SystemInfoAssistBTS = { "SystemInfoAssistBTS", "SystemInfoAssistBTS", CHOICE_free, CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_decode_uper, CHOICE_encode_uper, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ &asn_PER_type_SystemInfoAssistBTS_constr_1, asn_MBR_SystemInfoAssistBTS_1, 2, /* Elements count */ &asn_SPC_SystemInfoAssistBTS_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SystemInfoAssistBTS.h000066400000000000000000000020551305042567700244750ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SystemInfoAssistBTS_H_ #define _SystemInfoAssistBTS_H_ #include /* Including external dependencies */ #include #include "AssistBTSData.h" #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum SystemInfoAssistBTS_PR { SystemInfoAssistBTS_PR_NOTHING, /* No components present */ SystemInfoAssistBTS_PR_notPresent, SystemInfoAssistBTS_PR_present } SystemInfoAssistBTS_PR; /* SystemInfoAssistBTS */ typedef struct SystemInfoAssistBTS { SystemInfoAssistBTS_PR present; union SystemInfoAssistBTS_u { NULL_t notPresent; AssistBTSData_t present; } choice; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SystemInfoAssistBTS_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SystemInfoAssistBTS; #ifdef __cplusplus } #endif #endif /* _SystemInfoAssistBTS_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SystemInfoAssistData-R98-ExpOTD.c000066400000000000000000000042751305042567700264000ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SystemInfoAssistData-R98-ExpOTD.h" static asn_TYPE_member_t asn_MBR_SystemInfoAssistData_R98_ExpOTD_1[] = { { ATF_NOFLAGS, 0, offsetof(struct SystemInfoAssistData_R98_ExpOTD, systemInfoAssistListR98_ExpOTD), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfSystemInfoAssistBTS_R98_ExpOTD, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "systemInfoAssistListR98-ExpOTD" }, }; static ber_tlv_tag_t asn_DEF_SystemInfoAssistData_R98_ExpOTD_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_SystemInfoAssistData_R98_ExpOTD_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* systemInfoAssistListR98-ExpOTD at 917 */ }; static asn_SEQUENCE_specifics_t asn_SPC_SystemInfoAssistData_R98_ExpOTD_specs_1 = { sizeof(struct SystemInfoAssistData_R98_ExpOTD), offsetof(struct SystemInfoAssistData_R98_ExpOTD, _asn_ctx), asn_MAP_SystemInfoAssistData_R98_ExpOTD_tag2el_1, 1, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_SystemInfoAssistData_R98_ExpOTD = { "SystemInfoAssistData-R98-ExpOTD", "SystemInfoAssistData-R98-ExpOTD", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SystemInfoAssistData_R98_ExpOTD_tags_1, sizeof(asn_DEF_SystemInfoAssistData_R98_ExpOTD_tags_1) /sizeof(asn_DEF_SystemInfoAssistData_R98_ExpOTD_tags_1[0]), /* 1 */ asn_DEF_SystemInfoAssistData_R98_ExpOTD_tags_1, /* Same as above */ sizeof(asn_DEF_SystemInfoAssistData_R98_ExpOTD_tags_1) /sizeof(asn_DEF_SystemInfoAssistData_R98_ExpOTD_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_SystemInfoAssistData_R98_ExpOTD_1, 1, /* Elements count */ &asn_SPC_SystemInfoAssistData_R98_ExpOTD_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SystemInfoAssistData-R98-ExpOTD.h000066400000000000000000000015751305042567700264050ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SystemInfoAssistData_R98_ExpOTD_H_ #define _SystemInfoAssistData_R98_ExpOTD_H_ #include /* Including external dependencies */ #include "SeqOfSystemInfoAssistBTS-R98-ExpOTD.h" #include #ifdef __cplusplus extern "C" { #endif /* SystemInfoAssistData-R98-ExpOTD */ typedef struct SystemInfoAssistData_R98_ExpOTD { SeqOfSystemInfoAssistBTS_R98_ExpOTD_t systemInfoAssistListR98_ExpOTD; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SystemInfoAssistData_R98_ExpOTD_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SystemInfoAssistData_R98_ExpOTD; #ifdef __cplusplus } #endif #endif /* _SystemInfoAssistData_R98_ExpOTD_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SystemInfoAssistData.c000066400000000000000000000036701305042567700247150ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SystemInfoAssistData.h" static asn_TYPE_member_t asn_MBR_SystemInfoAssistData_1[] = { { ATF_NOFLAGS, 0, offsetof(struct SystemInfoAssistData, systemInfoAssistList), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SeqOfSystemInfoAssistBTS, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "systemInfoAssistList" }, }; static ber_tlv_tag_t asn_DEF_SystemInfoAssistData_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_SystemInfoAssistData_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* systemInfoAssistList at 218 */ }; static asn_SEQUENCE_specifics_t asn_SPC_SystemInfoAssistData_specs_1 = { sizeof(struct SystemInfoAssistData), offsetof(struct SystemInfoAssistData, _asn_ctx), asn_MAP_SystemInfoAssistData_tag2el_1, 1, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_SystemInfoAssistData = { "SystemInfoAssistData", "SystemInfoAssistData", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SystemInfoAssistData_tags_1, sizeof(asn_DEF_SystemInfoAssistData_tags_1) /sizeof(asn_DEF_SystemInfoAssistData_tags_1[0]), /* 1 */ asn_DEF_SystemInfoAssistData_tags_1, /* Same as above */ sizeof(asn_DEF_SystemInfoAssistData_tags_1) /sizeof(asn_DEF_SystemInfoAssistData_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_SystemInfoAssistData_1, 1, /* Elements count */ &asn_SPC_SystemInfoAssistData_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SystemInfoAssistData.h000066400000000000000000000014201305042567700247110ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SystemInfoAssistData_H_ #define _SystemInfoAssistData_H_ #include /* Including external dependencies */ #include "SeqOfSystemInfoAssistBTS.h" #include #ifdef __cplusplus extern "C" { #endif /* SystemInfoAssistData */ typedef struct SystemInfoAssistData { SeqOfSystemInfoAssistBTS_t systemInfoAssistList; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SystemInfoAssistData_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SystemInfoAssistData; #ifdef __cplusplus } #endif #endif /* _SystemInfoAssistData_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SystemInfoIndex.c000066400000000000000000000114061305042567700237200ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "SystemInfoIndex.h" int SystemInfoIndex_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 1 && value <= 32)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void SystemInfoIndex_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void SystemInfoIndex_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { SystemInfoIndex_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int SystemInfoIndex_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { SystemInfoIndex_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t SystemInfoIndex_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { SystemInfoIndex_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t SystemInfoIndex_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { SystemInfoIndex_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t SystemInfoIndex_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { SystemInfoIndex_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t SystemInfoIndex_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { SystemInfoIndex_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t SystemInfoIndex_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { SystemInfoIndex_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t SystemInfoIndex_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { SystemInfoIndex_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_SystemInfoIndex_constr_1 = { { APC_CONSTRAINED, 5, 5, 1, 32 } /* (1..32) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_SystemInfoIndex_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_SystemInfoIndex = { "SystemInfoIndex", "SystemInfoIndex", SystemInfoIndex_free, SystemInfoIndex_print, SystemInfoIndex_constraint, SystemInfoIndex_decode_ber, SystemInfoIndex_encode_der, SystemInfoIndex_decode_xer, SystemInfoIndex_encode_xer, SystemInfoIndex_decode_uper, SystemInfoIndex_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SystemInfoIndex_tags_1, sizeof(asn_DEF_SystemInfoIndex_tags_1) /sizeof(asn_DEF_SystemInfoIndex_tags_1[0]), /* 1 */ asn_DEF_SystemInfoIndex_tags_1, /* Same as above */ sizeof(asn_DEF_SystemInfoIndex_tags_1) /sizeof(asn_DEF_SystemInfoIndex_tags_1[0]), /* 1 */ &asn_PER_type_SystemInfoIndex_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/SystemInfoIndex.h000066400000000000000000000017101305042567700237220ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _SystemInfoIndex_H_ #define _SystemInfoIndex_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* SystemInfoIndex */ typedef long SystemInfoIndex_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SystemInfoIndex; asn_struct_free_f SystemInfoIndex_free; asn_struct_print_f SystemInfoIndex_print; asn_constr_check_f SystemInfoIndex_constraint; ber_type_decoder_f SystemInfoIndex_decode_ber; der_type_encoder_f SystemInfoIndex_encode_der; xer_type_decoder_f SystemInfoIndex_decode_xer; xer_type_encoder_f SystemInfoIndex_encode_xer; per_type_decoder_f SystemInfoIndex_decode_uper; per_type_encoder_f SystemInfoIndex_encode_uper; #ifdef __cplusplus } #endif #endif /* _SystemInfoIndex_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/TA0.c000066400000000000000000000105521305042567700212150ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "TA0.h" int TA0_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= (-2147483647L - 1) && value <= 2147483647)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void TA0_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void TA0_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { TA0_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int TA0_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { TA0_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t TA0_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { TA0_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t TA0_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { TA0_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t TA0_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { TA0_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t TA0_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { TA0_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t TA0_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { TA0_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t TA0_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { TA0_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_TA0_constr_1 = { { APC_CONSTRAINED, 32, -1, (-2147483647L - 1), 2147483647 } /* (-2147483648..2147483647) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_TA0_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_TA0 = { "TA0", "TA0", TA0_free, TA0_print, TA0_constraint, TA0_decode_ber, TA0_encode_der, TA0_decode_xer, TA0_encode_xer, TA0_decode_uper, TA0_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_TA0_tags_1, sizeof(asn_DEF_TA0_tags_1) /sizeof(asn_DEF_TA0_tags_1[0]), /* 1 */ asn_DEF_TA0_tags_1, /* Same as above */ sizeof(asn_DEF_TA0_tags_1) /sizeof(asn_DEF_TA0_tags_1[0]), /* 1 */ &asn_PER_type_TA0_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/TA0.h000066400000000000000000000014241305042567700212200ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _TA0_H_ #define _TA0_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* TA0 */ typedef long TA0_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_TA0; asn_struct_free_f TA0_free; asn_struct_print_f TA0_print; asn_constr_check_f TA0_constraint; ber_type_decoder_f TA0_decode_ber; der_type_encoder_f TA0_encode_der; xer_type_decoder_f TA0_decode_xer; xer_type_encoder_f TA0_encode_xer; per_type_decoder_f TA0_decode_uper; per_type_encoder_f TA0_encode_uper; #ifdef __cplusplus } #endif #endif /* _TA0_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/TA1.c000066400000000000000000000105121305042567700212120ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "TA1.h" int TA1_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -8388608 && value <= 8388607)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void TA1_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void TA1_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { TA1_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int TA1_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { TA1_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t TA1_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { TA1_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t TA1_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { TA1_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t TA1_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { TA1_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t TA1_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { TA1_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t TA1_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { TA1_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t TA1_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { TA1_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_TA1_constr_1 = { { APC_CONSTRAINED, 24, -1, -8388608, 8388607 } /* (-8388608..8388607) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_TA1_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_TA1 = { "TA1", "TA1", TA1_free, TA1_print, TA1_constraint, TA1_decode_ber, TA1_encode_der, TA1_decode_xer, TA1_encode_xer, TA1_decode_uper, TA1_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_TA1_tags_1, sizeof(asn_DEF_TA1_tags_1) /sizeof(asn_DEF_TA1_tags_1[0]), /* 1 */ asn_DEF_TA1_tags_1, /* Same as above */ sizeof(asn_DEF_TA1_tags_1) /sizeof(asn_DEF_TA1_tags_1[0]), /* 1 */ &asn_PER_type_TA1_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/TA1.h000066400000000000000000000014241305042567700212210ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _TA1_H_ #define _TA1_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* TA1 */ typedef long TA1_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_TA1; asn_struct_free_f TA1_free; asn_struct_print_f TA1_print; asn_constr_check_f TA1_constraint; ber_type_decoder_f TA1_decode_ber; der_type_encoder_f TA1_encode_der; xer_type_decoder_f TA1_decode_xer; xer_type_encoder_f TA1_encode_xer; per_type_decoder_f TA1_decode_uper; per_type_encoder_f TA1_encode_uper; #ifdef __cplusplus } #endif #endif /* _TA1_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/TA2.c000066400000000000000000000104531305042567700212170ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "TA2.h" int TA2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -64 && value <= 63)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void TA2_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void TA2_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { TA2_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int TA2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { TA2_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t TA2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { TA2_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t TA2_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { TA2_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t TA2_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { TA2_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t TA2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { TA2_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t TA2_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { TA2_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t TA2_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { TA2_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_TA2_constr_1 = { { APC_CONSTRAINED, 7, 7, -64, 63 } /* (-64..63) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_TA2_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_TA2 = { "TA2", "TA2", TA2_free, TA2_print, TA2_constraint, TA2_decode_ber, TA2_encode_der, TA2_decode_xer, TA2_encode_xer, TA2_decode_uper, TA2_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_TA2_tags_1, sizeof(asn_DEF_TA2_tags_1) /sizeof(asn_DEF_TA2_tags_1[0]), /* 1 */ asn_DEF_TA2_tags_1, /* Same as above */ sizeof(asn_DEF_TA2_tags_1) /sizeof(asn_DEF_TA2_tags_1[0]), /* 1 */ &asn_PER_type_TA2_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/TA2.h000066400000000000000000000014241305042567700212220ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _TA2_H_ #define _TA2_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* TA2 */ typedef long TA2_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_TA2; asn_struct_free_f TA2_free; asn_struct_print_f TA2_print; asn_constr_check_f TA2_constraint; ber_type_decoder_f TA2_decode_ber; der_type_encoder_f TA2_encode_der; xer_type_decoder_f TA2_decode_xer; xer_type_encoder_f TA2_encode_xer; per_type_decoder_f TA2_decode_uper; per_type_encoder_f TA2_encode_uper; #ifdef __cplusplus } #endif #endif /* _TA2_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/TLMReservedBits.c000066400000000000000000000114031305042567700236030ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "TLMReservedBits.h" int TLMReservedBits_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 3)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void TLMReservedBits_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void TLMReservedBits_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { TLMReservedBits_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int TLMReservedBits_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { TLMReservedBits_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t TLMReservedBits_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { TLMReservedBits_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t TLMReservedBits_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { TLMReservedBits_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t TLMReservedBits_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { TLMReservedBits_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t TLMReservedBits_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { TLMReservedBits_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t TLMReservedBits_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { TLMReservedBits_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t TLMReservedBits_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { TLMReservedBits_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_TLMReservedBits_constr_1 = { { APC_CONSTRAINED, 2, 2, 0, 3 } /* (0..3) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_TLMReservedBits_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_TLMReservedBits = { "TLMReservedBits", "TLMReservedBits", TLMReservedBits_free, TLMReservedBits_print, TLMReservedBits_constraint, TLMReservedBits_decode_ber, TLMReservedBits_encode_der, TLMReservedBits_decode_xer, TLMReservedBits_encode_xer, TLMReservedBits_decode_uper, TLMReservedBits_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_TLMReservedBits_tags_1, sizeof(asn_DEF_TLMReservedBits_tags_1) /sizeof(asn_DEF_TLMReservedBits_tags_1[0]), /* 1 */ asn_DEF_TLMReservedBits_tags_1, /* Same as above */ sizeof(asn_DEF_TLMReservedBits_tags_1) /sizeof(asn_DEF_TLMReservedBits_tags_1[0]), /* 1 */ &asn_PER_type_TLMReservedBits_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/TLMReservedBits.h000066400000000000000000000017101305042567700236100ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _TLMReservedBits_H_ #define _TLMReservedBits_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* TLMReservedBits */ typedef long TLMReservedBits_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_TLMReservedBits; asn_struct_free_f TLMReservedBits_free; asn_struct_print_f TLMReservedBits_print; asn_constr_check_f TLMReservedBits_constraint; ber_type_decoder_f TLMReservedBits_decode_ber; der_type_encoder_f TLMReservedBits_encode_der; xer_type_decoder_f TLMReservedBits_decode_xer; xer_type_encoder_f TLMReservedBits_encode_xer; per_type_decoder_f TLMReservedBits_decode_uper; per_type_encoder_f TLMReservedBits_encode_uper; #ifdef __cplusplus } #endif #endif /* _TLMReservedBits_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/TLMWord.c000066400000000000000000000107211305042567700221170ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "TLMWord.h" int TLMWord_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 16383)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void TLMWord_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void TLMWord_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { TLMWord_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int TLMWord_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { TLMWord_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t TLMWord_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { TLMWord_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t TLMWord_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { TLMWord_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t TLMWord_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { TLMWord_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t TLMWord_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { TLMWord_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t TLMWord_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { TLMWord_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t TLMWord_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { TLMWord_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_TLMWord_constr_1 = { { APC_CONSTRAINED, 14, 14, 0, 16383 } /* (0..16383) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_TLMWord_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_TLMWord = { "TLMWord", "TLMWord", TLMWord_free, TLMWord_print, TLMWord_constraint, TLMWord_decode_ber, TLMWord_encode_der, TLMWord_decode_xer, TLMWord_encode_xer, TLMWord_decode_uper, TLMWord_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_TLMWord_tags_1, sizeof(asn_DEF_TLMWord_tags_1) /sizeof(asn_DEF_TLMWord_tags_1[0]), /* 1 */ asn_DEF_TLMWord_tags_1, /* Same as above */ sizeof(asn_DEF_TLMWord_tags_1) /sizeof(asn_DEF_TLMWord_tags_1[0]), /* 1 */ &asn_PER_type_TLMWord_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/TLMWord.h000066400000000000000000000015201305042567700221210ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _TLMWord_H_ #define _TLMWord_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* TLMWord */ typedef long TLMWord_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_TLMWord; asn_struct_free_f TLMWord_free; asn_struct_print_f TLMWord_print; asn_constr_check_f TLMWord_constraint; ber_type_decoder_f TLMWord_decode_ber; der_type_encoder_f TLMWord_encode_der; xer_type_decoder_f TLMWord_decode_xer; xer_type_encoder_f TLMWord_encode_xer; per_type_decoder_f TLMWord_decode_uper; per_type_encoder_f TLMWord_encode_uper; #ifdef __cplusplus } #endif #endif /* _TLMWord_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/TOA-MeasurementsOfRef.c000066400000000000000000000044571305042567700246530ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "TOA-MeasurementsOfRef.h" static asn_TYPE_member_t asn_MBR_TOA_MeasurementsOfRef_1[] = { { ATF_NOFLAGS, 0, offsetof(struct TOA_MeasurementsOfRef, refQuality), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_RefQuality, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "refQuality" }, { ATF_NOFLAGS, 0, offsetof(struct TOA_MeasurementsOfRef, numOfMeasurements), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NumOfMeasurements, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "numOfMeasurements" }, }; static ber_tlv_tag_t asn_DEF_TOA_MeasurementsOfRef_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_TOA_MeasurementsOfRef_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* refQuality at 360 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* numOfMeasurements at 362 */ }; static asn_SEQUENCE_specifics_t asn_SPC_TOA_MeasurementsOfRef_specs_1 = { sizeof(struct TOA_MeasurementsOfRef), offsetof(struct TOA_MeasurementsOfRef, _asn_ctx), asn_MAP_TOA_MeasurementsOfRef_tag2el_1, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_TOA_MeasurementsOfRef = { "TOA-MeasurementsOfRef", "TOA-MeasurementsOfRef", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_TOA_MeasurementsOfRef_tags_1, sizeof(asn_DEF_TOA_MeasurementsOfRef_tags_1) /sizeof(asn_DEF_TOA_MeasurementsOfRef_tags_1[0]), /* 1 */ asn_DEF_TOA_MeasurementsOfRef_tags_1, /* Same as above */ sizeof(asn_DEF_TOA_MeasurementsOfRef_tags_1) /sizeof(asn_DEF_TOA_MeasurementsOfRef_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_TOA_MeasurementsOfRef_1, 2, /* Elements count */ &asn_SPC_TOA_MeasurementsOfRef_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/TOA-MeasurementsOfRef.h000066400000000000000000000014711305042567700246510ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _TOA_MeasurementsOfRef_H_ #define _TOA_MeasurementsOfRef_H_ #include /* Including external dependencies */ #include "RefQuality.h" #include "NumOfMeasurements.h" #include #ifdef __cplusplus extern "C" { #endif /* TOA-MeasurementsOfRef */ typedef struct TOA_MeasurementsOfRef { RefQuality_t refQuality; NumOfMeasurements_t numOfMeasurements; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } TOA_MeasurementsOfRef_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_TOA_MeasurementsOfRef; #ifdef __cplusplus } #endif #endif /* _TOA_MeasurementsOfRef_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/TimeRelation.c000066400000000000000000000042171305042567700232260ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "TimeRelation.h" static asn_TYPE_member_t asn_MBR_TimeRelation_1[] = { { ATF_NOFLAGS, 0, offsetof(struct TimeRelation, gpsTOW), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GPSTOW23b, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "gpsTOW" }, { ATF_POINTER, 1, offsetof(struct TimeRelation, gsmTime), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GSMTime, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "gsmTime" }, }; static int asn_MAP_TimeRelation_oms_1[] = { 1 }; static ber_tlv_tag_t asn_DEF_TimeRelation_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_TimeRelation_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* gpsTOW at 828 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* gsmTime at 829 */ }; static asn_SEQUENCE_specifics_t asn_SPC_TimeRelation_specs_1 = { sizeof(struct TimeRelation), offsetof(struct TimeRelation, _asn_ctx), asn_MAP_TimeRelation_tag2el_1, 2, /* Count of tags in the map */ asn_MAP_TimeRelation_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_TimeRelation = { "TimeRelation", "TimeRelation", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_TimeRelation_tags_1, sizeof(asn_DEF_TimeRelation_tags_1) /sizeof(asn_DEF_TimeRelation_tags_1[0]), /* 1 */ asn_DEF_TimeRelation_tags_1, /* Same as above */ sizeof(asn_DEF_TimeRelation_tags_1) /sizeof(asn_DEF_TimeRelation_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_TimeRelation_1, 2, /* Elements count */ &asn_SPC_TimeRelation_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/TimeRelation.h000066400000000000000000000014651305042567700232350ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _TimeRelation_H_ #define _TimeRelation_H_ #include /* Including external dependencies */ #include "GPSTOW23b.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct GSMTime; /* TimeRelation */ typedef struct TimeRelation { GPSTOW23b_t gpsTOW; struct GSMTime *gsmTime /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } TimeRelation_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_TimeRelation; #ifdef __cplusplus } #endif /* Referred external types */ #include "GSMTime.h" #endif /* _TimeRelation_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/TimeSlot.c000066400000000000000000000107531305042567700223740ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "TimeSlot.h" int TimeSlot_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 7)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void TimeSlot_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void TimeSlot_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { TimeSlot_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int TimeSlot_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { TimeSlot_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t TimeSlot_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { TimeSlot_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t TimeSlot_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { TimeSlot_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t TimeSlot_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { TimeSlot_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t TimeSlot_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { TimeSlot_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t TimeSlot_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { TimeSlot_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t TimeSlot_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { TimeSlot_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_TimeSlot_constr_1 = { { APC_CONSTRAINED, 3, 3, 0, 7 } /* (0..7) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_TimeSlot_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_TimeSlot = { "TimeSlot", "TimeSlot", TimeSlot_free, TimeSlot_print, TimeSlot_constraint, TimeSlot_decode_ber, TimeSlot_encode_der, TimeSlot_decode_xer, TimeSlot_encode_xer, TimeSlot_decode_uper, TimeSlot_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_TimeSlot_tags_1, sizeof(asn_DEF_TimeSlot_tags_1) /sizeof(asn_DEF_TimeSlot_tags_1[0]), /* 1 */ asn_DEF_TimeSlot_tags_1, /* Same as above */ sizeof(asn_DEF_TimeSlot_tags_1) /sizeof(asn_DEF_TimeSlot_tags_1[0]), /* 1 */ &asn_PER_type_TimeSlot_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/TimeSlot.h000066400000000000000000000015371305042567700224010ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _TimeSlot_H_ #define _TimeSlot_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* TimeSlot */ typedef long TimeSlot_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_TimeSlot; asn_struct_free_f TimeSlot_free; asn_struct_print_f TimeSlot_print; asn_constr_check_f TimeSlot_constraint; ber_type_decoder_f TimeSlot_decode_ber; der_type_encoder_f TimeSlot_encode_der; xer_type_decoder_f TimeSlot_decode_xer; xer_type_encoder_f TimeSlot_encode_xer; per_type_decoder_f TimeSlot_decode_uper; per_type_encoder_f TimeSlot_encode_uper; #ifdef __cplusplus } #endif #endif /* _TimeSlot_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/TimeSlotScheme.c000066400000000000000000000121611305042567700235140ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "TimeSlotScheme.h" int TimeSlotScheme_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { /* Replace with underlying type checker */ td->check_constraints = asn_DEF_ENUMERATED.check_constraints; return td->check_constraints(td, sptr, ctfailcb, app_key); } /* * This type is implemented using ENUMERATED, * so here we adjust the DEF accordingly. */ static void TimeSlotScheme_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_ENUMERATED.free_struct; td->print_struct = asn_DEF_ENUMERATED.print_struct; td->ber_decoder = asn_DEF_ENUMERATED.ber_decoder; td->der_encoder = asn_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; td->uper_encoder = asn_DEF_ENUMERATED.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_ENUMERATED.per_constraints; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ } void TimeSlotScheme_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { TimeSlotScheme_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int TimeSlotScheme_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { TimeSlotScheme_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t TimeSlotScheme_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { TimeSlotScheme_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t TimeSlotScheme_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { TimeSlotScheme_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t TimeSlotScheme_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { TimeSlotScheme_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t TimeSlotScheme_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { TimeSlotScheme_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t TimeSlotScheme_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { TimeSlotScheme_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t TimeSlotScheme_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { TimeSlotScheme_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_TimeSlotScheme_constr_1 = { { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_INTEGER_enum_map_t asn_MAP_TimeSlotScheme_value2enum_1[] = { { 0, 11, "equalLength" }, { 1, 13, "variousLength" } }; static unsigned int asn_MAP_TimeSlotScheme_enum2value_1[] = { 0, /* equalLength(0) */ 1 /* variousLength(1) */ }; static asn_INTEGER_specifics_t asn_SPC_TimeSlotScheme_specs_1 = { asn_MAP_TimeSlotScheme_value2enum_1, /* "tag" => N; sorted by tag */ asn_MAP_TimeSlotScheme_enum2value_1, /* N => "tag"; sorted by N */ 2, /* Number of elements in the maps */ 0, /* Enumeration is not extensible */ 1, /* Strict enumeration */ 0, /* Native long size */ 0 }; static ber_tlv_tag_t asn_DEF_TimeSlotScheme_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; asn_TYPE_descriptor_t asn_DEF_TimeSlotScheme = { "TimeSlotScheme", "TimeSlotScheme", TimeSlotScheme_free, TimeSlotScheme_print, TimeSlotScheme_constraint, TimeSlotScheme_decode_ber, TimeSlotScheme_encode_der, TimeSlotScheme_decode_xer, TimeSlotScheme_encode_xer, TimeSlotScheme_decode_uper, TimeSlotScheme_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_TimeSlotScheme_tags_1, sizeof(asn_DEF_TimeSlotScheme_tags_1) /sizeof(asn_DEF_TimeSlotScheme_tags_1[0]), /* 1 */ asn_DEF_TimeSlotScheme_tags_1, /* Same as above */ sizeof(asn_DEF_TimeSlotScheme_tags_1) /sizeof(asn_DEF_TimeSlotScheme_tags_1[0]), /* 1 */ &asn_PER_type_TimeSlotScheme_constr_1, 0, 0, /* Defined elsewhere */ &asn_SPC_TimeSlotScheme_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/TimeSlotScheme.h000066400000000000000000000021071305042567700235200ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _TimeSlotScheme_H_ #define _TimeSlotScheme_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum TimeSlotScheme { TimeSlotScheme_equalLength = 0, TimeSlotScheme_variousLength = 1 } e_TimeSlotScheme; /* TimeSlotScheme */ typedef ENUMERATED_t TimeSlotScheme_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_TimeSlotScheme; asn_struct_free_f TimeSlotScheme_free; asn_struct_print_f TimeSlotScheme_print; asn_constr_check_f TimeSlotScheme_constraint; ber_type_decoder_f TimeSlotScheme_decode_ber; der_type_encoder_f TimeSlotScheme_encode_der; xer_type_decoder_f TimeSlotScheme_decode_xer; xer_type_encoder_f TimeSlotScheme_encode_xer; per_type_decoder_f TimeSlotScheme_decode_uper; per_type_encoder_f TimeSlotScheme_encode_uper; #ifdef __cplusplus } #endif #endif /* _TimeSlotScheme_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/UTCModel.c000066400000000000000000000231461305042567700222500ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "UTCModel.h" static int memb_utcA1_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -8388608 && value <= 8388607)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_utcA0_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= (-2147483647L - 1) && value <= 2147483647)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_utcTot_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 255)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_utcWNt_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 255)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_utcDeltaTls_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -128 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_utcWNlsf_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 255)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_utcDN_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -128 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_utcDeltaTlsf_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -128 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_utcA1_constr_2 = { { APC_CONSTRAINED, 24, -1, -8388608, 8388607 } /* (-8388608..8388607) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_utcA0_constr_3 = { { APC_CONSTRAINED, 32, -1, (-2147483647L - 1), 2147483647 } /* (-2147483648..2147483647) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_utcTot_constr_4 = { { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_utcWNt_constr_5 = { { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_utcDeltaTls_constr_6 = { { APC_CONSTRAINED, 8, 8, -128, 127 } /* (-128..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_utcWNlsf_constr_7 = { { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_utcDN_constr_8 = { { APC_CONSTRAINED, 8, 8, -128, 127 } /* (-128..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_utcDeltaTlsf_constr_9 = { { APC_CONSTRAINED, 8, 8, -128, 127 } /* (-128..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_UTCModel_1[] = { { ATF_NOFLAGS, 0, offsetof(struct UTCModel, utcA1), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_utcA1_constraint_1, &asn_PER_memb_utcA1_constr_2, 0, "utcA1" }, { ATF_NOFLAGS, 0, offsetof(struct UTCModel, utcA0), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_utcA0_constraint_1, &asn_PER_memb_utcA0_constr_3, 0, "utcA0" }, { ATF_NOFLAGS, 0, offsetof(struct UTCModel, utcTot), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_utcTot_constraint_1, &asn_PER_memb_utcTot_constr_4, 0, "utcTot" }, { ATF_NOFLAGS, 0, offsetof(struct UTCModel, utcWNt), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_utcWNt_constraint_1, &asn_PER_memb_utcWNt_constr_5, 0, "utcWNt" }, { ATF_NOFLAGS, 0, offsetof(struct UTCModel, utcDeltaTls), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_utcDeltaTls_constraint_1, &asn_PER_memb_utcDeltaTls_constr_6, 0, "utcDeltaTls" }, { ATF_NOFLAGS, 0, offsetof(struct UTCModel, utcWNlsf), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_utcWNlsf_constraint_1, &asn_PER_memb_utcWNlsf_constr_7, 0, "utcWNlsf" }, { ATF_NOFLAGS, 0, offsetof(struct UTCModel, utcDN), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_utcDN_constraint_1, &asn_PER_memb_utcDN_constr_8, 0, "utcDN" }, { ATF_NOFLAGS, 0, offsetof(struct UTCModel, utcDeltaTlsf), (ASN_TAG_CLASS_CONTEXT | (7 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_utcDeltaTlsf_constraint_1, &asn_PER_memb_utcDeltaTlsf_constr_9, 0, "utcDeltaTlsf" }, }; static ber_tlv_tag_t asn_DEF_UTCModel_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_UTCModel_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* utcA1 at 775 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* utcA0 at 776 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* utcTot at 777 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* utcWNt at 778 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* utcDeltaTls at 779 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* utcWNlsf at 780 */ { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* utcDN at 781 */ { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 } /* utcDeltaTlsf at 782 */ }; static asn_SEQUENCE_specifics_t asn_SPC_UTCModel_specs_1 = { sizeof(struct UTCModel), offsetof(struct UTCModel, _asn_ctx), asn_MAP_UTCModel_tag2el_1, 8, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_UTCModel = { "UTCModel", "UTCModel", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_UTCModel_tags_1, sizeof(asn_DEF_UTCModel_tags_1) /sizeof(asn_DEF_UTCModel_tags_1[0]), /* 1 */ asn_DEF_UTCModel_tags_1, /* Same as above */ sizeof(asn_DEF_UTCModel_tags_1) /sizeof(asn_DEF_UTCModel_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_UTCModel_1, 8, /* Elements count */ &asn_SPC_UTCModel_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/UTCModel.h000066400000000000000000000014001305042567700222420ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _UTCModel_H_ #define _UTCModel_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* UTCModel */ typedef struct UTCModel { long utcA1; long utcA0; long utcTot; long utcWNt; long utcDeltaTls; long utcWNlsf; long utcDN; long utcDeltaTlsf; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } UTCModel_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_UTCModel; #ifdef __cplusplus } #endif #endif /* _UTCModel_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/UlPseudoSegInd.c000066400000000000000000000121571305042567700234660ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "UlPseudoSegInd.h" int UlPseudoSegInd_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { /* Replace with underlying type checker */ td->check_constraints = asn_DEF_ENUMERATED.check_constraints; return td->check_constraints(td, sptr, ctfailcb, app_key); } /* * This type is implemented using ENUMERATED, * so here we adjust the DEF accordingly. */ static void UlPseudoSegInd_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_ENUMERATED.free_struct; td->print_struct = asn_DEF_ENUMERATED.print_struct; td->ber_decoder = asn_DEF_ENUMERATED.ber_decoder; td->der_encoder = asn_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; td->uper_encoder = asn_DEF_ENUMERATED.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_ENUMERATED.per_constraints; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ } void UlPseudoSegInd_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { UlPseudoSegInd_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int UlPseudoSegInd_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { UlPseudoSegInd_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t UlPseudoSegInd_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { UlPseudoSegInd_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t UlPseudoSegInd_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { UlPseudoSegInd_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t UlPseudoSegInd_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { UlPseudoSegInd_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t UlPseudoSegInd_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { UlPseudoSegInd_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t UlPseudoSegInd_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { UlPseudoSegInd_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t UlPseudoSegInd_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { UlPseudoSegInd_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_UlPseudoSegInd_constr_1 = { { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_INTEGER_enum_map_t asn_MAP_UlPseudoSegInd_value2enum_1[] = { { 0, 11, "firstOfMany" }, { 1, 12, "secondOfMany" } }; static unsigned int asn_MAP_UlPseudoSegInd_enum2value_1[] = { 0, /* firstOfMany(0) */ 1 /* secondOfMany(1) */ }; static asn_INTEGER_specifics_t asn_SPC_UlPseudoSegInd_specs_1 = { asn_MAP_UlPseudoSegInd_value2enum_1, /* "tag" => N; sorted by tag */ asn_MAP_UlPseudoSegInd_enum2value_1, /* N => "tag"; sorted by N */ 2, /* Number of elements in the maps */ 0, /* Enumeration is not extensible */ 1, /* Strict enumeration */ 0, /* Native long size */ 0 }; static ber_tlv_tag_t asn_DEF_UlPseudoSegInd_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; asn_TYPE_descriptor_t asn_DEF_UlPseudoSegInd = { "UlPseudoSegInd", "UlPseudoSegInd", UlPseudoSegInd_free, UlPseudoSegInd_print, UlPseudoSegInd_constraint, UlPseudoSegInd_decode_ber, UlPseudoSegInd_encode_der, UlPseudoSegInd_decode_xer, UlPseudoSegInd_encode_xer, UlPseudoSegInd_decode_uper, UlPseudoSegInd_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_UlPseudoSegInd_tags_1, sizeof(asn_DEF_UlPseudoSegInd_tags_1) /sizeof(asn_DEF_UlPseudoSegInd_tags_1[0]), /* 1 */ asn_DEF_UlPseudoSegInd_tags_1, /* Same as above */ sizeof(asn_DEF_UlPseudoSegInd_tags_1) /sizeof(asn_DEF_UlPseudoSegInd_tags_1[0]), /* 1 */ &asn_PER_type_UlPseudoSegInd_constr_1, 0, 0, /* Defined elsewhere */ &asn_SPC_UlPseudoSegInd_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/UlPseudoSegInd.h000066400000000000000000000021061305042567700234640ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _UlPseudoSegInd_H_ #define _UlPseudoSegInd_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum UlPseudoSegInd { UlPseudoSegInd_firstOfMany = 0, UlPseudoSegInd_secondOfMany = 1 } e_UlPseudoSegInd; /* UlPseudoSegInd */ typedef ENUMERATED_t UlPseudoSegInd_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_UlPseudoSegInd; asn_struct_free_f UlPseudoSegInd_free; asn_struct_print_f UlPseudoSegInd_print; asn_constr_check_f UlPseudoSegInd_constraint; ber_type_decoder_f UlPseudoSegInd_decode_ber; der_type_encoder_f UlPseudoSegInd_encode_der; xer_type_decoder_f UlPseudoSegInd_decode_xer; xer_type_encoder_f UlPseudoSegInd_encode_xer; per_type_decoder_f UlPseudoSegInd_decode_uper; per_type_encoder_f UlPseudoSegInd_encode_uper; #ifdef __cplusplus } #endif #endif /* _UlPseudoSegInd_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/UncompressedEphemeris.c000066400000000000000000001221001305042567700251330ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "UncompressedEphemeris.h" static int ephemE_17_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { unsigned long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const unsigned long *)sptr; /* Constraint check succeeded */ return 0; } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void ephemE_17_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; /* td->specifics = asn_DEF_NativeInteger.specifics; // Defined explicitly */ } static void ephemE_17_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { ephemE_17_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } static int ephemE_17_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { ephemE_17_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } static asn_dec_rval_t ephemE_17_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { ephemE_17_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } static asn_enc_rval_t ephemE_17_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { ephemE_17_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } static asn_dec_rval_t ephemE_17_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { ephemE_17_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } static asn_enc_rval_t ephemE_17_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { ephemE_17_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } static asn_dec_rval_t ephemE_17_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { ephemE_17_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } static asn_enc_rval_t ephemE_17_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { ephemE_17_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static int ephemAPowerHalf_19_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { unsigned long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const unsigned long *)sptr; /* Constraint check succeeded */ return 0; } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void ephemAPowerHalf_19_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; /* td->specifics = asn_DEF_NativeInteger.specifics; // Defined explicitly */ } static void ephemAPowerHalf_19_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { ephemAPowerHalf_19_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } static int ephemAPowerHalf_19_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { ephemAPowerHalf_19_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } static asn_dec_rval_t ephemAPowerHalf_19_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { ephemAPowerHalf_19_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } static asn_enc_rval_t ephemAPowerHalf_19_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { ephemAPowerHalf_19_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } static asn_dec_rval_t ephemAPowerHalf_19_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { ephemAPowerHalf_19_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } static asn_enc_rval_t ephemAPowerHalf_19_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { ephemAPowerHalf_19_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } static asn_dec_rval_t ephemAPowerHalf_19_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { ephemAPowerHalf_19_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } static asn_enc_rval_t ephemAPowerHalf_19_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { ephemAPowerHalf_19_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static int memb_ephemCodeOnL2_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 3)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ephemURA_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 15)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ephemSVhealth_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 63)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ephemIODC_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1023)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ephemL2Pflag_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ephemTgd_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -128 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ephemToc_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 37799)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ephemAF2_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -128 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ephemAF1_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -32768 && value <= 32767)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ephemAF0_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -2097152 && value <= 2097151)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ephemCrs_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -32768 && value <= 32767)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ephemDeltaN_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -32768 && value <= 32767)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ephemM0_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= (-2147483647L - 1) && value <= 2147483647)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ephemCuc_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -32768 && value <= 32767)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ephemE_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { unsigned long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const unsigned long *)sptr; /* Constraint check succeeded */ return 0; } static int memb_ephemCus_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -32768 && value <= 32767)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ephemAPowerHalf_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { unsigned long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const unsigned long *)sptr; /* Constraint check succeeded */ return 0; } static int memb_ephemToe_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 37799)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ephemFitFlag_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ephemAODA_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 31)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ephemCic_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -32768 && value <= 32767)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ephemOmegaA0_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= (-2147483647L - 1) && value <= 2147483647)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ephemCis_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -32768 && value <= 32767)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ephemI0_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= (-2147483647L - 1) && value <= 2147483647)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ephemCrc_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -32768 && value <= 32767)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ephemW_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= (-2147483647L - 1) && value <= 2147483647)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ephemOmegaADot_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -8388608 && value <= 8388607)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ephemIDot_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -8192 && value <= 8191)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_type_ephemE_constr_17 = { { APC_CONSTRAINED, 32, -1, 0, 4294967295 } /* (0..4294967295) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_type_ephemAPowerHalf_constr_19 = { { APC_CONSTRAINED, 32, -1, 0, 4294967295 } /* (0..4294967295) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemCodeOnL2_constr_2 = { { APC_CONSTRAINED, 2, 2, 0, 3 } /* (0..3) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemURA_constr_3 = { { APC_CONSTRAINED, 4, 4, 0, 15 } /* (0..15) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemSVhealth_constr_4 = { { APC_CONSTRAINED, 6, 6, 0, 63 } /* (0..63) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemIODC_constr_5 = { { APC_CONSTRAINED, 10, 10, 0, 1023 } /* (0..1023) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemL2Pflag_constr_6 = { { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemTgd_constr_8 = { { APC_CONSTRAINED, 8, 8, -128, 127 } /* (-128..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemToc_constr_9 = { { APC_CONSTRAINED, 16, 16, 0, 37799 } /* (0..37799) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemAF2_constr_10 = { { APC_CONSTRAINED, 8, 8, -128, 127 } /* (-128..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemAF1_constr_11 = { { APC_CONSTRAINED, 16, 16, -32768, 32767 } /* (-32768..32767) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemAF0_constr_12 = { { APC_CONSTRAINED, 22, -1, -2097152, 2097151 } /* (-2097152..2097151) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemCrs_constr_13 = { { APC_CONSTRAINED, 16, 16, -32768, 32767 } /* (-32768..32767) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemDeltaN_constr_14 = { { APC_CONSTRAINED, 16, 16, -32768, 32767 } /* (-32768..32767) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemM0_constr_15 = { { APC_CONSTRAINED, 32, -1, (-2147483647L - 1), 2147483647 } /* (-2147483648..2147483647) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemCuc_constr_16 = { { APC_CONSTRAINED, 16, 16, -32768, 32767 } /* (-32768..32767) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemE_constr_17 = { { APC_CONSTRAINED, 32, -1, 0, 4294967295 } /* (0..4294967295) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemCus_constr_18 = { { APC_CONSTRAINED, 16, 16, -32768, 32767 } /* (-32768..32767) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemAPowerHalf_constr_19 = { { APC_CONSTRAINED, 32, -1, 0, 4294967295 } /* (0..4294967295) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemToe_constr_20 = { { APC_CONSTRAINED, 16, 16, 0, 37799 } /* (0..37799) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemFitFlag_constr_21 = { { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemAODA_constr_22 = { { APC_CONSTRAINED, 5, 5, 0, 31 } /* (0..31) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemCic_constr_23 = { { APC_CONSTRAINED, 16, 16, -32768, 32767 } /* (-32768..32767) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemOmegaA0_constr_24 = { { APC_CONSTRAINED, 32, -1, (-2147483647L - 1), 2147483647 } /* (-2147483648..2147483647) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemCis_constr_25 = { { APC_CONSTRAINED, 16, 16, -32768, 32767 } /* (-32768..32767) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemI0_constr_26 = { { APC_CONSTRAINED, 32, -1, (-2147483647L - 1), 2147483647 } /* (-2147483648..2147483647) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemCrc_constr_27 = { { APC_CONSTRAINED, 16, 16, -32768, 32767 } /* (-32768..32767) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemW_constr_28 = { { APC_CONSTRAINED, 32, -1, (-2147483647L - 1), 2147483647 } /* (-2147483648..2147483647) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemOmegaADot_constr_29 = { { APC_CONSTRAINED, 24, -1, -8388608, 8388607 } /* (-8388608..8388607) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ephemIDot_constr_30 = { { APC_CONSTRAINED, 14, 14, -8192, 8191 } /* (-8192..8191) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_INTEGER_specifics_t asn_SPC_ephemE_specs_17 = { 0, 0, 0, 0, 0, 0, /* Native long size */ 1 /* Unsigned representation */ }; static ber_tlv_tag_t asn_DEF_ephemE_tags_17[] = { (ASN_TAG_CLASS_CONTEXT | (15 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_ephemE_17 = { "ephemE", "ephemE", ephemE_17_free, ephemE_17_print, ephemE_17_constraint, ephemE_17_decode_ber, ephemE_17_encode_der, ephemE_17_decode_xer, ephemE_17_encode_xer, ephemE_17_decode_uper, ephemE_17_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_ephemE_tags_17, sizeof(asn_DEF_ephemE_tags_17) /sizeof(asn_DEF_ephemE_tags_17[0]) - 1, /* 1 */ asn_DEF_ephemE_tags_17, /* Same as above */ sizeof(asn_DEF_ephemE_tags_17) /sizeof(asn_DEF_ephemE_tags_17[0]), /* 2 */ &asn_PER_type_ephemE_constr_17, 0, 0, /* No members */ &asn_SPC_ephemE_specs_17 /* Additional specs */ }; static asn_INTEGER_specifics_t asn_SPC_ephemAPowerHalf_specs_19 = { 0, 0, 0, 0, 0, 0, /* Native long size */ 1 /* Unsigned representation */ }; static ber_tlv_tag_t asn_DEF_ephemAPowerHalf_tags_19[] = { (ASN_TAG_CLASS_CONTEXT | (17 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_ephemAPowerHalf_19 = { "ephemAPowerHalf", "ephemAPowerHalf", ephemAPowerHalf_19_free, ephemAPowerHalf_19_print, ephemAPowerHalf_19_constraint, ephemAPowerHalf_19_decode_ber, ephemAPowerHalf_19_encode_der, ephemAPowerHalf_19_decode_xer, ephemAPowerHalf_19_encode_xer, ephemAPowerHalf_19_decode_uper, ephemAPowerHalf_19_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_ephemAPowerHalf_tags_19, sizeof(asn_DEF_ephemAPowerHalf_tags_19) /sizeof(asn_DEF_ephemAPowerHalf_tags_19[0]) - 1, /* 1 */ asn_DEF_ephemAPowerHalf_tags_19, /* Same as above */ sizeof(asn_DEF_ephemAPowerHalf_tags_19) /sizeof(asn_DEF_ephemAPowerHalf_tags_19[0]), /* 2 */ &asn_PER_type_ephemAPowerHalf_constr_19, 0, 0, /* No members */ &asn_SPC_ephemAPowerHalf_specs_19 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_UncompressedEphemeris_1[] = { { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemCodeOnL2), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ephemCodeOnL2_constraint_1, &asn_PER_memb_ephemCodeOnL2_constr_2, 0, "ephemCodeOnL2" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemURA), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ephemURA_constraint_1, &asn_PER_memb_ephemURA_constr_3, 0, "ephemURA" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemSVhealth), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ephemSVhealth_constraint_1, &asn_PER_memb_ephemSVhealth_constr_4, 0, "ephemSVhealth" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemIODC), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ephemIODC_constraint_1, &asn_PER_memb_ephemIODC_constr_5, 0, "ephemIODC" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemL2Pflag), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ephemL2Pflag_constraint_1, &asn_PER_memb_ephemL2Pflag_constr_6, 0, "ephemL2Pflag" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemSF1Rsvd), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_EphemerisSubframe1Reserved, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ephemSF1Rsvd" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemTgd), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ephemTgd_constraint_1, &asn_PER_memb_ephemTgd_constr_8, 0, "ephemTgd" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemToc), (ASN_TAG_CLASS_CONTEXT | (7 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ephemToc_constraint_1, &asn_PER_memb_ephemToc_constr_9, 0, "ephemToc" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemAF2), (ASN_TAG_CLASS_CONTEXT | (8 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ephemAF2_constraint_1, &asn_PER_memb_ephemAF2_constr_10, 0, "ephemAF2" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemAF1), (ASN_TAG_CLASS_CONTEXT | (9 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ephemAF1_constraint_1, &asn_PER_memb_ephemAF1_constr_11, 0, "ephemAF1" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemAF0), (ASN_TAG_CLASS_CONTEXT | (10 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ephemAF0_constraint_1, &asn_PER_memb_ephemAF0_constr_12, 0, "ephemAF0" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemCrs), (ASN_TAG_CLASS_CONTEXT | (11 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ephemCrs_constraint_1, &asn_PER_memb_ephemCrs_constr_13, 0, "ephemCrs" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemDeltaN), (ASN_TAG_CLASS_CONTEXT | (12 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ephemDeltaN_constraint_1, &asn_PER_memb_ephemDeltaN_constr_14, 0, "ephemDeltaN" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemM0), (ASN_TAG_CLASS_CONTEXT | (13 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ephemM0_constraint_1, &asn_PER_memb_ephemM0_constr_15, 0, "ephemM0" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemCuc), (ASN_TAG_CLASS_CONTEXT | (14 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ephemCuc_constraint_1, &asn_PER_memb_ephemCuc_constr_16, 0, "ephemCuc" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemE), (ASN_TAG_CLASS_CONTEXT | (15 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_ephemE_17, memb_ephemE_constraint_1, &asn_PER_memb_ephemE_constr_17, 0, "ephemE" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemCus), (ASN_TAG_CLASS_CONTEXT | (16 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ephemCus_constraint_1, &asn_PER_memb_ephemCus_constr_18, 0, "ephemCus" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemAPowerHalf), (ASN_TAG_CLASS_CONTEXT | (17 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_ephemAPowerHalf_19, memb_ephemAPowerHalf_constraint_1, &asn_PER_memb_ephemAPowerHalf_constr_19, 0, "ephemAPowerHalf" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemToe), (ASN_TAG_CLASS_CONTEXT | (18 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ephemToe_constraint_1, &asn_PER_memb_ephemToe_constr_20, 0, "ephemToe" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemFitFlag), (ASN_TAG_CLASS_CONTEXT | (19 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ephemFitFlag_constraint_1, &asn_PER_memb_ephemFitFlag_constr_21, 0, "ephemFitFlag" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemAODA), (ASN_TAG_CLASS_CONTEXT | (20 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ephemAODA_constraint_1, &asn_PER_memb_ephemAODA_constr_22, 0, "ephemAODA" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemCic), (ASN_TAG_CLASS_CONTEXT | (21 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ephemCic_constraint_1, &asn_PER_memb_ephemCic_constr_23, 0, "ephemCic" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemOmegaA0), (ASN_TAG_CLASS_CONTEXT | (22 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ephemOmegaA0_constraint_1, &asn_PER_memb_ephemOmegaA0_constr_24, 0, "ephemOmegaA0" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemCis), (ASN_TAG_CLASS_CONTEXT | (23 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ephemCis_constraint_1, &asn_PER_memb_ephemCis_constr_25, 0, "ephemCis" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemI0), (ASN_TAG_CLASS_CONTEXT | (24 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ephemI0_constraint_1, &asn_PER_memb_ephemI0_constr_26, 0, "ephemI0" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemCrc), (ASN_TAG_CLASS_CONTEXT | (25 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ephemCrc_constraint_1, &asn_PER_memb_ephemCrc_constr_27, 0, "ephemCrc" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemW), (ASN_TAG_CLASS_CONTEXT | (26 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ephemW_constraint_1, &asn_PER_memb_ephemW_constr_28, 0, "ephemW" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemOmegaADot), (ASN_TAG_CLASS_CONTEXT | (27 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ephemOmegaADot_constraint_1, &asn_PER_memb_ephemOmegaADot_constr_29, 0, "ephemOmegaADot" }, { ATF_NOFLAGS, 0, offsetof(struct UncompressedEphemeris, ephemIDot), (ASN_TAG_CLASS_CONTEXT | (28 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_ephemIDot_constraint_1, &asn_PER_memb_ephemIDot_constr_30, 0, "ephemIDot" }, }; static ber_tlv_tag_t asn_DEF_UncompressedEphemeris_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_UncompressedEphemeris_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ephemCodeOnL2 at 722 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ephemURA at 723 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* ephemSVhealth at 724 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* ephemIODC at 725 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* ephemL2Pflag at 726 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* ephemSF1Rsvd at 727 */ { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* ephemTgd at 728 */ { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 }, /* ephemToc at 729 */ { (ASN_TAG_CLASS_CONTEXT | (8 << 2)), 8, 0, 0 }, /* ephemAF2 at 730 */ { (ASN_TAG_CLASS_CONTEXT | (9 << 2)), 9, 0, 0 }, /* ephemAF1 at 731 */ { (ASN_TAG_CLASS_CONTEXT | (10 << 2)), 10, 0, 0 }, /* ephemAF0 at 732 */ { (ASN_TAG_CLASS_CONTEXT | (11 << 2)), 11, 0, 0 }, /* ephemCrs at 733 */ { (ASN_TAG_CLASS_CONTEXT | (12 << 2)), 12, 0, 0 }, /* ephemDeltaN at 734 */ { (ASN_TAG_CLASS_CONTEXT | (13 << 2)), 13, 0, 0 }, /* ephemM0 at 735 */ { (ASN_TAG_CLASS_CONTEXT | (14 << 2)), 14, 0, 0 }, /* ephemCuc at 736 */ { (ASN_TAG_CLASS_CONTEXT | (15 << 2)), 15, 0, 0 }, /* ephemE at 737 */ { (ASN_TAG_CLASS_CONTEXT | (16 << 2)), 16, 0, 0 }, /* ephemCus at 738 */ { (ASN_TAG_CLASS_CONTEXT | (17 << 2)), 17, 0, 0 }, /* ephemAPowerHalf at 739 */ { (ASN_TAG_CLASS_CONTEXT | (18 << 2)), 18, 0, 0 }, /* ephemToe at 740 */ { (ASN_TAG_CLASS_CONTEXT | (19 << 2)), 19, 0, 0 }, /* ephemFitFlag at 741 */ { (ASN_TAG_CLASS_CONTEXT | (20 << 2)), 20, 0, 0 }, /* ephemAODA at 742 */ { (ASN_TAG_CLASS_CONTEXT | (21 << 2)), 21, 0, 0 }, /* ephemCic at 743 */ { (ASN_TAG_CLASS_CONTEXT | (22 << 2)), 22, 0, 0 }, /* ephemOmegaA0 at 744 */ { (ASN_TAG_CLASS_CONTEXT | (23 << 2)), 23, 0, 0 }, /* ephemCis at 745 */ { (ASN_TAG_CLASS_CONTEXT | (24 << 2)), 24, 0, 0 }, /* ephemI0 at 746 */ { (ASN_TAG_CLASS_CONTEXT | (25 << 2)), 25, 0, 0 }, /* ephemCrc at 747 */ { (ASN_TAG_CLASS_CONTEXT | (26 << 2)), 26, 0, 0 }, /* ephemW at 748 */ { (ASN_TAG_CLASS_CONTEXT | (27 << 2)), 27, 0, 0 }, /* ephemOmegaADot at 749 */ { (ASN_TAG_CLASS_CONTEXT | (28 << 2)), 28, 0, 0 } /* ephemIDot at 750 */ }; static asn_SEQUENCE_specifics_t asn_SPC_UncompressedEphemeris_specs_1 = { sizeof(struct UncompressedEphemeris), offsetof(struct UncompressedEphemeris, _asn_ctx), asn_MAP_UncompressedEphemeris_tag2el_1, 29, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_UncompressedEphemeris = { "UncompressedEphemeris", "UncompressedEphemeris", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_UncompressedEphemeris_tags_1, sizeof(asn_DEF_UncompressedEphemeris_tags_1) /sizeof(asn_DEF_UncompressedEphemeris_tags_1[0]), /* 1 */ asn_DEF_UncompressedEphemeris_tags_1, /* Same as above */ sizeof(asn_DEF_UncompressedEphemeris_tags_1) /sizeof(asn_DEF_UncompressedEphemeris_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_UncompressedEphemeris_1, 29, /* Elements count */ &asn_SPC_UncompressedEphemeris_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/UncompressedEphemeris.h000066400000000000000000000027761305042567700251600ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _UncompressedEphemeris_H_ #define _UncompressedEphemeris_H_ #include /* Including external dependencies */ #include #include "EphemerisSubframe1Reserved.h" #include #ifdef __cplusplus extern "C" { #endif /* UncompressedEphemeris */ typedef struct UncompressedEphemeris { long ephemCodeOnL2; long ephemURA; long ephemSVhealth; long ephemIODC; long ephemL2Pflag; EphemerisSubframe1Reserved_t ephemSF1Rsvd; long ephemTgd; long ephemToc; long ephemAF2; long ephemAF1; long ephemAF0; long ephemCrs; long ephemDeltaN; long ephemM0; long ephemCuc; unsigned long ephemE; long ephemCus; unsigned long ephemAPowerHalf; long ephemToe; long ephemFitFlag; long ephemAODA; long ephemCic; long ephemOmegaA0; long ephemCis; long ephemI0; long ephemCrc; long ephemW; long ephemOmegaADot; long ephemIDot; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } UncompressedEphemeris_t; /* Implementation */ /* extern asn_TYPE_descriptor_t asn_DEF_ephemE_17; // (Use -fall-defs-global to expose) */ /* extern asn_TYPE_descriptor_t asn_DEF_ephemAPowerHalf_19; // (Use -fall-defs-global to expose) */ extern asn_TYPE_descriptor_t asn_DEF_UncompressedEphemeris; #ifdef __cplusplus } #endif #endif /* _UncompressedEphemeris_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/UseMultipleSets.c000066400000000000000000000122221305042567700237340ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "UseMultipleSets.h" int UseMultipleSets_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { /* Replace with underlying type checker */ td->check_constraints = asn_DEF_ENUMERATED.check_constraints; return td->check_constraints(td, sptr, ctfailcb, app_key); } /* * This type is implemented using ENUMERATED, * so here we adjust the DEF accordingly. */ static void UseMultipleSets_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_ENUMERATED.free_struct; td->print_struct = asn_DEF_ENUMERATED.print_struct; td->ber_decoder = asn_DEF_ENUMERATED.ber_decoder; td->der_encoder = asn_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; td->uper_encoder = asn_DEF_ENUMERATED.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_ENUMERATED.per_constraints; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ } void UseMultipleSets_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { UseMultipleSets_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int UseMultipleSets_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { UseMultipleSets_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t UseMultipleSets_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { UseMultipleSets_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t UseMultipleSets_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { UseMultipleSets_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t UseMultipleSets_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { UseMultipleSets_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t UseMultipleSets_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { UseMultipleSets_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t UseMultipleSets_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { UseMultipleSets_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t UseMultipleSets_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { UseMultipleSets_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_UseMultipleSets_constr_1 = { { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_INTEGER_enum_map_t asn_MAP_UseMultipleSets_value2enum_1[] = { { 0, 12, "multipleSets" }, { 1, 6, "oneSet" } }; static unsigned int asn_MAP_UseMultipleSets_enum2value_1[] = { 0, /* multipleSets(0) */ 1 /* oneSet(1) */ }; static asn_INTEGER_specifics_t asn_SPC_UseMultipleSets_specs_1 = { asn_MAP_UseMultipleSets_value2enum_1, /* "tag" => N; sorted by tag */ asn_MAP_UseMultipleSets_enum2value_1, /* N => "tag"; sorted by N */ 2, /* Number of elements in the maps */ 0, /* Enumeration is not extensible */ 1, /* Strict enumeration */ 0, /* Native long size */ 0 }; static ber_tlv_tag_t asn_DEF_UseMultipleSets_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; asn_TYPE_descriptor_t asn_DEF_UseMultipleSets = { "UseMultipleSets", "UseMultipleSets", UseMultipleSets_free, UseMultipleSets_print, UseMultipleSets_constraint, UseMultipleSets_decode_ber, UseMultipleSets_encode_der, UseMultipleSets_decode_xer, UseMultipleSets_encode_xer, UseMultipleSets_decode_uper, UseMultipleSets_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_UseMultipleSets_tags_1, sizeof(asn_DEF_UseMultipleSets_tags_1) /sizeof(asn_DEF_UseMultipleSets_tags_1[0]), /* 1 */ asn_DEF_UseMultipleSets_tags_1, /* Same as above */ sizeof(asn_DEF_UseMultipleSets_tags_1) /sizeof(asn_DEF_UseMultipleSets_tags_1[0]), /* 1 */ &asn_PER_type_UseMultipleSets_constr_1, 0, 0, /* Defined elsewhere */ &asn_SPC_UseMultipleSets_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/UseMultipleSets.h000066400000000000000000000021241305042567700237410ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _UseMultipleSets_H_ #define _UseMultipleSets_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum UseMultipleSets { UseMultipleSets_multipleSets = 0, UseMultipleSets_oneSet = 1 } e_UseMultipleSets; /* UseMultipleSets */ typedef ENUMERATED_t UseMultipleSets_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_UseMultipleSets; asn_struct_free_f UseMultipleSets_free; asn_struct_print_f UseMultipleSets_print; asn_constr_check_f UseMultipleSets_constraint; ber_type_decoder_f UseMultipleSets_decode_ber; der_type_encoder_f UseMultipleSets_encode_der; xer_type_decoder_f UseMultipleSets_decode_xer; xer_type_encoder_f UseMultipleSets_encode_xer; per_type_decoder_f UseMultipleSets_decode_uper; per_type_encoder_f UseMultipleSets_encode_uper; #ifdef __cplusplus } #endif #endif /* _UseMultipleSets_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/VelocityEstimate.c000066400000000000000000000104641305042567700241250ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #include "VelocityEstimate.h" int VelocityEstimate_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { /* Replace with underlying type checker */ td->check_constraints = asn_DEF_INTEGER.check_constraints; return td->check_constraints(td, sptr, ctfailcb, app_key); } /* * This type is implemented using INTEGER, * so here we adjust the DEF accordingly. */ static void VelocityEstimate_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_INTEGER.free_struct; td->print_struct = asn_DEF_INTEGER.print_struct; td->ber_decoder = asn_DEF_INTEGER.ber_decoder; td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; td->uper_decoder = asn_DEF_INTEGER.uper_decoder; td->uper_encoder = asn_DEF_INTEGER.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; } void VelocityEstimate_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { VelocityEstimate_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int VelocityEstimate_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { VelocityEstimate_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t VelocityEstimate_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { VelocityEstimate_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t VelocityEstimate_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { VelocityEstimate_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t VelocityEstimate_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { VelocityEstimate_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t VelocityEstimate_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { VelocityEstimate_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t VelocityEstimate_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { VelocityEstimate_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t VelocityEstimate_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { VelocityEstimate_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static ber_tlv_tag_t asn_DEF_VelocityEstimate_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_VelocityEstimate = { "VelocityEstimate", "VelocityEstimate", VelocityEstimate_free, VelocityEstimate_print, VelocityEstimate_constraint, VelocityEstimate_decode_ber, VelocityEstimate_encode_der, VelocityEstimate_decode_xer, VelocityEstimate_encode_xer, VelocityEstimate_decode_uper, VelocityEstimate_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_VelocityEstimate_tags_1, sizeof(asn_DEF_VelocityEstimate_tags_1) /sizeof(asn_DEF_VelocityEstimate_tags_1[0]), /* 1 */ asn_DEF_VelocityEstimate_tags_1, /* Same as above */ sizeof(asn_DEF_VelocityEstimate_tags_1) /sizeof(asn_DEF_VelocityEstimate_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/VelocityEstimate.h000066400000000000000000000017261305042567700241330ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "RRLP-Components" * found in "../rrlp-components.asn" */ #ifndef _VelocityEstimate_H_ #define _VelocityEstimate_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* VelocityEstimate */ typedef INTEGER_t VelocityEstimate_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_VelocityEstimate; asn_struct_free_f VelocityEstimate_free; asn_struct_print_f VelocityEstimate_print; asn_constr_check_f VelocityEstimate_constraint; ber_type_decoder_f VelocityEstimate_decode_ber; der_type_encoder_f VelocityEstimate_encode_der; xer_type_decoder_f VelocityEstimate_decode_xer; xer_type_encoder_f VelocityEstimate_encode_xer; per_type_decoder_f VelocityEstimate_decode_uper; per_type_encoder_f VelocityEstimate_encode_uper; #ifdef __cplusplus } #endif #endif /* _VelocityEstimate_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/asn_SEQUENCE_OF.c000066400000000000000000000015601305042567700232650ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include typedef A_SEQUENCE_OF(void) asn_sequence; void asn_sequence_del(void *asn_sequence_of_x, int number, int _do_free) { asn_sequence *as = (asn_sequence *)asn_sequence_of_x; if(as) { void *ptr; int n; if(number < 0 || number >= as->count) return; /* Nothing to delete */ if(_do_free && as->free) { ptr = as->array[number]; } else { ptr = 0; } /* * Shift all elements to the left to hide the gap. */ --as->count; for(n = number; n < as->count; n++) as->array[n] = as->array[n+1]; /* * Invoke the third-party function only when the state * of the parent structure is consistent. */ if(ptr) as->free(ptr); } } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/asn_SEQUENCE_OF.h000066400000000000000000000027351305042567700232770ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef ASN_SEQUENCE_OF_H #define ASN_SEQUENCE_OF_H #include #ifdef __cplusplus extern "C" { #endif /* * SEQUENCE OF is the same as SET OF with a tiny difference: * the delete operation preserves the initial order of elements * and thus MAY operate in non-constant time. */ #define A_SEQUENCE_OF(type) A_SET_OF(type) #define ASN_SEQUENCE_ADD(headptr, ptr) \ asn_sequence_add((headptr), (ptr)) /*********************************************** * Implementation of the SEQUENCE OF structure. */ #define asn_sequence_add asn_set_add #define asn_sequence_empty asn_set_empty /* * Delete the element from the set by its number (base 0). * This is NOT a constant-time operation. * The order of elements is preserved. * If _do_free is given AND the (*free) is initialized, the element * will be freed using the custom (*free) function as well. */ void asn_sequence_del(void *asn_sequence_of_x, int number, int _do_free); /* * Cope with different conversions requirements to/from void in C and C++. * This is mostly useful for support library. */ typedef A_SEQUENCE_OF(void) asn_anonymous_sequence_; #define _A_SEQUENCE_FROM_VOID(ptr) ((asn_anonymous_sequence_ *)(ptr)) #define _A_CSEQUENCE_FROM_VOID(ptr) ((const asn_anonymous_sequence_ *)(ptr)) #ifdef __cplusplus } #endif #endif /* ASN_SEQUENCE_OF_H */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/asn_SET_OF.c000066400000000000000000000032521305042567700225100ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include /* * Add another element into the set. */ int asn_set_add(void *asn_set_of_x, void *ptr) { asn_anonymous_set_ *as = _A_SET_FROM_VOID(asn_set_of_x); if(as == 0 || ptr == 0) { errno = EINVAL; /* Invalid arguments */ return -1; } /* * Make sure there's enough space to insert an element. */ if(as->count == as->size) { int _newsize = as->size ? (as->size << 1) : 4; void *_new_arr; _new_arr = REALLOC(as->array, _newsize * sizeof(as->array[0])); if(_new_arr) { as->array = (void **)_new_arr; as->size = _newsize; } else { /* ENOMEM */ return -1; } } as->array[as->count++] = ptr; return 0; } void asn_set_del(void *asn_set_of_x, int number, int _do_free) { asn_anonymous_set_ *as = _A_SET_FROM_VOID(asn_set_of_x); if(as) { void *ptr; if(number < 0 || number >= as->count) return; if(_do_free && as->free) { ptr = as->array[number]; } else { ptr = 0; } as->array[number] = as->array[--as->count]; /* * Invoke the third-party function only when the state * of the parent structure is consistent. */ if(ptr) as->free(ptr); } } /* * Free the contents of the set, do not free the set itself. */ void asn_set_empty(void *asn_set_of_x) { asn_anonymous_set_ *as = _A_SET_FROM_VOID(asn_set_of_x); if(as) { if(as->array) { if(as->free) { while(as->count--) as->free(as->array[as->count]); } FREEMEM(as->array); as->array = 0; } as->count = 0; as->size = 0; } } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/asn_SET_OF.h000066400000000000000000000032331305042567700225140ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef ASN_SET_OF_H #define ASN_SET_OF_H #ifdef __cplusplus extern "C" { #endif #define A_SET_OF(type) \ struct { \ type **array; \ int count; /* Meaningful size */ \ int size; /* Allocated size */ \ void (*free)(type *); \ } #define ASN_SET_ADD(headptr, ptr) \ asn_set_add((headptr), (ptr)) /******************************************* * Implementation of the SET OF structure. */ /* * Add another structure into the set by its pointer. * RETURN VALUES: * 0 for success and -1/errno for failure. */ int asn_set_add(void *asn_set_of_x, void *ptr); /* * Delete the element from the set by its number (base 0). * This is a constant-time operation. The order of elements before the * deleted ones is guaranteed, the order of elements after the deleted * one is NOT guaranteed. * If _do_free is given AND the (*free) is initialized, the element * will be freed using the custom (*free) function as well. */ void asn_set_del(void *asn_set_of_x, int number, int _do_free); /* * Empty the contents of the set. Will free the elements, if (*free) is given. * Will NOT free the set itself. */ void asn_set_empty(void *asn_set_of_x); /* * Cope with different conversions requirements to/from void in C and C++. * This is mostly useful for support library. */ typedef A_SET_OF(void) asn_anonymous_set_; #define _A_SET_FROM_VOID(ptr) ((asn_anonymous_set_ *)(ptr)) #define _A_CSET_FROM_VOID(ptr) ((const asn_anonymous_set_ *)(ptr)) #ifdef __cplusplus } #endif #endif /* ASN_SET_OF_H */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/asn_application.h000066400000000000000000000027161305042567700240050ustar00rootroot00000000000000/*- * Copyright (c) 2004, 2006 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ /* * Application-level ASN.1 callbacks. */ #ifndef _ASN_APPLICATION_H_ #define _ASN_APPLICATION_H_ #include "asn_system.h" /* for platform-dependent types */ #include "asn_codecs.h" /* for ASN.1 codecs specifics */ #ifdef __cplusplus extern "C" { #endif /* * Generic type of an application-defined callback to return various * types of data to the application. * EXPECTED RETURN VALUES: * -1: Failed to consume bytes. Abort the mission. * Non-negative return values indicate success, and ignored. */ typedef int (asn_app_consume_bytes_f)(const void *buffer, size_t size, void *application_specific_key); /* * A callback of this type is called whenever constraint validation fails * on some ASN.1 type. See "constraints.h" for more details on constraint * validation. * This callback specifies a descriptor of the ASN.1 type which failed * the constraint check, as well as human readable message on what * particular constraint has failed. */ typedef void (asn_app_constraint_failed_f)(void *application_specific_key, struct asn_TYPE_descriptor_s *type_descriptor_which_failed, const void *structure_which_failed_ptr, const char *error_message_format, ...) GCC_PRINTFLIKE(4, 5); #ifdef __cplusplus } #endif #include "constr_TYPE.h" /* for asn_TYPE_descriptor_t */ #endif /* _ASN_APPLICATION_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/asn_codecs.h000066400000000000000000000065451305042567700227460ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004, 2005 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _ASN_CODECS_H_ #define _ASN_CODECS_H_ #ifdef __cplusplus extern "C" { #endif struct asn_TYPE_descriptor_s; /* Forward declaration */ /* * This structure defines a set of parameters that may be passed * to every ASN.1 encoder or decoder function. * WARNING: if max_stack_size member is set, and you are calling the * function pointers of the asn_TYPE_descriptor_t directly, * this structure must be ALLOCATED ON THE STACK! * If you can't always satisfy this requirement, use ber_decode(), * xer_decode() and uper_decode() functions instead. */ typedef struct asn_codec_ctx_s { /* * Limit the decoder routines to use no (much) more stack than a given * number of bytes. Most of decoders are stack-based, and this * would protect against stack overflows if the number of nested * encodings is high. * The OCTET STRING, BIT STRING and ANY BER decoders are heap-based, * and are safe from this kind of overflow. * A value from getrlimit(RLIMIT_STACK) may be used to initialize * this variable. Be careful in multithreaded environments, as the * stack size is rather limited. */ size_t max_stack_size; /* 0 disables stack bounds checking */ } asn_codec_ctx_t; /* * Type of the return value of the encoding functions (der_encode, xer_encode). */ typedef struct asn_enc_rval_s { /* * Number of bytes encoded. * -1 indicates failure to encode the structure. * In this case, the members below this one are meaningful. */ ssize_t encoded; /* * Members meaningful when (encoded == -1), for post mortem analysis. */ /* Type which cannot be encoded */ struct asn_TYPE_descriptor_s *failed_type; /* Pointer to the structure of that type */ void *structure_ptr; } asn_enc_rval_t; #define _ASN_ENCODE_FAILED do { \ asn_enc_rval_t tmp_error; \ tmp_error.encoded = -1; \ tmp_error.failed_type = td; \ tmp_error.structure_ptr = sptr; \ ASN_DEBUG("Failed to encode element %s", td->name); \ return tmp_error; \ } while(0) #define _ASN_ENCODED_OK(rval) do { \ rval.structure_ptr = 0; \ rval.failed_type = 0; \ return rval; \ } while(0) /* * Type of the return value of the decoding functions (ber_decode, xer_decode) * * Please note that the number of consumed bytes is ALWAYS meaningful, * even if code==RC_FAIL. This is to indicate the number of successfully * decoded bytes, hence providing a possibility to fail with more diagnostics * (i.e., print the offending remainder of the buffer). */ enum asn_dec_rval_code_e { RC_OK, /* Decoded successfully */ RC_WMORE, /* More data expected, call again */ RC_FAIL /* Failure to decode data */ }; typedef struct asn_dec_rval_s { enum asn_dec_rval_code_e code; /* Result code */ size_t consumed; /* Number of bytes consumed */ } asn_dec_rval_t; #define _ASN_DECODE_FAILED do { \ asn_dec_rval_t tmp_error; \ tmp_error.code = RC_FAIL; \ tmp_error.consumed = 0; \ ASN_DEBUG("Failed to decode element %s", td->name); \ return tmp_error; \ } while(0) #define _ASN_DECODE_STARVED do { \ asn_dec_rval_t tmp_error; \ tmp_error.code = RC_WMORE; \ tmp_error.consumed = 0; \ return tmp_error; \ } while(0) #ifdef __cplusplus } #endif #endif /* _ASN_CODECS_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/asn_codecs_prim.c000066400000000000000000000152311305042567700237600ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include /* * Decode an always-primitive type. */ asn_dec_rval_t ber_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const void *buf_ptr, size_t size, int tag_mode) { ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)*sptr; asn_dec_rval_t rval; ber_tlv_len_t length; /* * If the structure is not there, allocate it. */ if(st == NULL) { st = (ASN__PRIMITIVE_TYPE_t *)CALLOC(1, sizeof(*st)); if(st == NULL) _ASN_DECODE_FAILED; *sptr = (void *)st; } ASN_DEBUG("Decoding %s as plain primitive (tm=%d)", td->name, tag_mode); /* * Check tags and extract value length. */ rval = ber_check_tags(opt_codec_ctx, td, 0, buf_ptr, size, tag_mode, 0, &length, 0); if(rval.code != RC_OK) return rval; ASN_DEBUG("%s length is %d bytes", td->name, (int)length); /* * Make sure we have this length. */ buf_ptr = ((const char *)buf_ptr) + rval.consumed; size -= rval.consumed; if(length > (ber_tlv_len_t)size) { rval.code = RC_WMORE; rval.consumed = 0; return rval; } st->size = (int)length; /* The following better be optimized away. */ if(sizeof(st->size) != sizeof(length) && (ber_tlv_len_t)st->size != length) { st->size = 0; _ASN_DECODE_FAILED; } st->buf = (uint8_t *)MALLOC(length + 1); if(!st->buf) { st->size = 0; _ASN_DECODE_FAILED; } memcpy(st->buf, buf_ptr, length); st->buf[length] = '\0'; /* Just in case */ rval.code = RC_OK; rval.consumed += length; ASN_DEBUG("Took %ld/%ld bytes to encode %s", (long)rval.consumed, (long)length, td->name); return rval; } /* * Encode an always-primitive type using DER. */ asn_enc_rval_t der_encode_primitive(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t erval; ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)sptr; ASN_DEBUG("%s %s as a primitive type (tm=%d)", cb?"Encoding":"Estimating", td->name, tag_mode); erval.encoded = der_write_tags(td, st->size, tag_mode, 0, tag, cb, app_key); ASN_DEBUG("%s wrote tags %d", td->name, (int)erval.encoded); if(erval.encoded == -1) { erval.failed_type = td; erval.structure_ptr = sptr; return erval; } if(cb && st->buf) { if(cb(st->buf, st->size, app_key) < 0) { erval.encoded = -1; erval.failed_type = td; erval.structure_ptr = sptr; return erval; } } else { assert(st->buf || st->size == 0); } erval.encoded += st->size; _ASN_ENCODED_OK(erval); } void ASN__PRIMITIVE_TYPE_free(asn_TYPE_descriptor_t *td, void *sptr, int contents_only) { ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)sptr; if(!td || !sptr) return; ASN_DEBUG("Freeing %s as a primitive type", td->name); if(st->buf) FREEMEM(st->buf); if(!contents_only) FREEMEM(st); } /* * Local internal type passed around as an argument. */ struct xdp_arg_s { asn_TYPE_descriptor_t *type_descriptor; void *struct_key; xer_primitive_body_decoder_f *prim_body_decoder; int decoded_something; int want_more; }; static int xer_decode__unexpected_tag(void *key, const void *chunk_buf, size_t chunk_size) { struct xdp_arg_s *arg = (struct xdp_arg_s *)key; enum xer_pbd_rval bret; if(arg->decoded_something) { if(xer_is_whitespace(chunk_buf, chunk_size)) return 0; /* Skip it. */ /* * Decoding was done once already. Prohibit doing it again. */ return -1; } bret = arg->prim_body_decoder(arg->type_descriptor, arg->struct_key, chunk_buf, chunk_size); switch(bret) { case XPBD_SYSTEM_FAILURE: case XPBD_DECODER_LIMIT: case XPBD_BROKEN_ENCODING: break; case XPBD_BODY_CONSUMED: /* Tag decoded successfully */ arg->decoded_something = 1; /* Fall through */ case XPBD_NOT_BODY_IGNORE: /* Safe to proceed further */ return 0; } return -1; } static ssize_t xer_decode__body(void *key, const void *chunk_buf, size_t chunk_size, int have_more) { struct xdp_arg_s *arg = (struct xdp_arg_s *)key; enum xer_pbd_rval bret; if(arg->decoded_something) { if(xer_is_whitespace(chunk_buf, chunk_size)) return chunk_size; /* * Decoding was done once already. Prohibit doing it again. */ return -1; } if(!have_more) { /* * If we've received something like "1", we can't really * tell whether it is really `1` or `123`, until we know * that there is no more data coming. * The have_more argument will be set to 1 once something * like this is available to the caller of this callback: * "1want_more = 1; return -1; } bret = arg->prim_body_decoder(arg->type_descriptor, arg->struct_key, chunk_buf, chunk_size); switch(bret) { case XPBD_SYSTEM_FAILURE: case XPBD_DECODER_LIMIT: case XPBD_BROKEN_ENCODING: break; case XPBD_BODY_CONSUMED: /* Tag decoded successfully */ arg->decoded_something = 1; /* Fall through */ case XPBD_NOT_BODY_IGNORE: /* Safe to proceed further */ return chunk_size; } return -1; } asn_dec_rval_t xer_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, size_t struct_size, const char *opt_mname, const void *buf_ptr, size_t size, xer_primitive_body_decoder_f *prim_body_decoder ) { const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; asn_struct_ctx_t s_ctx; struct xdp_arg_s s_arg; asn_dec_rval_t rc; /* * Create the structure if does not exist. */ if(!*sptr) { *sptr = CALLOC(1, struct_size); if(!*sptr) _ASN_DECODE_FAILED; } memset(&s_ctx, 0, sizeof(s_ctx)); s_arg.type_descriptor = td; s_arg.struct_key = *sptr; s_arg.prim_body_decoder = prim_body_decoder; s_arg.decoded_something = 0; s_arg.want_more = 0; rc = xer_decode_general(opt_codec_ctx, &s_ctx, &s_arg, xml_tag, buf_ptr, size, xer_decode__unexpected_tag, xer_decode__body); switch(rc.code) { case RC_OK: if(!s_arg.decoded_something) { char ch; ASN_DEBUG("Primitive body is not recognized, " "supplying empty one"); /* * Decoding opportunity has come and gone. * Where's the result? * Try to feed with empty body, see if it eats it. */ if(prim_body_decoder(s_arg.type_descriptor, s_arg.struct_key, &ch, 0) != XPBD_BODY_CONSUMED) { /* * This decoder does not like empty stuff. */ _ASN_DECODE_FAILED; } } break; case RC_WMORE: /* * Redo the whole thing later. * We don't have a context to save intermediate parsing state. */ rc.consumed = 0; break; case RC_FAIL: rc.consumed = 0; if(s_arg.want_more) rc.code = RC_WMORE; else _ASN_DECODE_FAILED; break; } return rc; } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/asn_codecs_prim.h000066400000000000000000000031351305042567700237650ustar00rootroot00000000000000/*- * Copyright (c) 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef ASN_CODECS_PRIM_H #define ASN_CODECS_PRIM_H #include #ifdef __cplusplus extern "C" { #endif typedef struct ASN__PRIMITIVE_TYPE_s { uint8_t *buf; /* Buffer with consecutive primitive encoding bytes */ int size; /* Size of the buffer */ } ASN__PRIMITIVE_TYPE_t; /* Do not use this type directly! */ asn_struct_free_f ASN__PRIMITIVE_TYPE_free; ber_type_decoder_f ber_decode_primitive; der_type_encoder_f der_encode_primitive; /* * A callback specification for the xer_decode_primitive() function below. */ enum xer_pbd_rval { XPBD_SYSTEM_FAILURE, /* System failure (memory shortage, etc) */ XPBD_DECODER_LIMIT, /* Hit some decoder limitation or deficiency */ XPBD_BROKEN_ENCODING, /* Encoding of a primitive body is broken */ XPBD_NOT_BODY_IGNORE, /* Not a body format, but safe to ignore */ XPBD_BODY_CONSUMED /* Body is recognized and consumed */ }; typedef enum xer_pbd_rval (xer_primitive_body_decoder_f) (asn_TYPE_descriptor_t *td, void *struct_ptr, const void *chunk_buf, size_t chunk_size); /* * Specific function to decode simple primitive types. * Also see xer_decode_general() in xer_decoder.h */ asn_dec_rval_t xer_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *type_descriptor, void **struct_ptr, size_t struct_size, const char *opt_mname, const void *buf_ptr, size_t size, xer_primitive_body_decoder_f *prim_body_decoder ); #ifdef __cplusplus } #endif #endif /* ASN_CODECS_PRIM_H */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/asn_internal.h000066400000000000000000000067171305042567700233230ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004, 2005, 2007 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ /* * Declarations internally useful for the ASN.1 support code. */ #ifndef _ASN_INTERNAL_H_ #define _ASN_INTERNAL_H_ #include "asn_application.h" /* Application-visible API */ #ifndef __NO_ASSERT_H__ /* Include assert.h only for internal use. */ #include /* for assert() macro */ #endif #ifdef __cplusplus extern "C" { #endif /* Environment version might be used to avoid running with the old library */ #define ASN1C_ENVIRONMENT_VERSION 922 /* Compile-time version */ int get_asn1c_environment_version(void); /* Run-time version */ #define CALLOC(nmemb, size) calloc(nmemb, size) #define MALLOC(size) malloc(size) #define REALLOC(oldptr, size) realloc(oldptr, size) #define FREEMEM(ptr) free(ptr) /* * A macro for debugging the ASN.1 internals. * You may enable or override it. */ #ifndef ASN_DEBUG /* If debugging code is not defined elsewhere... */ #if EMIT_ASN_DEBUG == 1 /* And it was asked to emit this code... */ #ifdef __GNUC__ #ifdef ASN_THREAD_SAFE #define asn_debug_indent 0 #else /* !ASN_THREAD_SAFE */ int asn_debug_indent; #endif /* ASN_THREAD_SAFE */ #define ASN_DEBUG(fmt, args...) do { \ int adi = asn_debug_indent; \ while(adi--) fprintf(stderr, " "); \ fprintf(stderr, fmt, ##args); \ fprintf(stderr, " (%s:%d)\n", \ __FILE__, __LINE__); \ } while(0) #else /* !__GNUC__ */ void ASN_DEBUG_f(const char *fmt, ...); #define ASN_DEBUG ASN_DEBUG_f #endif /* __GNUC__ */ #else /* EMIT_ASN_DEBUG != 1 */ static inline void ASN_DEBUG(const char *fmt, ...) { (void)fmt; } #endif /* EMIT_ASN_DEBUG */ #endif /* ASN_DEBUG */ /* * Invoke the application-supplied callback and fail, if something is wrong. */ #define __ASN_E_cbc(buf, size) (cb((buf), (size), app_key) < 0) #define _ASN_E_CALLBACK(foo) do { \ if(foo) goto cb_failed; \ } while(0) #define _ASN_CALLBACK(buf, size) \ _ASN_E_CALLBACK(__ASN_E_cbc(buf, size)) #define _ASN_CALLBACK2(buf1, size1, buf2, size2) \ _ASN_E_CALLBACK(__ASN_E_cbc(buf1, size1) || __ASN_E_cbc(buf2, size2)) #define _ASN_CALLBACK3(buf1, size1, buf2, size2, buf3, size3) \ _ASN_E_CALLBACK(__ASN_E_cbc(buf1, size1) \ || __ASN_E_cbc(buf2, size2) \ || __ASN_E_cbc(buf3, size3)) #define _i_ASN_TEXT_INDENT(nl, level) do { \ int __level = (level); \ int __nl = ((nl) != 0); \ int __i; \ if(__nl) _ASN_CALLBACK("\n", 1); \ if(__level < 0) __level = 0; \ for(__i = 0; __i < __level; __i++) \ _ASN_CALLBACK(" ", 4); \ er.encoded += __nl + 4 * __level; \ } while(0) #define _i_INDENT(nl) do { \ int __i; \ if((nl) && cb("\n", 1, app_key) < 0) return -1; \ for(__i = 0; __i < ilevel; __i++) \ if(cb(" ", 4, app_key) < 0) return -1; \ } while(0) /* * Check stack against overflow, if limit is set. */ #define _ASN_DEFAULT_STACK_MAX (30000) static inline int _ASN_STACK_OVERFLOW_CHECK(asn_codec_ctx_t *ctx) { if(ctx && ctx->max_stack_size) { /* ctx MUST be allocated on the stack */ ptrdiff_t usedstack = ((char *)ctx - (char *)&ctx); if(usedstack > 0) usedstack = -usedstack; /* grows up! */ /* double negative required to avoid int wrap-around */ if(usedstack < -(ptrdiff_t)ctx->max_stack_size) { ASN_DEBUG("Stack limit %ld reached", (long)ctx->max_stack_size); return -1; } } return 0; } #ifdef __cplusplus } #endif #endif /* _ASN_INTERNAL_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/asn_system.h000066400000000000000000000064301305042567700230230ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004, 2007 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ /* * Miscellaneous system-dependent types. */ #ifndef _ASN_SYSTEM_H_ #define _ASN_SYSTEM_H_ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include /* For snprintf(3) */ #include /* For *alloc(3) */ #include /* For memcpy(3) */ #include /* For size_t */ #include /* For LONG_MAX */ #include /* For va_start */ #include /* for offsetof and ptrdiff_t */ #ifdef WIN32 #include #define snprintf _snprintf #define vsnprintf _vsnprintf /* To avoid linking with ws2_32.lib, here's the definition of ntohl() */ #define sys_ntohl(l) ((((l) << 24) & 0xff000000) \ | (((l) << 16) & 0xff0000) \ | (((l) << 8) & 0xff00) \ | ((l) & 0xff)) #ifdef _MSC_VER /* MSVS.Net */ #ifndef __cplusplus #define inline __inline #endif #ifndef ASSUMESTDTYPES /* Standard types have been defined elsewhere */ #define ssize_t SSIZE_T typedef char int8_t; typedef short int16_t; typedef int int32_t; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #endif /* ASSUMESTDTYPES */ #define WIN32_LEAN_AND_MEAN #include #include #define isnan _isnan #define finite _finite #define copysign _copysign #define ilogb _logb #else /* !_MSC_VER */ #include #endif /* _MSC_VER */ #else /* !WIN32 */ #if defined(__vxworks) #include #else /* !defined(__vxworks) */ #include /* C99 specifies this file */ /* * 1. Earlier FreeBSD version didn't have , * but was present. * 2. Sun Solaris requires for alloca(3), * but does not have . */ #if (!defined(__FreeBSD__) || !defined(_SYS_INTTYPES_H_)) #if defined(sun) #include /* For alloca(3) */ #include /* for finite(3) */ #elif defined(__hpux) #ifdef __GNUC__ #include /* For alloca(3) */ #else /* !__GNUC__ */ #define inline #endif /* __GNUC__ */ #else #include /* SUSv2+ and C99 specify this file, for uintXX_t */ #endif /* defined(sun) */ #endif #include /* for ntohl() */ #define sys_ntohl(foo) ntohl(foo) #endif /* defined(__vxworks) */ #endif /* WIN32 */ #if __GNUC__ >= 3 #ifndef GCC_PRINTFLIKE #define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var))) #endif #ifndef GCC_NOTUSED #define GCC_NOTUSED __attribute__((unused)) #endif #else #ifndef GCC_PRINTFLIKE #define GCC_PRINTFLIKE(fmt,var) /* nothing */ #endif #ifndef GCC_NOTUSED #define GCC_NOTUSED #endif #endif /* Figure out if thread safety is requested */ #if !defined(ASN_THREAD_SAFE) && (defined(THREAD_SAFE) || defined(_REENTRANT)) #define ASN_THREAD_SAFE #endif /* Thread safety */ #ifndef offsetof /* If not defined by */ #define offsetof(s, m) ((ptrdiff_t)&(((s *)0)->m) - (ptrdiff_t)((s *)0)) #endif /* offsetof */ #ifndef MIN /* Suitable for comparing primitive types (integers) */ #if defined(__GNUC__) #define MIN(a,b) ({ __typeof a _a = a; __typeof b _b = b; \ ((_a)<(_b)?(_a):(_b)); }) #else /* !__GNUC__ */ #define MIN(a,b) ((a)<(b)?(a):(b)) /* Unsafe variant */ #endif /* __GNUC__ */ #endif /* MIN */ #endif /* _ASN_SYSTEM_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ber_decoder.c000066400000000000000000000167701305042567700230760ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #undef ADVANCE #define ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ ptr = ((const char *)ptr) + num; \ size -= num; \ consumed_myself += num; \ } while(0) #undef RETURN #define RETURN(_code) do { \ asn_dec_rval_t rval; \ rval.code = _code; \ if(opt_ctx) opt_ctx->step = step; /* Save context */ \ if(_code == RC_OK || opt_ctx) \ rval.consumed = consumed_myself; \ else \ rval.consumed = 0; /* Context-free */ \ return rval; \ } while(0) /* * The BER decoder of any type. */ asn_dec_rval_t ber_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *type_descriptor, void **struct_ptr, const void *ptr, size_t size) { asn_codec_ctx_t s_codec_ctx; /* * Stack checker requires that the codec context * must be allocated on the stack. */ if(opt_codec_ctx) { if(opt_codec_ctx->max_stack_size) { s_codec_ctx = *opt_codec_ctx; opt_codec_ctx = &s_codec_ctx; } } else { /* If context is not given, be security-conscious anyway */ memset(&s_codec_ctx, 0, sizeof(s_codec_ctx)); s_codec_ctx.max_stack_size = _ASN_DEFAULT_STACK_MAX; opt_codec_ctx = &s_codec_ctx; } /* * Invoke type-specific decoder. */ return type_descriptor->ber_decoder(opt_codec_ctx, type_descriptor, struct_ptr, /* Pointer to the destination structure */ ptr, size, /* Buffer and its size */ 0 /* Default tag mode is 0 */ ); } /* * Check the set of >> tags matches the definition. */ asn_dec_rval_t ber_check_tags(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_struct_ctx_t *opt_ctx, const void *ptr, size_t size, int tag_mode, int last_tag_form, ber_tlv_len_t *last_length, int *opt_tlv_form) { ssize_t consumed_myself = 0; ssize_t tag_len; ssize_t len_len; ber_tlv_tag_t tlv_tag; ber_tlv_len_t tlv_len; ber_tlv_len_t limit_len = -1; int expect_00_terminators = 0; int tlv_constr = -1; /* If CHOICE, opt_tlv_form is not given */ int step = opt_ctx ? opt_ctx->step : 0; /* Where we left previously */ int tagno; /* * Make sure we didn't exceed the maximum stack size. */ if(_ASN_STACK_OVERFLOW_CHECK(opt_codec_ctx)) RETURN(RC_FAIL); /* * So what does all this implicit skip stuff mean? * Imagine two types, * A ::= [5] IMPLICIT T * B ::= [2] EXPLICIT T * Where T is defined as * T ::= [4] IMPLICIT SEQUENCE { ... } * * Let's say, we are starting to decode type A, given the * following TLV stream: <5> <0>. What does this mean? * It means that the type A contains type T which is, * in turn, empty. * Remember though, that we are still in A. We cannot * just pass control to the type T decoder. Why? Because * the type T decoder expects <4> <0>, not <5> <0>. * So, we must make sure we are going to receive <5> while * still in A, then pass control to the T decoder, indicating * that the tag <4> was implicitly skipped. The decoder of T * hence will be prepared to treat <4> as valid tag, and decode * it appropriately. */ tagno = step /* Continuing where left previously */ + (tag_mode==1?-1:0) ; ASN_DEBUG("ber_check_tags(%s, size=%ld, tm=%d, step=%d, tagno=%d)", td->name, (long)size, tag_mode, step, tagno); /* assert(td->tags_count >= 1) May not be the case for CHOICE or ANY */ if(tag_mode == 0 && tagno == td->tags_count) { /* * This must be the _untagged_ ANY type, * which outermost tag isn't known in advance. * Fetch the tag and length separately. */ tag_len = ber_fetch_tag(ptr, size, &tlv_tag); switch(tag_len) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); } tlv_constr = BER_TLV_CONSTRUCTED(ptr); len_len = ber_fetch_length(tlv_constr, (const char *)ptr + tag_len, size - tag_len, &tlv_len); switch(len_len) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); } ASN_DEBUG("Advancing %ld in ANY case", (long)(tag_len + len_len)); ADVANCE(tag_len + len_len); } else { assert(tagno < td->tags_count); /* At least one loop */ } for((void)tagno; tagno < td->tags_count; tagno++, step++) { /* * Fetch and process T from TLV. */ tag_len = ber_fetch_tag(ptr, size, &tlv_tag); ASN_DEBUG("Fetching tag from {%p,%ld}: " "len %ld, step %d, tagno %d got %s", ptr, (long)size, (long)tag_len, step, tagno, ber_tlv_tag_string(tlv_tag)); switch(tag_len) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); } tlv_constr = BER_TLV_CONSTRUCTED(ptr); /* * If {I}, don't check anything. * If {I,B,C}, check B and C unless we're at I. */ if(tag_mode != 0 && step == 0) { /* * We don't expect tag to match here. * It's just because we don't know how the tag * is supposed to look like. */ } else { assert(tagno >= 0); /* Guaranteed by the code above */ if(tlv_tag != td->tags[tagno]) { /* * Unexpected tag. Too bad. */ ASN_DEBUG("Expected: %s, " "expectation failed (tn=%d, tm=%d)", ber_tlv_tag_string(td->tags[tagno]), tagno, tag_mode ); RETURN(RC_FAIL); } } /* * Attention: if there are more tags expected, * ensure that the current tag is presented * in constructed form (it contains other tags!). * If this one is the last one, check that the tag form * matches the one given in descriptor. */ if(tagno < (td->tags_count - 1)) { if(tlv_constr == 0) { ASN_DEBUG("tlv_constr = %d, expfail", tlv_constr); RETURN(RC_FAIL); } } else { if(last_tag_form != tlv_constr && last_tag_form != -1) { ASN_DEBUG("last_tag_form %d != %d", last_tag_form, tlv_constr); RETURN(RC_FAIL); } } /* * Fetch and process L from TLV. */ len_len = ber_fetch_length(tlv_constr, (const char *)ptr + tag_len, size - tag_len, &tlv_len); ASN_DEBUG("Fetchinig len = %ld", (long)len_len); switch(len_len) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); } /* * FIXME * As of today, the chain of tags * must either contain several indefinite length TLVs, * or several definite length ones. * No mixing is allowed. */ if(tlv_len == -1) { /* * Indefinite length. */ if(limit_len == -1) { expect_00_terminators++; } else { ASN_DEBUG("Unexpected indefinite length " "in a chain of definite lengths"); RETURN(RC_FAIL); } ADVANCE(tag_len + len_len); continue; } else { if(expect_00_terminators) { ASN_DEBUG("Unexpected definite length " "in a chain of indefinite lengths"); RETURN(RC_FAIL); } } /* * Check that multiple TLVs specify ever decreasing length, * which is consistent. */ if(limit_len == -1) { limit_len = tlv_len + tag_len + len_len; if(limit_len < 0) { /* Too great tlv_len value? */ RETURN(RC_FAIL); } } else if(limit_len != tlv_len + tag_len + len_len) { /* * Inner TLV specifies length which is inconsistent * with the outer TLV's length value. */ ASN_DEBUG("Outer TLV is %ld and inner is %ld", (long)limit_len, (long)tlv_len); RETURN(RC_FAIL); } ADVANCE(tag_len + len_len); limit_len -= (tag_len + len_len); if((ssize_t)size > limit_len) { /* * Make sure that we won't consume more bytes * from the parent frame than the inferred limit. */ size = limit_len; } } if(opt_tlv_form) *opt_tlv_form = tlv_constr; if(expect_00_terminators) *last_length = -expect_00_terminators; else *last_length = tlv_len; RETURN(RC_OK); } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ber_decoder.h000066400000000000000000000037771305042567700231060ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _BER_DECODER_H_ #define _BER_DECODER_H_ #include #ifdef __cplusplus extern "C" { #endif struct asn_TYPE_descriptor_s; /* Forward declaration */ struct asn_codec_ctx_s; /* Forward declaration */ /* * The BER decoder of any type. * This function may be invoked directly from the application. * The der_encode() function (der_encoder.h) is an opposite to ber_decode(). */ asn_dec_rval_t ber_decode(struct asn_codec_ctx_s *opt_codec_ctx, struct asn_TYPE_descriptor_s *type_descriptor, void **struct_ptr, /* Pointer to a target structure's pointer */ const void *buffer, /* Data to be decoded */ size_t size /* Size of that buffer */ ); /* * Type of generic function which decodes the byte stream into the structure. */ typedef asn_dec_rval_t (ber_type_decoder_f)( struct asn_codec_ctx_s *opt_codec_ctx, struct asn_TYPE_descriptor_s *type_descriptor, void **struct_ptr, const void *buf_ptr, size_t size, int tag_mode); /******************************* * INTERNALLY USEFUL FUNCTIONS * *******************************/ /* * Check that all tags correspond to the type definition (as given in head). * On return, last_length would contain either a non-negative length of the * value part of the last TLV, or the negative number of expected * "end of content" sequences. The number may only be negative if the * head->last_tag_form is non-zero. */ asn_dec_rval_t ber_check_tags( struct asn_codec_ctx_s *opt_codec_ctx, /* codec options */ struct asn_TYPE_descriptor_s *type_descriptor, asn_struct_ctx_t *opt_ctx, /* saved decoding context */ const void *ptr, size_t size, int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ int last_tag_form, /* {-1,0:1}: any, primitive, constr */ ber_tlv_len_t *last_length, int *opt_tlv_form /* optional tag form */ ); #ifdef __cplusplus } #endif #endif /* _BER_DECODER_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ber_tlv_length.c000066400000000000000000000073101305042567700236250ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include ssize_t ber_fetch_length(int _is_constructed, const void *bufptr, size_t size, ber_tlv_len_t *len_r) { const uint8_t *buf = (const uint8_t *)bufptr; unsigned oct; if(size == 0) return 0; /* Want more */ oct = *(const uint8_t *)buf; if((oct & 0x80) == 0) { /* * Short definite length. */ *len_r = oct; /* & 0x7F */ return 1; } else { ber_tlv_len_t len; size_t skipped; if(_is_constructed && oct == 0x80) { *len_r = -1; /* Indefinite length */ return 1; } if(oct == 0xff) { /* Reserved in standard for future use. */ return -1; } oct &= 0x7F; /* Leave only the 7 LS bits */ for(len = 0, buf++, skipped = 1; oct && (++skipped <= size); buf++, oct--) { len = (len << 8) | *buf; if(len < 0 || (len >> ((8 * sizeof(len)) - 8) && oct > 1)) { /* * Too large length value. */ return -1; } } if(oct == 0) { ber_tlv_len_t lenplusepsilon = (size_t)len + 1024; /* * Here length may be very close or equal to 2G. * However, the arithmetics used in some decoders * may add some (small) quantities to the length, * to check the resulting value against some limits. * This may result in integer wrap-around, which * we try to avoid by checking it earlier here. */ if(lenplusepsilon < 0) { /* Too large length value */ return -1; } *len_r = len; return skipped; } return 0; /* Want more */ } } ssize_t ber_skip_length(asn_codec_ctx_t *opt_codec_ctx, int _is_constructed, const void *ptr, size_t size) { ber_tlv_len_t vlen; /* Length of V in TLV */ ssize_t tl; /* Length of L in TLV */ ssize_t ll; /* Length of L in TLV */ size_t skip; /* * Make sure we didn't exceed the maximum stack size. */ if(_ASN_STACK_OVERFLOW_CHECK(opt_codec_ctx)) return -1; /* * Determine the size of L in TLV. */ ll = ber_fetch_length(_is_constructed, ptr, size, &vlen); if(ll <= 0) return ll; /* * Definite length. */ if(vlen >= 0) { skip = ll + vlen; if(skip > size) return 0; /* Want more */ return skip; } /* * Indefinite length! */ ASN_DEBUG("Skipping indefinite length"); for(skip = ll, ptr = ((const char *)ptr) + ll, size -= ll;;) { ber_tlv_tag_t tag; /* Fetch the tag */ tl = ber_fetch_tag(ptr, size, &tag); if(tl <= 0) return tl; ll = ber_skip_length(opt_codec_ctx, BER_TLV_CONSTRUCTED(ptr), ((const char *)ptr) + tl, size - tl); if(ll <= 0) return ll; skip += tl + ll; /* * This may be the end of the indefinite length structure, * two consecutive 0 octets. * Check if it is true. */ if(((const uint8_t *)ptr)[0] == 0 && ((const uint8_t *)ptr)[1] == 0) return skip; ptr = ((const char *)ptr) + tl + ll; size -= tl + ll; } /* UNREACHABLE */ } size_t der_tlv_length_serialize(ber_tlv_len_t len, void *bufp, size_t size) { size_t required_size; /* Size of len encoding */ uint8_t *buf = (uint8_t *)bufp; uint8_t *end; size_t i; if(len <= 127) { /* Encoded in 1 octet */ if(size) *buf = (uint8_t)len; return 1; } /* * Compute the size of the subsequent bytes. */ for(required_size = 1, i = 8; i < 8 * sizeof(len); i += 8) { if(len >> i) required_size++; else break; } if(size <= required_size) return required_size + 1; *buf++ = (uint8_t)(0x80 | required_size); /* Length of the encoding */ /* * Produce the len encoding, space permitting. */ end = buf + required_size; for(i -= 8; buf < end; i -= 8, buf++) *buf = (uint8_t)(len >> i); return required_size + 1; } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ber_tlv_length.h000066400000000000000000000027751305042567700236440ustar00rootroot00000000000000/*- * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _BER_TLV_LENGTH_H_ #define _BER_TLV_LENGTH_H_ #ifdef __cplusplus extern "C" { #endif typedef ssize_t ber_tlv_len_t; /* * This function tries to fetch the length of the BER TLV value and place it * in *len_r. * RETURN VALUES: * 0: More data expected than bufptr contains. * -1: Fatal error deciphering length. * >0: Number of bytes used from bufptr. * On return with >0, len_r is constrained as -1..MAX, where -1 mean * that the value is of indefinite length. */ ssize_t ber_fetch_length(int _is_constructed, const void *bufptr, size_t size, ber_tlv_len_t *len_r); /* * This function expects bufptr to be positioned over L in TLV. * It returns number of bytes occupied by L and V together, suitable * for skipping. The function properly handles indefinite length. * RETURN VALUES: * Standard {-1,0,>0} convention. */ ssize_t ber_skip_length( struct asn_codec_ctx_s *opt_codec_ctx, /* optional context */ int _is_constructed, const void *bufptr, size_t size); /* * This function serializes the length (L from TLV) in DER format. * It always returns number of bytes necessary to represent the length, * it is a caller's responsibility to check the return value * against the supplied buffer's size. */ size_t der_tlv_length_serialize(ber_tlv_len_t len, void *bufptr, size_t size); #ifdef __cplusplus } #endif #endif /* _BER_TLV_LENGTH_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ber_tlv_tag.c000066400000000000000000000061561305042567700231260ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include ssize_t ber_fetch_tag(const void *ptr, size_t size, ber_tlv_tag_t *tag_r) { ber_tlv_tag_t val; ber_tlv_tag_t tclass; size_t skipped; if(size == 0) return 0; val = *(const uint8_t *)ptr; tclass = (val >> 6); if((val &= 0x1F) != 0x1F) { /* * Simple form: everything encoded in a single octet. * Tag Class is encoded using two least significant bits. */ *tag_r = (val << 2) | tclass; return 1; } /* * Each octet contains 7 bits of useful information. * The MSB is 0 if it is the last octet of the tag. */ for(val = 0, ptr = ((const char *)ptr) + 1, skipped = 2; skipped <= size; ptr = ((const char *)ptr) + 1, skipped++) { unsigned int oct = *(const uint8_t *)ptr; if(oct & 0x80) { val = (val << 7) | (oct & 0x7F); /* * Make sure there are at least 9 bits spare * at the MS side of a value. */ if(val >> ((8 * sizeof(val)) - 9)) { /* * We would not be able to accomodate * any more tag bits. */ return -1; } } else { val = (val << 7) | oct; *tag_r = (val << 2) | tclass; return skipped; } } return 0; /* Want more */ } ssize_t ber_tlv_tag_fwrite(ber_tlv_tag_t tag, FILE *f) { char buf[sizeof("[APPLICATION ]") + 32]; ssize_t ret; ret = ber_tlv_tag_snprint(tag, buf, sizeof(buf)); if(ret >= (ssize_t)sizeof(buf) || ret < 2) { errno = EPERM; return -1; } return fwrite(buf, 1, ret, f); } ssize_t ber_tlv_tag_snprint(ber_tlv_tag_t tag, char *buf, size_t size) { char *type = 0; int ret; switch(tag & 0x3) { case ASN_TAG_CLASS_UNIVERSAL: type = "UNIVERSAL "; break; case ASN_TAG_CLASS_APPLICATION: type = "APPLICATION "; break; case ASN_TAG_CLASS_CONTEXT: type = ""; break; case ASN_TAG_CLASS_PRIVATE: type = "PRIVATE "; break; } ret = snprintf(buf, size, "[%s%u]", type, ((unsigned)tag) >> 2); if(ret <= 0 && size) buf[0] = '\0'; /* against broken libc's */ return ret; } char * ber_tlv_tag_string(ber_tlv_tag_t tag) { static char buf[sizeof("[APPLICATION ]") + 32]; (void)ber_tlv_tag_snprint(tag, buf, sizeof(buf)); return buf; } size_t ber_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) { int tclass = BER_TAG_CLASS(tag); ber_tlv_tag_t tval = BER_TAG_VALUE(tag); uint8_t *buf = (uint8_t *)bufp; uint8_t *end; size_t required_size; size_t i; if(tval <= 30) { /* Encoded in 1 octet */ if(size) buf[0] = (tclass << 6) | tval; return 1; } else if(size) { *buf++ = (tclass << 6) | 0x1F; size--; } /* * Compute the size of the subsequent bytes. */ for(required_size = 1, i = 7; i < 8 * sizeof(tval); i += 7) { if(tval >> i) required_size++; else break; } if(size < required_size) return required_size + 1; /* * Fill in the buffer, space permitting. */ end = buf + required_size - 1; for(i -= 7; buf < end; i -= 7, buf++) *buf = 0x80 | ((tval >> i) & 0x7F); *buf = (tval & 0x7F); /* Last octet without high bit */ return required_size + 1; } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/ber_tlv_tag.h000066400000000000000000000034541305042567700231310ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _BER_TLV_TAG_H_ #define _BER_TLV_TAG_H_ #ifdef __cplusplus extern "C" { #endif enum asn_tag_class { ASN_TAG_CLASS_UNIVERSAL = 0, /* 0b00 */ ASN_TAG_CLASS_APPLICATION = 1, /* 0b01 */ ASN_TAG_CLASS_CONTEXT = 2, /* 0b10 */ ASN_TAG_CLASS_PRIVATE = 3 /* 0b11 */ }; typedef unsigned ber_tlv_tag_t; /* BER TAG from Tag-Length-Value */ /* * Tag class is encoded together with tag value for optimization purposes. */ #define BER_TAG_CLASS(tag) ((tag) & 0x3) #define BER_TAG_VALUE(tag) ((tag) >> 2) #define BER_TLV_CONSTRUCTED(tagptr) (((*(const uint8_t *)tagptr)&0x20)?1:0) #define BER_TAGS_EQUAL(tag1, tag2) ((tag1) == (tag2)) /* * Several functions for printing the TAG in the canonical form * (i.e. "[PRIVATE 0]"). * Return values correspond to their libc counterparts (if any). */ ssize_t ber_tlv_tag_snprint(ber_tlv_tag_t tag, char *buf, size_t buflen); ssize_t ber_tlv_tag_fwrite(ber_tlv_tag_t tag, FILE *); char *ber_tlv_tag_string(ber_tlv_tag_t tag); /* * This function tries to fetch the tag from the input stream. * RETURN VALUES: * 0: More data expected than bufptr contains. * -1: Fatal error deciphering tag. * >0: Number of bytes used from bufptr. tag_r will contain the tag. */ ssize_t ber_fetch_tag(const void *bufptr, size_t size, ber_tlv_tag_t *tag_r); /* * This function serializes the tag (T from TLV) in BER format. * It always returns number of bytes necessary to represent the tag, * it is a caller's responsibility to check the return value * against the supplied buffer's size. */ size_t ber_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufptr, size_t size); #ifdef __cplusplus } #endif #endif /* _BER_TLV_TAG_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/constr_CHOICE.c000066400000000000000000000676461305042567700231730ustar00rootroot00000000000000/* * Copyright (c) 2003, 2004, 2005, 2006, 2007 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include /* * Number of bytes left for this structure. * (ctx->left) indicates the number of bytes _transferred_ for the structure. * (size) contains the number of bytes in the buffer passed. */ #define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) /* * If the subprocessor function returns with an indication that it wants * more data, it may well be a fatal decoding problem, because the * size is constrained by the 's L, even if the buffer size allows * reading more data. * For example, consider the buffer containing the following TLVs: * ... * The TLV length clearly indicates that one byte is expected in V, but * if the V processor returns with "want more data" even if the buffer * contains way more data than the V processor have seen. */ #define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) /* * This macro "eats" the part of the buffer which is definitely "consumed", * i.e. was correctly converted into local representation or rightfully skipped. */ #undef ADVANCE #define ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ ptr = ((const char *)ptr) + num;\ size -= num; \ if(ctx->left >= 0) \ ctx->left -= num; \ consumed_myself += num; \ } while(0) /* * Switch to the next phase of parsing. */ #undef NEXT_PHASE #define NEXT_PHASE(ctx) do { \ ctx->phase++; \ ctx->step = 0; \ } while(0) /* * Return a standardized complex structure. */ #undef RETURN #define RETURN(_code) do { \ rval.code = _code; \ rval.consumed = consumed_myself;\ return rval; \ } while(0) /* * See the definitions. */ static int _fetch_present_idx(const void *struct_ptr, int off, int size); static void _set_present_idx(void *sptr, int offset, int size, int pres); /* * Tags are canonically sorted in the tag to member table. */ static int _search4tag(const void *ap, const void *bp) { const asn_TYPE_tag2member_t *a = (const asn_TYPE_tag2member_t *)ap; const asn_TYPE_tag2member_t *b = (const asn_TYPE_tag2member_t *)bp; int a_class = BER_TAG_CLASS(a->el_tag); int b_class = BER_TAG_CLASS(b->el_tag); if(a_class == b_class) { ber_tlv_tag_t a_value = BER_TAG_VALUE(a->el_tag); ber_tlv_tag_t b_value = BER_TAG_VALUE(b->el_tag); if(a_value == b_value) return 0; else if(a_value < b_value) return -1; else return 1; } else if(a_class < b_class) { return -1; } else { return 1; } } /* * The decoder of the CHOICE type. */ asn_dec_rval_t CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **struct_ptr, const void *ptr, size_t size, int tag_mode) { /* * Bring closer parts of structure description. */ asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; asn_TYPE_member_t *elements = td->elements; /* * Parts of the structure being constructed. */ void *st = *struct_ptr; /* Target structure. */ asn_struct_ctx_t *ctx; /* Decoder context */ ber_tlv_tag_t tlv_tag; /* T from TLV */ ssize_t tag_len; /* Length of TLV's T */ asn_dec_rval_t rval; /* Return code from subparsers */ ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ ASN_DEBUG("Decoding %s as CHOICE", td->name); /* * Create the target structure if it is not present already. */ if(st == 0) { st = *struct_ptr = CALLOC(1, specs->struct_size); if(st == 0) { RETURN(RC_FAIL); } } /* * Restore parsing context. */ ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); /* * Start to parse where left previously */ switch(ctx->phase) { case 0: /* * PHASE 0. * Check that the set of tags associated with given structure * perfectly fits our expectations. */ if(tag_mode || td->tags_count) { rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, tag_mode, -1, &ctx->left, 0); if(rval.code != RC_OK) { ASN_DEBUG("%s tagging check failed: %d", td->name, rval.code); return rval; } if(ctx->left >= 0) { /* ?Substracted below! */ ctx->left += rval.consumed; } ADVANCE(rval.consumed); } else { ctx->left = -1; } NEXT_PHASE(ctx); ASN_DEBUG("Structure consumes %ld bytes, buffer %ld", (long)ctx->left, (long)size); /* Fall through */ case 1: /* * Fetch the T from TLV. */ tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); ASN_DEBUG("In %s CHOICE tag length %d", td->name, (int)tag_len); switch(tag_len) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); /* Fall through */ case -1: RETURN(RC_FAIL); } do { asn_TYPE_tag2member_t *t2m; asn_TYPE_tag2member_t key; key.el_tag = tlv_tag; t2m = (asn_TYPE_tag2member_t *)bsearch(&key, specs->tag2el, specs->tag2el_count, sizeof(specs->tag2el[0]), _search4tag); if(t2m) { /* * Found the element corresponding to the tag. */ NEXT_PHASE(ctx); ctx->step = t2m->el_no; break; } else if(specs->ext_start == -1) { ASN_DEBUG("Unexpected tag %s " "in non-extensible CHOICE %s", ber_tlv_tag_string(tlv_tag), td->name); RETURN(RC_FAIL); } else { /* Skip this tag */ ssize_t skip; ASN_DEBUG("Skipping unknown tag %s", ber_tlv_tag_string(tlv_tag)); skip = ber_skip_length(opt_codec_ctx, BER_TLV_CONSTRUCTED(ptr), (const char *)ptr + tag_len, LEFT - tag_len); switch(skip) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); /* Fall through */ case -1: RETURN(RC_FAIL); } ADVANCE(skip + tag_len); RETURN(RC_OK); } } while(0); case 2: /* * PHASE 2. * Read in the element. */ do { asn_TYPE_member_t *elm;/* CHOICE's element */ void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ elm = &elements[ctx->step]; /* * Compute the position of the member inside a structure, * and also a type of containment (it may be contained * as pointer or using inline inclusion). */ if(elm->flags & ATF_POINTER) { /* Member is a pointer to another structure */ memb_ptr2 = (void **)((char *)st + elm->memb_offset); } else { /* * A pointer to a pointer * holding the start of the structure */ memb_ptr = (char *)st + elm->memb_offset; memb_ptr2 = &memb_ptr; } /* Set presence to be able to free it properly at any time */ _set_present_idx(st, specs->pres_offset, specs->pres_size, ctx->step + 1); /* * Invoke the member fetch routine according to member's type */ rval = elm->type->ber_decoder(opt_codec_ctx, elm->type, memb_ptr2, ptr, LEFT, elm->tag_mode); switch(rval.code) { case RC_OK: break; case RC_WMORE: /* More data expected */ if(!SIZE_VIOLATION) { ADVANCE(rval.consumed); RETURN(RC_WMORE); } RETURN(RC_FAIL); case RC_FAIL: /* Fatal error */ RETURN(rval.code); } /* switch(rval) */ ADVANCE(rval.consumed); } while(0); NEXT_PHASE(ctx); /* Fall through */ case 3: ASN_DEBUG("CHOICE %s Leftover: %ld, size = %ld, tm=%d, tc=%d", td->name, (long)ctx->left, (long)size, tag_mode, td->tags_count); if(ctx->left > 0) { /* * The type must be fully decoded * by the CHOICE member-specific decoder. */ RETURN(RC_FAIL); } if(ctx->left == -1 && !(tag_mode || td->tags_count)) { /* * This is an untagged CHOICE. * It doesn't contain nothing * except for the member itself, including all its tags. * The decoding is completed. */ NEXT_PHASE(ctx); break; } /* * Read in the "end of data chunks"'s. */ while(ctx->left < 0) { ssize_t tl; tl = ber_fetch_tag(ptr, LEFT, &tlv_tag); switch(tl) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); /* Fall through */ case -1: RETURN(RC_FAIL); } /* * Expected <0><0>... */ if(((const uint8_t *)ptr)[0] == 0) { if(LEFT < 2) { if(SIZE_VIOLATION) RETURN(RC_FAIL); else RETURN(RC_WMORE); } else if(((const uint8_t *)ptr)[1] == 0) { /* * Correctly finished with <0><0>. */ ADVANCE(2); ctx->left++; continue; } } else { ASN_DEBUG("Unexpected continuation in %s", td->name); RETURN(RC_FAIL); } /* UNREACHABLE */ } NEXT_PHASE(ctx); case 4: /* No meaningful work here */ break; } RETURN(RC_OK); } asn_enc_rval_t CHOICE_encode_der(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; asn_TYPE_member_t *elm; /* CHOICE element */ asn_enc_rval_t erval; void *memb_ptr; size_t computed_size = 0; int present; if(!sptr) _ASN_ENCODE_FAILED; ASN_DEBUG("%s %s as CHOICE", cb?"Encoding":"Estimating", td->name); present = _fetch_present_idx(sptr, specs->pres_offset, specs->pres_size); /* * If the structure was not initialized, it cannot be encoded: * can't deduce what to encode in the choice type. */ if(present <= 0 || present > td->elements_count) { if(present == 0 && td->elements_count == 0) { /* The CHOICE is empty?! */ erval.encoded = 0; _ASN_ENCODED_OK(erval); } _ASN_ENCODE_FAILED; } /* * Seek over the present member of the structure. */ elm = &td->elements[present-1]; if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)sptr + elm->memb_offset); if(memb_ptr == 0) { if(elm->optional) { erval.encoded = 0; _ASN_ENCODED_OK(erval); } /* Mandatory element absent */ _ASN_ENCODE_FAILED; } } else { memb_ptr = (void *)((char *)sptr + elm->memb_offset); } /* * If the CHOICE itself is tagged EXPLICIT: * T ::= [2] EXPLICIT CHOICE { ... } * Then emit the appropriate tags. */ if(tag_mode == 1 || td->tags_count) { /* * For this, we need to pre-compute the member. */ ssize_t ret; /* Encode member with its tag */ erval = elm->type->der_encoder(elm->type, memb_ptr, elm->tag_mode, elm->tag, 0, 0); if(erval.encoded == -1) return erval; /* Encode CHOICE with parent or my own tag */ ret = der_write_tags(td, erval.encoded, tag_mode, 1, tag, cb, app_key); if(ret == -1) _ASN_ENCODE_FAILED; computed_size += ret; } /* * Encode the single underlying member. */ erval = elm->type->der_encoder(elm->type, memb_ptr, elm->tag_mode, elm->tag, cb, app_key); if(erval.encoded == -1) return erval; ASN_DEBUG("Encoded CHOICE member in %ld bytes (+%ld)", (long)erval.encoded, (long)computed_size); erval.encoded += computed_size; return erval; } ber_tlv_tag_t CHOICE_outmost_tag(asn_TYPE_descriptor_t *td, const void *ptr, int tag_mode, ber_tlv_tag_t tag) { asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; int present; assert(tag_mode == 0); (void)tag_mode; assert(tag == 0); (void)tag; /* * Figure out which CHOICE element is encoded. */ present = _fetch_present_idx(ptr, specs->pres_offset, specs->pres_size); if(present > 0 || present <= td->elements_count) { asn_TYPE_member_t *elm = &td->elements[present-1]; const void *memb_ptr; if(elm->flags & ATF_POINTER) { memb_ptr = *(const void * const *) ((const char *)ptr + elm->memb_offset); } else { memb_ptr = (const void *) ((const char *)ptr + elm->memb_offset); } return asn_TYPE_outmost_tag(elm->type, memb_ptr, elm->tag_mode, elm->tag); } else { return (ber_tlv_tag_t)-1; } } int CHOICE_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; int present; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } /* * Figure out which CHOICE element is encoded. */ present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); if(present > 0 && present <= td->elements_count) { asn_TYPE_member_t *elm = &td->elements[present-1]; const void *memb_ptr; if(elm->flags & ATF_POINTER) { memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); if(!memb_ptr) { if(elm->optional) return 0; _ASN_CTFAIL(app_key, td, sptr, "%s: mandatory CHOICE element %s absent (%s:%d)", td->name, elm->name, __FILE__, __LINE__); return -1; } } else { memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); } if(elm->memb_constraints) { return elm->memb_constraints(elm->type, memb_ptr, ctfailcb, app_key); } else { int ret = elm->type->check_constraints(elm->type, memb_ptr, ctfailcb, app_key); /* * Cannot inherit it eralier: * need to make sure we get the updated version. */ elm->memb_constraints = elm->type->check_constraints; return ret; } } else { _ASN_CTFAIL(app_key, td, sptr, "%s: no CHOICE element given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } #undef XER_ADVANCE #define XER_ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ buf_ptr = ((const char *)buf_ptr) + num;\ size -= num; \ consumed_myself += num; \ } while(0) /* * Decode the XER (XML) data. */ asn_dec_rval_t CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **struct_ptr, const char *opt_mname, const void *buf_ptr, size_t size) { /* * Bring closer parts of structure description. */ asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; /* * Parts of the structure being constructed. */ void *st = *struct_ptr; /* Target structure. */ asn_struct_ctx_t *ctx; /* Decoder context */ asn_dec_rval_t rval; /* Return value of a decoder */ ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ int edx; /* Element index */ /* * Create the target structure if it is not present already. */ if(st == 0) { st = *struct_ptr = CALLOC(1, specs->struct_size); if(st == 0) RETURN(RC_FAIL); } /* * Restore parsing context. */ ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); if(ctx->phase == 0 && !*xml_tag) ctx->phase = 1; /* Skip the outer tag checking phase */ /* * Phases of XER/XML processing: * Phase 0: Check that the opening tag matches our expectations. * Phase 1: Processing body and reacting on closing tag. * Phase 2: Processing inner type. * Phase 3: Only waiting for closing tag. * Phase 4: Skipping unknown extensions. * Phase 5: PHASED OUT */ for(edx = ctx->step; ctx->phase <= 4;) { pxer_chunk_type_e ch_type; /* XER chunk type */ ssize_t ch_size; /* Chunk size */ xer_check_tag_e tcv; /* Tag check value */ asn_TYPE_member_t *elm; /* * Go inside the member. */ if(ctx->phase == 2) { asn_dec_rval_t tmprval; void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ elm = &td->elements[edx]; if(elm->flags & ATF_POINTER) { /* Member is a pointer to another structure */ memb_ptr2 = (void **)((char *)st + elm->memb_offset); } else { memb_ptr = (char *)st + elm->memb_offset; memb_ptr2 = &memb_ptr; } /* Start/Continue decoding the inner member */ tmprval = elm->type->xer_decoder(opt_codec_ctx, elm->type, memb_ptr2, elm->name, buf_ptr, size); XER_ADVANCE(tmprval.consumed); ASN_DEBUG("XER/CHOICE: itdf: [%s] code=%d", elm->type->name, tmprval.code); if(tmprval.code != RC_OK) RETURN(tmprval.code); assert(_fetch_present_idx(st, specs->pres_offset, specs->pres_size) == 0); /* Record what we've got */ _set_present_idx(st, specs->pres_offset, specs->pres_size, edx + 1); ctx->phase = 3; /* Fall through */ } /* No need to wait for closing tag; special mode. */ if(ctx->phase == 3 && !*xml_tag) { ctx->phase = 5; /* Phase out */ RETURN(RC_OK); } /* * Get the next part of the XML stream. */ ch_size = xer_next_token(&ctx->context, buf_ptr, size, &ch_type); switch(ch_size) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); default: switch(ch_type) { case PXER_COMMENT: /* Got XML comment */ case PXER_TEXT: /* Ignore free-standing text */ XER_ADVANCE(ch_size); /* Skip silently */ continue; case PXER_TAG: break; /* Check the rest down there */ } } tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); ASN_DEBUG("XER/CHOICE checked [%c%c%c%c] vs [%s], tcv=%d", ch_size>0?((const uint8_t *)buf_ptr)[0]:'?', ch_size>1?((const uint8_t *)buf_ptr)[1]:'?', ch_size>2?((const uint8_t *)buf_ptr)[2]:'?', ch_size>3?((const uint8_t *)buf_ptr)[3]:'?', xml_tag, tcv); /* Skip the extensions section */ if(ctx->phase == 4) { ASN_DEBUG("skip_unknown(%d, %ld)", tcv, (long)ctx->left); switch(xer_skip_unknown(tcv, &ctx->left)) { case -1: ctx->phase = 5; RETURN(RC_FAIL); continue; case 1: ctx->phase = 3; /* Fall through */ case 0: XER_ADVANCE(ch_size); continue; case 2: ctx->phase = 3; break; } } switch(tcv) { case XCT_BOTH: break; /* No CHOICE? */ case XCT_CLOSING: if(ctx->phase != 3) break; XER_ADVANCE(ch_size); ctx->phase = 5; /* Phase out */ RETURN(RC_OK); case XCT_OPENING: if(ctx->phase == 0) { XER_ADVANCE(ch_size); ctx->phase = 1; /* Processing body phase */ continue; } /* Fall through */ case XCT_UNKNOWN_OP: case XCT_UNKNOWN_BO: if(ctx->phase != 1) break; /* Really unexpected */ /* * Search which inner member corresponds to this tag. */ for(edx = 0; edx < td->elements_count; edx++) { elm = &td->elements[edx]; tcv = xer_check_tag(buf_ptr,ch_size,elm->name); switch(tcv) { case XCT_BOTH: case XCT_OPENING: /* * Process this member. */ ctx->step = edx; ctx->phase = 2; break; case XCT_UNKNOWN_OP: case XCT_UNKNOWN_BO: continue; default: edx = td->elements_count; break; /* Phase out */ } break; } if(edx != td->elements_count) continue; /* It is expected extension */ if(specs->ext_start != -1) { ASN_DEBUG("Got anticipated extension"); /* * Check for (XCT_BOTH or XCT_UNKNOWN_BO) * By using a mask. Only record a pure * tags. */ if(tcv & XCT_CLOSING) { /* Found without body */ ctx->phase = 3; /* Terminating */ } else { ctx->left = 1; ctx->phase = 4; /* Skip ...'s */ } XER_ADVANCE(ch_size); continue; } /* Fall through */ default: break; } ASN_DEBUG("Unexpected XML tag [%c%c%c%c] in CHOICE [%s]" " (ph=%d, tag=%s)", ch_size>0?((const uint8_t *)buf_ptr)[0]:'?', ch_size>1?((const uint8_t *)buf_ptr)[1]:'?', ch_size>2?((const uint8_t *)buf_ptr)[2]:'?', ch_size>3?((const uint8_t *)buf_ptr)[3]:'?', td->name, ctx->phase, xml_tag); break; } ctx->phase = 5; /* Phase out, just in case */ RETURN(RC_FAIL); } asn_enc_rval_t CHOICE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_CHOICE_specifics_t *specs=(asn_CHOICE_specifics_t *)td->specifics; asn_enc_rval_t er; int present; if(!sptr) _ASN_ENCODE_FAILED; /* * Figure out which CHOICE element is encoded. */ present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); if(present <= 0 || present > td->elements_count) { _ASN_ENCODE_FAILED; } else { asn_enc_rval_t tmper; asn_TYPE_member_t *elm = &td->elements[present-1]; void *memb_ptr; const char *mname = elm->name; unsigned int mlen = strlen(mname); if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)sptr + elm->memb_offset); if(!memb_ptr) _ASN_ENCODE_FAILED; } else { memb_ptr = (void *)((char *)sptr + elm->memb_offset); } er.encoded = 0; if(!(flags & XER_F_CANONICAL)) _i_ASN_TEXT_INDENT(1, ilevel); _ASN_CALLBACK3("<", 1, mname, mlen, ">", 1); tmper = elm->type->xer_encoder(elm->type, memb_ptr, ilevel + 1, flags, cb, app_key); if(tmper.encoded == -1) return tmper; _ASN_CALLBACK3("", 1); er.encoded += 5 + (2 * mlen) + tmper.encoded; } if(!(flags & XER_F_CANONICAL)) _i_ASN_TEXT_INDENT(1, ilevel - 1); _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } asn_dec_rval_t CHOICE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; asn_dec_rval_t rv; asn_per_constraint_t *ct; asn_TYPE_member_t *elm; /* CHOICE's element */ void *memb_ptr; void **memb_ptr2; void *st = *sptr; int value; if(_ASN_STACK_OVERFLOW_CHECK(opt_codec_ctx)) _ASN_DECODE_FAILED; /* * Create the target structure if it is not present already. */ if(!st) { st = *sptr = CALLOC(1, specs->struct_size); if(!st) _ASN_DECODE_FAILED; } if(constraints) ct = &constraints->value; else if(td->per_constraints) ct = &td->per_constraints->value; else ct = 0; if(ct && ct->flags & APC_EXTENSIBLE) { value = per_get_few_bits(pd, 1); if(value < 0) _ASN_DECODE_STARVED; if(value) ct = 0; /* Not restricted */ } if(ct && ct->range_bits >= 0) { value = per_get_few_bits(pd, ct->range_bits); if(value < 0) _ASN_DECODE_STARVED; ASN_DEBUG("CHOICE %s got index %d in range %d", td->name, value, ct->range_bits); if(value > ct->upper_bound) _ASN_DECODE_FAILED; } else { if(specs->ext_start == -1) _ASN_DECODE_FAILED; value = uper_get_nsnnwn(pd); if(value < 0) _ASN_DECODE_STARVED; value += specs->ext_start; if(value >= td->elements_count) _ASN_DECODE_FAILED; } /* Adjust if canonical order is different from natural order */ if(specs->canonical_order) value = specs->canonical_order[value]; /* Set presence to be able to free it later */ _set_present_idx(st, specs->pres_offset, specs->pres_size, value + 1); elm = &td->elements[value]; if(elm->flags & ATF_POINTER) { /* Member is a pointer to another structure */ memb_ptr2 = (void **)((char *)st + elm->memb_offset); } else { memb_ptr = (char *)st + elm->memb_offset; memb_ptr2 = &memb_ptr; } ASN_DEBUG("Discovered CHOICE %s encodes %s", td->name, elm->name); if(ct && ct->range_bits >= 0) { rv = elm->type->uper_decoder(opt_codec_ctx, elm->type, elm->per_constraints, memb_ptr2, pd); } else { rv = uper_open_type_get(opt_codec_ctx, elm->type, elm->per_constraints, memb_ptr2, pd); } if(rv.code != RC_OK) ASN_DEBUG("Failed to decode %s in %s (CHOICE) %d", elm->name, td->name, rv.code); return rv; } asn_enc_rval_t CHOICE_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; asn_TYPE_member_t *elm; /* CHOICE's element */ asn_per_constraint_t *ct; void *memb_ptr; int present; if(!sptr) _ASN_ENCODE_FAILED; ASN_DEBUG("Encoding %s as CHOICE", td->name); if(constraints) ct = &constraints->value; else if(td->per_constraints) ct = &td->per_constraints->value; else ct = 0; present = _fetch_present_idx(sptr, specs->pres_offset, specs->pres_size); /* * If the structure was not initialized properly, it cannot be encoded: * can't deduce what to encode in the choice type. */ if(present <= 0 || present > td->elements_count) _ASN_ENCODE_FAILED; else present--; /* Adjust if canonical order is different from natural order */ if(specs->canonical_order) present = specs->canonical_order[present]; ASN_DEBUG("Encoding %s CHOICE element %d", td->name, present); if(ct && ct->range_bits >= 0) { if(present < ct->lower_bound || present > ct->upper_bound) { if(ct->flags & APC_EXTENSIBLE) { if(per_put_few_bits(po, 1, 1)) _ASN_ENCODE_FAILED; } else { _ASN_ENCODE_FAILED; } ct = 0; } } if(ct && ct->flags & APC_EXTENSIBLE) if(per_put_few_bits(po, 0, 1)) _ASN_ENCODE_FAILED; elm = &td->elements[present]; if(elm->flags & ATF_POINTER) { /* Member is a pointer to another structure */ memb_ptr = *(void **)((char *)sptr + elm->memb_offset); if(!memb_ptr) _ASN_ENCODE_FAILED; } else { memb_ptr = (char *)sptr + elm->memb_offset; } if(ct && ct->range_bits >= 0) { if(per_put_few_bits(po, present, ct->range_bits)) _ASN_ENCODE_FAILED; return elm->type->uper_encoder(elm->type, elm->per_constraints, memb_ptr, po); } else { asn_enc_rval_t rval; if(specs->ext_start == -1) _ASN_ENCODE_FAILED; if(uper_put_nsnnwn(po, present - specs->ext_start)) _ASN_ENCODE_FAILED; if(uper_open_type_put(elm->type, elm->per_constraints, memb_ptr, po)) _ASN_ENCODE_FAILED; rval.encoded = 0; _ASN_ENCODED_OK(rval); } } int CHOICE_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; int present; if(!sptr) return (cb("", 8, app_key) < 0) ? -1 : 0; /* * Figure out which CHOICE element is encoded. */ present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); /* * Print that element. */ if(present > 0 && present <= td->elements_count) { asn_TYPE_member_t *elm = &td->elements[present-1]; const void *memb_ptr; if(elm->flags & ATF_POINTER) { memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); if(!memb_ptr) return (cb("", 8, app_key) < 0) ? -1 : 0; } else { memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); } /* Print member's name and stuff */ if(0) { if(cb(elm->name, strlen(elm->name), app_key) < 0 || cb(": ", 2, app_key) < 0) return -1; } return elm->type->print_struct(elm->type, memb_ptr, ilevel, cb, app_key); } else { return (cb("", 8, app_key) < 0) ? -1 : 0; } } void CHOICE_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; int present; if(!td || !ptr) return; ASN_DEBUG("Freeing %s as CHOICE", td->name); /* * Figure out which CHOICE element is encoded. */ present = _fetch_present_idx(ptr, specs->pres_offset, specs->pres_size); /* * Free that element. */ if(present > 0 && present <= td->elements_count) { asn_TYPE_member_t *elm = &td->elements[present-1]; void *memb_ptr; if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)ptr + elm->memb_offset); if(memb_ptr) ASN_STRUCT_FREE(*elm->type, memb_ptr); } else { memb_ptr = (void *)((char *)ptr + elm->memb_offset); ASN_STRUCT_FREE_CONTENTS_ONLY(*elm->type, memb_ptr); } } if(!contents_only) { FREEMEM(ptr); } } /* * The following functions functions offer protection against -fshort-enums, * compatible with little- and big-endian machines. * If assertion is triggered, either disable -fshort-enums, or add an entry * here with the ->pres_size of your target stracture. * Unless the target structure is packed, the ".present" member * is guaranteed to be aligned properly. ASN.1 compiler itself does not * produce packed code. */ static int _fetch_present_idx(const void *struct_ptr, int pres_offset, int pres_size) { const void *present_ptr; int present; present_ptr = ((const char *)struct_ptr) + pres_offset; switch(pres_size) { case sizeof(int): present = *(const int *)present_ptr; break; case sizeof(short): present = *(const short *)present_ptr; break; case sizeof(char): present = *(const char *)present_ptr; break; default: /* ANSI C mandates enum to be equivalent to integer */ assert(pres_size != sizeof(int)); return 0; /* If not aborted, pass back safe value */ } return present; } static void _set_present_idx(void *struct_ptr, int pres_offset, int pres_size, int present) { void *present_ptr; present_ptr = ((char *)struct_ptr) + pres_offset; switch(pres_size) { case sizeof(int): *(int *)present_ptr = present; break; case sizeof(short): *(short *)present_ptr = present; break; case sizeof(char): *(char *)present_ptr = present; break; default: /* ANSI C mandates enum to be equivalent to integer */ assert(pres_size != sizeof(int)); } } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/constr_CHOICE.h000066400000000000000000000025661305042567700231660ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004, 2005 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _CONSTR_CHOICE_H_ #define _CONSTR_CHOICE_H_ #include #ifdef __cplusplus extern "C" { #endif typedef struct asn_CHOICE_specifics_s { /* * Target structure description. */ int struct_size; /* Size of the target structure. */ int ctx_offset; /* Offset of the asn_codec_ctx_t member */ int pres_offset; /* Identifier of the present member */ int pres_size; /* Size of the identifier (enum) */ /* * Tags to members mapping table. */ asn_TYPE_tag2member_t *tag2el; int tag2el_count; /* Canonical ordering of CHOICE elements, for PER */ int *canonical_order; /* * Extensions-related stuff. */ int ext_start; /* First member of extensions, or -1 */ } asn_CHOICE_specifics_t; /* * A set specialized functions dealing with the CHOICE type. */ asn_struct_free_f CHOICE_free; asn_struct_print_f CHOICE_print; asn_constr_check_f CHOICE_constraint; ber_type_decoder_f CHOICE_decode_ber; der_type_encoder_f CHOICE_encode_der; xer_type_decoder_f CHOICE_decode_xer; xer_type_encoder_f CHOICE_encode_xer; per_type_decoder_f CHOICE_decode_uper; per_type_encoder_f CHOICE_encode_uper; asn_outmost_tag_f CHOICE_outmost_tag; #ifdef __cplusplus } #endif #endif /* _CONSTR_CHOICE_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/constr_SEQUENCE.c000066400000000000000000001072361305042567700234370ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004, 2005, 2006, 2007 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include /* * Number of bytes left for this structure. * (ctx->left) indicates the number of bytes _transferred_ for the structure. * (size) contains the number of bytes in the buffer passed. */ #define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) /* * If the subprocessor function returns with an indication that it wants * more data, it may well be a fatal decoding problem, because the * size is constrained by the 's L, even if the buffer size allows * reading more data. * For example, consider the buffer containing the following TLVs: * ... * The TLV length clearly indicates that one byte is expected in V, but * if the V processor returns with "want more data" even if the buffer * contains way more data than the V processor have seen. */ #define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) /* * This macro "eats" the part of the buffer which is definitely "consumed", * i.e. was correctly converted into local representation or rightfully skipped. */ #undef ADVANCE #define ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ ptr = ((const char *)ptr) + num;\ size -= num; \ if(ctx->left >= 0) \ ctx->left -= num; \ consumed_myself += num; \ } while(0) /* * Switch to the next phase of parsing. */ #undef NEXT_PHASE #undef PHASE_OUT #define NEXT_PHASE(ctx) do { \ ctx->phase++; \ ctx->step = 0; \ } while(0) #define PHASE_OUT(ctx) do { ctx->phase = 10; } while(0) /* * Return a standardized complex structure. */ #undef RETURN #define RETURN(_code) do { \ rval.code = _code; \ rval.consumed = consumed_myself;\ return rval; \ } while(0) /* * Check whether we are inside the extensions group. */ #define IN_EXTENSION_GROUP(specs, memb_idx) \ ( ((memb_idx) > (specs)->ext_after) \ &&((memb_idx) < (specs)->ext_before)) /* * Tags are canonically sorted in the tag2element map. */ static int _t2e_cmp(const void *ap, const void *bp) { const asn_TYPE_tag2member_t *a = (const asn_TYPE_tag2member_t *)ap; const asn_TYPE_tag2member_t *b = (const asn_TYPE_tag2member_t *)bp; int a_class = BER_TAG_CLASS(a->el_tag); int b_class = BER_TAG_CLASS(b->el_tag); if(a_class == b_class) { ber_tlv_tag_t a_value = BER_TAG_VALUE(a->el_tag); ber_tlv_tag_t b_value = BER_TAG_VALUE(b->el_tag); if(a_value == b_value) { if(a->el_no > b->el_no) return 1; /* * Important: we do not check * for a->el_no <= b->el_no! */ return 0; } else if(a_value < b_value) return -1; else return 1; } else if(a_class < b_class) { return -1; } else { return 1; } } /* * The decoder of the SEQUENCE type. */ asn_dec_rval_t SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **struct_ptr, const void *ptr, size_t size, int tag_mode) { /* * Bring closer parts of structure description. */ asn_SEQUENCE_specifics_t *specs = (asn_SEQUENCE_specifics_t *)td->specifics; asn_TYPE_member_t *elements = td->elements; /* * Parts of the structure being constructed. */ void *st = *struct_ptr; /* Target structure. */ asn_struct_ctx_t *ctx; /* Decoder context */ ber_tlv_tag_t tlv_tag; /* T from TLV */ asn_dec_rval_t rval; /* Return code from subparsers */ ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ int edx; /* SEQUENCE element's index */ ASN_DEBUG("Decoding %s as SEQUENCE", td->name); /* * Create the target structure if it is not present already. */ if(st == 0) { st = *struct_ptr = CALLOC(1, specs->struct_size); if(st == 0) { RETURN(RC_FAIL); } } /* * Restore parsing context. */ ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); /* * Start to parse where left previously */ switch(ctx->phase) { case 0: /* * PHASE 0. * Check that the set of tags associated with given structure * perfectly fits our expectations. */ rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, tag_mode, 1, &ctx->left, 0); if(rval.code != RC_OK) { ASN_DEBUG("%s tagging check failed: %d", td->name, rval.code); return rval; } if(ctx->left >= 0) ctx->left += rval.consumed; /* ?Substracted below! */ ADVANCE(rval.consumed); NEXT_PHASE(ctx); ASN_DEBUG("Structure consumes %ld bytes, buffer %ld", (long)ctx->left, (long)size); /* Fall through */ case 1: /* * PHASE 1. * From the place where we've left it previously, * try to decode the next member from the list of * this structure's elements. * (ctx->step) stores the member being processed * between invocations and the microphase {0,1} of parsing * that member: * step = ( * 2 + ). */ for(edx = (ctx->step >> 1); edx < td->elements_count; edx++, ctx->step = (ctx->step & ~1) + 2) { void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ ssize_t tag_len; /* Length of TLV's T */ int opt_edx_end; /* Next non-optional element */ int use_bsearch; int n; if(ctx->step & 1) goto microphase2; /* * MICROPHASE 1: Synchronize decoding. */ ASN_DEBUG("In %s SEQUENCE left %d, edx=%d flags=%d" " opt=%d ec=%d", td->name, (int)ctx->left, edx, elements[edx].flags, elements[edx].optional, td->elements_count); if(ctx->left == 0 /* No more stuff is expected */ && ( /* Explicit OPTIONAL specification reaches the end */ (edx + elements[edx].optional == td->elements_count) || /* All extensions are optional */ (IN_EXTENSION_GROUP(specs, edx) && specs->ext_before > td->elements_count) ) ) { ASN_DEBUG("End of SEQUENCE %s", td->name); /* * Found the legitimate end of the structure. */ PHASE_OUT(ctx); RETURN(RC_OK); } /* * Fetch the T from TLV. */ tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); ASN_DEBUG("Current tag in %s SEQUENCE for element %d " "(%s) is %s encoded in %d bytes, of frame %ld", td->name, edx, elements[edx].name, ber_tlv_tag_string(tlv_tag), (int)tag_len, (long)LEFT); switch(tag_len) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); /* Fall through */ case -1: RETURN(RC_FAIL); } if(ctx->left < 0 && ((const uint8_t *)ptr)[0] == 0) { if(LEFT < 2) { if(SIZE_VIOLATION) RETURN(RC_FAIL); else RETURN(RC_WMORE); } else if(((const uint8_t *)ptr)[1] == 0) { ASN_DEBUG("edx = %d, opt = %d, ec=%d", edx, elements[edx].optional, td->elements_count); if((edx + elements[edx].optional == td->elements_count) || (IN_EXTENSION_GROUP(specs, edx) && specs->ext_before > td->elements_count)) { /* * Yeah, baby! Found the terminator * of the indefinite length structure. */ /* * Proceed to the canonical * finalization function. * No advancing is necessary. */ goto phase3; } } } /* * Find the next available type with this tag. */ use_bsearch = 0; opt_edx_end = edx + elements[edx].optional + 1; if(opt_edx_end > td->elements_count) opt_edx_end = td->elements_count; /* Cap */ else if(opt_edx_end - edx > 8) { /* Limit the scope of linear search... */ opt_edx_end = edx + 8; use_bsearch = 1; /* ... and resort to bsearch() */ } for(n = edx; n < opt_edx_end; n++) { if(BER_TAGS_EQUAL(tlv_tag, elements[n].tag)) { /* * Found element corresponding to the tag * being looked at. * Reposition over the right element. */ edx = n; ctx->step = 1 + 2 * edx; /* Remember! */ goto microphase2; } else if(elements[n].flags & ATF_OPEN_TYPE) { /* * This is the ANY type, which may bear * any flag whatsoever. */ edx = n; ctx->step = 1 + 2 * edx; /* Remember! */ goto microphase2; } else if(elements[n].tag == (ber_tlv_tag_t)-1) { use_bsearch = 1; break; } } if(use_bsearch) { /* * Resort to a binary search over * sorted array of tags. */ asn_TYPE_tag2member_t *t2m; asn_TYPE_tag2member_t key; key.el_tag = tlv_tag; key.el_no = edx; t2m = (asn_TYPE_tag2member_t *)bsearch(&key, specs->tag2el, specs->tag2el_count, sizeof(specs->tag2el[0]), _t2e_cmp); if(t2m) { asn_TYPE_tag2member_t *best = 0; asn_TYPE_tag2member_t *t2m_f, *t2m_l; int edx_max = edx + elements[edx].optional; /* * Rewind to the first element with that tag, * `cause bsearch() does not guarantee order. */ t2m_f = t2m + t2m->toff_first; t2m_l = t2m + t2m->toff_last; for(t2m = t2m_f; t2m <= t2m_l; t2m++) { if(t2m->el_no > edx_max) break; if(t2m->el_no < edx) continue; best = t2m; } if(best) { edx = best->el_no; ctx->step = 1 + 2 * edx; goto microphase2; } } n = opt_edx_end; } if(n == opt_edx_end) { /* * If tag is unknown, it may be either * an unknown (thus, incorrect) tag, * or an extension (...), * or an end of the indefinite-length structure. */ if(!IN_EXTENSION_GROUP(specs, edx + elements[edx].optional)) { ASN_DEBUG("Unexpected tag %s (at %d)", ber_tlv_tag_string(tlv_tag), edx); ASN_DEBUG("Expected tag %s (%s)%s", ber_tlv_tag_string(elements[edx].tag), elements[edx].name, elements[edx].optional ?" or alternatives":""); RETURN(RC_FAIL); } else { /* Skip this tag */ ssize_t skip; edx += elements[edx].optional; ASN_DEBUG("Skipping unexpected %s (at %d)", ber_tlv_tag_string(tlv_tag), edx); skip = ber_skip_length(opt_codec_ctx, BER_TLV_CONSTRUCTED(ptr), (const char *)ptr + tag_len, LEFT - tag_len); ASN_DEBUG("Skip length %d in %s", (int)skip, td->name); switch(skip) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); /* Fall through */ case -1: RETURN(RC_FAIL); } ADVANCE(skip + tag_len); ctx->step -= 2; edx--; continue; /* Try again with the next tag */ } } /* * MICROPHASE 2: Invoke the member-specific decoder. */ ctx->step |= 1; /* Confirm entering next microphase */ microphase2: ASN_DEBUG("Inside SEQUENCE %s MF2", td->name); /* * Compute the position of the member inside a structure, * and also a type of containment (it may be contained * as pointer or using inline inclusion). */ if(elements[edx].flags & ATF_POINTER) { /* Member is a pointer to another structure */ memb_ptr2 = (void **)((char *)st + elements[edx].memb_offset); } else { /* * A pointer to a pointer * holding the start of the structure */ memb_ptr = (char *)st + elements[edx].memb_offset; memb_ptr2 = &memb_ptr; } /* * Invoke the member fetch routine according to member's type */ rval = elements[edx].type->ber_decoder(opt_codec_ctx, elements[edx].type, memb_ptr2, ptr, LEFT, elements[edx].tag_mode); ASN_DEBUG("In %s SEQUENCE decoded %d %s of %d " "in %d bytes rval.code %d, size=%d", td->name, edx, elements[edx].type->name, (int)LEFT, (int)rval.consumed, rval.code, (int)size); switch(rval.code) { case RC_OK: break; case RC_WMORE: /* More data expected */ if(!SIZE_VIOLATION) { ADVANCE(rval.consumed); RETURN(RC_WMORE); } ASN_DEBUG("Size violation (c->l=%ld <= s=%ld)", (long)ctx->left, (long)size); /* Fall through */ case RC_FAIL: /* Fatal error */ RETURN(RC_FAIL); } /* switch(rval) */ ADVANCE(rval.consumed); } /* for(all structure members) */ phase3: ctx->phase = 3; case 3: /* 00 and other tags expected */ case 4: /* only 00's expected */ ASN_DEBUG("SEQUENCE %s Leftover: %ld, size = %ld", td->name, (long)ctx->left, (long)size); /* * Skip everything until the end of the SEQUENCE. */ while(ctx->left) { ssize_t tl, ll; tl = ber_fetch_tag(ptr, LEFT, &tlv_tag); switch(tl) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); /* Fall through */ case -1: RETURN(RC_FAIL); } /* * If expected <0><0>... */ if(ctx->left < 0 && ((const uint8_t *)ptr)[0] == 0) { if(LEFT < 2) { if(SIZE_VIOLATION) RETURN(RC_FAIL); else RETURN(RC_WMORE); } else if(((const uint8_t *)ptr)[1] == 0) { /* * Correctly finished with <0><0>. */ ADVANCE(2); ctx->left++; ctx->phase = 4; continue; } } if(!IN_EXTENSION_GROUP(specs, td->elements_count) || ctx->phase == 4) { ASN_DEBUG("Unexpected continuation " "of a non-extensible type " "%s (SEQUENCE): %s", td->name, ber_tlv_tag_string(tlv_tag)); RETURN(RC_FAIL); } ll = ber_skip_length(opt_codec_ctx, BER_TLV_CONSTRUCTED(ptr), (const char *)ptr + tl, LEFT - tl); switch(ll) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); /* Fall through */ case -1: RETURN(RC_FAIL); } ADVANCE(tl + ll); } PHASE_OUT(ctx); } RETURN(RC_OK); } /* * The DER encoder of the SEQUENCE type. */ asn_enc_rval_t SEQUENCE_encode_der(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { size_t computed_size = 0; asn_enc_rval_t erval; ssize_t ret; int edx; ASN_DEBUG("%s %s as SEQUENCE", cb?"Encoding":"Estimating", td->name); /* * Gather the length of the underlying members sequence. */ for(edx = 0; edx < td->elements_count; edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)sptr + elm->memb_offset); if(!memb_ptr) { if(elm->optional) continue; /* Mandatory element is missing */ _ASN_ENCODE_FAILED; } } else { memb_ptr = (void *)((char *)sptr + elm->memb_offset); } erval = elm->type->der_encoder(elm->type, memb_ptr, elm->tag_mode, elm->tag, 0, 0); if(erval.encoded == -1) return erval; computed_size += erval.encoded; ASN_DEBUG("Member %d %s estimated %ld bytes", edx, elm->name, (long)erval.encoded); } /* * Encode the TLV for the sequence itself. */ ret = der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key); ASN_DEBUG("Wrote tags: %ld (+%ld)", (long)ret, (long)computed_size); if(ret == -1) _ASN_ENCODE_FAILED; erval.encoded = computed_size + ret; if(!cb) _ASN_ENCODED_OK(erval); /* * Encode all members. */ for(edx = 0; edx < td->elements_count; edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; asn_enc_rval_t tmperval; void *memb_ptr; if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)sptr + elm->memb_offset); if(!memb_ptr) continue; } else { memb_ptr = (void *)((char *)sptr + elm->memb_offset); } tmperval = elm->type->der_encoder(elm->type, memb_ptr, elm->tag_mode, elm->tag, cb, app_key); if(tmperval.encoded == -1) return tmperval; computed_size -= tmperval.encoded; ASN_DEBUG("Member %d %s of SEQUENCE %s encoded in %ld bytes", edx, elm->name, td->name, (long)tmperval.encoded); } if(computed_size != 0) /* * Encoded size is not equal to the computed size. */ _ASN_ENCODE_FAILED; _ASN_ENCODED_OK(erval); } #undef XER_ADVANCE #define XER_ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ buf_ptr = ((const char *)buf_ptr) + num;\ size -= num; \ consumed_myself += num; \ } while(0) /* * Decode the XER (XML) data. */ asn_dec_rval_t SEQUENCE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **struct_ptr, const char *opt_mname, const void *buf_ptr, size_t size) { /* * Bring closer parts of structure description. */ asn_SEQUENCE_specifics_t *specs = (asn_SEQUENCE_specifics_t *)td->specifics; asn_TYPE_member_t *elements = td->elements; const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; /* * ... and parts of the structure being constructed. */ void *st = *struct_ptr; /* Target structure. */ asn_struct_ctx_t *ctx; /* Decoder context */ asn_dec_rval_t rval; /* Return value from a decoder */ ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ int edx; /* Element index */ int edx_end; /* * Create the target structure if it is not present already. */ if(st == 0) { st = *struct_ptr = CALLOC(1, specs->struct_size); if(st == 0) RETURN(RC_FAIL); } /* * Restore parsing context. */ ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); /* * Phases of XER/XML processing: * Phase 0: Check that the opening tag matches our expectations. * Phase 1: Processing body and reacting on closing tag. * Phase 2: Processing inner type. * Phase 3: Skipping unknown extensions. * Phase 4: PHASED OUT */ for(edx = ctx->step; ctx->phase <= 3;) { pxer_chunk_type_e ch_type; /* XER chunk type */ ssize_t ch_size; /* Chunk size */ xer_check_tag_e tcv; /* Tag check value */ asn_TYPE_member_t *elm; int n; /* * Go inside the inner member of a sequence. */ if(ctx->phase == 2) { asn_dec_rval_t tmprval; void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ elm = &td->elements[edx]; if(elm->flags & ATF_POINTER) { /* Member is a pointer to another structure */ memb_ptr2 = (void **)((char *)st + elm->memb_offset); } else { memb_ptr = (char *)st + elm->memb_offset; memb_ptr2 = &memb_ptr; } /* Invoke the inner type decoder, m.b. multiple times */ tmprval = elm->type->xer_decoder(opt_codec_ctx, elm->type, memb_ptr2, elm->name, buf_ptr, size); XER_ADVANCE(tmprval.consumed); if(tmprval.code != RC_OK) RETURN(tmprval.code); ctx->phase = 1; /* Back to body processing */ ctx->step = ++edx; ASN_DEBUG("XER/SEQUENCE phase => %d, step => %d", ctx->phase, ctx->step); /* Fall through */ } /* * Get the next part of the XML stream. */ ch_size = xer_next_token(&ctx->context, buf_ptr, size, &ch_type); switch(ch_size) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); default: switch(ch_type) { case PXER_COMMENT: /* Got XML comment */ case PXER_TEXT: /* Ignore free-standing text */ XER_ADVANCE(ch_size); /* Skip silently */ continue; case PXER_TAG: break; /* Check the rest down there */ } } tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); ASN_DEBUG("XER/SEQUENCE: tcv = %d, ph=%d [%s]", tcv, ctx->phase, xml_tag); /* Skip the extensions section */ if(ctx->phase == 3) { switch(xer_skip_unknown(tcv, &ctx->left)) { case -1: ctx->phase = 4; RETURN(RC_FAIL); case 0: XER_ADVANCE(ch_size); continue; case 1: XER_ADVANCE(ch_size); ctx->phase = 1; continue; case 2: ctx->phase = 1; break; } } switch(tcv) { case XCT_CLOSING: if(ctx->phase == 0) break; ctx->phase = 0; /* Fall through */ case XCT_BOTH: if(ctx->phase == 0) { if(edx >= td->elements_count || /* Explicit OPTIONAL specs reaches the end */ (edx + elements[edx].optional == td->elements_count) || /* All extensions are optional */ (IN_EXTENSION_GROUP(specs, edx) && specs->ext_before > td->elements_count) ) { XER_ADVANCE(ch_size); ctx->phase = 4; /* Phase out */ RETURN(RC_OK); } else { ASN_DEBUG("Premature end of XER SEQUENCE"); RETURN(RC_FAIL); } } /* Fall through */ case XCT_OPENING: if(ctx->phase == 0) { XER_ADVANCE(ch_size); ctx->phase = 1; /* Processing body phase */ continue; } /* Fall through */ case XCT_UNKNOWN_OP: case XCT_UNKNOWN_BO: ASN_DEBUG("XER/SEQUENCE: tcv=%d, ph=%d, edx=%d", tcv, ctx->phase, edx); if(ctx->phase != 1) { break; /* Really unexpected */ } if(edx < td->elements_count) { /* * Search which member corresponds to this tag. */ edx_end = edx + elements[edx].optional + 1; if(edx_end > td->elements_count) edx_end = td->elements_count; for(n = edx; n < edx_end; n++) { elm = &td->elements[n]; tcv = xer_check_tag(buf_ptr, ch_size, elm->name); switch(tcv) { case XCT_BOTH: case XCT_OPENING: /* * Process this member. */ ctx->step = edx = n; ctx->phase = 2; break; case XCT_UNKNOWN_OP: case XCT_UNKNOWN_BO: continue; default: n = edx_end; break; /* Phase out */ } break; } if(n != edx_end) continue; } else { ASN_DEBUG("Out of defined members: %d/%d", edx, td->elements_count); } /* It is expected extension */ if(IN_EXTENSION_GROUP(specs, edx + (edx < td->elements_count ? elements[edx].optional : 0))) { ASN_DEBUG("Got anticipated extension at %d", edx); /* * Check for (XCT_BOTH or XCT_UNKNOWN_BO) * By using a mask. Only record a pure * tags. */ if(tcv & XCT_CLOSING) { /* Found without body */ } else { ctx->left = 1; ctx->phase = 3; /* Skip ...'s */ } XER_ADVANCE(ch_size); continue; } /* Fall through */ default: break; } ASN_DEBUG("Unexpected XML tag in SEQUENCE [%c%c%c%c%c%c]", size>0?((const char *)buf_ptr)[0]:'.', size>1?((const char *)buf_ptr)[1]:'.', size>2?((const char *)buf_ptr)[2]:'.', size>3?((const char *)buf_ptr)[3]:'.', size>4?((const char *)buf_ptr)[4]:'.', size>5?((const char *)buf_ptr)[5]:'.'); break; } ctx->phase = 4; /* "Phase out" on hard failure */ RETURN(RC_FAIL); } asn_enc_rval_t SEQUENCE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t er; int xcan = (flags & XER_F_CANONICAL); int edx; if(!sptr) _ASN_ENCODE_FAILED; er.encoded = 0; for(edx = 0; edx < td->elements_count; edx++) { asn_enc_rval_t tmper; asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; const char *mname = elm->name; unsigned int mlen = strlen(mname); if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)sptr + elm->memb_offset); if(!memb_ptr) { if(elm->optional) continue; /* Mandatory element is missing */ _ASN_ENCODE_FAILED; } } else { memb_ptr = (void *)((char *)sptr + elm->memb_offset); } if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel); _ASN_CALLBACK3("<", 1, mname, mlen, ">", 1); /* Print the member itself */ tmper = elm->type->xer_encoder(elm->type, memb_ptr, ilevel + 1, flags, cb, app_key); if(tmper.encoded == -1) return tmper; _ASN_CALLBACK3("", 1); er.encoded += 5 + (2 * mlen) + tmper.encoded; } if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel - 1); _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } int SEQUENCE_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { int edx; int ret; if(!sptr) return (cb("", 8, app_key) < 0) ? -1 : 0; /* Dump preamble */ if(cb(td->name, strlen(td->name), app_key) < 0 || cb(" ::= {", 6, app_key) < 0) return -1; for(edx = 0; edx < td->elements_count; edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; const void *memb_ptr; if(elm->flags & ATF_POINTER) { memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); if(!memb_ptr) { if(elm->optional) continue; /* Print line */ /* Fall through */ } } else { memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); } /* Indentation */ _i_INDENT(1); /* Print the member's name and stuff */ if(cb(elm->name, strlen(elm->name), app_key) < 0 || cb(": ", 2, app_key) < 0) return -1; /* Print the member itself */ ret = elm->type->print_struct(elm->type, memb_ptr, ilevel + 1, cb, app_key); if(ret) return ret; } ilevel--; _i_INDENT(1); return (cb("}", 1, app_key) < 0) ? -1 : 0; } void SEQUENCE_free(asn_TYPE_descriptor_t *td, void *sptr, int contents_only) { int edx; if(!td || !sptr) return; ASN_DEBUG("Freeing %s as SEQUENCE", td->name); for(edx = 0; edx < td->elements_count; edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)sptr + elm->memb_offset); if(memb_ptr) ASN_STRUCT_FREE(*elm->type, memb_ptr); } else { memb_ptr = (void *)((char *)sptr + elm->memb_offset); ASN_STRUCT_FREE_CONTENTS_ONLY(*elm->type, memb_ptr); } } if(!contents_only) { FREEMEM(sptr); } } int SEQUENCE_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { int edx; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } /* * Iterate over structure members and check their validity. */ for(edx = 0; edx < td->elements_count; edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; const void *memb_ptr; if(elm->flags & ATF_POINTER) { memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); if(!memb_ptr) { if(elm->optional) continue; _ASN_CTFAIL(app_key, td, sptr, "%s: mandatory element %s absent (%s:%d)", td->name, elm->name, __FILE__, __LINE__); return -1; } } else { memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); } if(elm->memb_constraints) { int ret = elm->memb_constraints(elm->type, memb_ptr, ctfailcb, app_key); if(ret) return ret; } else { int ret = elm->type->check_constraints(elm->type, memb_ptr, ctfailcb, app_key); if(ret) return ret; /* * Cannot inherit it earlier: * need to make sure we get the updated version. */ elm->memb_constraints = elm->type->check_constraints; } } return 0; } asn_dec_rval_t SEQUENCE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { asn_SEQUENCE_specifics_t *specs = (asn_SEQUENCE_specifics_t *)td->specifics; void *st = *sptr; /* Target structure. */ int extpresent; /* Extension additions are present */ uint8_t *opres; /* Presence of optional root members */ asn_per_data_t opmd; asn_dec_rval_t rv; int edx; (void)constraints; if(_ASN_STACK_OVERFLOW_CHECK(opt_codec_ctx)) _ASN_DECODE_FAILED; if(!st) { st = *sptr = CALLOC(1, specs->struct_size); if(!st) _ASN_DECODE_FAILED; } ASN_DEBUG("Decoding %s as SEQUENCE (UPER)", td->name); /* Handle extensions */ if(specs->ext_before >= 0) { extpresent = per_get_few_bits(pd, 1); if(extpresent < 0) _ASN_DECODE_STARVED; } else { extpresent = 0; } /* Prepare a place and read-in the presence bitmap */ memset(&opmd, 0, sizeof(opmd)); if(specs->roms_count) { opres = (uint8_t *)MALLOC(((specs->roms_count + 7) >> 3) + 1); if(!opres) _ASN_DECODE_FAILED; /* Get the presence map */ if(per_get_many_bits(pd, opres, 0, specs->roms_count)) { FREEMEM(opres); _ASN_DECODE_STARVED; } opmd.buffer = opres; opmd.nbits = specs->roms_count; ASN_DEBUG("Read in presence bitmap for %s of %d bits (%x..)", td->name, specs->roms_count, *opres); } else { opres = 0; } /* * Get the sequence ROOT elements. */ for(edx = 0; edx < td->elements_count; edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ if(IN_EXTENSION_GROUP(specs, edx)) continue; /* Fetch the pointer to this member */ if(elm->flags & ATF_POINTER) { memb_ptr2 = (void **)((char *)st + elm->memb_offset); } else { memb_ptr = (char *)st + elm->memb_offset; memb_ptr2 = &memb_ptr; } /* Deal with optionality */ if(elm->optional) { int present = per_get_few_bits(&opmd, 1); ASN_DEBUG("Member %s->%s is optional, p=%d (%d->%d)", td->name, elm->name, present, (int)opmd.nboff, (int)opmd.nbits); if(present == 0) { /* This element is not present */ if(elm->default_value) { /* Fill-in DEFAULT */ if(elm->default_value(1, memb_ptr2)) { FREEMEM(opres); _ASN_DECODE_FAILED; } ASN_DEBUG("Filled-in default"); } /* The member is just not present */ continue; } /* Fall through */ } /* Fetch the member from the stream */ ASN_DEBUG("Decoding member %s in %s", elm->name, td->name); rv = elm->type->uper_decoder(opt_codec_ctx, elm->type, elm->per_constraints, memb_ptr2, pd); if(rv.code != RC_OK) { ASN_DEBUG("Failed decode %s in %s", elm->name, td->name); FREEMEM(opres); return rv; } } /* Optionality map is not needed anymore */ FREEMEM(opres); /* * Deal with extensions. */ if(extpresent) { ssize_t bmlength; uint8_t *epres; /* Presence of extension members */ asn_per_data_t epmd; bmlength = uper_get_nslength(pd); if(bmlength < 0) _ASN_DECODE_STARVED; ASN_DEBUG("Extensions %d present in %s", bmlength, td->name); epres = (uint8_t *)MALLOC((bmlength + 15) >> 3); if(!epres) _ASN_DECODE_STARVED; /* Get the extensions map */ if(per_get_many_bits(pd, epres, 0, bmlength)) _ASN_DECODE_STARVED; memset(&epmd, 0, sizeof(epmd)); epmd.buffer = epres; epmd.nbits = bmlength; ASN_DEBUG("Read in extensions bitmap for %s of %d bits (%x..)", td->name, bmlength, *epres); /* Go over extensions and read them in */ for(edx = specs->ext_after + 1; edx < td->elements_count; edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ int present; if(!IN_EXTENSION_GROUP(specs, edx)) { ASN_DEBUG("%d is not extension", edx); continue; } /* Fetch the pointer to this member */ if(elm->flags & ATF_POINTER) { memb_ptr2 = (void **)((char *)st + elm->memb_offset); } else { memb_ptr = (void *)((char *)st + elm->memb_offset); memb_ptr2 = &memb_ptr; } present = per_get_few_bits(&epmd, 1); if(present <= 0) { if(present < 0) break; /* No more extensions */ continue; } ASN_DEBUG("Decoding member %s in %s %p", elm->name, td->name, *memb_ptr2); rv = uper_open_type_get(opt_codec_ctx, elm->type, elm->per_constraints, memb_ptr2, pd); if(rv.code != RC_OK) { FREEMEM(epres); return rv; } } /* Skip over overflow extensions which aren't present * in this system's version of the protocol */ for(;;) { ASN_DEBUG("Getting overflow extensions"); switch(per_get_few_bits(&epmd, 1)) { case -1: break; case 0: continue; default: if(uper_open_type_skip(opt_codec_ctx, pd)) { FREEMEM(epres); _ASN_DECODE_STARVED; } } break; } FREEMEM(epres); } /* Fill DEFAULT members in extensions */ for(edx = specs->roms_count; edx < specs->roms_count + specs->aoms_count; edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; void **memb_ptr2; /* Pointer to member pointer */ if(!elm->default_value) continue; /* Fetch the pointer to this member */ if(elm->flags & ATF_POINTER) { memb_ptr2 = (void **)((char *)st + elm->memb_offset); if(*memb_ptr2) continue; } else { continue; /* Extensions are all optionals */ } /* Set default value */ if(elm->default_value(1, memb_ptr2)) { _ASN_DECODE_FAILED; } } rv.consumed = 0; rv.code = RC_OK; return rv; } static int SEQUENCE_handle_extensions(asn_TYPE_descriptor_t *td, void *sptr, asn_per_outp_t *po1, asn_per_outp_t *po2) { asn_SEQUENCE_specifics_t *specs = (asn_SEQUENCE_specifics_t *)td->specifics; int exts_present = 0; int exts_count = 0; int edx; if(specs->ext_before < 0) return 0; /* Find out which extensions are present */ for(edx = specs->ext_after + 1; edx < td->elements_count; edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ int present; if(!IN_EXTENSION_GROUP(specs, edx)) { ASN_DEBUG("%s (@%d) is not extension", elm->type->name, edx); continue; } /* Fetch the pointer to this member */ if(elm->flags & ATF_POINTER) { memb_ptr2 = (void **)((char *)sptr + elm->memb_offset); present = (*memb_ptr2 != 0); } else { memb_ptr = (void *)((char *)sptr + elm->memb_offset); memb_ptr2 = &memb_ptr; present = 1; } ASN_DEBUG("checking %s (@%d) present => %d", elm->type->name, edx, present); exts_count++; exts_present += present; /* Encode as presence marker */ if(po1 && per_put_few_bits(po1, present, 1)) return -1; /* Encode as open type field */ if(po2 && present && uper_open_type_put(elm->type, elm->per_constraints, *memb_ptr2, po2)) return -1; } return exts_present ? exts_count : 0; } asn_enc_rval_t SEQUENCE_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { asn_SEQUENCE_specifics_t *specs = (asn_SEQUENCE_specifics_t *)td->specifics; asn_enc_rval_t er; int n_extensions; int edx; int i; (void)constraints; if(!sptr) _ASN_ENCODE_FAILED; er.encoded = 0; ASN_DEBUG("Encoding %s as SEQUENCE (UPER)", td->name); /* * X.691#18.1 Whether structure is extensible * and whether to encode extensions */ if(specs->ext_before >= 0) { n_extensions = SEQUENCE_handle_extensions(td, sptr, 0, 0); per_put_few_bits(po, n_extensions ? 1 : 0, 1); } else { n_extensions = 0; /* There are no extensions to encode */ } /* Encode a presence bitmap */ for(i = 0; i < specs->roms_count; i++) { asn_TYPE_member_t *elm; void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ int present; edx = specs->oms[i]; elm = &td->elements[edx]; /* Fetch the pointer to this member */ if(elm->flags & ATF_POINTER) { memb_ptr2 = (void **)((char *)sptr + elm->memb_offset); present = (*memb_ptr2 != 0); } else { memb_ptr = (void *)((char *)sptr + elm->memb_offset); memb_ptr2 = &memb_ptr; present = 1; } /* Eliminate default values */ if(present && elm->default_value && elm->default_value(0, memb_ptr2) == 1) present = 0; ASN_DEBUG("Element %s %s %s->%s is %s", elm->flags & ATF_POINTER ? "ptr" : "inline", elm->default_value ? "def" : "wtv", td->name, elm->name, present ? "present" : "absent"); if(per_put_few_bits(po, present, 1)) _ASN_ENCODE_FAILED; } /* * Encode the sequence ROOT elements. */ ASN_DEBUG("ext_after = %d, ec = %d, eb = %d", specs->ext_after, td->elements_count, specs->ext_before); for(edx = 0; edx < ((specs->ext_after < 0) ? td->elements_count : specs->ext_before - 1); edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ if(IN_EXTENSION_GROUP(specs, edx)) continue; ASN_DEBUG("About to encode %s", elm->type->name); /* Fetch the pointer to this member */ if(elm->flags & ATF_POINTER) { memb_ptr2 = (void **)((char *)sptr + elm->memb_offset); if(!*memb_ptr2) { ASN_DEBUG("Element %s %d not present", elm->name, edx); if(elm->optional) continue; /* Mandatory element is missing */ _ASN_ENCODE_FAILED; } } else { memb_ptr = (void *)((char *)sptr + elm->memb_offset); memb_ptr2 = &memb_ptr; } /* Eliminate default values */ if(elm->default_value && elm->default_value(0, memb_ptr2) == 1) continue; ASN_DEBUG("Encoding %s->%s", td->name, elm->name); er = elm->type->uper_encoder(elm->type, elm->per_constraints, *memb_ptr2, po); if(er.encoded == -1) return er; } /* No extensions to encode */ if(!n_extensions) _ASN_ENCODED_OK(er); ASN_DEBUG("Length of %d bit-map", n_extensions); /* #18.8. Write down the presence bit-map length. */ if(uper_put_nslength(po, n_extensions)) _ASN_ENCODE_FAILED; ASN_DEBUG("Bit-map of %d elements", n_extensions); /* #18.7. Encoding the extensions presence bit-map. */ /* TODO: act upon NOTE in #18.7 for canonical PER */ if(SEQUENCE_handle_extensions(td, sptr, po, 0) != n_extensions) _ASN_ENCODE_FAILED; ASN_DEBUG("Writing %d extensions", n_extensions); /* #18.9. Encode extensions as open type fields. */ if(SEQUENCE_handle_extensions(td, sptr, 0, po) != n_extensions) _ASN_ENCODE_FAILED; _ASN_ENCODED_OK(er); } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/constr_SEQUENCE.h000066400000000000000000000027641305042567700234440ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _CONSTR_SEQUENCE_H_ #define _CONSTR_SEQUENCE_H_ #include #ifdef __cplusplus extern "C" { #endif typedef struct asn_SEQUENCE_specifics_s { /* * Target structure description. */ int struct_size; /* Size of the target structure. */ int ctx_offset; /* Offset of the asn_struct_ctx_t member */ /* * Tags to members mapping table (sorted). */ asn_TYPE_tag2member_t *tag2el; int tag2el_count; /* * Optional members of the extensions root (roms) or additions (aoms). * Meaningful for PER. */ int *oms; /* Optional MemberS */ int roms_count; /* Root optional members count */ int aoms_count; /* Additions optional members count */ /* * Description of an extensions group. */ int ext_after; /* Extensions start after this member */ int ext_before; /* Extensions stop before this member */ } asn_SEQUENCE_specifics_t; /* * A set specialized functions dealing with the SEQUENCE type. */ asn_struct_free_f SEQUENCE_free; asn_struct_print_f SEQUENCE_print; asn_constr_check_f SEQUENCE_constraint; ber_type_decoder_f SEQUENCE_decode_ber; der_type_encoder_f SEQUENCE_encode_der; xer_type_decoder_f SEQUENCE_decode_xer; xer_type_encoder_f SEQUENCE_encode_xer; per_type_decoder_f SEQUENCE_decode_uper; per_type_encoder_f SEQUENCE_encode_uper; #ifdef __cplusplus } #endif #endif /* _CONSTR_SEQUENCE_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/constr_SEQUENCE_OF.c000066400000000000000000000124051305042567700240140ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004, 2006 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include /* * The DER encoder of the SEQUENCE OF type. */ asn_enc_rval_t SEQUENCE_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { asn_TYPE_member_t *elm = td->elements; asn_anonymous_sequence_ *list = _A_SEQUENCE_FROM_VOID(ptr); size_t computed_size = 0; ssize_t encoding_size = 0; asn_enc_rval_t erval; int edx; ASN_DEBUG("Estimating size of SEQUENCE OF %s", td->name); /* * Gather the length of the underlying members sequence. */ for(edx = 0; edx < list->count; edx++) { void *memb_ptr = list->array[edx]; if(!memb_ptr) continue; erval = elm->type->der_encoder(elm->type, memb_ptr, 0, elm->tag, 0, 0); if(erval.encoded == -1) return erval; computed_size += erval.encoded; } /* * Encode the TLV for the sequence itself. */ encoding_size = der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key); if(encoding_size == -1) { erval.encoded = -1; erval.failed_type = td; erval.structure_ptr = ptr; return erval; } computed_size += encoding_size; if(!cb) { erval.encoded = computed_size; _ASN_ENCODED_OK(erval); } ASN_DEBUG("Encoding members of SEQUENCE OF %s", td->name); /* * Encode all members. */ for(edx = 0; edx < list->count; edx++) { void *memb_ptr = list->array[edx]; if(!memb_ptr) continue; erval = elm->type->der_encoder(elm->type, memb_ptr, 0, elm->tag, cb, app_key); if(erval.encoded == -1) return erval; encoding_size += erval.encoded; } if(computed_size != (size_t)encoding_size) { /* * Encoded size is not equal to the computed size. */ erval.encoded = -1; erval.failed_type = td; erval.structure_ptr = ptr; } else { erval.encoded = computed_size; erval.structure_ptr = 0; erval.failed_type = 0; } return erval; } asn_enc_rval_t SEQUENCE_OF_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t er; asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics; asn_TYPE_member_t *elm = td->elements; asn_anonymous_sequence_ *list = _A_SEQUENCE_FROM_VOID(sptr); const char *mname = specs->as_XMLValueList ? 0 : ((*elm->name) ? elm->name : elm->type->xml_tag); unsigned int mlen = mname ? strlen(mname) : 0; int xcan = (flags & XER_F_CANONICAL); int i; if(!sptr) _ASN_ENCODE_FAILED; er.encoded = 0; for(i = 0; i < list->count; i++) { asn_enc_rval_t tmper; void *memb_ptr = list->array[i]; if(!memb_ptr) continue; if(mname) { if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel); _ASN_CALLBACK3("<", 1, mname, mlen, ">", 1); } tmper = elm->type->xer_encoder(elm->type, memb_ptr, ilevel + 1, flags, cb, app_key); if(tmper.encoded == -1) return tmper; if(tmper.encoded == 0 && specs->as_XMLValueList) { const char *name = elm->type->xml_tag; size_t len = strlen(name); if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel + 1); _ASN_CALLBACK3("<", 1, name, len, "/>", 2); } if(mname) { _ASN_CALLBACK3("", 1); er.encoded += 5; } er.encoded += (2 * mlen) + tmper.encoded; } if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel - 1); _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } asn_enc_rval_t SEQUENCE_OF_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { asn_anonymous_sequence_ *list; asn_per_constraint_t *ct; asn_enc_rval_t er; asn_TYPE_member_t *elm = td->elements; int seq; if(!sptr) _ASN_ENCODE_FAILED; list = _A_SEQUENCE_FROM_VOID(sptr); er.encoded = 0; ASN_DEBUG("Encoding %s as SEQUENCE OF (%d)", td->name, list->count); if(constraints) ct = &constraints->size; else if(td->per_constraints) ct = &td->per_constraints->size; else ct = 0; /* If extensible constraint, check if size is in root */ if(ct) { int not_in_root = (list->count < ct->lower_bound || list->count > ct->upper_bound); ASN_DEBUG("lb %ld ub %ld %s", ct->lower_bound, ct->upper_bound, ct->flags & APC_EXTENSIBLE ? "ext" : "fix"); if(ct->flags & APC_EXTENSIBLE) { /* Declare whether size is in extension root */ if(per_put_few_bits(po, not_in_root, 1)) _ASN_ENCODE_FAILED; if(not_in_root) ct = 0; } else if(not_in_root && ct->effective_bits >= 0) _ASN_ENCODE_FAILED; } if(ct && ct->effective_bits >= 0) { /* X.691, #19.5: No length determinant */ if(per_put_few_bits(po, list->count - ct->lower_bound, ct->effective_bits)) _ASN_ENCODE_FAILED; } for(seq = -1; seq < list->count;) { ssize_t mayEncode; if(seq < 0) seq = 0; if(ct && ct->effective_bits >= 0) { mayEncode = list->count; } else { mayEncode = uper_put_length(po, list->count - seq); if(mayEncode < 0) _ASN_ENCODE_FAILED; } while(mayEncode--) { void *memb_ptr = list->array[seq++]; if(!memb_ptr) _ASN_ENCODE_FAILED; er = elm->type->uper_encoder(elm->type, elm->per_constraints, memb_ptr, po); if(er.encoded == -1) _ASN_ENCODE_FAILED; } } _ASN_ENCODED_OK(er); } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/constr_SEQUENCE_OF.h000066400000000000000000000016421305042567700240220ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2005 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _CONSTR_SEQUENCE_OF_H_ #define _CONSTR_SEQUENCE_OF_H_ #include #include /* Implemented using SET OF */ #ifdef __cplusplus extern "C" { #endif /* * A set specialized functions dealing with the SEQUENCE OF type. * Generally implemented using SET OF. */ #define SEQUENCE_OF_free SET_OF_free #define SEQUENCE_OF_print SET_OF_print #define SEQUENCE_OF_constraint SET_OF_constraint #define SEQUENCE_OF_decode_ber SET_OF_decode_ber #define SEQUENCE_OF_decode_xer SET_OF_decode_xer #define SEQUENCE_OF_decode_uper SET_OF_decode_uper der_type_encoder_f SEQUENCE_OF_encode_der; xer_type_encoder_f SEQUENCE_OF_encode_xer; per_type_encoder_f SEQUENCE_OF_encode_uper; #ifdef __cplusplus } #endif #endif /* _CONSTR_SET_OF_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/constr_SET_OF.c000066400000000000000000000557761305042567700232610ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004, 2005 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include /* * Number of bytes left for this structure. * (ctx->left) indicates the number of bytes _transferred_ for the structure. * (size) contains the number of bytes in the buffer passed. */ #define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) /* * If the subprocessor function returns with an indication that it wants * more data, it may well be a fatal decoding problem, because the * size is constrained by the 's L, even if the buffer size allows * reading more data. * For example, consider the buffer containing the following TLVs: * ... * The TLV length clearly indicates that one byte is expected in V, but * if the V processor returns with "want more data" even if the buffer * contains way more data than the V processor have seen. */ #define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) /* * This macro "eats" the part of the buffer which is definitely "consumed", * i.e. was correctly converted into local representation or rightfully skipped. */ #undef ADVANCE #define ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ ptr = ((const char *)ptr) + num;\ size -= num; \ if(ctx->left >= 0) \ ctx->left -= num; \ consumed_myself += num; \ } while(0) /* * Switch to the next phase of parsing. */ #undef NEXT_PHASE #undef PHASE_OUT #define NEXT_PHASE(ctx) do { \ ctx->phase++; \ ctx->step = 0; \ } while(0) #define PHASE_OUT(ctx) do { ctx->phase = 10; } while(0) /* * Return a standardized complex structure. */ #undef RETURN #define RETURN(_code) do { \ rval.code = _code; \ rval.consumed = consumed_myself;\ return rval; \ } while(0) /* * The decoder of the SET OF type. */ asn_dec_rval_t SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **struct_ptr, const void *ptr, size_t size, int tag_mode) { /* * Bring closer parts of structure description. */ asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics; asn_TYPE_member_t *elm = td->elements; /* Single one */ /* * Parts of the structure being constructed. */ void *st = *struct_ptr; /* Target structure. */ asn_struct_ctx_t *ctx; /* Decoder context */ ber_tlv_tag_t tlv_tag; /* T from TLV */ asn_dec_rval_t rval; /* Return code from subparsers */ ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ ASN_DEBUG("Decoding %s as SET OF", td->name); /* * Create the target structure if it is not present already. */ if(st == 0) { st = *struct_ptr = CALLOC(1, specs->struct_size); if(st == 0) { RETURN(RC_FAIL); } } /* * Restore parsing context. */ ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); /* * Start to parse where left previously */ switch(ctx->phase) { case 0: /* * PHASE 0. * Check that the set of tags associated with given structure * perfectly fits our expectations. */ rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, tag_mode, 1, &ctx->left, 0); if(rval.code != RC_OK) { ASN_DEBUG("%s tagging check failed: %d", td->name, rval.code); return rval; } if(ctx->left >= 0) ctx->left += rval.consumed; /* ?Substracted below! */ ADVANCE(rval.consumed); ASN_DEBUG("Structure consumes %ld bytes, " "buffer %ld", (long)ctx->left, (long)size); NEXT_PHASE(ctx); /* Fall through */ case 1: /* * PHASE 1. * From the place where we've left it previously, * try to decode the next item. */ for(;; ctx->step = 0) { ssize_t tag_len; /* Length of TLV's T */ if(ctx->step & 1) goto microphase2; /* * MICROPHASE 1: Synchronize decoding. */ if(ctx->left == 0) { ASN_DEBUG("End of SET OF %s", td->name); /* * No more things to decode. * Exit out of here. */ PHASE_OUT(ctx); RETURN(RC_OK); } /* * Fetch the T from TLV. */ tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); switch(tag_len) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); /* Fall through */ case -1: RETURN(RC_FAIL); } if(ctx->left < 0 && ((const uint8_t *)ptr)[0] == 0) { if(LEFT < 2) { if(SIZE_VIOLATION) RETURN(RC_FAIL); else RETURN(RC_WMORE); } else if(((const uint8_t *)ptr)[1] == 0) { /* * Found the terminator of the * indefinite length structure. */ break; } } /* Outmost tag may be unknown and cannot be fetched/compared */ if(elm->tag != (ber_tlv_tag_t)-1) { if(BER_TAGS_EQUAL(tlv_tag, elm->tag)) { /* * The new list member of expected type has arrived. */ } else { ASN_DEBUG("Unexpected tag %s fixed SET OF %s", ber_tlv_tag_string(tlv_tag), td->name); ASN_DEBUG("%s SET OF has tag %s", td->name, ber_tlv_tag_string(elm->tag)); RETURN(RC_FAIL); } } /* * MICROPHASE 2: Invoke the member-specific decoder. */ ctx->step |= 1; /* Confirm entering next microphase */ microphase2: /* * Invoke the member fetch routine according to member's type */ rval = elm->type->ber_decoder(opt_codec_ctx, elm->type, &ctx->ptr, ptr, LEFT, 0); ASN_DEBUG("In %s SET OF %s code %d consumed %d", td->name, elm->type->name, rval.code, (int)rval.consumed); switch(rval.code) { case RC_OK: { asn_anonymous_set_ *list = _A_SET_FROM_VOID(st); if(ASN_SET_ADD(list, ctx->ptr) != 0) RETURN(RC_FAIL); else ctx->ptr = 0; } break; case RC_WMORE: /* More data expected */ if(!SIZE_VIOLATION) { ADVANCE(rval.consumed); RETURN(RC_WMORE); } /* Fall through */ case RC_FAIL: /* Fatal error */ ASN_STRUCT_FREE(*elm->type, ctx->ptr); ctx->ptr = 0; RETURN(RC_FAIL); } /* switch(rval) */ ADVANCE(rval.consumed); } /* for(all list members) */ NEXT_PHASE(ctx); case 2: /* * Read in all "end of content" TLVs. */ while(ctx->left < 0) { if(LEFT < 2) { if(LEFT > 0 && ((const char *)ptr)[0] != 0) { /* Unexpected tag */ RETURN(RC_FAIL); } else { RETURN(RC_WMORE); } } if(((const char *)ptr)[0] == 0 && ((const char *)ptr)[1] == 0) { ADVANCE(2); ctx->left++; } else { RETURN(RC_FAIL); } } PHASE_OUT(ctx); } RETURN(RC_OK); } /* * Internally visible buffer holding a single encoded element. */ struct _el_buffer { uint8_t *buf; size_t length; size_t size; }; /* Append bytes to the above structure */ static int _el_addbytes(const void *buffer, size_t size, void *el_buf_ptr) { struct _el_buffer *el_buf = (struct _el_buffer *)el_buf_ptr; if(el_buf->length + size > el_buf->size) return -1; memcpy(el_buf->buf + el_buf->length, buffer, size); el_buf->length += size; return 0; } static int _el_buf_cmp(const void *ap, const void *bp) { const struct _el_buffer *a = (const struct _el_buffer *)ap; const struct _el_buffer *b = (const struct _el_buffer *)bp; int ret; size_t common_len; if(a->length < b->length) common_len = a->length; else common_len = b->length; ret = memcmp(a->buf, b->buf, common_len); if(ret == 0) { if(a->length < b->length) ret = -1; else if(a->length > b->length) ret = 1; } return ret; } /* * The DER encoder of the SET OF type. */ asn_enc_rval_t SET_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { asn_TYPE_member_t *elm = td->elements; asn_TYPE_descriptor_t *elm_type = elm->type; der_type_encoder_f *der_encoder = elm_type->der_encoder; asn_anonymous_set_ *list = _A_SET_FROM_VOID(ptr); size_t computed_size = 0; ssize_t encoding_size = 0; struct _el_buffer *encoded_els; ssize_t eels_count = 0; size_t max_encoded_len = 1; asn_enc_rval_t erval; int ret; int edx; ASN_DEBUG("Estimating size for SET OF %s", td->name); /* * Gather the length of the underlying members sequence. */ for(edx = 0; edx < list->count; edx++) { void *memb_ptr = list->array[edx]; if(!memb_ptr) continue; erval = der_encoder(elm_type, memb_ptr, 0, elm->tag, 0, 0); if(erval.encoded == -1) return erval; computed_size += erval.encoded; /* Compute maximum encoding's size */ if(max_encoded_len < (size_t)erval.encoded) max_encoded_len = erval.encoded; } /* * Encode the TLV for the sequence itself. */ encoding_size = der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key); if(encoding_size == -1) { erval.encoded = -1; erval.failed_type = td; erval.structure_ptr = ptr; return erval; } computed_size += encoding_size; if(!cb || list->count == 0) { erval.encoded = computed_size; _ASN_ENCODED_OK(erval); } /* * DER mandates dynamic sorting of the SET OF elements * according to their encodings. Build an array of the * encoded elements. */ encoded_els = (struct _el_buffer *)MALLOC( list->count * sizeof(encoded_els[0])); if(encoded_els == NULL) { erval.encoded = -1; erval.failed_type = td; erval.structure_ptr = ptr; return erval; } ASN_DEBUG("Encoding members of %s SET OF", td->name); /* * Encode all members. */ for(edx = 0; edx < list->count; edx++) { void *memb_ptr = list->array[edx]; struct _el_buffer *encoded_el = &encoded_els[eels_count]; if(!memb_ptr) continue; /* * Prepare space for encoding. */ encoded_el->buf = (uint8_t *)MALLOC(max_encoded_len); if(encoded_el->buf) { encoded_el->length = 0; encoded_el->size = max_encoded_len; } else { for(edx--; edx >= 0; edx--) FREEMEM(encoded_els[edx].buf); FREEMEM(encoded_els); erval.encoded = -1; erval.failed_type = td; erval.structure_ptr = ptr; return erval; } /* * Encode the member into the prepared space. */ erval = der_encoder(elm_type, memb_ptr, 0, elm->tag, _el_addbytes, encoded_el); if(erval.encoded == -1) { for(; edx >= 0; edx--) FREEMEM(encoded_els[edx].buf); FREEMEM(encoded_els); return erval; } encoding_size += erval.encoded; eels_count++; } /* * Sort the encoded elements according to their encoding. */ qsort(encoded_els, eels_count, sizeof(encoded_els[0]), _el_buf_cmp); /* * Report encoded elements to the application. * Dispose of temporary sorted members table. */ ret = 0; for(edx = 0; edx < eels_count; edx++) { struct _el_buffer *encoded_el = &encoded_els[edx]; /* Report encoded chunks to the application */ if(ret == 0 && cb(encoded_el->buf, encoded_el->length, app_key) < 0) ret = -1; FREEMEM(encoded_el->buf); } FREEMEM(encoded_els); if(ret || computed_size != (size_t)encoding_size) { /* * Standard callback failed, or * encoded size is not equal to the computed size. */ erval.encoded = -1; erval.failed_type = td; erval.structure_ptr = ptr; } else { erval.encoded = computed_size; } _ASN_ENCODED_OK(erval); } #undef XER_ADVANCE #define XER_ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ buf_ptr = ((const char *)buf_ptr) + num;\ size -= num; \ consumed_myself += num; \ } while(0) /* * Decode the XER (XML) data. */ asn_dec_rval_t SET_OF_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **struct_ptr, const char *opt_mname, const void *buf_ptr, size_t size) { /* * Bring closer parts of structure description. */ asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics; asn_TYPE_member_t *element = td->elements; const char *elm_tag; const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; /* * ... and parts of the structure being constructed. */ void *st = *struct_ptr; /* Target structure. */ asn_struct_ctx_t *ctx; /* Decoder context */ asn_dec_rval_t rval; /* Return value from a decoder */ ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ /* * Create the target structure if it is not present already. */ if(st == 0) { st = *struct_ptr = CALLOC(1, specs->struct_size); if(st == 0) RETURN(RC_FAIL); } /* Which tag is expected for the downstream */ if(specs->as_XMLValueList) { elm_tag = (specs->as_XMLValueList == 1) ? 0 : ""; } else { elm_tag = (*element->name) ? element->name : element->type->xml_tag; } /* * Restore parsing context. */ ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); /* * Phases of XER/XML processing: * Phase 0: Check that the opening tag matches our expectations. * Phase 1: Processing body and reacting on closing tag. * Phase 2: Processing inner type. */ for(; ctx->phase <= 2;) { pxer_chunk_type_e ch_type; /* XER chunk type */ ssize_t ch_size; /* Chunk size */ xer_check_tag_e tcv; /* Tag check value */ /* * Go inside the inner member of a set. */ if(ctx->phase == 2) { asn_dec_rval_t tmprval; /* Invoke the inner type decoder, m.b. multiple times */ ASN_DEBUG("XER/SET OF element [%s]", elm_tag); tmprval = element->type->xer_decoder(opt_codec_ctx, element->type, &ctx->ptr, elm_tag, buf_ptr, size); if(tmprval.code == RC_OK) { asn_anonymous_set_ *list = _A_SET_FROM_VOID(st); if(ASN_SET_ADD(list, ctx->ptr) != 0) RETURN(RC_FAIL); ctx->ptr = 0; XER_ADVANCE(tmprval.consumed); } else { XER_ADVANCE(tmprval.consumed); RETURN(tmprval.code); } ctx->phase = 1; /* Back to body processing */ ASN_DEBUG("XER/SET OF phase => %d", ctx->phase); /* Fall through */ } /* * Get the next part of the XML stream. */ ch_size = xer_next_token(&ctx->context, buf_ptr, size, &ch_type); switch(ch_size) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); default: switch(ch_type) { case PXER_COMMENT: /* Got XML comment */ case PXER_TEXT: /* Ignore free-standing text */ XER_ADVANCE(ch_size); /* Skip silently */ continue; case PXER_TAG: break; /* Check the rest down there */ } } tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); ASN_DEBUG("XER/SET OF: tcv = %d, ph=%d t=%s", tcv, ctx->phase, xml_tag); switch(tcv) { case XCT_CLOSING: if(ctx->phase == 0) break; ctx->phase = 0; /* Fall through */ case XCT_BOTH: if(ctx->phase == 0) { /* No more things to decode */ XER_ADVANCE(ch_size); ctx->phase = 3; /* Phase out */ RETURN(RC_OK); } /* Fall through */ case XCT_OPENING: if(ctx->phase == 0) { XER_ADVANCE(ch_size); ctx->phase = 1; /* Processing body phase */ continue; } /* Fall through */ case XCT_UNKNOWN_OP: case XCT_UNKNOWN_BO: ASN_DEBUG("XER/SET OF: tcv=%d, ph=%d", tcv, ctx->phase); if(ctx->phase == 1) { /* * Process a single possible member. */ ctx->phase = 2; continue; } /* Fall through */ default: break; } ASN_DEBUG("Unexpected XML tag in SET OF"); break; } ctx->phase = 3; /* "Phase out" on hard failure */ RETURN(RC_FAIL); } typedef struct xer_tmp_enc_s { void *buffer; size_t offset; size_t size; } xer_tmp_enc_t; static int SET_OF_encode_xer_callback(const void *buffer, size_t size, void *key) { xer_tmp_enc_t *t = (xer_tmp_enc_t *)key; if(t->offset + size >= t->size) { size_t newsize = (t->size << 2) + size; void *p = REALLOC(t->buffer, newsize); if(!p) return -1; t->buffer = p; t->size = newsize; } memcpy((char *)t->buffer + t->offset, buffer, size); t->offset += size; return 0; } static int SET_OF_xer_order(const void *aptr, const void *bptr) { const xer_tmp_enc_t *a = (const xer_tmp_enc_t *)aptr; const xer_tmp_enc_t *b = (const xer_tmp_enc_t *)bptr; size_t minlen = a->offset; int ret; if(b->offset < minlen) minlen = b->offset; /* Well-formed UTF-8 has this nice lexicographical property... */ ret = memcmp(a->buffer, b->buffer, minlen); if(ret != 0) return ret; if(a->offset == b->offset) return 0; if(a->offset == minlen) return -1; return 1; } asn_enc_rval_t SET_OF_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t er; asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics; asn_TYPE_member_t *elm = td->elements; asn_anonymous_set_ *list = _A_SET_FROM_VOID(sptr); const char *mname = specs->as_XMLValueList ? 0 : ((*elm->name) ? elm->name : elm->type->xml_tag); size_t mlen = mname ? strlen(mname) : 0; int xcan = (flags & XER_F_CANONICAL); xer_tmp_enc_t *encs = 0; size_t encs_count = 0; void *original_app_key = app_key; asn_app_consume_bytes_f *original_cb = cb; int i; if(!sptr) _ASN_ENCODE_FAILED; if(xcan) { encs = (xer_tmp_enc_t *)MALLOC(list->count * sizeof(encs[0])); if(!encs) _ASN_ENCODE_FAILED; cb = SET_OF_encode_xer_callback; } er.encoded = 0; for(i = 0; i < list->count; i++) { asn_enc_rval_t tmper; void *memb_ptr = list->array[i]; if(!memb_ptr) continue; if(encs) { memset(&encs[encs_count], 0, sizeof(encs[0])); app_key = &encs[encs_count]; encs_count++; } if(mname) { if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel); _ASN_CALLBACK3("<", 1, mname, mlen, ">", 1); } if(!xcan && specs->as_XMLValueList == 1) _i_ASN_TEXT_INDENT(1, ilevel + 1); tmper = elm->type->xer_encoder(elm->type, memb_ptr, ilevel + (specs->as_XMLValueList != 2), flags, cb, app_key); if(tmper.encoded == -1) { td = tmper.failed_type; sptr = tmper.structure_ptr; goto cb_failed; } if(tmper.encoded == 0 && specs->as_XMLValueList) { const char *name = elm->type->xml_tag; size_t len = strlen(name); _ASN_CALLBACK3("<", 1, name, len, "/>", 2); } if(mname) { _ASN_CALLBACK3("", 1); er.encoded += 5; } er.encoded += (2 * mlen) + tmper.encoded; } if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel - 1); if(encs) { xer_tmp_enc_t *enc = encs; xer_tmp_enc_t *end = encs + encs_count; ssize_t control_size = 0; cb = original_cb; app_key = original_app_key; qsort(encs, encs_count, sizeof(encs[0]), SET_OF_xer_order); for(; enc < end; enc++) { _ASN_CALLBACK(enc->buffer, enc->offset); FREEMEM(enc->buffer); enc->buffer = 0; control_size += enc->offset; } assert(control_size == er.encoded); } goto cleanup; cb_failed: er.encoded = -1; er.failed_type = td; er.structure_ptr = sptr; cleanup: if(encs) { while(encs_count-- > 0) { if(encs[encs_count].buffer) FREEMEM(encs[encs_count].buffer); } FREEMEM(encs); } _ASN_ENCODED_OK(er); } int SET_OF_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { asn_TYPE_member_t *elm = td->elements; const asn_anonymous_set_ *list = _A_CSET_FROM_VOID(sptr); int ret; int i; if(!sptr) return (cb("", 8, app_key) < 0) ? -1 : 0; /* Dump preamble */ if(cb(td->name, strlen(td->name), app_key) < 0 || cb(" ::= {", 6, app_key) < 0) return -1; for(i = 0; i < list->count; i++) { const void *memb_ptr = list->array[i]; if(!memb_ptr) continue; _i_INDENT(1); ret = elm->type->print_struct(elm->type, memb_ptr, ilevel + 1, cb, app_key); if(ret) return ret; } ilevel--; _i_INDENT(1); return (cb("}", 1, app_key) < 0) ? -1 : 0; } void SET_OF_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { if(td && ptr) { asn_SET_OF_specifics_t *specs; asn_TYPE_member_t *elm = td->elements; asn_anonymous_set_ *list = _A_SET_FROM_VOID(ptr); asn_struct_ctx_t *ctx; /* Decoder context */ int i; /* * Could not use set_of_empty() because of (*free) * incompatibility. */ for(i = 0; i < list->count; i++) { void *memb_ptr = list->array[i]; if(memb_ptr) ASN_STRUCT_FREE(*elm->type, memb_ptr); } list->count = 0; /* No meaningful elements left */ asn_set_empty(list); /* Remove (list->array) */ specs = (asn_SET_OF_specifics_t *)td->specifics; ctx = (asn_struct_ctx_t *)((char *)ptr + specs->ctx_offset); if(ctx->ptr) { ASN_STRUCT_FREE(*elm->type, ctx->ptr); ctx->ptr = 0; } if(!contents_only) { FREEMEM(ptr); } } } int SET_OF_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { asn_TYPE_member_t *elm = td->elements; asn_constr_check_f *constr; const asn_anonymous_set_ *list = _A_CSET_FROM_VOID(sptr); int i; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } constr = elm->memb_constraints; if(!constr) constr = elm->type->check_constraints; /* * Iterate over the members of an array. * Validate each in turn, until one fails. */ for(i = 0; i < list->count; i++) { const void *memb_ptr = list->array[i]; int ret; if(!memb_ptr) continue; ret = constr(elm->type, memb_ptr, ctfailcb, app_key); if(ret) return ret; } /* * Cannot inherit it eralier: * need to make sure we get the updated version. */ if(!elm->memb_constraints) elm->memb_constraints = elm->type->check_constraints; return 0; } asn_dec_rval_t SET_OF_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { asn_dec_rval_t rv; asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics; asn_TYPE_member_t *elm = td->elements; /* Single one */ void *st = *sptr; asn_anonymous_set_ *list; asn_per_constraint_t *ct; int repeat = 0; ssize_t nelems; if(_ASN_STACK_OVERFLOW_CHECK(opt_codec_ctx)) _ASN_DECODE_FAILED; /* * Create the target structure if it is not present already. */ if(!st) { st = *sptr = CALLOC(1, specs->struct_size); if(!st) _ASN_DECODE_FAILED; } list = _A_SET_FROM_VOID(st); /* Figure out which constraints to use */ if(constraints) ct = &constraints->size; else if(td->per_constraints) ct = &td->per_constraints->size; else ct = 0; if(ct && ct->flags & APC_EXTENSIBLE) { int value = per_get_few_bits(pd, 1); if(value < 0) _ASN_DECODE_STARVED; if(value) ct = 0; /* Not restricted! */ } if(ct && ct->effective_bits >= 0) { /* X.691, #19.5: No length determinant */ nelems = per_get_few_bits(pd, ct->effective_bits); ASN_DEBUG("Preparing to fetch %ld+%ld elements from %s", (long)nelems, ct->lower_bound, td->name); if(nelems < 0) _ASN_DECODE_STARVED; nelems += ct->lower_bound; } else { nelems = -1; } do { int i; if(nelems < 0) { nelems = uper_get_length(pd, ct ? ct->effective_bits : -1, &repeat); ASN_DEBUG("Got to decode %d elements (eff %d)", (int)nelems, (int)ct ? ct->effective_bits : -1); if(nelems < 0) _ASN_DECODE_STARVED; } for(i = 0; i < nelems; i++) { void *ptr = 0; ASN_DEBUG("SET OF %s decoding", elm->type->name); rv = elm->type->uper_decoder(opt_codec_ctx, elm->type, elm->per_constraints, &ptr, pd); ASN_DEBUG("%s SET OF %s decoded %d, %p", td->name, elm->type->name, rv.code, ptr); if(rv.code == RC_OK) { if(ASN_SET_ADD(list, ptr) == 0) continue; ASN_DEBUG("Failed to add element into %s", td->name); /* Fall through */ rv.code = RC_FAIL; } else { ASN_DEBUG("Failed decoding %s of %s (SET OF)", elm->type->name, td->name); } if(ptr) ASN_STRUCT_FREE(*elm->type, ptr); return rv; } nelems = -1; /* Allow uper_get_length() */ } while(repeat); ASN_DEBUG("Decoded %s as SET OF", td->name); rv.code = RC_OK; rv.consumed = 0; return rv; } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/constr_SET_OF.h000066400000000000000000000020461305042567700232440ustar00rootroot00000000000000/*- * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _CONSTR_SET_OF_H_ #define _CONSTR_SET_OF_H_ #include #ifdef __cplusplus extern "C" { #endif typedef struct asn_SET_OF_specifics_s { /* * Target structure description. */ int struct_size; /* Size of the target structure. */ int ctx_offset; /* Offset of the asn_struct_ctx_t member */ /* XER-specific stuff */ int as_XMLValueList; /* The member type must be encoded like this */ } asn_SET_OF_specifics_t; /* * A set specialized functions dealing with the SET OF type. */ asn_struct_free_f SET_OF_free; asn_struct_print_f SET_OF_print; asn_constr_check_f SET_OF_constraint; ber_type_decoder_f SET_OF_decode_ber; der_type_encoder_f SET_OF_encode_der; xer_type_decoder_f SET_OF_decode_xer; xer_type_encoder_f SET_OF_encode_xer; per_type_decoder_f SET_OF_decode_uper; per_type_encoder_f SET_OF_encode_uper; #ifdef __cplusplus } #endif #endif /* _CONSTR_SET_OF_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/constr_TYPE.c000066400000000000000000000033421305042567700230010ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include /* * Version of the ASN.1 infrastructure shipped with compiler. */ int get_asn1c_environment_version() { return ASN1C_ENVIRONMENT_VERSION; } static asn_app_consume_bytes_f _print2fp; /* * Return the outmost tag of the type. */ ber_tlv_tag_t asn_TYPE_outmost_tag(asn_TYPE_descriptor_t *type_descriptor, const void *struct_ptr, int tag_mode, ber_tlv_tag_t tag) { if(tag_mode) return tag; if(type_descriptor->tags_count) return type_descriptor->tags[0]; return type_descriptor->outmost_tag(type_descriptor, struct_ptr, 0, 0); } /* * Print the target language's structure in human readable form. */ int asn_fprint(FILE *stream, asn_TYPE_descriptor_t *td, const void *struct_ptr) { if(!stream) stream = stdout; if(!td || !struct_ptr) { errno = EINVAL; return -1; } /* Invoke type-specific printer */ if(td->print_struct(td, struct_ptr, 1, _print2fp, stream)) return -1; /* Terminate the output */ if(_print2fp("\n", 1, stream)) return -1; return fflush(stream); } /* Dump the data into the specified stdio stream */ static int _print2fp(const void *buffer, size_t size, void *app_key) { FILE *stream = (FILE *)app_key; if(fwrite(buffer, 1, size, stream) != size) return -1; return 0; } /* * Some compilers do not support variable args macros. * This function is a replacement of ASN_DEBUG() macro. */ void ASN_DEBUG_f(const char *fmt, ...); void ASN_DEBUG_f(const char *fmt, ...) { va_list ap; va_start(ap, fmt); vfprintf(stderr, fmt, ap); fprintf(stderr, "\n"); va_end(ap); } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/constr_TYPE.h000066400000000000000000000150561305042567700230130ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004, 2005, 2006 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ /* * This file contains the declaration structure called "ASN.1 Type Definition", * which holds all information necessary for encoding and decoding routines. * This structure even contains pointer to these encoding and decoding routines * for each defined ASN.1 type. */ #ifndef _CONSTR_TYPE_H_ #define _CONSTR_TYPE_H_ #include #include #ifdef __cplusplus extern "C" { #endif struct asn_TYPE_descriptor_s; /* Forward declaration */ struct asn_TYPE_member_s; /* Forward declaration */ /* * This type provides the context information for various ASN.1 routines, * primarily ones doing decoding. A member _asn_ctx of this type must be * included into certain target language's structures, such as compound types. */ typedef struct asn_struct_ctx_s { short phase; /* Decoding phase */ short step; /* Elementary step of a phase */ int context; /* Other context information */ void *ptr; /* Decoder-specific stuff (stack elements) */ ber_tlv_len_t left; /* Number of bytes left, -1 for indefinite */ } asn_struct_ctx_t; #include /* Basic Encoding Rules decoder */ #include /* Distinguished Encoding Rules encoder */ #include /* Decoder of XER (XML, text) */ #include /* Encoder into XER (XML, text) */ #include /* Packet Encoding Rules decoder */ #include /* Packet Encoding Rules encoder */ #include /* Subtype constraints support */ /* * Free the structure according to its specification. * If (free_contents_only) is set, the wrapper structure itself (struct_ptr) * will not be freed. (It may be useful in case the structure is allocated * statically or arranged on the stack, yet its elements are allocated * dynamically.) */ typedef void (asn_struct_free_f)( struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, int free_contents_only); #define ASN_STRUCT_FREE(asn_DEF, ptr) (asn_DEF).free_struct(&(asn_DEF),ptr,0) #define ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF, ptr) \ (asn_DEF).free_struct(&(asn_DEF),ptr,1) /* * Print the structure according to its specification. */ typedef int (asn_struct_print_f)( struct asn_TYPE_descriptor_s *type_descriptor, const void *struct_ptr, int level, /* Indentation level */ asn_app_consume_bytes_f *callback, void *app_key); /* * Return the outmost tag of the type. * If the type is untagged CHOICE, the dynamic operation is performed. * NOTE: This function pointer type is only useful internally. * Do not use it in your application. */ typedef ber_tlv_tag_t (asn_outmost_tag_f)( struct asn_TYPE_descriptor_s *type_descriptor, const void *struct_ptr, int tag_mode, ber_tlv_tag_t tag); /* The instance of the above function type; used internally. */ asn_outmost_tag_f asn_TYPE_outmost_tag; /* * The definitive description of the destination language's structure. */ typedef struct asn_TYPE_descriptor_s { char *name; /* A name of the ASN.1 type. "" in some cases. */ char *xml_tag; /* Name used in XML tag */ /* * Generalized functions for dealing with the specific type. * May be directly invoked by applications. */ asn_struct_free_f *free_struct; /* Free the structure */ asn_struct_print_f *print_struct; /* Human readable output */ asn_constr_check_f *check_constraints; /* Constraints validator */ ber_type_decoder_f *ber_decoder; /* Generic BER decoder */ der_type_encoder_f *der_encoder; /* Canonical DER encoder */ xer_type_decoder_f *xer_decoder; /* Generic XER decoder */ xer_type_encoder_f *xer_encoder; /* [Canonical] XER encoder */ per_type_decoder_f *uper_decoder; /* Unaligned PER decoder */ per_type_encoder_f *uper_encoder; /* Unaligned PER encoder */ /*********************************************************************** * Internally useful members. Not to be used by applications directly. * **********************************************************************/ /* * Tags that are expected to occur. */ asn_outmost_tag_f *outmost_tag; /* */ ber_tlv_tag_t *tags; /* Effective tags sequence for this type */ int tags_count; /* Number of tags which are expected */ ber_tlv_tag_t *all_tags;/* Every tag for BER/containment */ int all_tags_count; /* Number of tags */ asn_per_constraints_t *per_constraints; /* PER compiled constraints */ /* * An ASN.1 production type members (members of SEQUENCE, SET, CHOICE). */ struct asn_TYPE_member_s *elements; int elements_count; /* * Additional information describing the type, used by appropriate * functions above. */ void *specifics; } asn_TYPE_descriptor_t; /* * This type describes an element of the constructed type, * i.e. SEQUENCE, SET, CHOICE, etc. */ enum asn_TYPE_flags_e { ATF_NOFLAGS, ATF_POINTER = 0x01, /* Represented by the pointer */ ATF_OPEN_TYPE = 0x02 /* ANY type, without meaningful tag */ }; typedef struct asn_TYPE_member_s { enum asn_TYPE_flags_e flags; /* Element's presentation flags */ int optional; /* Following optional members, including current */ int memb_offset; /* Offset of the element */ ber_tlv_tag_t tag; /* Outmost (most immediate) tag */ int tag_mode; /* IMPLICIT/no/EXPLICIT tag at current level */ asn_TYPE_descriptor_t *type; /* Member type descriptor */ asn_constr_check_f *memb_constraints; /* Constraints validator */ asn_per_constraints_t *per_constraints; /* PER compiled constraints */ int (*default_value)(int setval, void **sptr); /* DEFAULT */ char *name; /* ASN.1 identifier of the element */ } asn_TYPE_member_t; /* * BER tag to element number mapping. */ typedef struct asn_TYPE_tag2member_s { ber_tlv_tag_t el_tag; /* Outmost tag of the member */ int el_no; /* Index of the associated member, base 0 */ int toff_first; /* First occurence of the el_tag, relative */ int toff_last; /* Last occurence of the el_tag, relatvie */ } asn_TYPE_tag2member_t; /* * This function is a wrapper around (td)->print_struct, which prints out * the contents of the target language's structure (struct_ptr) into the * file pointer (stream) in human readable form. * RETURN VALUES: * 0: The structure is printed. * -1: Problem dumping the structure. * (See also xer_fprint() in xer_encoder.h) */ int asn_fprint(FILE *stream, /* Destination stream descriptor */ asn_TYPE_descriptor_t *td, /* ASN.1 type descriptor */ const void *struct_ptr); /* Structure to be printed */ #ifdef __cplusplus } #endif #endif /* _CONSTR_TYPE_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/constraints.c000066400000000000000000000042571305042567700232050ustar00rootroot00000000000000#include "asn_internal.h" #include "constraints.h" int asn_generic_no_constraint(asn_TYPE_descriptor_t *type_descriptor, const void *struct_ptr, asn_app_constraint_failed_f *cb, void *key) { (void)type_descriptor; /* Unused argument */ (void)struct_ptr; /* Unused argument */ (void)cb; /* Unused argument */ (void)key; /* Unused argument */ /* Nothing to check */ return 0; } int asn_generic_unknown_constraint(asn_TYPE_descriptor_t *type_descriptor, const void *struct_ptr, asn_app_constraint_failed_f *cb, void *key) { (void)type_descriptor; /* Unused argument */ (void)struct_ptr; /* Unused argument */ (void)cb; /* Unused argument */ (void)key; /* Unused argument */ /* Unknown how to check */ return 0; } struct errbufDesc { asn_TYPE_descriptor_t *failed_type; const void *failed_struct_ptr; char *errbuf; size_t errlen; }; static void _asn_i_ctfailcb(void *key, asn_TYPE_descriptor_t *td, const void *sptr, const char *fmt, ...) { struct errbufDesc *arg = key; va_list ap; ssize_t vlen; ssize_t maxlen; arg->failed_type = td; arg->failed_struct_ptr = sptr; maxlen = arg->errlen; if(maxlen <= 0) return; va_start(ap, fmt); vlen = vsnprintf(arg->errbuf, maxlen, fmt, ap); va_end(ap); if(vlen >= maxlen) { arg->errbuf[maxlen-1] = '\0'; /* Ensuring libc correctness */ arg->errlen = maxlen - 1; /* Not counting termination */ return; } else if(vlen >= 0) { arg->errbuf[vlen] = '\0'; /* Ensuring libc correctness */ arg->errlen = vlen; /* Not counting termination */ } else { /* * The libc on this system is broken. */ vlen = sizeof("") - 1; maxlen--; arg->errlen = vlen < maxlen ? vlen : maxlen; memcpy(arg->errbuf, "", arg->errlen); arg->errbuf[arg->errlen] = 0; } return; } int asn_check_constraints(asn_TYPE_descriptor_t *type_descriptor, const void *struct_ptr, char *errbuf, size_t *errlen) { struct errbufDesc arg; int ret; arg.failed_type = 0; arg.failed_struct_ptr = 0; arg.errbuf = errbuf; arg.errlen = errlen ? *errlen : 0; ret = type_descriptor->check_constraints(type_descriptor, struct_ptr, _asn_i_ctfailcb, &arg); if(ret == -1 && errlen) *errlen = arg.errlen; return ret; } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/constraints.h000066400000000000000000000036571305042567700232150ustar00rootroot00000000000000/*- * Copyright (c) 2004, 2006 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _ASN1_CONSTRAINTS_VALIDATOR_H_ #define _ASN1_CONSTRAINTS_VALIDATOR_H_ #include /* Platform-dependent types */ #ifdef __cplusplus extern "C" { #endif struct asn_TYPE_descriptor_s; /* Forward declaration */ /* * Validate the structure according to the ASN.1 constraints. * If errbuf and errlen are given, they shall be pointing to the appropriate * buffer space and its length before calling this function. Alternatively, * they could be passed as NULL's. If constraints validation fails, * errlen will contain the actual number of bytes taken from the errbuf * to encode an error message (properly 0-terminated). * * RETURN VALUES: * This function returns 0 in case all ASN.1 constraints are met * and -1 if one or more constraints were failed. */ int asn_check_constraints(struct asn_TYPE_descriptor_s *type_descriptor, const void *struct_ptr, /* Target language's structure */ char *errbuf, /* Returned error description */ size_t *errlen /* Length of the error description */ ); /* * Generic type for constraint checking callback, * associated with every type descriptor. */ typedef int (asn_constr_check_f)( struct asn_TYPE_descriptor_s *type_descriptor, const void *struct_ptr, asn_app_constraint_failed_f *optional_callback, /* Log the error */ void *optional_app_key /* Opaque key passed to a callback */ ); /******************************* * INTERNALLY USEFUL FUNCTIONS * *******************************/ asn_constr_check_f asn_generic_no_constraint; /* No constraint whatsoever */ asn_constr_check_f asn_generic_unknown_constraint; /* Not fully supported */ /* * Invoke the callback with a complete error message. */ #define _ASN_CTFAIL if(ctfailcb) ctfailcb #ifdef __cplusplus } #endif #endif /* _ASN1_CONSTRAINTS_VALIDATOR_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/converter-sample.c000066400000000000000000000537061305042567700241270ustar00rootroot00000000000000/* * Generic converter template for a selected ASN.1 type. * Copyright (c) 2005, 2006, 2007 Lev Walkin . * All rights reserved. * * To compile with your own ASN.1 type, please redefine the PDU as shown: * * cc -DPDU=MyCustomType -o myDecoder.o -c converter-sample.c */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include /* for atoi(3) */ #include /* for getopt(3) */ #include /* for strerror(3) */ #include /* for EX_* exit codes */ #include /* for errno */ #include #include /* for _ASN_DEFAULT_STACK_MAX */ /* Convert "Type" defined by -DPDU into "asn_DEF_Type" */ #define ASN_DEF_PDU(t) asn_DEF_ ## t #define DEF_PDU_Type(t) ASN_DEF_PDU(t) #define PDU_Type DEF_PDU_Type(PDU) extern asn_TYPE_descriptor_t PDU_Type; /* ASN.1 type to be decoded */ #ifdef ASN_PDU_COLLECTION /* Generated by asn1c: -pdu=... */ extern asn_TYPE_descriptor_t *asn_pdu_collection[]; #endif /* * Open file and parse its contens. */ static void *data_decode_from_file(asn_TYPE_descriptor_t *asnTypeOfPDU, FILE *file, const char *name, ssize_t suggested_bufsize, int first_pdu); static int write_out(const void *buffer, size_t size, void *key); static FILE *argument_to_file(char *av[], int idx); static char *argument_to_name(char *av[], int idx); int opt_debug; /* -d (or -dd) */ static int opt_check; /* -c (constraints checking) */ static int opt_stack; /* -s (maximum stack size) */ static int opt_nopad; /* -per-nopad (PER input is not padded) */ static int opt_onepdu; /* -1 (decode single PDU) */ /* Input data format selector */ static enum input_format { INP_BER, /* -iber: BER input */ INP_XER, /* -ixer: XER input */ INP_PER /* -iper: Unaligned PER input */ } iform; /* -i */ /* Output data format selector */ static enum output_format { OUT_XER, /* -oxer: XER (XML) output */ OUT_DER, /* -oder: DER (BER) output */ OUT_PER, /* -oper: Unaligned PER output */ OUT_TEXT, /* -otext: semi-structured text */ OUT_NULL /* -onull: No pretty-printing */ } oform; /* -o */ #ifdef JUNKTEST /* Enable -J */ #define JUNKOPT "J:" static double opt_jprob; /* Junk bit probability */ static int junk_failures; static void junk_bytes_with_probability(uint8_t *, size_t, double prob); #else #define JUNKOPT #endif /* Debug output function */ static inline void DEBUG(const char *fmt, ...) { va_list ap; if(!opt_debug) return; fprintf(stderr, "AD: "); va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); fprintf(stderr, "\n"); } int main(int ac, char *av[]) { static asn_TYPE_descriptor_t *pduType = &PDU_Type; ssize_t suggested_bufsize = 8192; /* close or equal to stdio buffer */ int number_of_iterations = 1; int num; int ch; /* Figure out if Unaligned PER needs to be default */ if(pduType->uper_decoder) iform = INP_PER; /* * Pocess the command-line argments. */ while((ch = getopt(ac, av, "i:o:1b:cdn:p:hs:" JUNKOPT)) != -1) switch(ch) { case 'i': if(optarg[0] == 'b') { iform = INP_BER; break; } if(optarg[0] == 'x') { iform = INP_XER; break; } if(pduType->uper_decoder && optarg[0] == 'p') { iform = INP_PER; break; } fprintf(stderr, "-i: '%s': improper format selector\n", optarg); exit(EX_UNAVAILABLE); case 'o': if(optarg[0] == 'd') { oform = OUT_DER; break; } if(pduType->uper_encoder && optarg[0] == 'p') { oform = OUT_PER; break; } if(optarg[0] == 'x') { oform = OUT_XER; break; } if(optarg[0] == 't') { oform = OUT_TEXT; break; } if(optarg[0] == 'n') { oform = OUT_NULL; break; } fprintf(stderr, "-o: '%s': improper format selector\n", optarg); exit(EX_UNAVAILABLE); case '1': opt_onepdu = 1; break; case 'b': suggested_bufsize = atoi(optarg); if(suggested_bufsize < 1 || suggested_bufsize > 16 * 1024 * 1024) { fprintf(stderr, "-b %s: Improper buffer size (1..16M)\n", optarg); exit(EX_UNAVAILABLE); } break; case 'c': opt_check = 1; break; case 'd': opt_debug++; /* Double -dd means ASN.1 debug */ break; case 'n': number_of_iterations = atoi(optarg); if(number_of_iterations < 1) { fprintf(stderr, "-n %s: Improper iterations count\n", optarg); exit(EX_UNAVAILABLE); } break; case 'p': if(strcmp(optarg, "er-nopad") == 0) { opt_nopad = 1; break; } #ifdef ASN_PDU_COLLECTION if(strcmp(optarg, "list") == 0) { asn_TYPE_descriptor_t **pdu = asn_pdu_collection; fprintf(stderr, "Available PDU types:\n"); for(; *pdu; pdu++) printf("%s\n", (*pdu)->name); exit(0); } else if(optarg[0] >= 'A' && optarg[0] <= 'Z') { asn_TYPE_descriptor_t **pdu = asn_pdu_collection; while(*pdu && strcmp((*pdu)->name, optarg)) pdu++; if(*pdu) { pduType = *pdu; break; } fprintf(stderr, "-p %s: Unrecognized PDU\n", optarg); } #endif /* ASN_PDU_COLLECTION */ fprintf(stderr, "-p %s: Unrecognized option\n", optarg); exit(EX_UNAVAILABLE); case 's': opt_stack = atoi(optarg); if(opt_stack < 0) { fprintf(stderr, "-s %s: Non-negative value expected\n", optarg); exit(EX_UNAVAILABLE); } break; #ifdef JUNKTEST case 'J': opt_jprob = strtod(optarg, 0); if(opt_jprob <= 0.0 || opt_jprob > 1.0) { fprintf(stderr, "-J %s: Probability range 0..1 expected \n", optarg); exit(EX_UNAVAILABLE); } break; #endif /* JUNKTEST */ case 'h': default: #ifdef ASN_CONVERTER_TITLE #define _AXS(x) #x #define _ASX(x) _AXS(x) fprintf(stderr, "%s\n", _ASX(ASN_CONVERTER_TITLE)); #endif fprintf(stderr, "Usage: %s [options] ...\n", av[0]); fprintf(stderr, "Where options are:\n"); if(pduType->uper_decoder) fprintf(stderr, " -iper Input is in Unaligned PER (Packed Encoding Rules) (DEFAULT)\n"); fprintf(stderr, " -iber Input is in BER (Basic Encoding Rules)%s\n", iform == INP_PER ? "" : " (DEFAULT)"); fprintf(stderr, " -ixer Input is in XER (XML Encoding Rules)\n"); if(pduType->uper_encoder) fprintf(stderr, " -oper Output in Unaligned PER (Packed Encoding Rules)\n"); fprintf(stderr, " -oder Output in DER (Distinguished Encoding Rules)\n" " -oxer Output in XER (XML Encoding Rules) (DEFAULT)\n" " -otext Output in plain semi-structured text (dump)\n" " -onull Verify (decode) input, but do not output\n"); if(pduType->uper_decoder) fprintf(stderr, " -per-nopad Assume PER PDUs are not padded (-iper)\n"); #ifdef ASN_PDU_COLLECTION fprintf(stderr, " -p Specify PDU type to decode\n" " -p list List available PDUs\n"); #endif /* ASN_PDU_COLLECTION */ fprintf(stderr, " -1 Decode only the first PDU in file\n" " -b Set the i/o buffer size (default is %ld)\n" " -c Check ASN.1 constraints after decoding\n" " -d Enable debugging (-dd is even better)\n" " -n Process files times\n" " -s Set the stack usage limit (default is %d)\n" #ifdef JUNKTEST " -J Set random junk test bit garbaging probability\n" #endif , (long)suggested_bufsize, _ASN_DEFAULT_STACK_MAX); exit(EX_USAGE); } ac -= optind; av += optind; if(ac < 1) { fprintf(stderr, "%s: No input files specified. " "Try '-h' for more information\n", av[-optind]); exit(EX_USAGE); } setvbuf(stdout, 0, _IOLBF, 0); for(num = 0; num < number_of_iterations; num++) { int ac_i; /* * Process all files in turn. */ for(ac_i = 0; ac_i < ac; ac_i++) { asn_enc_rval_t erv; void *structure; /* Decoded structure */ FILE *file = argument_to_file(av, ac_i); char *name = argument_to_name(av, ac_i); int first_pdu; for(first_pdu = 1; first_pdu || !opt_onepdu; first_pdu = 0) { /* * Decode the encoded structure from file. */ structure = data_decode_from_file(pduType, file, name, suggested_bufsize, first_pdu); if(!structure) { if(errno) { /* Error message is already printed */ exit(EX_DATAERR); } else { /* EOF */ break; } } /* Check ASN.1 constraints */ if(opt_check) { char errbuf[128]; size_t errlen = sizeof(errbuf); if(asn_check_constraints(pduType, structure, errbuf, &errlen)) { fprintf(stderr, "%s: ASN.1 constraint " "check failed: %s\n", name, errbuf); exit(EX_DATAERR); } } switch(oform) { case OUT_NULL: #ifdef JUNKTEST if(opt_jprob == 0.0) #endif fprintf(stderr, "%s: decoded successfully\n", name); break; case OUT_TEXT: /* -otext */ asn_fprint(stdout, pduType, structure); break; case OUT_XER: /* -oxer */ if(xer_fprint(stdout, pduType, structure)) { fprintf(stderr, "%s: Cannot convert %s into XML\n", name, pduType->name); exit(EX_UNAVAILABLE); } break; case OUT_DER: erv = der_encode(pduType, structure, write_out, stdout); if(erv.encoded < 0) { fprintf(stderr, "%s: Cannot convert %s into DER\n", name, pduType->name); exit(EX_UNAVAILABLE); } DEBUG("Encoded in %ld bytes of DER", (long)erv.encoded); break; case OUT_PER: erv = uper_encode(pduType, structure, write_out, stdout); if(erv.encoded < 0) { fprintf(stderr, "%s: Cannot convert %s into Unaligned PER\n", name, pduType->name); exit(EX_UNAVAILABLE); } DEBUG("Encoded in %ld bits of UPER", (long)erv.encoded); break; } ASN_STRUCT_FREE(*pduType, structure); } if(file && file != stdin) fclose(file); } } #ifdef JUNKTEST if(opt_jprob > 0.0) { fprintf(stderr, "Junked %f OK (%d/%d)\n", opt_jprob, junk_failures, number_of_iterations); } #endif /* JUNKTEST */ return 0; } static struct dynamic_buffer { uint8_t *data; /* Pointer to the data bytes */ size_t offset; /* Offset from the start */ size_t length; /* Length of meaningful contents */ size_t unbits; /* Unused bits in the last byte */ size_t allocated; /* Allocated memory for data */ int nreallocs; /* Number of data reallocations */ off_t bytes_shifted; /* Number of bytes ever shifted */ } DynamicBuffer; static void buffer_dump() { uint8_t *p = DynamicBuffer.data + DynamicBuffer.offset; uint8_t *e = p + DynamicBuffer.length - (DynamicBuffer.unbits ? 1 : 0); if(!opt_debug) return; DEBUG("Buffer: { d=%p, o=%ld, l=%ld, u=%ld, a=%ld, s=%ld }", DynamicBuffer.data, (long)DynamicBuffer.offset, (long)DynamicBuffer.length, (long)DynamicBuffer.unbits, (long)DynamicBuffer.allocated, (long)DynamicBuffer.bytes_shifted); for(; p < e; p++) { fprintf(stderr, " %c%c%c%c%c%c%c%c", ((*p >> 7) & 1) ? '1' : '0', ((*p >> 6) & 1) ? '1' : '0', ((*p >> 5) & 1) ? '1' : '0', ((*p >> 4) & 1) ? '1' : '0', ((*p >> 3) & 1) ? '1' : '0', ((*p >> 2) & 1) ? '1' : '0', ((*p >> 1) & 1) ? '1' : '0', ((*p >> 0) & 1) ? '1' : '0'); } if(DynamicBuffer.unbits) { unsigned int shift; fprintf(stderr, " "); for(shift = 7; shift >= DynamicBuffer.unbits; shift--) fprintf(stderr, "%c", ((*p >> shift) & 1) ? '1' : '0'); fprintf(stderr, " %ld:%ld\n", (long)DynamicBuffer.length - 1, (long)8 - DynamicBuffer.unbits); } else { fprintf(stderr, " %d\n", DynamicBuffer.length); } } /* * Move the buffer content left N bits, possibly joining it with * preceeding content. */ static void buffer_shift_left(size_t offset, int bits) { uint8_t *ptr = DynamicBuffer.data + DynamicBuffer.offset + offset; uint8_t *end = DynamicBuffer.data + DynamicBuffer.offset + DynamicBuffer.length - 1; if(!bits) return; DEBUG("Shifting left %d bits off %ld (o=%ld, u=%ld, l=%ld)", bits, (long)offset, (long)DynamicBuffer.offset, (long)DynamicBuffer.unbits, (long)DynamicBuffer.length); if(offset) { int right; right = ptr[0] >> (8 - bits); DEBUG("oleft: %c%c%c%c%c%c%c%c", ((ptr[-1] >> 7) & 1) ? '1' : '0', ((ptr[-1] >> 6) & 1) ? '1' : '0', ((ptr[-1] >> 5) & 1) ? '1' : '0', ((ptr[-1] >> 4) & 1) ? '1' : '0', ((ptr[-1] >> 3) & 1) ? '1' : '0', ((ptr[-1] >> 2) & 1) ? '1' : '0', ((ptr[-1] >> 1) & 1) ? '1' : '0', ((ptr[-1] >> 0) & 1) ? '1' : '0'); DEBUG("oriht: %c%c%c%c%c%c%c%c", ((ptr[0] >> 7) & 1) ? '1' : '0', ((ptr[0] >> 6) & 1) ? '1' : '0', ((ptr[0] >> 5) & 1) ? '1' : '0', ((ptr[0] >> 4) & 1) ? '1' : '0', ((ptr[0] >> 3) & 1) ? '1' : '0', ((ptr[0] >> 2) & 1) ? '1' : '0', ((ptr[0] >> 1) & 1) ? '1' : '0', ((ptr[0] >> 0) & 1) ? '1' : '0'); DEBUG("mriht: %c%c%c%c%c%c%c%c", ((right >> 7) & 1) ? '1' : '0', ((right >> 6) & 1) ? '1' : '0', ((right >> 5) & 1) ? '1' : '0', ((right >> 4) & 1) ? '1' : '0', ((right >> 3) & 1) ? '1' : '0', ((right >> 2) & 1) ? '1' : '0', ((right >> 1) & 1) ? '1' : '0', ((right >> 0) & 1) ? '1' : '0'); ptr[-1] = (ptr[-1] & (0xff << bits)) | right; DEBUG("after: %c%c%c%c%c%c%c%c", ((ptr[-1] >> 7) & 1) ? '1' : '0', ((ptr[-1] >> 6) & 1) ? '1' : '0', ((ptr[-1] >> 5) & 1) ? '1' : '0', ((ptr[-1] >> 4) & 1) ? '1' : '0', ((ptr[-1] >> 3) & 1) ? '1' : '0', ((ptr[-1] >> 2) & 1) ? '1' : '0', ((ptr[-1] >> 1) & 1) ? '1' : '0', ((ptr[-1] >> 0) & 1) ? '1' : '0'); } buffer_dump(); for(; ptr < end; ptr++) { int right = ptr[1] >> (8 - bits); *ptr = (*ptr << bits) | right; } *ptr <<= bits; DEBUG("Unbits [%d=>", (int)DynamicBuffer.unbits); if(DynamicBuffer.unbits == 0) { DynamicBuffer.unbits += bits; } else { DynamicBuffer.unbits += bits; if(DynamicBuffer.unbits > 7) { DynamicBuffer.unbits -= 8; DynamicBuffer.length--; DynamicBuffer.bytes_shifted++; } } DEBUG("Unbits =>%d]", (int)DynamicBuffer.unbits); buffer_dump(); DEBUG("Shifted. Now (o=%ld, u=%ld l=%ld)", (long)DynamicBuffer.offset, (long)DynamicBuffer.unbits, (long)DynamicBuffer.length); } /* * Ensure that the buffer contains at least this amount of free space. */ static void add_bytes_to_buffer(const void *data2add, size_t bytes) { if(bytes == 0) return; DEBUG("=> add_bytes(%ld) { o=%ld l=%ld u=%ld, s=%ld }", (long)bytes, (long)DynamicBuffer.offset, (long)DynamicBuffer.length, (long)DynamicBuffer.unbits, (long)DynamicBuffer.allocated); if(DynamicBuffer.allocated >= (DynamicBuffer.offset + DynamicBuffer.length + bytes)) { DEBUG("\tNo buffer reallocation is necessary"); } else if(bytes <= DynamicBuffer.offset) { DEBUG("\tContents shifted by %ld", DynamicBuffer.offset); /* Shift the buffer contents */ memmove(DynamicBuffer.data, DynamicBuffer.data + DynamicBuffer.offset, DynamicBuffer.length); DynamicBuffer.bytes_shifted += DynamicBuffer.offset; DynamicBuffer.offset = 0; } else { size_t newsize = (DynamicBuffer.allocated << 2) + bytes; void *p = MALLOC(newsize); if(!p) { perror("malloc()"); exit(EX_OSERR); } memcpy(p, DynamicBuffer.data + DynamicBuffer.offset, DynamicBuffer.length); FREEMEM(DynamicBuffer.data); DynamicBuffer.data = (uint8_t *)p; DynamicBuffer.offset = 0; DynamicBuffer.allocated = newsize; DynamicBuffer.nreallocs++; DEBUG("\tBuffer reallocated to %ld (%d time)", newsize, DynamicBuffer.nreallocs); } memcpy(DynamicBuffer.data + DynamicBuffer.offset + DynamicBuffer.length, data2add, bytes); DynamicBuffer.length += bytes; if(DynamicBuffer.unbits) { int bits = DynamicBuffer.unbits; DynamicBuffer.unbits = 0; buffer_shift_left(DynamicBuffer.length - bytes, bits); } DEBUG("<= add_bytes(%ld) { o=%ld l=%ld u=%ld, s=%ld }", (long)bytes, (long)DynamicBuffer.offset, (long)DynamicBuffer.length, (long)DynamicBuffer.unbits, (long)DynamicBuffer.allocated); } static void * data_decode_from_file(asn_TYPE_descriptor_t *pduType, FILE *file, const char *name, ssize_t suggested_bufsize, int on_first_pdu) { static uint8_t *fbuf; static ssize_t fbuf_size; static asn_codec_ctx_t s_codec_ctx; asn_codec_ctx_t *opt_codec_ctx = 0; void *structure = 0; asn_dec_rval_t rval; size_t old_offset; size_t new_offset; int tolerate_eof; size_t rd; if(!file) { fprintf(stderr, "%s: %s\n", name, strerror(errno)); errno = EINVAL; return 0; } if(opt_stack) { s_codec_ctx.max_stack_size = opt_stack; opt_codec_ctx = &s_codec_ctx; } DEBUG("Processing %s", name); /* prepare the file buffer */ if(fbuf_size != suggested_bufsize) { fbuf = (uint8_t *)REALLOC(fbuf, suggested_bufsize); if(!fbuf) { perror("realloc()"); exit(EX_OSERR); } fbuf_size = suggested_bufsize; } if(on_first_pdu) { DynamicBuffer.offset = 0; DynamicBuffer.length = 0; DynamicBuffer.unbits = 0; DynamicBuffer.allocated = 0; DynamicBuffer.bytes_shifted = 0; DynamicBuffer.nreallocs = 0; } old_offset = DynamicBuffer.bytes_shifted + DynamicBuffer.offset; /* Pretend immediate EOF */ rval.code = RC_WMORE; rval.consumed = 0; for(tolerate_eof = 1; /* Allow EOF first time buffer is non-empty */ (rd = fread(fbuf, 1, fbuf_size, file)) || feof(file) == 0 || (tolerate_eof && DynamicBuffer.length) ;) { int ecbits = 0; /* Extra consumed bits in case of PER */ uint8_t *i_bptr; size_t i_size; /* * Copy the data over, or use the original buffer. */ if(DynamicBuffer.allocated) { /* Append new data into the existing dynamic buffer */ add_bytes_to_buffer(fbuf, rd); i_bptr = DynamicBuffer.data + DynamicBuffer.offset; i_size = DynamicBuffer.length; } else { i_bptr = fbuf; i_size = rd; } DEBUG("Decoding %ld bytes", (long)i_size); #ifdef JUNKTEST junk_bytes_with_probability(i_bptr, i_size, opt_jprob); #endif switch(iform) { case INP_BER: rval = ber_decode(opt_codec_ctx, pduType, (void **)&structure, i_bptr, i_size); break; case INP_XER: rval = xer_decode(opt_codec_ctx, pduType, (void **)&structure, i_bptr, i_size); break; case INP_PER: if(opt_nopad) rval = uper_decode(opt_codec_ctx, pduType, (void **)&structure, i_bptr, i_size, 0, DynamicBuffer.unbits); else rval = uper_decode_complete(opt_codec_ctx, pduType, (void **)&structure, i_bptr, i_size); switch(rval.code) { case RC_OK: /* Fall through */ case RC_FAIL: if(opt_nopad) { /* uper_decode() returns bits! */ /* Extra bits */ ecbits = rval.consumed % 8; /* Convert into bytes! */ rval.consumed /= 8; } break; case RC_WMORE: /* PER does not support restartability */ ASN_STRUCT_FREE(*pduType, structure); structure = 0; rval.consumed = 0; /* Continue accumulating data */ break; } break; } DEBUG("decode(%ld) consumed %ld+%db (%ld), code %d", (long)DynamicBuffer.length, (long)rval.consumed, ecbits, (long)i_size, rval.code); if(DynamicBuffer.allocated == 0) { /* * Flush remainder into the intermediate buffer. */ if(rval.code != RC_FAIL && rval.consumed < rd) { add_bytes_to_buffer(fbuf + rval.consumed, rd - rval.consumed); buffer_shift_left(0, ecbits); DynamicBuffer.bytes_shifted = rval.consumed; rval.consumed = 0; ecbits = 0; } } /* * Adjust position inside the source buffer. */ if(DynamicBuffer.allocated) { DynamicBuffer.offset += rval.consumed; DynamicBuffer.length -= rval.consumed; } else { DynamicBuffer.bytes_shifted += rval.consumed; } switch(rval.code) { case RC_OK: if(ecbits) buffer_shift_left(0, ecbits); DEBUG("RC_OK, finishing up with %ld+%d", (long)rval.consumed, ecbits); return structure; case RC_WMORE: DEBUG("RC_WMORE, continuing read=%ld, cons=%ld " " with %ld..%ld-%ld..%ld", (long)rd, (long)rval.consumed, (long)DynamicBuffer.offset, (long)DynamicBuffer.length, (long)DynamicBuffer.unbits, (long)DynamicBuffer.allocated); if(!rd) tolerate_eof--; continue; case RC_FAIL: break; } break; } DEBUG("Clean up partially decoded structure"); ASN_STRUCT_FREE(*pduType, structure); new_offset = DynamicBuffer.bytes_shifted + DynamicBuffer.offset; /* * Print a message and return failure only if not EOF, * unless this is our first PDU (empty file). */ if(on_first_pdu || DynamicBuffer.length || new_offset - old_offset > ((iform == INP_XER)?sizeof("\r\n")-1:0) ) { #ifdef JUNKTEST /* * Nothing's wrong with being unable to decode junk. * Simulate EOF. */ if(opt_jprob != 0.0) { junk_failures++; errno = 0; return 0; } #endif DEBUG("ofp %d, no=%ld, oo=%ld, dbl=%ld", on_first_pdu, (long)new_offset, (long)old_offset, (long)DynamicBuffer.length); fprintf(stderr, "%s: " "Decode failed past byte %ld: %s\n", name, (long)new_offset, (rval.code == RC_WMORE) ? "Unexpected end of input" : "Input processing error"); #ifndef ENOMSG #define ENOMSG EINVAL #endif #ifndef EBADMSG #define EBADMSG EINVAL #endif errno = (rval.code == RC_WMORE) ? ENOMSG : EBADMSG; } else { /* Got EOF after a few successful PDUs */ errno = 0; } return 0; } /* Dump the buffer out to the specified FILE */ static int write_out(const void *buffer, size_t size, void *key) { FILE *fp = (FILE *)key; return (fwrite(buffer, 1, size, fp) == size) ? 0 : -1; } static int argument_is_stdin(char *av[], int idx) { if(strcmp(av[idx], "-")) { return 0; /* Certainly not */ } else { /* This might be , unless `./program -- -` */ if(strcmp(av[-1], "--")) return 1; else return 0; } } static FILE *argument_to_file(char *av[], int idx) { return argument_is_stdin(av, idx) ? stdin : fopen(av[idx], "r"); } static char *argument_to_name(char *av[], int idx) { return argument_is_stdin(av, idx) ? "standard input" : av[idx]; } #ifdef JUNKTEST /* * Fill bytes with some garbage with specified probability (more or less). */ static void junk_bytes_with_probability(uint8_t *buf, size_t size, double prob) { static int junkmode; uint8_t *ptr; uint8_t *end; if(opt_jprob <= 0.0) return; for(ptr = buf, end = ptr + size; ptr < end; ptr++) { int byte = *ptr; if(junkmode++ & 1) { if((((double)random() / RAND_MAX) < prob)) byte = random() & 0xff; } else { #define BPROB(b) ((((double)random() / RAND_MAX) < prob) ? b : 0) byte ^= BPROB(0x80); byte ^= BPROB(0x40); byte ^= BPROB(0x20); byte ^= BPROB(0x10); byte ^= BPROB(0x08); byte ^= BPROB(0x04); byte ^= BPROB(0x02); byte ^= BPROB(0x01); } if(byte != *ptr) { DEBUG("Junk buf[%d] %02x -> %02x", ptr - buf, *ptr, byte); *ptr = byte; } } } #endif /* JUNKTEST */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/der_encoder.c000066400000000000000000000116451305042567700231060ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include static ssize_t der_write_TL(ber_tlv_tag_t tag, ber_tlv_len_t len, asn_app_consume_bytes_f *cb, void *app_key, int constructed); /* * The DER encoder of any type. */ asn_enc_rval_t der_encode(asn_TYPE_descriptor_t *type_descriptor, void *struct_ptr, asn_app_consume_bytes_f *consume_bytes, void *app_key) { ASN_DEBUG("DER encoder invoked for %s", type_descriptor->name); /* * Invoke type-specific encoder. */ return type_descriptor->der_encoder(type_descriptor, struct_ptr, /* Pointer to the destination structure */ 0, 0, consume_bytes, app_key); } /* * Argument type and callback necessary for der_encode_to_buffer(). */ typedef struct enc_to_buf_arg { void *buffer; size_t left; } enc_to_buf_arg; static int encode_to_buffer_cb(const void *buffer, size_t size, void *key) { enc_to_buf_arg *arg = (enc_to_buf_arg *)key; if(arg->left < size) return -1; /* Data exceeds the available buffer size */ memcpy(arg->buffer, buffer, size); arg->buffer = ((char *)arg->buffer) + size; arg->left -= size; return 0; } /* * A variant of the der_encode() which encodes the data into the provided buffer */ asn_enc_rval_t der_encode_to_buffer(asn_TYPE_descriptor_t *type_descriptor, void *struct_ptr, void *buffer, size_t buffer_size) { enc_to_buf_arg arg; asn_enc_rval_t ec; arg.buffer = buffer; arg.left = buffer_size; ec = type_descriptor->der_encoder(type_descriptor, struct_ptr, /* Pointer to the destination structure */ 0, 0, encode_to_buffer_cb, &arg); if(ec.encoded != -1) { assert(ec.encoded == (ssize_t)(buffer_size - arg.left)); /* Return the encoded contents size */ } return ec; } /* * Write out leading TL[v] sequence according to the type definition. */ ssize_t der_write_tags(asn_TYPE_descriptor_t *sd, size_t struct_length, int tag_mode, int last_tag_form, ber_tlv_tag_t tag, /* EXPLICIT or IMPLICIT tag */ asn_app_consume_bytes_f *cb, void *app_key) { ber_tlv_tag_t *tags; /* Copy of tags stream */ int tags_count; /* Number of tags */ size_t overall_length; ssize_t *lens; int i; ASN_DEBUG("Writing tags (%s, tm=%d, tc=%d, tag=%s, mtc=%d)", sd->name, tag_mode, sd->tags_count, ber_tlv_tag_string(tag), tag_mode ?(sd->tags_count+1 -((tag_mode == -1) && sd->tags_count)) :sd->tags_count ); if(tag_mode) { /* * Instead of doing shaman dance like we do in ber_check_tags(), * allocate a small array on the stack * and initialize it appropriately. */ int stag_offset; tags = (ber_tlv_tag_t *)alloca((sd->tags_count + 1) * sizeof(ber_tlv_tag_t)); if(!tags) { /* Can fail on !x86 */ errno = ENOMEM; return -1; } tags_count = sd->tags_count + 1 /* EXPLICIT or IMPLICIT tag is given */ - ((tag_mode == -1) && sd->tags_count); /* Copy tags over */ tags[0] = tag; stag_offset = -1 + ((tag_mode == -1) && sd->tags_count); for(i = 1; i < tags_count; i++) tags[i] = sd->tags[i + stag_offset]; } else { tags = sd->tags; tags_count = sd->tags_count; } /* No tags to write */ if(tags_count == 0) return 0; lens = (ssize_t *)alloca(tags_count * sizeof(lens[0])); if(!lens) { errno = ENOMEM; return -1; } /* * Array of tags is initialized. * Now, compute the size of the TLV pairs, from right to left. */ overall_length = struct_length; for(i = tags_count - 1; i >= 0; --i) { lens[i] = der_write_TL(tags[i], overall_length, 0, 0, 0); if(lens[i] == -1) return -1; overall_length += lens[i]; lens[i] = overall_length - lens[i]; } if(!cb) return overall_length - struct_length; ASN_DEBUG("%s %s TL sequence (%d elements)", cb?"Encoding":"Estimating", sd->name, tags_count); /* * Encode the TL sequence for real. */ for(i = 0; i < tags_count; i++) { ssize_t len; int _constr; /* Check if this tag happens to be constructed */ _constr = (last_tag_form || i < (tags_count - 1)); len = der_write_TL(tags[i], lens[i], cb, app_key, _constr); if(len == -1) return -1; } return overall_length - struct_length; } static ssize_t der_write_TL(ber_tlv_tag_t tag, ber_tlv_len_t len, asn_app_consume_bytes_f *cb, void *app_key, int constructed) { uint8_t buf[32]; size_t size = 0; int buf_size = cb?sizeof(buf):0; ssize_t tmp; /* Serialize tag (T from TLV) into possibly zero-length buffer */ tmp = ber_tlv_tag_serialize(tag, buf, buf_size); if(tmp == -1 || tmp > (ssize_t)sizeof(buf)) return -1; size += tmp; /* Serialize length (L from TLV) into possibly zero-length buffer */ tmp = der_tlv_length_serialize(len, buf+size, buf_size?buf_size-size:0); if(tmp == -1) return -1; size += tmp; if(size > sizeof(buf)) return -1; /* * If callback is specified, invoke it, and check its return value. */ if(cb) { if(constructed) *buf |= 0x20; if(cb(buf, size, app_key) < 0) return -1; } return size; } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/der_encoder.h000066400000000000000000000036311305042567700231070ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _DER_ENCODER_H_ #define _DER_ENCODER_H_ #include #ifdef __cplusplus extern "C" { #endif struct asn_TYPE_descriptor_s; /* Forward declaration */ /* * The DER encoder of any type. May be invoked by the application. * The ber_decode() function (ber_decoder.h) is an opposite of der_encode(). */ asn_enc_rval_t der_encode(struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, /* Structure to be encoded */ asn_app_consume_bytes_f *consume_bytes_cb, void *app_key /* Arbitrary callback argument */ ); /* A variant of der_encode() which encodes data into the pre-allocated buffer */ asn_enc_rval_t der_encode_to_buffer( struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, /* Structure to be encoded */ void *buffer, /* Pre-allocated buffer */ size_t buffer_size /* Initial buffer size (maximum) */ ); /* * Type of the generic DER encoder. */ typedef asn_enc_rval_t (der_type_encoder_f)( struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, /* Structure to be encoded */ int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ ber_tlv_tag_t tag, asn_app_consume_bytes_f *consume_bytes_cb, /* Callback */ void *app_key /* Arbitrary callback argument */ ); /******************************* * INTERNALLY USEFUL FUNCTIONS * *******************************/ /* * Write out leading TL[v] sequence according to the type definition. */ ssize_t der_write_tags( struct asn_TYPE_descriptor_s *type_descriptor, size_t struct_length, int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ int last_tag_form, /* {0,!0}: prim, constructed */ ber_tlv_tag_t tag, asn_app_consume_bytes_f *consume_bytes_cb, void *app_key ); #ifdef __cplusplus } #endif #endif /* _DER_ENCODER_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/per_decoder.c000066400000000000000000000047521305042567700231110ustar00rootroot00000000000000#include #include #include /* * Decode a "Production of a complete encoding", X.691#10.1. * The complete encoding contains at least one byte, and is an integral * multiple of 8 bytes. */ asn_dec_rval_t uper_decode_complete(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const void *buffer, size_t size) { asn_dec_rval_t rval; rval = uper_decode(opt_codec_ctx, td, sptr, buffer, size, 0, 0); if(rval.consumed) { /* * We've always given 8-aligned data, * so convert bits to integral bytes. */ rval.consumed += 7; rval.consumed >>= 3; } else if(rval.code == RC_OK) { if(size) { if(((uint8_t *)buffer)[0] == 0) { rval.consumed = 1; /* 1 byte */ } else { ASN_DEBUG("Expecting single zeroed byte"); rval.code = RC_FAIL; } } else { /* Must contain at least 8 bits. */ rval.code = RC_WMORE; } } return rval; } asn_dec_rval_t uper_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const void *buffer, size_t size, int skip_bits, int unused_bits) { asn_codec_ctx_t s_codec_ctx; asn_dec_rval_t rval; asn_per_data_t pd; if(skip_bits < 0 || skip_bits > 7 || unused_bits < 0 || unused_bits > 7 || (unused_bits > 0 && !size)) _ASN_DECODE_FAILED; /* * Stack checker requires that the codec context * must be allocated on the stack. */ if(opt_codec_ctx) { if(opt_codec_ctx->max_stack_size) { s_codec_ctx = *opt_codec_ctx; opt_codec_ctx = &s_codec_ctx; } } else { /* If context is not given, be security-conscious anyway */ memset(&s_codec_ctx, 0, sizeof(s_codec_ctx)); s_codec_ctx.max_stack_size = _ASN_DEFAULT_STACK_MAX; opt_codec_ctx = &s_codec_ctx; } /* Fill in the position indicator */ memset(&pd, 0, sizeof(pd)); pd.buffer = (const uint8_t *)buffer; pd.nboff = skip_bits; pd.nbits = 8 * size - unused_bits; /* 8 is CHAR_BIT from */ if(pd.nboff > pd.nbits) _ASN_DECODE_FAILED; /* * Invoke type-specific decoder. */ if(!td->uper_decoder) _ASN_DECODE_FAILED; /* PER is not compiled in */ rval = td->uper_decoder(opt_codec_ctx, td, 0, sptr, &pd); if(rval.code == RC_OK) { /* Return the number of consumed bits */ rval.consumed = ((pd.buffer - (const uint8_t *)buffer) << 3) + pd.nboff - skip_bits; ASN_DEBUG("PER decoding consumed %d, counted %d", rval.consumed, pd.moved); assert(rval.consumed == pd.moved); } else { /* PER codec is not a restartable */ rval.consumed = 0; } return rval; } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/per_decoder.h000066400000000000000000000033001305042567700231020ustar00rootroot00000000000000/*- * Copyright (c) 2005, 2007 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _PER_DECODER_H_ #define _PER_DECODER_H_ #include #include #ifdef __cplusplus extern "C" { #endif struct asn_TYPE_descriptor_s; /* Forward declaration */ /* * Unaligned PER decoder of a "complete encoding" as per X.691#10.1. * On success, this call always returns (.consumed >= 1), as per X.691#10.1.3. */ asn_dec_rval_t uper_decode_complete(struct asn_codec_ctx_s *opt_codec_ctx, struct asn_TYPE_descriptor_s *type_descriptor, /* Type to decode */ void **struct_ptr, /* Pointer to a target structure's pointer */ const void *buffer, /* Data to be decoded */ size_t size /* Size of data buffer */ ); /* * Unaligned PER decoder of any ASN.1 type. May be invoked by the application. * WARNING: This call returns the number of BITS read from the stream. Beware. */ asn_dec_rval_t uper_decode(struct asn_codec_ctx_s *opt_codec_ctx, struct asn_TYPE_descriptor_s *type_descriptor, /* Type to decode */ void **struct_ptr, /* Pointer to a target structure's pointer */ const void *buffer, /* Data to be decoded */ size_t size, /* Size of data buffer */ int skip_bits, /* Number of unused leading bits, 0..7 */ int unused_bits /* Number of unused tailing bits, 0..7 */ ); /* * Type of the type-specific PER decoder function. */ typedef asn_dec_rval_t (per_type_decoder_f)(asn_codec_ctx_t *opt_codec_ctx, struct asn_TYPE_descriptor_s *type_descriptor, asn_per_constraints_t *constraints, void **struct_ptr, asn_per_data_t *per_data ); #ifdef __cplusplus } #endif #endif /* _PER_DECODER_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/per_encoder.c000066400000000000000000000071561305042567700231240ustar00rootroot00000000000000#include #include #include static asn_enc_rval_t uper_encode_internal(asn_TYPE_descriptor_t *td, asn_per_constraints_t *, void *sptr, asn_app_consume_bytes_f *cb, void *app_key); asn_enc_rval_t uper_encode(asn_TYPE_descriptor_t *td, void *sptr, asn_app_consume_bytes_f *cb, void *app_key) { return uper_encode_internal(td, 0, sptr, cb, app_key); } /* * Argument type and callback necessary for uper_encode_to_buffer(). */ typedef struct enc_to_buf_arg { void *buffer; size_t left; } enc_to_buf_arg; static int encode_to_buffer_cb(const void *buffer, size_t size, void *key) { enc_to_buf_arg *arg = (enc_to_buf_arg *)key; if(arg->left < size) return -1; /* Data exceeds the available buffer size */ memcpy(arg->buffer, buffer, size); arg->buffer = ((char *)arg->buffer) + size; arg->left -= size; return 0; } asn_enc_rval_t uper_encode_to_buffer(asn_TYPE_descriptor_t *td, void *sptr, void *buffer, size_t buffer_size) { enc_to_buf_arg key; key.buffer = buffer; key.left = buffer_size; if(td) ASN_DEBUG("Encoding \"%s\" using UNALIGNED PER", td->name); return uper_encode_internal(td, 0, sptr, encode_to_buffer_cb, &key); } typedef struct enc_dyn_arg { void *buffer; size_t length; size_t allocated; } enc_dyn_arg; static int encode_dyn_cb(const void *buffer, size_t size, void *key) { enc_dyn_arg *arg = key; if(arg->length + size >= arg->allocated) { void *p; arg->allocated = arg->allocated ? (arg->allocated << 2) : size; p = REALLOC(arg->buffer, arg->allocated); if(!p) { FREEMEM(arg->buffer); memset(arg, 0, sizeof(*arg)); return -1; } arg->buffer = p; } memcpy(((char *)arg->buffer) + arg->length, buffer, size); arg->length += size; return 0; } ssize_t uper_encode_to_new_buffer(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, void **buffer_r) { asn_enc_rval_t er; enc_dyn_arg key; memset(&key, 0, sizeof(key)); er = uper_encode_internal(td, constraints, sptr, encode_dyn_cb, &key); switch(er.encoded) { case -1: FREEMEM(key.buffer); return -1; case 0: FREEMEM(key.buffer); key.buffer = MALLOC(1); if(key.buffer) { *(char *)key.buffer = '\0'; *buffer_r = key.buffer; return 1; } else { return -1; } default: *buffer_r = key.buffer; ASN_DEBUG("Complete encoded in %d bits", er.encoded); return ((er.encoded + 7) >> 3); } } /* * Internally useful functions. */ /* Flush partially filled buffer */ static int _uper_encode_flush_outp(asn_per_outp_t *po) { uint8_t *buf; if(po->nboff == 0 && po->buffer == po->tmpspace) return 0; buf = po->buffer + (po->nboff >> 3); /* Make sure we account for the last, partially filled */ if(po->nboff & 0x07) { buf[0] &= 0xff << (8 - (po->nboff & 0x07)); buf++; } return po->outper(po->tmpspace, buf - po->tmpspace, po->op_key); } static asn_enc_rval_t uper_encode_internal(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_app_consume_bytes_f *cb, void *app_key) { asn_per_outp_t po; asn_enc_rval_t er; /* * Invoke type-specific encoder. */ if(!td || !td->uper_encoder) _ASN_ENCODE_FAILED; /* PER is not compiled in */ po.buffer = po.tmpspace; po.nboff = 0; po.nbits = 8 * sizeof(po.tmpspace); po.outper = cb; po.op_key = app_key; po.flushed_bytes = 0; er = td->uper_encoder(td, constraints, sptr, &po); if(er.encoded != -1) { size_t bits_to_flush; bits_to_flush = ((po.buffer - po.tmpspace) << 3) + po.nboff; /* Set number of bits encoded to a firm value */ er.encoded = (po.flushed_bytes << 3) + bits_to_flush; if(_uper_encode_flush_outp(&po)) _ASN_ENCODE_FAILED; } return er; } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/per_encoder.h000066400000000000000000000041771305042567700231310ustar00rootroot00000000000000/*- * Copyright (c) 2006, 2007 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _PER_ENCODER_H_ #define _PER_ENCODER_H_ #include #include #ifdef __cplusplus extern "C" { #endif struct asn_TYPE_descriptor_s; /* Forward declaration */ /* * Unaligned PER encoder of any ASN.1 type. May be invoked by the application. * WARNING: This function returns the number of encoded bits in the .encoded * field of the return value. Use the following formula to convert to bytes: * bytes = ((.encoded + 7) / 8) */ asn_enc_rval_t uper_encode(struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, /* Structure to be encoded */ asn_app_consume_bytes_f *consume_bytes_cb, /* Data collector */ void *app_key /* Arbitrary callback argument */ ); /* * A variant of uper_encode() which encodes data into the existing buffer * WARNING: This function returns the number of encoded bits in the .encoded * field of the return value. */ asn_enc_rval_t uper_encode_to_buffer( struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, /* Structure to be encoded */ void *buffer, /* Pre-allocated buffer */ size_t buffer_size /* Initial buffer size (max) */ ); /* * A variant of uper_encode_to_buffer() which allocates buffer itself. * Returns the number of bytes in the buffer or -1 in case of failure. * WARNING: This function produces a "Production of the complete encoding", * with length of at least one octet. Contrast this to precise bit-packing * encoding of uper_encode() and uper_encode_to_buffer(). */ ssize_t uper_encode_to_new_buffer( struct asn_TYPE_descriptor_s *type_descriptor, asn_per_constraints_t *constraints, void *struct_ptr, /* Structure to be encoded */ void **buffer_r /* Buffer allocated and returned */ ); /* * Type of the generic PER encoder function. */ typedef asn_enc_rval_t (per_type_encoder_f)( struct asn_TYPE_descriptor_s *type_descriptor, asn_per_constraints_t *constraints, void *struct_ptr, asn_per_outp_t *per_output ); #ifdef __cplusplus } #endif #endif /* _PER_ENCODER_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/per_opentype.c000066400000000000000000000216731305042567700233500ustar00rootroot00000000000000/* * Copyright (c) 2007 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include #include typedef struct uper_ugot_key { asn_per_data_t oldpd; /* Old per data source */ size_t unclaimed; size_t ot_moved; /* Number of bits moved by OT processing */ int repeat; } uper_ugot_key; static int uper_ugot_refill(asn_per_data_t *pd); static int per_skip_bits(asn_per_data_t *pd, int skip_nbits); static asn_dec_rval_t uper_sot_suck(asn_codec_ctx_t *, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd); int asn_debug_indent; /* * Encode an "open type field". * #10.1, #10.2 */ int uper_open_type_put(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { void *buf; void *bptr; ssize_t size; size_t toGo; ASN_DEBUG("Open type put %s ...", td->name); size = uper_encode_to_new_buffer(td, constraints, sptr, &buf); if(size <= 0) return -1; for(bptr = buf, toGo = size; toGo;) { ssize_t maySave = uper_put_length(po, toGo); if(maySave < 0) break; if(per_put_many_bits(po, bptr, maySave * 8)) break; bptr = (char *)bptr + maySave; toGo -= maySave; } FREEMEM(buf); if(toGo) return -1; ASN_DEBUG("Open type put %s of length %d + overhead (1byte?)", td->name, size); return 0; } static asn_dec_rval_t uper_open_type_get_simple(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { asn_dec_rval_t rv; ssize_t chunk_bytes; int repeat; uint8_t *buf = 0; size_t bufLen = 0; size_t bufSize = 0; asn_per_data_t spd; size_t padding; _ASN_STACK_OVERFLOW_CHECK(ctx); ASN_DEBUG("Getting open type %s...", td->name); do { chunk_bytes = uper_get_length(pd, -1, &repeat); if(chunk_bytes < 0) { FREEMEM(buf); _ASN_DECODE_STARVED; } if(bufLen + chunk_bytes > bufSize) { void *ptr; bufSize = chunk_bytes + (bufSize << 2); ptr = REALLOC(buf, bufSize); if(!ptr) { FREEMEM(buf); _ASN_DECODE_FAILED; } buf = ptr; } if(per_get_many_bits(pd, buf + bufLen, 0, chunk_bytes << 3)) { FREEMEM(buf); _ASN_DECODE_STARVED; } bufLen += chunk_bytes; } while(repeat); ASN_DEBUG("Getting open type %s encoded in %d bytes", td->name, bufLen); memset(&spd, 0, sizeof(spd)); spd.buffer = buf; spd.nbits = bufLen << 3; asn_debug_indent += 4; rv = td->uper_decoder(ctx, td, constraints, sptr, &spd); asn_debug_indent -= 4; if(rv.code == RC_OK) { /* Check padding validity */ padding = spd.nbits - spd.nboff; if(padding < 8 && per_get_few_bits(&spd, padding) == 0) { /* Everything is cool */ FREEMEM(buf); return rv; } FREEMEM(buf); if(padding >= 8) { ASN_DEBUG("Too large padding %d in open type", padding); _ASN_DECODE_FAILED; } else { ASN_DEBUG("Non-zero padding"); _ASN_DECODE_FAILED; } } else { FREEMEM(buf); /* rv.code could be RC_WMORE, nonsense in this context */ rv.code = RC_FAIL; /* Noone would give us more */ } return rv; } static asn_dec_rval_t GCC_NOTUSED uper_open_type_get_complex(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { uper_ugot_key arg; asn_dec_rval_t rv; ssize_t padding; _ASN_STACK_OVERFLOW_CHECK(ctx); ASN_DEBUG("Getting open type %s from %s", td->name, per_data_string(pd)); arg.oldpd = *pd; arg.unclaimed = 0; arg.ot_moved = 0; arg.repeat = 1; pd->refill = uper_ugot_refill; pd->refill_key = &arg; pd->nbits = pd->nboff; /* 0 good bits at this point, will refill */ pd->moved = 0; /* This now counts the open type size in bits */ asn_debug_indent += 4; rv = td->uper_decoder(ctx, td, constraints, sptr, pd); asn_debug_indent -= 4; #define UPDRESTOREPD do { \ /* buffer and nboff are valid, preserve them. */ \ pd->nbits = arg.oldpd.nbits - (pd->moved - arg.ot_moved); \ pd->moved = arg.oldpd.moved + (pd->moved - arg.ot_moved); \ pd->refill = arg.oldpd.refill; \ pd->refill_key = arg.oldpd.refill_key; \ } while(0) if(rv.code != RC_OK) { UPDRESTOREPD; return rv; } ASN_DEBUG("OpenType %s pd%s old%s unclaimed=%d, repeat=%d" , td->name, per_data_string(pd), per_data_string(&arg.oldpd), arg.unclaimed, arg.repeat); padding = pd->moved % 8; if(padding) { int32_t pvalue; if(padding > 7) { ASN_DEBUG("Too large padding %d in open type", padding); rv.code = RC_FAIL; UPDRESTOREPD; return rv; } padding = 8 - padding; ASN_DEBUG("Getting padding of %d bits", padding); pvalue = per_get_few_bits(pd, padding); switch(pvalue) { case -1: ASN_DEBUG("Padding skip failed"); UPDRESTOREPD; _ASN_DECODE_STARVED; case 0: break; default: ASN_DEBUG("Non-blank padding (%d bits 0x%02x)", padding, (int)pvalue); UPDRESTOREPD; _ASN_DECODE_FAILED; } } if(pd->nboff != pd->nbits) { ASN_DEBUG("Open type %s overhead pd%s old%s", td->name, per_data_string(pd), per_data_string(&arg.oldpd)); if(1) { UPDRESTOREPD; _ASN_DECODE_FAILED; } else { arg.unclaimed += pd->nbits - pd->nboff; } } /* Adjust pd back so it points to original data */ UPDRESTOREPD; /* Skip data not consumed by the decoder */ if(arg.unclaimed) ASN_DEBUG("Getting unclaimed %d", arg.unclaimed); if(arg.unclaimed) { switch(per_skip_bits(pd, arg.unclaimed)) { case -1: ASN_DEBUG("Claim of %d failed", arg.unclaimed); _ASN_DECODE_STARVED; case 0: ASN_DEBUG("Got claim of %d", arg.unclaimed); break; default: /* Padding must be blank */ ASN_DEBUG("Non-blank unconsumed padding"); _ASN_DECODE_FAILED; } arg.unclaimed = 0; } if(arg.repeat) { ASN_DEBUG("Not consumed the whole thing"); rv.code = RC_FAIL; return rv; } return rv; } asn_dec_rval_t uper_open_type_get(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { return uper_open_type_get_simple(ctx, td, constraints, sptr, pd); } int uper_open_type_skip(asn_codec_ctx_t *ctx, asn_per_data_t *pd) { asn_TYPE_descriptor_t s_td; asn_dec_rval_t rv; s_td.name = ""; s_td.uper_decoder = uper_sot_suck; rv = uper_open_type_get(ctx, &s_td, 0, 0, pd); if(rv.code != RC_OK) return -1; else return 0; } /* * Internal functions. */ static asn_dec_rval_t uper_sot_suck(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { asn_dec_rval_t rv; (void)ctx; (void)td; (void)constraints; (void)sptr; while(per_get_few_bits(pd, 24) >= 0); rv.code = RC_OK; rv.consumed = pd->moved; return rv; } static int uper_ugot_refill(asn_per_data_t *pd) { uper_ugot_key *arg = pd->refill_key; ssize_t next_chunk_bytes, next_chunk_bits; ssize_t avail; asn_per_data_t *oldpd = &arg->oldpd; ASN_DEBUG("REFILLING pd->moved=%d, oldpd->moved=%d", pd->moved, oldpd->moved); /* Advance our position to where pd is */ oldpd->buffer = pd->buffer; oldpd->nboff = pd->nboff; oldpd->nbits -= pd->moved - arg->ot_moved; oldpd->moved += pd->moved - arg->ot_moved; arg->ot_moved = pd->moved; if(arg->unclaimed) { /* Refill the container */ if(per_get_few_bits(oldpd, 1)) return -1; if(oldpd->nboff == 0) { assert(0); return -1; } pd->buffer = oldpd->buffer; pd->nboff = oldpd->nboff - 1; pd->nbits = oldpd->nbits; ASN_DEBUG("UNCLAIMED <- return from (pd->moved=%d)", pd->moved); return 0; } if(!arg->repeat) { ASN_DEBUG("Want more but refill doesn't have it"); return -1; } next_chunk_bytes = uper_get_length(oldpd, -1, &arg->repeat); ASN_DEBUG("Open type LENGTH %d bytes at off %d, repeat %d", next_chunk_bytes, oldpd->moved, arg->repeat); if(next_chunk_bytes < 0) return -1; if(next_chunk_bytes == 0) { pd->refill = 0; /* No more refills, naturally */ assert(!arg->repeat); /* Implementation guarantee */ } next_chunk_bits = next_chunk_bytes << 3; avail = oldpd->nbits - oldpd->nboff; if(avail >= next_chunk_bits) { pd->nbits = oldpd->nboff + next_chunk_bits; arg->unclaimed = 0; ASN_DEBUG("!+Parent frame %d bits, alloting %d [%d..%d] (%d)", next_chunk_bits, oldpd->moved, oldpd->nboff, oldpd->nbits, oldpd->nbits - oldpd->nboff); } else { pd->nbits = oldpd->nbits; arg->unclaimed = next_chunk_bits - avail; ASN_DEBUG("!-Parent frame %d, require %d, will claim %d", avail, next_chunk_bits, arg->unclaimed); } pd->buffer = oldpd->buffer; pd->nboff = oldpd->nboff; ASN_DEBUG("Refilled pd%s old%s", per_data_string(pd), per_data_string(oldpd)); return 0; } static int per_skip_bits(asn_per_data_t *pd, int skip_nbits) { int hasNonZeroBits = 0; while(skip_nbits > 0) { int skip; if(skip_nbits < skip) skip = skip_nbits; else skip = 24; skip_nbits -= skip; switch(per_get_few_bits(pd, skip)) { case -1: return -1; /* Starving */ case 0: continue; /* Skipped empty space */ default: hasNonZeroBits = 1; continue; } } return hasNonZeroBits; } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/per_opentype.h000066400000000000000000000012321305042567700233420ustar00rootroot00000000000000/* * Copyright (c) 2007 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _PER_OPENTYPE_H_ #define _PER_OPENTYPE_H_ #ifdef __cplusplus extern "C" { #endif asn_dec_rval_t uper_open_type_get(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd); int uper_open_type_skip(asn_codec_ctx_t *opt_codec_ctx, asn_per_data_t *pd); int uper_open_type_put(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po); #ifdef __cplusplus } #endif #endif /* _PER_OPENTYPE_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/per_support.c000066400000000000000000000231231305042567700232110ustar00rootroot00000000000000/* * Copyright (c) 2005, 2006, 2007 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include char * per_data_string(asn_per_data_t *pd) { static char buf[2][32]; static int n; n = (n+1) % 2; snprintf(buf[n], sizeof(buf), "{m=%d span %+d[%d..%d] (%d)}", pd->moved, (((int)pd->buffer) & 0xf), pd->nboff, pd->nbits, pd->nbits - pd->nboff); return buf[n]; } void per_get_undo(asn_per_data_t *pd, int nbits) { if((ssize_t)pd->nboff < nbits) { assert((ssize_t)pd->nboff < nbits); } else { pd->nboff -= nbits; pd->moved -= nbits; } } /* * Extract a small number of bits (<= 31) from the specified PER data pointer. */ int32_t per_get_few_bits(asn_per_data_t *pd, int nbits) { size_t off; /* Next after last bit offset */ ssize_t nleft; /* Number of bits left in this stream */ uint32_t accum; const uint8_t *buf; if(nbits < 0) return -1; nleft = pd->nbits - pd->nboff; if(nbits > nleft) { int32_t tailv, vhead; if(!pd->refill || nbits > 31) return -1; /* Accumulate unused bytes before refill */ ASN_DEBUG("Obtain the rest %d bits (want %d)", nleft, nbits); tailv = per_get_few_bits(pd, nleft); if(tailv < 0) return -1; /* Refill (replace pd contents with new data) */ if(pd->refill(pd)) return -1; nbits -= nleft; vhead = per_get_few_bits(pd, nbits); /* Combine the rest of previous pd with the head of new one */ tailv = (tailv << nbits) | vhead; /* Could == -1 */ return tailv; } /* * Normalize position indicator. */ if(pd->nboff >= 8) { pd->buffer += (pd->nboff >> 3); pd->nbits -= (pd->nboff & ~0x07); pd->nboff &= 0x07; } pd->moved += nbits; pd->nboff += nbits; off = pd->nboff; buf = pd->buffer; /* * Extract specified number of bits. */ if(off <= 8) accum = nbits ? (buf[0]) >> (8 - off) : 0; else if(off <= 16) accum = ((buf[0] << 8) + buf[1]) >> (16 - off); else if(off <= 24) accum = ((buf[0] << 16) + (buf[1] << 8) + buf[2]) >> (24 - off); else if(off <= 31) accum = ((buf[0] << 24) + (buf[1] << 16) + (buf[2] << 8) + (buf[3])) >> (32 - off); else if(nbits <= 31) { asn_per_data_t tpd = *pd; /* Here are we with our 31-bits limit plus 1..7 bits offset. */ per_get_undo(&tpd, nbits); /* The number of available bits in the stream allow * for the following operations to take place without * invoking the ->refill() function */ accum = per_get_few_bits(&tpd, nbits - 24) << 24; accum |= per_get_few_bits(&tpd, 24); } else { per_get_undo(pd, nbits); return -1; } accum &= (((uint32_t)1 << nbits) - 1); ASN_DEBUG(" [PER got %2d<=%2d bits => span %d %+d[%d..%d]:%02x (%d) => 0x%x]", nbits, nleft, pd->moved, (((int)pd->buffer) & 0xf), pd->nboff, pd->nbits, pd->buffer[0], pd->nbits - pd->nboff, (int)accum); return accum; } /* * Extract a large number of bits from the specified PER data pointer. */ int per_get_many_bits(asn_per_data_t *pd, uint8_t *dst, int alright, int nbits) { int32_t value; if(alright && (nbits & 7)) { /* Perform right alignment of a first few bits */ value = per_get_few_bits(pd, nbits & 0x07); if(value < 0) return -1; *dst++ = value; /* value is already right-aligned */ nbits &= ~7; } while(nbits) { if(nbits >= 24) { value = per_get_few_bits(pd, 24); if(value < 0) return -1; *(dst++) = value >> 16; *(dst++) = value >> 8; *(dst++) = value; nbits -= 24; } else { value = per_get_few_bits(pd, nbits); if(value < 0) return -1; if(nbits & 7) { /* implies left alignment */ value <<= 8 - (nbits & 7), nbits += 8 - (nbits & 7); if(nbits > 24) *dst++ = value >> 24; } if(nbits > 16) *dst++ = value >> 16; if(nbits > 8) *dst++ = value >> 8; *dst++ = value; break; } } return 0; } /* * Get the length "n" from the stream. */ ssize_t uper_get_length(asn_per_data_t *pd, int ebits, int *repeat) { ssize_t value; *repeat = 0; if(ebits >= 0) return per_get_few_bits(pd, ebits); value = per_get_few_bits(pd, 8); if(value < 0) return -1; if((value & 128) == 0) /* #10.9.3.6 */ return (value & 0x7F); if((value & 64) == 0) { /* #10.9.3.7 */ value = ((value & 63) << 8) | per_get_few_bits(pd, 8); if(value < 0) return -1; return value; } value &= 63; /* this is "m" from X.691, #10.9.3.8 */ if(value < 1 || value > 4) return -1; *repeat = 1; return (16384 * value); } /* * Get the normally small length "n". * This procedure used to decode length of extensions bit-maps * for SET and SEQUENCE types. */ ssize_t uper_get_nslength(asn_per_data_t *pd) { ssize_t length; ASN_DEBUG("Getting normally small length"); if(per_get_few_bits(pd, 1) == 0) { length = per_get_few_bits(pd, 6) + 1; if(length <= 0) return -1; ASN_DEBUG("l=%d", length); return length; } else { int repeat; length = uper_get_length(pd, -1, &repeat); if(length >= 0 && !repeat) return length; return -1; /* Error, or do not support >16K extensions */ } } /* * Get the normally small non-negative whole number. * X.691, #10.6 */ ssize_t uper_get_nsnnwn(asn_per_data_t *pd) { ssize_t value; value = per_get_few_bits(pd, 7); if(value & 64) { /* implicit (value < 0) */ value &= 63; value <<= 2; value |= per_get_few_bits(pd, 2); if(value & 128) /* implicit (value < 0) */ return -1; if(value == 0) return 0; if(value >= 3) return -1; value = per_get_few_bits(pd, 8 * value); return value; } return value; } /* * Put the normally small non-negative whole number. * X.691, #10.6 */ int uper_put_nsnnwn(asn_per_outp_t *po, int n) { int bytes; if(n <= 63) { if(n < 0) return -1; return per_put_few_bits(po, n, 7); } if(n < 256) bytes = 1; else if(n < 65536) bytes = 2; else if(n < 256 * 65536) bytes = 3; else return -1; /* This is not a "normally small" value */ if(per_put_few_bits(po, bytes, 8)) return -1; return per_put_few_bits(po, n, 8 * bytes); } /* * Put a small number of bits (<= 31). */ int per_put_few_bits(asn_per_outp_t *po, uint32_t bits, int obits) { size_t off; /* Next after last bit offset */ size_t omsk; /* Existing last byte meaningful bits mask */ uint8_t *buf; if(obits <= 0 || obits >= 32) return obits ? -1 : 0; ASN_DEBUG("[PER put %d bits %x to %p+%d bits]", obits, (int)bits, po->buffer, po->nboff); /* * Normalize position indicator. */ if(po->nboff >= 8) { po->buffer += (po->nboff >> 3); po->nbits -= (po->nboff & ~0x07); po->nboff &= 0x07; } /* * Flush whole-bytes output, if necessary. */ if(po->nboff + obits > po->nbits) { int complete_bytes = (po->buffer - po->tmpspace); ASN_DEBUG("[PER output %d complete + %d]", complete_bytes, po->flushed_bytes); if(po->outper(po->tmpspace, complete_bytes, po->op_key) < 0) return -1; if(po->nboff) po->tmpspace[0] = po->buffer[0]; po->buffer = po->tmpspace; po->nbits = 8 * sizeof(po->tmpspace); po->flushed_bytes += complete_bytes; } /* * Now, due to sizeof(tmpspace), we are guaranteed large enough space. */ buf = po->buffer; omsk = ~((1 << (8 - po->nboff)) - 1); off = (po->nboff += obits); /* Clear data of debris before meaningful bits */ bits &= (((uint32_t)1 << obits) - 1); ASN_DEBUG("[PER out %d %u/%x (t=%d,o=%d) %x&%x=%x]", obits, (int)bits, (int)bits, po->nboff - obits, off, buf[0], omsk&0xff, buf[0] & omsk); if(off <= 8) /* Completely within 1 byte */ bits <<= (8 - off), buf[0] = (buf[0] & omsk) | bits; else if(off <= 16) bits <<= (16 - off), buf[0] = (buf[0] & omsk) | (bits >> 8), buf[1] = bits; else if(off <= 24) bits <<= (24 - off), buf[0] = (buf[0] & omsk) | (bits >> 16), buf[1] = bits >> 8, buf[2] = bits; else if(off <= 31) bits <<= (32 - off), buf[0] = (buf[0] & omsk) | (bits >> 24), buf[1] = bits >> 16, buf[2] = bits >> 8, buf[3] = bits; else { ASN_DEBUG("->[PER out split %d]", obits); per_put_few_bits(po, bits >> 8, 24); per_put_few_bits(po, bits, obits - 24); ASN_DEBUG("<-[PER out split %d]", obits); } ASN_DEBUG("[PER out %u/%x => %02x buf+%d]", (int)bits, (int)bits, buf[0], po->buffer - po->tmpspace); return 0; } /* * Output a large number of bits. */ int per_put_many_bits(asn_per_outp_t *po, const uint8_t *src, int nbits) { while(nbits) { uint32_t value; if(nbits >= 24) { value = (src[0] << 16) | (src[1] << 8) | src[2]; src += 3; nbits -= 24; if(per_put_few_bits(po, value, 24)) return -1; } else { value = src[0]; if(nbits > 8) value = (value << 8) | src[1]; if(nbits > 16) value = (value << 8) | src[2]; if(nbits & 0x07) value >>= (8 - (nbits & 0x07)); if(per_put_few_bits(po, value, nbits)) return -1; break; } } return 0; } /* * Put the length "n" (or part of it) into the stream. */ ssize_t uper_put_length(asn_per_outp_t *po, size_t length) { if(length <= 127) /* #10.9.3.6 */ return per_put_few_bits(po, length, 8) ? -1 : (ssize_t)length; else if(length < 16384) /* #10.9.3.7 */ return per_put_few_bits(po, length|0x8000, 16) ? -1 : (ssize_t)length; length >>= 14; if(length > 4) length = 4; return per_put_few_bits(po, 0xC0 | length, 8) ? -1 : (ssize_t)(length << 14); } /* * Put the normally small length "n" into the stream. * This procedure used to encode length of extensions bit-maps * for SET and SEQUENCE types. */ int uper_put_nslength(asn_per_outp_t *po, size_t length) { if(length <= 64) { /* #10.9.3.4 */ if(length == 0) return -1; return per_put_few_bits(po, length-1, 7) ? -1 : 0; } else { if(uper_put_length(po, length) != (ssize_t)length) { /* This might happen in case of >16K extensions */ return -1; } } return 0; } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/per_support.h000066400000000000000000000075411305042567700232240ustar00rootroot00000000000000/* * Copyright (c) 2005, 2006, 2007 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _PER_SUPPORT_H_ #define _PER_SUPPORT_H_ #include /* Platform-specific types */ #ifdef __cplusplus extern "C" { #endif /* * Pre-computed PER constraints. */ typedef struct asn_per_constraint_s { enum asn_per_constraint_flags { APC_UNCONSTRAINED = 0x0, /* No PER visible constraints */ APC_SEMI_CONSTRAINED = 0x1, /* Constrained at "lb" */ APC_CONSTRAINED = 0x2, /* Fully constrained */ APC_EXTENSIBLE = 0x4 /* May have extension */ } flags; int range_bits; /* Full number of bits in the range */ int effective_bits; /* Effective bits */ long lower_bound; /* "lb" value */ long upper_bound; /* "ub" value */ } asn_per_constraint_t; typedef struct asn_per_constraints_s { asn_per_constraint_t value; asn_per_constraint_t size; int (*value2code)(unsigned int value); int (*code2value)(unsigned int code); } asn_per_constraints_t; /* * This structure describes a position inside an incoming PER bit stream. */ typedef struct asn_per_data_s { const uint8_t *buffer; /* Pointer to the octet stream */ size_t nboff; /* Bit offset to the meaningful bit */ size_t nbits; /* Number of bits in the stream */ size_t moved; /* Number of bits moved through this bit stream */ int (*refill)(struct asn_per_data_s *); void *refill_key; } asn_per_data_t; /* * Extract a small number of bits (<= 31) from the specified PER data pointer. * This function returns -1 if the specified number of bits could not be * extracted due to EOD or other conditions. */ int32_t per_get_few_bits(asn_per_data_t *per_data, int get_nbits); /* Undo the immediately preceeding "get_few_bits" operation */ void per_get_undo(asn_per_data_t *per_data, int get_nbits); /* * Extract a large number of bits from the specified PER data pointer. * This function returns -1 if the specified number of bits could not be * extracted due to EOD or other conditions. */ int per_get_many_bits(asn_per_data_t *pd, uint8_t *dst, int right_align, int get_nbits); /* * Get the length "n" from the Unaligned PER stream. */ ssize_t uper_get_length(asn_per_data_t *pd, int effective_bound_bits, int *repeat); /* * Get the normally small length "n". */ ssize_t uper_get_nslength(asn_per_data_t *pd); /* * Get the normally small non-negative whole number. */ ssize_t uper_get_nsnnwn(asn_per_data_t *pd); /* Non-thread-safe debugging function, don't use it */ char *per_data_string(asn_per_data_t *pd); /* * This structure supports forming PER output. */ typedef struct asn_per_outp_s { uint8_t *buffer; /* Pointer into the (tmpspace) */ size_t nboff; /* Bit offset to the meaningful bit */ size_t nbits; /* Number of bits left in (tmpspace) */ uint8_t tmpspace[32]; /* Preliminary storage to hold data */ int (*outper)(const void *data, size_t size, void *op_key); void *op_key; /* Key for (outper) data callback */ size_t flushed_bytes; /* Bytes already flushed through (outper) */ } asn_per_outp_t; /* Output a small number of bits (<= 31) */ int per_put_few_bits(asn_per_outp_t *per_data, uint32_t bits, int obits); /* Output a large number of bits */ int per_put_many_bits(asn_per_outp_t *po, const uint8_t *src, int put_nbits); /* * Put the length "n" to the Unaligned PER stream. * This function returns the number of units which may be flushed * in the next units saving iteration. */ ssize_t uper_put_length(asn_per_outp_t *po, size_t whole_length); /* * Put the normally small length "n" to the Unaligned PER stream. * Returns 0 or -1. */ int uper_put_nslength(asn_per_outp_t *po, size_t length); /* * Put the normally small non-negative whole number. */ int uper_put_nsnnwn(asn_per_outp_t *po, int n); #ifdef __cplusplus } #endif #endif /* _PER_SUPPORT_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/xer_decoder.c000066400000000000000000000210141305042567700231070ustar00rootroot00000000000000/* * Copyright (c) 2004, 2005 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include /* XER/XML parsing support */ /* * Decode the XER encoding of a given type. */ asn_dec_rval_t xer_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **struct_ptr, const void *buffer, size_t size) { asn_codec_ctx_t s_codec_ctx; /* * Stack checker requires that the codec context * must be allocated on the stack. */ if(opt_codec_ctx) { if(opt_codec_ctx->max_stack_size) { s_codec_ctx = *opt_codec_ctx; opt_codec_ctx = &s_codec_ctx; } } else { /* If context is not given, be security-conscious anyway */ memset(&s_codec_ctx, 0, sizeof(s_codec_ctx)); s_codec_ctx.max_stack_size = _ASN_DEFAULT_STACK_MAX; opt_codec_ctx = &s_codec_ctx; } /* * Invoke type-specific decoder. */ return td->xer_decoder(opt_codec_ctx, td, struct_ptr, 0, buffer, size); } struct xer__cb_arg { pxml_chunk_type_e chunk_type; size_t chunk_size; const void *chunk_buf; int callback_not_invoked; }; static int xer__token_cb(pxml_chunk_type_e type, const void *_chunk_data, size_t _chunk_size, void *key) { struct xer__cb_arg *arg = (struct xer__cb_arg *)key; arg->chunk_type = type; arg->chunk_size = _chunk_size; arg->chunk_buf = _chunk_data; arg->callback_not_invoked = 0; return -1; /* Terminate the XML parsing */ } /* * Fetch the next token from the XER/XML stream. */ ssize_t xer_next_token(int *stateContext, const void *buffer, size_t size, pxer_chunk_type_e *ch_type) { struct xer__cb_arg arg; int new_stateContext = *stateContext; ssize_t ret; arg.callback_not_invoked = 1; ret = pxml_parse(&new_stateContext, buffer, size, xer__token_cb, &arg); if(ret < 0) return -1; if(arg.callback_not_invoked) { assert(ret == 0); /* No data was consumed */ return 0; /* Try again with more data */ } else { assert(arg.chunk_size); assert(arg.chunk_buf == buffer); } /* * Translate the XML chunk types into more convenient ones. */ switch(arg.chunk_type) { case PXML_TEXT: *ch_type = PXER_TEXT; break; case PXML_TAG: return 0; /* Want more */ case PXML_TAG_END: *ch_type = PXER_TAG; break; case PXML_COMMENT: case PXML_COMMENT_END: *ch_type = PXER_COMMENT; break; } *stateContext = new_stateContext; return arg.chunk_size; } #define CSLASH 0x2f /* '/' */ #define LANGLE 0x3c /* '<' */ #define RANGLE 0x3e /* '>' */ xer_check_tag_e xer_check_tag(const void *buf_ptr, int size, const char *need_tag) { const char *buf = (const char *)buf_ptr; const char *end; xer_check_tag_e ct = XCT_OPENING; if(size < 2 || buf[0] != LANGLE || buf[size-1] != RANGLE) { if(size >= 2) ASN_DEBUG("Broken XML tag: \"%c...%c\"", buf[0], buf[size - 1]); return XCT_BROKEN; } /* * Determine the tag class. */ if(buf[1] == CSLASH) { buf += 2; /* advance past "" */ ct = XCT_CLOSING; if(size > 0 && buf[size-1] == CSLASH) return XCT_BROKEN; /* */ } else { buf++; /* advance past "<" */ size -= 2; /* strip "<" and ">" */ if(size > 0 && buf[size-1] == CSLASH) { ct = XCT_BOTH; size--; /* One more, for "/" */ } } /* Sometimes we don't care about the tag */ if(!need_tag || !*need_tag) return (xer_check_tag_e)(XCT__UNK__MASK | ct); /* * Determine the tag name. */ for(end = buf + size; buf < end; buf++, need_tag++) { int b = *buf, n = *need_tag; if(b != n) { if(n == 0) { switch(b) { case 0x09: case 0x0a: case 0x0c: case 0x0d: case 0x20: /* "": whitespace is normal */ return ct; } } return (xer_check_tag_e)(XCT__UNK__MASK | ct); } if(b == 0) return XCT_BROKEN; /* Embedded 0 in buf?! */ } if(*need_tag) return (xer_check_tag_e)(XCT__UNK__MASK | ct); return ct; } #undef ADVANCE #define ADVANCE(num_bytes) do { \ size_t num = (num_bytes); \ buf_ptr = ((const char *)buf_ptr) + num; \ size -= num; \ consumed_myself += num; \ } while(0) #undef RETURN #define RETURN(_code) do { \ rval.code = _code; \ rval.consumed = consumed_myself; \ if(rval.code != RC_OK) \ ASN_DEBUG("Failed with %d", rval.code); \ return rval; \ } while(0) #define XER_GOT_BODY(chunk_buf, chunk_size, size) do { \ ssize_t converted_size = body_receiver \ (struct_key, chunk_buf, chunk_size, \ (size_t)chunk_size < size); \ if(converted_size == -1) RETURN(RC_FAIL); \ if(converted_size == 0 \ && size == (size_t)chunk_size) \ RETURN(RC_WMORE); \ chunk_size = converted_size; \ } while(0) #define XER_GOT_EMPTY() do { \ if(body_receiver(struct_key, 0, 0, size > 0) == -1) \ RETURN(RC_FAIL); \ } while(0) /* * Generalized function for decoding the primitive values. */ asn_dec_rval_t xer_decode_general(asn_codec_ctx_t *opt_codec_ctx, asn_struct_ctx_t *ctx, /* Type decoder context */ void *struct_key, const char *xml_tag, /* Expected XML tag */ const void *buf_ptr, size_t size, int (*opt_unexpected_tag_decoder) (void *struct_key, const void *chunk_buf, size_t chunk_size), ssize_t (*body_receiver) (void *struct_key, const void *chunk_buf, size_t chunk_size, int have_more) ) { asn_dec_rval_t rval; ssize_t consumed_myself = 0; (void)opt_codec_ctx; /* * Phases of XER/XML processing: * Phase 0: Check that the opening tag matches our expectations. * Phase 1: Processing body and reacting on closing tag. */ if(ctx->phase > 1) RETURN(RC_FAIL); for(;;) { pxer_chunk_type_e ch_type; /* XER chunk type */ ssize_t ch_size; /* Chunk size */ xer_check_tag_e tcv; /* Tag check value */ /* * Get the next part of the XML stream. */ ch_size = xer_next_token(&ctx->context, buf_ptr, size, &ch_type); switch(ch_size) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); default: switch(ch_type) { case PXER_COMMENT: /* Got XML comment */ ADVANCE(ch_size); /* Skip silently */ continue; case PXER_TEXT: if(ctx->phase == 0) { /* * We have to ignore whitespace here, * but in order to be forward compatible * with EXTENDED-XER (EMBED-VALUES, #25) * any text is just ignored here. */ } else { XER_GOT_BODY(buf_ptr, ch_size, size); } ADVANCE(ch_size); continue; case PXER_TAG: break; /* Check the rest down there */ } } assert(ch_type == PXER_TAG && size); tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); /* * Phase 0: * Expecting the opening tag * for the type being processed. * Phase 1: * Waiting for the closing XML tag. */ switch(tcv) { case XCT_BOTH: if(ctx->phase) break; /* Finished decoding of an empty element */ XER_GOT_EMPTY(); ADVANCE(ch_size); ctx->phase = 2; /* Phase out */ RETURN(RC_OK); case XCT_OPENING: if(ctx->phase) break; ADVANCE(ch_size); ctx->phase = 1; /* Processing body phase */ continue; case XCT_CLOSING: if(!ctx->phase) break; ADVANCE(ch_size); ctx->phase = 2; /* Phase out */ RETURN(RC_OK); case XCT_UNKNOWN_BO: /* * Certain tags in the body may be expected. */ if(opt_unexpected_tag_decoder && opt_unexpected_tag_decoder(struct_key, buf_ptr, ch_size) >= 0) { /* Tag's processed fine */ ADVANCE(ch_size); if(!ctx->phase) { /* We are not expecting * the closing tag anymore. */ ctx->phase = 2; /* Phase out */ RETURN(RC_OK); } continue; } /* Fall through */ default: break; /* Unexpected tag */ } ASN_DEBUG("Unexpected XML tag (expected \"%s\")", xml_tag); break; /* Dark and mysterious things have just happened */ } RETURN(RC_FAIL); } int xer_is_whitespace(const void *chunk_buf, size_t chunk_size) { const char *p = (const char *)chunk_buf; const char *pend = p + chunk_size; for(; p < pend; p++) { switch(*p) { /* X.693, #8.1.4 * HORISONTAL TAB (9) * LINE FEED (10) * CARRIAGE RETURN (13) * SPACE (32) */ case 0x09: case 0x0a: case 0x0d: case 0x20: break; default: return 0; } } return 1; /* All whitespace */ } /* * This is a vastly simplified, non-validating XML tree skipper. */ int xer_skip_unknown(xer_check_tag_e tcv, ber_tlv_len_t *depth) { assert(*depth > 0); switch(tcv) { case XCT_BOTH: case XCT_UNKNOWN_BO: /* These negate each other. */ return 0; case XCT_OPENING: case XCT_UNKNOWN_OP: ++(*depth); return 0; case XCT_CLOSING: case XCT_UNKNOWN_CL: if(--(*depth) == 0) return (tcv == XCT_CLOSING) ? 2 : 1; return 0; default: return -1; } } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/xer_decoder.h000066400000000000000000000064101305042567700231170ustar00rootroot00000000000000/*- * Copyright (c) 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _XER_DECODER_H_ #define _XER_DECODER_H_ #include #ifdef __cplusplus extern "C" { #endif struct asn_TYPE_descriptor_s; /* Forward declaration */ /* * The XER decoder of any ASN.1 type. May be invoked by the application. */ asn_dec_rval_t xer_decode(struct asn_codec_ctx_s *opt_codec_ctx, struct asn_TYPE_descriptor_s *type_descriptor, void **struct_ptr, /* Pointer to a target structure's pointer */ const void *buffer, /* Data to be decoded */ size_t size /* Size of data buffer */ ); /* * Type of the type-specific XER decoder function. */ typedef asn_dec_rval_t (xer_type_decoder_f)(asn_codec_ctx_t *opt_codec_ctx, struct asn_TYPE_descriptor_s *type_descriptor, void **struct_ptr, const char *opt_mname, /* Member name */ const void *buf_ptr, size_t size ); /******************************* * INTERNALLY USEFUL FUNCTIONS * *******************************/ /* * Generalized function for decoding the primitive values. * Used by more specialized functions, such as OCTET_STRING_decode_xer_utf8 * and others. This function should not be used by applications, as its API * is subject to changes. */ asn_dec_rval_t xer_decode_general(asn_codec_ctx_t *opt_codec_ctx, asn_struct_ctx_t *ctx, /* Type decoder context */ void *struct_key, /* Treated as opaque pointer */ const char *xml_tag, /* Expected XML tag name */ const void *buf_ptr, size_t size, int (*opt_unexpected_tag_decoder) (void *struct_key, const void *chunk_buf, size_t chunk_size), ssize_t (*body_receiver) (void *struct_key, const void *chunk_buf, size_t chunk_size, int have_more) ); /* * Fetch the next XER (XML) token from the stream. * The function returns the number of bytes occupied by the chunk type, * returned in the _ch_type. The _ch_type is only set (and valid) when * the return value is greater than 0. */ typedef enum pxer_chunk_type { PXER_TAG, /* Complete XER tag */ PXER_TEXT, /* Plain text between XER tags */ PXER_COMMENT /* A comment, may be part of */ } pxer_chunk_type_e; ssize_t xer_next_token(int *stateContext, const void *buffer, size_t size, pxer_chunk_type_e *_ch_type); /* * This function checks the buffer against the tag name is expected to occur. */ typedef enum xer_check_tag { XCT_BROKEN = 0, /* The tag is broken */ XCT_OPENING = 1, /* This is the tag */ XCT_CLOSING = 2, /* This is the tag */ XCT_BOTH = 3, /* This is the tag */ XCT__UNK__MASK = 4, /* Mask of everything unexpected */ XCT_UNKNOWN_OP = 5, /* Unexpected tag */ XCT_UNKNOWN_CL = 6, /* Unexpected tag */ XCT_UNKNOWN_BO = 7 /* Unexpected tag */ } xer_check_tag_e; xer_check_tag_e xer_check_tag(const void *buf_ptr, int size, const char *need_tag); /* * Check whether this buffer consists of entirely XER whitespace characters. * RETURN VALUES: * 1: Whitespace or empty string * 0: Non-whitespace */ int xer_is_whitespace(const void *chunk_buf, size_t chunk_size); /* * Skip the series of anticipated extensions. */ int xer_skip_unknown(xer_check_tag_e tcv, ber_tlv_len_t *depth); #ifdef __cplusplus } #endif #endif /* _XER_DECODER_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/xer_encoder.c000066400000000000000000000030051305042567700231210ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include /* * The XER encoder of any type. May be invoked by the application. */ asn_enc_rval_t xer_encode(asn_TYPE_descriptor_t *td, void *sptr, enum xer_encoder_flags_e xer_flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t er, tmper; const char *mname; size_t mlen; int xcan = (xer_flags & XER_F_CANONICAL) ? 1 : 2; if(!td || !sptr) goto cb_failed; mname = td->xml_tag; mlen = strlen(mname); _ASN_CALLBACK3("<", 1, mname, mlen, ">", 1); tmper = td->xer_encoder(td, sptr, 1, xer_flags, cb, app_key); if(tmper.encoded == -1) return tmper; _ASN_CALLBACK3("\n", xcan); er.encoded = 4 + xcan + (2 * mlen) + tmper.encoded; _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } /* * This is a helper function for xer_fprint, which directs all incoming data * into the provided file descriptor. */ static int xer__print2fp(const void *buffer, size_t size, void *app_key) { FILE *stream = (FILE *)app_key; if(fwrite(buffer, 1, size, stream) != size) return -1; return 0; } int xer_fprint(FILE *stream, asn_TYPE_descriptor_t *td, void *sptr) { asn_enc_rval_t er; if(!stream) stream = stdout; if(!td || !sptr) return -1; er = xer_encode(td, sptr, XER_F_BASIC, xer__print2fp, stream); if(er.encoded == -1) return -1; return fflush(stream); } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/xer_encoder.h000066400000000000000000000032411305042567700231300ustar00rootroot00000000000000/*- * Copyright (c) 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _XER_ENCODER_H_ #define _XER_ENCODER_H_ #include #ifdef __cplusplus extern "C" { #endif struct asn_TYPE_descriptor_s; /* Forward declaration */ /* Flags used by the xer_encode() and (*xer_type_encoder_f), defined below */ enum xer_encoder_flags_e { /* Mode of encoding */ XER_F_BASIC = 0x01, /* BASIC-XER (pretty-printing) */ XER_F_CANONICAL = 0x02 /* Canonical XER (strict rules) */ }; /* * The XER encoder of any type. May be invoked by the application. */ asn_enc_rval_t xer_encode(struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, /* Structure to be encoded */ enum xer_encoder_flags_e xer_flags, asn_app_consume_bytes_f *consume_bytes_cb, void *app_key /* Arbitrary callback argument */ ); /* * The variant of the above function which dumps the BASIC-XER (XER_F_BASIC) * output into the chosen file pointer. * RETURN VALUES: * 0: The structure is printed. * -1: Problem printing the structure. * WARNING: No sensible errno value is returned. */ int xer_fprint(FILE *stream, struct asn_TYPE_descriptor_s *td, void *sptr); /* * Type of the generic XER encoder. */ typedef asn_enc_rval_t (xer_type_encoder_f)( struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, /* Structure to be encoded */ int ilevel, /* Level of indentation */ enum xer_encoder_flags_e xer_flags, asn_app_consume_bytes_f *consume_bytes_cb, /* Callback */ void *app_key /* Arbitrary callback argument */ ); #ifdef __cplusplus } #endif #endif /* _XER_ENCODER_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/xer_support.c000066400000000000000000000126551305042567700232310ustar00rootroot00000000000000/* * Copyright (c) 2003, 2004 X/IO Labs, xiolabs.com. * Copyright (c) 2003, 2004, 2005 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include /* Parser states */ typedef enum { ST_TEXT, ST_TAG_START, ST_TAG_BODY, ST_TAG_QUOTE_WAIT, ST_TAG_QUOTED_STRING, ST_TAG_UNQUOTED_STRING, ST_COMMENT_WAIT_DASH1, /* ""[0] */ ST_COMMENT_CLO_RT /* "-->"[1] */ } pstate_e; static pxml_chunk_type_e final_chunk_type[] = { PXML_TEXT, PXML_TAG_END, PXML_COMMENT_END, PXML_TAG_END, PXML_COMMENT_END, }; static int _charclass[256] = { 0,0,0,0,0,0,0,0, 0,1,1,0,1,1,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 2,2,2,2,2,2,2,2, 2,2,0,0,0,0,0,0, /* 01234567 89 */ 0,3,3,3,3,3,3,3, 3,3,3,3,3,3,3,3, /* ABCDEFG HIJKLMNO */ 3,3,3,3,3,3,3,3, 3,3,3,0,0,0,0,0, /* PQRSTUVW XYZ */ 0,3,3,3,3,3,3,3, 3,3,3,3,3,3,3,3, /* abcdefg hijklmno */ 3,3,3,3,3,3,3,3, 3,3,3,0,0,0,0,0 /* pqrstuvw xyz */ }; #define WHITESPACE(c) (_charclass[(unsigned char)(c)] == 1) #define ALNUM(c) (_charclass[(unsigned char)(c)] >= 2) #define ALPHA(c) (_charclass[(unsigned char)(c)] == 3) /* Aliases for characters, ASCII/UTF-8 */ #define EXCLAM 0x21 /* '!' */ #define CQUOTE 0x22 /* '"' */ #define CDASH 0x2d /* '-' */ #define CSLASH 0x2f /* '/' */ #define LANGLE 0x3c /* '<' */ #define CEQUAL 0x3d /* '=' */ #define RANGLE 0x3e /* '>' */ #define CQUEST 0x3f /* '?' */ /* Invoke token callback */ #define TOKEN_CB_CALL(type, _ns, _current_too, _final) do { \ int _ret; \ pstate_e ns = _ns; \ ssize_t _sz = (p - chunk_start) + _current_too; \ if (!_sz) { \ /* Shortcut */ \ state = _ns; \ break; \ } \ _ret = cb(type, chunk_start, _sz, key); \ if(_ret < _sz) { \ if(_current_too && _ret == -1) \ state = ns; \ goto finish; \ } \ chunk_start = p + _current_too; \ state = ns; \ } while(0) #define TOKEN_CB(_type, _ns, _current_too) \ TOKEN_CB_CALL(_type, _ns, _current_too, 0) #define TOKEN_CB_FINAL(_type, _ns, _current_too) \ TOKEN_CB_CALL(final_chunk_type[_type], _ns, _current_too, 1) /* * Parser itself */ ssize_t pxml_parse(int *stateContext, const void *xmlbuf, size_t size, pxml_callback_f *cb, void *key) { pstate_e state = (pstate_e)*stateContext; const char *chunk_start = (const char *)xmlbuf; const char *p = chunk_start; const char *end = p + size; for(; p < end; p++) { int C = *(const unsigned char *)p; switch(state) { case ST_TEXT: /* * Initial state: we're in the middle of some text, * or just have started. */ if (C == LANGLE) /* We're now in the tag, probably */ TOKEN_CB(PXML_TEXT, ST_TAG_START, 0); break; case ST_TAG_START: if (ALPHA(C) || (C == CSLASH)) state = ST_TAG_BODY; else if (C == EXCLAM) state = ST_COMMENT_WAIT_DASH1; else /* * Not characters and not whitespace. * Must be something like "3 < 4". */ TOKEN_CB(PXML_TEXT, ST_TEXT, 1);/* Flush as data */ break; case ST_TAG_BODY: switch(C) { case RANGLE: /* End of the tag */ TOKEN_CB_FINAL(PXML_TAG, ST_TEXT, 1); break; case LANGLE: /* * The previous tag wasn't completed, but still * recognized as valid. (Mozilla-compatible) */ TOKEN_CB_FINAL(PXML_TAG, ST_TAG_START, 0); break; case CEQUAL: state = ST_TAG_QUOTE_WAIT; break; } break; case ST_TAG_QUOTE_WAIT: /* * State after the equal sign ("=") in the tag. */ switch(C) { case CQUOTE: state = ST_TAG_QUOTED_STRING; break; case RANGLE: /* End of the tag */ TOKEN_CB_FINAL(PXML_TAG, ST_TEXT, 1); break; default: if(!WHITESPACE(C)) /* Unquoted string value */ state = ST_TAG_UNQUOTED_STRING; } break; case ST_TAG_QUOTED_STRING: /* * Tag attribute's string value in quotes. */ if(C == CQUOTE) { /* Return back to the tag state */ state = ST_TAG_BODY; } break; case ST_TAG_UNQUOTED_STRING: if(C == RANGLE) { /* End of the tag */ TOKEN_CB_FINAL(PXML_TAG, ST_TEXT, 1); } else if(WHITESPACE(C)) { /* Return back to the tag state */ state = ST_TAG_BODY; } break; case ST_COMMENT_WAIT_DASH1: if(C == CDASH) { state = ST_COMMENT_WAIT_DASH2; } else { /* Some ordinary tag. */ state = ST_TAG_BODY; } break; case ST_COMMENT_WAIT_DASH2: if(C == CDASH) { /* Seen "<--" */ state = ST_COMMENT; } else { /* Some ordinary tag */ state = ST_TAG_BODY; } break; case ST_COMMENT: if(C == CDASH) { state = ST_COMMENT_CLO_DASH2; } break; case ST_COMMENT_CLO_DASH2: if(C == CDASH) { state = ST_COMMENT_CLO_RT; } else { /* This is not an end of a comment */ state = ST_COMMENT; } break; case ST_COMMENT_CLO_RT: if(C == RANGLE) { TOKEN_CB_FINAL(PXML_COMMENT, ST_TEXT, 1); } else if(C == CDASH) { /* Maintain current state, still waiting for '>' */ } else { state = ST_COMMENT; } break; } /* switch(*ptr) */ } /* for() */ /* * Flush the partially processed chunk, state permitting. */ if(p - chunk_start) { switch (state) { case ST_COMMENT: TOKEN_CB(PXML_COMMENT, state, 0); break; case ST_TEXT: TOKEN_CB(PXML_TEXT, state, 0); break; default: break; /* a no-op */ } } finish: *stateContext = (int)state; return chunk_start - (const char *)xmlbuf; } gnss-sdr-0.0.9/src/core/libs/supl/asn-rrlp/xer_support.h000066400000000000000000000034241305042567700232300ustar00rootroot00000000000000/* * Copyright (c) 2003, 2004 X/IO Labs, xiolabs.com. * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _XER_SUPPORT_H_ #define _XER_SUPPORT_H_ #include /* Platform-specific types */ #ifdef __cplusplus extern "C" { #endif /* * Types of data transferred to the application. */ typedef enum { PXML_TEXT, /* Plain text between XML tags. */ PXML_TAG, /* A tag, starting with '<'. */ PXML_COMMENT, /* An XML comment, including "". */ /* * The following chunk types are reported if the chunk * terminates the specified XML element. */ PXML_TAG_END, /* Tag ended */ PXML_COMMENT_END /* Comment ended */ } pxml_chunk_type_e; /* * Callback function that is called by the parser when parsed data is * available. The _opaque is the pointer to a field containing opaque user * data specified in pxml_create() call. The chunk type is _type and the text * data is the piece of buffer identified by _bufid (as supplied to * pxml_feed() call) starting at offset _offset and of _size bytes size. * The chunk is NOT '\0'-terminated. */ typedef int (pxml_callback_f)(pxml_chunk_type_e _type, const void *_chunk_data, size_t _chunk_size, void *_key); /* * Parse the given buffer as it were a chunk of XML data. * Invoke the specified callback each time the meaninful data is found. * This function returns number of bytes consumed from the bufer. * It will always be lesser than or equal to the specified _size. * The next invocation of this function must account the difference. */ ssize_t pxml_parse(int *_stateContext, const void *_buf, size_t _size, pxml_callback_f *cb, void *_key); #ifdef __cplusplus } #endif #endif /* _XER_SUPPORT_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/000077500000000000000000000000001305042567700204665ustar00rootroot00000000000000gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/AltitudeInfo.c000066400000000000000000000221371305042567700232260ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "AltitudeInfo.h" static int altitudeDirection_2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { /* Replace with underlying type checker */ td->check_constraints = asn_DEF_ENUMERATED.check_constraints; return td->check_constraints(td, sptr, ctfailcb, app_key); } /* * This type is implemented using ENUMERATED, * so here we adjust the DEF accordingly. */ static void altitudeDirection_2_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_ENUMERATED.free_struct; td->print_struct = asn_DEF_ENUMERATED.print_struct; td->ber_decoder = asn_DEF_ENUMERATED.ber_decoder; td->der_encoder = asn_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; td->uper_encoder = asn_DEF_ENUMERATED.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_ENUMERATED.per_constraints; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ } static void altitudeDirection_2_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { altitudeDirection_2_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } static int altitudeDirection_2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { altitudeDirection_2_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } static asn_dec_rval_t altitudeDirection_2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { altitudeDirection_2_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } static asn_enc_rval_t altitudeDirection_2_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { altitudeDirection_2_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } static asn_dec_rval_t altitudeDirection_2_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { altitudeDirection_2_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } static asn_enc_rval_t altitudeDirection_2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { altitudeDirection_2_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } static asn_dec_rval_t altitudeDirection_2_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { altitudeDirection_2_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } static asn_enc_rval_t altitudeDirection_2_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { altitudeDirection_2_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static int memb_altitude_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 32767)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_altUncertainty_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_type_altitudeDirection_constr_2 = { { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_altitude_constr_5 = { { APC_CONSTRAINED, 15, 15, 0, 32767 } /* (0..32767) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_altUncertainty_constr_6 = { { APC_CONSTRAINED, 7, 7, 0, 127 } /* (0..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_INTEGER_enum_map_t asn_MAP_altitudeDirection_value2enum_2[] = { { 0, 6, "height" }, { 1, 5, "depth" } }; static unsigned int asn_MAP_altitudeDirection_enum2value_2[] = { 1, /* depth(1) */ 0 /* height(0) */ }; static asn_INTEGER_specifics_t asn_SPC_altitudeDirection_specs_2 = { asn_MAP_altitudeDirection_value2enum_2, /* "tag" => N; sorted by tag */ asn_MAP_altitudeDirection_enum2value_2, /* N => "tag"; sorted by N */ 2, /* Number of elements in the maps */ 0, /* Enumeration is not extensible */ 1, /* Strict enumeration */ 0, /* Native long size */ 0 }; static ber_tlv_tag_t asn_DEF_altitudeDirection_tags_2[] = { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_altitudeDirection_2 = { "altitudeDirection", "altitudeDirection", altitudeDirection_2_free, altitudeDirection_2_print, altitudeDirection_2_constraint, altitudeDirection_2_decode_ber, altitudeDirection_2_encode_der, altitudeDirection_2_decode_xer, altitudeDirection_2_encode_xer, altitudeDirection_2_decode_uper, altitudeDirection_2_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_altitudeDirection_tags_2, sizeof(asn_DEF_altitudeDirection_tags_2) /sizeof(asn_DEF_altitudeDirection_tags_2[0]) - 1, /* 1 */ asn_DEF_altitudeDirection_tags_2, /* Same as above */ sizeof(asn_DEF_altitudeDirection_tags_2) /sizeof(asn_DEF_altitudeDirection_tags_2[0]), /* 2 */ &asn_PER_type_altitudeDirection_constr_2, 0, 0, /* Defined elsewhere */ &asn_SPC_altitudeDirection_specs_2 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_AltitudeInfo_1[] = { { ATF_NOFLAGS, 0, offsetof(struct AltitudeInfo, altitudeDirection), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_altitudeDirection_2, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "altitudeDirection" }, { ATF_NOFLAGS, 0, offsetof(struct AltitudeInfo, altitude), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_altitude_constraint_1, &asn_PER_memb_altitude_constr_5, 0, "altitude" }, { ATF_NOFLAGS, 0, offsetof(struct AltitudeInfo, altUncertainty), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_altUncertainty_constraint_1, &asn_PER_memb_altUncertainty_constr_6, 0, "altUncertainty" }, }; static ber_tlv_tag_t asn_DEF_AltitudeInfo_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_AltitudeInfo_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* altitudeDirection at 86 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* altitude at 87 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* altUncertainty at 88 */ }; static asn_SEQUENCE_specifics_t asn_SPC_AltitudeInfo_specs_1 = { sizeof(struct AltitudeInfo), offsetof(struct AltitudeInfo, _asn_ctx), asn_MAP_AltitudeInfo_tag2el_1, 3, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ 2, /* Start extensions */ 4 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_AltitudeInfo = { "AltitudeInfo", "AltitudeInfo", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_AltitudeInfo_tags_1, sizeof(asn_DEF_AltitudeInfo_tags_1) /sizeof(asn_DEF_AltitudeInfo_tags_1[0]), /* 1 */ asn_DEF_AltitudeInfo_tags_1, /* Same as above */ sizeof(asn_DEF_AltitudeInfo_tags_1) /sizeof(asn_DEF_AltitudeInfo_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_AltitudeInfo_1, 3, /* Elements count */ &asn_SPC_AltitudeInfo_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/AltitudeInfo.h000066400000000000000000000020551305042567700232300ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _AltitudeInfo_H_ #define _AltitudeInfo_H_ #include /* Including external dependencies */ #include #include #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum altitudeDirection { altitudeDirection_height = 0, altitudeDirection_depth = 1 } e_altitudeDirection; /* AltitudeInfo */ typedef struct AltitudeInfo { ENUMERATED_t altitudeDirection; long altitude; long altUncertainty; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } AltitudeInfo_t; /* Implementation */ /* extern asn_TYPE_descriptor_t asn_DEF_altitudeDirection_2; // (Use -fall-defs-global to expose) */ extern asn_TYPE_descriptor_t asn_DEF_AltitudeInfo; #ifdef __cplusplus } #endif #endif /* _AltitudeInfo_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/BIT_STRING.c000066400000000000000000000107401305042567700223400ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include /* * BIT STRING basic type description. */ static ber_tlv_tag_t asn_DEF_BIT_STRING_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)) }; static asn_OCTET_STRING_specifics_t asn_DEF_BIT_STRING_specs = { sizeof(BIT_STRING_t), offsetof(BIT_STRING_t, _asn_ctx), ASN_OSUBV_BIT }; asn_TYPE_descriptor_t asn_DEF_BIT_STRING = { "BIT STRING", "BIT_STRING", OCTET_STRING_free, /* Implemented in terms of OCTET STRING */ BIT_STRING_print, BIT_STRING_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ OCTET_STRING_decode_xer_binary, BIT_STRING_encode_xer, OCTET_STRING_decode_uper, /* Unaligned PER decoder */ OCTET_STRING_encode_uper, /* Unaligned PER encoder */ 0, /* Use generic outmost tag fetcher */ asn_DEF_BIT_STRING_tags, sizeof(asn_DEF_BIT_STRING_tags) / sizeof(asn_DEF_BIT_STRING_tags[0]), asn_DEF_BIT_STRING_tags, /* Same as above */ sizeof(asn_DEF_BIT_STRING_tags) / sizeof(asn_DEF_BIT_STRING_tags[0]), 0, /* No PER visible constraints */ 0, 0, /* No members */ &asn_DEF_BIT_STRING_specs }; /* * BIT STRING generic constraint. */ int BIT_STRING_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; if(st && st->buf) { if((st->size == 0 && st->bits_unused) || st->bits_unused < 0 || st->bits_unused > 7) { _ASN_CTFAIL(app_key, td, sptr, "%s: invalid padding byte (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } else { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } return 0; } static char *_bit_pattern[16] = { "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111" }; asn_enc_rval_t BIT_STRING_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t er; char scratch[128]; char *p = scratch; char *scend = scratch + (sizeof(scratch) - 10); const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; int xcan = (flags & XER_F_CANONICAL); uint8_t *buf; uint8_t *end; if(!st || !st->buf) _ASN_ENCODE_FAILED; er.encoded = 0; buf = st->buf; end = buf + st->size - 1; /* Last byte is special */ /* * Binary dump */ for(; buf < end; buf++) { int v = *buf; int nline = xcan?0:(((buf - st->buf) % 8) == 0); if(p >= scend || nline) { er.encoded += p - scratch; _ASN_CALLBACK(scratch, p - scratch); p = scratch; if(nline) _i_ASN_TEXT_INDENT(1, ilevel); } memcpy(p + 0, _bit_pattern[v >> 4], 4); memcpy(p + 4, _bit_pattern[v & 0x0f], 4); p += 8; } if(!xcan && ((buf - st->buf) % 8) == 0) _i_ASN_TEXT_INDENT(1, ilevel); er.encoded += p - scratch; _ASN_CALLBACK(scratch, p - scratch); p = scratch; if(buf == end) { int v = *buf; int ubits = st->bits_unused; int i; for(i = 7; i >= ubits; i--) *p++ = (v & (1 << i)) ? 0x31 : 0x30; er.encoded += p - scratch; _ASN_CALLBACK(scratch, p - scratch); } if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel - 1); _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } /* * BIT STRING specific contents printer. */ int BIT_STRING_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { static const char *h2c = "0123456789ABCDEF"; char scratch[64]; const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; uint8_t *buf; uint8_t *end; char *p = scratch; (void)td; /* Unused argument */ if(!st || !st->buf) return (cb("", 8, app_key) < 0) ? -1 : 0; ilevel++; buf = st->buf; end = buf + st->size; /* * Hexadecimal dump. */ for(; buf < end; buf++) { if((buf - st->buf) % 16 == 0 && (st->size > 16) && buf != st->buf) { _i_INDENT(1); /* Dump the string */ if(cb(scratch, p - scratch, app_key) < 0) return -1; p = scratch; } *p++ = h2c[*buf >> 4]; *p++ = h2c[*buf & 0x0F]; *p++ = 0x20; } if(p > scratch) { p--; /* Eat the tailing space */ if((st->size > 16)) { _i_INDENT(1); } /* Dump the incomplete 16-bytes row */ if(cb(scratch, p - scratch, app_key) < 0) return -1; } return 0; } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/BIT_STRING.h000066400000000000000000000014701305042567700223450ustar00rootroot00000000000000/*- * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _BIT_STRING_H_ #define _BIT_STRING_H_ #include /* Some help from OCTET STRING */ #ifdef __cplusplus extern "C" { #endif typedef struct BIT_STRING_s { uint8_t *buf; /* BIT STRING body */ int size; /* Size of the above buffer */ int bits_unused;/* Unused trailing bits in the last octet (0..7) */ asn_struct_ctx_t _asn_ctx; /* Parsing across buffer boundaries */ } BIT_STRING_t; extern asn_TYPE_descriptor_t asn_DEF_BIT_STRING; asn_struct_print_f BIT_STRING_print; /* Human-readable output */ asn_constr_check_f BIT_STRING_constraint; xer_type_encoder_f BIT_STRING_encode_xer; #ifdef __cplusplus } #endif #endif /* _BIT_STRING_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/BOOLEAN.c000066400000000000000000000142231305042567700217130ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2005 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include /* * BOOLEAN basic type description. */ static ber_tlv_tag_t asn_DEF_BOOLEAN_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)) }; asn_TYPE_descriptor_t asn_DEF_BOOLEAN = { "BOOLEAN", "BOOLEAN", BOOLEAN_free, BOOLEAN_print, asn_generic_no_constraint, BOOLEAN_decode_ber, BOOLEAN_encode_der, BOOLEAN_decode_xer, BOOLEAN_encode_xer, BOOLEAN_decode_uper, /* Unaligned PER decoder */ BOOLEAN_encode_uper, /* Unaligned PER encoder */ 0, /* Use generic outmost tag fetcher */ asn_DEF_BOOLEAN_tags, sizeof(asn_DEF_BOOLEAN_tags) / sizeof(asn_DEF_BOOLEAN_tags[0]), asn_DEF_BOOLEAN_tags, /* Same as above */ sizeof(asn_DEF_BOOLEAN_tags) / sizeof(asn_DEF_BOOLEAN_tags[0]), 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; /* * Decode BOOLEAN type. */ asn_dec_rval_t BOOLEAN_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **bool_value, const void *buf_ptr, size_t size, int tag_mode) { BOOLEAN_t *st = (BOOLEAN_t *)*bool_value; asn_dec_rval_t rval; ber_tlv_len_t length; ber_tlv_len_t lidx; if(st == NULL) { st = (BOOLEAN_t *)(*bool_value = CALLOC(1, sizeof(*st))); if(st == NULL) { rval.code = RC_FAIL; rval.consumed = 0; return rval; } } ASN_DEBUG("Decoding %s as BOOLEAN (tm=%d)", td->name, tag_mode); /* * Check tags. */ rval = ber_check_tags(opt_codec_ctx, td, 0, buf_ptr, size, tag_mode, 0, &length, 0); if(rval.code != RC_OK) return rval; ASN_DEBUG("Boolean length is %d bytes", (int)length); buf_ptr = ((const char *)buf_ptr) + rval.consumed; size -= rval.consumed; if(length > (ber_tlv_len_t)size) { rval.code = RC_WMORE; rval.consumed = 0; return rval; } /* * Compute boolean value. */ for(*st = 0, lidx = 0; (lidx < length) && *st == 0; lidx++) { /* * Very simple approach: read bytes until the end or * value is already TRUE. * BOOLEAN is not supposed to contain meaningful data anyway. */ *st |= ((const uint8_t *)buf_ptr)[lidx]; } rval.code = RC_OK; rval.consumed += length; ASN_DEBUG("Took %ld/%ld bytes to encode %s, value=%d", (long)rval.consumed, (long)length, td->name, *st); return rval; } asn_enc_rval_t BOOLEAN_encode_der(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t erval; BOOLEAN_t *st = (BOOLEAN_t *)sptr; erval.encoded = der_write_tags(td, 1, tag_mode, 0, tag, cb, app_key); if(erval.encoded == -1) { erval.failed_type = td; erval.structure_ptr = sptr; return erval; } if(cb) { uint8_t bool_value; bool_value = *st ? 0xff : 0; /* 0xff mandated by DER */ if(cb(&bool_value, 1, app_key) < 0) { erval.encoded = -1; erval.failed_type = td; erval.structure_ptr = sptr; return erval; } } erval.encoded += 1; _ASN_ENCODED_OK(erval); } /* * Decode the chunk of XML text encoding INTEGER. */ static enum xer_pbd_rval BOOLEAN__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void *chunk_buf, size_t chunk_size) { BOOLEAN_t *st = (BOOLEAN_t *)sptr; const char *p = (const char *)chunk_buf; (void)td; if(chunk_size && p[0] == 0x3c /* '<' */) { switch(xer_check_tag(chunk_buf, chunk_size, "false")) { case XCT_BOTH: /* "" */ *st = 0; break; case XCT_UNKNOWN_BO: if(xer_check_tag(chunk_buf, chunk_size, "true") != XCT_BOTH) return XPBD_BROKEN_ENCODING; /* "" */ *st = 1; /* Or 0xff as in DER?.. */ break; default: return XPBD_BROKEN_ENCODING; } return XPBD_BODY_CONSUMED; } else { if(xer_is_whitespace(chunk_buf, chunk_size)) return XPBD_NOT_BODY_IGNORE; else return XPBD_BROKEN_ENCODING; } } asn_dec_rval_t BOOLEAN_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, const void *buf_ptr, size_t size) { return xer_decode_primitive(opt_codec_ctx, td, sptr, sizeof(BOOLEAN_t), opt_mname, buf_ptr, size, BOOLEAN__xer_body_decode); } asn_enc_rval_t BOOLEAN_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { const BOOLEAN_t *st = (const BOOLEAN_t *)sptr; asn_enc_rval_t er; (void)ilevel; (void)flags; if(!st) _ASN_ENCODE_FAILED; if(*st) { _ASN_CALLBACK("", 7); er.encoded = 7; } else { _ASN_CALLBACK("", 8); er.encoded = 8; } _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } int BOOLEAN_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const BOOLEAN_t *st = (const BOOLEAN_t *)sptr; const char *buf; size_t buflen; (void)td; /* Unused argument */ (void)ilevel; /* Unused argument */ if(st) { if(*st) { buf = "TRUE"; buflen = 4; } else { buf = "FALSE"; buflen = 5; } } else { buf = ""; buflen = 8; } return (cb(buf, buflen, app_key) < 0) ? -1 : 0; } void BOOLEAN_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { if(td && ptr && !contents_only) { FREEMEM(ptr); } } asn_dec_rval_t BOOLEAN_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { asn_dec_rval_t rv; BOOLEAN_t *st = (BOOLEAN_t *)*sptr; (void)opt_codec_ctx; (void)constraints; if(!st) { st = (BOOLEAN_t *)(*sptr = MALLOC(sizeof(*st))); if(!st) _ASN_DECODE_FAILED; } /* * Extract a single bit */ switch(per_get_few_bits(pd, 1)) { case 1: *st = 1; break; case 0: *st = 0; break; case -1: default: _ASN_DECODE_STARVED; } ASN_DEBUG("%s decoded as %s", td->name, *st ? "TRUE" : "FALSE"); rv.code = RC_OK; rv.consumed = 1; return rv; } asn_enc_rval_t BOOLEAN_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { const BOOLEAN_t *st = (const BOOLEAN_t *)sptr; asn_enc_rval_t er; (void)constraints; if(!st) _ASN_ENCODE_FAILED; per_put_few_bits(po, *st ? 1 : 0, 1); _ASN_ENCODED_OK(er); } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/BOOLEAN.h000066400000000000000000000015731305042567700217240ustar00rootroot00000000000000/*- * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _BOOLEAN_H_ #define _BOOLEAN_H_ #include #ifdef __cplusplus extern "C" { #endif /* * The underlying integer may contain various values, but everything * non-zero is capped to 0xff by the DER encoder. The BER decoder may * yield non-zero values different from 1, beware. */ typedef int BOOLEAN_t; extern asn_TYPE_descriptor_t asn_DEF_BOOLEAN; asn_struct_free_f BOOLEAN_free; asn_struct_print_f BOOLEAN_print; ber_type_decoder_f BOOLEAN_decode_ber; der_type_encoder_f BOOLEAN_encode_der; xer_type_decoder_f BOOLEAN_decode_xer; xer_type_encoder_f BOOLEAN_encode_xer; per_type_decoder_f BOOLEAN_decode_uper; per_type_encoder_f BOOLEAN_encode_uper; #ifdef __cplusplus } #endif #endif /* _BOOLEAN_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/CPICH-Ec-N0.c000066400000000000000000000111411305042567700222560ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "CPICH-Ec-N0.h" int CPICH_Ec_N0_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 63)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void CPICH_Ec_N0_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void CPICH_Ec_N0_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { CPICH_Ec_N0_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int CPICH_Ec_N0_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { CPICH_Ec_N0_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t CPICH_Ec_N0_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { CPICH_Ec_N0_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t CPICH_Ec_N0_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { CPICH_Ec_N0_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t CPICH_Ec_N0_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { CPICH_Ec_N0_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t CPICH_Ec_N0_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { CPICH_Ec_N0_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t CPICH_Ec_N0_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { CPICH_Ec_N0_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t CPICH_Ec_N0_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { CPICH_Ec_N0_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_CPICH_Ec_N0_constr_1 = { { APC_CONSTRAINED, 6, 6, 0, 63 } /* (0..63) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_CPICH_Ec_N0_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_CPICH_Ec_N0 = { "CPICH-Ec-N0", "CPICH-Ec-N0", CPICH_Ec_N0_free, CPICH_Ec_N0_print, CPICH_Ec_N0_constraint, CPICH_Ec_N0_decode_ber, CPICH_Ec_N0_encode_der, CPICH_Ec_N0_decode_xer, CPICH_Ec_N0_encode_xer, CPICH_Ec_N0_decode_uper, CPICH_Ec_N0_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_CPICH_Ec_N0_tags_1, sizeof(asn_DEF_CPICH_Ec_N0_tags_1) /sizeof(asn_DEF_CPICH_Ec_N0_tags_1[0]), /* 1 */ asn_DEF_CPICH_Ec_N0_tags_1, /* Same as above */ sizeof(asn_DEF_CPICH_Ec_N0_tags_1) /sizeof(asn_DEF_CPICH_Ec_N0_tags_1[0]), /* 1 */ &asn_PER_type_CPICH_Ec_N0_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/CPICH-Ec-N0.h000066400000000000000000000016071305042567700222710ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _CPICH_Ec_N0_H_ #define _CPICH_Ec_N0_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* CPICH-Ec-N0 */ typedef long CPICH_Ec_N0_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_CPICH_Ec_N0; asn_struct_free_f CPICH_Ec_N0_free; asn_struct_print_f CPICH_Ec_N0_print; asn_constr_check_f CPICH_Ec_N0_constraint; ber_type_decoder_f CPICH_Ec_N0_decode_ber; der_type_encoder_f CPICH_Ec_N0_encode_der; xer_type_decoder_f CPICH_Ec_N0_decode_xer; xer_type_encoder_f CPICH_Ec_N0_encode_xer; per_type_decoder_f CPICH_Ec_N0_decode_uper; per_type_encoder_f CPICH_Ec_N0_encode_uper; #ifdef __cplusplus } #endif #endif /* _CPICH_Ec_N0_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/CPICH-RSCP.c000066400000000000000000000110741305042567700222300ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "CPICH-RSCP.h" int CPICH_RSCP_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void CPICH_RSCP_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void CPICH_RSCP_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { CPICH_RSCP_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int CPICH_RSCP_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { CPICH_RSCP_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t CPICH_RSCP_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { CPICH_RSCP_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t CPICH_RSCP_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { CPICH_RSCP_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t CPICH_RSCP_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { CPICH_RSCP_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t CPICH_RSCP_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { CPICH_RSCP_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t CPICH_RSCP_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { CPICH_RSCP_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t CPICH_RSCP_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { CPICH_RSCP_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_CPICH_RSCP_constr_1 = { { APC_CONSTRAINED, 7, 7, 0, 127 } /* (0..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_CPICH_RSCP_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_CPICH_RSCP = { "CPICH-RSCP", "CPICH-RSCP", CPICH_RSCP_free, CPICH_RSCP_print, CPICH_RSCP_constraint, CPICH_RSCP_decode_ber, CPICH_RSCP_encode_der, CPICH_RSCP_decode_xer, CPICH_RSCP_encode_xer, CPICH_RSCP_decode_uper, CPICH_RSCP_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_CPICH_RSCP_tags_1, sizeof(asn_DEF_CPICH_RSCP_tags_1) /sizeof(asn_DEF_CPICH_RSCP_tags_1[0]), /* 1 */ asn_DEF_CPICH_RSCP_tags_1, /* Same as above */ sizeof(asn_DEF_CPICH_RSCP_tags_1) /sizeof(asn_DEF_CPICH_RSCP_tags_1[0]), /* 1 */ &asn_PER_type_CPICH_RSCP_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/CPICH-RSCP.h000066400000000000000000000015701305042567700222350ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _CPICH_RSCP_H_ #define _CPICH_RSCP_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* CPICH-RSCP */ typedef long CPICH_RSCP_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_CPICH_RSCP; asn_struct_free_f CPICH_RSCP_free; asn_struct_print_f CPICH_RSCP_print; asn_constr_check_f CPICH_RSCP_constraint; ber_type_decoder_f CPICH_RSCP_decode_ber; der_type_encoder_f CPICH_RSCP_encode_der; xer_type_decoder_f CPICH_RSCP_decode_xer; xer_type_encoder_f CPICH_RSCP_encode_xer; per_type_decoder_f CPICH_RSCP_decode_uper; per_type_encoder_f CPICH_RSCP_encode_uper; #ifdef __cplusplus } #endif #endif /* _CPICH_RSCP_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/CdmaCellInformation.c000066400000000000000000000236571305042567700245210ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "CdmaCellInformation.h" static int memb_refNID_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 65535)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_refSID_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 32767)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_refBASEID_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 65535)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_refBASELAT_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 4194303)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_reBASELONG_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 8388607)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_refREFPN_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 511)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_refWeekNumber_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 65535)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_refSeconds_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 4194303)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_refNID_constr_2 = { { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_refSID_constr_3 = { { APC_CONSTRAINED, 15, 15, 0, 32767 } /* (0..32767) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_refBASEID_constr_4 = { { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_refBASELAT_constr_5 = { { APC_CONSTRAINED, 22, -1, 0, 4194303 } /* (0..4194303) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_reBASELONG_constr_6 = { { APC_CONSTRAINED, 23, -1, 0, 8388607 } /* (0..8388607) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_refREFPN_constr_7 = { { APC_CONSTRAINED, 9, 9, 0, 511 } /* (0..511) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_refWeekNumber_constr_8 = { { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_refSeconds_constr_9 = { { APC_CONSTRAINED, 22, -1, 0, 4194303 } /* (0..4194303) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_CdmaCellInformation_1[] = { { ATF_NOFLAGS, 0, offsetof(struct CdmaCellInformation, refNID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_refNID_constraint_1, &asn_PER_memb_refNID_constr_2, 0, "refNID" }, { ATF_NOFLAGS, 0, offsetof(struct CdmaCellInformation, refSID), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_refSID_constraint_1, &asn_PER_memb_refSID_constr_3, 0, "refSID" }, { ATF_NOFLAGS, 0, offsetof(struct CdmaCellInformation, refBASEID), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_refBASEID_constraint_1, &asn_PER_memb_refBASEID_constr_4, 0, "refBASEID" }, { ATF_NOFLAGS, 0, offsetof(struct CdmaCellInformation, refBASELAT), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_refBASELAT_constraint_1, &asn_PER_memb_refBASELAT_constr_5, 0, "refBASELAT" }, { ATF_NOFLAGS, 0, offsetof(struct CdmaCellInformation, reBASELONG), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_reBASELONG_constraint_1, &asn_PER_memb_reBASELONG_constr_6, 0, "reBASELONG" }, { ATF_NOFLAGS, 0, offsetof(struct CdmaCellInformation, refREFPN), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_refREFPN_constraint_1, &asn_PER_memb_refREFPN_constr_7, 0, "refREFPN" }, { ATF_NOFLAGS, 0, offsetof(struct CdmaCellInformation, refWeekNumber), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_refWeekNumber_constraint_1, &asn_PER_memb_refWeekNumber_constr_8, 0, "refWeekNumber" }, { ATF_NOFLAGS, 0, offsetof(struct CdmaCellInformation, refSeconds), (ASN_TAG_CLASS_CONTEXT | (7 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_refSeconds_constraint_1, &asn_PER_memb_refSeconds_constr_9, 0, "refSeconds" }, }; static ber_tlv_tag_t asn_DEF_CdmaCellInformation_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_CdmaCellInformation_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* refNID at 92 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* refSID at 93 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* refBASEID at 94 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* refBASELAT at 95 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* reBASELONG at 96 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* refREFPN at 97 */ { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* refWeekNumber at 98 */ { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 } /* refSeconds at 99 */ }; static asn_SEQUENCE_specifics_t asn_SPC_CdmaCellInformation_specs_1 = { sizeof(struct CdmaCellInformation), offsetof(struct CdmaCellInformation, _asn_ctx), asn_MAP_CdmaCellInformation_tag2el_1, 8, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ 7, /* Start extensions */ 9 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_CdmaCellInformation = { "CdmaCellInformation", "CdmaCellInformation", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_CdmaCellInformation_tags_1, sizeof(asn_DEF_CdmaCellInformation_tags_1) /sizeof(asn_DEF_CdmaCellInformation_tags_1[0]), /* 1 */ asn_DEF_CdmaCellInformation_tags_1, /* Same as above */ sizeof(asn_DEF_CdmaCellInformation_tags_1) /sizeof(asn_DEF_CdmaCellInformation_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_CdmaCellInformation_1, 8, /* Elements count */ &asn_SPC_CdmaCellInformation_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/CdmaCellInformation.h000066400000000000000000000016371305042567700245200ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _CdmaCellInformation_H_ #define _CdmaCellInformation_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* CdmaCellInformation */ typedef struct CdmaCellInformation { long refNID; long refSID; long refBASEID; long refBASELAT; long reBASELONG; long refREFPN; long refWeekNumber; long refSeconds; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } CdmaCellInformation_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_CdmaCellInformation; #ifdef __cplusplus } #endif #endif /* _CdmaCellInformation_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/CellInfo.c000066400000000000000000000045451305042567700223350ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "CellInfo.h" static asn_per_constraints_t asn_PER_type_CellInfo_constr_1 = { { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 2 } /* (0..2,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_CellInfo_1[] = { { ATF_NOFLAGS, 0, offsetof(struct CellInfo, choice.gsmCell), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_GsmCellInformation, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "gsmCell" }, { ATF_NOFLAGS, 0, offsetof(struct CellInfo, choice.wcdmaCell), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_WcdmaCellInformation, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "wcdmaCell" }, { ATF_NOFLAGS, 0, offsetof(struct CellInfo, choice.cdmaCell), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_CdmaCellInformation, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "cdmaCell" }, }; static asn_TYPE_tag2member_t asn_MAP_CellInfo_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* gsmCell at 61 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* wcdmaCell at 62 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* cdmaCell at 63 */ }; static asn_CHOICE_specifics_t asn_SPC_CellInfo_specs_1 = { sizeof(struct CellInfo), offsetof(struct CellInfo, _asn_ctx), offsetof(struct CellInfo, present), sizeof(((struct CellInfo *)0)->present), asn_MAP_CellInfo_tag2el_1, 3, /* Count of tags in the map */ 0, 3 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_CellInfo = { "CellInfo", "CellInfo", CHOICE_free, CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_decode_uper, CHOICE_encode_uper, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ &asn_PER_type_CellInfo_constr_1, asn_MBR_CellInfo_1, 3, /* Elements count */ &asn_SPC_CellInfo_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/CellInfo.h000066400000000000000000000022041305042567700223300ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _CellInfo_H_ #define _CellInfo_H_ #include /* Including external dependencies */ #include "GsmCellInformation.h" #include "WcdmaCellInformation.h" #include "CdmaCellInformation.h" #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum CellInfo_PR { CellInfo_PR_NOTHING, /* No components present */ CellInfo_PR_gsmCell, CellInfo_PR_wcdmaCell, CellInfo_PR_cdmaCell, /* Extensions may appear below */ } CellInfo_PR; /* CellInfo */ typedef struct CellInfo { CellInfo_PR present; union CellInfo_u { GsmCellInformation_t gsmCell; WcdmaCellInformation_t wcdmaCell; CdmaCellInformation_t cdmaCell; /* * This type is extensible, * possible extensions are below. */ } choice; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } CellInfo_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_CellInfo; #ifdef __cplusplus } #endif #endif /* _CellInfo_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/CellMeasuredResults.c000066400000000000000000000250631305042567700245670ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "CellMeasuredResults.h" static int memb_cellIdentity_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 268435455)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_type_modeSpecificInfo_constr_3 = { { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_cellIdentity_constr_2 = { { APC_CONSTRAINED, 28, -1, 0, 268435455 } /* (0..268435455) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_fdd_4[] = { { ATF_NOFLAGS, 0, offsetof(struct fdd, primaryCPICH_Info), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_PrimaryCPICH_Info, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "primaryCPICH-Info" }, { ATF_POINTER, 3, offsetof(struct fdd, cpich_Ec_N0), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_CPICH_Ec_N0, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "cpich-Ec-N0" }, { ATF_POINTER, 2, offsetof(struct fdd, cpich_RSCP), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_CPICH_RSCP, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "cpich-RSCP" }, { ATF_POINTER, 1, offsetof(struct fdd, pathloss), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Pathloss, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "pathloss" }, }; static int asn_MAP_fdd_oms_4[] = { 1, 2, 3 }; static ber_tlv_tag_t asn_DEF_fdd_tags_4[] = { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_fdd_tag2el_4[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* primaryCPICH-Info at 163 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* cpich-Ec-N0 at 164 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* cpich-RSCP at 165 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* pathloss at 166 */ }; static asn_SEQUENCE_specifics_t asn_SPC_fdd_specs_4 = { sizeof(struct fdd), offsetof(struct fdd, _asn_ctx), asn_MAP_fdd_tag2el_4, 4, /* Count of tags in the map */ asn_MAP_fdd_oms_4, /* Optional members */ 3, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_fdd_4 = { "fdd", "fdd", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_fdd_tags_4, sizeof(asn_DEF_fdd_tags_4) /sizeof(asn_DEF_fdd_tags_4[0]) - 1, /* 1 */ asn_DEF_fdd_tags_4, /* Same as above */ sizeof(asn_DEF_fdd_tags_4) /sizeof(asn_DEF_fdd_tags_4[0]), /* 2 */ 0, /* No PER visible constraints */ asn_MBR_fdd_4, 4, /* Elements count */ &asn_SPC_fdd_specs_4 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_tdd_9[] = { { ATF_NOFLAGS, 0, offsetof(struct tdd, cellParametersID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_CellParametersID, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "cellParametersID" }, { ATF_POINTER, 4, offsetof(struct tdd, proposedTGSN), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_TGSN, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "proposedTGSN" }, { ATF_POINTER, 3, offsetof(struct tdd, primaryCCPCH_RSCP), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_PrimaryCCPCH_RSCP, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "primaryCCPCH-RSCP" }, { ATF_POINTER, 2, offsetof(struct tdd, pathloss), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Pathloss, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "pathloss" }, { ATF_POINTER, 1, offsetof(struct tdd, timeslotISCP_List), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_TimeslotISCP_List, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "timeslotISCP-List" }, }; static int asn_MAP_tdd_oms_9[] = { 1, 2, 3, 4 }; static ber_tlv_tag_t asn_DEF_tdd_tags_9[] = { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_tdd_tag2el_9[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* cellParametersID at 168 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* proposedTGSN at 169 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* primaryCCPCH-RSCP at 170 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* pathloss at 171 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* timeslotISCP-List at 172 */ }; static asn_SEQUENCE_specifics_t asn_SPC_tdd_specs_9 = { sizeof(struct tdd), offsetof(struct tdd, _asn_ctx), asn_MAP_tdd_tag2el_9, 5, /* Count of tags in the map */ asn_MAP_tdd_oms_9, /* Optional members */ 4, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_tdd_9 = { "tdd", "tdd", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_tdd_tags_9, sizeof(asn_DEF_tdd_tags_9) /sizeof(asn_DEF_tdd_tags_9[0]) - 1, /* 1 */ asn_DEF_tdd_tags_9, /* Same as above */ sizeof(asn_DEF_tdd_tags_9) /sizeof(asn_DEF_tdd_tags_9[0]), /* 2 */ 0, /* No PER visible constraints */ asn_MBR_tdd_9, 5, /* Elements count */ &asn_SPC_tdd_specs_9 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_modeSpecificInfo_3[] = { { ATF_NOFLAGS, 0, offsetof(struct modeSpecificInfo, choice.fdd), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, &asn_DEF_fdd_4, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "fdd" }, { ATF_NOFLAGS, 0, offsetof(struct modeSpecificInfo, choice.tdd), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, &asn_DEF_tdd_9, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "tdd" }, }; static asn_TYPE_tag2member_t asn_MAP_modeSpecificInfo_tag2el_3[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* fdd at 163 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* tdd at 168 */ }; static asn_CHOICE_specifics_t asn_SPC_modeSpecificInfo_specs_3 = { sizeof(struct modeSpecificInfo), offsetof(struct modeSpecificInfo, _asn_ctx), offsetof(struct modeSpecificInfo, present), sizeof(((struct modeSpecificInfo *)0)->present), asn_MAP_modeSpecificInfo_tag2el_3, 2, /* Count of tags in the map */ 0, -1 /* Extensions start */ }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_modeSpecificInfo_3 = { "modeSpecificInfo", "modeSpecificInfo", CHOICE_free, CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_decode_uper, CHOICE_encode_uper, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ &asn_PER_type_modeSpecificInfo_constr_3, asn_MBR_modeSpecificInfo_3, 2, /* Elements count */ &asn_SPC_modeSpecificInfo_specs_3 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_CellMeasuredResults_1[] = { { ATF_POINTER, 1, offsetof(struct CellMeasuredResults, cellIdentity), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_cellIdentity_constraint_1, &asn_PER_memb_cellIdentity_constr_2, 0, "cellIdentity" }, { ATF_NOFLAGS, 0, offsetof(struct CellMeasuredResults, modeSpecificInfo), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), +1, /* EXPLICIT tag at current level */ &asn_DEF_modeSpecificInfo_3, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "modeSpecificInfo" }, }; static int asn_MAP_CellMeasuredResults_oms_1[] = { 0 }; static ber_tlv_tag_t asn_DEF_CellMeasuredResults_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_CellMeasuredResults_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* cellIdentity at 160 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* modeSpecificInfo at 166 */ }; static asn_SEQUENCE_specifics_t asn_SPC_CellMeasuredResults_specs_1 = { sizeof(struct CellMeasuredResults), offsetof(struct CellMeasuredResults, _asn_ctx), asn_MAP_CellMeasuredResults_tag2el_1, 2, /* Count of tags in the map */ asn_MAP_CellMeasuredResults_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_CellMeasuredResults = { "CellMeasuredResults", "CellMeasuredResults", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_CellMeasuredResults_tags_1, sizeof(asn_DEF_CellMeasuredResults_tags_1) /sizeof(asn_DEF_CellMeasuredResults_tags_1[0]), /* 1 */ asn_DEF_CellMeasuredResults_tags_1, /* Same as above */ sizeof(asn_DEF_CellMeasuredResults_tags_1) /sizeof(asn_DEF_CellMeasuredResults_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_CellMeasuredResults_1, 2, /* Elements count */ &asn_SPC_CellMeasuredResults_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/CellMeasuredResults.h000066400000000000000000000041351305042567700245710ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _CellMeasuredResults_H_ #define _CellMeasuredResults_H_ #include /* Including external dependencies */ #include #include "PrimaryCPICH-Info.h" #include "CPICH-Ec-N0.h" #include "CPICH-RSCP.h" #include "Pathloss.h" #include #include "CellParametersID.h" #include "TGSN.h" #include "PrimaryCCPCH-RSCP.h" #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum modeSpecificInfo_PR { modeSpecificInfo_PR_NOTHING, /* No components present */ modeSpecificInfo_PR_fdd, modeSpecificInfo_PR_tdd } modeSpecificInfo_PR; /* Forward declarations */ struct TimeslotISCP_List; /* CellMeasuredResults */ typedef struct CellMeasuredResults { long *cellIdentity /* OPTIONAL */; struct modeSpecificInfo { modeSpecificInfo_PR present; union CellMeasuredResults__modeSpecificInfo_u { struct fdd { PrimaryCPICH_Info_t primaryCPICH_Info; CPICH_Ec_N0_t *cpich_Ec_N0 /* OPTIONAL */; CPICH_RSCP_t *cpich_RSCP /* OPTIONAL */; Pathloss_t *pathloss /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } fdd; struct tdd { CellParametersID_t cellParametersID; TGSN_t *proposedTGSN /* OPTIONAL */; PrimaryCCPCH_RSCP_t *primaryCCPCH_RSCP /* OPTIONAL */; Pathloss_t *pathloss /* OPTIONAL */; struct TimeslotISCP_List *timeslotISCP_List /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } tdd; } choice; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } modeSpecificInfo; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } CellMeasuredResults_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_CellMeasuredResults; #ifdef __cplusplus } #endif /* Referred external types */ #include "TimeslotISCP-List.h" #endif /* _CellMeasuredResults_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/CellMeasuredResultsList.c000066400000000000000000000035051305042567700254200ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "CellMeasuredResultsList.h" static asn_per_constraints_t asn_PER_type_CellMeasuredResultsList_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 5, 5, 1, 32 } /* (SIZE(1..32)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_CellMeasuredResultsList_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_CellMeasuredResults, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_CellMeasuredResultsList_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_CellMeasuredResultsList_specs_1 = { sizeof(struct CellMeasuredResultsList), offsetof(struct CellMeasuredResultsList, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_CellMeasuredResultsList = { "CellMeasuredResultsList", "CellMeasuredResultsList", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_CellMeasuredResultsList_tags_1, sizeof(asn_DEF_CellMeasuredResultsList_tags_1) /sizeof(asn_DEF_CellMeasuredResultsList_tags_1[0]), /* 1 */ asn_DEF_CellMeasuredResultsList_tags_1, /* Same as above */ sizeof(asn_DEF_CellMeasuredResultsList_tags_1) /sizeof(asn_DEF_CellMeasuredResultsList_tags_1[0]), /* 1 */ &asn_PER_type_CellMeasuredResultsList_constr_1, asn_MBR_CellMeasuredResultsList_1, 1, /* Single element */ &asn_SPC_CellMeasuredResultsList_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/CellMeasuredResultsList.h000066400000000000000000000016201305042567700254210ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _CellMeasuredResultsList_H_ #define _CellMeasuredResultsList_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct CellMeasuredResults; /* CellMeasuredResultsList */ typedef struct CellMeasuredResultsList { A_SEQUENCE_OF(struct CellMeasuredResults) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } CellMeasuredResultsList_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_CellMeasuredResultsList; #ifdef __cplusplus } #endif /* Referred external types */ #include "CellMeasuredResults.h" #endif /* _CellMeasuredResultsList_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/CellParametersID.c000066400000000000000000000114541305042567700237570ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "CellParametersID.h" int CellParametersID_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void CellParametersID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void CellParametersID_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { CellParametersID_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int CellParametersID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { CellParametersID_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t CellParametersID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { CellParametersID_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t CellParametersID_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { CellParametersID_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t CellParametersID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { CellParametersID_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t CellParametersID_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { CellParametersID_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t CellParametersID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { CellParametersID_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t CellParametersID_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { CellParametersID_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_CellParametersID_constr_1 = { { APC_CONSTRAINED, 7, 7, 0, 127 } /* (0..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_CellParametersID_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_CellParametersID = { "CellParametersID", "CellParametersID", CellParametersID_free, CellParametersID_print, CellParametersID_constraint, CellParametersID_decode_ber, CellParametersID_encode_der, CellParametersID_decode_xer, CellParametersID_encode_xer, CellParametersID_decode_uper, CellParametersID_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_CellParametersID_tags_1, sizeof(asn_DEF_CellParametersID_tags_1) /sizeof(asn_DEF_CellParametersID_tags_1[0]), /* 1 */ asn_DEF_CellParametersID_tags_1, /* Same as above */ sizeof(asn_DEF_CellParametersID_tags_1) /sizeof(asn_DEF_CellParametersID_tags_1[0]), /* 1 */ &asn_PER_type_CellParametersID_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/CellParametersID.h000066400000000000000000000017221305042567700237610ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _CellParametersID_H_ #define _CellParametersID_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* CellParametersID */ typedef long CellParametersID_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_CellParametersID; asn_struct_free_f CellParametersID_free; asn_struct_print_f CellParametersID_print; asn_constr_check_f CellParametersID_constraint; ber_type_decoder_f CellParametersID_decode_ber; der_type_encoder_f CellParametersID_encode_der; xer_type_decoder_f CellParametersID_decode_xer; xer_type_encoder_f CellParametersID_encode_xer; per_type_decoder_f CellParametersID_decode_uper; per_type_encoder_f CellParametersID_encode_uper; #ifdef __cplusplus } #endif #endif /* _CellParametersID_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/DUMMY.c000066400000000000000000000075771305042567700215450ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP" * found in "../supl-ulp.asn" */ #include "DUMMY.h" int DUMMY_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { /* Replace with underlying type checker */ td->check_constraints = asn_DEF_INTEGER.check_constraints; return td->check_constraints(td, sptr, ctfailcb, app_key); } /* * This type is implemented using INTEGER, * so here we adjust the DEF accordingly. */ static void DUMMY_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_INTEGER.free_struct; td->print_struct = asn_DEF_INTEGER.print_struct; td->ber_decoder = asn_DEF_INTEGER.ber_decoder; td->der_encoder = asn_DEF_INTEGER.der_encoder; td->xer_decoder = asn_DEF_INTEGER.xer_decoder; td->xer_encoder = asn_DEF_INTEGER.xer_encoder; td->uper_decoder = asn_DEF_INTEGER.uper_decoder; td->uper_encoder = asn_DEF_INTEGER.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_INTEGER.per_constraints; td->elements = asn_DEF_INTEGER.elements; td->elements_count = asn_DEF_INTEGER.elements_count; td->specifics = asn_DEF_INTEGER.specifics; } void DUMMY_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { DUMMY_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int DUMMY_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { DUMMY_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t DUMMY_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { DUMMY_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t DUMMY_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { DUMMY_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t DUMMY_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { DUMMY_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t DUMMY_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { DUMMY_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t DUMMY_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { DUMMY_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t DUMMY_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { DUMMY_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static ber_tlv_tag_t asn_DEF_DUMMY_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_DUMMY = { "DUMMY", "DUMMY", DUMMY_free, DUMMY_print, DUMMY_constraint, DUMMY_decode_ber, DUMMY_encode_der, DUMMY_decode_xer, DUMMY_encode_xer, DUMMY_decode_uper, DUMMY_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_DUMMY_tags_1, sizeof(asn_DEF_DUMMY_tags_1) /sizeof(asn_DEF_DUMMY_tags_1[0]), /* 1 */ asn_DEF_DUMMY_tags_1, /* Same as above */ sizeof(asn_DEF_DUMMY_tags_1) /sizeof(asn_DEF_DUMMY_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/DUMMY.h000066400000000000000000000014361305042567700215360ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP" * found in "../supl-ulp.asn" */ #ifndef _DUMMY_H_ #define _DUMMY_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* DUMMY */ typedef INTEGER_t DUMMY_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_DUMMY; asn_struct_free_f DUMMY_free; asn_struct_print_f DUMMY_print; asn_constr_check_f DUMMY_constraint; ber_type_decoder_f DUMMY_decode_ber; der_type_encoder_f DUMMY_encode_der; xer_type_decoder_f DUMMY_decode_xer; xer_type_encoder_f DUMMY_encode_xer; per_type_decoder_f DUMMY_decode_uper; per_type_encoder_f DUMMY_encode_uper; #ifdef __cplusplus } #endif #endif /* _DUMMY_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/ENUMERATED.c000066400000000000000000000041241305042567700222640ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2005, 2006 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include #include /* Encoder and decoder of a primitive type */ /* * ENUMERATED basic type description. */ static ber_tlv_tag_t asn_DEF_ENUMERATED_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; asn_TYPE_descriptor_t asn_DEF_ENUMERATED = { "ENUMERATED", "ENUMERATED", ASN__PRIMITIVE_TYPE_free, INTEGER_print, /* Implemented in terms of INTEGER */ asn_generic_no_constraint, ber_decode_primitive, INTEGER_encode_der, /* Implemented in terms of INTEGER */ INTEGER_decode_xer, /* This is temporary! */ INTEGER_encode_xer, ENUMERATED_decode_uper, /* Unaligned PER decoder */ ENUMERATED_encode_uper, /* Unaligned PER encoder */ 0, /* Use generic outmost tag fetcher */ asn_DEF_ENUMERATED_tags, sizeof(asn_DEF_ENUMERATED_tags) / sizeof(asn_DEF_ENUMERATED_tags[0]), asn_DEF_ENUMERATED_tags, /* Same as above */ sizeof(asn_DEF_ENUMERATED_tags) / sizeof(asn_DEF_ENUMERATED_tags[0]), 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; asn_dec_rval_t ENUMERATED_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { asn_dec_rval_t rval; ENUMERATED_t *st = (ENUMERATED_t *)*sptr; long value; void *vptr = &value; if(!st) { st = (ENUMERATED_t *)(*sptr = CALLOC(1, sizeof(*st))); if(!st) _ASN_DECODE_FAILED; } rval = NativeEnumerated_decode_uper(opt_codec_ctx, td, constraints, (void **)&vptr, pd); if(rval.code == RC_OK) if(asn_long2INTEGER(st, value)) rval.code = RC_FAIL; return rval; } asn_enc_rval_t ENUMERATED_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { ENUMERATED_t *st = (ENUMERATED_t *)sptr; long value; if(asn_INTEGER2long(st, &value)) _ASN_ENCODE_FAILED; return NativeEnumerated_encode_uper(td, constraints, &value, po); } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/ENUMERATED.h000066400000000000000000000010201305042567700222610ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2005 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _ENUMERATED_H_ #define _ENUMERATED_H_ #include #ifdef __cplusplus extern "C" { #endif typedef INTEGER_t ENUMERATED_t; /* Implemented via INTEGER */ extern asn_TYPE_descriptor_t asn_DEF_ENUMERATED; per_type_decoder_f ENUMERATED_decode_uper; per_type_encoder_f ENUMERATED_encode_uper; #ifdef __cplusplus } #endif #endif /* _ENUMERATED_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/EncodingType.c000066400000000000000000000121541305042567700232250ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-INIT" * found in "../supl-init.asn" */ #include "EncodingType.h" int EncodingType_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { /* Replace with underlying type checker */ td->check_constraints = asn_DEF_ENUMERATED.check_constraints; return td->check_constraints(td, sptr, ctfailcb, app_key); } /* * This type is implemented using ENUMERATED, * so here we adjust the DEF accordingly. */ static void EncodingType_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_ENUMERATED.free_struct; td->print_struct = asn_DEF_ENUMERATED.print_struct; td->ber_decoder = asn_DEF_ENUMERATED.ber_decoder; td->der_encoder = asn_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; td->uper_encoder = asn_DEF_ENUMERATED.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_ENUMERATED.per_constraints; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ } void EncodingType_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { EncodingType_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int EncodingType_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { EncodingType_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t EncodingType_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { EncodingType_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t EncodingType_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { EncodingType_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t EncodingType_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { EncodingType_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t EncodingType_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { EncodingType_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t EncodingType_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { EncodingType_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t EncodingType_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { EncodingType_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_EncodingType_constr_1 = { { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 2 } /* (0..2,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_INTEGER_enum_map_t asn_MAP_EncodingType_value2enum_1[] = { { 0, 4, "ucs2" }, { 1, 10, "gsmDefault" }, { 2, 4, "utf8" } /* This list is extensible */ }; static unsigned int asn_MAP_EncodingType_enum2value_1[] = { 1, /* gsmDefault(1) */ 0, /* ucs2(0) */ 2 /* utf8(2) */ /* This list is extensible */ }; static asn_INTEGER_specifics_t asn_SPC_EncodingType_specs_1 = { asn_MAP_EncodingType_value2enum_1, /* "tag" => N; sorted by tag */ asn_MAP_EncodingType_enum2value_1, /* N => "tag"; sorted by N */ 3, /* Number of elements in the maps */ 4, /* Extensions before this member */ 1, /* Strict enumeration */ 0, /* Native long size */ 0 }; static ber_tlv_tag_t asn_DEF_EncodingType_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; asn_TYPE_descriptor_t asn_DEF_EncodingType = { "EncodingType", "EncodingType", EncodingType_free, EncodingType_print, EncodingType_constraint, EncodingType_decode_ber, EncodingType_encode_der, EncodingType_decode_xer, EncodingType_encode_xer, EncodingType_decode_uper, EncodingType_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_EncodingType_tags_1, sizeof(asn_DEF_EncodingType_tags_1) /sizeof(asn_DEF_EncodingType_tags_1[0]), /* 1 */ asn_DEF_EncodingType_tags_1, /* Same as above */ sizeof(asn_DEF_EncodingType_tags_1) /sizeof(asn_DEF_EncodingType_tags_1[0]), /* 1 */ &asn_PER_type_EncodingType_constr_1, 0, 0, /* Defined elsewhere */ &asn_SPC_EncodingType_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/EncodingType.h000066400000000000000000000021121305042567700232230ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-INIT" * found in "../supl-init.asn" */ #ifndef _EncodingType_H_ #define _EncodingType_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum EncodingType { EncodingType_ucs2 = 0, EncodingType_gsmDefault = 1, EncodingType_utf8 = 2 /* * Enumeration is extensible */ } e_EncodingType; /* EncodingType */ typedef ENUMERATED_t EncodingType_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_EncodingType; asn_struct_free_f EncodingType_free; asn_struct_print_f EncodingType_print; asn_constr_check_f EncodingType_constraint; ber_type_decoder_f EncodingType_decode_ber; der_type_encoder_f EncodingType_encode_der; xer_type_decoder_f EncodingType_decode_xer; xer_type_encoder_f EncodingType_encode_xer; per_type_decoder_f EncodingType_decode_uper; per_type_encoder_f EncodingType_encode_uper; #ifdef __cplusplus } #endif #endif /* _EncodingType_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/FQDN.c000066400000000000000000000142271305042567700213700ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "FQDN.h" static int permitted_alphabet_table_1[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, /* -. */ 3, 4, 5, 6, 7, 8, 9,10,11,12, 0, 0, 0, 0, 0, 0, /* 0123456789 */ 0,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27, /* ABCDEFGHIJKLMNO */ 28,29,30,31,32,33,34,35,36,37,38, 0, 0, 0, 0, 0, /* PQRSTUVWXYZ */ 0,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53, /* abcdefghijklmno */ 54,55,56,57,58,59,60,61,62,63,64, 0, 0, 0, 0, 0, /* pqrstuvwxyz */ }; static int permitted_alphabet_code2value_1[64] = { 45,46,48,49,50,51,52,53,54,55,56,57,65,66,67,68, 69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84, 85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106, 107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122, }; static int check_permitted_alphabet_1(const void *sptr) { int *table = permitted_alphabet_table_1; /* The underlying type is VisibleString */ const VisibleString_t *st = (const VisibleString_t *)sptr; const uint8_t *ch = st->buf; const uint8_t *end = ch + st->size; for(; ch < end; ch++) { uint8_t cv = *ch; if(!table[cv]) return -1; } return 0; } int FQDN_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const VisibleString_t *st = (const VisibleString_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } size = st->size; if((size >= 1 && size <= 255) && !check_permitted_alphabet_1(st)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int asn_PER_MAP_FQDN_1_v2c(unsigned int value) { if(value >= sizeof(permitted_alphabet_table_1)/sizeof(permitted_alphabet_table_1[0])) return -1; return permitted_alphabet_table_1[value] - 1; } static int asn_PER_MAP_FQDN_1_c2v(unsigned int code) { if(code >= sizeof(permitted_alphabet_code2value_1)/sizeof(permitted_alphabet_code2value_1[0])) return -1; return permitted_alphabet_code2value_1[code]; } /* * This type is implemented using VisibleString, * so here we adjust the DEF accordingly. */ static void FQDN_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_VisibleString.free_struct; td->print_struct = asn_DEF_VisibleString.print_struct; td->ber_decoder = asn_DEF_VisibleString.ber_decoder; td->der_encoder = asn_DEF_VisibleString.der_encoder; td->xer_decoder = asn_DEF_VisibleString.xer_decoder; td->xer_encoder = asn_DEF_VisibleString.xer_encoder; td->uper_decoder = asn_DEF_VisibleString.uper_decoder; td->uper_encoder = asn_DEF_VisibleString.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_VisibleString.per_constraints; td->elements = asn_DEF_VisibleString.elements; td->elements_count = asn_DEF_VisibleString.elements_count; td->specifics = asn_DEF_VisibleString.specifics; } void FQDN_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { FQDN_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int FQDN_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { FQDN_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t FQDN_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { FQDN_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t FQDN_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { FQDN_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t FQDN_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { FQDN_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t FQDN_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { FQDN_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t FQDN_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { FQDN_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t FQDN_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { FQDN_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_FQDN_constr_1 = { { APC_CONSTRAINED, 6, 6, 45, 122 } /* (45..122) */, { APC_CONSTRAINED, 8, 8, 1, 255 } /* (SIZE(1..255)) */, asn_PER_MAP_FQDN_1_v2c, /* Value to PER code map */ asn_PER_MAP_FQDN_1_c2v /* PER code to value map */ }; static ber_tlv_tag_t asn_DEF_FQDN_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)) }; asn_TYPE_descriptor_t asn_DEF_FQDN = { "FQDN", "FQDN", FQDN_free, FQDN_print, FQDN_constraint, FQDN_decode_ber, FQDN_encode_der, FQDN_decode_xer, FQDN_encode_xer, FQDN_decode_uper, FQDN_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_FQDN_tags_1, sizeof(asn_DEF_FQDN_tags_1) /sizeof(asn_DEF_FQDN_tags_1[0]), /* 1 */ asn_DEF_FQDN_tags_1, /* Same as above */ sizeof(asn_DEF_FQDN_tags_1) /sizeof(asn_DEF_FQDN_tags_1[0]), /* 1 */ &asn_PER_type_FQDN_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/FQDN.h000066400000000000000000000014511305042567700213700ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _FQDN_H_ #define _FQDN_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* FQDN */ typedef VisibleString_t FQDN_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_FQDN; asn_struct_free_f FQDN_free; asn_struct_print_f FQDN_print; asn_constr_check_f FQDN_constraint; ber_type_decoder_f FQDN_decode_ber; der_type_encoder_f FQDN_encode_der; xer_type_decoder_f FQDN_decode_xer; xer_type_encoder_f FQDN_encode_xer; per_type_decoder_f FQDN_decode_uper; per_type_encoder_f FQDN_encode_uper; #ifdef __cplusplus } #endif #endif /* _FQDN_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/FormatIndicator.c000066400000000000000000000127411305042567700237240ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-INIT" * found in "../supl-init.asn" */ #include "FormatIndicator.h" int FormatIndicator_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { /* Replace with underlying type checker */ td->check_constraints = asn_DEF_ENUMERATED.check_constraints; return td->check_constraints(td, sptr, ctfailcb, app_key); } /* * This type is implemented using ENUMERATED, * so here we adjust the DEF accordingly. */ static void FormatIndicator_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_ENUMERATED.free_struct; td->print_struct = asn_DEF_ENUMERATED.print_struct; td->ber_decoder = asn_DEF_ENUMERATED.ber_decoder; td->der_encoder = asn_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; td->uper_encoder = asn_DEF_ENUMERATED.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_ENUMERATED.per_constraints; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ } void FormatIndicator_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { FormatIndicator_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int FormatIndicator_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { FormatIndicator_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t FormatIndicator_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { FormatIndicator_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t FormatIndicator_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { FormatIndicator_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t FormatIndicator_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { FormatIndicator_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t FormatIndicator_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { FormatIndicator_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t FormatIndicator_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { FormatIndicator_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t FormatIndicator_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { FormatIndicator_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_FormatIndicator_constr_1 = { { APC_CONSTRAINED | APC_EXTENSIBLE, 3, 3, 0, 7 } /* (0..7,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_INTEGER_enum_map_t asn_MAP_FormatIndicator_value2enum_1[] = { { 0, 11, "logicalName" }, { 1, 13, "e-mailAddress" }, { 2, 6, "msisdn" }, { 3, 3, "url" }, { 4, 6, "sipUrl" }, { 5, 3, "min" }, { 6, 3, "mdn" }, { 7, 17, "imsPublicIdentity" } /* This list is extensible */ }; static unsigned int asn_MAP_FormatIndicator_enum2value_1[] = { 1, /* e-mailAddress(1) */ 7, /* imsPublicIdentity(7) */ 0, /* logicalName(0) */ 6, /* mdn(6) */ 5, /* min(5) */ 2, /* msisdn(2) */ 4, /* sipUrl(4) */ 3 /* url(3) */ /* This list is extensible */ }; static asn_INTEGER_specifics_t asn_SPC_FormatIndicator_specs_1 = { asn_MAP_FormatIndicator_value2enum_1, /* "tag" => N; sorted by tag */ asn_MAP_FormatIndicator_enum2value_1, /* N => "tag"; sorted by N */ 8, /* Number of elements in the maps */ 9, /* Extensions before this member */ 1, /* Strict enumeration */ 0, /* Native long size */ 0 }; static ber_tlv_tag_t asn_DEF_FormatIndicator_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; asn_TYPE_descriptor_t asn_DEF_FormatIndicator = { "FormatIndicator", "FormatIndicator", FormatIndicator_free, FormatIndicator_print, FormatIndicator_constraint, FormatIndicator_decode_ber, FormatIndicator_encode_der, FormatIndicator_decode_xer, FormatIndicator_encode_xer, FormatIndicator_decode_uper, FormatIndicator_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_FormatIndicator_tags_1, sizeof(asn_DEF_FormatIndicator_tags_1) /sizeof(asn_DEF_FormatIndicator_tags_1[0]), /* 1 */ asn_DEF_FormatIndicator_tags_1, /* Same as above */ sizeof(asn_DEF_FormatIndicator_tags_1) /sizeof(asn_DEF_FormatIndicator_tags_1[0]), /* 1 */ &asn_PER_type_FormatIndicator_constr_1, 0, 0, /* Defined elsewhere */ &asn_SPC_FormatIndicator_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/FormatIndicator.h000066400000000000000000000024451305042567700237310ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-INIT" * found in "../supl-init.asn" */ #ifndef _FormatIndicator_H_ #define _FormatIndicator_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum FormatIndicator { FormatIndicator_logicalName = 0, FormatIndicator_e_mailAddress = 1, FormatIndicator_msisdn = 2, FormatIndicator_url = 3, FormatIndicator_sipUrl = 4, FormatIndicator_min = 5, FormatIndicator_mdn = 6, FormatIndicator_imsPublicIdentity = 7 /* * Enumeration is extensible */ } e_FormatIndicator; /* FormatIndicator */ typedef ENUMERATED_t FormatIndicator_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_FormatIndicator; asn_struct_free_f FormatIndicator_free; asn_struct_print_f FormatIndicator_print; asn_constr_check_f FormatIndicator_constraint; ber_type_decoder_f FormatIndicator_decode_ber; der_type_encoder_f FormatIndicator_encode_der; xer_type_decoder_f FormatIndicator_decode_xer; xer_type_encoder_f FormatIndicator_encode_xer; per_type_decoder_f FormatIndicator_decode_uper; per_type_encoder_f FormatIndicator_encode_uper; #ifdef __cplusplus } #endif #endif /* _FormatIndicator_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/FrequencyInfo.c000066400000000000000000000074241305042567700234160ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "FrequencyInfo.h" static asn_per_constraints_t asn_PER_type_fmodeSpecificInfo_constr_2 = { { APC_CONSTRAINED | APC_EXTENSIBLE, 1, 1, 0, 1 } /* (0..1,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_fmodeSpecificInfo_2[] = { { ATF_NOFLAGS, 0, offsetof(struct fmodeSpecificInfo, choice.fdd), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_FrequencyInfoFDD, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "fdd" }, { ATF_NOFLAGS, 0, offsetof(struct fmodeSpecificInfo, choice.tdd), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_FrequencyInfoTDD, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "tdd" }, }; static asn_TYPE_tag2member_t asn_MAP_fmodeSpecificInfo_tag2el_2[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* fdd at 122 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* tdd at 123 */ }; static asn_CHOICE_specifics_t asn_SPC_fmodeSpecificInfo_specs_2 = { sizeof(struct fmodeSpecificInfo), offsetof(struct fmodeSpecificInfo, _asn_ctx), offsetof(struct fmodeSpecificInfo, present), sizeof(((struct fmodeSpecificInfo *)0)->present), asn_MAP_fmodeSpecificInfo_tag2el_2, 2, /* Count of tags in the map */ 0, 2 /* Extensions start */ }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_fmodeSpecificInfo_2 = { "fmodeSpecificInfo", "fmodeSpecificInfo", CHOICE_free, CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_decode_uper, CHOICE_encode_uper, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ &asn_PER_type_fmodeSpecificInfo_constr_2, asn_MBR_fmodeSpecificInfo_2, 2, /* Elements count */ &asn_SPC_fmodeSpecificInfo_specs_2 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_FrequencyInfo_1[] = { { ATF_NOFLAGS, 0, offsetof(struct FrequencyInfo, fmodeSpecificInfo), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), +1, /* EXPLICIT tag at current level */ &asn_DEF_fmodeSpecificInfo_2, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "fmodeSpecificInfo" }, }; static ber_tlv_tag_t asn_DEF_FrequencyInfo_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_FrequencyInfo_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* fmodeSpecificInfo at 122 */ }; static asn_SEQUENCE_specifics_t asn_SPC_FrequencyInfo_specs_1 = { sizeof(struct FrequencyInfo), offsetof(struct FrequencyInfo, _asn_ctx), asn_MAP_FrequencyInfo_tag2el_1, 1, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ 0, /* Start extensions */ 2 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_FrequencyInfo = { "FrequencyInfo", "FrequencyInfo", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_FrequencyInfo_tags_1, sizeof(asn_DEF_FrequencyInfo_tags_1) /sizeof(asn_DEF_FrequencyInfo_tags_1[0]), /* 1 */ asn_DEF_FrequencyInfo_tags_1, /* Same as above */ sizeof(asn_DEF_FrequencyInfo_tags_1) /sizeof(asn_DEF_FrequencyInfo_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_FrequencyInfo_1, 1, /* Elements count */ &asn_SPC_FrequencyInfo_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/FrequencyInfo.h000066400000000000000000000025601305042567700234170ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _FrequencyInfo_H_ #define _FrequencyInfo_H_ #include /* Including external dependencies */ #include "FrequencyInfoFDD.h" #include "FrequencyInfoTDD.h" #include #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum fmodeSpecificInfo_PR { fmodeSpecificInfo_PR_NOTHING, /* No components present */ fmodeSpecificInfo_PR_fdd, fmodeSpecificInfo_PR_tdd, /* Extensions may appear below */ } fmodeSpecificInfo_PR; /* FrequencyInfo */ typedef struct FrequencyInfo { struct fmodeSpecificInfo { fmodeSpecificInfo_PR present; union FrequencyInfo__fmodeSpecificInfo_u { FrequencyInfoFDD_t fdd; FrequencyInfoTDD_t tdd; /* * This type is extensible, * possible extensions are below. */ } choice; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } fmodeSpecificInfo; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } FrequencyInfo_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_FrequencyInfo; #ifdef __cplusplus } #endif #endif /* _FrequencyInfo_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/FrequencyInfoFDD.c000066400000000000000000000043571305042567700237360ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "FrequencyInfoFDD.h" static asn_TYPE_member_t asn_MBR_FrequencyInfoFDD_1[] = { { ATF_POINTER, 1, offsetof(struct FrequencyInfoFDD, uarfcn_UL), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_UARFCN, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "uarfcn-UL" }, { ATF_NOFLAGS, 0, offsetof(struct FrequencyInfoFDD, uarfcn_DL), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_UARFCN, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "uarfcn-DL" }, }; static int asn_MAP_FrequencyInfoFDD_oms_1[] = { 0 }; static ber_tlv_tag_t asn_DEF_FrequencyInfoFDD_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_FrequencyInfoFDD_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* uarfcn-UL at 128 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* uarfcn-DL at 129 */ }; static asn_SEQUENCE_specifics_t asn_SPC_FrequencyInfoFDD_specs_1 = { sizeof(struct FrequencyInfoFDD), offsetof(struct FrequencyInfoFDD, _asn_ctx), asn_MAP_FrequencyInfoFDD_tag2el_1, 2, /* Count of tags in the map */ asn_MAP_FrequencyInfoFDD_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ 1, /* Start extensions */ 3 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_FrequencyInfoFDD = { "FrequencyInfoFDD", "FrequencyInfoFDD", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_FrequencyInfoFDD_tags_1, sizeof(asn_DEF_FrequencyInfoFDD_tags_1) /sizeof(asn_DEF_FrequencyInfoFDD_tags_1[0]), /* 1 */ asn_DEF_FrequencyInfoFDD_tags_1, /* Same as above */ sizeof(asn_DEF_FrequencyInfoFDD_tags_1) /sizeof(asn_DEF_FrequencyInfoFDD_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_FrequencyInfoFDD_1, 2, /* Elements count */ &asn_SPC_FrequencyInfoFDD_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/FrequencyInfoFDD.h000066400000000000000000000014561305042567700237400ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _FrequencyInfoFDD_H_ #define _FrequencyInfoFDD_H_ #include /* Including external dependencies */ #include "UARFCN.h" #include #ifdef __cplusplus extern "C" { #endif /* FrequencyInfoFDD */ typedef struct FrequencyInfoFDD { UARFCN_t *uarfcn_UL /* OPTIONAL */; UARFCN_t uarfcn_DL; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } FrequencyInfoFDD_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_FrequencyInfoFDD; #ifdef __cplusplus } #endif #endif /* _FrequencyInfoFDD_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/FrequencyInfoTDD.c000066400000000000000000000034561305042567700237530ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "FrequencyInfoTDD.h" static asn_TYPE_member_t asn_MBR_FrequencyInfoTDD_1[] = { { ATF_NOFLAGS, 0, offsetof(struct FrequencyInfoTDD, uarfcn_Nt), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_UARFCN, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "uarfcn-Nt" }, }; static ber_tlv_tag_t asn_DEF_FrequencyInfoTDD_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_FrequencyInfoTDD_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* uarfcn-Nt at 132 */ }; static asn_SEQUENCE_specifics_t asn_SPC_FrequencyInfoTDD_specs_1 = { sizeof(struct FrequencyInfoTDD), offsetof(struct FrequencyInfoTDD, _asn_ctx), asn_MAP_FrequencyInfoTDD_tag2el_1, 1, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ 0, /* Start extensions */ 2 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_FrequencyInfoTDD = { "FrequencyInfoTDD", "FrequencyInfoTDD", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_FrequencyInfoTDD_tags_1, sizeof(asn_DEF_FrequencyInfoTDD_tags_1) /sizeof(asn_DEF_FrequencyInfoTDD_tags_1[0]), /* 1 */ asn_DEF_FrequencyInfoTDD_tags_1, /* Same as above */ sizeof(asn_DEF_FrequencyInfoTDD_tags_1) /sizeof(asn_DEF_FrequencyInfoTDD_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_FrequencyInfoTDD_1, 1, /* Elements count */ &asn_SPC_FrequencyInfoTDD_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/FrequencyInfoTDD.h000066400000000000000000000014111305042567700237450ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _FrequencyInfoTDD_H_ #define _FrequencyInfoTDD_H_ #include /* Including external dependencies */ #include "UARFCN.h" #include #ifdef __cplusplus extern "C" { #endif /* FrequencyInfoTDD */ typedef struct FrequencyInfoTDD { UARFCN_t uarfcn_Nt; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } FrequencyInfoTDD_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_FrequencyInfoTDD; #ifdef __cplusplus } #endif #endif /* _FrequencyInfoTDD_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/GeneralizedTime.c000066400000000000000000000361061305042567700237100ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #define _POSIX_PTHREAD_SEMANTICS /* for Sun */ #define _REENTRANT /* for Sun */ #include #include #include #ifdef __CYGWIN__ #include "/usr/include/time.h" #else #include #endif /* __CYGWIN__ */ #if defined(WIN32) #pragma message( "PLEASE STOP AND READ!") #pragma message( " localtime_r is implemented via localtime(), which may be not thread-safe.") #pragma message( " gmtime_r is implemented via gmtime(), which may be not thread-safe.") #pragma message( " ") #pragma message( " You must fix the code by inserting appropriate locking") #pragma message( " if you want to use asn_GT2time() or asn_UT2time().") #pragma message( "PLEASE STOP AND READ!") static struct tm *localtime_r(const time_t *tloc, struct tm *result) { struct tm *tm; if((tm = localtime(tloc))) return memcpy(result, tm, sizeof(struct tm)); return 0; } static struct tm *gmtime_r(const time_t *tloc, struct tm *result) { struct tm *tm; if((tm = gmtime(tloc))) return memcpy(result, tm, sizeof(struct tm)); return 0; } #define tzset() _tzset() #define putenv(c) _putenv(c) #define _EMULATE_TIMEGM #endif /* WIN32 */ #if defined(sun) || defined(_sun_) || defined(__solaris__) #define _EMULATE_TIMEGM #endif /* * Where to look for offset from GMT, Phase I. * Several platforms are known. */ #if defined(__FreeBSD__) \ || (defined(__GNUC__) && defined(__APPLE_CC__)) \ || (defined __GLIBC__ && __GLIBC__ >= 2) #undef HAVE_TM_GMTOFF #define HAVE_TM_GMTOFF #endif /* BSDs and newer glibc */ /* * Where to look for offset from GMT, Phase II. */ #ifdef HAVE_TM_GMTOFF #define GMTOFF(tm) ((tm).tm_gmtoff) #else /* HAVE_TM_GMTOFF */ #define GMTOFF(tm) (-timezone) #endif /* HAVE_TM_GMTOFF */ #if (defined(_EMULATE_TIMEGM) || !defined(HAVE_TM_GMTOFF)) #warning "PLEASE STOP AND READ!" #warning " timegm() is implemented via getenv(\"TZ\")/setenv(\"TZ\"), which may be not thread-safe." #warning " " #warning " You must fix the code by inserting appropriate locking" #warning " if you want to use asn_GT2time() or asn_UT2time()." #warning "PLEASE STOP AND READ!" #endif /* _EMULATE_TIMEGM */ /* * Override our GMTOFF decision for other known platforms. */ #ifdef __CYGWIN__ #undef GMTOFF static long GMTOFF(struct tm a){ struct tm *lt; time_t local_time, gmt_time; long zone; tzset(); gmt_time = time (NULL); lt = gmtime(&gmt_time); local_time = mktime(lt); return (gmt_time - local_time); } #define _EMULATE_TIMEGM #endif /* __CYGWIN__ */ #define ATZVARS do { \ char tzoldbuf[64]; \ char *tzold #define ATZSAVETZ do { \ tzold = getenv("TZ"); \ if(tzold) { \ size_t tzlen = strlen(tzold); \ if(tzlen < sizeof(tzoldbuf)) { \ tzold = memcpy(tzoldbuf, tzold, tzlen + 1); \ } else { \ char *dupptr = tzold; \ tzold = MALLOC(tzlen + 1); \ if(tzold) memcpy(tzold, dupptr, tzlen + 1); \ } \ setenv("TZ", "UTC", 1); \ } \ tzset(); \ } while(0) #define ATZOLDTZ do { \ if (tzold) { \ setenv("TZ", tzold, 1); \ *tzoldbuf = 0; \ if(tzold != tzoldbuf) \ FREEMEM(tzold); \ } else { \ unsetenv("TZ"); \ } \ tzset(); \ } while(0); } while(0); #ifdef _EMULATE_TIMEGM static time_t timegm(struct tm *tm) { time_t tloc; ATZVARS; ATZSAVETZ; tloc = mktime(tm); ATZOLDTZ; return tloc; } #endif /* _EMULATE_TIMEGM */ #ifndef __ASN_INTERNAL_TEST_MODE__ /* * GeneralizedTime basic type description. */ static ber_tlv_tag_t asn_DEF_GeneralizedTime_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (24 << 2)), /* [UNIVERSAL 24] IMPLICIT ...*/ (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), /* [UNIVERSAL 26] IMPLICIT ...*/ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; static asn_per_constraints_t asn_DEF_GeneralizedTime_constraints = { { APC_CONSTRAINED, 7, 7, 0x20, 0x7e }, /* Value */ { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 }, /* Size */ 0, 0 }; asn_TYPE_descriptor_t asn_DEF_GeneralizedTime = { "GeneralizedTime", "GeneralizedTime", OCTET_STRING_free, GeneralizedTime_print, GeneralizedTime_constraint, /* Check validity of time */ OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ GeneralizedTime_encode_der, OCTET_STRING_decode_xer_utf8, GeneralizedTime_encode_xer, OCTET_STRING_decode_uper, OCTET_STRING_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GeneralizedTime_tags, sizeof(asn_DEF_GeneralizedTime_tags) / sizeof(asn_DEF_GeneralizedTime_tags[0]) - 2, asn_DEF_GeneralizedTime_tags, sizeof(asn_DEF_GeneralizedTime_tags) / sizeof(asn_DEF_GeneralizedTime_tags[0]), &asn_DEF_GeneralizedTime_constraints, 0, 0, /* No members */ 0 /* No specifics */ }; #endif /* __ASN_INTERNAL_TEST_MODE__ */ /* * Check that the time looks like the time. */ int GeneralizedTime_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const GeneralizedTime_t *st = (const GeneralizedTime_t *)sptr; time_t tloc; errno = EPERM; /* Just an unlikely error code */ tloc = asn_GT2time(st, 0, 0); if(tloc == -1 && errno != EPERM) { _ASN_CTFAIL(app_key, td, sptr, "%s: Invalid time format: %s (%s:%d)", td->name, strerror(errno), __FILE__, __LINE__); return -1; } return 0; } asn_enc_rval_t GeneralizedTime_encode_der(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { GeneralizedTime_t *st = (GeneralizedTime_t *)sptr; asn_enc_rval_t erval; int fv, fd; /* seconds fraction value and number of digits */ struct tm tm; time_t tloc; /* * Encode as a canonical DER. */ errno = EPERM; tloc = asn_GT2time_frac(st, &fv, &fd, &tm, 1); /* Recognize time */ if(tloc == -1 && errno != EPERM) /* Failed to recognize time. Fail completely. */ _ASN_ENCODE_FAILED; st = asn_time2GT_frac(0, &tm, fv, fd, 1); /* Save time canonically */ if(!st) _ASN_ENCODE_FAILED; /* Memory allocation failure. */ erval = OCTET_STRING_encode_der(td, st, tag_mode, tag, cb, app_key); FREEMEM(st->buf); FREEMEM(st); return erval; } #ifndef __ASN_INTERNAL_TEST_MODE__ asn_enc_rval_t GeneralizedTime_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { if(flags & XER_F_CANONICAL) { GeneralizedTime_t *gt; asn_enc_rval_t rv; int fv, fd; /* fractional parts */ struct tm tm; errno = EPERM; if(asn_GT2time_frac((GeneralizedTime_t *)sptr, &fv, &fd, &tm, 1) == -1 && errno != EPERM) _ASN_ENCODE_FAILED; gt = asn_time2GT_frac(0, &tm, fv, fd, 1); if(!gt) _ASN_ENCODE_FAILED; rv = OCTET_STRING_encode_xer_utf8(td, sptr, ilevel, flags, cb, app_key); ASN_STRUCT_FREE(asn_DEF_GeneralizedTime, gt); return rv; } else { return OCTET_STRING_encode_xer_utf8(td, sptr, ilevel, flags, cb, app_key); } } #endif /* __ASN_INTERNAL_TEST_MODE__ */ int GeneralizedTime_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const GeneralizedTime_t *st = (const GeneralizedTime_t *)sptr; (void)td; /* Unused argument */ (void)ilevel; /* Unused argument */ if(st && st->buf) { char buf[32]; struct tm tm; int ret; errno = EPERM; if(asn_GT2time(st, &tm, 1) == -1 && errno != EPERM) return (cb("", 11, app_key) < 0) ? -1 : 0; ret = snprintf(buf, sizeof(buf), "%04d-%02d-%02d %02d:%02d:%02d (GMT)", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); assert(ret > 0 && ret < (int)sizeof(buf)); return (cb(buf, ret, app_key) < 0) ? -1 : 0; } else { return (cb("", 8, app_key) < 0) ? -1 : 0; } } time_t asn_GT2time(const GeneralizedTime_t *st, struct tm *ret_tm, int as_gmt) { return asn_GT2time_frac(st, 0, 0, ret_tm, as_gmt); } time_t asn_GT2time_prec(const GeneralizedTime_t *st, int *frac_value, int frac_digits, struct tm *ret_tm, int as_gmt) { time_t tloc; int fv, fd = 0; if(frac_value) tloc = asn_GT2time_frac(st, &fv, &fd, ret_tm, as_gmt); else return asn_GT2time_frac(st, 0, 0, ret_tm, as_gmt); if(fd == 0 || frac_digits <= 0) { *frac_value = 0; } else { while(fd > frac_digits) fv /= 10, fd--; while(fd < frac_digits) { int new_fv = fv * 10; if(new_fv / 10 != fv) { /* Too long precision request */ fv = 0; break; } fv = new_fv, fd++; } *frac_value = fv; } return tloc; } time_t asn_GT2time_frac(const GeneralizedTime_t *st, int *frac_value, int *frac_digits, struct tm *ret_tm, int as_gmt) { struct tm tm_s; uint8_t *buf; uint8_t *end; int gmtoff_h = 0; int gmtoff_m = 0; int gmtoff = 0; /* h + m */ int offset_specified = 0; int fvalue = 0; int fdigits = 0; time_t tloc; if(!st || !st->buf) { errno = EINVAL; return -1; } else { buf = st->buf; end = buf + st->size; } if(st->size < 10) { errno = EINVAL; return -1; } /* * Decode first 10 bytes: "AAAAMMJJhh" */ memset(&tm_s, 0, sizeof(tm_s)); #undef B2F #undef B2T #define B2F(var) do { \ unsigned ch = *buf; \ if(ch < 0x30 || ch > 0x39) { \ errno = EINVAL; \ return -1; \ } else { \ var = var * 10 + (ch - 0x30); \ buf++; \ } \ } while(0) #define B2T(var) B2F(tm_s.var) B2T(tm_year); /* 1: A */ B2T(tm_year); /* 2: A */ B2T(tm_year); /* 3: A */ B2T(tm_year); /* 4: A */ B2T(tm_mon); /* 5: M */ B2T(tm_mon); /* 6: M */ B2T(tm_mday); /* 7: J */ B2T(tm_mday); /* 8: J */ B2T(tm_hour); /* 9: h */ B2T(tm_hour); /* 0: h */ if(buf == end) goto local_finish; /* * Parse [mm[ss[(.|,)ffff]]] * ^^ */ switch(*buf) { case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: tm_s.tm_min = (*buf++) - 0x30; if(buf == end) { errno = EINVAL; return -1; } B2T(tm_min); break; case 0x2B: case 0x2D: /* +, - */ goto offset; case 0x5A: /* Z */ goto utc_finish; default: errno = EINVAL; return -1; } if(buf == end) goto local_finish; /* * Parse [mm[ss[(.|,)ffff]]] * ^^ */ switch(*buf) { case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: tm_s.tm_sec = (*buf++) - 0x30; if(buf == end) { errno = EINVAL; return -1; } B2T(tm_sec); break; case 0x2B: case 0x2D: /* +, - */ goto offset; case 0x5A: /* Z */ goto utc_finish; default: errno = EINVAL; return -1; } if(buf == end) goto local_finish; /* * Parse [mm[ss[(.|,)ffff]]] * ^ ^ */ switch(*buf) { case 0x2C: case 0x2E: /* (.|,) */ /* * Process fractions of seconds. */ for(buf++; buf < end; buf++) { int v = *buf; int new_fvalue; switch(v) { case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: new_fvalue = fvalue * 10 + (v - 0x30); if(new_fvalue / 10 != fvalue) { /* Not enough precision, ignore */ } else { fvalue = new_fvalue; fdigits++; } continue; default: break; } break; } } if(buf == end) goto local_finish; switch(*buf) { case 0x2B: case 0x2D: /* +, - */ goto offset; case 0x5A: /* Z */ goto utc_finish; default: errno = EINVAL; return -1; } offset: if(end - buf < 3) { errno = EINVAL; return -1; } buf++; B2F(gmtoff_h); B2F(gmtoff_h); if(buf[-3] == 0x2D) /* Negative */ gmtoff = -1; else gmtoff = 1; if((end - buf) == 2) { B2F(gmtoff_m); B2F(gmtoff_m); } else if(end != buf) { errno = EINVAL; return -1; } gmtoff = gmtoff * (3600 * gmtoff_h + 60 * gmtoff_m); /* Fall through */ utc_finish: offset_specified = 1; /* Fall through */ local_finish: /* * Validation. */ if((tm_s.tm_mon > 12 || tm_s.tm_mon < 1) || (tm_s.tm_mday > 31 || tm_s.tm_mday < 1) || (tm_s.tm_hour > 23) || (tm_s.tm_sec > 60) ) { errno = EINVAL; return -1; } /* Canonicalize */ tm_s.tm_mon -= 1; /* 0 - 11 */ tm_s.tm_year -= 1900; tm_s.tm_isdst = -1; tm_s.tm_sec -= gmtoff; /*** AT THIS POINT tm_s is either GMT or local (unknown) ****/ if(offset_specified) { tloc = timegm(&tm_s); } else { /* * Without an offset (or "Z"), * we can only guess that it is a local zone. * Interpret it in this fashion. */ tloc = mktime(&tm_s); } if(tloc == -1) { errno = EINVAL; return -1; } if(ret_tm) { if(as_gmt) { if(offset_specified) { *ret_tm = tm_s; } else { if(gmtime_r(&tloc, ret_tm) == 0) { errno = EINVAL; return -1; } } } else { if(localtime_r(&tloc, ret_tm) == 0) { errno = EINVAL; return -1; } } } /* Fractions of seconds */ if(frac_value) *frac_value = fvalue; if(frac_digits) *frac_digits = fdigits; return tloc; } GeneralizedTime_t * asn_time2GT(GeneralizedTime_t *opt_gt, const struct tm *tm, int force_gmt) { return asn_time2GT_frac(opt_gt, tm, 0, 0, force_gmt); } GeneralizedTime_t * asn_time2GT_frac(GeneralizedTime_t *opt_gt, const struct tm *tm, int frac_value, int frac_digits, int force_gmt) { struct tm tm_s; long gmtoff; const unsigned int buf_size = 4 + 2 + 2 /* yyyymmdd */ + 2 + 2 + 2 /* hhmmss */ + 1 + 6 /* .ffffff */ + 1 + 4 /* +hhmm */ + 1 /* '\0' */ ; char *buf; char *p; int size; /* Check arguments */ if(!tm) { errno = EINVAL; return 0; } /* Pre-allocate a buffer of sufficient yet small length */ buf = (char *)MALLOC(buf_size); if(!buf) return 0; gmtoff = GMTOFF(*tm); if(force_gmt && gmtoff) { tm_s = *tm; tm_s.tm_sec -= gmtoff; timegm(&tm_s); /* Fix the time */ tm = &tm_s; #ifdef HAVE_TM_GMTOFF assert(!GMTOFF(tm_s)); /* Will fix itself */ #else /* !HAVE_TM_GMTOFF */ gmtoff = 0; #endif } size = snprintf(buf, buf_size, "%04d%02d%02d%02d%02d%02d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec ); if(size != 14) { /* Could be assert(size == 14); */ FREEMEM(buf); errno = EINVAL; return 0; } p = buf + size; /* * Deal with fractions. */ if(frac_value > 0 && frac_digits > 0) { char *end = p + 1 + 6; /* '.' + maximum 6 digits */ char *z = p; long fbase; *z++ = '.'; /* Place bounds on precision */ while(frac_digits-- > 6) frac_value /= 10; /* emulate fbase = pow(10, frac_digits) */ for(fbase = 1; frac_digits--;) fbase *= 10; do { int digit = frac_value / fbase; if(digit > 9) { z = 0; break; } *z++ = digit + 0x30; frac_value %= fbase; fbase /= 10; } while(fbase > 0 && frac_value > 0 && z < end); if(z) { for(--z; *z == 0x30; --z); /* Strip zeroes */ p = z + (*z != '.'); size = p - buf; } } if(force_gmt) { *p++ = 0x5a; /* "Z" */ *p++ = 0; size++; } else { int ret; gmtoff %= 86400; ret = snprintf(p, buf_size - size, "%+03ld%02ld", gmtoff / 3600, labs(gmtoff % 3600) / 60); if(ret != 5) { FREEMEM(buf); errno = EINVAL; return 0; } size += ret; } if(opt_gt) { if(opt_gt->buf) FREEMEM(opt_gt->buf); } else { opt_gt = (GeneralizedTime_t *)CALLOC(1, sizeof *opt_gt); if(!opt_gt) { FREEMEM(buf); return 0; } } opt_gt->buf = (unsigned char *)buf; opt_gt->size = size; return opt_gt; } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/GeneralizedTime.h000066400000000000000000000042411305042567700237100ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _GeneralizedTime_H_ #define _GeneralizedTime_H_ #include #ifdef __cplusplus extern "C" { #endif typedef OCTET_STRING_t GeneralizedTime_t; /* Implemented via OCTET STRING */ extern asn_TYPE_descriptor_t asn_DEF_GeneralizedTime; asn_struct_print_f GeneralizedTime_print; asn_constr_check_f GeneralizedTime_constraint; der_type_encoder_f GeneralizedTime_encode_der; xer_type_encoder_f GeneralizedTime_encode_xer; /*********************** * Some handy helpers. * ***********************/ struct tm; /* */ /* * Convert a GeneralizedTime structure into time_t * and optionally into struct tm. * If as_gmt is given, the resulting _optional_tm4fill will have a GMT zone, * instead of default local one. * On error returns -1 and errno set to EINVAL */ time_t asn_GT2time(const GeneralizedTime_t *, struct tm *_optional_tm4fill, int as_gmt); /* A version of the above function also returning the fractions of seconds */ time_t asn_GT2time_frac(const GeneralizedTime_t *, int *frac_value, int *frac_digits, /* (value / (10 ^ digits)) */ struct tm *_optional_tm4fill, int as_gmt); /* * Another version returning fractions with defined precision * For example, parsing of the time ending with ".1" seconds * with frac_digits=3 (msec) would yield frac_value = 100. */ time_t asn_GT2time_prec(const GeneralizedTime_t *, int *frac_value, int frac_digits, struct tm *_optional_tm4fill, int as_gmt); /* * Convert a struct tm into GeneralizedTime. * If _optional_gt is not given, this function will try to allocate one. * If force_gmt is given, the resulting GeneralizedTime will be forced * into a GMT time zone (encoding ends with a "Z"). * On error, this function returns 0 and sets errno. */ GeneralizedTime_t *asn_time2GT(GeneralizedTime_t *_optional_gt, const struct tm *, int force_gmt); GeneralizedTime_t *asn_time2GT_frac(GeneralizedTime_t *_optional_gt, const struct tm *, int frac_value, int frac_digits, int force_gmt); #ifdef __cplusplus } #endif #endif /* _GeneralizedTime_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/GsmCellInformation.c000066400000000000000000000160131305042567700243670ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "GsmCellInformation.h" static int memb_refMCC_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 999)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_refMNC_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 999)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_refLAC_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 65535)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_refCI_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 65535)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_tA_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 255)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_refMCC_constr_2 = { { APC_CONSTRAINED, 10, 10, 0, 999 } /* (0..999) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_refMNC_constr_3 = { { APC_CONSTRAINED, 10, 10, 0, 999 } /* (0..999) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_refLAC_constr_4 = { { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_refCI_constr_5 = { { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_tA_constr_7 = { { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_GsmCellInformation_1[] = { { ATF_NOFLAGS, 0, offsetof(struct GsmCellInformation, refMCC), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_refMCC_constraint_1, &asn_PER_memb_refMCC_constr_2, 0, "refMCC" }, { ATF_NOFLAGS, 0, offsetof(struct GsmCellInformation, refMNC), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_refMNC_constraint_1, &asn_PER_memb_refMNC_constr_3, 0, "refMNC" }, { ATF_NOFLAGS, 0, offsetof(struct GsmCellInformation, refLAC), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_refLAC_constraint_1, &asn_PER_memb_refLAC_constr_4, 0, "refLAC" }, { ATF_NOFLAGS, 0, offsetof(struct GsmCellInformation, refCI), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_refCI_constraint_1, &asn_PER_memb_refCI_constr_5, 0, "refCI" }, { ATF_POINTER, 2, offsetof(struct GsmCellInformation, nMR), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NMR, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "nMR" }, { ATF_POINTER, 1, offsetof(struct GsmCellInformation, tA), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_tA_constraint_1, &asn_PER_memb_tA_constr_7, 0, "tA" }, }; static int asn_MAP_GsmCellInformation_oms_1[] = { 4, 5 }; static ber_tlv_tag_t asn_DEF_GsmCellInformation_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_GsmCellInformation_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* refMCC at 103 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* refMNC at 104 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* refLAC at 105 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* refCI at 106 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* nMR at 107 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 } /* tA at 108 */ }; static asn_SEQUENCE_specifics_t asn_SPC_GsmCellInformation_specs_1 = { sizeof(struct GsmCellInformation), offsetof(struct GsmCellInformation, _asn_ctx), asn_MAP_GsmCellInformation_tag2el_1, 6, /* Count of tags in the map */ asn_MAP_GsmCellInformation_oms_1, /* Optional members */ 2, 0, /* Root/Additions */ 5, /* Start extensions */ 7 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_GsmCellInformation = { "GsmCellInformation", "GsmCellInformation", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_GsmCellInformation_tags_1, sizeof(asn_DEF_GsmCellInformation_tags_1) /sizeof(asn_DEF_GsmCellInformation_tags_1[0]), /* 1 */ asn_DEF_GsmCellInformation_tags_1, /* Same as above */ sizeof(asn_DEF_GsmCellInformation_tags_1) /sizeof(asn_DEF_GsmCellInformation_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_GsmCellInformation_1, 6, /* Elements count */ &asn_SPC_GsmCellInformation_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/GsmCellInformation.h000066400000000000000000000017261305042567700244010ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _GsmCellInformation_H_ #define _GsmCellInformation_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct NMR; /* GsmCellInformation */ typedef struct GsmCellInformation { long refMCC; long refMNC; long refLAC; long refCI; struct NMR *nMR /* OPTIONAL */; long *tA /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } GsmCellInformation_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_GsmCellInformation; #ifdef __cplusplus } #endif /* Referred external types */ #include "NMR.h" #endif /* _GsmCellInformation_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/Horandveruncert.c000066400000000000000000000207011305042567700240030ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "Horandveruncert.h" static int memb_verdirect_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } if(st->size > 0) { /* Size in bits */ size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } if((size == 1)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_bearing_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } if(st->size > 0) { /* Size in bits */ size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } if((size == 9)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_horspeed_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } if(st->size > 0) { /* Size in bits */ size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } if((size == 16)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_verspeed_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } if(st->size > 0) { /* Size in bits */ size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } if((size == 8)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_horuncertspeed_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } if(st->size > 0) { /* Size in bits */ size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } if((size == 8)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_veruncertspeed_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } if(st->size > 0) { /* Size in bits */ size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } if((size == 8)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_verdirect_constr_2 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 1, 1 } /* (SIZE(1..1)) */, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_bearing_constr_3 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 9, 9 } /* (SIZE(9..9)) */, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_horspeed_constr_4 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 16, 16 } /* (SIZE(16..16)) */, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_verspeed_constr_5 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 8, 8 } /* (SIZE(8..8)) */, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_horuncertspeed_constr_6 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 8, 8 } /* (SIZE(8..8)) */, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_veruncertspeed_constr_7 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 8, 8 } /* (SIZE(8..8)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_Horandveruncert_1[] = { { ATF_NOFLAGS, 0, offsetof(struct Horandveruncert, verdirect), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, memb_verdirect_constraint_1, &asn_PER_memb_verdirect_constr_2, 0, "verdirect" }, { ATF_NOFLAGS, 0, offsetof(struct Horandveruncert, bearing), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, memb_bearing_constraint_1, &asn_PER_memb_bearing_constr_3, 0, "bearing" }, { ATF_NOFLAGS, 0, offsetof(struct Horandveruncert, horspeed), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, memb_horspeed_constraint_1, &asn_PER_memb_horspeed_constr_4, 0, "horspeed" }, { ATF_NOFLAGS, 0, offsetof(struct Horandveruncert, verspeed), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, memb_verspeed_constraint_1, &asn_PER_memb_verspeed_constr_5, 0, "verspeed" }, { ATF_NOFLAGS, 0, offsetof(struct Horandveruncert, horuncertspeed), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, memb_horuncertspeed_constraint_1, &asn_PER_memb_horuncertspeed_constr_6, 0, "horuncertspeed" }, { ATF_NOFLAGS, 0, offsetof(struct Horandveruncert, veruncertspeed), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, memb_veruncertspeed_constraint_1, &asn_PER_memb_veruncertspeed_constr_7, 0, "veruncertspeed" }, }; static ber_tlv_tag_t asn_DEF_Horandveruncert_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_Horandveruncert_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* verdirect at 251 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* bearing at 252 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* horspeed at 253 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* verspeed at 254 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* horuncertspeed at 255 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 } /* veruncertspeed at 256 */ }; static asn_SEQUENCE_specifics_t asn_SPC_Horandveruncert_specs_1 = { sizeof(struct Horandveruncert), offsetof(struct Horandveruncert, _asn_ctx), asn_MAP_Horandveruncert_tag2el_1, 6, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ 5, /* Start extensions */ 7 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Horandveruncert = { "Horandveruncert", "Horandveruncert", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_Horandveruncert_tags_1, sizeof(asn_DEF_Horandveruncert_tags_1) /sizeof(asn_DEF_Horandveruncert_tags_1[0]), /* 1 */ asn_DEF_Horandveruncert_tags_1, /* Same as above */ sizeof(asn_DEF_Horandveruncert_tags_1) /sizeof(asn_DEF_Horandveruncert_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_Horandveruncert_1, 6, /* Elements count */ &asn_SPC_Horandveruncert_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/Horandveruncert.h000066400000000000000000000016221305042567700240110ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _Horandveruncert_H_ #define _Horandveruncert_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Horandveruncert */ typedef struct Horandveruncert { BIT_STRING_t verdirect; BIT_STRING_t bearing; BIT_STRING_t horspeed; BIT_STRING_t verspeed; BIT_STRING_t horuncertspeed; BIT_STRING_t veruncertspeed; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } Horandveruncert_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Horandveruncert; #ifdef __cplusplus } #endif #endif /* _Horandveruncert_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/Horandvervel.c000066400000000000000000000137541305042567700233030ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "Horandvervel.h" static int memb_verdirect_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } if(st->size > 0) { /* Size in bits */ size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } if((size == 1)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_bearing_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } if(st->size > 0) { /* Size in bits */ size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } if((size == 9)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_horspeed_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } if(st->size > 0) { /* Size in bits */ size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } if((size == 16)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_verspeed_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } if(st->size > 0) { /* Size in bits */ size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } if((size == 8)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_verdirect_constr_2 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 1, 1 } /* (SIZE(1..1)) */, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_bearing_constr_3 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 9, 9 } /* (SIZE(9..9)) */, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_horspeed_constr_4 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 16, 16 } /* (SIZE(16..16)) */, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_verspeed_constr_5 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 8, 8 } /* (SIZE(8..8)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_Horandvervel_1[] = { { ATF_NOFLAGS, 0, offsetof(struct Horandvervel, verdirect), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, memb_verdirect_constraint_1, &asn_PER_memb_verdirect_constr_2, 0, "verdirect" }, { ATF_NOFLAGS, 0, offsetof(struct Horandvervel, bearing), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, memb_bearing_constraint_1, &asn_PER_memb_bearing_constr_3, 0, "bearing" }, { ATF_NOFLAGS, 0, offsetof(struct Horandvervel, horspeed), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, memb_horspeed_constraint_1, &asn_PER_memb_horspeed_constr_4, 0, "horspeed" }, { ATF_NOFLAGS, 0, offsetof(struct Horandvervel, verspeed), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, memb_verspeed_constraint_1, &asn_PER_memb_verspeed_constr_5, 0, "verspeed" }, }; static ber_tlv_tag_t asn_DEF_Horandvervel_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_Horandvervel_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* verdirect at 238 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* bearing at 239 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* horspeed at 240 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* verspeed at 241 */ }; static asn_SEQUENCE_specifics_t asn_SPC_Horandvervel_specs_1 = { sizeof(struct Horandvervel), offsetof(struct Horandvervel, _asn_ctx), asn_MAP_Horandvervel_tag2el_1, 4, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ 3, /* Start extensions */ 5 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Horandvervel = { "Horandvervel", "Horandvervel", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_Horandvervel_tags_1, sizeof(asn_DEF_Horandvervel_tags_1) /sizeof(asn_DEF_Horandvervel_tags_1[0]), /* 1 */ asn_DEF_Horandvervel_tags_1, /* Same as above */ sizeof(asn_DEF_Horandvervel_tags_1) /sizeof(asn_DEF_Horandvervel_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_Horandvervel_1, 4, /* Elements count */ &asn_SPC_Horandvervel_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/Horandvervel.h000066400000000000000000000014771305042567700233070ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _Horandvervel_H_ #define _Horandvervel_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Horandvervel */ typedef struct Horandvervel { BIT_STRING_t verdirect; BIT_STRING_t bearing; BIT_STRING_t horspeed; BIT_STRING_t verspeed; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } Horandvervel_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Horandvervel; #ifdef __cplusplus } #endif #endif /* _Horandvervel_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/Horvel.c000066400000000000000000000070611305042567700220750ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "Horvel.h" static int memb_bearing_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } if(st->size > 0) { /* Size in bits */ size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } if((size == 9)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_horspeed_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } if(st->size > 0) { /* Size in bits */ size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } if((size == 16)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_bearing_constr_2 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 9, 9 } /* (SIZE(9..9)) */, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_horspeed_constr_3 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 16, 16 } /* (SIZE(16..16)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_Horvel_1[] = { { ATF_NOFLAGS, 0, offsetof(struct Horvel, bearing), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, memb_bearing_constraint_1, &asn_PER_memb_bearing_constr_2, 0, "bearing" }, { ATF_NOFLAGS, 0, offsetof(struct Horvel, horspeed), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, memb_horspeed_constraint_1, &asn_PER_memb_horspeed_constr_3, 0, "horspeed" }, }; static ber_tlv_tag_t asn_DEF_Horvel_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_Horvel_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* bearing at 233 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* horspeed at 234 */ }; static asn_SEQUENCE_specifics_t asn_SPC_Horvel_specs_1 = { sizeof(struct Horvel), offsetof(struct Horvel, _asn_ctx), asn_MAP_Horvel_tag2el_1, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ 1, /* Start extensions */ 3 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Horvel = { "Horvel", "Horvel", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_Horvel_tags_1, sizeof(asn_DEF_Horvel_tags_1) /sizeof(asn_DEF_Horvel_tags_1[0]), /* 1 */ asn_DEF_Horvel_tags_1, /* Same as above */ sizeof(asn_DEF_Horvel_tags_1) /sizeof(asn_DEF_Horvel_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_Horvel_1, 2, /* Elements count */ &asn_SPC_Horvel_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/Horvel.h000066400000000000000000000013421305042567700220760ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _Horvel_H_ #define _Horvel_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Horvel */ typedef struct Horvel { BIT_STRING_t bearing; BIT_STRING_t horspeed; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } Horvel_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Horvel; #ifdef __cplusplus } #endif #endif /* _Horvel_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/Horveluncert.c000066400000000000000000000115371305042567700233210ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "Horveluncert.h" static int memb_bearing_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } if(st->size > 0) { /* Size in bits */ size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } if((size == 9)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_horspeed_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } if(st->size > 0) { /* Size in bits */ size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } if((size == 16)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_uncertspeed_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } if(st->size > 0) { /* Size in bits */ size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } if((size == 8)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_bearing_constr_2 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 9, 9 } /* (SIZE(9..9)) */, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_horspeed_constr_3 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 16, 16 } /* (SIZE(16..16)) */, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_uncertspeed_constr_4 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 8, 8 } /* (SIZE(8..8)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_Horveluncert_1[] = { { ATF_NOFLAGS, 0, offsetof(struct Horveluncert, bearing), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, memb_bearing_constraint_1, &asn_PER_memb_bearing_constr_2, 0, "bearing" }, { ATF_NOFLAGS, 0, offsetof(struct Horveluncert, horspeed), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, memb_horspeed_constraint_1, &asn_PER_memb_horspeed_constr_3, 0, "horspeed" }, { ATF_NOFLAGS, 0, offsetof(struct Horveluncert, uncertspeed), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, memb_uncertspeed_constraint_1, &asn_PER_memb_uncertspeed_constr_4, 0, "uncertspeed" }, }; static ber_tlv_tag_t asn_DEF_Horveluncert_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_Horveluncert_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* bearing at 245 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* horspeed at 246 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* uncertspeed at 247 */ }; static asn_SEQUENCE_specifics_t asn_SPC_Horveluncert_specs_1 = { sizeof(struct Horveluncert), offsetof(struct Horveluncert, _asn_ctx), asn_MAP_Horveluncert_tag2el_1, 3, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ 2, /* Start extensions */ 4 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Horveluncert = { "Horveluncert", "Horveluncert", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_Horveluncert_tags_1, sizeof(asn_DEF_Horveluncert_tags_1) /sizeof(asn_DEF_Horveluncert_tags_1[0]), /* 1 */ asn_DEF_Horveluncert_tags_1, /* Same as above */ sizeof(asn_DEF_Horveluncert_tags_1) /sizeof(asn_DEF_Horveluncert_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_Horveluncert_1, 3, /* Elements count */ &asn_SPC_Horveluncert_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/Horveluncert.h000066400000000000000000000014501305042567700233170ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _Horveluncert_H_ #define _Horveluncert_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Horveluncert */ typedef struct Horveluncert { BIT_STRING_t bearing; BIT_STRING_t horspeed; BIT_STRING_t uncertspeed; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } Horveluncert_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Horveluncert; #ifdef __cplusplus } #endif #endif /* _Horveluncert_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/IA5String.c000066400000000000000000000040641305042567700224030ustar00rootroot00000000000000/*- * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include /* * IA5String basic type description. */ static ber_tlv_tag_t asn_DEF_IA5String_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)), /* [UNIVERSAL 22] IMPLICIT ...*/ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; static asn_per_constraints_t asn_DEF_IA5String_constraints = { { APC_CONSTRAINED, 7, 7, 0, 0x7f }, /* Value */ { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 }, /* Size */ 0, 0 }; asn_TYPE_descriptor_t asn_DEF_IA5String = { "IA5String", "IA5String", OCTET_STRING_free, OCTET_STRING_print_utf8, /* ASCII subset */ IA5String_constraint, /* Constraint on the alphabet */ OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, OCTET_STRING_decode_xer_utf8, OCTET_STRING_encode_xer_utf8, OCTET_STRING_decode_uper, OCTET_STRING_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_IA5String_tags, sizeof(asn_DEF_IA5String_tags) / sizeof(asn_DEF_IA5String_tags[0]) - 1, asn_DEF_IA5String_tags, sizeof(asn_DEF_IA5String_tags) / sizeof(asn_DEF_IA5String_tags[0]), &asn_DEF_IA5String_constraints, 0, 0, /* No members */ 0 /* No specifics */ }; int IA5String_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const IA5String_t *st = (const IA5String_t *)sptr; if(st && st->buf) { uint8_t *buf = st->buf; uint8_t *end = buf + st->size; /* * IA5String is generally equivalent to 7bit ASCII. * ISO/ITU-T T.50, 1963. */ for(; buf < end; buf++) { if(*buf > 0x7F) { _ASN_CTFAIL(app_key, td, sptr, "%s: value byte %ld out of range: " "%d > 127 (%s:%d)", td->name, (long)((buf - st->buf) + 1), *buf, __FILE__, __LINE__); return -1; } } } else { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } return 0; } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/IA5String.h000066400000000000000000000010221305042567700223770ustar00rootroot00000000000000/*- * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _IA5String_H_ #define _IA5String_H_ #include #ifdef __cplusplus extern "C" { #endif typedef OCTET_STRING_t IA5String_t; /* Implemented via OCTET STRING */ /* * IA5String ASN.1 type definition. */ extern asn_TYPE_descriptor_t asn_DEF_IA5String; asn_constr_check_f IA5String_constraint; #ifdef __cplusplus } #endif #endif /* _IA5String_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/INTEGER.c000066400000000000000000000543541305042567700217420ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004, 2005, 2006, 2007 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include /* Encoder and decoder of a primitive type */ #include /* * INTEGER basic type description. */ static ber_tlv_tag_t asn_DEF_INTEGER_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_INTEGER = { "INTEGER", "INTEGER", ASN__PRIMITIVE_TYPE_free, INTEGER_print, asn_generic_no_constraint, ber_decode_primitive, INTEGER_encode_der, INTEGER_decode_xer, INTEGER_encode_xer, INTEGER_decode_uper, /* Unaligned PER decoder */ INTEGER_encode_uper, /* Unaligned PER encoder */ 0, /* Use generic outmost tag fetcher */ asn_DEF_INTEGER_tags, sizeof(asn_DEF_INTEGER_tags) / sizeof(asn_DEF_INTEGER_tags[0]), asn_DEF_INTEGER_tags, /* Same as above */ sizeof(asn_DEF_INTEGER_tags) / sizeof(asn_DEF_INTEGER_tags[0]), 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; /* * Encode INTEGER type using DER. */ asn_enc_rval_t INTEGER_encode_der(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { INTEGER_t *st = (INTEGER_t *)sptr; ASN_DEBUG("%s %s as INTEGER (tm=%d)", cb?"Encoding":"Estimating", td->name, tag_mode); /* * Canonicalize integer in the buffer. * (Remove too long sign extension, remove some first 0x00 bytes) */ if(st->buf) { uint8_t *buf = st->buf; uint8_t *end1 = buf + st->size - 1; int shift; /* Compute the number of superfluous leading bytes */ for(; buf < end1; buf++) { /* * If the contents octets of an integer value encoding * consist of more than one octet, then the bits of the * first octet and bit 8 of the second octet: * a) shall not all be ones; and * b) shall not all be zero. */ switch(*buf) { case 0x00: if((buf[1] & 0x80) == 0) continue; break; case 0xff: if((buf[1] & 0x80)) continue; break; } break; } /* Remove leading superfluous bytes from the integer */ shift = buf - st->buf; if(shift) { uint8_t *nb = st->buf; uint8_t *end; st->size -= shift; /* New size, minus bad bytes */ end = nb + st->size; for(; nb < end; nb++, buf++) *nb = *buf; } } /* if(1) */ return der_encode_primitive(td, sptr, tag_mode, tag, cb, app_key); } static const asn_INTEGER_enum_map_t *INTEGER_map_enum2value(asn_INTEGER_specifics_t *specs, const char *lstart, const char *lstop); /* * INTEGER specific human-readable output. */ static ssize_t INTEGER__dump(asn_TYPE_descriptor_t *td, const INTEGER_t *st, asn_app_consume_bytes_f *cb, void *app_key, int plainOrXER) { asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; char scratch[32]; /* Enough for 64-bit integer */ uint8_t *buf = st->buf; uint8_t *buf_end = st->buf + st->size; signed long accum; ssize_t wrote = 0; char *p; int ret; /* * Advance buf pointer until the start of the value's body. * This will make us able to process large integers using simple case, * when the actual value is small * (0x0000000000abcdef would yield a fine 0x00abcdef) */ /* Skip the insignificant leading bytes */ for(; buf < buf_end-1; buf++) { switch(*buf) { case 0x00: if((buf[1] & 0x80) == 0) continue; break; case 0xff: if((buf[1] & 0x80) != 0) continue; break; } break; } /* Simple case: the integer size is small */ if((size_t)(buf_end - buf) <= sizeof(accum)) { const asn_INTEGER_enum_map_t *el; size_t scrsize; char *scr; if(buf == buf_end) { accum = 0; } else { accum = (*buf & 0x80) ? -1 : 0; for(; buf < buf_end; buf++) accum = (accum << 8) | *buf; } el = INTEGER_map_value2enum(specs, accum); if(el) { scrsize = el->enum_len + 32; scr = (char *)alloca(scrsize); if(plainOrXER == 0) ret = snprintf(scr, scrsize, "%ld (%s)", accum, el->enum_name); else ret = snprintf(scr, scrsize, "<%s/>", el->enum_name); } else if(plainOrXER && specs && specs->strict_enumeration) { ASN_DEBUG("ASN.1 forbids dealing with " "unknown value of ENUMERATED type"); errno = EPERM; return -1; } else { scrsize = sizeof(scratch); scr = scratch; ret = snprintf(scr, scrsize, (specs && specs->field_unsigned) ?"%lu":"%ld", accum); } assert(ret > 0 && (size_t)ret < scrsize); return (cb(scr, ret, app_key) < 0) ? -1 : ret; } else if(plainOrXER && specs && specs->strict_enumeration) { /* * Here and earlier, we cannot encode the ENUMERATED values * if there is no corresponding identifier. */ ASN_DEBUG("ASN.1 forbids dealing with " "unknown value of ENUMERATED type"); errno = EPERM; return -1; } /* Output in the long xx:yy:zz... format */ /* TODO: replace with generic algorithm (Knuth TAOCP Vol 2, 4.3.1) */ for(p = scratch; buf < buf_end; buf++) { static const char *h2c = "0123456789ABCDEF"; if((p - scratch) >= (ssize_t)(sizeof(scratch) - 4)) { /* Flush buffer */ if(cb(scratch, p - scratch, app_key) < 0) return -1; wrote += p - scratch; p = scratch; } *p++ = h2c[*buf >> 4]; *p++ = h2c[*buf & 0x0F]; *p++ = 0x3a; /* ":" */ } if(p != scratch) p--; /* Remove the last ":" */ wrote += p - scratch; return (cb(scratch, p - scratch, app_key) < 0) ? -1 : wrote; } /* * INTEGER specific human-readable output. */ int INTEGER_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const INTEGER_t *st = (const INTEGER_t *)sptr; ssize_t ret; (void)td; (void)ilevel; if(!st || !st->buf) ret = cb("", 8, app_key); else ret = INTEGER__dump(td, st, cb, app_key, 0); return (ret < 0) ? -1 : 0; } struct e2v_key { const char *start; const char *stop; asn_INTEGER_enum_map_t *vemap; unsigned int *evmap; }; static int INTEGER__compar_enum2value(const void *kp, const void *am) { const struct e2v_key *key = (const struct e2v_key *)kp; const asn_INTEGER_enum_map_t *el = (const asn_INTEGER_enum_map_t *)am; const char *ptr, *end, *name; /* Remap the element (sort by different criterion) */ el = key->vemap + key->evmap[el - key->vemap]; /* Compare strings */ for(ptr = key->start, end = key->stop, name = el->enum_name; ptr < end; ptr++, name++) { if(*ptr != *name) return *(const unsigned char *)ptr - *(const unsigned char *)name; } return name[0] ? -1 : 0; } static const asn_INTEGER_enum_map_t * INTEGER_map_enum2value(asn_INTEGER_specifics_t *specs, const char *lstart, const char *lstop) { asn_INTEGER_enum_map_t *el_found; int count = specs ? specs->map_count : 0; struct e2v_key key; const char *lp; if(!count) return NULL; /* Guaranteed: assert(lstart < lstop); */ /* Figure out the tag name */ for(lstart++, lp = lstart; lp < lstop; lp++) { switch(*lp) { case 9: case 10: case 11: case 12: case 13: case 32: /* WSP */ case 0x2f: /* '/' */ case 0x3e: /* '>' */ break; default: continue; } break; } if(lp == lstop) return NULL; /* No tag found */ lstop = lp; key.start = lstart; key.stop = lstop; key.vemap = specs->value2enum; key.evmap = specs->enum2value; el_found = (asn_INTEGER_enum_map_t *)bsearch(&key, specs->value2enum, count, sizeof(specs->value2enum[0]), INTEGER__compar_enum2value); if(el_found) { /* Remap enum2value into value2enum */ el_found = key.vemap + key.evmap[el_found - key.vemap]; } return el_found; } static int INTEGER__compar_value2enum(const void *kp, const void *am) { long a = *(const long *)kp; const asn_INTEGER_enum_map_t *el = (const asn_INTEGER_enum_map_t *)am; long b = el->nat_value; if(a < b) return -1; else if(a == b) return 0; else return 1; } const asn_INTEGER_enum_map_t * INTEGER_map_value2enum(asn_INTEGER_specifics_t *specs, long value) { int count = specs ? specs->map_count : 0; if(!count) return 0; return (asn_INTEGER_enum_map_t *)bsearch(&value, specs->value2enum, count, sizeof(specs->value2enum[0]), INTEGER__compar_value2enum); } static int INTEGER_st_prealloc(INTEGER_t *st, int min_size) { void *p = MALLOC(min_size + 1); if(p) { void *b = st->buf; st->size = 0; st->buf = p; FREEMEM(b); return 0; } else { return -1; } } /* * Decode the chunk of XML text encoding INTEGER. */ static enum xer_pbd_rval INTEGER__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void *chunk_buf, size_t chunk_size) { INTEGER_t *st = (INTEGER_t *)sptr; long sign = 1; long value; const char *lp; const char *lstart = (const char *)chunk_buf; const char *lstop = lstart + chunk_size; enum { ST_SKIPSPACE, ST_SKIPSPHEX, ST_WAITDIGITS, ST_DIGITS, ST_HEXDIGIT1, ST_HEXDIGIT2, ST_HEXCOLON, ST_EXTRASTUFF } state = ST_SKIPSPACE; if(chunk_size) ASN_DEBUG("INTEGER body %ld 0x%2x..0x%2x", (long)chunk_size, *lstart, lstop[-1]); /* * We may have received a tag here. It will be processed inline. * Use strtoul()-like code and serialize the result. */ for(value = 0, lp = lstart; lp < lstop; lp++) { int lv = *lp; switch(lv) { case 0x09: case 0x0a: case 0x0d: case 0x20: switch(state) { case ST_SKIPSPACE: case ST_SKIPSPHEX: continue; case ST_HEXCOLON: if(xer_is_whitespace(lp, lstop - lp)) { lp = lstop - 1; continue; } break; default: break; } break; case 0x2d: /* '-' */ if(state == ST_SKIPSPACE) { sign = -1; state = ST_WAITDIGITS; continue; } break; case 0x2b: /* '+' */ if(state == ST_SKIPSPACE) { state = ST_WAITDIGITS; continue; } break; case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: switch(state) { case ST_DIGITS: break; case ST_SKIPSPHEX: /* Fall through */ case ST_HEXDIGIT1: value = (lv - 0x30) << 4; state = ST_HEXDIGIT2; continue; case ST_HEXDIGIT2: value += (lv - 0x30); state = ST_HEXCOLON; st->buf[st->size++] = (uint8_t)value; continue; case ST_HEXCOLON: return XPBD_BROKEN_ENCODING; default: state = ST_DIGITS; break; } { long new_value = value * 10; if(new_value / 10 != value) /* Overflow */ return XPBD_DECODER_LIMIT; value = new_value + (lv - 0x30); /* Check for two's complement overflow */ if(value < 0) { /* Check whether it is a LONG_MIN */ if(sign == -1 && (unsigned long)value == ~((unsigned long)-1 >> 1)) { sign = 1; } else { /* Overflow */ return XPBD_DECODER_LIMIT; } } } continue; case 0x3c: /* '<' */ if(state == ST_SKIPSPACE) { const asn_INTEGER_enum_map_t *el; el = INTEGER_map_enum2value( (asn_INTEGER_specifics_t *) td->specifics, lstart, lstop); if(el) { ASN_DEBUG("Found \"%s\" => %ld", el->enum_name, el->nat_value); state = ST_DIGITS; value = el->nat_value; lp = lstop - 1; continue; } ASN_DEBUG("Unknown identifier for INTEGER"); } return XPBD_BROKEN_ENCODING; case 0x3a: /* ':' */ if(state == ST_HEXCOLON) { /* This colon is expected */ state = ST_HEXDIGIT1; continue; } else if(state == ST_DIGITS) { /* The colon here means that we have * decoded the first two hexadecimal * places as a decimal value. * Switch decoding mode. */ ASN_DEBUG("INTEGER re-evaluate as hex form"); if(INTEGER_st_prealloc(st, (chunk_size/3) + 1)) return XPBD_SYSTEM_FAILURE; state = ST_SKIPSPHEX; lp = lstart - 1; continue; } else { ASN_DEBUG("state %d at %d", state, lp - lstart); break; } /* [A-Fa-f] */ case 0x41:case 0x42:case 0x43:case 0x44:case 0x45:case 0x46: case 0x61:case 0x62:case 0x63:case 0x64:case 0x65:case 0x66: switch(state) { case ST_SKIPSPHEX: case ST_SKIPSPACE: /* Fall through */ case ST_HEXDIGIT1: value = lv - ((lv < 0x61) ? 0x41 : 0x61); value += 10; value <<= 4; state = ST_HEXDIGIT2; continue; case ST_HEXDIGIT2: value += lv - ((lv < 0x61) ? 0x41 : 0x61); value += 10; st->buf[st->size++] = (uint8_t)value; state = ST_HEXCOLON; continue; case ST_DIGITS: ASN_DEBUG("INTEGER re-evaluate as hex form"); if(INTEGER_st_prealloc(st, (chunk_size/3) + 1)) return XPBD_SYSTEM_FAILURE; state = ST_SKIPSPHEX; lp = lstart - 1; continue; default: break; } break; } /* Found extra non-numeric stuff */ ASN_DEBUG("Found non-numeric 0x%2x at %d", lv, lp - lstart); state = ST_EXTRASTUFF; break; } switch(state) { case ST_DIGITS: /* Everything is cool */ break; case ST_HEXCOLON: st->buf[st->size] = 0; /* Just in case termination */ return XPBD_BODY_CONSUMED; case ST_HEXDIGIT1: case ST_HEXDIGIT2: case ST_SKIPSPHEX: return XPBD_BROKEN_ENCODING; default: if(xer_is_whitespace(lp, lstop - lp)) { if(state != ST_EXTRASTUFF) return XPBD_NOT_BODY_IGNORE; break; } else { ASN_DEBUG("INTEGER: No useful digits (state %d)", state); return XPBD_BROKEN_ENCODING; /* No digits */ } break; } value *= sign; /* Change sign, if needed */ if(asn_long2INTEGER(st, value)) return XPBD_SYSTEM_FAILURE; return XPBD_BODY_CONSUMED; } asn_dec_rval_t INTEGER_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, const void *buf_ptr, size_t size) { return xer_decode_primitive(opt_codec_ctx, td, sptr, sizeof(INTEGER_t), opt_mname, buf_ptr, size, INTEGER__xer_body_decode); } asn_enc_rval_t INTEGER_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { const INTEGER_t *st = (const INTEGER_t *)sptr; asn_enc_rval_t er; (void)ilevel; (void)flags; if(!st || !st->buf) _ASN_ENCODE_FAILED; er.encoded = INTEGER__dump(td, st, cb, app_key, 1); if(er.encoded < 0) _ASN_ENCODE_FAILED; _ASN_ENCODED_OK(er); } asn_dec_rval_t INTEGER_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; asn_dec_rval_t rval = { RC_OK, 0 }; INTEGER_t *st = (INTEGER_t *)*sptr; asn_per_constraint_t *ct; int repeat; (void)opt_codec_ctx; if(!st) { st = (INTEGER_t *)(*sptr = CALLOC(1, sizeof(*st))); if(!st) _ASN_DECODE_FAILED; } if(!constraints) constraints = td->per_constraints; ct = constraints ? &constraints->value : 0; if(ct && ct->flags & APC_EXTENSIBLE) { int inext = per_get_few_bits(pd, 1); if(inext < 0) _ASN_DECODE_STARVED; if(inext) ct = 0; } FREEMEM(st->buf); st->buf = 0; st->size = 0; if(ct) { if(ct->flags & APC_SEMI_CONSTRAINED) { st->buf = (uint8_t *)CALLOC(1, 2); if(!st->buf) _ASN_DECODE_FAILED; st->size = 1; } else if(ct->flags & APC_CONSTRAINED && ct->range_bits >= 0) { size_t size = (ct->range_bits + 7) >> 3; st->buf = (uint8_t *)MALLOC(1 + size + 1); if(!st->buf) _ASN_DECODE_FAILED; st->size = size; } } /* X.691, #12.2.2 */ if(ct && ct->flags != APC_UNCONSTRAINED) { /* #10.5.6 */ ASN_DEBUG("Integer with range %d bits", ct->range_bits); if(ct->range_bits >= 0) { long value; if(ct->range_bits == 32) { long lhalf; value = per_get_few_bits(pd, 16); if(value < 0) _ASN_DECODE_STARVED; lhalf = per_get_few_bits(pd, 16); if(lhalf < 0) _ASN_DECODE_STARVED; value = (value << 16) | lhalf; } else { value = per_get_few_bits(pd, ct->range_bits); if(value < 0) _ASN_DECODE_STARVED; } ASN_DEBUG("Got value %ld + low %ld", value, ct->lower_bound); value += ct->lower_bound; if((specs && specs->field_unsigned) ? asn_ulong2INTEGER(st, value) : asn_long2INTEGER(st, value)) _ASN_DECODE_FAILED; return rval; } } else { ASN_DEBUG("Decoding unconstrained integer %s", td->name); } /* X.691, #12.2.3, #12.2.4 */ do { ssize_t len; void *p; int ret; /* Get the PER length */ len = uper_get_length(pd, -1, &repeat); if(len < 0) _ASN_DECODE_STARVED; p = REALLOC(st->buf, st->size + len + 1); if(!p) _ASN_DECODE_FAILED; st->buf = (uint8_t *)p; ret = per_get_many_bits(pd, &st->buf[st->size], 0, 8 * len); if(ret < 0) _ASN_DECODE_STARVED; st->size += len; } while(repeat); st->buf[st->size] = 0; /* JIC */ /* #12.2.3 */ if(ct && ct->lower_bound) { /* * TODO: replace by in-place arithmetics. */ long value; if(asn_INTEGER2long(st, &value)) _ASN_DECODE_FAILED; if(asn_long2INTEGER(st, value + ct->lower_bound)) _ASN_DECODE_FAILED; } return rval; } asn_enc_rval_t INTEGER_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; asn_enc_rval_t er; INTEGER_t *st = (INTEGER_t *)sptr; const uint8_t *buf; const uint8_t *end; asn_per_constraint_t *ct; long value = 0; if(!st || st->size == 0) _ASN_ENCODE_FAILED; if(!constraints) constraints = td->per_constraints; ct = constraints ? &constraints->value : 0; er.encoded = 0; if(ct) { int inext = 0; if(specs && specs->field_unsigned) { unsigned long uval; if(asn_INTEGER2ulong(st, &uval)) _ASN_ENCODE_FAILED; /* Check proper range */ if(ct->flags & APC_SEMI_CONSTRAINED) { if(uval < (unsigned long)ct->lower_bound) inext = 1; } else if(ct->range_bits >= 0) { if(uval < (unsigned long)ct->lower_bound || uval > (unsigned long)ct->upper_bound) inext = 1; } ASN_DEBUG("Value %lu (%02x/%d) lb %lu ub %lu %s", uval, st->buf[0], st->size, ct->lower_bound, ct->upper_bound, inext ? "ext" : "fix"); value = uval; } else { if(asn_INTEGER2long(st, &value)) _ASN_ENCODE_FAILED; /* Check proper range */ if(ct->flags & APC_SEMI_CONSTRAINED) { if(value < ct->lower_bound) inext = 1; } else if(ct->range_bits >= 0) { if(value < ct->lower_bound || value > ct->upper_bound) inext = 1; } ASN_DEBUG("Value %ld (%02x/%d) lb %ld ub %ld %s", value, st->buf[0], st->size, ct->lower_bound, ct->upper_bound, inext ? "ext" : "fix"); } if(ct->flags & APC_EXTENSIBLE) { if(per_put_few_bits(po, inext, 1)) _ASN_ENCODE_FAILED; if(inext) ct = 0; } else if(inext) { _ASN_ENCODE_FAILED; } } /* X.691, #12.2.2 */ if(ct && ct->range_bits >= 0) { /* #10.5.6 */ ASN_DEBUG("Encoding integer with range %d bits", ct->range_bits); if(ct->range_bits == 32) { /* TODO: extend to >32 bits */ long v = value - ct->lower_bound; if(per_put_few_bits(po, v >> 1, 31) || per_put_few_bits(po, v, 1)) _ASN_ENCODE_FAILED; } else { if(per_put_few_bits(po, value - ct->lower_bound, ct->range_bits)) _ASN_ENCODE_FAILED; } _ASN_ENCODED_OK(er); } if(ct && ct->lower_bound) { ASN_DEBUG("Adjust lower bound to %ld", ct->lower_bound); /* TODO: adjust lower bound */ _ASN_ENCODE_FAILED; } for(buf = st->buf, end = st->buf + st->size; buf < end;) { ssize_t mayEncode = uper_put_length(po, end - buf); if(mayEncode < 0) _ASN_ENCODE_FAILED; if(per_put_many_bits(po, buf, 8 * mayEncode)) _ASN_ENCODE_FAILED; buf += mayEncode; } _ASN_ENCODED_OK(er); } int asn_INTEGER2long(const INTEGER_t *iptr, long *lptr) { uint8_t *b, *end; size_t size; long l; /* Sanity checking */ if(!iptr || !iptr->buf || !lptr) { errno = EINVAL; return -1; } /* Cache the begin/end of the buffer */ b = iptr->buf; /* Start of the INTEGER buffer */ size = iptr->size; end = b + size; /* Where to stop */ if(size > sizeof(long)) { uint8_t *end1 = end - 1; /* * Slightly more advanced processing, * able to >sizeof(long) bytes, * when the actual value is small * (0x0000000000abcdef would yield a fine 0x00abcdef) */ /* Skip out the insignificant leading bytes */ for(; b < end1; b++) { switch(*b) { case 0x00: if((b[1] & 0x80) == 0) continue; break; case 0xff: if((b[1] & 0x80) != 0) continue; break; } break; } size = end - b; if(size > sizeof(long)) { /* Still cannot fit the long */ errno = ERANGE; return -1; } } /* Shortcut processing of a corner case */ if(end == b) { *lptr = 0; return 0; } /* Perform the sign initialization */ /* Actually l = -(*b >> 7); gains nothing, yet unreadable! */ if((*b >> 7)) l = -1; else l = 0; /* Conversion engine */ for(; b < end; b++) l = (l << 8) | *b; *lptr = l; return 0; } int asn_INTEGER2ulong(const INTEGER_t *iptr, unsigned long *lptr) { uint8_t *b, *end; unsigned long l; size_t size; if(!iptr || !iptr->buf || !lptr) { errno = EINVAL; return -1; } b = iptr->buf; size = iptr->size; end = b + size; /* If all extra leading bytes are zeroes, ignore them */ for(; size > sizeof(unsigned long); b++, size--) { if(*b) { /* Value won't fit unsigned long */ errno = ERANGE; return -1; } } /* Conversion engine */ for(l = 0; b < end; b++) l = (l << 8) | *b; *lptr = l; return 0; } int asn_ulong2INTEGER(INTEGER_t *st, unsigned long value) { uint8_t *buf; uint8_t *end; uint8_t *b; int shr; if(value <= LONG_MAX) return asn_long2INTEGER(st, value); buf = (uint8_t *)MALLOC(1 + sizeof(value)); if(!buf) return -1; end = buf + (sizeof(value) + 1); buf[0] = 0; for(b = buf + 1, shr = (sizeof(long)-1)*8; b < end; shr -= 8, b++) *b = (uint8_t)(value >> shr); if(st->buf) FREEMEM(st->buf); st->buf = buf; st->size = 1 + sizeof(value); return 0; } int asn_long2INTEGER(INTEGER_t *st, long value) { uint8_t *buf, *bp; uint8_t *p; uint8_t *pstart; uint8_t *pend1; int littleEndian = 1; /* Run-time detection */ int add; if(!st) { errno = EINVAL; return -1; } buf = (uint8_t *)MALLOC(sizeof(value)); if(!buf) return -1; if(*(char *)&littleEndian) { pstart = (uint8_t *)&value + sizeof(value) - 1; pend1 = (uint8_t *)&value; add = -1; } else { pstart = (uint8_t *)&value; pend1 = pstart + sizeof(value) - 1; add = 1; } /* * If the contents octet consists of more than one octet, * then bits of the first octet and bit 8 of the second octet: * a) shall not all be ones; and * b) shall not all be zero. */ for(p = pstart; p != pend1; p += add) { switch(*p) { case 0x00: if((*(p+add) & 0x80) == 0) continue; break; case 0xff: if((*(p+add) & 0x80)) continue; break; } break; } /* Copy the integer body */ for(pstart = p, bp = buf, pend1 += add; p != pend1; p += add) *bp++ = *p; if(st->buf) FREEMEM(st->buf); st->buf = buf; st->size = bp - buf; return 0; } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/INTEGER.h000066400000000000000000000042671305042567700217450ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2005 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _INTEGER_H_ #define _INTEGER_H_ #include #include #ifdef __cplusplus extern "C" { #endif typedef ASN__PRIMITIVE_TYPE_t INTEGER_t; extern asn_TYPE_descriptor_t asn_DEF_INTEGER; /* Map with to integer value association */ typedef struct asn_INTEGER_enum_map_s { long nat_value; /* associated native integer value */ size_t enum_len; /* strlen("tag") */ const char *enum_name; /* "tag" */ } asn_INTEGER_enum_map_t; /* This type describes an enumeration for INTEGER and ENUMERATED types */ typedef struct asn_INTEGER_specifics_s { asn_INTEGER_enum_map_t *value2enum; /* N -> "tag"; sorted by N */ unsigned int *enum2value; /* "tag" => N; sorted by tag */ int map_count; /* Elements in either map */ int extension; /* This map is extensible */ int strict_enumeration; /* Enumeration set is fixed */ int field_width; /* Size of native integer */ int field_unsigned; /* Signed=0, unsigned=1 */ } asn_INTEGER_specifics_t; asn_struct_print_f INTEGER_print; ber_type_decoder_f INTEGER_decode_ber; der_type_encoder_f INTEGER_encode_der; xer_type_decoder_f INTEGER_decode_xer; xer_type_encoder_f INTEGER_encode_xer; per_type_decoder_f INTEGER_decode_uper; per_type_encoder_f INTEGER_encode_uper; /*********************************** * Some handy conversion routines. * ***********************************/ /* * Returns 0 if it was possible to convert, -1 otherwise. * -1/EINVAL: Mandatory argument missing * -1/ERANGE: Value encoded is out of range for long representation * -1/ENOMEM: Memory allocation failed (in asn_long2INTEGER()). */ int asn_INTEGER2long(const INTEGER_t *i, long *l); int asn_INTEGER2ulong(const INTEGER_t *i, unsigned long *l); int asn_long2INTEGER(INTEGER_t *i, long l); int asn_ulong2INTEGER(INTEGER_t *i, unsigned long l); /* * Convert the integer value into the corresponding enumeration map entry. */ const asn_INTEGER_enum_map_t *INTEGER_map_value2enum(asn_INTEGER_specifics_t *specs, long value); #ifdef __cplusplus } #endif #endif /* _INTEGER_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/IPAddress.c000066400000000000000000000067071305042567700224620ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "IPAddress.h" static int memb_ipv4Address_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } size = st->size; if((size == 4)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_ipv6Address_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } size = st->size; if((size == 16)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_ipv4Address_constr_2 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 4, 4 } /* (SIZE(4..4)) */, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_ipv6Address_constr_3 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 16, 16 } /* (SIZE(16..16)) */, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_type_IPAddress_constr_1 = { { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_IPAddress_1[] = { { ATF_NOFLAGS, 0, offsetof(struct IPAddress, choice.ipv4Address), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_OCTET_STRING, memb_ipv4Address_constraint_1, &asn_PER_memb_ipv4Address_constr_2, 0, "ipv4Address" }, { ATF_NOFLAGS, 0, offsetof(struct IPAddress, choice.ipv6Address), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_OCTET_STRING, memb_ipv6Address_constraint_1, &asn_PER_memb_ipv6Address_constr_3, 0, "ipv6Address" }, }; static asn_TYPE_tag2member_t asn_MAP_IPAddress_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ipv4Address at 41 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ipv6Address at 42 */ }; static asn_CHOICE_specifics_t asn_SPC_IPAddress_specs_1 = { sizeof(struct IPAddress), offsetof(struct IPAddress, _asn_ctx), offsetof(struct IPAddress, present), sizeof(((struct IPAddress *)0)->present), asn_MAP_IPAddress_tag2el_1, 2, /* Count of tags in the map */ 0, -1 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_IPAddress = { "IPAddress", "IPAddress", CHOICE_free, CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_decode_uper, CHOICE_encode_uper, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ &asn_PER_type_IPAddress_constr_1, asn_MBR_IPAddress_1, 2, /* Elements count */ &asn_SPC_IPAddress_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/IPAddress.h000066400000000000000000000016321305042567700224570ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _IPAddress_H_ #define _IPAddress_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum IPAddress_PR { IPAddress_PR_NOTHING, /* No components present */ IPAddress_PR_ipv4Address, IPAddress_PR_ipv6Address } IPAddress_PR; /* IPAddress */ typedef struct IPAddress { IPAddress_PR present; union IPAddress_u { OCTET_STRING_t ipv4Address; OCTET_STRING_t ipv6Address; } choice; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } IPAddress_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_IPAddress; #ifdef __cplusplus } #endif #endif /* _IPAddress_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/KeyIdentity.c000066400000000000000000000112761305042567700231030ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-INIT" * found in "../supl-init.asn" */ #include "KeyIdentity.h" int KeyIdentity_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } if(st->size > 0) { /* Size in bits */ size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } if((size == 128)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using BIT_STRING, * so here we adjust the DEF accordingly. */ static void KeyIdentity_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_BIT_STRING.free_struct; td->print_struct = asn_DEF_BIT_STRING.print_struct; td->ber_decoder = asn_DEF_BIT_STRING.ber_decoder; td->der_encoder = asn_DEF_BIT_STRING.der_encoder; td->xer_decoder = asn_DEF_BIT_STRING.xer_decoder; td->xer_encoder = asn_DEF_BIT_STRING.xer_encoder; td->uper_decoder = asn_DEF_BIT_STRING.uper_decoder; td->uper_encoder = asn_DEF_BIT_STRING.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_BIT_STRING.per_constraints; td->elements = asn_DEF_BIT_STRING.elements; td->elements_count = asn_DEF_BIT_STRING.elements_count; td->specifics = asn_DEF_BIT_STRING.specifics; } void KeyIdentity_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { KeyIdentity_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int KeyIdentity_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { KeyIdentity_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t KeyIdentity_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { KeyIdentity_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t KeyIdentity_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { KeyIdentity_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t KeyIdentity_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { KeyIdentity_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t KeyIdentity_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { KeyIdentity_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t KeyIdentity_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { KeyIdentity_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t KeyIdentity_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { KeyIdentity_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_KeyIdentity_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 128, 128 } /* (SIZE(128..128)) */, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_KeyIdentity_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)) }; asn_TYPE_descriptor_t asn_DEF_KeyIdentity = { "KeyIdentity", "KeyIdentity", KeyIdentity_free, KeyIdentity_print, KeyIdentity_constraint, KeyIdentity_decode_ber, KeyIdentity_encode_der, KeyIdentity_decode_xer, KeyIdentity_encode_xer, KeyIdentity_decode_uper, KeyIdentity_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_KeyIdentity_tags_1, sizeof(asn_DEF_KeyIdentity_tags_1) /sizeof(asn_DEF_KeyIdentity_tags_1[0]), /* 1 */ asn_DEF_KeyIdentity_tags_1, /* Same as above */ sizeof(asn_DEF_KeyIdentity_tags_1) /sizeof(asn_DEF_KeyIdentity_tags_1[0]), /* 1 */ &asn_PER_type_KeyIdentity_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/KeyIdentity.h000066400000000000000000000016051305042567700231030ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-INIT" * found in "../supl-init.asn" */ #ifndef _KeyIdentity_H_ #define _KeyIdentity_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* KeyIdentity */ typedef BIT_STRING_t KeyIdentity_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_KeyIdentity; asn_struct_free_f KeyIdentity_free; asn_struct_print_f KeyIdentity_print; asn_constr_check_f KeyIdentity_constraint; ber_type_decoder_f KeyIdentity_decode_ber; der_type_encoder_f KeyIdentity_encode_der; xer_type_decoder_f KeyIdentity_decode_xer; xer_type_encoder_f KeyIdentity_encode_xer; per_type_decoder_f KeyIdentity_decode_uper; per_type_encoder_f KeyIdentity_encode_uper; #ifdef __cplusplus } #endif #endif /* _KeyIdentity_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/KeyIdentity4.c000066400000000000000000000113561305042567700231660ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-RESPONSE" * found in "../supl-response.asn" */ #include "KeyIdentity4.h" int KeyIdentity4_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } if(st->size > 0) { /* Size in bits */ size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } if((size == 128)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using BIT_STRING, * so here we adjust the DEF accordingly. */ static void KeyIdentity4_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_BIT_STRING.free_struct; td->print_struct = asn_DEF_BIT_STRING.print_struct; td->ber_decoder = asn_DEF_BIT_STRING.ber_decoder; td->der_encoder = asn_DEF_BIT_STRING.der_encoder; td->xer_decoder = asn_DEF_BIT_STRING.xer_decoder; td->xer_encoder = asn_DEF_BIT_STRING.xer_encoder; td->uper_decoder = asn_DEF_BIT_STRING.uper_decoder; td->uper_encoder = asn_DEF_BIT_STRING.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_BIT_STRING.per_constraints; td->elements = asn_DEF_BIT_STRING.elements; td->elements_count = asn_DEF_BIT_STRING.elements_count; td->specifics = asn_DEF_BIT_STRING.specifics; } void KeyIdentity4_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { KeyIdentity4_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int KeyIdentity4_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { KeyIdentity4_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t KeyIdentity4_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { KeyIdentity4_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t KeyIdentity4_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { KeyIdentity4_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t KeyIdentity4_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { KeyIdentity4_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t KeyIdentity4_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { KeyIdentity4_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t KeyIdentity4_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { KeyIdentity4_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t KeyIdentity4_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { KeyIdentity4_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_KeyIdentity4_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 128, 128 } /* (SIZE(128..128)) */, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_KeyIdentity4_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)) }; asn_TYPE_descriptor_t asn_DEF_KeyIdentity4 = { "KeyIdentity4", "KeyIdentity4", KeyIdentity4_free, KeyIdentity4_print, KeyIdentity4_constraint, KeyIdentity4_decode_ber, KeyIdentity4_encode_der, KeyIdentity4_decode_xer, KeyIdentity4_encode_xer, KeyIdentity4_decode_uper, KeyIdentity4_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_KeyIdentity4_tags_1, sizeof(asn_DEF_KeyIdentity4_tags_1) /sizeof(asn_DEF_KeyIdentity4_tags_1[0]), /* 1 */ asn_DEF_KeyIdentity4_tags_1, /* Same as above */ sizeof(asn_DEF_KeyIdentity4_tags_1) /sizeof(asn_DEF_KeyIdentity4_tags_1[0]), /* 1 */ &asn_PER_type_KeyIdentity4_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/KeyIdentity4.h000066400000000000000000000016341305042567700231710ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-RESPONSE" * found in "../supl-response.asn" */ #ifndef _KeyIdentity4_H_ #define _KeyIdentity4_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* KeyIdentity4 */ typedef BIT_STRING_t KeyIdentity4_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_KeyIdentity4; asn_struct_free_f KeyIdentity4_free; asn_struct_print_f KeyIdentity4_print; asn_constr_check_f KeyIdentity4_constraint; ber_type_decoder_f KeyIdentity4_decode_ber; der_type_encoder_f KeyIdentity4_encode_der; xer_type_decoder_f KeyIdentity4_decode_xer; xer_type_encoder_f KeyIdentity4_encode_xer; per_type_decoder_f KeyIdentity4_decode_uper; per_type_encoder_f KeyIdentity4_encode_uper; #ifdef __cplusplus } #endif #endif /* _KeyIdentity4_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/LocationId.c000066400000000000000000000040131305042567700226550ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "LocationId.h" static asn_TYPE_member_t asn_MBR_LocationId_1[] = { { ATF_NOFLAGS, 0, offsetof(struct LocationId, cellInfo), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), +1, /* EXPLICIT tag at current level */ &asn_DEF_CellInfo, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "cellInfo" }, { ATF_NOFLAGS, 0, offsetof(struct LocationId, status), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Status, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "status" }, }; static ber_tlv_tag_t asn_DEF_LocationId_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_LocationId_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* cellInfo at 53 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* status at 54 */ }; static asn_SEQUENCE_specifics_t asn_SPC_LocationId_specs_1 = { sizeof(struct LocationId), offsetof(struct LocationId, _asn_ctx), asn_MAP_LocationId_tag2el_1, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ 1, /* Start extensions */ 3 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_LocationId = { "LocationId", "LocationId", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_LocationId_tags_1, sizeof(asn_DEF_LocationId_tags_1) /sizeof(asn_DEF_LocationId_tags_1[0]), /* 1 */ asn_DEF_LocationId_tags_1, /* Same as above */ sizeof(asn_DEF_LocationId_tags_1) /sizeof(asn_DEF_LocationId_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_LocationId_1, 2, /* Elements count */ &asn_SPC_LocationId_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/LocationId.h000066400000000000000000000014111305042567700226610ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _LocationId_H_ #define _LocationId_H_ #include /* Including external dependencies */ #include "CellInfo.h" #include "Status.h" #include #ifdef __cplusplus extern "C" { #endif /* LocationId */ typedef struct LocationId { CellInfo_t cellInfo; Status_t status; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } LocationId_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_LocationId; #ifdef __cplusplus } #endif #endif /* _LocationId_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/MAC.c000066400000000000000000000105711305042567700212360ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-INIT" * found in "../supl-init.asn" */ #include "MAC.h" int MAC_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } if(st->size > 0) { /* Size in bits */ size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } if((size == 64)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using BIT_STRING, * so here we adjust the DEF accordingly. */ static void MAC_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_BIT_STRING.free_struct; td->print_struct = asn_DEF_BIT_STRING.print_struct; td->ber_decoder = asn_DEF_BIT_STRING.ber_decoder; td->der_encoder = asn_DEF_BIT_STRING.der_encoder; td->xer_decoder = asn_DEF_BIT_STRING.xer_decoder; td->xer_encoder = asn_DEF_BIT_STRING.xer_encoder; td->uper_decoder = asn_DEF_BIT_STRING.uper_decoder; td->uper_encoder = asn_DEF_BIT_STRING.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_BIT_STRING.per_constraints; td->elements = asn_DEF_BIT_STRING.elements; td->elements_count = asn_DEF_BIT_STRING.elements_count; td->specifics = asn_DEF_BIT_STRING.specifics; } void MAC_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { MAC_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int MAC_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { MAC_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t MAC_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { MAC_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t MAC_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { MAC_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t MAC_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { MAC_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t MAC_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { MAC_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t MAC_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { MAC_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t MAC_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { MAC_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_MAC_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 64, 64 } /* (SIZE(64..64)) */, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_MAC_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)) }; asn_TYPE_descriptor_t asn_DEF_MAC = { "MAC", "MAC", MAC_free, MAC_print, MAC_constraint, MAC_decode_ber, MAC_encode_der, MAC_decode_xer, MAC_encode_xer, MAC_decode_uper, MAC_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_MAC_tags_1, sizeof(asn_DEF_MAC_tags_1) /sizeof(asn_DEF_MAC_tags_1[0]), /* 1 */ asn_DEF_MAC_tags_1, /* Same as above */ sizeof(asn_DEF_MAC_tags_1) /sizeof(asn_DEF_MAC_tags_1[0]), /* 1 */ &asn_PER_type_MAC_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/MAC.h000066400000000000000000000014151305042567700212400ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-INIT" * found in "../supl-init.asn" */ #ifndef _MAC_H_ #define _MAC_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* MAC */ typedef BIT_STRING_t MAC_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_MAC; asn_struct_free_f MAC_free; asn_struct_print_f MAC_print; asn_constr_check_f MAC_constraint; ber_type_decoder_f MAC_decode_ber; der_type_encoder_f MAC_encode_der; xer_type_decoder_f MAC_decode_xer; xer_type_encoder_f MAC_encode_xer; per_type_decoder_f MAC_decode_uper; per_type_encoder_f MAC_encode_uper; #ifdef __cplusplus } #endif #endif /* _MAC_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/MeasuredResults.c000066400000000000000000000052631305042567700237670ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "MeasuredResults.h" static asn_TYPE_member_t asn_MBR_MeasuredResults_1[] = { { ATF_POINTER, 3, offsetof(struct MeasuredResults, frequencyInfo), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_FrequencyInfo, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "frequencyInfo" }, { ATF_POINTER, 2, offsetof(struct MeasuredResults, utra_CarrierRSSI), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_UTRA_CarrierRSSI, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "utra-CarrierRSSI" }, { ATF_POINTER, 1, offsetof(struct MeasuredResults, cellMeasuredResultsList), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_CellMeasuredResultsList, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "cellMeasuredResultsList" }, }; static int asn_MAP_MeasuredResults_oms_1[] = { 0, 1, 2 }; static ber_tlv_tag_t asn_DEF_MeasuredResults_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_MeasuredResults_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* frequencyInfo at 148 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* utra-CarrierRSSI at 149 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* cellMeasuredResultsList at 150 */ }; static asn_SEQUENCE_specifics_t asn_SPC_MeasuredResults_specs_1 = { sizeof(struct MeasuredResults), offsetof(struct MeasuredResults, _asn_ctx), asn_MAP_MeasuredResults_tag2el_1, 3, /* Count of tags in the map */ asn_MAP_MeasuredResults_oms_1, /* Optional members */ 3, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_MeasuredResults = { "MeasuredResults", "MeasuredResults", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_MeasuredResults_tags_1, sizeof(asn_DEF_MeasuredResults_tags_1) /sizeof(asn_DEF_MeasuredResults_tags_1[0]), /* 1 */ asn_DEF_MeasuredResults_tags_1, /* Same as above */ sizeof(asn_DEF_MeasuredResults_tags_1) /sizeof(asn_DEF_MeasuredResults_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_MeasuredResults_1, 3, /* Elements count */ &asn_SPC_MeasuredResults_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/MeasuredResults.h000066400000000000000000000020221305042567700237620ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _MeasuredResults_H_ #define _MeasuredResults_H_ #include /* Including external dependencies */ #include "UTRA-CarrierRSSI.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct FrequencyInfo; struct CellMeasuredResultsList; /* MeasuredResults */ typedef struct MeasuredResults { struct FrequencyInfo *frequencyInfo /* OPTIONAL */; UTRA_CarrierRSSI_t *utra_CarrierRSSI /* OPTIONAL */; struct CellMeasuredResultsList *cellMeasuredResultsList /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } MeasuredResults_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_MeasuredResults; #ifdef __cplusplus } #endif /* Referred external types */ #include "FrequencyInfo.h" #include "CellMeasuredResultsList.h" #endif /* _MeasuredResults_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/MeasuredResultsList.c000066400000000000000000000033631305042567700246220ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "MeasuredResultsList.h" static asn_per_constraints_t asn_PER_type_MeasuredResultsList_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 3, 3, 1, 8 } /* (SIZE(1..8)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_MeasuredResultsList_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_MeasuredResults, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_MeasuredResultsList_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_MeasuredResultsList_specs_1 = { sizeof(struct MeasuredResultsList), offsetof(struct MeasuredResultsList, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_MeasuredResultsList = { "MeasuredResultsList", "MeasuredResultsList", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_MeasuredResultsList_tags_1, sizeof(asn_DEF_MeasuredResultsList_tags_1) /sizeof(asn_DEF_MeasuredResultsList_tags_1[0]), /* 1 */ asn_DEF_MeasuredResultsList_tags_1, /* Same as above */ sizeof(asn_DEF_MeasuredResultsList_tags_1) /sizeof(asn_DEF_MeasuredResultsList_tags_1[0]), /* 1 */ &asn_PER_type_MeasuredResultsList_constr_1, asn_MBR_MeasuredResultsList_1, 1, /* Single element */ &asn_SPC_MeasuredResultsList_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/MeasuredResultsList.h000066400000000000000000000015501305042567700246230ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _MeasuredResultsList_H_ #define _MeasuredResultsList_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct MeasuredResults; /* MeasuredResultsList */ typedef struct MeasuredResultsList { A_SEQUENCE_OF(struct MeasuredResults) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } MeasuredResultsList_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_MeasuredResultsList; #ifdef __cplusplus } #endif /* Referred external types */ #include "MeasuredResults.h" #endif /* _MeasuredResultsList_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/NMR.c000066400000000000000000000027001305042567700212650ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "NMR.h" static asn_per_constraints_t asn_PER_type_NMR_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 4, 4, 1, 15 } /* (SIZE(1..15)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_NMR_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_NMRelement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_NMR_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_NMR_specs_1 = { sizeof(struct NMR), offsetof(struct NMR, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_NMR = { "NMR", "NMR", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_NMR_tags_1, sizeof(asn_DEF_NMR_tags_1) /sizeof(asn_DEF_NMR_tags_1[0]), /* 1 */ asn_DEF_NMR_tags_1, /* Same as above */ sizeof(asn_DEF_NMR_tags_1) /sizeof(asn_DEF_NMR_tags_1[0]), /* 1 */ &asn_PER_type_NMR_constr_1, asn_MBR_NMR_1, 1, /* Single element */ &asn_SPC_NMR_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/NMR.h000066400000000000000000000013511305042567700212730ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _NMR_H_ #define _NMR_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct NMRelement; /* NMR */ typedef struct NMR { A_SEQUENCE_OF(struct NMRelement) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } NMR_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_NMR; #ifdef __cplusplus } #endif /* Referred external types */ #include "NMRelement.h" #endif /* _NMR_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/NMRelement.c000066400000000000000000000105501305042567700226410ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "NMRelement.h" static int memb_aRFCN_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1023)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_bSIC_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 63)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_rxLev_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 63)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_aRFCN_constr_2 = { { APC_CONSTRAINED, 10, 10, 0, 1023 } /* (0..1023) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_bSIC_constr_3 = { { APC_CONSTRAINED, 6, 6, 0, 63 } /* (0..63) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_rxLev_constr_4 = { { APC_CONSTRAINED, 6, 6, 0, 63 } /* (0..63) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_NMRelement_1[] = { { ATF_NOFLAGS, 0, offsetof(struct NMRelement, aRFCN), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_aRFCN_constraint_1, &asn_PER_memb_aRFCN_constr_2, 0, "aRFCN" }, { ATF_NOFLAGS, 0, offsetof(struct NMRelement, bSIC), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_bSIC_constraint_1, &asn_PER_memb_bSIC_constr_3, 0, "bSIC" }, { ATF_NOFLAGS, 0, offsetof(struct NMRelement, rxLev), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_rxLev_constraint_1, &asn_PER_memb_rxLev_constr_4, 0, "rxLev" }, }; static ber_tlv_tag_t asn_DEF_NMRelement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_NMRelement_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* aRFCN at 140 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* bSIC at 141 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* rxLev at 142 */ }; static asn_SEQUENCE_specifics_t asn_SPC_NMRelement_specs_1 = { sizeof(struct NMRelement), offsetof(struct NMRelement, _asn_ctx), asn_MAP_NMRelement_tag2el_1, 3, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ 2, /* Start extensions */ 4 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_NMRelement = { "NMRelement", "NMRelement", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_NMRelement_tags_1, sizeof(asn_DEF_NMRelement_tags_1) /sizeof(asn_DEF_NMRelement_tags_1[0]), /* 1 */ asn_DEF_NMRelement_tags_1, /* Same as above */ sizeof(asn_DEF_NMRelement_tags_1) /sizeof(asn_DEF_NMRelement_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_NMRelement_1, 3, /* Elements count */ &asn_SPC_NMRelement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/NMRelement.h000066400000000000000000000013711305042567700226470ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _NMRelement_H_ #define _NMRelement_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* NMRelement */ typedef struct NMRelement { long aRFCN; long bSIC; long rxLev; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } NMRelement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_NMRelement; #ifdef __cplusplus } #endif #endif /* _NMRelement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/NativeEnumerated.c000066400000000000000000000134261305042567700241000ustar00rootroot00000000000000/*- * Copyright (c) 2004, 2007 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ /* * Read the NativeInteger.h for the explanation wrt. differences between * INTEGER and NativeInteger. * Basically, both are decoders and encoders of ASN.1 INTEGER type, but this * implementation deals with the standard (machine-specific) representation * of them instead of using the platform-independent buffer. */ #include #include /* * NativeEnumerated basic type description. */ static ber_tlv_tag_t asn_DEF_NativeEnumerated_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; asn_TYPE_descriptor_t asn_DEF_NativeEnumerated = { "ENUMERATED", /* The ASN.1 type is still ENUMERATED */ "ENUMERATED", NativeInteger_free, NativeInteger_print, asn_generic_no_constraint, NativeInteger_decode_ber, NativeInteger_encode_der, NativeInteger_decode_xer, NativeEnumerated_encode_xer, NativeEnumerated_decode_uper, NativeEnumerated_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_NativeEnumerated_tags, sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]), asn_DEF_NativeEnumerated_tags, /* Same as above */ sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]), 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; asn_enc_rval_t NativeEnumerated_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; asn_enc_rval_t er; const long *native = (const long *)sptr; const asn_INTEGER_enum_map_t *el; (void)ilevel; (void)flags; if(!native) _ASN_ENCODE_FAILED; el = INTEGER_map_value2enum(specs, *native); if(el) { size_t srcsize = el->enum_len + 5; char *src = (char *)alloca(srcsize); er.encoded = snprintf(src, srcsize, "<%s/>", el->enum_name); assert(er.encoded > 0 && (size_t)er.encoded < srcsize); if(cb(src, er.encoded, app_key) < 0) _ASN_ENCODE_FAILED; _ASN_ENCODED_OK(er); } else { ASN_DEBUG("ASN.1 forbids dealing with " "unknown value of ENUMERATED type"); _ASN_ENCODE_FAILED; } } asn_dec_rval_t NativeEnumerated_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { asn_INTEGER_specifics_t *specs = (asn_INTEGER_specifics_t *)td->specifics; asn_dec_rval_t rval = { RC_OK, 0 }; long *native = (long *)*sptr; asn_per_constraint_t *ct; long value; (void)opt_codec_ctx; if(constraints) ct = &constraints->value; else if(td->per_constraints) ct = &td->per_constraints->value; else _ASN_DECODE_FAILED; /* Mandatory! */ if(!specs) _ASN_DECODE_FAILED; if(!native) { native = (long *)(*sptr = CALLOC(1, sizeof(*native))); if(!native) _ASN_DECODE_FAILED; } ASN_DEBUG("Decoding %s as NativeEnumerated", td->name); if(ct->flags & APC_EXTENSIBLE) { int inext = per_get_few_bits(pd, 1); if(inext < 0) _ASN_DECODE_STARVED; if(inext) ct = 0; } if(ct && ct->range_bits >= 0) { value = per_get_few_bits(pd, ct->range_bits); if(value < 0) _ASN_DECODE_STARVED; if(value >= (specs->extension ? specs->extension - 1 : specs->map_count)) _ASN_DECODE_FAILED; } else { if(!specs->extension) _ASN_DECODE_FAILED; /* * X.691, #10.6: normally small non-negative whole number; */ value = uper_get_nsnnwn(pd); if(value < 0) _ASN_DECODE_STARVED; value += specs->extension - 1; if(value >= specs->map_count) _ASN_DECODE_FAILED; } *native = specs->value2enum[value].nat_value; ASN_DEBUG("Decoded %s = %ld", td->name, *native); return rval; } static int NativeEnumerated__compar_value2enum(const void *ap, const void *bp) { const asn_INTEGER_enum_map_t *a = ap; const asn_INTEGER_enum_map_t *b = bp; if(a->nat_value == b->nat_value) return 0; if(a->nat_value < b->nat_value) return -1; return 1; } asn_enc_rval_t NativeEnumerated_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { asn_INTEGER_specifics_t *specs = (asn_INTEGER_specifics_t *)td->specifics; asn_enc_rval_t er; long native, value; asn_per_constraint_t *ct; int inext = 0; asn_INTEGER_enum_map_t key; asn_INTEGER_enum_map_t *kf; if(!sptr) _ASN_ENCODE_FAILED; if(!specs) _ASN_ENCODE_FAILED; if(constraints) ct = &constraints->value; else if(td->per_constraints) ct = &td->per_constraints->value; else _ASN_ENCODE_FAILED; /* Mandatory! */ ASN_DEBUG("Encoding %s as NativeEnumerated", td->name); er.encoded = 0; native = *(long *)sptr; if(native < 0) _ASN_ENCODE_FAILED; key.nat_value = native; kf = bsearch(&key, specs->value2enum, specs->map_count, sizeof(key), NativeEnumerated__compar_value2enum); if(!kf) { ASN_DEBUG("No element corresponds to %ld", native); _ASN_ENCODE_FAILED; } value = kf - specs->value2enum; if(ct->range_bits >= 0) { int cmpWith = specs->extension ? specs->extension - 1 : specs->map_count; if(value >= cmpWith) inext = 1; } if(ct->flags & APC_EXTENSIBLE) { if(per_put_few_bits(po, inext, 1)) _ASN_ENCODE_FAILED; if(inext) ct = 0; } else if(inext) { _ASN_ENCODE_FAILED; } if(ct && ct->range_bits >= 0) { if(per_put_few_bits(po, value, ct->range_bits)) _ASN_ENCODE_FAILED; _ASN_ENCODED_OK(er); } if(!specs->extension) _ASN_ENCODE_FAILED; /* * X.691, #10.6: normally small non-negative whole number; */ ASN_DEBUG("value = %ld, ext = %d, inext = %d, res = %ld", value, specs->extension, inext, value - (inext ? (specs->extension - 1) : 0)); if(uper_put_nsnnwn(po, value - (inext ? (specs->extension - 1) : 0))) _ASN_ENCODE_FAILED; _ASN_ENCODED_OK(er); } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/NativeEnumerated.h000066400000000000000000000016011305042567700240750ustar00rootroot00000000000000/*- * Copyright (c) 2004, 2005, 2006 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ /* * This type differs from the standard ENUMERATED in that it is modelled using * the fixed machine type (long, int, short), so it can hold only values of * limited length. There is no type (i.e., NativeEnumerated_t, any integer type * will do). * This type may be used when integer range is limited by subtype constraints. */ #ifndef _NativeEnumerated_H_ #define _NativeEnumerated_H_ #include #ifdef __cplusplus extern "C" { #endif extern asn_TYPE_descriptor_t asn_DEF_NativeEnumerated; xer_type_encoder_f NativeEnumerated_encode_xer; per_type_decoder_f NativeEnumerated_decode_uper; per_type_encoder_f NativeEnumerated_encode_uper; #ifdef __cplusplus } #endif #endif /* _NativeEnumerated_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/NativeInteger.c000066400000000000000000000207761305042567700234120ustar00rootroot00000000000000/*- * Copyright (c) 2004, 2005, 2006 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ /* * Read the NativeInteger.h for the explanation wrt. differences between * INTEGER and NativeInteger. * Basically, both are decoders and encoders of ASN.1 INTEGER type, but this * implementation deals with the standard (machine-specific) representation * of them instead of using the platform-independent buffer. */ #include #include /* * NativeInteger basic type description. */ static ber_tlv_tag_t asn_DEF_NativeInteger_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_NativeInteger = { "INTEGER", /* The ASN.1 type is still INTEGER */ "INTEGER", NativeInteger_free, NativeInteger_print, asn_generic_no_constraint, NativeInteger_decode_ber, NativeInteger_encode_der, NativeInteger_decode_xer, NativeInteger_encode_xer, NativeInteger_decode_uper, /* Unaligned PER decoder */ NativeInteger_encode_uper, /* Unaligned PER encoder */ 0, /* Use generic outmost tag fetcher */ asn_DEF_NativeInteger_tags, sizeof(asn_DEF_NativeInteger_tags) / sizeof(asn_DEF_NativeInteger_tags[0]), asn_DEF_NativeInteger_tags, /* Same as above */ sizeof(asn_DEF_NativeInteger_tags) / sizeof(asn_DEF_NativeInteger_tags[0]), 0, /* No PER visible constraints */ 0, 0, /* No members */ 0 /* No specifics */ }; /* * Decode INTEGER type. */ asn_dec_rval_t NativeInteger_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **nint_ptr, const void *buf_ptr, size_t size, int tag_mode) { asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; long *native = (long *)*nint_ptr; asn_dec_rval_t rval; ber_tlv_len_t length; /* * If the structure is not there, allocate it. */ if(native == NULL) { native = (long *)(*nint_ptr = CALLOC(1, sizeof(*native))); if(native == NULL) { rval.code = RC_FAIL; rval.consumed = 0; return rval; } } ASN_DEBUG("Decoding %s as INTEGER (tm=%d)", td->name, tag_mode); /* * Check tags. */ rval = ber_check_tags(opt_codec_ctx, td, 0, buf_ptr, size, tag_mode, 0, &length, 0); if(rval.code != RC_OK) return rval; ASN_DEBUG("%s length is %d bytes", td->name, (int)length); /* * Make sure we have this length. */ buf_ptr = ((const char *)buf_ptr) + rval.consumed; size -= rval.consumed; if(length > (ber_tlv_len_t)size) { rval.code = RC_WMORE; rval.consumed = 0; return rval; } /* * ASN.1 encoded INTEGER: buf_ptr, length * Fill the native, at the same time checking for overflow. * If overflow occured, return with RC_FAIL. */ { INTEGER_t tmp; union { const void *constbuf; void *nonconstbuf; } unconst_buf; long l; unconst_buf.constbuf = buf_ptr; tmp.buf = (uint8_t *)unconst_buf.nonconstbuf; tmp.size = length; if((specs&&specs->field_unsigned) ? asn_INTEGER2ulong(&tmp, &l) : asn_INTEGER2long(&tmp, &l)) { rval.code = RC_FAIL; rval.consumed = 0; return rval; } *native = l; } rval.code = RC_OK; rval.consumed += length; ASN_DEBUG("Took %ld/%ld bytes to encode %s (%ld)", (long)rval.consumed, (long)length, td->name, (long)*native); return rval; } /* * Encode the NativeInteger using the standard INTEGER type DER encoder. */ asn_enc_rval_t NativeInteger_encode_der(asn_TYPE_descriptor_t *sd, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { unsigned long native = *(unsigned long *)ptr; /* Disable sign ext. */ asn_enc_rval_t erval; INTEGER_t tmp; #ifdef WORDS_BIGENDIAN /* Opportunistic optimization */ tmp.buf = (uint8_t *)&native; tmp.size = sizeof(native); #else /* Works even if WORDS_BIGENDIAN is not set where should've been */ uint8_t buf[sizeof(native)]; uint8_t *p; /* Prepare a fake INTEGER */ for(p = buf + sizeof(buf) - 1; p >= buf; p--, native >>= 8) *p = (uint8_t)native; tmp.buf = buf; tmp.size = sizeof(buf); #endif /* WORDS_BIGENDIAN */ /* Encode fake INTEGER */ erval = INTEGER_encode_der(sd, &tmp, tag_mode, tag, cb, app_key); if(erval.encoded == -1) { assert(erval.structure_ptr == &tmp); erval.structure_ptr = ptr; } return erval; } /* * Decode the chunk of XML text encoding INTEGER. */ asn_dec_rval_t NativeInteger_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, const void *buf_ptr, size_t size) { asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; asn_dec_rval_t rval; INTEGER_t st; void *st_ptr = (void *)&st; long *native = (long *)*sptr; if(!native) { native = (long *)(*sptr = CALLOC(1, sizeof(*native))); if(!native) _ASN_DECODE_FAILED; } memset(&st, 0, sizeof(st)); rval = INTEGER_decode_xer(opt_codec_ctx, td, &st_ptr, opt_mname, buf_ptr, size); if(rval.code == RC_OK) { long l; if((specs&&specs->field_unsigned) ? asn_INTEGER2ulong(&st, &l) : asn_INTEGER2long(&st, &l)) { rval.code = RC_FAIL; rval.consumed = 0; } else { *native = l; } } else { /* * Cannot restart from the middle; * there is no place to save state in the native type. * Request a continuation from the very beginning. */ rval.consumed = 0; } ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &st); return rval; } asn_enc_rval_t NativeInteger_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; char scratch[32]; /* Enough for 64-bit int */ asn_enc_rval_t er; const long *native = (const long *)sptr; (void)ilevel; (void)flags; if(!native) _ASN_ENCODE_FAILED; er.encoded = snprintf(scratch, sizeof(scratch), (specs && specs->field_unsigned) ? "%lu" : "%ld", *native); if(er.encoded <= 0 || (size_t)er.encoded >= sizeof(scratch) || cb(scratch, er.encoded, app_key) < 0) _ASN_ENCODE_FAILED; _ASN_ENCODED_OK(er); } asn_dec_rval_t NativeInteger_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; asn_dec_rval_t rval; long *native = (long *)*sptr; INTEGER_t tmpint; void *tmpintptr = &tmpint; (void)opt_codec_ctx; ASN_DEBUG("Decoding NativeInteger %s (UPER)", td->name); if(!native) { native = (long *)(*sptr = CALLOC(1, sizeof(*native))); if(!native) _ASN_DECODE_FAILED; } memset(&tmpint, 0, sizeof tmpint); rval = INTEGER_decode_uper(opt_codec_ctx, td, constraints, &tmpintptr, pd); if(rval.code == RC_OK) { if((specs&&specs->field_unsigned) ? asn_INTEGER2ulong(&tmpint, native) : asn_INTEGER2long(&tmpint, native)) rval.code = RC_FAIL; else ASN_DEBUG("NativeInteger %s got value %ld", td->name, *native); } ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); return rval; } asn_enc_rval_t NativeInteger_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; asn_enc_rval_t er; long native; INTEGER_t tmpint; if(!sptr) _ASN_ENCODE_FAILED; native = *(long *)sptr; ASN_DEBUG("Encoding NativeInteger %s %ld (UPER)", td->name, native); memset(&tmpint, 0, sizeof(tmpint)); if((specs&&specs->field_unsigned) ? asn_ulong2INTEGER(&tmpint, native) : asn_long2INTEGER(&tmpint, native)) _ASN_ENCODE_FAILED; er = INTEGER_encode_uper(td, constraints, &tmpint, po); ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); return er; } /* * INTEGER specific human-readable output. */ int NativeInteger_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; const long *native = (const long *)sptr; char scratch[32]; /* Enough for 64-bit int */ int ret; (void)td; /* Unused argument */ (void)ilevel; /* Unused argument */ if(native) { ret = snprintf(scratch, sizeof(scratch), (specs && specs->field_unsigned) ? "%lu" : "%ld", *native); assert(ret > 0 && (size_t)ret < sizeof(scratch)); return (cb(scratch, ret, app_key) < 0) ? -1 : 0; } else { return (cb("", 8, app_key) < 0) ? -1 : 0; } } void NativeInteger_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { if(!td || !ptr) return; ASN_DEBUG("Freeing %s as INTEGER (%d, %p, Native)", td->name, contents_only, ptr); if(!contents_only) { FREEMEM(ptr); } } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/NativeInteger.h000066400000000000000000000021041305042567700234000ustar00rootroot00000000000000/*- * Copyright (c) 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ /* * This type differs from the standard INTEGER in that it is modelled using * the fixed machine type (long, int, short), so it can hold only values of * limited length. There is no type (i.e., NativeInteger_t, any integer type * will do). * This type may be used when integer range is limited by subtype constraints. */ #ifndef _NativeInteger_H_ #define _NativeInteger_H_ #include #include #ifdef __cplusplus extern "C" { #endif extern asn_TYPE_descriptor_t asn_DEF_NativeInteger; asn_struct_free_f NativeInteger_free; asn_struct_print_f NativeInteger_print; ber_type_decoder_f NativeInteger_decode_ber; der_type_encoder_f NativeInteger_encode_der; xer_type_decoder_f NativeInteger_decode_xer; xer_type_encoder_f NativeInteger_encode_xer; per_type_decoder_f NativeInteger_decode_uper; per_type_encoder_f NativeInteger_encode_uper; #ifdef __cplusplus } #endif #endif /* _NativeInteger_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/Notification.c000066400000000000000000000121721305042567700232630ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-INIT" * found in "../supl-init.asn" */ #include "Notification.h" static int memb_requestorId_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } size = st->size; if((size >= 1 && size <= 50)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_clientName_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } size = st->size; if((size >= 1 && size <= 50)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_requestorId_constr_4 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 6, 6, 1, 50 } /* (SIZE(1..50)) */, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_clientName_constr_6 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 6, 6, 1, 50 } /* (SIZE(1..50)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_Notification_1[] = { { ATF_NOFLAGS, 0, offsetof(struct Notification, notificationType), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NotificationType, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "notificationType" }, { ATF_POINTER, 5, offsetof(struct Notification, encodingType), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_EncodingType, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "encodingType" }, { ATF_POINTER, 4, offsetof(struct Notification, requestorId), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_OCTET_STRING, memb_requestorId_constraint_1, &asn_PER_memb_requestorId_constr_4, 0, "requestorId" }, { ATF_POINTER, 3, offsetof(struct Notification, requestorIdType), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_FormatIndicator, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "requestorIdType" }, { ATF_POINTER, 2, offsetof(struct Notification, clientName), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_OCTET_STRING, memb_clientName_constraint_1, &asn_PER_memb_clientName_constr_6, 0, "clientName" }, { ATF_POINTER, 1, offsetof(struct Notification, clientNameType), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_FormatIndicator, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "clientNameType" }, }; static int asn_MAP_Notification_oms_1[] = { 1, 2, 3, 4, 5 }; static ber_tlv_tag_t asn_DEF_Notification_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_Notification_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* notificationType at 20 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* encodingType at 21 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* requestorId at 22 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* requestorIdType at 23 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* clientName at 24 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 } /* clientNameType at 25 */ }; static asn_SEQUENCE_specifics_t asn_SPC_Notification_specs_1 = { sizeof(struct Notification), offsetof(struct Notification, _asn_ctx), asn_MAP_Notification_tag2el_1, 6, /* Count of tags in the map */ asn_MAP_Notification_oms_1, /* Optional members */ 5, 0, /* Root/Additions */ 5, /* Start extensions */ 7 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Notification = { "Notification", "Notification", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_Notification_tags_1, sizeof(asn_DEF_Notification_tags_1) /sizeof(asn_DEF_Notification_tags_1[0]), /* 1 */ asn_DEF_Notification_tags_1, /* Same as above */ sizeof(asn_DEF_Notification_tags_1) /sizeof(asn_DEF_Notification_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_Notification_1, 6, /* Elements count */ &asn_SPC_Notification_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/Notification.h000066400000000000000000000021001305042567700232560ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-INIT" * found in "../supl-init.asn" */ #ifndef _Notification_H_ #define _Notification_H_ #include /* Including external dependencies */ #include "NotificationType.h" #include "EncodingType.h" #include #include "FormatIndicator.h" #include #ifdef __cplusplus extern "C" { #endif /* Notification */ typedef struct Notification { NotificationType_t notificationType; EncodingType_t *encodingType /* OPTIONAL */; OCTET_STRING_t *requestorId /* OPTIONAL */; FormatIndicator_t *requestorIdType /* OPTIONAL */; OCTET_STRING_t *clientName /* OPTIONAL */; FormatIndicator_t *clientNameType /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } Notification_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Notification; #ifdef __cplusplus } #endif #endif /* _Notification_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/NotificationType.c000066400000000000000000000130761305042567700241310ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-INIT" * found in "../supl-init.asn" */ #include "NotificationType.h" int NotificationType_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { /* Replace with underlying type checker */ td->check_constraints = asn_DEF_ENUMERATED.check_constraints; return td->check_constraints(td, sptr, ctfailcb, app_key); } /* * This type is implemented using ENUMERATED, * so here we adjust the DEF accordingly. */ static void NotificationType_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_ENUMERATED.free_struct; td->print_struct = asn_DEF_ENUMERATED.print_struct; td->ber_decoder = asn_DEF_ENUMERATED.ber_decoder; td->der_encoder = asn_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; td->uper_encoder = asn_DEF_ENUMERATED.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_ENUMERATED.per_constraints; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ } void NotificationType_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { NotificationType_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int NotificationType_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { NotificationType_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t NotificationType_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { NotificationType_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t NotificationType_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { NotificationType_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t NotificationType_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { NotificationType_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t NotificationType_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { NotificationType_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t NotificationType_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { NotificationType_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t NotificationType_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { NotificationType_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_NotificationType_constr_1 = { { APC_CONSTRAINED | APC_EXTENSIBLE, 3, 3, 0, 4 } /* (0..4,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_INTEGER_enum_map_t asn_MAP_NotificationType_value2enum_1[] = { { 0, 28, "noNotificationNoVerification" }, { 1, 16, "notificationOnly" }, { 2, 35, "notificationAndVerficationAllowedNA" }, { 3, 34, "notificationAndVerficationDeniedNA" }, { 4, 15, "privacyOverride" } /* This list is extensible */ }; static unsigned int asn_MAP_NotificationType_enum2value_1[] = { 0, /* noNotificationNoVerification(0) */ 2, /* notificationAndVerficationAllowedNA(2) */ 3, /* notificationAndVerficationDeniedNA(3) */ 1, /* notificationOnly(1) */ 4 /* privacyOverride(4) */ /* This list is extensible */ }; static asn_INTEGER_specifics_t asn_SPC_NotificationType_specs_1 = { asn_MAP_NotificationType_value2enum_1, /* "tag" => N; sorted by tag */ asn_MAP_NotificationType_enum2value_1, /* N => "tag"; sorted by N */ 5, /* Number of elements in the maps */ 6, /* Extensions before this member */ 1, /* Strict enumeration */ 0, /* Native long size */ 0 }; static ber_tlv_tag_t asn_DEF_NotificationType_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; asn_TYPE_descriptor_t asn_DEF_NotificationType = { "NotificationType", "NotificationType", NotificationType_free, NotificationType_print, NotificationType_constraint, NotificationType_decode_ber, NotificationType_encode_der, NotificationType_decode_xer, NotificationType_encode_xer, NotificationType_decode_uper, NotificationType_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_NotificationType_tags_1, sizeof(asn_DEF_NotificationType_tags_1) /sizeof(asn_DEF_NotificationType_tags_1[0]), /* 1 */ asn_DEF_NotificationType_tags_1, /* Same as above */ sizeof(asn_DEF_NotificationType_tags_1) /sizeof(asn_DEF_NotificationType_tags_1[0]), /* 1 */ &asn_PER_type_NotificationType_constr_1, 0, 0, /* Defined elsewhere */ &asn_SPC_NotificationType_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/NotificationType.h000066400000000000000000000024701305042567700241320ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-INIT" * found in "../supl-init.asn" */ #ifndef _NotificationType_H_ #define _NotificationType_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum NotificationType { NotificationType_noNotificationNoVerification = 0, NotificationType_notificationOnly = 1, NotificationType_notificationAndVerficationAllowedNA = 2, NotificationType_notificationAndVerficationDeniedNA = 3, NotificationType_privacyOverride = 4 /* * Enumeration is extensible */ } e_NotificationType; /* NotificationType */ typedef ENUMERATED_t NotificationType_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_NotificationType; asn_struct_free_f NotificationType_free; asn_struct_print_f NotificationType_print; asn_constr_check_f NotificationType_constraint; ber_type_decoder_f NotificationType_decode_ber; der_type_encoder_f NotificationType_encode_der; xer_type_decoder_f NotificationType_decode_xer; xer_type_encoder_f NotificationType_encode_xer; per_type_decoder_f NotificationType_decode_uper; per_type_encoder_f NotificationType_encode_uper; #ifdef __cplusplus } #endif #endif /* _NotificationType_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/OCTET_STRING.c000066400000000000000000001332351305042567700226050ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004, 2005, 2006 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include /* for .bits_unused member */ #include /* * OCTET STRING basic type description. */ static ber_tlv_tag_t asn_DEF_OCTET_STRING_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) }; static asn_OCTET_STRING_specifics_t asn_DEF_OCTET_STRING_specs = { sizeof(OCTET_STRING_t), offsetof(OCTET_STRING_t, _asn_ctx), ASN_OSUBV_STR }; static asn_per_constraints_t asn_DEF_OCTET_STRING_constraints = { { APC_CONSTRAINED, 8, 8, 0, 255 }, { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 }, 0, 0 }; asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = { "OCTET STRING", /* Canonical name */ "OCTET_STRING", /* XML tag name */ OCTET_STRING_free, OCTET_STRING_print, /* non-ascii stuff, generally */ asn_generic_no_constraint, OCTET_STRING_decode_ber, OCTET_STRING_encode_der, OCTET_STRING_decode_xer_hex, OCTET_STRING_encode_xer, OCTET_STRING_decode_uper, /* Unaligned PER decoder */ OCTET_STRING_encode_uper, /* Unaligned PER encoder */ 0, /* Use generic outmost tag fetcher */ asn_DEF_OCTET_STRING_tags, sizeof(asn_DEF_OCTET_STRING_tags) / sizeof(asn_DEF_OCTET_STRING_tags[0]), asn_DEF_OCTET_STRING_tags, /* Same as above */ sizeof(asn_DEF_OCTET_STRING_tags) / sizeof(asn_DEF_OCTET_STRING_tags[0]), 0, /* No PER visible constraints */ 0, 0, /* No members */ &asn_DEF_OCTET_STRING_specs }; #undef _CH_PHASE #undef NEXT_PHASE #undef PREV_PHASE #define _CH_PHASE(ctx, inc) do { \ if(ctx->phase == 0) \ ctx->context = 0; \ ctx->phase += inc; \ } while(0) #define NEXT_PHASE(ctx) _CH_PHASE(ctx, +1) #define PREV_PHASE(ctx) _CH_PHASE(ctx, -1) #undef ADVANCE #define ADVANCE(num_bytes) do { \ size_t num = (num_bytes); \ buf_ptr = ((const char *)buf_ptr) + num; \ size -= num; \ consumed_myself += num; \ } while(0) #undef RETURN #define RETURN(_code) do { \ asn_dec_rval_t tmprval; \ tmprval.code = _code; \ tmprval.consumed = consumed_myself; \ return tmprval; \ } while(0) #undef APPEND #define APPEND(bufptr, bufsize) do { \ size_t _bs = (bufsize); /* Append size */ \ size_t _ns = ctx->context; /* Allocated now */ \ size_t _es = st->size + _bs; /* Expected size */ \ /* int is really a typeof(st->size): */ \ if((int)_es < 0) RETURN(RC_FAIL); \ if(_ns <= _es) { \ void *ptr; \ /* Be nice and round to the memory allocator */ \ do { _ns = _ns ? _ns << 1 : 16; } \ while(_ns <= _es); \ /* int is really a typeof(st->size): */ \ if((int)_ns < 0) RETURN(RC_FAIL); \ ptr = REALLOC(st->buf, _ns); \ if(ptr) { \ st->buf = (uint8_t *)ptr; \ ctx->context = _ns; \ } else { \ RETURN(RC_FAIL); \ } \ ASN_DEBUG("Reallocating into %ld", (long)_ns); \ } \ memcpy(st->buf + st->size, bufptr, _bs); \ /* Convenient nul-termination */ \ st->buf[_es] = '\0'; \ st->size = _es; \ } while(0) /* * The main reason why ASN.1 is still alive is that too much time and effort * is necessary for learning it more or less adequately, thus creating a gut * necessity to demonstrate that aquired skill everywhere afterwards. * No, I am not going to explain what the following stuff is. */ struct _stack_el { ber_tlv_len_t left; /* What's left to read (or -1) */ ber_tlv_len_t got; /* What was actually processed */ int cont_level; /* Depth of subcontainment */ int want_nulls; /* Want null "end of content" octets? */ int bits_chopped; /* Flag in BIT STRING mode */ ber_tlv_tag_t tag; /* For debugging purposes */ struct _stack_el *prev; struct _stack_el *next; }; struct _stack { struct _stack_el *tail; struct _stack_el *cur_ptr; }; static struct _stack_el * OS__add_stack_el(struct _stack *st) { struct _stack_el *nel; /* * Reuse the old stack frame or allocate a new one. */ if(st->cur_ptr && st->cur_ptr->next) { nel = st->cur_ptr->next; nel->bits_chopped = 0; nel->got = 0; /* Retain the nel->cont_level, it's correct. */ } else { nel = (struct _stack_el *)CALLOC(1, sizeof(struct _stack_el)); if(nel == NULL) return NULL; if(st->tail) { /* Increase a subcontainment depth */ nel->cont_level = st->tail->cont_level + 1; st->tail->next = nel; } nel->prev = st->tail; st->tail = nel; } st->cur_ptr = nel; return nel; } static struct _stack * _new_stack() { return (struct _stack *)CALLOC(1, sizeof(struct _stack)); } /* * Decode OCTET STRING type. */ asn_dec_rval_t OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const void *buf_ptr, size_t size, int tag_mode) { asn_OCTET_STRING_specifics_t *specs = td->specifics ? (asn_OCTET_STRING_specifics_t *)td->specifics : &asn_DEF_OCTET_STRING_specs; BIT_STRING_t *st = (BIT_STRING_t *)*sptr; asn_dec_rval_t rval; asn_struct_ctx_t *ctx; ssize_t consumed_myself = 0; struct _stack *stck; /* Expectations stack structure */ struct _stack_el *sel = 0; /* Stack element */ int tlv_constr; enum asn_OS_Subvariant type_variant = specs->subvariant; ASN_DEBUG("Decoding %s as %s (frame %ld)", td->name, (type_variant == ASN_OSUBV_STR) ? "OCTET STRING" : "OS-SpecialCase", (long)size); /* * Create the string if does not exist. */ if(st == NULL) { st = (BIT_STRING_t *)(*sptr = CALLOC(1, specs->struct_size)); if(st == NULL) RETURN(RC_FAIL); } /* Restore parsing context */ ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); switch(ctx->phase) { case 0: /* * Check tags. */ rval = ber_check_tags(opt_codec_ctx, td, ctx, buf_ptr, size, tag_mode, -1, &ctx->left, &tlv_constr); if(rval.code != RC_OK) return rval; if(tlv_constr) { /* * Complex operation, requires stack of expectations. */ ctx->ptr = _new_stack(); if(ctx->ptr) { stck = (struct _stack *)ctx->ptr; } else { RETURN(RC_FAIL); } } else { /* * Jump into stackless primitive decoding. */ _CH_PHASE(ctx, 3); if(type_variant == ASN_OSUBV_ANY && tag_mode != 1) APPEND(buf_ptr, rval.consumed); ADVANCE(rval.consumed); goto phase3; } NEXT_PHASE(ctx); /* Fall through */ case 1: phase1: /* * Fill the stack with expectations. */ stck = (struct _stack *)ctx->ptr; sel = stck->cur_ptr; do { ber_tlv_tag_t tlv_tag; ber_tlv_len_t tlv_len; ber_tlv_tag_t expected_tag; ssize_t tl, ll, tlvl; /* This one works even if (sel->left == -1) */ ssize_t Left = ((!sel||(size_t)sel->left >= size) ?(ssize_t)size:sel->left); ASN_DEBUG("%p, s->l=%ld, s->wn=%ld, s->g=%ld\n", sel, (long)(sel?sel->left:0), (long)(sel?sel->want_nulls:0), (long)(sel?sel->got:0) ); if(sel && sel->left <= 0 && sel->want_nulls == 0) { if(sel->prev) { struct _stack_el *prev = sel->prev; if(prev->left != -1) { if(prev->left < sel->got) RETURN(RC_FAIL); prev->left -= sel->got; } prev->got += sel->got; sel = stck->cur_ptr = prev; if(!sel) break; tlv_constr = 1; continue; } else { sel = stck->cur_ptr = 0; break; /* Nothing to wait */ } } tl = ber_fetch_tag(buf_ptr, Left, &tlv_tag); ASN_DEBUG("fetch tag(size=%ld,L=%ld), %sstack, left=%ld, wn=%ld, tl=%ld", (long)size, (long)Left, sel?"":"!", (long)(sel?sel->left:0), (long)(sel?sel->want_nulls:0), (long)tl); switch(tl) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); } tlv_constr = BER_TLV_CONSTRUCTED(buf_ptr); ll = ber_fetch_length(tlv_constr, (const char *)buf_ptr + tl,Left - tl,&tlv_len); ASN_DEBUG("Got tag=%s, tc=%d, left=%ld, tl=%ld, len=%ld, ll=%ld", ber_tlv_tag_string(tlv_tag), tlv_constr, (long)Left, (long)tl, (long)tlv_len, (long)ll); switch(ll) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); } if(sel && sel->want_nulls && ((const uint8_t *)buf_ptr)[0] == 0 && ((const uint8_t *)buf_ptr)[1] == 0) { ASN_DEBUG("Eat EOC; wn=%d--", sel->want_nulls); if(type_variant == ASN_OSUBV_ANY && (tag_mode != 1 || sel->cont_level)) APPEND("\0\0", 2); ADVANCE(2); sel->got += 2; if(sel->left != -1) { sel->left -= 2; /* assert(sel->left >= 2) */ } sel->want_nulls--; if(sel->want_nulls == 0) { /* Move to the next expectation */ sel->left = 0; tlv_constr = 1; } continue; } /* * Set up expected tags, * depending on ASN.1 type being decoded. */ switch(type_variant) { case ASN_OSUBV_BIT: /* X.690: 8.6.4.1, NOTE 2 */ /* Fall through */ case ASN_OSUBV_STR: default: if(sel) { int level = sel->cont_level; if(level < td->all_tags_count) { expected_tag = td->all_tags[level]; break; } else if(td->all_tags_count) { expected_tag = td->all_tags [td->all_tags_count - 1]; break; } /* else, Fall through */ } /* Fall through */ case ASN_OSUBV_ANY: expected_tag = tlv_tag; break; } if(tlv_tag != expected_tag) { char buf[2][32]; ber_tlv_tag_snprint(tlv_tag, buf[0], sizeof(buf[0])); ber_tlv_tag_snprint(td->tags[td->tags_count-1], buf[1], sizeof(buf[1])); ASN_DEBUG("Tag does not match expectation: %s != %s", buf[0], buf[1]); RETURN(RC_FAIL); } tlvl = tl + ll; /* Combined length of T and L encoding */ if((tlv_len + tlvl) < 0) { /* tlv_len value is too big */ ASN_DEBUG("TLV encoding + length (%ld) is too big", (long)tlv_len); RETURN(RC_FAIL); } /* * Append a new expectation. */ sel = OS__add_stack_el(stck); if(!sel) RETURN(RC_FAIL); sel->tag = tlv_tag; sel->want_nulls = (tlv_len==-1); if(sel->prev && sel->prev->left != -1) { /* Check that the parent frame is big enough */ if(sel->prev->left < tlvl + (tlv_len==-1?0:tlv_len)) RETURN(RC_FAIL); if(tlv_len == -1) sel->left = sel->prev->left - tlvl; else sel->left = tlv_len; } else { sel->left = tlv_len; } if(type_variant == ASN_OSUBV_ANY && (tag_mode != 1 || sel->cont_level)) APPEND(buf_ptr, tlvl); sel->got += tlvl; ADVANCE(tlvl); ASN_DEBUG("+EXPECT2 got=%ld left=%ld, wn=%d, clvl=%d", (long)sel->got, (long)sel->left, sel->want_nulls, sel->cont_level); } while(tlv_constr); if(sel == NULL) { /* Finished operation, "phase out" */ ASN_DEBUG("Phase out"); _CH_PHASE(ctx, +3); break; } NEXT_PHASE(ctx); /* Fall through */ case 2: stck = (struct _stack *)ctx->ptr; sel = stck->cur_ptr; ASN_DEBUG("Phase 2: Need %ld bytes, size=%ld, alrg=%ld, wn=%d", (long)sel->left, (long)size, (long)sel->got, sel->want_nulls); { ber_tlv_len_t len; assert(sel->left >= 0); len = ((ber_tlv_len_t)size < sel->left) ? (ber_tlv_len_t)size : sel->left; if(len > 0) { if(type_variant == ASN_OSUBV_BIT && sel->bits_chopped == 0) { /* Put the unused-bits-octet away */ st->bits_unused = *(const uint8_t *)buf_ptr; APPEND(((const char *)buf_ptr+1), (len - 1)); sel->bits_chopped = 1; } else { APPEND(buf_ptr, len); } ADVANCE(len); sel->left -= len; sel->got += len; } if(sel->left) { ASN_DEBUG("OS left %ld, size = %ld, wn=%d\n", (long)sel->left, (long)size, sel->want_nulls); RETURN(RC_WMORE); } PREV_PHASE(ctx); goto phase1; } break; case 3: phase3: /* * Primitive form, no stack required. */ assert(ctx->left >= 0); if(size < (size_t)ctx->left) { if(!size) RETURN(RC_WMORE); if(type_variant == ASN_OSUBV_BIT && !ctx->context) { st->bits_unused = *(const uint8_t *)buf_ptr; ctx->left--; ADVANCE(1); } APPEND(buf_ptr, size); assert(ctx->context > 0); ctx->left -= size; ADVANCE(size); RETURN(RC_WMORE); } else { if(type_variant == ASN_OSUBV_BIT && !ctx->context && ctx->left) { st->bits_unused = *(const uint8_t *)buf_ptr; ctx->left--; ADVANCE(1); } APPEND(buf_ptr, ctx->left); ADVANCE(ctx->left); ctx->left = 0; NEXT_PHASE(ctx); } break; } if(sel) { ASN_DEBUG("3sel p=%p, wn=%d, l=%ld, g=%ld, size=%ld", sel->prev, sel->want_nulls, (long)sel->left, (long)sel->got, (long)size); if(sel->prev || sel->want_nulls > 1 || sel->left > 0) { RETURN(RC_WMORE); } } /* * BIT STRING-specific processing. */ if(type_variant == ASN_OSUBV_BIT && st->size) { /* Finalize BIT STRING: zero out unused bits. */ st->buf[st->size-1] &= 0xff << st->bits_unused; } ASN_DEBUG("Took %ld bytes to encode %s: [%s]:%ld", (long)consumed_myself, td->name, (type_variant == ASN_OSUBV_STR) ? (char *)st->buf : "", (long)st->size); RETURN(RC_OK); } /* * Encode OCTET STRING type using DER. */ asn_enc_rval_t OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t er; asn_OCTET_STRING_specifics_t *specs = td->specifics ? (asn_OCTET_STRING_specifics_t *)td->specifics : &asn_DEF_OCTET_STRING_specs; BIT_STRING_t *st = (BIT_STRING_t *)sptr; enum asn_OS_Subvariant type_variant = specs->subvariant; int fix_last_byte = 0; ASN_DEBUG("%s %s as OCTET STRING", cb?"Estimating":"Encoding", td->name); /* * Write tags. */ if(type_variant != ASN_OSUBV_ANY || tag_mode == 1) { er.encoded = der_write_tags(td, (type_variant == ASN_OSUBV_BIT) + st->size, tag_mode, type_variant == ASN_OSUBV_ANY, tag, cb, app_key); if(er.encoded == -1) { er.failed_type = td; er.structure_ptr = sptr; return er; } } else { /* Disallow: [] IMPLICIT ANY */ assert(type_variant != ASN_OSUBV_ANY || tag_mode != -1); er.encoded = 0; } if(!cb) { er.encoded += (type_variant == ASN_OSUBV_BIT) + st->size; _ASN_ENCODED_OK(er); } /* * Prepare to deal with the last octet of BIT STRING. */ if(type_variant == ASN_OSUBV_BIT) { uint8_t b = st->bits_unused & 0x07; if(b && st->size) fix_last_byte = 1; _ASN_CALLBACK(&b, 1); er.encoded++; } /* Invoke callback for the main part of the buffer */ _ASN_CALLBACK(st->buf, st->size - fix_last_byte); /* The last octet should be stripped off the unused bits */ if(fix_last_byte) { uint8_t b = st->buf[st->size-1] & (0xff << st->bits_unused); _ASN_CALLBACK(&b, 1); } er.encoded += st->size; _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } asn_enc_rval_t OCTET_STRING_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { static const char *h2c = "0123456789ABCDEF"; const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; asn_enc_rval_t er; char scratch[16 * 3 + 4]; char *p = scratch; uint8_t *buf; uint8_t *end; size_t i; if(!st || (!st->buf && st->size)) _ASN_ENCODE_FAILED; er.encoded = 0; /* * Dump the contents of the buffer in hexadecimal. */ buf = st->buf; end = buf + st->size; if(flags & XER_F_CANONICAL) { char *scend = scratch + (sizeof(scratch) - 2); for(; buf < end; buf++) { if(p >= scend) { _ASN_CALLBACK(scratch, p - scratch); er.encoded += p - scratch; p = scratch; } *p++ = h2c[(*buf >> 4) & 0x0F]; *p++ = h2c[*buf & 0x0F]; } _ASN_CALLBACK(scratch, p-scratch); /* Dump the rest */ er.encoded += p - scratch; } else { for(i = 0; buf < end; buf++, i++) { if(!(i % 16) && (i || st->size > 16)) { _ASN_CALLBACK(scratch, p-scratch); er.encoded += (p-scratch); p = scratch; _i_ASN_TEXT_INDENT(1, ilevel); } *p++ = h2c[(*buf >> 4) & 0x0F]; *p++ = h2c[*buf & 0x0F]; *p++ = 0x20; } if(p - scratch) { p--; /* Remove the tail space */ _ASN_CALLBACK(scratch, p-scratch); /* Dump the rest */ er.encoded += p - scratch; if(st->size > 16) _i_ASN_TEXT_INDENT(1, ilevel-1); } } _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } static struct OCTET_STRING__xer_escape_table_s { char *string; int size; } OCTET_STRING__xer_escape_table[] = { #define OSXET(s) { s, sizeof(s) - 1 } OSXET("\074\156\165\154\057\076"), /* */ OSXET("\074\163\157\150\057\076"), /* */ OSXET("\074\163\164\170\057\076"), /* */ OSXET("\074\145\164\170\057\076"), /* */ OSXET("\074\145\157\164\057\076"), /* */ OSXET("\074\145\156\161\057\076"), /* */ OSXET("\074\141\143\153\057\076"), /* */ OSXET("\074\142\145\154\057\076"), /* */ OSXET("\074\142\163\057\076"), /* */ OSXET("\011"), /* \t */ OSXET("\012"), /* \n */ OSXET("\074\166\164\057\076"), /* */ OSXET("\074\146\146\057\076"), /* */ OSXET("\015"), /* \r */ OSXET("\074\163\157\057\076"), /* */ OSXET("\074\163\151\057\076"), /* */ OSXET("\074\144\154\145\057\076"), /* */ OSXET("\074\144\143\061\057\076"), /* */ OSXET("\074\144\143\062\057\076"), /* */ OSXET("\074\144\143\063\057\076"), /* */ OSXET("\074\144\143\064\057\076"), /* */ OSXET("\074\156\141\153\057\076"), /* */ OSXET("\074\163\171\156\057\076"), /* */ OSXET("\074\145\164\142\057\076"), /* */ OSXET("\074\143\141\156\057\076"), /* */ OSXET("\074\145\155\057\076"), /* */ OSXET("\074\163\165\142\057\076"), /* */ OSXET("\074\145\163\143\057\076"), /* */ OSXET("\074\151\163\064\057\076"), /* */ OSXET("\074\151\163\063\057\076"), /* */ OSXET("\074\151\163\062\057\076"), /* */ OSXET("\074\151\163\061\057\076"), /* */ { 0, 0 }, /* " " */ { 0, 0 }, /* ! */ { 0, 0 }, /* \" */ { 0, 0 }, /* # */ { 0, 0 }, /* $ */ { 0, 0 }, /* % */ OSXET("\046\141\155\160\073"), /* & */ { 0, 0 }, /* ' */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* ()*+,-./ */ {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* 01234567 */ {0,0},{0,0},{0,0},{0,0}, /* 89:; */ OSXET("\046\154\164\073"), /* < */ { 0, 0 }, /* = */ OSXET("\046\147\164\073"), /* > */ }; static int OS__check_escaped_control_char(const void *buf, int size) { size_t i; /* * Inefficient algorithm which translates the escape sequences * defined above into characters. Returns -1 if not found. * TODO: replace by a faster algorithm (bsearch(), hash or * nested table lookups). */ for(i = 0; i < 32 /* Don't spend time on the bottom half */; i++) { struct OCTET_STRING__xer_escape_table_s *el; el = &OCTET_STRING__xer_escape_table[i]; if(el->size == size && memcmp(buf, el->string, size) == 0) return i; } return -1; } static int OCTET_STRING__handle_control_chars(void *struct_ptr, const void *chunk_buf, size_t chunk_size) { /* * This might be one of the escape sequences * for control characters. Check it out. * #11.15.5 */ int control_char = OS__check_escaped_control_char(chunk_buf,chunk_size); if(control_char >= 0) { OCTET_STRING_t *st = (OCTET_STRING_t *)struct_ptr; void *p = REALLOC(st->buf, st->size + 2); if(p) { st->buf = (uint8_t *)p; st->buf[st->size++] = control_char; st->buf[st->size] = '\0'; /* nul-termination */ return 0; } } return -1; /* No, it's not */ } asn_enc_rval_t OCTET_STRING_encode_xer_utf8(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; asn_enc_rval_t er; uint8_t *buf, *end; uint8_t *ss; /* Sequence start */ ssize_t encoded_len = 0; (void)ilevel; /* Unused argument */ (void)flags; /* Unused argument */ if(!st || (!st->buf && st->size)) _ASN_ENCODE_FAILED; buf = st->buf; end = buf + st->size; for(ss = buf; buf < end; buf++) { unsigned int ch = *buf; int s_len; /* Special encoding sequence length */ /* * Escape certain characters: X.680/11.15 */ if(ch < sizeof(OCTET_STRING__xer_escape_table) /sizeof(OCTET_STRING__xer_escape_table[0]) && (s_len = OCTET_STRING__xer_escape_table[ch].size)) { if(((buf - ss) && cb(ss, buf - ss, app_key) < 0) || cb(OCTET_STRING__xer_escape_table[ch].string, s_len, app_key) < 0) _ASN_ENCODE_FAILED; encoded_len += (buf - ss) + s_len; ss = buf + 1; } } encoded_len += (buf - ss); if((buf - ss) && cb(ss, buf - ss, app_key) < 0) _ASN_ENCODE_FAILED; er.encoded = encoded_len; _ASN_ENCODED_OK(er); } /* * Convert from hexadecimal format (cstring): "AB CD EF" */ static ssize_t OCTET_STRING__convert_hexadecimal(void *sptr, const void *chunk_buf, size_t chunk_size, int have_more) { OCTET_STRING_t *st = (OCTET_STRING_t *)sptr; const char *chunk_stop = (const char *)chunk_buf; const char *p = chunk_stop; const char *pend = p + chunk_size; unsigned int clv = 0; int half = 0; /* Half bit */ uint8_t *buf; /* Reallocate buffer according to high cap estimation */ ssize_t _ns = st->size + (chunk_size + 1) / 2; void *nptr = REALLOC(st->buf, _ns + 1); if(!nptr) return -1; st->buf = (uint8_t *)nptr; buf = st->buf + st->size; /* * If something like " a b c " appears here, the " a b":3 will be * converted, and the rest skipped. That is, unless buf_size is greater * than chunk_size, then it'll be equivalent to "ABC0". */ for(; p < pend; p++) { int ch = *(const unsigned char *)p; switch(ch) { case 0x09: case 0x0a: case 0x0c: case 0x0d: case 0x20: /* Ignore whitespace */ continue; case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: /*01234*/ case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: /*56789*/ clv = (clv << 4) + (ch - 0x30); break; case 0x41: case 0x42: case 0x43: /* ABC */ case 0x44: case 0x45: case 0x46: /* DEF */ clv = (clv << 4) + (ch - 0x41 + 10); break; case 0x61: case 0x62: case 0x63: /* abc */ case 0x64: case 0x65: case 0x66: /* def */ clv = (clv << 4) + (ch - 0x61 + 10); break; default: *buf = 0; /* JIC */ return -1; } if(half++) { half = 0; *buf++ = clv; chunk_stop = p + 1; } } /* * Check partial decoding. */ if(half) { if(have_more) { /* * Partial specification is fine, * because no more more PXER_TEXT data is available. */ *buf++ = clv << 4; chunk_stop = p; } } else { chunk_stop = p; } st->size = buf - st->buf; /* Adjust the buffer size */ assert(st->size <= _ns); st->buf[st->size] = 0; /* Courtesy termination */ return (chunk_stop - (const char *)chunk_buf); /* Converted size */ } /* * Convert from binary format: "00101011101" */ static ssize_t OCTET_STRING__convert_binary(void *sptr, const void *chunk_buf, size_t chunk_size, int have_more) { BIT_STRING_t *st = (BIT_STRING_t *)sptr; const char *p = (const char *)chunk_buf; const char *pend = p + chunk_size; int bits_unused = st->bits_unused & 0x7; uint8_t *buf; /* Reallocate buffer according to high cap estimation */ ssize_t _ns = st->size + (chunk_size + 7) / 8; void *nptr = REALLOC(st->buf, _ns + 1); if(!nptr) return -1; st->buf = (uint8_t *)nptr; buf = st->buf + st->size; (void)have_more; if(bits_unused == 0) bits_unused = 8; else if(st->size) buf--; /* * Convert series of 0 and 1 into the octet string. */ for(; p < pend; p++) { int ch = *(const unsigned char *)p; switch(ch) { case 0x09: case 0x0a: case 0x0c: case 0x0d: case 0x20: /* Ignore whitespace */ break; case 0x30: case 0x31: if(bits_unused-- <= 0) { *++buf = 0; /* Clean the cell */ bits_unused = 7; } *buf |= (ch&1) << bits_unused; break; default: st->bits_unused = bits_unused; return -1; } } if(bits_unused == 8) { st->size = buf - st->buf; st->bits_unused = 0; } else { st->size = buf - st->buf + 1; st->bits_unused = bits_unused; } assert(st->size <= _ns); st->buf[st->size] = 0; /* Courtesy termination */ return chunk_size; /* Converted in full */ } /* * Something like strtod(), but with stricter rules. */ static int OS__strtoent(int base, const char *buf, const char *end, int32_t *ret_value) { int32_t val = 0; const char *p; for(p = buf; p < end; p++) { int ch = *p; /* Strange huge value */ if((val * base + base) < 0) return -1; switch(ch) { case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: /*01234*/ case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: /*56789*/ val = val * base + (ch - 0x30); break; case 0x41: case 0x42: case 0x43: /* ABC */ case 0x44: case 0x45: case 0x46: /* DEF */ val = val * base + (ch - 0x41 + 10); break; case 0x61: case 0x62: case 0x63: /* abc */ case 0x64: case 0x65: case 0x66: /* def */ val = val * base + (ch - 0x61 + 10); break; case 0x3b: /* ';' */ *ret_value = val; return (p - buf) + 1; default: return -1; /* Character set error */ } } *ret_value = -1; return (p - buf); } /* * Convert from the plain UTF-8 format, expanding entity references: "2 < 3" */ static ssize_t OCTET_STRING__convert_entrefs(void *sptr, const void *chunk_buf, size_t chunk_size, int have_more) { OCTET_STRING_t *st = (OCTET_STRING_t *)sptr; const char *p = (const char *)chunk_buf; const char *pend = p + chunk_size; uint8_t *buf; /* Reallocate buffer */ ssize_t _ns = st->size + chunk_size; void *nptr = REALLOC(st->buf, _ns + 1); if(!nptr) return -1; st->buf = (uint8_t *)nptr; buf = st->buf + st->size; /* * Convert series of 0 and 1 into the octet string. */ for(; p < pend; p++) { int ch = *(const unsigned char *)p; int len; /* Length of the rest of the chunk */ if(ch != 0x26 /* '&' */) { *buf++ = ch; continue; /* That was easy... */ } /* * Process entity reference. */ len = chunk_size - (p - (const char *)chunk_buf); if(len == 1 /* "&" */) goto want_more; if(p[1] == 0x23 /* '#' */) { const char *pval; /* Pointer to start of digits */ int32_t val = 0; /* Entity reference value */ int base; if(len == 2 /* "&#" */) goto want_more; if(p[2] == 0x78 /* 'x' */) pval = p + 3, base = 16; else pval = p + 2, base = 10; len = OS__strtoent(base, pval, p + len, &val); if(len == -1) { /* Invalid charset. Just copy verbatim. */ *buf++ = ch; continue; } if(!len || pval[len-1] != 0x3b) goto want_more; assert(val > 0); p += (pval - p) + len - 1; /* Advance past entref */ if(val < 0x80) { *buf++ = (char)val; } else if(val < 0x800) { *buf++ = 0xc0 | ((val >> 6)); *buf++ = 0x80 | ((val & 0x3f)); } else if(val < 0x10000) { *buf++ = 0xe0 | ((val >> 12)); *buf++ = 0x80 | ((val >> 6) & 0x3f); *buf++ = 0x80 | ((val & 0x3f)); } else if(val < 0x200000) { *buf++ = 0xf0 | ((val >> 18)); *buf++ = 0x80 | ((val >> 12) & 0x3f); *buf++ = 0x80 | ((val >> 6) & 0x3f); *buf++ = 0x80 | ((val & 0x3f)); } else if(val < 0x4000000) { *buf++ = 0xf8 | ((val >> 24)); *buf++ = 0x80 | ((val >> 18) & 0x3f); *buf++ = 0x80 | ((val >> 12) & 0x3f); *buf++ = 0x80 | ((val >> 6) & 0x3f); *buf++ = 0x80 | ((val & 0x3f)); } else { *buf++ = 0xfc | ((val >> 30) & 0x1); *buf++ = 0x80 | ((val >> 24) & 0x3f); *buf++ = 0x80 | ((val >> 18) & 0x3f); *buf++ = 0x80 | ((val >> 12) & 0x3f); *buf++ = 0x80 | ((val >> 6) & 0x3f); *buf++ = 0x80 | ((val & 0x3f)); } } else { /* * Ugly, limited parsing of & > < */ char *sc = (char *)memchr(p, 0x3b, len > 5 ? 5 : len); if(!sc) goto want_more; if((sc - p) == 4 && p[1] == 0x61 /* 'a' */ && p[2] == 0x6d /* 'm' */ && p[3] == 0x70 /* 'p' */) { *buf++ = 0x26; p = sc; continue; } if((sc - p) == 3) { if(p[1] == 0x6c) { *buf = 0x3c; /* '<' */ } else if(p[1] == 0x67) { *buf = 0x3e; /* '>' */ } else { /* Unsupported entity reference */ *buf++ = ch; continue; } if(p[2] != 0x74) { /* Unsupported entity reference */ *buf++ = ch; continue; } buf++; p = sc; continue; } /* Unsupported entity reference */ *buf++ = ch; } continue; want_more: if(have_more) { /* * We know that no more data (of the same type) * is coming. Copy the rest verbatim. */ *buf++ = ch; continue; } chunk_size = (p - (const char *)chunk_buf); /* Processing stalled: need more data */ break; } st->size = buf - st->buf; assert(st->size <= _ns); st->buf[st->size] = 0; /* Courtesy termination */ return chunk_size; /* Converted in full */ } /* * Decode OCTET STRING from the XML element's body. */ static asn_dec_rval_t OCTET_STRING__decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, const void *buf_ptr, size_t size, int (*opt_unexpected_tag_decoder) (void *struct_ptr, const void *chunk_buf, size_t chunk_size), ssize_t (*body_receiver) (void *struct_ptr, const void *chunk_buf, size_t chunk_size, int have_more) ) { OCTET_STRING_t *st = (OCTET_STRING_t *)*sptr; asn_OCTET_STRING_specifics_t *specs = td->specifics ? (asn_OCTET_STRING_specifics_t *)td->specifics : &asn_DEF_OCTET_STRING_specs; const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; asn_struct_ctx_t *ctx; /* Per-structure parser context */ asn_dec_rval_t rval; /* Return value from the decoder */ int st_allocated; /* * Create the string if does not exist. */ if(!st) { st = (OCTET_STRING_t *)CALLOC(1, specs->struct_size); *sptr = (void *)st; if(!st) goto sta_failed; st_allocated = 1; } else { st_allocated = 0; } if(!st->buf) { /* This is separate from above section */ st->buf = (uint8_t *)CALLOC(1, 1); if(!st->buf) { if(st_allocated) { *sptr = 0; goto stb_failed; } else { goto sta_failed; } } } /* Restore parsing context */ ctx = (asn_struct_ctx_t *)(((char *)*sptr) + specs->ctx_offset); return xer_decode_general(opt_codec_ctx, ctx, *sptr, xml_tag, buf_ptr, size, opt_unexpected_tag_decoder, body_receiver); stb_failed: FREEMEM(st); sta_failed: rval.code = RC_FAIL; rval.consumed = 0; return rval; } /* * Decode OCTET STRING from the hexadecimal data. */ asn_dec_rval_t OCTET_STRING_decode_xer_hex(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, const void *buf_ptr, size_t size) { return OCTET_STRING__decode_xer(opt_codec_ctx, td, sptr, opt_mname, buf_ptr, size, 0, OCTET_STRING__convert_hexadecimal); } /* * Decode OCTET STRING from the binary (0/1) data. */ asn_dec_rval_t OCTET_STRING_decode_xer_binary(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, const void *buf_ptr, size_t size) { return OCTET_STRING__decode_xer(opt_codec_ctx, td, sptr, opt_mname, buf_ptr, size, 0, OCTET_STRING__convert_binary); } /* * Decode OCTET STRING from the string (ASCII/UTF-8) data. */ asn_dec_rval_t OCTET_STRING_decode_xer_utf8(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, const void *buf_ptr, size_t size) { return OCTET_STRING__decode_xer(opt_codec_ctx, td, sptr, opt_mname, buf_ptr, size, OCTET_STRING__handle_control_chars, OCTET_STRING__convert_entrefs); } static int OCTET_STRING_per_get_characters(asn_per_data_t *po, uint8_t *buf, size_t units, unsigned int bpc, unsigned int unit_bits, long lb, long ub, asn_per_constraints_t *pc) { uint8_t *end = buf + units * bpc; ASN_DEBUG("Expanding %d characters into (%ld..%ld):%d", (int)units, lb, ub, unit_bits); /* X.691: 27.5.4 */ if((unsigned long)ub <= ((unsigned long)2 << (unit_bits - 1))) { /* Decode without translation */ lb = 0; } else if(pc && pc->code2value) { if(unit_bits > 16) return 1; /* FATAL: can't have constrained * UniversalString with more than * 16 million code points */ for(; buf < end; buf += bpc) { int value; int code = per_get_few_bits(po, unit_bits); if(code < 0) return -1; /* WMORE */ value = pc->code2value(code); if(value < 0) { ASN_DEBUG("Code %d (0x%02x) is" " not in map (%ld..%ld)", code, code, lb, ub); return 1; /* FATAL */ } switch(bpc) { case 1: *buf = value; break; case 2: buf[0] = value >> 8; buf[1] = value; break; case 4: buf[0] = value >> 24; buf[1] = value >> 16; buf[2] = value >> 8; buf[3] = value; break; } } return 0; } /* Shortcut the no-op copying to the aligned structure */ if(lb == 0 && (unit_bits == 8 * bpc)) { return per_get_many_bits(po, buf, 0, unit_bits * units); } for(; buf < end; buf += bpc) { int code = per_get_few_bits(po, unit_bits); int ch = code + lb; if(code < 0) return -1; /* WMORE */ if(ch > ub) { ASN_DEBUG("Code %d is out of range (%ld..%ld)", ch, lb, ub); return 1; /* FATAL */ } switch(bpc) { case 1: *buf = ch; break; case 2: buf[0] = ch >> 8; buf[1] = ch; break; case 4: buf[0] = ch >> 24; buf[1] = ch >> 16; buf[2] = ch >> 8; buf[3] = ch; break; } } return 0; } static int OCTET_STRING_per_put_characters(asn_per_outp_t *po, const uint8_t *buf, size_t units, unsigned int bpc, unsigned int unit_bits, long lb, long ub, asn_per_constraints_t *pc) { const uint8_t *end = buf + units * bpc; ASN_DEBUG("Squeezing %d characters into (%ld..%ld):%d (%d bpc)", (int)units, lb, ub, unit_bits, bpc); /* X.691: 27.5.4 */ if((unsigned long)ub <= ((unsigned long)2 << (unit_bits - 1))) { /* Encode as is */ lb = 0; } else if(pc && pc->value2code) { for(; buf < end; buf += bpc) { int code; uint32_t value; switch(bpc) { case 1: value = *(const uint8_t *)buf; break; case 2: value = (buf[0] << 8) | buf[1]; break; case 4: value = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]; break; default: return -1; } code = pc->value2code(value); if(code < 0) { ASN_DEBUG("Character %d (0x%02x) is" " not in map (%ld..%ld)", *buf, *buf, lb, ub); return -1; } if(per_put_few_bits(po, code, unit_bits)) return -1; } } /* Shortcut the no-op copying to the aligned structure */ if(lb == 0 && (unit_bits == 8 * bpc)) { return per_put_many_bits(po, buf, unit_bits * units); } for(ub -= lb; buf < end; buf += bpc) { int ch; uint32_t value; switch(bpc) { case 1: value = *(const uint8_t *)buf; break; case 2: value = (buf[0] << 8) | buf[1]; break; case 4: value = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]; break; default: return -1; } ch = value - lb; if(ch < 0 || ch > ub) { ASN_DEBUG("Character %d (0x%02x)" " is out of range (%ld..%ld)", *buf, *buf, lb, ub + lb); return -1; } if(per_put_few_bits(po, ch, unit_bits)) return -1; } return 0; } asn_dec_rval_t OCTET_STRING_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { asn_OCTET_STRING_specifics_t *specs = td->specifics ? (asn_OCTET_STRING_specifics_t *)td->specifics : &asn_DEF_OCTET_STRING_specs; asn_per_constraints_t *pc = constraints ? constraints : td->per_constraints; asn_per_constraint_t *cval; asn_per_constraint_t *csiz; asn_dec_rval_t rval = { RC_OK, 0 }; BIT_STRING_t *st = (BIT_STRING_t *)*sptr; ssize_t consumed_myself = 0; int repeat; enum { OS__BPC_BIT = 0, OS__BPC_CHAR = 1, OS__BPC_U16 = 2, OS__BPC_U32 = 4 } bpc; /* Bytes per character */ unsigned int unit_bits; unsigned int canonical_unit_bits; (void)opt_codec_ctx; if(pc) { cval = &pc->value; csiz = &pc->size; } else { cval = &asn_DEF_OCTET_STRING_constraints.value; csiz = &asn_DEF_OCTET_STRING_constraints.size; } switch(specs->subvariant) { default: case ASN_OSUBV_ANY: ASN_DEBUG("Unrecognized subvariant %d", specs->subvariant); RETURN(RC_FAIL); case ASN_OSUBV_BIT: canonical_unit_bits = unit_bits = 1; bpc = OS__BPC_BIT; break; case ASN_OSUBV_STR: canonical_unit_bits = unit_bits = 8; if(cval->flags & APC_CONSTRAINED) unit_bits = cval->range_bits; bpc = OS__BPC_CHAR; break; case ASN_OSUBV_U16: canonical_unit_bits = unit_bits = 16; if(cval->flags & APC_CONSTRAINED) unit_bits = cval->range_bits; bpc = OS__BPC_U16; break; case ASN_OSUBV_U32: canonical_unit_bits = unit_bits = 32; if(cval->flags & APC_CONSTRAINED) unit_bits = cval->range_bits; bpc = OS__BPC_U32; break; } /* * Allocate the string. */ if(!st) { st = (BIT_STRING_t *)(*sptr = CALLOC(1, specs->struct_size)); if(!st) RETURN(RC_FAIL); } ASN_DEBUG("PER Decoding %s size %ld .. %ld bits %d", csiz->flags & APC_EXTENSIBLE ? "extensible" : "non-extensible", csiz->lower_bound, csiz->upper_bound, csiz->effective_bits); if(csiz->flags & APC_EXTENSIBLE) { int inext = per_get_few_bits(pd, 1); if(inext < 0) RETURN(RC_WMORE); if(inext) { csiz = &asn_DEF_OCTET_STRING_constraints.size; cval = &asn_DEF_OCTET_STRING_constraints.value; unit_bits = canonical_unit_bits; } } if(csiz->effective_bits >= 0) { FREEMEM(st->buf); if(bpc) { st->size = csiz->upper_bound * bpc; } else { st->size = (csiz->upper_bound + 7) >> 3; } st->buf = (uint8_t *)MALLOC(st->size + 1); if(!st->buf) { st->size = 0; RETURN(RC_FAIL); } } /* X.691, #16.5: zero-length encoding */ /* X.691, #16.6: short fixed length encoding (up to 2 octets) */ /* X.691, #16.7: long fixed length encoding (up to 64K octets) */ if(csiz->effective_bits == 0) { int ret; if(bpc) { ASN_DEBUG("Encoding OCTET STRING size %ld", csiz->upper_bound); ret = OCTET_STRING_per_get_characters(pd, st->buf, csiz->upper_bound, bpc, unit_bits, cval->lower_bound, cval->upper_bound, pc); if(ret > 0) RETURN(RC_FAIL); } else { ASN_DEBUG("Encoding BIT STRING size %ld", csiz->upper_bound); ret = per_get_many_bits(pd, st->buf, 0, unit_bits * csiz->upper_bound); } if(ret < 0) RETURN(RC_WMORE); consumed_myself += unit_bits * csiz->upper_bound; st->buf[st->size] = 0; if(bpc == 0) { int ubs = (csiz->upper_bound & 0x7); st->bits_unused = ubs ? 8 - ubs : 0; } RETURN(RC_OK); } st->size = 0; do { ssize_t raw_len; ssize_t len_bytes; ssize_t len_bits; void *p; int ret; /* Get the PER length */ raw_len = uper_get_length(pd, csiz->effective_bits, &repeat); if(raw_len < 0) RETURN(RC_WMORE); raw_len += csiz->lower_bound; ASN_DEBUG("Got PER length eb %ld, len %ld, %s (%s)", (long)csiz->effective_bits, (long)raw_len, repeat ? "repeat" : "once", td->name); if(bpc) { len_bytes = raw_len * bpc; len_bits = len_bytes * unit_bits; } else { len_bits = raw_len; len_bytes = (len_bits + 7) >> 3; if(len_bits & 0x7) st->bits_unused = 8 - (len_bits & 0x7); /* len_bits be multiple of 16K if repeat is set */ } p = REALLOC(st->buf, st->size + len_bytes + 1); if(!p) RETURN(RC_FAIL); st->buf = (uint8_t *)p; if(bpc) { ret = OCTET_STRING_per_get_characters(pd, &st->buf[st->size], raw_len, bpc, unit_bits, cval->lower_bound, cval->upper_bound, pc); if(ret > 0) RETURN(RC_FAIL); } else { ret = per_get_many_bits(pd, &st->buf[st->size], 0, len_bits); } if(ret < 0) RETURN(RC_WMORE); st->size += len_bytes; } while(repeat); st->buf[st->size] = 0; /* nul-terminate */ return rval; } asn_enc_rval_t OCTET_STRING_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { asn_OCTET_STRING_specifics_t *specs = td->specifics ? (asn_OCTET_STRING_specifics_t *)td->specifics : &asn_DEF_OCTET_STRING_specs; asn_per_constraints_t *pc = constraints ? constraints : td->per_constraints; asn_per_constraint_t *cval; asn_per_constraint_t *csiz; const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; asn_enc_rval_t er = { 0, 0, 0 }; int inext = 0; /* Lies not within extension root */ unsigned int unit_bits; unsigned int canonical_unit_bits; unsigned int sizeinunits; const uint8_t *buf; int ret; enum { OS__BPC_BIT = 0, OS__BPC_CHAR = 1, OS__BPC_U16 = 2, OS__BPC_U32 = 4 } bpc; /* Bytes per character */ int ct_extensible; if(!st || (!st->buf && st->size)) _ASN_ENCODE_FAILED; if(pc) { cval = &pc->value; csiz = &pc->size; } else { cval = &asn_DEF_OCTET_STRING_constraints.value; csiz = &asn_DEF_OCTET_STRING_constraints.size; } ct_extensible = csiz->flags & APC_EXTENSIBLE; switch(specs->subvariant) { default: case ASN_OSUBV_ANY: _ASN_ENCODE_FAILED; case ASN_OSUBV_BIT: canonical_unit_bits = unit_bits = 1; bpc = OS__BPC_BIT; sizeinunits = st->size * 8 - (st->bits_unused & 0x07); ASN_DEBUG("BIT STRING of %d bytes, %d bits unused", sizeinunits, st->bits_unused); break; case ASN_OSUBV_STR: canonical_unit_bits = unit_bits = 8; if(cval->flags & APC_CONSTRAINED) unit_bits = cval->range_bits; bpc = OS__BPC_CHAR; sizeinunits = st->size; break; case ASN_OSUBV_U16: canonical_unit_bits = unit_bits = 16; if(cval->flags & APC_CONSTRAINED) unit_bits = cval->range_bits; bpc = OS__BPC_U16; sizeinunits = st->size / 2; break; case ASN_OSUBV_U32: canonical_unit_bits = unit_bits = 32; if(cval->flags & APC_CONSTRAINED) unit_bits = cval->range_bits; bpc = OS__BPC_U32; sizeinunits = st->size / 4; break; } ASN_DEBUG("Encoding %s into %d units of %d bits" " (%ld..%ld, effective %d)%s", td->name, sizeinunits, unit_bits, csiz->lower_bound, csiz->upper_bound, csiz->effective_bits, ct_extensible ? " EXT" : ""); /* Figure out wheter size lies within PER visible constraint */ if(csiz->effective_bits >= 0) { if((int)sizeinunits < csiz->lower_bound || (int)sizeinunits > csiz->upper_bound) { if(ct_extensible) { cval = &asn_DEF_OCTET_STRING_constraints.value; csiz = &asn_DEF_OCTET_STRING_constraints.size; unit_bits = canonical_unit_bits; inext = 1; } else _ASN_ENCODE_FAILED; } } else { inext = 0; } if(ct_extensible) { /* Declare whether length is [not] within extension root */ if(per_put_few_bits(po, inext, 1)) _ASN_ENCODE_FAILED; } /* X.691, #16.5: zero-length encoding */ /* X.691, #16.6: short fixed length encoding (up to 2 octets) */ /* X.691, #16.7: long fixed length encoding (up to 64K octets) */ if(csiz->effective_bits >= 0) { ASN_DEBUG("Encoding %d bytes (%ld), length in %d bits", st->size, sizeinunits - csiz->lower_bound, csiz->effective_bits); ret = per_put_few_bits(po, sizeinunits - csiz->lower_bound, csiz->effective_bits); if(ret) _ASN_ENCODE_FAILED; if(bpc) { ret = OCTET_STRING_per_put_characters(po, st->buf, sizeinunits, bpc, unit_bits, cval->lower_bound, cval->upper_bound, pc); } else { ret = per_put_many_bits(po, st->buf, sizeinunits * unit_bits); } if(ret) _ASN_ENCODE_FAILED; _ASN_ENCODED_OK(er); } ASN_DEBUG("Encoding %d bytes", st->size); if(sizeinunits == 0) { if(uper_put_length(po, 0)) _ASN_ENCODE_FAILED; _ASN_ENCODED_OK(er); } buf = st->buf; while(sizeinunits) { ssize_t maySave = uper_put_length(po, sizeinunits); if(maySave < 0) _ASN_ENCODE_FAILED; ASN_DEBUG("Encoding %ld of %ld", (long)maySave, (long)sizeinunits); if(bpc) { ret = OCTET_STRING_per_put_characters(po, buf, maySave, bpc, unit_bits, cval->lower_bound, cval->upper_bound, pc); } else { ret = per_put_many_bits(po, buf, maySave * unit_bits); } if(ret) _ASN_ENCODE_FAILED; if(bpc) buf += maySave * bpc; else buf += maySave >> 3; sizeinunits -= maySave; assert(!(maySave & 0x07) || !sizeinunits); } _ASN_ENCODED_OK(er); } int OCTET_STRING_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { static const char *h2c = "0123456789ABCDEF"; const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; char scratch[16 * 3 + 4]; char *p = scratch; uint8_t *buf; uint8_t *end; size_t i; (void)td; /* Unused argument */ if(!st || (!st->buf && st->size)) return (cb("", 8, app_key) < 0) ? -1 : 0; /* * Dump the contents of the buffer in hexadecimal. */ buf = st->buf; end = buf + st->size; for(i = 0; buf < end; buf++, i++) { if(!(i % 16) && (i || st->size > 16)) { if(cb(scratch, p - scratch, app_key) < 0) return -1; _i_INDENT(1); p = scratch; } *p++ = h2c[(*buf >> 4) & 0x0F]; *p++ = h2c[*buf & 0x0F]; *p++ = 0x20; } if(p > scratch) { p--; /* Remove the tail space */ if(cb(scratch, p - scratch, app_key) < 0) return -1; } return 0; } int OCTET_STRING_print_utf8(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; (void)td; /* Unused argument */ (void)ilevel; /* Unused argument */ if(st && (st->buf || !st->size)) { return (cb(st->buf, st->size, app_key) < 0) ? -1 : 0; } else { return (cb("", 8, app_key) < 0) ? -1 : 0; } } void OCTET_STRING_free(asn_TYPE_descriptor_t *td, void *sptr, int contents_only) { OCTET_STRING_t *st = (OCTET_STRING_t *)sptr; asn_OCTET_STRING_specifics_t *specs = td->specifics ? (asn_OCTET_STRING_specifics_t *)td->specifics : &asn_DEF_OCTET_STRING_specs; asn_struct_ctx_t *ctx = (asn_struct_ctx_t *) ((char *)st + specs->ctx_offset); struct _stack *stck; if(!td || !st) return; ASN_DEBUG("Freeing %s as OCTET STRING", td->name); if(st->buf) { FREEMEM(st->buf); st->buf = 0; } /* * Remove decode-time stack. */ stck = (struct _stack *)ctx->ptr; if(stck) { while(stck->tail) { struct _stack_el *sel = stck->tail; stck->tail = sel->prev; FREEMEM(sel); } FREEMEM(stck); } if(!contents_only) { FREEMEM(st); } } /* * Conversion routines. */ int OCTET_STRING_fromBuf(OCTET_STRING_t *st, const char *str, int len) { void *buf; if(st == 0 || (str == 0 && len)) { errno = EINVAL; return -1; } /* * Clear the OCTET STRING. */ if(str == NULL) { FREEMEM(st->buf); st->buf = 0; st->size = 0; return 0; } /* Determine the original string size, if not explicitly given */ if(len < 0) len = strlen(str); /* Allocate and fill the memory */ buf = MALLOC(len + 1); if(buf == NULL) return -1; memcpy(buf, str, len); ((uint8_t *)buf)[len] = '\0'; /* Couldn't use memcpy(len+1)! */ FREEMEM(st->buf); st->buf = (uint8_t *)buf; st->size = len; return 0; } OCTET_STRING_t * OCTET_STRING_new_fromBuf(asn_TYPE_descriptor_t *td, const char *str, int len) { asn_OCTET_STRING_specifics_t *specs = td->specifics ? (asn_OCTET_STRING_specifics_t *)td->specifics : &asn_DEF_OCTET_STRING_specs; OCTET_STRING_t *st; st = (OCTET_STRING_t *)CALLOC(1, specs->struct_size); if(st && str && OCTET_STRING_fromBuf(st, str, len)) { FREEMEM(st); st = NULL; } return st; } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/OCTET_STRING.h000066400000000000000000000054031305042567700226050ustar00rootroot00000000000000/*- * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _OCTET_STRING_H_ #define _OCTET_STRING_H_ #include #ifdef __cplusplus extern "C" { #endif typedef struct OCTET_STRING { uint8_t *buf; /* Buffer with consecutive OCTET_STRING bits */ int size; /* Size of the buffer */ asn_struct_ctx_t _asn_ctx; /* Parsing across buffer boundaries */ } OCTET_STRING_t; extern asn_TYPE_descriptor_t asn_DEF_OCTET_STRING; asn_struct_free_f OCTET_STRING_free; asn_struct_print_f OCTET_STRING_print; asn_struct_print_f OCTET_STRING_print_utf8; ber_type_decoder_f OCTET_STRING_decode_ber; der_type_encoder_f OCTET_STRING_encode_der; xer_type_decoder_f OCTET_STRING_decode_xer_hex; /* Hexadecimal */ xer_type_decoder_f OCTET_STRING_decode_xer_binary; /* 01010111010 */ xer_type_decoder_f OCTET_STRING_decode_xer_utf8; /* ASCII/UTF-8 */ xer_type_encoder_f OCTET_STRING_encode_xer; xer_type_encoder_f OCTET_STRING_encode_xer_utf8; per_type_decoder_f OCTET_STRING_decode_uper; per_type_encoder_f OCTET_STRING_encode_uper; /****************************** * Handy conversion routines. * ******************************/ /* * This function clears the previous value of the OCTET STRING (if any) * and then allocates a new memory with the specified content (str/size). * If size = -1, the size of the original string will be determined * using strlen(str). * If str equals to NULL, the function will silently clear the * current contents of the OCTET STRING. * Returns 0 if it was possible to perform operation, -1 otherwise. */ int OCTET_STRING_fromBuf(OCTET_STRING_t *s, const char *str, int size); /* Handy conversion from the C string into the OCTET STRING. */ #define OCTET_STRING_fromString(s, str) OCTET_STRING_fromBuf(s, str, -1) /* * Allocate and fill the new OCTET STRING and return a pointer to the newly * allocated object. NULL is permitted in str: the function will just allocate * empty OCTET STRING. */ OCTET_STRING_t *OCTET_STRING_new_fromBuf(asn_TYPE_descriptor_t *td, const char *str, int size); /**************************** * Internally useful stuff. * ****************************/ typedef struct asn_OCTET_STRING_specifics_s { /* * Target structure description. */ int struct_size; /* Size of the structure */ int ctx_offset; /* Offset of the asn_struct_ctx_t member */ enum asn_OS_Subvariant { ASN_OSUBV_ANY, /* The open type (ANY) */ ASN_OSUBV_BIT, /* BIT STRING */ ASN_OSUBV_STR, /* String types, not {BMP,Universal}String */ ASN_OSUBV_U16, /* 16-bit character (BMPString) */ ASN_OSUBV_U32 /* 32-bit character (UniversalString) */ } subvariant; } asn_OCTET_STRING_specifics_t; #ifdef __cplusplus } #endif #endif /* _OCTET_STRING_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/Pathloss.c000066400000000000000000000107571305042567700224410ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "Pathloss.h" int Pathloss_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 46 && value <= 173)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void Pathloss_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void Pathloss_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { Pathloss_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int Pathloss_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { Pathloss_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t Pathloss_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { Pathloss_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t Pathloss_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { Pathloss_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t Pathloss_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { Pathloss_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t Pathloss_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { Pathloss_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t Pathloss_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { Pathloss_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t Pathloss_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { Pathloss_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_Pathloss_constr_1 = { { APC_CONSTRAINED, 7, 7, 46, 173 } /* (46..173) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_Pathloss_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Pathloss = { "Pathloss", "Pathloss", Pathloss_free, Pathloss_print, Pathloss_constraint, Pathloss_decode_ber, Pathloss_encode_der, Pathloss_decode_xer, Pathloss_encode_xer, Pathloss_decode_uper, Pathloss_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_Pathloss_tags_1, sizeof(asn_DEF_Pathloss_tags_1) /sizeof(asn_DEF_Pathloss_tags_1[0]), /* 1 */ asn_DEF_Pathloss_tags_1, /* Same as above */ sizeof(asn_DEF_Pathloss_tags_1) /sizeof(asn_DEF_Pathloss_tags_1[0]), /* 1 */ &asn_PER_type_Pathloss_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/Pathloss.h000066400000000000000000000015321305042567700224350ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _Pathloss_H_ #define _Pathloss_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Pathloss */ typedef long Pathloss_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Pathloss; asn_struct_free_f Pathloss_free; asn_struct_print_f Pathloss_print; asn_constr_check_f Pathloss_constraint; ber_type_decoder_f Pathloss_decode_ber; der_type_encoder_f Pathloss_encode_der; xer_type_decoder_f Pathloss_decode_xer; xer_type_encoder_f Pathloss_encode_xer; per_type_decoder_f Pathloss_decode_uper; per_type_encoder_f Pathloss_encode_uper; #ifdef __cplusplus } #endif #endif /* _Pathloss_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/PosMethod.c000066400000000000000000000125431305042567700225410ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "PosMethod.h" int PosMethod_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { /* Replace with underlying type checker */ td->check_constraints = asn_DEF_ENUMERATED.check_constraints; return td->check_constraints(td, sptr, ctfailcb, app_key); } /* * This type is implemented using ENUMERATED, * so here we adjust the DEF accordingly. */ static void PosMethod_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_ENUMERATED.free_struct; td->print_struct = asn_DEF_ENUMERATED.print_struct; td->ber_decoder = asn_DEF_ENUMERATED.ber_decoder; td->der_encoder = asn_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; td->uper_encoder = asn_DEF_ENUMERATED.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_ENUMERATED.per_constraints; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ } void PosMethod_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { PosMethod_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int PosMethod_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { PosMethod_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t PosMethod_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { PosMethod_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t PosMethod_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { PosMethod_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t PosMethod_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { PosMethod_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t PosMethod_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { PosMethod_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t PosMethod_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { PosMethod_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t PosMethod_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { PosMethod_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_PosMethod_constr_1 = { { APC_CONSTRAINED | APC_EXTENSIBLE, 4, 4, 0, 9 } /* (0..9,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_INTEGER_enum_map_t asn_MAP_PosMethod_value2enum_1[] = { { 0, 15, "agpsSETassisted" }, { 1, 12, "agpsSETbased" }, { 2, 19, "agpsSETassistedpref" }, { 3, 16, "agpsSETbasedpref" }, { 4, 13, "autonomousGPS" }, { 5, 4, "aFLT" }, { 6, 4, "eCID" }, { 7, 4, "eOTD" }, { 8, 5, "oTDOA" }, { 9, 10, "noPosition" } /* This list is extensible */ }; static unsigned int asn_MAP_PosMethod_enum2value_1[] = { 5, /* aFLT(5) */ 0, /* agpsSETassisted(0) */ 2, /* agpsSETassistedpref(2) */ 1, /* agpsSETbased(1) */ 3, /* agpsSETbasedpref(3) */ 4, /* autonomousGPS(4) */ 6, /* eCID(6) */ 7, /* eOTD(7) */ 9, /* noPosition(9) */ 8 /* oTDOA(8) */ /* This list is extensible */ }; static asn_INTEGER_specifics_t asn_SPC_PosMethod_specs_1 = { asn_MAP_PosMethod_value2enum_1, /* "tag" => N; sorted by tag */ asn_MAP_PosMethod_enum2value_1, /* N => "tag"; sorted by N */ 10, /* Number of elements in the maps */ 11, /* Extensions before this member */ 1, /* Strict enumeration */ 0, /* Native long size */ 0 }; static ber_tlv_tag_t asn_DEF_PosMethod_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; asn_TYPE_descriptor_t asn_DEF_PosMethod = { "PosMethod", "PosMethod", PosMethod_free, PosMethod_print, PosMethod_constraint, PosMethod_decode_ber, PosMethod_encode_der, PosMethod_decode_xer, PosMethod_encode_xer, PosMethod_decode_uper, PosMethod_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_PosMethod_tags_1, sizeof(asn_DEF_PosMethod_tags_1) /sizeof(asn_DEF_PosMethod_tags_1[0]), /* 1 */ asn_DEF_PosMethod_tags_1, /* Same as above */ sizeof(asn_DEF_PosMethod_tags_1) /sizeof(asn_DEF_PosMethod_tags_1[0]), /* 1 */ &asn_PER_type_PosMethod_constr_1, 0, 0, /* Defined elsewhere */ &asn_SPC_PosMethod_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/PosMethod.h000066400000000000000000000023401305042567700225400ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _PosMethod_H_ #define _PosMethod_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum PosMethod { PosMethod_agpsSETassisted = 0, PosMethod_agpsSETbased = 1, PosMethod_agpsSETassistedpref = 2, PosMethod_agpsSETbasedpref = 3, PosMethod_autonomousGPS = 4, PosMethod_aFLT = 5, PosMethod_eCID = 6, PosMethod_eOTD = 7, PosMethod_oTDOA = 8, PosMethod_noPosition = 9 /* * Enumeration is extensible */ } e_PosMethod; /* PosMethod */ typedef ENUMERATED_t PosMethod_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_PosMethod; asn_struct_free_f PosMethod_free; asn_struct_print_f PosMethod_print; asn_constr_check_f PosMethod_constraint; ber_type_decoder_f PosMethod_decode_ber; der_type_encoder_f PosMethod_encode_der; xer_type_decoder_f PosMethod_decode_xer; xer_type_encoder_f PosMethod_encode_xer; per_type_decoder_f PosMethod_decode_uper; per_type_encoder_f PosMethod_encode_uper; #ifdef __cplusplus } #endif #endif /* _PosMethod_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/PosPayLoad.c000066400000000000000000000112061305042567700226450ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-POS" * found in "../supl-pos.asn" */ #include "PosPayLoad.h" static int memb_tia801payload_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } size = st->size; if((size >= 1 && size <= 8192)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_rrcPayload_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } size = st->size; if((size >= 1 && size <= 8192)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_rrlpPayload_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } size = st->size; if((size >= 1 && size <= 8192)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_tia801payload_constr_2 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 13, 13, 1, 8192 } /* (SIZE(1..8192)) */, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_rrcPayload_constr_3 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 13, 13, 1, 8192 } /* (SIZE(1..8192)) */, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_rrlpPayload_constr_4 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 13, 13, 1, 8192 } /* (SIZE(1..8192)) */, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_type_PosPayLoad_constr_1 = { { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 2 } /* (0..2,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_PosPayLoad_1[] = { { ATF_NOFLAGS, 0, offsetof(struct PosPayLoad, choice.tia801payload), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_OCTET_STRING, memb_tia801payload_constraint_1, &asn_PER_memb_tia801payload_constr_2, 0, "tia801payload" }, { ATF_NOFLAGS, 0, offsetof(struct PosPayLoad, choice.rrcPayload), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_OCTET_STRING, memb_rrcPayload_constraint_1, &asn_PER_memb_rrcPayload_constr_3, 0, "rrcPayload" }, { ATF_NOFLAGS, 0, offsetof(struct PosPayLoad, choice.rrlpPayload), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_OCTET_STRING, memb_rrlpPayload_constraint_1, &asn_PER_memb_rrlpPayload_constr_4, 0, "rrlpPayload" }, }; static asn_TYPE_tag2member_t asn_MAP_PosPayLoad_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* tia801payload at 15 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* rrcPayload at 16 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* rrlpPayload at 17 */ }; static asn_CHOICE_specifics_t asn_SPC_PosPayLoad_specs_1 = { sizeof(struct PosPayLoad), offsetof(struct PosPayLoad, _asn_ctx), offsetof(struct PosPayLoad, present), sizeof(((struct PosPayLoad *)0)->present), asn_MAP_PosPayLoad_tag2el_1, 3, /* Count of tags in the map */ 0, 3 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_PosPayLoad = { "PosPayLoad", "PosPayLoad", CHOICE_free, CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_decode_uper, CHOICE_encode_uper, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ &asn_PER_type_PosPayLoad_constr_1, asn_MBR_PosPayLoad_1, 3, /* Elements count */ &asn_SPC_PosPayLoad_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/PosPayLoad.h000066400000000000000000000021171305042567700226530ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-POS" * found in "../supl-pos.asn" */ #ifndef _PosPayLoad_H_ #define _PosPayLoad_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum PosPayLoad_PR { PosPayLoad_PR_NOTHING, /* No components present */ PosPayLoad_PR_tia801payload, PosPayLoad_PR_rrcPayload, PosPayLoad_PR_rrlpPayload, /* Extensions may appear below */ } PosPayLoad_PR; /* PosPayLoad */ typedef struct PosPayLoad { PosPayLoad_PR present; union PosPayLoad_u { OCTET_STRING_t tia801payload; OCTET_STRING_t rrcPayload; OCTET_STRING_t rrlpPayload; /* * This type is extensible, * possible extensions are below. */ } choice; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } PosPayLoad_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_PosPayLoad; #ifdef __cplusplus } #endif #endif /* _PosPayLoad_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/PosProtocol.c000066400000000000000000000045371305042567700231260ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-START" * found in "../supl-start.asn" */ #include "PosProtocol.h" static asn_TYPE_member_t asn_MBR_PosProtocol_1[] = { { ATF_NOFLAGS, 0, offsetof(struct PosProtocol, tia801), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BOOLEAN, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "tia801" }, { ATF_NOFLAGS, 0, offsetof(struct PosProtocol, rrlp), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BOOLEAN, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "rrlp" }, { ATF_NOFLAGS, 0, offsetof(struct PosProtocol, rrc), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BOOLEAN, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "rrc" }, }; static ber_tlv_tag_t asn_DEF_PosProtocol_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_PosProtocol_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* tia801 at 35 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* rrlp at 36 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* rrc at 37 */ }; static asn_SEQUENCE_specifics_t asn_SPC_PosProtocol_specs_1 = { sizeof(struct PosProtocol), offsetof(struct PosProtocol, _asn_ctx), asn_MAP_PosProtocol_tag2el_1, 3, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ 2, /* Start extensions */ 4 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_PosProtocol = { "PosProtocol", "PosProtocol", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_PosProtocol_tags_1, sizeof(asn_DEF_PosProtocol_tags_1) /sizeof(asn_DEF_PosProtocol_tags_1[0]), /* 1 */ asn_DEF_PosProtocol_tags_1, /* Same as above */ sizeof(asn_DEF_PosProtocol_tags_1) /sizeof(asn_DEF_PosProtocol_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_PosProtocol_1, 3, /* Elements count */ &asn_SPC_PosProtocol_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/PosProtocol.h000066400000000000000000000014031305042567700231200ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-START" * found in "../supl-start.asn" */ #ifndef _PosProtocol_H_ #define _PosProtocol_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* PosProtocol */ typedef struct PosProtocol { BOOLEAN_t tia801; BOOLEAN_t rrlp; BOOLEAN_t rrc; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } PosProtocol_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_PosProtocol; #ifdef __cplusplus } #endif #endif /* _PosProtocol_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/PosTechnology.c000066400000000000000000000074631305042567700234410ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-START" * found in "../supl-start.asn" */ #include "PosTechnology.h" static asn_TYPE_member_t asn_MBR_PosTechnology_1[] = { { ATF_NOFLAGS, 0, offsetof(struct PosTechnology, agpsSETassisted), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BOOLEAN, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "agpsSETassisted" }, { ATF_NOFLAGS, 0, offsetof(struct PosTechnology, agpsSETBased), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BOOLEAN, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "agpsSETBased" }, { ATF_NOFLAGS, 0, offsetof(struct PosTechnology, autonomousGPS), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BOOLEAN, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "autonomousGPS" }, { ATF_NOFLAGS, 0, offsetof(struct PosTechnology, aFLT), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BOOLEAN, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "aFLT" }, { ATF_NOFLAGS, 0, offsetof(struct PosTechnology, eCID), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BOOLEAN, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "eCID" }, { ATF_NOFLAGS, 0, offsetof(struct PosTechnology, eOTD), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BOOLEAN, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "eOTD" }, { ATF_NOFLAGS, 0, offsetof(struct PosTechnology, oTDOA), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BOOLEAN, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "oTDOA" }, }; static ber_tlv_tag_t asn_DEF_PosTechnology_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_PosTechnology_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* agpsSETassisted at 22 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* agpsSETBased at 23 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* autonomousGPS at 24 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* aFLT at 25 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* eCID at 26 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* eOTD at 27 */ { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 } /* oTDOA at 28 */ }; static asn_SEQUENCE_specifics_t asn_SPC_PosTechnology_specs_1 = { sizeof(struct PosTechnology), offsetof(struct PosTechnology, _asn_ctx), asn_MAP_PosTechnology_tag2el_1, 7, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ 6, /* Start extensions */ 8 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_PosTechnology = { "PosTechnology", "PosTechnology", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_PosTechnology_tags_1, sizeof(asn_DEF_PosTechnology_tags_1) /sizeof(asn_DEF_PosTechnology_tags_1[0]), /* 1 */ asn_DEF_PosTechnology_tags_1, /* Same as above */ sizeof(asn_DEF_PosTechnology_tags_1) /sizeof(asn_DEF_PosTechnology_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_PosTechnology_1, 7, /* Elements count */ &asn_SPC_PosTechnology_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/PosTechnology.h000066400000000000000000000015651305042567700234430ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-START" * found in "../supl-start.asn" */ #ifndef _PosTechnology_H_ #define _PosTechnology_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* PosTechnology */ typedef struct PosTechnology { BOOLEAN_t agpsSETassisted; BOOLEAN_t agpsSETBased; BOOLEAN_t autonomousGPS; BOOLEAN_t aFLT; BOOLEAN_t eCID; BOOLEAN_t eOTD; BOOLEAN_t oTDOA; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } PosTechnology_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_PosTechnology; #ifdef __cplusplus } #endif #endif /* _PosTechnology_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/Position.c000066400000000000000000000046621305042567700224460ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "Position.h" static asn_TYPE_member_t asn_MBR_Position_1[] = { { ATF_NOFLAGS, 0, offsetof(struct Position, timestamp), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_UTCTime, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "timestamp" }, { ATF_NOFLAGS, 0, offsetof(struct Position, positionEstimate), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_PositionEstimate, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "positionEstimate" }, { ATF_POINTER, 1, offsetof(struct Position, velocity), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), +1, /* EXPLICIT tag at current level */ &asn_DEF_Velocity, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "velocity" }, }; static int asn_MAP_Position_oms_1[] = { 2 }; static ber_tlv_tag_t asn_DEF_Position_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_Position_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* timestamp at 67 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* positionEstimate at 68 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* velocity at 69 */ }; static asn_SEQUENCE_specifics_t asn_SPC_Position_specs_1 = { sizeof(struct Position), offsetof(struct Position, _asn_ctx), asn_MAP_Position_tag2el_1, 3, /* Count of tags in the map */ asn_MAP_Position_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ 2, /* Start extensions */ 4 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Position = { "Position", "Position", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_Position_tags_1, sizeof(asn_DEF_Position_tags_1) /sizeof(asn_DEF_Position_tags_1[0]), /* 1 */ asn_DEF_Position_tags_1, /* Same as above */ sizeof(asn_DEF_Position_tags_1) /sizeof(asn_DEF_Position_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_Position_1, 3, /* Elements count */ &asn_SPC_Position_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/Position.h000066400000000000000000000016451305042567700224510ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _Position_H_ #define _Position_H_ #include /* Including external dependencies */ #include #include "PositionEstimate.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct Velocity; /* Position */ typedef struct Position { UTCTime_t timestamp; PositionEstimate_t positionEstimate; struct Velocity *velocity /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } Position_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Position; #ifdef __cplusplus } #endif /* Referred external types */ #include "Velocity.h" #endif /* _Position_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/PositionEstimate.c000066400000000000000000000366211305042567700241420ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "PositionEstimate.h" static int latitudeSign_2_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { /* Replace with underlying type checker */ td->check_constraints = asn_DEF_ENUMERATED.check_constraints; return td->check_constraints(td, sptr, ctfailcb, app_key); } /* * This type is implemented using ENUMERATED, * so here we adjust the DEF accordingly. */ static void latitudeSign_2_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_ENUMERATED.free_struct; td->print_struct = asn_DEF_ENUMERATED.print_struct; td->ber_decoder = asn_DEF_ENUMERATED.ber_decoder; td->der_encoder = asn_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; td->uper_encoder = asn_DEF_ENUMERATED.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_ENUMERATED.per_constraints; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ } static void latitudeSign_2_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { latitudeSign_2_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } static int latitudeSign_2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { latitudeSign_2_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } static asn_dec_rval_t latitudeSign_2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { latitudeSign_2_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } static asn_enc_rval_t latitudeSign_2_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { latitudeSign_2_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } static asn_dec_rval_t latitudeSign_2_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { latitudeSign_2_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } static asn_enc_rval_t latitudeSign_2_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { latitudeSign_2_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } static asn_dec_rval_t latitudeSign_2_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { latitudeSign_2_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } static asn_enc_rval_t latitudeSign_2_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { latitudeSign_2_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static int memb_uncertaintySemiMajor_constraint_7(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_uncertaintySemiMinor_constraint_7(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_orientationMajorAxis_constraint_7(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 180)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_latitude_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 8388607)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_longitude_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= -8388608 && value <= 8388607)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_confidence_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 100)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_type_latitudeSign_constr_2 = { { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_uncertaintySemiMajor_constr_8 = { { APC_CONSTRAINED, 7, 7, 0, 127 } /* (0..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_uncertaintySemiMinor_constr_9 = { { APC_CONSTRAINED, 7, 7, 0, 127 } /* (0..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_orientationMajorAxis_constr_10 = { { APC_CONSTRAINED, 8, 8, 0, 180 } /* (0..180) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_latitude_constr_5 = { { APC_CONSTRAINED, 23, -1, 0, 8388607 } /* (0..8388607) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_longitude_constr_6 = { { APC_CONSTRAINED, 24, -1, -8388608, 8388607 } /* (-8388608..8388607) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_confidence_constr_11 = { { APC_CONSTRAINED, 7, 7, 0, 100 } /* (0..100) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_INTEGER_enum_map_t asn_MAP_latitudeSign_value2enum_2[] = { { 0, 5, "north" }, { 1, 5, "south" } }; static unsigned int asn_MAP_latitudeSign_enum2value_2[] = { 0, /* north(0) */ 1 /* south(1) */ }; static asn_INTEGER_specifics_t asn_SPC_latitudeSign_specs_2 = { asn_MAP_latitudeSign_value2enum_2, /* "tag" => N; sorted by tag */ asn_MAP_latitudeSign_enum2value_2, /* N => "tag"; sorted by N */ 2, /* Number of elements in the maps */ 0, /* Enumeration is not extensible */ 1, /* Strict enumeration */ 0, /* Native long size */ 0 }; static ber_tlv_tag_t asn_DEF_latitudeSign_tags_2[] = { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_latitudeSign_2 = { "latitudeSign", "latitudeSign", latitudeSign_2_free, latitudeSign_2_print, latitudeSign_2_constraint, latitudeSign_2_decode_ber, latitudeSign_2_encode_der, latitudeSign_2_decode_xer, latitudeSign_2_encode_xer, latitudeSign_2_decode_uper, latitudeSign_2_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_latitudeSign_tags_2, sizeof(asn_DEF_latitudeSign_tags_2) /sizeof(asn_DEF_latitudeSign_tags_2[0]) - 1, /* 1 */ asn_DEF_latitudeSign_tags_2, /* Same as above */ sizeof(asn_DEF_latitudeSign_tags_2) /sizeof(asn_DEF_latitudeSign_tags_2[0]), /* 2 */ &asn_PER_type_latitudeSign_constr_2, 0, 0, /* Defined elsewhere */ &asn_SPC_latitudeSign_specs_2 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_uncertainty_7[] = { { ATF_NOFLAGS, 0, offsetof(struct uncertainty, uncertaintySemiMajor), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_uncertaintySemiMajor_constraint_7, &asn_PER_memb_uncertaintySemiMajor_constr_8, 0, "uncertaintySemiMajor" }, { ATF_NOFLAGS, 0, offsetof(struct uncertainty, uncertaintySemiMinor), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_uncertaintySemiMinor_constraint_7, &asn_PER_memb_uncertaintySemiMinor_constr_9, 0, "uncertaintySemiMinor" }, { ATF_NOFLAGS, 0, offsetof(struct uncertainty, orientationMajorAxis), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_orientationMajorAxis_constraint_7, &asn_PER_memb_orientationMajorAxis_constr_10, 0, "orientationMajorAxis" }, }; static ber_tlv_tag_t asn_DEF_uncertainty_tags_7[] = { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_uncertainty_tag2el_7[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* uncertaintySemiMajor at 77 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* uncertaintySemiMinor at 78 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* orientationMajorAxis at 79 */ }; static asn_SEQUENCE_specifics_t asn_SPC_uncertainty_specs_7 = { sizeof(struct uncertainty), offsetof(struct uncertainty, _asn_ctx), asn_MAP_uncertainty_tag2el_7, 3, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_uncertainty_7 = { "uncertainty", "uncertainty", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_uncertainty_tags_7, sizeof(asn_DEF_uncertainty_tags_7) /sizeof(asn_DEF_uncertainty_tags_7[0]) - 1, /* 1 */ asn_DEF_uncertainty_tags_7, /* Same as above */ sizeof(asn_DEF_uncertainty_tags_7) /sizeof(asn_DEF_uncertainty_tags_7[0]), /* 2 */ 0, /* No PER visible constraints */ asn_MBR_uncertainty_7, 3, /* Elements count */ &asn_SPC_uncertainty_specs_7 /* Additional specs */ }; static asn_TYPE_member_t asn_MBR_PositionEstimate_1[] = { { ATF_NOFLAGS, 0, offsetof(struct PositionEstimate, latitudeSign), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_latitudeSign_2, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "latitudeSign" }, { ATF_NOFLAGS, 0, offsetof(struct PositionEstimate, latitude), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_latitude_constraint_1, &asn_PER_memb_latitude_constr_5, 0, "latitude" }, { ATF_NOFLAGS, 0, offsetof(struct PositionEstimate, longitude), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_longitude_constraint_1, &asn_PER_memb_longitude_constr_6, 0, "longitude" }, { ATF_POINTER, 3, offsetof(struct PositionEstimate, uncertainty), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 0, &asn_DEF_uncertainty_7, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "uncertainty" }, { ATF_POINTER, 2, offsetof(struct PositionEstimate, confidence), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_confidence_constraint_1, &asn_PER_memb_confidence_constr_11, 0, "confidence" }, { ATF_POINTER, 1, offsetof(struct PositionEstimate, altitudeInfo), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_AltitudeInfo, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "altitudeInfo" }, }; static int asn_MAP_PositionEstimate_oms_1[] = { 3, 4, 5 }; static ber_tlv_tag_t asn_DEF_PositionEstimate_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_PositionEstimate_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* latitudeSign at 73 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* latitude at 74 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* longitude at 75 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* uncertainty at 77 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* confidence at 81 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 } /* altitudeInfo at 82 */ }; static asn_SEQUENCE_specifics_t asn_SPC_PositionEstimate_specs_1 = { sizeof(struct PositionEstimate), offsetof(struct PositionEstimate, _asn_ctx), asn_MAP_PositionEstimate_tag2el_1, 6, /* Count of tags in the map */ asn_MAP_PositionEstimate_oms_1, /* Optional members */ 3, 0, /* Root/Additions */ 5, /* Start extensions */ 7 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_PositionEstimate = { "PositionEstimate", "PositionEstimate", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_PositionEstimate_tags_1, sizeof(asn_DEF_PositionEstimate_tags_1) /sizeof(asn_DEF_PositionEstimate_tags_1[0]), /* 1 */ asn_DEF_PositionEstimate_tags_1, /* Same as above */ sizeof(asn_DEF_PositionEstimate_tags_1) /sizeof(asn_DEF_PositionEstimate_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_PositionEstimate_1, 6, /* Elements count */ &asn_SPC_PositionEstimate_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/PositionEstimate.h000066400000000000000000000026721305042567700241460ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _PositionEstimate_H_ #define _PositionEstimate_H_ #include /* Including external dependencies */ #include #include #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum latitudeSign { latitudeSign_north = 0, latitudeSign_south = 1 } e_latitudeSign; /* Forward declarations */ struct AltitudeInfo; /* PositionEstimate */ typedef struct PositionEstimate { ENUMERATED_t latitudeSign; long latitude; long longitude; struct uncertainty { long uncertaintySemiMajor; long uncertaintySemiMinor; long orientationMajorAxis; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } *uncertainty; long *confidence /* OPTIONAL */; struct AltitudeInfo *altitudeInfo /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } PositionEstimate_t; /* Implementation */ /* extern asn_TYPE_descriptor_t asn_DEF_latitudeSign_2; // (Use -fall-defs-global to expose) */ extern asn_TYPE_descriptor_t asn_DEF_PositionEstimate; #ifdef __cplusplus } #endif /* Referred external types */ #include "AltitudeInfo.h" #endif /* _PositionEstimate_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/PrefMethod.c000066400000000000000000000120171305042567700226700ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-START" * found in "../supl-start.asn" */ #include "PrefMethod.h" int PrefMethod_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { /* Replace with underlying type checker */ td->check_constraints = asn_DEF_ENUMERATED.check_constraints; return td->check_constraints(td, sptr, ctfailcb, app_key); } /* * This type is implemented using ENUMERATED, * so here we adjust the DEF accordingly. */ static void PrefMethod_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_ENUMERATED.free_struct; td->print_struct = asn_DEF_ENUMERATED.print_struct; td->ber_decoder = asn_DEF_ENUMERATED.ber_decoder; td->der_encoder = asn_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; td->uper_encoder = asn_DEF_ENUMERATED.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_ENUMERATED.per_constraints; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ } void PrefMethod_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { PrefMethod_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int PrefMethod_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { PrefMethod_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t PrefMethod_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { PrefMethod_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t PrefMethod_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { PrefMethod_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t PrefMethod_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { PrefMethod_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t PrefMethod_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { PrefMethod_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t PrefMethod_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { PrefMethod_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t PrefMethod_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { PrefMethod_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_PrefMethod_constr_1 = { { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_INTEGER_enum_map_t asn_MAP_PrefMethod_value2enum_1[] = { { 0, 24, "agpsSETassistedPreferred" }, { 1, 21, "agpsSETBasedPreferred" }, { 2, 12, "noPreference" } }; static unsigned int asn_MAP_PrefMethod_enum2value_1[] = { 1, /* agpsSETBasedPreferred(1) */ 0, /* agpsSETassistedPreferred(0) */ 2 /* noPreference(2) */ }; static asn_INTEGER_specifics_t asn_SPC_PrefMethod_specs_1 = { asn_MAP_PrefMethod_value2enum_1, /* "tag" => N; sorted by tag */ asn_MAP_PrefMethod_enum2value_1, /* N => "tag"; sorted by N */ 3, /* Number of elements in the maps */ 0, /* Enumeration is not extensible */ 1, /* Strict enumeration */ 0, /* Native long size */ 0 }; static ber_tlv_tag_t asn_DEF_PrefMethod_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; asn_TYPE_descriptor_t asn_DEF_PrefMethod = { "PrefMethod", "PrefMethod", PrefMethod_free, PrefMethod_print, PrefMethod_constraint, PrefMethod_decode_ber, PrefMethod_encode_der, PrefMethod_decode_xer, PrefMethod_encode_xer, PrefMethod_decode_uper, PrefMethod_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_PrefMethod_tags_1, sizeof(asn_DEF_PrefMethod_tags_1) /sizeof(asn_DEF_PrefMethod_tags_1[0]), /* 1 */ asn_DEF_PrefMethod_tags_1, /* Same as above */ sizeof(asn_DEF_PrefMethod_tags_1) /sizeof(asn_DEF_PrefMethod_tags_1[0]), /* 1 */ &asn_PER_type_PrefMethod_constr_1, 0, 0, /* Defined elsewhere */ &asn_SPC_PrefMethod_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/PrefMethod.h000066400000000000000000000020441305042567700226740ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-START" * found in "../supl-start.asn" */ #ifndef _PrefMethod_H_ #define _PrefMethod_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum PrefMethod { PrefMethod_agpsSETassistedPreferred = 0, PrefMethod_agpsSETBasedPreferred = 1, PrefMethod_noPreference = 2 } e_PrefMethod; /* PrefMethod */ typedef ENUMERATED_t PrefMethod_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_PrefMethod; asn_struct_free_f PrefMethod_free; asn_struct_print_f PrefMethod_print; asn_constr_check_f PrefMethod_constraint; ber_type_decoder_f PrefMethod_decode_ber; der_type_encoder_f PrefMethod_encode_der; xer_type_decoder_f PrefMethod_decode_xer; xer_type_encoder_f PrefMethod_encode_xer; per_type_decoder_f PrefMethod_decode_uper; per_type_encoder_f PrefMethod_encode_uper; #ifdef __cplusplus } #endif #endif /* _PrefMethod_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/PrimaryCCPCH-RSCP.c000066400000000000000000000115241305042567700235660ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "PrimaryCCPCH-RSCP.h" int PrimaryCCPCH_RSCP_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void PrimaryCCPCH_RSCP_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void PrimaryCCPCH_RSCP_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { PrimaryCCPCH_RSCP_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int PrimaryCCPCH_RSCP_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { PrimaryCCPCH_RSCP_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t PrimaryCCPCH_RSCP_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { PrimaryCCPCH_RSCP_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t PrimaryCCPCH_RSCP_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { PrimaryCCPCH_RSCP_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t PrimaryCCPCH_RSCP_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { PrimaryCCPCH_RSCP_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t PrimaryCCPCH_RSCP_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { PrimaryCCPCH_RSCP_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t PrimaryCCPCH_RSCP_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { PrimaryCCPCH_RSCP_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t PrimaryCCPCH_RSCP_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { PrimaryCCPCH_RSCP_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_PrimaryCCPCH_RSCP_constr_1 = { { APC_CONSTRAINED, 7, 7, 0, 127 } /* (0..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_PrimaryCCPCH_RSCP_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_PrimaryCCPCH_RSCP = { "PrimaryCCPCH-RSCP", "PrimaryCCPCH-RSCP", PrimaryCCPCH_RSCP_free, PrimaryCCPCH_RSCP_print, PrimaryCCPCH_RSCP_constraint, PrimaryCCPCH_RSCP_decode_ber, PrimaryCCPCH_RSCP_encode_der, PrimaryCCPCH_RSCP_decode_xer, PrimaryCCPCH_RSCP_encode_xer, PrimaryCCPCH_RSCP_decode_uper, PrimaryCCPCH_RSCP_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_PrimaryCCPCH_RSCP_tags_1, sizeof(asn_DEF_PrimaryCCPCH_RSCP_tags_1) /sizeof(asn_DEF_PrimaryCCPCH_RSCP_tags_1[0]), /* 1 */ asn_DEF_PrimaryCCPCH_RSCP_tags_1, /* Same as above */ sizeof(asn_DEF_PrimaryCCPCH_RSCP_tags_1) /sizeof(asn_DEF_PrimaryCCPCH_RSCP_tags_1[0]), /* 1 */ &asn_PER_type_PrimaryCCPCH_RSCP_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/PrimaryCCPCH-RSCP.h000066400000000000000000000017411305042567700235730ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _PrimaryCCPCH_RSCP_H_ #define _PrimaryCCPCH_RSCP_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* PrimaryCCPCH-RSCP */ typedef long PrimaryCCPCH_RSCP_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_PrimaryCCPCH_RSCP; asn_struct_free_f PrimaryCCPCH_RSCP_free; asn_struct_print_f PrimaryCCPCH_RSCP_print; asn_constr_check_f PrimaryCCPCH_RSCP_constraint; ber_type_decoder_f PrimaryCCPCH_RSCP_decode_ber; der_type_encoder_f PrimaryCCPCH_RSCP_encode_der; xer_type_decoder_f PrimaryCCPCH_RSCP_decode_xer; xer_type_encoder_f PrimaryCCPCH_RSCP_encode_xer; per_type_decoder_f PrimaryCCPCH_RSCP_decode_uper; per_type_encoder_f PrimaryCCPCH_RSCP_encode_uper; #ifdef __cplusplus } #endif #endif /* _PrimaryCCPCH_RSCP_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/PrimaryCPICH-Info.c000066400000000000000000000051341305042567700237200ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "PrimaryCPICH-Info.h" static int memb_primaryScramblingCode_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 511)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_primaryScramblingCode_constr_2 = { { APC_CONSTRAINED, 9, 9, 0, 511 } /* (0..511) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_PrimaryCPICH_Info_1[] = { { ATF_NOFLAGS, 0, offsetof(struct PrimaryCPICH_Info, primaryScramblingCode), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_primaryScramblingCode_constraint_1, &asn_PER_memb_primaryScramblingCode_constr_2, 0, "primaryScramblingCode" }, }; static ber_tlv_tag_t asn_DEF_PrimaryCPICH_Info_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_PrimaryCPICH_Info_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* primaryScramblingCode at 186 */ }; static asn_SEQUENCE_specifics_t asn_SPC_PrimaryCPICH_Info_specs_1 = { sizeof(struct PrimaryCPICH_Info), offsetof(struct PrimaryCPICH_Info, _asn_ctx), asn_MAP_PrimaryCPICH_Info_tag2el_1, 1, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_PrimaryCPICH_Info = { "PrimaryCPICH-Info", "PrimaryCPICH-Info", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_PrimaryCPICH_Info_tags_1, sizeof(asn_DEF_PrimaryCPICH_Info_tags_1) /sizeof(asn_DEF_PrimaryCPICH_Info_tags_1[0]), /* 1 */ asn_DEF_PrimaryCPICH_Info_tags_1, /* Same as above */ sizeof(asn_DEF_PrimaryCPICH_Info_tags_1) /sizeof(asn_DEF_PrimaryCPICH_Info_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_PrimaryCPICH_Info_1, 1, /* Elements count */ &asn_SPC_PrimaryCPICH_Info_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/PrimaryCPICH-Info.h000066400000000000000000000013261305042567700237240ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _PrimaryCPICH_Info_H_ #define _PrimaryCPICH_Info_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* PrimaryCPICH-Info */ typedef struct PrimaryCPICH_Info { long primaryScramblingCode; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } PrimaryCPICH_Info_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_PrimaryCPICH_Info; #ifdef __cplusplus } #endif #endif /* _PrimaryCPICH_Info_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/QoP.c000066400000000000000000000125121305042567700213320ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "QoP.h" static int memb_horacc_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_veracc_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_maxLocAge_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 65535)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_delay_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 7)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_horacc_constr_2 = { { APC_CONSTRAINED, 7, 7, 0, 127 } /* (0..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_veracc_constr_3 = { { APC_CONSTRAINED, 7, 7, 0, 127 } /* (0..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_maxLocAge_constr_4 = { { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_delay_constr_5 = { { APC_CONSTRAINED, 3, 3, 0, 7 } /* (0..7) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_QoP_1[] = { { ATF_NOFLAGS, 0, offsetof(struct QoP, horacc), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_horacc_constraint_1, &asn_PER_memb_horacc_constr_2, 0, "horacc" }, { ATF_POINTER, 3, offsetof(struct QoP, veracc), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_veracc_constraint_1, &asn_PER_memb_veracc_constr_3, 0, "veracc" }, { ATF_POINTER, 2, offsetof(struct QoP, maxLocAge), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_maxLocAge_constraint_1, &asn_PER_memb_maxLocAge_constr_4, 0, "maxLocAge" }, { ATF_POINTER, 1, offsetof(struct QoP, delay), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_delay_constraint_1, &asn_PER_memb_delay_constr_5, 0, "delay" }, }; static int asn_MAP_QoP_oms_1[] = { 1, 2, 3 }; static ber_tlv_tag_t asn_DEF_QoP_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_QoP_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* horacc at 219 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* veracc at 220 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* maxLocAge at 221 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* delay at 222 */ }; static asn_SEQUENCE_specifics_t asn_SPC_QoP_specs_1 = { sizeof(struct QoP), offsetof(struct QoP, _asn_ctx), asn_MAP_QoP_tag2el_1, 4, /* Count of tags in the map */ asn_MAP_QoP_oms_1, /* Optional members */ 3, 0, /* Root/Additions */ 3, /* Start extensions */ 5 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_QoP = { "QoP", "QoP", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_QoP_tags_1, sizeof(asn_DEF_QoP_tags_1) /sizeof(asn_DEF_QoP_tags_1[0]), /* 1 */ asn_DEF_QoP_tags_1, /* Same as above */ sizeof(asn_DEF_QoP_tags_1) /sizeof(asn_DEF_QoP_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_QoP_1, 4, /* Elements count */ &asn_SPC_QoP_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/QoP.h000066400000000000000000000014121305042567700213340ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _QoP_H_ #define _QoP_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* QoP */ typedef struct QoP { long horacc; long *veracc /* OPTIONAL */; long *maxLocAge /* OPTIONAL */; long *delay /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } QoP_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_QoP; #ifdef __cplusplus } #endif #endif /* _QoP_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/RequestedAssistData.c000066400000000000000000000130611305042567700245550ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-POS-INIT" * found in "../supl-posinit.asn" */ #include "RequestedAssistData.h" static asn_TYPE_member_t asn_MBR_RequestedAssistData_1[] = { { ATF_NOFLAGS, 0, offsetof(struct RequestedAssistData, almanacRequested), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BOOLEAN, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "almanacRequested" }, { ATF_NOFLAGS, 0, offsetof(struct RequestedAssistData, utcModelRequested), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BOOLEAN, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "utcModelRequested" }, { ATF_NOFLAGS, 0, offsetof(struct RequestedAssistData, ionosphericModelRequested), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BOOLEAN, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ionosphericModelRequested" }, { ATF_NOFLAGS, 0, offsetof(struct RequestedAssistData, dgpsCorrectionsRequested), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BOOLEAN, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "dgpsCorrectionsRequested" }, { ATF_NOFLAGS, 0, offsetof(struct RequestedAssistData, referenceLocationRequested), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BOOLEAN, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "referenceLocationRequested" }, { ATF_NOFLAGS, 0, offsetof(struct RequestedAssistData, referenceTimeRequested), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BOOLEAN, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "referenceTimeRequested" }, { ATF_NOFLAGS, 0, offsetof(struct RequestedAssistData, acquisitionAssistanceRequested), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BOOLEAN, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "acquisitionAssistanceRequested" }, { ATF_NOFLAGS, 0, offsetof(struct RequestedAssistData, realTimeIntegrityRequested), (ASN_TAG_CLASS_CONTEXT | (7 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BOOLEAN, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "realTimeIntegrityRequested" }, { ATF_NOFLAGS, 0, offsetof(struct RequestedAssistData, navigationModelRequested), (ASN_TAG_CLASS_CONTEXT | (8 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BOOLEAN, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "navigationModelRequested" }, { ATF_POINTER, 1, offsetof(struct RequestedAssistData, navigationModelData), (ASN_TAG_CLASS_CONTEXT | (9 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_XNavigationModel, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "navigationModelData" }, }; static int asn_MAP_RequestedAssistData_oms_1[] = { 9 }; static ber_tlv_tag_t asn_DEF_RequestedAssistData_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_RequestedAssistData_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* almanacRequested at 24 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* utcModelRequested at 25 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* ionosphericModelRequested at 26 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* dgpsCorrectionsRequested at 27 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* referenceLocationRequested at 28 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* referenceTimeRequested at 29 */ { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* acquisitionAssistanceRequested at 30 */ { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 }, /* realTimeIntegrityRequested at 31 */ { (ASN_TAG_CLASS_CONTEXT | (8 << 2)), 8, 0, 0 }, /* navigationModelRequested at 32 */ { (ASN_TAG_CLASS_CONTEXT | (9 << 2)), 9, 0, 0 } /* navigationModelData at 33 */ }; static asn_SEQUENCE_specifics_t asn_SPC_RequestedAssistData_specs_1 = { sizeof(struct RequestedAssistData), offsetof(struct RequestedAssistData, _asn_ctx), asn_MAP_RequestedAssistData_tag2el_1, 10, /* Count of tags in the map */ asn_MAP_RequestedAssistData_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ 9, /* Start extensions */ 11 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_RequestedAssistData = { "RequestedAssistData", "RequestedAssistData", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_RequestedAssistData_tags_1, sizeof(asn_DEF_RequestedAssistData_tags_1) /sizeof(asn_DEF_RequestedAssistData_tags_1[0]), /* 1 */ asn_DEF_RequestedAssistData_tags_1, /* Same as above */ sizeof(asn_DEF_RequestedAssistData_tags_1) /sizeof(asn_DEF_RequestedAssistData_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_RequestedAssistData_1, 10, /* Elements count */ &asn_SPC_RequestedAssistData_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/RequestedAssistData.h000066400000000000000000000024111305042567700245570ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-POS-INIT" * found in "../supl-posinit.asn" */ #ifndef _RequestedAssistData_H_ #define _RequestedAssistData_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct XNavigationModel; /* RequestedAssistData */ typedef struct RequestedAssistData { BOOLEAN_t almanacRequested; BOOLEAN_t utcModelRequested; BOOLEAN_t ionosphericModelRequested; BOOLEAN_t dgpsCorrectionsRequested; BOOLEAN_t referenceLocationRequested; BOOLEAN_t referenceTimeRequested; BOOLEAN_t acquisitionAssistanceRequested; BOOLEAN_t realTimeIntegrityRequested; BOOLEAN_t navigationModelRequested; struct XNavigationModel *navigationModelData /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } RequestedAssistData_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_RequestedAssistData; #ifdef __cplusplus } #endif /* Referred external types */ #include "XNavigationModel.h" #endif /* _RequestedAssistData_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SETAuthKey.c000066400000000000000000000072041305042567700225630ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-RESPONSE" * found in "../supl-response.asn" */ #include "SETAuthKey.h" static int memb_shortKey_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } if(st->size > 0) { /* Size in bits */ size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } if((size == 128)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_longKey_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } if(st->size > 0) { /* Size in bits */ size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } if((size == 256)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_shortKey_constr_2 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 128, 128 } /* (SIZE(128..128)) */, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_longKey_constr_3 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 256, 256 } /* (SIZE(256..256)) */, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_type_SETAuthKey_constr_1 = { { APC_CONSTRAINED | APC_EXTENSIBLE, 1, 1, 0, 1 } /* (0..1,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SETAuthKey_1[] = { { ATF_NOFLAGS, 0, offsetof(struct SETAuthKey, choice.shortKey), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, memb_shortKey_constraint_1, &asn_PER_memb_shortKey_constr_2, 0, "shortKey" }, { ATF_NOFLAGS, 0, offsetof(struct SETAuthKey, choice.longKey), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, memb_longKey_constraint_1, &asn_PER_memb_longKey_constr_3, 0, "longKey" }, }; static asn_TYPE_tag2member_t asn_MAP_SETAuthKey_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* shortKey at 17 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* longKey at 18 */ }; static asn_CHOICE_specifics_t asn_SPC_SETAuthKey_specs_1 = { sizeof(struct SETAuthKey), offsetof(struct SETAuthKey, _asn_ctx), offsetof(struct SETAuthKey, present), sizeof(((struct SETAuthKey *)0)->present), asn_MAP_SETAuthKey_tag2el_1, 2, /* Count of tags in the map */ 0, 2 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_SETAuthKey = { "SETAuthKey", "SETAuthKey", CHOICE_free, CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_decode_uper, CHOICE_encode_uper, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ &asn_PER_type_SETAuthKey_constr_1, asn_MBR_SETAuthKey_1, 2, /* Elements count */ &asn_SPC_SETAuthKey_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SETAuthKey.h000066400000000000000000000020101305042567700225560ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-RESPONSE" * found in "../supl-response.asn" */ #ifndef _SETAuthKey_H_ #define _SETAuthKey_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum SETAuthKey_PR { SETAuthKey_PR_NOTHING, /* No components present */ SETAuthKey_PR_shortKey, SETAuthKey_PR_longKey, /* Extensions may appear below */ } SETAuthKey_PR; /* SETAuthKey */ typedef struct SETAuthKey { SETAuthKey_PR present; union SETAuthKey_u { BIT_STRING_t shortKey; BIT_STRING_t longKey; /* * This type is extensible, * possible extensions are below. */ } choice; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SETAuthKey_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SETAuthKey; #ifdef __cplusplus } #endif #endif /* _SETAuthKey_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SETCapabilities.c000066400000000000000000000050031305042567700235750ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-START" * found in "../supl-start.asn" */ #include "SETCapabilities.h" static asn_TYPE_member_t asn_MBR_SETCapabilities_1[] = { { ATF_NOFLAGS, 0, offsetof(struct SETCapabilities, posTechnology), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_PosTechnology, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "posTechnology" }, { ATF_NOFLAGS, 0, offsetof(struct SETCapabilities, prefMethod), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_PrefMethod, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "prefMethod" }, { ATF_NOFLAGS, 0, offsetof(struct SETCapabilities, posProtocol), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_PosProtocol, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "posProtocol" }, }; static ber_tlv_tag_t asn_DEF_SETCapabilities_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_SETCapabilities_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* posTechnology at 16 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* prefMethod at 17 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* posProtocol at 18 */ }; static asn_SEQUENCE_specifics_t asn_SPC_SETCapabilities_specs_1 = { sizeof(struct SETCapabilities), offsetof(struct SETCapabilities, _asn_ctx), asn_MAP_SETCapabilities_tag2el_1, 3, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ 2, /* Start extensions */ 4 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_SETCapabilities = { "SETCapabilities", "SETCapabilities", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SETCapabilities_tags_1, sizeof(asn_DEF_SETCapabilities_tags_1) /sizeof(asn_DEF_SETCapabilities_tags_1[0]), /* 1 */ asn_DEF_SETCapabilities_tags_1, /* Same as above */ sizeof(asn_DEF_SETCapabilities_tags_1) /sizeof(asn_DEF_SETCapabilities_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_SETCapabilities_1, 3, /* Elements count */ &asn_SPC_SETCapabilities_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SETCapabilities.h000066400000000000000000000015701305042567700236070ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-START" * found in "../supl-start.asn" */ #ifndef _SETCapabilities_H_ #define _SETCapabilities_H_ #include /* Including external dependencies */ #include "PosTechnology.h" #include "PrefMethod.h" #include "PosProtocol.h" #include #ifdef __cplusplus extern "C" { #endif /* SETCapabilities */ typedef struct SETCapabilities { PosTechnology_t posTechnology; PrefMethod_t prefMethod; PosProtocol_t posProtocol; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SETCapabilities_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SETCapabilities; #ifdef __cplusplus } #endif #endif /* _SETCapabilities_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SETId.c000066400000000000000000000163321305042567700215470ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "SETId.h" static int check_permitted_alphabet_6(const void *sptr) { /* The underlying type is IA5String */ const IA5String_t *st = (const IA5String_t *)sptr; const uint8_t *ch = st->buf; const uint8_t *end = ch + st->size; for(; ch < end; ch++) { uint8_t cv = *ch; if(!(cv <= 127)) return -1; } return 0; } static int memb_msisdn_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } size = st->size; if((size == 8)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_mdn_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } size = st->size; if((size == 8)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_min_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } if(st->size > 0) { /* Size in bits */ size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } if((size == 34)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_imsi_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } size = st->size; if((size == 8)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_nai_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const IA5String_t *st = (const IA5String_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } size = st->size; if((size >= 1 && size <= 1000) && !check_permitted_alphabet_6(st)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_msisdn_constr_2 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 8, 8 } /* (SIZE(8..8)) */, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_mdn_constr_3 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 8, 8 } /* (SIZE(8..8)) */, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_min_constr_4 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 34, 34 } /* (SIZE(34..34)) */, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_imsi_constr_5 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 8, 8 } /* (SIZE(8..8)) */, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_nai_constr_6 = { { APC_CONSTRAINED, 7, 7, 0, 127 } /* (0..127) */, { APC_CONSTRAINED, 10, 10, 1, 1000 } /* (SIZE(1..1000)) */, 0, 0 /* No PER character map necessary */ }; static asn_per_constraints_t asn_PER_type_SETId_constr_1 = { { APC_CONSTRAINED | APC_EXTENSIBLE, 3, 3, 0, 5 } /* (0..5,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SETId_1[] = { { ATF_NOFLAGS, 0, offsetof(struct SETId, choice.msisdn), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_OCTET_STRING, memb_msisdn_constraint_1, &asn_PER_memb_msisdn_constr_2, 0, "msisdn" }, { ATF_NOFLAGS, 0, offsetof(struct SETId, choice.mdn), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_OCTET_STRING, memb_mdn_constraint_1, &asn_PER_memb_mdn_constr_3, 0, "mdn" }, { ATF_NOFLAGS, 0, offsetof(struct SETId, choice.min), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_BIT_STRING, memb_min_constraint_1, &asn_PER_memb_min_constr_4, 0, "min" }, { ATF_NOFLAGS, 0, offsetof(struct SETId, choice.imsi), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_OCTET_STRING, memb_imsi_constraint_1, &asn_PER_memb_imsi_constr_5, 0, "imsi" }, { ATF_NOFLAGS, 0, offsetof(struct SETId, choice.nai), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_IA5String, memb_nai_constraint_1, &asn_PER_memb_nai_constr_6, 0, "nai" }, { ATF_NOFLAGS, 0, offsetof(struct SETId, choice.iPAddress), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), +1, /* EXPLICIT tag at current level */ &asn_DEF_IPAddress, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "iPAddress" }, }; static asn_TYPE_tag2member_t asn_MAP_SETId_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* msisdn at 22 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* mdn at 23 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* min at 24 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* imsi at 25 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* nai at 26 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 } /* iPAddress at 27 */ }; static asn_CHOICE_specifics_t asn_SPC_SETId_specs_1 = { sizeof(struct SETId), offsetof(struct SETId, _asn_ctx), offsetof(struct SETId, present), sizeof(((struct SETId *)0)->present), asn_MAP_SETId_tag2el_1, 6, /* Count of tags in the map */ 0, 6 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_SETId = { "SETId", "SETId", CHOICE_free, CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_decode_uper, CHOICE_encode_uper, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ &asn_PER_type_SETId_constr_1, asn_MBR_SETId_1, 6, /* Elements count */ &asn_SPC_SETId_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SETId.h000066400000000000000000000022371305042567700215530ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _SETId_H_ #define _SETId_H_ #include /* Including external dependencies */ #include #include #include #include "IPAddress.h" #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum SETId_PR { SETId_PR_NOTHING, /* No components present */ SETId_PR_msisdn, SETId_PR_mdn, SETId_PR_min, SETId_PR_imsi, SETId_PR_nai, SETId_PR_iPAddress, /* Extensions may appear below */ } SETId_PR; /* SETId */ typedef struct SETId { SETId_PR present; union SETId_u { OCTET_STRING_t msisdn; OCTET_STRING_t mdn; BIT_STRING_t min; OCTET_STRING_t imsi; IA5String_t nai; IPAddress_t iPAddress; /* * This type is extensible, * possible extensions are below. */ } choice; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SETId_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SETId; #ifdef __cplusplus } #endif #endif /* _SETId_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SLPAddress.c000066400000000000000000000037701305042567700226050ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "SLPAddress.h" static asn_per_constraints_t asn_PER_type_SLPAddress_constr_1 = { { APC_CONSTRAINED | APC_EXTENSIBLE, 1, 1, 0, 1 } /* (0..1,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SLPAddress_1[] = { { ATF_NOFLAGS, 0, offsetof(struct SLPAddress, choice.iPAddress), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), +1, /* EXPLICIT tag at current level */ &asn_DEF_IPAddress, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "iPAddress" }, { ATF_NOFLAGS, 0, offsetof(struct SLPAddress, choice.fQDN), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_FQDN, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "fQDN" }, }; static asn_TYPE_tag2member_t asn_MAP_SLPAddress_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* iPAddress at 44 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* fQDN at 45 */ }; static asn_CHOICE_specifics_t asn_SPC_SLPAddress_specs_1 = { sizeof(struct SLPAddress), offsetof(struct SLPAddress, _asn_ctx), offsetof(struct SLPAddress, present), sizeof(((struct SLPAddress *)0)->present), asn_MAP_SLPAddress_tag2el_1, 2, /* Count of tags in the map */ 0, 2 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_SLPAddress = { "SLPAddress", "SLPAddress", CHOICE_free, CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_decode_uper, CHOICE_encode_uper, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ &asn_PER_type_SLPAddress_constr_1, asn_MBR_SLPAddress_1, 2, /* Elements count */ &asn_SPC_SLPAddress_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SLPAddress.h000066400000000000000000000020151305042567700226010ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _SLPAddress_H_ #define _SLPAddress_H_ #include /* Including external dependencies */ #include "IPAddress.h" #include "FQDN.h" #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum SLPAddress_PR { SLPAddress_PR_NOTHING, /* No components present */ SLPAddress_PR_iPAddress, SLPAddress_PR_fQDN, /* Extensions may appear below */ } SLPAddress_PR; /* SLPAddress */ typedef struct SLPAddress { SLPAddress_PR present; union SLPAddress_u { IPAddress_t iPAddress; FQDN_t fQDN; /* * This type is extensible, * possible extensions are below. */ } choice; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SLPAddress_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SLPAddress; #ifdef __cplusplus } #endif #endif /* _SLPAddress_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SLPMode.c000066400000000000000000000114131305042567700220750ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-INIT" * found in "../supl-init.asn" */ #include "SLPMode.h" int SLPMode_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { /* Replace with underlying type checker */ td->check_constraints = asn_DEF_ENUMERATED.check_constraints; return td->check_constraints(td, sptr, ctfailcb, app_key); } /* * This type is implemented using ENUMERATED, * so here we adjust the DEF accordingly. */ static void SLPMode_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_ENUMERATED.free_struct; td->print_struct = asn_DEF_ENUMERATED.print_struct; td->ber_decoder = asn_DEF_ENUMERATED.ber_decoder; td->der_encoder = asn_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; td->uper_encoder = asn_DEF_ENUMERATED.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_ENUMERATED.per_constraints; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ } void SLPMode_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { SLPMode_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int SLPMode_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { SLPMode_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t SLPMode_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { SLPMode_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t SLPMode_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { SLPMode_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t SLPMode_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { SLPMode_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t SLPMode_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { SLPMode_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t SLPMode_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { SLPMode_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t SLPMode_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { SLPMode_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_SLPMode_constr_1 = { { APC_CONSTRAINED, 1, 1, 0, 1 } /* (0..1) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_INTEGER_enum_map_t asn_MAP_SLPMode_value2enum_1[] = { { 0, 5, "proxy" }, { 1, 8, "nonProxy" } }; static unsigned int asn_MAP_SLPMode_enum2value_1[] = { 1, /* nonProxy(1) */ 0 /* proxy(0) */ }; static asn_INTEGER_specifics_t asn_SPC_SLPMode_specs_1 = { asn_MAP_SLPMode_value2enum_1, /* "tag" => N; sorted by tag */ asn_MAP_SLPMode_enum2value_1, /* N => "tag"; sorted by N */ 2, /* Number of elements in the maps */ 0, /* Enumeration is not extensible */ 1, /* Strict enumeration */ 0, /* Native long size */ 0 }; static ber_tlv_tag_t asn_DEF_SLPMode_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; asn_TYPE_descriptor_t asn_DEF_SLPMode = { "SLPMode", "SLPMode", SLPMode_free, SLPMode_print, SLPMode_constraint, SLPMode_decode_ber, SLPMode_encode_der, SLPMode_decode_xer, SLPMode_encode_xer, SLPMode_decode_uper, SLPMode_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SLPMode_tags_1, sizeof(asn_DEF_SLPMode_tags_1) /sizeof(asn_DEF_SLPMode_tags_1[0]), /* 1 */ asn_DEF_SLPMode_tags_1, /* Same as above */ sizeof(asn_DEF_SLPMode_tags_1) /sizeof(asn_DEF_SLPMode_tags_1[0]), /* 1 */ &asn_PER_type_SLPMode_constr_1, 0, 0, /* Defined elsewhere */ &asn_SPC_SLPMode_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SLPMode.h000066400000000000000000000016531305042567700221070ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-INIT" * found in "../supl-init.asn" */ #ifndef _SLPMode_H_ #define _SLPMode_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum SLPMode { SLPMode_proxy = 0, SLPMode_nonProxy = 1 } e_SLPMode; /* SLPMode */ typedef ENUMERATED_t SLPMode_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SLPMode; asn_struct_free_f SLPMode_free; asn_struct_print_f SLPMode_print; asn_constr_check_f SLPMode_constraint; ber_type_decoder_f SLPMode_decode_ber; der_type_encoder_f SLPMode_encode_der; xer_type_decoder_f SLPMode_decode_xer; xer_type_encoder_f SLPMode_encode_xer; per_type_decoder_f SLPMode_decode_uper; per_type_encoder_f SLPMode_encode_uper; #ifdef __cplusplus } #endif #endif /* _SLPMode_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SUPLEND.c000066400000000000000000000045511305042567700217510ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-END" * found in "../supl-end.asn" */ #include "SUPLEND.h" static asn_TYPE_member_t asn_MBR_SUPLEND_1[] = { { ATF_POINTER, 3, offsetof(struct SUPLEND, position), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Position, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "position" }, { ATF_POINTER, 2, offsetof(struct SUPLEND, statusCode), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_StatusCode, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "statusCode" }, { ATF_POINTER, 1, offsetof(struct SUPLEND, ver), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Ver, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ver" }, }; static int asn_MAP_SUPLEND_oms_1[] = { 0, 1, 2 }; static ber_tlv_tag_t asn_DEF_SUPLEND_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_SUPLEND_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* position at 10 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* statusCode at 11 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* ver at 12 */ }; static asn_SEQUENCE_specifics_t asn_SPC_SUPLEND_specs_1 = { sizeof(struct SUPLEND), offsetof(struct SUPLEND, _asn_ctx), asn_MAP_SUPLEND_tag2el_1, 3, /* Count of tags in the map */ asn_MAP_SUPLEND_oms_1, /* Optional members */ 3, 0, /* Root/Additions */ 2, /* Start extensions */ 4 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_SUPLEND = { "SUPLEND", "SUPLEND", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SUPLEND_tags_1, sizeof(asn_DEF_SUPLEND_tags_1) /sizeof(asn_DEF_SUPLEND_tags_1[0]), /* 1 */ asn_DEF_SUPLEND_tags_1, /* Same as above */ sizeof(asn_DEF_SUPLEND_tags_1) /sizeof(asn_DEF_SUPLEND_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_SUPLEND_1, 3, /* Elements count */ &asn_SPC_SUPLEND_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SUPLEND.h000066400000000000000000000016231305042567700217530ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-END" * found in "../supl-end.asn" */ #ifndef _SUPLEND_H_ #define _SUPLEND_H_ #include /* Including external dependencies */ #include "StatusCode.h" #include "Ver.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct Position; /* SUPLEND */ typedef struct SUPLEND { struct Position *position /* OPTIONAL */; StatusCode_t *statusCode /* OPTIONAL */; Ver_t *ver /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SUPLEND_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SUPLEND; #ifdef __cplusplus } #endif /* Referred external types */ #include "Position.h" #endif /* _SUPLEND_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SUPLINIT.c000066400000000000000000000074051305042567700221070ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-INIT" * found in "../supl-init.asn" */ #include "SUPLINIT.h" static asn_TYPE_member_t asn_MBR_SUPLINIT_1[] = { { ATF_NOFLAGS, 0, offsetof(struct SUPLINIT, posMethod), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_PosMethod, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "posMethod" }, { ATF_POINTER, 3, offsetof(struct SUPLINIT, notification), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Notification, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "notification" }, { ATF_POINTER, 2, offsetof(struct SUPLINIT, sLPAddress), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), +1, /* EXPLICIT tag at current level */ &asn_DEF_SLPAddress, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "sLPAddress" }, { ATF_POINTER, 1, offsetof(struct SUPLINIT, qoP), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_QoP, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "qoP" }, { ATF_NOFLAGS, 0, offsetof(struct SUPLINIT, sLPMode), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SLPMode, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "sLPMode" }, { ATF_POINTER, 2, offsetof(struct SUPLINIT, mAC), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_MAC, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "mAC" }, { ATF_POINTER, 1, offsetof(struct SUPLINIT, keyIdentity), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_KeyIdentity, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "keyIdentity" }, }; static int asn_MAP_SUPLINIT_oms_1[] = { 1, 2, 3, 5, 6 }; static ber_tlv_tag_t asn_DEF_SUPLINIT_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_SUPLINIT_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* posMethod at 10 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* notification at 11 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* sLPAddress at 12 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* qoP at 13 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* sLPMode at 14 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* mAC at 15 */ { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 } /* keyIdentity at 16 */ }; static asn_SEQUENCE_specifics_t asn_SPC_SUPLINIT_specs_1 = { sizeof(struct SUPLINIT), offsetof(struct SUPLINIT, _asn_ctx), asn_MAP_SUPLINIT_tag2el_1, 7, /* Count of tags in the map */ asn_MAP_SUPLINIT_oms_1, /* Optional members */ 5, 0, /* Root/Additions */ 6, /* Start extensions */ 8 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_SUPLINIT = { "SUPLINIT", "SUPLINIT", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SUPLINIT_tags_1, sizeof(asn_DEF_SUPLINIT_tags_1) /sizeof(asn_DEF_SUPLINIT_tags_1[0]), /* 1 */ asn_DEF_SUPLINIT_tags_1, /* Same as above */ sizeof(asn_DEF_SUPLINIT_tags_1) /sizeof(asn_DEF_SUPLINIT_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_SUPLINIT_1, 7, /* Elements count */ &asn_SPC_SUPLINIT_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SUPLINIT.h000066400000000000000000000022411305042567700221050ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-INIT" * found in "../supl-init.asn" */ #ifndef _SUPLINIT_H_ #define _SUPLINIT_H_ #include /* Including external dependencies */ #include "PosMethod.h" #include "SLPMode.h" #include "MAC.h" #include "KeyIdentity.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct Notification; struct SLPAddress; struct QoP; /* SUPLINIT */ typedef struct SUPLINIT { PosMethod_t posMethod; struct Notification *notification /* OPTIONAL */; struct SLPAddress *sLPAddress /* OPTIONAL */; struct QoP *qoP /* OPTIONAL */; SLPMode_t sLPMode; MAC_t *mAC /* OPTIONAL */; KeyIdentity_t *keyIdentity /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SUPLINIT_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SUPLINIT; #ifdef __cplusplus } #endif /* Referred external types */ #include "Notification.h" #include "SLPAddress.h" #include "QoP.h" #endif /* _SUPLINIT_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SUPLPOS.c000066400000000000000000000040331305042567700217770ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-POS" * found in "../supl-pos.asn" */ #include "SUPLPOS.h" static asn_TYPE_member_t asn_MBR_SUPLPOS_1[] = { { ATF_NOFLAGS, 0, offsetof(struct SUPLPOS, posPayLoad), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), +1, /* EXPLICIT tag at current level */ &asn_DEF_PosPayLoad, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "posPayLoad" }, { ATF_POINTER, 1, offsetof(struct SUPLPOS, velocity), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), +1, /* EXPLICIT tag at current level */ &asn_DEF_Velocity, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "velocity" }, }; static int asn_MAP_SUPLPOS_oms_1[] = { 1 }; static ber_tlv_tag_t asn_DEF_SUPLPOS_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_SUPLPOS_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* posPayLoad at 10 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* velocity at 11 */ }; static asn_SEQUENCE_specifics_t asn_SPC_SUPLPOS_specs_1 = { sizeof(struct SUPLPOS), offsetof(struct SUPLPOS, _asn_ctx), asn_MAP_SUPLPOS_tag2el_1, 2, /* Count of tags in the map */ asn_MAP_SUPLPOS_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ 1, /* Start extensions */ 3 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_SUPLPOS = { "SUPLPOS", "SUPLPOS", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SUPLPOS_tags_1, sizeof(asn_DEF_SUPLPOS_tags_1) /sizeof(asn_DEF_SUPLPOS_tags_1[0]), /* 1 */ asn_DEF_SUPLPOS_tags_1, /* Same as above */ sizeof(asn_DEF_SUPLPOS_tags_1) /sizeof(asn_DEF_SUPLPOS_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_SUPLPOS_1, 2, /* Elements count */ &asn_SPC_SUPLPOS_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SUPLPOS.h000066400000000000000000000015271305042567700220110ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-POS" * found in "../supl-pos.asn" */ #ifndef _SUPLPOS_H_ #define _SUPLPOS_H_ #include /* Including external dependencies */ #include "PosPayLoad.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct Velocity; /* SUPLPOS */ typedef struct SUPLPOS { PosPayLoad_t posPayLoad; struct Velocity *velocity /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SUPLPOS_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SUPLPOS; #ifdef __cplusplus } #endif /* Referred external types */ #include "Velocity.h" #endif /* _SUPLPOS_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SUPLPOSINIT.c000066400000000000000000000070711305042567700224700ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-POS-INIT" * found in "../supl-posinit.asn" */ #include "SUPLPOSINIT.h" static asn_TYPE_member_t asn_MBR_SUPLPOSINIT_1[] = { { ATF_NOFLAGS, 0, offsetof(struct SUPLPOSINIT, sETCapabilities), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SETCapabilities, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "sETCapabilities" }, { ATF_POINTER, 1, offsetof(struct SUPLPOSINIT, requestedAssistData), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_RequestedAssistData, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "requestedAssistData" }, { ATF_NOFLAGS, 0, offsetof(struct SUPLPOSINIT, locationId), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_LocationId, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "locationId" }, { ATF_POINTER, 3, offsetof(struct SUPLPOSINIT, position), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Position, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "position" }, { ATF_POINTER, 2, offsetof(struct SUPLPOSINIT, sUPLPOS), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SUPLPOS, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "sUPLPOS" }, { ATF_POINTER, 1, offsetof(struct SUPLPOSINIT, ver), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Ver, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "ver" }, }; static int asn_MAP_SUPLPOSINIT_oms_1[] = { 1, 3, 4, 5 }; static ber_tlv_tag_t asn_DEF_SUPLPOSINIT_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_SUPLPOSINIT_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* sETCapabilities at 15 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* requestedAssistData at 16 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* locationId at 17 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* position at 18 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* sUPLPOS at 19 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 } /* ver at 20 */ }; static asn_SEQUENCE_specifics_t asn_SPC_SUPLPOSINIT_specs_1 = { sizeof(struct SUPLPOSINIT), offsetof(struct SUPLPOSINIT, _asn_ctx), asn_MAP_SUPLPOSINIT_tag2el_1, 6, /* Count of tags in the map */ asn_MAP_SUPLPOSINIT_oms_1, /* Optional members */ 4, 0, /* Root/Additions */ 5, /* Start extensions */ 7 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_SUPLPOSINIT = { "SUPLPOSINIT", "SUPLPOSINIT", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SUPLPOSINIT_tags_1, sizeof(asn_DEF_SUPLPOSINIT_tags_1) /sizeof(asn_DEF_SUPLPOSINIT_tags_1[0]), /* 1 */ asn_DEF_SUPLPOSINIT_tags_1, /* Same as above */ sizeof(asn_DEF_SUPLPOSINIT_tags_1) /sizeof(asn_DEF_SUPLPOSINIT_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_SUPLPOSINIT_1, 6, /* Elements count */ &asn_SPC_SUPLPOSINIT_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SUPLPOSINIT.h000066400000000000000000000022671305042567700224770ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-POS-INIT" * found in "../supl-posinit.asn" */ #ifndef _SUPLPOSINIT_H_ #define _SUPLPOSINIT_H_ #include /* Including external dependencies */ #include "SETCapabilities.h" #include "LocationId.h" #include "Ver.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct RequestedAssistData; struct Position; struct SUPLPOS; /* SUPLPOSINIT */ typedef struct SUPLPOSINIT { SETCapabilities_t sETCapabilities; struct RequestedAssistData *requestedAssistData /* OPTIONAL */; LocationId_t locationId; struct Position *position /* OPTIONAL */; struct SUPLPOS *sUPLPOS /* OPTIONAL */; Ver_t *ver /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SUPLPOSINIT_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SUPLPOSINIT; #ifdef __cplusplus } #endif /* Referred external types */ #include "RequestedAssistData.h" #include "Position.h" #include "SUPLPOS.h" #endif /* _SUPLPOSINIT_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SUPLRESPONSE.c000066400000000000000000000055741305042567700226070ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-RESPONSE" * found in "../supl-response.asn" */ #include "SUPLRESPONSE.h" static asn_TYPE_member_t asn_MBR_SUPLRESPONSE_1[] = { { ATF_NOFLAGS, 0, offsetof(struct SUPLRESPONSE, posMethod), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_PosMethod, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "posMethod" }, { ATF_POINTER, 3, offsetof(struct SUPLRESPONSE, sLPAddress), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), +1, /* EXPLICIT tag at current level */ &asn_DEF_SLPAddress, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "sLPAddress" }, { ATF_POINTER, 2, offsetof(struct SUPLRESPONSE, sETAuthKey), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), +1, /* EXPLICIT tag at current level */ &asn_DEF_SETAuthKey, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "sETAuthKey" }, { ATF_POINTER, 1, offsetof(struct SUPLRESPONSE, keyIdentity4), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_KeyIdentity4, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "keyIdentity4" }, }; static int asn_MAP_SUPLRESPONSE_oms_1[] = { 1, 2, 3 }; static ber_tlv_tag_t asn_DEF_SUPLRESPONSE_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_SUPLRESPONSE_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* posMethod at 10 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* sLPAddress at 11 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* sETAuthKey at 12 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* keyIdentity4 at 13 */ }; static asn_SEQUENCE_specifics_t asn_SPC_SUPLRESPONSE_specs_1 = { sizeof(struct SUPLRESPONSE), offsetof(struct SUPLRESPONSE, _asn_ctx), asn_MAP_SUPLRESPONSE_tag2el_1, 4, /* Count of tags in the map */ asn_MAP_SUPLRESPONSE_oms_1, /* Optional members */ 3, 0, /* Root/Additions */ 3, /* Start extensions */ 5 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_SUPLRESPONSE = { "SUPLRESPONSE", "SUPLRESPONSE", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SUPLRESPONSE_tags_1, sizeof(asn_DEF_SUPLRESPONSE_tags_1) /sizeof(asn_DEF_SUPLRESPONSE_tags_1[0]), /* 1 */ asn_DEF_SUPLRESPONSE_tags_1, /* Same as above */ sizeof(asn_DEF_SUPLRESPONSE_tags_1) /sizeof(asn_DEF_SUPLRESPONSE_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_SUPLRESPONSE_1, 4, /* Elements count */ &asn_SPC_SUPLRESPONSE_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SUPLRESPONSE.h000066400000000000000000000020531305042567700226010ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-RESPONSE" * found in "../supl-response.asn" */ #ifndef _SUPLRESPONSE_H_ #define _SUPLRESPONSE_H_ #include /* Including external dependencies */ #include "PosMethod.h" #include "KeyIdentity4.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct SLPAddress; struct SETAuthKey; /* SUPLRESPONSE */ typedef struct SUPLRESPONSE { PosMethod_t posMethod; struct SLPAddress *sLPAddress /* OPTIONAL */; struct SETAuthKey *sETAuthKey /* OPTIONAL */; KeyIdentity4_t *keyIdentity4 /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SUPLRESPONSE_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SUPLRESPONSE; #ifdef __cplusplus } #endif /* Referred external types */ #include "SLPAddress.h" #include "SETAuthKey.h" #endif /* _SUPLRESPONSE_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SUPLSTART.c000066400000000000000000000046631305042567700222440ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-START" * found in "../supl-start.asn" */ #include "SUPLSTART.h" static asn_TYPE_member_t asn_MBR_SUPLSTART_1[] = { { ATF_NOFLAGS, 0, offsetof(struct SUPLSTART, sETCapabilities), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SETCapabilities, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "sETCapabilities" }, { ATF_NOFLAGS, 0, offsetof(struct SUPLSTART, locationId), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_LocationId, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "locationId" }, { ATF_POINTER, 1, offsetof(struct SUPLSTART, qoP), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_QoP, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "qoP" }, }; static int asn_MAP_SUPLSTART_oms_1[] = { 2 }; static ber_tlv_tag_t asn_DEF_SUPLSTART_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_SUPLSTART_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* sETCapabilities at 10 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* locationId at 11 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* qoP at 12 */ }; static asn_SEQUENCE_specifics_t asn_SPC_SUPLSTART_specs_1 = { sizeof(struct SUPLSTART), offsetof(struct SUPLSTART, _asn_ctx), asn_MAP_SUPLSTART_tag2el_1, 3, /* Count of tags in the map */ asn_MAP_SUPLSTART_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ 2, /* Start extensions */ 4 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_SUPLSTART = { "SUPLSTART", "SUPLSTART", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SUPLSTART_tags_1, sizeof(asn_DEF_SUPLSTART_tags_1) /sizeof(asn_DEF_SUPLSTART_tags_1[0]), /* 1 */ asn_DEF_SUPLSTART_tags_1, /* Same as above */ sizeof(asn_DEF_SUPLSTART_tags_1) /sizeof(asn_DEF_SUPLSTART_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_SUPLSTART_1, 3, /* Elements count */ &asn_SPC_SUPLSTART_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SUPLSTART.h000066400000000000000000000016271305042567700222460ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-START" * found in "../supl-start.asn" */ #ifndef _SUPLSTART_H_ #define _SUPLSTART_H_ #include /* Including external dependencies */ #include "SETCapabilities.h" #include "LocationId.h" #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct QoP; /* SUPLSTART */ typedef struct SUPLSTART { SETCapabilities_t sETCapabilities; LocationId_t locationId; struct QoP *qoP /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SUPLSTART_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SUPLSTART; #ifdef __cplusplus } #endif /* Referred external types */ #include "QoP.h" #endif /* _SUPLSTART_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SatelliteInfo.c000066400000000000000000000032101305042567700233700ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-POS-INIT" * found in "../supl-posinit.asn" */ #include "SatelliteInfo.h" static asn_per_constraints_t asn_PER_type_SatelliteInfo_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 5, 5, 1, 31 } /* (SIZE(1..31)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SatelliteInfo_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, &asn_DEF_SatelliteInfoElement, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_SatelliteInfo_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_SatelliteInfo_specs_1 = { sizeof(struct SatelliteInfo), offsetof(struct SatelliteInfo, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_SatelliteInfo = { "SatelliteInfo", "SatelliteInfo", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SatelliteInfo_tags_1, sizeof(asn_DEF_SatelliteInfo_tags_1) /sizeof(asn_DEF_SatelliteInfo_tags_1[0]), /* 1 */ asn_DEF_SatelliteInfo_tags_1, /* Same as above */ sizeof(asn_DEF_SatelliteInfo_tags_1) /sizeof(asn_DEF_SatelliteInfo_tags_1[0]), /* 1 */ &asn_PER_type_SatelliteInfo_constr_1, asn_MBR_SatelliteInfo_1, 1, /* Single element */ &asn_SPC_SatelliteInfo_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SatelliteInfo.h000066400000000000000000000015151305042567700234030ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-POS-INIT" * found in "../supl-posinit.asn" */ #ifndef _SatelliteInfo_H_ #define _SatelliteInfo_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct SatelliteInfoElement; /* SatelliteInfo */ typedef struct SatelliteInfo { A_SEQUENCE_OF(struct SatelliteInfoElement) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SatelliteInfo_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SatelliteInfo; #ifdef __cplusplus } #endif /* Referred external types */ #include "SatelliteInfoElement.h" #endif /* _SatelliteInfo_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SatelliteInfoElement.c000066400000000000000000000070551305042567700247150ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-POS-INIT" * found in "../supl-posinit.asn" */ #include "SatelliteInfoElement.h" static int memb_satId_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 63)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_iODE_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 255)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_satId_constr_2 = { { APC_CONSTRAINED, 6, 6, 0, 63 } /* (0..63) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_iODE_constr_3 = { { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SatelliteInfoElement_1[] = { { ATF_NOFLAGS, 0, offsetof(struct SatelliteInfoElement, satId), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_satId_constraint_1, &asn_PER_memb_satId_constr_2, 0, "satId" }, { ATF_NOFLAGS, 0, offsetof(struct SatelliteInfoElement, iODE), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_iODE_constraint_1, &asn_PER_memb_iODE_constr_3, 0, "iODE" }, }; static ber_tlv_tag_t asn_DEF_SatelliteInfoElement_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_SatelliteInfoElement_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* satId at 50 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* iODE at 51 */ }; static asn_SEQUENCE_specifics_t asn_SPC_SatelliteInfoElement_specs_1 = { sizeof(struct SatelliteInfoElement), offsetof(struct SatelliteInfoElement, _asn_ctx), asn_MAP_SatelliteInfoElement_tag2el_1, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ 1, /* Start extensions */ 3 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_SatelliteInfoElement = { "SatelliteInfoElement", "SatelliteInfoElement", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SatelliteInfoElement_tags_1, sizeof(asn_DEF_SatelliteInfoElement_tags_1) /sizeof(asn_DEF_SatelliteInfoElement_tags_1[0]), /* 1 */ asn_DEF_SatelliteInfoElement_tags_1, /* Same as above */ sizeof(asn_DEF_SatelliteInfoElement_tags_1) /sizeof(asn_DEF_SatelliteInfoElement_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_SatelliteInfoElement_1, 2, /* Elements count */ &asn_SPC_SatelliteInfoElement_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SatelliteInfoElement.h000066400000000000000000000014611305042567700247150ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-POS-INIT" * found in "../supl-posinit.asn" */ #ifndef _SatelliteInfoElement_H_ #define _SatelliteInfoElement_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* SatelliteInfoElement */ typedef struct SatelliteInfoElement { long satId; long iODE; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SatelliteInfoElement_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SatelliteInfoElement; #ifdef __cplusplus } #endif #endif /* _SatelliteInfoElement_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SessionID.c000066400000000000000000000041571305042567700225010ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "SessionID.h" static asn_TYPE_member_t asn_MBR_SessionID_1[] = { { ATF_POINTER, 2, offsetof(struct SessionID, setSessionID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SetSessionID, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "setSessionID" }, { ATF_POINTER, 1, offsetof(struct SessionID, slpSessionID), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SlpSessionID, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "slpSessionID" }, }; static int asn_MAP_SessionID_oms_1[] = { 0, 1 }; static ber_tlv_tag_t asn_DEF_SessionID_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_SessionID_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* setSessionID at 15 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* slpSessionID at 16 */ }; static asn_SEQUENCE_specifics_t asn_SPC_SessionID_specs_1 = { sizeof(struct SessionID), offsetof(struct SessionID, _asn_ctx), asn_MAP_SessionID_tag2el_1, 2, /* Count of tags in the map */ asn_MAP_SessionID_oms_1, /* Optional members */ 2, 0, /* Root/Additions */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_SessionID = { "SessionID", "SessionID", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SessionID_tags_1, sizeof(asn_DEF_SessionID_tags_1) /sizeof(asn_DEF_SessionID_tags_1[0]), /* 1 */ asn_DEF_SessionID_tags_1, /* Same as above */ sizeof(asn_DEF_SessionID_tags_1) /sizeof(asn_DEF_SessionID_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_SessionID_1, 2, /* Elements count */ &asn_SPC_SessionID_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SessionID.h000066400000000000000000000015441305042567700225030ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _SessionID_H_ #define _SessionID_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct SetSessionID; struct SlpSessionID; /* SessionID */ typedef struct SessionID { struct SetSessionID *setSessionID /* OPTIONAL */; struct SlpSessionID *slpSessionID /* OPTIONAL */; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SessionID_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SessionID; #ifdef __cplusplus } #endif /* Referred external types */ #include "SetSessionID.h" #include "SlpSessionID.h" #endif /* _SessionID_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SetSessionID.c000066400000000000000000000054001305042567700231450ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "SetSessionID.h" static int memb_sessionId_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 65535)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_sessionId_constr_2 = { { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SetSessionID_1[] = { { ATF_NOFLAGS, 0, offsetof(struct SetSessionID, sessionId), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_sessionId_constraint_1, &asn_PER_memb_sessionId_constr_2, 0, "sessionId" }, { ATF_NOFLAGS, 0, offsetof(struct SetSessionID, setId), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), +1, /* EXPLICIT tag at current level */ &asn_DEF_SETId, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "setId" }, }; static ber_tlv_tag_t asn_DEF_SetSessionID_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_SetSessionID_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* sessionId at 18 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* setId at 19 */ }; static asn_SEQUENCE_specifics_t asn_SPC_SetSessionID_specs_1 = { sizeof(struct SetSessionID), offsetof(struct SetSessionID, _asn_ctx), asn_MAP_SetSessionID_tag2el_1, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_SetSessionID = { "SetSessionID", "SetSessionID", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SetSessionID_tags_1, sizeof(asn_DEF_SetSessionID_tags_1) /sizeof(asn_DEF_SetSessionID_tags_1[0]), /* 1 */ asn_DEF_SetSessionID_tags_1, /* Same as above */ sizeof(asn_DEF_SetSessionID_tags_1) /sizeof(asn_DEF_SetSessionID_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_SetSessionID_1, 2, /* Elements count */ &asn_SPC_SetSessionID_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SetSessionID.h000066400000000000000000000013131305042567700231510ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _SetSessionID_H_ #define _SetSessionID_H_ #include /* Including external dependencies */ #include #include "SETId.h" #include #ifdef __cplusplus extern "C" { #endif /* SetSessionID */ typedef struct SetSessionID { long sessionId; SETId_t setId; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SetSessionID_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SetSessionID; #ifdef __cplusplus } #endif #endif /* _SetSessionID_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SlpSessionID.c000066400000000000000000000054341305042567700231570ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "SlpSessionID.h" static int memb_sessionID_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } size = st->size; if((size == 4)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_sessionID_constr_2 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 4, 4 } /* (SIZE(4..4)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_SlpSessionID_1[] = { { ATF_NOFLAGS, 0, offsetof(struct SlpSessionID, sessionID), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_OCTET_STRING, memb_sessionID_constraint_1, &asn_PER_memb_sessionID_constr_2, 0, "sessionID" }, { ATF_NOFLAGS, 0, offsetof(struct SlpSessionID, slpId), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), +1, /* EXPLICIT tag at current level */ &asn_DEF_SLPAddress, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "slpId" }, }; static ber_tlv_tag_t asn_DEF_SlpSessionID_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_SlpSessionID_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* sessionID at 37 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* slpId at 38 */ }; static asn_SEQUENCE_specifics_t asn_SPC_SlpSessionID_specs_1 = { sizeof(struct SlpSessionID), offsetof(struct SlpSessionID, _asn_ctx), asn_MAP_SlpSessionID_tag2el_1, 2, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_SlpSessionID = { "SlpSessionID", "SlpSessionID", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_SlpSessionID_tags_1, sizeof(asn_DEF_SlpSessionID_tags_1) /sizeof(asn_DEF_SlpSessionID_tags_1[0]), /* 1 */ asn_DEF_SlpSessionID_tags_1, /* Same as above */ sizeof(asn_DEF_SlpSessionID_tags_1) /sizeof(asn_DEF_SlpSessionID_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_SlpSessionID_1, 2, /* Elements count */ &asn_SPC_SlpSessionID_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/SlpSessionID.h000066400000000000000000000013361305042567700231610ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _SlpSessionID_H_ #define _SlpSessionID_H_ #include /* Including external dependencies */ #include #include "SLPAddress.h" #include #ifdef __cplusplus extern "C" { #endif /* SlpSessionID */ typedef struct SlpSessionID { OCTET_STRING_t sessionID; SLPAddress_t slpId; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } SlpSessionID_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_SlpSessionID; #ifdef __cplusplus } #endif #endif /* _SlpSessionID_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/Status.c000066400000000000000000000115401305042567700221160ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "Status.h" int Status_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { /* Replace with underlying type checker */ td->check_constraints = asn_DEF_ENUMERATED.check_constraints; return td->check_constraints(td, sptr, ctfailcb, app_key); } /* * This type is implemented using ENUMERATED, * so here we adjust the DEF accordingly. */ static void Status_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_ENUMERATED.free_struct; td->print_struct = asn_DEF_ENUMERATED.print_struct; td->ber_decoder = asn_DEF_ENUMERATED.ber_decoder; td->der_encoder = asn_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; td->uper_encoder = asn_DEF_ENUMERATED.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_ENUMERATED.per_constraints; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ } void Status_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { Status_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int Status_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { Status_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t Status_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { Status_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t Status_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { Status_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t Status_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { Status_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t Status_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { Status_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t Status_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { Status_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t Status_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { Status_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_Status_constr_1 = { { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 2 } /* (0..2,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_INTEGER_enum_map_t asn_MAP_Status_value2enum_1[] = { { 0, 5, "stale" }, { 1, 7, "current" }, { 2, 7, "unknown" } /* This list is extensible */ }; static unsigned int asn_MAP_Status_enum2value_1[] = { 1, /* current(1) */ 0, /* stale(0) */ 2 /* unknown(2) */ /* This list is extensible */ }; static asn_INTEGER_specifics_t asn_SPC_Status_specs_1 = { asn_MAP_Status_value2enum_1, /* "tag" => N; sorted by tag */ asn_MAP_Status_enum2value_1, /* N => "tag"; sorted by N */ 3, /* Number of elements in the maps */ 4, /* Extensions before this member */ 1, /* Strict enumeration */ 0, /* Native long size */ 0 }; static ber_tlv_tag_t asn_DEF_Status_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Status = { "Status", "Status", Status_free, Status_print, Status_constraint, Status_decode_ber, Status_encode_der, Status_decode_xer, Status_encode_xer, Status_decode_uper, Status_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_Status_tags_1, sizeof(asn_DEF_Status_tags_1) /sizeof(asn_DEF_Status_tags_1[0]), /* 1 */ asn_DEF_Status_tags_1, /* Same as above */ sizeof(asn_DEF_Status_tags_1) /sizeof(asn_DEF_Status_tags_1[0]), /* 1 */ &asn_PER_type_Status_constr_1, 0, 0, /* Defined elsewhere */ &asn_SPC_Status_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/Status.h000066400000000000000000000017321305042567700221250ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _Status_H_ #define _Status_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum Status { Status_stale = 0, Status_current = 1, Status_unknown = 2 /* * Enumeration is extensible */ } e_Status; /* Status */ typedef ENUMERATED_t Status_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Status; asn_struct_free_f Status_free; asn_struct_print_f Status_print; asn_constr_check_f Status_constraint; ber_type_decoder_f Status_decode_ber; der_type_encoder_f Status_encode_der; xer_type_decoder_f Status_decode_xer; xer_type_encoder_f Status_encode_xer; per_type_decoder_f Status_decode_uper; per_type_encoder_f Status_encode_uper; #ifdef __cplusplus } #endif #endif /* _Status_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/StatusCode.c000066400000000000000000000143211305042567700227110ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "StatusCode.h" int StatusCode_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { /* Replace with underlying type checker */ td->check_constraints = asn_DEF_ENUMERATED.check_constraints; return td->check_constraints(td, sptr, ctfailcb, app_key); } /* * This type is implemented using ENUMERATED, * so here we adjust the DEF accordingly. */ static void StatusCode_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_ENUMERATED.free_struct; td->print_struct = asn_DEF_ENUMERATED.print_struct; td->ber_decoder = asn_DEF_ENUMERATED.ber_decoder; td->der_encoder = asn_DEF_ENUMERATED.der_encoder; td->xer_decoder = asn_DEF_ENUMERATED.xer_decoder; td->xer_encoder = asn_DEF_ENUMERATED.xer_encoder; td->uper_decoder = asn_DEF_ENUMERATED.uper_decoder; td->uper_encoder = asn_DEF_ENUMERATED.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_ENUMERATED.per_constraints; td->elements = asn_DEF_ENUMERATED.elements; td->elements_count = asn_DEF_ENUMERATED.elements_count; /* td->specifics = asn_DEF_ENUMERATED.specifics; // Defined explicitly */ } void StatusCode_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { StatusCode_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int StatusCode_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { StatusCode_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t StatusCode_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { StatusCode_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t StatusCode_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { StatusCode_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t StatusCode_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { StatusCode_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t StatusCode_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { StatusCode_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t StatusCode_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { StatusCode_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t StatusCode_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { StatusCode_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_StatusCode_constr_1 = { { APC_CONSTRAINED | APC_EXTENSIBLE, 5, 5, 0, 19 } /* (0..19,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_INTEGER_enum_map_t asn_MAP_StatusCode_value2enum_1[] = { { 0, 11, "unspecified" }, { 1, 13, "systemFailure" }, { 2, 17, "unexpectedMessage" }, { 3, 13, "protocolError" }, { 4, 11, "dataMissing" }, { 5, 19, "unexpectedDataValue" }, { 6, 16, "posMethodFailure" }, { 7, 17, "posMethodMismatch" }, { 8, 19, "posProtocolMismatch" }, { 9, 21, "targetSETnotReachable" }, { 10, 19, "versionNotSupported" }, { 11, 16, "resourceShortage" }, { 12, 16, "invalidSessionId" }, { 13, 24, "nonProxyModeNotSupported" }, { 14, 21, "proxyModeNotSupported" }, { 15, 23, "positioningNotPermitted" }, { 16, 14, "authNetFailure" }, { 17, 19, "authSuplinitFailure" }, { 100, 19, "consentDeniedByUser" }, { 101, 20, "consentGrantedByUser" } /* This list is extensible */ }; static unsigned int asn_MAP_StatusCode_enum2value_1[] = { 16, /* authNetFailure(16) */ 17, /* authSuplinitFailure(17) */ 18, /* consentDeniedByUser(100) */ 19, /* consentGrantedByUser(101) */ 4, /* dataMissing(4) */ 12, /* invalidSessionId(12) */ 13, /* nonProxyModeNotSupported(13) */ 6, /* posMethodFailure(6) */ 7, /* posMethodMismatch(7) */ 8, /* posProtocolMismatch(8) */ 15, /* positioningNotPermitted(15) */ 3, /* protocolError(3) */ 14, /* proxyModeNotSupported(14) */ 11, /* resourceShortage(11) */ 1, /* systemFailure(1) */ 9, /* targetSETnotReachable(9) */ 5, /* unexpectedDataValue(5) */ 2, /* unexpectedMessage(2) */ 0, /* unspecified(0) */ 10 /* versionNotSupported(10) */ /* This list is extensible */ }; static asn_INTEGER_specifics_t asn_SPC_StatusCode_specs_1 = { asn_MAP_StatusCode_value2enum_1, /* "tag" => N; sorted by tag */ asn_MAP_StatusCode_enum2value_1, /* N => "tag"; sorted by N */ 20, /* Number of elements in the maps */ 21, /* Extensions before this member */ 1, /* Strict enumeration */ 0, /* Native long size */ 0 }; static ber_tlv_tag_t asn_DEF_StatusCode_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) }; asn_TYPE_descriptor_t asn_DEF_StatusCode = { "StatusCode", "StatusCode", StatusCode_free, StatusCode_print, StatusCode_constraint, StatusCode_decode_ber, StatusCode_encode_der, StatusCode_decode_xer, StatusCode_encode_xer, StatusCode_decode_uper, StatusCode_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_StatusCode_tags_1, sizeof(asn_DEF_StatusCode_tags_1) /sizeof(asn_DEF_StatusCode_tags_1[0]), /* 1 */ asn_DEF_StatusCode_tags_1, /* Same as above */ sizeof(asn_DEF_StatusCode_tags_1) /sizeof(asn_DEF_StatusCode_tags_1[0]), /* 1 */ &asn_PER_type_StatusCode_constr_1, 0, 0, /* Defined elsewhere */ &asn_SPC_StatusCode_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/StatusCode.h000066400000000000000000000032611305042567700227170ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _StatusCode_H_ #define _StatusCode_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum StatusCode { StatusCode_unspecified = 0, StatusCode_systemFailure = 1, StatusCode_unexpectedMessage = 2, StatusCode_protocolError = 3, StatusCode_dataMissing = 4, StatusCode_unexpectedDataValue = 5, StatusCode_posMethodFailure = 6, StatusCode_posMethodMismatch = 7, StatusCode_posProtocolMismatch = 8, StatusCode_targetSETnotReachable = 9, StatusCode_versionNotSupported = 10, StatusCode_resourceShortage = 11, StatusCode_invalidSessionId = 12, StatusCode_nonProxyModeNotSupported = 13, StatusCode_proxyModeNotSupported = 14, StatusCode_positioningNotPermitted = 15, StatusCode_authNetFailure = 16, StatusCode_authSuplinitFailure = 17, StatusCode_consentDeniedByUser = 100, StatusCode_consentGrantedByUser = 101 /* * Enumeration is extensible */ } e_StatusCode; /* StatusCode */ typedef ENUMERATED_t StatusCode_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_StatusCode; asn_struct_free_f StatusCode_free; asn_struct_print_f StatusCode_print; asn_constr_check_f StatusCode_constraint; ber_type_decoder_f StatusCode_decode_ber; der_type_encoder_f StatusCode_encode_der; xer_type_decoder_f StatusCode_decode_xer; xer_type_encoder_f StatusCode_encode_xer; per_type_decoder_f StatusCode_decode_uper; per_type_encoder_f StatusCode_encode_uper; #ifdef __cplusplus } #endif #endif /* _StatusCode_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/TGSN.c000066400000000000000000000105111305042567700214030ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "TGSN.h" int TGSN_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 14)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void TGSN_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void TGSN_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { TGSN_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int TGSN_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { TGSN_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t TGSN_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { TGSN_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t TGSN_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { TGSN_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t TGSN_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { TGSN_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t TGSN_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { TGSN_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t TGSN_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { TGSN_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t TGSN_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { TGSN_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_TGSN_constr_1 = { { APC_CONSTRAINED, 4, 4, 0, 14 } /* (0..14) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_TGSN_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_TGSN = { "TGSN", "TGSN", TGSN_free, TGSN_print, TGSN_constraint, TGSN_decode_ber, TGSN_encode_der, TGSN_decode_xer, TGSN_encode_xer, TGSN_decode_uper, TGSN_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_TGSN_tags_1, sizeof(asn_DEF_TGSN_tags_1) /sizeof(asn_DEF_TGSN_tags_1[0]), /* 1 */ asn_DEF_TGSN_tags_1, /* Same as above */ sizeof(asn_DEF_TGSN_tags_1) /sizeof(asn_DEF_TGSN_tags_1[0]), /* 1 */ &asn_PER_type_TGSN_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/TGSN.h000066400000000000000000000014361305042567700214160ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _TGSN_H_ #define _TGSN_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* TGSN */ typedef long TGSN_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_TGSN; asn_struct_free_f TGSN_free; asn_struct_print_f TGSN_print; asn_constr_check_f TGSN_constraint; ber_type_decoder_f TGSN_decode_ber; der_type_encoder_f TGSN_encode_der; xer_type_decoder_f TGSN_decode_xer; xer_type_encoder_f TGSN_encode_xer; per_type_decoder_f TGSN_decode_uper; per_type_encoder_f TGSN_encode_uper; #ifdef __cplusplus } #endif #endif /* _TGSN_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/TimeslotISCP-List.c000066400000000000000000000033131305042567700240220ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "TimeslotISCP-List.h" static asn_per_constraints_t asn_PER_type_TimeslotISCP_List_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 4, 4, 1, 14 } /* (SIZE(1..14)) */, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_TimeslotISCP_List_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, &asn_DEF_TimeslotISCP, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "" }, }; static ber_tlv_tag_t asn_DEF_TimeslotISCP_List_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_SET_OF_specifics_t asn_SPC_TimeslotISCP_List_specs_1 = { sizeof(struct TimeslotISCP_List), offsetof(struct TimeslotISCP_List, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; asn_TYPE_descriptor_t asn_DEF_TimeslotISCP_List = { "TimeslotISCP-List", "TimeslotISCP-List", SEQUENCE_OF_free, SEQUENCE_OF_print, SEQUENCE_OF_constraint, SEQUENCE_OF_decode_ber, SEQUENCE_OF_encode_der, SEQUENCE_OF_decode_xer, SEQUENCE_OF_encode_xer, SEQUENCE_OF_decode_uper, SEQUENCE_OF_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_TimeslotISCP_List_tags_1, sizeof(asn_DEF_TimeslotISCP_List_tags_1) /sizeof(asn_DEF_TimeslotISCP_List_tags_1[0]), /* 1 */ asn_DEF_TimeslotISCP_List_tags_1, /* Same as above */ sizeof(asn_DEF_TimeslotISCP_List_tags_1) /sizeof(asn_DEF_TimeslotISCP_List_tags_1[0]), /* 1 */ &asn_PER_type_TimeslotISCP_List_constr_1, asn_MBR_TimeslotISCP_List_1, 1, /* Single element */ &asn_SPC_TimeslotISCP_List_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/TimeslotISCP-List.h000066400000000000000000000013741305042567700240340ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _TimeslotISCP_List_H_ #define _TimeslotISCP_List_H_ #include /* Including external dependencies */ #include "TimeslotISCP.h" #include #include #ifdef __cplusplus extern "C" { #endif /* TimeslotISCP-List */ typedef struct TimeslotISCP_List { A_SEQUENCE_OF(TimeslotISCP_t) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } TimeslotISCP_List_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_TimeslotISCP_List; #ifdef __cplusplus } #endif #endif /* _TimeslotISCP_List_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/TimeslotISCP.c000066400000000000000000000112141305042567700231100ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "TimeslotISCP.h" int TimeslotISCP_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void TimeslotISCP_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void TimeslotISCP_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { TimeslotISCP_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int TimeslotISCP_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { TimeslotISCP_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t TimeslotISCP_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { TimeslotISCP_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t TimeslotISCP_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { TimeslotISCP_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t TimeslotISCP_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { TimeslotISCP_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t TimeslotISCP_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { TimeslotISCP_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t TimeslotISCP_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { TimeslotISCP_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t TimeslotISCP_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { TimeslotISCP_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_TimeslotISCP_constr_1 = { { APC_CONSTRAINED, 7, 7, 0, 127 } /* (0..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_TimeslotISCP_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_TimeslotISCP = { "TimeslotISCP", "TimeslotISCP", TimeslotISCP_free, TimeslotISCP_print, TimeslotISCP_constraint, TimeslotISCP_decode_ber, TimeslotISCP_encode_der, TimeslotISCP_decode_xer, TimeslotISCP_encode_xer, TimeslotISCP_decode_uper, TimeslotISCP_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_TimeslotISCP_tags_1, sizeof(asn_DEF_TimeslotISCP_tags_1) /sizeof(asn_DEF_TimeslotISCP_tags_1[0]), /* 1 */ asn_DEF_TimeslotISCP_tags_1, /* Same as above */ sizeof(asn_DEF_TimeslotISCP_tags_1) /sizeof(asn_DEF_TimeslotISCP_tags_1[0]), /* 1 */ &asn_PER_type_TimeslotISCP_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/TimeslotISCP.h000066400000000000000000000016261305042567700231230ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _TimeslotISCP_H_ #define _TimeslotISCP_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* TimeslotISCP */ typedef long TimeslotISCP_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_TimeslotISCP; asn_struct_free_f TimeslotISCP_free; asn_struct_print_f TimeslotISCP_print; asn_constr_check_f TimeslotISCP_constraint; ber_type_decoder_f TimeslotISCP_decode_ber; der_type_encoder_f TimeslotISCP_encode_der; xer_type_decoder_f TimeslotISCP_decode_xer; xer_type_encoder_f TimeslotISCP_encode_xer; per_type_decoder_f TimeslotISCP_decode_uper; per_type_encoder_f TimeslotISCP_encode_uper; #ifdef __cplusplus } #endif #endif /* _TimeslotISCP_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/UARFCN.c000066400000000000000000000106441305042567700216150ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "UARFCN.h" int UARFCN_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 16383)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void UARFCN_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void UARFCN_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { UARFCN_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int UARFCN_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { UARFCN_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t UARFCN_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { UARFCN_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t UARFCN_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { UARFCN_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t UARFCN_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { UARFCN_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t UARFCN_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { UARFCN_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t UARFCN_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { UARFCN_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t UARFCN_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { UARFCN_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_UARFCN_constr_1 = { { APC_CONSTRAINED, 14, 14, 0, 16383 } /* (0..16383) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_UARFCN_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_UARFCN = { "UARFCN", "UARFCN", UARFCN_free, UARFCN_print, UARFCN_constraint, UARFCN_decode_ber, UARFCN_encode_der, UARFCN_decode_xer, UARFCN_encode_xer, UARFCN_decode_uper, UARFCN_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_UARFCN_tags_1, sizeof(asn_DEF_UARFCN_tags_1) /sizeof(asn_DEF_UARFCN_tags_1[0]), /* 1 */ asn_DEF_UARFCN_tags_1, /* Same as above */ sizeof(asn_DEF_UARFCN_tags_1) /sizeof(asn_DEF_UARFCN_tags_1[0]), /* 1 */ &asn_PER_type_UARFCN_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/UARFCN.h000066400000000000000000000014741305042567700216230ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _UARFCN_H_ #define _UARFCN_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* UARFCN */ typedef long UARFCN_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_UARFCN; asn_struct_free_f UARFCN_free; asn_struct_print_f UARFCN_print; asn_constr_check_f UARFCN_constraint; ber_type_decoder_f UARFCN_decode_ber; der_type_encoder_f UARFCN_encode_der; xer_type_decoder_f UARFCN_decode_xer; xer_type_encoder_f UARFCN_encode_xer; per_type_decoder_f UARFCN_decode_uper; per_type_encoder_f UARFCN_encode_uper; #ifdef __cplusplus } #endif #endif /* _UARFCN_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/ULP-PDU.c000066400000000000000000000064671305042567700217350ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP" * found in "../supl-ulp.asn" */ #include "ULP-PDU.h" static int memb_length_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 65535)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_length_constr_2 = { { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_ULP_PDU_1[] = { { ATF_NOFLAGS, 0, offsetof(struct ULP_PDU, length), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_length_constraint_1, &asn_PER_memb_length_constr_2, 0, "length" }, { ATF_NOFLAGS, 0, offsetof(struct ULP_PDU, version), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Version, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "version" }, { ATF_NOFLAGS, 0, offsetof(struct ULP_PDU, sessionID), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SessionID, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "sessionID" }, { ATF_NOFLAGS, 0, offsetof(struct ULP_PDU, message), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), +1, /* EXPLICIT tag at current level */ &asn_DEF_UlpMessage, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "message" }, }; static ber_tlv_tag_t asn_DEF_ULP_PDU_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_ULP_PDU_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* length at 31 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* version at 32 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* sessionID at 33 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* message at 34 */ }; static asn_SEQUENCE_specifics_t asn_SPC_ULP_PDU_specs_1 = { sizeof(struct ULP_PDU), offsetof(struct ULP_PDU, _asn_ctx), asn_MAP_ULP_PDU_tag2el_1, 4, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_ULP_PDU = { "ULP-PDU", "ULP-PDU", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_ULP_PDU_tags_1, sizeof(asn_DEF_ULP_PDU_tags_1) /sizeof(asn_DEF_ULP_PDU_tags_1[0]), /* 1 */ asn_DEF_ULP_PDU_tags_1, /* Same as above */ sizeof(asn_DEF_ULP_PDU_tags_1) /sizeof(asn_DEF_ULP_PDU_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_ULP_PDU_1, 4, /* Elements count */ &asn_SPC_ULP_PDU_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/ULP-PDU.h000066400000000000000000000013751305042567700217330ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP" * found in "../supl-ulp.asn" */ #ifndef _ULP_PDU_H_ #define _ULP_PDU_H_ #include /* Including external dependencies */ #include #include "Version.h" #include "SessionID.h" #include "UlpMessage.h" #include #ifdef __cplusplus extern "C" { #endif /* ULP-PDU */ typedef struct ULP_PDU { long length; Version_t version; SessionID_t sessionID; UlpMessage_t message; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } ULP_PDU_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_ULP_PDU; #ifdef __cplusplus } #endif #endif /* _ULP_PDU_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/UTCTime.c000066400000000000000000000106611305042567700221100ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include #include #ifdef __CYGWIN__ #include "/usr/include/time.h" #else #include #endif /* __CYGWIN__ */ #ifndef __ASN_INTERNAL_TEST_MODE__ /* * UTCTime basic type description. */ static ber_tlv_tag_t asn_DEF_UTCTime_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (23 << 2)), /* [UNIVERSAL 23] IMPLICIT ...*/ (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), /* [UNIVERSAL 26] IMPLICIT ...*/ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; static asn_per_constraints_t asn_DEF_UTCTime_constraints = { { APC_CONSTRAINED, 7, 7, 0x20, 0x7e }, /* Value */ { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 }, /* Size */ 0, 0 }; asn_TYPE_descriptor_t asn_DEF_UTCTime = { "UTCTime", "UTCTime", OCTET_STRING_free, UTCTime_print, UTCTime_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ OCTET_STRING_decode_xer_utf8, UTCTime_encode_xer, OCTET_STRING_decode_uper, OCTET_STRING_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_UTCTime_tags, sizeof(asn_DEF_UTCTime_tags) / sizeof(asn_DEF_UTCTime_tags[0]) - 2, asn_DEF_UTCTime_tags, sizeof(asn_DEF_UTCTime_tags) / sizeof(asn_DEF_UTCTime_tags[0]), &asn_DEF_UTCTime_constraints, 0, 0, /* No members */ 0 /* No specifics */ }; #endif /* __ASN_INTERNAL_TEST_MODE__ */ /* * Check that the time looks like the time. */ int UTCTime_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const UTCTime_t *st = (const UTCTime_t *)sptr; time_t tloc; errno = EPERM; /* Just an unlikely error code */ tloc = asn_UT2time(st, 0, 0); if(tloc == -1 && errno != EPERM) { _ASN_CTFAIL(app_key, td, sptr, "%s: Invalid time format: %s (%s:%d)", td->name, strerror(errno), __FILE__, __LINE__); return -1; } return 0; } #ifndef __ASN_INTERNAL_TEST_MODE__ asn_enc_rval_t UTCTime_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { if(flags & XER_F_CANONICAL) { asn_enc_rval_t rv; UTCTime_t *ut; struct tm tm; errno = EPERM; if(asn_UT2time((UTCTime_t *)sptr, &tm, 1) == -1 && errno != EPERM) _ASN_ENCODE_FAILED; /* Fractions are not allowed in UTCTime */ ut = asn_time2GT(0, 0, 1); if(!ut) _ASN_ENCODE_FAILED; rv = OCTET_STRING_encode_xer_utf8(td, sptr, ilevel, flags, cb, app_key); OCTET_STRING_free(&asn_DEF_UTCTime, ut, 0); return rv; } else { return OCTET_STRING_encode_xer_utf8(td, sptr, ilevel, flags, cb, app_key); } } #endif /* __ASN_INTERNAL_TEST_MODE__ */ int UTCTime_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { const UTCTime_t *st = (const UTCTime_t *)sptr; (void)td; /* Unused argument */ (void)ilevel; /* Unused argument */ if(st && st->buf) { char buf[32]; struct tm tm; int ret; errno = EPERM; if(asn_UT2time(st, &tm, 1) == -1 && errno != EPERM) return (cb("", 11, app_key) < 0) ? -1 : 0; ret = snprintf(buf, sizeof(buf), "%04d-%02d-%02d %02d:%02d:%02d (GMT)", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); assert(ret > 0 && ret < (int)sizeof(buf)); return (cb(buf, ret, app_key) < 0) ? -1 : 0; } else { return (cb("", 8, app_key) < 0) ? -1 : 0; } } time_t asn_UT2time(const UTCTime_t *st, struct tm *_tm, int as_gmt) { char buf[24]; /* "AAMMJJhhmmss+hhmm" + cushion */ GeneralizedTime_t gt; if(!st || !st->buf || st->size < 11 || st->size >= ((int)sizeof(buf) - 2)) { errno = EINVAL; return -1; } gt.buf = (unsigned char *)buf; gt.size = st->size + 2; memcpy(gt.buf + 2, st->buf, st->size); if(st->buf[0] > 0x35) { /* 19xx */ gt.buf[0] = 0x31; gt.buf[1] = 0x39; } else { /* 20xx */ gt.buf[0] = 0x32; gt.buf[1] = 0x30; } return asn_GT2time(>, _tm, as_gmt); } UTCTime_t * asn_time2UT(UTCTime_t *opt_ut, const struct tm *tm, int force_gmt) { GeneralizedTime_t *gt = (GeneralizedTime_t *)opt_ut; gt = asn_time2GT(gt, tm, force_gmt); if(gt == 0) return 0; assert(gt->size >= 2); gt->size -= 2; memmove(gt->buf, gt->buf + 2, gt->size + 1); return (UTCTime_t *)gt; } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/UTCTime.h000066400000000000000000000016161305042567700221150ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _UTCTime_H_ #define _UTCTime_H_ #include #ifdef __cplusplus extern "C" { #endif typedef OCTET_STRING_t UTCTime_t; /* Implemented via OCTET STRING */ extern asn_TYPE_descriptor_t asn_DEF_UTCTime; asn_struct_print_f UTCTime_print; asn_constr_check_f UTCTime_constraint; xer_type_encoder_f UTCTime_encode_xer; /*********************** * Some handy helpers. * ***********************/ struct tm; /* */ /* See asn_GT2time() in GeneralizedTime.h */ time_t asn_UT2time(const UTCTime_t *, struct tm *_optional_tm4fill, int as_gmt); /* See asn_time2GT() in GeneralizedTime.h */ UTCTime_t *asn_time2UT(UTCTime_t *__opt_ut, const struct tm *, int force_gmt); #ifdef __cplusplus } #endif #endif /* _UTCTime_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/UTRA-CarrierRSSI.c000066400000000000000000000114541305042567700235000ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "UTRA-CarrierRSSI.h" int UTRA_CarrierRSSI_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 127)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using NativeInteger, * so here we adjust the DEF accordingly. */ static void UTRA_CarrierRSSI_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_NativeInteger.free_struct; td->print_struct = asn_DEF_NativeInteger.print_struct; td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; td->der_encoder = asn_DEF_NativeInteger.der_encoder; td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_NativeInteger.per_constraints; td->elements = asn_DEF_NativeInteger.elements; td->elements_count = asn_DEF_NativeInteger.elements_count; td->specifics = asn_DEF_NativeInteger.specifics; } void UTRA_CarrierRSSI_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { UTRA_CarrierRSSI_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int UTRA_CarrierRSSI_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { UTRA_CarrierRSSI_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t UTRA_CarrierRSSI_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { UTRA_CarrierRSSI_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t UTRA_CarrierRSSI_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { UTRA_CarrierRSSI_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t UTRA_CarrierRSSI_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { UTRA_CarrierRSSI_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t UTRA_CarrierRSSI_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { UTRA_CarrierRSSI_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t UTRA_CarrierRSSI_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { UTRA_CarrierRSSI_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t UTRA_CarrierRSSI_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { UTRA_CarrierRSSI_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_UTRA_CarrierRSSI_constr_1 = { { APC_CONSTRAINED, 7, 7, 0, 127 } /* (0..127) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_UTRA_CarrierRSSI_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) }; asn_TYPE_descriptor_t asn_DEF_UTRA_CarrierRSSI = { "UTRA-CarrierRSSI", "UTRA-CarrierRSSI", UTRA_CarrierRSSI_free, UTRA_CarrierRSSI_print, UTRA_CarrierRSSI_constraint, UTRA_CarrierRSSI_decode_ber, UTRA_CarrierRSSI_encode_der, UTRA_CarrierRSSI_decode_xer, UTRA_CarrierRSSI_encode_xer, UTRA_CarrierRSSI_decode_uper, UTRA_CarrierRSSI_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_UTRA_CarrierRSSI_tags_1, sizeof(asn_DEF_UTRA_CarrierRSSI_tags_1) /sizeof(asn_DEF_UTRA_CarrierRSSI_tags_1[0]), /* 1 */ asn_DEF_UTRA_CarrierRSSI_tags_1, /* Same as above */ sizeof(asn_DEF_UTRA_CarrierRSSI_tags_1) /sizeof(asn_DEF_UTRA_CarrierRSSI_tags_1[0]), /* 1 */ &asn_PER_type_UTRA_CarrierRSSI_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/UTRA-CarrierRSSI.h000066400000000000000000000017221305042567700235020ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _UTRA_CarrierRSSI_H_ #define _UTRA_CarrierRSSI_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* UTRA-CarrierRSSI */ typedef long UTRA_CarrierRSSI_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_UTRA_CarrierRSSI; asn_struct_free_f UTRA_CarrierRSSI_free; asn_struct_print_f UTRA_CarrierRSSI_print; asn_constr_check_f UTRA_CarrierRSSI_constraint; ber_type_decoder_f UTRA_CarrierRSSI_decode_ber; der_type_encoder_f UTRA_CarrierRSSI_encode_der; xer_type_decoder_f UTRA_CarrierRSSI_decode_xer; xer_type_encoder_f UTRA_CarrierRSSI_encode_xer; per_type_decoder_f UTRA_CarrierRSSI_decode_uper; per_type_encoder_f UTRA_CarrierRSSI_encode_uper; #ifdef __cplusplus } #endif #endif /* _UTRA_CarrierRSSI_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/UlpMessage.c000066400000000000000000000102201305042567700226720ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP" * found in "../supl-ulp.asn" */ #include "UlpMessage.h" static asn_per_constraints_t asn_PER_type_UlpMessage_constr_1 = { { APC_CONSTRAINED | APC_EXTENSIBLE, 3, 3, 0, 7 } /* (0..7,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_UlpMessage_1[] = { { ATF_NOFLAGS, 0, offsetof(struct UlpMessage, choice.msSUPLINIT), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SUPLINIT, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "msSUPLINIT" }, { ATF_NOFLAGS, 0, offsetof(struct UlpMessage, choice.msSUPLSTART), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SUPLSTART, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "msSUPLSTART" }, { ATF_NOFLAGS, 0, offsetof(struct UlpMessage, choice.msSUPLRESPONSE), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SUPLRESPONSE, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "msSUPLRESPONSE" }, { ATF_NOFLAGS, 0, offsetof(struct UlpMessage, choice.msSUPLPOSINIT), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SUPLPOSINIT, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "msSUPLPOSINIT" }, { ATF_NOFLAGS, 0, offsetof(struct UlpMessage, choice.msSUPLPOS), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SUPLPOS, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "msSUPLPOS" }, { ATF_NOFLAGS, 0, offsetof(struct UlpMessage, choice.msSUPLEND), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SUPLEND, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "msSUPLEND" }, { ATF_NOFLAGS, 0, offsetof(struct UlpMessage, choice.msDUMMY2), (ASN_TAG_CLASS_CONTEXT | (6 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_DUMMY, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "msDUMMY2" }, { ATF_NOFLAGS, 0, offsetof(struct UlpMessage, choice.msDUMMY3), (ASN_TAG_CLASS_CONTEXT | (7 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_DUMMY, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "msDUMMY3" }, }; static asn_TYPE_tag2member_t asn_MAP_UlpMessage_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* msSUPLINIT at 37 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* msSUPLSTART at 38 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* msSUPLRESPONSE at 39 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* msSUPLPOSINIT at 40 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* msSUPLPOS at 41 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* msSUPLEND at 42 */ { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* msDUMMY2 at 44 */ { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 } /* msDUMMY3 at 46 */ }; static asn_CHOICE_specifics_t asn_SPC_UlpMessage_specs_1 = { sizeof(struct UlpMessage), offsetof(struct UlpMessage, _asn_ctx), offsetof(struct UlpMessage, present), sizeof(((struct UlpMessage *)0)->present), asn_MAP_UlpMessage_tag2el_1, 8, /* Count of tags in the map */ 0, 8 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_UlpMessage = { "UlpMessage", "UlpMessage", CHOICE_free, CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_decode_uper, CHOICE_encode_uper, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ &asn_PER_type_UlpMessage_constr_1, asn_MBR_UlpMessage_1, 8, /* Elements count */ &asn_SPC_UlpMessage_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/UlpMessage.h000066400000000000000000000027061305042567700227110ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP" * found in "../supl-ulp.asn" */ #ifndef _UlpMessage_H_ #define _UlpMessage_H_ #include /* Including external dependencies */ #include "SUPLINIT.h" #include "SUPLSTART.h" #include "SUPLRESPONSE.h" #include "SUPLPOSINIT.h" #include "SUPLPOS.h" #include "SUPLEND.h" #include "DUMMY.h" #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum UlpMessage_PR { UlpMessage_PR_NOTHING, /* No components present */ UlpMessage_PR_msSUPLINIT, UlpMessage_PR_msSUPLSTART, UlpMessage_PR_msSUPLRESPONSE, UlpMessage_PR_msSUPLPOSINIT, UlpMessage_PR_msSUPLPOS, UlpMessage_PR_msSUPLEND, UlpMessage_PR_msDUMMY2, UlpMessage_PR_msDUMMY3, /* Extensions may appear below */ } UlpMessage_PR; /* UlpMessage */ typedef struct UlpMessage { UlpMessage_PR present; union UlpMessage_u { SUPLINIT_t msSUPLINIT; SUPLSTART_t msSUPLSTART; SUPLRESPONSE_t msSUPLRESPONSE; SUPLPOSINIT_t msSUPLPOSINIT; SUPLPOS_t msSUPLPOS; SUPLEND_t msSUPLEND; DUMMY_t msDUMMY2; DUMMY_t msDUMMY3; /* * This type is extensible, * possible extensions are below. */ } choice; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } UlpMessage_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_UlpMessage; #ifdef __cplusplus } #endif #endif /* _UlpMessage_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/Velocity.c000066400000000000000000000053401305042567700224320ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "Velocity.h" static asn_per_constraints_t asn_PER_type_Velocity_constr_1 = { { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 3 } /* (0..3,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_Velocity_1[] = { { ATF_NOFLAGS, 0, offsetof(struct Velocity, choice.horvel), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Horvel, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "horvel" }, { ATF_NOFLAGS, 0, offsetof(struct Velocity, choice.horandvervel), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Horandvervel, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "horandvervel" }, { ATF_NOFLAGS, 0, offsetof(struct Velocity, choice.horveluncert), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Horveluncert, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "horveluncert" }, { ATF_NOFLAGS, 0, offsetof(struct Velocity, choice.horandveruncert), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_Horandveruncert, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "horandveruncert" }, }; static asn_TYPE_tag2member_t asn_MAP_Velocity_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* horvel at 226 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* horandvervel at 227 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* horveluncert at 228 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* horandveruncert at 229 */ }; static asn_CHOICE_specifics_t asn_SPC_Velocity_specs_1 = { sizeof(struct Velocity), offsetof(struct Velocity, _asn_ctx), offsetof(struct Velocity, present), sizeof(((struct Velocity *)0)->present), asn_MAP_Velocity_tag2el_1, 4, /* Count of tags in the map */ 0, 4 /* Extensions start */ }; asn_TYPE_descriptor_t asn_DEF_Velocity = { "Velocity", "Velocity", CHOICE_free, CHOICE_print, CHOICE_constraint, CHOICE_decode_ber, CHOICE_encode_der, CHOICE_decode_xer, CHOICE_encode_xer, CHOICE_decode_uper, CHOICE_encode_uper, CHOICE_outmost_tag, 0, /* No effective tags (pointer) */ 0, /* No effective tags (count) */ 0, /* No tags (pointer) */ 0, /* No tags (count) */ &asn_PER_type_Velocity_constr_1, asn_MBR_Velocity_1, 4, /* Elements count */ &asn_SPC_Velocity_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/Velocity.h000066400000000000000000000022731305042567700224410ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _Velocity_H_ #define _Velocity_H_ #include /* Including external dependencies */ #include "Horvel.h" #include "Horandvervel.h" #include "Horveluncert.h" #include "Horandveruncert.h" #include #ifdef __cplusplus extern "C" { #endif /* Dependencies */ typedef enum Velocity_PR { Velocity_PR_NOTHING, /* No components present */ Velocity_PR_horvel, Velocity_PR_horandvervel, Velocity_PR_horveluncert, Velocity_PR_horandveruncert, /* Extensions may appear below */ } Velocity_PR; /* Velocity */ typedef struct Velocity { Velocity_PR present; union Velocity_u { Horvel_t horvel; Horandvervel_t horandvervel; Horveluncert_t horveluncert; Horandveruncert_t horandveruncert; /* * This type is extensible, * possible extensions are below. */ } choice; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } Velocity_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Velocity; #ifdef __cplusplus } #endif #endif /* _Velocity_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/Ver.c000066400000000000000000000106001305042567700213630ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "Ver.h" int Ver_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; size_t size; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } if(st->size > 0) { /* Size in bits */ size = 8 * st->size - (st->bits_unused & 0x07); } else { size = 0; } if((size == 64)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } /* * This type is implemented using BIT_STRING, * so here we adjust the DEF accordingly. */ static void Ver_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { td->free_struct = asn_DEF_BIT_STRING.free_struct; td->print_struct = asn_DEF_BIT_STRING.print_struct; td->ber_decoder = asn_DEF_BIT_STRING.ber_decoder; td->der_encoder = asn_DEF_BIT_STRING.der_encoder; td->xer_decoder = asn_DEF_BIT_STRING.xer_decoder; td->xer_encoder = asn_DEF_BIT_STRING.xer_encoder; td->uper_decoder = asn_DEF_BIT_STRING.uper_decoder; td->uper_encoder = asn_DEF_BIT_STRING.uper_encoder; if(!td->per_constraints) td->per_constraints = asn_DEF_BIT_STRING.per_constraints; td->elements = asn_DEF_BIT_STRING.elements; td->elements_count = asn_DEF_BIT_STRING.elements_count; td->specifics = asn_DEF_BIT_STRING.specifics; } void Ver_free(asn_TYPE_descriptor_t *td, void *struct_ptr, int contents_only) { Ver_1_inherit_TYPE_descriptor(td); td->free_struct(td, struct_ptr, contents_only); } int Ver_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { Ver_1_inherit_TYPE_descriptor(td); return td->print_struct(td, struct_ptr, ilevel, cb, app_key); } asn_dec_rval_t Ver_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const void *bufptr, size_t size, int tag_mode) { Ver_1_inherit_TYPE_descriptor(td); return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); } asn_enc_rval_t Ver_encode_der(asn_TYPE_descriptor_t *td, void *structure, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { Ver_1_inherit_TYPE_descriptor(td); return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); } asn_dec_rval_t Ver_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **structure, const char *opt_mname, const void *bufptr, size_t size) { Ver_1_inherit_TYPE_descriptor(td); return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); } asn_enc_rval_t Ver_encode_xer(asn_TYPE_descriptor_t *td, void *structure, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { Ver_1_inherit_TYPE_descriptor(td); return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); } asn_dec_rval_t Ver_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) { Ver_1_inherit_TYPE_descriptor(td); return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data); } asn_enc_rval_t Ver_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *structure, asn_per_outp_t *per_out) { Ver_1_inherit_TYPE_descriptor(td); return td->uper_encoder(td, constraints, structure, per_out); } static asn_per_constraints_t asn_PER_type_Ver_constr_1 = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 0, 0, 64, 64 } /* (SIZE(64..64)) */, 0, 0 /* No PER value map */ }; static ber_tlv_tag_t asn_DEF_Ver_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)) }; asn_TYPE_descriptor_t asn_DEF_Ver = { "Ver", "Ver", Ver_free, Ver_print, Ver_constraint, Ver_decode_ber, Ver_encode_der, Ver_decode_xer, Ver_encode_xer, Ver_decode_uper, Ver_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_Ver_tags_1, sizeof(asn_DEF_Ver_tags_1) /sizeof(asn_DEF_Ver_tags_1[0]), /* 1 */ asn_DEF_Ver_tags_1, /* Same as above */ sizeof(asn_DEF_Ver_tags_1) /sizeof(asn_DEF_Ver_tags_1[0]), /* 1 */ &asn_PER_type_Ver_constr_1, 0, 0, /* No members */ 0 /* No specifics */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/Ver.h000066400000000000000000000014241305042567700213740ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _Ver_H_ #define _Ver_H_ #include /* Including external dependencies */ #include #ifdef __cplusplus extern "C" { #endif /* Ver */ typedef BIT_STRING_t Ver_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Ver; asn_struct_free_f Ver_free; asn_struct_print_f Ver_print; asn_constr_check_f Ver_constraint; ber_type_decoder_f Ver_decode_ber; der_type_encoder_f Ver_encode_der; xer_type_decoder_f Ver_decode_xer; xer_type_encoder_f Ver_encode_xer; per_type_decoder_f Ver_decode_uper; per_type_encoder_f Ver_encode_uper; #ifdef __cplusplus } #endif #endif /* _Ver_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/Version.c000066400000000000000000000104371305042567700222640ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "Version.h" static int memb_maj_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 255)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_min_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 255)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_servind_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 255)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_maj_constr_2 = { { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_min_constr_3 = { { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_servind_constr_4 = { { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_Version_1[] = { { ATF_NOFLAGS, 0, offsetof(struct Version, maj), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_maj_constraint_1, &asn_PER_memb_maj_constr_2, 0, "maj" }, { ATF_NOFLAGS, 0, offsetof(struct Version, min), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_min_constraint_1, &asn_PER_memb_min_constr_3, 0, "min" }, { ATF_NOFLAGS, 0, offsetof(struct Version, servind), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_servind_constraint_1, &asn_PER_memb_servind_constr_4, 0, "servind" }, }; static ber_tlv_tag_t asn_DEF_Version_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_Version_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* maj at 10 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* min at 11 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* servind at 12 */ }; static asn_SEQUENCE_specifics_t asn_SPC_Version_specs_1 = { sizeof(struct Version), offsetof(struct Version, _asn_ctx), asn_MAP_Version_tag2el_1, 3, /* Count of tags in the map */ 0, 0, 0, /* Optional elements (not needed) */ -1, /* Start extensions */ -1 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_Version = { "Version", "Version", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_Version_tags_1, sizeof(asn_DEF_Version_tags_1) /sizeof(asn_DEF_Version_tags_1[0]), /* 1 */ asn_DEF_Version_tags_1, /* Same as above */ sizeof(asn_DEF_Version_tags_1) /sizeof(asn_DEF_Version_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_Version_1, 3, /* Elements count */ &asn_SPC_Version_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/Version.h000066400000000000000000000012321305042567700222620ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _Version_H_ #define _Version_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Version */ typedef struct Version { long maj; long min; long servind; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } Version_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_Version; #ifdef __cplusplus } #endif #endif /* _Version_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/VisibleString.c000066400000000000000000000042751305042567700234260ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2006 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include /* * VisibleString basic type description. */ static ber_tlv_tag_t asn_DEF_VisibleString_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (26 << 2)), /* [UNIVERSAL 26] IMPLICIT ...*/ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; static asn_per_constraints_t asn_DEF_VisibleString_constraints = { { APC_CONSTRAINED, 7, 7, 0x20, 0x7e }, /* Value */ { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 }, /* Size */ 0, 0 }; asn_TYPE_descriptor_t asn_DEF_VisibleString = { "VisibleString", "VisibleString", OCTET_STRING_free, OCTET_STRING_print_utf8, /* ASCII subset */ VisibleString_constraint, OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ OCTET_STRING_encode_der, OCTET_STRING_decode_xer_utf8, OCTET_STRING_encode_xer_utf8, OCTET_STRING_decode_uper, OCTET_STRING_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_VisibleString_tags, sizeof(asn_DEF_VisibleString_tags) / sizeof(asn_DEF_VisibleString_tags[0]) - 1, asn_DEF_VisibleString_tags, sizeof(asn_DEF_VisibleString_tags) / sizeof(asn_DEF_VisibleString_tags[0]), &asn_DEF_VisibleString_constraints, 0, 0, /* No members */ 0 /* No specifics */ }; int VisibleString_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { const VisibleString_t *st = (const VisibleString_t *)sptr; if(st && st->buf) { uint8_t *buf = st->buf; uint8_t *end = buf + st->size; /* * Check the alphabet of the VisibleString. * ISO646, ISOReg#6 * The alphabet is a subset of ASCII between the space * and "~" (tilde). */ for(; buf < end; buf++) { if(*buf < 0x20 || *buf > 0x7e) { _ASN_CTFAIL(app_key, td, sptr, "%s: value byte %ld (%d) " "not in VisibleString alphabet (%s:%d)", td->name, (long)((buf - st->buf) + 1), *buf, __FILE__, __LINE__); return -1; } } } else { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } return 0; } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/VisibleString.h000066400000000000000000000007771305042567700234360ustar00rootroot00000000000000/*- * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _VisibleString_H_ #define _VisibleString_H_ #include #ifdef __cplusplus extern "C" { #endif typedef OCTET_STRING_t VisibleString_t; /* Implemented via OCTET STRING */ extern asn_TYPE_descriptor_t asn_DEF_VisibleString; asn_constr_check_f VisibleString_constraint; #ifdef __cplusplus } #endif #endif /* _VisibleString_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/WcdmaCellInformation.c000066400000000000000000000151601305042567700246760ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #include "WcdmaCellInformation.h" static int memb_refMCC_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 999)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_refMNC_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 999)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_refUC_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 268435455)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_primaryScramblingCode_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 511)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_refMCC_constr_2 = { { APC_CONSTRAINED, 10, 10, 0, 999 } /* (0..999) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_refMNC_constr_3 = { { APC_CONSTRAINED, 10, 10, 0, 999 } /* (0..999) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_refUC_constr_4 = { { APC_CONSTRAINED, 28, -1, 0, 268435455 } /* (0..268435455) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_primaryScramblingCode_constr_6 = { { APC_CONSTRAINED, 9, 9, 0, 511 } /* (0..511) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_WcdmaCellInformation_1[] = { { ATF_NOFLAGS, 0, offsetof(struct WcdmaCellInformation, refMCC), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_refMCC_constraint_1, &asn_PER_memb_refMCC_constr_2, 0, "refMCC" }, { ATF_NOFLAGS, 0, offsetof(struct WcdmaCellInformation, refMNC), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_refMNC_constraint_1, &asn_PER_memb_refMNC_constr_3, 0, "refMNC" }, { ATF_NOFLAGS, 0, offsetof(struct WcdmaCellInformation, refUC), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_refUC_constraint_1, &asn_PER_memb_refUC_constr_4, 0, "refUC" }, { ATF_POINTER, 3, offsetof(struct WcdmaCellInformation, frequencyInfo), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_FrequencyInfo, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "frequencyInfo" }, { ATF_POINTER, 2, offsetof(struct WcdmaCellInformation, primaryScramblingCode), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_primaryScramblingCode_constraint_1, &asn_PER_memb_primaryScramblingCode_constr_6, 0, "primaryScramblingCode" }, { ATF_POINTER, 1, offsetof(struct WcdmaCellInformation, measuredResultsList), (ASN_TAG_CLASS_CONTEXT | (5 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_MeasuredResultsList, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "measuredResultsList" }, }; static int asn_MAP_WcdmaCellInformation_oms_1[] = { 3, 4, 5 }; static ber_tlv_tag_t asn_DEF_WcdmaCellInformation_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_WcdmaCellInformation_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* refMCC at 112 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* refMNC at 113 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* refUC at 114 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* frequencyInfo at 115 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* primaryScramblingCode at 116 */ { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 } /* measuredResultsList at 117 */ }; static asn_SEQUENCE_specifics_t asn_SPC_WcdmaCellInformation_specs_1 = { sizeof(struct WcdmaCellInformation), offsetof(struct WcdmaCellInformation, _asn_ctx), asn_MAP_WcdmaCellInformation_tag2el_1, 6, /* Count of tags in the map */ asn_MAP_WcdmaCellInformation_oms_1, /* Optional members */ 3, 0, /* Root/Additions */ 5, /* Start extensions */ 7 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_WcdmaCellInformation = { "WcdmaCellInformation", "WcdmaCellInformation", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_WcdmaCellInformation_tags_1, sizeof(asn_DEF_WcdmaCellInformation_tags_1) /sizeof(asn_DEF_WcdmaCellInformation_tags_1[0]), /* 1 */ asn_DEF_WcdmaCellInformation_tags_1, /* Same as above */ sizeof(asn_DEF_WcdmaCellInformation_tags_1) /sizeof(asn_DEF_WcdmaCellInformation_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_WcdmaCellInformation_1, 6, /* Elements count */ &asn_SPC_WcdmaCellInformation_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/WcdmaCellInformation.h000066400000000000000000000022161305042567700247010ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "ULP-Components" * found in "../supl-common.asn" */ #ifndef _WcdmaCellInformation_H_ #define _WcdmaCellInformation_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct FrequencyInfo; struct MeasuredResultsList; /* WcdmaCellInformation */ typedef struct WcdmaCellInformation { long refMCC; long refMNC; long refUC; struct FrequencyInfo *frequencyInfo /* OPTIONAL */; long *primaryScramblingCode /* OPTIONAL */; struct MeasuredResultsList *measuredResultsList /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } WcdmaCellInformation_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_WcdmaCellInformation; #ifdef __cplusplus } #endif /* Referred external types */ #include "FrequencyInfo.h" #include "MeasuredResultsList.h" #endif /* _WcdmaCellInformation_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/XNavigationModel.c000066400000000000000000000137421305042567700240510ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-POS-INIT" * found in "../supl-posinit.asn" */ #include "XNavigationModel.h" static int memb_gpsWeek_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 1023)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_gpsToe_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 167)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_nSAT_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 31)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static int memb_toeLimit_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { long value; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } value = *(const long *)sptr; if((value >= 0 && value <= 10)) { /* Constraint check succeeded */ return 0; } else { _ASN_CTFAIL(app_key, td, sptr, "%s: constraint failed (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } static asn_per_constraints_t asn_PER_memb_gpsWeek_constr_2 = { { APC_CONSTRAINED, 10, 10, 0, 1023 } /* (0..1023) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_gpsToe_constr_3 = { { APC_CONSTRAINED, 8, 8, 0, 167 } /* (0..167) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_nSAT_constr_4 = { { APC_CONSTRAINED, 5, 5, 0, 31 } /* (0..31) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_per_constraints_t asn_PER_memb_toeLimit_constr_5 = { { APC_CONSTRAINED, 4, 4, 0, 10 } /* (0..10) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; static asn_TYPE_member_t asn_MBR_XNavigationModel_1[] = { { ATF_NOFLAGS, 0, offsetof(struct XNavigationModel, gpsWeek), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_gpsWeek_constraint_1, &asn_PER_memb_gpsWeek_constr_2, 0, "gpsWeek" }, { ATF_NOFLAGS, 0, offsetof(struct XNavigationModel, gpsToe), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_gpsToe_constraint_1, &asn_PER_memb_gpsToe_constr_3, 0, "gpsToe" }, { ATF_NOFLAGS, 0, offsetof(struct XNavigationModel, nSAT), (ASN_TAG_CLASS_CONTEXT | (2 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_nSAT_constraint_1, &asn_PER_memb_nSAT_constr_4, 0, "nSAT" }, { ATF_NOFLAGS, 0, offsetof(struct XNavigationModel, toeLimit), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_NativeInteger, memb_toeLimit_constraint_1, &asn_PER_memb_toeLimit_constr_5, 0, "toeLimit" }, { ATF_POINTER, 1, offsetof(struct XNavigationModel, satInfo), (ASN_TAG_CLASS_CONTEXT | (4 << 2)), -1, /* IMPLICIT tag at current level */ &asn_DEF_SatelliteInfo, 0, /* Defer constraints checking to the member type */ 0, /* No PER visible constraints */ 0, "satInfo" }, }; static int asn_MAP_XNavigationModel_oms_1[] = { 4 }; static ber_tlv_tag_t asn_DEF_XNavigationModel_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; static asn_TYPE_tag2member_t asn_MAP_XNavigationModel_tag2el_1[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* gpsWeek at 38 */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* gpsToe at 39 */ { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* nSAT at 40 */ { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* toeLimit at 41 */ { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* satInfo at 42 */ }; static asn_SEQUENCE_specifics_t asn_SPC_XNavigationModel_specs_1 = { sizeof(struct XNavigationModel), offsetof(struct XNavigationModel, _asn_ctx), asn_MAP_XNavigationModel_tag2el_1, 5, /* Count of tags in the map */ asn_MAP_XNavigationModel_oms_1, /* Optional members */ 1, 0, /* Root/Additions */ 4, /* Start extensions */ 6 /* Stop extensions */ }; asn_TYPE_descriptor_t asn_DEF_XNavigationModel = { "XNavigationModel", "XNavigationModel", SEQUENCE_free, SEQUENCE_print, SEQUENCE_constraint, SEQUENCE_decode_ber, SEQUENCE_encode_der, SEQUENCE_decode_xer, SEQUENCE_encode_xer, SEQUENCE_decode_uper, SEQUENCE_encode_uper, 0, /* Use generic outmost tag fetcher */ asn_DEF_XNavigationModel_tags_1, sizeof(asn_DEF_XNavigationModel_tags_1) /sizeof(asn_DEF_XNavigationModel_tags_1[0]), /* 1 */ asn_DEF_XNavigationModel_tags_1, /* Same as above */ sizeof(asn_DEF_XNavigationModel_tags_1) /sizeof(asn_DEF_XNavigationModel_tags_1[0]), /* 1 */ 0, /* No PER visible constraints */ asn_MBR_XNavigationModel_1, 5, /* Elements count */ &asn_SPC_XNavigationModel_specs_1 /* Additional specs */ }; gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/XNavigationModel.h000066400000000000000000000017221305042567700240510ustar00rootroot00000000000000/* * Generated by asn1c-0.9.22 (http://lionet.info/asn1c) * From ASN.1 module "SUPL-POS-INIT" * found in "../supl-posinit.asn" */ #ifndef _XNavigationModel_H_ #define _XNavigationModel_H_ #include /* Including external dependencies */ #include #include #ifdef __cplusplus extern "C" { #endif /* Forward declarations */ struct SatelliteInfo; /* XNavigationModel */ typedef struct XNavigationModel { long gpsWeek; long gpsToe; long nSAT; long toeLimit; struct SatelliteInfo *satInfo /* OPTIONAL */; /* * This type is extensible, * possible extensions are below. */ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } XNavigationModel_t; /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_XNavigationModel; #ifdef __cplusplus } #endif /* Referred external types */ #include "SatelliteInfo.h" #endif /* _XNavigationModel_H_ */ #include gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/asn_SEQUENCE_OF.c000066400000000000000000000015601305042567700232710ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include typedef A_SEQUENCE_OF(void) asn_sequence; void asn_sequence_del(void *asn_sequence_of_x, int number, int _do_free) { asn_sequence *as = (asn_sequence *)asn_sequence_of_x; if(as) { void *ptr; int n; if(number < 0 || number >= as->count) return; /* Nothing to delete */ if(_do_free && as->free) { ptr = as->array[number]; } else { ptr = 0; } /* * Shift all elements to the left to hide the gap. */ --as->count; for(n = number; n < as->count; n++) as->array[n] = as->array[n+1]; /* * Invoke the third-party function only when the state * of the parent structure is consistent. */ if(ptr) as->free(ptr); } } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/asn_SEQUENCE_OF.h000066400000000000000000000027351305042567700233030ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef ASN_SEQUENCE_OF_H #define ASN_SEQUENCE_OF_H #include #ifdef __cplusplus extern "C" { #endif /* * SEQUENCE OF is the same as SET OF with a tiny difference: * the delete operation preserves the initial order of elements * and thus MAY operate in non-constant time. */ #define A_SEQUENCE_OF(type) A_SET_OF(type) #define ASN_SEQUENCE_ADD(headptr, ptr) \ asn_sequence_add((headptr), (ptr)) /*********************************************** * Implementation of the SEQUENCE OF structure. */ #define asn_sequence_add asn_set_add #define asn_sequence_empty asn_set_empty /* * Delete the element from the set by its number (base 0). * This is NOT a constant-time operation. * The order of elements is preserved. * If _do_free is given AND the (*free) is initialized, the element * will be freed using the custom (*free) function as well. */ void asn_sequence_del(void *asn_sequence_of_x, int number, int _do_free); /* * Cope with different conversions requirements to/from void in C and C++. * This is mostly useful for support library. */ typedef A_SEQUENCE_OF(void) asn_anonymous_sequence_; #define _A_SEQUENCE_FROM_VOID(ptr) ((asn_anonymous_sequence_ *)(ptr)) #define _A_CSEQUENCE_FROM_VOID(ptr) ((const asn_anonymous_sequence_ *)(ptr)) #ifdef __cplusplus } #endif #endif /* ASN_SEQUENCE_OF_H */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/asn_SET_OF.c000066400000000000000000000032521305042567700225140ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include /* * Add another element into the set. */ int asn_set_add(void *asn_set_of_x, void *ptr) { asn_anonymous_set_ *as = _A_SET_FROM_VOID(asn_set_of_x); if(as == 0 || ptr == 0) { errno = EINVAL; /* Invalid arguments */ return -1; } /* * Make sure there's enough space to insert an element. */ if(as->count == as->size) { int _newsize = as->size ? (as->size << 1) : 4; void *_new_arr; _new_arr = REALLOC(as->array, _newsize * sizeof(as->array[0])); if(_new_arr) { as->array = (void **)_new_arr; as->size = _newsize; } else { /* ENOMEM */ return -1; } } as->array[as->count++] = ptr; return 0; } void asn_set_del(void *asn_set_of_x, int number, int _do_free) { asn_anonymous_set_ *as = _A_SET_FROM_VOID(asn_set_of_x); if(as) { void *ptr; if(number < 0 || number >= as->count) return; if(_do_free && as->free) { ptr = as->array[number]; } else { ptr = 0; } as->array[number] = as->array[--as->count]; /* * Invoke the third-party function only when the state * of the parent structure is consistent. */ if(ptr) as->free(ptr); } } /* * Free the contents of the set, do not free the set itself. */ void asn_set_empty(void *asn_set_of_x) { asn_anonymous_set_ *as = _A_SET_FROM_VOID(asn_set_of_x); if(as) { if(as->array) { if(as->free) { while(as->count--) as->free(as->array[as->count]); } FREEMEM(as->array); as->array = 0; } as->count = 0; as->size = 0; } } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/asn_SET_OF.h000066400000000000000000000032331305042567700225200ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef ASN_SET_OF_H #define ASN_SET_OF_H #ifdef __cplusplus extern "C" { #endif #define A_SET_OF(type) \ struct { \ type **array; \ int count; /* Meaningful size */ \ int size; /* Allocated size */ \ void (*free)(type *); \ } #define ASN_SET_ADD(headptr, ptr) \ asn_set_add((headptr), (ptr)) /******************************************* * Implementation of the SET OF structure. */ /* * Add another structure into the set by its pointer. * RETURN VALUES: * 0 for success and -1/errno for failure. */ int asn_set_add(void *asn_set_of_x, void *ptr); /* * Delete the element from the set by its number (base 0). * This is a constant-time operation. The order of elements before the * deleted ones is guaranteed, the order of elements after the deleted * one is NOT guaranteed. * If _do_free is given AND the (*free) is initialized, the element * will be freed using the custom (*free) function as well. */ void asn_set_del(void *asn_set_of_x, int number, int _do_free); /* * Empty the contents of the set. Will free the elements, if (*free) is given. * Will NOT free the set itself. */ void asn_set_empty(void *asn_set_of_x); /* * Cope with different conversions requirements to/from void in C and C++. * This is mostly useful for support library. */ typedef A_SET_OF(void) asn_anonymous_set_; #define _A_SET_FROM_VOID(ptr) ((asn_anonymous_set_ *)(ptr)) #define _A_CSET_FROM_VOID(ptr) ((const asn_anonymous_set_ *)(ptr)) #ifdef __cplusplus } #endif #endif /* ASN_SET_OF_H */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/asn_application.h000066400000000000000000000027161305042567700240110ustar00rootroot00000000000000/*- * Copyright (c) 2004, 2006 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ /* * Application-level ASN.1 callbacks. */ #ifndef _ASN_APPLICATION_H_ #define _ASN_APPLICATION_H_ #include "asn_system.h" /* for platform-dependent types */ #include "asn_codecs.h" /* for ASN.1 codecs specifics */ #ifdef __cplusplus extern "C" { #endif /* * Generic type of an application-defined callback to return various * types of data to the application. * EXPECTED RETURN VALUES: * -1: Failed to consume bytes. Abort the mission. * Non-negative return values indicate success, and ignored. */ typedef int (asn_app_consume_bytes_f)(const void *buffer, size_t size, void *application_specific_key); /* * A callback of this type is called whenever constraint validation fails * on some ASN.1 type. See "constraints.h" for more details on constraint * validation. * This callback specifies a descriptor of the ASN.1 type which failed * the constraint check, as well as human readable message on what * particular constraint has failed. */ typedef void (asn_app_constraint_failed_f)(void *application_specific_key, struct asn_TYPE_descriptor_s *type_descriptor_which_failed, const void *structure_which_failed_ptr, const char *error_message_format, ...) GCC_PRINTFLIKE(4, 5); #ifdef __cplusplus } #endif #include "constr_TYPE.h" /* for asn_TYPE_descriptor_t */ #endif /* _ASN_APPLICATION_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/asn_codecs.h000066400000000000000000000065451305042567700227520ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004, 2005 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _ASN_CODECS_H_ #define _ASN_CODECS_H_ #ifdef __cplusplus extern "C" { #endif struct asn_TYPE_descriptor_s; /* Forward declaration */ /* * This structure defines a set of parameters that may be passed * to every ASN.1 encoder or decoder function. * WARNING: if max_stack_size member is set, and you are calling the * function pointers of the asn_TYPE_descriptor_t directly, * this structure must be ALLOCATED ON THE STACK! * If you can't always satisfy this requirement, use ber_decode(), * xer_decode() and uper_decode() functions instead. */ typedef struct asn_codec_ctx_s { /* * Limit the decoder routines to use no (much) more stack than a given * number of bytes. Most of decoders are stack-based, and this * would protect against stack overflows if the number of nested * encodings is high. * The OCTET STRING, BIT STRING and ANY BER decoders are heap-based, * and are safe from this kind of overflow. * A value from getrlimit(RLIMIT_STACK) may be used to initialize * this variable. Be careful in multithreaded environments, as the * stack size is rather limited. */ size_t max_stack_size; /* 0 disables stack bounds checking */ } asn_codec_ctx_t; /* * Type of the return value of the encoding functions (der_encode, xer_encode). */ typedef struct asn_enc_rval_s { /* * Number of bytes encoded. * -1 indicates failure to encode the structure. * In this case, the members below this one are meaningful. */ ssize_t encoded; /* * Members meaningful when (encoded == -1), for post mortem analysis. */ /* Type which cannot be encoded */ struct asn_TYPE_descriptor_s *failed_type; /* Pointer to the structure of that type */ void *structure_ptr; } asn_enc_rval_t; #define _ASN_ENCODE_FAILED do { \ asn_enc_rval_t tmp_error; \ tmp_error.encoded = -1; \ tmp_error.failed_type = td; \ tmp_error.structure_ptr = sptr; \ ASN_DEBUG("Failed to encode element %s", td->name); \ return tmp_error; \ } while(0) #define _ASN_ENCODED_OK(rval) do { \ rval.structure_ptr = 0; \ rval.failed_type = 0; \ return rval; \ } while(0) /* * Type of the return value of the decoding functions (ber_decode, xer_decode) * * Please note that the number of consumed bytes is ALWAYS meaningful, * even if code==RC_FAIL. This is to indicate the number of successfully * decoded bytes, hence providing a possibility to fail with more diagnostics * (i.e., print the offending remainder of the buffer). */ enum asn_dec_rval_code_e { RC_OK, /* Decoded successfully */ RC_WMORE, /* More data expected, call again */ RC_FAIL /* Failure to decode data */ }; typedef struct asn_dec_rval_s { enum asn_dec_rval_code_e code; /* Result code */ size_t consumed; /* Number of bytes consumed */ } asn_dec_rval_t; #define _ASN_DECODE_FAILED do { \ asn_dec_rval_t tmp_error; \ tmp_error.code = RC_FAIL; \ tmp_error.consumed = 0; \ ASN_DEBUG("Failed to decode element %s", td->name); \ return tmp_error; \ } while(0) #define _ASN_DECODE_STARVED do { \ asn_dec_rval_t tmp_error; \ tmp_error.code = RC_WMORE; \ tmp_error.consumed = 0; \ return tmp_error; \ } while(0) #ifdef __cplusplus } #endif #endif /* _ASN_CODECS_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/asn_codecs_prim.c000066400000000000000000000152311305042567700237640ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include /* * Decode an always-primitive type. */ asn_dec_rval_t ber_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const void *buf_ptr, size_t size, int tag_mode) { ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)*sptr; asn_dec_rval_t rval; ber_tlv_len_t length; /* * If the structure is not there, allocate it. */ if(st == NULL) { st = (ASN__PRIMITIVE_TYPE_t *)CALLOC(1, sizeof(*st)); if(st == NULL) _ASN_DECODE_FAILED; *sptr = (void *)st; } ASN_DEBUG("Decoding %s as plain primitive (tm=%d)", td->name, tag_mode); /* * Check tags and extract value length. */ rval = ber_check_tags(opt_codec_ctx, td, 0, buf_ptr, size, tag_mode, 0, &length, 0); if(rval.code != RC_OK) return rval; ASN_DEBUG("%s length is %d bytes", td->name, (int)length); /* * Make sure we have this length. */ buf_ptr = ((const char *)buf_ptr) + rval.consumed; size -= rval.consumed; if(length > (ber_tlv_len_t)size) { rval.code = RC_WMORE; rval.consumed = 0; return rval; } st->size = (int)length; /* The following better be optimized away. */ if(sizeof(st->size) != sizeof(length) && (ber_tlv_len_t)st->size != length) { st->size = 0; _ASN_DECODE_FAILED; } st->buf = (uint8_t *)MALLOC(length + 1); if(!st->buf) { st->size = 0; _ASN_DECODE_FAILED; } memcpy(st->buf, buf_ptr, length); st->buf[length] = '\0'; /* Just in case */ rval.code = RC_OK; rval.consumed += length; ASN_DEBUG("Took %ld/%ld bytes to encode %s", (long)rval.consumed, (long)length, td->name); return rval; } /* * Encode an always-primitive type using DER. */ asn_enc_rval_t der_encode_primitive(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t erval; ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)sptr; ASN_DEBUG("%s %s as a primitive type (tm=%d)", cb?"Encoding":"Estimating", td->name, tag_mode); erval.encoded = der_write_tags(td, st->size, tag_mode, 0, tag, cb, app_key); ASN_DEBUG("%s wrote tags %d", td->name, (int)erval.encoded); if(erval.encoded == -1) { erval.failed_type = td; erval.structure_ptr = sptr; return erval; } if(cb && st->buf) { if(cb(st->buf, st->size, app_key) < 0) { erval.encoded = -1; erval.failed_type = td; erval.structure_ptr = sptr; return erval; } } else { assert(st->buf || st->size == 0); } erval.encoded += st->size; _ASN_ENCODED_OK(erval); } void ASN__PRIMITIVE_TYPE_free(asn_TYPE_descriptor_t *td, void *sptr, int contents_only) { ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)sptr; if(!td || !sptr) return; ASN_DEBUG("Freeing %s as a primitive type", td->name); if(st->buf) FREEMEM(st->buf); if(!contents_only) FREEMEM(st); } /* * Local internal type passed around as an argument. */ struct xdp_arg_s { asn_TYPE_descriptor_t *type_descriptor; void *struct_key; xer_primitive_body_decoder_f *prim_body_decoder; int decoded_something; int want_more; }; static int xer_decode__unexpected_tag(void *key, const void *chunk_buf, size_t chunk_size) { struct xdp_arg_s *arg = (struct xdp_arg_s *)key; enum xer_pbd_rval bret; if(arg->decoded_something) { if(xer_is_whitespace(chunk_buf, chunk_size)) return 0; /* Skip it. */ /* * Decoding was done once already. Prohibit doing it again. */ return -1; } bret = arg->prim_body_decoder(arg->type_descriptor, arg->struct_key, chunk_buf, chunk_size); switch(bret) { case XPBD_SYSTEM_FAILURE: case XPBD_DECODER_LIMIT: case XPBD_BROKEN_ENCODING: break; case XPBD_BODY_CONSUMED: /* Tag decoded successfully */ arg->decoded_something = 1; /* Fall through */ case XPBD_NOT_BODY_IGNORE: /* Safe to proceed further */ return 0; } return -1; } static ssize_t xer_decode__body(void *key, const void *chunk_buf, size_t chunk_size, int have_more) { struct xdp_arg_s *arg = (struct xdp_arg_s *)key; enum xer_pbd_rval bret; if(arg->decoded_something) { if(xer_is_whitespace(chunk_buf, chunk_size)) return chunk_size; /* * Decoding was done once already. Prohibit doing it again. */ return -1; } if(!have_more) { /* * If we've received something like "1", we can't really * tell whether it is really `1` or `123`, until we know * that there is no more data coming. * The have_more argument will be set to 1 once something * like this is available to the caller of this callback: * "1want_more = 1; return -1; } bret = arg->prim_body_decoder(arg->type_descriptor, arg->struct_key, chunk_buf, chunk_size); switch(bret) { case XPBD_SYSTEM_FAILURE: case XPBD_DECODER_LIMIT: case XPBD_BROKEN_ENCODING: break; case XPBD_BODY_CONSUMED: /* Tag decoded successfully */ arg->decoded_something = 1; /* Fall through */ case XPBD_NOT_BODY_IGNORE: /* Safe to proceed further */ return chunk_size; } return -1; } asn_dec_rval_t xer_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, size_t struct_size, const char *opt_mname, const void *buf_ptr, size_t size, xer_primitive_body_decoder_f *prim_body_decoder ) { const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; asn_struct_ctx_t s_ctx; struct xdp_arg_s s_arg; asn_dec_rval_t rc; /* * Create the structure if does not exist. */ if(!*sptr) { *sptr = CALLOC(1, struct_size); if(!*sptr) _ASN_DECODE_FAILED; } memset(&s_ctx, 0, sizeof(s_ctx)); s_arg.type_descriptor = td; s_arg.struct_key = *sptr; s_arg.prim_body_decoder = prim_body_decoder; s_arg.decoded_something = 0; s_arg.want_more = 0; rc = xer_decode_general(opt_codec_ctx, &s_ctx, &s_arg, xml_tag, buf_ptr, size, xer_decode__unexpected_tag, xer_decode__body); switch(rc.code) { case RC_OK: if(!s_arg.decoded_something) { char ch; ASN_DEBUG("Primitive body is not recognized, " "supplying empty one"); /* * Decoding opportunity has come and gone. * Where's the result? * Try to feed with empty body, see if it eats it. */ if(prim_body_decoder(s_arg.type_descriptor, s_arg.struct_key, &ch, 0) != XPBD_BODY_CONSUMED) { /* * This decoder does not like empty stuff. */ _ASN_DECODE_FAILED; } } break; case RC_WMORE: /* * Redo the whole thing later. * We don't have a context to save intermediate parsing state. */ rc.consumed = 0; break; case RC_FAIL: rc.consumed = 0; if(s_arg.want_more) rc.code = RC_WMORE; else _ASN_DECODE_FAILED; break; } return rc; } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/asn_codecs_prim.h000066400000000000000000000031351305042567700237710ustar00rootroot00000000000000/*- * Copyright (c) 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef ASN_CODECS_PRIM_H #define ASN_CODECS_PRIM_H #include #ifdef __cplusplus extern "C" { #endif typedef struct ASN__PRIMITIVE_TYPE_s { uint8_t *buf; /* Buffer with consecutive primitive encoding bytes */ int size; /* Size of the buffer */ } ASN__PRIMITIVE_TYPE_t; /* Do not use this type directly! */ asn_struct_free_f ASN__PRIMITIVE_TYPE_free; ber_type_decoder_f ber_decode_primitive; der_type_encoder_f der_encode_primitive; /* * A callback specification for the xer_decode_primitive() function below. */ enum xer_pbd_rval { XPBD_SYSTEM_FAILURE, /* System failure (memory shortage, etc) */ XPBD_DECODER_LIMIT, /* Hit some decoder limitation or deficiency */ XPBD_BROKEN_ENCODING, /* Encoding of a primitive body is broken */ XPBD_NOT_BODY_IGNORE, /* Not a body format, but safe to ignore */ XPBD_BODY_CONSUMED /* Body is recognized and consumed */ }; typedef enum xer_pbd_rval (xer_primitive_body_decoder_f) (asn_TYPE_descriptor_t *td, void *struct_ptr, const void *chunk_buf, size_t chunk_size); /* * Specific function to decode simple primitive types. * Also see xer_decode_general() in xer_decoder.h */ asn_dec_rval_t xer_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *type_descriptor, void **struct_ptr, size_t struct_size, const char *opt_mname, const void *buf_ptr, size_t size, xer_primitive_body_decoder_f *prim_body_decoder ); #ifdef __cplusplus } #endif #endif /* ASN_CODECS_PRIM_H */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/asn_internal.h000066400000000000000000000067171305042567700233270ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004, 2005, 2007 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ /* * Declarations internally useful for the ASN.1 support code. */ #ifndef _ASN_INTERNAL_H_ #define _ASN_INTERNAL_H_ #include "asn_application.h" /* Application-visible API */ #ifndef __NO_ASSERT_H__ /* Include assert.h only for internal use. */ #include /* for assert() macro */ #endif #ifdef __cplusplus extern "C" { #endif /* Environment version might be used to avoid running with the old library */ #define ASN1C_ENVIRONMENT_VERSION 922 /* Compile-time version */ int get_asn1c_environment_version(void); /* Run-time version */ #define CALLOC(nmemb, size) calloc(nmemb, size) #define MALLOC(size) malloc(size) #define REALLOC(oldptr, size) realloc(oldptr, size) #define FREEMEM(ptr) free(ptr) /* * A macro for debugging the ASN.1 internals. * You may enable or override it. */ #ifndef ASN_DEBUG /* If debugging code is not defined elsewhere... */ #if EMIT_ASN_DEBUG == 1 /* And it was asked to emit this code... */ #ifdef __GNUC__ #ifdef ASN_THREAD_SAFE #define asn_debug_indent 0 #else /* !ASN_THREAD_SAFE */ int asn_debug_indent; #endif /* ASN_THREAD_SAFE */ #define ASN_DEBUG(fmt, args...) do { \ int adi = asn_debug_indent; \ while(adi--) fprintf(stderr, " "); \ fprintf(stderr, fmt, ##args); \ fprintf(stderr, " (%s:%d)\n", \ __FILE__, __LINE__); \ } while(0) #else /* !__GNUC__ */ void ASN_DEBUG_f(const char *fmt, ...); #define ASN_DEBUG ASN_DEBUG_f #endif /* __GNUC__ */ #else /* EMIT_ASN_DEBUG != 1 */ static inline void ASN_DEBUG(const char *fmt, ...) { (void)fmt; } #endif /* EMIT_ASN_DEBUG */ #endif /* ASN_DEBUG */ /* * Invoke the application-supplied callback and fail, if something is wrong. */ #define __ASN_E_cbc(buf, size) (cb((buf), (size), app_key) < 0) #define _ASN_E_CALLBACK(foo) do { \ if(foo) goto cb_failed; \ } while(0) #define _ASN_CALLBACK(buf, size) \ _ASN_E_CALLBACK(__ASN_E_cbc(buf, size)) #define _ASN_CALLBACK2(buf1, size1, buf2, size2) \ _ASN_E_CALLBACK(__ASN_E_cbc(buf1, size1) || __ASN_E_cbc(buf2, size2)) #define _ASN_CALLBACK3(buf1, size1, buf2, size2, buf3, size3) \ _ASN_E_CALLBACK(__ASN_E_cbc(buf1, size1) \ || __ASN_E_cbc(buf2, size2) \ || __ASN_E_cbc(buf3, size3)) #define _i_ASN_TEXT_INDENT(nl, level) do { \ int __level = (level); \ int __nl = ((nl) != 0); \ int __i; \ if(__nl) _ASN_CALLBACK("\n", 1); \ if(__level < 0) __level = 0; \ for(__i = 0; __i < __level; __i++) \ _ASN_CALLBACK(" ", 4); \ er.encoded += __nl + 4 * __level; \ } while(0) #define _i_INDENT(nl) do { \ int __i; \ if((nl) && cb("\n", 1, app_key) < 0) return -1; \ for(__i = 0; __i < ilevel; __i++) \ if(cb(" ", 4, app_key) < 0) return -1; \ } while(0) /* * Check stack against overflow, if limit is set. */ #define _ASN_DEFAULT_STACK_MAX (30000) static inline int _ASN_STACK_OVERFLOW_CHECK(asn_codec_ctx_t *ctx) { if(ctx && ctx->max_stack_size) { /* ctx MUST be allocated on the stack */ ptrdiff_t usedstack = ((char *)ctx - (char *)&ctx); if(usedstack > 0) usedstack = -usedstack; /* grows up! */ /* double negative required to avoid int wrap-around */ if(usedstack < -(ptrdiff_t)ctx->max_stack_size) { ASN_DEBUG("Stack limit %ld reached", (long)ctx->max_stack_size); return -1; } } return 0; } #ifdef __cplusplus } #endif #endif /* _ASN_INTERNAL_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/asn_system.h000066400000000000000000000064301305042567700230270ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004, 2007 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ /* * Miscellaneous system-dependent types. */ #ifndef _ASN_SYSTEM_H_ #define _ASN_SYSTEM_H_ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include /* For snprintf(3) */ #include /* For *alloc(3) */ #include /* For memcpy(3) */ #include /* For size_t */ #include /* For LONG_MAX */ #include /* For va_start */ #include /* for offsetof and ptrdiff_t */ #ifdef WIN32 #include #define snprintf _snprintf #define vsnprintf _vsnprintf /* To avoid linking with ws2_32.lib, here's the definition of ntohl() */ #define sys_ntohl(l) ((((l) << 24) & 0xff000000) \ | (((l) << 16) & 0xff0000) \ | (((l) << 8) & 0xff00) \ | ((l) & 0xff)) #ifdef _MSC_VER /* MSVS.Net */ #ifndef __cplusplus #define inline __inline #endif #ifndef ASSUMESTDTYPES /* Standard types have been defined elsewhere */ #define ssize_t SSIZE_T typedef char int8_t; typedef short int16_t; typedef int int32_t; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #endif /* ASSUMESTDTYPES */ #define WIN32_LEAN_AND_MEAN #include #include #define isnan _isnan #define finite _finite #define copysign _copysign #define ilogb _logb #else /* !_MSC_VER */ #include #endif /* _MSC_VER */ #else /* !WIN32 */ #if defined(__vxworks) #include #else /* !defined(__vxworks) */ #include /* C99 specifies this file */ /* * 1. Earlier FreeBSD version didn't have , * but was present. * 2. Sun Solaris requires for alloca(3), * but does not have . */ #if (!defined(__FreeBSD__) || !defined(_SYS_INTTYPES_H_)) #if defined(sun) #include /* For alloca(3) */ #include /* for finite(3) */ #elif defined(__hpux) #ifdef __GNUC__ #include /* For alloca(3) */ #else /* !__GNUC__ */ #define inline #endif /* __GNUC__ */ #else #include /* SUSv2+ and C99 specify this file, for uintXX_t */ #endif /* defined(sun) */ #endif #include /* for ntohl() */ #define sys_ntohl(foo) ntohl(foo) #endif /* defined(__vxworks) */ #endif /* WIN32 */ #if __GNUC__ >= 3 #ifndef GCC_PRINTFLIKE #define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var))) #endif #ifndef GCC_NOTUSED #define GCC_NOTUSED __attribute__((unused)) #endif #else #ifndef GCC_PRINTFLIKE #define GCC_PRINTFLIKE(fmt,var) /* nothing */ #endif #ifndef GCC_NOTUSED #define GCC_NOTUSED #endif #endif /* Figure out if thread safety is requested */ #if !defined(ASN_THREAD_SAFE) && (defined(THREAD_SAFE) || defined(_REENTRANT)) #define ASN_THREAD_SAFE #endif /* Thread safety */ #ifndef offsetof /* If not defined by */ #define offsetof(s, m) ((ptrdiff_t)&(((s *)0)->m) - (ptrdiff_t)((s *)0)) #endif /* offsetof */ #ifndef MIN /* Suitable for comparing primitive types (integers) */ #if defined(__GNUC__) #define MIN(a,b) ({ __typeof a _a = a; __typeof b _b = b; \ ((_a)<(_b)?(_a):(_b)); }) #else /* !__GNUC__ */ #define MIN(a,b) ((a)<(b)?(a):(b)) /* Unsafe variant */ #endif /* __GNUC__ */ #endif /* MIN */ #endif /* _ASN_SYSTEM_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/ber_decoder.c000066400000000000000000000167701305042567700231020ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #undef ADVANCE #define ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ ptr = ((const char *)ptr) + num; \ size -= num; \ consumed_myself += num; \ } while(0) #undef RETURN #define RETURN(_code) do { \ asn_dec_rval_t rval; \ rval.code = _code; \ if(opt_ctx) opt_ctx->step = step; /* Save context */ \ if(_code == RC_OK || opt_ctx) \ rval.consumed = consumed_myself; \ else \ rval.consumed = 0; /* Context-free */ \ return rval; \ } while(0) /* * The BER decoder of any type. */ asn_dec_rval_t ber_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *type_descriptor, void **struct_ptr, const void *ptr, size_t size) { asn_codec_ctx_t s_codec_ctx; /* * Stack checker requires that the codec context * must be allocated on the stack. */ if(opt_codec_ctx) { if(opt_codec_ctx->max_stack_size) { s_codec_ctx = *opt_codec_ctx; opt_codec_ctx = &s_codec_ctx; } } else { /* If context is not given, be security-conscious anyway */ memset(&s_codec_ctx, 0, sizeof(s_codec_ctx)); s_codec_ctx.max_stack_size = _ASN_DEFAULT_STACK_MAX; opt_codec_ctx = &s_codec_ctx; } /* * Invoke type-specific decoder. */ return type_descriptor->ber_decoder(opt_codec_ctx, type_descriptor, struct_ptr, /* Pointer to the destination structure */ ptr, size, /* Buffer and its size */ 0 /* Default tag mode is 0 */ ); } /* * Check the set of >> tags matches the definition. */ asn_dec_rval_t ber_check_tags(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_struct_ctx_t *opt_ctx, const void *ptr, size_t size, int tag_mode, int last_tag_form, ber_tlv_len_t *last_length, int *opt_tlv_form) { ssize_t consumed_myself = 0; ssize_t tag_len; ssize_t len_len; ber_tlv_tag_t tlv_tag; ber_tlv_len_t tlv_len; ber_tlv_len_t limit_len = -1; int expect_00_terminators = 0; int tlv_constr = -1; /* If CHOICE, opt_tlv_form is not given */ int step = opt_ctx ? opt_ctx->step : 0; /* Where we left previously */ int tagno; /* * Make sure we didn't exceed the maximum stack size. */ if(_ASN_STACK_OVERFLOW_CHECK(opt_codec_ctx)) RETURN(RC_FAIL); /* * So what does all this implicit skip stuff mean? * Imagine two types, * A ::= [5] IMPLICIT T * B ::= [2] EXPLICIT T * Where T is defined as * T ::= [4] IMPLICIT SEQUENCE { ... } * * Let's say, we are starting to decode type A, given the * following TLV stream: <5> <0>. What does this mean? * It means that the type A contains type T which is, * in turn, empty. * Remember though, that we are still in A. We cannot * just pass control to the type T decoder. Why? Because * the type T decoder expects <4> <0>, not <5> <0>. * So, we must make sure we are going to receive <5> while * still in A, then pass control to the T decoder, indicating * that the tag <4> was implicitly skipped. The decoder of T * hence will be prepared to treat <4> as valid tag, and decode * it appropriately. */ tagno = step /* Continuing where left previously */ + (tag_mode==1?-1:0) ; ASN_DEBUG("ber_check_tags(%s, size=%ld, tm=%d, step=%d, tagno=%d)", td->name, (long)size, tag_mode, step, tagno); /* assert(td->tags_count >= 1) May not be the case for CHOICE or ANY */ if(tag_mode == 0 && tagno == td->tags_count) { /* * This must be the _untagged_ ANY type, * which outermost tag isn't known in advance. * Fetch the tag and length separately. */ tag_len = ber_fetch_tag(ptr, size, &tlv_tag); switch(tag_len) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); } tlv_constr = BER_TLV_CONSTRUCTED(ptr); len_len = ber_fetch_length(tlv_constr, (const char *)ptr + tag_len, size - tag_len, &tlv_len); switch(len_len) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); } ASN_DEBUG("Advancing %ld in ANY case", (long)(tag_len + len_len)); ADVANCE(tag_len + len_len); } else { assert(tagno < td->tags_count); /* At least one loop */ } for((void)tagno; tagno < td->tags_count; tagno++, step++) { /* * Fetch and process T from TLV. */ tag_len = ber_fetch_tag(ptr, size, &tlv_tag); ASN_DEBUG("Fetching tag from {%p,%ld}: " "len %ld, step %d, tagno %d got %s", ptr, (long)size, (long)tag_len, step, tagno, ber_tlv_tag_string(tlv_tag)); switch(tag_len) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); } tlv_constr = BER_TLV_CONSTRUCTED(ptr); /* * If {I}, don't check anything. * If {I,B,C}, check B and C unless we're at I. */ if(tag_mode != 0 && step == 0) { /* * We don't expect tag to match here. * It's just because we don't know how the tag * is supposed to look like. */ } else { assert(tagno >= 0); /* Guaranteed by the code above */ if(tlv_tag != td->tags[tagno]) { /* * Unexpected tag. Too bad. */ ASN_DEBUG("Expected: %s, " "expectation failed (tn=%d, tm=%d)", ber_tlv_tag_string(td->tags[tagno]), tagno, tag_mode ); RETURN(RC_FAIL); } } /* * Attention: if there are more tags expected, * ensure that the current tag is presented * in constructed form (it contains other tags!). * If this one is the last one, check that the tag form * matches the one given in descriptor. */ if(tagno < (td->tags_count - 1)) { if(tlv_constr == 0) { ASN_DEBUG("tlv_constr = %d, expfail", tlv_constr); RETURN(RC_FAIL); } } else { if(last_tag_form != tlv_constr && last_tag_form != -1) { ASN_DEBUG("last_tag_form %d != %d", last_tag_form, tlv_constr); RETURN(RC_FAIL); } } /* * Fetch and process L from TLV. */ len_len = ber_fetch_length(tlv_constr, (const char *)ptr + tag_len, size - tag_len, &tlv_len); ASN_DEBUG("Fetchinig len = %ld", (long)len_len); switch(len_len) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); } /* * FIXME * As of today, the chain of tags * must either contain several indefinite length TLVs, * or several definite length ones. * No mixing is allowed. */ if(tlv_len == -1) { /* * Indefinite length. */ if(limit_len == -1) { expect_00_terminators++; } else { ASN_DEBUG("Unexpected indefinite length " "in a chain of definite lengths"); RETURN(RC_FAIL); } ADVANCE(tag_len + len_len); continue; } else { if(expect_00_terminators) { ASN_DEBUG("Unexpected definite length " "in a chain of indefinite lengths"); RETURN(RC_FAIL); } } /* * Check that multiple TLVs specify ever decreasing length, * which is consistent. */ if(limit_len == -1) { limit_len = tlv_len + tag_len + len_len; if(limit_len < 0) { /* Too great tlv_len value? */ RETURN(RC_FAIL); } } else if(limit_len != tlv_len + tag_len + len_len) { /* * Inner TLV specifies length which is inconsistent * with the outer TLV's length value. */ ASN_DEBUG("Outer TLV is %ld and inner is %ld", (long)limit_len, (long)tlv_len); RETURN(RC_FAIL); } ADVANCE(tag_len + len_len); limit_len -= (tag_len + len_len); if((ssize_t)size > limit_len) { /* * Make sure that we won't consume more bytes * from the parent frame than the inferred limit. */ size = limit_len; } } if(opt_tlv_form) *opt_tlv_form = tlv_constr; if(expect_00_terminators) *last_length = -expect_00_terminators; else *last_length = tlv_len; RETURN(RC_OK); } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/ber_decoder.h000066400000000000000000000037771305042567700231120ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _BER_DECODER_H_ #define _BER_DECODER_H_ #include #ifdef __cplusplus extern "C" { #endif struct asn_TYPE_descriptor_s; /* Forward declaration */ struct asn_codec_ctx_s; /* Forward declaration */ /* * The BER decoder of any type. * This function may be invoked directly from the application. * The der_encode() function (der_encoder.h) is an opposite to ber_decode(). */ asn_dec_rval_t ber_decode(struct asn_codec_ctx_s *opt_codec_ctx, struct asn_TYPE_descriptor_s *type_descriptor, void **struct_ptr, /* Pointer to a target structure's pointer */ const void *buffer, /* Data to be decoded */ size_t size /* Size of that buffer */ ); /* * Type of generic function which decodes the byte stream into the structure. */ typedef asn_dec_rval_t (ber_type_decoder_f)( struct asn_codec_ctx_s *opt_codec_ctx, struct asn_TYPE_descriptor_s *type_descriptor, void **struct_ptr, const void *buf_ptr, size_t size, int tag_mode); /******************************* * INTERNALLY USEFUL FUNCTIONS * *******************************/ /* * Check that all tags correspond to the type definition (as given in head). * On return, last_length would contain either a non-negative length of the * value part of the last TLV, or the negative number of expected * "end of content" sequences. The number may only be negative if the * head->last_tag_form is non-zero. */ asn_dec_rval_t ber_check_tags( struct asn_codec_ctx_s *opt_codec_ctx, /* codec options */ struct asn_TYPE_descriptor_s *type_descriptor, asn_struct_ctx_t *opt_ctx, /* saved decoding context */ const void *ptr, size_t size, int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ int last_tag_form, /* {-1,0:1}: any, primitive, constr */ ber_tlv_len_t *last_length, int *opt_tlv_form /* optional tag form */ ); #ifdef __cplusplus } #endif #endif /* _BER_DECODER_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/ber_tlv_length.c000066400000000000000000000073101305042567700236310ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include ssize_t ber_fetch_length(int _is_constructed, const void *bufptr, size_t size, ber_tlv_len_t *len_r) { const uint8_t *buf = (const uint8_t *)bufptr; unsigned oct; if(size == 0) return 0; /* Want more */ oct = *(const uint8_t *)buf; if((oct & 0x80) == 0) { /* * Short definite length. */ *len_r = oct; /* & 0x7F */ return 1; } else { ber_tlv_len_t len; size_t skipped; if(_is_constructed && oct == 0x80) { *len_r = -1; /* Indefinite length */ return 1; } if(oct == 0xff) { /* Reserved in standard for future use. */ return -1; } oct &= 0x7F; /* Leave only the 7 LS bits */ for(len = 0, buf++, skipped = 1; oct && (++skipped <= size); buf++, oct--) { len = (len << 8) | *buf; if(len < 0 || (len >> ((8 * sizeof(len)) - 8) && oct > 1)) { /* * Too large length value. */ return -1; } } if(oct == 0) { ber_tlv_len_t lenplusepsilon = (size_t)len + 1024; /* * Here length may be very close or equal to 2G. * However, the arithmetics used in some decoders * may add some (small) quantities to the length, * to check the resulting value against some limits. * This may result in integer wrap-around, which * we try to avoid by checking it earlier here. */ if(lenplusepsilon < 0) { /* Too large length value */ return -1; } *len_r = len; return skipped; } return 0; /* Want more */ } } ssize_t ber_skip_length(asn_codec_ctx_t *opt_codec_ctx, int _is_constructed, const void *ptr, size_t size) { ber_tlv_len_t vlen; /* Length of V in TLV */ ssize_t tl; /* Length of L in TLV */ ssize_t ll; /* Length of L in TLV */ size_t skip; /* * Make sure we didn't exceed the maximum stack size. */ if(_ASN_STACK_OVERFLOW_CHECK(opt_codec_ctx)) return -1; /* * Determine the size of L in TLV. */ ll = ber_fetch_length(_is_constructed, ptr, size, &vlen); if(ll <= 0) return ll; /* * Definite length. */ if(vlen >= 0) { skip = ll + vlen; if(skip > size) return 0; /* Want more */ return skip; } /* * Indefinite length! */ ASN_DEBUG("Skipping indefinite length"); for(skip = ll, ptr = ((const char *)ptr) + ll, size -= ll;;) { ber_tlv_tag_t tag; /* Fetch the tag */ tl = ber_fetch_tag(ptr, size, &tag); if(tl <= 0) return tl; ll = ber_skip_length(opt_codec_ctx, BER_TLV_CONSTRUCTED(ptr), ((const char *)ptr) + tl, size - tl); if(ll <= 0) return ll; skip += tl + ll; /* * This may be the end of the indefinite length structure, * two consecutive 0 octets. * Check if it is true. */ if(((const uint8_t *)ptr)[0] == 0 && ((const uint8_t *)ptr)[1] == 0) return skip; ptr = ((const char *)ptr) + tl + ll; size -= tl + ll; } /* UNREACHABLE */ } size_t der_tlv_length_serialize(ber_tlv_len_t len, void *bufp, size_t size) { size_t required_size; /* Size of len encoding */ uint8_t *buf = (uint8_t *)bufp; uint8_t *end; size_t i; if(len <= 127) { /* Encoded in 1 octet */ if(size) *buf = (uint8_t)len; return 1; } /* * Compute the size of the subsequent bytes. */ for(required_size = 1, i = 8; i < 8 * sizeof(len); i += 8) { if(len >> i) required_size++; else break; } if(size <= required_size) return required_size + 1; *buf++ = (uint8_t)(0x80 | required_size); /* Length of the encoding */ /* * Produce the len encoding, space permitting. */ end = buf + required_size; for(i -= 8; buf < end; i -= 8, buf++) *buf = (uint8_t)(len >> i); return required_size + 1; } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/ber_tlv_length.h000066400000000000000000000027751305042567700236500ustar00rootroot00000000000000/*- * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _BER_TLV_LENGTH_H_ #define _BER_TLV_LENGTH_H_ #ifdef __cplusplus extern "C" { #endif typedef ssize_t ber_tlv_len_t; /* * This function tries to fetch the length of the BER TLV value and place it * in *len_r. * RETURN VALUES: * 0: More data expected than bufptr contains. * -1: Fatal error deciphering length. * >0: Number of bytes used from bufptr. * On return with >0, len_r is constrained as -1..MAX, where -1 mean * that the value is of indefinite length. */ ssize_t ber_fetch_length(int _is_constructed, const void *bufptr, size_t size, ber_tlv_len_t *len_r); /* * This function expects bufptr to be positioned over L in TLV. * It returns number of bytes occupied by L and V together, suitable * for skipping. The function properly handles indefinite length. * RETURN VALUES: * Standard {-1,0,>0} convention. */ ssize_t ber_skip_length( struct asn_codec_ctx_s *opt_codec_ctx, /* optional context */ int _is_constructed, const void *bufptr, size_t size); /* * This function serializes the length (L from TLV) in DER format. * It always returns number of bytes necessary to represent the length, * it is a caller's responsibility to check the return value * against the supplied buffer's size. */ size_t der_tlv_length_serialize(ber_tlv_len_t len, void *bufptr, size_t size); #ifdef __cplusplus } #endif #endif /* _BER_TLV_LENGTH_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/ber_tlv_tag.c000066400000000000000000000061561305042567700231320ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include ssize_t ber_fetch_tag(const void *ptr, size_t size, ber_tlv_tag_t *tag_r) { ber_tlv_tag_t val; ber_tlv_tag_t tclass; size_t skipped; if(size == 0) return 0; val = *(const uint8_t *)ptr; tclass = (val >> 6); if((val &= 0x1F) != 0x1F) { /* * Simple form: everything encoded in a single octet. * Tag Class is encoded using two least significant bits. */ *tag_r = (val << 2) | tclass; return 1; } /* * Each octet contains 7 bits of useful information. * The MSB is 0 if it is the last octet of the tag. */ for(val = 0, ptr = ((const char *)ptr) + 1, skipped = 2; skipped <= size; ptr = ((const char *)ptr) + 1, skipped++) { unsigned int oct = *(const uint8_t *)ptr; if(oct & 0x80) { val = (val << 7) | (oct & 0x7F); /* * Make sure there are at least 9 bits spare * at the MS side of a value. */ if(val >> ((8 * sizeof(val)) - 9)) { /* * We would not be able to accomodate * any more tag bits. */ return -1; } } else { val = (val << 7) | oct; *tag_r = (val << 2) | tclass; return skipped; } } return 0; /* Want more */ } ssize_t ber_tlv_tag_fwrite(ber_tlv_tag_t tag, FILE *f) { char buf[sizeof("[APPLICATION ]") + 32]; ssize_t ret; ret = ber_tlv_tag_snprint(tag, buf, sizeof(buf)); if(ret >= (ssize_t)sizeof(buf) || ret < 2) { errno = EPERM; return -1; } return fwrite(buf, 1, ret, f); } ssize_t ber_tlv_tag_snprint(ber_tlv_tag_t tag, char *buf, size_t size) { char *type = 0; int ret; switch(tag & 0x3) { case ASN_TAG_CLASS_UNIVERSAL: type = "UNIVERSAL "; break; case ASN_TAG_CLASS_APPLICATION: type = "APPLICATION "; break; case ASN_TAG_CLASS_CONTEXT: type = ""; break; case ASN_TAG_CLASS_PRIVATE: type = "PRIVATE "; break; } ret = snprintf(buf, size, "[%s%u]", type, ((unsigned)tag) >> 2); if(ret <= 0 && size) buf[0] = '\0'; /* against broken libc's */ return ret; } char * ber_tlv_tag_string(ber_tlv_tag_t tag) { static char buf[sizeof("[APPLICATION ]") + 32]; (void)ber_tlv_tag_snprint(tag, buf, sizeof(buf)); return buf; } size_t ber_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) { int tclass = BER_TAG_CLASS(tag); ber_tlv_tag_t tval = BER_TAG_VALUE(tag); uint8_t *buf = (uint8_t *)bufp; uint8_t *end; size_t required_size; size_t i; if(tval <= 30) { /* Encoded in 1 octet */ if(size) buf[0] = (tclass << 6) | tval; return 1; } else if(size) { *buf++ = (tclass << 6) | 0x1F; size--; } /* * Compute the size of the subsequent bytes. */ for(required_size = 1, i = 7; i < 8 * sizeof(tval); i += 7) { if(tval >> i) required_size++; else break; } if(size < required_size) return required_size + 1; /* * Fill in the buffer, space permitting. */ end = buf + required_size - 1; for(i -= 7; buf < end; i -= 7, buf++) *buf = 0x80 | ((tval >> i) & 0x7F); *buf = (tval & 0x7F); /* Last octet without high bit */ return required_size + 1; } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/ber_tlv_tag.h000066400000000000000000000034541305042567700231350ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _BER_TLV_TAG_H_ #define _BER_TLV_TAG_H_ #ifdef __cplusplus extern "C" { #endif enum asn_tag_class { ASN_TAG_CLASS_UNIVERSAL = 0, /* 0b00 */ ASN_TAG_CLASS_APPLICATION = 1, /* 0b01 */ ASN_TAG_CLASS_CONTEXT = 2, /* 0b10 */ ASN_TAG_CLASS_PRIVATE = 3 /* 0b11 */ }; typedef unsigned ber_tlv_tag_t; /* BER TAG from Tag-Length-Value */ /* * Tag class is encoded together with tag value for optimization purposes. */ #define BER_TAG_CLASS(tag) ((tag) & 0x3) #define BER_TAG_VALUE(tag) ((tag) >> 2) #define BER_TLV_CONSTRUCTED(tagptr) (((*(const uint8_t *)tagptr)&0x20)?1:0) #define BER_TAGS_EQUAL(tag1, tag2) ((tag1) == (tag2)) /* * Several functions for printing the TAG in the canonical form * (i.e. "[PRIVATE 0]"). * Return values correspond to their libc counterparts (if any). */ ssize_t ber_tlv_tag_snprint(ber_tlv_tag_t tag, char *buf, size_t buflen); ssize_t ber_tlv_tag_fwrite(ber_tlv_tag_t tag, FILE *); char *ber_tlv_tag_string(ber_tlv_tag_t tag); /* * This function tries to fetch the tag from the input stream. * RETURN VALUES: * 0: More data expected than bufptr contains. * -1: Fatal error deciphering tag. * >0: Number of bytes used from bufptr. tag_r will contain the tag. */ ssize_t ber_fetch_tag(const void *bufptr, size_t size, ber_tlv_tag_t *tag_r); /* * This function serializes the tag (T from TLV) in BER format. * It always returns number of bytes necessary to represent the tag, * it is a caller's responsibility to check the return value * against the supplied buffer's size. */ size_t ber_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufptr, size_t size); #ifdef __cplusplus } #endif #endif /* _BER_TLV_TAG_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/constr_CHOICE.c000066400000000000000000000676461305042567700231770ustar00rootroot00000000000000/* * Copyright (c) 2003, 2004, 2005, 2006, 2007 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include /* * Number of bytes left for this structure. * (ctx->left) indicates the number of bytes _transferred_ for the structure. * (size) contains the number of bytes in the buffer passed. */ #define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) /* * If the subprocessor function returns with an indication that it wants * more data, it may well be a fatal decoding problem, because the * size is constrained by the 's L, even if the buffer size allows * reading more data. * For example, consider the buffer containing the following TLVs: * ... * The TLV length clearly indicates that one byte is expected in V, but * if the V processor returns with "want more data" even if the buffer * contains way more data than the V processor have seen. */ #define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) /* * This macro "eats" the part of the buffer which is definitely "consumed", * i.e. was correctly converted into local representation or rightfully skipped. */ #undef ADVANCE #define ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ ptr = ((const char *)ptr) + num;\ size -= num; \ if(ctx->left >= 0) \ ctx->left -= num; \ consumed_myself += num; \ } while(0) /* * Switch to the next phase of parsing. */ #undef NEXT_PHASE #define NEXT_PHASE(ctx) do { \ ctx->phase++; \ ctx->step = 0; \ } while(0) /* * Return a standardized complex structure. */ #undef RETURN #define RETURN(_code) do { \ rval.code = _code; \ rval.consumed = consumed_myself;\ return rval; \ } while(0) /* * See the definitions. */ static int _fetch_present_idx(const void *struct_ptr, int off, int size); static void _set_present_idx(void *sptr, int offset, int size, int pres); /* * Tags are canonically sorted in the tag to member table. */ static int _search4tag(const void *ap, const void *bp) { const asn_TYPE_tag2member_t *a = (const asn_TYPE_tag2member_t *)ap; const asn_TYPE_tag2member_t *b = (const asn_TYPE_tag2member_t *)bp; int a_class = BER_TAG_CLASS(a->el_tag); int b_class = BER_TAG_CLASS(b->el_tag); if(a_class == b_class) { ber_tlv_tag_t a_value = BER_TAG_VALUE(a->el_tag); ber_tlv_tag_t b_value = BER_TAG_VALUE(b->el_tag); if(a_value == b_value) return 0; else if(a_value < b_value) return -1; else return 1; } else if(a_class < b_class) { return -1; } else { return 1; } } /* * The decoder of the CHOICE type. */ asn_dec_rval_t CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **struct_ptr, const void *ptr, size_t size, int tag_mode) { /* * Bring closer parts of structure description. */ asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; asn_TYPE_member_t *elements = td->elements; /* * Parts of the structure being constructed. */ void *st = *struct_ptr; /* Target structure. */ asn_struct_ctx_t *ctx; /* Decoder context */ ber_tlv_tag_t tlv_tag; /* T from TLV */ ssize_t tag_len; /* Length of TLV's T */ asn_dec_rval_t rval; /* Return code from subparsers */ ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ ASN_DEBUG("Decoding %s as CHOICE", td->name); /* * Create the target structure if it is not present already. */ if(st == 0) { st = *struct_ptr = CALLOC(1, specs->struct_size); if(st == 0) { RETURN(RC_FAIL); } } /* * Restore parsing context. */ ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); /* * Start to parse where left previously */ switch(ctx->phase) { case 0: /* * PHASE 0. * Check that the set of tags associated with given structure * perfectly fits our expectations. */ if(tag_mode || td->tags_count) { rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, tag_mode, -1, &ctx->left, 0); if(rval.code != RC_OK) { ASN_DEBUG("%s tagging check failed: %d", td->name, rval.code); return rval; } if(ctx->left >= 0) { /* ?Substracted below! */ ctx->left += rval.consumed; } ADVANCE(rval.consumed); } else { ctx->left = -1; } NEXT_PHASE(ctx); ASN_DEBUG("Structure consumes %ld bytes, buffer %ld", (long)ctx->left, (long)size); /* Fall through */ case 1: /* * Fetch the T from TLV. */ tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); ASN_DEBUG("In %s CHOICE tag length %d", td->name, (int)tag_len); switch(tag_len) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); /* Fall through */ case -1: RETURN(RC_FAIL); } do { asn_TYPE_tag2member_t *t2m; asn_TYPE_tag2member_t key; key.el_tag = tlv_tag; t2m = (asn_TYPE_tag2member_t *)bsearch(&key, specs->tag2el, specs->tag2el_count, sizeof(specs->tag2el[0]), _search4tag); if(t2m) { /* * Found the element corresponding to the tag. */ NEXT_PHASE(ctx); ctx->step = t2m->el_no; break; } else if(specs->ext_start == -1) { ASN_DEBUG("Unexpected tag %s " "in non-extensible CHOICE %s", ber_tlv_tag_string(tlv_tag), td->name); RETURN(RC_FAIL); } else { /* Skip this tag */ ssize_t skip; ASN_DEBUG("Skipping unknown tag %s", ber_tlv_tag_string(tlv_tag)); skip = ber_skip_length(opt_codec_ctx, BER_TLV_CONSTRUCTED(ptr), (const char *)ptr + tag_len, LEFT - tag_len); switch(skip) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); /* Fall through */ case -1: RETURN(RC_FAIL); } ADVANCE(skip + tag_len); RETURN(RC_OK); } } while(0); case 2: /* * PHASE 2. * Read in the element. */ do { asn_TYPE_member_t *elm;/* CHOICE's element */ void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ elm = &elements[ctx->step]; /* * Compute the position of the member inside a structure, * and also a type of containment (it may be contained * as pointer or using inline inclusion). */ if(elm->flags & ATF_POINTER) { /* Member is a pointer to another structure */ memb_ptr2 = (void **)((char *)st + elm->memb_offset); } else { /* * A pointer to a pointer * holding the start of the structure */ memb_ptr = (char *)st + elm->memb_offset; memb_ptr2 = &memb_ptr; } /* Set presence to be able to free it properly at any time */ _set_present_idx(st, specs->pres_offset, specs->pres_size, ctx->step + 1); /* * Invoke the member fetch routine according to member's type */ rval = elm->type->ber_decoder(opt_codec_ctx, elm->type, memb_ptr2, ptr, LEFT, elm->tag_mode); switch(rval.code) { case RC_OK: break; case RC_WMORE: /* More data expected */ if(!SIZE_VIOLATION) { ADVANCE(rval.consumed); RETURN(RC_WMORE); } RETURN(RC_FAIL); case RC_FAIL: /* Fatal error */ RETURN(rval.code); } /* switch(rval) */ ADVANCE(rval.consumed); } while(0); NEXT_PHASE(ctx); /* Fall through */ case 3: ASN_DEBUG("CHOICE %s Leftover: %ld, size = %ld, tm=%d, tc=%d", td->name, (long)ctx->left, (long)size, tag_mode, td->tags_count); if(ctx->left > 0) { /* * The type must be fully decoded * by the CHOICE member-specific decoder. */ RETURN(RC_FAIL); } if(ctx->left == -1 && !(tag_mode || td->tags_count)) { /* * This is an untagged CHOICE. * It doesn't contain nothing * except for the member itself, including all its tags. * The decoding is completed. */ NEXT_PHASE(ctx); break; } /* * Read in the "end of data chunks"'s. */ while(ctx->left < 0) { ssize_t tl; tl = ber_fetch_tag(ptr, LEFT, &tlv_tag); switch(tl) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); /* Fall through */ case -1: RETURN(RC_FAIL); } /* * Expected <0><0>... */ if(((const uint8_t *)ptr)[0] == 0) { if(LEFT < 2) { if(SIZE_VIOLATION) RETURN(RC_FAIL); else RETURN(RC_WMORE); } else if(((const uint8_t *)ptr)[1] == 0) { /* * Correctly finished with <0><0>. */ ADVANCE(2); ctx->left++; continue; } } else { ASN_DEBUG("Unexpected continuation in %s", td->name); RETURN(RC_FAIL); } /* UNREACHABLE */ } NEXT_PHASE(ctx); case 4: /* No meaningful work here */ break; } RETURN(RC_OK); } asn_enc_rval_t CHOICE_encode_der(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; asn_TYPE_member_t *elm; /* CHOICE element */ asn_enc_rval_t erval; void *memb_ptr; size_t computed_size = 0; int present; if(!sptr) _ASN_ENCODE_FAILED; ASN_DEBUG("%s %s as CHOICE", cb?"Encoding":"Estimating", td->name); present = _fetch_present_idx(sptr, specs->pres_offset, specs->pres_size); /* * If the structure was not initialized, it cannot be encoded: * can't deduce what to encode in the choice type. */ if(present <= 0 || present > td->elements_count) { if(present == 0 && td->elements_count == 0) { /* The CHOICE is empty?! */ erval.encoded = 0; _ASN_ENCODED_OK(erval); } _ASN_ENCODE_FAILED; } /* * Seek over the present member of the structure. */ elm = &td->elements[present-1]; if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)sptr + elm->memb_offset); if(memb_ptr == 0) { if(elm->optional) { erval.encoded = 0; _ASN_ENCODED_OK(erval); } /* Mandatory element absent */ _ASN_ENCODE_FAILED; } } else { memb_ptr = (void *)((char *)sptr + elm->memb_offset); } /* * If the CHOICE itself is tagged EXPLICIT: * T ::= [2] EXPLICIT CHOICE { ... } * Then emit the appropriate tags. */ if(tag_mode == 1 || td->tags_count) { /* * For this, we need to pre-compute the member. */ ssize_t ret; /* Encode member with its tag */ erval = elm->type->der_encoder(elm->type, memb_ptr, elm->tag_mode, elm->tag, 0, 0); if(erval.encoded == -1) return erval; /* Encode CHOICE with parent or my own tag */ ret = der_write_tags(td, erval.encoded, tag_mode, 1, tag, cb, app_key); if(ret == -1) _ASN_ENCODE_FAILED; computed_size += ret; } /* * Encode the single underlying member. */ erval = elm->type->der_encoder(elm->type, memb_ptr, elm->tag_mode, elm->tag, cb, app_key); if(erval.encoded == -1) return erval; ASN_DEBUG("Encoded CHOICE member in %ld bytes (+%ld)", (long)erval.encoded, (long)computed_size); erval.encoded += computed_size; return erval; } ber_tlv_tag_t CHOICE_outmost_tag(asn_TYPE_descriptor_t *td, const void *ptr, int tag_mode, ber_tlv_tag_t tag) { asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; int present; assert(tag_mode == 0); (void)tag_mode; assert(tag == 0); (void)tag; /* * Figure out which CHOICE element is encoded. */ present = _fetch_present_idx(ptr, specs->pres_offset, specs->pres_size); if(present > 0 || present <= td->elements_count) { asn_TYPE_member_t *elm = &td->elements[present-1]; const void *memb_ptr; if(elm->flags & ATF_POINTER) { memb_ptr = *(const void * const *) ((const char *)ptr + elm->memb_offset); } else { memb_ptr = (const void *) ((const char *)ptr + elm->memb_offset); } return asn_TYPE_outmost_tag(elm->type, memb_ptr, elm->tag_mode, elm->tag); } else { return (ber_tlv_tag_t)-1; } } int CHOICE_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; int present; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } /* * Figure out which CHOICE element is encoded. */ present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); if(present > 0 && present <= td->elements_count) { asn_TYPE_member_t *elm = &td->elements[present-1]; const void *memb_ptr; if(elm->flags & ATF_POINTER) { memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); if(!memb_ptr) { if(elm->optional) return 0; _ASN_CTFAIL(app_key, td, sptr, "%s: mandatory CHOICE element %s absent (%s:%d)", td->name, elm->name, __FILE__, __LINE__); return -1; } } else { memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); } if(elm->memb_constraints) { return elm->memb_constraints(elm->type, memb_ptr, ctfailcb, app_key); } else { int ret = elm->type->check_constraints(elm->type, memb_ptr, ctfailcb, app_key); /* * Cannot inherit it eralier: * need to make sure we get the updated version. */ elm->memb_constraints = elm->type->check_constraints; return ret; } } else { _ASN_CTFAIL(app_key, td, sptr, "%s: no CHOICE element given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } } #undef XER_ADVANCE #define XER_ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ buf_ptr = ((const char *)buf_ptr) + num;\ size -= num; \ consumed_myself += num; \ } while(0) /* * Decode the XER (XML) data. */ asn_dec_rval_t CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **struct_ptr, const char *opt_mname, const void *buf_ptr, size_t size) { /* * Bring closer parts of structure description. */ asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; /* * Parts of the structure being constructed. */ void *st = *struct_ptr; /* Target structure. */ asn_struct_ctx_t *ctx; /* Decoder context */ asn_dec_rval_t rval; /* Return value of a decoder */ ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ int edx; /* Element index */ /* * Create the target structure if it is not present already. */ if(st == 0) { st = *struct_ptr = CALLOC(1, specs->struct_size); if(st == 0) RETURN(RC_FAIL); } /* * Restore parsing context. */ ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); if(ctx->phase == 0 && !*xml_tag) ctx->phase = 1; /* Skip the outer tag checking phase */ /* * Phases of XER/XML processing: * Phase 0: Check that the opening tag matches our expectations. * Phase 1: Processing body and reacting on closing tag. * Phase 2: Processing inner type. * Phase 3: Only waiting for closing tag. * Phase 4: Skipping unknown extensions. * Phase 5: PHASED OUT */ for(edx = ctx->step; ctx->phase <= 4;) { pxer_chunk_type_e ch_type; /* XER chunk type */ ssize_t ch_size; /* Chunk size */ xer_check_tag_e tcv; /* Tag check value */ asn_TYPE_member_t *elm; /* * Go inside the member. */ if(ctx->phase == 2) { asn_dec_rval_t tmprval; void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ elm = &td->elements[edx]; if(elm->flags & ATF_POINTER) { /* Member is a pointer to another structure */ memb_ptr2 = (void **)((char *)st + elm->memb_offset); } else { memb_ptr = (char *)st + elm->memb_offset; memb_ptr2 = &memb_ptr; } /* Start/Continue decoding the inner member */ tmprval = elm->type->xer_decoder(opt_codec_ctx, elm->type, memb_ptr2, elm->name, buf_ptr, size); XER_ADVANCE(tmprval.consumed); ASN_DEBUG("XER/CHOICE: itdf: [%s] code=%d", elm->type->name, tmprval.code); if(tmprval.code != RC_OK) RETURN(tmprval.code); assert(_fetch_present_idx(st, specs->pres_offset, specs->pres_size) == 0); /* Record what we've got */ _set_present_idx(st, specs->pres_offset, specs->pres_size, edx + 1); ctx->phase = 3; /* Fall through */ } /* No need to wait for closing tag; special mode. */ if(ctx->phase == 3 && !*xml_tag) { ctx->phase = 5; /* Phase out */ RETURN(RC_OK); } /* * Get the next part of the XML stream. */ ch_size = xer_next_token(&ctx->context, buf_ptr, size, &ch_type); switch(ch_size) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); default: switch(ch_type) { case PXER_COMMENT: /* Got XML comment */ case PXER_TEXT: /* Ignore free-standing text */ XER_ADVANCE(ch_size); /* Skip silently */ continue; case PXER_TAG: break; /* Check the rest down there */ } } tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); ASN_DEBUG("XER/CHOICE checked [%c%c%c%c] vs [%s], tcv=%d", ch_size>0?((const uint8_t *)buf_ptr)[0]:'?', ch_size>1?((const uint8_t *)buf_ptr)[1]:'?', ch_size>2?((const uint8_t *)buf_ptr)[2]:'?', ch_size>3?((const uint8_t *)buf_ptr)[3]:'?', xml_tag, tcv); /* Skip the extensions section */ if(ctx->phase == 4) { ASN_DEBUG("skip_unknown(%d, %ld)", tcv, (long)ctx->left); switch(xer_skip_unknown(tcv, &ctx->left)) { case -1: ctx->phase = 5; RETURN(RC_FAIL); continue; case 1: ctx->phase = 3; /* Fall through */ case 0: XER_ADVANCE(ch_size); continue; case 2: ctx->phase = 3; break; } } switch(tcv) { case XCT_BOTH: break; /* No CHOICE? */ case XCT_CLOSING: if(ctx->phase != 3) break; XER_ADVANCE(ch_size); ctx->phase = 5; /* Phase out */ RETURN(RC_OK); case XCT_OPENING: if(ctx->phase == 0) { XER_ADVANCE(ch_size); ctx->phase = 1; /* Processing body phase */ continue; } /* Fall through */ case XCT_UNKNOWN_OP: case XCT_UNKNOWN_BO: if(ctx->phase != 1) break; /* Really unexpected */ /* * Search which inner member corresponds to this tag. */ for(edx = 0; edx < td->elements_count; edx++) { elm = &td->elements[edx]; tcv = xer_check_tag(buf_ptr,ch_size,elm->name); switch(tcv) { case XCT_BOTH: case XCT_OPENING: /* * Process this member. */ ctx->step = edx; ctx->phase = 2; break; case XCT_UNKNOWN_OP: case XCT_UNKNOWN_BO: continue; default: edx = td->elements_count; break; /* Phase out */ } break; } if(edx != td->elements_count) continue; /* It is expected extension */ if(specs->ext_start != -1) { ASN_DEBUG("Got anticipated extension"); /* * Check for (XCT_BOTH or XCT_UNKNOWN_BO) * By using a mask. Only record a pure * tags. */ if(tcv & XCT_CLOSING) { /* Found without body */ ctx->phase = 3; /* Terminating */ } else { ctx->left = 1; ctx->phase = 4; /* Skip ...'s */ } XER_ADVANCE(ch_size); continue; } /* Fall through */ default: break; } ASN_DEBUG("Unexpected XML tag [%c%c%c%c] in CHOICE [%s]" " (ph=%d, tag=%s)", ch_size>0?((const uint8_t *)buf_ptr)[0]:'?', ch_size>1?((const uint8_t *)buf_ptr)[1]:'?', ch_size>2?((const uint8_t *)buf_ptr)[2]:'?', ch_size>3?((const uint8_t *)buf_ptr)[3]:'?', td->name, ctx->phase, xml_tag); break; } ctx->phase = 5; /* Phase out, just in case */ RETURN(RC_FAIL); } asn_enc_rval_t CHOICE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_CHOICE_specifics_t *specs=(asn_CHOICE_specifics_t *)td->specifics; asn_enc_rval_t er; int present; if(!sptr) _ASN_ENCODE_FAILED; /* * Figure out which CHOICE element is encoded. */ present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); if(present <= 0 || present > td->elements_count) { _ASN_ENCODE_FAILED; } else { asn_enc_rval_t tmper; asn_TYPE_member_t *elm = &td->elements[present-1]; void *memb_ptr; const char *mname = elm->name; unsigned int mlen = strlen(mname); if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)sptr + elm->memb_offset); if(!memb_ptr) _ASN_ENCODE_FAILED; } else { memb_ptr = (void *)((char *)sptr + elm->memb_offset); } er.encoded = 0; if(!(flags & XER_F_CANONICAL)) _i_ASN_TEXT_INDENT(1, ilevel); _ASN_CALLBACK3("<", 1, mname, mlen, ">", 1); tmper = elm->type->xer_encoder(elm->type, memb_ptr, ilevel + 1, flags, cb, app_key); if(tmper.encoded == -1) return tmper; _ASN_CALLBACK3("", 1); er.encoded += 5 + (2 * mlen) + tmper.encoded; } if(!(flags & XER_F_CANONICAL)) _i_ASN_TEXT_INDENT(1, ilevel - 1); _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } asn_dec_rval_t CHOICE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; asn_dec_rval_t rv; asn_per_constraint_t *ct; asn_TYPE_member_t *elm; /* CHOICE's element */ void *memb_ptr; void **memb_ptr2; void *st = *sptr; int value; if(_ASN_STACK_OVERFLOW_CHECK(opt_codec_ctx)) _ASN_DECODE_FAILED; /* * Create the target structure if it is not present already. */ if(!st) { st = *sptr = CALLOC(1, specs->struct_size); if(!st) _ASN_DECODE_FAILED; } if(constraints) ct = &constraints->value; else if(td->per_constraints) ct = &td->per_constraints->value; else ct = 0; if(ct && ct->flags & APC_EXTENSIBLE) { value = per_get_few_bits(pd, 1); if(value < 0) _ASN_DECODE_STARVED; if(value) ct = 0; /* Not restricted */ } if(ct && ct->range_bits >= 0) { value = per_get_few_bits(pd, ct->range_bits); if(value < 0) _ASN_DECODE_STARVED; ASN_DEBUG("CHOICE %s got index %d in range %d", td->name, value, ct->range_bits); if(value > ct->upper_bound) _ASN_DECODE_FAILED; } else { if(specs->ext_start == -1) _ASN_DECODE_FAILED; value = uper_get_nsnnwn(pd); if(value < 0) _ASN_DECODE_STARVED; value += specs->ext_start; if(value >= td->elements_count) _ASN_DECODE_FAILED; } /* Adjust if canonical order is different from natural order */ if(specs->canonical_order) value = specs->canonical_order[value]; /* Set presence to be able to free it later */ _set_present_idx(st, specs->pres_offset, specs->pres_size, value + 1); elm = &td->elements[value]; if(elm->flags & ATF_POINTER) { /* Member is a pointer to another structure */ memb_ptr2 = (void **)((char *)st + elm->memb_offset); } else { memb_ptr = (char *)st + elm->memb_offset; memb_ptr2 = &memb_ptr; } ASN_DEBUG("Discovered CHOICE %s encodes %s", td->name, elm->name); if(ct && ct->range_bits >= 0) { rv = elm->type->uper_decoder(opt_codec_ctx, elm->type, elm->per_constraints, memb_ptr2, pd); } else { rv = uper_open_type_get(opt_codec_ctx, elm->type, elm->per_constraints, memb_ptr2, pd); } if(rv.code != RC_OK) ASN_DEBUG("Failed to decode %s in %s (CHOICE) %d", elm->name, td->name, rv.code); return rv; } asn_enc_rval_t CHOICE_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; asn_TYPE_member_t *elm; /* CHOICE's element */ asn_per_constraint_t *ct; void *memb_ptr; int present; if(!sptr) _ASN_ENCODE_FAILED; ASN_DEBUG("Encoding %s as CHOICE", td->name); if(constraints) ct = &constraints->value; else if(td->per_constraints) ct = &td->per_constraints->value; else ct = 0; present = _fetch_present_idx(sptr, specs->pres_offset, specs->pres_size); /* * If the structure was not initialized properly, it cannot be encoded: * can't deduce what to encode in the choice type. */ if(present <= 0 || present > td->elements_count) _ASN_ENCODE_FAILED; else present--; /* Adjust if canonical order is different from natural order */ if(specs->canonical_order) present = specs->canonical_order[present]; ASN_DEBUG("Encoding %s CHOICE element %d", td->name, present); if(ct && ct->range_bits >= 0) { if(present < ct->lower_bound || present > ct->upper_bound) { if(ct->flags & APC_EXTENSIBLE) { if(per_put_few_bits(po, 1, 1)) _ASN_ENCODE_FAILED; } else { _ASN_ENCODE_FAILED; } ct = 0; } } if(ct && ct->flags & APC_EXTENSIBLE) if(per_put_few_bits(po, 0, 1)) _ASN_ENCODE_FAILED; elm = &td->elements[present]; if(elm->flags & ATF_POINTER) { /* Member is a pointer to another structure */ memb_ptr = *(void **)((char *)sptr + elm->memb_offset); if(!memb_ptr) _ASN_ENCODE_FAILED; } else { memb_ptr = (char *)sptr + elm->memb_offset; } if(ct && ct->range_bits >= 0) { if(per_put_few_bits(po, present, ct->range_bits)) _ASN_ENCODE_FAILED; return elm->type->uper_encoder(elm->type, elm->per_constraints, memb_ptr, po); } else { asn_enc_rval_t rval; if(specs->ext_start == -1) _ASN_ENCODE_FAILED; if(uper_put_nsnnwn(po, present - specs->ext_start)) _ASN_ENCODE_FAILED; if(uper_open_type_put(elm->type, elm->per_constraints, memb_ptr, po)) _ASN_ENCODE_FAILED; rval.encoded = 0; _ASN_ENCODED_OK(rval); } } int CHOICE_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; int present; if(!sptr) return (cb("", 8, app_key) < 0) ? -1 : 0; /* * Figure out which CHOICE element is encoded. */ present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); /* * Print that element. */ if(present > 0 && present <= td->elements_count) { asn_TYPE_member_t *elm = &td->elements[present-1]; const void *memb_ptr; if(elm->flags & ATF_POINTER) { memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); if(!memb_ptr) return (cb("", 8, app_key) < 0) ? -1 : 0; } else { memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); } /* Print member's name and stuff */ if(0) { if(cb(elm->name, strlen(elm->name), app_key) < 0 || cb(": ", 2, app_key) < 0) return -1; } return elm->type->print_struct(elm->type, memb_ptr, ilevel, cb, app_key); } else { return (cb("", 8, app_key) < 0) ? -1 : 0; } } void CHOICE_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; int present; if(!td || !ptr) return; ASN_DEBUG("Freeing %s as CHOICE", td->name); /* * Figure out which CHOICE element is encoded. */ present = _fetch_present_idx(ptr, specs->pres_offset, specs->pres_size); /* * Free that element. */ if(present > 0 && present <= td->elements_count) { asn_TYPE_member_t *elm = &td->elements[present-1]; void *memb_ptr; if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)ptr + elm->memb_offset); if(memb_ptr) ASN_STRUCT_FREE(*elm->type, memb_ptr); } else { memb_ptr = (void *)((char *)ptr + elm->memb_offset); ASN_STRUCT_FREE_CONTENTS_ONLY(*elm->type, memb_ptr); } } if(!contents_only) { FREEMEM(ptr); } } /* * The following functions functions offer protection against -fshort-enums, * compatible with little- and big-endian machines. * If assertion is triggered, either disable -fshort-enums, or add an entry * here with the ->pres_size of your target stracture. * Unless the target structure is packed, the ".present" member * is guaranteed to be aligned properly. ASN.1 compiler itself does not * produce packed code. */ static int _fetch_present_idx(const void *struct_ptr, int pres_offset, int pres_size) { const void *present_ptr; int present; present_ptr = ((const char *)struct_ptr) + pres_offset; switch(pres_size) { case sizeof(int): present = *(const int *)present_ptr; break; case sizeof(short): present = *(const short *)present_ptr; break; case sizeof(char): present = *(const char *)present_ptr; break; default: /* ANSI C mandates enum to be equivalent to integer */ assert(pres_size != sizeof(int)); return 0; /* If not aborted, pass back safe value */ } return present; } static void _set_present_idx(void *struct_ptr, int pres_offset, int pres_size, int present) { void *present_ptr; present_ptr = ((char *)struct_ptr) + pres_offset; switch(pres_size) { case sizeof(int): *(int *)present_ptr = present; break; case sizeof(short): *(short *)present_ptr = present; break; case sizeof(char): *(char *)present_ptr = present; break; default: /* ANSI C mandates enum to be equivalent to integer */ assert(pres_size != sizeof(int)); } } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/constr_CHOICE.h000066400000000000000000000025661305042567700231720ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004, 2005 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _CONSTR_CHOICE_H_ #define _CONSTR_CHOICE_H_ #include #ifdef __cplusplus extern "C" { #endif typedef struct asn_CHOICE_specifics_s { /* * Target structure description. */ int struct_size; /* Size of the target structure. */ int ctx_offset; /* Offset of the asn_codec_ctx_t member */ int pres_offset; /* Identifier of the present member */ int pres_size; /* Size of the identifier (enum) */ /* * Tags to members mapping table. */ asn_TYPE_tag2member_t *tag2el; int tag2el_count; /* Canonical ordering of CHOICE elements, for PER */ int *canonical_order; /* * Extensions-related stuff. */ int ext_start; /* First member of extensions, or -1 */ } asn_CHOICE_specifics_t; /* * A set specialized functions dealing with the CHOICE type. */ asn_struct_free_f CHOICE_free; asn_struct_print_f CHOICE_print; asn_constr_check_f CHOICE_constraint; ber_type_decoder_f CHOICE_decode_ber; der_type_encoder_f CHOICE_encode_der; xer_type_decoder_f CHOICE_decode_xer; xer_type_encoder_f CHOICE_encode_xer; per_type_decoder_f CHOICE_decode_uper; per_type_encoder_f CHOICE_encode_uper; asn_outmost_tag_f CHOICE_outmost_tag; #ifdef __cplusplus } #endif #endif /* _CONSTR_CHOICE_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/constr_SEQUENCE.c000066400000000000000000001072361305042567700234430ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004, 2005, 2006, 2007 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include /* * Number of bytes left for this structure. * (ctx->left) indicates the number of bytes _transferred_ for the structure. * (size) contains the number of bytes in the buffer passed. */ #define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) /* * If the subprocessor function returns with an indication that it wants * more data, it may well be a fatal decoding problem, because the * size is constrained by the 's L, even if the buffer size allows * reading more data. * For example, consider the buffer containing the following TLVs: * ... * The TLV length clearly indicates that one byte is expected in V, but * if the V processor returns with "want more data" even if the buffer * contains way more data than the V processor have seen. */ #define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) /* * This macro "eats" the part of the buffer which is definitely "consumed", * i.e. was correctly converted into local representation or rightfully skipped. */ #undef ADVANCE #define ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ ptr = ((const char *)ptr) + num;\ size -= num; \ if(ctx->left >= 0) \ ctx->left -= num; \ consumed_myself += num; \ } while(0) /* * Switch to the next phase of parsing. */ #undef NEXT_PHASE #undef PHASE_OUT #define NEXT_PHASE(ctx) do { \ ctx->phase++; \ ctx->step = 0; \ } while(0) #define PHASE_OUT(ctx) do { ctx->phase = 10; } while(0) /* * Return a standardized complex structure. */ #undef RETURN #define RETURN(_code) do { \ rval.code = _code; \ rval.consumed = consumed_myself;\ return rval; \ } while(0) /* * Check whether we are inside the extensions group. */ #define IN_EXTENSION_GROUP(specs, memb_idx) \ ( ((memb_idx) > (specs)->ext_after) \ &&((memb_idx) < (specs)->ext_before)) /* * Tags are canonically sorted in the tag2element map. */ static int _t2e_cmp(const void *ap, const void *bp) { const asn_TYPE_tag2member_t *a = (const asn_TYPE_tag2member_t *)ap; const asn_TYPE_tag2member_t *b = (const asn_TYPE_tag2member_t *)bp; int a_class = BER_TAG_CLASS(a->el_tag); int b_class = BER_TAG_CLASS(b->el_tag); if(a_class == b_class) { ber_tlv_tag_t a_value = BER_TAG_VALUE(a->el_tag); ber_tlv_tag_t b_value = BER_TAG_VALUE(b->el_tag); if(a_value == b_value) { if(a->el_no > b->el_no) return 1; /* * Important: we do not check * for a->el_no <= b->el_no! */ return 0; } else if(a_value < b_value) return -1; else return 1; } else if(a_class < b_class) { return -1; } else { return 1; } } /* * The decoder of the SEQUENCE type. */ asn_dec_rval_t SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **struct_ptr, const void *ptr, size_t size, int tag_mode) { /* * Bring closer parts of structure description. */ asn_SEQUENCE_specifics_t *specs = (asn_SEQUENCE_specifics_t *)td->specifics; asn_TYPE_member_t *elements = td->elements; /* * Parts of the structure being constructed. */ void *st = *struct_ptr; /* Target structure. */ asn_struct_ctx_t *ctx; /* Decoder context */ ber_tlv_tag_t tlv_tag; /* T from TLV */ asn_dec_rval_t rval; /* Return code from subparsers */ ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ int edx; /* SEQUENCE element's index */ ASN_DEBUG("Decoding %s as SEQUENCE", td->name); /* * Create the target structure if it is not present already. */ if(st == 0) { st = *struct_ptr = CALLOC(1, specs->struct_size); if(st == 0) { RETURN(RC_FAIL); } } /* * Restore parsing context. */ ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); /* * Start to parse where left previously */ switch(ctx->phase) { case 0: /* * PHASE 0. * Check that the set of tags associated with given structure * perfectly fits our expectations. */ rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, tag_mode, 1, &ctx->left, 0); if(rval.code != RC_OK) { ASN_DEBUG("%s tagging check failed: %d", td->name, rval.code); return rval; } if(ctx->left >= 0) ctx->left += rval.consumed; /* ?Substracted below! */ ADVANCE(rval.consumed); NEXT_PHASE(ctx); ASN_DEBUG("Structure consumes %ld bytes, buffer %ld", (long)ctx->left, (long)size); /* Fall through */ case 1: /* * PHASE 1. * From the place where we've left it previously, * try to decode the next member from the list of * this structure's elements. * (ctx->step) stores the member being processed * between invocations and the microphase {0,1} of parsing * that member: * step = ( * 2 + ). */ for(edx = (ctx->step >> 1); edx < td->elements_count; edx++, ctx->step = (ctx->step & ~1) + 2) { void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ ssize_t tag_len; /* Length of TLV's T */ int opt_edx_end; /* Next non-optional element */ int use_bsearch; int n; if(ctx->step & 1) goto microphase2; /* * MICROPHASE 1: Synchronize decoding. */ ASN_DEBUG("In %s SEQUENCE left %d, edx=%d flags=%d" " opt=%d ec=%d", td->name, (int)ctx->left, edx, elements[edx].flags, elements[edx].optional, td->elements_count); if(ctx->left == 0 /* No more stuff is expected */ && ( /* Explicit OPTIONAL specification reaches the end */ (edx + elements[edx].optional == td->elements_count) || /* All extensions are optional */ (IN_EXTENSION_GROUP(specs, edx) && specs->ext_before > td->elements_count) ) ) { ASN_DEBUG("End of SEQUENCE %s", td->name); /* * Found the legitimate end of the structure. */ PHASE_OUT(ctx); RETURN(RC_OK); } /* * Fetch the T from TLV. */ tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); ASN_DEBUG("Current tag in %s SEQUENCE for element %d " "(%s) is %s encoded in %d bytes, of frame %ld", td->name, edx, elements[edx].name, ber_tlv_tag_string(tlv_tag), (int)tag_len, (long)LEFT); switch(tag_len) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); /* Fall through */ case -1: RETURN(RC_FAIL); } if(ctx->left < 0 && ((const uint8_t *)ptr)[0] == 0) { if(LEFT < 2) { if(SIZE_VIOLATION) RETURN(RC_FAIL); else RETURN(RC_WMORE); } else if(((const uint8_t *)ptr)[1] == 0) { ASN_DEBUG("edx = %d, opt = %d, ec=%d", edx, elements[edx].optional, td->elements_count); if((edx + elements[edx].optional == td->elements_count) || (IN_EXTENSION_GROUP(specs, edx) && specs->ext_before > td->elements_count)) { /* * Yeah, baby! Found the terminator * of the indefinite length structure. */ /* * Proceed to the canonical * finalization function. * No advancing is necessary. */ goto phase3; } } } /* * Find the next available type with this tag. */ use_bsearch = 0; opt_edx_end = edx + elements[edx].optional + 1; if(opt_edx_end > td->elements_count) opt_edx_end = td->elements_count; /* Cap */ else if(opt_edx_end - edx > 8) { /* Limit the scope of linear search... */ opt_edx_end = edx + 8; use_bsearch = 1; /* ... and resort to bsearch() */ } for(n = edx; n < opt_edx_end; n++) { if(BER_TAGS_EQUAL(tlv_tag, elements[n].tag)) { /* * Found element corresponding to the tag * being looked at. * Reposition over the right element. */ edx = n; ctx->step = 1 + 2 * edx; /* Remember! */ goto microphase2; } else if(elements[n].flags & ATF_OPEN_TYPE) { /* * This is the ANY type, which may bear * any flag whatsoever. */ edx = n; ctx->step = 1 + 2 * edx; /* Remember! */ goto microphase2; } else if(elements[n].tag == (ber_tlv_tag_t)-1) { use_bsearch = 1; break; } } if(use_bsearch) { /* * Resort to a binary search over * sorted array of tags. */ asn_TYPE_tag2member_t *t2m; asn_TYPE_tag2member_t key; key.el_tag = tlv_tag; key.el_no = edx; t2m = (asn_TYPE_tag2member_t *)bsearch(&key, specs->tag2el, specs->tag2el_count, sizeof(specs->tag2el[0]), _t2e_cmp); if(t2m) { asn_TYPE_tag2member_t *best = 0; asn_TYPE_tag2member_t *t2m_f, *t2m_l; int edx_max = edx + elements[edx].optional; /* * Rewind to the first element with that tag, * `cause bsearch() does not guarantee order. */ t2m_f = t2m + t2m->toff_first; t2m_l = t2m + t2m->toff_last; for(t2m = t2m_f; t2m <= t2m_l; t2m++) { if(t2m->el_no > edx_max) break; if(t2m->el_no < edx) continue; best = t2m; } if(best) { edx = best->el_no; ctx->step = 1 + 2 * edx; goto microphase2; } } n = opt_edx_end; } if(n == opt_edx_end) { /* * If tag is unknown, it may be either * an unknown (thus, incorrect) tag, * or an extension (...), * or an end of the indefinite-length structure. */ if(!IN_EXTENSION_GROUP(specs, edx + elements[edx].optional)) { ASN_DEBUG("Unexpected tag %s (at %d)", ber_tlv_tag_string(tlv_tag), edx); ASN_DEBUG("Expected tag %s (%s)%s", ber_tlv_tag_string(elements[edx].tag), elements[edx].name, elements[edx].optional ?" or alternatives":""); RETURN(RC_FAIL); } else { /* Skip this tag */ ssize_t skip; edx += elements[edx].optional; ASN_DEBUG("Skipping unexpected %s (at %d)", ber_tlv_tag_string(tlv_tag), edx); skip = ber_skip_length(opt_codec_ctx, BER_TLV_CONSTRUCTED(ptr), (const char *)ptr + tag_len, LEFT - tag_len); ASN_DEBUG("Skip length %d in %s", (int)skip, td->name); switch(skip) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); /* Fall through */ case -1: RETURN(RC_FAIL); } ADVANCE(skip + tag_len); ctx->step -= 2; edx--; continue; /* Try again with the next tag */ } } /* * MICROPHASE 2: Invoke the member-specific decoder. */ ctx->step |= 1; /* Confirm entering next microphase */ microphase2: ASN_DEBUG("Inside SEQUENCE %s MF2", td->name); /* * Compute the position of the member inside a structure, * and also a type of containment (it may be contained * as pointer or using inline inclusion). */ if(elements[edx].flags & ATF_POINTER) { /* Member is a pointer to another structure */ memb_ptr2 = (void **)((char *)st + elements[edx].memb_offset); } else { /* * A pointer to a pointer * holding the start of the structure */ memb_ptr = (char *)st + elements[edx].memb_offset; memb_ptr2 = &memb_ptr; } /* * Invoke the member fetch routine according to member's type */ rval = elements[edx].type->ber_decoder(opt_codec_ctx, elements[edx].type, memb_ptr2, ptr, LEFT, elements[edx].tag_mode); ASN_DEBUG("In %s SEQUENCE decoded %d %s of %d " "in %d bytes rval.code %d, size=%d", td->name, edx, elements[edx].type->name, (int)LEFT, (int)rval.consumed, rval.code, (int)size); switch(rval.code) { case RC_OK: break; case RC_WMORE: /* More data expected */ if(!SIZE_VIOLATION) { ADVANCE(rval.consumed); RETURN(RC_WMORE); } ASN_DEBUG("Size violation (c->l=%ld <= s=%ld)", (long)ctx->left, (long)size); /* Fall through */ case RC_FAIL: /* Fatal error */ RETURN(RC_FAIL); } /* switch(rval) */ ADVANCE(rval.consumed); } /* for(all structure members) */ phase3: ctx->phase = 3; case 3: /* 00 and other tags expected */ case 4: /* only 00's expected */ ASN_DEBUG("SEQUENCE %s Leftover: %ld, size = %ld", td->name, (long)ctx->left, (long)size); /* * Skip everything until the end of the SEQUENCE. */ while(ctx->left) { ssize_t tl, ll; tl = ber_fetch_tag(ptr, LEFT, &tlv_tag); switch(tl) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); /* Fall through */ case -1: RETURN(RC_FAIL); } /* * If expected <0><0>... */ if(ctx->left < 0 && ((const uint8_t *)ptr)[0] == 0) { if(LEFT < 2) { if(SIZE_VIOLATION) RETURN(RC_FAIL); else RETURN(RC_WMORE); } else if(((const uint8_t *)ptr)[1] == 0) { /* * Correctly finished with <0><0>. */ ADVANCE(2); ctx->left++; ctx->phase = 4; continue; } } if(!IN_EXTENSION_GROUP(specs, td->elements_count) || ctx->phase == 4) { ASN_DEBUG("Unexpected continuation " "of a non-extensible type " "%s (SEQUENCE): %s", td->name, ber_tlv_tag_string(tlv_tag)); RETURN(RC_FAIL); } ll = ber_skip_length(opt_codec_ctx, BER_TLV_CONSTRUCTED(ptr), (const char *)ptr + tl, LEFT - tl); switch(ll) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); /* Fall through */ case -1: RETURN(RC_FAIL); } ADVANCE(tl + ll); } PHASE_OUT(ctx); } RETURN(RC_OK); } /* * The DER encoder of the SEQUENCE type. */ asn_enc_rval_t SEQUENCE_encode_der(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { size_t computed_size = 0; asn_enc_rval_t erval; ssize_t ret; int edx; ASN_DEBUG("%s %s as SEQUENCE", cb?"Encoding":"Estimating", td->name); /* * Gather the length of the underlying members sequence. */ for(edx = 0; edx < td->elements_count; edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)sptr + elm->memb_offset); if(!memb_ptr) { if(elm->optional) continue; /* Mandatory element is missing */ _ASN_ENCODE_FAILED; } } else { memb_ptr = (void *)((char *)sptr + elm->memb_offset); } erval = elm->type->der_encoder(elm->type, memb_ptr, elm->tag_mode, elm->tag, 0, 0); if(erval.encoded == -1) return erval; computed_size += erval.encoded; ASN_DEBUG("Member %d %s estimated %ld bytes", edx, elm->name, (long)erval.encoded); } /* * Encode the TLV for the sequence itself. */ ret = der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key); ASN_DEBUG("Wrote tags: %ld (+%ld)", (long)ret, (long)computed_size); if(ret == -1) _ASN_ENCODE_FAILED; erval.encoded = computed_size + ret; if(!cb) _ASN_ENCODED_OK(erval); /* * Encode all members. */ for(edx = 0; edx < td->elements_count; edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; asn_enc_rval_t tmperval; void *memb_ptr; if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)sptr + elm->memb_offset); if(!memb_ptr) continue; } else { memb_ptr = (void *)((char *)sptr + elm->memb_offset); } tmperval = elm->type->der_encoder(elm->type, memb_ptr, elm->tag_mode, elm->tag, cb, app_key); if(tmperval.encoded == -1) return tmperval; computed_size -= tmperval.encoded; ASN_DEBUG("Member %d %s of SEQUENCE %s encoded in %ld bytes", edx, elm->name, td->name, (long)tmperval.encoded); } if(computed_size != 0) /* * Encoded size is not equal to the computed size. */ _ASN_ENCODE_FAILED; _ASN_ENCODED_OK(erval); } #undef XER_ADVANCE #define XER_ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ buf_ptr = ((const char *)buf_ptr) + num;\ size -= num; \ consumed_myself += num; \ } while(0) /* * Decode the XER (XML) data. */ asn_dec_rval_t SEQUENCE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **struct_ptr, const char *opt_mname, const void *buf_ptr, size_t size) { /* * Bring closer parts of structure description. */ asn_SEQUENCE_specifics_t *specs = (asn_SEQUENCE_specifics_t *)td->specifics; asn_TYPE_member_t *elements = td->elements; const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; /* * ... and parts of the structure being constructed. */ void *st = *struct_ptr; /* Target structure. */ asn_struct_ctx_t *ctx; /* Decoder context */ asn_dec_rval_t rval; /* Return value from a decoder */ ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ int edx; /* Element index */ int edx_end; /* * Create the target structure if it is not present already. */ if(st == 0) { st = *struct_ptr = CALLOC(1, specs->struct_size); if(st == 0) RETURN(RC_FAIL); } /* * Restore parsing context. */ ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); /* * Phases of XER/XML processing: * Phase 0: Check that the opening tag matches our expectations. * Phase 1: Processing body and reacting on closing tag. * Phase 2: Processing inner type. * Phase 3: Skipping unknown extensions. * Phase 4: PHASED OUT */ for(edx = ctx->step; ctx->phase <= 3;) { pxer_chunk_type_e ch_type; /* XER chunk type */ ssize_t ch_size; /* Chunk size */ xer_check_tag_e tcv; /* Tag check value */ asn_TYPE_member_t *elm; int n; /* * Go inside the inner member of a sequence. */ if(ctx->phase == 2) { asn_dec_rval_t tmprval; void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ elm = &td->elements[edx]; if(elm->flags & ATF_POINTER) { /* Member is a pointer to another structure */ memb_ptr2 = (void **)((char *)st + elm->memb_offset); } else { memb_ptr = (char *)st + elm->memb_offset; memb_ptr2 = &memb_ptr; } /* Invoke the inner type decoder, m.b. multiple times */ tmprval = elm->type->xer_decoder(opt_codec_ctx, elm->type, memb_ptr2, elm->name, buf_ptr, size); XER_ADVANCE(tmprval.consumed); if(tmprval.code != RC_OK) RETURN(tmprval.code); ctx->phase = 1; /* Back to body processing */ ctx->step = ++edx; ASN_DEBUG("XER/SEQUENCE phase => %d, step => %d", ctx->phase, ctx->step); /* Fall through */ } /* * Get the next part of the XML stream. */ ch_size = xer_next_token(&ctx->context, buf_ptr, size, &ch_type); switch(ch_size) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); default: switch(ch_type) { case PXER_COMMENT: /* Got XML comment */ case PXER_TEXT: /* Ignore free-standing text */ XER_ADVANCE(ch_size); /* Skip silently */ continue; case PXER_TAG: break; /* Check the rest down there */ } } tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); ASN_DEBUG("XER/SEQUENCE: tcv = %d, ph=%d [%s]", tcv, ctx->phase, xml_tag); /* Skip the extensions section */ if(ctx->phase == 3) { switch(xer_skip_unknown(tcv, &ctx->left)) { case -1: ctx->phase = 4; RETURN(RC_FAIL); case 0: XER_ADVANCE(ch_size); continue; case 1: XER_ADVANCE(ch_size); ctx->phase = 1; continue; case 2: ctx->phase = 1; break; } } switch(tcv) { case XCT_CLOSING: if(ctx->phase == 0) break; ctx->phase = 0; /* Fall through */ case XCT_BOTH: if(ctx->phase == 0) { if(edx >= td->elements_count || /* Explicit OPTIONAL specs reaches the end */ (edx + elements[edx].optional == td->elements_count) || /* All extensions are optional */ (IN_EXTENSION_GROUP(specs, edx) && specs->ext_before > td->elements_count) ) { XER_ADVANCE(ch_size); ctx->phase = 4; /* Phase out */ RETURN(RC_OK); } else { ASN_DEBUG("Premature end of XER SEQUENCE"); RETURN(RC_FAIL); } } /* Fall through */ case XCT_OPENING: if(ctx->phase == 0) { XER_ADVANCE(ch_size); ctx->phase = 1; /* Processing body phase */ continue; } /* Fall through */ case XCT_UNKNOWN_OP: case XCT_UNKNOWN_BO: ASN_DEBUG("XER/SEQUENCE: tcv=%d, ph=%d, edx=%d", tcv, ctx->phase, edx); if(ctx->phase != 1) { break; /* Really unexpected */ } if(edx < td->elements_count) { /* * Search which member corresponds to this tag. */ edx_end = edx + elements[edx].optional + 1; if(edx_end > td->elements_count) edx_end = td->elements_count; for(n = edx; n < edx_end; n++) { elm = &td->elements[n]; tcv = xer_check_tag(buf_ptr, ch_size, elm->name); switch(tcv) { case XCT_BOTH: case XCT_OPENING: /* * Process this member. */ ctx->step = edx = n; ctx->phase = 2; break; case XCT_UNKNOWN_OP: case XCT_UNKNOWN_BO: continue; default: n = edx_end; break; /* Phase out */ } break; } if(n != edx_end) continue; } else { ASN_DEBUG("Out of defined members: %d/%d", edx, td->elements_count); } /* It is expected extension */ if(IN_EXTENSION_GROUP(specs, edx + (edx < td->elements_count ? elements[edx].optional : 0))) { ASN_DEBUG("Got anticipated extension at %d", edx); /* * Check for (XCT_BOTH or XCT_UNKNOWN_BO) * By using a mask. Only record a pure * tags. */ if(tcv & XCT_CLOSING) { /* Found without body */ } else { ctx->left = 1; ctx->phase = 3; /* Skip ...'s */ } XER_ADVANCE(ch_size); continue; } /* Fall through */ default: break; } ASN_DEBUG("Unexpected XML tag in SEQUENCE [%c%c%c%c%c%c]", size>0?((const char *)buf_ptr)[0]:'.', size>1?((const char *)buf_ptr)[1]:'.', size>2?((const char *)buf_ptr)[2]:'.', size>3?((const char *)buf_ptr)[3]:'.', size>4?((const char *)buf_ptr)[4]:'.', size>5?((const char *)buf_ptr)[5]:'.'); break; } ctx->phase = 4; /* "Phase out" on hard failure */ RETURN(RC_FAIL); } asn_enc_rval_t SEQUENCE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t er; int xcan = (flags & XER_F_CANONICAL); int edx; if(!sptr) _ASN_ENCODE_FAILED; er.encoded = 0; for(edx = 0; edx < td->elements_count; edx++) { asn_enc_rval_t tmper; asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; const char *mname = elm->name; unsigned int mlen = strlen(mname); if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)sptr + elm->memb_offset); if(!memb_ptr) { if(elm->optional) continue; /* Mandatory element is missing */ _ASN_ENCODE_FAILED; } } else { memb_ptr = (void *)((char *)sptr + elm->memb_offset); } if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel); _ASN_CALLBACK3("<", 1, mname, mlen, ">", 1); /* Print the member itself */ tmper = elm->type->xer_encoder(elm->type, memb_ptr, ilevel + 1, flags, cb, app_key); if(tmper.encoded == -1) return tmper; _ASN_CALLBACK3("", 1); er.encoded += 5 + (2 * mlen) + tmper.encoded; } if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel - 1); _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } int SEQUENCE_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { int edx; int ret; if(!sptr) return (cb("", 8, app_key) < 0) ? -1 : 0; /* Dump preamble */ if(cb(td->name, strlen(td->name), app_key) < 0 || cb(" ::= {", 6, app_key) < 0) return -1; for(edx = 0; edx < td->elements_count; edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; const void *memb_ptr; if(elm->flags & ATF_POINTER) { memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); if(!memb_ptr) { if(elm->optional) continue; /* Print line */ /* Fall through */ } } else { memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); } /* Indentation */ _i_INDENT(1); /* Print the member's name and stuff */ if(cb(elm->name, strlen(elm->name), app_key) < 0 || cb(": ", 2, app_key) < 0) return -1; /* Print the member itself */ ret = elm->type->print_struct(elm->type, memb_ptr, ilevel + 1, cb, app_key); if(ret) return ret; } ilevel--; _i_INDENT(1); return (cb("}", 1, app_key) < 0) ? -1 : 0; } void SEQUENCE_free(asn_TYPE_descriptor_t *td, void *sptr, int contents_only) { int edx; if(!td || !sptr) return; ASN_DEBUG("Freeing %s as SEQUENCE", td->name); for(edx = 0; edx < td->elements_count; edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)sptr + elm->memb_offset); if(memb_ptr) ASN_STRUCT_FREE(*elm->type, memb_ptr); } else { memb_ptr = (void *)((char *)sptr + elm->memb_offset); ASN_STRUCT_FREE_CONTENTS_ONLY(*elm->type, memb_ptr); } } if(!contents_only) { FREEMEM(sptr); } } int SEQUENCE_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { int edx; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } /* * Iterate over structure members and check their validity. */ for(edx = 0; edx < td->elements_count; edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; const void *memb_ptr; if(elm->flags & ATF_POINTER) { memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); if(!memb_ptr) { if(elm->optional) continue; _ASN_CTFAIL(app_key, td, sptr, "%s: mandatory element %s absent (%s:%d)", td->name, elm->name, __FILE__, __LINE__); return -1; } } else { memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); } if(elm->memb_constraints) { int ret = elm->memb_constraints(elm->type, memb_ptr, ctfailcb, app_key); if(ret) return ret; } else { int ret = elm->type->check_constraints(elm->type, memb_ptr, ctfailcb, app_key); if(ret) return ret; /* * Cannot inherit it earlier: * need to make sure we get the updated version. */ elm->memb_constraints = elm->type->check_constraints; } } return 0; } asn_dec_rval_t SEQUENCE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { asn_SEQUENCE_specifics_t *specs = (asn_SEQUENCE_specifics_t *)td->specifics; void *st = *sptr; /* Target structure. */ int extpresent; /* Extension additions are present */ uint8_t *opres; /* Presence of optional root members */ asn_per_data_t opmd; asn_dec_rval_t rv; int edx; (void)constraints; if(_ASN_STACK_OVERFLOW_CHECK(opt_codec_ctx)) _ASN_DECODE_FAILED; if(!st) { st = *sptr = CALLOC(1, specs->struct_size); if(!st) _ASN_DECODE_FAILED; } ASN_DEBUG("Decoding %s as SEQUENCE (UPER)", td->name); /* Handle extensions */ if(specs->ext_before >= 0) { extpresent = per_get_few_bits(pd, 1); if(extpresent < 0) _ASN_DECODE_STARVED; } else { extpresent = 0; } /* Prepare a place and read-in the presence bitmap */ memset(&opmd, 0, sizeof(opmd)); if(specs->roms_count) { opres = (uint8_t *)MALLOC(((specs->roms_count + 7) >> 3) + 1); if(!opres) _ASN_DECODE_FAILED; /* Get the presence map */ if(per_get_many_bits(pd, opres, 0, specs->roms_count)) { FREEMEM(opres); _ASN_DECODE_STARVED; } opmd.buffer = opres; opmd.nbits = specs->roms_count; ASN_DEBUG("Read in presence bitmap for %s of %d bits (%x..)", td->name, specs->roms_count, *opres); } else { opres = 0; } /* * Get the sequence ROOT elements. */ for(edx = 0; edx < td->elements_count; edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ if(IN_EXTENSION_GROUP(specs, edx)) continue; /* Fetch the pointer to this member */ if(elm->flags & ATF_POINTER) { memb_ptr2 = (void **)((char *)st + elm->memb_offset); } else { memb_ptr = (char *)st + elm->memb_offset; memb_ptr2 = &memb_ptr; } /* Deal with optionality */ if(elm->optional) { int present = per_get_few_bits(&opmd, 1); ASN_DEBUG("Member %s->%s is optional, p=%d (%d->%d)", td->name, elm->name, present, (int)opmd.nboff, (int)opmd.nbits); if(present == 0) { /* This element is not present */ if(elm->default_value) { /* Fill-in DEFAULT */ if(elm->default_value(1, memb_ptr2)) { FREEMEM(opres); _ASN_DECODE_FAILED; } ASN_DEBUG("Filled-in default"); } /* The member is just not present */ continue; } /* Fall through */ } /* Fetch the member from the stream */ ASN_DEBUG("Decoding member %s in %s", elm->name, td->name); rv = elm->type->uper_decoder(opt_codec_ctx, elm->type, elm->per_constraints, memb_ptr2, pd); if(rv.code != RC_OK) { ASN_DEBUG("Failed decode %s in %s", elm->name, td->name); FREEMEM(opres); return rv; } } /* Optionality map is not needed anymore */ FREEMEM(opres); /* * Deal with extensions. */ if(extpresent) { ssize_t bmlength; uint8_t *epres; /* Presence of extension members */ asn_per_data_t epmd; bmlength = uper_get_nslength(pd); if(bmlength < 0) _ASN_DECODE_STARVED; ASN_DEBUG("Extensions %d present in %s", bmlength, td->name); epres = (uint8_t *)MALLOC((bmlength + 15) >> 3); if(!epres) _ASN_DECODE_STARVED; /* Get the extensions map */ if(per_get_many_bits(pd, epres, 0, bmlength)) _ASN_DECODE_STARVED; memset(&epmd, 0, sizeof(epmd)); epmd.buffer = epres; epmd.nbits = bmlength; ASN_DEBUG("Read in extensions bitmap for %s of %d bits (%x..)", td->name, bmlength, *epres); /* Go over extensions and read them in */ for(edx = specs->ext_after + 1; edx < td->elements_count; edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ int present; if(!IN_EXTENSION_GROUP(specs, edx)) { ASN_DEBUG("%d is not extension", edx); continue; } /* Fetch the pointer to this member */ if(elm->flags & ATF_POINTER) { memb_ptr2 = (void **)((char *)st + elm->memb_offset); } else { memb_ptr = (void *)((char *)st + elm->memb_offset); memb_ptr2 = &memb_ptr; } present = per_get_few_bits(&epmd, 1); if(present <= 0) { if(present < 0) break; /* No more extensions */ continue; } ASN_DEBUG("Decoding member %s in %s %p", elm->name, td->name, *memb_ptr2); rv = uper_open_type_get(opt_codec_ctx, elm->type, elm->per_constraints, memb_ptr2, pd); if(rv.code != RC_OK) { FREEMEM(epres); return rv; } } /* Skip over overflow extensions which aren't present * in this system's version of the protocol */ for(;;) { ASN_DEBUG("Getting overflow extensions"); switch(per_get_few_bits(&epmd, 1)) { case -1: break; case 0: continue; default: if(uper_open_type_skip(opt_codec_ctx, pd)) { FREEMEM(epres); _ASN_DECODE_STARVED; } } break; } FREEMEM(epres); } /* Fill DEFAULT members in extensions */ for(edx = specs->roms_count; edx < specs->roms_count + specs->aoms_count; edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; void **memb_ptr2; /* Pointer to member pointer */ if(!elm->default_value) continue; /* Fetch the pointer to this member */ if(elm->flags & ATF_POINTER) { memb_ptr2 = (void **)((char *)st + elm->memb_offset); if(*memb_ptr2) continue; } else { continue; /* Extensions are all optionals */ } /* Set default value */ if(elm->default_value(1, memb_ptr2)) { _ASN_DECODE_FAILED; } } rv.consumed = 0; rv.code = RC_OK; return rv; } static int SEQUENCE_handle_extensions(asn_TYPE_descriptor_t *td, void *sptr, asn_per_outp_t *po1, asn_per_outp_t *po2) { asn_SEQUENCE_specifics_t *specs = (asn_SEQUENCE_specifics_t *)td->specifics; int exts_present = 0; int exts_count = 0; int edx; if(specs->ext_before < 0) return 0; /* Find out which extensions are present */ for(edx = specs->ext_after + 1; edx < td->elements_count; edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ int present; if(!IN_EXTENSION_GROUP(specs, edx)) { ASN_DEBUG("%s (@%d) is not extension", elm->type->name, edx); continue; } /* Fetch the pointer to this member */ if(elm->flags & ATF_POINTER) { memb_ptr2 = (void **)((char *)sptr + elm->memb_offset); present = (*memb_ptr2 != 0); } else { memb_ptr = (void *)((char *)sptr + elm->memb_offset); memb_ptr2 = &memb_ptr; present = 1; } ASN_DEBUG("checking %s (@%d) present => %d", elm->type->name, edx, present); exts_count++; exts_present += present; /* Encode as presence marker */ if(po1 && per_put_few_bits(po1, present, 1)) return -1; /* Encode as open type field */ if(po2 && present && uper_open_type_put(elm->type, elm->per_constraints, *memb_ptr2, po2)) return -1; } return exts_present ? exts_count : 0; } asn_enc_rval_t SEQUENCE_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { asn_SEQUENCE_specifics_t *specs = (asn_SEQUENCE_specifics_t *)td->specifics; asn_enc_rval_t er; int n_extensions; int edx; int i; (void)constraints; if(!sptr) _ASN_ENCODE_FAILED; er.encoded = 0; ASN_DEBUG("Encoding %s as SEQUENCE (UPER)", td->name); /* * X.691#18.1 Whether structure is extensible * and whether to encode extensions */ if(specs->ext_before >= 0) { n_extensions = SEQUENCE_handle_extensions(td, sptr, 0, 0); per_put_few_bits(po, n_extensions ? 1 : 0, 1); } else { n_extensions = 0; /* There are no extensions to encode */ } /* Encode a presence bitmap */ for(i = 0; i < specs->roms_count; i++) { asn_TYPE_member_t *elm; void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ int present; edx = specs->oms[i]; elm = &td->elements[edx]; /* Fetch the pointer to this member */ if(elm->flags & ATF_POINTER) { memb_ptr2 = (void **)((char *)sptr + elm->memb_offset); present = (*memb_ptr2 != 0); } else { memb_ptr = (void *)((char *)sptr + elm->memb_offset); memb_ptr2 = &memb_ptr; present = 1; } /* Eliminate default values */ if(present && elm->default_value && elm->default_value(0, memb_ptr2) == 1) present = 0; ASN_DEBUG("Element %s %s %s->%s is %s", elm->flags & ATF_POINTER ? "ptr" : "inline", elm->default_value ? "def" : "wtv", td->name, elm->name, present ? "present" : "absent"); if(per_put_few_bits(po, present, 1)) _ASN_ENCODE_FAILED; } /* * Encode the sequence ROOT elements. */ ASN_DEBUG("ext_after = %d, ec = %d, eb = %d", specs->ext_after, td->elements_count, specs->ext_before); for(edx = 0; edx < ((specs->ext_after < 0) ? td->elements_count : specs->ext_before - 1); edx++) { asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; /* Pointer to the member */ void **memb_ptr2; /* Pointer to that pointer */ if(IN_EXTENSION_GROUP(specs, edx)) continue; ASN_DEBUG("About to encode %s", elm->type->name); /* Fetch the pointer to this member */ if(elm->flags & ATF_POINTER) { memb_ptr2 = (void **)((char *)sptr + elm->memb_offset); if(!*memb_ptr2) { ASN_DEBUG("Element %s %d not present", elm->name, edx); if(elm->optional) continue; /* Mandatory element is missing */ _ASN_ENCODE_FAILED; } } else { memb_ptr = (void *)((char *)sptr + elm->memb_offset); memb_ptr2 = &memb_ptr; } /* Eliminate default values */ if(elm->default_value && elm->default_value(0, memb_ptr2) == 1) continue; ASN_DEBUG("Encoding %s->%s", td->name, elm->name); er = elm->type->uper_encoder(elm->type, elm->per_constraints, *memb_ptr2, po); if(er.encoded == -1) return er; } /* No extensions to encode */ if(!n_extensions) _ASN_ENCODED_OK(er); ASN_DEBUG("Length of %d bit-map", n_extensions); /* #18.8. Write down the presence bit-map length. */ if(uper_put_nslength(po, n_extensions)) _ASN_ENCODE_FAILED; ASN_DEBUG("Bit-map of %d elements", n_extensions); /* #18.7. Encoding the extensions presence bit-map. */ /* TODO: act upon NOTE in #18.7 for canonical PER */ if(SEQUENCE_handle_extensions(td, sptr, po, 0) != n_extensions) _ASN_ENCODE_FAILED; ASN_DEBUG("Writing %d extensions", n_extensions); /* #18.9. Encode extensions as open type fields. */ if(SEQUENCE_handle_extensions(td, sptr, 0, po) != n_extensions) _ASN_ENCODE_FAILED; _ASN_ENCODED_OK(er); } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/constr_SEQUENCE.h000066400000000000000000000027641305042567700234500ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _CONSTR_SEQUENCE_H_ #define _CONSTR_SEQUENCE_H_ #include #ifdef __cplusplus extern "C" { #endif typedef struct asn_SEQUENCE_specifics_s { /* * Target structure description. */ int struct_size; /* Size of the target structure. */ int ctx_offset; /* Offset of the asn_struct_ctx_t member */ /* * Tags to members mapping table (sorted). */ asn_TYPE_tag2member_t *tag2el; int tag2el_count; /* * Optional members of the extensions root (roms) or additions (aoms). * Meaningful for PER. */ int *oms; /* Optional MemberS */ int roms_count; /* Root optional members count */ int aoms_count; /* Additions optional members count */ /* * Description of an extensions group. */ int ext_after; /* Extensions start after this member */ int ext_before; /* Extensions stop before this member */ } asn_SEQUENCE_specifics_t; /* * A set specialized functions dealing with the SEQUENCE type. */ asn_struct_free_f SEQUENCE_free; asn_struct_print_f SEQUENCE_print; asn_constr_check_f SEQUENCE_constraint; ber_type_decoder_f SEQUENCE_decode_ber; der_type_encoder_f SEQUENCE_encode_der; xer_type_decoder_f SEQUENCE_decode_xer; xer_type_encoder_f SEQUENCE_encode_xer; per_type_decoder_f SEQUENCE_decode_uper; per_type_encoder_f SEQUENCE_encode_uper; #ifdef __cplusplus } #endif #endif /* _CONSTR_SEQUENCE_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/constr_SEQUENCE_OF.c000066400000000000000000000124051305042567700240200ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004, 2006 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include /* * The DER encoder of the SEQUENCE OF type. */ asn_enc_rval_t SEQUENCE_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { asn_TYPE_member_t *elm = td->elements; asn_anonymous_sequence_ *list = _A_SEQUENCE_FROM_VOID(ptr); size_t computed_size = 0; ssize_t encoding_size = 0; asn_enc_rval_t erval; int edx; ASN_DEBUG("Estimating size of SEQUENCE OF %s", td->name); /* * Gather the length of the underlying members sequence. */ for(edx = 0; edx < list->count; edx++) { void *memb_ptr = list->array[edx]; if(!memb_ptr) continue; erval = elm->type->der_encoder(elm->type, memb_ptr, 0, elm->tag, 0, 0); if(erval.encoded == -1) return erval; computed_size += erval.encoded; } /* * Encode the TLV for the sequence itself. */ encoding_size = der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key); if(encoding_size == -1) { erval.encoded = -1; erval.failed_type = td; erval.structure_ptr = ptr; return erval; } computed_size += encoding_size; if(!cb) { erval.encoded = computed_size; _ASN_ENCODED_OK(erval); } ASN_DEBUG("Encoding members of SEQUENCE OF %s", td->name); /* * Encode all members. */ for(edx = 0; edx < list->count; edx++) { void *memb_ptr = list->array[edx]; if(!memb_ptr) continue; erval = elm->type->der_encoder(elm->type, memb_ptr, 0, elm->tag, cb, app_key); if(erval.encoded == -1) return erval; encoding_size += erval.encoded; } if(computed_size != (size_t)encoding_size) { /* * Encoded size is not equal to the computed size. */ erval.encoded = -1; erval.failed_type = td; erval.structure_ptr = ptr; } else { erval.encoded = computed_size; erval.structure_ptr = 0; erval.failed_type = 0; } return erval; } asn_enc_rval_t SEQUENCE_OF_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t er; asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics; asn_TYPE_member_t *elm = td->elements; asn_anonymous_sequence_ *list = _A_SEQUENCE_FROM_VOID(sptr); const char *mname = specs->as_XMLValueList ? 0 : ((*elm->name) ? elm->name : elm->type->xml_tag); unsigned int mlen = mname ? strlen(mname) : 0; int xcan = (flags & XER_F_CANONICAL); int i; if(!sptr) _ASN_ENCODE_FAILED; er.encoded = 0; for(i = 0; i < list->count; i++) { asn_enc_rval_t tmper; void *memb_ptr = list->array[i]; if(!memb_ptr) continue; if(mname) { if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel); _ASN_CALLBACK3("<", 1, mname, mlen, ">", 1); } tmper = elm->type->xer_encoder(elm->type, memb_ptr, ilevel + 1, flags, cb, app_key); if(tmper.encoded == -1) return tmper; if(tmper.encoded == 0 && specs->as_XMLValueList) { const char *name = elm->type->xml_tag; size_t len = strlen(name); if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel + 1); _ASN_CALLBACK3("<", 1, name, len, "/>", 2); } if(mname) { _ASN_CALLBACK3("", 1); er.encoded += 5; } er.encoded += (2 * mlen) + tmper.encoded; } if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel - 1); _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } asn_enc_rval_t SEQUENCE_OF_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { asn_anonymous_sequence_ *list; asn_per_constraint_t *ct; asn_enc_rval_t er; asn_TYPE_member_t *elm = td->elements; int seq; if(!sptr) _ASN_ENCODE_FAILED; list = _A_SEQUENCE_FROM_VOID(sptr); er.encoded = 0; ASN_DEBUG("Encoding %s as SEQUENCE OF (%d)", td->name, list->count); if(constraints) ct = &constraints->size; else if(td->per_constraints) ct = &td->per_constraints->size; else ct = 0; /* If extensible constraint, check if size is in root */ if(ct) { int not_in_root = (list->count < ct->lower_bound || list->count > ct->upper_bound); ASN_DEBUG("lb %ld ub %ld %s", ct->lower_bound, ct->upper_bound, ct->flags & APC_EXTENSIBLE ? "ext" : "fix"); if(ct->flags & APC_EXTENSIBLE) { /* Declare whether size is in extension root */ if(per_put_few_bits(po, not_in_root, 1)) _ASN_ENCODE_FAILED; if(not_in_root) ct = 0; } else if(not_in_root && ct->effective_bits >= 0) _ASN_ENCODE_FAILED; } if(ct && ct->effective_bits >= 0) { /* X.691, #19.5: No length determinant */ if(per_put_few_bits(po, list->count - ct->lower_bound, ct->effective_bits)) _ASN_ENCODE_FAILED; } for(seq = -1; seq < list->count;) { ssize_t mayEncode; if(seq < 0) seq = 0; if(ct && ct->effective_bits >= 0) { mayEncode = list->count; } else { mayEncode = uper_put_length(po, list->count - seq); if(mayEncode < 0) _ASN_ENCODE_FAILED; } while(mayEncode--) { void *memb_ptr = list->array[seq++]; if(!memb_ptr) _ASN_ENCODE_FAILED; er = elm->type->uper_encoder(elm->type, elm->per_constraints, memb_ptr, po); if(er.encoded == -1) _ASN_ENCODE_FAILED; } } _ASN_ENCODED_OK(er); } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/constr_SEQUENCE_OF.h000066400000000000000000000016421305042567700240260ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2005 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _CONSTR_SEQUENCE_OF_H_ #define _CONSTR_SEQUENCE_OF_H_ #include #include /* Implemented using SET OF */ #ifdef __cplusplus extern "C" { #endif /* * A set specialized functions dealing with the SEQUENCE OF type. * Generally implemented using SET OF. */ #define SEQUENCE_OF_free SET_OF_free #define SEQUENCE_OF_print SET_OF_print #define SEQUENCE_OF_constraint SET_OF_constraint #define SEQUENCE_OF_decode_ber SET_OF_decode_ber #define SEQUENCE_OF_decode_xer SET_OF_decode_xer #define SEQUENCE_OF_decode_uper SET_OF_decode_uper der_type_encoder_f SEQUENCE_OF_encode_der; xer_type_encoder_f SEQUENCE_OF_encode_xer; per_type_encoder_f SEQUENCE_OF_encode_uper; #ifdef __cplusplus } #endif #endif /* _CONSTR_SET_OF_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/constr_SET_OF.c000066400000000000000000000557761305042567700232650ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004, 2005 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include /* * Number of bytes left for this structure. * (ctx->left) indicates the number of bytes _transferred_ for the structure. * (size) contains the number of bytes in the buffer passed. */ #define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) /* * If the subprocessor function returns with an indication that it wants * more data, it may well be a fatal decoding problem, because the * size is constrained by the 's L, even if the buffer size allows * reading more data. * For example, consider the buffer containing the following TLVs: * ... * The TLV length clearly indicates that one byte is expected in V, but * if the V processor returns with "want more data" even if the buffer * contains way more data than the V processor have seen. */ #define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) /* * This macro "eats" the part of the buffer which is definitely "consumed", * i.e. was correctly converted into local representation or rightfully skipped. */ #undef ADVANCE #define ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ ptr = ((const char *)ptr) + num;\ size -= num; \ if(ctx->left >= 0) \ ctx->left -= num; \ consumed_myself += num; \ } while(0) /* * Switch to the next phase of parsing. */ #undef NEXT_PHASE #undef PHASE_OUT #define NEXT_PHASE(ctx) do { \ ctx->phase++; \ ctx->step = 0; \ } while(0) #define PHASE_OUT(ctx) do { ctx->phase = 10; } while(0) /* * Return a standardized complex structure. */ #undef RETURN #define RETURN(_code) do { \ rval.code = _code; \ rval.consumed = consumed_myself;\ return rval; \ } while(0) /* * The decoder of the SET OF type. */ asn_dec_rval_t SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **struct_ptr, const void *ptr, size_t size, int tag_mode) { /* * Bring closer parts of structure description. */ asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics; asn_TYPE_member_t *elm = td->elements; /* Single one */ /* * Parts of the structure being constructed. */ void *st = *struct_ptr; /* Target structure. */ asn_struct_ctx_t *ctx; /* Decoder context */ ber_tlv_tag_t tlv_tag; /* T from TLV */ asn_dec_rval_t rval; /* Return code from subparsers */ ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ ASN_DEBUG("Decoding %s as SET OF", td->name); /* * Create the target structure if it is not present already. */ if(st == 0) { st = *struct_ptr = CALLOC(1, specs->struct_size); if(st == 0) { RETURN(RC_FAIL); } } /* * Restore parsing context. */ ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); /* * Start to parse where left previously */ switch(ctx->phase) { case 0: /* * PHASE 0. * Check that the set of tags associated with given structure * perfectly fits our expectations. */ rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, tag_mode, 1, &ctx->left, 0); if(rval.code != RC_OK) { ASN_DEBUG("%s tagging check failed: %d", td->name, rval.code); return rval; } if(ctx->left >= 0) ctx->left += rval.consumed; /* ?Substracted below! */ ADVANCE(rval.consumed); ASN_DEBUG("Structure consumes %ld bytes, " "buffer %ld", (long)ctx->left, (long)size); NEXT_PHASE(ctx); /* Fall through */ case 1: /* * PHASE 1. * From the place where we've left it previously, * try to decode the next item. */ for(;; ctx->step = 0) { ssize_t tag_len; /* Length of TLV's T */ if(ctx->step & 1) goto microphase2; /* * MICROPHASE 1: Synchronize decoding. */ if(ctx->left == 0) { ASN_DEBUG("End of SET OF %s", td->name); /* * No more things to decode. * Exit out of here. */ PHASE_OUT(ctx); RETURN(RC_OK); } /* * Fetch the T from TLV. */ tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); switch(tag_len) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); /* Fall through */ case -1: RETURN(RC_FAIL); } if(ctx->left < 0 && ((const uint8_t *)ptr)[0] == 0) { if(LEFT < 2) { if(SIZE_VIOLATION) RETURN(RC_FAIL); else RETURN(RC_WMORE); } else if(((const uint8_t *)ptr)[1] == 0) { /* * Found the terminator of the * indefinite length structure. */ break; } } /* Outmost tag may be unknown and cannot be fetched/compared */ if(elm->tag != (ber_tlv_tag_t)-1) { if(BER_TAGS_EQUAL(tlv_tag, elm->tag)) { /* * The new list member of expected type has arrived. */ } else { ASN_DEBUG("Unexpected tag %s fixed SET OF %s", ber_tlv_tag_string(tlv_tag), td->name); ASN_DEBUG("%s SET OF has tag %s", td->name, ber_tlv_tag_string(elm->tag)); RETURN(RC_FAIL); } } /* * MICROPHASE 2: Invoke the member-specific decoder. */ ctx->step |= 1; /* Confirm entering next microphase */ microphase2: /* * Invoke the member fetch routine according to member's type */ rval = elm->type->ber_decoder(opt_codec_ctx, elm->type, &ctx->ptr, ptr, LEFT, 0); ASN_DEBUG("In %s SET OF %s code %d consumed %d", td->name, elm->type->name, rval.code, (int)rval.consumed); switch(rval.code) { case RC_OK: { asn_anonymous_set_ *list = _A_SET_FROM_VOID(st); if(ASN_SET_ADD(list, ctx->ptr) != 0) RETURN(RC_FAIL); else ctx->ptr = 0; } break; case RC_WMORE: /* More data expected */ if(!SIZE_VIOLATION) { ADVANCE(rval.consumed); RETURN(RC_WMORE); } /* Fall through */ case RC_FAIL: /* Fatal error */ ASN_STRUCT_FREE(*elm->type, ctx->ptr); ctx->ptr = 0; RETURN(RC_FAIL); } /* switch(rval) */ ADVANCE(rval.consumed); } /* for(all list members) */ NEXT_PHASE(ctx); case 2: /* * Read in all "end of content" TLVs. */ while(ctx->left < 0) { if(LEFT < 2) { if(LEFT > 0 && ((const char *)ptr)[0] != 0) { /* Unexpected tag */ RETURN(RC_FAIL); } else { RETURN(RC_WMORE); } } if(((const char *)ptr)[0] == 0 && ((const char *)ptr)[1] == 0) { ADVANCE(2); ctx->left++; } else { RETURN(RC_FAIL); } } PHASE_OUT(ctx); } RETURN(RC_OK); } /* * Internally visible buffer holding a single encoded element. */ struct _el_buffer { uint8_t *buf; size_t length; size_t size; }; /* Append bytes to the above structure */ static int _el_addbytes(const void *buffer, size_t size, void *el_buf_ptr) { struct _el_buffer *el_buf = (struct _el_buffer *)el_buf_ptr; if(el_buf->length + size > el_buf->size) return -1; memcpy(el_buf->buf + el_buf->length, buffer, size); el_buf->length += size; return 0; } static int _el_buf_cmp(const void *ap, const void *bp) { const struct _el_buffer *a = (const struct _el_buffer *)ap; const struct _el_buffer *b = (const struct _el_buffer *)bp; int ret; size_t common_len; if(a->length < b->length) common_len = a->length; else common_len = b->length; ret = memcmp(a->buf, b->buf, common_len); if(ret == 0) { if(a->length < b->length) ret = -1; else if(a->length > b->length) ret = 1; } return ret; } /* * The DER encoder of the SET OF type. */ asn_enc_rval_t SET_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { asn_TYPE_member_t *elm = td->elements; asn_TYPE_descriptor_t *elm_type = elm->type; der_type_encoder_f *der_encoder = elm_type->der_encoder; asn_anonymous_set_ *list = _A_SET_FROM_VOID(ptr); size_t computed_size = 0; ssize_t encoding_size = 0; struct _el_buffer *encoded_els; ssize_t eels_count = 0; size_t max_encoded_len = 1; asn_enc_rval_t erval; int ret; int edx; ASN_DEBUG("Estimating size for SET OF %s", td->name); /* * Gather the length of the underlying members sequence. */ for(edx = 0; edx < list->count; edx++) { void *memb_ptr = list->array[edx]; if(!memb_ptr) continue; erval = der_encoder(elm_type, memb_ptr, 0, elm->tag, 0, 0); if(erval.encoded == -1) return erval; computed_size += erval.encoded; /* Compute maximum encoding's size */ if(max_encoded_len < (size_t)erval.encoded) max_encoded_len = erval.encoded; } /* * Encode the TLV for the sequence itself. */ encoding_size = der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key); if(encoding_size == -1) { erval.encoded = -1; erval.failed_type = td; erval.structure_ptr = ptr; return erval; } computed_size += encoding_size; if(!cb || list->count == 0) { erval.encoded = computed_size; _ASN_ENCODED_OK(erval); } /* * DER mandates dynamic sorting of the SET OF elements * according to their encodings. Build an array of the * encoded elements. */ encoded_els = (struct _el_buffer *)MALLOC( list->count * sizeof(encoded_els[0])); if(encoded_els == NULL) { erval.encoded = -1; erval.failed_type = td; erval.structure_ptr = ptr; return erval; } ASN_DEBUG("Encoding members of %s SET OF", td->name); /* * Encode all members. */ for(edx = 0; edx < list->count; edx++) { void *memb_ptr = list->array[edx]; struct _el_buffer *encoded_el = &encoded_els[eels_count]; if(!memb_ptr) continue; /* * Prepare space for encoding. */ encoded_el->buf = (uint8_t *)MALLOC(max_encoded_len); if(encoded_el->buf) { encoded_el->length = 0; encoded_el->size = max_encoded_len; } else { for(edx--; edx >= 0; edx--) FREEMEM(encoded_els[edx].buf); FREEMEM(encoded_els); erval.encoded = -1; erval.failed_type = td; erval.structure_ptr = ptr; return erval; } /* * Encode the member into the prepared space. */ erval = der_encoder(elm_type, memb_ptr, 0, elm->tag, _el_addbytes, encoded_el); if(erval.encoded == -1) { for(; edx >= 0; edx--) FREEMEM(encoded_els[edx].buf); FREEMEM(encoded_els); return erval; } encoding_size += erval.encoded; eels_count++; } /* * Sort the encoded elements according to their encoding. */ qsort(encoded_els, eels_count, sizeof(encoded_els[0]), _el_buf_cmp); /* * Report encoded elements to the application. * Dispose of temporary sorted members table. */ ret = 0; for(edx = 0; edx < eels_count; edx++) { struct _el_buffer *encoded_el = &encoded_els[edx]; /* Report encoded chunks to the application */ if(ret == 0 && cb(encoded_el->buf, encoded_el->length, app_key) < 0) ret = -1; FREEMEM(encoded_el->buf); } FREEMEM(encoded_els); if(ret || computed_size != (size_t)encoding_size) { /* * Standard callback failed, or * encoded size is not equal to the computed size. */ erval.encoded = -1; erval.failed_type = td; erval.structure_ptr = ptr; } else { erval.encoded = computed_size; } _ASN_ENCODED_OK(erval); } #undef XER_ADVANCE #define XER_ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ buf_ptr = ((const char *)buf_ptr) + num;\ size -= num; \ consumed_myself += num; \ } while(0) /* * Decode the XER (XML) data. */ asn_dec_rval_t SET_OF_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **struct_ptr, const char *opt_mname, const void *buf_ptr, size_t size) { /* * Bring closer parts of structure description. */ asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics; asn_TYPE_member_t *element = td->elements; const char *elm_tag; const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; /* * ... and parts of the structure being constructed. */ void *st = *struct_ptr; /* Target structure. */ asn_struct_ctx_t *ctx; /* Decoder context */ asn_dec_rval_t rval; /* Return value from a decoder */ ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ /* * Create the target structure if it is not present already. */ if(st == 0) { st = *struct_ptr = CALLOC(1, specs->struct_size); if(st == 0) RETURN(RC_FAIL); } /* Which tag is expected for the downstream */ if(specs->as_XMLValueList) { elm_tag = (specs->as_XMLValueList == 1) ? 0 : ""; } else { elm_tag = (*element->name) ? element->name : element->type->xml_tag; } /* * Restore parsing context. */ ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); /* * Phases of XER/XML processing: * Phase 0: Check that the opening tag matches our expectations. * Phase 1: Processing body and reacting on closing tag. * Phase 2: Processing inner type. */ for(; ctx->phase <= 2;) { pxer_chunk_type_e ch_type; /* XER chunk type */ ssize_t ch_size; /* Chunk size */ xer_check_tag_e tcv; /* Tag check value */ /* * Go inside the inner member of a set. */ if(ctx->phase == 2) { asn_dec_rval_t tmprval; /* Invoke the inner type decoder, m.b. multiple times */ ASN_DEBUG("XER/SET OF element [%s]", elm_tag); tmprval = element->type->xer_decoder(opt_codec_ctx, element->type, &ctx->ptr, elm_tag, buf_ptr, size); if(tmprval.code == RC_OK) { asn_anonymous_set_ *list = _A_SET_FROM_VOID(st); if(ASN_SET_ADD(list, ctx->ptr) != 0) RETURN(RC_FAIL); ctx->ptr = 0; XER_ADVANCE(tmprval.consumed); } else { XER_ADVANCE(tmprval.consumed); RETURN(tmprval.code); } ctx->phase = 1; /* Back to body processing */ ASN_DEBUG("XER/SET OF phase => %d", ctx->phase); /* Fall through */ } /* * Get the next part of the XML stream. */ ch_size = xer_next_token(&ctx->context, buf_ptr, size, &ch_type); switch(ch_size) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); default: switch(ch_type) { case PXER_COMMENT: /* Got XML comment */ case PXER_TEXT: /* Ignore free-standing text */ XER_ADVANCE(ch_size); /* Skip silently */ continue; case PXER_TAG: break; /* Check the rest down there */ } } tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); ASN_DEBUG("XER/SET OF: tcv = %d, ph=%d t=%s", tcv, ctx->phase, xml_tag); switch(tcv) { case XCT_CLOSING: if(ctx->phase == 0) break; ctx->phase = 0; /* Fall through */ case XCT_BOTH: if(ctx->phase == 0) { /* No more things to decode */ XER_ADVANCE(ch_size); ctx->phase = 3; /* Phase out */ RETURN(RC_OK); } /* Fall through */ case XCT_OPENING: if(ctx->phase == 0) { XER_ADVANCE(ch_size); ctx->phase = 1; /* Processing body phase */ continue; } /* Fall through */ case XCT_UNKNOWN_OP: case XCT_UNKNOWN_BO: ASN_DEBUG("XER/SET OF: tcv=%d, ph=%d", tcv, ctx->phase); if(ctx->phase == 1) { /* * Process a single possible member. */ ctx->phase = 2; continue; } /* Fall through */ default: break; } ASN_DEBUG("Unexpected XML tag in SET OF"); break; } ctx->phase = 3; /* "Phase out" on hard failure */ RETURN(RC_FAIL); } typedef struct xer_tmp_enc_s { void *buffer; size_t offset; size_t size; } xer_tmp_enc_t; static int SET_OF_encode_xer_callback(const void *buffer, size_t size, void *key) { xer_tmp_enc_t *t = (xer_tmp_enc_t *)key; if(t->offset + size >= t->size) { size_t newsize = (t->size << 2) + size; void *p = REALLOC(t->buffer, newsize); if(!p) return -1; t->buffer = p; t->size = newsize; } memcpy((char *)t->buffer + t->offset, buffer, size); t->offset += size; return 0; } static int SET_OF_xer_order(const void *aptr, const void *bptr) { const xer_tmp_enc_t *a = (const xer_tmp_enc_t *)aptr; const xer_tmp_enc_t *b = (const xer_tmp_enc_t *)bptr; size_t minlen = a->offset; int ret; if(b->offset < minlen) minlen = b->offset; /* Well-formed UTF-8 has this nice lexicographical property... */ ret = memcmp(a->buffer, b->buffer, minlen); if(ret != 0) return ret; if(a->offset == b->offset) return 0; if(a->offset == minlen) return -1; return 1; } asn_enc_rval_t SET_OF_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t er; asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics; asn_TYPE_member_t *elm = td->elements; asn_anonymous_set_ *list = _A_SET_FROM_VOID(sptr); const char *mname = specs->as_XMLValueList ? 0 : ((*elm->name) ? elm->name : elm->type->xml_tag); size_t mlen = mname ? strlen(mname) : 0; int xcan = (flags & XER_F_CANONICAL); xer_tmp_enc_t *encs = 0; size_t encs_count = 0; void *original_app_key = app_key; asn_app_consume_bytes_f *original_cb = cb; int i; if(!sptr) _ASN_ENCODE_FAILED; if(xcan) { encs = (xer_tmp_enc_t *)MALLOC(list->count * sizeof(encs[0])); if(!encs) _ASN_ENCODE_FAILED; cb = SET_OF_encode_xer_callback; } er.encoded = 0; for(i = 0; i < list->count; i++) { asn_enc_rval_t tmper; void *memb_ptr = list->array[i]; if(!memb_ptr) continue; if(encs) { memset(&encs[encs_count], 0, sizeof(encs[0])); app_key = &encs[encs_count]; encs_count++; } if(mname) { if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel); _ASN_CALLBACK3("<", 1, mname, mlen, ">", 1); } if(!xcan && specs->as_XMLValueList == 1) _i_ASN_TEXT_INDENT(1, ilevel + 1); tmper = elm->type->xer_encoder(elm->type, memb_ptr, ilevel + (specs->as_XMLValueList != 2), flags, cb, app_key); if(tmper.encoded == -1) { td = tmper.failed_type; sptr = tmper.structure_ptr; goto cb_failed; } if(tmper.encoded == 0 && specs->as_XMLValueList) { const char *name = elm->type->xml_tag; size_t len = strlen(name); _ASN_CALLBACK3("<", 1, name, len, "/>", 2); } if(mname) { _ASN_CALLBACK3("", 1); er.encoded += 5; } er.encoded += (2 * mlen) + tmper.encoded; } if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel - 1); if(encs) { xer_tmp_enc_t *enc = encs; xer_tmp_enc_t *end = encs + encs_count; ssize_t control_size = 0; cb = original_cb; app_key = original_app_key; qsort(encs, encs_count, sizeof(encs[0]), SET_OF_xer_order); for(; enc < end; enc++) { _ASN_CALLBACK(enc->buffer, enc->offset); FREEMEM(enc->buffer); enc->buffer = 0; control_size += enc->offset; } assert(control_size == er.encoded); } goto cleanup; cb_failed: er.encoded = -1; er.failed_type = td; er.structure_ptr = sptr; cleanup: if(encs) { while(encs_count-- > 0) { if(encs[encs_count].buffer) FREEMEM(encs[encs_count].buffer); } FREEMEM(encs); } _ASN_ENCODED_OK(er); } int SET_OF_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { asn_TYPE_member_t *elm = td->elements; const asn_anonymous_set_ *list = _A_CSET_FROM_VOID(sptr); int ret; int i; if(!sptr) return (cb("", 8, app_key) < 0) ? -1 : 0; /* Dump preamble */ if(cb(td->name, strlen(td->name), app_key) < 0 || cb(" ::= {", 6, app_key) < 0) return -1; for(i = 0; i < list->count; i++) { const void *memb_ptr = list->array[i]; if(!memb_ptr) continue; _i_INDENT(1); ret = elm->type->print_struct(elm->type, memb_ptr, ilevel + 1, cb, app_key); if(ret) return ret; } ilevel--; _i_INDENT(1); return (cb("}", 1, app_key) < 0) ? -1 : 0; } void SET_OF_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { if(td && ptr) { asn_SET_OF_specifics_t *specs; asn_TYPE_member_t *elm = td->elements; asn_anonymous_set_ *list = _A_SET_FROM_VOID(ptr); asn_struct_ctx_t *ctx; /* Decoder context */ int i; /* * Could not use set_of_empty() because of (*free) * incompatibility. */ for(i = 0; i < list->count; i++) { void *memb_ptr = list->array[i]; if(memb_ptr) ASN_STRUCT_FREE(*elm->type, memb_ptr); } list->count = 0; /* No meaningful elements left */ asn_set_empty(list); /* Remove (list->array) */ specs = (asn_SET_OF_specifics_t *)td->specifics; ctx = (asn_struct_ctx_t *)((char *)ptr + specs->ctx_offset); if(ctx->ptr) { ASN_STRUCT_FREE(*elm->type, ctx->ptr); ctx->ptr = 0; } if(!contents_only) { FREEMEM(ptr); } } } int SET_OF_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key) { asn_TYPE_member_t *elm = td->elements; asn_constr_check_f *constr; const asn_anonymous_set_ *list = _A_CSET_FROM_VOID(sptr); int i; if(!sptr) { _ASN_CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name, __FILE__, __LINE__); return -1; } constr = elm->memb_constraints; if(!constr) constr = elm->type->check_constraints; /* * Iterate over the members of an array. * Validate each in turn, until one fails. */ for(i = 0; i < list->count; i++) { const void *memb_ptr = list->array[i]; int ret; if(!memb_ptr) continue; ret = constr(elm->type, memb_ptr, ctfailcb, app_key); if(ret) return ret; } /* * Cannot inherit it eralier: * need to make sure we get the updated version. */ if(!elm->memb_constraints) elm->memb_constraints = elm->type->check_constraints; return 0; } asn_dec_rval_t SET_OF_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { asn_dec_rval_t rv; asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics; asn_TYPE_member_t *elm = td->elements; /* Single one */ void *st = *sptr; asn_anonymous_set_ *list; asn_per_constraint_t *ct; int repeat = 0; ssize_t nelems; if(_ASN_STACK_OVERFLOW_CHECK(opt_codec_ctx)) _ASN_DECODE_FAILED; /* * Create the target structure if it is not present already. */ if(!st) { st = *sptr = CALLOC(1, specs->struct_size); if(!st) _ASN_DECODE_FAILED; } list = _A_SET_FROM_VOID(st); /* Figure out which constraints to use */ if(constraints) ct = &constraints->size; else if(td->per_constraints) ct = &td->per_constraints->size; else ct = 0; if(ct && ct->flags & APC_EXTENSIBLE) { int value = per_get_few_bits(pd, 1); if(value < 0) _ASN_DECODE_STARVED; if(value) ct = 0; /* Not restricted! */ } if(ct && ct->effective_bits >= 0) { /* X.691, #19.5: No length determinant */ nelems = per_get_few_bits(pd, ct->effective_bits); ASN_DEBUG("Preparing to fetch %ld+%ld elements from %s", (long)nelems, ct->lower_bound, td->name); if(nelems < 0) _ASN_DECODE_STARVED; nelems += ct->lower_bound; } else { nelems = -1; } do { int i; if(nelems < 0) { nelems = uper_get_length(pd, ct ? ct->effective_bits : -1, &repeat); ASN_DEBUG("Got to decode %d elements (eff %d)", (int)nelems, (int)ct ? ct->effective_bits : -1); if(nelems < 0) _ASN_DECODE_STARVED; } for(i = 0; i < nelems; i++) { void *ptr = 0; ASN_DEBUG("SET OF %s decoding", elm->type->name); rv = elm->type->uper_decoder(opt_codec_ctx, elm->type, elm->per_constraints, &ptr, pd); ASN_DEBUG("%s SET OF %s decoded %d, %p", td->name, elm->type->name, rv.code, ptr); if(rv.code == RC_OK) { if(ASN_SET_ADD(list, ptr) == 0) continue; ASN_DEBUG("Failed to add element into %s", td->name); /* Fall through */ rv.code = RC_FAIL; } else { ASN_DEBUG("Failed decoding %s of %s (SET OF)", elm->type->name, td->name); } if(ptr) ASN_STRUCT_FREE(*elm->type, ptr); return rv; } nelems = -1; /* Allow uper_get_length() */ } while(repeat); ASN_DEBUG("Decoded %s as SET OF", td->name); rv.code = RC_OK; rv.consumed = 0; return rv; } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/constr_SET_OF.h000066400000000000000000000020461305042567700232500ustar00rootroot00000000000000/*- * Copyright (c) 2003 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _CONSTR_SET_OF_H_ #define _CONSTR_SET_OF_H_ #include #ifdef __cplusplus extern "C" { #endif typedef struct asn_SET_OF_specifics_s { /* * Target structure description. */ int struct_size; /* Size of the target structure. */ int ctx_offset; /* Offset of the asn_struct_ctx_t member */ /* XER-specific stuff */ int as_XMLValueList; /* The member type must be encoded like this */ } asn_SET_OF_specifics_t; /* * A set specialized functions dealing with the SET OF type. */ asn_struct_free_f SET_OF_free; asn_struct_print_f SET_OF_print; asn_constr_check_f SET_OF_constraint; ber_type_decoder_f SET_OF_decode_ber; der_type_encoder_f SET_OF_encode_der; xer_type_decoder_f SET_OF_decode_xer; xer_type_encoder_f SET_OF_encode_xer; per_type_decoder_f SET_OF_decode_uper; per_type_encoder_f SET_OF_encode_uper; #ifdef __cplusplus } #endif #endif /* _CONSTR_SET_OF_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/constr_TYPE.c000066400000000000000000000033421305042567700230050ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include /* * Version of the ASN.1 infrastructure shipped with compiler. */ int get_asn1c_environment_version() { return ASN1C_ENVIRONMENT_VERSION; } static asn_app_consume_bytes_f _print2fp; /* * Return the outmost tag of the type. */ ber_tlv_tag_t asn_TYPE_outmost_tag(asn_TYPE_descriptor_t *type_descriptor, const void *struct_ptr, int tag_mode, ber_tlv_tag_t tag) { if(tag_mode) return tag; if(type_descriptor->tags_count) return type_descriptor->tags[0]; return type_descriptor->outmost_tag(type_descriptor, struct_ptr, 0, 0); } /* * Print the target language's structure in human readable form. */ int asn_fprint(FILE *stream, asn_TYPE_descriptor_t *td, const void *struct_ptr) { if(!stream) stream = stdout; if(!td || !struct_ptr) { errno = EINVAL; return -1; } /* Invoke type-specific printer */ if(td->print_struct(td, struct_ptr, 1, _print2fp, stream)) return -1; /* Terminate the output */ if(_print2fp("\n", 1, stream)) return -1; return fflush(stream); } /* Dump the data into the specified stdio stream */ static int _print2fp(const void *buffer, size_t size, void *app_key) { FILE *stream = (FILE *)app_key; if(fwrite(buffer, 1, size, stream) != size) return -1; return 0; } /* * Some compilers do not support variable args macros. * This function is a replacement of ASN_DEBUG() macro. */ void ASN_DEBUG_f(const char *fmt, ...); void ASN_DEBUG_f(const char *fmt, ...) { va_list ap; va_start(ap, fmt); vfprintf(stderr, fmt, ap); fprintf(stderr, "\n"); va_end(ap); } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/constr_TYPE.h000066400000000000000000000150561305042567700230170ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004, 2005, 2006 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ /* * This file contains the declaration structure called "ASN.1 Type Definition", * which holds all information necessary for encoding and decoding routines. * This structure even contains pointer to these encoding and decoding routines * for each defined ASN.1 type. */ #ifndef _CONSTR_TYPE_H_ #define _CONSTR_TYPE_H_ #include #include #ifdef __cplusplus extern "C" { #endif struct asn_TYPE_descriptor_s; /* Forward declaration */ struct asn_TYPE_member_s; /* Forward declaration */ /* * This type provides the context information for various ASN.1 routines, * primarily ones doing decoding. A member _asn_ctx of this type must be * included into certain target language's structures, such as compound types. */ typedef struct asn_struct_ctx_s { short phase; /* Decoding phase */ short step; /* Elementary step of a phase */ int context; /* Other context information */ void *ptr; /* Decoder-specific stuff (stack elements) */ ber_tlv_len_t left; /* Number of bytes left, -1 for indefinite */ } asn_struct_ctx_t; #include /* Basic Encoding Rules decoder */ #include /* Distinguished Encoding Rules encoder */ #include /* Decoder of XER (XML, text) */ #include /* Encoder into XER (XML, text) */ #include /* Packet Encoding Rules decoder */ #include /* Packet Encoding Rules encoder */ #include /* Subtype constraints support */ /* * Free the structure according to its specification. * If (free_contents_only) is set, the wrapper structure itself (struct_ptr) * will not be freed. (It may be useful in case the structure is allocated * statically or arranged on the stack, yet its elements are allocated * dynamically.) */ typedef void (asn_struct_free_f)( struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, int free_contents_only); #define ASN_STRUCT_FREE(asn_DEF, ptr) (asn_DEF).free_struct(&(asn_DEF),ptr,0) #define ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF, ptr) \ (asn_DEF).free_struct(&(asn_DEF),ptr,1) /* * Print the structure according to its specification. */ typedef int (asn_struct_print_f)( struct asn_TYPE_descriptor_s *type_descriptor, const void *struct_ptr, int level, /* Indentation level */ asn_app_consume_bytes_f *callback, void *app_key); /* * Return the outmost tag of the type. * If the type is untagged CHOICE, the dynamic operation is performed. * NOTE: This function pointer type is only useful internally. * Do not use it in your application. */ typedef ber_tlv_tag_t (asn_outmost_tag_f)( struct asn_TYPE_descriptor_s *type_descriptor, const void *struct_ptr, int tag_mode, ber_tlv_tag_t tag); /* The instance of the above function type; used internally. */ asn_outmost_tag_f asn_TYPE_outmost_tag; /* * The definitive description of the destination language's structure. */ typedef struct asn_TYPE_descriptor_s { char *name; /* A name of the ASN.1 type. "" in some cases. */ char *xml_tag; /* Name used in XML tag */ /* * Generalized functions for dealing with the specific type. * May be directly invoked by applications. */ asn_struct_free_f *free_struct; /* Free the structure */ asn_struct_print_f *print_struct; /* Human readable output */ asn_constr_check_f *check_constraints; /* Constraints validator */ ber_type_decoder_f *ber_decoder; /* Generic BER decoder */ der_type_encoder_f *der_encoder; /* Canonical DER encoder */ xer_type_decoder_f *xer_decoder; /* Generic XER decoder */ xer_type_encoder_f *xer_encoder; /* [Canonical] XER encoder */ per_type_decoder_f *uper_decoder; /* Unaligned PER decoder */ per_type_encoder_f *uper_encoder; /* Unaligned PER encoder */ /*********************************************************************** * Internally useful members. Not to be used by applications directly. * **********************************************************************/ /* * Tags that are expected to occur. */ asn_outmost_tag_f *outmost_tag; /* */ ber_tlv_tag_t *tags; /* Effective tags sequence for this type */ int tags_count; /* Number of tags which are expected */ ber_tlv_tag_t *all_tags;/* Every tag for BER/containment */ int all_tags_count; /* Number of tags */ asn_per_constraints_t *per_constraints; /* PER compiled constraints */ /* * An ASN.1 production type members (members of SEQUENCE, SET, CHOICE). */ struct asn_TYPE_member_s *elements; int elements_count; /* * Additional information describing the type, used by appropriate * functions above. */ void *specifics; } asn_TYPE_descriptor_t; /* * This type describes an element of the constructed type, * i.e. SEQUENCE, SET, CHOICE, etc. */ enum asn_TYPE_flags_e { ATF_NOFLAGS, ATF_POINTER = 0x01, /* Represented by the pointer */ ATF_OPEN_TYPE = 0x02 /* ANY type, without meaningful tag */ }; typedef struct asn_TYPE_member_s { enum asn_TYPE_flags_e flags; /* Element's presentation flags */ int optional; /* Following optional members, including current */ int memb_offset; /* Offset of the element */ ber_tlv_tag_t tag; /* Outmost (most immediate) tag */ int tag_mode; /* IMPLICIT/no/EXPLICIT tag at current level */ asn_TYPE_descriptor_t *type; /* Member type descriptor */ asn_constr_check_f *memb_constraints; /* Constraints validator */ asn_per_constraints_t *per_constraints; /* PER compiled constraints */ int (*default_value)(int setval, void **sptr); /* DEFAULT */ char *name; /* ASN.1 identifier of the element */ } asn_TYPE_member_t; /* * BER tag to element number mapping. */ typedef struct asn_TYPE_tag2member_s { ber_tlv_tag_t el_tag; /* Outmost tag of the member */ int el_no; /* Index of the associated member, base 0 */ int toff_first; /* First occurence of the el_tag, relative */ int toff_last; /* Last occurence of the el_tag, relatvie */ } asn_TYPE_tag2member_t; /* * This function is a wrapper around (td)->print_struct, which prints out * the contents of the target language's structure (struct_ptr) into the * file pointer (stream) in human readable form. * RETURN VALUES: * 0: The structure is printed. * -1: Problem dumping the structure. * (See also xer_fprint() in xer_encoder.h) */ int asn_fprint(FILE *stream, /* Destination stream descriptor */ asn_TYPE_descriptor_t *td, /* ASN.1 type descriptor */ const void *struct_ptr); /* Structure to be printed */ #ifdef __cplusplus } #endif #endif /* _CONSTR_TYPE_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/constraints.c000066400000000000000000000042571305042567700232110ustar00rootroot00000000000000#include "asn_internal.h" #include "constraints.h" int asn_generic_no_constraint(asn_TYPE_descriptor_t *type_descriptor, const void *struct_ptr, asn_app_constraint_failed_f *cb, void *key) { (void)type_descriptor; /* Unused argument */ (void)struct_ptr; /* Unused argument */ (void)cb; /* Unused argument */ (void)key; /* Unused argument */ /* Nothing to check */ return 0; } int asn_generic_unknown_constraint(asn_TYPE_descriptor_t *type_descriptor, const void *struct_ptr, asn_app_constraint_failed_f *cb, void *key) { (void)type_descriptor; /* Unused argument */ (void)struct_ptr; /* Unused argument */ (void)cb; /* Unused argument */ (void)key; /* Unused argument */ /* Unknown how to check */ return 0; } struct errbufDesc { asn_TYPE_descriptor_t *failed_type; const void *failed_struct_ptr; char *errbuf; size_t errlen; }; static void _asn_i_ctfailcb(void *key, asn_TYPE_descriptor_t *td, const void *sptr, const char *fmt, ...) { struct errbufDesc *arg = key; va_list ap; ssize_t vlen; ssize_t maxlen; arg->failed_type = td; arg->failed_struct_ptr = sptr; maxlen = arg->errlen; if(maxlen <= 0) return; va_start(ap, fmt); vlen = vsnprintf(arg->errbuf, maxlen, fmt, ap); va_end(ap); if(vlen >= maxlen) { arg->errbuf[maxlen-1] = '\0'; /* Ensuring libc correctness */ arg->errlen = maxlen - 1; /* Not counting termination */ return; } else if(vlen >= 0) { arg->errbuf[vlen] = '\0'; /* Ensuring libc correctness */ arg->errlen = vlen; /* Not counting termination */ } else { /* * The libc on this system is broken. */ vlen = sizeof("") - 1; maxlen--; arg->errlen = vlen < maxlen ? vlen : maxlen; memcpy(arg->errbuf, "", arg->errlen); arg->errbuf[arg->errlen] = 0; } return; } int asn_check_constraints(asn_TYPE_descriptor_t *type_descriptor, const void *struct_ptr, char *errbuf, size_t *errlen) { struct errbufDesc arg; int ret; arg.failed_type = 0; arg.failed_struct_ptr = 0; arg.errbuf = errbuf; arg.errlen = errlen ? *errlen : 0; ret = type_descriptor->check_constraints(type_descriptor, struct_ptr, _asn_i_ctfailcb, &arg); if(ret == -1 && errlen) *errlen = arg.errlen; return ret; } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/constraints.h000066400000000000000000000036571305042567700232210ustar00rootroot00000000000000/*- * Copyright (c) 2004, 2006 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _ASN1_CONSTRAINTS_VALIDATOR_H_ #define _ASN1_CONSTRAINTS_VALIDATOR_H_ #include /* Platform-dependent types */ #ifdef __cplusplus extern "C" { #endif struct asn_TYPE_descriptor_s; /* Forward declaration */ /* * Validate the structure according to the ASN.1 constraints. * If errbuf and errlen are given, they shall be pointing to the appropriate * buffer space and its length before calling this function. Alternatively, * they could be passed as NULL's. If constraints validation fails, * errlen will contain the actual number of bytes taken from the errbuf * to encode an error message (properly 0-terminated). * * RETURN VALUES: * This function returns 0 in case all ASN.1 constraints are met * and -1 if one or more constraints were failed. */ int asn_check_constraints(struct asn_TYPE_descriptor_s *type_descriptor, const void *struct_ptr, /* Target language's structure */ char *errbuf, /* Returned error description */ size_t *errlen /* Length of the error description */ ); /* * Generic type for constraint checking callback, * associated with every type descriptor. */ typedef int (asn_constr_check_f)( struct asn_TYPE_descriptor_s *type_descriptor, const void *struct_ptr, asn_app_constraint_failed_f *optional_callback, /* Log the error */ void *optional_app_key /* Opaque key passed to a callback */ ); /******************************* * INTERNALLY USEFUL FUNCTIONS * *******************************/ asn_constr_check_f asn_generic_no_constraint; /* No constraint whatsoever */ asn_constr_check_f asn_generic_unknown_constraint; /* Not fully supported */ /* * Invoke the callback with a complete error message. */ #define _ASN_CTFAIL if(ctfailcb) ctfailcb #ifdef __cplusplus } #endif #endif /* _ASN1_CONSTRAINTS_VALIDATOR_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/der_encoder.c000066400000000000000000000116451305042567700231120ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include static ssize_t der_write_TL(ber_tlv_tag_t tag, ber_tlv_len_t len, asn_app_consume_bytes_f *cb, void *app_key, int constructed); /* * The DER encoder of any type. */ asn_enc_rval_t der_encode(asn_TYPE_descriptor_t *type_descriptor, void *struct_ptr, asn_app_consume_bytes_f *consume_bytes, void *app_key) { ASN_DEBUG("DER encoder invoked for %s", type_descriptor->name); /* * Invoke type-specific encoder. */ return type_descriptor->der_encoder(type_descriptor, struct_ptr, /* Pointer to the destination structure */ 0, 0, consume_bytes, app_key); } /* * Argument type and callback necessary for der_encode_to_buffer(). */ typedef struct enc_to_buf_arg { void *buffer; size_t left; } enc_to_buf_arg; static int encode_to_buffer_cb(const void *buffer, size_t size, void *key) { enc_to_buf_arg *arg = (enc_to_buf_arg *)key; if(arg->left < size) return -1; /* Data exceeds the available buffer size */ memcpy(arg->buffer, buffer, size); arg->buffer = ((char *)arg->buffer) + size; arg->left -= size; return 0; } /* * A variant of the der_encode() which encodes the data into the provided buffer */ asn_enc_rval_t der_encode_to_buffer(asn_TYPE_descriptor_t *type_descriptor, void *struct_ptr, void *buffer, size_t buffer_size) { enc_to_buf_arg arg; asn_enc_rval_t ec; arg.buffer = buffer; arg.left = buffer_size; ec = type_descriptor->der_encoder(type_descriptor, struct_ptr, /* Pointer to the destination structure */ 0, 0, encode_to_buffer_cb, &arg); if(ec.encoded != -1) { assert(ec.encoded == (ssize_t)(buffer_size - arg.left)); /* Return the encoded contents size */ } return ec; } /* * Write out leading TL[v] sequence according to the type definition. */ ssize_t der_write_tags(asn_TYPE_descriptor_t *sd, size_t struct_length, int tag_mode, int last_tag_form, ber_tlv_tag_t tag, /* EXPLICIT or IMPLICIT tag */ asn_app_consume_bytes_f *cb, void *app_key) { ber_tlv_tag_t *tags; /* Copy of tags stream */ int tags_count; /* Number of tags */ size_t overall_length; ssize_t *lens; int i; ASN_DEBUG("Writing tags (%s, tm=%d, tc=%d, tag=%s, mtc=%d)", sd->name, tag_mode, sd->tags_count, ber_tlv_tag_string(tag), tag_mode ?(sd->tags_count+1 -((tag_mode == -1) && sd->tags_count)) :sd->tags_count ); if(tag_mode) { /* * Instead of doing shaman dance like we do in ber_check_tags(), * allocate a small array on the stack * and initialize it appropriately. */ int stag_offset; tags = (ber_tlv_tag_t *)alloca((sd->tags_count + 1) * sizeof(ber_tlv_tag_t)); if(!tags) { /* Can fail on !x86 */ errno = ENOMEM; return -1; } tags_count = sd->tags_count + 1 /* EXPLICIT or IMPLICIT tag is given */ - ((tag_mode == -1) && sd->tags_count); /* Copy tags over */ tags[0] = tag; stag_offset = -1 + ((tag_mode == -1) && sd->tags_count); for(i = 1; i < tags_count; i++) tags[i] = sd->tags[i + stag_offset]; } else { tags = sd->tags; tags_count = sd->tags_count; } /* No tags to write */ if(tags_count == 0) return 0; lens = (ssize_t *)alloca(tags_count * sizeof(lens[0])); if(!lens) { errno = ENOMEM; return -1; } /* * Array of tags is initialized. * Now, compute the size of the TLV pairs, from right to left. */ overall_length = struct_length; for(i = tags_count - 1; i >= 0; --i) { lens[i] = der_write_TL(tags[i], overall_length, 0, 0, 0); if(lens[i] == -1) return -1; overall_length += lens[i]; lens[i] = overall_length - lens[i]; } if(!cb) return overall_length - struct_length; ASN_DEBUG("%s %s TL sequence (%d elements)", cb?"Encoding":"Estimating", sd->name, tags_count); /* * Encode the TL sequence for real. */ for(i = 0; i < tags_count; i++) { ssize_t len; int _constr; /* Check if this tag happens to be constructed */ _constr = (last_tag_form || i < (tags_count - 1)); len = der_write_TL(tags[i], lens[i], cb, app_key, _constr); if(len == -1) return -1; } return overall_length - struct_length; } static ssize_t der_write_TL(ber_tlv_tag_t tag, ber_tlv_len_t len, asn_app_consume_bytes_f *cb, void *app_key, int constructed) { uint8_t buf[32]; size_t size = 0; int buf_size = cb?sizeof(buf):0; ssize_t tmp; /* Serialize tag (T from TLV) into possibly zero-length buffer */ tmp = ber_tlv_tag_serialize(tag, buf, buf_size); if(tmp == -1 || tmp > (ssize_t)sizeof(buf)) return -1; size += tmp; /* Serialize length (L from TLV) into possibly zero-length buffer */ tmp = der_tlv_length_serialize(len, buf+size, buf_size?buf_size-size:0); if(tmp == -1) return -1; size += tmp; if(size > sizeof(buf)) return -1; /* * If callback is specified, invoke it, and check its return value. */ if(cb) { if(constructed) *buf |= 0x20; if(cb(buf, size, app_key) < 0) return -1; } return size; } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/der_encoder.h000066400000000000000000000036311305042567700231130ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _DER_ENCODER_H_ #define _DER_ENCODER_H_ #include #ifdef __cplusplus extern "C" { #endif struct asn_TYPE_descriptor_s; /* Forward declaration */ /* * The DER encoder of any type. May be invoked by the application. * The ber_decode() function (ber_decoder.h) is an opposite of der_encode(). */ asn_enc_rval_t der_encode(struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, /* Structure to be encoded */ asn_app_consume_bytes_f *consume_bytes_cb, void *app_key /* Arbitrary callback argument */ ); /* A variant of der_encode() which encodes data into the pre-allocated buffer */ asn_enc_rval_t der_encode_to_buffer( struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, /* Structure to be encoded */ void *buffer, /* Pre-allocated buffer */ size_t buffer_size /* Initial buffer size (maximum) */ ); /* * Type of the generic DER encoder. */ typedef asn_enc_rval_t (der_type_encoder_f)( struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, /* Structure to be encoded */ int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ ber_tlv_tag_t tag, asn_app_consume_bytes_f *consume_bytes_cb, /* Callback */ void *app_key /* Arbitrary callback argument */ ); /******************************* * INTERNALLY USEFUL FUNCTIONS * *******************************/ /* * Write out leading TL[v] sequence according to the type definition. */ ssize_t der_write_tags( struct asn_TYPE_descriptor_s *type_descriptor, size_t struct_length, int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ int last_tag_form, /* {0,!0}: prim, constructed */ ber_tlv_tag_t tag, asn_app_consume_bytes_f *consume_bytes_cb, void *app_key ); #ifdef __cplusplus } #endif #endif /* _DER_ENCODER_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/per_decoder.c000066400000000000000000000047521305042567700231150ustar00rootroot00000000000000#include #include #include /* * Decode a "Production of a complete encoding", X.691#10.1. * The complete encoding contains at least one byte, and is an integral * multiple of 8 bytes. */ asn_dec_rval_t uper_decode_complete(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const void *buffer, size_t size) { asn_dec_rval_t rval; rval = uper_decode(opt_codec_ctx, td, sptr, buffer, size, 0, 0); if(rval.consumed) { /* * We've always given 8-aligned data, * so convert bits to integral bytes. */ rval.consumed += 7; rval.consumed >>= 3; } else if(rval.code == RC_OK) { if(size) { if(((uint8_t *)buffer)[0] == 0) { rval.consumed = 1; /* 1 byte */ } else { ASN_DEBUG("Expecting single zeroed byte"); rval.code = RC_FAIL; } } else { /* Must contain at least 8 bits. */ rval.code = RC_WMORE; } } return rval; } asn_dec_rval_t uper_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const void *buffer, size_t size, int skip_bits, int unused_bits) { asn_codec_ctx_t s_codec_ctx; asn_dec_rval_t rval; asn_per_data_t pd; if(skip_bits < 0 || skip_bits > 7 || unused_bits < 0 || unused_bits > 7 || (unused_bits > 0 && !size)) _ASN_DECODE_FAILED; /* * Stack checker requires that the codec context * must be allocated on the stack. */ if(opt_codec_ctx) { if(opt_codec_ctx->max_stack_size) { s_codec_ctx = *opt_codec_ctx; opt_codec_ctx = &s_codec_ctx; } } else { /* If context is not given, be security-conscious anyway */ memset(&s_codec_ctx, 0, sizeof(s_codec_ctx)); s_codec_ctx.max_stack_size = _ASN_DEFAULT_STACK_MAX; opt_codec_ctx = &s_codec_ctx; } /* Fill in the position indicator */ memset(&pd, 0, sizeof(pd)); pd.buffer = (const uint8_t *)buffer; pd.nboff = skip_bits; pd.nbits = 8 * size - unused_bits; /* 8 is CHAR_BIT from */ if(pd.nboff > pd.nbits) _ASN_DECODE_FAILED; /* * Invoke type-specific decoder. */ if(!td->uper_decoder) _ASN_DECODE_FAILED; /* PER is not compiled in */ rval = td->uper_decoder(opt_codec_ctx, td, 0, sptr, &pd); if(rval.code == RC_OK) { /* Return the number of consumed bits */ rval.consumed = ((pd.buffer - (const uint8_t *)buffer) << 3) + pd.nboff - skip_bits; ASN_DEBUG("PER decoding consumed %d, counted %d", rval.consumed, pd.moved); assert(rval.consumed == pd.moved); } else { /* PER codec is not a restartable */ rval.consumed = 0; } return rval; } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/per_decoder.h000066400000000000000000000033001305042567700231060ustar00rootroot00000000000000/*- * Copyright (c) 2005, 2007 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _PER_DECODER_H_ #define _PER_DECODER_H_ #include #include #ifdef __cplusplus extern "C" { #endif struct asn_TYPE_descriptor_s; /* Forward declaration */ /* * Unaligned PER decoder of a "complete encoding" as per X.691#10.1. * On success, this call always returns (.consumed >= 1), as per X.691#10.1.3. */ asn_dec_rval_t uper_decode_complete(struct asn_codec_ctx_s *opt_codec_ctx, struct asn_TYPE_descriptor_s *type_descriptor, /* Type to decode */ void **struct_ptr, /* Pointer to a target structure's pointer */ const void *buffer, /* Data to be decoded */ size_t size /* Size of data buffer */ ); /* * Unaligned PER decoder of any ASN.1 type. May be invoked by the application. * WARNING: This call returns the number of BITS read from the stream. Beware. */ asn_dec_rval_t uper_decode(struct asn_codec_ctx_s *opt_codec_ctx, struct asn_TYPE_descriptor_s *type_descriptor, /* Type to decode */ void **struct_ptr, /* Pointer to a target structure's pointer */ const void *buffer, /* Data to be decoded */ size_t size, /* Size of data buffer */ int skip_bits, /* Number of unused leading bits, 0..7 */ int unused_bits /* Number of unused tailing bits, 0..7 */ ); /* * Type of the type-specific PER decoder function. */ typedef asn_dec_rval_t (per_type_decoder_f)(asn_codec_ctx_t *opt_codec_ctx, struct asn_TYPE_descriptor_s *type_descriptor, asn_per_constraints_t *constraints, void **struct_ptr, asn_per_data_t *per_data ); #ifdef __cplusplus } #endif #endif /* _PER_DECODER_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/per_encoder.c000066400000000000000000000071561305042567700231300ustar00rootroot00000000000000#include #include #include static asn_enc_rval_t uper_encode_internal(asn_TYPE_descriptor_t *td, asn_per_constraints_t *, void *sptr, asn_app_consume_bytes_f *cb, void *app_key); asn_enc_rval_t uper_encode(asn_TYPE_descriptor_t *td, void *sptr, asn_app_consume_bytes_f *cb, void *app_key) { return uper_encode_internal(td, 0, sptr, cb, app_key); } /* * Argument type and callback necessary for uper_encode_to_buffer(). */ typedef struct enc_to_buf_arg { void *buffer; size_t left; } enc_to_buf_arg; static int encode_to_buffer_cb(const void *buffer, size_t size, void *key) { enc_to_buf_arg *arg = (enc_to_buf_arg *)key; if(arg->left < size) return -1; /* Data exceeds the available buffer size */ memcpy(arg->buffer, buffer, size); arg->buffer = ((char *)arg->buffer) + size; arg->left -= size; return 0; } asn_enc_rval_t uper_encode_to_buffer(asn_TYPE_descriptor_t *td, void *sptr, void *buffer, size_t buffer_size) { enc_to_buf_arg key; key.buffer = buffer; key.left = buffer_size; if(td) ASN_DEBUG("Encoding \"%s\" using UNALIGNED PER", td->name); return uper_encode_internal(td, 0, sptr, encode_to_buffer_cb, &key); } typedef struct enc_dyn_arg { void *buffer; size_t length; size_t allocated; } enc_dyn_arg; static int encode_dyn_cb(const void *buffer, size_t size, void *key) { enc_dyn_arg *arg = key; if(arg->length + size >= arg->allocated) { void *p; arg->allocated = arg->allocated ? (arg->allocated << 2) : size; p = REALLOC(arg->buffer, arg->allocated); if(!p) { FREEMEM(arg->buffer); memset(arg, 0, sizeof(*arg)); return -1; } arg->buffer = p; } memcpy(((char *)arg->buffer) + arg->length, buffer, size); arg->length += size; return 0; } ssize_t uper_encode_to_new_buffer(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, void **buffer_r) { asn_enc_rval_t er; enc_dyn_arg key; memset(&key, 0, sizeof(key)); er = uper_encode_internal(td, constraints, sptr, encode_dyn_cb, &key); switch(er.encoded) { case -1: FREEMEM(key.buffer); return -1; case 0: FREEMEM(key.buffer); key.buffer = MALLOC(1); if(key.buffer) { *(char *)key.buffer = '\0'; *buffer_r = key.buffer; return 1; } else { return -1; } default: *buffer_r = key.buffer; ASN_DEBUG("Complete encoded in %d bits", er.encoded); return ((er.encoded + 7) >> 3); } } /* * Internally useful functions. */ /* Flush partially filled buffer */ static int _uper_encode_flush_outp(asn_per_outp_t *po) { uint8_t *buf; if(po->nboff == 0 && po->buffer == po->tmpspace) return 0; buf = po->buffer + (po->nboff >> 3); /* Make sure we account for the last, partially filled */ if(po->nboff & 0x07) { buf[0] &= 0xff << (8 - (po->nboff & 0x07)); buf++; } return po->outper(po->tmpspace, buf - po->tmpspace, po->op_key); } static asn_enc_rval_t uper_encode_internal(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_app_consume_bytes_f *cb, void *app_key) { asn_per_outp_t po; asn_enc_rval_t er; /* * Invoke type-specific encoder. */ if(!td || !td->uper_encoder) _ASN_ENCODE_FAILED; /* PER is not compiled in */ po.buffer = po.tmpspace; po.nboff = 0; po.nbits = 8 * sizeof(po.tmpspace); po.outper = cb; po.op_key = app_key; po.flushed_bytes = 0; er = td->uper_encoder(td, constraints, sptr, &po); if(er.encoded != -1) { size_t bits_to_flush; bits_to_flush = ((po.buffer - po.tmpspace) << 3) + po.nboff; /* Set number of bits encoded to a firm value */ er.encoded = (po.flushed_bytes << 3) + bits_to_flush; if(_uper_encode_flush_outp(&po)) _ASN_ENCODE_FAILED; } return er; } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/per_encoder.h000066400000000000000000000041771305042567700231350ustar00rootroot00000000000000/*- * Copyright (c) 2006, 2007 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _PER_ENCODER_H_ #define _PER_ENCODER_H_ #include #include #ifdef __cplusplus extern "C" { #endif struct asn_TYPE_descriptor_s; /* Forward declaration */ /* * Unaligned PER encoder of any ASN.1 type. May be invoked by the application. * WARNING: This function returns the number of encoded bits in the .encoded * field of the return value. Use the following formula to convert to bytes: * bytes = ((.encoded + 7) / 8) */ asn_enc_rval_t uper_encode(struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, /* Structure to be encoded */ asn_app_consume_bytes_f *consume_bytes_cb, /* Data collector */ void *app_key /* Arbitrary callback argument */ ); /* * A variant of uper_encode() which encodes data into the existing buffer * WARNING: This function returns the number of encoded bits in the .encoded * field of the return value. */ asn_enc_rval_t uper_encode_to_buffer( struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, /* Structure to be encoded */ void *buffer, /* Pre-allocated buffer */ size_t buffer_size /* Initial buffer size (max) */ ); /* * A variant of uper_encode_to_buffer() which allocates buffer itself. * Returns the number of bytes in the buffer or -1 in case of failure. * WARNING: This function produces a "Production of the complete encoding", * with length of at least one octet. Contrast this to precise bit-packing * encoding of uper_encode() and uper_encode_to_buffer(). */ ssize_t uper_encode_to_new_buffer( struct asn_TYPE_descriptor_s *type_descriptor, asn_per_constraints_t *constraints, void *struct_ptr, /* Structure to be encoded */ void **buffer_r /* Buffer allocated and returned */ ); /* * Type of the generic PER encoder function. */ typedef asn_enc_rval_t (per_type_encoder_f)( struct asn_TYPE_descriptor_s *type_descriptor, asn_per_constraints_t *constraints, void *struct_ptr, asn_per_outp_t *per_output ); #ifdef __cplusplus } #endif #endif /* _PER_ENCODER_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/per_opentype.c000066400000000000000000000216731305042567700233540ustar00rootroot00000000000000/* * Copyright (c) 2007 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include #include typedef struct uper_ugot_key { asn_per_data_t oldpd; /* Old per data source */ size_t unclaimed; size_t ot_moved; /* Number of bits moved by OT processing */ int repeat; } uper_ugot_key; static int uper_ugot_refill(asn_per_data_t *pd); static int per_skip_bits(asn_per_data_t *pd, int skip_nbits); static asn_dec_rval_t uper_sot_suck(asn_codec_ctx_t *, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd); int asn_debug_indent; /* * Encode an "open type field". * #10.1, #10.2 */ int uper_open_type_put(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { void *buf; void *bptr; ssize_t size; size_t toGo; ASN_DEBUG("Open type put %s ...", td->name); size = uper_encode_to_new_buffer(td, constraints, sptr, &buf); if(size <= 0) return -1; for(bptr = buf, toGo = size; toGo;) { ssize_t maySave = uper_put_length(po, toGo); if(maySave < 0) break; if(per_put_many_bits(po, bptr, maySave * 8)) break; bptr = (char *)bptr + maySave; toGo -= maySave; } FREEMEM(buf); if(toGo) return -1; ASN_DEBUG("Open type put %s of length %d + overhead (1byte?)", td->name, size); return 0; } static asn_dec_rval_t uper_open_type_get_simple(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { asn_dec_rval_t rv; ssize_t chunk_bytes; int repeat; uint8_t *buf = 0; size_t bufLen = 0; size_t bufSize = 0; asn_per_data_t spd; size_t padding; _ASN_STACK_OVERFLOW_CHECK(ctx); ASN_DEBUG("Getting open type %s...", td->name); do { chunk_bytes = uper_get_length(pd, -1, &repeat); if(chunk_bytes < 0) { FREEMEM(buf); _ASN_DECODE_STARVED; } if(bufLen + chunk_bytes > bufSize) { void *ptr; bufSize = chunk_bytes + (bufSize << 2); ptr = REALLOC(buf, bufSize); if(!ptr) { FREEMEM(buf); _ASN_DECODE_FAILED; } buf = ptr; } if(per_get_many_bits(pd, buf + bufLen, 0, chunk_bytes << 3)) { FREEMEM(buf); _ASN_DECODE_STARVED; } bufLen += chunk_bytes; } while(repeat); ASN_DEBUG("Getting open type %s encoded in %d bytes", td->name, bufLen); memset(&spd, 0, sizeof(spd)); spd.buffer = buf; spd.nbits = bufLen << 3; asn_debug_indent += 4; rv = td->uper_decoder(ctx, td, constraints, sptr, &spd); asn_debug_indent -= 4; if(rv.code == RC_OK) { /* Check padding validity */ padding = spd.nbits - spd.nboff; if(padding < 8 && per_get_few_bits(&spd, padding) == 0) { /* Everything is cool */ FREEMEM(buf); return rv; } FREEMEM(buf); if(padding >= 8) { ASN_DEBUG("Too large padding %d in open type", padding); _ASN_DECODE_FAILED; } else { ASN_DEBUG("Non-zero padding"); _ASN_DECODE_FAILED; } } else { FREEMEM(buf); /* rv.code could be RC_WMORE, nonsense in this context */ rv.code = RC_FAIL; /* Noone would give us more */ } return rv; } static asn_dec_rval_t GCC_NOTUSED uper_open_type_get_complex(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { uper_ugot_key arg; asn_dec_rval_t rv; ssize_t padding; _ASN_STACK_OVERFLOW_CHECK(ctx); ASN_DEBUG("Getting open type %s from %s", td->name, per_data_string(pd)); arg.oldpd = *pd; arg.unclaimed = 0; arg.ot_moved = 0; arg.repeat = 1; pd->refill = uper_ugot_refill; pd->refill_key = &arg; pd->nbits = pd->nboff; /* 0 good bits at this point, will refill */ pd->moved = 0; /* This now counts the open type size in bits */ asn_debug_indent += 4; rv = td->uper_decoder(ctx, td, constraints, sptr, pd); asn_debug_indent -= 4; #define UPDRESTOREPD do { \ /* buffer and nboff are valid, preserve them. */ \ pd->nbits = arg.oldpd.nbits - (pd->moved - arg.ot_moved); \ pd->moved = arg.oldpd.moved + (pd->moved - arg.ot_moved); \ pd->refill = arg.oldpd.refill; \ pd->refill_key = arg.oldpd.refill_key; \ } while(0) if(rv.code != RC_OK) { UPDRESTOREPD; return rv; } ASN_DEBUG("OpenType %s pd%s old%s unclaimed=%d, repeat=%d" , td->name, per_data_string(pd), per_data_string(&arg.oldpd), arg.unclaimed, arg.repeat); padding = pd->moved % 8; if(padding) { int32_t pvalue; if(padding > 7) { ASN_DEBUG("Too large padding %d in open type", padding); rv.code = RC_FAIL; UPDRESTOREPD; return rv; } padding = 8 - padding; ASN_DEBUG("Getting padding of %d bits", padding); pvalue = per_get_few_bits(pd, padding); switch(pvalue) { case -1: ASN_DEBUG("Padding skip failed"); UPDRESTOREPD; _ASN_DECODE_STARVED; case 0: break; default: ASN_DEBUG("Non-blank padding (%d bits 0x%02x)", padding, (int)pvalue); UPDRESTOREPD; _ASN_DECODE_FAILED; } } if(pd->nboff != pd->nbits) { ASN_DEBUG("Open type %s overhead pd%s old%s", td->name, per_data_string(pd), per_data_string(&arg.oldpd)); if(1) { UPDRESTOREPD; _ASN_DECODE_FAILED; } else { arg.unclaimed += pd->nbits - pd->nboff; } } /* Adjust pd back so it points to original data */ UPDRESTOREPD; /* Skip data not consumed by the decoder */ if(arg.unclaimed) ASN_DEBUG("Getting unclaimed %d", arg.unclaimed); if(arg.unclaimed) { switch(per_skip_bits(pd, arg.unclaimed)) { case -1: ASN_DEBUG("Claim of %d failed", arg.unclaimed); _ASN_DECODE_STARVED; case 0: ASN_DEBUG("Got claim of %d", arg.unclaimed); break; default: /* Padding must be blank */ ASN_DEBUG("Non-blank unconsumed padding"); _ASN_DECODE_FAILED; } arg.unclaimed = 0; } if(arg.repeat) { ASN_DEBUG("Not consumed the whole thing"); rv.code = RC_FAIL; return rv; } return rv; } asn_dec_rval_t uper_open_type_get(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { return uper_open_type_get_simple(ctx, td, constraints, sptr, pd); } int uper_open_type_skip(asn_codec_ctx_t *ctx, asn_per_data_t *pd) { asn_TYPE_descriptor_t s_td; asn_dec_rval_t rv; s_td.name = ""; s_td.uper_decoder = uper_sot_suck; rv = uper_open_type_get(ctx, &s_td, 0, 0, pd); if(rv.code != RC_OK) return -1; else return 0; } /* * Internal functions. */ static asn_dec_rval_t uper_sot_suck(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { asn_dec_rval_t rv; (void)ctx; (void)td; (void)constraints; (void)sptr; while(per_get_few_bits(pd, 24) >= 0); rv.code = RC_OK; rv.consumed = pd->moved; return rv; } static int uper_ugot_refill(asn_per_data_t *pd) { uper_ugot_key *arg = pd->refill_key; ssize_t next_chunk_bytes, next_chunk_bits; ssize_t avail; asn_per_data_t *oldpd = &arg->oldpd; ASN_DEBUG("REFILLING pd->moved=%d, oldpd->moved=%d", pd->moved, oldpd->moved); /* Advance our position to where pd is */ oldpd->buffer = pd->buffer; oldpd->nboff = pd->nboff; oldpd->nbits -= pd->moved - arg->ot_moved; oldpd->moved += pd->moved - arg->ot_moved; arg->ot_moved = pd->moved; if(arg->unclaimed) { /* Refill the container */ if(per_get_few_bits(oldpd, 1)) return -1; if(oldpd->nboff == 0) { assert(0); return -1; } pd->buffer = oldpd->buffer; pd->nboff = oldpd->nboff - 1; pd->nbits = oldpd->nbits; ASN_DEBUG("UNCLAIMED <- return from (pd->moved=%d)", pd->moved); return 0; } if(!arg->repeat) { ASN_DEBUG("Want more but refill doesn't have it"); return -1; } next_chunk_bytes = uper_get_length(oldpd, -1, &arg->repeat); ASN_DEBUG("Open type LENGTH %d bytes at off %d, repeat %d", next_chunk_bytes, oldpd->moved, arg->repeat); if(next_chunk_bytes < 0) return -1; if(next_chunk_bytes == 0) { pd->refill = 0; /* No more refills, naturally */ assert(!arg->repeat); /* Implementation guarantee */ } next_chunk_bits = next_chunk_bytes << 3; avail = oldpd->nbits - oldpd->nboff; if(avail >= next_chunk_bits) { pd->nbits = oldpd->nboff + next_chunk_bits; arg->unclaimed = 0; ASN_DEBUG("!+Parent frame %d bits, alloting %d [%d..%d] (%d)", next_chunk_bits, oldpd->moved, oldpd->nboff, oldpd->nbits, oldpd->nbits - oldpd->nboff); } else { pd->nbits = oldpd->nbits; arg->unclaimed = next_chunk_bits - avail; ASN_DEBUG("!-Parent frame %d, require %d, will claim %d", avail, next_chunk_bits, arg->unclaimed); } pd->buffer = oldpd->buffer; pd->nboff = oldpd->nboff; ASN_DEBUG("Refilled pd%s old%s", per_data_string(pd), per_data_string(oldpd)); return 0; } static int per_skip_bits(asn_per_data_t *pd, int skip_nbits) { int hasNonZeroBits = 0; while(skip_nbits > 0) { int skip; if(skip_nbits < skip) skip = skip_nbits; else skip = 24; skip_nbits -= skip; switch(per_get_few_bits(pd, skip)) { case -1: return -1; /* Starving */ case 0: continue; /* Skipped empty space */ default: hasNonZeroBits = 1; continue; } } return hasNonZeroBits; } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/per_opentype.h000066400000000000000000000012321305042567700233460ustar00rootroot00000000000000/* * Copyright (c) 2007 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _PER_OPENTYPE_H_ #define _PER_OPENTYPE_H_ #ifdef __cplusplus extern "C" { #endif asn_dec_rval_t uper_open_type_get(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd); int uper_open_type_skip(asn_codec_ctx_t *opt_codec_ctx, asn_per_data_t *pd); int uper_open_type_put(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po); #ifdef __cplusplus } #endif #endif /* _PER_OPENTYPE_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/per_support.c000066400000000000000000000231231305042567700232150ustar00rootroot00000000000000/* * Copyright (c) 2005, 2006, 2007 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include char * per_data_string(asn_per_data_t *pd) { static char buf[2][32]; static int n; n = (n+1) % 2; snprintf(buf[n], sizeof(buf), "{m=%d span %+d[%d..%d] (%d)}", pd->moved, (((int)pd->buffer) & 0xf), pd->nboff, pd->nbits, pd->nbits - pd->nboff); return buf[n]; } void per_get_undo(asn_per_data_t *pd, int nbits) { if((ssize_t)pd->nboff < nbits) { assert((ssize_t)pd->nboff < nbits); } else { pd->nboff -= nbits; pd->moved -= nbits; } } /* * Extract a small number of bits (<= 31) from the specified PER data pointer. */ int32_t per_get_few_bits(asn_per_data_t *pd, int nbits) { size_t off; /* Next after last bit offset */ ssize_t nleft; /* Number of bits left in this stream */ uint32_t accum; const uint8_t *buf; if(nbits < 0) return -1; nleft = pd->nbits - pd->nboff; if(nbits > nleft) { int32_t tailv, vhead; if(!pd->refill || nbits > 31) return -1; /* Accumulate unused bytes before refill */ ASN_DEBUG("Obtain the rest %d bits (want %d)", nleft, nbits); tailv = per_get_few_bits(pd, nleft); if(tailv < 0) return -1; /* Refill (replace pd contents with new data) */ if(pd->refill(pd)) return -1; nbits -= nleft; vhead = per_get_few_bits(pd, nbits); /* Combine the rest of previous pd with the head of new one */ tailv = (tailv << nbits) | vhead; /* Could == -1 */ return tailv; } /* * Normalize position indicator. */ if(pd->nboff >= 8) { pd->buffer += (pd->nboff >> 3); pd->nbits -= (pd->nboff & ~0x07); pd->nboff &= 0x07; } pd->moved += nbits; pd->nboff += nbits; off = pd->nboff; buf = pd->buffer; /* * Extract specified number of bits. */ if(off <= 8) accum = nbits ? (buf[0]) >> (8 - off) : 0; else if(off <= 16) accum = ((buf[0] << 8) + buf[1]) >> (16 - off); else if(off <= 24) accum = ((buf[0] << 16) + (buf[1] << 8) + buf[2]) >> (24 - off); else if(off <= 31) accum = ((buf[0] << 24) + (buf[1] << 16) + (buf[2] << 8) + (buf[3])) >> (32 - off); else if(nbits <= 31) { asn_per_data_t tpd = *pd; /* Here are we with our 31-bits limit plus 1..7 bits offset. */ per_get_undo(&tpd, nbits); /* The number of available bits in the stream allow * for the following operations to take place without * invoking the ->refill() function */ accum = per_get_few_bits(&tpd, nbits - 24) << 24; accum |= per_get_few_bits(&tpd, 24); } else { per_get_undo(pd, nbits); return -1; } accum &= (((uint32_t)1 << nbits) - 1); ASN_DEBUG(" [PER got %2d<=%2d bits => span %d %+d[%d..%d]:%02x (%d) => 0x%x]", nbits, nleft, pd->moved, (((int)pd->buffer) & 0xf), pd->nboff, pd->nbits, pd->buffer[0], pd->nbits - pd->nboff, (int)accum); return accum; } /* * Extract a large number of bits from the specified PER data pointer. */ int per_get_many_bits(asn_per_data_t *pd, uint8_t *dst, int alright, int nbits) { int32_t value; if(alright && (nbits & 7)) { /* Perform right alignment of a first few bits */ value = per_get_few_bits(pd, nbits & 0x07); if(value < 0) return -1; *dst++ = value; /* value is already right-aligned */ nbits &= ~7; } while(nbits) { if(nbits >= 24) { value = per_get_few_bits(pd, 24); if(value < 0) return -1; *(dst++) = value >> 16; *(dst++) = value >> 8; *(dst++) = value; nbits -= 24; } else { value = per_get_few_bits(pd, nbits); if(value < 0) return -1; if(nbits & 7) { /* implies left alignment */ value <<= 8 - (nbits & 7), nbits += 8 - (nbits & 7); if(nbits > 24) *dst++ = value >> 24; } if(nbits > 16) *dst++ = value >> 16; if(nbits > 8) *dst++ = value >> 8; *dst++ = value; break; } } return 0; } /* * Get the length "n" from the stream. */ ssize_t uper_get_length(asn_per_data_t *pd, int ebits, int *repeat) { ssize_t value; *repeat = 0; if(ebits >= 0) return per_get_few_bits(pd, ebits); value = per_get_few_bits(pd, 8); if(value < 0) return -1; if((value & 128) == 0) /* #10.9.3.6 */ return (value & 0x7F); if((value & 64) == 0) { /* #10.9.3.7 */ value = ((value & 63) << 8) | per_get_few_bits(pd, 8); if(value < 0) return -1; return value; } value &= 63; /* this is "m" from X.691, #10.9.3.8 */ if(value < 1 || value > 4) return -1; *repeat = 1; return (16384 * value); } /* * Get the normally small length "n". * This procedure used to decode length of extensions bit-maps * for SET and SEQUENCE types. */ ssize_t uper_get_nslength(asn_per_data_t *pd) { ssize_t length; ASN_DEBUG("Getting normally small length"); if(per_get_few_bits(pd, 1) == 0) { length = per_get_few_bits(pd, 6) + 1; if(length <= 0) return -1; ASN_DEBUG("l=%d", length); return length; } else { int repeat; length = uper_get_length(pd, -1, &repeat); if(length >= 0 && !repeat) return length; return -1; /* Error, or do not support >16K extensions */ } } /* * Get the normally small non-negative whole number. * X.691, #10.6 */ ssize_t uper_get_nsnnwn(asn_per_data_t *pd) { ssize_t value; value = per_get_few_bits(pd, 7); if(value & 64) { /* implicit (value < 0) */ value &= 63; value <<= 2; value |= per_get_few_bits(pd, 2); if(value & 128) /* implicit (value < 0) */ return -1; if(value == 0) return 0; if(value >= 3) return -1; value = per_get_few_bits(pd, 8 * value); return value; } return value; } /* * Put the normally small non-negative whole number. * X.691, #10.6 */ int uper_put_nsnnwn(asn_per_outp_t *po, int n) { int bytes; if(n <= 63) { if(n < 0) return -1; return per_put_few_bits(po, n, 7); } if(n < 256) bytes = 1; else if(n < 65536) bytes = 2; else if(n < 256 * 65536) bytes = 3; else return -1; /* This is not a "normally small" value */ if(per_put_few_bits(po, bytes, 8)) return -1; return per_put_few_bits(po, n, 8 * bytes); } /* * Put a small number of bits (<= 31). */ int per_put_few_bits(asn_per_outp_t *po, uint32_t bits, int obits) { size_t off; /* Next after last bit offset */ size_t omsk; /* Existing last byte meaningful bits mask */ uint8_t *buf; if(obits <= 0 || obits >= 32) return obits ? -1 : 0; ASN_DEBUG("[PER put %d bits %x to %p+%d bits]", obits, (int)bits, po->buffer, po->nboff); /* * Normalize position indicator. */ if(po->nboff >= 8) { po->buffer += (po->nboff >> 3); po->nbits -= (po->nboff & ~0x07); po->nboff &= 0x07; } /* * Flush whole-bytes output, if necessary. */ if(po->nboff + obits > po->nbits) { int complete_bytes = (po->buffer - po->tmpspace); ASN_DEBUG("[PER output %d complete + %d]", complete_bytes, po->flushed_bytes); if(po->outper(po->tmpspace, complete_bytes, po->op_key) < 0) return -1; if(po->nboff) po->tmpspace[0] = po->buffer[0]; po->buffer = po->tmpspace; po->nbits = 8 * sizeof(po->tmpspace); po->flushed_bytes += complete_bytes; } /* * Now, due to sizeof(tmpspace), we are guaranteed large enough space. */ buf = po->buffer; omsk = ~((1 << (8 - po->nboff)) - 1); off = (po->nboff += obits); /* Clear data of debris before meaningful bits */ bits &= (((uint32_t)1 << obits) - 1); ASN_DEBUG("[PER out %d %u/%x (t=%d,o=%d) %x&%x=%x]", obits, (int)bits, (int)bits, po->nboff - obits, off, buf[0], omsk&0xff, buf[0] & omsk); if(off <= 8) /* Completely within 1 byte */ bits <<= (8 - off), buf[0] = (buf[0] & omsk) | bits; else if(off <= 16) bits <<= (16 - off), buf[0] = (buf[0] & omsk) | (bits >> 8), buf[1] = bits; else if(off <= 24) bits <<= (24 - off), buf[0] = (buf[0] & omsk) | (bits >> 16), buf[1] = bits >> 8, buf[2] = bits; else if(off <= 31) bits <<= (32 - off), buf[0] = (buf[0] & omsk) | (bits >> 24), buf[1] = bits >> 16, buf[2] = bits >> 8, buf[3] = bits; else { ASN_DEBUG("->[PER out split %d]", obits); per_put_few_bits(po, bits >> 8, 24); per_put_few_bits(po, bits, obits - 24); ASN_DEBUG("<-[PER out split %d]", obits); } ASN_DEBUG("[PER out %u/%x => %02x buf+%d]", (int)bits, (int)bits, buf[0], po->buffer - po->tmpspace); return 0; } /* * Output a large number of bits. */ int per_put_many_bits(asn_per_outp_t *po, const uint8_t *src, int nbits) { while(nbits) { uint32_t value; if(nbits >= 24) { value = (src[0] << 16) | (src[1] << 8) | src[2]; src += 3; nbits -= 24; if(per_put_few_bits(po, value, 24)) return -1; } else { value = src[0]; if(nbits > 8) value = (value << 8) | src[1]; if(nbits > 16) value = (value << 8) | src[2]; if(nbits & 0x07) value >>= (8 - (nbits & 0x07)); if(per_put_few_bits(po, value, nbits)) return -1; break; } } return 0; } /* * Put the length "n" (or part of it) into the stream. */ ssize_t uper_put_length(asn_per_outp_t *po, size_t length) { if(length <= 127) /* #10.9.3.6 */ return per_put_few_bits(po, length, 8) ? -1 : (ssize_t)length; else if(length < 16384) /* #10.9.3.7 */ return per_put_few_bits(po, length|0x8000, 16) ? -1 : (ssize_t)length; length >>= 14; if(length > 4) length = 4; return per_put_few_bits(po, 0xC0 | length, 8) ? -1 : (ssize_t)(length << 14); } /* * Put the normally small length "n" into the stream. * This procedure used to encode length of extensions bit-maps * for SET and SEQUENCE types. */ int uper_put_nslength(asn_per_outp_t *po, size_t length) { if(length <= 64) { /* #10.9.3.4 */ if(length == 0) return -1; return per_put_few_bits(po, length-1, 7) ? -1 : 0; } else { if(uper_put_length(po, length) != (ssize_t)length) { /* This might happen in case of >16K extensions */ return -1; } } return 0; } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/per_support.h000066400000000000000000000075411305042567700232300ustar00rootroot00000000000000/* * Copyright (c) 2005, 2006, 2007 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _PER_SUPPORT_H_ #define _PER_SUPPORT_H_ #include /* Platform-specific types */ #ifdef __cplusplus extern "C" { #endif /* * Pre-computed PER constraints. */ typedef struct asn_per_constraint_s { enum asn_per_constraint_flags { APC_UNCONSTRAINED = 0x0, /* No PER visible constraints */ APC_SEMI_CONSTRAINED = 0x1, /* Constrained at "lb" */ APC_CONSTRAINED = 0x2, /* Fully constrained */ APC_EXTENSIBLE = 0x4 /* May have extension */ } flags; int range_bits; /* Full number of bits in the range */ int effective_bits; /* Effective bits */ long lower_bound; /* "lb" value */ long upper_bound; /* "ub" value */ } asn_per_constraint_t; typedef struct asn_per_constraints_s { asn_per_constraint_t value; asn_per_constraint_t size; int (*value2code)(unsigned int value); int (*code2value)(unsigned int code); } asn_per_constraints_t; /* * This structure describes a position inside an incoming PER bit stream. */ typedef struct asn_per_data_s { const uint8_t *buffer; /* Pointer to the octet stream */ size_t nboff; /* Bit offset to the meaningful bit */ size_t nbits; /* Number of bits in the stream */ size_t moved; /* Number of bits moved through this bit stream */ int (*refill)(struct asn_per_data_s *); void *refill_key; } asn_per_data_t; /* * Extract a small number of bits (<= 31) from the specified PER data pointer. * This function returns -1 if the specified number of bits could not be * extracted due to EOD or other conditions. */ int32_t per_get_few_bits(asn_per_data_t *per_data, int get_nbits); /* Undo the immediately preceeding "get_few_bits" operation */ void per_get_undo(asn_per_data_t *per_data, int get_nbits); /* * Extract a large number of bits from the specified PER data pointer. * This function returns -1 if the specified number of bits could not be * extracted due to EOD or other conditions. */ int per_get_many_bits(asn_per_data_t *pd, uint8_t *dst, int right_align, int get_nbits); /* * Get the length "n" from the Unaligned PER stream. */ ssize_t uper_get_length(asn_per_data_t *pd, int effective_bound_bits, int *repeat); /* * Get the normally small length "n". */ ssize_t uper_get_nslength(asn_per_data_t *pd); /* * Get the normally small non-negative whole number. */ ssize_t uper_get_nsnnwn(asn_per_data_t *pd); /* Non-thread-safe debugging function, don't use it */ char *per_data_string(asn_per_data_t *pd); /* * This structure supports forming PER output. */ typedef struct asn_per_outp_s { uint8_t *buffer; /* Pointer into the (tmpspace) */ size_t nboff; /* Bit offset to the meaningful bit */ size_t nbits; /* Number of bits left in (tmpspace) */ uint8_t tmpspace[32]; /* Preliminary storage to hold data */ int (*outper)(const void *data, size_t size, void *op_key); void *op_key; /* Key for (outper) data callback */ size_t flushed_bytes; /* Bytes already flushed through (outper) */ } asn_per_outp_t; /* Output a small number of bits (<= 31) */ int per_put_few_bits(asn_per_outp_t *per_data, uint32_t bits, int obits); /* Output a large number of bits */ int per_put_many_bits(asn_per_outp_t *po, const uint8_t *src, int put_nbits); /* * Put the length "n" to the Unaligned PER stream. * This function returns the number of units which may be flushed * in the next units saving iteration. */ ssize_t uper_put_length(asn_per_outp_t *po, size_t whole_length); /* * Put the normally small length "n" to the Unaligned PER stream. * Returns 0 or -1. */ int uper_put_nslength(asn_per_outp_t *po, size_t length); /* * Put the normally small non-negative whole number. */ int uper_put_nsnnwn(asn_per_outp_t *po, int n); #ifdef __cplusplus } #endif #endif /* _PER_SUPPORT_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/xer_decoder.c000066400000000000000000000210141305042567700231130ustar00rootroot00000000000000/* * Copyright (c) 2004, 2005 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include /* XER/XML parsing support */ /* * Decode the XER encoding of a given type. */ asn_dec_rval_t xer_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **struct_ptr, const void *buffer, size_t size) { asn_codec_ctx_t s_codec_ctx; /* * Stack checker requires that the codec context * must be allocated on the stack. */ if(opt_codec_ctx) { if(opt_codec_ctx->max_stack_size) { s_codec_ctx = *opt_codec_ctx; opt_codec_ctx = &s_codec_ctx; } } else { /* If context is not given, be security-conscious anyway */ memset(&s_codec_ctx, 0, sizeof(s_codec_ctx)); s_codec_ctx.max_stack_size = _ASN_DEFAULT_STACK_MAX; opt_codec_ctx = &s_codec_ctx; } /* * Invoke type-specific decoder. */ return td->xer_decoder(opt_codec_ctx, td, struct_ptr, 0, buffer, size); } struct xer__cb_arg { pxml_chunk_type_e chunk_type; size_t chunk_size; const void *chunk_buf; int callback_not_invoked; }; static int xer__token_cb(pxml_chunk_type_e type, const void *_chunk_data, size_t _chunk_size, void *key) { struct xer__cb_arg *arg = (struct xer__cb_arg *)key; arg->chunk_type = type; arg->chunk_size = _chunk_size; arg->chunk_buf = _chunk_data; arg->callback_not_invoked = 0; return -1; /* Terminate the XML parsing */ } /* * Fetch the next token from the XER/XML stream. */ ssize_t xer_next_token(int *stateContext, const void *buffer, size_t size, pxer_chunk_type_e *ch_type) { struct xer__cb_arg arg; int new_stateContext = *stateContext; ssize_t ret; arg.callback_not_invoked = 1; ret = pxml_parse(&new_stateContext, buffer, size, xer__token_cb, &arg); if(ret < 0) return -1; if(arg.callback_not_invoked) { assert(ret == 0); /* No data was consumed */ return 0; /* Try again with more data */ } else { assert(arg.chunk_size); assert(arg.chunk_buf == buffer); } /* * Translate the XML chunk types into more convenient ones. */ switch(arg.chunk_type) { case PXML_TEXT: *ch_type = PXER_TEXT; break; case PXML_TAG: return 0; /* Want more */ case PXML_TAG_END: *ch_type = PXER_TAG; break; case PXML_COMMENT: case PXML_COMMENT_END: *ch_type = PXER_COMMENT; break; } *stateContext = new_stateContext; return arg.chunk_size; } #define CSLASH 0x2f /* '/' */ #define LANGLE 0x3c /* '<' */ #define RANGLE 0x3e /* '>' */ xer_check_tag_e xer_check_tag(const void *buf_ptr, int size, const char *need_tag) { const char *buf = (const char *)buf_ptr; const char *end; xer_check_tag_e ct = XCT_OPENING; if(size < 2 || buf[0] != LANGLE || buf[size-1] != RANGLE) { if(size >= 2) ASN_DEBUG("Broken XML tag: \"%c...%c\"", buf[0], buf[size - 1]); return XCT_BROKEN; } /* * Determine the tag class. */ if(buf[1] == CSLASH) { buf += 2; /* advance past "" */ ct = XCT_CLOSING; if(size > 0 && buf[size-1] == CSLASH) return XCT_BROKEN; /* */ } else { buf++; /* advance past "<" */ size -= 2; /* strip "<" and ">" */ if(size > 0 && buf[size-1] == CSLASH) { ct = XCT_BOTH; size--; /* One more, for "/" */ } } /* Sometimes we don't care about the tag */ if(!need_tag || !*need_tag) return (xer_check_tag_e)(XCT__UNK__MASK | ct); /* * Determine the tag name. */ for(end = buf + size; buf < end; buf++, need_tag++) { int b = *buf, n = *need_tag; if(b != n) { if(n == 0) { switch(b) { case 0x09: case 0x0a: case 0x0c: case 0x0d: case 0x20: /* "": whitespace is normal */ return ct; } } return (xer_check_tag_e)(XCT__UNK__MASK | ct); } if(b == 0) return XCT_BROKEN; /* Embedded 0 in buf?! */ } if(*need_tag) return (xer_check_tag_e)(XCT__UNK__MASK | ct); return ct; } #undef ADVANCE #define ADVANCE(num_bytes) do { \ size_t num = (num_bytes); \ buf_ptr = ((const char *)buf_ptr) + num; \ size -= num; \ consumed_myself += num; \ } while(0) #undef RETURN #define RETURN(_code) do { \ rval.code = _code; \ rval.consumed = consumed_myself; \ if(rval.code != RC_OK) \ ASN_DEBUG("Failed with %d", rval.code); \ return rval; \ } while(0) #define XER_GOT_BODY(chunk_buf, chunk_size, size) do { \ ssize_t converted_size = body_receiver \ (struct_key, chunk_buf, chunk_size, \ (size_t)chunk_size < size); \ if(converted_size == -1) RETURN(RC_FAIL); \ if(converted_size == 0 \ && size == (size_t)chunk_size) \ RETURN(RC_WMORE); \ chunk_size = converted_size; \ } while(0) #define XER_GOT_EMPTY() do { \ if(body_receiver(struct_key, 0, 0, size > 0) == -1) \ RETURN(RC_FAIL); \ } while(0) /* * Generalized function for decoding the primitive values. */ asn_dec_rval_t xer_decode_general(asn_codec_ctx_t *opt_codec_ctx, asn_struct_ctx_t *ctx, /* Type decoder context */ void *struct_key, const char *xml_tag, /* Expected XML tag */ const void *buf_ptr, size_t size, int (*opt_unexpected_tag_decoder) (void *struct_key, const void *chunk_buf, size_t chunk_size), ssize_t (*body_receiver) (void *struct_key, const void *chunk_buf, size_t chunk_size, int have_more) ) { asn_dec_rval_t rval; ssize_t consumed_myself = 0; (void)opt_codec_ctx; /* * Phases of XER/XML processing: * Phase 0: Check that the opening tag matches our expectations. * Phase 1: Processing body and reacting on closing tag. */ if(ctx->phase > 1) RETURN(RC_FAIL); for(;;) { pxer_chunk_type_e ch_type; /* XER chunk type */ ssize_t ch_size; /* Chunk size */ xer_check_tag_e tcv; /* Tag check value */ /* * Get the next part of the XML stream. */ ch_size = xer_next_token(&ctx->context, buf_ptr, size, &ch_type); switch(ch_size) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); default: switch(ch_type) { case PXER_COMMENT: /* Got XML comment */ ADVANCE(ch_size); /* Skip silently */ continue; case PXER_TEXT: if(ctx->phase == 0) { /* * We have to ignore whitespace here, * but in order to be forward compatible * with EXTENDED-XER (EMBED-VALUES, #25) * any text is just ignored here. */ } else { XER_GOT_BODY(buf_ptr, ch_size, size); } ADVANCE(ch_size); continue; case PXER_TAG: break; /* Check the rest down there */ } } assert(ch_type == PXER_TAG && size); tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); /* * Phase 0: * Expecting the opening tag * for the type being processed. * Phase 1: * Waiting for the closing XML tag. */ switch(tcv) { case XCT_BOTH: if(ctx->phase) break; /* Finished decoding of an empty element */ XER_GOT_EMPTY(); ADVANCE(ch_size); ctx->phase = 2; /* Phase out */ RETURN(RC_OK); case XCT_OPENING: if(ctx->phase) break; ADVANCE(ch_size); ctx->phase = 1; /* Processing body phase */ continue; case XCT_CLOSING: if(!ctx->phase) break; ADVANCE(ch_size); ctx->phase = 2; /* Phase out */ RETURN(RC_OK); case XCT_UNKNOWN_BO: /* * Certain tags in the body may be expected. */ if(opt_unexpected_tag_decoder && opt_unexpected_tag_decoder(struct_key, buf_ptr, ch_size) >= 0) { /* Tag's processed fine */ ADVANCE(ch_size); if(!ctx->phase) { /* We are not expecting * the closing tag anymore. */ ctx->phase = 2; /* Phase out */ RETURN(RC_OK); } continue; } /* Fall through */ default: break; /* Unexpected tag */ } ASN_DEBUG("Unexpected XML tag (expected \"%s\")", xml_tag); break; /* Dark and mysterious things have just happened */ } RETURN(RC_FAIL); } int xer_is_whitespace(const void *chunk_buf, size_t chunk_size) { const char *p = (const char *)chunk_buf; const char *pend = p + chunk_size; for(; p < pend; p++) { switch(*p) { /* X.693, #8.1.4 * HORISONTAL TAB (9) * LINE FEED (10) * CARRIAGE RETURN (13) * SPACE (32) */ case 0x09: case 0x0a: case 0x0d: case 0x20: break; default: return 0; } } return 1; /* All whitespace */ } /* * This is a vastly simplified, non-validating XML tree skipper. */ int xer_skip_unknown(xer_check_tag_e tcv, ber_tlv_len_t *depth) { assert(*depth > 0); switch(tcv) { case XCT_BOTH: case XCT_UNKNOWN_BO: /* These negate each other. */ return 0; case XCT_OPENING: case XCT_UNKNOWN_OP: ++(*depth); return 0; case XCT_CLOSING: case XCT_UNKNOWN_CL: if(--(*depth) == 0) return (tcv == XCT_CLOSING) ? 2 : 1; return 0; default: return -1; } } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/xer_decoder.h000066400000000000000000000064101305042567700231230ustar00rootroot00000000000000/*- * Copyright (c) 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _XER_DECODER_H_ #define _XER_DECODER_H_ #include #ifdef __cplusplus extern "C" { #endif struct asn_TYPE_descriptor_s; /* Forward declaration */ /* * The XER decoder of any ASN.1 type. May be invoked by the application. */ asn_dec_rval_t xer_decode(struct asn_codec_ctx_s *opt_codec_ctx, struct asn_TYPE_descriptor_s *type_descriptor, void **struct_ptr, /* Pointer to a target structure's pointer */ const void *buffer, /* Data to be decoded */ size_t size /* Size of data buffer */ ); /* * Type of the type-specific XER decoder function. */ typedef asn_dec_rval_t (xer_type_decoder_f)(asn_codec_ctx_t *opt_codec_ctx, struct asn_TYPE_descriptor_s *type_descriptor, void **struct_ptr, const char *opt_mname, /* Member name */ const void *buf_ptr, size_t size ); /******************************* * INTERNALLY USEFUL FUNCTIONS * *******************************/ /* * Generalized function for decoding the primitive values. * Used by more specialized functions, such as OCTET_STRING_decode_xer_utf8 * and others. This function should not be used by applications, as its API * is subject to changes. */ asn_dec_rval_t xer_decode_general(asn_codec_ctx_t *opt_codec_ctx, asn_struct_ctx_t *ctx, /* Type decoder context */ void *struct_key, /* Treated as opaque pointer */ const char *xml_tag, /* Expected XML tag name */ const void *buf_ptr, size_t size, int (*opt_unexpected_tag_decoder) (void *struct_key, const void *chunk_buf, size_t chunk_size), ssize_t (*body_receiver) (void *struct_key, const void *chunk_buf, size_t chunk_size, int have_more) ); /* * Fetch the next XER (XML) token from the stream. * The function returns the number of bytes occupied by the chunk type, * returned in the _ch_type. The _ch_type is only set (and valid) when * the return value is greater than 0. */ typedef enum pxer_chunk_type { PXER_TAG, /* Complete XER tag */ PXER_TEXT, /* Plain text between XER tags */ PXER_COMMENT /* A comment, may be part of */ } pxer_chunk_type_e; ssize_t xer_next_token(int *stateContext, const void *buffer, size_t size, pxer_chunk_type_e *_ch_type); /* * This function checks the buffer against the tag name is expected to occur. */ typedef enum xer_check_tag { XCT_BROKEN = 0, /* The tag is broken */ XCT_OPENING = 1, /* This is the tag */ XCT_CLOSING = 2, /* This is the tag */ XCT_BOTH = 3, /* This is the tag */ XCT__UNK__MASK = 4, /* Mask of everything unexpected */ XCT_UNKNOWN_OP = 5, /* Unexpected tag */ XCT_UNKNOWN_CL = 6, /* Unexpected tag */ XCT_UNKNOWN_BO = 7 /* Unexpected tag */ } xer_check_tag_e; xer_check_tag_e xer_check_tag(const void *buf_ptr, int size, const char *need_tag); /* * Check whether this buffer consists of entirely XER whitespace characters. * RETURN VALUES: * 1: Whitespace or empty string * 0: Non-whitespace */ int xer_is_whitespace(const void *chunk_buf, size_t chunk_size); /* * Skip the series of anticipated extensions. */ int xer_skip_unknown(xer_check_tag_e tcv, ber_tlv_len_t *depth); #ifdef __cplusplus } #endif #endif /* _XER_DECODER_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/xer_encoder.c000066400000000000000000000030051305042567700231250ustar00rootroot00000000000000/*- * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include #include /* * The XER encoder of any type. May be invoked by the application. */ asn_enc_rval_t xer_encode(asn_TYPE_descriptor_t *td, void *sptr, enum xer_encoder_flags_e xer_flags, asn_app_consume_bytes_f *cb, void *app_key) { asn_enc_rval_t er, tmper; const char *mname; size_t mlen; int xcan = (xer_flags & XER_F_CANONICAL) ? 1 : 2; if(!td || !sptr) goto cb_failed; mname = td->xml_tag; mlen = strlen(mname); _ASN_CALLBACK3("<", 1, mname, mlen, ">", 1); tmper = td->xer_encoder(td, sptr, 1, xer_flags, cb, app_key); if(tmper.encoded == -1) return tmper; _ASN_CALLBACK3("\n", xcan); er.encoded = 4 + xcan + (2 * mlen) + tmper.encoded; _ASN_ENCODED_OK(er); cb_failed: _ASN_ENCODE_FAILED; } /* * This is a helper function for xer_fprint, which directs all incoming data * into the provided file descriptor. */ static int xer__print2fp(const void *buffer, size_t size, void *app_key) { FILE *stream = (FILE *)app_key; if(fwrite(buffer, 1, size, stream) != size) return -1; return 0; } int xer_fprint(FILE *stream, asn_TYPE_descriptor_t *td, void *sptr) { asn_enc_rval_t er; if(!stream) stream = stdout; if(!td || !sptr) return -1; er = xer_encode(td, sptr, XER_F_BASIC, xer__print2fp, stream); if(er.encoded == -1) return -1; return fflush(stream); } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/xer_encoder.h000066400000000000000000000032411305042567700231340ustar00rootroot00000000000000/*- * Copyright (c) 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _XER_ENCODER_H_ #define _XER_ENCODER_H_ #include #ifdef __cplusplus extern "C" { #endif struct asn_TYPE_descriptor_s; /* Forward declaration */ /* Flags used by the xer_encode() and (*xer_type_encoder_f), defined below */ enum xer_encoder_flags_e { /* Mode of encoding */ XER_F_BASIC = 0x01, /* BASIC-XER (pretty-printing) */ XER_F_CANONICAL = 0x02 /* Canonical XER (strict rules) */ }; /* * The XER encoder of any type. May be invoked by the application. */ asn_enc_rval_t xer_encode(struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, /* Structure to be encoded */ enum xer_encoder_flags_e xer_flags, asn_app_consume_bytes_f *consume_bytes_cb, void *app_key /* Arbitrary callback argument */ ); /* * The variant of the above function which dumps the BASIC-XER (XER_F_BASIC) * output into the chosen file pointer. * RETURN VALUES: * 0: The structure is printed. * -1: Problem printing the structure. * WARNING: No sensible errno value is returned. */ int xer_fprint(FILE *stream, struct asn_TYPE_descriptor_s *td, void *sptr); /* * Type of the generic XER encoder. */ typedef asn_enc_rval_t (xer_type_encoder_f)( struct asn_TYPE_descriptor_s *type_descriptor, void *struct_ptr, /* Structure to be encoded */ int ilevel, /* Level of indentation */ enum xer_encoder_flags_e xer_flags, asn_app_consume_bytes_f *consume_bytes_cb, /* Callback */ void *app_key /* Arbitrary callback argument */ ); #ifdef __cplusplus } #endif #endif /* _XER_ENCODER_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/xer_support.c000066400000000000000000000126551305042567700232350ustar00rootroot00000000000000/* * Copyright (c) 2003, 2004 X/IO Labs, xiolabs.com. * Copyright (c) 2003, 2004, 2005 Lev Walkin . * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include #include /* Parser states */ typedef enum { ST_TEXT, ST_TAG_START, ST_TAG_BODY, ST_TAG_QUOTE_WAIT, ST_TAG_QUOTED_STRING, ST_TAG_UNQUOTED_STRING, ST_COMMENT_WAIT_DASH1, /* ""[0] */ ST_COMMENT_CLO_RT /* "-->"[1] */ } pstate_e; static pxml_chunk_type_e final_chunk_type[] = { PXML_TEXT, PXML_TAG_END, PXML_COMMENT_END, PXML_TAG_END, PXML_COMMENT_END, }; static int _charclass[256] = { 0,0,0,0,0,0,0,0, 0,1,1,0,1,1,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 2,2,2,2,2,2,2,2, 2,2,0,0,0,0,0,0, /* 01234567 89 */ 0,3,3,3,3,3,3,3, 3,3,3,3,3,3,3,3, /* ABCDEFG HIJKLMNO */ 3,3,3,3,3,3,3,3, 3,3,3,0,0,0,0,0, /* PQRSTUVW XYZ */ 0,3,3,3,3,3,3,3, 3,3,3,3,3,3,3,3, /* abcdefg hijklmno */ 3,3,3,3,3,3,3,3, 3,3,3,0,0,0,0,0 /* pqrstuvw xyz */ }; #define WHITESPACE(c) (_charclass[(unsigned char)(c)] == 1) #define ALNUM(c) (_charclass[(unsigned char)(c)] >= 2) #define ALPHA(c) (_charclass[(unsigned char)(c)] == 3) /* Aliases for characters, ASCII/UTF-8 */ #define EXCLAM 0x21 /* '!' */ #define CQUOTE 0x22 /* '"' */ #define CDASH 0x2d /* '-' */ #define CSLASH 0x2f /* '/' */ #define LANGLE 0x3c /* '<' */ #define CEQUAL 0x3d /* '=' */ #define RANGLE 0x3e /* '>' */ #define CQUEST 0x3f /* '?' */ /* Invoke token callback */ #define TOKEN_CB_CALL(type, _ns, _current_too, _final) do { \ int _ret; \ pstate_e ns = _ns; \ ssize_t _sz = (p - chunk_start) + _current_too; \ if (!_sz) { \ /* Shortcut */ \ state = _ns; \ break; \ } \ _ret = cb(type, chunk_start, _sz, key); \ if(_ret < _sz) { \ if(_current_too && _ret == -1) \ state = ns; \ goto finish; \ } \ chunk_start = p + _current_too; \ state = ns; \ } while(0) #define TOKEN_CB(_type, _ns, _current_too) \ TOKEN_CB_CALL(_type, _ns, _current_too, 0) #define TOKEN_CB_FINAL(_type, _ns, _current_too) \ TOKEN_CB_CALL(final_chunk_type[_type], _ns, _current_too, 1) /* * Parser itself */ ssize_t pxml_parse(int *stateContext, const void *xmlbuf, size_t size, pxml_callback_f *cb, void *key) { pstate_e state = (pstate_e)*stateContext; const char *chunk_start = (const char *)xmlbuf; const char *p = chunk_start; const char *end = p + size; for(; p < end; p++) { int C = *(const unsigned char *)p; switch(state) { case ST_TEXT: /* * Initial state: we're in the middle of some text, * or just have started. */ if (C == LANGLE) /* We're now in the tag, probably */ TOKEN_CB(PXML_TEXT, ST_TAG_START, 0); break; case ST_TAG_START: if (ALPHA(C) || (C == CSLASH)) state = ST_TAG_BODY; else if (C == EXCLAM) state = ST_COMMENT_WAIT_DASH1; else /* * Not characters and not whitespace. * Must be something like "3 < 4". */ TOKEN_CB(PXML_TEXT, ST_TEXT, 1);/* Flush as data */ break; case ST_TAG_BODY: switch(C) { case RANGLE: /* End of the tag */ TOKEN_CB_FINAL(PXML_TAG, ST_TEXT, 1); break; case LANGLE: /* * The previous tag wasn't completed, but still * recognized as valid. (Mozilla-compatible) */ TOKEN_CB_FINAL(PXML_TAG, ST_TAG_START, 0); break; case CEQUAL: state = ST_TAG_QUOTE_WAIT; break; } break; case ST_TAG_QUOTE_WAIT: /* * State after the equal sign ("=") in the tag. */ switch(C) { case CQUOTE: state = ST_TAG_QUOTED_STRING; break; case RANGLE: /* End of the tag */ TOKEN_CB_FINAL(PXML_TAG, ST_TEXT, 1); break; default: if(!WHITESPACE(C)) /* Unquoted string value */ state = ST_TAG_UNQUOTED_STRING; } break; case ST_TAG_QUOTED_STRING: /* * Tag attribute's string value in quotes. */ if(C == CQUOTE) { /* Return back to the tag state */ state = ST_TAG_BODY; } break; case ST_TAG_UNQUOTED_STRING: if(C == RANGLE) { /* End of the tag */ TOKEN_CB_FINAL(PXML_TAG, ST_TEXT, 1); } else if(WHITESPACE(C)) { /* Return back to the tag state */ state = ST_TAG_BODY; } break; case ST_COMMENT_WAIT_DASH1: if(C == CDASH) { state = ST_COMMENT_WAIT_DASH2; } else { /* Some ordinary tag. */ state = ST_TAG_BODY; } break; case ST_COMMENT_WAIT_DASH2: if(C == CDASH) { /* Seen "<--" */ state = ST_COMMENT; } else { /* Some ordinary tag */ state = ST_TAG_BODY; } break; case ST_COMMENT: if(C == CDASH) { state = ST_COMMENT_CLO_DASH2; } break; case ST_COMMENT_CLO_DASH2: if(C == CDASH) { state = ST_COMMENT_CLO_RT; } else { /* This is not an end of a comment */ state = ST_COMMENT; } break; case ST_COMMENT_CLO_RT: if(C == RANGLE) { TOKEN_CB_FINAL(PXML_COMMENT, ST_TEXT, 1); } else if(C == CDASH) { /* Maintain current state, still waiting for '>' */ } else { state = ST_COMMENT; } break; } /* switch(*ptr) */ } /* for() */ /* * Flush the partially processed chunk, state permitting. */ if(p - chunk_start) { switch (state) { case ST_COMMENT: TOKEN_CB(PXML_COMMENT, state, 0); break; case ST_TEXT: TOKEN_CB(PXML_TEXT, state, 0); break; default: break; /* a no-op */ } } finish: *stateContext = (int)state; return chunk_start - (const char *)xmlbuf; } gnss-sdr-0.0.9/src/core/libs/supl/asn-supl/xer_support.h000066400000000000000000000034241305042567700232340ustar00rootroot00000000000000/* * Copyright (c) 2003, 2004 X/IO Labs, xiolabs.com. * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #ifndef _XER_SUPPORT_H_ #define _XER_SUPPORT_H_ #include /* Platform-specific types */ #ifdef __cplusplus extern "C" { #endif /* * Types of data transferred to the application. */ typedef enum { PXML_TEXT, /* Plain text between XML tags. */ PXML_TAG, /* A tag, starting with '<'. */ PXML_COMMENT, /* An XML comment, including "". */ /* * The following chunk types are reported if the chunk * terminates the specified XML element. */ PXML_TAG_END, /* Tag ended */ PXML_COMMENT_END /* Comment ended */ } pxml_chunk_type_e; /* * Callback function that is called by the parser when parsed data is * available. The _opaque is the pointer to a field containing opaque user * data specified in pxml_create() call. The chunk type is _type and the text * data is the piece of buffer identified by _bufid (as supplied to * pxml_feed() call) starting at offset _offset and of _size bytes size. * The chunk is NOT '\0'-terminated. */ typedef int (pxml_callback_f)(pxml_chunk_type_e _type, const void *_chunk_data, size_t _chunk_size, void *_key); /* * Parse the given buffer as it were a chunk of XML data. * Invoke the specified callback each time the meaninful data is found. * This function returns number of bytes consumed from the bufer. * It will always be lesser than or equal to the specified _size. * The next invocation of this function must account the difference. */ ssize_t pxml_parse(int *_stateContext, const void *_buf, size_t _size, pxml_callback_f *cb, void *_key); #ifdef __cplusplus } #endif #endif /* _XER_SUPPORT_H_ */ gnss-sdr-0.0.9/src/core/libs/supl/asn/000077500000000000000000000000001305042567700175055ustar00rootroot00000000000000gnss-sdr-0.0.9/src/core/libs/supl/asn/rrlp-components.asn000066400000000000000000001354551305042567700233670ustar00rootroot00000000000000RRLP-Components -- { RRLP-Components } DEFINITIONS AUTOMATIC TAGS ::= BEGIN --IMPORTS -- Ext-GeographicalInformation , VelocityEstimate --FROM -- MAP-LCS-DataTypes { -- ccitt identified-organization (4) etsi (0) mobileDomain (0) -- gsm-Network (1) modules (3) map-LCS-DataTypes (25) version5 (5)} -- -- ExtensionContainer --FROM MAP-ExtensionDataTypes { -- ccitt identified-organization (4) etsi (0) mobileDomain (0) -- gsm-Network (1) modules (3) map-ExtensionDataTypes (21) version4 (4)} --; VelocityEstimate ::= INTEGER ExtensionContainer ::= INTEGER -- Add here other ASN.1 definitions presented below -- in chapters 4 and 5. -- add this definition to RRLP-Components module -- Measurement Position request component MsrPosition-Req ::= SEQUENCE { positionInstruct PositionInstruct, referenceAssistData ReferenceAssistData OPTIONAL, msrAssistData MsrAssistData OPTIONAL, systemInfoAssistData SystemInfoAssistData OPTIONAL, gps-AssistData GPS-AssistData OPTIONAL, extensionContainer ExtensionContainer OPTIONAL, ..., -- Release 98 extension element rel98-MsrPosition-Req-extension Rel98-MsrPosition-Req-Extension OPTIONAL, -- Release 5 extension element rel5-MsrPosition-Req-extension Rel5-MsrPosition-Req-Extension OPTIONAL -- Release 7 extension element -- rel7-MsrPosition-Req-extension Rel7-MsrPosition-Req-Extension OPTIONAL } -- add this defintion to RRLP-Components module -- Measurement Position response component MsrPosition-Rsp ::= SEQUENCE { multipleSets MultipleSets OPTIONAL, referenceIdentity ReferenceIdentity OPTIONAL, otd-MeasureInfo OTD-MeasureInfo OPTIONAL, locationInfo LocationInfo OPTIONAL, gps-MeasureInfo GPS-MeasureInfo OPTIONAL, locationError LocationError OPTIONAL, extensionContainer ExtensionContainer OPTIONAL, ..., -- Release extension here rel-98-MsrPosition-Rsp-Extension Rel-98-MsrPosition-Rsp-Extension OPTIONAL, rel-5-MsrPosition-Rsp-Extension Rel-5-MsrPosition-Rsp-Extension OPTIONAL -- rel-5-MsrPosition-Rsp-Extension and other possible future extensions -- are the only information elements that may be included in the 2nd -- MsrPosition-Rsp component when RRLP pseudo-segmentation is -- rel-7-MsrPosition-Rsp-Extension Rel-7-MsrPosition-Rsp-Extension OPTIONAL } -- add this defintion to RRLP-Components module -- Assistance Data component AssistanceData ::= SEQUENCE { referenceAssistData ReferenceAssistData OPTIONAL, msrAssistData MsrAssistData OPTIONAL, systemInfoAssistData SystemInfoAssistData OPTIONAL, gps-AssistData GPS-AssistData OPTIONAL, moreAssDataToBeSent MoreAssDataToBeSent OPTIONAL, -- If not present, interpret as only -- Assistance Data component used to -- deliver entire set of assistance -- data. extensionContainer ExtensionContainer OPTIONAL, ..., -- Release extension here rel98-AssistanceData-Extension Rel98-AssistanceData-Extension OPTIONAL, rel5-AssistanceData-Extension Rel5-AssistanceData-Extension OPTIONAL -- rel7-AssistanceData-Extension Rel7-AssistanceData-Extension OPTIONAL } -- add this defintion to RRLP-Components module -- Protocol Error component ProtocolError ::= SEQUENCE { errorCause ErrorCodes, extensionContainer ExtensionContainer OPTIONAL, ..., -- Release extensions here rel-5-ProtocolError-Extension Rel-5-ProtocolError-Extension OPTIONAL } -- add these defintions to RRLP-Components module -- Position instructions PositionInstruct ::= SEQUENCE { -- Method type methodType MethodType, positionMethod PositionMethod, measureResponseTime MeasureResponseTime, useMultipleSets UseMultipleSets, environmentCharacter EnvironmentCharacter OPTIONAL } -- MethodType ::= CHOICE { msAssisted AccuracyOpt, -- accuracy is optional msBased Accuracy, -- accuracy is mandatory msBasedPref Accuracy, -- accuracy is mandatory msAssistedPref Accuracy -- accuracy is mandatory } -- Accuracy of the location estimation AccuracyOpt ::= SEQUENCE { accuracy Accuracy OPTIONAL } -- The values of this field are defined in 3GPP TS 23.032 (Uncertainty code) Accuracy ::= INTEGER (0..127) -- Position Method PositionMethod ::= ENUMERATED { eotd (0), gps (1), gpsOrEOTD (2) } -- Measurement request response time MeasureResponseTime ::= INTEGER (0..7) -- useMultiple Sets, FFS! UseMultipleSets ::= ENUMERATED { multipleSets (0), -- multiple sets are allowed oneSet (1) -- sending of multiple is not allowed } -- Environment characterization EnvironmentCharacter ::= ENUMERATED { badArea (0), -- bad urban or suburban, heavy multipath and NLOS notBadArea (1), -- light multipath and NLOS mixedArea (2), -- not defined or mixed environment ... } -- E-OTD reference BTS for Assitance data IE ReferenceAssistData ::= SEQUENCE { bcchCarrier BCCHCarrier, -- BCCH carrier bsic BSIC, -- BSIC timeSlotScheme TimeSlotScheme, -- Timeslot scheme btsPosition BTSPosition OPTIONAL } -- ellipsoid point and -- ellipsoid point with altitude and uncertainty ellipsoid shapes are supported BTSPosition ::= Ext-GeographicalInformation -- RF channel number of BCCH BCCHCarrier ::= INTEGER (0..1023) -- Base station Identity Code BSIC ::= INTEGER (0..63) -- Timeslot scheme TimeSlotScheme ::= ENUMERATED { equalLength (0), variousLength (1) } -- Time slot (modulo) ModuloTimeSlot ::= INTEGER (0..3) -- E-OTD measurement assistance data IE -- The total number of neighbors in this element (MsrAssistData) -- and in SystemInfoAssistData element (presented neighbors -- can be at a maximum 15!) MsrAssistData ::= SEQUENCE { msrAssistList SeqOfMsrAssistBTS } SeqOfMsrAssistBTS ::= SEQUENCE (SIZE(1..15)) OF MsrAssistBTS MsrAssistBTS ::= SEQUENCE { bcchCarrier BCCHCarrier, -- BCCH carrier bsic BSIC, -- BSIC multiFrameOffset MultiFrameOffset, -- multiframe offset timeSlotScheme TimeSlotScheme, -- Timeslot scheme roughRTD RoughRTD, -- rough RTD value -- Location Calculation Assistance data is moved here calcAssistanceBTS CalcAssistanceBTS OPTIONAL } -- Multiframe offset MultiFrameOffset ::= INTEGER (0..51) -- The Multiframe Offset value 51 shall not be encoded by the transmitting entity and -- shall be treated by the receiving entity as 0. -- Rough RTD value between one base station and reference BTS RoughRTD ::= INTEGER (0..1250) -- The RoughRTD value 1250 shall not be encoded by the transmitting entity and shall -- be treated by the receiving entity as 0. -- E-OTD Measurement assistance data for system information List IE -- The total number of base stations in this element (SystemInfoAssistData -- presented neighbors) and in MsrAssistData element can be at a maximum 15. SystemInfoAssistData ::= SEQUENCE { systemInfoAssistList SeqOfSystemInfoAssistBTS } SeqOfSystemInfoAssistBTS::= SEQUENCE (SIZE(1..32)) OF SystemInfoAssistBTS -- whether n.th is present or not ? SystemInfoAssistBTS ::= CHOICE { notPresent NULL, present AssistBTSData } -- Actual assistance data for system information base station AssistBTSData ::= SEQUENCE { bsic BSIC, -- BSIC multiFrameOffset MultiFrameOffset, -- multiframe offset timeSlotScheme TimeSlotScheme, -- Timeslot scheme roughRTD RoughRTD, -- rough RTD value -- Location Calculation Assistance data calcAssistanceBTS CalcAssistanceBTS OPTIONAL } -- E-OTD Location calculation assistance data, -- CalcAssistanceBTS element is optional not subfields CalcAssistanceBTS ::= SEQUENCE { fineRTD FineRTD, -- fine RTD value between base stations referenceWGS84 ReferenceWGS84 -- reference coordinates } -- Coordinates of neighbour BTS, WGS-84 ellipsoid ReferenceWGS84 ::= SEQUENCE { relativeNorth RelDistance, -- relative distance (south negative) relativeEast RelDistance, -- relative distance (west negative) -- Relative Altitude is not always known relativeAlt RelativeAlt OPTIONAL -- relative altitude } -- Fine RTD value between this BTS and the reference BTS FineRTD ::= INTEGER (0..255) -- Relative north/east distance RelDistance ::= INTEGER (-200000..200000) -- Relative altitude RelativeAlt ::= INTEGER (-4000..4000) -- Measure position response IEs -- Reference Identity -- Multiple sets MultipleSets ::= SEQUENCE { -- number of reference sets nbrOfSets INTEGER (2..3), -- This field actually tells the number of reference BTSs nbrOfReferenceBTSs INTEGER (1..3), -- This field is conditional and included optionally only if -- nbrOfSets is 3 and number of reference BTSs is 2. referenceRelation ReferenceRelation OPTIONAL } -- Relation between refence BTSs and sets ReferenceRelation ::= ENUMERATED { secondBTSThirdSet (0), -- 1st BTS related to 1st and 2nd sets secondBTSSecondSet (1), -- 1st BTS related to 1st and 3rd sets firstBTSFirstSet (2) -- 1st BTS related to 1st set } -- Reference BTS Identity, this element contains number of -- BTSs told nbrOfReferenceBTSs field in Multiple sets element) ReferenceIdentity ::= SEQUENCE { -- Reference BTS list refBTSList SeqOfReferenceIdentityType } SeqOfReferenceIdentityType ::= SEQUENCE (SIZE(1..3)) OF ReferenceIdentityType -- Cell identity ReferenceIdentityType ::= CHOICE { bsicAndCarrier BSICAndCarrier, -- BSIC and Carrier ci CellID, -- Cell ID, LAC not needed requestIndex RequestIndex, -- Index to Requested Neighbor List systemInfoIndex SystemInfoIndex, -- Index to System info list, this type of ref. identity -- shall not be used by the MS unless it has received -- the SystemInfoAssistData from the SMLC for this cell. ciAndLAC CellIDAndLAC -- CI and LAC } BSICAndCarrier ::= SEQUENCE { carrier BCCHCarrier, bsic BSIC } RequestIndex ::= INTEGER (1..16) SystemInfoIndex ::= INTEGER (1..32) CellIDAndLAC ::= SEQUENCE { referenceLAC LAC, -- Location area code referenceCI CellID -- Cell identity } CellID ::= INTEGER (0..65535) LAC ::= INTEGER (0..65535) -- OTD-MeasureInfo OTD-MeasureInfo ::= SEQUENCE { -- Measurement info elements, OTD-MsrElement is repeated number of times -- told in nbrOfReferenceBTSs in MultipleSets, default value is 1 otdMsrFirstSets OTD-MsrElementFirst, -- if more than one sets are present this element is repeated -- NumberOfSets - 1 (-1 = first set) otdMsrRestSets SeqOfOTD-MsrElementRest OPTIONAL } SeqOfOTD-MsrElementRest ::= SEQUENCE (SIZE(1..2)) OF OTD-MsrElementRest -- OTD measurent information for 1 set OTD-MsrElementFirst ::= SEQUENCE { refFrameNumber INTEGER (0..42431), -- Frame number modulo 42432 referenceTimeSlot ModuloTimeSlot, toaMeasurementsOfRef TOA-MeasurementsOfRef OPTIONAL, stdResolution StdResolution, taCorrection INTEGER (0..960) OPTIONAL, -- TA correction -- measured neighbors in OTD measurements otd-FirstSetMsrs SeqOfOTD-FirstSetMsrs OPTIONAL } SeqOfOTD-FirstSetMsrs ::= SEQUENCE (SIZE(1..10)) OF OTD-FirstSetMsrs -- OTD measurent information 2 and 3 sets if exist OTD-MsrElementRest ::= SEQUENCE { refFrameNumber INTEGER (0..42431), -- Frame number modulo 42432 referenceTimeSlot ModuloTimeSlot, toaMeasurementsOfRef TOA-MeasurementsOfRef OPTIONAL, stdResolution StdResolution, taCorrection INTEGER (0..960) OPTIONAL, -- TA correction -- measured neighbors in OTD measurements otd-MsrsOfOtherSets SeqOfOTD-MsrsOfOtherSets OPTIONAL } SeqOfOTD-MsrsOfOtherSets ::= SEQUENCE (SIZE(1..10)) OF OTD-MsrsOfOtherSets -- Standard deviation of the TOA measurements from the reference BTS TOA-MeasurementsOfRef ::= SEQUENCE { refQuality RefQuality, numOfMeasurements NumOfMeasurements } RefQuality ::= INTEGER (0..31) -- St Dev of TOA of reference as defined in annex NumOfMeasurements ::= INTEGER (0..7) -- No. of measurements for RefQuality as defined in annex StdResolution ::= INTEGER (0..3) -- Values of resolution are defined in annex OTD-FirstSetMsrs ::= OTD-MeasurementWithID -- Neighbour info in OTD measurements 0-10 times in TD measurement info OTD-MsrsOfOtherSets ::= CHOICE { identityNotPresent OTD-Measurement, identityPresent OTD-MeasurementWithID } -- For this OTD measurement identity is same as the identity of BTS -- in the first set with same sequence number OTD-Measurement ::= SEQUENCE { nborTimeSlot ModuloTimeSlot, eotdQuality EOTDQuality, otdValue OTDValue } -- This measurement contains the BTS identity and measurement OTD-MeasurementWithID ::=SEQUENCE { neighborIdentity NeighborIdentity, nborTimeSlot ModuloTimeSlot, eotdQuality EOTDQuality, otdValue OTDValue } EOTDQuality ::= SEQUENCE { nbrOfMeasurements INTEGER (0..7), stdOfEOTD INTEGER (0..31) } NeighborIdentity ::= CHOICE { bsicAndCarrier BSICAndCarrier, -- BSIC and Carrier ci CellID, -- Cell ID, LAC not needed multiFrameCarrier MultiFrameCarrier, -- MultiFrameOffest and BSIC requestIndex RequestIndex, -- Index to Requested Neighbor List systemInfoIndex SystemInfoIndex, -- Index to System info list, this type of neighbour -- identity shall not be used by the MS unless it has -- received the SystemInfoAssistData from the SMLC for -- this cell. ciAndLAC CellIDAndLAC -- CI and LAC } -- Multiframe and carrier MultiFrameCarrier ::= SEQUENCE { bcchCarrier BCCHCarrier, multiFrameOffset MultiFrameOffset } -- OTD measurement value for neighbour OTDValue ::= INTEGER (0..39999) -- Location information IE LocationInfo ::= SEQUENCE { refFrame INTEGER (0..65535), -- Reference Frame number -- If refFrame is within (42432..65535), it shall be ignored by the receiver -- in that case the MS should provide GPS TOW if available gpsTOW INTEGER (0..14399999) OPTIONAL, -- GPS TOW fixType FixType, -- Note that applicable range for refFrame is 0 - 42431 -- Possible shapes carried in posEstimate are -- ellipsoid point, -- ellipsoid point with uncertainty circle -- ellipsoid point with uncertainty ellipse -- ellipsoid point with altitude and uncertainty ellipsoid posEstimate Ext-GeographicalInformation } FixType ::= INTEGER { twoDFix (0), threeDFix (1) } (0..1) -- GPS-Measurement information GPS-MeasureInfo ::= SEQUENCE { -- Measurement info elements -- user has to make sure that in this element is number of elements -- defined in reference BTS identity gpsMsrSetList SeqOfGPS-MsrSetElement } SeqOfGPS-MsrSetElement ::= SEQUENCE (SIZE(1..3)) OF GPS-MsrSetElement -- OTD measurent information 1-3 times in message GPS-MsrSetElement ::= SEQUENCE { refFrame INTEGER (0..65535) OPTIONAL, -- Reference Frame number gpsTOW GPSTOW24b, -- GPS TOW -- Note that applicable range for refFrame is 0 - 42431 --N_SAT can be read from number of elements of gps-msrList gps-msrList SeqOfGPS-MsrElement } -- 24 bit presentation for GPSTOW GPSTOW24b ::= INTEGER (0..14399999) -- measured elements in measurement parameters field SeqOfGPS-MsrElement ::= SEQUENCE (SIZE(1..16)) OF GPS-MsrElement GPS-MsrElement ::= SEQUENCE { satelliteID SatelliteID, -- Satellite identifier cNo INTEGER (0..63), -- carrier noise ratio doppler INTEGER (-32768..32767), -- doppler, mulltiply by 0.2 wholeChips INTEGER (0..1022), -- whole value of the code phase measurement fracChips INTEGER (0..1024), -- fractional value of the code phase measurement -- a value of 1024 shall not be encoded by the sender -- the receiver shall consider a value of 1024 to be -- invalid data mpathIndic MpathIndic, -- multipath indicator pseuRangeRMSErr INTEGER (0..63) -- index } -- Multipath indicator MpathIndic ::= ENUMERATED { notMeasured (0), low (1), medium (2), high (3) } -- Location error IE LocationError ::= SEQUENCE { locErrorReason LocErrorReason, additionalAssistanceData AdditionalAssistanceData OPTIONAL, ... } LocErrorReason ::= ENUMERATED { unDefined (0), notEnoughBTSs (1), notEnoughSats (2), eotdLocCalAssDataMissing (3), eotdAssDataMissing (4), gpsLocCalAssDataMissing (5), gpsAssDataMissing (6), methodNotSupported (7), notProcessed (8), refBTSForGPSNotServingBTS (9), refBTSForEOTDNotServingBTS (10), ..., notEnoughGANSSSats (11), ganssAssDataMissing (12), refBTSForGANSSNotServingBTS (13) } -- exception handling: -- an unrecognized value shall be treated the same as value 0 -- defines additional assistance data needed for any new location attempt -- MS shall retain any assistance data already received AdditionalAssistanceData ::= SEQUENCE { gpsAssistanceData GPSAssistanceData OPTIONAL, extensionContainer ExtensionContainer OPTIONAL, ..., ganssAssistanceData GANSSAssistanceData OPTIONAL } GPSAssistanceData ::= OCTET STRING (SIZE (1..maxGPSAssistanceData)) -- GPSAssistanceData has identical structure and encoding to octets 3 to n of the -- GPS Assistance Data IE in 3GPP TS 49.031 maxGPSAssistanceData INTEGER ::= 40 GANSSAssistanceData ::= OCTET STRING (SIZE (1..maxGANSSAssistanceData)) -- GANSSAssistanceData has identical structure and encoding to octets 3 to n of the -- GANSS Assistance Data IE in 3GPP TS 49.031 maxGANSSAssistanceData INTEGER ::= 40 -- Protocol Error Causes ErrorCodes ::= ENUMERATED { unDefined (0), missingComponet (1), incorrectData (2), missingIEorComponentElement (3), messageTooShort (4), unknowReferenceNumber (5), ... } -- exception handling: -- an unrecognized value shall be treated the same as value 0 -- GPS assistance data IE GPS-AssistData ::= SEQUENCE { controlHeader ControlHeader } -- More Assistance Data To Be Sent IE -- More Assistance Data Components On the Way indication for delivery of an entire set of assistance -- data in multiple Assistance Data components. MoreAssDataToBeSent ::= ENUMERATED { noMoreMessages (0), -- This is the only or last Assistance Data message used to deliver -- the entire set of assistance data. moreMessagesOnTheWay (1) -- The SMLC will send more Assistance Data messages or a final RRLP -- Measure Position Request message to deliver the -- the entire set of assistance data. } -- Control header of the GPS assistance data ControlHeader ::= SEQUENCE { -- Field type Present information referenceTime ReferenceTime OPTIONAL, refLocation RefLocation OPTIONAL, dgpsCorrections DGPSCorrections OPTIONAL, navigationModel NavigationModel OPTIONAL, ionosphericModel IonosphericModel OPTIONAL, utcModel UTCModel OPTIONAL, almanac Almanac OPTIONAL, acquisAssist AcquisAssist OPTIONAL, realTimeIntegrity SeqOf-BadSatelliteSet OPTIONAL } ReferenceTime ::= SEQUENCE { gpsTime GPSTime, gsmTime GSMTime OPTIONAL, gpsTowAssist GPSTOWAssist OPTIONAL } -- GPS Time includes week number and time-of-week (TOW) GPSTime ::= SEQUENCE { gpsTOW23b GPSTOW23b, gpsWeek GPSWeek } -- GPSTOW, range 0-604799.92, resolution 0.08 sec, 23-bit presentation GPSTOW23b ::= INTEGER (0..7559999) -- GPS week number GPSWeek ::= INTEGER (0..1023) -- GPSTOWAssist consists of TLM message, Anti-spoof flag, Alert flag, and 2 reserved bits in TLM Word -- for each visible satellite. -- N_SAT can be read from number of elements in GPSTOWAssist GPSTOWAssist ::= SEQUENCE (SIZE(1..12)) OF GPSTOWAssistElement GPSTOWAssistElement ::= SEQUENCE { satelliteID SatelliteID, tlmWord TLMWord, antiSpoof AntiSpoofFlag, alert AlertFlag, tlmRsvdBits TLMReservedBits } -- TLM Word, 14 bits TLMWord ::= INTEGER (0..16383) -- Anti-Spoof flag AntiSpoofFlag ::= INTEGER (0..1) -- Alert flag AlertFlag ::= INTEGER (0..1) -- Reserved bits in TLM word, MSB occurs earlier in TLM Word transmitted by satellite TLMReservedBits ::= INTEGER (0..3) GSMTime ::= SEQUENCE { bcchCarrier BCCHCarrier, -- BCCH carrier bsic BSIC, -- BSIC frameNumber FrameNumber, timeSlot TimeSlot, bitNumber BitNumber } -- Frame number FrameNumber ::= INTEGER (0..2097151) -- Time slot number TimeSlot ::= INTEGER (0..7) -- Bit number BitNumber ::= INTEGER (0..156) -- Reference Location IE RefLocation ::= SEQUENCE { threeDLocation Ext-GeographicalInformation } -- DGPS Corrections IE DGPSCorrections ::= SEQUENCE { gpsTOW INTEGER (0..604799), -- DGPS reference time status INTEGER (0..7), -- N_SAT can be read from number of elements of satList satList SeqOfSatElement } SeqOfSatElement ::= SEQUENCE (SIZE (1..16)) OF SatElement -- number of correction for satellites SatElement ::= SEQUENCE { satelliteID SatelliteID, --- Sequence number for ephemeris iode INTEGER (0..239), -- User Differential Range Error udre INTEGER (0..3), -- Pseudo Range Correction, range is -- -655.04 - +655.04, pseudoRangeCor INTEGER (-2047..2047), -- Pseudo Range Rate Correction, range is -- -4.064 - +4.064, rangeRateCor INTEGER (-127..127), -- Delta Pseudo Range Correction 2 deltaPseudoRangeCor2 INTEGER (-127..127), -- This IE shall be ignored by the receiver and -- set to zero by the sender -- Delta Pseudo Range Correction 2 deltaRangeRateCor2 INTEGER (-7..7), -- This IE shall be ignored by the receiver and -- set to zero by the sender -- Delta Pseudo Range Correction 3 deltaPseudoRangeCor3 INTEGER (-127..127), -- This IE shall be ignored by the receiver and -- set to zero by the sender -- Delta Pseudo Range Correction 3 deltaRangeRateCor3 INTEGER (-7..7) -- This IE shall be ignored by the receiver and -- set to zero by the sender } SatelliteID ::= INTEGER (0..63) -- identifies satellite -- Navigation Model IE NavigationModel ::= SEQUENCE { navModelList SeqOfNavModelElement } -- navigation model satellite list SeqOfNavModelElement ::= SEQUENCE (SIZE(1..16)) OF NavModelElement NavModelElement ::= SEQUENCE { satelliteID SatelliteID, satStatus SatStatus -- satellite status } -- the Status of the navigation model SatStatus ::= CHOICE { -- New satellite, new Navigation Model newSatelliteAndModelUC UncompressedEphemeris, -- Existing satellite, Existing Navigation Model oldSatelliteAndModel NULL, -- Existing satellite, new Navigation Model newNaviModelUC UncompressedEphemeris, ... } -- Uncompressed satellite emhemeris and clock corrections UncompressedEphemeris ::= SEQUENCE { ephemCodeOnL2 INTEGER (0..3), ephemURA INTEGER (0..15), ephemSVhealth INTEGER (0..63), ephemIODC INTEGER (0..1023), ephemL2Pflag INTEGER (0..1), ephemSF1Rsvd EphemerisSubframe1Reserved, ephemTgd INTEGER (-128..127), ephemToc INTEGER (0..37799), ephemAF2 INTEGER (-128..127), ephemAF1 INTEGER (-32768..32767), ephemAF0 INTEGER (-2097152..2097151), ephemCrs INTEGER (-32768..32767), ephemDeltaN INTEGER (-32768..32767), ephemM0 INTEGER (-2147483648..2147483647), ephemCuc INTEGER (-32768..32767), ephemE INTEGER (0..4294967295), ephemCus INTEGER (-32768..32767), ephemAPowerHalf INTEGER (0..4294967295), ephemToe INTEGER (0..37799), ephemFitFlag INTEGER (0..1), ephemAODA INTEGER (0..31), ephemCic INTEGER (-32768..32767), ephemOmegaA0 INTEGER (-2147483648..2147483647), ephemCis INTEGER (-32768..32767), ephemI0 INTEGER (-2147483648..2147483647), ephemCrc INTEGER (-32768..32767), ephemW INTEGER (-2147483648..2147483647), ephemOmegaADot INTEGER (-8388608..8388607), ephemIDot INTEGER (-8192..8191) } -- Reserved bits in subframe 1 of navigation message EphemerisSubframe1Reserved ::= SEQUENCE { reserved1 INTEGER (0..8388607), -- 23-bit field reserved2 INTEGER (0..16777215), -- 24-bit field reserved3 INTEGER (0..16777215), -- 24-bit field reserved4 INTEGER (0..65535) -- 16-bit field } -- Ionospheric Model IE IonosphericModel ::= SEQUENCE { alfa0 INTEGER (-128..127), alfa1 INTEGER (-128..127), alfa2 INTEGER (-128..127), alfa3 INTEGER (-128..127), beta0 INTEGER (-128..127), beta1 INTEGER (-128..127), beta2 INTEGER (-128..127), beta3 INTEGER (-128..127) } -- Universal Time Coordinate Model UTCModel ::= SEQUENCE { utcA1 INTEGER (-8388608..8388607), utcA0 INTEGER (-2147483648..2147483647), utcTot INTEGER (0..255), utcWNt INTEGER (0..255), utcDeltaTls INTEGER (-128..127), utcWNlsf INTEGER (0..255), utcDN INTEGER (-128..127), utcDeltaTlsf INTEGER (-128..127) } -- Almanac, Long term model -- NOTE: These are parameters are subset of the ephemeris -- NOTE: But with reduced resolution and accuracy Almanac ::= SEQUENCE { alamanacWNa INTEGER (0..255), -- Once per message -- navigation model satellite list. -- The size of almanacList is actually Nums_Sats_Total field almanacList SeqOfAlmanacElement } SeqOfAlmanacElement ::= SEQUENCE (SIZE(1..64)) OF AlmanacElement -- Almanac info once per satellite AlmanacElement ::= SEQUENCE { satelliteID SatelliteID, almanacE INTEGER (0..65535), alamanacToa INTEGER (0..255), almanacKsii INTEGER (-32768..32767), almanacOmegaDot INTEGER (-32768..32767), almanacSVhealth INTEGER (0..255), almanacAPowerHalf INTEGER (0..16777215), almanacOmega0 INTEGER (-8388608..8388607), almanacW INTEGER (-8388608..8388607), almanacM0 INTEGER (-8388608..8388607), almanacAF0 INTEGER (-1024..1023), almanacAF1 INTEGER (-1024..1023) } -- Acquisition Assistance AcquisAssist ::= SEQUENCE { -- Number of Satellites can be read from acquistList timeRelation TimeRelation, -- Acquisition assistance list -- The size of Number of Satellites is actually Number of Satellites field acquisList SeqOfAcquisElement } SeqOfAcquisElement ::= SEQUENCE (SIZE(1..16)) OF AcquisElement -- the relationship between GPS time and air-interface timing TimeRelation ::= SEQUENCE { -- gpsTOW GPSTOW23b, -- 23b presentation gsmTime GSMTime OPTIONAL } -- data occuring per number of satellites AcquisElement ::= SEQUENCE { svid SatelliteID, -- Doppler 0th order term, -- -5120.0 - 5117.5 Hz (= -2048 - 2047 with 2.5 Hz resolution) doppler0 INTEGER (-2048..2047), addionalDoppler AddionalDopplerFields OPTIONAL, codePhase INTEGER (0..1022), -- Code Phase intCodePhase INTEGER (0..19), -- Integer Code Phase gpsBitNumber INTEGER (0..3), -- GPS bit number codePhaseSearchWindow INTEGER (0..15), -- Code Phase Search Window addionalAngle AddionalAngleFields OPTIONAL } AddionalDopplerFields ::= SEQUENCE { -- Doppler 1st order term, -1.0 - +0.5 Hz/sec -- (= -42 + (0 to 63) with 1/42 Hz/sec. resolution) doppler1 INTEGER (0..63), dopplerUncertainty INTEGER (0..7) -- a sender shall not encode any DopplerUncertainty value in the range 5 to 7 -- a receiver shall ignore any value between 5 and 7. } AddionalAngleFields ::= SEQUENCE { -- azimuth angle, 0 - 348.75 deg (= 0 - 31 with 11.25 deg resolution) azimuth INTEGER (0..31), -- elevation angle, 0 - 78.75 deg (= 0 - 7 with 11.25 deg resolution) elevation INTEGER (0..7) } -- Real-Time Integrity -- number of bad satellites can be read from this element SeqOf-BadSatelliteSet ::= SEQUENCE (SIZE(1..16)) OF SatelliteID -- Extension Elements -- Release 98 Extensions here Rel98-MsrPosition-Req-Extension ::= SEQUENCE { rel98-Ext-ExpOTD Rel98-Ext-ExpOTD OPTIONAL, -- ExpectedOTD extension ..., gpsTimeAssistanceMeasurementRequest NULL OPTIONAL, gpsReferenceTimeUncertainty GPSReferenceTimeUncertainty OPTIONAL -- Further R98 extensions here } Rel98-AssistanceData-Extension ::= SEQUENCE { rel98-Ext-ExpOTD Rel98-Ext-ExpOTD OPTIONAL, -- ExpectedOTD extension ..., gpsTimeAssistanceMeasurementRequest NULL OPTIONAL, gpsReferenceTimeUncertainty GPSReferenceTimeUncertainty OPTIONAL -- Further R98 extensions here } -- Release 98 ExpOTD extension Rel98-Ext-ExpOTD ::= SEQUENCE { -- If MsrAssistBTS is included in message, msrAssistData-R98-ExpOTD shall be included. msrAssistData-R98-ExpOTD MsrAssistData-R98-ExpOTD OPTIONAL, -- If SystemInfoAssistaData is included in message, systemInfoAssistData-R98-ExpOTD shall be -- included. systemInfoAssistData-R98-ExpOTD SystemInfoAssistData-R98-ExpOTD OPTIONAL } -- MsrAssistData R98 extension MsrAssistData-R98-ExpOTD ::= SEQUENCE { msrAssistList-R98-ExpOTD SeqOfMsrAssistBTS-R98-ExpOTD } -- Indexes in SeqOfMsrAssistBTS-R98-ExpOTD refer to SeqOfMsrAssistBTS -- If the index exceeds the SegOfMsrAssistBTS range or if there is other -- inconsistencies between the BTS indices, the MS shall apply protocol -- error cause incorrectData SeqOfMsrAssistBTS-R98-ExpOTD ::= SEQUENCE (SIZE(1..15)) OF MsrAssistBTS-R98-ExpOTD -- This element completes MsrAssistBTS IE MsrAssistBTS-R98-ExpOTD ::= SEQUENCE { expectedOTD ExpectedOTD, expOTDUncertainty ExpOTDUncertainty } -- SystemInfoAssistData R98 extension SystemInfoAssistData-R98-ExpOTD ::= SEQUENCE { systemInfoAssistListR98-ExpOTD SeqOfSystemInfoAssistBTS-R98-ExpOTD } -- SeqOfSystemInfoAssistBTS-R98-ExpOTD index refer to SeqOfSystemInfoAssistBTS -- If the index exceeds the SegOfSystemInfoAssistBTS range or if there is other -- inconsistencies between the BTS indices, the MS shall apply protocol -- error cause incorrectData SeqOfSystemInfoAssistBTS-R98-ExpOTD ::= SEQUENCE (SIZE(1..32)) OF SystemInfoAssistBTS-R98-ExpOTD -- whether n.th is present or not ? SystemInfoAssistBTS-R98-ExpOTD ::= CHOICE { notPresent NULL, present AssistBTSData-R98-ExpOTD } -- This element completes AssistBTSData IE AssistBTSData-R98-ExpOTD ::= SEQUENCE { expectedOTD ExpectedOTD, expOTDuncertainty ExpOTDUncertainty -- Uncertainty of expected OTD } -- Expected OTD value between nbor base station and reference BTS -- at MS's current estimated location. ExpectedOTD ::= INTEGER (0..1250) -- The ExpectedOTD value 1250 shall not be encoded by the transmitting entity and -- shall be treated by the receiving entity as 0. -- Uncertainty of Exptected OTD in bits ExpOTDUncertainty ::= INTEGER(0..7) -- Release 98 extensions GPSReferenceTimeUncertainty ::= INTEGER (0 .. 127) -- Coding according to Annex GPSTimeAssistanceMeasurements ::= SEQUENCE { referenceFrameMSB INTEGER (0 .. 63), -- MSB of frame number gpsTowSubms INTEGER (0 .. 9999) OPTIONAL, -- in units of 100ns, for MS based AGPS deltaTow INTEGER (0 .. 127) OPTIONAL, -- for MS assisted AGPS gpsReferenceTimeUncertainty GPSReferenceTimeUncertainty OPTIONAL } Rel-98-MsrPosition-Rsp-Extension ::= SEQUENCE { -- First extension to Release 98 rel-98-Ext-MeasureInfo SEQUENCE { otd-MeasureInfo-R98-Ext OTD-MeasureInfo-R98-Ext OPTIONAL }, ..., timeAssistanceMeasurements GPSTimeAssistanceMeasurements OPTIONAL -- Further R98 extensions here } -- This is an addition to OTD-MeasureInfo element defined in original message, -- If OTD-MeasureInfo is absent, or if one or more OTD-MsrElementRest are present -- OTD-MeasureInfo-R98-Ext shall be absent. -- OTD-MeasureInfo-R98-Ext OTD-MeasureInfo-R98-Ext ::= SEQUENCE { -- Measurement info elements otdMsrFirstSets-R98-Ext OTD-MsrElementFirst-R98-Ext } -- OTD measurement information Ext for the first set only OTD-MsrElementFirst-R98-Ext ::= SEQUENCE { -- additional measured neighbors in OTD measurements otd-FirstSetMsrs-R98-Ext SeqOfOTD-FirstSetMsrs-R98-Ext OPTIONAL } SeqOfOTD-FirstSetMsrs-R98-Ext ::= SEQUENCE (SIZE(1..5)) OF OTD-FirstSetMsrs Rel-5-MsrPosition-Rsp-Extension ::= SEQUENCE { extended-reference Extended-reference OPTIONAL, -- The extended-reference shall be included by the MS if and only if previously -- received from the SMLC in a Measure Position Request. When included, the value sent -- by the MS shall equal the value received from the SMLC. -- extension to Release 5, for RRLP pseudo-segmentation here otd-MeasureInfo-5-Ext OTD-MeasureInfo-5-Ext OPTIONAL, ulPseudoSegInd UlPseudoSegInd OPTIONAL, -- Included when uplink RRLP -- Pseudo-segmentation is used, not included when no uplink pseudo-segmentation is used ... -- Possibly more extensions for Release 5 here later } Extended-reference ::= SEQUENCE { smlc-code INTEGER (0..63), transaction-ID INTEGER (0..262143) } OTD-MeasureInfo-5-Ext ::= SeqOfOTD-MsrElementRest -- if more than one measurement sets are present this element is repeated -- NumberOfSets - 1 (-1 = first set) combined in OTD-MeasureInfo-5-Ext and -- OTD-MeasureInfo (e.g. if NumberOfSets is 3, then one otdMsrRestSets may -- be sent in OTD-MeasureInfo-5-Ext and one in OTD-MeasureInfo) -- First part of Uplink RRLP Pseudo-segmentation indication, possibly more may be defined -- in the future for segmentation with more than two segments. UlPseudoSegInd ::= ENUMERATED { firstOfMany (0), secondOfMany(1) } Rel5-MsrPosition-Req-Extension ::= SEQUENCE { extended-reference Extended-reference, ... -- Possibly more extensions for Release 5 here later } Rel5-AssistanceData-Extension ::= SEQUENCE { extended-reference Extended-reference, ... -- Possibly more extensions for Release 5 here later } Rel-5-ProtocolError-Extension::= SEQUENCE { extended-reference Extended-reference OPTIONAL, -- The extended-reference shall be included by the MS if and only if previously -- received from the SMLC. -- When included, the value sent by the MS shall equal the value received from the SMLC. ... -- Possibly more extensions for Release 5 here later } -- Release 7 Extensions here Rel7-MsrPosition-Req-Extension ::= SEQUENCE { velocityRequested NULL OPTIONAL, ganssPositionMethod GANSSPositioningMethod OPTIONAL, ganss-AssistData GANSS-AssistData OPTIONAL, ganssCarrierPhaseMeasurementRequest NULL OPTIONAL, ganssTODGSMTimeAssociationMeasurementRequest NULL OPTIONAL, requiredResponseTime RequiredResponseTime OPTIONAL, ... -- Further Release 7 extentions here } -- additional satellite systems may be added in future versions of the protocol GANSSPositioningMethod ::= BIT STRING { gps (0), galileo (1)} (SIZE (2..16)) GANSS-AssistData ::= SEQUENCE { ganss-controlHeader GANSS-ControlHeader } GANSS-ControlHeader ::= SEQUENCE { ganssCommonAssistData GANSSCommonAssistData OPTIONAL, ganssGenericAssistDataList SeqOfGANSSGenericAssistDataElement OPTIONAL } -- GANSS Common Assistance Data Elements GANSSCommonAssistData ::= SEQUENCE { ganssReferenceTime GANSSReferenceTime OPTIONAL, ganssRefLocation GANSSRefLocation OPTIONAL, ganssIonosphericModel GANSSIonosphericModel OPTIONAL, ... } -- List of GANSS Generic Assistance Data Elements, up to 8 GANSS SeqOfGANSSGenericAssistDataElement ::= SEQUENCE (SIZE (1..8)) OF GANSSGenericAssistDataElement -- GANSS Generic Assistance Data Elements GANSSGenericAssistDataElement ::= SEQUENCE { ganssID INTEGER (0..7) OPTIONAL, -- Coding according to Annex ganssTimeModel SeqOfGANSSTimeModel OPTIONAL, ganssDiffCorrections GANSSDiffCorrections OPTIONAL, ganssNavigationModel GANSSNavModel OPTIONAL, ganssRealTimeIntegrity GANSSRealTimeIntegrity OPTIONAL, ganssDataBitAssist GANSSDataBitAssist OPTIONAL, ganssRefMeasurementAssist GANSSRefMeasurementAssist OPTIONAL, ganssAlmanacModel GANSSAlmanacModel OPTIONAL, ganssUTCModel GANSSUTCModel OPTIONAL, ... } -- GANSS COMMON ASSISTANCE DATA ELEMENTS -- GANSS Reference Time IE GANSSReferenceTime ::= SEQUENCE { ganssRefTimeInfo GANSSRefTimeInfo, ganssTOD-GSMTimeAssociation GANSSTOD-GSMTimeAssociation OPTIONAL } -- GANSS Reference Time includes GANSS TOD, GANSS Day, uncertainty GANSSRefTimeInfo ::= SEQUENCE { ganssDay INTEGER(0 .. 8191) OPTIONAL, ganssTOD GANSSTOD, ganssTODUncertainty GANSSTODUncertainty OPTIONAL, ganssTimeID INTEGER (0 .. 7) OPTIONAL } -- GANSS TOD integer seconds GANSSTOD ::= INTEGER (0 .. 86399) -- GANSS TOD uncertainty GANSSTODUncertainty ::= INTEGER (0 .. 127) -- Coding according to Annex -- GANSS TOD-GSM Time association GANSSTOD-GSMTimeAssociation ::= SEQUENCE { bcchCarrier BCCHCarrier, -- BCCH carrier bsic BSIC, -- BSIC frameNumber FrameNumber, timeSlot TimeSlot, bitNumber BitNumber, frameDrift FrameDrift OPTIONAL } -- Frame drift FrameDrift ::= INTEGER(-64 .. 63) -- GANSS Reference Location IE GANSSRefLocation ::= SEQUENCE { threeDLocation Ext-GeographicalInformation } -- GANSS Ionospheric Model IE -- GANSS Ionospheric Model consists of NeQuick model parameters and storm flags GANSSIonosphericModel ::= SEQUENCE { ganssIonoModel GANSSIonosphereModel, ganssIonoStormFlags GANSSIonoStormFlags OPTIONAL, ... } -- GANSS ionosphere model. Coding according to Annex GANSSIonosphereModel ::= SEQUENCE { ai0 INTEGER (0 .. 4095), ai1 INTEGER (0 .. 4095), ai2 INTEGER (0 .. 4095) } -- GANSS ionosphere storm flags GANSSIonoStormFlags ::= SEQUENCE { ionoStormFlag1 INTEGER (0 .. 1), ionoStormFlag2 INTEGER (0 .. 1), ionoStormFlag3 INTEGER (0 .. 1), ionoStormFlag4 INTEGER (0 .. 1), ionoStormFlag5 INTEGER (0 .. 1) } -- GANSS GENERIC ASSISTANCE DATA ELEMENTS -- GANSS Time Model IE consists of time offset and first and second order parameters to relate GNSS -- specific system time to selected time reference -- SeqOf GANSSTimeModel ::= SEQUENCE (SIZE(1..7)) OF GANSSTimeModelElement SeqOfGANSSTimeModel ::= SEQUENCE (SIZE(1..7)) OF GANSSTimeModelElement GANSSTimeModelElement ::= SEQUENCE { ganssTimeModelRefTime INTEGER(0 .. 65535), tA0 TA0, tA1 TA1 OPTIONAL, tA2 TA2 OPTIONAL, gnssTOID INTEGER (0 .. 7), weekNumber INTEGER (0 .. 8191) OPTIONAL } -- GANSS time model parameter A0 TA0 ::= INTEGER (-2147483648 .. 2147483647) -- GANSS time model parameter A1 TA1 ::= INTEGER (-8388608 .. 8388607) -- GANSS time model parameter A2 TA2 ::= INTEGER (-64 .. 63) -- DGANSS Corrections IE GANSSDiffCorrections ::= SEQUENCE { dganssRefTime INTEGER (0 .. 119), -- DGANSS reference time -- N_SGN_TYPE can be read from number of elements of sgnTypeList sgnTypeList SeqOfSgnTypeElement } SeqOfSgnTypeElement ::= SEQUENCE (SIZE (1..3)) OF SgnTypeElement -- max three signals per GNSS -- DGANSS signal type element, once per GNSS signal type included in DGANSS SgnTypeElement ::= SEQUENCE { ganssSignalID GANSSSignalID OPTIONAL, -- signal type identity ganssStatusHealth INTEGER (0 .. 7), -- N_SGN can be read from number of elements of dganssSgnList dganssSgnList SeqOfDGANSSSgnElement } GANSSSignalID ::= INTEGER (0 .. 3) -- Coding according to Annex SeqOfDGANSSSgnElement ::= SEQUENCE (SIZE (1..16)) OF DGANSSSgnElement -- number of correction for signals DGANSSSgnElement ::= SEQUENCE { svID SVID, -- Satellite identity --- Sequence number for GANSS Navigation Model that matches the DGANSS correction set iod INTEGER (0 .. 1023), -- User Differential Range Error udre INTEGER (0..3), -- Pseudo Range Correction, range is -- -655.04 - +655.04, pseudoRangeCor INTEGER (-2047..2047), -- Pseudo Range Rate Correction, range is -- -4.064 - +4.064, rangeRateCor INTEGER (-127..127) } SVID ::= INTEGER (0 .. 63) -- Coding according to Annex -- GANSS Navigation Model IE GANSSNavModel ::= SEQUENCE { nonBroadcastIndFlag INTEGER (0 .. 1), toeMSB INTEGER (0 .. 31) OPTIONAL, -- 5 MSB of toe and toc eMSB INTEGER (0 .. 127) OPTIONAL, sqrtAMBS INTEGER (0 .. 63) OPTIONAL, ganssSatelliteList SeqOfGANSSSatelliteElement } SeqOfGANSSSatelliteElement ::= SEQUENCE (SIZE(1..32)) OF GANSSSatelliteElement GANSSSatelliteElement ::= SEQUENCE { svID SVID, svHealth INTEGER (-7 .. 13), -- Coding according to Annex iod INTEGER (0 .. 1023), -- Coding according to Annex ganssClockModel GANSSClockModel, ganssOrbitModel GANSSOrbitModel, ... } -- GANSS orbit model for the GNSS satellite according to the choice GANSSOrbitModel ::= CHOICE { keplerianSet NavModel-KeplerianSet, ... } -- Navigation model in Keplerian parameters NavModel-KeplerianSet ::= SEQUENCE { keplerToeLSB INTEGER (0 .. 511), -- 9LSB are given in GANSSNavigationModel keplerW INTEGER (-2147483648..2147483647), keplerDeltaN INTEGER (-32768..32767), keplerM0 INTEGER (-2147483648..2147483647), keplerOmegaDot INTEGER (-8388608..8388607), keplerELSB INTEGER (0..33554431), keplerIDot INTEGER (-8192..8191), keplerAPowerHalfLSB INTEGER (0.. 67108863), keplerI0 INTEGER (-2147483648..2147483647), keplerOmega0 INTEGER (-2147483648..2147483647), keplerCrs INTEGER (-32768..32767), keplerCis INTEGER (-32768..32767), keplerCus INTEGER (-32768..32767), keplerCrc INTEGER (-32768..32767), keplerCic INTEGER (-32768..32767), keplerCuc INTEGER (-32768..32767) } -- GANSS clock model for the GNSS satellite according to the choice GANSSClockModel ::= CHOICE { standardClockModelList SeqOfStandardClockModelElement, ... } SeqOfStandardClockModelElement ::= SEQUENCE (SIZE(1..2)) OF StandardClockModelElement StandardClockModelElement ::= SEQUENCE { stanClockTocLSB INTEGER (0 .. 511), -- 9LSB of time of clock stanClockAF2 INTEGER (-2048 .. 2047), stanClockAF1 INTEGER (-131072 .. 131071), stanClockAF0 INTEGER (-134217728 .. 134217727), stanClockTgd INTEGER (-512 .. 511) OPTIONAL, stanModelID INTEGER (0 .. 1) OPTIONAL, ... } -- GANSS Real-Time Integrity IE GANSSRealTimeIntegrity ::= SEQUENCE { -- list of bad signals -- NBS can be read from number of elements in SeqOf-BadSignalSet ganssBadSignalList SeqOfBadSignalElement } SeqOfBadSignalElement ::= SEQUENCE (SIZE(1..16)) OF BadSignalElement BadSignalElement ::= SEQUENCE { badSVID SVID, -- Coding according to Annex badSignalID INTEGER (0 .. 3) OPTIONAL -- Coding according to Annex } -- GANSS Data Bit Assistance IE GANSSDataBitAssist ::= SEQUENCE { ganssTOD INTEGER (0 .. 59), svID SVID, ganssDataTypeID INTEGER (0 .. 2), -- Coding according to Annex -- list of navigation data bits -- N_BIT can be read from number of elements in SeqOf-DataBits ganssDataBits SeqOf-GANSSDataBits } SeqOf-GANSSDataBits ::= SEQUENCE (SIZE(1 .. 1024)) OF GANSSDataBit GANSSDataBit ::= INTEGER(0 .. 1) -- GANSS Reference Measurement Assistance IE -- Code and Doppler assistance from the network. GANSSRefMeasurementAssist ::= SEQUENCE { ganssSignalID INTEGER (0 .. 3) OPTIONAL, -- Coding according to Annex ganssRefMeasAssitList SeqOfGANSSRefMeasurementElement } SeqOfGANSSRefMeasurementElement ::= SEQUENCE (SIZE(1 .. 16)) OF GANSSRefMeasurementElement GANSSRefMeasurementElement ::= SEQUENCE { svID SVID, -- Doppler 0th order term, -- -1024 m/s to 1023.5 m/s with 0.5 m/s resolution) doppler0 INTEGER (-2048 .. 2047), -- Coding according to Annex additionalDoppler AdditionalDopplerFields OPTIONAL, codePhase INTEGER (0 .. 1022), -- Code Phase in ms intCodePhase INTEGER (0 .. 127), -- Integer Code Phase in ms codePhaseSearchWindow INTEGER (0 .. 31), -- Code Phase Search Window, see Annex additionalAngle AddionalAngleFields OPTIONAL, ... } AdditionalDopplerFields ::= SEQUENCE { -- Doppler 1st order term, -0.2 - +0.1 m/s2 doppler1 INTEGER (0..63), dopplerUncertainty INTEGER (0..4) } -- GANSS Almanac Model IE GANSSAlmanacModel ::= SEQUENCE { weekNumber INTEGER (0 .. 255), svIDMask SVIDMASK, toa INTEGER (0 .. 255) OPTIONAL, ioda INTEGER (0 .. 3) OPTIONAL, ganssAlmanacList SeqOfGANSSAlmanacElement } -- SV ID Mask, LSB for ID 1 and MSB for ID 36 SVIDMASK ::= BIT STRING (SIZE (1..36)) SeqOfGANSSAlmanacElement ::= SEQUENCE (SIZE(1 .. 36)) OF GANSSAlmanacElement -- GANSS Almanac Model GANSSAlmanacElement ::= CHOICE { keplerianAlmanacSet Almanac-KeplerianSet, ... } -- Almanac parameters according to Keplerian parameters Almanac-KeplerianSet ::= SEQUENCE { kepAlmanacE INTEGER (0 .. 2047), kepAlmanacDeltaI INTEGER (-1024 .. 1023), kepAlmanacOmegaDot INTEGER (-1024 .. 1023), kepSVHealth INTEGER (0 .. 15), -- Coding according to Annex kepAlmanacAPowerHalf INTEGER (-65536 .. 65535), kepAlmanacOmega0 INTEGER (-32768 .. 32767), kepAlmanacW INTEGER (-32768 .. 32767), kepAlmanacM0 INTEGER (-32768 .. 32767), kepAlmanacAF0 INTEGER (-8192 .. 8191), kepAlmanacAF1 INTEGER (-1024..1023) } -- GANSS Universal Time Coordinate Model GANSSUTCModel ::= SEQUENCE { ganssUtcA1 INTEGER (-8388608..8388607), ganssUtcA0 INTEGER (-2147483648..2147483647), ganssUtcTot INTEGER (0..255), ganssUtcWNt INTEGER (0..255), ganssUtcDeltaTls INTEGER (-128..127), ganssUtcWNlsf INTEGER (0..255), ganssUtcDN INTEGER (-128..127), ganssUtcDeltaTlsf INTEGER (-128..127) } --Required Measurement Request Response Time, range is 1 to 128 seconds. RequiredResponseTime ::= INTEGER (1..128) Rel-7-MsrPosition-Rsp-Extension ::= SEQUENCE { velEstimate VelocityEstimate OPTIONAL, -- Horizontal Velocity -- Horizontal with Vertical Velocity -- Horizontal Velocity with Uncertainty -- Horizontal with Vertical Velocity and Uncertainty ganssLocationInfo GANSSLocationInfo OPTIONAL, ganssMeasureInfo GANSSMeasureInfo OPTIONAL, ... -- Further Release 7 extensions here } -- GANSS Location Information contains location estimate, time stamp with uncertainty -- and optionally Reference Frame field GANSSLocationInfo ::= SEQUENCE { referenceFrame ReferenceFrame OPTIONAL, -- Reference Frame Number ganssTODm GANSSTODm OPTIONAL, -- GNSS TOD modulo ganssTODFrac INTEGER (0 .. 16384) OPTIONAL, -- Coding according to Annex ganssTODUncertainty GANSSTODUncertainty OPTIONAL, -- Coding according to Annex ganssTimeID INTEGER (0 .. 3) OPTIONAL, -- Coding according to Annex fixType FixType, posData PositionData, stationaryIndication INTEGER(0 .. 1) OPTIONAL, -- ‘0’ if moving or motion not known -- Possible shapes carried in posEstimate are -- ellipsoid point, -- ellipsoid point with uncertainty circle -- ellipsoid point with uncertainty ellipse -- ellipsoid point with altitude and uncertainty ellipsoid posEstimate Ext-GeographicalInformation, ... } PositionData ::= BIT STRING { e-otd(0), gps (1), galileo (2) } (SIZE (3..16)) -- GANSS TOD modulo 1 hour GANSSTODm ::= INTEGER (0 .. 3599999) ReferenceFrame ::= SEQUENCE { referenceFN INTEGER (0 .. 65535), -- Note that applicable range for referenceFN is 0 - 42431 referenceFNMSB INTEGER (0 .. 63) OPTIONAL -- MSB of Reference Frame Number } -- GANSS Measurement Information GANSSMeasureInfo ::= SEQUENCE { -- Measurement info elements -- user has to make sure that in this element is number of elements -- defined in reference BTS identity ganssMsrSetList SeqOfGANSS-MsrSetElement } SeqOfGANSS-MsrSetElement ::= SEQUENCE (SIZE(1..3)) OF GANSS-MsrSetElement -- GANSS measurement information 1-3 times in a message GANSS-MsrSetElement ::= SEQUENCE { referenceFrame ReferenceFrame OPTIONAL, -- Reference Frame Number ganssTODm GANSSTODm OPTIONAL, -- GANSS TOD modulo deltaGNASSTOD INTEGER (0 .. 127) OPTIONAL, ganssTODUncertainty GANSSTODUncertainty OPTIONAL, -- Coding accoring to Annex --N_SGN_TYPE can be read from number of elements of SeqOfGANSS-SgnTypeElement ganss-SgnTypeList SeqOfGANSS-SgnTypeElement } -- Measurements can be returned up to 6 different signal types SeqOfGANSS-SgnTypeElement ::= SEQUENCE (SIZE(1..6)) OF GANSS-SgnTypeElement GANSS-SgnTypeElement ::= SEQUENCE { ganssSignalID INTEGER (0 .. 15), -- Coding accroding to Annex --N_SGN can be read from number of elements of SeqOfGANSS-SgnElement ganss-SgnList SeqOfGANSS-SgnElement } -- Measurements can be returned up to 16 per signal types SeqOfGANSS-SgnElement ::= SEQUENCE (SIZE(1..16)) OF GANSS-SgnElement GANSS-SgnElement ::= SEQUENCE { svID SVID, cNo INTEGER (0 .. 63), mpathDet MpathIndic, -- Coding according to Annex carrierQualityInd INTEGER (0 .. 3) OPTIONAL, -- Coding according to Annex codePhase INTEGER (0 .. 2097151), integerCodePhase INTEGER (0 .. 63) OPTIONAL, codePhaseRMSError INTEGER (0..63), -- Coding accoring to Annex doppler INTEGER (-32768 .. 32767) OPTIONAL, adr INTEGER (0 .. 33554431) OPTIONAL } Rel7-AssistanceData-Extension ::= SEQUENCE { ganss-AssistData GANSS-AssistData OPTIONAL, ganssCarrierPhaseMeasurementRequest NULL OPTIONAL, ganssTODGSMTimeAssociationMeasurementRequest NULL OPTIONAL, ... -- Possibly more extensions for Release 7 here } Ext-GeographicalInformation ::= OCTET STRING (SIZE (1..maxExt-GeographicalInformation)) maxExt-GeographicalInformation INTEGER ::= 20 END gnss-sdr-0.0.9/src/core/libs/supl/asn/rrlp-messages.asn000066400000000000000000000007471305042567700230040ustar00rootroot00000000000000RRLP-Messages -- { RRLP-messages } DEFINITIONS AUTOMATIC TAGS ::= BEGIN IMPORTS MsrPosition-Req, MsrPosition-Rsp, AssistanceData, ProtocolError FROM RRLP-Components -- { RRLP-Components } ; PDU ::= SEQUENCE { referenceNumber INTEGER (0..7), component RRLP-Component } RRLP-Component ::= CHOICE { msrPositionReq MsrPosition-Req, msrPositionRsp MsrPosition-Rsp, assistanceData AssistanceData, assistanceDataAck NULL, protocolError ProtocolError, ... } END gnss-sdr-0.0.9/src/core/libs/supl/asn/supl-common.asn000066400000000000000000000223241305042567700224640ustar00rootroot00000000000000ULP-Components DEFINITIONS AUTOMATIC TAGS ::= BEGIN EXPORTS Version, SessionID, IPAddress, SLPAddress, LocationId, Position, StatusCode, Velocity, QoP, PosMethod, Ver; -- protocol version expressed as x.y.z (e.g., 5.1.0) Version ::= SEQUENCE { maj INTEGER(0..255), min INTEGER(0..255), servind INTEGER(0..255)} SessionID ::= SEQUENCE { setSessionID SetSessionID OPTIONAL, -- the semantics of OPTIONAL applies to the encoding only. The parameter itself is MANDATORY. This is introduced only to minimize bandwidth for the SUPL INIT message. Since the setSessionID is allocated by the SET, there is no setSessionID to be transmitted in the SUPL INIT message. slpSessionID SlpSessionID OPTIONAL -- the semantics of OPTIONAL applies to the encoding only. The parameter itself is MANDATORY. This is introduced only to minimize bandwidth for the SUPL START message. Since the slpSessionID is allocated by the SLP, there is no slpSessionID to be transmitted in the SUPL START message.--} SetSessionID ::= SEQUENCE {sessionId INTEGER(0..65535), setId SETId} SETId ::= CHOICE { msisdn OCTET STRING(SIZE (8)), mdn OCTET STRING(SIZE (8)), min BIT STRING(SIZE (34)), -- coded according to TIA-553 imsi OCTET STRING(SIZE (8)), nai IA5String(SIZE (1..1000)), iPAddress IPAddress, ...} -- msisdn, mdn and imsi are a BCD (Binary Coded Decimal) string -- represent digits from 0 through 9, -- two digits per octet, each digit encoded 0000 to 1001 (0 to 9) -- bits 8765 of octet n encoding digit 2n -- bits 4321 of octet n encoding digit 2(n-1) +1 -- not used digits in the string shall be filled with 1111 SlpSessionID ::= SEQUENCE { sessionID OCTET STRING(SIZE (4)), slpId SLPAddress} IPAddress ::= CHOICE { ipv4Address OCTET STRING(SIZE (4)), ipv6Address OCTET STRING(SIZE (16))} SLPAddress ::= CHOICE {iPAddress IPAddress, fQDN FQDN, ...} FQDN ::= VisibleString(FROM ("a".."z" | "A".."Z" | "0".."9" | ".-"))(SIZE (1..255)) Ver ::= BIT STRING(SIZE (64)) LocationId ::= SEQUENCE {cellInfo CellInfo, status Status, ...} Status ::= ENUMERATED {stale(0), current(1), unknown(2), ... } CellInfo ::= CHOICE { gsmCell GsmCellInformation, wcdmaCell WcdmaCellInformation, cdmaCell CdmaCellInformation, ...} Position ::= SEQUENCE { timestamp UTCTime, -- shall include seconds and shall use UTC time. positionEstimate PositionEstimate, velocity Velocity OPTIONAL, ...} PositionEstimate ::= SEQUENCE { latitudeSign ENUMERATED {north, south}, latitude INTEGER(0..8388607), longitude INTEGER(-8388608..8388607), uncertainty SEQUENCE {uncertaintySemiMajor INTEGER(0..127), uncertaintySemiMinor INTEGER(0..127), orientationMajorAxis INTEGER(0..180)} OPTIONAL, -- angle in degree between major axis and North confidence INTEGER(0..100) OPTIONAL, altitudeInfo AltitudeInfo OPTIONAL, ...} AltitudeInfo ::= SEQUENCE { altitudeDirection ENUMERATED {height, depth}, altitude INTEGER(0..32767), altUncertainty INTEGER(0..127), ...} -- based on 3GPP TS 23.032 CdmaCellInformation ::= SEQUENCE { refNID INTEGER(0..65535), -- Network Id refSID INTEGER(0..32767), -- System Id refBASEID INTEGER(0..65535), -- Base Station Id refBASELAT INTEGER(0..4194303), -- Base Station Latitude reBASELONG INTEGER(0..8388607), -- Base Station Longitude refREFPN INTEGER(0..511), -- Base Station PN Code refWeekNumber INTEGER(0..65535), -- GPS Week Number refSeconds INTEGER(0..4194303)-- GPS Seconds -- , ...} GsmCellInformation ::= SEQUENCE { refMCC INTEGER(0..999), -- Mobile Country Code refMNC INTEGER(0..999), -- Mobile Network Code refLAC INTEGER(0..65535), -- Location area code refCI INTEGER(0..65535), -- Cell identity nMR NMR OPTIONAL, tA INTEGER(0..255) OPTIONAL, --Timing Advance ...} WcdmaCellInformation ::= SEQUENCE { refMCC INTEGER(0..999), -- Mobile Country Code refMNC INTEGER(0..999), -- Mobile Network Code refUC INTEGER(0..268435455), -- Cell identity frequencyInfo FrequencyInfo OPTIONAL, primaryScramblingCode INTEGER(0..511) OPTIONAL, measuredResultsList MeasuredResultsList OPTIONAL, ...} FrequencyInfo ::= SEQUENCE { -- after asn1c gcc chokes with this being same as in CellMeasuredResults fmodeSpecificInfo CHOICE {fdd FrequencyInfoFDD, tdd FrequencyInfoTDD, ...}, ...} FrequencyInfoFDD ::= SEQUENCE { uarfcn-UL UARFCN OPTIONAL, uarfcn-DL UARFCN, ...} FrequencyInfoTDD ::= SEQUENCE {uarfcn-Nt UARFCN, ...} UARFCN ::= INTEGER(0..16383) NMR ::= SEQUENCE (SIZE (1..15)) OF NMRelement NMRelement ::= SEQUENCE { aRFCN INTEGER(0..1023), bSIC INTEGER(0..63), rxLev INTEGER(0..63), ...} MeasuredResultsList ::= SEQUENCE (SIZE (1..maxFreq)) OF MeasuredResults MeasuredResults ::= SEQUENCE { frequencyInfo FrequencyInfo OPTIONAL, utra-CarrierRSSI UTRA-CarrierRSSI OPTIONAL, cellMeasuredResultsList CellMeasuredResultsList OPTIONAL} CellMeasuredResultsList ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CellMeasuredResults -- SPARE: UTRA-CarrierRSSI, Max = 76 -- Values above Max are spare UTRA-CarrierRSSI ::= INTEGER(0..127) CellMeasuredResults ::= SEQUENCE { cellIdentity INTEGER(0..268435455) OPTIONAL, modeSpecificInfo CHOICE {fdd SEQUENCE {primaryCPICH-Info PrimaryCPICH-Info, cpich-Ec-N0 CPICH-Ec-N0 OPTIONAL, cpich-RSCP CPICH-RSCP OPTIONAL, pathloss Pathloss OPTIONAL}, tdd SEQUENCE {cellParametersID CellParametersID, proposedTGSN TGSN OPTIONAL, primaryCCPCH-RSCP PrimaryCCPCH-RSCP OPTIONAL, pathloss Pathloss OPTIONAL, timeslotISCP-List TimeslotISCP-List OPTIONAL}}} CellParametersID ::= INTEGER(0..127) TGSN ::= INTEGER(0..14) PrimaryCCPCH-RSCP ::= INTEGER(0..127) -- SPARE: TimeslotISCP, Max = 91 -- Values above Max are spare TimeslotISCP ::= INTEGER(0..127) TimeslotISCP-List ::= SEQUENCE (SIZE (1..maxTS)) OF TimeslotISCP PrimaryCPICH-Info ::= SEQUENCE {primaryScramblingCode INTEGER(0..511)} -- SPARE: CPICH-Ec-No, Max = 49 -- Values above Max are spare CPICH-Ec-N0 ::= INTEGER(0..63) -- SPARE: CPICH- RSCP, data range from 0 to 91 and from 123 to 127. -- Values from 92 to 122 are spare -- the encoding of cpich-RSCP is (as per 25.331 V5.11.0) -- cpich-RSCP = 123 CPICH RSCP <-120 dBm -- cpich-RSCP = 124 CPICH RSCP < -119 dBm -- cpich-RSCP = 125 CPICH RSCP < -118 dBm -- cpich-RSCP = 126 CPICH RSCP < -117 dBm -- cpich-RSCP = 127 CPICH RSCP < -116 dBm -- cpich-RSCP = 0 CPICH RSCP < -115 dBm -- cpich-RSCP = 1 CPICH -- cpich-RSCP = 89 CPICH RSCP < -26 dBm -- cpich-RSCP = 90 CPICH RSCP < -25 dBm -- cpich-RSCP = 91 CPICH RSCP dBm CPICH-RSCP ::= INTEGER(0..127) -- SPARE: Pathloss, Max = 158 -- Values above Max are spare Pathloss ::= INTEGER(46..173) maxCellMeas INTEGER ::= 32 maxFreq INTEGER ::= 8 maxTS INTEGER ::= 14 QoP ::= SEQUENCE { horacc INTEGER(0..127), veracc INTEGER(0..127) OPTIONAL, -- as defined in 3GPP TS uncertainty.23 maxLocAge INTEGER(0..65535) OPTIONAL, delay INTEGER(0..7) OPTIONAL, -- as defined in 3GPP TS 44.031 ...} Velocity ::= CHOICE { -- velocity definition as per 23.032 horvel Horvel, horandvervel Horandvervel, horveluncert Horveluncert, horandveruncert Horandveruncert, ...} Horvel ::= SEQUENCE { bearing BIT STRING(SIZE (9)), horspeed BIT STRING(SIZE (16)), ...} Horandvervel ::= SEQUENCE { verdirect BIT STRING(SIZE (1)), bearing BIT STRING(SIZE (9)), horspeed BIT STRING(SIZE (16)), verspeed BIT STRING(SIZE (8)), ...} Horveluncert ::= SEQUENCE { bearing BIT STRING(SIZE (9)), horspeed BIT STRING(SIZE (16)), uncertspeed BIT STRING(SIZE (8)), ...} Horandveruncert ::= SEQUENCE { verdirect BIT STRING(SIZE (1)), bearing BIT STRING(SIZE (9)), horspeed BIT STRING(SIZE (16)), verspeed BIT STRING(SIZE (8)), horuncertspeed BIT STRING(SIZE (8)), veruncertspeed BIT STRING(SIZE (8)), ...} StatusCode ::= ENUMERATED { unspecified(0), systemFailure(1), unexpectedMessage(2), protocolError(3), dataMissing(4), unexpectedDataValue(5), posMethodFailure(6), posMethodMismatch(7), posProtocolMismatch(8), targetSETnotReachable(9), versionNotSupported(10), resourceShortage(11), invalidSessionId(12), nonProxyModeNotSupported(13), proxyModeNotSupported(14), positioningNotPermitted(15), authNetFailure(16), authSuplinitFailure(17), consentDeniedByUser(100), consentGrantedByUser(101), ... } PosMethod ::= ENUMERATED { agpsSETassisted(0), agpsSETbased(1), agpsSETassistedpref(2), agpsSETbasedpref(3), autonomousGPS(4), aFLT(5), eCID(6), eOTD(7), oTDOA(8), noPosition(9), ... } END gnss-sdr-0.0.9/src/core/libs/supl/asn/supl-end.asn000066400000000000000000000004061305042567700217370ustar00rootroot00000000000000SUPL-END DEFINITIONS AUTOMATIC TAGS ::= BEGIN EXPORTS SUPLEND; IMPORTS StatusCode, Position, Ver FROM ULP-Components; SUPLEND ::= SEQUENCE { position Position OPTIONAL, statusCode StatusCode OPTIONAL, ver Ver OPTIONAL, ...} END gnss-sdr-0.0.9/src/core/libs/supl/asn/supl-init.asn000066400000000000000000000025321305042567700221360ustar00rootroot00000000000000SUPL-INIT DEFINITIONS AUTOMATIC TAGS ::= BEGIN EXPORTS SUPLINIT; IMPORTS SLPAddress, QoP, PosMethod FROM ULP-Components; SUPLINIT ::= SEQUENCE { posMethod PosMethod, notification Notification OPTIONAL, sLPAddress SLPAddress OPTIONAL, qoP QoP OPTIONAL, sLPMode SLPMode, mAC MAC OPTIONAL, keyIdentity KeyIdentity OPTIONAL, ...} Notification ::= SEQUENCE { notificationType NotificationType, encodingType EncodingType OPTIONAL, requestorId OCTET STRING(SIZE (1..maxReqLength)) OPTIONAL, requestorIdType FormatIndicator OPTIONAL, clientName OCTET STRING(SIZE (1..maxClientLength)) OPTIONAL, clientNameType FormatIndicator OPTIONAL, ...} NotificationType ::= ENUMERATED { noNotificationNoVerification(0), notificationOnly(1), notificationAndVerficationAllowedNA(2), notificationAndVerficationDeniedNA(3), privacyOverride(4), ... } EncodingType ::= ENUMERATED {ucs2(0), gsmDefault(1), utf8(2), ... } maxReqLength INTEGER ::= 50 maxClientLength INTEGER ::= 50 FormatIndicator ::= ENUMERATED { logicalName(0), e-mailAddress(1), msisdn(2), url(3), sipUrl(4), min(5), mdn(6), imsPublicIdentity(7), ... } SLPMode ::= ENUMERATED {proxy(0), nonProxy(1)} MAC ::= BIT STRING(SIZE (64)) KeyIdentity ::= BIT STRING(SIZE (128)) END gnss-sdr-0.0.9/src/core/libs/supl/asn/supl-pos.asn000066400000000000000000000005751305042567700220010ustar00rootroot00000000000000SUPL-POS DEFINITIONS AUTOMATIC TAGS ::= BEGIN EXPORTS SUPLPOS; IMPORTS Velocity FROM ULP-Components; SUPLPOS ::= SEQUENCE { posPayLoad PosPayLoad, velocity Velocity OPTIONAL, ...} PosPayLoad ::= CHOICE { tia801payload OCTET STRING(SIZE (1..8192)), rrcPayload OCTET STRING(SIZE (1..8192)), rrlpPayload OCTET STRING(SIZE (1..8192)), ...} END gnss-sdr-0.0.9/src/core/libs/supl/asn/supl-posinit.asn000066400000000000000000000026461305042567700226660ustar00rootroot00000000000000SUPL-POS-INIT DEFINITIONS AUTOMATIC TAGS ::= BEGIN EXPORTS SUPLPOSINIT; IMPORTS SUPLPOS FROM SUPL-POS SETCapabilities FROM SUPL-START LocationId, Position, Ver FROM ULP-Components; SUPLPOSINIT ::= SEQUENCE { sETCapabilities SETCapabilities, requestedAssistData RequestedAssistData OPTIONAL, locationId LocationId, position Position OPTIONAL, sUPLPOS SUPLPOS OPTIONAL, ver Ver OPTIONAL, ...} RequestedAssistData ::= SEQUENCE { almanacRequested BOOLEAN, utcModelRequested BOOLEAN, ionosphericModelRequested BOOLEAN, dgpsCorrectionsRequested BOOLEAN, referenceLocationRequested BOOLEAN, referenceTimeRequested BOOLEAN, acquisitionAssistanceRequested BOOLEAN, realTimeIntegrityRequested BOOLEAN, navigationModelRequested BOOLEAN, navigationModelData XNavigationModel OPTIONAL, ...} -- name clash with RRLP stuff XNavigationModel ::= SEQUENCE { gpsWeek INTEGER(0..1023), gpsToe INTEGER(0..167), nSAT INTEGER(0..31), toeLimit INTEGER(0..10), satInfo SatelliteInfo OPTIONAL, ...} -- Further information on this fields can be found -- in 3GPP TS 44.031 and 49.031 SatelliteInfo ::= SEQUENCE (SIZE (1..31)) OF SatelliteInfoElement SatelliteInfoElement ::= SEQUENCE { satId INTEGER(0..63), iODE INTEGER(0..255), ...} END gnss-sdr-0.0.9/src/core/libs/supl/asn/supl-response.asn000066400000000000000000000007161305042567700230330ustar00rootroot00000000000000SUPL-RESPONSE DEFINITIONS AUTOMATIC TAGS ::= BEGIN EXPORTS SUPLRESPONSE; IMPORTS PosMethod, SLPAddress FROM ULP-Components; SUPLRESPONSE ::= SEQUENCE { posMethod PosMethod, sLPAddress SLPAddress OPTIONAL, sETAuthKey SETAuthKey OPTIONAL, keyIdentity4 KeyIdentity4 OPTIONAL, ...} SETAuthKey ::= CHOICE { shortKey BIT STRING(SIZE (128)), longKey BIT STRING(SIZE (256)), ...} KeyIdentity4 ::= BIT STRING(SIZE (128)) END gnss-sdr-0.0.9/src/core/libs/supl/asn/supl-start.asn000066400000000000000000000014741305042567700223340ustar00rootroot00000000000000SUPL-START DEFINITIONS AUTOMATIC TAGS ::= BEGIN EXPORTS SUPLSTART, SETCapabilities; IMPORTS LocationId, QoP FROM ULP-Components; SUPLSTART ::= SEQUENCE { sETCapabilities SETCapabilities, locationId LocationId, qoP QoP OPTIONAL, ...} SETCapabilities ::= SEQUENCE { posTechnology PosTechnology, prefMethod PrefMethod, posProtocol PosProtocol, ...} PosTechnology ::= SEQUENCE { agpsSETassisted BOOLEAN, agpsSETBased BOOLEAN, autonomousGPS BOOLEAN, aFLT BOOLEAN, eCID BOOLEAN, eOTD BOOLEAN, oTDOA BOOLEAN, ...} PrefMethod ::= ENUMERATED { agpsSETassistedPreferred, agpsSETBasedPreferred, noPreference} PosProtocol ::= SEQUENCE { tia801 BOOLEAN, rrlp BOOLEAN, rrc BOOLEAN, ...} END gnss-sdr-0.0.9/src/core/libs/supl/asn/supl-ulp.asn000066400000000000000000000015361305042567700217760ustar00rootroot00000000000000ULP DEFINITIONS AUTOMATIC TAGS ::= BEGIN IMPORTS Version, SessionID FROM ULP-Components SUPLINIT FROM SUPL-INIT SUPLSTART FROM SUPL-START SUPLRESPONSE FROM SUPL-RESPONSE SUPLPOSINIT FROM SUPL-POS-INIT SUPLPOS FROM SUPL-POS SUPLEND FROM SUPL-END -- SUPLAUTHREQ -- FROM SUPL-AUTH-REQ -- SUPLAUTHRESP -- FROM SUPL-AUTH-RESP; ; -- general ULP PDU layout; ULP-PDU ::= SEQUENCE { length INTEGER(0..65535), version Version, sessionID SessionID, message UlpMessage} UlpMessage ::= CHOICE { msSUPLINIT SUPLINIT, msSUPLSTART SUPLSTART, msSUPLRESPONSE SUPLRESPONSE, msSUPLPOSINIT SUPLPOSINIT, msSUPLPOS SUPLPOS, msSUPLEND SUPLEND, -- msSUPLAUTHREQ SUPLAUTHREQ, msDUMMY2 DUMMY, -- msSUPLAUTHRESP SUPLAUTHRESP, msDUMMY3 DUMMY, ...} DUMMY ::= INTEGER END gnss-sdr-0.0.9/src/core/libs/supl/supl.c000066400000000000000000000666341305042567700200720ustar00rootroot00000000000000/* ** SUPL library with some RRLP ** ** Copyright (c) 2007 Tatu Mannisto ** All rights reserved. ** Redistribution and modifications are permitted subject to BSD license. ** Modifified by Carles Fernandez ** to make use of the gnutls library. */ #include "supl.h" #include #include #include #include #include #include #include #include #include #define PARAM_GSM_CELL_CURRENT 1 #define PARAM_GSM_CELL_KNOWN 2 #define PARAM_WCDMA_CELL_CURRENT 4 #define OPTIONAL_MISSING ((void*)0) #ifdef SUPL_DEBUG static struct supl_debug_s { FILE *log; int verbose_rrlp, verbose_supl, debug; int sent,recv, out_msg, in_msg; } debug; #endif static int server_connect(char *server); static int pdu_make_ulp_start(supl_ctx_t *ctx, supl_ulp_t *pdu); static int pdu_make_ulp_pos_init(supl_ctx_t *ctx, supl_ulp_t *pdu); static int pdu_make_ulp_rrlp_ack(supl_ctx_t *ctx, supl_ulp_t *pdu, PDU_t *rrlp); static int supl_more_rrlp(PDU_t *rrlp); static int supl_response_harvest(supl_ctx_t *ctx, supl_ulp_t *pdu); int EXPORT supl_ulp_decode(supl_ulp_t *pdu) { ULP_PDU_t *ulp; asn_codec_ctx_t ctx; asn_dec_rval_t rval; ulp = calloc(1, sizeof(ULP_PDU_t)); pdu->pdu = ulp; ctx.max_stack_size = 0; rval = uper_decode_complete(&ctx, &asn_DEF_ULP_PDU, (void **)&ulp, pdu->buffer, pdu->size); if (rval.code == RC_OK) { return 0; } free(ulp); pdu->pdu = 0; return E_SUPL_DECODE; } int EXPORT supl_ulp_encode(supl_ulp_t *pdu) { asn_enc_rval_t ret; int pdu_len; ret = uper_encode_to_buffer(&asn_DEF_ULP_PDU, pdu->pdu, pdu->buffer, sizeof(pdu->buffer)); if (ret.encoded != -1) { memset(pdu->buffer, 0, sizeof(pdu->buffer)); pdu_len = (ret.encoded + 7) >> 3; ((ULP_PDU_t *)pdu->pdu)->length = pdu_len; ret = uper_encode_to_buffer(&asn_DEF_ULP_PDU, pdu->pdu, pdu->buffer, sizeof(pdu->buffer)); if (ret.encoded > 0) { int len = (ret.encoded + 7) >> 3; if (len == pdu_len) { pdu->size = pdu_len; return 0; } } } return E_SUPL_ENCODE; } void EXPORT supl_ulp_free(supl_ulp_t *pdu) { asn_DEF_ULP_PDU.free_struct(&asn_DEF_ULP_PDU, pdu->pdu, 0); } int EXPORT supl_ulp_send(supl_ctx_t *ctx, supl_ulp_t *pdu) { int err; #if SUPL_DEBUG if (debug.verbose_supl) { fprintf(debug.log, "Send %lu bytes\n", pdu->size); xer_fprint(debug.log, &asn_DEF_ULP_PDU, pdu->pdu); } #endif err = SSL_write(ctx->ssl, pdu->buffer, pdu->size); if (err <= 0) { #if SUPL_DEBUG if (debug.debug) fprintf(debug.log, "Error: SSL_write error: %s\n", strerror(errno)); #endif return E_SUPL_WRITE; } #ifdef SUPL_DEBUG debug.sent += pdu->size; debug.out_msg++; #endif return 0; } int EXPORT supl_ulp_recv(supl_ctx_t *ctx, supl_ulp_t *pdu) { int err; int n; asn_dec_rval_t rval; ULP_PDU_t *length; err = SSL_read(ctx->ssl, pdu->buffer, sizeof(pdu->buffer)); if (err <= 0) { #ifdef SUPL_DEBUG if (debug.debug) fprintf(debug.log, "Error: SSL_read error: %s\n", strerror(errno)); #endif return E_SUPL_READ; } n = err; length = calloc(1, sizeof(ULP_PDU_t)); // decode the very first bytes of the ULP_PDU message, just enough to the get message length rval = uper_decode_complete(0, &asn_DEF_ULP_PDU, (void **)&length, pdu->buffer, n < 6 ? n : 6); if (rval.code == RC_WMORE) { // read the missing data for (n = err; n < length->length; n += err) { #ifdef SUPL_DEBUG if (debug.debug) fprintf(debug.log, "SSL_read got %u bytes (total %lu)\n", n, length->length); #endif err = SSL_read(ctx->ssl, &pdu->buffer[n], sizeof(pdu->buffer)-n); if (err <= 0) { #ifdef SUPL_DEBUG if (debug.debug) fprintf(debug.log, "Error: SSL_read (again) error: %s\n", strerror(errno)); #endif return E_SUPL_READ; } } } asn_DEF_ULP_PDU.free_struct(&asn_DEF_ULP_PDU, length, 0); pdu->size = n; if (supl_ulp_decode(pdu)) { return E_SUPL_DECODE; } #ifdef SUPL_DEBUG if (debug.verbose_supl) { fprintf(debug.log, "Recv %lu bytes\n", pdu->size); xer_fprint(debug.log, &asn_DEF_ULP_PDU, pdu->pdu); } #endif #ifdef SUPL_DEBUG debug.recv += err; debug.in_msg++; #endif return 0; } int EXPORT supl_decode_rrlp(supl_ulp_t *ulp_pdu, PDU_t **ret_rrlp) { asn_dec_rval_t rval; OCTET_STRING_t *rrlp_pdu; PDU_t *rrlp; ULP_PDU_t *ulp; ulp = ulp_pdu->pdu; if (!(ulp->message.present == UlpMessage_PR_msSUPLPOS && ulp->message.choice.msSUPLPOS.posPayLoad.present == PosPayLoad_PR_rrlpPayload)) { return 0; } rrlp_pdu = &ulp->message.choice.msSUPLPOS.posPayLoad.choice.rrlpPayload; rrlp = calloc(1, sizeof(PDU_t)); rval = uper_decode_complete(0, &asn_DEF_PDU, (void **)&rrlp, rrlp_pdu->buf, rrlp_pdu->size); switch (rval.code) { case RC_OK: #ifdef SUPL_DEBUG if (rval.consumed != rrlp_pdu->size) { if (debug.debug) fprintf(debug.log, "Warning: %lu bytes left over in RRLP decoding\n", rval.consumed); } #endif *ret_rrlp = rrlp; return 0; case RC_WMORE: asn_DEF_PDU.free_struct(&asn_DEF_PDU, rrlp, 0); ret_rrlp = 0; return E_SUPL_DECODE_RRLP; default: asn_DEF_PDU.free_struct(&asn_DEF_PDU, rrlp, 0); ret_rrlp = 0; return E_SUPL_DECODE_RRLP; } return E_SUPL_INTERNAL; } int EXPORT supl_server_connect(supl_ctx_t *ctx, char *server) { int err; const SSL_METHOD *meth; SSLeay_add_ssl_algorithms(); // meth = TLSv1_client_method(); meth = SSLv23_client_method(); SSL_load_error_strings(); ctx->ssl_ctx = SSL_CTX_new(meth); if (!ctx->ssl_ctx) return E_SUPL_CONNECT; ctx->ssl = SSL_new(ctx->ssl_ctx); if (!ctx->ssl) return E_SUPL_CONNECT; if (server) { ctx->fd = server_connect(server); if (ctx->fd == -1) return E_SUPL_CONNECT; } SSL_set_fd(ctx->ssl, ctx->fd); err = SSL_connect(ctx->ssl); if (err == -1) return E_SUPL_CONNECT; #if 0 { X509 *s_cert = SSL_get_peer_certificate(ctx->ssl); FILE *fp = fopen("/tmp/s_cert.pem", "w"); if (fp) PEM_write_X509(fp, s_cert); fclose(fp); X509_free(s_cert); } #endif return 0; } void EXPORT supl_close(supl_ctx_t *ctx) { SSL_shutdown(ctx->ssl); SSL_free(ctx->ssl); SSL_CTX_free(ctx->ssl_ctx); close(ctx->fd); } static int server_connect(char *server) { int fd = -1; struct addrinfo *ailist, *aip; struct addrinfo hint; int err; memset(&hint, 0, sizeof(struct addrinfo)); hint.ai_socktype = SOCK_STREAM; err = getaddrinfo(server, SUPL_PORT, &hint, &ailist); if (err != 0) { return -1; } for (aip = ailist; aip; aip = aip->ai_next) { if ((fd = socket(aip->ai_family, SOCK_STREAM, 0)) < 0) { err = errno; } if (connect(fd, aip->ai_addr, aip->ai_addrlen) != 0) { return -1; } break; } return fd; } static int pdu_make_ulp_start(supl_ctx_t *ctx, supl_ulp_t *pdu) { ULP_PDU_t *ulp; SetSessionID_t *session_id; int err; ulp = calloc(1, sizeof(ULP_PDU_t)); session_id = calloc(1, sizeof(SetSessionID_t)); ulp->length = 0; ulp->version.maj = 1; ulp->version.min = 0; ulp->version.servind = 0; session_id->sessionId = 1; // session_id->setId.present = SETId_PR_msisdn; // (void)OCTET_STRING_fromBuf(&session_id->setId.choice.msisdn, ctx->p.msisdn, 8); session_id->setId.present = SETId_PR_imsi; (void)OCTET_STRING_fromBuf(&session_id->setId.choice.imsi, ctx->p.msisdn, 8); ulp->sessionID.setSessionID = session_id; ulp->sessionID.slpSessionID = OPTIONAL_MISSING; ulp->message.present = UlpMessage_PR_msSUPLSTART; ulp->message.choice.msSUPLSTART.sETCapabilities.posTechnology.agpsSETBased = 1; // (void)asn_long2INTEGER(&ulp->message.choice.msSUPLSTART.sETCapabilities.prefMethod, PrefMethod_noPreference); (void)asn_long2INTEGER(&ulp->message.choice.msSUPLSTART.sETCapabilities.prefMethod, PrefMethod_agpsSETBasedPreferred); ulp->message.choice.msSUPLSTART.sETCapabilities.posProtocol.rrlp = 1; if (ctx->p.set & PARAM_GSM_CELL_CURRENT) { ulp->message.choice.msSUPLSTART.locationId.cellInfo.present = CellInfo_PR_gsmCell; ulp->message.choice.msSUPLSTART.locationId.cellInfo.choice.gsmCell.refMCC = ctx->p.gsm.mcc; ulp->message.choice.msSUPLSTART.locationId.cellInfo.choice.gsmCell.refMNC = ctx->p.gsm.mnc; ulp->message.choice.msSUPLSTART.locationId.cellInfo.choice.gsmCell.refLAC = ctx->p.gsm.lac; ulp->message.choice.msSUPLSTART.locationId.cellInfo.choice.gsmCell.refCI = ctx->p.gsm.ci; ulp->message.choice.msSUPLSTART.locationId.cellInfo.choice.gsmCell.nMR = OPTIONAL_MISSING; ulp->message.choice.msSUPLSTART.locationId.cellInfo.choice.gsmCell.tA = OPTIONAL_MISSING; } else if (ctx->p.set & PARAM_WCDMA_CELL_CURRENT) { ulp->message.choice.msSUPLSTART.locationId.cellInfo.present = CellInfo_PR_wcdmaCell; ulp->message.choice.msSUPLSTART.locationId.cellInfo.choice.wcdmaCell.refMCC = ctx->p.wcdma.mcc; ulp->message.choice.msSUPLSTART.locationId.cellInfo.choice.wcdmaCell.refMNC = ctx->p.wcdma.mnc; ulp->message.choice.msSUPLSTART.locationId.cellInfo.choice.wcdmaCell.refUC = ctx->p.wcdma.uc; } (void)asn_long2INTEGER(&ulp->message.choice.msSUPLSTART.locationId.status, Status_current); ulp->message.choice.msSUPLSTART.qoP = OPTIONAL_MISSING; pdu->pdu = ulp; err = supl_ulp_encode(pdu); if (err < 0) { asn_DEF_ULP_PDU.free_struct(&asn_DEF_ULP_PDU, ulp, 0); return err; } return 0; } // get slpSessionID from SUPLRESPONSE pdu if preset static int supl_response_harvest(supl_ctx_t *ctx, supl_ulp_t *pdu) { int ret; ULP_PDU_t *ulp = pdu->pdu; void *buf; ctx->slp_session_id.buf = 0; ret = uper_encode_to_new_buffer(&asn_DEF_SlpSessionID, 0, (void *)ulp->sessionID.slpSessionID, &buf); if (ret == -1) return -1; ctx->slp_session_id.buf = buf; ctx->slp_session_id.size = ret; return 0; } static int pdu_make_ulp_pos_init(supl_ctx_t *ctx, supl_ulp_t *pdu) { int err; ULP_PDU_t *ulp; SetSessionID_t *session_id; RequestedAssistData_t *req_adata; ulp = calloc(1, sizeof(ULP_PDU_t)); session_id = calloc(1, sizeof(SetSessionID_t)); req_adata = calloc(1, sizeof(RequestedAssistData_t)); ulp->length = 0; ulp->version.maj = 1; ulp->version.min = 0; ulp->version.servind = 0; session_id->sessionId = 1; // session_id->setId.present = SETId_PR_msisdn; // (void)OCTET_STRING_fromBuf(&session_id->setId.choice.msisdn, ctx->p.msisdn, 8); session_id->setId.present = SETId_PR_imsi; (void)OCTET_STRING_fromBuf(&session_id->setId.choice.imsi, ctx->p.msisdn, 8); ulp->sessionID.setSessionID = session_id; // ulp->sessionID.slpSessionID = OPTIONAL_MISSING; if (ctx->slp_session_id.buf) { (void)uper_decode_complete(0, &asn_DEF_SlpSessionID, (void **)&ulp->sessionID.slpSessionID, ctx->slp_session_id.buf, ctx->slp_session_id.size); } else { ulp->sessionID.slpSessionID = OPTIONAL_MISSING; } ulp->message.present = UlpMessage_PR_msSUPLPOSINIT; ulp->message.choice.msSUPLPOSINIT.sETCapabilities.posTechnology.agpsSETBased = 1; // (void)asn_long2INTEGER(&ulp->message.choice.msSUPLPOSINIT.sETCapabilities.prefMethod, PrefMethod_noPreference); (void)asn_long2INTEGER(&ulp->message.choice.msSUPLPOSINIT.sETCapabilities.prefMethod, PrefMethod_agpsSETBasedPreferred); ulp->message.choice.msSUPLPOSINIT.sETCapabilities.posProtocol.rrlp = 1; //GNSS-SDR mod // Use ctx->p.request to swith between a pre-defined set of assistence data request // reason: Some SUPL servers do not respond to Acquisition assistance depending on the status of other assistance flags switch (ctx->p.request) { case 0: //request almanac, time, and cell positions req_adata->acquisitionAssistanceRequested = 0; // 1 req_adata->navigationModelRequested = 0; // 1 req_adata->referenceTimeRequested = 1; req_adata->utcModelRequested = 1; //1 req_adata->ionosphericModelRequested = 1; // 1 req_adata->referenceLocationRequested = 1; req_adata->almanacRequested = 1; req_adata->realTimeIntegrityRequested = 1; // 1 break; case 1: // request Navigation Model (Ephemeris) req_adata->acquisitionAssistanceRequested = 0; // 1 req_adata->navigationModelRequested = 1; // 1 req_adata->referenceTimeRequested = 1; req_adata->utcModelRequested = 0; //1 req_adata->ionosphericModelRequested = 0; // 1 req_adata->referenceLocationRequested = 0; req_adata->almanacRequested = 0; req_adata->realTimeIntegrityRequested = 0; // 1 break; case 2: //request Acquisition assistance (Doppler assistance) req_adata->acquisitionAssistanceRequested = 1; // 1 req_adata->navigationModelRequested = 0; // 1 req_adata->referenceTimeRequested = 1; req_adata->utcModelRequested = 1; //1 req_adata->ionosphericModelRequested = 1; // 1 req_adata->referenceLocationRequested = 1; req_adata->almanacRequested = 1; req_adata->realTimeIntegrityRequested = 1; // 1 break; default: req_adata->acquisitionAssistanceRequested = 0; // 1 req_adata->navigationModelRequested = 0; // 1 req_adata->referenceTimeRequested = 1; req_adata->utcModelRequested = 1; //1 req_adata->ionosphericModelRequested = 1; // 1 req_adata->referenceLocationRequested = 1; req_adata->almanacRequested = 1; req_adata->realTimeIntegrityRequested = 1; // 1 break; } ulp->message.choice.msSUPLPOSINIT.requestedAssistData = req_adata; if (ctx->p.set & PARAM_GSM_CELL_CURRENT) { ulp->message.choice.msSUPLPOSINIT.locationId.cellInfo.present = CellInfo_PR_gsmCell; ulp->message.choice.msSUPLPOSINIT.locationId.cellInfo.choice.gsmCell.refMCC = ctx->p.gsm.mcc; ulp->message.choice.msSUPLPOSINIT.locationId.cellInfo.choice.gsmCell.refMNC = ctx->p.gsm.mnc; ulp->message.choice.msSUPLPOSINIT.locationId.cellInfo.choice.gsmCell.refLAC = ctx->p.gsm.lac; ulp->message.choice.msSUPLPOSINIT.locationId.cellInfo.choice.gsmCell.refCI = ctx->p.gsm.ci; ulp->message.choice.msSUPLPOSINIT.locationId.cellInfo.choice.gsmCell.nMR = OPTIONAL_MISSING; ulp->message.choice.msSUPLPOSINIT.locationId.cellInfo.choice.gsmCell.tA = OPTIONAL_MISSING; } else if (ctx->p.set & PARAM_WCDMA_CELL_CURRENT) { ulp->message.choice.msSUPLPOSINIT.locationId.cellInfo.present = CellInfo_PR_wcdmaCell; ulp->message.choice.msSUPLPOSINIT.locationId.cellInfo.choice.wcdmaCell.refMCC = ctx->p.wcdma.mcc; ulp->message.choice.msSUPLPOSINIT.locationId.cellInfo.choice.wcdmaCell.refMNC = ctx->p.wcdma.mnc; ulp->message.choice.msSUPLPOSINIT.locationId.cellInfo.choice.wcdmaCell.refUC = ctx->p.wcdma.uc; } if (ctx->p.set & PARAM_GSM_CELL_KNOWN) { Position_t *pos = calloc(1, sizeof(Position_t)); struct tm *tm; time_t t; (void)asn_long2INTEGER(&ulp->message.choice.msSUPLPOSINIT.locationId.status, Status_stale); t = time(0); tm = gmtime(&t); asn_UT2time(&pos->timestamp, tm ,1); (void)asn_long2INTEGER(&pos->positionEstimate.latitudeSign, latitudeSign_north); pos->positionEstimate.latitude = (1 << 23) / 90.0 * ctx->p.known.lat; pos->positionEstimate.longitude = (1 << 24) / 360.0 * ctx->p.known.lon; // TODO: set position estimate ulp->message.choice.msSUPLPOSINIT.position = pos; } else { (void)asn_long2INTEGER(&ulp->message.choice.msSUPLPOSINIT.locationId.status, Status_current); ulp->message.choice.msSUPLPOSINIT.position = OPTIONAL_MISSING; } ulp->message.choice.msSUPLPOSINIT.sUPLPOS = OPTIONAL_MISSING; ulp->message.choice.msSUPLPOSINIT.ver = OPTIONAL_MISSING; pdu->pdu = ulp; err = supl_ulp_encode(pdu); if (err < 0) { asn_DEF_ULP_PDU.free_struct(&asn_DEF_ULP_PDU, ulp, 0); return err; } return 0; } static int pdu_make_ulp_rrlp_ack(supl_ctx_t *ctx, supl_ulp_t *pdu, PDU_t *rrlp) { int err; PDU_t *rrlp_ack; ULP_PDU_t *ulp; SetSessionID_t *session_id; asn_enc_rval_t ret; int pdu_len; char buffer[1024]; rrlp_ack = calloc(1, sizeof(PDU_t)); /* create RRLP assistanceDataAck */ rrlp_ack->referenceNumber = rrlp->referenceNumber; rrlp_ack->component.present = RRLP_Component_PR_assistanceDataAck; ret = uper_encode_to_buffer(&asn_DEF_PDU, rrlp_ack, buffer, sizeof(buffer)); asn_DEF_ULP_PDU.free_struct(&asn_DEF_PDU, rrlp_ack, 0); if (ret.encoded == -1) { return E_SUPL_ENCODE_RRLP; } pdu_len = (ret.encoded + 7) >> 3; /* embedded it in SUPLPOS */ ulp = calloc(1, sizeof(ULP_PDU_t)); session_id = calloc(1, sizeof(SetSessionID_t)); ulp->length = 0; ulp->version.maj = 1; ulp->version.min = 0; ulp->version.servind = 0; session_id->sessionId = 1; // session_id->setId.present = SETId_PR_msisdn; // (void)OCTET_STRING_fromBuf(&session_id->setId.choice.msisdn, ctx->p.msisdn, 8); session_id->setId.present = SETId_PR_imsi; (void)OCTET_STRING_fromBuf(&session_id->setId.choice.imsi, ctx->p.msisdn, 8); ulp->sessionID.setSessionID = session_id; // ulp->sessionID.slpSessionID = OPTIONAL_MISSING; if (ctx->slp_session_id.buf) { (void)uper_decode_complete(0, &asn_DEF_SlpSessionID, (void **)&ulp->sessionID.slpSessionID, ctx->slp_session_id.buf, ctx->slp_session_id.size); } else { ulp->sessionID.slpSessionID = OPTIONAL_MISSING; } ulp->message.present = UlpMessage_PR_msSUPLPOS; ulp->message.choice.msSUPLPOS.posPayLoad.present = PosPayLoad_PR_rrlpPayload; (void)OCTET_STRING_fromBuf(&ulp->message.choice.msSUPLPOS.posPayLoad.choice.rrlpPayload, buffer, pdu_len); pdu->pdu = ulp; err = supl_ulp_encode(pdu); if (err < 0) { supl_ulp_free(pdu); return err; } return 0; } /* ** ** */ int EXPORT supl_collect_rrlp(supl_assist_t *assist, PDU_t *rrlp, struct timeval *t) { ControlHeader_t *hdr; if (rrlp->component.present != RRLP_Component_PR_assistanceData) return 0; if (!rrlp->component.choice.assistanceData.gps_AssistData) return 0; hdr = &rrlp->component.choice.assistanceData.gps_AssistData->controlHeader; if (hdr->referenceTime) { assist->set |= SUPL_RRLP_ASSIST_REFTIME; assist->time.gps_tow = hdr->referenceTime->gpsTime.gpsTOW23b; assist->time.gps_week = hdr->referenceTime->gpsTime.gpsWeek; memcpy(&assist->time.stamp, t, sizeof(struct timeval)); } if (hdr->refLocation) { OCTET_STRING_t *loc; loc = &hdr->refLocation->threeDLocation; if (loc->size == 14 && loc->buf[0] == 0x90) { double lat, lon; long l; /* from 3GPP TS 23.032 V4.0.0 (2001-04) */ l = (loc->buf[1] & 0x7f) << 16 | (loc->buf[2] << 8) | loc->buf[3]; if (loc->buf[1] & 0x80) l *= -1; lat = 90.0 / (1 << 23) * l; l = (loc->buf[4] << 16) | (loc->buf[5] << 8) | loc->buf[6]; lon = 360.0 / (1 << 24) * l; /* max of uncertainty ellipsoid axis */ /* uncert in meters = 10 * (1.1 ^ l - 1) */ /* l == 96 => 100 km uncertainty => not usable */ l = loc->buf[9]; if (loc->buf[10] > l) l = loc->buf[10]; assist->set |= SUPL_RRLP_ASSIST_REFLOC; assist->pos.lat = lat; assist->pos.lon = lon; assist->pos.uncertainty = l; } } if (hdr->acquisAssist) { int n; assist->acq_time = hdr->acquisAssist->timeRelation.gpsTOW; for (n = 0; n < hdr->acquisAssist->acquisList.list.count; n++) { struct AcquisElement *e = hdr->acquisAssist->acquisList.list.array[n]; int i = assist->cnt_acq++; assist->acq[i].prn = e->svid + 1; assist->acq[i].parts = 0; assist->acq[i].doppler0 = e->doppler0; if (e->addionalDoppler) { assist->acq[i].parts |= SUPL_ACQUIS_DOPPLER; assist->acq[i].doppler1 = e->addionalDoppler->doppler1; assist->acq[i].d_win = e->addionalDoppler->dopplerUncertainty; } assist->acq[i].code_ph = e->codePhase; assist->acq[i].code_ph_int = e->intCodePhase; assist->acq[i].bit_num = e->gpsBitNumber; assist->acq[i].code_ph_win = e->codePhaseSearchWindow; if (e->addionalAngle) { assist->acq[i].parts |= SUPL_ACQUIS_ANGLE; assist->acq[i].az = e->addionalAngle->azimuth; assist->acq[i].el = e->addionalAngle->elevation; } } } if (hdr->almanac) { int n; for (n = 0; n < hdr->almanac->almanacList.list.count; n++) { struct AlmanacElement *e = hdr->almanac->almanacList.list.array[n]; int i = assist->cnt_alm++; assist->alm[i].prn = e->satelliteID + 1; assist->alm[i].e = e->almanacE; assist->alm[i].toa = e->alamanacToa; // nice touch 3gpp assist->alm[i].Ksii = e->almanacKsii; assist->alm[i].OMEGA_dot = e->almanacOmegaDot; assist->alm[i].A_sqrt = e->almanacAPowerHalf; assist->alm[i].OMEGA_0 = e->almanacOmega0; assist->alm[i].w = e->almanacW; assist->alm[i].M0 = e->almanacM0; assist->alm[i].AF0 = e->almanacAF0; assist->alm[i].AF1 = e->almanacAF1; } } if (hdr->navigationModel) { UncompressedEphemeris_t *ue; int n; for (n = 0; n < hdr->navigationModel->navModelList.list.count; n++) { struct NavModelElement *e = hdr->navigationModel->navModelList.list.array[n]; int i = assist->cnt_eph++; assist->eph[i].prn = e->satelliteID + 1; /* what is the difference between these two */ ue = 0; if (e->satStatus.present == SatStatus_PR_newNaviModelUC) ue = &e->satStatus.choice.newNaviModelUC; if (e->satStatus.present == SatStatus_PR_newSatelliteAndModelUC) ue = &e->satStatus.choice.newSatelliteAndModelUC; if (ue) { #if 0 assist->eph_x[i].L2P = ue->ephemL2Pflag; assist->eph_x[i].fit = ue->ephemFitFlag; #endif assist->eph[i].delta_n = ue->ephemDeltaN; assist->eph[i].M0 = ue->ephemM0; #if 0 // this is needed for asn1c version 0.9.22 { long v; asn_INTEGER2long((INTEGER_t *)&ue->ephemE, &v); assist->eph[i].e = v; asn_INTEGER2long((INTEGER_t *)&ue->ephemAPowerHalf, &v); assist->eph[i].e = v; } #else assist->eph[i].e = ue->ephemE; assist->eph[i].A_sqrt = ue->ephemAPowerHalf; #endif assist->eph[i].OMEGA_0 = ue->ephemOmegaA0; assist->eph[i].i0 = ue->ephemI0; assist->eph[i].w = ue->ephemW; assist->eph[i].OMEGA_dot = ue->ephemOmegaADot; assist->eph[i].i_dot = ue->ephemIDot; assist->eph[i].Cuc = ue->ephemCuc; assist->eph[i].Cus = ue->ephemCus; assist->eph[i].Crc = ue->ephemCrc; assist->eph[i].Crs = ue->ephemCrs; assist->eph[i].Cic = ue->ephemCic; assist->eph[i].Cis = ue->ephemCis; assist->eph[i].toe = ue->ephemToe; assist->eph[i].IODC = ue->ephemIODC; assist->eph[i].toc = ue->ephemToc; assist->eph[i].AF0 = ue->ephemAF0; assist->eph[i].AF1 = ue->ephemAF1; assist->eph[i].AF2 = ue->ephemAF2; assist->eph[i].nav_model = 1; assist->eph[i].bits = ue->ephemCodeOnL2; assist->eph[i].ura = ue->ephemURA; assist->eph[i].health = ue->ephemSVhealth; assist->eph[i].AODA = ue->ephemAODA; assist->eph[i].tgd = ue->ephemTgd; } } } if (hdr->ionosphericModel) { assist->set |= SUPL_RRLP_ASSIST_IONO; assist->iono.a0 = hdr->ionosphericModel->alfa0; assist->iono.a1 = hdr->ionosphericModel->alfa1; assist->iono.a2 = hdr->ionosphericModel->alfa2; assist->iono.a3 = hdr->ionosphericModel->alfa3; //missed in original supl client assist->iono.b0 = hdr->ionosphericModel->beta0; assist->iono.b1 = hdr->ionosphericModel->beta1; assist->iono.b2 = hdr->ionosphericModel->beta2; assist->iono.b3 = hdr->ionosphericModel->beta3; } if (hdr->utcModel) { assist->set |= SUPL_RRLP_ASSIST_UTC; assist->utc.a0 = hdr->utcModel->utcA0; assist->utc.a1 = hdr->utcModel->utcA1; assist->utc.tot = hdr->utcModel->utcTot; assist->utc.wnt = hdr->utcModel->utcWNt; assist->utc.delta_tls = hdr->utcModel->utcDeltaTls; assist->utc.wnlsf = hdr->utcModel->utcWNlsf; assist->utc.dn = hdr->utcModel->utcDN; assist->utc.delta_tlsf = hdr->utcModel->utcDeltaTlsf; } return 1; } int EXPORT supl_ctx_new(supl_ctx_t *ctx) { memset(ctx, 0, sizeof(supl_ctx_t)); #ifdef SUPL_DEBUG memset(&debug, 0, sizeof(struct supl_debug_s)); #endif return 0; } int EXPORT supl_ctx_free(supl_ctx_t *ctx) { if (ctx->slp_session_id.buf) { free(ctx->slp_session_id.buf); ctx->slp_session_id.buf = 0; } return 0; } static int supl_more_rrlp(PDU_t *rrlp) { long value; return (rrlp->component.present == RRLP_Component_PR_assistanceData && rrlp->component.choice.assistanceData.moreAssDataToBeSent && asn_INTEGER2long((INTEGER_t *)rrlp->component.choice.assistanceData.moreAssDataToBeSent, &value) == 0 && value == MoreAssDataToBeSent_moreMessagesOnTheWay); } int EXPORT supl_get_assist(supl_ctx_t *ctx, char *server, supl_assist_t *assist) { supl_ulp_t ulp; // memcpy(ctx->p.msisdn, "\xde\xad\xbe\xef\xf0\x0b\xaa\x42", 8); memcpy(ctx->p.msisdn, "\xFF\xFF\x91\x94\x48\x45\x83\x98", 8); /* ** connect to server */ if (supl_server_connect(ctx, server) < 0) return E_SUPL_CONNECT; /* ** send SUPL_START */ if (pdu_make_ulp_start(ctx, &ulp) < 0) { return E_SUPL_ENCODE_START; } (void)supl_ulp_send(ctx, &ulp); supl_ulp_free(&ulp); /* ** should receive SUPL_RESPONSE back */ if (supl_ulp_recv(ctx, &ulp) < 0) { return E_SUPL_RECV_RESPONSE; } if (ulp.pdu->message.present != UlpMessage_PR_msSUPLRESPONSE) { supl_ulp_free(&ulp); return E_SUPL_SUPLRESPONSE; } // get and copy slpSessionID if present supl_response_harvest(ctx, &ulp); supl_ulp_free(&ulp); /* ** send SUPL_POS_INIT */ if (pdu_make_ulp_pos_init(ctx, &ulp) < 0) { return E_SUPL_ENCODE_POSINIT; } (void)supl_ulp_send(ctx, &ulp); /* ** should get SUPLPOS back - bounce back and forth until all messages have arrived */ memset(assist, 0, sizeof(supl_assist_t)); while (1) { struct timeval t; PDU_t *rrlp; supl_ulp_free(&ulp); /* record packet recv time */ gettimeofday(&t, 0); if (supl_ulp_recv(ctx, &ulp) < 0) { return E_SUPL_RECV_SUPLPOS; } if (ulp.pdu->message.present == UlpMessage_PR_msSUPLEND) { break; } if (ulp.pdu->message.present != UlpMessage_PR_msSUPLPOS) { supl_ulp_free(&ulp); return E_SUPL_SUPLPOS; } /* get the beef, the RRLP payload */ if (supl_decode_rrlp(&ulp, &rrlp) < 0) { supl_ulp_free(&ulp); return E_SUPL_DECODE_RRLP; } #ifdef SUPL_DEBUG if (debug.verbose_rrlp) { fprintf(debug.log, "Embedded RRLP message\n"); xer_fprint(debug.log, &asn_DEF_PDU, rrlp); } #endif /* remember important stuff from it */ supl_collect_rrlp(assist, rrlp, &t); if (!supl_more_rrlp(rrlp)) { asn_DEF_ULP_PDU.free_struct(&asn_DEF_PDU, rrlp, 0); break; } /* More data coming in, send SUPLPOS + RRLP ACK */ if (pdu_make_ulp_rrlp_ack(ctx, &ulp, rrlp) < 0) { return E_SUPL_RRLP_ACK; } supl_ulp_send(ctx, &ulp); asn_DEF_ULP_PDU.free_struct(&asn_DEF_PDU, rrlp, 0); } supl_ulp_free(&ulp); /* ** send SUPL_END (but who really cares) */ supl_close(ctx); return 0; } void EXPORT supl_set_gsm_cell(supl_ctx_t *ctx, int mcc, int mns, int lac, int ci) { ctx->p.set |= PARAM_GSM_CELL_CURRENT; ctx->p.gsm.mcc = mcc; ctx->p.gsm.mnc = mns; ctx->p.gsm.lac = lac; ctx->p.gsm.ci = ci; } void EXPORT supl_set_gsm_cell_known(supl_ctx_t *ctx, int mcc, int mns, int lac, int ci, double lat, double lon, int uncert) { ctx->p.set |= PARAM_GSM_CELL_KNOWN; ctx->p.known.mcc = mcc; ctx->p.known.mnc = mns; ctx->p.known.lac = lac; ctx->p.known.ci = ci; ctx->p.known.lat = lat; ctx->p.known.lon = lon; ctx->p.known.uncert = uncert; } void EXPORT supl_set_wcdma_cell(supl_ctx_t *ctx, int mcc, int mns, int uc) { ctx->p.set |= PARAM_WCDMA_CELL_CURRENT; ctx->p.wcdma.mcc = mcc; ctx->p.wcdma.mnc = mns; ctx->p.wcdma.uc = uc; } void EXPORT supl_request(supl_ctx_t *ctx, int request) { ctx->p.request = request; } void EXPORT supl_set_debug(FILE *log, int flags) { #ifdef SUPL_DEBUG debug.log = log; if (flags & SUPL_DEBUG_RRLP) debug.verbose_rrlp = 1; if (flags & SUPL_DEBUG_SUPL) debug.verbose_supl = 1; if (flags & SUPL_DEBUG_DEBUG) debug.debug = 1; #endif } gnss-sdr-0.0.9/src/core/libs/supl/supl.h000066400000000000000000000124441305042567700200650ustar00rootroot00000000000000/* ** SUPL library ** ** Copyright (c) 2007 Tatu Mannisto ** All rights reserved. ** Redistribution and modifications are permitted subject to BSD license. ** Modifified by Carles Fernandez ** to make use of the gnutls library. ** */ #ifndef SUPL_H #define SUPL_H #ifdef USE_EXPORT #define EXPORT __attribute__((visibility("default"))) #else #define EXPORT #endif #if USE_OPENSSL_FALLBACK #include #include #include #include #include #else #include #include #include #include #include #endif #include #include #define SUPL_PORT "7275" /* error messages */ #define E_SUPL_CONNECT (-1) #define E_SUPL_ENCODE_START (-2) #define E_SUPL_RECV_RESPONSE (-3) #define E_SUPL_SUPLRESPONSE (-4) #define E_SUPL_ENCODE_POSINIT (-5) #define E_SUPL_RECV_SUPLPOS (-6) #define E_SUPL_SUPLPOS (-7) #define E_SUPL_DECODE_RRLP (-8) #define E_SUPL_RRLP_ACK (-9) #define E_SUPL_ENCODE (-10) #define E_SUPL_WRITE (-11) #define E_SUPL_READ (-12) #define E_SUPL_INTERNAL (-13) #define E_SUPL_DECODE (-14) #define E_SUPL_ENCODE_RRLP (-15) /* diagnostic & debug values */ #define SUPL_DEBUG_RRLP 1 #define SUPL_DEBUG_SUPL 2 #define SUPL_DEBUG_DEBUG 4 /* flags for additional assistance requests */ #define SUPL_REQUEST_ALMANAC 1 /* flags for collected assist data elements */ #define SUPL_RRLP_ASSIST_REFTIME (1) #define SUPL_RRLP_ASSIST_REFLOC (2) #define SUPL_RRLP_ASSIST_IONO (4) #define SUPL_RRLP_ASSIST_EPHEMERIS (8) #define SUPL_RRLP_ASSIST_UTC (16) #define SUPL_ACQUIS_DOPPLER (1) #define SUPL_ACQUIS_ANGLE (2) #define MAX_EPHEMERIS 32 struct supl_acquis_s { u_int8_t prn; u_int8_t parts; int16_t doppler0; int8_t doppler1; u_int8_t d_win; u_int16_t code_ph; u_int8_t code_ph_int; u_int8_t bit_num; u_int16_t code_ph_win; u_int8_t az; u_int8_t el; u_int8_t fill[2]; }; struct supl_almanac_s { u_int8_t prn; u_int16_t e; u_int8_t toa; int16_t Ksii; int16_t OMEGA_dot; u_int32_t A_sqrt; int32_t OMEGA_0; int32_t w; int32_t M0; int16_t AF0; int16_t AF1; // int32_t health; }; struct supl_ephemeris_s { u_int8_t prn; u_int8_t fill1; u_int16_t delta_n; int32_t M0; u_int32_t e; u_int32_t A_sqrt; int32_t OMEGA_0; int32_t i0; int32_t w; int32_t OMEGA_dot; int16_t i_dot; int16_t Cuc; int16_t Cus; int16_t Crc; int16_t Crs; int16_t Cic; int16_t Cis; u_int16_t toe; u_int16_t IODC; u_int16_t toc; int32_t AF0; int16_t AF1; int8_t AF2; u_int8_t nav_model; /* nav model */ u_int8_t bits; u_int8_t ura; u_int8_t health; char reserved[11]; int8_t tgd; u_int8_t AODA; }; struct supl_ionospheric_s { int8_t a0, a1, a2,a3, b0, b1, b2, b3; }; struct supl_utc_s { int32_t a0; int32_t a1; int8_t delta_tls; u_int8_t tot; u_int8_t wnt; u_int8_t wnlsf; u_int8_t dn; u_int8_t delta_tlsf; u_int8_t fill[8]; }; typedef struct supl_rrlp_ctx_s { int set; struct { long gps_tow, gps_week; struct timeval stamp; } time; struct { int uncertainty; double lat, lon; /* of the base station */ } pos; struct supl_ionospheric_s iono; struct supl_utc_s utc; int cnt_eph; struct supl_ephemeris_s eph[MAX_EPHEMERIS]; int cnt_alm; int alm_week; struct supl_almanac_s alm[MAX_EPHEMERIS]; int cnt_acq; int acq_time; struct supl_acquis_s acq[MAX_EPHEMERIS]; } supl_assist_t; typedef struct supl_param_s { int set; int request; struct { int mcc, mnc, lac, ci; } gsm; struct { int mcc, mnc, uc; } wcdma; struct { int mcc, mnc, lac, ci; double lat, lon; int uncert; } known; char msisdn[8]; } supl_param_t; typedef struct supl_ctx_s { supl_param_t p; int fd; SSL *ssl; SSL_CTX *ssl_ctx; struct { void *buf; size_t size; } slp_session_id; } supl_ctx_t; int supl_ctx_new(supl_ctx_t *ctx); int supl_ctx_free(supl_ctx_t *ctx); void supl_set_gsm_cell(supl_ctx_t *ctx, int mcc, int mns, int lac, int ci); void supl_set_wcdma_cell(supl_ctx_t *ctx, int mcc, int mns, int uc); void supl_set_gsm_cell_known(supl_ctx_t *ctx, int mcc, int mns, int lac, int ci, double lat, double lon, int uncert); void supl_set_server(supl_ctx_t *ctx, char *server); void supl_set_fd(supl_ctx_t *ctx, int fd); void supl_request(supl_ctx_t *ctx, int flags); int supl_get_assist(supl_ctx_t *ctx, char *server, supl_assist_t *assist); void supl_set_debug(FILE *log, int flags); /* ** stuff above should be enough for supl client implementation */ typedef void (*supl_debug_cb)(char format, ...); typedef struct supl_ulp_s { ULP_PDU_t *pdu; size_t size; unsigned char buffer[8192]; } supl_ulp_t; typedef struct supl_rrlp_s { PDU_t *pdu; size_t size; unsigned char buffer[8192]; } supl_rrlp_t; void supl_ulp_free(supl_ulp_t *pdu); int supl_ulp_encode(supl_ulp_t *pdu); int supl_ulp_decode(supl_ulp_t *pdu); int supl_decode_rrlp(supl_ulp_t *pdu, PDU_t **rrlp); int supl_collect_rrlp(supl_assist_t *assist, PDU_t *rrlp, struct timeval *t); int supl_server_connect(supl_ctx_t *ctx, char *server); void supl_close(supl_ctx_t *ctx); int supl_ulp_send(supl_ctx_t *ctx, supl_ulp_t *pdu); int supl_ulp_recv(supl_ctx_t *ctx, supl_ulp_t *pdu); #endif gnss-sdr-0.0.9/src/core/receiver/000077500000000000000000000000001305042567700166145ustar00rootroot00000000000000gnss-sdr-0.0.9/src/core/receiver/CMakeLists.txt000066400000000000000000000131161305042567700213560ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # set(GNSS_RECEIVER_SOURCES control_thread.cc control_message_factory.cc file_configuration.cc gnss_block_factory.cc gnss_flowgraph.cc in_memory_configuration.cc ) if(PC_GNURADIO_RUNTIME_VERSION VERSION_GREATER 3.7.3) add_definitions(-DMODERN_GNURADIO=1) endif(PC_GNURADIO_RUNTIME_VERSION VERSION_GREATER 3.7.3) if(ENABLE_CUDA) add_definitions(-DCUDA_GPU_ACCEL=1) set(OPT_RECEIVER_INCLUDE_DIRS ${OPT_RECEIVER_INCLUDE_DIRS} ${CUDA_INCLUDE_DIRS}) endif(ENABLE_CUDA) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/interfaces ${CMAKE_SOURCE_DIR}/src/core/libs ${CMAKE_SOURCE_DIR}/src/core/libs/supl ${CMAKE_SOURCE_DIR}/src/core/libs/supl/asn-rrlp ${CMAKE_SOURCE_DIR}/src/core/libs/supl/asn-supl ${CMAKE_SOURCE_DIR}/src/algorithms/libs ${CMAKE_SOURCE_DIR}/src/algorithms/signal_source/libs ${CMAKE_SOURCE_DIR}/src/algorithms/signal_source/adapters ${CMAKE_SOURCE_DIR}/src/algorithms/signal_source/gnuradio_blocks ${CMAKE_SOURCE_DIR}/src/algorithms/channel/adapters ${CMAKE_SOURCE_DIR}/src/algorithms/channel/libs ${CMAKE_SOURCE_DIR}/src/algorithms/conditioner/adapters ${CMAKE_SOURCE_DIR}/src/algorithms/data_type_adapter/adapters ${CMAKE_SOURCE_DIR}/src/algorithms/data_type_adapter/gnuradio_blocks ${CMAKE_SOURCE_DIR}/src/algorithms/resampler/adapters ${CMAKE_SOURCE_DIR}/src/algorithms/input_filter/adapters ${CMAKE_SOURCE_DIR}/src/algorithms/input_filter/gnuradio_blocks ${CMAKE_SOURCE_DIR}/src/algorithms/acquisition/adapters ${CMAKE_SOURCE_DIR}/src/algorithms/acquisition/gnuradio_blocks ${CMAKE_SOURCE_DIR}/src/algorithms/tracking/adapters ${CMAKE_SOURCE_DIR}/src/algorithms/tracking/gnuradio_blocks ${CMAKE_SOURCE_DIR}/src/algorithms/tracking/libs ${CMAKE_SOURCE_DIR}/src/algorithms/telemetry_decoder/adapters ${CMAKE_SOURCE_DIR}/src/algorithms/telemetry_decoder/gnuradio_blocks ${CMAKE_SOURCE_DIR}/src/algorithms/telemetry_decoder/libs ${CMAKE_SOURCE_DIR}/src/algorithms/observables/adapters ${CMAKE_SOURCE_DIR}/src/algorithms/observables/gnuradio_blocks ${CMAKE_SOURCE_DIR}/src/algorithms/PVT/adapters ${CMAKE_SOURCE_DIR}/src/algorithms/PVT/gnuradio_blocks ${CMAKE_SOURCE_DIR}/src/algorithms/PVT/libs ${ARMADILLO_INCLUDE_DIRS} ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ${OPT_RECEIVER_INCLUDE_DIRS} ${VOLK_GNSSSDR_INCLUDE_DIRS} ) if(Boost_VERSION LESS 105000) add_definitions(-DOLD_BOOST=1) endif(Boost_VERSION LESS 105000) if(OPENSSL_FOUND) add_definitions( -DUSE_OPENSSL_FALLBACK=1 ) endif(OPENSSL_FOUND) if(ENABLE_GN3S) add_definitions(-DGN3S_DRIVER=1) endif(ENABLE_GN3S) if(ENABLE_ARRAY) add_definitions(-DRAW_ARRAY_DRIVER=1) endif(ENABLE_ARRAY) if(ENABLE_FLEXIBAND) add_definitions(-DFLEXIBAND_DRIVER=1) endif(ENABLE_FLEXIBAND) if(ENABLE_OSMOSDR) add_definitions(-DOSMOSDR_DRIVER=1) endif(ENABLE_OSMOSDR) if(ENABLE_UHD) add_definitions(-DUHD_DRIVER=1) endif(ENABLE_UHD) #Enable OpenCL if found in the system if(OPENCL_FOUND) message(STATUS "Adding processing blocks implemented using OpenCL" ) add_definitions(-DOPENCL_BLOCKS=1) else(OPENCL_FOUND) add_definitions(-DOPENCL_BLOCKS=0) endif(OPENCL_FOUND) add_definitions(-DGNSSSDR_INSTALL_DIR="${CMAKE_INSTALL_PREFIX}") file(GLOB GNSS_RECEIVER_HEADERS "*.h") list(SORT GNSS_RECEIVER_HEADERS) file(GLOB GNSS_RECEIVER_INTERFACE_HEADERS "../interfaces/*.h") list(SORT GNSS_RECEIVER_INTERFACE_HEADERS) add_library(gnss_rx ${GNSS_RECEIVER_SOURCES} ${GNSS_RECEIVER_HEADERS} ${GNSS_RECEIVER_INTERFACE_HEADERS}) source_group(Headers FILES ${GNSS_RECEIVER_HEADERS} ${GNSS_RECEIVER_INTERFACE_HEADERS}) target_link_libraries(gnss_rx ${Boost_LIBRARIES} ${ARMADILLO_LIBRARIES} ${GNURADIO_RUNTIME_LIBRARIES} ${GNURADIO_BLOCKS_LIBRARIES} ${GNURADIO_FFT_LIBRARIES} ${GNURADIO_FILTER_LIBRARIES} gnss_system_parameters gnss_sp_libs signal_source_adapters datatype_adapters input_filter_adapters conditioner_adapters resampler_adapters acq_adapters tracking_lib tracking_adapters channel_adapters telemetry_decoder_adapters obs_adapters pvt_adapters pvt_lib rx_core_lib ) gnss-sdr-0.0.9/src/core/receiver/concurrent_map.h000066400000000000000000000054711305042567700220130ustar00rootroot00000000000000/*! * \file concurrent_map.h * \brief Interface of a thread-safe std::map * \author Javier Arribas, 2011. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_CONCURRENT_MAP_H #define GNSS_SDR_CONCURRENT_MAP_H #include #include #include template /*! * \brief This class implements a thread-safe std::map * */ class concurrent_map { typedef typename std::map::iterator Data_iterator; // iterator is scope dependent private: std::map the_map; boost::mutex the_mutex; public: void write(int key, Data const& data) { boost::mutex::scoped_lock lock(the_mutex); Data_iterator data_iter; data_iter = the_map.find(key); if (data_iter != the_map.end()) { data_iter->second = data; // update } else { the_map.insert(std::pair(key, data)); // insert SILENTLY fails if the item already exists in the map! } lock.unlock(); } std::map get_map_copy() { boost::mutex::scoped_lock lock(the_mutex); std::map map_aux = the_map; lock.unlock(); return map_aux; } size_t size() { boost::mutex::scoped_lock lock(the_mutex); size_t size_ = the_map.size(); lock.unlock(); return size_; } bool read(int key, Data& p_data) { boost::mutex::scoped_lock lock(the_mutex); Data_iterator data_iter; data_iter = the_map.find(key); if (data_iter != the_map.end()) { p_data = data_iter->second; lock.unlock(); return true; } else { lock.unlock(); return false; } } }; #endif gnss-sdr-0.0.9/src/core/receiver/concurrent_queue.h000066400000000000000000000051131305042567700223530ustar00rootroot00000000000000/*! * \file concurrent_queue.h * \brief Interface of a thread-safe std::queue * \author Javier Arribas, 2011. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_CONCURRENT_QUEUE_H #define GNSS_SDR_CONCURRENT_QUEUE_H #include #include template /*! * \brief This class implements a thread-safe std::queue * * Thread-safe object queue which uses the library * boost_thread to perform MUTEX based on the code available at * http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html */ class concurrent_queue { private: std::queue the_queue; mutable boost::mutex the_mutex; boost::condition_variable the_condition_variable; public: void push(Data const& data) { boost::mutex::scoped_lock lock(the_mutex); the_queue.push(data); lock.unlock(); the_condition_variable.notify_one(); } bool empty() const { boost::mutex::scoped_lock lock(the_mutex); return the_queue.empty(); } bool try_pop(Data& popped_value) { boost::mutex::scoped_lock lock(the_mutex); if(the_queue.empty()) { return false; } popped_value = the_queue.front(); the_queue.pop(); return true; } void wait_and_pop(Data& popped_value) { boost::mutex::scoped_lock lock(the_mutex); while(the_queue.empty()) { the_condition_variable.wait(lock); } popped_value = the_queue.front(); the_queue.pop(); } }; #endif gnss-sdr-0.0.9/src/core/receiver/control_message.h000066400000000000000000000030361305042567700221530ustar00rootroot00000000000000/*! * \file control_message.h * \brief Interface for the different control messages. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_CONTROL_MESSAGE_H_ #define GNSS_SDR_CONTROL_MESSAGE_H_ /*! * \brief This class defines the different Control Messages */ class ControlMessage { public: static unsigned int const ack_success = 0; static unsigned int const ack_failed = 1; static unsigned int const trk_failed = 2; static unsigned int const channel_init = 3; }; #endif /*GNSS_SDR_CONTROL_MESSAGE_H_*/ gnss-sdr-0.0.9/src/core/receiver/control_message_factory.cc000066400000000000000000000056551305042567700240510ustar00rootroot00000000000000/*! * \file control_message_factory.cc * \brief Implementation of a Control Message Factory * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "control_message_factory.h" #include using google::LogMessage; // Constructor ControlMessageFactory::ControlMessageFactory() {} // Destructor ControlMessageFactory::~ControlMessageFactory() {} boost::shared_ptr ControlMessageFactory::GetQueueMessage(unsigned int who, unsigned int what) { std::shared_ptr control_message = std::make_shared(); control_message->who = who; control_message->what = what; boost::shared_ptr queue_message = gr::message::make(0, 0, 0, sizeof(ControlMessage)); memcpy(queue_message->msg(), control_message.get(), sizeof(ControlMessage)); return queue_message; } std::shared_ptr>> ControlMessageFactory::GetControlMessages(boost::shared_ptr queue_message) { std::shared_ptr>> control_messages = std::make_shared>>(); unsigned int control_messages_count = queue_message->length() / sizeof(ControlMessage); if(queue_message->length() % sizeof(ControlMessage) != 0) { LOG(WARNING) << "Queue message has size " << queue_message->length() << ", which is not" << " multiple of control message size " << sizeof(ControlMessage); LOG(WARNING) << "Ignoring this queue message to prevent unexpected results."; return control_messages; } for(unsigned int i = 0; i < control_messages_count; i++) { control_messages->push_back(std::make_shared()); memcpy(control_messages->at(i).get(), queue_message->msg() + (i*sizeof(ControlMessage)), sizeof(ControlMessage)); } return control_messages; } gnss-sdr-0.0.9/src/core/receiver/control_message_factory.h000066400000000000000000000040161305042567700237010ustar00rootroot00000000000000/*! * \file control_message_factory.h * \brief Interface of a factory for control messages. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_CONTROL_MESSAGE_FACTORY_H_ #define GNSS_SDR_CONTROL_MESSAGE_FACTORY_H_ #include #include #include //! Message described by who sent it and what it says typedef struct ControlMessage_ { unsigned int who; unsigned int what; } ControlMessage ; /*! * \brief This class implements a factory for Control Messages. * * It encapsulates the complexity behind getting Queue Messages and associated Control Messages */ class ControlMessageFactory { public: //! Constructor ControlMessageFactory(); //! Virtual destructor virtual ~ControlMessageFactory(); boost::shared_ptr GetQueueMessage(unsigned int who, unsigned int what); std::shared_ptr>> GetControlMessages(gr::message::sptr queue_message); }; #endif /*GNSS_SDR_CONTROL_MESSAGE_FACTORY_H_*/ gnss-sdr-0.0.9/src/core/receiver/control_thread.cc000066400000000000000000000605051305042567700221400ustar00rootroot00000000000000/*! * \file control_thread.cc * \brief This class implements the receiver control plane * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * * GNSS Receiver Control Plane: connects the flowgraph, starts running it, * and while it does not stop, reads the control messages generated by the blocks, * process them, and apply the corresponding actions. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "control_thread.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "gps_ephemeris.h" #include "gps_iono.h" #include "gps_utc_model.h" #include "gps_almanac.h" #include "galileo_ephemeris.h" #include "galileo_iono.h" #include "galileo_utc_model.h" #include "galileo_almanac.h" #include "concurrent_queue.h" #include "concurrent_map.h" #include "gnss_flowgraph.h" #include "file_configuration.h" #include "control_message_factory.h" extern concurrent_map global_gps_acq_assist_map; extern concurrent_queue global_gps_acq_assist_queue; using google::LogMessage; DEFINE_string(config_file, std::string(GNSSSDR_INSTALL_DIR "/share/gnss-sdr/conf/default.conf"), "File containing the configuration parameters"); ControlThread::ControlThread() { configuration_ = std::make_shared(FLAGS_config_file); delete_configuration_ = false; init(); } ControlThread::ControlThread(std::shared_ptr configuration) { configuration_ = configuration; delete_configuration_ = false; init(); } ControlThread::~ControlThread() { // save navigation data to files // if (save_assistance_to_XML() == true) {} if(msqid != -1) msgctl(msqid, IPC_RMID, NULL); } /* * Runs the control thread that manages the receiver control plane * * This is the main loop that reads and process the control messages * 1- Connect the GNSS receiver flowgraph * 2- Start the GNSS receiver flowgraph * while (flowgraph_->running() && !stop)_{ * 3- Read control messages and process them } */ void ControlThread::run() { // Connect the flowgraph flowgraph_->connect(); if (flowgraph_->connected()) { LOG(INFO) << "Flowgraph connected"; } else { LOG(ERROR) << "Unable to connect flowgraph"; return; } // Start the flowgraph flowgraph_->start(); if (flowgraph_->running()) { LOG(INFO) << "Flowgraph started"; } else { LOG(ERROR) << "Unable to start flowgraph"; return; } //launch GNSS assistance process AFTER the flowgraph is running because the GNURadio asynchronous queues must be already running to transport msgs assist_GNSS(); // start the keyboard_listener thread keyboard_thread_ = boost::thread(&ControlThread::keyboard_listener, this); sysv_queue_thread_ = boost::thread(&ControlThread::sysv_queue_listener, this); // Main loop to read and process the control messages while (flowgraph_->running() && !stop_) { //TODO re-enable the blocking read messages functions and fork the process read_control_messages(); if (control_messages_ != 0) process_control_messages(); } std::cout << "Stopping GNSS-SDR, please wait!" << std::endl; flowgraph_->stop(); stop_ = true; //Join keyboard thread #ifdef OLD_BOOST keyboard_thread_.timed_join(boost::posix_time::seconds(1)); sysv_queue_thread_.timed_join(boost::posix_time::seconds(1)); #endif #ifndef OLD_BOOST keyboard_thread_.try_join_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(1000)); sysv_queue_thread_.try_join_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(1000)); #endif LOG(INFO) << "Flowgraph stopped"; } void ControlThread::set_control_queue(boost::shared_ptr control_queue) { if (flowgraph_->running()) { LOG(WARNING) << "Unable to set control queue while flowgraph is running"; return; } control_queue_ = control_queue; } /* * Returns true if reading was successful */ bool ControlThread::read_assistance_from_XML() { // return variable (true == succeeded) bool ret = false; // getting names from the config file, if available std::string eph_xml_filename = configuration_->property("GNSS-SDR.SUPL_gps_ephemeris_xml", eph_default_xml_filename); std::string utc_xml_filename = configuration_->property("GNSS-SDR.SUPL_gps_utc_model.xml", utc_default_xml_filename); std::string iono_xml_filename = configuration_->property("GNSS-SDR.SUPL_gps_iono_xml", iono_default_xml_filename); std::string ref_time_xml_filename = configuration_->property("GNSS-SDR.SUPL_gps_ref_time_xml", ref_time_default_xml_filename); std::string ref_location_xml_filename = configuration_->property("GNSS-SDR.SUPL_gps_ref_location_xml", ref_location_default_xml_filename); std::cout << "SUPL: Try read GPS ephemeris from XML file " << eph_xml_filename << std::endl; if (supl_client_ephemeris_.load_ephemeris_xml(eph_xml_filename) == true) { std::map::iterator gps_eph_iter; for(gps_eph_iter = supl_client_ephemeris_.gps_ephemeris_map.begin(); gps_eph_iter != supl_client_ephemeris_.gps_ephemeris_map.end(); gps_eph_iter++) { std::cout << "SUPL: Read XML Ephemeris for GPS SV " << gps_eph_iter->first << std::endl; std::shared_ptr tmp_obj = std::make_shared(gps_eph_iter->second); flowgraph_->send_telemetry_msg(pmt::make_any(tmp_obj)); } ret = true; } else { std::cout << "ERROR: SUPL client error reading XML" << std::endl; std::cout << "Disabling SUPL assistance..." << std::endl; } // Only look for {utc, iono, ref time, ref location} if SUPL is enabled bool enable_gps_supl_assistance = configuration_->property("GNSS-SDR.SUPL_gps_enabled", false); if (enable_gps_supl_assistance == true) { // Try to read UTC model from XML if (supl_client_acquisition_.load_utc_xml(utc_xml_filename) == true) { LOG(INFO) << "SUPL: Read XML UTC model"; std::shared_ptr tmp_obj = std::make_shared(supl_client_acquisition_.gps_utc); flowgraph_->send_telemetry_msg(pmt::make_any(tmp_obj)); } else { LOG(INFO) << "SUPL: couldn't read UTC model XML"; } // Try to read Iono model from XML if (supl_client_acquisition_.load_iono_xml(iono_xml_filename) == true) { LOG(INFO) << "SUPL: Read XML IONO model"; std::shared_ptr tmp_obj = std::make_shared(supl_client_acquisition_.gps_iono); flowgraph_->send_telemetry_msg(pmt::make_any(tmp_obj)); } else { LOG(INFO) << "SUPL: couldn't read IONO model XML"; } // Try to read Ref Time from XML if (supl_client_acquisition_.load_ref_time_xml(ref_time_xml_filename) == true) { LOG(INFO) << "SUPL: Read XML Ref Time"; std::shared_ptr tmp_obj = std::make_shared(supl_client_acquisition_.gps_time); flowgraph_->send_telemetry_msg(pmt::make_any(tmp_obj)); } else { LOG(INFO) << "SUPL: couldn't read Ref Time XML"; } // Try to read Ref Location from XML if (supl_client_acquisition_.load_ref_location_xml(ref_location_xml_filename) == true) { LOG(INFO) << "SUPL: Read XML Ref Location"; std::shared_ptr tmp_obj = std::make_shared(supl_client_acquisition_.gps_ref_loc); flowgraph_->send_telemetry_msg(pmt::make_any(tmp_obj)); } else { LOG(INFO) << "SUPL: couldn't read Ref Location XML"; } } return ret; } void ControlThread::assist_GNSS() { //######### GNSS Assistance ################################# // GNSS Assistance configuration bool enable_gps_supl_assistance = configuration_->property("GNSS-SDR.SUPL_gps_enabled", false); if (enable_gps_supl_assistance == true) //SUPL SERVER TEST. Not operational yet! { std::cout << "SUPL RRLP GPS assistance enabled!" << std::endl; std::string default_acq_server = "supl.nokia.com"; std::string default_eph_server = "supl.google.com"; supl_client_ephemeris_.server_name = configuration_->property("GNSS-SDR.SUPL_gps_ephemeris_server", default_acq_server); supl_client_acquisition_.server_name = configuration_->property("GNSS-SDR.SUPL_gps_acquisition_server", default_eph_server); supl_client_ephemeris_.server_port = configuration_->property("GNSS-SDR.SUPL_gps_ephemeris_port", 7275); supl_client_acquisition_.server_port = configuration_->property("GNSS-SDR.SUPL_gps_acquisition_port", 7275); supl_mcc = configuration_->property("GNSS-SDR.SUPL_MCC", 244); supl_mns = configuration_->property("GNSS-SDR.SUPL_MNS", 5); std::string default_lac = "0x59e2"; std::string default_ci = "0x31b0"; try { supl_lac = boost::lexical_cast(configuration_->property("GNSS-SDR.SUPL_LAC", default_lac)); } catch(boost::bad_lexical_cast &) { supl_lac = 0x59e2; } try { supl_ci = boost::lexical_cast(configuration_->property("GNSS-SDR.SUPL_CI", default_ci)); } catch(boost::bad_lexical_cast &) { supl_ci = 0x31b0; } bool SUPL_read_gps_assistance_xml = configuration_->property("GNSS-SDR.SUPL_read_gps_assistance_xml", false); if (SUPL_read_gps_assistance_xml == true) { // read assistance from file if (read_assistance_from_XML()) { std::cout << "GPS assistance data loaded from local XML file." << std::endl; } } else { // Request ephemeris from SUPL server int error; supl_client_ephemeris_.request = 1; std::cout << "SUPL: Try to read GPS ephemeris from SUPL server..." << std::endl; error = supl_client_ephemeris_.get_assistance(supl_mcc, supl_mns, supl_lac, supl_ci); if (error == 0) { std::map::iterator gps_eph_iter; for(gps_eph_iter = supl_client_ephemeris_.gps_ephemeris_map.begin(); gps_eph_iter != supl_client_ephemeris_.gps_ephemeris_map.end(); gps_eph_iter++) { std::cout << "SUPL: Received Ephemeris for GPS SV " << gps_eph_iter->first << std::endl; std::shared_ptr tmp_obj = std::make_shared(gps_eph_iter->second); flowgraph_->send_telemetry_msg(pmt::make_any(tmp_obj)); } //Save ephemeris to XML file std::string eph_xml_filename = configuration_->property("GNSS-SDR.SUPL_gps_ephemeris_xml", eph_default_xml_filename); if (supl_client_ephemeris_.save_ephemeris_map_xml(eph_xml_filename, supl_client_ephemeris_.gps_ephemeris_map) == true) { std::cout << "SUPL: XML Ephemeris file created" << std::endl; } else { std::cout << "SUPL: Failed to create XML Ephemeris file" << std::endl; } } else { std::cout << "ERROR: SUPL client for Ephemeris returned " << error << std::endl; std::cout << "Please check internet connection and SUPL server configuration" << error << std::endl; std::cout << "Trying to read ephemeris from XML file" << std::endl; if (read_assistance_from_XML() == false) { std::cout << "ERROR: Could not read Ephemeris file: Disabling SUPL assistance." << std::endl; } } // Request almanac , IONO and UTC Model supl_client_ephemeris_.request = 0; std::cout << "SUPL: Try read Almanac, Iono, Utc Model, Ref Time and Ref Location from SUPL server..." << std::endl; error = supl_client_ephemeris_.get_assistance(supl_mcc, supl_mns, supl_lac, supl_ci); if (error == 0) { std::map::iterator gps_alm_iter; for(gps_alm_iter = supl_client_ephemeris_.gps_almanac_map.begin(); gps_alm_iter != supl_client_ephemeris_.gps_almanac_map.end(); gps_alm_iter++) { std::cout << "SUPL: Received Almanac for GPS SV " << gps_alm_iter->first << std::endl; std::shared_ptr tmp_obj = std::make_shared(gps_alm_iter->second); flowgraph_->send_telemetry_msg(pmt::make_any(tmp_obj)); } if (supl_client_ephemeris_.gps_iono.valid == true) { std::cout << "SUPL: Received GPS Iono" << std::endl; std::shared_ptr tmp_obj = std::make_shared(supl_client_ephemeris_.gps_iono); flowgraph_->send_telemetry_msg(pmt::make_any(tmp_obj)); } if (supl_client_ephemeris_.gps_utc.valid == true) { std::cout << "SUPL: Received GPS UTC Model" << std::endl; std::shared_ptr tmp_obj = std::make_shared(supl_client_ephemeris_.gps_utc); flowgraph_->send_telemetry_msg(pmt::make_any(tmp_obj)); } } else { std::cout << "ERROR: SUPL client for Almanac returned " << error << std::endl; std::cout << "Please check internet connection and SUPL server configuration" << error << std::endl; std::cout << "Disabling SUPL assistance." << std::endl; } // Request acquisition assistance supl_client_acquisition_.request = 2; std::cout << "SUPL: Try read Acquisition assistance from SUPL server..." << std::endl; error = supl_client_acquisition_.get_assistance(supl_mcc, supl_mns, supl_lac, supl_ci); if (error == 0) { std::map::iterator gps_acq_iter; for(gps_acq_iter = supl_client_acquisition_.gps_acq_map.begin(); gps_acq_iter != supl_client_acquisition_.gps_acq_map.end(); gps_acq_iter++) { std::cout << "SUPL: Received Acquisition assistance for GPS SV " << gps_acq_iter->first << std::endl; global_gps_acq_assist_map.write(gps_acq_iter->second.i_satellite_PRN, gps_acq_iter->second); } if (supl_client_acquisition_.gps_ref_loc.valid == true) { std::cout << "SUPL: Received Ref Location (Acquisition Assistance)" << std::endl; std::shared_ptr tmp_obj = std::make_shared(supl_client_acquisition_.gps_ref_loc); flowgraph_->send_telemetry_msg(pmt::make_any(tmp_obj)); } if (supl_client_acquisition_.gps_time.valid == true) { std::cout << "SUPL: Received Ref Time (Acquisition Assistance)" << std::endl; std::shared_ptr tmp_obj = std::make_shared(supl_client_acquisition_.gps_time); flowgraph_->send_telemetry_msg(pmt::make_any(tmp_obj)); } } else { std::cout << "ERROR: SUPL client for Acquisition assistance returned " << error << std::endl; std::cout << "Please check internet connection and SUPL server configuration" << error << std::endl; std::cout << "Disabling SUPL assistance.." << std::endl; } } } } void ControlThread::init() { // Instantiates a control queue, a GNSS flowgraph, and a control message factory control_queue_ = gr::msg_queue::make(0); flowgraph_ = std::make_shared(configuration_, control_queue_); control_message_factory_ = std::make_shared(); stop_ = false; processed_control_messages_ = 0; applied_actions_ = 0; supl_mcc = 0; supl_mns = 0; supl_lac = 0; supl_ci = 0; msqid = -1; } void ControlThread::read_control_messages() { DLOG(INFO) << "Reading control messages from queue"; boost::shared_ptr queue_message = control_queue_->delete_head(); if (queue_message != 0) { control_messages_ = control_message_factory_->GetControlMessages(queue_message); } else { control_messages_->clear(); } } // Apply the corresponding control actions // TODO: May be it is better to move the apply_action state machine to the control_thread void ControlThread::process_control_messages() { for (unsigned int i = 0; i < control_messages_->size(); i++) { if (stop_) break; if (control_messages_->at(i)->who == 200) { apply_action(control_messages_->at(i)->what); } else { flowgraph_->apply_action(control_messages_->at(i)->who, control_messages_->at(i)->what); } processed_control_messages_++; } control_messages_->clear(); DLOG(INFO) << "Processed all control messages"; } void ControlThread::apply_action(unsigned int what) { switch (what) { case 0: DLOG(INFO) << "Received action STOP"; stop_ = true; applied_actions_++; break; default: DLOG(INFO) << "Unrecognized action."; break; } } void ControlThread::gps_acq_assist_data_collector() { // ############ 1.bis READ EPHEMERIS/UTC_MODE/IONO QUEUE #################### Gps_Acq_Assist gps_acq; Gps_Acq_Assist gps_acq_old; while(stop_ == false) { global_gps_acq_assist_queue.wait_and_pop(gps_acq); if(gps_acq.i_satellite_PRN == 0) break; // DEBUG MESSAGE std::cout << "Acquisition assistance record has arrived from SAT ID " << gps_acq.i_satellite_PRN << " with Doppler " << gps_acq.d_Doppler0 << " [Hz] "<< std::endl; // insert new acq record to the global ephemeris map if (global_gps_acq_assist_map.read(gps_acq.i_satellite_PRN,gps_acq_old)) { std::cout << "Acquisition assistance record updated" << std::endl; global_gps_acq_assist_map.write(gps_acq.i_satellite_PRN, gps_acq); } else { // insert new acq record LOG(INFO) << "New acq assist record inserted"; global_gps_acq_assist_map.write(gps_acq.i_satellite_PRN, gps_acq); } } } void ControlThread::sysv_queue_listener() { typedef struct { long mtype; // required by SysV queue messaging double stop_message; } stop_msgbuf; bool read_queue = true; stop_msgbuf msg; double received_message = 0.0; int msgrcv_size = sizeof(msg.stop_message); key_t key = 1102; if((msqid = msgget(key, 0644 | IPC_CREAT )) == -1) { perror("GNSS-SDR cannot create SysV message queues"); exit(1); } while(read_queue && !stop_) { if (msgrcv(msqid, &msg, msgrcv_size, 1, 0) != -1) { received_message = msg.stop_message; if( (std::abs(received_message - (-200.0)) < 10 * std::numeric_limits::epsilon()) ) { std::cout << "Quit order received, stopping GNSS-SDR !!" << std::endl; std::unique_ptr cmf(new ControlMessageFactory()); if (control_queue_ != gr::msg_queue::sptr()) { control_queue_->handle(cmf->GetQueueMessage(200, 0)); } read_queue = false; } } } } void ControlThread::keyboard_listener() { bool read_keys = true; char c = '0'; while(read_keys && !stop_) { std::cin.get(c); if (c == 'q') { std::cout << "Quit keystroke order received, stopping GNSS-SDR !!" << std::endl; std::unique_ptr cmf(new ControlMessageFactory()); if (control_queue_ != gr::msg_queue::sptr()) { control_queue_->handle(cmf->GetQueueMessage(200, 0)); } read_keys = false; } usleep(500000); } } gnss-sdr-0.0.9/src/core/receiver/control_thread.h000066400000000000000000000127011305042567700217750ustar00rootroot00000000000000/*! * \file control_thread.h * \brief Interface of the receiver control plane * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * * GNSS Receiver Control Plane: connects the flowgraph, starts running it, * and while it does not stop, reads the control messages generated by the blocks, * processes them, and applies the corresponding actions. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_CONTROL_THREAD_H_ #define GNSS_SDR_CONTROL_THREAD_H_ #include #include #include #include #include "control_message_factory.h" #include "gnss_sdr_supl_client.h" class GNSSFlowgraph; class ConfigurationInterface; /*! * \brief This class represents the main thread of the application, so the name is ControlThread. * This is the GNSS Receiver Control Plane: it connects the flowgraph, starts running it, * and while it does not stop, reads the control messages generated by the blocks, * processes them, and applies the corresponding actions. */ class ControlThread { public: /*! * \brief Default constructor */ ControlThread(); /*! * \brief Constructor that initializes the class with parameters * * \param[in] configuration Pointer to a ConfigurationInterface */ ControlThread(std::shared_ptr configuration); //! \brief Destructor ~ControlThread(); /*! \brief Runs the control thread * * This is the main loop that reads and process the control messages: * * - Connect the GNSS receiver flowgraph; * * - Start the GNSS receiver flowgraph; * * while (flowgraph_->running() && !stop_){ * * - Read control messages and process them; } */ void run(); /*! * \brief Sets the control_queue * * \param[in] boost::shared_ptr control_queue */ void set_control_queue(boost::shared_ptr control_queue); unsigned int processed_control_messages() { return processed_control_messages_; } unsigned int applied_actions() { return applied_actions_; } /*! * \brief Instantiates a flowgraph * * \return Returns a smart pointer to a flowgraph object */ std::shared_ptr flowgraph() { return flowgraph_; } private: //SUPL assistance classes gnss_sdr_supl_client supl_client_acquisition_; gnss_sdr_supl_client supl_client_ephemeris_; int supl_mcc; // Current network MCC (Mobile country code), 3 digits. int supl_mns; // Current network MNC (Mobile Network code), 2 or 3 digits. int supl_lac; // Current network LAC (Location area code),16 bits, 1-65520 are valid values. int supl_ci; // Cell Identity (16 bits, 0-65535 are valid values). void init(); // Read {ephemeris, iono, utc, ref loc, ref time} assistance from a local XML file previously recorded bool read_assistance_from_XML(); // Save {ephemeris, iono, utc, ref loc, ref time} assistance to a local XML file //bool save_assistance_to_XML(); void read_control_messages(); void process_control_messages(); /* * Blocking function that reads the GPS assistance queue */ void gps_acq_assist_data_collector(); /* * Read initial GNSS assistance from SUPL server or local XML files */ void assist_GNSS(); void apply_action(unsigned int what); std::shared_ptr flowgraph_; std::shared_ptr configuration_; boost::shared_ptr control_queue_; std::shared_ptr control_message_factory_; std::shared_ptr>> control_messages_; bool stop_; bool delete_configuration_; unsigned int processed_control_messages_; unsigned int applied_actions_; boost::thread keyboard_thread_; boost::thread sysv_queue_thread_; boost::thread gps_acq_assist_data_collector_thread_; void keyboard_listener(); void sysv_queue_listener(); int msqid; // default filename for assistance data const std::string eph_default_xml_filename = "./gps_ephemeris.xml"; const std::string utc_default_xml_filename = "./gps_utc_model.xml"; const std::string iono_default_xml_filename = "./gps_iono.xml"; const std::string ref_time_default_xml_filename = "./gps_ref_time.xml"; const std::string ref_location_default_xml_filename = "./gps_ref_location.xml"; }; #endif /*GNSS_SDR_CONTROL_THREAD_H_*/ gnss-sdr-0.0.9/src/core/receiver/file_configuration.cc000066400000000000000000000132161305042567700227740ustar00rootroot00000000000000/*! * \file file_configuration.cc * \brief Implementation of the interface ConfigurationInterface that reads the * configuration from a file. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * * This implementation has a text file as the source for the values of the parameters. * The file is in the INI format, containing sections and pairs of names and values. * For more information about the INI format, see http://en.wikipedia.org/wiki/INI_file * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "file_configuration.h" #include #include #include "INIReader.h" #include "string_converter.h" #include "in_memory_configuration.h" using google::LogMessage; FileConfiguration::FileConfiguration(std::string filename) { filename_ = filename; init(); } FileConfiguration::FileConfiguration() { filename_ = "./default_config_file.txt"; init(); } FileConfiguration::~FileConfiguration() { LOG(INFO) << "Destructor called"; } std::string FileConfiguration::property(std::string property_name, std::string default_value) { if(overrided_->is_present(property_name)) { return overrided_->property(property_name, default_value); } else { return ini_reader_->Get("GNSS-SDR", property_name, default_value); } } bool FileConfiguration::property(std::string property_name, bool default_value) { if(overrided_->is_present(property_name)) { return overrided_->property(property_name, default_value); } else { std::string empty = ""; return converter_->convert(property(property_name, empty), default_value); } } long FileConfiguration::property(std::string property_name, long default_value) { if(overrided_->is_present(property_name)) { return overrided_->property(property_name, default_value); } else { std::string empty = ""; return converter_->convert(property(property_name, empty), default_value); } } int FileConfiguration::property(std::string property_name, int default_value) { if(overrided_->is_present(property_name)) { return overrided_->property(property_name, default_value); } else { std::string empty = ""; return converter_->convert(property(property_name, empty), default_value); } } unsigned int FileConfiguration::property(std::string property_name, unsigned int default_value) { if(overrided_->is_present(property_name)) { return overrided_->property(property_name, default_value); } else { std::string empty = ""; return converter_->convert(property(property_name, empty), default_value); } } unsigned short FileConfiguration::property(std::string property_name, unsigned short default_value) { if(overrided_->is_present(property_name)) { return overrided_->property(property_name, default_value); } else { std::string empty = ""; return converter_->convert(property(property_name, empty), default_value); } } float FileConfiguration::property(std::string property_name, float default_value) { if(overrided_->is_present(property_name)) { return overrided_->property(property_name, default_value); } else { std::string empty = ""; return converter_->convert(property(property_name, empty), default_value); } } double FileConfiguration::property(std::string property_name, double default_value) { if(overrided_->is_present(property_name)) { return overrided_->property(property_name, default_value); } else { std::string empty = ""; return converter_->convert(property(property_name, empty), default_value); } } void FileConfiguration::set_property(std::string property_name, std::string value) { overrided_->set_property(property_name, value); } void FileConfiguration::init() { std::unique_ptr converter_(new StringConverter); overrided_ = std::make_shared(); ini_reader_ = std::make_shared(filename_); error_ = ini_reader_->ParseError(); if(error_ == 0) { DLOG(INFO) << "Configuration file " << filename_ << " opened with no errors"; } else if(error_ > 0) { LOG(WARNING) << "Configuration file " << filename_ << " contains errors in line " << error_; } else { LOG(WARNING) << "Unable to open configuration file " << filename_; } } gnss-sdr-0.0.9/src/core/receiver/file_configuration.h000066400000000000000000000062411305042567700226360ustar00rootroot00000000000000/*! * \file file_configuration.h * \brief A ConfigurationInterface that reads the configuration from a file. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * * This implementation has a text file as the source for the values of the parameters. * The file is in the INI format, containing sections and pairs of names and values. * For more information about the INI format, see http://en.wikipedia.org/wiki/INI_file * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_FILE_CONFIGURATION_H_ #define GNSS_SDR_FILE_CONFIGURATION_H_ #include "configuration_interface.h" #include #include class INIReader; class StringConverter; class InMemoryConfiguration; /*! * \brief This class is an implementation of the interface ConfigurationInterface * * Derived from ConfigurationInterface, this class implements an interface * to a configuration file. This implementation has a text file as the source * for the values of the parameters. * The file is in the INI format, containing sections and pairs of names and values. * For more information about the INI format, see http://en.wikipedia.org/wiki/INI_file */ class FileConfiguration : public ConfigurationInterface { public: FileConfiguration(std::string filename); FileConfiguration(); //! Virtual destructor ~FileConfiguration(); std::string property(std::string property_name, std::string default_value); bool property(std::string property_name, bool default_value); long property(std::string property_name, long default_value); int property(std::string property_name, int default_value); unsigned int property(std::string property_name, unsigned int default_value); unsigned short property(std::string property_name, unsigned short default_value); float property(std::string property_name, float default_value); double property(std::string property_name, double default_value); void set_property(std::string property_name, std::string value); private: void init(); std::string filename_; std::shared_ptr ini_reader_; std::shared_ptr overrided_; std::unique_ptr converter_; int error_; }; #endif /*GNSS_SDR_FILE_CONFIGURATION_H_*/ gnss-sdr-0.0.9/src/core/receiver/gnss_block_factory.cc000066400000000000000000001662221305042567700230070ustar00rootroot00000000000000/*! * \file gnss_block_factory.cc * \brief This class implements a factory that returns instances of GNSS blocks. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Luis Esteve, 2012. luis(at)epsilon-formacion.com * Javier Arribas, 2011. jarribas(at)cttc.es * * This class encapsulates the complexity behind the instantiation * of GNSS blocks. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gnss_block_factory.h" #include #include #include #include #include #include "configuration_interface.h" #include "in_memory_configuration.h" #include "gnss_block_interface.h" #include "pass_through.h" #include "file_signal_source.h" #include "nsr_file_signal_source.h" #include "two_bit_cpx_file_signal_source.h" #include "spir_file_signal_source.h" #include "rtl_tcp_signal_source.h" #include "two_bit_packed_file_signal_source.h" #include "channel.h" #include "signal_conditioner.h" #include "array_signal_conditioner.h" #include "byte_to_short.h" #include "ibyte_to_cbyte.h" #include "ibyte_to_cshort.h" #include "ibyte_to_complex.h" #include "ishort_to_cshort.h" #include "ishort_to_complex.h" #include "direct_resampler_conditioner.h" #include "fir_filter.h" #include "freq_xlating_fir_filter.h" #include "beamformer_filter.h" #include "gps_l1_ca_pcps_acquisition.h" #include "gps_l2_m_pcps_acquisition.h" #include "gps_l1_ca_pcps_multithread_acquisition.h" #include "gps_l1_ca_pcps_tong_acquisition.h" #include "gps_l1_ca_pcps_assisted_acquisition.h" #include "gps_l1_ca_pcps_acquisition_fine_doppler.h" #include "gps_l1_ca_pcps_quicksync_acquisition.h" #include "galileo_e1_pcps_ambiguous_acquisition.h" #include "galileo_e1_pcps_8ms_ambiguous_acquisition.h" #include "galileo_e1_pcps_tong_ambiguous_acquisition.h" #include "galileo_e1_pcps_cccwsr_ambiguous_acquisition.h" #include "galileo_e1_pcps_quicksync_ambiguous_acquisition.h" #include "galileo_e5a_noncoherent_iq_acquisition_caf.h" #include "gps_l1_ca_dll_pll_tracking.h" #include "gps_l1_ca_dll_pll_c_aid_tracking.h" #include "gps_l1_ca_tcp_connector_tracking.h" #include "galileo_e1_dll_pll_veml_tracking.h" #include "galileo_e1_tcp_connector_tracking.h" #include "galileo_e5a_dll_pll_tracking.h" #include "gps_l2_m_dll_pll_tracking.h" #include "gps_l1_ca_telemetry_decoder.h" #include "gps_l2c_telemetry_decoder.h" #include "galileo_e1b_telemetry_decoder.h" #include "galileo_e5a_telemetry_decoder.h" #include "sbas_l1_telemetry_decoder.h" #include "gps_l1_ca_observables.h" #include "gps_l2c_observables.h" #include "galileo_e1_observables.h" #include "galileo_e5a_observables.h" #include "hybrid_observables.h" #include "gps_l1_ca_pvt.h" #include "galileo_e1_pvt.h" #include "hybrid_pvt.h" #if OPENCL_BLOCKS #include "gps_l1_ca_pcps_opencl_acquisition.h" #endif #if GN3S_DRIVER #include "gn3s_signal_source.h" #endif #if RAW_ARRAY_DRIVER #include "raw_array_signal_source.h" #endif #if OSMOSDR_DRIVER #include "osmosdr_signal_source.h" #endif #if UHD_DRIVER #include "uhd_signal_source.h" #endif #if FLEXIBAND_DRIVER #include "flexiband_signal_source.h" #endif #if CUDA_GPU_ACCEL #include "gps_l1_ca_dll_pll_tracking_gpu.h" #endif using google::LogMessage; GNSSBlockFactory::GNSSBlockFactory() {} GNSSBlockFactory::~GNSSBlockFactory() {} std::unique_ptr GNSSBlockFactory::GetSignalSource( std::shared_ptr configuration, boost::shared_ptr queue, int ID) { std::string default_implementation = "File_Signal_Source"; std::string role = "SignalSource"; //backwards compatibility for old conf files if (ID != -1) { role = "SignalSource" + boost::lexical_cast(ID); } std::string implementation = configuration->property(role + ".implementation", default_implementation); LOG(INFO) << "Getting SignalSource with implementation " << implementation; return GetBlock(configuration, role, implementation, 0, 1, queue); } std::unique_ptr GNSSBlockFactory::GetSignalConditioner( std::shared_ptr configuration, int ID) { std::string default_implementation = "Pass_Through"; //backwards compatibility for old conf files std::string role_conditioner = "SignalConditioner" ; std::string role_datatypeadapter = "DataTypeAdapter"; std::string role_inputfilter = "InputFilter"; std::string role_resampler = "Resampler"; if (ID != -1) { role_conditioner = "SignalConditioner" + boost::lexical_cast(ID); role_datatypeadapter = "DataTypeAdapter" + boost::lexical_cast(ID); role_inputfilter = "InputFilter" + boost::lexical_cast(ID); role_resampler = "Resampler" + boost::lexical_cast(ID); } std::string signal_conditioner = configuration->property(role_conditioner + ".implementation", default_implementation); std::string data_type_adapter; std::string input_filter; std::string resampler; if(signal_conditioner.compare("Pass_Through") == 0) { data_type_adapter = "Pass_Through"; input_filter = "Pass_Through"; resampler = "Pass_Through"; } else { data_type_adapter = configuration->property(role_datatypeadapter + ".implementation", default_implementation); input_filter = configuration->property(role_inputfilter + ".implementation", default_implementation); resampler = configuration->property(role_resampler + ".implementation", default_implementation); } LOG(INFO) << "Getting SignalConditioner with DataTypeAdapter implementation: " << data_type_adapter << ", InputFilter implementation: " << input_filter << ", and Resampler implementation: " << resampler; if(signal_conditioner.compare("Array_Signal_Conditioner") == 0) { //instantiate the array version std::unique_ptr conditioner_(new ArraySignalConditioner(configuration.get(), std::move(GetBlock(configuration, role_datatypeadapter, data_type_adapter, 1, 1)), std::move(GetBlock(configuration, role_inputfilter, input_filter, 1, 1)), std::move(GetBlock(configuration, role_resampler, resampler, 1, 1)), role_conditioner, "Signal_Conditioner")); return conditioner_; } else { //single-antenna version std::unique_ptr conditioner_(new SignalConditioner(configuration.get(), std::move(GetBlock(configuration, role_datatypeadapter, data_type_adapter, 1, 1)), std::move(GetBlock(configuration, role_inputfilter, input_filter, 1, 1)), std::move(GetBlock(configuration, role_resampler, resampler, 1, 1)), role_conditioner, "Signal_Conditioner")); return conditioner_; } } std::unique_ptr GNSSBlockFactory::GetObservables(std::shared_ptr configuration) { std::string default_implementation = "GPS_L1_CA_Observables"; std::string implementation = configuration->property("Observables.implementation", default_implementation); LOG(INFO) << "Getting Observables with implementation " << implementation; unsigned int Galileo_channels = configuration->property("Channels_1B.count", 0); Galileo_channels += configuration->property("Channels_5X.count", 0); unsigned int GPS_channels = configuration->property("Channels_1C.count", 0); GPS_channels += configuration->property("Channels_2S.count", 0); return GetBlock(configuration, "Observables", implementation, Galileo_channels + GPS_channels, Galileo_channels + GPS_channels); } std::unique_ptr GNSSBlockFactory::GetPVT(std::shared_ptr configuration) { std::string default_implementation = "Pass_Through"; std::string implementation = configuration->property("PVT.implementation", default_implementation); LOG(INFO) << "Getting PVT with implementation " << implementation; unsigned int Galileo_channels =configuration->property("Channels_1B.count", 0); Galileo_channels += configuration->property("Channels_5X.count", 0); unsigned int GPS_channels =configuration->property("Channels_1C.count", 0); GPS_channels += configuration->property("Channels_2S.count", 0); return GetBlock(configuration, "PVT", implementation, Galileo_channels + GPS_channels, 1); } //********* GPS L1 C/A CHANNEL ***************** std::unique_ptr GNSSBlockFactory::GetChannel_1C( std::shared_ptr configuration, std::string acq, std::string trk, std::string tlm, int channel, boost::shared_ptr queue) { //"appendix" is added to the "role" with the aim of Acquisition, Tracking and Telemetry Decoder adapters //can find their specific configurations when they read the config //TODO: REMOVE APPENDIX!! AND CHECK ALTERNATIVE MECHANISM TO GET PARTICULARIZED PARAMETERS LOG(INFO) << "Instantiating Channel " << channel << " with Acquisition Implementation: " << acq << ", Tracking Implementation: " << trk << ", Telemetry Decoder implementation: " << tlm; std::string aux = configuration->property("Acquisition_1C" + boost::lexical_cast(channel) + ".implementation", std::string("W")); std::string appendix1; if(aux.compare("W") != 0) { appendix1 = boost::lexical_cast(channel); } else { appendix1 = ""; } aux = configuration->property("Tracking_1C" + boost::lexical_cast(channel) + ".implementation", std::string("W")); std::string appendix2; if(aux.compare("W") != 0) { appendix2 = boost::lexical_cast(channel); } else { appendix2 = ""; } aux = configuration->property("TelemetryDecoder_1C" + boost::lexical_cast(channel) + ".implementation", std::string("W")); std::string appendix3; if(aux.compare("W") != 0) { appendix3 = boost::lexical_cast(channel); } else { appendix3 = ""; } // Automatically detect input data type std::shared_ptr config; config = std::make_shared(); std::string default_item_type = "gr_complex"; std::string acq_item_type = configuration->property("Acquisition_1C" + appendix1 + ".item_type", default_item_type); std::string trk_item_type = configuration->property("Tracking_1C" + appendix2 + ".item_type", default_item_type); if(acq_item_type.compare(trk_item_type)) { LOG(ERROR) << "Acquisition and Tracking blocks must have the same input data type!"; } config->set_property("Channel.item_type", acq_item_type); std::unique_ptr pass_through_ = GetBlock(config, "Channel", "Pass_Through", 1, 1, queue); std::unique_ptr acq_ = GetAcqBlock(configuration, "Acquisition_1C" + appendix1, acq, 1, 0); std::unique_ptr trk_ = GetTrkBlock(configuration, "Tracking_1C"+ appendix2, trk, 1, 1); std::unique_ptr tlm_ = GetTlmBlock(configuration, "TelemetryDecoder_1C" + appendix3, tlm, 1, 1); std::unique_ptr channel_(new Channel(configuration.get(), channel, std::move(pass_through_), std::move(acq_), std::move(trk_), std::move(tlm_), "Channel", "1C", queue)); return channel_; } //********* GPS L2C (M) CHANNEL ***************** std::unique_ptr GNSSBlockFactory::GetChannel_2S( std::shared_ptr configuration, std::string acq, std::string trk, std::string tlm, int channel, boost::shared_ptr queue) { LOG(INFO) << "Instantiating Channel " << channel << " with Acquisition Implementation: " << acq << ", Tracking Implementation: " << trk << ", Telemetry Decoder implementation: " << tlm; std::string aux = configuration->property("Acquisition_2S" + boost::lexical_cast(channel) + ".implementation", std::string("W")); std::string appendix1; if(aux.compare("W") != 0) { appendix1 = boost::lexical_cast(channel); } else { appendix1 = ""; } aux = configuration->property("Tracking_2S" + boost::lexical_cast(channel) + ".implementation", std::string("W")); std::string appendix2; if(aux.compare("W") != 0) { appendix2 = boost::lexical_cast(channel); } else { appendix2 = ""; } aux = configuration->property("TelemetryDecoder_2S" + boost::lexical_cast(channel) + ".implementation", std::string("W")); std::string appendix3; if(aux.compare("W") != 0) { appendix3 = boost::lexical_cast(channel); } else { appendix3 = ""; } // Automatically detect input data type std::shared_ptr config; config = std::make_shared(); std::string default_item_type = "gr_complex"; std::string acq_item_type = configuration->property("Acquisition_2S" + appendix1 + ".item_type", default_item_type); std::string trk_item_type = configuration->property("Tracking_2S" + appendix2 + ".item_type", default_item_type); if(acq_item_type.compare(trk_item_type)) { LOG(ERROR) << "Acquisition and Tracking blocks must have the same input data type!"; } config->set_property("Channel.item_type", acq_item_type); std::unique_ptr pass_through_ = GetBlock(configuration, "Channel", "Pass_Through", 1, 1, queue); std::unique_ptr acq_ = GetAcqBlock(configuration, "Acquisition_2S" + appendix1 , acq, 1, 0); std::unique_ptr trk_ = GetTrkBlock(configuration, "Tracking_2S" + appendix2, trk, 1, 1); std::unique_ptr tlm_ = GetTlmBlock(configuration, "TelemetryDecoder_2S" + appendix3, tlm, 1, 1); std::unique_ptr channel_(new Channel(configuration.get(), channel, std::move(pass_through_), std::move(acq_), std::move(trk_), std::move(tlm_), "Channel", "2S", queue)); return channel_; } //********* GALILEO E1 B CHANNEL ***************** std::unique_ptr GNSSBlockFactory::GetChannel_1B( std::shared_ptr configuration, std::string acq, std::string trk, std::string tlm, int channel, boost::shared_ptr queue) { std::stringstream stream; stream << channel; std::string id = stream.str(); LOG(INFO) << "Instantiating Channel " << id << " with Acquisition Implementation: " << acq << ", Tracking Implementation: " << trk << ", Telemetry Decoder implementation: " << tlm; std::string aux = configuration->property("Acquisition_1B" + boost::lexical_cast(channel) + ".implementation", std::string("W")); std::string appendix1; if(aux.compare("W") != 0) { appendix1 = boost::lexical_cast(channel); } else { appendix1 = ""; } aux = configuration->property("Tracking_1B" + boost::lexical_cast(channel) + ".implementation", std::string("W")); std::string appendix2; if(aux.compare("W") != 0) { appendix2 = boost::lexical_cast(channel); } else { appendix2 = ""; } aux = configuration->property("TelemetryDecoder_1B" + boost::lexical_cast(channel) + ".implementation", std::string("W")); std::string appendix3; if(aux.compare("W") != 0) { appendix3 = boost::lexical_cast(channel); } else { appendix3 = ""; } // Automatically detect input data type std::shared_ptr config; config = std::make_shared(); std::string default_item_type = "gr_complex"; std::string acq_item_type = configuration->property("Acquisition_1B" + appendix1 + ".item_type", default_item_type); std::string trk_item_type = configuration->property("Tracking_1B" + appendix2 + ".item_type", default_item_type); if(acq_item_type.compare(trk_item_type)) { LOG(ERROR) << "Acquisition and Tracking blocks must have the same input data type!"; } config->set_property("Channel.item_type", acq_item_type); std::unique_ptr pass_through_ = GetBlock(configuration, "Channel", "Pass_Through", 1, 1, queue); std::unique_ptr acq_ = GetAcqBlock(configuration, "Acquisition_1B" + appendix1, acq, 1, 0); std::unique_ptr trk_ = GetTrkBlock(configuration, "Tracking_1B" + appendix2, trk, 1, 1); std::unique_ptr tlm_ = GetTlmBlock(configuration, "TelemetryDecoder_1B" + appendix3, tlm, 1, 1); std::unique_ptr channel_(new Channel(configuration.get(), channel, std::move(pass_through_), std::move(acq_), std::move(trk_), std::move(tlm_), "Channel", "1B", queue)); return channel_; } //********* GALILEO E5a CHANNEL ***************** std::unique_ptr GNSSBlockFactory::GetChannel_5X( std::shared_ptr configuration, std::string acq, std::string trk, std::string tlm, int channel, boost::shared_ptr queue) { std::stringstream stream; stream << channel; std::string id = stream.str(); LOG(INFO) << "Instantiating Channel " << id << " with Acquisition Implementation: " << acq << ", Tracking Implementation: " << trk << ", Telemetry Decoder implementation: " << tlm; std::string aux = configuration->property("Acquisition_5X" + boost::lexical_cast(channel) + ".implementation", std::string("W")); std::string appendix1; if(aux.compare("W") != 0) { appendix1 = boost::lexical_cast(channel); } else { appendix1 = ""; } aux = configuration->property("Tracking_5X" + boost::lexical_cast(channel) + ".implementation", std::string("W")); std::string appendix2; if(aux.compare("W") != 0) { appendix2 = boost::lexical_cast(channel); } else { appendix2 = ""; } aux = configuration->property("TelemetryDecoder_5X" + boost::lexical_cast(channel) + ".implementation", std::string("W")); std::string appendix3; if(aux.compare("W") != 0) { appendix3 = boost::lexical_cast(channel); } else { appendix3 = ""; } // Automatically detect input data type std::shared_ptr config; config = std::make_shared(); std::string default_item_type = "gr_complex"; std::string acq_item_type = configuration->property("Acquisition_5X" + appendix1 + ".item_type", default_item_type); std::string trk_item_type = configuration->property("Tracking_5X" + appendix2 + ".item_type", default_item_type); if(acq_item_type.compare(trk_item_type)) { LOG(ERROR) << "Acquisition and Tracking blocks must have the same input data type!"; } config->set_property("Channel.item_type", acq_item_type); std::unique_ptr pass_through_ = GetBlock(configuration, "Channel", "Pass_Through", 1, 1, queue); std::unique_ptr acq_ = GetAcqBlock(configuration, "Acquisition_5X" + appendix1, acq, 1, 0); std::unique_ptr trk_ = GetTrkBlock(configuration, "Tracking_5X" + appendix2, trk, 1, 1); std::unique_ptr tlm_ = GetTlmBlock(configuration, "TelemetryDecoder_5X" + appendix3, tlm, 1, 1); std::unique_ptr channel_(new Channel(configuration.get(), channel, std::move(pass_through_), std::move(acq_), std::move(trk_), std::move(tlm_), "Channel", "5X", queue)); return channel_; } std::unique_ptr>> GNSSBlockFactory::GetChannels( std::shared_ptr configuration, boost::shared_ptr queue) { std::string default_implementation = "Pass_Through"; std::string tracking_implementation; std::string telemetry_decoder_implementation; std::string acquisition_implementation; unsigned int channel_absolute_id = 0; unsigned int Channels_1C_count = configuration->property("Channels_1C.count", 0); unsigned int Channels_2S_count = configuration->property("Channels_2S.count", 0); unsigned int Channels_1B_count = configuration->property("Channels_1B.count", 0); unsigned int Channels_5X_count = configuration->property("Channels_5X.count", 0); unsigned int total_channels = Channels_1C_count + Channels_2S_count + Channels_1B_count + Channels_5X_count; std::unique_ptr>> channels(new std::vector>(total_channels)); //**************** GPS L1 C/A CHANNELS ********************** LOG(INFO) << "Getting " << Channels_1C_count << " GPS L1 C/A channels"; acquisition_implementation = configuration->property("Acquisition_1C.implementation", default_implementation); tracking_implementation = configuration->property("Tracking_1C.implementation", default_implementation); telemetry_decoder_implementation = configuration->property("TelemetryDecoder_1C.implementation", default_implementation); for (unsigned int i = 0; i < Channels_1C_count; i++) { //(i.e. Acquisition_1C0.implementation=xxxx) std::string acquisition_implementation_specific = configuration->property( "Acquisition_1C" + boost::lexical_cast(channel_absolute_id) + ".implementation", acquisition_implementation); //(i.e. Tracking_1C0.implementation=xxxx) std::string tracking_implementation_specific = configuration->property( "Tracking_1C" + boost::lexical_cast(channel_absolute_id) + ".implementation", tracking_implementation); std::string telemetry_decoder_implementation_specific = configuration->property( "TelemetryDecoder_1C" + boost::lexical_cast(channel_absolute_id) + ".implementation", telemetry_decoder_implementation); // Push back the channel to the vector of channels channels->at(channel_absolute_id) = std::move(GetChannel_1C(configuration, acquisition_implementation_specific, tracking_implementation_specific, telemetry_decoder_implementation_specific, channel_absolute_id, queue)); channel_absolute_id++; } //**************** GPS L2C (M) CHANNELS ********************** LOG(INFO)<< "Getting " << Channels_2S_count << " GPS L2C (M) channels"; tracking_implementation = configuration->property("Tracking_2S.implementation", default_implementation); telemetry_decoder_implementation = configuration->property("TelemetryDecoder_2S.implementation", default_implementation); acquisition_implementation = configuration->property("Acquisition_2S.implementation", default_implementation); for (unsigned int i = 0; i < Channels_2S_count; i++) { //(i.e. Acquisition_1C0.implementation=xxxx) std::string acquisition_implementation_specific = configuration->property( "Acquisition_2S" + boost::lexical_cast(channel_absolute_id) + ".implementation", acquisition_implementation); //(i.e. Tracking_1C0.implementation=xxxx) std::string tracking_implementation_specific = configuration->property( "Tracking_2S" + boost::lexical_cast(channel_absolute_id) + ".implementation", tracking_implementation); std::string telemetry_decoder_implementation_specific = configuration->property( "TelemetryDecoder_2S" + boost::lexical_cast(channel_absolute_id) + ".implementation", telemetry_decoder_implementation); // Push back the channel to the vector of channels channels->at(channel_absolute_id) = std::move(GetChannel_2S(configuration, acquisition_implementation_specific, tracking_implementation_specific, telemetry_decoder_implementation_specific, channel_absolute_id, queue)); channel_absolute_id++; } //**************** GALILEO E1 B (I/NAV OS) CHANNELS ********************** LOG(INFO) << "Getting " << Channels_1B_count << " GALILEO E1 B (I/NAV OS) channels"; tracking_implementation = configuration->property("Tracking_1B.implementation", default_implementation); telemetry_decoder_implementation = configuration->property("TelemetryDecoder_1B.implementation", default_implementation); acquisition_implementation = configuration->property("Acquisition_1B.implementation", default_implementation); for (unsigned int i = 0; i < Channels_1B_count; i++) { //(i.e. Acquisition_1C0.implementation=xxxx) std::string acquisition_implementation_specific = configuration->property( "Acquisition_1B" + boost::lexical_cast(channel_absolute_id) + ".implementation", acquisition_implementation); //(i.e. Tracking_1C0.implementation=xxxx) std::string tracking_implementation_specific = configuration->property( "Tracking_1B" + boost::lexical_cast(channel_absolute_id) + ".implementation", tracking_implementation); std::string telemetry_decoder_implementation_specific = configuration->property( "TelemetryDecoder_1B" + boost::lexical_cast(channel_absolute_id) + ".implementation", telemetry_decoder_implementation); // Push back the channel to the vector of channels channels->at(channel_absolute_id) = std::move(GetChannel_1B(configuration, acquisition_implementation_specific, tracking_implementation_specific, telemetry_decoder_implementation_specific, channel_absolute_id, queue)); channel_absolute_id++; } //**************** GALILEO E5a I (F/NAV OS) CHANNELS ********************** LOG(INFO) << "Getting " << Channels_5X_count << " GALILEO E5a I (F/NAV OS) channels"; tracking_implementation = configuration->property("Tracking_5X.implementation", default_implementation); telemetry_decoder_implementation = configuration->property("TelemetryDecoder_5X.implementation", default_implementation); acquisition_implementation = configuration->property("Acquisition_5X.implementation", default_implementation); for (unsigned int i = 0; i < Channels_5X_count; i++) { //(i.e. Acquisition_1C0.implementation=xxxx) std::string acquisition_implementation_specific = configuration->property( "Acquisition_5X" + boost::lexical_cast(channel_absolute_id) + ".implementation", acquisition_implementation); //(i.e. Tracking_1C0.implementation=xxxx) std::string tracking_implementation_specific = configuration->property( "Tracking_5X" + boost::lexical_cast(channel_absolute_id) + ".implementation", tracking_implementation); std::string telemetry_decoder_implementation_specific = configuration->property( "TelemetryDecoder_5X" + boost::lexical_cast(channel_absolute_id) + ".implementation", telemetry_decoder_implementation); // Push back the channel to the vector of channels channels->at(channel_absolute_id) = std::move(GetChannel_5X(configuration, acquisition_implementation_specific, tracking_implementation_specific, telemetry_decoder_implementation_specific, channel_absolute_id, queue)); channel_absolute_id++; } return channels; } /* * Returns the block with the required configuration and implementation * * PLEASE ADD YOUR NEW BLOCK HERE!! * * IMPORTANT NOTE: Acquisition, Tracking and telemetry blocks are only included here for testing purposes. * To be included in a channel they must be also be included in GetAcqBlock(), GetTrkBlock() and GetTlmBlock() * (see below) */ std::unique_ptr GNSSBlockFactory::GetBlock( std::shared_ptr configuration, std::string role, std::string implementation, unsigned int in_streams, unsigned int out_streams, boost::shared_ptr queue) { std::unique_ptr block; //PASS THROUGH ---------------------------------------------------------------- if (implementation.compare("Pass_Through") == 0) { std::unique_ptr block_(new Pass_Through(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } // SIGNAL SOURCES ------------------------------------------------------------- else if (implementation.compare("File_Signal_Source") == 0) { try { std::unique_ptr block_(new FileSignalSource(configuration.get(), role, in_streams, out_streams, queue)); block = std::move(block_); } catch (const std::exception &e) { std::cout << "GNSS-SDR program ended." << std::endl; exit(1); } } else if (implementation.compare("Nsr_File_Signal_Source") == 0) { try { std::unique_ptr block_(new NsrFileSignalSource(configuration.get(), role, in_streams, out_streams, queue)); block = std::move(block_); } catch (const std::exception &e) { std::cout << "GNSS-SDR program ended." << std::endl; exit(1); } } #if MODERN_GNURADIO else if (implementation.compare("Two_Bit_Cpx_File_Signal_Source") == 0) { try { std::unique_ptr block_(new TwoBitCpxFileSignalSource(configuration.get(), role, in_streams, out_streams, queue)); block = std::move(block_); } catch (const std::exception &e) { std::cout << "GNSS-SDR program ended." << std::endl; exit(1); } } else if(implementation.compare("Two_Bit_Packed_File_Signal_Source") == 0 ) { try { std::unique_ptr block_(new TwoBitPackedFileSignalSource(configuration.get(), role, in_streams, out_streams, queue)); block = std::move(block_); } catch(const std::exception &e) { std::cout << "GNSS-SDR program ended." << std::endl; exit(1); } } #endif else if (implementation.compare("Spir_File_Signal_Source") == 0) { try { std::unique_ptr block_(new SpirFileSignalSource(configuration.get(), role, in_streams, out_streams, queue)); block = std::move(block_); } catch (const std::exception &e) { std::cout << "GNSS-SDR program ended." << std::endl; exit(1); } } else if (implementation.compare("RtlTcp_Signal_Source") == 0) { try { std::unique_ptr block_(new RtlTcpSignalSource(configuration.get(), role, in_streams, out_streams, queue)); block = std::move(block_); } catch (const std::exception &e) { std::cout << "GNSS-SDR program ended." << std::endl; exit(1); } } #if UHD_DRIVER else if (implementation.compare("UHD_Signal_Source") == 0) { std::unique_ptr block_(new UhdSignalSource(configuration.get(), role, in_streams, out_streams, queue)); block = std::move(block_); } #endif #if GN3S_DRIVER else if (implementation.compare("GN3S_Signal_Source") == 0) { std::unique_ptr block_(new Gn3sSignalSource(configuration.get(), role, in_streams, out_streams, queue)); block = std::move(block_); } #endif #if RAW_ARRAY_DRIVER else if (implementation.compare("Raw_Array_Signal_Source") == 0) { std::unique_ptr block_(new RawArraySignalSource(configuration.get(), role, in_streams, out_streams, queue)); block = std::move(block_); } #endif #if OSMOSDR_DRIVER else if (implementation.compare("Osmosdr_Signal_Source") == 0) { std::unique_ptr block_(new OsmosdrSignalSource(configuration.get(), role, in_streams, out_streams, queue)); block = std::move(block_); } #endif #if FLEXIBAND_DRIVER else if (implementation.compare("Flexiband_Signal_Source") == 0) { std::unique_ptr block_(new FlexibandSignalSource(configuration.get(), role, in_streams, out_streams, queue)); block = std::move(block_); } #endif // DATA TYPE ADAPTER ----------------------------------------------------------- else if (implementation.compare("Byte_To_Short") == 0) { std::unique_ptrblock_(new ByteToShort(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Ibyte_To_Cbyte") == 0) { std::unique_ptrblock_(new IbyteToCbyte(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Ibyte_To_Cshort") == 0) { std::unique_ptrblock_(new IbyteToCshort(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Ibyte_To_Complex") == 0) { std::unique_ptrblock_(new IbyteToComplex(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Ishort_To_Cshort") == 0) { std::unique_ptrblock_(new IshortToCshort(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Ishort_To_Complex") == 0) { std::unique_ptrblock_(new IshortToComplex(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } // INPUT FILTER ---------------------------------------------------------------- else if (implementation.compare("Fir_Filter") == 0) { std::unique_ptr block_(new FirFilter(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Freq_Xlating_Fir_Filter") == 0) { std::unique_ptr block_(new FreqXlatingFirFilter(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Beamformer_Filter") == 0) { std::unique_ptr block_(new BeamformerFilter(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } // RESAMPLER ------------------------------------------------------------------- else if (implementation.compare("Direct_Resampler") == 0) { std::unique_ptr block_(new DirectResamplerConditioner(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } // ACQUISITION BLOCKS --------------------------------------------------------- else if (implementation.compare("GPS_L1_CA_PCPS_Acquisition") == 0) { std::unique_ptr block_(new GpsL1CaPcpsAcquisition(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("GPS_L1_CA_PCPS_Assisted_Acquisition") == 0) { std::unique_ptr block_(new GpsL1CaPcpsAssistedAcquisition(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("GPS_L1_CA_PCPS_Tong_Acquisition") == 0) { std::unique_ptr block_(new GpsL1CaPcpsTongAcquisition(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("GPS_L1_CA_PCPS_Multithread_Acquisition") == 0) { std::unique_ptr block_(new GpsL1CaPcpsMultithreadAcquisition(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } #if OPENCL_BLOCKS else if (implementation.compare("GPS_L1_CA_PCPS_OpenCl_Acquisition") == 0) { std::unique_ptr block_(new GpsL1CaPcpsOpenClAcquisition(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } #endif else if (implementation.compare("GPS_L1_CA_PCPS_Acquisition_Fine_Doppler") == 0) { std::unique_ptr block_(new GpsL1CaPcpsAcquisitionFineDoppler(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("GPS_L1_CA_PCPS_QuickSync_Acquisition") == 0) { std::unique_ptr block_( new GpsL1CaPcpsQuickSyncAcquisition(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Galileo_E1_PCPS_Ambiguous_Acquisition") == 0) { std::unique_ptr block_(new GalileoE1PcpsAmbiguousAcquisition(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Galileo_E1_PCPS_8ms_Ambiguous_Acquisition") == 0) { std::unique_ptr block_(new GalileoE1Pcps8msAmbiguousAcquisition(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Galileo_E1_PCPS_Tong_Ambiguous_Acquisition") == 0) { std::unique_ptr block_(new GalileoE1PcpsTongAmbiguousAcquisition(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Galileo_E1_PCPS_CCCWSR_Ambiguous_Acquisition") == 0) { std::unique_ptr block_(new GalileoE1PcpsCccwsrAmbiguousAcquisition(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Galileo_E5a_Noncoherent_IQ_Acquisition_CAF") == 0) { std::unique_ptr block_(new GalileoE5aNoncoherentIQAcquisitionCaf(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Galileo_E1_PCPS_QuickSync_Ambiguous_Acquisition") == 0) { std::unique_ptr block_( new GalileoE1PcpsQuickSyncAmbiguousAcquisition(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } // TRACKING BLOCKS ------------------------------------------------------------- else if (implementation.compare("GPS_L1_CA_DLL_PLL_Tracking") == 0) { std::unique_ptr block_(new GpsL1CaDllPllTracking(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("GPS_L1_CA_DLL_PLL_C_Aid_Tracking") == 0) { std::unique_ptr block_(new GpsL1CaDllPllCAidTracking(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("GPS_L1_CA_TCP_CONNECTOR_Tracking") == 0) { std::unique_ptr block_(new GpsL1CaTcpConnectorTracking(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("GPS_L2_M_DLL_PLL_Tracking") == 0) { std::unique_ptr block_(new GpsL2MDllPllTracking(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } #if CUDA_GPU_ACCEL else if (implementation.compare("GPS_L1_CA_DLL_PLL_Tracking_GPU") == 0) { std::unique_ptr block_(new GpsL1CaDllPllTrackingGPU(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } #endif else if (implementation.compare("Galileo_E1_DLL_PLL_VEML_Tracking") == 0) { std::unique_ptr block_(new GalileoE1DllPllVemlTracking(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Galileo_E1_TCP_CONNECTOR_Tracking") == 0) { std::unique_ptr block_(new GalileoE1TcpConnectorTracking(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Galileo_E5a_DLL_PLL_Tracking") == 0) { std::unique_ptr block_(new GalileoE5aDllPllTracking(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } // TELEMETRY DECODERS ---------------------------------------------------------- else if (implementation.compare("GPS_L1_CA_Telemetry_Decoder") == 0) { std::unique_ptr block_(new GpsL1CaTelemetryDecoder(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("GPS_L2C_Telemetry_Decoder") == 0) { std::unique_ptr block_(new GpsL2CTelemetryDecoder(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Galileo_E1B_Telemetry_Decoder") == 0) { std::unique_ptr block_(new GalileoE1BTelemetryDecoder(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("SBAS_L1_Telemetry_Decoder") == 0) { std::unique_ptr block_(new SbasL1TelemetryDecoder(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Galileo_E5a_Telemetry_Decoder") == 0) { std::unique_ptr block_(new GalileoE5aTelemetryDecoder(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } // OBSERVABLES ----------------------------------------------------------------- else if (implementation.compare("GPS_L1_CA_Observables") == 0) { std::unique_ptr block_(new GpsL1CaObservables(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("GPS_L2C_Observables") == 0) { std::unique_ptr block_(new GpsL2CObservables(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Galileo_E1B_Observables") == 0) { std::unique_ptr block_(new GalileoE1Observables(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Galileo_E5A_Observables") == 0) { std::unique_ptr block_(new GalileoE5aObservables(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Hybrid_Observables") == 0) { std::unique_ptr block_(new HybridObservables(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } // PVT ------------------------------------------------------------------------- else if (implementation.compare("GPS_L1_CA_PVT") == 0) { std::unique_ptr block_(new GpsL1CaPvt(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("GALILEO_E1_PVT") == 0) { std::unique_ptr block_(new GalileoE1Pvt(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Hybrid_PVT") == 0) { std::unique_ptr block_(new HybridPvt(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else { // Log fatal. This causes execution to stop. LOG(ERROR) << role << "." << implementation << ": Undefined implementation for block"; } return std::move(block); } /* * * PLEASE ADD YOUR NEW BLOCK HERE!! * * Not very elegant, Acq, Trk and Tlm blocks must be added here, too. * To be improved! */ std::unique_ptr GNSSBlockFactory::GetAcqBlock( std::shared_ptr configuration, std::string role, std::string implementation, unsigned int in_streams, unsigned int out_streams) { std::unique_ptr block; // ACQUISITION BLOCKS --------------------------------------------------------- if (implementation.compare("GPS_L1_CA_PCPS_Acquisition") == 0) { std::unique_ptr block_(new GpsL1CaPcpsAcquisition(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("GPS_L1_CA_PCPS_Assisted_Acquisition") == 0) { std::unique_ptr block_(new GpsL1CaPcpsAssistedAcquisition(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("GPS_L1_CA_PCPS_Tong_Acquisition") == 0) { std::unique_ptr block_(new GpsL1CaPcpsTongAcquisition(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("GPS_L1_CA_PCPS_Multithread_Acquisition") == 0) { std::unique_ptr block_(new GpsL1CaPcpsMultithreadAcquisition(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } #if OPENCL_BLOCKS else if (implementation.compare("GPS_L1_CA_PCPS_OpenCl_Acquisition") == 0) { std::unique_ptr block_(new GpsL1CaPcpsOpenClAcquisition(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } #endif else if (implementation.compare("GPS_L1_CA_PCPS_Acquisition_Fine_Doppler") == 0) { std::unique_ptr block_(new GpsL1CaPcpsAcquisitionFineDoppler(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("GPS_L1_CA_PCPS_QuickSync_Acquisition") == 0) { std::unique_ptr block_( new GpsL1CaPcpsQuickSyncAcquisition(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("GPS_L2_M_PCPS_Acquisition") == 0) { std::unique_ptr block_(new GpsL2MPcpsAcquisition(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Galileo_E1_PCPS_Ambiguous_Acquisition") == 0) { std::unique_ptr block_(new GalileoE1PcpsAmbiguousAcquisition(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Galileo_E1_PCPS_8ms_Ambiguous_Acquisition") == 0) { std::unique_ptr block_(new GalileoE1Pcps8msAmbiguousAcquisition(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Galileo_E1_PCPS_Tong_Ambiguous_Acquisition") == 0) { std::unique_ptr block_(new GalileoE1PcpsTongAmbiguousAcquisition(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Galileo_E1_PCPS_CCCWSR_Ambiguous_Acquisition") == 0) { std::unique_ptr block_(new GalileoE1PcpsCccwsrAmbiguousAcquisition(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Galileo_E1_PCPS_QuickSync_Ambiguous_Acquisition") == 0) { std::unique_ptr block_( new GalileoE1PcpsQuickSyncAmbiguousAcquisition(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Galileo_E5a_Noncoherent_IQ_Acquisition_CAF") == 0) { std::unique_ptr block_(new GalileoE5aNoncoherentIQAcquisitionCaf(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else { // Log fatal. This causes execution to stop. LOG(ERROR) << role << "." << implementation << ": Undefined implementation for block"; } return std::move(block); } std::unique_ptr GNSSBlockFactory::GetTrkBlock( std::shared_ptr configuration, std::string role, std::string implementation, unsigned int in_streams, unsigned int out_streams) { std::unique_ptr block; // TRACKING BLOCKS ------------------------------------------------------------- if (implementation.compare("GPS_L1_CA_DLL_PLL_Tracking") == 0) { std::unique_ptr block_(new GpsL1CaDllPllTracking(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("GPS_L1_CA_DLL_PLL_C_Aid_Tracking") == 0) { std::unique_ptr block_(new GpsL1CaDllPllCAidTracking(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("GPS_L1_CA_TCP_CONNECTOR_Tracking") == 0) { std::unique_ptr block_(new GpsL1CaTcpConnectorTracking(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Galileo_E1_DLL_PLL_VEML_Tracking") == 0) { std::unique_ptr block_(new GalileoE1DllPllVemlTracking(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Galileo_E1_TCP_CONNECTOR_Tracking") == 0) { std::unique_ptr block_(new GalileoE1TcpConnectorTracking(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Galileo_E5a_DLL_PLL_Tracking") == 0) { std::unique_ptr block_(new GalileoE5aDllPllTracking(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("GPS_L2_M_DLL_PLL_Tracking") == 0) { std::unique_ptr block_(new GpsL2MDllPllTracking(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } #if CUDA_GPU_ACCEL else if (implementation.compare("GPS_L1_CA_DLL_PLL_Tracking_GPU") == 0) { std::unique_ptr block_(new GpsL1CaDllPllTrackingGPU(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } #endif else { // Log fatal. This causes execution to stop. LOG(ERROR) << role << "." << implementation << ": Undefined implementation for block"; } return std::move(block); } std::unique_ptr GNSSBlockFactory::GetTlmBlock( std::shared_ptr configuration, std::string role, std::string implementation, unsigned int in_streams, unsigned int out_streams) { std::unique_ptr block; // TELEMETRY DECODERS ---------------------------------------------------------- if (implementation.compare("GPS_L1_CA_Telemetry_Decoder") == 0) { std::unique_ptr block_(new GpsL1CaTelemetryDecoder(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Galileo_E1B_Telemetry_Decoder") == 0) { std::unique_ptr block_(new GalileoE1BTelemetryDecoder(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("SBAS_L1_Telemetry_Decoder") == 0) { std::unique_ptr block_(new SbasL1TelemetryDecoder(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("Galileo_E5a_Telemetry_Decoder") == 0) { std::unique_ptr block_(new GalileoE5aTelemetryDecoder(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else if (implementation.compare("GPS_L2C_Telemetry_Decoder") == 0) { std::unique_ptr block_(new GpsL2CTelemetryDecoder(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } else { // Log fatal. This causes execution to stop. LOG(ERROR) << role << "." << implementation << ": Undefined implementation for block"; } return std::move(block); } gnss-sdr-0.0.9/src/core/receiver/gnss_block_factory.h000066400000000000000000000112621305042567700226420ustar00rootroot00000000000000/*! * \file gnss_block_factory.h * \brief Interface of a factory that returns smart pointers to GNSS blocks. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Luis Esteve, 2011. luis(at)epsilon-formacion.com * Javier Arribas, 2011. jarribas(at)cttc.es * Carles Fernandez-Prades, 2014. cfernandez(at)cttc.es * * This class encapsulates the complexity behind the instantiation * of GNSS blocks. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_BLOCK_FACTORY_H_ #define GNSS_SDR_BLOCK_FACTORY_H_ #include #include #include #include class ConfigurationInterface; class GNSSBlockInterface; class AcquisitionInterface; class TrackingInterface; class TelemetryDecoderInterface; /*! * \brief Class that produces all kinds of GNSS blocks */ class GNSSBlockFactory { public: GNSSBlockFactory(); virtual ~GNSSBlockFactory(); std::unique_ptr GetSignalSource(std::shared_ptr configuration, boost::shared_ptr queue, int ID = -1); std::unique_ptr GetSignalConditioner(std::shared_ptr configuration, int ID = -1); std::unique_ptr GetPVT(std::shared_ptr configuration); std::unique_ptr GetObservables(std::shared_ptr configuration); std::unique_ptr>> GetChannels(std::shared_ptr configuration, boost::shared_ptr queue); /* * \brief Returns the block with the required configuration and implementation */ std::unique_ptr GetBlock(std::shared_ptr configuration, std::string role, std::string implementation, unsigned int in_streams, unsigned int out_streams, boost::shared_ptr queue = nullptr); private: std::unique_ptr GetChannel_1C(std::shared_ptr configuration, std::string acq, std::string trk, std::string tlm, int channel, boost::shared_ptr queue); std::unique_ptr GetChannel_2S(std::shared_ptr configuration, std::string acq, std::string trk, std::string tlm, int channel, boost::shared_ptr queue); std::unique_ptr GetChannel_1B(std::shared_ptr configuration, std::string acq, std::string trk, std::string tlm, int channel, boost::shared_ptr queue); std::unique_ptr GetChannel_5X(std::shared_ptr configuration, std::string acq, std::string trk, std::string tlm, int channel, boost::shared_ptr queue); std::unique_ptr GetAcqBlock( std::shared_ptr configuration, std::string role, std::string implementation, unsigned int in_streams, unsigned int out_streams); std::unique_ptr GetTrkBlock( std::shared_ptr configuration, std::string role, std::string implementation, unsigned int in_streams, unsigned int out_streams); std::unique_ptr GetTlmBlock( std::shared_ptr configuration, std::string role, std::string implementation, unsigned int in_streams, unsigned int out_streams); }; #endif /*GNSS_SDR_BLOCK_FACTORY_H_*/ gnss-sdr-0.0.9/src/core/receiver/gnss_flowgraph.cc000066400000000000000000000721031305042567700221510ustar00rootroot00000000000000/*! * \file gnss_flowgraph.cc * \brief Implementation of a GNSS receiver flowgraph * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Luis Esteve, 2012. luis(at)epsilon-formacion.com * Carles Fernandez-Prades, 2014. cfernandez(at)cttc.es * * Detailed description of the file here if needed. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gnss_flowgraph.h" #include "unistd.h" #include #include #include #include #include #include #include #include #include "configuration_interface.h" #include "gnss_block_interface.h" #include "channel_interface.h" #include "gnss_block_factory.h" #define GNSS_SDR_ARRAY_SIGNAL_CONDITIONER_CHANNELS 8 using google::LogMessage; GNSSFlowgraph::GNSSFlowgraph(std::shared_ptr configuration, boost::shared_ptr queue) { connected_ = false; running_ = false; configuration_ = configuration; queue_ = queue; init(); } GNSSFlowgraph::~GNSSFlowgraph() {} void GNSSFlowgraph::start() { if (running_) { LOG(WARNING) << "Already running"; return; } try { top_block_->start(); } catch (std::exception& e) { LOG(WARNING) << "Unable to start flowgraph"; LOG(ERROR) << e.what(); return; } running_ = true; } void GNSSFlowgraph::stop() { // for (unsigned int i = 0; i < channels_count_; i++) // { // channels_.at(i)->stop_channel(); // LOG(INFO) << "Channel " << i << " in state " << channels_state_[i]; // } // LOG(INFO) << "Threads finished. Return to main program."; top_block_->stop(); running_ = false; } void GNSSFlowgraph::connect() { /* Connects the blocks in the flowgraph * * Signal Source > Signal conditioner >> Channels >> Observables >> PVT */ LOG(INFO) << "Connecting flowgraph"; if (connected_) { LOG(WARNING) << "flowgraph already connected"; return; } for (int i = 0; i < sources_count_; i++) { try { sig_source_.at(i)->connect(top_block_); } catch (std::exception& e) { LOG(INFO) << "Can't connect signal source block " << i << " internally"; LOG(ERROR) << e.what(); top_block_->disconnect_all(); return; } } // Signal Source > Signal conditioner > for (unsigned int i = 0; i < sig_conditioner_.size(); i++) { try { sig_conditioner_.at(i)->connect(top_block_); } catch (std::exception& e) { LOG(INFO) << "Can't connect signal conditioner block " << i << " internally"; LOG(ERROR) << e.what(); top_block_->disconnect_all(); return; } } for (unsigned int i = 0; i < channels_count_; i++) { try { channels_.at(i)->connect(top_block_); } catch (std::exception& e) { LOG(WARNING) << "Can't connect channel " << i << " internally"; LOG(ERROR) << e.what(); top_block_->disconnect_all(); return; } } try { observables_->connect(top_block_); } catch (std::exception& e) { LOG(WARNING) << "Can't connect observables block internally"; LOG(ERROR) << e.what(); top_block_->disconnect_all(); return; } // Signal Source > Signal conditioner >> Channels >> Observables > PVT try { pvt_->connect(top_block_); } catch (std::exception& e) { LOG(WARNING) << "Can't connect PVT block internally"; LOG(ERROR) << e.what(); top_block_->disconnect_all(); return; } DLOG(INFO) << "blocks connected internally"; // Signal Source (i) > Signal conditioner (i) > int RF_Channels = 0; int signal_conditioner_ID = 0; for (int i = 0; i < sources_count_; i++) { try { //TODO: Remove this array implementation and create generic multistream connector //(if a signal source has more than 1 stream, then connect it to the multistream signal conditioner) if(sig_source_.at(i)->implementation().compare("Raw_Array_Signal_Source") == 0) { //Multichannel Array std::cout << "ARRAY MODE" << std::endl; for (int j = 0; j < GNSS_SDR_ARRAY_SIGNAL_CONDITIONER_CHANNELS; j++) { std::cout << "connecting ch " << j << std::endl; top_block_->connect(sig_source_.at(i)->get_right_block(), j, sig_conditioner_.at(i)->get_left_block(), j); } } else { //TODO: Create a class interface for SignalSources, derived from GNSSBlockInterface. //Include GetRFChannels in the interface to avoid read config parameters here //read the number of RF channels for each front-end RF_Channels = configuration_->property(sig_source_.at(i)->role() + ".RF_channels", 1); for (int j = 0; j < RF_Channels; j++) { //Connect the multichannel signal source to multiple signal conditioners // GNURADIO max_streams=-1 means infinite ports! LOG(INFO) << "sig_source_.at(i)->get_right_block()->output_signature()->max_streams()=" << sig_source_.at(i)->get_right_block()->output_signature()->max_streams(); LOG(INFO) << "sig_conditioner_.at(signal_conditioner_ID)->get_left_block()->input_signature()=" << sig_conditioner_.at(signal_conditioner_ID)->get_left_block()->input_signature()->max_streams(); if (sig_source_.at(i)->get_right_block()->output_signature()->max_streams() > 1) { LOG(INFO) << "connecting sig_source_ " << i << " stream " << j << " to conditioner " << j; top_block_->connect(sig_source_.at(i)->get_right_block(), j, sig_conditioner_.at(signal_conditioner_ID)->get_left_block(), 0); } else { if (j == 0) { // RF_channel 0 backward compatibility with single channel sources LOG(INFO) << "connecting sig_source_ " << i << " stream " << 0 << " to conditioner " << j; top_block_->connect(sig_source_.at(i)->get_right_block(), 0, sig_conditioner_.at(signal_conditioner_ID)->get_left_block(), 0); } else { // Multiple channel sources using multiple output blocks of single channel (requires RF_channel selector in call) LOG(INFO) << "connecting sig_source_ " << i << " stream " << j << " to conditioner " << j; top_block_->connect(sig_source_.at(i)->get_right_block(j), 0, sig_conditioner_.at(signal_conditioner_ID)->get_left_block(), 0); } } signal_conditioner_ID++; } } } catch (std::exception& e) { LOG(WARNING) << "Can't connect signal source " << i << " to signal conditioner " << i; LOG(ERROR) << e.what(); top_block_->disconnect_all(); return; } } DLOG(INFO) << "Signal source connected to signal conditioner"; // Signal conditioner (selected_signal_source) >> channels (i) (dependent of their associated SignalSource_ID) int selected_signal_conditioner_ID; for (unsigned int i = 0; i < channels_count_; i++) { selected_signal_conditioner_ID = configuration_->property("Channel" + boost::lexical_cast(i) + ".RF_channel_ID", 0); try { top_block_->connect(sig_conditioner_.at(selected_signal_conditioner_ID)->get_right_block(), 0, channels_.at(i)->get_left_block(), 0); } catch (std::exception& e) { LOG(WARNING) << "Can't connect signal conditioner " << selected_signal_conditioner_ID << " to channel " << i; LOG(ERROR) << e.what(); top_block_->disconnect_all(); return; } DLOG(INFO) << "signal conditioner " << selected_signal_conditioner_ID << " connected to channel " << i; // Signal Source > Signal conditioner >> Channels >> Observables try { top_block_->connect(channels_.at(i)->get_right_block(), 0, observables_->get_left_block(), i); } catch (std::exception& e) { LOG(WARNING) << "Can't connect channel " << i << " to observables"; LOG(ERROR) << e.what(); top_block_->disconnect_all(); return; } std::string gnss_signal = channels_.at(i)->get_signal().get_signal_str(); // use channel's implicit signal! while (gnss_signal.compare(available_GNSS_signals_.front().get_signal_str()) != 0 ) { available_GNSS_signals_.push_back(available_GNSS_signals_.front()); available_GNSS_signals_.pop_front(); } channels_.at(i)->set_signal(available_GNSS_signals_.front()); if (channels_state_[i] == 1) { channels_.at(i)->start_acquisition(); available_GNSS_signals_.pop_front(); LOG(INFO) << "Channel " << i << " assigned to " << available_GNSS_signals_.front(); LOG(INFO) << "Channel " << i << " connected to observables and ready for acquisition"; } else { LOG(INFO) << "Channel " << i << " connected to observables in standby mode"; } } /* * Connect the observables output of each channel to the PVT block */ try { for (unsigned int i = 0; i < channels_count_; i++) { top_block_->connect(observables_->get_right_block(), i, pvt_->get_left_block(), i); top_block_->msg_connect(channels_.at(i)->get_right_block(), pmt::mp("telemetry"), pvt_->get_left_block(), pmt::mp("telemetry")); } } catch (std::exception& e) { LOG(WARNING) << "Can't connect observables to PVT"; LOG(ERROR) << e.what(); top_block_->disconnect_all(); return; } connected_ = true; LOG(INFO) << "Flowgraph connected"; top_block_->dump(); } void GNSSFlowgraph::wait() { if (!running_) { LOG(WARNING) << "Can't apply wait. Flowgraph is not running"; return; } top_block_->wait(); DLOG(INFO) << "Flowgraph finished calculations"; running_ = false; } bool GNSSFlowgraph::send_telemetry_msg(pmt::pmt_t msg) { //push ephemeris to PVT telemetry msg in port using a channel out port // it uses the first channel as a message produces (it is already connected to PVT) channels_.at(0)->get_right_block()->message_port_pub(pmt::mp("telemetry"), msg); return true; } /* * Applies an action to the flowgraph * * \param[in] who Who generated the action * \param[in] what What is the action 0: acquisition failed */ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) { DLOG(INFO) << "received " << what << " from " << who; switch (what) { case 0: LOG(INFO) << "Channel " << who << " ACQ FAILED satellite " << channels_.at(who)->get_signal().get_satellite() << ", Signal " << channels_.at(who)->get_signal().get_signal_str(); available_GNSS_signals_.push_back(channels_.at(who)->get_signal()); //TODO: Optimize the channel and signal matching! while ( channels_.at(who)->get_signal().get_signal_str().compare(available_GNSS_signals_.front().get_signal_str()) != 0 ) { available_GNSS_signals_.push_back(available_GNSS_signals_.front()); available_GNSS_signals_.pop_front(); } channels_.at(who)->set_signal(available_GNSS_signals_.front()); available_GNSS_signals_.pop_front(); usleep(100); channels_.at(who)->start_acquisition(); break; case 1: LOG(INFO) << "Channel " << who << " ACQ SUCCESS satellite " << channels_.at(who)->get_signal().get_satellite(); channels_state_[who] = 2; acq_channels_count_--; if (!available_GNSS_signals_.empty() && acq_channels_count_ < max_acq_channels_) { for (unsigned int i = 0; i < channels_count_; i++) { if (channels_state_[i] == 0) { channels_state_[i] = 1; while (channels_.at(i)->get_signal().get_signal_str().compare(available_GNSS_signals_.front().get_signal_str()) != 0 ) { available_GNSS_signals_.push_back(available_GNSS_signals_.front()); available_GNSS_signals_.pop_front(); } channels_.at(i)->set_signal(available_GNSS_signals_.front()); available_GNSS_signals_.pop_front(); acq_channels_count_++; channels_.at(i)->start_acquisition(); break; } DLOG(INFO) << "Channel " << i << " in state " << channels_state_[i]; } } break; case 2: LOG(INFO) << "Channel " << who << " TRK FAILED satellite " << channels_.at(who)->get_signal().get_satellite(); if (acq_channels_count_ < max_acq_channels_) { channels_state_[who] = 1; acq_channels_count_++; channels_.at(who)->start_acquisition(); } else { channels_state_[who] = 0; available_GNSS_signals_.push_back( channels_.at(who)->get_signal() ); } // for (unsigned int i = 0; i < channels_count_; i++) // { // LOG(INFO) << "Channel " << i << " in state " << channels_state_[i] << std::endl; // } break; default: break; } DLOG(INFO) << "Number of available signals: " << available_GNSS_signals_.size(); } void GNSSFlowgraph::set_configuration(std::shared_ptr configuration) { if (running_) { LOG(WARNING) << "Unable to update configuration while flowgraph running"; return; } if (connected_) { LOG(WARNING) << "Unable to update configuration while flowgraph connected"; } configuration_ = configuration; } void GNSSFlowgraph::init() { /* * Instantiates the receiver blocks */ std::unique_ptr block_factory_(new GNSSBlockFactory()); // 1. read the number of RF front-ends available (one file_source per RF front-end) sources_count_ = configuration_->property("Receiver.sources_count", 1); int RF_Channels = 0; int signal_conditioner_ID = 0; if (sources_count_ > 1) { for (int i = 0; i < sources_count_; i++) { std::cout << "Creating source " << i << std::endl; sig_source_.push_back(block_factory_->GetSignalSource(configuration_, queue_, i)); //TODO: Create a class interface for SignalSources, derived from GNSSBlockInterface. //Include GetRFChannels in the interface to avoid read config parameters here //read the number of RF channels for each front-end RF_Channels = configuration_->property(sig_source_.at(i)->role() + ".RF_channels", 1); std::cout << "RF Channels " << RF_Channels << std::endl; for (int j = 0; j < RF_Channels; j++) { sig_conditioner_.push_back(block_factory_->GetSignalConditioner(configuration_, signal_conditioner_ID)); signal_conditioner_ID++; } } } else { //backwards compatibility for old config files sig_source_.push_back(block_factory_->GetSignalSource(configuration_, queue_, -1)); //TODO: Create a class interface for SignalSources, derived from GNSSBlockInterface. //Include GetRFChannels in the interface to avoid read config parameters here //read the number of RF channels for each front-end RF_Channels = configuration_->property(sig_source_.at(0)->role() + ".RF_channels", 0); if (RF_Channels != 0) { for (int j = 0; j < RF_Channels; j++) { sig_conditioner_.push_back(block_factory_->GetSignalConditioner(configuration_, signal_conditioner_ID)); signal_conditioner_ID++; } } else { //old config file, single signal source and single channel, not specified sig_conditioner_.push_back(block_factory_->GetSignalConditioner(configuration_, -1)); } } observables_ = block_factory_->GetObservables(configuration_); pvt_ = block_factory_->GetPVT(configuration_); std::shared_ptr>> channels = block_factory_->GetChannels(configuration_, queue_); //todo:check smart pointer coherence... channels_count_ = channels->size(); for (unsigned int i = 0; i < channels_count_; i++) { std::shared_ptr chan_ = std::move(channels->at(i)); channels_.push_back(std::dynamic_pointer_cast(chan_)); } top_block_ = gr::make_top_block("GNSSFlowgraph"); // fill the available_GNSS_signals_ queue with the satellites ID's to be searched by the acquisition set_signals_list(); set_channels_state(); applied_actions_ = 0; DLOG(INFO) << "Blocks instantiated. " << channels_count_ << " channels."; } void GNSSFlowgraph::set_signals_list() { /* * Sets a sequential list of GNSS satellites */ std::set::iterator available_gnss_prn_iter; /* * \TODO Describe GNSS satellites more nicely, with RINEX notation * See http://igscb.jpl.nasa.gov/igscb/data/format/rinex301.pdf (page 5) */ /* * Read GNSS-SDR default GNSS system and signal */ unsigned int total_channels = configuration_->property("Channels_1C.count", 0) + configuration_->property("Channels_2S.count", 0) + configuration_->property("Channels_1B.count", 0) + configuration_->property("Channels_5X.count", 0); /* * Loop to create the list of GNSS Signals * To add signals from other systems, add another loop 'for' */ std::set available_gps_prn = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }; std::set available_sbas_prn = {120, 124, 126}; std::set available_galileo_prn = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36}; std::string sv_list = configuration_->property("Galileo.prns", std::string("") ); if( sv_list.length() > 0 ) { // Reset the available prns: std::set< unsigned int > tmp_set; boost::tokenizer<> tok( sv_list ); std::transform( tok.begin(), tok.end(), std::inserter( tmp_set, tmp_set.begin() ), boost::lexical_cast ); if( tmp_set.size() > 0 ) { available_galileo_prn = tmp_set; } } sv_list = configuration_->property("GPS.prns", std::string("") ); if( sv_list.length() > 0 ) { // Reset the available prns: std::set< unsigned int > tmp_set; boost::tokenizer<> tok( sv_list ); std::transform( tok.begin(), tok.end(), std::inserter( tmp_set, tmp_set.begin() ), boost::lexical_cast ); if( tmp_set.size() > 0 ) { available_gps_prn = tmp_set; } } sv_list = configuration_->property("SBAS.prns", std::string("") ); if( sv_list.length() > 0 ) { // Reset the available prns: std::set< unsigned int > tmp_set; boost::tokenizer<> tok( sv_list ); std::transform( tok.begin(), tok.end(), std::inserter( tmp_set, tmp_set.begin() ), boost::lexical_cast ); if( tmp_set.size() > 0 ) { available_sbas_prn = tmp_set; } } if (configuration_->property("Channels_1C.count", 0) > 0 ) { /* * Loop to create GPS L1 C/A signals */ for (available_gnss_prn_iter = available_gps_prn.begin(); available_gnss_prn_iter != available_gps_prn.end(); available_gnss_prn_iter++) { available_GNSS_signals_.push_back(Gnss_Signal(Gnss_Satellite(std::string("GPS"), *available_gnss_prn_iter), std::string("1C"))); } } if (configuration_->property("Channels_2S.count", 0) > 0) { /* * Loop to create GPS L2C M signals */ for (available_gnss_prn_iter = available_gps_prn.begin(); available_gnss_prn_iter != available_gps_prn.end(); available_gnss_prn_iter++) { available_GNSS_signals_.push_back(Gnss_Signal(Gnss_Satellite(std::string("GPS"), *available_gnss_prn_iter), std::string("2S"))); } } if (configuration_->property("Channels_SBAS.count", 0) > 0) { /* * Loop to create SBAS L1 C/A signals */ for (available_gnss_prn_iter = available_sbas_prn.begin(); available_gnss_prn_iter != available_sbas_prn.end(); available_gnss_prn_iter++) { available_GNSS_signals_.push_back(Gnss_Signal(Gnss_Satellite(std::string("SBAS"), *available_gnss_prn_iter), std::string("1C"))); } } if (configuration_->property("Channels_1B.count", 0) > 0) { /* * Loop to create the list of Galileo E1 B signals */ for (available_gnss_prn_iter = available_galileo_prn.begin(); available_gnss_prn_iter != available_galileo_prn.end(); available_gnss_prn_iter++) { available_GNSS_signals_.push_back(Gnss_Signal(Gnss_Satellite(std::string("Galileo"), *available_gnss_prn_iter), std::string("1B"))); } } if (configuration_->property("Channels_5X.count", 0) > 0 ) { /* * Loop to create the list of Galileo E1 B signals */ for (available_gnss_prn_iter = available_galileo_prn.begin(); available_gnss_prn_iter != available_galileo_prn.end(); available_gnss_prn_iter++) { available_GNSS_signals_.push_back(Gnss_Signal(Gnss_Satellite(std::string("Galileo"), *available_gnss_prn_iter), std::string("5X"))); } } /* * Ordering the list of signals from configuration file */ std::list::iterator gnss_it = available_GNSS_signals_.begin(); // Pre-assignation if not defined at ChannelX.signal=1C ...? In what order? for (unsigned int i = 0; i < total_channels; i++) { std::string gnss_signal = (configuration_->property("Channel" + boost::lexical_cast(i) + ".signal", std::string("1C"))); std::string gnss_system; if((gnss_signal.compare("1C") == 0) or (gnss_signal.compare("2S") == 0) ) gnss_system = "GPS"; if((gnss_signal.compare("1B") == 0) or (gnss_signal.compare("5X") == 0) ) gnss_system = "Galileo"; unsigned int sat = configuration_->property("Channel" + boost::lexical_cast(i) + ".satellite", 0); LOG(INFO) << "Channel " << i << " system " << gnss_system << ", signal " << gnss_signal <<", sat "<::iterator available_gnss_list_iter; // for (available_gnss_list_iter = available_GNSS_signals_.begin(); available_gnss_list_iter // != available_GNSS_signals_.end(); available_gnss_list_iter++) // { // std::cout << *available_gnss_list_iter << std::endl; // } } void GNSSFlowgraph::set_channels_state() { max_acq_channels_ = (configuration_->property("Channels.in_acquisition", channels_count_)); if (max_acq_channels_ > channels_count_) { max_acq_channels_ = channels_count_; LOG(WARNING) << "Channels_in_acquisition is bigger than number of channels. Variable acq_channels_count_ is set to " << channels_count_; } channels_state_.reserve(channels_count_); for (unsigned int i = 0; i < channels_count_; i++) { if (i < max_acq_channels_) { channels_state_.push_back(1); } else channels_state_.push_back(0); DLOG(INFO) << "Channel " << i << " in state " << channels_state_[i]; } acq_channels_count_ = max_acq_channels_; DLOG(INFO) << acq_channels_count_ << " channels in acquisition state"; } gnss-sdr-0.0.9/src/core/receiver/gnss_flowgraph.h000066400000000000000000000105671305042567700220210ustar00rootroot00000000000000/*! * \file gnss_flowgraph.h * \brief Interface of a GNSS receiver flowgraph. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Luis Esteve, 2011. luis(at)epsilon-formacion.com * Carles Fernandez-Prades, 2014. cfernandez(at)cttc.es * * It contains a signal source, * a signal conditioner, a set of channels, a pvt and an output filter. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GNSS_FLOWGRAPH_H_ #define GNSS_SDR_GNSS_FLOWGRAPH_H_ #include #include #include #include #include #include #include #include "GPS_L1_CA.h" #include "gnss_signal.h" class GNSSBlockInterface; class ChannelInterface; class ConfigurationInterface; class GNSSBlockFactory; /*! \brief This class represents a GNSS flowgraph. * * It contains a signal source, * a signal conditioner, a set of channels, a PVT and an output filter. */ class GNSSFlowgraph { public: /*! * \brief Constructor that initializes the receiver flowgraph */ GNSSFlowgraph(std::shared_ptr configuration, boost::shared_ptr queue); /*! * \brief Virtual destructor */ virtual ~GNSSFlowgraph(); //! \brief Start the flowgraph void start(); //! \brief Stop the flowgraph void stop(); /*! * \brief Connects the defined blocks in the flowgraph * * Signal Source > Signal conditioner > Channels >> Observables >> PVT > Output filter */ void connect(); void wait(); /*! * \brief Applies an action to the flowgraph * * \param[in] who Who generated the action * \param[in] what What is the action 0: acquisition failed */ void apply_action(unsigned int who, unsigned int what); void set_configuration(std::shared_ptr configuration); unsigned int applied_actions() { return applied_actions_; } bool connected() { return connected_; } bool running() { return running_; } /*! * \brief Sends a GNURadio asyncronous message from telemetry to PVT * * It is used to assist the receiver with external ephemeris data */ bool send_telemetry_msg(pmt::pmt_t msg); private: void init(); // Populates the SV PRN list available for acquisition and tracking void set_signals_list(); void set_channels_state(); // Initializes the channels state (start acquisition or keep standby) // using the configuration parameters (number of channels and max channels in acquisition) bool connected_; bool running_; int sources_count_; unsigned int channels_count_; unsigned int acq_channels_count_; unsigned int max_acq_channels_; unsigned int applied_actions_; std::string config_file_; std::shared_ptr configuration_; std::vector> sig_source_; std::vector> sig_conditioner_; std::shared_ptr observables_; std::shared_ptr pvt_; std::vector> channels_; gr::top_block_sptr top_block_; boost::shared_ptr queue_; std::list available_GNSS_signals_; std::vector channels_state_; }; #endif /*GNSS_SDR_GNSS_FLOWGRAPH_H_*/ gnss-sdr-0.0.9/src/core/receiver/in_memory_configuration.cc000066400000000000000000000070301305042567700240500ustar00rootroot00000000000000/*! * \file in_memory_configuration.cc * \brief This implementation accepts configuration parameters upon instantiation and * it is intended to be used in unit testing. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "in_memory_configuration.h" #include #include #include "string_converter.h" InMemoryConfiguration::InMemoryConfiguration() { std::unique_ptr converter_(new StringConverter); } InMemoryConfiguration::~InMemoryConfiguration() { properties_.clear(); } std::string InMemoryConfiguration::property(std::string property_name, std::string default_value) { std::map::iterator iter = properties_.find(property_name); if(iter != properties_.end()) { return iter->second; } else { return default_value; } } bool InMemoryConfiguration::property(std::string property_name, bool default_value) { std::string empty = ""; return converter_->convert(property(property_name, empty), default_value); } long InMemoryConfiguration::property(std::string property_name, long default_value) { std::string empty = ""; return converter_->convert(property(property_name, empty), default_value); } int InMemoryConfiguration::property(std::string property_name, int default_value) { std::string empty = ""; return converter_->convert(property(property_name, empty), default_value); } unsigned int InMemoryConfiguration::property(std::string property_name, unsigned int default_value) { std::string empty = ""; return converter_->convert(property(property_name, empty), default_value); } unsigned short InMemoryConfiguration::property(std::string property_name, unsigned short default_value) { std::string empty = ""; return converter_->convert(property(property_name, empty), default_value); } float InMemoryConfiguration::property(std::string property_name, float default_value) { std::string empty = ""; return converter_->convert(property(property_name, empty), default_value); } double InMemoryConfiguration::property(std::string property_name, double default_value) { std::string empty = ""; return converter_->convert(property(property_name, empty), default_value); } void InMemoryConfiguration::set_property(std::string property_name, std::string value) { properties_.insert(std::make_pair(property_name, value)); } bool InMemoryConfiguration::is_present(std::string property_name) { return (properties_.find(property_name) != properties_.end()); } gnss-sdr-0.0.9/src/core/receiver/in_memory_configuration.h000066400000000000000000000052401305042567700237130ustar00rootroot00000000000000/*! * \file in_memory_configuration.h * \brief A ConfigurationInterface for testing purposes. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * * This implementation accepts configuration parameters upon instantiation and * it is intended to be used in unit testing. * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_IN_MEMORY_CONFIGURATION_H_ #define GNSS_SDR_IN_MEMORY_CONFIGURATION_H_ #include #include #include #include "configuration_interface.h" class StringConverter; /*! * \brief This class is an implementation of the interface ConfigurationInterface. * * This implementation accepts configuration parameters upon instantiation and * it is intended to be used in unit testing. */ class InMemoryConfiguration : public ConfigurationInterface { public: InMemoryConfiguration(); virtual ~InMemoryConfiguration(); std::string property(std::string property_name, std::string default_value); bool property(std::string property_name, bool default_value); long property(std::string property_name, long default_value); int property(std::string property_name, int default_value); unsigned int property(std::string property_name, unsigned int default_value); unsigned short property(std::string property_name, unsigned short default_value); float property(std::string property_name, float default_value); double property(std::string property_name, double default_value); void set_property(std::string property_name, std::string value); bool is_present(std::string property_name); private: std::map properties_; std::unique_ptr converter_; }; #endif /*GNSS_SDR_IN_MEMORY_CONFIGURATION_H_*/ gnss-sdr-0.0.9/src/core/system_parameters/000077500000000000000000000000001305042567700205575ustar00rootroot00000000000000gnss-sdr-0.0.9/src/core/system_parameters/CMakeLists.txt000066400000000000000000000035701305042567700233240ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # set(SYSTEM_PARAMETERS_SOURCES gnss_satellite.cc gnss_signal.cc gps_navigation_message.cc gps_ephemeris.cc gps_iono.cc gps_almanac.cc gps_utc_model.cc gps_acq_assist.cc gps_ref_time.cc gps_ref_location.cc galileo_utc_model.cc galileo_ephemeris.cc galileo_almanac.cc galileo_iono.cc galileo_navigation_message.cc sbas_ephemeris.cc sbas_ionospheric_correction.cc sbas_satellite_correction.cc sbas_telemetry_data.cc galileo_fnav_message.cc gps_cnav_ephemeris.cc gps_cnav_navigation_message.cc gps_cnav_iono.cc gps_cnav_utc_model.cc rtcm.cc ) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${CMAKE_SOURCE_DIR}/src/core/receiver ${GLOG_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ) link_directories(${Boost_LIBRARY_DIR}) file(GLOB SYSTEM_PARAMETERS_HEADERS "*.h") list(SORT SYSTEM_PARAMETERS_HEADERS) add_library(gnss_system_parameters ${SYSTEM_PARAMETERS_SOURCES} ${SYSTEM_PARAMETERS_HEADERS}) source_group(Headers FILES ${SYSTEM_PARAMETERS_HEADERS}) add_dependencies(gnss_system_parameters glog-${glog_RELEASE}) target_link_libraries(gnss_system_parameters ${Boost_LIBRARIES}) gnss-sdr-0.0.9/src/core/system_parameters/GPS_L1_CA.h000066400000000000000000000260251305042567700222650ustar00rootroot00000000000000/*! * \file GPS_L1_CA.h * \brief Defines system parameters for GPS L1 C/A signal and NAV data * \author Javier Arribas, 2011. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L1_CA_H_ #define GNSS_SDR_GPS_L1_CA_H_ #include #include // std::pair #include "MATH_CONSTANTS.h" // Physical constants const double GPS_C_m_s = 299792458.0; //!< The speed of light, [m/s] const double GPS_C_m_ms = 299792.4580; //!< The speed of light, [m/ms] const double GPS_PI = 3.1415926535898; //!< Pi as defined in IS-GPS-200E const double GPS_TWO_PI = 6.283185307179586;//!< 2Pi as defined in IS-GPS-200E const double OMEGA_EARTH_DOT = 7.2921151467e-5; //!< Earth rotation rate, [rad/s] const double GM = 3.986005e14; //!< Universal gravitational constant times the mass of the Earth, [m^3/s^2] const double F = -4.442807633e-10; //!< Constant, [s/(m)^(1/2)] // carrier and code frequencies const double GPS_L1_FREQ_HZ = 1.57542e9; //!< L1 [Hz] const double GPS_L1_CA_CODE_RATE_HZ = 1.023e6; //!< GPS L1 C/A code rate [chips/s] const double GPS_L1_CA_CODE_LENGTH_CHIPS = 1023.0; //!< GPS L1 C/A code length [chips] const double GPS_L1_CA_CODE_PERIOD = 0.001; //!< GPS L1 C/A code period [seconds] const double GPS_L1_CA_CHIP_PERIOD = 9.7752e-07; //!< GPS L1 C/A chip period [seconds] /*! * \brief Maximum Time-Of-Arrival (TOA) difference between satellites for a receiver operated on Earth surface is 20 ms * * According to the GPS orbit model described in [1] Pag. 32. * It should be taken into account to set the buffer size for the PRN start timestamp in the pseudoranges block. * [1] J. Bao-Yen Tsui, Fundamentals of Global Positioning System Receivers. A Software Approach, John Wiley & Sons, * Inc., Hoboken, NJ, 2nd edition, 2005. */ const double MAX_TOA_DELAY_MS = 20; //#define NAVIGATION_SOLUTION_RATE_MS 1000 // this cannot go here const double GPS_STARTOFFSET_ms = 68.802; //[ms] Initial sign. travel time (this cannot go here) // OBSERVABLE HISTORY DEEP FOR INTERPOLATION const int GPS_L1_CA_HISTORY_DEEP = 100; // NAVIGATION MESSAGE DEMODULATION AND DECODING #define GPS_PREAMBLE {1, 0, 0, 0, 1, 0, 1, 1} const int GPS_CA_PREAMBLE_LENGTH_BITS = 8; const int GPS_CA_PREAMBLE_LENGTH_SYMBOLS = 160; const int GPS_CA_TELEMETRY_RATE_BITS_SECOND = 50; //!< NAV message bit rate [bits/s] const int GPS_CA_TELEMETRY_SYMBOLS_PER_BIT = 20; const int GPS_CA_TELEMETRY_RATE_SYMBOLS_SECOND = GPS_CA_TELEMETRY_RATE_BITS_SECOND*GPS_CA_TELEMETRY_SYMBOLS_PER_BIT; //!< NAV message bit rate [symbols/s] const int GPS_WORD_LENGTH = 4; //!< CRC + GPS WORD (-2 -1 0 ... 29) Bits = 4 bytes const int GPS_SUBFRAME_LENGTH = 40; //!< GPS_WORD_LENGTH x 10 = 40 bytes const int GPS_SUBFRAME_BITS = 300; //!< Number of bits per subframe in the NAV message [bits] const int GPS_SUBFRAME_SECONDS = 6; //!< Subframe duration [seconds] const int GPS_SUBFRAME_MS = 6000; //!< Subframe duration [seconds] const int GPS_WORD_BITS = 30; //!< Number of bits per word in the NAV message [bits] // GPS NAVIGATION MESSAGE STRUCTURE // NAVIGATION MESSAGE FIELDS POSITIONS (from IS-GPS-200E Appendix II) // SUBFRAME 1-5 (TLM and HOW) const std::vector > TOW( { {31,17} } ); const std::vector > INTEGRITY_STATUS_FLAG({{23,1}}); const std::vector > ALERT_FLAG({{48,1}}); const std::vector > ANTI_SPOOFING_FLAG({{49,1}}); const std::vector > SUBFRAME_ID({{50,3}}); // SUBFRAME 1 const std::vector> GPS_WEEK({{61,10}}); const std::vector> CA_OR_P_ON_L2({{71,2}}); //* const std::vector> SV_ACCURACY({{73,4}}); const std::vector> SV_HEALTH ({{77,6}}); const std::vector> L2_P_DATA_FLAG ({{91,1}}); const std::vector> T_GD({{197,8}}); const double T_GD_LSB = TWO_N31; const std::vector> IODC({{83,2},{211,8}}); const std::vector> T_OC({{219,16}}); const double T_OC_LSB = TWO_P4; const std::vector> A_F2({{241,8}}); const double A_F2_LSB = TWO_N55; const std::vector> A_F1({{249,16}}); const double A_F1_LSB = TWO_N43; const std::vector> A_F0({{271,22}}); const double A_F0_LSB = TWO_N31; // SUBFRAME 2 const std::vector> IODE_SF2({{61,8}}); const std::vector> C_RS({{69,16}}); const double C_RS_LSB = TWO_N5; const std::vector> DELTA_N({{91,16}}); const double DELTA_N_LSB = PI_TWO_N43; const std::vector> M_0({{107,8},{121,24}}); const double M_0_LSB = PI_TWO_N31; const std::vector> C_UC({{151,16}}); const double C_UC_LSB = TWO_N29; const std::vector> E({{167,8},{181,24}}); const double E_LSB = TWO_N33; const std::vector> C_US({{211,16}}); const double C_US_LSB = TWO_N29; const std::vector> SQRT_A({{227,8},{241,24}}); const double SQRT_A_LSB = TWO_N19; const std::vector> T_OE({{271,16}}); const double T_OE_LSB = TWO_P4; const std::vector> FIT_INTERVAL_FLAG({{271,1}}); const std::vector> AODO({{272,5}}); const int AODO_LSB = 900; // SUBFRAME 3 const std::vector> C_IC({{61,16}}); const double C_IC_LSB = TWO_N29; const std::vector> OMEGA_0({{77,8},{91,24}}); const double OMEGA_0_LSB = PI_TWO_N31; const std::vector> C_IS({{121,16}}); const double C_IS_LSB = TWO_N29; const std::vector> I_0({{137,8},{151,24}}); const double I_0_LSB = PI_TWO_N31; const std::vector> C_RC({{181,16}}); const double C_RC_LSB = TWO_N5; const std::vector> OMEGA({{197,8},{211,24}}); const double OMEGA_LSB = PI_TWO_N31; const std::vector> OMEGA_DOT({{241,24}}); const double OMEGA_DOT_LSB = PI_TWO_N43; const std::vector> IODE_SF3({{271,8}}); const std::vector> I_DOT({{279,14}}); const double I_DOT_LSB = PI_TWO_N43; // SUBFRAME 4-5 const std::vector> SV_DATA_ID({{61,2}}); const std::vector> SV_PAGE({{63,6}}); // SUBFRAME 4 //! \todo read all pages of subframe 4 // Page 18 - Ionospheric and UTC data const std::vector> ALPHA_0({{69,8}}); const double ALPHA_0_LSB = TWO_N30; const std::vector> ALPHA_1({{77,8}}); const double ALPHA_1_LSB = TWO_N27; const std::vector> ALPHA_2({{91,8}}); const double ALPHA_2_LSB = TWO_N24; const std::vector> ALPHA_3({{99,8}}); const double ALPHA_3_LSB = TWO_N24; const std::vector> BETA_0({{107,8}}); const double BETA_0_LSB = TWO_P11; const std::vector> BETA_1({{121,8}}); const double BETA_1_LSB = TWO_P14; const std::vector> BETA_2({{129,8}}); const double BETA_2_LSB = TWO_P16; const std::vector> BETA_3({{137,8}}); const double BETA_3_LSB = TWO_P16; const std::vector> A_1({{151,24}}); const double A_1_LSB = TWO_N50; const std::vector> A_0({{181,24},{211,8}}); const double A_0_LSB = TWO_N30; const std::vector> T_OT({{219,8}}); const double T_OT_LSB = TWO_P12; const std::vector> WN_T({{227,8}}); const double WN_T_LSB = 1; const std::vector> DELTAT_LS({{241,8}}); const double DELTAT_LS_LSB = 1; const std::vector> WN_LSF({{249,8}}); const double WN_LSF_LSB = 1; const std::vector> DN({{257,8}}); const double DN_LSB = 1; const std::vector> DELTAT_LSF({{271,8}}); const double DELTAT_LSF_LSB = 1; // Page 25 - Antispoofing, SV config and SV health (PRN 25 -32) const std::vector> HEALTH_SV25({{229,6}}); const std::vector> HEALTH_SV26({{241,6}}); const std::vector> HEALTH_SV27({{247,6}}); const std::vector> HEALTH_SV28({{253,6}}); const std::vector> HEALTH_SV29({{259,6}}); const std::vector> HEALTH_SV30({{271,6}}); const std::vector> HEALTH_SV31({{277,6}}); const std::vector> HEALTH_SV32({{283,6}}); // SUBFRAME 5 //! \todo read all pages of subframe 5 // page 25 - Health (PRN 1 - 24) const std::vector> T_OA({{69,8}}); const double T_OA_LSB = TWO_P12; const std::vector> WN_A({{77,8}}); const std::vector> HEALTH_SV1({{91,6}}); const std::vector> HEALTH_SV2({{97,6}}); const std::vector> HEALTH_SV3({{103,6}}); const std::vector> HEALTH_SV4({{109,6}}); const std::vector> HEALTH_SV5({{121,6}}); const std::vector> HEALTH_SV6({{127,6}}); const std::vector> HEALTH_SV7({{133,6}}); const std::vector> HEALTH_SV8({{139,6}}); const std::vector> HEALTH_SV9({{151,6}}); const std::vector> HEALTH_SV10({{157,6}}); const std::vector> HEALTH_SV11({{163,6}}); const std::vector> HEALTH_SV12({{169,6}}); const std::vector> HEALTH_SV13({{181,6}}); const std::vector> HEALTH_SV14({{187,6}}); const std::vector> HEALTH_SV15({{193,6}}); const std::vector> HEALTH_SV16({{199,6}}); const std::vector> HEALTH_SV17({{211,6}}); const std::vector> HEALTH_SV18({{217,6}}); const std::vector> HEALTH_SV19({{223,6}}); const std::vector> HEALTH_SV20({{229,6}}); const std::vector> HEALTH_SV21({{241,6}}); const std::vector> HEALTH_SV22({{247,6}}); const std::vector> HEALTH_SV23({{253,6}}); const std::vector> HEALTH_SV24({{259,6}}); #endif /* GNSS_SDR_GPS_L1_CA_H_ */ gnss-sdr-0.0.9/src/core/system_parameters/GPS_L2C.h000066400000000000000000000237041305042567700220270ustar00rootroot00000000000000/*! * \file GPS_L2C.h * \brief Defines system parameters for GPS L2C signal * \author Javier Arribas, 2015. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_L2C_H_ #define GNSS_SDR_GPS_L2C_H_ #include #include #include // std::pair #include "MATH_CONSTANTS.h" // Physical constants const double GPS_L2_C_m_s = 299792458.0; //!< The speed of light, [m/s] const double GPS_L2_C_m_ms = 299792.4580; //!< The speed of light, [m/ms] const double GPS_L2_PI = 3.1415926535898; //!< Pi as defined in IS-GPS-200E const double GPS_L2_TWO_PI = 6.283185307179586;//!< 2Pi as defined in IS-GPS-200E const double GPS_L2_OMEGA_EARTH_DOT = 7.2921151467e-5; //!< Earth rotation rate, [rad/s] const double GPS_L2_GM = 3.986005e14; //!< Universal gravitational constant times the mass of the Earth, [m^3/s^2] const double GPS_L2_F = -4.442807633e-10; //!< Constant, [s/(m)^(1/2)] // carrier and code frequencies const double GPS_L2_FREQ_HZ = 1.2276e9; //!< L2 [Hz] const double GPS_L2_M_CODE_RATE_HZ = 0.5115e6; //!< GPS L2 M code rate [chips/s] const int GPS_L2_M_CODE_LENGTH_CHIPS = 10230; //!< GPS L2 M code length [chips] const double GPS_L2_M_PERIOD = 0.02; //!< GPS L2 M code period [seconds] const double GPS_L2_L_CODE_RATE_HZ = 0.5115e6; //!< GPS L2 L code rate [chips/s] const int GPS_L2_L_CODE_LENGTH_CHIPS = 767250; //!< GPS L2 L code length [chips] const double GPS_L2_L_PERIOD = 1.5; //!< GPS L2 L code period [seconds] const int GPS_L2C_HISTORY_DEEP = 5; const int32_t GPS_L2C_M_INIT_REG[115] = {0742417664, 0756014035,0002747144,0066265724, // 1:4 0601403471, 0703232733, 0124510070, 0617316361, // 5:8 0047541621, 0733031046, 0713512145, 0024437606, 0021264003, 0230655351, 0001314400, 0222021506, 0540264026, 0205521705, 0064022144, 0120161274, 0044023533, 0724744327, 0045743577, 0741201660, 0700274134, 0010247261, 0713433445, 0737324162, 0311627434, 0710452007, 0722462133, 0050172213, 0500653703, 0755077436, 0136717361, 0756675453, 0435506112, 0771353753, 0226107701, 0022025110, 0402466344, 0752566114, 0702011164, 0041216771, 0047457275, 0266333164, 0713167356, 0060546335, 0355173035, 0617201036, 0157465571, 0767360553, 0023127030, 0431343777, 0747317317, 0045706125, 0002744276, 0060036467, 0217744147, 0603340174,//57:60 0326616775, 0063240065, 0111460621, //61:63 0604055104, 0157065232, 0013305707, 0603552017,//159:162 0230461355, 0603653437, 0652346475, 0743107103, 0401521277, 0167335110, 0014013575, 0362051132, 0617753265, 0216363634, 0755561123, 0365304033, 0625025543, 0054420334, 0415473671, 0662364360, 0373446602, 0417564100, 0000526452, 0226631300, 0113752074, 0706134401, 0041352546, 0664630154, 0276524255, 0714720530, 0714051771, 0044526647, 0207164322, 0262120161, 0204244652, 0202133131, 0714351204, 0657127260, 0130567507, 0670517677, 0607275514, 0045413633, 0212645405, 0613700455, 0706202440, 0705056276, 0020373522, 0746013617, 0132720621, 0434015513, 0566721727, 0140633660}; // CNAV GPS NAVIGATION MESSAGE STRUCTURE // NAVIGATION MESSAGE FIELDS POSITIONS (from IS-GPS-200E Appendix III) #define GPS_CNAV_PREAMBLE {1, 0, 0, 0, 1, 0, 1, 1} const int GPS_L2_CNAV_DATA_PAGE_BITS = 300; //!< GPS L2 CNAV page length, including preamble and CRC [bits] const int GPS_L2_SYMBOLS_PER_BIT = 2; const int GPS_L2_SAMPLES_PER_SYMBOL = 1; const int GPS_L2_CNAV_DATA_PAGE_DURATION_S = 12; const int GPS_L2_CNAV_DATA_PAGE_BITS_EXTENDED_BYTES = 304; //!< GPS L2 CNAV page length, including preamble and CRC [bits] // common to all messages const std::vector > CNAV_PRN( { {9,6} } ); const std::vector > CNAV_MSG_TYPE( { {15,6} } ); const std::vector > CNAV_TOW( { {21,17} } ); //GPS Time Of Week in seconds const double CNAV_TOW_LSB = 6.0; const std::vector > CNAV_ALERT_FLAG( { {38,1} } ); // MESSAGE TYPE 10 (Ephemeris 1) const std::vector > CNAV_WN({{39,13}}); const std::vector > CNAV_HEALTH({{52,3}}); const std::vector > CNAV_TOP1({{55,11}}); const double CNAV_TOP1_LSB = 300.0; const std::vector > CNAV_URA({{66,5}}); const std::vector > CNAV_TOE1({{71,11}}); const double CNAV_TOE1_LSB = 300.0; const std::vector > CNAV_DELTA_A({{82,26}}); //Relative to AREF = 26,559,710 meters const double CNAV_DELTA_A_LSB = TWO_N9; const std::vector > CNAV_A_DOT({{108,25}}); const double CNAV_A_DOT_LSB = TWO_N21; const std::vector > CNAV_DELTA_N0({{133,17}}); const double CNAV_DELTA_N0_LSB = TWO_N44; const std::vector > CNAV_DELTA_N0_DOT({{150,23}}); const double CNAV_DELTA_N0_DOT_LSB = TWO_N57; const std::vector > CNAV_M0({{173,33}}); const double CNAV_M0_LSB = TWO_N32; const std::vector > CNAV_E_ECCENTRICITY({{206,33}}); const double CNAV_E_ECCENTRICITY_LSB = TWO_N34; const std::vector > CNAV_OMEGA({{239,33}}); const double CNAV_OMEGA_LSB = TWO_N32; const std::vector > CNAV_INTEGRITY_FLAG({{272,1}}); const std::vector > CNAV_L2_PHASING_FLAG({{273,1}}); // MESSAGE TYPE 11 (Ephemeris 2) const std::vector > CNAV_TOE2({{39,11}}); const double CNAV_TOE2_LSB = 300.0; const std::vector > CNAV_OMEGA0({{50,33}}); const double CNAV_OMEGA0_LSB = TWO_N32; const std::vector > CNAV_I0({{83,33}}); const double CNAV_I0_LSB = TWO_N32; const std::vector > CNAV_DELTA_OMEGA_DOT({{116,17}}); //Relative to REF = -2.6 x 10-9 semi-circles/second. const double CNAV_DELTA_OMEGA_DOT_LSB = TWO_N44; const std::vector > CNAV_I0_DOT({{133,15}}); const double CNAV_I0_DOT_LSB = TWO_N44; const std::vector > CNAV_CIS({{148,16}}); const double CNAV_CIS_LSB = TWO_N30; const std::vector > CNAV_CIC({{164,16}}); const double CNAV_CIC_LSB = TWO_N30; const std::vector > CNAV_CRS({{180,24}}); const double CNAV_CRS_LSB = TWO_N8; const std::vector > CNAV_CRC({{204,24}}); const double CNAV_CRC_LSB = TWO_N8; const std::vector > CNAV_CUS({{228,21}}); const double CNAV_CUS_LSB = TWO_N30; const std::vector > CNAV_CUC({{249,21}}); const double CNAV_CUC_LSB = TWO_N30; // MESSAGE TYPE 30 (CLOCK, IONO, GRUP DELAY) const std::vector > CNAV_TOP2({{39,11}}); const double CNAV_TOP2_LSB = 300.0; const std::vector > CNAV_URA_NED0({{50,5}}); const std::vector > CNAV_URA_NED1({{55,3}}); const std::vector > CNAV_URA_NED2({{58,3}}); const std::vector > CNAV_TOC({{61,11}}); const double CNAV_TOC_LSB = 300.0; const std::vector > CNAV_AF0({{72,26}}); const double CNAV_AF0_LSB = TWO_N60; const std::vector > CNAV_AF1({{98,20}}); const double CNAV_AF1_LSB = TWO_N48; const std::vector > CNAV_AF2({{118,10}}); const double CNAV_AF2_LSB = TWO_N35; const std::vector > CNAV_TGD({{128,13}}); const double CNAV_TGD_LSB = TWO_N35; const std::vector > CNAV_ISCL1({{141,13}}); const double CNAV_ISCL1_LSB = TWO_N35; const std::vector > CNAV_ISCL2({{154,13}}); const double CNAV_ISCL2_LSB = TWO_N35; const std::vector > CNAV_ISCL5I({{167,13}}); const double CNAV_ISCL5I_LSB = TWO_N35; const std::vector > CNAV_ISCL5Q({{180,13}}); const double CNAV_ISCL5Q_LSB = TWO_N35; //Ionospheric parameters const std::vector > CNAV_ALPHA0({{193,8}}); const double CNAV_ALPHA0_LSB = TWO_N30; const std::vector > CNAV_ALPHA1({{201,8}}); const double CNAV_ALPHA1_LSB = TWO_N27; const std::vector > CNAV_ALPHA2({{209,8}}); const double CNAV_ALPHA2_LSB = TWO_N24; const std::vector > CNAV_ALPHA3({{217,8}}); const double CNAV_ALPHA3_LSB = TWO_N24; const std::vector > CNAV_BETA0({{225,8}}); const double CNAV_BETA0_LSB = TWO_P11; const std::vector > CNAV_BETA1({{233,8}}); const double CNAV_BETA1_LSB = TWO_P14; const std::vector > CNAV_BETA2({{241,8}}); const double CNAV_BETA2_LSB = TWO_P16; const std::vector > CNAV_BETA3({{249,8}}); const double CNAV_BETA3_LSB = TWO_P16; const std::vector > CNAV_WNOP({{257,8}}); // TODO: Add more frames (Almanac, etc...) #endif /* GNSS_SDR_GPS_L2C_H_ */ gnss-sdr-0.0.9/src/core/system_parameters/Galileo_E1.h000066400000000000000000003451041305042567700226400ustar00rootroot00000000000000/*! * \file Galileo_E1.h * \brief Defines system parameters for Galileo E1 signal and NAV data * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com * \author Mara Branzanti 2013. mara.branzanti(at)gmail.com * \author Javier Arribas 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_E1_H_ #define GNSS_SDR_GALILEO_E1_H_ #include #include #include // std::pair #include "MATH_CONSTANTS.h" // Physical constants const double GALILEO_PI = 3.1415926535898; //!< Pi as defined in GALILEO ICD const double GALILEO_TWO_PI = 6.283185307179600 ; //!< 2*Pi as defined in GALILEO ICD const double GALILEO_GM = 3.986004418e14; //!< Geocentric gravitational constant[m^3/s^2] const double GALILEO_OMEGA_EARTH_DOT = 7.2921151467e-5; //!< Mean angular velocity of the Earth [rad/s] const double GALILEO_C_m_s = 299792458.0; //!< The speed of light, [m/s] const double GALILEO_C_m_ms = 299792.4580; //!< The speed of light, [m/ms] const double GALILEO_F = -4.442807309e-10; //!< Constant, [s/(m)^(1/2)] // carrier and code frequencies const double Galileo_E1_FREQ_HZ = 1.57542e9; //!< Galileo E1 carrier frequency [Hz] const double Galileo_E1_CODE_CHIP_RATE_HZ = 1.023e6; //!< Galileo E1 code rate [chips/s] const double Galileo_E1_CODE_PERIOD = 0.004; //!< Galileo E1 code period [s] const double Galileo_E1_SUB_CARRIER_A_RATE_HZ = 1.023e6; //!< Galileo E1 sub-carrier 'a' rate [Hz] const double Galileo_E1_SUB_CARRIER_B_RATE_HZ = 6.138e6; //!< Galileo E1 sub-carrier 'b' rate [Hz] const double Galileo_E1_B_CODE_LENGTH_CHIPS = 4092.0; //!< Galileo E1-B code length [chips] const double Galileo_E1_B_SYMBOL_RATE_BPS = 250.0; //!< Galileo E1-B symbol rate [bits/second] const double Galileo_E1_C_SECONDARY_CODE_LENGTH = 25.0; //!< Galileo E1-C secondary code length [chips] const int Galileo_E1_NUMBER_OF_CODES = 50; const double GALILEO_STARTOFFSET_ms = 68.802; //[ms] Initial sign. travel time (this cannot go here) // OBSERVABLE HISTORY DEEP FOR INTERPOLATION const int GALILEO_E1_HISTORY_DEEP=100; // Galileo INAV Telemetry structure #define GALILEO_INAV_PREAMBLE {0, 1, 0, 1, 1, 0, 0, 0, 0, 0} const int GALILEO_INAV_PREAMBLE_LENGTH_BITS = 10; const int GALILEO_INAV_PREAMBLE_PERIOD_SYMBOLS = 250; const int GALILEO_INAV_PAGE_PART_SYMBOLS = 250; //!< Each Galileo INAV pages are composed of two parts (even and odd) each of 250 symbols, including preamble. See Galileo ICD 4.3.2 const int GALILEO_INAV_PAGE_SYMBOLS = 500; //!< The complete Galileo INAV page length const int GALILEO_INAV_PAGE_PART_SECONDS = 1; // a page part last 1 sec const int GALILEO_INAV_PAGE_SECONDS = 2; // a full page last 2 sec const int GALILEO_INAV_INTERLEAVER_ROWS = 8; const int GALILEO_INAV_INTERLEAVER_COLS = 30; const int GALILEO_TELEMETRY_RATE_BITS_SECOND = 250; //bps 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}}); const std::vector> PAGE_TYPE_bit({{1,6}});; /*Page 1 - Word type 1: Ephemeris (1/4)*/ const std::vector> IOD_nav_1_bit({{7,10}}); const std::vector> T0E_1_bit({{17,14}}); const double t0e_1_LSB = 60; const std::vector> M0_1_bit({{31,32}}); const double M0_1_LSB = PI_TWO_N31; const std::vector> e_1_bit({{63,32}}); const double e_1_LSB = TWO_N33; const std::vector> A_1_bit({{95,32}}); const double A_1_LSB_gal = TWO_N19; //last two bits are reserved /*Page 2 - Word type 2: Ephemeris (2/4)*/ const std::vector> IOD_nav_2_bit({{7,10}}); const std::vector> OMEGA_0_2_bit({{17,32}}); const double OMEGA_0_2_LSB = PI_TWO_N31; const std::vector> i_0_2_bit({{49,32}}); const double i_0_2_LSB = PI_TWO_N31; const std::vector> omega_2_bit({{81,32}}); const double omega_2_LSB = PI_TWO_N31; const std::vector> iDot_2_bit({{113,14}}); const double iDot_2_LSB = PI_TWO_N43; //last two bits are reserved /*Word type 3: Ephemeris (3/4) and SISA*/ const std::vector> IOD_nav_3_bit({{7,10}}); const std::vector> OMEGA_dot_3_bit({{17,24}}); const double OMEGA_dot_3_LSB = PI_TWO_N43; const std::vector> delta_n_3_bit({{41,16}}); const double delta_n_3_LSB = PI_TWO_N43; const std::vector> C_uc_3_bit({{57,16}}); const double C_uc_3_LSB = TWO_N29; const std::vector> C_us_3_bit({{73,16}}); const double C_us_3_LSB = TWO_N29; const std::vector> C_rc_3_bit({{89,16}}); const double C_rc_3_LSB = TWO_N5; const std::vector> C_rs_3_bit({{105,16}}); const double C_rs_3_LSB = TWO_N5; const std::vector> SISA_3_bit({{121,8}}); /*Word type 4: Ephemeris (4/4) and Clock correction parameters*/ const std::vector> IOD_nav_4_bit({{7,10}}); const std::vector> SV_ID_PRN_4_bit({{17,6}}); const std::vector> C_ic_4_bit({{23,16}}); const double C_ic_4_LSB = TWO_N29; const std::vector> C_is_4_bit({{39,16}}); const double C_is_4_LSB = TWO_N29; const std::vector> t0c_4_bit({{55,14}}); // const double t0c_4_LSB = 60; const std::vector> af0_4_bit({{69,31}}); // const double af0_4_LSB = TWO_N34; const std::vector> af1_4_bit({{100,21}}); // const double af1_4_LSB = TWO_N46; const std::vector> af2_4_bit({{121,6}}); const double af2_4_LSB = TWO_N59; const std::vector> spare_4_bit({{127,2}}); //last two bits are reserved /*Word type 5: Ionospheric correction, BGD, signal health and data validity status and GST*/ /*Ionospheric correction*/ /*Az*/ const std::vector> ai0_5_bit({{7,11}}); // const double ai0_5_LSB = TWO_N2; const std::vector> ai1_5_bit({{18,11}}); // const double ai1_5_LSB = TWO_N8; const std::vector> ai2_5_bit({{29,14}}); // const double ai2_5_LSB = TWO_N15; /*Ionospheric disturbance flag*/ const std::vector> Region1_5_bit({{43,1}}); // const std::vector> Region2_5_bit({{44,1}}); // const std::vector> Region3_5_bit({{45,1}}); // const std::vector> Region4_5_bit({{46,1}}); // const std::vector> Region5_5_bit({{47,1}}); // const std::vector> BGD_E1E5a_5_bit({{48,10}}); // const double BGD_E1E5a_5_LSB = TWO_N32; const std::vector> BGD_E1E5b_5_bit({{58,10}}); // const double BGD_E1E5b_5_LSB = TWO_N32; const std::vector> E5b_HS_5_bit({{68,2}}); // const std::vector> E1B_HS_5_bit({{70,2}}); // const std::vector> E5b_DVS_5_bit({{72,1}}); // const std::vector> E1B_DVS_5_bit({{73,1}}); // /*GST*/ const std::vector> WN_5_bit({{74,12}}); const std::vector> TOW_5_bit({{86,20}}); const std::vector> spare_5_bit({{106,23}}); /* Page 6 */ const std::vector> A0_6_bit({{7,32}}); const double A0_6_LSB = TWO_N30; const std::vector> A1_6_bit({{39,24}}); const double A1_6_LSB = TWO_N50; const std::vector> Delta_tLS_6_bit({{63,8}}); const std::vector> t0t_6_bit({{71,8}}); const double t0t_6_LSB = 3600; const std::vector> WNot_6_bit({{79,8}}); const std::vector> WN_LSF_6_bit({{87,8}}); const std::vector> DN_6_bit({{95,3}}); const std::vector> Delta_tLSF_6_bit({{98,8}}); const std::vector> TOW_6_bit({{106,20}}); /* Page 7 */ const std::vector> IOD_a_7_bit({{7,4}}); const std::vector> WN_a_7_bit({{11,2}}); const std::vector> t0a_7_bit({{13,10}}); const double t0a_7_LSB = 600; const std::vector> SVID1_7_bit({{23,6}}); const std::vector> DELTA_A_7_bit({{29,13}}); const double DELTA_A_7_LSB = TWO_N9; const std::vector> e_7_bit({{42,11}}); const double e_7_LSB = TWO_N16; const std::vector> omega_7_bit({{53,16}}); const double omega_7_LSB = TWO_N15; const std::vector> delta_i_7_bit({{69,11}}); const double delta_i_7_LSB = TWO_N14; const std::vector> Omega0_7_bit({{80,16}}); const double Omega0_7_LSB = TWO_N15; const std::vector> Omega_dot_7_bit({{96,11}}); const double Omega_dot_7_LSB = TWO_N33; const std::vector> M0_7_bit({{107,16}}); const double M0_7_LSB = TWO_N15; /* Page 8 */ const std::vector> IOD_a_8_bit({{7,4}}); const std::vector> af0_8_bit({{11,16}}); const double af0_8_LSB = TWO_N19; const std::vector> af1_8_bit({{27,13}}); const double af1_8_LSB = TWO_N38; const std::vector> E5b_HS_8_bit({{40,2}}); const std::vector> E1B_HS_8_bit({{42,2}}); const std::vector> SVID2_8_bit({{44,6}}); const std::vector> DELTA_A_8_bit({{50,13}}); const double DELTA_A_8_LSB = TWO_N9; const std::vector> e_8_bit({{63,11}}); const double e_8_LSB = TWO_N16; const std::vector> omega_8_bit({{74,16}}); const double omega_8_LSB = TWO_N15; const std::vector> delta_i_8_bit({{90,11}}); const double delta_i_8_LSB = TWO_N14; const std::vector> Omega0_8_bit({{101,16}}); const double Omega0_8_LSB = TWO_N15; const std::vector> Omega_dot_8_bit({{117,11}}); const double Omega_dot_8_LSB = TWO_N33; /* Page 9 */ const std::vector> IOD_a_9_bit({{7,4}}); const std::vector> WN_a_9_bit({{11,2}}); const std::vector> t0a_9_bit({{13,10}}); const double t0a_9_LSB = 600; const std::vector> M0_9_bit({{23,16}}); const double M0_9_LSB = TWO_N15; const std::vector> af0_9_bit({{39,16}}); const double af0_9_LSB = TWO_N19; const std::vector> af1_9_bit({{55,13}}); const double af1_9_LSB = TWO_N38; const std::vector> E5b_HS_9_bit({{68,2}}); const std::vector> E1B_HS_9_bit({{70,2}}); const std::vector> SVID3_9_bit({{72,6}}); const std::vector> DELTA_A_9_bit({{78,13}}); const double DELTA_A_9_LSB = TWO_N9; const std::vector> e_9_bit({{91,11}}); const double e_9_LSB = TWO_N16; const std::vector> omega_9_bit({{102,16}}); const double omega_9_LSB = TWO_N15; const std::vector> delta_i_9_bit({{118,11}}); const double delta_i_9_LSB = TWO_N14; /* Page 10 */ const std::vector> IOD_a_10_bit({{7,4}}); const std::vector> Omega0_10_bit({{11,16}}); const double Omega0_10_LSB = TWO_N15; const std::vector> Omega_dot_10_bit({{27,11}}); const double Omega_dot_10_LSB = TWO_N33; const std::vector> M0_10_bit({{38,16}}); const double M0_10_LSB = TWO_N15; const std::vector> af0_10_bit({{54,16}}); const double af0_10_LSB = TWO_N19; const std::vector> af1_10_bit({{70,13}}); const double af1_10_LSB = TWO_N38; const std::vector> E5b_HS_10_bit({{83,2}}); const std::vector> E1B_HS_10_bit({{85,2}}); const std::vector> A_0G_10_bit({{87,16}}); const double A_0G_10_LSB = TWO_N35; const std::vector> A_1G_10_bit({{103,12}}); const double A_1G_10_LSB = TWO_N51; const std::vector> t_0G_10_bit({{115,8}}); const double t_0G_10_LSB = 3600; const std::vector> WN_0G_10_bit({{123,6}}); /* Page 0 */ const std::vector> Time_0_bit({{7,2}}); const std::vector> WN_0_bit({{97,12}}); const std::vector> TOW_0_bit({{109,20}}); // Galileo E1 primary codes const std::string Galileo_E1_B_PRIMARY_CODE[Galileo_E1_NUMBER_OF_CODES] = { "F5D710130573541B9DBD4FD9E9B20A0D59D144C54BC7935539D2E75810FB51E494093A0A19DD79C70C5A98E5657AA578097777E86BCC4651CC72F2F974DC766E07AEA3D0B557EF42FF57E6A58E805358CE9257669133B18F80FDBDFB38C5524C7FB1DE079842482990DF58F72321D9201F8979EAB159B2679C9E95AA6D53456C0DF75C2B4316D1E2309216882854253A1FA60CA2C94ECE013E2A8C943341E7D9E5A8464B3AD407E0AE465C3E3DD1BE60A8C3D50F831536401E776BE02A6042FC4A27AF653F0CFC4D4D013F115310788D68CAEAD3ECCCC5330587EB3C22A1459FC8E6FCCE9CDE849A5205E70C6D66D125814D698DD0EEBFEAE52CC65C5C84EEDF207379000E169D318426516AC5D1C31F2E18A65E07AE6E33FDD724B13098B3A444688389EFBBB5EEAB588742BB083B679D42FB26FF77919EAB21DE0389D9997498F967AE05AF0F4C7E177416E18C4D5E6987ED3590690AD127D872F14A8F4903A12329732A9768F82F295BEE391879293E3A97D51435A7F03ED7FBE275F102A83202DC3DE94AF4C712E9D006D182693E9632933E6EB773880CF147B922E74539E4582F79E39723B4C80E42EDCE4C08A8D02221BAE6D17734817D5B531C0D3C1AE723911F3FFF6AAC02E97FEA69E376AF4761E6451CA61FDB2F9187642EFCD63A09AAB680770C1593EEDD4FF4293BFFD6DD2C3367E85B14A654C834B6699421A", // 01 "96B856A629F581D1344FEF597835FE60434625D077ECF0D95FBE1155EA0431979E5AFF544AF591A332FDAEF98AB1EDD847A73F3AF15AAEE7E9A05C9D82C59EC325EF4CF264B8ADF2A8E8BA459354CB4B415CC50BF239ADBC31B3A9C87B0843CF3B9E6D646BA43F866276B053826F3A2334CC5E2EFB9F8F195B382E75EEA63F58A06B3F82A3B5C77C1800FD9498F803E524435B321210BB84690BED0BBBE16D363B3A90656A73720E27008852FB7DACC8284411B177728D9527C560859084A395A6F11A96AD9DB6B43E00642B000ED12BFD967868EAB1108552CD4FC89FBC408ACE7678C381EC91DD000319124EB5D5EF52C4CAC9AADEE2FA045C16CE492D7F43743CA77924C78696FCBF2F9F7F36D8E623752200C6FCBBD71ABBB6877F3C5D6E6740AB0389458A6B66440858B2D383244E853646FE2714211DEA9E6196252815BB704A20BFE556AC474F8998944E0CABBBE21A6400B87BFDCF937D12B2821D59298AF4AD378F0F42BD8C41693B8D993CF37C8B478F3BB5D33AD2A9FA24AD7B8FA895FDBC04964192F7BA3FF74E0E3A435B5DFE042E3115CACF29624C0645E9C917534A2EBC1F5665E4E1B1BC56208DBCD8A27CCB6474D5D0E20CA4072C960E5ACE41BDA3770DF3B681F2B318F6F8E1CB17C2857350FB6009AED665E13B2780D79217F73FAC7A8A48048DB0FB8A8A5007CDDC9A7B2DA8257C99F1CB605A18204", "E57DE19A3E4A8C122FCB1DD6584B3D2DAE364D800F9C5A9E957B38F624CBD3ACC58FA3ED070B5E44857CCB813FBC0BB83B5D157C6C562422E5963CC4DD753C45B0264F8E136A0F1774D77A543E44D51EF8C6B9408B6E3B5CEE1347A94F13ECDC94DC764976E5A50B4CB0AE7557553B47EDFE03EC2CD32EA8D125A341E1EDFC77E75330D6E7B23DC838EBCE7E5567F5B8C80C3D15E7404B4E10F0BEB0C69626A814AF91334199864FC77E0FF548DC2A6FA6A71C3C0561F2B085CC05E8512E27B9DBA60B93D114B87935776C8E9A67905C429D48BF3AB1B0A56FAFBFD5D9C8D8C8A9E5918BFF273CF5E8664FF2B90314BDBFDAD5AB8C22A0E45C104ECE75EA43FE9BDCE306A5A28AE464628163D249D8056005F1A900951808CC8620F81768153436F741667A8E271DD986C7A1E5046FCC74C7CEBBF9A1296D6CF0B2FF85BE412D87214BB368DFF462AD649D7324A117252311C664D33E4DAFBD830FBCEB6EFBDD7391D4BADA7A775FD1949D981F619655DB3C22BAC34E5AE41222905C0C7E80D6EA28471EC0468756531C09A471EDBE200472E78F1701FEE96E5769A9893C0F11E7906B064442E06E21ED8B0D70AF288690C532A2D03B373E1E0085F62F7AAA658B569C5184E3DDC40ECAA88B887118601691892F9F55E2DE79E49DFF11D434C2BA3AA6447522A7C99DC215CAD2ED0114ED62CBDAE9D315E48AE14D2014B7F8E", "C0FC4C72A12023BA7093C86775DF3D2F42C7CEDE616876340BE4301361B9DC9DFF4F1DEC6A62E165927BDE4F809E969AAD085437496BB95904719820F4CA8ABBA0B84C34B06DD7E268BA10E386FA7DB9FCFCDAF2B6AFBA46A8A299153B4E11582FBA7F28F0A0F9DE41830AB33335062C57D81DC361EDFE491939100FC827F36273760043D1C35B74E36C6C4DBE1D307847D55AC07D8B212C2DBA632A86AB15BD0FAFFA43070644C7E50623195A3796AA8E8D6E4E964FA0E4488A500B9063FBBFB1204A0E33C6CF2879AC2BA7C86CAB57E3E8A497836194E65C5C39B950F1AFC3B58E850A5EC39F4190D55351D16529CD52B36DF4A2DC68EE202BB758CF19C54B0E1461D547B5D06C2F9DC09C2B15458C3140860E4C6F3FE4F417FDFCEDE00F71212EE137E6669E569A7845470CA564F85CB4772808D65D2B48D409B709BD7AC5F7E28AA804CE9DAC3ABB5A5B768C6A184B5A974E933F2C1772FF64AB26BA2D5A165744E314EFB2238AC4858A8B82723DAE8865478EAA261F35DD4D98A9C07ACB0B822AFF1AD3E739CB214CE737196FEF2DD0B0D45BAC423935670BCF71C2EC04CCB98943786173C309E75A02BB78A788A5E6F8A8F407E57B8403841A9E1FCB3A7AB80D1F6529770E52C173E2C47EDED4400D5E665E325ED845C9E8D0E66FDA16B17D61EDBB336F22688C3F0FB040A55F33B65FA9F3D45F5B22C445CBF9DEB22", "EA9596357B343DFC31D5875CC0E94117A33651472E476D3892D8112EB6CB6E0151D409C5A514DCDA38A773C58F18B590EF9017B6EDF0192AB7EB29DD6E1E7E7390C13E9B10209D5775F3B066F7B2DBB7307FB44F726DD2F368A5FDBE75BA7248762E1EC7E4589DF1A353A16D6B3CAC1C9ACDB89890ED2C4F44AFEFC763DB51D102230C37E1ED0943CD6F4176B2F5C19119588911ACF81A7A29320AD579C1BFAED1A70DEE1B87037138ADE411E0BB92F5B3148DFA11F2F84CA6C019124B922837503AA9823A97E443A66378D5CB3130A7EC9B05670E85D095D5E6F603092C632E51FD9013FE7FB9F08448FD09F1219A4744CDAF82BF9C60039C8185C7E9559FCE301C6D3F46A2E514AAD44D3889C8CB4ED7439BF47019194F2644363770F8BBD0AE92B6F5F43CBBB503A885239DA636903D4C264B3FF09AB77E3FDBA7EFC63E0792B6D5183759E57D8A694CDB133B4A9E301CEEEB978050AD9A9E410091AD29E389829E2F24BE1E3B24F4540C4A6533EBA72E8AD540BAAE43A0CB82F971F3A51DD77FE9E1956E2EE7553E050A1D10B99552DDD5B68F2E2859712835BD2AD6B08881753B4833FB04740E3364D2CD4921B939393E7EA91B854FA1E5A8EE79FF0A83F111F78435481D462E0E1CBC0C921D190A435A1BA755E4B7021244FC5E3F0630F2A1F439C02AE619393E5624834B05ED7DEDE5F0AFC7A40899424E75D4EE792", // 05 "90E92279CD4F60D98F6E8FCB3E9263DB60FAB146A835AAC2E96B3BE3FF07119032DEE0521C731117E90C2943B389DD6B65C5E21C34F86F5A7ADE04072DFD1479EA36528D340736B0FED4F6207BE9F6CFC971D5EA11781AC2DA25DBEEB6B903EF8BB0AC0CD2E29F94B8CB67874A7B7441045758E09EA061181A50E0AB7BCCF801554E0644780BC137436E3FB7784C182856A790D6943BB53DB40D13D6A2F7B83A5C521073883B90FB8DB1C0F954D132943C09156A09984B822079FB8FD09BC07C1D6336C7CEAE8CC3162760B9838CA6A38FD0044FDF099E416D57BF9F33A551043F34EBF9BAA90901E62D2D981065F977852072F692535DDE24EE8946387B4E5B0FEFEBD75552C1FC325A608A78079A9AC864F2F30010A3304CB16A26AF98D9BFD3B8D128541190B2BBEE275A6F53B9BC5108306985ECBB983B56E34F18B48A12AEAB88271F4F780CFDFA83E05E35C12464F4350597CCAE9B4498F5A5454DCC3218D3336763674934ADCBCB5EA52891EB240C362248226DE64899BE30735F6495E94AA61ABEF62B803C57FDD045B724ED1966B6E7DFDFCA5B36F7B0FACEDAC62DE8E10B12DFC84B1A9CEB407BDE63CDB5208ABBE5E066AAF262187E94502B1701B2CC8681CB616773DA2B7AF49443CFF528F45DD7F25959836771908C2519171CAED2BCDCFCEA46301E7D99A5AF7199155772E92BAD85F35EDB656F0999EE828", "A91F570102961D62CA6CB55144AFCCEAF3910F3336DCB029CDCBA164ADA72732771B6ECD1C58E49F468A2BFD23E1B996DABABBAF5AB3A4C74926187B5833006F8BEF7F9CD0F05A2A0B9BD9073C4C3976E8660CE7BF81634CF0B31C3DDD806A6A0C15BC552B83A86789CC675A6D137BE27BC86DF68FEC5D268119EB9E965260FE1F5C56AEF60A8622CDA8C42F24CBA7F5B07A7416917277323314AFD3ECD10F74BEE7B22DC760EFA7F935FC9963411353782547FAEED32E69A4FB5756C1A73CCDFFEDE50F4B2D9B5D2ED5C59C9A52D80CD27B989B8DAA14C569E763C08FD42358CD064B2DE0526607C9536D75E1617EC80615EF5EE2314FAC29907B61B61F8696CB80B14B3A0148EEBC825C91150A08A23FC7B38B5982AA02A18BF6E91B3A1F2EEF360F682A34AB36CAFCAD556841073F219910F7BC2F07CE45E98F77F50475DF9EDFE2DC9E3D7280193D61AB5076A14887E9D9193C3B83C5773BDECA067CA1BC3D4561C3A8B4E30072A6269B529760CA1B5FE9D3DB2B5D1202CE8B18E9E2E80FAFF47108168D3C7EB3C940B1A35A1D1B968A5A9DC0686DD8336E498C240F20871600FF995B9E33169DCFCFCB58E75C94D82F843C60A7118F0D7B40064A8A4176C5158E86AF0BE4C1D5D73D1C051132A85CC0628486AFD660502A515D6353B674B1D4E61750C13E8A3AD48FE1F89F201C288A8F443867C2BAC23C706EE7A2D2C", "C6E00978E351164532EEA256ECBE0D4F8FCE02A276BD19666DE93936F7A242FC4C7E879791314B043ABF1D5F9B0036ED22AA92028C800C4D62BD6640431170EA77311865074D670AF2847AA47CB94584A793FA82F51574BD7C62BF14386F14A3D7DBD129FDE64EAD67EB35D5E13FF214D7D163B770D4A77A62D02D88C0FCF3FA5EC306EB7F85539105FA2CE5F53D182E58FBBC1C57CFBCD2D2F7FC8A067D6FA0BC834DAB8F370B0971BF6D068CD4D3A32C11C6598DEBBAEA046528C5EF762828CC84D003847069FA18743A809A004431E83924B8FDF0AC78699B905ACCFF82E83FDAFEC8648DF64042FC9438B261B73F0541498ACAD67D702AB631BECEF8680D33CE8F4F0CE29B95132591A350DD68B36734B97D4B3E84A76497F702312F2A8370DCF26A7C3C8EB91DD8699C48F551750712683E0397083714A6CAC3457C0FA70BB3A036C6E0BEF24E6B20BA5565B351C2EFD56BD9455FF7728BE07A097208E73DE4CD0CB4E215B4642365123CDEA419B28459D50E864B762554E7C1D7CAF73DA7D40EDEF5D824A2FE1A6CA473B07370932A8A5D441DEE3C9A60DB68E27A9D3E9C8229B44E5B434C6D18A8CADB6D17BC4614DEBEAD670C73132CE2F999C8716D1098C69277E8ECAC546EF8002E5182E25F31A354DF112E97F8733DD20893B430CD7130E69ED4A0FE4D6C2E4FA479001E42EBC9F36E5DFD3E0BE35A64B89745E", "821BBB3FB91E50253A9E71AC379ED57AEF394C2CC59587B2D0337CE74002EEAD17AB5D504BCA68BDAE9061C3DBAE2985EBE292B9BEC9D3542015225F44ED3C2C3FFB036A515BF33DA1690F3438FD225A5034106C5F4BCC43301EEC2245D73F63038E2A7D9B8CF95A9FD813FFA071FFDE423E0CE737969578BEB909764A8D6DAA9E15A4FA0867831652C0F6E9AAA39A63F0AEEF62A433476CC7380460ECFB8B7F3B2FE8C4C42A3EF1CDB808FC9747FB4F044B3B47A4EDFCC9463ABB72C55399B2F79EE5FEDA270D6358B27F8466969DE4A5F2E6A5F2C4CF0813C09F468DC97FC0E5DD057A8A0355767B698F8A79BF0350C4200413A15E6591DE70A1B502E19FF515C3DF36935974A4764895B9E3CA2626BD39B7ADB780AAF7E2E914E804CA923089A51F3876649C73CA3C2623A8C95D11EF4B3F941E9772EBA1F47212C666F03F01509FF699F74EDE27182B6E98AF49D1BAACB41A328A8C34D6E8AA3553DA3962B27B041495F269328B6BFB4A385CBB118953F3F009920EC4C8590003290DD60AC89177BB8C4BF753CE723AECA392B8D9E5E9E4113DD062F294A77B6EA9A0477E697C04C787CE78A92C704409D37D37B6B392128698D0D8D4CA101EB38B92F467F0D86EFD8759A14162CAB55F8C457E82392790A5BDDC8DD2663944F880C95EC02FE5363B064623994EE5D4396C0E44DE2A3D225830BA6160270BCD110A942B0", "92A0DEABA9875D4AFAF99A24C1D5F10EBBE6DEF9CAE5B0C85B2A0417C1CC5D1A5F71CD8F8A4B013C3F012C0A19EE4A23106CAB8662C5A2A93A971D0B6E487FC05BAF5C355A9520C9148584CFED3EDD0F38696E161E64378C831C586D9178A0CE289A67F33AE68C02A3CD138FA09DF1CAD01EFADFC8BF6F5407B79B18D09C82804736752D08A1FE09EB35F544E9F797EA36DB493BA947AA82513EB1615A356B5AA4308B0B4183E070EB494D628159D2D4BC3CB110AB0CCB2E9E73B5B7EB567187621E72D99F1FB78565917B28464A5F29DD8D6F98B6ED703040A44B0ACD97F15049E009E8533FDB0B6DB2F2582E6BBF81D7B0EADC8F402508F6B8531AD13FD1C55978A8A70DF4E053DD475132D348AE27581370EC14A3E0F96E0D70DA4946DEEC0760011404FDC5B436CA7419D05895F5E0EAEEBC88C74947733BE9919F18CE702887A6C4DF7C19279B82FB646090822DA9CD9C7653F6B931A337A28F7A4A01DE0CC0744F22961045F8EF8D4B30B07E5EDF5FA944EDCFB9841A9088AE82444FCB6E90B0E9C567A80E8C42EC713D78132F37AD1D2592C31C93D2EAEFF38AD94E5C0D94F949F47B88B03BC1EA4E5EC9C7D9DF19ED208B8E44FFDEB0B625F633C7DB1C826AA9E1C1309E5B14A0DDDB79714DFDCB52221CEAD7E8A140DF7806F127156478AFBEE922B8ECF322D66B48BEC434299BBB36B3BD9030467B7F2EBBDF358", // 10 "AFA7FBAC93326D0C36A388831B99DF4D527BCE7C9070F7B46B5FFCDEB07384801AE5F86A89934DE23DFE2C1AD117797D4FA1BBA6175823B41166DBE9D126F17B3761E2C352AB396A5A9CCEA42A5E9EA1BE3497C0A5BA9121DB97F64159AAC78E62D7DEFF3BF4CF73F8CFBE045C9D39E41D5D208DCC4B47CA27E900C3CD8FD1408DC5E0F5114F2FE65817D37CD1452C4967ACAA2119FB8D60E5E2FD8A820D0AADD88B94D40435C095568AE6394D3B97C835BA868A83083316C49C75D36EFDD85165BE74A4F2B2D21295EBCE085D9C4A4758FDD9CF71B97FDF34B7B63A5E9691DBDAB834D87D5B52CA9A53032FFE821398616EA92625C2DB633E37911987083A3B49A86FC562FB1264A75643A5FB6E97162E16ACCE353227FE61A859E094C2359BC4645946AD12AE5C39C70F59EA7B597A9B3372C23AA578146781A61163C92816627DD9C4BF1788087821F9F5D41B75A0F251B06BBD3E29ABD41E72A1D48323D24E2AD6F11C2D49678CC04FCF6B0EFD33BE6DDCD444F5CA02FE158112631F782CA7B0C5F3607ED807495BF8E82C5EA51A922FE28C8168D9844859E7A3EE3038C5D1D4BB4B13406C340894DF46406836739E31D01082BC84489592DA0E985630CEC40702A36DDC301B3AE1E8101786FEDBF752F9E175287C239C18FC25795BCB479DEF59C58C373313C02A1BC5F16355E2B50EFB58855670868728B902653ED80", "943CAEB680AA3E630755DF32F406F403D7AF5E48A710274D3887A7AAC8EA6744B889F2E0CD2033DEC0B434A9591254A0AA68C5C9BF11D35765E86B437497D84E5DCBBC0C0C580CE9BC50EC6382AD74DB02C2C233B7BB07517D48056226C505ABF2DD244F6BBAA23313D570558B065E42327768078EFDB53DC465DA038E3B216D990EE951B3E13D3C1CD559998F77BCDCD2B9522B6F1DC5E12C912EAEF574AFD69C251F9B2532501AB9F4B3B2223D0F8920BD562B0D358A14AB0D196DF6337D1C96CDB47AFEC6F81DED4B5773864DA32FCCD06B9AC53C122B2C6327E6E5EFE227DE4893FF15BBB2257FAEA836E99676EE32BF6FC14D4F56EA191B8A3870374A0867C49EB0015D1C6D07B87A36BFDD1DCEF20EA7B80D997CBE2D83EB5630F2EE6F73B0D50700C89E4F32438F5541360683DF11DA6E7A3C1E7DB2A87800D9245BF04278C990A8DC9CD86DEF39CBC6D4BC00FF13BBE132F9D86681A8913BE787CFC69C35304824788716D52DC74CEA399E06DE6241780447C74DA8E947134D8B2FAA9648D6D5F34C9D60AE5973B5BB0187796D589C8FDDD7675671F28C04AC1038D09251980683CB712F694D7C5B0D5B1DE86CD10EAC4EA04A55BA8803D78249BEF516D38067890105A23212E72879FA267A8B4F0455A81F17CFD3E5DDC55E5D4FE00F83E18626C676DAF00E6AAFCC23D209DEE0B0FC6C2AE4DE161D13017ADB5D8", "E5E70E7837D094416558C044D758383EDF5755C80921218ABE76E51FB93249E211A38FE6D07A7DFD2263E6E3D8DA0F921A06A606B804DE7AC3FD097E5F96EFCC0F544D623FD6F43FB88CEA7C341E901CD47A7E24AB141E998FE41CA87CD6CE8C1870D9ABB6503BF7E8B659084BAF2237DFC94F35C9884C7F44B87120BFCB298696E613C1656AC4899781A94869EC603B4D38665337CA8593AAC83AD8BECE10302E4B4694237E96CCD3AD9CD5F8EC039A1D1A4210716371404C5C3FF375CB3A33559B1C1A239F2E442C8EB033501BB290434BE73489F716965393989422CF4D57E5B4F3C76AF3C5E8999E61805134B9D7C40BFB59D0D0FD30F98567E66D6148D6AA64F74A22C50AE49D6B1ECC6BB5A002ABF38FF2E2436766B86BDDE7D95DD6E02AB0FF06E7BC22CEC98D55AA2BC4D7B91C36B2FF9F525A74423498D548318509320FCCBCA582A6C2996AF6538422FF0DF060C0BC7356B0850A139AC3914338127B786F4BC58CEB6064DA881376A147DFF53C6700BD13316A5874A75D7B9713DF54FBB393BAFAAD7F7B0710C049A0B6A8B76A9956BF6185BA39D9C347D179FBB97D4FED68F47DB5AC8E0D40122EA51C4A1F88D23153DF651A180C2AD456ABD7F851B65B220A72BA48FAD0436332E4EE7EDC554B7D75481EE05C3D3453D760E9099DD27B324DD84C0C0C4DEC4C674D25284B16410F959FBD09D9DF09CE875601E", "BFDBC82ACB4FBCD5A90C5967EB2FED597A02607F426002128AF4B38942C85AF4472B3CBF3B183F240E049B251713740A31117F108936631FD0F11C5F79325BD6677A2C2B242965AEFC147D93358730AA782491209CBE600976F56030753CC979C240A196647CD9EAB1DD0380E59BC7905EF740C3411AD9DD72027D0D3DD6DEB0F5F3C18F6D6F7BC59B758E7E262937B4599B38567C147ED2689BA2CF23736CAF55B6925827E2B70E47D3813C94C85298BD6B49C97B5D0221BE9E3164B6FA3D95AECF53AF170966090F19A69E75F188BD2556B4E8FA7DC4AC6C34F54297C06C2A96DD1C45B42E6175B5E8784568F7FEF0B6C124C5019CB577B374941E8515CCFC21F46D188BDD2C2284C688879A5BEC50CCB97FAEE1F75580577498D509D3DE161BE216C873B29E178CE17DCACC5E9E2224D05ECC842FBEAB82A75AAA20769FD81131CFB69D5E35409273CA106FFB27F63FF997CB500F161F6DD3A8BFA5719F004EC17860152D3290951678A131E4F3D3AB34CFFCAB2967ED9D8F1BB987950306BD28751D2AEAB05F071B08574EFCA01E5386E04F727BF413A8279E9392EFB64D9AEE00877C76C81EBC861E2B484A2D35E592A131726CAE61BC010B954721A82C968CC6F384D9BBB99B4E87846D10B94EE31F64846A5834DF73A67A267B894B1C06242D750F15F3E1E850A11CB2E2B16155008F91493AB3BC77CF9BE56F9DB20", "D64F3D1CB54CDB9143D9E701BD313779C09DA064D9A85674CCB53B0C5B4446C122098961D5EFFD6A85537486D5EB26B5E18FFBFB8E6EF16C2DD2C02EC7C07DB15CE33015A636E225F744C963BF0653A89A48F1AF04819E273A3AE1F5538AD574D553C5A0DEF47B552957037BCA921970C76DDEF74BA083ED55363760A6780612C075964B083B4F674EA0012FD1DF09F0445CE75A698852098206868AD8241E3B319FA8D2D86DE6E7631DF1AEB571F9676323E0627307F6D8F569536A758DE5EDAAEDF80F4335E3AFCAD07F70AAD5CD08CCA1E71B84D4D97931F924AC0010C0811972ACAA414B89FFF7917E653BB31E9CDFC72595066C662CDB9BBC96152D46BF4E8C15A8D34809C4B9D79871BDF0B63FA294F2D667624F6E0210CD40C92F1C033C3D8BF089EF85C4F571CA727C71B23128A9B0FFD70CEA93C316FC4D69D79B089107F292E03425B2552AF5AA18FDB9AF86EA1972B66B1276B09119437E4DFB8F8E3972D91A93816EBD7D8D715CB47EFA742938B0B49FA27A291B0DEA1DF0B8F878332103F45A99936896181E51FF65C6995F57C2C54B8002DEFF54B0EB3131EE7D61030C33B5502C49CF398FEC4B7615D16FCEA3E8EA12BFB311D426331A06606CA5A066707C4AF8D1048F1CA6065FBE506D06C6C00D5D250E227265551867A6816F05155FCBDE24D4AD115BDA98AFE08B12A1F32E7C2ADA801FFB78BA05726", // 15 "9D6AD9889EA02FC9A58949290975DB0F512EB37C8156CC9F1242B9E45F22CC1D6ED1CBCB6CB245811CE729261641FDF7A8F389BAFD7311B8BD689E02409F6E8C5202F466349EA466E5398B29C8CB126D9600D89697A07A6900FE8D95951903DAA3419839C2D9E35E9F4EABC04C9006EA585F544C7163A33D7E78DE28256B7B8978FE018CB529F7F79BBF66DC4F0DECE80AE3C2CD479D78C4480E4DE2F06C70E5FEBDFB4ECAEDC2E7BD891AD6C91A7C2446F1B13B340B7160782F6CC5B45F9787CF1B0985202DDF02EC552A6DC41325FD8D31A4316C13C56F7157134F66E1D103CC3AA7EB951C92094EB4409E6E7BC494434FAD80999D46D824A5A57390599052025F7DA4838F7D16A8DACDAFA06D175546FADD1E3F7975265230F6C01B9C1FB1B7AB1F2FDD43A5778E3C88FBEA70575CA26D94D249670E4D9FF28EC67D15829776D7BC6754D2A2BB01554E5FF0C3FAD8A1CB546E8AD5E5314103D086D14ABD30EA95DDC591C13D96C1CC3F60FD18D216B67181B6324AC09A97C0C45E50EE8380ED42F6E0430639373E7760C708248EE7D74830E9594114879748883F247D056B2BA94A0FC54CECF6F5C6AB4DCB7CFC8C224F40D886427504233DDBEDCE160DEFDFFD69EE2B75746D9CF71676DC453FD01C315ACA96373ED387B040BDEBA7FF3CE00D915F90AE6E1796971F8052160154E8986913AD7BA291188EC49A60BE27C", "B5184F7D580935ACFF18201CE8B5D54CD0A1CACF102FBC8AADF391C4CA5807BAEEF4E5E47F7459E74485E48E0C42D27CADE6970714FD97C08F9592FDD387C859FC12C1CCCFC3EBF510D66FBD8C448C25A322CC5887F94A55D48ECA362C690F24833C3B032A047D12BDA2ADC6824A1F6EA9320BED27968E9CFBDEC60D041EF538F1740C0519003FAA89CD4224293167E05344998FD396EEF618E8F547990BC06A8B76D0FD6FAC13284601AB7191CEB813C46C45CE7B3FC09EDF08DAFE136BFBDD63E6CE7E4BCBB16C5DA68AC71A1298FD27363349A261C2F2CA8CB799E8604ADF70092BDBD6A04CB80568776A537AD1711891B251C74E42FCB095B23EEF70F167E8B4856BB7F92E3A43C79FF4437262DD70BAF9B16CBF5F10D1AD7559AB0F8CEE1B9FAD058E84FCC342D9F0D9FBE4207D40E281416506242CA1B8DAB28DE88D2D00BA21AA7FDDC25940CB29F02811F8DC6850A6A87D72CA9F3476A73649FB4A254B1204CC1261E7D512BFE7B0D0091AD5CB0FBBB765FB5AFDFAB0D701941DA54832FE8253BC0CF61924BCA2CA231A196C7C32A350AC9A5FA2884D8571FEEEDB7D29632E71898BB62B5E4E0104F73AA6A9C6B8CDA816872805D75ECA64F961641077B259C9D39E2F3CCD9FCFB1E6B6E2692EA34336A967E587F32E49B961B91311198A204D11874B4BEBC6C04DDB5B82D5B741D3CEDC03A56A2017B3D2C4FBBD4", "CFDD6B78AEB21CDCD6AF8C349F6DF8FF8B96BC8246A672A16E45B5D0AB7D992570EC45A534B77F204039FE200D4C5E7C78FE24941F578097B216177D8AD4E1844B2E52D843256D0BE8504CF2D5B639E2CD501A6FE39B8AA7DB7DEA924B38692E43195DB7E5F25E25152DF0FB7E0D4EF63F99CD95F699E16576702B651C29583645070011B2A1F88C947BAE7C94D48EB07A132DB38D4FE2B77EEAFB31AFB442710BD0AE4E6102DA69A454517B6F148D97DBFBAC7305979B5D74D7D7568A0CA56CA89F23D8330261025CC741F9D7A4BDB356B544C68C89CCC2C125F5C71E18C4EA102343AE4A44F6FC695810E6F28C86BF53F4C8B8AAE46DF6006B1679EBEA790266D4D02A2095074ADA634EE60C7070285C316E1F191BC5A88B80D673F144D65B870A65FC93D8B4BB29B80FD58F9FE95F5994878308CAC5394781E4D5A3F5EA2A8ED834EE5BD31D2058C843F22EB778C4C25144193DAA65F9B57AEC4A344713E9EDF913F3CD29196B42E71BB182AC3B1A60AFDBF1112A86A20BFC1D28D3E0DBBABF38E8F12651C207C951654FE8C4CECB6C6F93EC46456DAFFD7320DEC8D08F2F712CEB4D82407D61CC47B333F69310C06EE1FB5ED84F83945F05D4A87CF5A68D78B5536880DE3443E804040E599BC5837E22150C93CC1E5E711F9B889C78C6FF882D80857EF41ABC5F12E99105E6C894EC0B796E0A645780341CBD039E8C6EE", "ABA759AE16B9D8778FAC203FADF48015331D6499B8CD74BD71ABEBD3E53ED90625E3057EA47BE587600F308D38743A686EF6FA189A4D86E4A35EB798FD2307345FBD10FA701265F6417603365FCC4CE7635924428167115BA372294C27A23CE6C27C506603C5A6618A2B3344BAC50AB7FDC29D36BCBDFCE0D48D088EFD8EA1DE492C543093C30AB7694627C01B334CE3368AEB4BB3267EBB1096450BDFC2571977D7EF78D6E288FCE0388A041838EC2031248F5FD659C70180634A1DC7196C8D9111C75B51C50F854CEC63DEBF9FFE1AB9406735EC3187276DE7CA2FAD4287027956C93B8E84B7C0C3A9C3F7E82B3DB35EB6D2CEBDFE0708FEDD764C839954F2CC9044B652D0A01D28BD6B9D3DD9740CAE39AA52597FFC1227FAD8B78EAFFC31BE94A632A1AA7A60AA5A9E090DA2B62F6DBDFDC50DF6EBE1D9949619FE9B2302248D6C801DD2D6C01FF8206A93C0AD22C6990C4EECA7D4BDF36C3246A5D2D2B3982C608E6AD6BDD85C92682EBDC9E4117F8B7F841239C2A5AD7977E11E4E9CA73A55859EADF7C9C2F1B28A6B4AC7202019230063331FC5586756CEA1F8478173A0A4964D00C1AC099590152125A4D01592C54DC2555E1BA34C7AC039394D1979AEA2BF7B2B2A8CB9D62E89132CE9E3B325F023AC6E8117CE57AD4B271EFB0C172FBFF8FA6A17A490B67CA7B15F865A8AEEF37651A622390E82AFD418C7AFD48", "CEA29601B96AD3A831646922000BBFF02C014A9136D9A151A0E61A51F9FC2EC0C3A8F4C83E64BDE569A33B4CD653C1345B7CBEA3B3AC0411B6145727B1DBF6066ABCE9DAA8B0DE58ADC2510C02C2619A542A139FA3EF7A03AD3467345D9573C107A13E7FCD43C0D51DB5EC1A09D409DA75462F9C71F0C9E36C2742C279C910F07CFC5CF7F98AD48D67232A2DF29A66B78209557357A4BC91922D4195DA9533CD3501F388AF6EE2BB3AD08BC7D53015059988F5B9BF7824D066DCBDC61CA588DCCF0EBDE4A96632DBA22CA0D770C61A1DD66EDA882D02C5FA284798E12296E89C45906D315EFDBA816FD869DF869A65DD8BA4E0B13C441EEB052EF3D0FD436E4AC68EFC749E0CF4C7E15599D5514E136ABD134BA638A02E9EC1FE66CC9ACBCE5082C8734196BADC21F4DA7621D9FA725362C411127836A26CB44CB3851D53C599B94A5E67862665D7092C43D9B4AD3FE20B8AFACCEDE920F440F3BF5552CFAFAD04A7D7E0A9CEA18D497282D44778FB7D5072832C0B77C4C51F4DCFD7AC07DC7A9863DB8A38F1C003CB852F6119BE801AD12B8BC7393B00640F125C734447DB2FD8B02F7F7FC7A23B84FB80F9CC08E3EF888634FFB6F51ECEE9B20A89941FBF2B49314DBDD67CB7A1B5BD8D629FA327AF2CBB47B5419A0A8CB807D30152FA560690DBAC49D6B043D5BC9D51E82C3B1CF4ED69E997050C65197F3D93E21CBE91E", // 20 "D358BFC8C6AD1DC94E71D1F5D05589424275875AF8CDA2ABCC6404D6FCB7A2E0A74C68024827E02621C10CD5FB149FBA373AE32DFFF275CF386C3D7A04E3FE10B6F1A6F4782B4823242F29672E847CCE760BA005D6852A3459E7576A254B10A9A78A9F8112BEA39BA65898CFED1179D68211D98E6950ED06399E39433ACD898E2F6C87F5FB9D99518EF36429D447B0EF0C5B7D834ACFA388578BDF60D4B1FB5A0CEE7D1D613BB9B99E36DC9636E70A543BA6BF0B3A448DBDF80469494239D4B7C4979D82E80C08EF36EA67560C86665D458040CE31BA009BCDC30CCBAC50259E4485E570F190613CB010563F6BD24C2F1CF73F6A6844AB8350D23BBC3D1361E73DCE94AF83697BB817BA366C9855A754EFC2F007D99A964125682E6F5CF7FBBF687D221B5A0FD844477A2F87D5370F4469F76073A93AEF7812275FD4F70B2040C12A83ADE5E5D862684D119DCA0F75AE2B56C794968A68566291B731579A1055A84F083B3072B7BD5AC9D520F64F0829B592875613BDD81C11622B331289C98501B01EE1D813C0E97CF36878260F80BF88071D258B9DE02F3F90B4C12BB56CBC731550B5EFDE6D97A1283EEFE61CD6E5DF312D0F0153A32DD65B143EC6A3F2B64E2B8FFB47EAE46BD92A6EB9ACBDD11A2D730D027A3EDEADBA5965198FD59BBC8574B680B96AD48586E5B17625251BF4374E28C6AB956C6818183FDC119499E", "FE69433233B6067B0EACF1F47BD3AAD9783FA30F684110D1152459233896479D08A976B853E4B7B52A34511239961048B7C1B9009095327C86F2EA291FAC1734ED2596EF19D04528F3D8F2A3430A0C19DA6A70A37DB6DC034BA0053B57ACB9E7C00ED9BD6AC11339EA169D9D54E6739B051AF40EE79A1034D6294261E1AFFCD61B9CA5016C56B2D1172D9B2A7283E4EE0A06C8149E5A2DAA263A5D2429C2B1FCE75C41887DD02E056EF8724645FEC6FE7FC1EF180529B1E894773CF3E2E1D938EFE9CD824D91454116797F5A84746537FED5F0EBF0583C8508EA0745B4989954EBC4F215BE3D515687BCDD5DFDAB9814358B07038E0CB869A8C34F916FC67773191679C60A15A0A399E224D0B0168439386C0AEE8F5EF77185AC847A66D934CB0ED6A3467C3B386BA7F115877F36B49E111DE49E409468F343A98974F4EF1EEEDD282F73013EC2727518DB46C6751A58AE3E0D5F9D2B966D4465BC5595BC31B2712AE1E1BF9915CC0E02CA7240EBB9A045F959E77DFCDADAB6248D58B47BBEF3C775DEFD629A2EED15201A21ADCA470B1AD3084924FABCDAB6B12FA6201E2A239AE8F1BCD7CC39FEC62587E58C84AAC15935D45261E3AFEB60016AFA0902DB98DCFE586513FF70EF4E3F47773635D475754A158FACC9C470921FB0186BD6EEDEFCBEE9C803118851F82CACBF8C0A544B0562E2E27286CEA5FBAF83AA5C1F97A", "C7386F9FF39FDDBFEB223AD8B856EA2E7F3AFEDE197A61F183FF7DF2FD6DE208E71E6E1063FB3774B696913524F7488EFC2CA54E8B653EF5BCB7A8F4994E312DCEE99A316C2ABF3FDF85B8FA9BBD4366ABBD7B3D3D433C14710A95EBB3D0FCDA2D37A443D62A8361DA78ACA781CEC04542D01DE7B6C6D14CDD4EA709264251D46C42AAF404094286DA5BFF8E81FA2F8C54B172821054F4CED82287F29EA3D3AA798C9CF5C5A909B9FBA641A8D9E310248B0F9A1375CE4DAA98EB62286B4EF4DFC58B877A73D017B17AFD7F1F58D3D2CAD3B7AF2F06699B08B88FB4EB70D2511190158BB4928ED1735C94400980144EF9ED06E06074E2F29325C1AA316A46E8E617B3CE916CFCF05A389052DE120498341EE26A27A3D757AAE763046B8CBC841350292F06AFF97C9707CE5561F5C119E2FF6C137094F62573EB80DC13862797C3319158DDD465FBC033CAD81BFBBBB54D9467599D751B9980A9AE8BFC6715C5EA74859E6A10DB369D5DF83A92655A9A5908228B33B36F55DE563005B886EB324CEC4160F0D18938E9FE41D39234C29E13B814DDCD13CA6450774800924B0848735C5DE076F66EDC973FC83B13938811CD9887371470AC5DD985481185F1191EA8C1D3A7DC65E1E82E2318D0FF0C9AF65EA1515DDC536C5A8BD0AF481789838DA54A39BA56D014E12242600AC78D28ADAC3FFD3600E896445868064D1D2ACF22E", "BF5202D3599D2DDAAE5F526B6B6AC469D4BA0D0BA5D79B1DB89173320F0EB68F5D9DA495AA0981F8022426F68519B548B19B5F8CF068A6CA1442AF77C83B7D8649DC281BF438F9576F7A719A902A860B9ECE9AE9C14B98859B282010A5DC90DCE612AFEFD44E0E9E7666A461AE50C2656BC036648B826CA9C3C7C53B30976335B097C19390716A41FD437A2098BCFA2B2975F1EAE5BDBB8192024C20136D2542FD89FB8F2F94C08F765109279BC4E511787496233F15F52D7C3BC3E98A6DC39AFA1818B9533EDE72FDAF021E2C9B7D6C74E49B849F372B1A131F4C532DBE3B63635E0E1334C87DDB6F3D73883D2B43E87CF19E40D6B404E581E807E6EC1A94F5261C7F7EFD4CF043C90A1A7E97465022ABAA1DC21588FD285E7158FD9B67EC5FE7C9E84029E961E045EB5227E4726154F4F057FA337BB20DDA25D11632A7995B810764084EBDE01AF07372EA82FBAFE0434401FCFE05CE8FE3C20C01ACF4E9B8EAF4D50C73D5C42A95526CDC8313DBCA6ECEACB457D9673565A1CC0AAE23FD6261A8943E8FB84CCEC676601A4B302A9CACDEC8998EDC847A53B3CB0E12C8B4A7897D5680CB14A3D11BDBF4826C3938EBEEFA0075B6494CC714D3C0DDA2F5F783CF23AD2D2545C899867C1115BF4A4F559F63E68098955550BFA1EF7771598EF86A08C0C634B291674BB77615121BF0838DA96D6E7C53BFE6A58A382FD9721CC", "BF8903A3918B3FDC06CAB4EF675F7BE3962CD7E3C6ED643386EE533C3B24A3D94D2EA2CFB83F0A346FF2875DB07BA647492D47A807E7FD9717CF12BC97B3C1BE1361E598850B39D50CF7BE700507863BC4BBF26620FAC11D97128049BD96C5E09DC8FF3F62655D660FE66D31AB0B0F6D4F8420E3D2E633C571D7FE2AF1CB4E3BEE95E092B00EFD2796A3DEF376F75B7EFCBB141337D81AE52939D87956C41B1E42C1CCA4317D31AB4F53DC9502A3DC774E05E1ED5008CD931DDDB98DFA69960A6ACD45B60895C4FBA2BDAE8BC7DB8C821697558B1E0A3111F156738409FD180C5A4A33B24C5EE4991B84133CE9AC089724D62DA9D9827A2A04FC103652F216A0895E78A96086270814C2699F475CEFD6359428D8C505BBE8C1A96D2793802219144CA6B3EDB455929B39A3E9F3AB74D685608CE3F301FE38202ADFEF529CCFF46AF36DC24956A7CD07CEBA55AA4C89F7913A8A4B844FD8F152C8A823CB9888E3BFEA97D7E4AAFA07125DA4F51D974A5DAFF0045BCE5B868177A91BD932963451EE2673A85AA8B7D493BDF25BCC2F64AEC3150D8C40C835AB4F5D0B7F259DF099BD6FA9F5CB198B61018B1448035CCD34E7E7A2138F437490026050BBE3CE2D4CF4F4F095CB97548E5731A338CB3903519D6B13A029727F047A7D00904A556C883745410360FC878F77707A716D549ACD6A70A18F9EE0AA8A6EE2080608E10AC", // 25 "F58CDE0EFE2356F429B0F2F9A7869A4142A6173188DD75B570F1D1ECD282E4AFBAD11370C5B4CCF3C98535D27D73C0111F11A84711F732441EAECAB684F2F0D7FD4FC4070749574922A906E84B3350CDE5957DC388FDA23BF45F05951A393DA253EAF691940897B57ACE655E9630F09856E76958D6BF7B830E0CB8182AE226F39D48036C867BEFA7E7ADBAD17C1AB45297C757DA4AFFBAE677B05677D60DE1D975A4F3D7EB3461B424B67B61025AAC257A69FF720CB9DAC007C50C69A7ACDBBCE210BAD4DC2E629A039D98E7EA037A5C344B5CAEDCDA035F28677A41D55A0E3E6E480CCB12B8F17062A983F4E651B4F7CB217FD06BE46747CD5418C0C81916465A4F5660152B3E4781DA8040D4246F9BC47366BF663CF9DA3BB247D9238873CCDC6FC62D1D8F669EFBA42527112FF4072262F7E65AEAC328871DDF47588A0A0DD13A4139F4145822A5917F624B881BFC354F37B6D59C566823F629A21C973324F7167BC39FBD2C121D2A849308D13DA1A28948EB59F7DE97E364223E17A30119BBC7F43E21E7DC3093F7505055ADAB4654194A77C1CCB61898840125455A275A8F071273D8C13934915D379CC603657D99CE4075C1F1DCAB60B6BD62ABA1A10B5402A59706798002EF30ADED2F354E38CE0B57900FDAD31E7F684E53D097B4313DB552EA66F6D337F29594470D3DC0BC6CD361831251004DD3C5357BC0BECFE", "D9086F7C272AA317C64C00AF43C924DB5DAC97F8EE3ED2296252FC4756FCE6928BB009D4488B9BAB757411BBA52BA6F61AF1181CC7BBA94257593FA1BD26D52AD5014C3F1A1832FC4F7445C8BBB77C8FD31C88F0C5D4736D49DCDFBEEF2B8301E31185793BFF87CFD9E6F7E084D343AB98BA3518A87A5F915BC0D76B01AF7DC1CE45F1C5280BD39D3E3D94D0A0286F8BD9FA942849664E08F2BE0B93C6E3B89061193FADA0FA9485F62CA87F3E68E204186EF1187642D651162E4D8E7DA049F462362D8C94539CAAD09AE4768C96ED6C2CAB8025EBB6901CBB26865E1F19FA1B193D47ECE390B881233578950175C85B928582D5B439EEF2F56A8C7EA09278E47741051223AC182456C4FA04D025BDB33FA10C48C70EC91BC709E3CB0FA3E01DCE5FE5ECB9018130A8DE5D0583EDD68EA2EF227A612748B2F785A30A01014BD479DEC6256C8AD88470F79DE0E1432CAE448DD7049E5B7D4DF3C978F65E708CA3759AAB9D329C11FAD71204E1E92322E3EA1BBDD9D034E2A23ACAFA21CF490AA5E2E419197DBE990667BCF277ED61B264632F694392EF52F0A27C38E478257AEC8D2542938BF0713EBE60779C95A0EEC8F32A5202A849CEE8CE0F99702F595AEA839531D4CFB5F5A6166B06EB64387552A1F9BC6BB97B9B99D19C3D2E1E8E9B305D525E7413496E40FF50CF77D4D4E2D41B1D5929848FB2F1FDDA5A39DEA0546", "AE4E3B30560A50DA55AB3E59FFF512844A2700D2D763D85D5C3FD8CFEFACD4D023BD926D3EF2E55EB1B3831F2276EB07E5C07B44FD7D79333699BED0804B678915FE0F092DA9A62F69CB020DA21932F9FDF9AF332E1B400C6B7E7880508E840D62FBA07E827A23A2575AE68E15AC444A1CE35DF3C3F7CA49DEF2966DF3BA89C8E90ED5E2421A6407F2EC51A3E92A3608FCBD6AD9FF9E5C7817E79A0C09FE9014F7AC291448263E4346CBC4BAA6EABFB59B4526B654070084F52B864F9769181DC6EA91B576956397CE55CCDDBE41F94E5DC366E775C86ADB1C807B66D08696A2BEE45B90E8736469A371F05929D9D9FD34980DE08E00BDE2CD0EAB6AF2165D76519F8F2D894AC70740D2372B37407BDA4D943EDF1CBD35CCE4D81340CC97751C568731C009DF65571F28B7F58106AE67279E83C3A0C130DE0C5B6C99117099548661D290C4CAF3BC60EF719E2F7B210FCD4381C33904AFDF96DC3A6557B42B6EE895B4D604F5F8985F454C51E32B2C874E90926CBC58D044D483D6D2A7C26C7AC4D190531F79993D07B2E830FEB99BFDB00AE8C008DB1B762F3F4A81D41295FDDA37F3056B1110D4F0CF385F9FCC7E14C34F6752A2FB17F5CD3FC4AF0D51E4A0AF7D28DB0D4D651156189209480054F8287266B1CB26C9E8CACAA0BE5A69C696300025D160F9DA29F9EC79838941459B7B8164AAD95577A0C532EC2EDB35250", "9CF0CC00B5788DD743A5F33D87E8FA5733B72EDBCD61AA4B8D0B81213DB52E7EF17AE90934F5EC0711ADD19E881CC330F696179C1BA464FFE6D7B04EEC383A4106BE5892C5DD1BD719AB3739A909A384FACA455E6AF96600AC6FF809788700DD2AB93DD228483759BD903EC002D4C1278808B764F018E3B740EFD821A61F5BEA2948A653041FB31F6D5D0DE0A045DA366E44112C820FD7FA966B2CCFD5A6816AF84DC0A3EEB8F9D2F0A912586F91D50B1AE3D930A680A8FB7435B6875ED2E599B87598A7C20245296C4965E2E0CF372B6ED1219BA68CB646D3E73D52665AAF2E3D1C4DE8D264578299B166FA0E148281C877FA9B14818759CBF7FF575307E80B73933599D94EAD2FB1C08A30006330BF0AC1F1C0A4EE6B07F9F3381AD7E2E469E8DA9C2D22CFC0A208B58924D2F994AFC0268EFE206E0A9EB79BB51CA26FB49013B9A17017E0C08F9FFC6C319BB1B5AE41771443BC670EEB91D7769F9890A9B80F52CB0167EAAF850FAF2A52B74ABB1792E7CEFF68C0D38B01F244AC0CC0EF0731E3BDDCDAB89DF376973A7ED5D4264EE82C334671FCD39ECD6E2CF869493914F332767BBE461707166A9164776D29F5EC9291F505AF291254D7319AA594B5F397D5BDF00BB840C4DDCB425F4325ED8AB77E57BECA3441B89414616671692EA88A89D2690A4B5FE958F990BD84A3884A60FADD5DA57EDF01865F85829195460", "B85B6E754CC8F6805A8A19DA104418D9C134C8B0DBCFD5DAAF5A71BC047A73BEDBC192A453674BC624959BB76E44C5B34244D4736ED3F0F3C9658FEC0DA5437E01E128795EDD7593D636CD73FC1780B37A381502633CCF2EFDA0BBB494C1D0FC7F602DF8C282F55E3828E81A92458EB16B74835040D8A9C8F2DDF180A617B0592344B4373E1B526C9706B843B0CED4D25D7324C6FDD0F33133C00443638E6249061C56A116CEC7822F4512AFAEE52CE8F94D8547F72612EA8C7D160C65FA3BCC92BE01493706EC4E5F203F0BF85C52F417BAF8AF490E50133505685CE63AC5B173E07D8DABB2D439C6DC18B41B9CF37D02C92AB5C2F27EC83AB6B2DDCB7ABCEA30A95BBC39E9FD0CBB28118823F7D0342F1EB7B45FA6BB3A50223D0D7B14E975E7658352BC9288B48AF1346955F4551F2ECA47D423EFC63D20681057E5EF234D061A5E6E234ED01F3DF223A0E8B4DEDDC552C7DC3ECF663D5011FC907EB4A7CF746AB9E07C2929B7427DFE9E00B0A1308881912635A72EA99927F343EBAD32436A9B8EB1934AC29E79BB80AB3ED9F5CE39D1E43C251564654365DA43FB8A0FBA27F2328D82445A1EAAED67B92716147E859064AC326A42DC7880DE82FA782AFFF9C59FBDCE088746F8CEDBA288BC8C2C4B458782CC9BE63A86168B671BE99A09F2217B7BB2A7BC88651C1BCE8A0B89316ABFE72B22722273AF570974D8EDEE4", // 30 "DD40DD438251E401FC926CC6968393415D52D521A5BB34D4272D6BC7B5431062B35112CA709C0680CBB18EEE053AAD62B2391C9E9D580562541A453ED936CE8E88DFA61A88CA3BEE66CFFF801785CCE863ED9C36A04D2DC8742A81CA55127B44314AB4E687ED921B4881CB363AFB3CCE7EB774E3205D4591939ED7D3C0C508A31786421F49669E120F01D35D467B40F85F2454F13F591F3B830937421B5C8A6C20EA878971AEC941FD99CEA92FEE00E5DC2264987DBC549EFF3E4A26AF0CAD7421C4256D107A3E8908F67450960E4E41FD7E2E84F754BAC81C8F5F1D6F650DEB3E6EFF6059836643209E3880D7BDA701869208D8E4BC8D0614066414DB3F93D6EA187950285F55BB7A1B026EA4BFCAB4671B07704828D5CBF9730EFC99E68E91F1FE9664DFA73297F2D6BD9497DE04982C9FF3730BB6FC3EA2053B3F45DC7FB587BA19B3C6B7E780EA5F25B45BB727174D4CD3B401FE1906360BF0B15DB13B62752F82EC62226AABC83C1C26376F8366BB849DDB65958AD969B25654DEF1841518993033AF47EABEE3CAAA936F19E28A205F3CDDB5CAC649DB6A90483ACB63A24EA46D397508EEB5DA94E9C883EB0451D036E28CC303D52B1BB31FFF582605F340D449508959ED1FE2FF0BD22FDF77F9680D6B5647D59E7E6A003AF0C6A95092F0DE43D1252EA6DE00F288BCCE3ED9CE273DCB4F3BA7E8D17353B8ECA24F03A", "FE38B1ACA366B4C15F3FDD4DF0E0274FBEFDA0042BB203A4F6627ED9E29F405379B2F2DDC0F3B02A0CA70A9499F3CE82B87603FAA347B7052CB5D13D9DE84C114EF3B8F62418FB1F3E374B997127667FD6BCA2E2F9DBC04ECA9D908CD37C62F08EEA6F44B3FDC149465AA8037D65A6C8B9B8B3D5E9A40578E5EA3AE1209BA49E5E2AC615C59A2D71AC1605B98E39A5E66A890754C7D1C07E06DE78632587BADAF7FAAB0A529AB791095DB0A708B691E9D81F2CEA8F07B05495528B9FD56F77A4C8209DB972FAADD9791BA59F47C06F241F50C0619FC04F8456339E0AF331310FA4DCCBEA0E5DC2795CA6B3ADD0174AE4B30AC0428320ACEAFF68F73ED11DC1BC9F0237BDC75F7F48BE518EB3305CF2BB898B329716FC9ECF7E99B510B3309808735FD0A77B15731C233998F9ECEF46E2CAA6E6EDC8D05B943ABD17027A80D636E535038FAE44D60AAEC5406A372D62479192FA84D844520C6774CC589FEE16A3A5549495D968AABAABFE4DB94F5AE0C54E603D6DA5C3056769A064890533EA8EA1E5D1CD410CC8DD4B1D7E0F5F787232439AA4B3911C5DC792ECB873E8105A1AA61C627BE57E809C6863073E1E19AD8B987DE97D88A817FB43ADBB7751E36D1F0E7B70B3759D6EA8F2350D10AF38C331E22703B2B5103C908E1D35A8E814E45BAE81DCA0530FC3525CD640548245C259738E749E195B006081A18C45475F906", "961408BD52EA1C6A9F340D9109B2388CC358BBA2D35BB6AB672A9C16F3AF968BE4613BA6B13D115B896BE71CFEC4A4AFC0BF5D2BB1B5DC19405F40E60FDF361E6CC362CDC28B75B8C30B468D3BBB77F3FC62869FBB635A3F7AEA63420CF1B80A4B3813B2240B83ECE999808E1394DA2881DE2DE62C870EC163AD8D81495DBE2C7383B78E19AC506AED9F3BD1280A77F2D9C55600BFA258E76761391145D45F74253C6E14BAE16179884F0F0EEF8150A445BE1B5AA4FEDC2198CC39763A3DB473C1CC4263CE2DD587447DDA6BD0A496E8DF60859CFCDAFED2EEC5B1E77E68F449ECF129AA17395BA39392EB610DF45134571BBCBB26162C83FFE77D188160EBCF598EF6F092881612A04BA9F4215D429BB521E737F6C3048B5D95B20AC37F79AA99A12CD0469268228463C317A1F31E63E4754890F20B4516D179342A76201402BC0DB2AD091A70B4232473343FE9E0002E59044C5F3B6E3D7368DB7E7F9F42E7A4A1942B1161552C5C84390197A54079F570B57E8EA8A30659FF5A61048142E4368D5542B968966E54DBF91D3970B9A3A278B951D6F914246FA5CCCC20DE53713D4830AA86D758ADA7A8747FCD455B2C320FF9E5E7FE1CCCFD6F7928884FC0B35F34118B4E7E6F6A5D6E3FB4E3DF90CEEBCEEF9D7D595A4C456C373C5356EF0DB0E6F8D61E413F80E4C32532BAA39170AAE2FC606B7206C379C4155031AF918", "E03A069F63220109A77232F2BAF29D345737AAFED2E5E8D5C846B937277DC88392DB2D55073CE063F5FFC5717BB89B481B8C86EC01808A85ADD78517CE12DF776CD3F02D948BA795215599CFCCD9B4FE56DD681A59C71D24946225171DC18E47BFA9068302BA428929790EE62306C5FC8C10E71F6F372105C9421A563A4DA704E01FFD71E46B28C6EE1B7CDF95BCA6A794E8CFCB6BCA6AFBB67DED5C1267A12A4752176C3C1E6C2F665194C7F11C1CE6CC8481A5A966719B57124CA33D8EC9862AE5485788106562A0BEBD3980AFC4469BB1FD1653678192B3022E26CE8788C68F202D506DF098D49EBAFF7741CA96A02BD68BFC4FDBE24D34770FBBF8EAD9647C911B2E6AA705F0236301162CD2B41B88BDCFC2A79EC54698276126D6EC0213931609985224BF515AD3221FB5E8A1C4CECD51DB4AFF612157ABA6640866DC6D3602C446B8C6EAEF359BC8703D5EF9FE8EC7F5F2685C53924C6F1F71519E0AB589EEFB393A12C06B906402FE0A2FBD793272BC101D3B57F10A52C172E505B74F2A00BD5D2F7C7EA2883908434C125969A62F1B09F42E578BE22C08E88B11767D97C4C0CBD2BBD98508AFD591EB0B0C846A95FB72159E561F9D87DB446E9A19AF378B6DB4DCCB49FF8DB547B3040FFD0171B87245CF73A0747287B6FA1F1E4AE99518E8C53DBEEA942AFEF75B69E4790D75CC8A5181C609BEFAB641E28C07082", "D8D7DD9242E54C6DCDB2A717A6F33226A94D5794FA0BDC401F4ED842A5CFA4AAB462F703239F684DB9B95E5101A5DC6067C7062AED9259CDB2067BC815C157A7E150F8557C3A54DDDAE94E5C569A1E09C383A062B601F920EF4D957F4BCA8E329123BD6FDC3B731361864CC139EBE3C68FED0F40FB127D9D1DC071DFA1552ABC6703494A632AA1314984A2D4B7A8BB32C555B79DEE013A66745AE15E8E5E4E129E44A119203425F2ABF1F03CE9CB33C0BDC3285ADFAAF4D7B51EC31F02D1E654BB10F0CD97EC3E389CAA34398166B4D5C9FCBC6E957FFEC9CEE4071F90EE2926FACC8FDE884CC6FF1F6EF1D3CC681FB44E45C5CF681AAD13226DFE19E22CE81265F3088D193EDB098988B2640EBD8D9D66708E1E9880DC41A72FD3D64792B14AA18C13E371CA17FB46B21DA9C59FFA2FD075852D42E2A578744792EC02F9A35F869912BBB44DCC648CE6075DBDF457A9AA891488A5450FC719778739AF323E87F9633E621B404F70614F77C65697E71F281675C843C523740AB66756E4DA784F555B5B4D797A06A0AFD35A69DEEA6E948B9B3C2A62D7B1D56832D9CCF56F2680A5A0A3037F4E0252413FB86520F2815C8824975634C0889A486963A2C874638559E14F780A7F3E2318B88B2C2010174150AFD4BECE2C5FF2D37BC2FF791F4A3136E19C373FCF03E471DFCCED19471182A93E91ED3EA68C402234AB2B00ECF62", // 35 "87F0D84B811E4635AE8023B74306DE789ADDF1CABAF5F47885CF7F9A33F2C533093A339EB0D5E05C0763A215459CFF0D31CA92573EF2074CE2B6A11FDD6BAA3C6FA100D23A9AA413BAAFDA22F746CF74562F9DB0EF2F7CDF266142F177681CF2EF388E2E9AA012459ECCA332B779E48CA44E536082D59C3951ECA42F66B600D2621BF5F3584B59DC0DB76EC66ED7D00E943BFDE703E7D5050A8F263366948253B3576311CE88B463791DFA6F401ABDCFD7FA44B158AA97EF1CFD7A8802662A633EED958052DEDB12A6FB353BF2224ECC2322937DE3D39DCF82650B18FC0BC2BCB8CC456141C9F3FB09A0906AC1EB77E50E8D260041E4B3FF4BF3A53F7EB62E0FC503E8E38F185AF795F67FCE17665AEE29BD0D5521024A70B61446CA4CD2B3DC274FBE72A9AE29EF67A2217D6CC81BD8831B5160E4E81238B379B657FFB49023B040B6D504B287F684A0A0C07304E6BFA21E8D0A7629BA32F3F2BC9A33DEE2EAC1A2C22462EA0D24162543945B78FB6E26B86E12621588735B32A4F9A50157F20BDB7A4B6D151B3F28B40A03CFEB3CCA635261ADA2295B74947F1B1D676F6C014AB362C1F5AEBB439DB137D034D00591235B6F8D11C735A0C1964B29D3002D5243374628FB488A04EF245E64F598EB6ACBDE8B87F2FC5D1ACD105460C26BC6E1C7DCEC2E92E33F722E0A613A86356343EB111D0B166AFEC5C7A44B81A607A24", "DDEC47E0FE3E2F4205206CD673EC66D7435E8BD4A523A8681ED77F51453B904E4468C70C2224C5F1D01A1C5ACA89BCD72673F82955FACFDDC4DA499EFD8D18A2BCC5035B0C69D095AE0EF1AFDC389B6253BD6FC83D3C37E809EE732A87D065207684332CBB9BB0519CFF51B553B3689246EC1EA42E236773A5AC4A7BCD37381615F78A41E5B181AF5C502E22FE79436D6EEC07F7FFAA739356CD9544C7DDBC42C56BB1C965441903962703986C93C6F8135A8EC42A89DCB46E754EF5B5250E1171398FD31793594831B0775F2A39E63FAD99929A0F257ADF332C078B0B7E209229ADA46D69512FF2DE930F962B8F81EEFCFDD358FEF8E4DA0D49F39C43AE9D99D8052FCD60305FF4D9FD4CAAA3FA6BF258B867E3F266F1BCC77390D02132E370AC79B34FB37F12D102985950FA5FD53D3D4783DA5B284494EBFAB51DE6CE259E27712A0EB4D78EFD6573A03D629F29166B902795FC8DF59050C9FA48584F0EB69293C7FACEA8972098E1367D183C0B91C3550852AEE6721A84341612E820CA4F53C71A51774134923FA00FAFD84811C07620917C1966F6A26A032B125D76BFA149FD66EBD18F7536285CF94A8A750680D6BE0F4A4E7F2433018796A358CE465E7507F186752EA2FFB01941902129936F7B18321902780E2C6A5EA7D3607227D6315C570815BD0E808EAE242B554824ABAF30614CC72B74E647D5B5A6306632E", "DB29CD5101A3FB7A651BAB94E0CEF2BF737BBEBF0F755AA42F1C0B2E6A2E00422458CD8E2244576F139E811B2469E1B8F10FD95A988FCF872607A9B5CF81EB5875C427515D8D6D4FC58F3C69A92AB4932ED3D1CE6191E648276AD746F12A0D7B1ACE96B80CD2C3B99BD1094ED29F7020121076A6E6D5D750C39633B00F3DCB4793A27B4838C492EFCFDF94D955ED33814C954FFE8B8D29A81C3C62BB2E95ECB393F06EBAB479494628027CD02E59F1AA32F78C53142137965E662DF4B3EEB0B92A6FEBDC91F8B31D41E2EF69ACDE1CFF2AB49E2A4B12C275A20439E30C690D14D4F661C81308F11EFA3D014009D80D794D9F2C8B51E2E6C83686DBB07D1790F56D7C8EE495657BDC081A63B1353F4C4CA74CC0D02CFD7BE60E063A33D1A4D9050A9100F0E181704799357532DE152CA54FFC089E8DF80F29DFA14C19C9D6B7855482622504F95A8948A5DD640EE88B87CA98F8248DF148AE4F992BC7D1FEB3BE07E70F22CC052D92FB263337528C41ABA642C6B1C6F8883B21ACDC69196733FFB684451D188107C1DD219AB8B0AE5F49628A1CE32FDBA4B8CF02F38513E37542D020F4BAFE03EAFD7DCCAAEE9E28258322E43DD47DA3AD625DC2795ADBBBB9FE061917573936E31DE6355023F8D74500D2D032B7A53630F37FFA80567BA36F771C4ACD71D76DE528FF47E8281ABCD325E4C4620D0B73B2BE2787A7F6F485492", "E8F24D8DFB54C5BF909CA2CC5496AEA76E583D2D865259C356E64E76793290BB00E7029A146E1E90DC0C45356E13EF59D60F20F080A0FEA743FC1C222AAEFA3E55876F2C9E6F7BD29C09AE32E80B15DBA0E6B594E951EAA3BFD166DFCC17AFD2621EAE6539C74FD776BB998C24C30EDB3A8B6814DE088E7E6B7CE9A64EEE9ED8C9D987A21A3BF35A9D59171DD456D8D0D7D1BEB3F37D4A31812BE00077F0F0064DA56EF9C4D36D1D3CAB4D1D4C024665BBE1DC227DD29E1CF814EA65B64DE60ECA4AB9B19F937DF15914F3CA577EB3A6A0A2C8ADDA53DE536721FFFD519FC5E7CD9A3BF4F030B1EB638D6A0F8C4E24085012D758414211585EF6E0DB8C670064885B67256BB6AD7E12E380C5E25BF58EB1731E935899C1FD2B20008CF87529AA3E714BFFA86D8B66AA94811A43ABD868A7711C4FFB339C01D72D4974ED53E7DDACCD36B5F459DDC05E9D475D3E2AE383F6FFC9C2A0D1791B4675DA843303C96A98ECA88B54735293C4E1906AF30221EE71AB58F3E38271608DA6AC0A488C0850DD86F8B6588C91589632EB781637C14D9D24B57ABFC301790B3C11C1B2938845F08F7280388E0B9D5A9682A6FD40374542634590F336E42D8FDD92F3F6C82BE4D3B953CCDAC984F6C94D8F2FF70BDFBA63C922060C322FE34188FF70A37648C362BB68B06D74A2012050FC007F276A54882A8A04DCE014655AE43E448639F56", "FE35174BF6B56B67D39271D92AE0DC2B64FE31AAE8D1135BD8FD308D7E281F3ECE84784423A48C1362B5852719023F8861E861AD8B22219259E357EB9CD8505A66EF7CCEB53636B47D38A2AF5506E1FD72D3E30A29EF897C5C44A271EE562D67B279806E8A5DCD78DE538D8121CAF4C217F8A969AEA50D6FAC68066277242B1979F1A6B3051CE5B9949A11719F556EBEF844C808E5C1AFCE5E312C53AA9DDBFAF7280A7FB8502D2C7D1B91614157AE0C6C962F868D05D0463131DC841169946B732F8000E686467BD5D8086CC249693FF9794374266BD6A5C8AFEC65C66A834012365D60179450C58FAFE724B8B9E99C33900A86649B04CD54351D6C4CC7068B28F070417CC9C4430390493BEA50799FCBCD7A13BF75947C597B3D7AD486E3AF99CDD743B6230BC473DA35E6D05FDD17F7CB8D04A2B00EFBAA30946EDA96BED467A45EBA54578D9001637702F1DBAFAD16D2608C475B8DC7994DAB93FB34DF2237E4A13D0C04A6CACD42FA9463674AF8ABA97CF511A82E8E61F8330004E165D753323F4AFFE598E4D108DD8EA8EFA45693A2F9EC8335C756393585E052FE5D150A58F058CF8C3C720F37112DCBC6324877E87541F06C968C46FF846CB512EFE65CC401174BBD1C977694ED7BD1702EBD2D1EF23BB56D0D0C1EC2D90A27CC63F0A09D83F8B0A5ECC181D5D4265911BEE77EB1DCB4780B53CE74DC7A42252F3FE", // 40 "8FC54C96AC76BECE7284BB32C63FCCABED194E82FBBCFBDFDC6AD09AF95DCE6A5D6E13CC06B247E38253D359A6C0EEE00A660BC3BE6FB217B9B554C90186711B1E85117DF0CA17463E132333B8469ADF72C3BC6F218A96697E172CE2E6D6F4E70EEC2A0CB48F0A2E7991B1B90A85088CD2C59E3C9AE7FD939592C14AFE9A13829DD97E345D1AF92AB46BF196DF906BBCAE16F5A58A4D99C7D586869C81E182352C210E3B1EE822F4A95DD0BB3B285632978B18FC1CC29BD58C2152FD3BE73482DE1A6A79C3929DDA1D20B6E99E25A666AB20CD371A85DD20BF0A76C5A81041EC943A89A94AA64C5207B3166441FFFBDF4AA28A2A88173F280F3A2838A98667775F597D0368DC0BC53C1AB8B7670EE23E0ECA08CB09FCA68FE2153F01FCB7061CA1B6AEDCD815D611FF71868F50855054085AA1B7CA3309581532D658C7D2D6069C3B44E0E3CDE45222DD9EB40C369762CDDAC6D9A6923FE0EA7DFA1DF73BFF8B60EFDDB8863538A38528803F3EC27E09C87A2D0E160C2480F7D2003DA331FD5C7FE05B582DC9AFB114D2AD2F822922067F1FDB3261078F33879C497035003171165FB139F79BC508AB9D3250D1B53508410A01C35B53179076D9F46C5BE1A26DEAA2F9F71F442FD7D19D34979F6ADF96BECF1124551D4806E7136551291352748DD2D58443978C3DEA5ED0544E6596769A760B476B9CE7BB09543991EADFAD8", "BA63AF12FA5F7D03F714CA9AFBF19375D2A7E31EEF4A9E10C7C2F8650552A6CD22FDE0E012D46CEBC773C87729C7E746FA4C0361099D4876701C0B2A16EA2B5A6B750CDCEB573DC711F95CEF06B8DF516CA2F9BE6387550F22502E53A772436F324569B25BBACCC781D30DE25B806D369AD1EB1D1137EFACD0BE765DF4D06E177D3E3F13E9A3165F269244FE8B130E9066B23474418A5191ED481BC8974074336E71BEB02B1BC34CC620BDBC24CDA8BCEBE068416E5F5B5A263A51CB3F6589F77D4E607939F7A0FA637858B96189A014B5688A9DA32FE2ABFC31FB00401DE475BA07265B3FD1890ED0FDA487D7C616E099B4EF4E47C9F9114E6BF8CC757C92C02C46546130ECF7CD44160F55A72831692A5E69146086C43A5F043BD1184965E2A6B154BD7B8BFB3B4B28C081B0F349900492C703913885428A82A8D2EF1240414CC0B6D56D969BA1A121D9D61584C6A880D533AB58B94C85F07732B5EBEE7FC87FF3AA279ED703858957A1C1501D71DC5420C24BB2D570F7589F0AC5B6EAA87AF68442FBB38EF693D2200E73DC73F58CFCBBE43FFCBF76DB4241FC4A7B131F29C8BC0F77C95843D2FD2DE39E3D4D44237DB39994380C5F1A1A3AFD927F6B736D585112920296B90CE31D58BCAAF8CCBCBF15BB36199B48F00F308F7E8264D039D6DAA6E848CECDD1544323C9654232F45689076B7C4B1123AE0FF152124E930", "F2CE3D09E701F60716A413AF06E14E6FB7BBC29DCCD8273A083B00D429B57EBE9FD5270EC0C299D243A9FF0FF73DE19977EC16C2772C6B7FF88F83481924C921F49EEE41121DC79B7C23295EFA50292B11C7D45D66BCFADC3C3A390E03E13CCCD51309BD4061782273CE5D0E1BD3E11271A3C52654D2B846B5600D3E68D2C234807BBC32F1A350839500DEB6D387AECBFF5344606CD04BE3614262F068FBD256B2855EABD5A7C0AB5C28D5719C844F2A6FFC500628CDBCE869D2F090E588B57B796029A84E2319FB6E59960553B62BD30DE99AA7ACF508168EEED8DAB9996041BDD78BAA2A1CAAD2EF366F4A3244DCAA3F06EC9A24572CC80C3CF44B557CDCF6279165414066D6B700DAEA8D361034D9DE455A55E55CBE39898B65651FE709506D1A1FF67585D0D3E1B2C5EB599704B3925CEFDA45C33D92C9ED9F0C45B7A80706E6629594F66A0F74A4A767493B73B23AF323D519B0D05EEC62C6123A0829CF612DEDFB7F275A55F1629DC64D2F77125A1BDFD7B9C213C51DD9FFD83DEF42E87AD4E0F9E5ABBAA6B120E131F9E5A3097F7EC766539C733522FEB0F02604613CA1190024CC1C3297E7CDC3C514F8C3787943EE8CE457B516677437B2212A19629A0A04B0DAB8258A17B28F52BCE915A680152225304301FD2BB1BA2A557B3E3CFE6553CABBF79A47FEC31DA590308D156C3537B97116224F3E21EA3841A505E", "AB2F844287488AB6B0F47218F2A4C54E6BE79A80F1209CD747FD88A575EBB11F2F0756E2C263E753D9388876E159EF3BBF99448D0865173572F4B6A03FB72244334E4E861E0495AAEF15276379F8DD88AF9313096805D5596446B48EF1F1BF2ABEDDABCB1FFC98ED408846D85732F807196C9CC9B283EA4E0D78681C73CB6AF89E5C361476F84E979814F30C0AB03E97156015A493E091EC5D854E8B08328581D80091564C25D6A714407D6B591F17D376953F18308B8BC12EAB5B5C9FC11AFEF293109785CCE29C978955CAE2601A1DBAA274B72CC18CF27FE077A0123258A1B879E1ABF84458BB10652CF7310278C7FA11BDC5D00DB65E5D6A13D77FBF9D02DD0574DC7AE3849C7C47820126FC99B9766920516AD1D63E7EAA366005714D6C1695E731E88D43A38B615407A99B32A101C4D417D5E36B886C26EA1CBA9FAB0C040468781897145489121EE47BB2FBD6A064CB325AF5CECE5D5A4BD590C70C7A9B068D318247D8FE16A3609C94A8D431E9872E26A3CDB19DD971971AE1FBEB2FB76F7A71AFC5815CF7871BB5EFE3BD0C49BAC441ACD9CE1DA4AFBDB972659D13775AE77F843259EED57A62CEA93FC449EEE1EFFD9AA2D36D8FDBC06A95A6AC9B067468F1D813F2DB95D3456063D5B23395824385D5C68D3F869C4F639962D599AEB26FE2D5148A51579EF385D31E744450E11307F0C803C70ECCA93F831EBFC", "9B1066F98BA2299266D8C1351E6945D7EAA658BCEA46D5AB353C2CE48D01E915E740DC90E9CC487126AF9FA722A335FA1A8D11C2719F07CCA23B1DC5E5B9AB198077177BAE0B5F35C14666FF32926AE0239F21811921C77FFB56F7B218A353F8EA67448F61ECA318196B1186514D27416EE2F61764940A70300B69EBD02719191ACAD969B1075EDD09EAE26F883AC99DED1AE9355C2F30CC656934C0175E824E76947F83D791CE7A2960FEF547CD3BA94CA064659D1F68C0DA8C13AFACC07F3D5A653F259DD141E2ECE9B6D25F67CD38AF3F802CCE332049DCDAE1504061C2437C7D3BF4E15D88185D4114E96BFF7EC673A7AF8AFD53C979C89FEFACDDF873686D892DEF5FB67877734CD981C16684320AF392A464C7216FC5C8B22BC29C8430151FACC94AA1513A08E1FF2F6A965F68E368245510B975595EFDA4E80B7FAE432FCE9737962974905F367FF637121237B2A404C42A5A9318DC5ED9CFBBC2EA9C17A6CA37BBD98F8771CFA7EF58B1EEE40BA2D6C2031EBDE4AF0590AAE8FD10B2BC02A254C97726521E4D4D4D9FFB74FA5D06F8AA0BD43631FAAFFCBF01FCA87C9360C5E6A62A4B025B894E2C30F9003D29B642335DB0A3F2A3436A917B61776F96292A06A6B4DACE4F6F0EE0232E1C206427A0386075BF50D6074006D45E3A3CAB085431032AC20D2690F0435D257D3E2C93FAE49D75FF0F320CB4D348C6288", // 45 "8A7F8C99EA79E1B2118E3B203F72FD8921BAA5C336B006ED66AC7181575D66ADE21D00FC8C7DCCA7DC9E430D1D086F2922487B5B025AD38750B4F60993368D829CC361B600ABA990E570370AFFF9BF171610F2A0B0B93A0A3AC54244073A0E816DD691BF1B0041BDC165125A14C621E01C8F069C3E05F48FB77E66A998C27A87FEAF07B5912B303A98AE5796F1B5D4E2EF52F38E68F0EC5786C19ED93612D7152BCF0CA1A3044898F9347FCA8370CE6E4A0510750DF6A42C1C35FDBD91BD2A26A60FB229CC35FC45525D12A092505D901A4F9E1E8D42D25C41B8FDBA13AFED8BC5566D4F3BA13A779D7BAAC1E25B6710D7718B73A641F23E1D22CBDED3B7BC3AF7D92B2DA1CF874D908CD8590C80F1D5055CB8228AD964DE099A4D037202C65D197A35D8A268D8A3BFFFAB39B93615DA295A09AB979AF925D895CB60B5DC5580055BC4347F0DDCB1090DAEF46C8ADD1009A5126362B0B4F1FFDDAB4A00AD8290EB84F76AA345DD73FFF7733035026E3CC1D99428CA68ADEB8CBE98E4A630F99F4F33E8AB66895AE7435D2E84EAC95CF19E9B440373EC0B4D4B2CFAD672C7FE1FE8CE5F34F55B016F8B115FAD6CC7B53DA7555E67672FBF6BDE324AA09FA18F13D9FF1041A12B04F30304774B07659F397554E66CA589D9D9F1F262CF659F718CA7F443B8331BDEA8C3980045562D909EA44E917FF5D47812A0390139B2A87D0", "80B35D641CF6EEF705D51DAACE1EA5EE92057FD497B0D937C7CE9A546BB32DE580F8E434D644F191798A518785BFB9471AAA5D03700CB0B7B2635A6A14750F03DA4FCCB1B363C254A5294DD8E7943E4CDDA318C4B92B57B14EB0F8EB250686CE129BBB2B18EBE7FF53C9DA9C0B664C527A3C69D905CC6FAAE8BEBA7D83294C1656DA4B8308968EE49DDDC2D0C71A17B02053027D7DB8F4E77E3AD1C80FFDBD37938876B671D80E99F5F1C7BAEF50B7E05CC0CAB8979A3A2A852A7018673292CDBCECAABC74B839FD3C084682357A5414E431C1F25E34850FBC779285854FC6AFDCFB7B7749E0DFFF5F93A8AC146C873B407F2CD6CCB461312AE35DEE8D6D51347B0824156DDD60762807A5C132C0667FBBCA7489058C47A156B2A50CA5C24B894C1EE7C44B87179176905B7657A8E95AF7F2EA6C6D2A12384CAC9E6D14253DC5C31BB8FDD2462581C109D2DAF72238E4B63F436DFD7DD5571548D2206BCB8B837D8CE8C9C3B3066E46A1655E3D84AF42DE1051DDDEF438821E0F0C1EDBFE148356D707036B269C19C4CEF4C4BB4048364E2A3886E38B42EFA15F22CC8F92D802EAF3FFAF9BF45247DB76C03E99F662884DC2A29EE488023BF0EBD46539DAC307410846B25280349106CBAADFD658A066C3664E35C4C696726140275AF7611D2369ADB8258EBD2279DD24DBFE002377B9A3C1B120890A6FDF20597417F88F15C", "ED6621A6BAAF64578BD988D08FA8D3D2873C87C38AD7EB38C0922FF3F7E59F0A8DE00744698939D42D459E6105ADD3C77E9FC4911F572B3856C9AF6C15ACE704F026C6B2FC8BDCD9D84022DC10C47E11E934BEB7E1DCE8B6A2BAECD384D810BC3AE587E7EDE57CDEA908DDB020885624BE042DE0ACCDE1511CE38AFB6C9DD812FEC339B8137D88108F07035A3869CDCFCB9402CF96B9E331297B644DB13DFA88F60605E067B9F35607D2D75573E0913F8080EF603AC4B7133D836B84F32F48534237CC559ACABA53A96885D297CBB572BAB1C3275F7CC7A3AAD10F29E727B28BC29B038F4003F8C93FEDC88C63D72609A5330F36F4986CD9536812676A89305C6CE58D4C49C088B5E273F2AF77A8D31D1B8574B9DF02CAD4930D7A7F76C067E7160ECD1A845FC6A3B508708C279A2C94F29108FCE34A63E5D5554FB530522394BCA00508DDAE6039ED9F47609781CC60F6E211BDF29E6F44ECC873DD24F1D37E49D7BB7D6279FA7B9D08B5FA8F9364EF6D4C8D129A5A97A8BBF17DBD5E64C4A31426881687BB79285B09290DE61AE40C295CB1BF3C8AF756E88068A777ACCE3C4B6E78C62AC1E8EAEBEED0AF3153983214D7459AA8E254633B52E5C0ABF4647B906AC50A62543710EE92B335A7162B540AC70F2B2F49FEA892BD72DBFC5F7A35C3AE56636AF2887BE680FA63768C27040E888202F700007DE648482F5307C56", "914BDB196CD56E3B7D7D3F1D7A5E4B0A1389578F111449DC2DF643E6E29F688227C3C07033C2A3818342B229F63C229FAC11EE1AB6F0FCE8608E03B46DC983318DF15FD8DBF2970EB342BE2E534BB0455BE58290A48FC60973553E94C4CB53566CE0250D9FCF055936523A8ABFC9287DB9DDEC54710859DF62829D2B6A100358EB64E6219451868D6BBC2AE4DCEA0C0E338B26B748D4A1A34AC16233046CB7D346D0D79A3CCDD4CDCB435B9B3075AEBEDB4C0F18C5DC006F5C208D882308510C75E729D08C779CA99D5A685E78D5628094AD137BAA635B7FC0F492C48A9CDBE63209C8231455012EB3E830B5B2A79ACD8FEA8016243EBC85BF5D6F46A48FE013D2B3B789BC5F743200BCDE03995BB2B6A640CFB099788E380B4E01D75409A8D8B3887DF2B1CD34960091653EEA6C52EDD745B9363BFFF666891D9C8BF511C3C07D38F49DA2892DCCEC81E1722F6EACB3214E3335C93E6141AB94E5EC31BABF8108F6BEBC3E60B1BFE37579B4D5DC8B77A347940CC1F6BFB5B46097B1EEEC4C354159BB3475E05FAB6BDE5672014D9489CB70DDF537F7209BB9EBF1FC6B8B94564AAAD5ADDD83CE6E51EFCF73DC6080D738C4FF1CBC87ED420A0B92FA459AD7BE58789F0A191D149F88173184A22874DF6D39DC1BCD4413648B178ECB03F8358547A68DE7B672BE9BA1FFC8BA392F8A58ED2806155C00F86B7669BEE4220D420", "97051FC67ACA30E8AEE73D3A8CF38BB13524D4E0EBD9BE68398C7C16227CABB1D0B0A0ABE7B6384ABA02905BA0C3C7363599D059C7B4C99DB165CD14FA12FA7912449CA7DD5E346D8010C85A757382270DAD15BA3CE36A76EF55F81A1E80BF366B37FE3A88EC722028C25E234E624040450A99CD808F942568AA7133981D72E7F2928894670AD5399482DF1B90E7E64062F830B736C79C30F36281495C76699CD48404673FA334F042F9E0E67DD7F3853BF71ABEAF6A9A5546855E840CE42B224D8F6490C6CE5FC02EBAF4FFC390107058F54CD635D4A7F2878099C1EF495750E6921BE2F39AD808C4210F287319F811A254CEF8CF153FC50AB2F3D694A530949E5F578D075DB96DDCF2BB90ED3DE09D9CA8E08662FD8982741DE1CE0A6B64C3D3D5004B5C04B2B0DFD976A20FACC94D1762D41EE03B40D2CF367612812EF4CC41D1BFE9CEB51AE3A22AF1BE7B85A057D3048D0E73FA0FDAF1119EFD76F0A41BE63128B22D64A5553E9549D411483BBCA1483EF30CF6A6D317AD2C7973EFA6D4C1121F703D2F48FCDA3177AD450D75D2A28D2C244AEA13F0E60AEED8ACBAB444D400DF5E280DB799B2D9A984DF1E2567D39D1DE58EF78CA6B4D8BC172B07DCB02D156CA96EEFAC69E556CFCE0AAB617C7FBB8C34871C1D35E74B7BD307D3F2E424C7A9AD676A1A69E0FE735EA50887A1DFAE6CA2FE4460FC7EF323ADE493020" // 50 }; const std::string Galileo_E1_C_PRIMARY_CODE[Galileo_E1_NUMBER_OF_CODES] = { "B39340CA1C817D81EF4FAE4E95BF3504A7709089FB48560E9E3EF802180E85EB2194E05902C6C4C52021FEB7EC64FD416BCEBC8E39D64A4B5EE345291911AB8204A888C25B1CD3D9342A56C538636D3EAB957037D09E879AE5F3A39834FBB84A3D8D5090D7814246B62E9CA68533D2EC403B4FB9488467FF9758B0D15A8CEF89187A1D5897880040B6C3C5244E85A2AD14BCF2F5ABC44A7B1D4A87E8BDA05766218773ED4F70F8D1D07CBB1E8CA6298E64EE6DC5886D37495BA2EDB3E0B0B68AD9F300310B88898DDEEFD484538C31A9BCAA76ECAD0C16607D32189058B0862EE9D70CEA9D304755CE8037BA4C46C2573181748A212E4B2BDD04F9BC240518273DC17CBAFF21A03E9120FA7DCA18D56DD1D9A7E510C90CF219104385F531F2EFAFD185ECB6B911F9B7809D98D86F15516FFDDBE9BD1CF8662EB777C3F94EA3F962D7B79449FAAD39935429E92CAE5637E9BCF4E94D413D27934952409AB536BE4055AFBC4330CD1E4B5509EFE5F8EFC9ECBE9EF377DE7E37C479BB9D3EE7745E4609B0A6D2C5D92EB3C9E2278C1F2221FF907596AA5E096ACF8990EBA907E43AD320F8019CB6355A2BA8670EE5A4F463E8E56F8F1D3E7F4922510FB668E32C4CF23AD8496399638B095B47833E0CBB34977EB3E4242EAF870D86660D6A73F83E45D6E8A41EDCA3815079649544597C5C43B6C93FEBAD5700D22EDAF431FD340", "A64F94BB47BD4033C76D4924305907EC1F618B43C7535F3CFC093E5AF5DDD5C4339F3BB6D835B5C2C2053CD3D5693368D4E1A7CAC59425D1FD96809C67285CFD3FC05B01053CB0773221D7205778022F487BF99D1650566BE287FD7AE882AA8E8F52E5D4E3C0C2F971C9FF70AA378691EBD8ADE45CF213822D09FD05243F9726F6C69893845E57C37A7643E16B770E26F431FF69D437271905D270EB85D8D229D7D87662121F0BEEB1E895ED9589A9CF5833408A04197AC9025D8570AD9B75DB7E192EA0A089504996E9DC652975D83633619CFF80667D8B519536B3475248BA8213C8A4C66DE69B4B3774BF9142425C57F34A27B1E288119E3FFCC6AF6A21087F9394F09DDFBD42F32D059B8CD4104A519BA640765D5CDE490E62F10E695FBFD33CBC9D2208A532C8EC25DA28B8CC1B6850AB43D9B5C00B6E74B7A148791AB07B328D347058C7E6233E18C5ED172C9F9E9ACF29D913E2A1614BFC0893D4967ED033B2B9AE6B51F908F1CED57C14FEEA85CD4D9711216BE7F79FA6721B7DCCA033C80127AC6E5FCF58EB4005EC24CB4886D787355362D5E7031B9B2AC2A86D730AD734181E723A811FF510A4DF868001973FE83288D78E6F9B9441DAF5BE2974A2848FD917C3BCD346A431922246EC852E4AAD467E60C15D61DD3BF4A207BB57DB45DCADEFE3210BE74B9DACC918A394469F2E2C95AD1E211947948FE24F5E4", "FD1F6976002C39C87187C44E3D224ED4DF0B67750105944C651A5E57798F168A136AC0FB5979C4E847A82B20A2E6C45DB42EF2B930A80D3257BCCC53EDA966F5DCD9AD47CFB226EED9B62A874E9F6404D4087798A1005F4131171D3A47907A3CD602B83DABE094D2CB031867DF4595F3ED59FD8C4D76EDEEE59E422CE5C7D0A5F720BE94FA24DF05F758348EADD5EFE9197C6BB2292E2B14DB8C6DB24AA94C5FF0F5106D2B566058D32C58B63A150784F7B02478D9973DD4CFD2E84059AE0F4F1320754B7EE83F04A51C67EFFC2EB1C301C0C58DBAEBE95474E3484A76500103C14C40BB0B7D3A04D8BDABB605C1EF9FD4A6564934DEC50BD5878243AEE80F9796EED70CE1B1E8B55725DF76472D12D4A7A487989F42E6705818B1F7E149E97153A7B05A82FA3FBE51763E61171A4E12931472E94CCBA74CC09483DF93623FC60945070FDDF3A00B561650427E4BD64D675B1EB398B35EF057A66FD0B48EDBABBDCD57C32ABAE46F5CDD0CB1FCF17765258236F3DE40BD5D0A3C5C978D81DEB07367AB20B2CAA9834B9576161C4F20FB9C184A01DC9021A4E92B71333354E05BBEA9015E5AC4C66312E8B79F0B92279AC7EF1936BCC30802B83DB3D113BEF64452CAD7ACF6674FDA44023A661019841A101BE80FDA4E3210AE774E433A9ABD97F2755259AECE21F7A8C3B1A3D471F874D2EEC85B9B21BC0C2E2EC9016F847C6", "EE38BAF6F61704B01509B5210A0534E4702F93190C392E749869B5572BB7AC4D7120E2BECD6618CD376C4C1B4965F7D9D73400824E88A5C7B5B66BA88C3E0065F9628A9AC6B91A1882192FC553E3140349934D20698C9F291B5370948AF6CC90C837B9F3607F13CAFD492CEF1723376E6A5B813A56301B88A8799519CB7646F33F91C44CDBE7F768D7DD9B323A5002D2F784C4101AF90D6E4C5ADE7D085C79E827D43E10DF63AC70BCDF13DCE0471B487C5ECB752B9C3E20F75DBD243790C91355ADFD7199081BFEA03D80E82445EC2831FB5014B85EFC2A52748A8ABFAC1BA3904E178DFBAB26C1750228C9A031104F58BB3B91905EDB9EADF7B0F6DF22ACEB0DE944E277809D77507D18EAEDAA1767697398421115D04AB2EBFC466E99F0AA540482A49C6AC8FF95E3F962734B03EF39873A93B70470B46FFFDFDC15C89F8FE2F4637B59F9BF9C5752D9F8AE7EA75D1EAF1C22CA27E5D5C9499624105D61BE2A691F9194D277414532A5E6C63875F7F20DD13C6EE73B0C3568392B14A5042843926472ABA343D2C427792199B543BE1D43A178FAA7ECF53B98AB7528D8E1B8B82C52D973CA0427636505837F94284E8D6B4F496FC5A48B7958D4681DA00651B8A7BC56EC859C071E4396A05F33588B8087EFE9635E565E6B5A8A70DA70F50ECAD1A85E6E36FF07B4FB3B9119EDE0B611CFA91D9D4C58C1F4815B07B9EB1DE", "CD37D0FB0043D03444A939E93676B9DAF5F2D19A2615E3D97D624E62ACAC8098099FDB9A5A2F4B3ACF20F75B6807A5A3F157C2C0F479158F4A10FB4972855F3AE2FDCBDEEC00A4D470AADF5F5E571818AD6E872D897E2DDC402006965ADF16582B1E06B1861BF7D0C7E7BA491C79E86224AF6B246317F725FA74DD8376D63D7993FE2F2BBBB2F1DA9238C6F3FFCAEC50FF61E645FADEB6E03F883892C42CCCF904708B123C9271A670D4DCFCD602951D12F5213937CA2C05ADDE9EE3908E99AAE8DA31951C36D36D671CD7BF15DF60B707F00BF6EBBE5476926D015628A85758BFF35C4AC540F39E761B2ED3CA9116E8680E28BC387058E0F69345CC6AB3AD160E9F2BC4D6047A1934E15D3D7A242A296333C09296981BBF3B8577E4B8ED2A3624866111F6638F8955431195B60C5C089F9897DDF0D34A3DC627CE337AC8128C28B63A394908E4C083BCC4522DB8CE5720C45EF76B2716225E53405FCAAAA72AC198226575D5225195F106C1249E4B87AC05287A3ABE6C51A2A41E07F56ECDC46E989A8568D35669B525A6FFCA90DC91D3013967F6A5F4C022FFCC17751B68FB0D8F16FC9229851DFDCC060838F923BD44C1AD70A993E8EBAC1667DA80F91B66F8F5B375D35275188E3C7702C2312CEAC5B20D67BB34400401BDF1DBFE79DFA0EB73F173A04807215DA5CE8E1D28F2126424C3DB44ADCD7A961260FDBCAB31E", "CAA02DD19DB9C721EB35AB7D64B8A387796427242698A47D832C3F1AD4DDA0B5926FFCE9319EEEDA1565ECB0FA1EEDB424414120AAE8CFD0BE88D4D248899A0BCE31F9BEE7A4DC4DB3C3B10444FAD6ADCCE28F0EDF7B808536ACF5EB05AADAE92693EE02C9512B3EEF000844BA35E24620A2E8935354B8432C07C8FD615534BCFD0D8E3B572BF2CF06AD343997590FE8B244A32BBE69125B5D7C5E513A493724EEA8DA6CB0FFF3ACF1C5085A8120694CBC40FAE1A6326FD71487CC3BE7C10A34315CDFFA8C618B68EA93D330945586B080381F0076351B888087F56B969E6D6A311AE03CC79FF6861E715C9DA9AEE751F1220661581C75DCEC0515A1C9259B9CF8E944CEC4B1754E5809E985D6F43FE45710893242ADE0D3B84F1E1942B7A95648611595FED13F546CA11DB8E5A55A3C3C78C3793C6689E1B3AFB5F67526A480DF923A586A779F94A09CF963594FF4B0A387876EBB3E8FAB888C97F6773E7F0317B038E47DD7D109545BB07263B1AA84284B86E47FFB9784A171D101E7B0A6D38BCAE7E63D827C999BF551728FFC642EE690B01D486CB6EBEEB9D5C888112589EA5CBC9BDF49E675965223416D6DA02D2333BFD4614706BF13373973207C849A0DE41EBA137FDF79A1EB25D74E30CF60B577C2787DF04740BA8CADE3F9DA55D3F0084F02809E37543239E0A71E99751EEB21CB3B41488244193A4868CBA9276", "FB227530F82BD527E648619E532D7646A5ABBD15DB91A6E7033DFECCC65D095A3D83AB77EDD2F3FEC52659CB3AD1BEB009D7A1C9BFB544291EC1C67B75DD6DAB06E70C32C714983139DE4A41EE07B4F3C03BF566558484F19A3BB674B6795F0D8537BC31BC8D7A38B2FF1B2EC8B78539B2251D0E385DE484B05A411477681A3AE7527AC98BC2943AF1CF7F09ACF2DDE4530AE896BDE1266FE916E833A1C0CAA2B2D2F5985AD47B2D0D1D3AFB6E50D4B3DA7DEEC4385E6CA8FE22760F92807AC55556AAF7973E8016ADFD43A3919088B768351B1057498D2D668D7C1E8C63438055FDF7D36C5E7DF02FCAFCBD9291A2149E7B429B3202D329E47CED51EA5771772E308C5BEBA7B934597540D83DBEC6C3BC61A96EA4CB2D7530D9D760AA9403338CD95B829F17547C5A90D161F7B8CE0037EBF403C91C0D0C70C589BA87CAE8DF26CF14281E235A686CCD10E2D520A76265C4C2780EDFD0705E89EFE3C953FE760DE45A8CF1F2D3F36DE3164D5BC2CF32204228ADD7C182EC55F1158AFA9358BE179C722ADAF1D0BF1306A0B56218857FC5C21001499F61E273442281E585B3E6DCE148AA97B6622B23BDAECF983BF186F1B34962764758AC3C20C84036061D49CA33B3C3FCDF03F47F7E53B940DBB6E1E4A26702A118E525A9A0EC229085C925D133750ED0B200CB28A113289DE143D1D5839D2AF8B0525E0027F34FF32106A", "9E5DA18A19514CCC849E9697AE4BD1B317BB34927D0461A96A7AF4A5D6C13107FFB9DE38C5E8CB7C5682827F57D94ED2E77D36F9F1CB05E4C2C62B1DE254C7B1CB236FC4ED70BF8DD1F43AC773C16A37392B895F8B157578C477C85E53FA7CA58BE70D9187AF5F7A18D5A1E5642335E46C2F8F4691AEEE6A9692E21B9668E2C083D9F45C2DB3E991588BA87A0A23808732EE39E8B3C876BE79227C782F07EE3FB3086AF913D71D71910A0F56D62B5DE5E224F7856A42A4A1B2AFE380827BE86E381FCE486FD08A91B22BD91D09615F417E178C5593E41B0917E075133960AD28B4DD4096D1E84BEF1363098DDE92C29CD508C40BA7E785F46C1E0DC72E729D394911DA919EA6F94D14567FFADC61CEB8DCA2821B1CF048477E2433E9DC718DE618EDEEF302CDCB5DE472656D6687DC41EA34C2BB4DF1CA08DCB933BE3EF4B419158BA0B68AE82A64ADD58559214FD88A4CB34D99F646310697DA982C2FD4EE069DC1CB102125C34A89AB20F17B6EF648A834627320410FF6881C7919AE4E71CBAE5F8200E523934D84BFA897C44B89B9BC6BC0129F7F97EE0EC049BA1AFD67D00CD624A75FF5A30514399BE4801CED057B498B9DBBF0EB9944295D5B6AE968C4B8BBD2B9A9E17A3039C5FA35A0D30AA54CA426C58353943DDDD3FD185895C0DAEE950455FC131F520B46AE118C7406D0A72BE6127C5307730AD441B6FC3D1E0", "8589F8396F5B1C54CAF2B17D4C152CEF347E66EC7903C878F2823D4ADB9E7CCFAFEBB926B7EEB4AE1BECA339A027CE8EF997957532FA871F356E0326ECE0BCE3399F81179BF78C5C7D135018ABC340C0BE58D3063DD7CDA4C1918A0187BACF830C8B6900D43B62E04DF6E831CFEFA13BDB5E873A527F24327C95DB4BBDB65C81A20F959F828F5DAE4DC13E5CAC7417EE089401FB497ABE10144E28EA383E61D4A9B63B618AA7CEA4588B2911EC581F506062B05E7BEF723A5A465C9FBE70E313753BDE3102845A79A206BF7D996F49A21752D534B73EE83B48C1A225F85F5103DDB9B6B8380F61AAF26E5CA643EB62EAF58AFEE0D3494E4F7A4F642A3454F4F56A406A264148FF5DAC9DF5F151C12E89ED9D4FDCC04EC5F0022DF8CBAF3CBC67CED2853FB4F8C5894C96CD00550950E7EA2A26C80A72DF533270A0E23EDBAA4D0BE935D62CC885E1CCE653D66C51E49C43952042E1B2D043BDA1CFFC1E98A3F806EB587A4EC9AE299BD838C68B9BBF7C420C12B23AA2793FA0248C932A91BCDD641DCB38F0B2D7187D8986928DF4602B381BA13B263291134628FC91C8EDE92594B39650B877D9A91DAAA05295457DFB2C5D8207BBCDFE16AC5B93600E33BC970B38E18808B1A732889320352B524B109560136E605D32784CA01F8B11D077C81EAD6B7A5741C82D76CEEF764FD07E361D531B75106AF1572AD1375B2BBAB68", "A3E17A4CAD2ABE76E32D18501899F8D60D293BB1AC3ADB64F81148AF56741790F87F8B7A2D9A6E7645EA50B75514C394508884CBF9E320B24D41D8246EB3C163B9101240776C312DB63C33889E3C1218435850471C454486DF7FF4D2DC0AAA14980F394CC8EB7B828A60C53A2FEC3315BEAEB30045B3E65006C6EBB23B47A8A069EAD45E32E771B9C467B4359EBB681AB48C891ABB796544169178203BCC4BC6B4A278DCEFACE5E9385C059346A23DCCA001FC9E47CFEED4BCBDD947B12A3F7E5FF8B9372D9497EE1A508D8BD3392BF3CFAD58F0191B18F6A300FF9CB8D914FDF37B48BF24C2C5CA76ABDFCCF833D51D48FC90E06E7B972944BCBAD169232A8429B6100BA562F7F3C55A625A1870A7C7D7BC9BD4C4783278CD95D07F89E8010E78876547F9AEC44322B0029A922B2922634ECCF2BBB47BF87909C494049550F1E6D03BB5354DEA7E777F499D2D6239BFA5C1CFA536F8CB16F4DB9EAD96F83A4AD34AE2C6893ECD6994C89E7F4FE426D95A18F93B88CB357996B8E5A34C43533EDB1F28A8162FCBEF03704FCCCD80C32874F345D34E81EE813DF5CC9B9C299362F8443AABE91BD0EAB9746E431804B6129FD32916303A570323FA121F7AEB2829F2A50A82CACCF6D273FFBD7AC6FFC5807771D216F50742F7091946F91460115989C87E8BBBC8402B4C8B95C102CAB53843D581FA9F16C0ECCE8944E5FC4BF4C", "9D7B1CF0029261D65AE1F021DAFA81CF1673C9E0B47FF2C37D1B1AF46E7A91BC5E529C8F93EE3BC74E92B2743AAB1EDE16A6523B5B8A591C617C1FD0150E63F3B7EF0494162437B0FD555A83A3BDB519B3BB209EF7924D6BCDE5992BA6248690442E72CD5EB64B4C3D3F7DA339108A18B61AD88ABE87BB7C85A3A352D7B882FD683B2637A17A2D9CB0B7F41456DCFA66D62913F145600BAAEEE7EFA5071C3C9E6FDD0A6779A737071FA6965978CBC89776386B108DD7216FCE962FA87A26B29FE0E732309C0124B0C1E99E5642E5EAE670005B078C097D16C58B8923633C18FDB0E8FF8C4610B789387ACB5A2DD0B6AE7E0DF43A6A9E8C3B89C7E5D628D59759C58D07E0687812AEDAEEDBC63B4FEE8524D10E4B467696957E6791C1E94B13CADCD0ED60752C2DB1B65E035EA72F89FC679138D3609FD2A30E4DD1A946418253C67AA69B07EBB95D4973F562CE3773430007A6DB77271D5F2B342CC5E76E115178F9C7B1600554F5C794961BAE81A5E9B621BA17851008BED9B556E461A553FE9BE00A40891750E4EA4B475216283B530CB8D479DC70B026E07889229F6017552AB9E01EDE6703FD1E2D59AF0B71E0F1DC9A42ACC5823324BEFC52CA0DCD25FE8B10C999152AA3676A30602D3506F78751477033DB7AB1A2EDC21A6FE51273B6B2890088703CEFE74F9EA89881896E5BE124B1FC9430B92F0C0568F5A068A80", "F23088E3EAA0A6BA04D0633AAFE85203E8B1829223FA6B730F6DEE6799B521F2E8323B8793D0F7F2BB9305B3EF4F5B4F1CB822836E4D92C8E4928A851BCE688329DECA6F7285DCC85195E5BDA3B503B8AEE6F1CD7FBB158444E7DE8BF6A9A3CDA311787755A827BCAD3DA5621908EA913C0316B9B52BFB07ADADEFF17D3766BB450DD71328A0353B09DC24DE93CF83A2E5F98BA9D612187B601157D6B140E675228B58C9398618C3BF0D11A226E489366102B9C35A916653F0DB36711ACBA5F32B327F5789F3EF48A338E4676F4BC2C6A1308597171903D2AA299CE7E523C2ABE4B15AA4FC48954187E0097583EB099419047244B4931326E5923B6313DE08423DB00866374ABBF5C31A00542CB97CDFB8F71046AA2A6DBFD7E1A71C068ED70E8D7C3268EA3E0EEF2262BD7991B6C59FF471F73A4E85F4FA015E164F9C15FE0AA5F4772BF2D62B26D3EAA25CE83EAEC5EB3577CA83A68168FB64C40A7A155905CBA6E64159E55EBC928D125E55165C639F545B0071EE3CF1A3F58B4994BB4BF50C2B24F2E06E4ADC90BC1C0954A257D88444347AAECF136C15242633463DCF984BB6736666E38F1A45150B1B7D1C31DE06EB9C2F4097E9D9B4D21EBC9F3A918000DE2449DCB3F5FDDC3C773A645DF560F7E013E847E2356D33EFF1E215782638F58034B09F4739F98915BFB0B1DC124681492F58021670D03CBF5E8F962351E", "EB07F9EDF03596ADC2A3B7EB6DB1CFC911E9A4C42336A57309F7B6C3389282E557D94BCC71827D7C5737B1C530D2A087E3F507242F3DA5BD1BBCA4DF8B78BEEC1DBF7EBB2EA1CF1DFA79E60785BAFA23658490C9A64AC61C45779DFAFC6C55CB5C9FE457BF47E45A3FEF092E178ED4495C0357B459E95AAC82132FF1C8044F4EC84EB882DC195D9CE996B1CCF523098E9E1A57C37C2E2D0ACB0EAA34B0B56FE5A0747130B1E75AA923F6F94C0D024A7FCD22E7A4ED8B201966C417AE864420767AB3223BFF56C64D4F8F557DD950F7C50D9A39AB2C742CE686C8F92B35711904C600A9D4D3DD83F3DF1ED7DB8042C76B0B7D5D9BCD6E0B5524184BF99D8D0B4F14967FA48A93A2F44E2275ED7E59F3991EFB0CBF2E26AC1F8D9A41AAE4563179254BA37028867E68C8179454B8B71FAB49DBD1F889104CFB64C8121151364BDB64BAF854B0DA22B8620BD7EE3D4302A88A115F8BFBA649CAA9EE7EF5BC95CFAB26503A9D26033370A4EF3CB8A5D094C63305A833387B4F8371C6FE1987514BB458C571E6CB5DF5FC900631652D3FA4444F8F1F0312204340FDB2092F709FDC51D2680753131ABC33712B4F1067EA1CC87C40B281E69209EDEC42C22A88950E9C1CE8130DA9291897BF2D8D1D106911743E7A9DA36220FA90A02A34EB0B28543217839374EBE79F40B3B612236C902E4CD05CE2E1C07F3DA10E2AEE8E387494E", "E9D537A821DEDE526B441BA4252785779B54DE76F82747F8607B8952DF990F268C039CC792883B1C76C297D81C6C0CF17DA8BA2C71110B16741728725839D33B5942BC0A5614A3650675FDA5D70F29154A429A42819D6EDE324C64596F93E84CC9B2C9DA3717AA6DFFCD03B75AC96543020A9F2024620353E1364E4320FD44933799FFF083E73F5D20B83BF77EC2247964ECE442C3213DE99026F8FAF0E96302EC60067EA38C5CA0CD989475205FA38869E349FC7F79EB81F8457CA3D1A875A8D166C96EBAF1F39C88815E2258EA1A14943298DA39EB9B738AAA4E0035F9567A0A9D572785594496316D56EB3D39E1F3F243D4F16111E194FC537A635FAEB2FB4401CAA9EE0091CF3CB28B366CB5446A6D3B10AB86B4B1A0714D107FCCBBD50EAE520D56A1161E03849192F5096346FBE5150B6D04025A564A43A3D22BD4B7E10DD4061CE20FA2ECDD36F66BAAD7EA96CDBAA0F063B814707718F47278F8570F77F3B15799D0E354CCA50DAA38C31C746B17482297D9C089FF379454FCCCB8730D89B1462AD95426370AC37DE50B775B952663B97AFBC403F6F729BB9CC1D21DD89EE78AF09DF8558F7E68B3711A7D9075DD4754174802F52CB9683FFE746471C7E543FF388D024327D1866CC5CA6775C58A14D70A3ECCD3EFAB52F9AE6CCE146766A8419FB546E39EB604F43B15AB88C72741F8C7D0A7FE2F462D360676D6E", "D79D916241BBE52B61BE8210A02543F75A47032E9C0CC128524A675E94D8F79A69B6842B0C5CFF5C1AC98D2085299BDBAEA67A41C724CA36B6275A80D377DC3A6EB4C8D0B6B88241334A95300B53FFB546163D2889D7C85F1D1397924F126DA76085BEF131A65C7DDF60DDF4086BD33B44D25025D689FF41E0C256EA12F4353D9E722EE37907AA8BED0A5A606333A031AC6B9A16614250916759B72FE6C1828BC6C1966C9EBCD51413A77F41F808BCA2534AC49DB1D32D37878DF5CC0BEFCC099C56CAF50D8B92E7CE616AA026EA1D81DC7ABC17C4705F9B57A0F99FA749F30F93DFA982A083EAE6582C8461A11ABA74B11663ED7D66EB4F8DE14F090EB1CA6D8D81CB6B063A391FD354DCEAF7DB71C277D0E92B4B463873DCBEFFB698BDCA17F80845EFD5F0FF150ADDC9D7797E21E4279B54BDD4B7C9D403D9FA6101604B79AC377780A5461499714082942313CF74AD1147CD10571A31D82871B6B3A055D50C6CDA4BDDF3871F41EFDAEBE8ABB995344DB6366E35C6E506907AD7FC76632F99124A58A32C86360FD6DDBF50324D86694518AC44F1FA19662C0EF0C0860811B5B976A96EC2A1449E53A7E4A07923E9F85794F228E441D92903922E5783F2FA21C677251B6B8DB02AC2E242C0C8652E0C17C9E3858E52DE78DC712B2DD5D2AF9A42DB2E2BEB3FB6E0FFF13DB9A1E02C8F84FCEF3F7C4D2DDC09F2A2813E8C2", "F8E2DACDD88277D482951555C657B3E3C5DB79E5A43500F7A2C8B30C854DBE611FAC1087FA03D439AC4635D39211E234B82A91248DEE5D4FE67A02D5AE25C676E64C4843E419EBB3C4D81FB606B9CA0836F8207CD19D106C0E287EFD8F8DB5C1A3A22886C2765FED26B5189153657B7C47D5590F11C6340067B800669B05A0849BCD2005DFEE6DF95833C9E94328D72F931D69CFBB2BDA81AC83DD660B3B17D2BA4023491DED324FC4F22510ECA4A5194B1245F4F3FE334DA9C1E6BF83A3FB30897BE54C688D2A7C5845F425866F25DD0A9852BA6DAAF8437DD80BCC72B3E258A906DE079A2D33EC5C5F6927503BA13158305DFFD3F86345524394151AA557D6242060F276BB6BB25586F632942ACF5E0883CD3F8393688F360323A000B82BD89414E9C807994B0234D730BC6D7CD0A2BF75D9F510786E83EE98D4CACF20EFF86EE9C38B8D52455D8A694B689F0D9A632E7A6AC6675E190A12ADD716D2C6322657B878FA97267C1BA4631584356768EBBD1F13FD2F37EBDCD1DF96FB943942E8A5188666235B455BE2F770C9759A8F070971CBA49789744FD2F64DC4DC6E003B3F9BEC7617C7EEDF6BACA94D374400499CA6813C90A03DFE2C537261DA93A1C0F6D8BA93D1EB5FB17255DF28B78737582FD675D056A4C474A71CA8EF0D77BAEBE5637711AEA3FF2B014700448C3D74E3DF264D773360F45CCC3342987169C9A", "94741D7F05B0CA50908E6BC14801A28E353551F01769451B1482FAD0043D5C72331246D9AC3344F0FA2E28FD00E86B38F5E0452F46CA111E92D01B37E966455DF1374883DB8B055C4DF25B42182280F86D0D825C096018D2949B4BFCEB7BB2C8A5BFA2C79E27F11A7F9B43A50AF928D81FA95CEC86A114222B99786072311025672AB04B2593C5AF50100B71D052AE268FBA992BF7868E58EFCD07A24D2111774A36115C1C527B5192EA955722EAE849EF83817FE8595C96EA2D76FECF6476D89F65A262D94B3F5E89A5DE8B1A7333EFCDFDED17FE1CCADEBA0D1E7B73E67491B413A862E34A308D5C211787E6ED8683C6E1DDEB8EE2D281166C03E7A72D7D7BD8B878D07D2216C21B855CCDA76B7B75DD1B2CB876E59F91F040D42B97050043499DCFFC65AF803E2F7455C9669DD9896FE1F62227936DF905835A644D31130A39479DE75B4DC4361E41202D51D50E0E4B4B218AF7F5CAF264DCD060C296E777DF1EED6AE8147E9B6CA73184C345FBDD89DE4A999C42AB4681D9EA3B86DD75031A33DCDC807F8FB14EE0CE61B16068AF01CCE7378C9D965943476AD21A469D8B0CAE15BA8FE04971FE1EC61D3AAD3386DF71B33FD0B4F324F3DA518F0CC0353182B3D76CF4EF5AB150FB9E74C28234CB3D907AC81CB6D3B99D510B481E1F0423D6F4987F5517ABBBEEC07F46AECEBA5F15D91AEB0FE91490E91F739D465225C", "839A01464B473A64A3D1EA24EB363EAAA590F4BD0E4492FEC4E3D4DB5883E4873BBA17595FF48134893F16F5C4A43659C46484A268C3303B2DC345E8C98FBBA6D06946F997074AE15680EC9423D6464585D98804B3541662E183F6540503BEC204749D58E3DB9ECF11C80CD3A38F8D66FFE6CC8A003BDD35F547E5039DE9A21F70A8A07B2DD89B68E43B42C2E021A11909817C543F839E6862268E38DCE712B4D49C39A5035F3D6BA19AE028AE70CCF557720794FEF6442999E740CD6AFE6235F165515FDC24AB6F578DB2549C8065E008577FCF8B8DD8A3BA679BABBC9A747A4E2DABD91501424E4191097E689A741EB6644A771CABDBFE6B74ED3ED171DF8DE641C1D42213B9D0F8CAD1E11FF63670F5587F1FB7FF92276AB48F31751E7A591AF4F0966F3909883EE6015639671BDC3D1378750F66F5DD165912CFF1A54ED463905404EB7D3412EE2B0F0D9E6B99EC81678ABCD1789BD8F1D72D3DF8754A16DC2106B83B325807E27BCBD22A25DAC32F27EACAB6A4CB6CBA4CC90D5302BE5E9827B7AB48BB696B2902975C48B3A4BA4630B14E0FD8A050B0718C2829371BEC597387172B0B3192EF958BD1F7977EF9A3A6C80D53BC961315F97B714253B9731A017BE2CA1D43024F75E26BBE989C4D514D01538956FE4B90BE17B3407B55BD08BA50FA807D0E448B7CAC65EB3FF856772A933F0C5F3E6F41E051015C6F9B8", "BDA2B72F0BB0265269F198207FB061DA29DE43E30847E7C062A581A7EB53491EA51B51EDD36F991D15AF89AB53198537988350FD5FDF8E003019BE115840B9BA55C238C3CBC72C0E24E25090A3D6A59BEA9FED0FAC9EAD40451A95649638FE0BB0F8FFE61AF5B9A8AB84BE84C65EA1E12E9F6650ADB59A824E608E80D1FC3AC19F418169B3879CC946165511D5AA280AE644AF360C42F7A3EEDF27E368E46480E3353E67F536E02B33505341BAF3941069567B723D7C125C8F066F9A6255436AAFDCAA8C554FDAFB0A9AAD91F1263DC62EF91A748FFB29F57E325D65A38ECB4F2851923DC6E9B7296064148A9BA2D938116266C597D9E1F11A46BE0EF526225BE750F0F3E5B0AEB7DC2140FA3A48B7238D0F5A872000782CB6F7751443EC6A1B7FA1ED02B9ABCD1C1DE4FC85E9B405C7851913C60F85582B1529276AD475AE52BD8115B6E73A53506E7A0244E1C29BCEF4CF20CFDF883392BB3990BE2A11B3213B68EC4A166C77D724CFAEBDC34C45ED09848A994BCE1FF6A9BB80C7F5CA8FD44D3FDF8DEC8BA6552C234EF8DC52382D52D2B01BB23404FC453725C7C9269A785FE09C712D4ADE7072B66295CA0C6405D9859E134FBBD3737F2956DD1D718A9F8242CE95BDB1E49F265EBF19976BC46E29F7DE0EE5C89A43AF2E107588A46E1B6762E6F8E48B8FC4F4FF93EC60938B8E5C3719022C750C4309FC62ADA4E9028", "D240216C5C4A70742CAA03AE910E8859C92E5A90A352CB8B45847BAC7793E1F75720D44919E896AD4581E1FD83986FF235C9834BEECAA1556794BE49033E79D4CCDB4DC67C5200E8B6A3EE891E700B348CBF092E4D3FA5E648B620E34E491D7B628A1FE7E2C45586B6577E50788687F0858C10F78F371B25C712ED2760C3D605D4ED4F052E8B66FC308D3ADD4A9B86F00CE4257EED085EAE95FBB1E113FCB42CE12BB6076178A20903C55DA570EF8A25BA7AC8B7E134B8D4E35AB172CA33CC97294A5E7E579B9361B92B49B63BB1982740015DFEC16882989C917F50D5FDD9166FE1001F3282D3C54A28AC7FD773CCC0634AF7CDF225F94107C169D2F2BB757EEB55933CCE0FF116D7FFBA992F9A075A2439CCB369D5B5DE460CADC9F8C81D98E71651AEBFC2A918C551082D85F75675CDC8CCA1D3E486CFFB3B025D27C8D67C451FDFCF59C3BFA163EB791152390E9488C604B9B8116C329453A98F7A104527BC677411034CC49686108E569B7595E1DDC85918D90BBCB337855860D6E4718C0679DAB6982D23FCB6648E8561F44BCF9B052D8B58384523BC592C9B7F824B96AD1A39AEBD2232D6D34DC171E8FBF933900960F207B55597759D23E1E794507586114228A2FC100CC200D2B862DF3F26E6D1C9370373FE165C326D8C29FD2F0B3071AFD5215781BFB589F605263FF065B7A5CA3F6AA9DE3FD8BF5589BDE3526", "8E7752C52805DD0A723D61F0BBE0122DF576A42B5AFDF9F196A766C9B3BFE296DC16A892FAECEEDD8256D2B1AE6BFE5437D4A2691803043B59862B30D68E4FF94A0700D735CFE967299724DA9D680200C898EED1C785E7B8CEB14F1DCDC73FC625F9678B407603587220C2FDFE0A47E82ADF36C26F942797D608BA6B38A3AD1A967315E1F2D665B27D51E350F075531A179DB2EED55547EA61761CD2B3962FCB347279117D1C7A7574B49FFE0991AF572A2B0C962A8A79800CFD524AAF9E6401C44569600F41F04422DB891D25B9F714713086BBFD0FB268E66A4FB10C0ABEEB31D0FBFBA20B0E4FFF404051596FC6F6C8093AD01807FA52041CD33007B205D15D47AF733966411A36F4C7B846D0BE049ADC21B89EA4CE0FBA414C005E66F36FACF3C43B474D47DAD78AC114D0171C031DFBE4A15FE1A22603CD79B6BB448B67A4DEDC97262F7B869C54F385F3682C744ED5AD6C0B6E16793920E6B45A024010896D5FECFA111CC9F0C34E728B32F2C4D45B8AA69B621AB9AC3D9D79B38BF205E8D0D19FAC44A76B9F5644526E06858F76B3EE2D74AEB1971D6B6E68B83773399AC32203164564B102B26C370A9FEC673C285AE0D1D3DF239D48B6492B89846EBED4618AEC940DC62AF4C3FF0D56FC9FBE23EE3B0A4890BA2665A88E9F40C4B6A770F9630234ED10A3A7FF3C5BCCBA836F3EDC8B821AB18D4B1D51D9962C328", "E682E9D8E92A7837823C9B7714D267F9CE290E9FA6CC0A8432D3F7507DAF6CF681246AA4C2323C6B53BCC6E53B31F49742EE5F4E6F79DC36727E98B06D0300ED21F0CF5F2B51D8304A51D0B498F4BFA39C0049B8117DAD334D4B2E37676EC42DFE0EED63B3726872CCF9A10223A8A4563BE8AC266E0697004921DCCEEA5DD80C62567FDEBF2AFDF030192831A6FD871F63D5DADA4B270AA9EC0ACE47E75BD19018CB809B548D4F2C24831C384DD2B807852F596BD4FE32CAB3A16899D0B100E9F96D06AACB8DA8D51DB0B0F600F3B614461F5238188B5EDA68EA753B6ACC58569E841BAF92CEE04E6E2626B1FBD01B9B67D1311B1C3D67427298E2D193F0647EA17D16FD7FD6A40A1BDBB320A1F5FC64B97759AF4EA92AAEB759B5DD30A726E9B8EAFA372FBD83CBFF0000CA75F219A95D6A3CDE38B8DFA9281609A20EE39B73FEBDF6A155359476D073E7153BC918C1191C9BAAF0E0F161384DAD8AFC31A3FC1E9EAFA495E22D18C05194EB85298AB0F042E447DD627904B73E6E505712DF010531C88E695F6510C78B443C731D7FDCD62EB7C4015AB5D530BD09CE5229FA4DC5642AF176C39D60FE070DF635CC5435136C7BB9C4DC83B0D382B9BB636A6C2B3838542904D53B862585FE6EC8960A9A77783D17B2D90506F5D60998602AE5430E86025C8864883CECD7CE51B49CC2953A2A41D7EF8027F1A83815BBEF6F6B2", "F6BD4204243CBA14DAA15A256FBCD138B5D875E28BCC0BA36855E648434CD04F49935C3D074DD5BA2EB82AB14E82C30991A1159E990D1D36DAF794853A23C499AB6B3DC02A89F014310372813643F786BF19D3FA8C463EE50D9FA87107E91C461AD2E5DF2FC99630D2005894CB7698123111FAFC0C5BC9D1E8E84FCCA5179A6C9AFE3E369222D66854F90D2668A57FDEE00C300AEA4E88F03F05C4D7695B206DE9F7E1D429E5E6B65DFE05D4C861F4E7844DDB9062C0B6DB46B27AD0368992F54A44829DD11A05AB97BA8AD854E428B87F20C4E5E4BB1FF3803809A81F2E4C109572006729A5E490E0AA40BA55F4391C9FB758EFA79B97E6D413BCB02D33A00DA6705BFBADED66CFC21291C494B7C3293810012ECC61415E609DD97AAFFDEB795DE36026B4602DD546A1AD937F1A6DEACD3393F5530C48A7974E2882CB327AE600C05A535BDE5D15AC524859582EEE2D62194B73E01643359E7B2625F3EB9FE7137514ED549A3196FFCBC8072B4F6C18CC67AAFA0ED6029A805EF0987E2F27A3260F849C68F3EF91DAA9E579AA16FDA698CC18AE8706E28C6D84CB3F593273D763C2969933D8EFA564E8C06C427809E6A5A6F76DE7C8B07FF4EDDF6CF2B7595066DFB15F5C6F3839DEE642FC86BC1F3AED7ED2E65B665198AA034817DBBBE0FE30E662B2161276CBD969FDA05AFD6D6A570C1E3CF7E324634441983F257E2BA", "A9366308475F2D8D0C2D451C4A65A01EE58A0AF19B791D97382EC59A52616C7480B86EB1D0A83E93224B0DF73DE1D7EE6D51088F3B20B7937E6C0144E0DACA6324F0C8E5F9D93A8CBA1045E5B509D7DF98619FDDFDD7892C3082D69008D9D3ED6C9C1367D9DB7C04621D7CDD8A5A2599EE45B87A82F8CE8D60293E7A71D11700CA9AF117D630C5D8B876A9DCE519BD653114448C68B265813C608435B96CD642A420A15FBAB467692931BCA74F1F9D23F5BFDDC5B8651139B5A73F04FEF3DA64B7BD56E49235069EE5E8A136B921051F1D1C7D5993E6EEEEA2D58583152ADCD87AA89CF5962BC8341EF99CEB3682A2D0686602CE140ABC2FDF79A778A9D75AFFDBBA00C0BD6A8A8AFF9B5D1F30C8373572C81BD9594890102F46B5A393ED126C36AEF6A66E231A246FDFCBD3DED198ABC54CF357ABC67AC83680C048932D7C902AB7DB16952B3C95DF4E845B46A362FFE1A27CD1388483FFA41AA563933371C0180848F9E3C03AFC1F00D6ABA29A953327A4E3D9FAD4616C8546C9AF89FB4D08D4256923B736A8F68FEA5A097E0640C16E0F7F942E6A6F5CBA76BB00D81C606C7FED908789A63F01F9B5FC7B7BE434E85A0A44B2070BE71AB2BA0132D9D7B32E2D2FE229619F85643E75B4141D355386D1A09F45738455BC21607086C7BBCD4B73F87DD83E905BCE8FC6C5BF1824E904C4F5C26518B2FEBF8EB06B22437270C", "92D87BF3F54B0445C05E508E80F9CBC0502F0897D717CA232004362F394A023BFBFE3322C1D331AFC6454FC756FB48768693FD5C46DDB40DCBF14C726C24ED67D8F3EB613BA80B0E39CF0747DF62D258613640D881E085C377DE1C3D149C8359407C2C6ABC0D2718A2D42439A8E7B38CD7DCED72AE750B2BE88D0069FBE94BD69A9A4B4AD42FEC5E651A31F86B90DC2FEBAA6FA6E5F6368B620C1750278DF393F7C5035D47897FC05FBC419A61330135F24365F13D653D77CA2930DBB05A3815FE83F75BB1BD8B2DE12A2FAADCD1ED62329C55B87FB32CC8F3B42D888981B4192480D1F57CEB0C55897BDA6B9C0ACE1E7E4595E30C7368306243208444FCF4574C47B07725B25EC2E28F4C50B744B3860B361DDDD22D949AA94EBA4F97606FCAD91394B6FC0E634BD15E099E697403B2AE84CDF5DBDF36D91FB82C0BC12B984FEE83CA9E97C194CADF8382CECAAF49EB3BD446F660F94C188C074CC312E186BEE0F6585535B050C226659A94B4C4974DA32CDFF30DBEB4DEA588C6F490F7432DA5FA2408BBC931EAF60EADD7B891A61C157147B8DDE7A45F909BD20D5B12009783DE410940245FE4E91ACCF72942E486AE773CD665912173EA29875A1722F8658C414CD08CBFDFE1DD356E167A9D7B20BF7441562EE816435A78BAE7E5A5EB4DA6AAAC36F594C93E2851D76B6A18B0B03B30CD38B97E38109C494C557643D58", "BAA2716F115D72D2037841EF9138D19833C7C5FF40F058A960826E690315577710EFE64BB37691564B3B0B6C577DA603CC3ACDFE1785541AAD23904758A5A13BDB018E7169D479A1FAA031CA72FA6D6AE9613D6B2F82AB07500B49DF535F86A76350C140F9CD25295D6BC2F38C5D13C99540E2363862F06DDCC486D884999BCB840BCCAF2AB84F5906B9AA0F77D6432F6531558392641C52FEAF9D8ED86BF0158134129F34ECD0768BC02ED442254515A74999C6B8052A1FC797F5720738C69DD9B3FFABDDC8515CD279B246EA7C67754920038C5A4C8D301119CEB95FAB2765DE39DDA84180CEBAAFBF4976118A8373FF6BBFC7FEBC3CFEAB1DA69DD3DB9E428C594950FD51F4D98A393BAB96001461F2765834ED70C60BC56406CFCB3E784C59B91C19783E67CE6C86713C43DCDA9512B2E7173AFC2EF9A172C9CFDDD3000D7A981440AD994C39DAE6FC0B645BA0FD49ECAA19E572ED0FAC748EC837A7D6F28A8D004402F71CA209BB9403B21E29836C5FE897268DE0736E985F9631DFDD1AC59D5411E684BE082F41108E33D2B92B2D45ED70FA52EA2D6DE121EB9F9C886DA479464A9DFD9970A406491E334372D7B78936095A7459BFAFF0E9090C2C6B6D62624A79334F879A5C92C685B50F75F04BA664EC95893FF40D62EEB24DCDD288729D0C297DF5ABB83C77FC11D0EA3EF18E3BC7C2C065CAC51390C610B591D24", "98CDFCBAD056240E180F347C00912F2D9ABEBCF5464D410BE6A50404B830F744D78F7D97180404FB3BCCC2288B7991810B2562C4D509200CE1F9C4DF6DCA4C600D9ED49C9C1456141C7B71513E728D41970ACDB6C15B4A4E327B9A87ADA73D1D46EB0A21F2F5481C3B42931C51B780FA526C29B98E6B9C714B20049F7A05252CBB84B8E36026DB2379C9632A0843436ECB72D15EA2950ACDE18DBDC6DFB01BF08F7E191EC885F11D1D8B7BC96E9836B395108F6854545082A694D5974CC36C8A658349186C1BA892DAA85D3F156BFBE94C73BCD815E7652C38E178AAF02014F0E6F23A4E7EF689EBF3ABDCCDD40E2DECED316F07E20716927C8F7B203D51D957EE6EAB062B99ACA0D28E0AB50B516CD92CBB9BA90333E73D58DE0B4B633D81EC93D15EBCCC813EE63D63BD18517F4FE85C37469574B8122FB91388123E1D5E805166FB7157494F8559F90A4FA3DE9E71DA6FA7CCC6086E638BDD4FD3E4487506ACCF84F1E1678D714B86FAAD57A6B76E085CFAC30DE469BE32E2D203C63B43F073DD24F4A1E039B941E7A97F8BB28B516217455268B6EFBB0E1745C23D6D12A8CD13E5D242F562F56FE92496342000A731BF3DB0A7D3110705DFD0D8DEFB85665B77347CEFC8629F3757304F6129DA9845F6509FE3D32DE9FA86EA4FA9BF86FF7CC8E726C0FA9F93F889C467642C5E944501BEF8ED59793AF8804A9951B4B88", "906F6C5A1D3BD03A03802EEF5937E214E87B5E2F0182BA2C258F44B516EC66EACB705E06EA6DFDB56600B8463A421DB03A51460091D7FE889E6DAE32EC19190E7211F08D37846CEE7364B6ECC07C1740CE990141C4DC4CB0AC9F25CAFCA6BC9111102EABA250ADFD505201FFF638B31A77CCE7A1ECB273F9C8ED84EC2F403C1191596A53EAD823421EC47DC5E78F3BD1339532C97E4EAA024CCC906EBFB870C1467C3D845A178EB07C11BE8D57E4EDEA7ADEF162923E9521451B871DF6E357DCEEA7F62022106F647DD8A23074AC10AA632C56DC32B34A4A184FACC64E5D1E8FD69269660543EEA2FD584117A3EBCF6268352F0212ABCE7CD28A93C9AF76722FB5A71FF9E5AC4579A2BA32B91818CDCB62C77A6A8EB1F4C34132EB463812B329B6B22108AC36E71F38338AE3A52C632796E45189632B73FDC0BD37A457204757261B7CFC01E06BC767A57A5FA7CFE43794F65398A94B4EF09D6DC2A8691BD0CB018BBE7B66E0C37BAA4723247AF3424BDE22614A9A581A7982E8C2323178BD2D46E6912A2FB2D2531819A180689D7F2C9B5C5AFC2DCF1C7FAEB1927EB79A72EB1203BB0FF17DAAF27D66022195890BBDDA786CF1C36ABFD96BC36FA1D2A5A0CC3D7EEE1A1050CA840209903CB9FF429C7EE9DF9CBC2BAB84CF28FAEF5BB45AE9588970A28B6BD9ADF8DF134C1FAB0DE274B5C7452C4836A573A26A0B4C14B74", "C6D5046A5000ECDB54C872F2DC494F2DEB88430007C9BE8EC39FFB148F00F7861D8277589AC839AAD30AF7D7A2E0F9EE8217A39C521311E9BD59A71BC6663A7738669D6D3BB28124A80ABDF905DFE2C9539CCF0C8FA39EF84E9633D63BE0C32F3B2AA9FCDC18AC38C3C00924E9D54977BDAE61410F997038BE066DA6C945D8258B7DD133EECBA836A7A6A2907C431C522619D466430E6ACF15030F7FBA4F3D6BB545CAD85678E81898D2DE358CFF3951C8184066B18930DDA867890871AF6F4133B492FC894DBE4AA5F1E44BD361C4560ABBCD3101B4AA4E065FD60308795DDAEBADBB604A3D58776006CD074389AF49A0EF09586410015C7DE4FEFEEBEA6262B23571B93BEE15CDA2BBA60B6CC72A7DC9C80C81C9A25FE3D149C7A8BB2F704BE11177F92E2CEF0BBD12C0766D691CCF093D456AFEA411A8FE5F1C1A44F31017760F0D0CC3B271FB15F56D9F51A594C34FDFF8F8ADC91584ED8D7E1B6DAB27B2BE1BBDC4486FB1C822F23704BB2EF4B521E02E42FDCABF69588B0B9D92AAA73116D26E8E9E48DE94F6267414AC845467597B4C1F2A9A8E1E82C0A1C05955022CDF87386098EAFC5BF1A040716A89BE53A36B143376927028A561BBC07AFAF42494DF5BC0D95170D853DCCCCB22FD36B7947712EB369077D02BF85B0A4F57757ED80B247E521AC640D1B1CE30F93DEBBE2389D364A8B7971A51AFA4F557A8E12", "FDCF36E6C842D2ABCCE9D8783D0D7A7EB74992EACEEF6C618AC7DED4E457B1A708BE2C82B28A9563F4A088FF7DB146B16B47A900DF49A4F3FA8EDAAFCA09F408B025D04EB673E105E0F55959B7951CF0E999CDF68EA9B32333DBFE0516D272111CBBD9933CA8AD8AA6025E5F9A062D8305344CAFC3CA391BD8DEBDC58F7FDBC041B349900E397609C71E4EA3A9D8407C63E8A6BBEEAEFC92E9C939147920E48E35DAC6D123DA46E4F0838FD732E43FE4EEF6BD68D5AF0C9BA3A0CB28233743B291D4E10054F695DC10A847E661F39C4C133289B07ACA8B544EE3E2EC288CB18C40CD9A8E48A93378FD50E077EFBC21996424B539A397B3D2A6C7DE58112CF55E82E8FF10F75571A15DC248E6B77CBB91D8BF2D53E5C4E9A85C7EB8FB690F74BE029CE1B569EFACFC16872C5008820FC6A7D12AB43E08B4AFF57DE6B43B613DF8480ACA556E29D792C6C81CB1CB54A67245C571A04965267BA0F9CD3FA0950B9A5B393B4A230A41E455267CD396F42285F0E49C5AFA0B53EC7B60C1C317EDA3FAE4B1713A80D4EBAD32FC685C13649C4806D6FD887A24A4F7AE801405EF28F058B37112A680F9E9AD0456314E9F490393CA25775797E4CCF9184FF0C6A237AFFA8DE1B84C420A6183B1D49D6F2AC1E673E7FDE161A8159DCEB00D85F032EE76E3931C459CE935DFE4AD6C6110591EE58496B82A16630E82320B9510880BE4E72", "94964FC9F66389FE3880283C4250E6E19F195DFEBD2104FC0959E084308BC9CFDC6E5ED1C4B48B4ECAEB4FDE5F215FBED85A6CD4D1C1466E68A4CF21AEF29F77933549A3A6FF7ACD8AB6E6C689F1E8DF0AD8AB289D5C33023DF90B21A26320CE8C1CEB2C099FC1DB58737665855DCD20D587E176483E33EF14C80AA4760F751EE5B28460811E5110FEC3D689AE2A6E91D0A3F1E22623E88571F4DAC895AA428D42634EC142E56D0D57CE68D7949BE13AF234229E546E9D66D5C58E510BF3EAC7B73309BE16DCE6E2280AA80247D9EDEDD20E06295C9876B412B786CF7E5F1073792158131AFA002FE7750A17015A9C2580646A9A0D2A3F0243AF1AB4FEFB3D028504553AF9C5C34D1A4A2FE3B8DD8BF8CEADA82AE63C319BD7981D97155AA2F105D724A8C09310D5C316877062152419A006ABF56AADED74DF0DF325D666C31DF51F194CFEB331E7DAF00410372999D2D05B023B2C3067E6CE4A472FED3B8BE1C15C24DFBF4956A5B670FFCF128E5A23039764BE39CBE55636B83674060B3CCF5EF9A7B7EAB0813ADEE82E271C422FB78A9820007753B1E62BF4CCC074F7796D5B2008FE6542DC0C77ECA3810120ABE9F90BE5934E8EAE365D02B3D2DF4EA4A827E033263B113EEE5823DD3912FB31E3C4B46B274D7115F34CDA793DB6AD2CD8BCAF4B13B832AB605BE42B2877EE2E66B411668EA29A7DBA5BD969B9F152638", "9B8071D96E7D361B2462CA93748DE4D31746972DAE582AD4F70A188CB40C2E6E418288B6A713ED4B647013B3EC31C9EA6217DE55D016A1977A0B285224129CDC59A9E54F3E5094258F11C0C995F60785614E560764312CD86C6969B3274236EE602EFAE392C015E4C3972D6FA2A47AB48D5C5F6836AFA54F28CCC03BB4DAA0A1DC0DCA3FD3F2B15FB2ADD907D3BF7719D1D9A8284A47C30F32712A8CD440148B8DFDB851FFD25ECA2864150B832F8B5DC3A7C701371785A66285601E96D285FF88947804AA4D88665B3E15760CDE327FBD21393042BAF62FDCE6EC41955E877ECAC331D594ED40547AFED34D410714CE57FCB4F01C8826519ACB85F447306C86BD1BA8189E0621DD09451E8F341AE47E7FCF1FD2DE2AF78E0AFA27A4B6DD51A0710FC1FC4A5998234EDAA1D4CF0786B779F637EE1A72058774C1B4BF5E125DEBB4230645ECF87E3C6FDC91E1D14397FA72686784815D9654839AE8FA43864709EE0F4A336E3C399CA20B2E652E2AB17719F9253F772EB7A9E8838FED4EBCD0F8CD977583BDCEEBBD925676F56AAB0C36F3DD915F6691A30D60D523216FB233CBBEDE7FDFBA827450E595AB51237F9E77058E40F862D3A5A96E4AA3DA74503812EDEFA501E526DB6B4C642222D7F33B06D9CD0023471DF5730CF8E2BEE834D108A25729C1C1484C207ECEB0E4598965EAB5216D4E7C30577A89FB8BEC0B118F4", "E43093167F77AAA20EF9F4AB7D715CD0E86542A0523BDF0256BCCFB1FA987A6565F808C03C71E6343EF41D2ED4C4FDBBB1AB1D617BBBDB776F07B000922FCBB3718F5FF326A7BBF4BDF148206411E86506FE5CEB8EC0F7AAD1DAE3BB46482F5E85D3B46DDF93F4BA19DF9DFD700C35DC038CF4E499A058995AF06BEE8535631966751A85571271E6877BE6216AFF16AA2B9046F1AB9126E1DCADBF40C4B390D23379D52C80C10CA05079D1F05CA294EAF7E2C66B884DDBB52DC85A45FFABB2BA6EB95869689486DDDE372DCCDFCB408496E647F33575BB99FF1699219D00D2608AEA1A47CF52DD21A3CEB3F043AAEB40EB27F042D276227C09CC8201304C55D254AC228FF309FE8DB74C85430FCF9441EF1B51A1192703B140CE3703E5848477FB0BBC2E82DC38702D4C6A78A41729B7EC86F9890EAD369DE4F25EAD61DB0B5B0ED764EC84FDAB904FAD9DBEDEBBE89F338DF52F7A6FAC8EA1D76001846802B328E8D1F110219BD6BB51214814026BFD6E32627B696C7990F53591CC811A9A09A1154A50585B882DE0B404D7B5846DBDC8C66E4AA0C7B90B08CC96A5CF2352A6592BCA536359C863D639CDA60FD23326619A9014FD878EBFF3E73E4424B045CBD506ED744D3243725EF9491D6165D332FB12985022A71C7DD4E3F942AF5CDF2396F6C346088EAE89535E1B21DA8F7B2E1E12DC8A37738310248808B9973041E", "F5B9B9204186466AF61609CC856B6B2B33D6F526EF1E4BE4DCAA1E1055F033072B3801B642700249C024414B3217D160513E5A804B3AE8425852CF5FB9F51D2601F9BFF9F5E4512A45ED8F615A6671315590DEC31720387533A4E090646F17244EB571DBD6E6A10890FF19809D935A5E88228D424FF2E54B1A37576C059A756290BAAEA5E36AC977526339CDFF915A763B2CD0657F3A3D385A5D92466A44980AD8A1B4E1593DC177E2447ADB53B1EAE15A91BD6703E46F01AE91D6C316C1DB983688576B3B2BAB280FF196D5BF545755097249C517E1271202E3856475A3C95324F827961DD7A827709DA2924B21949B6BF032675D80FD120180F6850BFC385E72399F840B80E5525EE70B89E1C524D580390D487D0CD31AF3CA5691067BDBE8E2E91E0099F59700CDFCFDF8B3ACBEBCB61DB23A28E80C3E463D9E53328C37EF8FF0D4FCBD287932C8197DF57EEBC9DDB29E2046C7FC14970F9F37CED37D8BB0958155192C8595E2A9369944DAF58FCC1D9E1987DC4FA77ACB256A65DA78B733178FED14DA3E3E41DB808849132EB05E48BCA03ED499A314C857FF7C7C1FC8BD2478635396BD7F252ED984C102E23F55450F57ADC7EAC50A57B78BF4F988565A172E878638ADB1D992703D0BB742605EB76E3C85319F567D71B9F2E40251EEB936B323DE98496229B1F8A996AE4F6C0C2FBB3B2244F3BC57EB3FD067F535102", "A7F21431EF8C75A1E9723B1FBB602EB4B92BE5FC8DE70183659A45A31EDDC46643ED1287A69DC876634231D3AF95F2D02FC9C0C7BBBB12319CBDBFDF6CBF94E47A05204AB14A490C6FBABCF329B5B0EFD8C2FA28845764510624398BFDED1B250003FBA61A67D2127550FF07A6FAE2CB5B8FEB23D289FA235BB4959F8845B25405A75A30E7D05D7BDEB721BFD4A998DAA6F1A54712901551E30D618DC80FADF7CB7863EADB7EEE708F1050AB0510A956C3C7706756B6CEAF611F02656C3CACBFD9E4507AC2B4B78D0EB0BF757496C84C7260CA972F0F45A393A89AC2BD70F15E629473D61FFA29BA18A468D8D4B1F72DDFF99608AC9E6A6D6A9231F24388991E80FBE6A9269AD6D31182E79235A0E33CFEE9E3526FC068A9253789407AF8CAECE14BC337FCE02333B63224A61E913367CB36641A74E2DB2892C4E939A50127DBEFED7456F7E61454FA5016A6B75E6133B0417C2860B2F640ED8EE62D5100EA172BBF8FB02E2022D29DF33C25654C96F8FB2305B72A92105E027444EE0F27769946A67E58D9A26AD01483FCA4BCDA4C00A8119E355CE733474349DC8311AE9853A064931FD68D598B02E0724A13FF63D88416FD5D03A962B5D8F79586E696C484D7F287773851831EBF33B0158F51C89C493C116157D20DE66F3990061135F5CBC46862BCFDA5EB0322793BD6AE188698A2E1DEDDF71702B6CB01EC2BDF85680", "FB2C4002173D1E1581890C14672C1F232E8A1332655108F24F78E53638EFECA3DAD18D19FBB1E91C6AA4761017DB37FA76F70BBBC4C8E8015384DC9E9EF14C6AE60DE55974D448DB8C36B030DD55DF5EC6F6C56DA8CB9BBAACF6784628B669913A7B291632730C11710D7E181401FB535FE8A9A0B81578CE54123A6C3897496375CD7C60BB4E05AD16BDD4CB8F652448E3020EDF4D51FF5EBB9FA93A740AE779419002994348358CD7827A63BABCD7C4501CF8ACD77A2200059DFF5B180AFFBF3CE52133C7451CD108AF9CC8FA32428AE9ABC55D89E1931E6607160BF96015901DC097B56299F9F358DBBE921FBD7D0DB43C9C5BF97468813C0AC632D35C858D8384C32EBDEE933C9037EC36D2322F54FB0D3CF305801DE42B4EBCB5F83F3D3FCC1AF56910B7A547F50F851079B6D0D262676145C27DB362AF383037FFAD5E3B26BD2095143B361F82425734842E2153C5F428D89DBA45EF59BD9DF1FE1BA941F172A685F08C18B76B6A8FDC86EED2867A57AF48E00467993864EF70D80CE5550C5EDF085E94435ECA89F6513D23A56235739534C777C17BC6DC7BF6E04BDAA9B0C94C4D7AF1368C6B4B9D3C97D25A26B05703EBC4D1F8869C5DDA359D189F4A3E548D53731FB429F3536880CAD9FE13F70DB0A080B949C3636611CBFF0F644ABA8B56D2C6E988B3392A7452A8C8E52F2288560331A78F4CF021D2A41B2ECB6", "CB7A566070A06E759017D62CF78A429913370E6498BCDC038C1D3079A0A3E6FD4FDCC851DCBEA9EB3A7D266479F75C40452A282CB406E9A2581372BE2FFBAF6E7F3359EAA594631CEF876FD62DEFBB3B816EC98A1F72B55F6023B572A51F320CD7ABF489AA905CE2274729C0EE0F677A04D7449A489BD02704CA65BCD8B753B689CB90C87C73FB4A45219DCD817E9AB584EFF049EA711CD3E24CE41423FEE6F258A65CA8EC3A00D45371EC5B846CF1549CB5CA4FF14B696140D3483DDC7801BFE6CFEFB9189B5C7AC3DB9C0709F630D80F361442BBD22636B00530EEF21D96D4A12CCF85E0124939B025CF35A0A5F1B4C2FA5B5DFCB3772CBFEC1F0C1C824B5CC22BA8FB2DC92164FCBC60333EBF920A14599F1E8EFD4E8CB0257134947331D820595BF5630EDF00814C32994039B47E8784C29D0D1C5B5D219A9F55FC14CC18DACBE6A79698A8073276A424BA9A6606DFF369CCF5F9F4AEC9605F6E44807507B36A4918FDAC448E3134106683EBA80A2D97E12EC2BC1EBBCBADBDC631CE7D61BB9DDF143C3EEA4E36EAAEAFC001849812A7CDE3EBC194A51EA2A9A2AA15A0A4F29C2FFD8B2CB4ADEE99B59553BB2398273C04329A5C884989D417C131D68E9B505594C9B9CF1C13AABF05093A9E4224D71B54C6F61F1255E25FF7527E47768FBD51523F42915133E02CD7E404147E7AAE95BE651BFBBD65E29130D0CA31C2A", "D90A7D104DEF06F51CA5FE107C115C130B8823C423423608DEE00E0C2E6C202B60C5D20BCC9CDC18767D89E5E7857BABC9531C21B08436AC14C5B34EB986E5521369BC3D9B1FCD07C99240FD0DA306C69303B310B8F78D2BF97D6E9E88843234D73214431F6BAEFE5109AFDA22C4C348A469370BBF9B0A81CF27ED919A0A48DA3E9061113C56659F7561175A608B7FB37A76EB9E5ABA5F4A6B485EA5D097482A28F4EF7DE785D31DDEBFE41DFF7C51CA2B64A0D2A7A70269FDE399FF7628202289EA97141F995FF51DB5AF7C9C5CA76F0AFB4981D021FEA9EE6A49ECCCD18AF290B6C231265247DECE33B3E165FDE4FCF82EA84A4A8AE3FA90972D96DB68550AEF21FCE82E0FC75FCDE33C2B6F659A873AF09067D94B068DCEEDCA4D392BE5077587785CB6A1F1947841F483BE5080E85B49F1073D4778A39239266DB2A24B57B5F51B1F021D05C634D66DAD081D1668EF0520424581E5E0B62ED085D005F169950F971E1493A49A60A595342AACBA236EB16D5EF94E749889E50656D98F94EEF205445AC027387AE1363696185E24749EB67518B89057899548BABE29F3487D273C54EE2BE6254C7F3ED3D3B22FA3FC94791A7BC7C499A391179368D9B1F0DDC325F55022F5AB7B91142E2880BAC761D154C11F2C58F4A42E8B3DBCFD44777F08A74676DFB7039F24C9A4C4620726FE12849C9D3C15293A3DF7F4870DCCF56", "9D238D97CE04FEC0D292181D145EA0EFA727DBB7BADDCC60357762D262DD7D7A3BB0189E05BE490018ABBB61B154F94A4FA81985E774019CCCE4B8ECE9858C0C2BDFFD7923B3354A2144ACCC5C9DA34E50299EBF68E9BA0A269760386E5531F8964F8024ACC99E7AC3F40BFA9D94ECA1B14A1B173A06867100C57883FE7333C079C5871A8A7603395A87387EFB92A77C5812EF548CBC3B9178E874E45DFA8796BA6FECB5D81687EDC0AD5F804FF36A9CDDC58A5F991A2A0BA999F86E663715CC79A439DEC44C394ECF1F14801D8F9F292A648D29D2E910032F224ECE51D0708E4ED6D3E65FC788A2C1D286750F4B6D768CBF1B6EDE8524C2A7457A82404A491DB5EC868E6B95B02167A0C4E785290156943FA091F28234C4CAAB586F8095895FD21582E0356BC15EC7CEE893E70902CE4D01217474E0226FFF30CB78597726C74B95732E44D03A626F1D1DBA7785F55859B71C2DAFCF71D99EB99FFEF4877518C579D2623FF6EB326B8D6C7674826984CCAF98CE41724183952EAD69F05F44750F3B857EA01475555FD25A828BE1DBEF5E8B1C1237779E9E69D35E7BA9ADA124CBE710490280B64B2DC5EA2C41D6644012A18B369E3CA2FD93A254C493506C54FA6CB4DFE24E0B5035230F2BDE6FF21101164F322B4B066ECBCA3BB4F3C476B41BD02D8948E555AF74EA13228F07A1BEDBF95FA7E16F2BDC5D178E74FE5A1A0", "8DD8032BC8D741905EDAE449212146878D8FA15AB037E41C36D21B0064D65BEBB74A18F4370C80DB44EE93C2AB06DCC6C6FE7DEA83F270C9FB52CE00BDBF546348F0E6285A35A32A47512823DD6E22FB7949071D4B58B46241544AB97B0F6023C70AFCFF0C7541B4B9E1FC6B3C3C55500251665D964871B9D1247B3A9728AE02FF47368053B1DE928B6A8D01ED3BCB18A3180EFC9700871F480959137CA1480C3640547497ED7CDB4912ADE1385F9F35B6D27BE64E362BD71E0981BE952B00AA20DC57465DA89B87BBE07F27454FB24B3B86766F95A5A5B4EAECA2620C3BF87C0654E6561398F27F96178EB1062E42F6E6AE0A669FC6C7170F217C850E822B4E70C9033A375BBCF6D62D11B3DAF7DA976D4A9D955B924E7F0A19CE77A53EDD424ADFDEE8558F06887E82A936193AD5E508938DD3FBFE02DFEBD98C2272DEAAD8AD3B0FC86C3637A6CE694DD95E4FD55F433E151D35DD4C930177CA66322001110B9BD0B89A096C8C3A3431C100E39E3D2E65504A770F4EB2F19E9D8FCCAF15B8E58DFB52A0B88406A48A036193F3EA9F8ED2322FC69CEAEB9E2DD6AC627DCF4CB109EA05AB5DCEA5F92902F3E7BD457C240C958FCA7B17F2EDA1248961C9C827E99BE0A3D60B3E27E42B1FF696DD58E48C7B832D8FE95529B9C8F075E67294C1B1060EC6736DB73FEF7407B320D850B049D80F9F4D536361038C4BAEAD92F24", "C10051089B11B578F56E6C24FAB973C5D1B4A2F937E4A402FFCC45267F4A3F4CF4EED3DFF530838A570000F7E523D1B97FF798A3C6E12F9704126A9B6FDF606031E4D8E1AE39A470FE929124FC95961B85A5A6E10A79CBA60F54F37D4DCCB13FA3B0A3A1729184C59036428532E3DDB3F7B8D373DC08842EBC2ABBFDEB5B73B2F9B7E83C81D5D0EB3037A32AC0E5B6CDCC7CD84B9289BE16106D1D019D47209AFD8DA78EFA0F9108377C187B170CD53F366B17899EB41903FA1627AA245C07EEA5D6DA78039B3C4C1D70DD28870A40EE3A048D8209C4088A0847D6859513E01E0F4172C383D64F0B307D721C01495070336A753A75E1CA433FA973BB131E558FACC298C0A6E934E9F717E19EBCEA11EDF3736D4EAF593A8E5AC8EDFFE4D2B17B613E024B41AAD19BC0A27A1E9BE9D25344D4350596B9B0A48AA014191511B26E61A9753D8A38C4E3BECAC93E67CAB5696888C06B9099E9AE856486436FDD1AF1C193057AD1DFBBB14AF772F7D9B00F37A6DC9E805A8DFD9D53A161885E5C2C2A6DED0C54D00A8E0704877DA2F1EB6F6D8EB93B5604A4E2545D454C3D4F0D606AC192E170D44E85E2ADC91E54F56906909024DEDB6F9050BF3D3928D9AE23D9C42576AE4DAD1336F47519EDE436C3B1829CD2C5A0AF63476C7928B32F5E51826D844A1DF765C5578F9C2E5F79024BFDA96FB3199A3C7B47D3755FAF376761B4E", "9C6674915677A62A7AFD4FCB27B45F8E6DDDD08980B7DBE1131E6E2425C5ADBEE8474E93A8A2D4E495B195A6B83F2CF6472A36E690928362B9A1FA994A9FEB7BCBA7FDCB771F59FB434ED289CCEABDAFAE29113389EB98D6F17E5508D5976E11BC8A1E93AF9F7B1C81686265930B4D334568E3F29E1C2F58A62572A610016C1C1C1C9E1D0EB3FEB2B3A210C59EB3980C44BC656FA7C5E05A4472D4255B40B8A1604FE39D8B5026A976310648D5C84CEBC87A8BF6545DC843A3A0B64DC4CCAF2D2203122DDD75BA42E096844899A35A899FDFD72C26E3392EA03351DC78BB9F62F51D913F8008DB00969C64003773FB2014FAF97E794A45792495BD52D7BE7ACA47FF2BF570CF88303377092B5B6BFF3B01D38A53E8A68B0D81FC2D1D375EB27C7AEEDD70679E8DDBA6DE656442ED951478FB96A979B4A9091F344EF39AF23DAA886C6FBAA8611C61686332C630690109E2869D18EE7A2C21B22921B9E3DE40BF063E370FF64E7AFE160B7EBFC4AF6AEDA043042552F5F36C2CABD339FE1442242EAD931D1B83968D1A31A7E32A0838401DBB9C1034D56ADCAF5942462EF63440FD70F91520137A50372D0D125A6285F7D715FD9225D03A109E1FC5EB547303CD7708F88FEED2814607171930436B249924714E8D8E024C24B3C0C9E40127DECE1AD966C3F9DF01793864615F291B73F73D27B624ACBEAD3D371B8D4FDA823C0", "A1B9E8AB6C44A3610768CC17E3B899CEDDB44B746319EC50BA7E006EA0F3C09E9D67EF8A20154B2F93EC265B800503BC72831800CE0C9FB6CCADC8327A840F69DDF29BE212BEFE4AB1810026FF786D9D3A88B29745EB61131FB47B385F83CA211B4A2BC0449F7ECE43B2DDAC94C10955FF2E078AF573FFA7349907571AF501FA6A2FCF24E4B5676F8213475351C0398748FBD60A5EE8A1128C0998E57D076A201453EA7C70B1F171E7D084F444311C9829CAD03E0C2330D7E8D39DB6B7901C30787FF123CFBAD4E974A5F6412FB1BC927FD65CAD1F3AA4ED52E2D84AF6257EF311222467DE179E89438524116D8E0A4A94C19A4D66D0AE0FC535D69C4953C2E43136AC07D6A5774D59DEF1471B4097146C2124DF83D36678FBD7BEA6E258D826645DD88AC9A7EA5E05FB49F2CB29EA9081323FFB2A00F3915D1F36675BA1C9AAA3B166D9FB2529150D3573E502668E33DFA5BE95AA6C2F1F106D69218839BA590406B4FE4A03C4B16E29E6BC31335234BCA55D34955880B702F08203198EB7BAE381B231FAFE513F24C8BA9E58798F35465C2679DD5BA8B16EEDAFB04E5A807B9BE6EE4B3AD77609D2B9E0985BB23397BBDE08F4D0B21494A3129857E37D13862C1FF77A57AC663C206A92F8358E6C05FDE1A9D68131BC04B76F6865E8DF5C48F9424CD9AB6FEFB3B49BA8D32C923CDB8602C5367AA9ECAE48AEE6A276CF25C", "ED1196222AA470CB4FC8A0B7D2C785EB45D232E06453B77DB76F60E5F7BAA0FAE80467EC8C656FC27FFDE8BFAADD2368B41AFF69460495923942ACF85C09EF01BCED0076960E5CDB1D36061933C1B6037548D27932CDF969FD5A910D5564F3A6BAF896A2A69F40EDA76E813AA261530F686042235A39A76081F58D952662894E6E648BA72098D840235EC4A2B963F8E74B52F2D0088DACA7EDF48115618DBBABC698C04AAAC0632475BEE65BB26A4EAA08F0209B75EB259B826724F580209F8B991808411F823819CC5F42A9FC1F0CEDBDC54C046EB1D1658FFF7252908B09F8C1D82E5F6D605F0B17B25506FAF91D4B3D4EBCB7A705E5BCB2A6FB409ABE4B1B0B47630F1AB0B40A3455181678573F82A7C139F072659D80671961D614D9F7DA72914BD5D6F417EBC152595972FDFAE876176923CF1F2F745A6FC27E134CEBC2D9AD5CC733F619C1B296026B7C4717D2086D91765D83AB76605050B810C542819BBB7CD87EA2305AB4A567B2C500D9913B7C6046F748DEECFE3C3AF829EF97E03799EA50F7C9EB38990F0D466498C091C3ABAA18453B173F0AA3A486DFAFEEE68E7998EA30E5C1349F2A54AE753963CEF58332A114F964B83B4E446A44147B11FFC60DA25B5FA705F34725B1388B17E99018236BD646DC714F8B7CD3BF2648063B2D3FB713AB94D82ED81D571D5BB4D3E5F2F067E2F2C90E8B6857E6A651B8E", "EBE597534C0A6FEE9CE6AD10A80D2DFD160D7DE7A20154F62AFD7C3187D51D09DA39A958432CDCCBD83FCE19131E65A30DE99DB796D93D0944223D960BA233798323D368DDBD407D51B80350976951AE0E50CF409279301939624C741D20D5CDBF4BC3ABC8723E267BE75707024F6398CC6D32A7BCD0989555E0EE49C1A2354D1E961CA9910A5169ADFA71D56745181E0CF13469D8F3C6020637B8118ED8421A680FD4D515DF6B31C39ACFA36B601027AFBC861493D34ACEACFB501DF9A311B7EB9D38D7107E6B5ECBE74FD35CC8BC8319DF9F1948653C94C868DC24AB8D7E650D8F70A3D1D878558AC9BFA50D425604037F3DA323192654F1296C8320AF934AF60DACAD7F9630EA4ED0A635678213F6D09D73A2544C779596990DA42079C23581E22F541E6A3B6D3FA383597A8BDD7CA42930816D74FE8B12F92CBB9303CA5FA12BF5FE954FA7B53E0D88B79BE263B4B55B42A7672F5C4F7E6E2DB4C02AFD6034B7371E01215CED3F73AB8E3419D7447781AE5DEB4F4547C5549E9B0AD59940C162790650344E5ACAB33A187A58E29C9032963F088C044ABE73A855FF1FC93AB8DC258E419777311B7997EA95D32CF1F0140CAB9E6707E73E4FE575E0752816122C39B8D12F34ED6771EAEE192D830797DBE97A0BFD00E39CA382D44F080BB4F8FF6FAAFF2A82744C6E14D3036E00EC2ED5C9D184ECCA300030D7BD77B27DA", "A56990B45E9AA5F9523D563D53E854A47629A4183E85CA1995BB374EE5601BDBCE5C7407999D28FF0F1B3EC7A463D3C941C57B7EB71E6262DA3A7136627814EA6D28C8D16E91680B0D961AAFACE2CA4099F986CD45A2AB387E39497B13678447480514B4008F0FA3B95AD7D2B4751C680F0C7D3651F9621E1355CEC76F10468ED33DE4C7D7D68B786B7F0006C604BCF893739FFE6AE56AD5AAD07D5BE76DE1CD581B10EDFEC9DF65AF925C4C1289837BE1854A62FCCEECCC4E2AB47B4864C467F5E4C276047501EABE444E051DEA933863E0FCB2356CC0C3817BA59B2E0AD78BBFEF4C3E4C35343331CD81C7F4C428B0418DFA4D6FF655BC50AF49C9A5E8A67BC265A3F30800B93E42C0E66F117E6C59C85BA5E273234EC7212C7B7AC3D87FC0E0EC5FBAE6654461F24BBDF9A063FD0E3F98741C5622ACC8BC008EB0E3F3D57680F12E52FB94CD957EFDD49BF512D9131757161A73DD9650E3561FB31509A908D3EA8DBD1C3AA95AC32E6960E0D17A218A25784332A88E85303DEBE117BEFEDF46882995AEBD704AEAE032668AEC6B8E5BD28D3F110C9F8C1DCA8FACFDC1188A073037796555DC4FAA26ACB9F51B545D32C224424BAC3DAB20D3C08D784E9FEDB47547C25671C269A62163742B55AB4CF9406D2C5047F92C76356F0B90221E019B31890C0B8FCFD04E6B5D06114B967D1358797238D5B14D824C8F0BD7B8BD0", "D85AAA53F2DE2946EB0CA09DEBB6CB61D91D27C8907B90C89E20C01F681D33BF0DC70B6C79F19E4DB64793505A0E055C33D1E07B7F5AE09F7EFF0C8CEBE80C84373804A48A945CA406D3A1B17CA787DA265C1D8FC735CB098C1AB37A0452F1A287B8E19E3A57E59EF8F2E6CCE2F0AA7772955977982B1F6880AE8717520753636591BA36E351310E98ABB77E26E2CA5BF267935FC38DE173CA20C3A964B56924A5E82A9E36D005EDE6680D543C021C7A9F53DB69BFA3201880B7797E90D31011AFA17BAE836505F5B337C23A07D6AF167258C314C3001291DD9FC565F6B7FB74D99C1B42B496422B3D3E1A564769C2306E40264641EC14724301795B4D54F5FF8D6C4AB3645B56C1D0FFE9B977FC5017E2A53392E7458BAA308C343AAFF5B46B808BDA1FE5C284299A9EEEFC755132F9D3B475E2FCD6BA84917C601B5E8340B5A68148A33563E40AC5A1E49BD8D5FA77BEB6B99E6F4F68A10ECA112475531E7C1942AB9504B8F76EA7BCCAE4A19EF859FD6B6753F07BDD9A19421A2A0B8F27643B2311FAD7978F4366C41BD9F609486FC6EC7CE833A00D7A48AD816412BD201F40C93D136ABB8E329DDB816D1F59A1F3124D6314C64C9B640E4D5BB201CDB4490A65C73228E78055AD6632D81709AA443EBF29A4607A504DD5CBC0D271FE595677B8E6A5E29E23D171D50B878D0D3F9416657E3997D077677B87399A6D1936E", "A0E629454DE594F7693888C9ADB907F83EC6818D6FC0019B70077BF1B0E3C2CB16A263BE145EA8129FED6BD98F3D9120BAD28379EC8E36DEC69C59B37BD6C2B65D172C70C69C23E29A6143121AEB9E6A9AB46C3DBC3979BC876F4357F6BAA5A0CB33C3AFF1654FE547D5D760E8CE095A9B324E15CEC1596BB7E0D56433D8908EA69925A5CCDCF01702811AD1103F237D36C5F12A3CD938A61EF76A3387340499E4EF1855F892F57AC39AB419F1A397CD43FE7F4C5E609ADF3A2A8E401FFAC870985826CA0DE211996A3549A203B798A5162E98FFC8B5CC2CFA68D618AE80D399D8DFE0FE4AA81ED9B586EA89F646D5C0AA8B107506C7F86879419D0F717E8F70C5A9DC2C3F122CB52F3B691087EF5971C27086512F1890494ABA38B1619969F8846B8876B95C56142F5B171502FA44ACD0299E82FC94EBCD4CDDBE1F5DF978871128F79C1758BB512D5C3BDE59A89786CF4E4716F0515F45A1CA31B06B23E4883F99EE0488848EB0A60FA14AABBD41EC5421D0C162590FEFFEBB4DD0300221471DE8DC0C87DB3F1D54DB11744F8A7115DCA0595F6CD99B74A6FB10C0D14E430F8B40E3E7105C89B2C8F12B37A8879AD9BEAD49AFA1BD56569713CCDA3FB634C3011D51A8DCF84437251A7B19EB61FCE5DF6E2278784722BABE384BA5424646FA23F6D10CE23DC5E0D8D512E7C5C094B1627D6285B57EDF38A7DB1BD57B72044", "CD7AAC98501F29507EA4E0183E8A40D2E5117E47BB5D18D01A3732DE4C821DFE86521CBEA7DB29BE1148BD544ECC681689BCD1B41EAF755310B7659342F8EE11CB41550CC30E566E192796B66C1A83C0B28BACCFA6C393043A0A2CB89712BC1CCB174DE58E66896AF39C1CEED1E05B0435F8CF6FD920D100F51584FE24879987399481DBF27DDB6286B6353919E552E669290CE02AB4CD5113D7F484229F379C7332767EC69E4336439B05DE1C1E3563DD303A4F580BFF20A40E49CB0822F715ED0221EBCDB5DBAD751124B1715E82F37488265135B6C8BBCF4F801ECC4D3525FF189493AD4EFF0C042B070C4CA8FB1FDF43D79F06A6E4E3D35D7B07D4B728D5DC54EEDACBBBA1EDDCDC07ADF7DFCFEF835E44DF1FF66DAF2A7BAEBE218AC3B15E183044D6A8A89B3C101B40BED97ED5DF93BBC1B84931D56B8C822A6D058AC74CFA4C85D8B456698E82D5B7574C17B041E5F4BEED09F75012355CBC322B822C63F10C18A8F279E9A0E18E1FEF183D23E13894E31F6D046956FE8A647558228F6D4D6910151EC03937876B6ED7A078D33DAEB3F2239353BB8181E62B286BBC41588DE10F478A5CE5B508F205A41820356767B0A0ED4B8DB9EFE348362E9A90D6C30218B295B338B51C09239D02FC8A1E7DAAAB60AC37F5E67CFC88EEF69567B5C81A03B449F4ED38B9D295A36AA3503173F6F6F66D93CE72D753076040FACDE", "ADDCEDB50E907D20E826E6E8A0D30C20C74B2DF204EA784BAE9F618CAE33A3C937729DF9CB10BA2A4C33E0182A37200C0CC509729D828B8A2A20F283AC4F9306596684EA3FB5492A4C9F2DB459E7531C9F9C0950E7D9E93B3EE5912AE7E39AC8F4EC14B18F24E325003F477E347C5AC1B67CDB11AF3BBBBCD0AC3703024B5767AA67A208254F798684BFD1D3EACD757EEC77254950A146620400DB95E694574F739A991EBA771EBBDFF1056BB39A77DBE0636A032E17141332F951C57C6C90F348F165E3ABDD60D429D5D6BEC7E3E3463806F819EB2D212B3528A5EDE51F235AD100A35E890955F8A1DC51FDCB53EABCA2540997DD054C1F5B29462995B876B44D085904E55E1B838BEF600A992EB49CE078DF75AF3D0F137685AC0D07F0BE1EB87B63A41E74DDE869C8A683BDE60AF5D77FF18F7137495BCEFD0ED28F62F9C3E25D332B5F861D999FCDC0B4851A984A4DBB53401FD40351ADA4335C702BCC8D900C737507B990BDDBE91D201E3A0946DC968D43FD10D04B0B76667FF5B4291C2124B0124C6B710A6D1BCFAEB016B9DEEB0F7A4FE044CA4EA0CCD84B7682617C3A545071EC295B0663B3F577D562DE1D9DD80DE6A1EFD6D5991EB5246F1597B86D0E9A90CF6DB0EB2B8E7BAE9431E567F01AA98502C773742246467ABF911A91A51F6C1B9E0C3233DC1A37D17DB91A5F0F661B0EB5886964456C7818601BD0C" }; const std::string Galileo_E1_C_SECONDARY_CODE = "0011100000001010110110010"; #endif /* GNSS_SDR_GALILEO_E1_H_ */ gnss-sdr-0.0.9/src/core/system_parameters/Galileo_E5a.h000066400000000000000000010272601305042567700230060ustar00rootroot00000000000000/* * \file Galileo_E5a.h * \brief Defines system parameters for Galileo E5a signal and NAV data * \author Marc Sales, 2014. marcsales92@gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_E5A_H_ #define GNSS_SDR_GALILEO_E5A_H_ #include #include #include // std::pair #include "MATH_CONSTANTS.h" // Physical constants already defined in E1 // Carrier and code frequencies const double Galileo_E5a_FREQ_HZ = 1.176450e9; //!< Galileo E5a carrier frequency [Hz] const double Galileo_E5a_CODE_CHIP_RATE_HZ = 1.023e7; //!< Galileo E5a code rate [chips/s] const double Galileo_E5a_I_TIERED_CODE_PERIOD = 0.020; //!< Galileo E5a-I tiered code period [s] const double Galileo_E5a_Q_TIERED_CODE_PERIOD = 0.100; //!< Galileo E5a-Q tiered code period [s] const int Galileo_E5a_CODE_LENGTH_CHIPS = 10230; //!< Galileo E5a primary code length [chips] const int Galileo_E5a_I_SECONDARY_CODE_LENGTH = 20; //!< Galileo E5a-I secondary code length [chips] const int Galileo_E5a_Q_SECONDARY_CODE_LENGTH = 100; //!< Galileo E5a-Q secondary code length [chips] const double GALILEO_E5a_CODE_PERIOD = 0.001; const int Galileo_E5a_SYMBOL_RATE_BPS = 50; //!< Galileo E5a symbol rate [bits/second] const int Galileo_E5a_NUMBER_OF_CODES = 50; // OBSERVABLE HISTORY DEEP FOR INTERPOLATION const int GALILEO_E5A_HISTORY_DEEP = 20; // F/NAV message structure const int GALILEO_FNAV_PREAMBLE_LENGTH_BITS = 12; const std::string GALILEO_FNAV_PREAMBLE = {"101101110000"}; const int GALILEO_FNAV_CODES_PER_SYMBOL = 20; // (chip rate/ code length)/telemetry bps const int GALILEO_FNAV_CODES_PER_PREAMBLE = 240; // bits preamble * codes/symbol const int GALILEO_FNAV_SYMBOLS_PER_PAGE = 500; //Total symbols per page including preamble. See Galileo ICD 4.2.2 const int GALILEO_FNAV_SECONDS_PER_PAGE = 10; const int GALILEO_FNAV_CODES_PER_PAGE = 10000; // symbols * codes/symbol, where code stands for primary code const int GALILEO_FNAV_INTERLEAVER_ROWS = 8; const int GALILEO_FNAV_INTERLEAVER_COLS = 61; const int GALILEO_FNAV_PAGE_TYPE_BITS = 6; const int GALILEO_FNAV_DATA_FRAME_BITS = 214; const int GALILEO_FNAV_DATA_FRAME_BYTES = 27; const std::vector> FNAV_PAGE_TYPE_bit({{1,6}}); /* WORD 1 iono corrections. FNAV (Galileo E5a message)*/ const std::vector> FNAV_SV_ID_PRN_1_bit({{6,6}}); const std::vector> FNAV_IODnav_1_bit({{12,10}}); const std::vector> FNAV_t0c_1_bit({{22,14}}); const double FNAV_t0c_1_LSB = 60; const std::vector> FNAV_af0_1_bit({{36,31}}); const double FNAV_af0_1_LSB = TWO_N34; const std::vector> FNAV_af1_1_bit({{67,21}}); const double FNAV_af1_1_LSB = TWO_N46; const std::vector> FNAV_af2_1_bit({{88,6}}); const double FNAV_af2_1_LSB = TWO_N59; const std::vector> FNAV_SISA_1_bit({{94,8}}); const std::vector> FNAV_ai0_1_bit({{102,11}}); const double FNAV_ai0_1_LSB = TWO_N2; const std::vector> FNAV_ai1_1_bit({{113,11}}); const double FNAV_ai1_1_LSB = TWO_N8; const std::vector> FNAV_ai2_1_bit({{124,14}}); const double FNAV_ai2_1_LSB = TWO_N15; const std::vector> FNAV_region1_1_bit({{138,1}}); const std::vector> FNAV_region2_1_bit({{139,1}}); const std::vector> FNAV_region3_1_bit({{140,1}}); const std::vector> FNAV_region4_1_bit({{141,1}}); const std::vector> FNAV_region5_1_bit({{142,1}}); const std::vector> FNAV_BGD_1_bit({{143,10}}); const double FNAV_BGD_1_LSB = TWO_N32; const std::vector> FNAV_E5ahs_1_bit({{153,2}}); const std::vector> FNAV_WN_1_bit({{155,12}}); const std::vector> FNAV_TOW_1_bit({{167,20}}); const std::vector> FNAV_E5advs_1_bit({{187,1}}); // WORD 2 Ephemeris (1/3) const std::vector> FNAV_IODnav_2_bit({{6,10}}); const std::vector> FNAV_M0_2_bit({{16,32}}); const double FNAV_M0_2_LSB = PI_TWO_N31; const std::vector> FNAV_omegadot_2_bit({{48,24}}); const double FNAV_omegadot_2_LSB = PI_TWO_N43; const std::vector> FNAV_e_2_bit({{72,32}}); const double FNAV_e_2_LSB = TWO_N33; const std::vector> FNAV_a12_2_bit({{104,32}}); const double FNAV_a12_2_LSB = TWO_N19; const std::vector> FNAV_omega0_2_bit({{136,32}}); const double FNAV_omega0_2_LSB = PI_TWO_N31; const std::vector> FNAV_idot_2_bit({{168,14}}); const double FNAV_idot_2_LSB = PI_TWO_N43; const std::vector> FNAV_WN_2_bit({{182,12}}); const std::vector> FNAV_TOW_2_bit({{194,20}}); // WORD 3 Ephemeris (2/3) const std::vector> FNAV_IODnav_3_bit({{6,10}}); const std::vector> FNAV_i0_3_bit({{16,32}}); const double FNAV_i0_3_LSB = PI_TWO_N31; const std::vector> FNAV_w_3_bit({{48,32}}); const double FNAV_w_3_LSB = PI_TWO_N31; const std::vector> FNAV_deltan_3_bit({{80,16}}); const double FNAV_deltan_3_LSB = PI_TWO_N43; const std::vector> FNAV_Cuc_3_bit({{96,16}}); const double FNAV_Cuc_3_LSB = TWO_N29; const std::vector> FNAV_Cus_3_bit({{112,16}}); const double FNAV_Cus_3_LSB = TWO_N29; const std::vector> FNAV_Crc_3_bit({{128,16}}); const double FNAV_Crc_3_LSB = TWO_N5; const std::vector> FNAV_Crs_3_bit({{144,16}}); const double FNAV_Crs_3_LSB = TWO_N5; const std::vector> FNAV_t0e_3_bit({{160,14}}); const double FNAV_t0e_3_LSB = 60; const std::vector> FNAV_WN_3_bit({{174,12}}); const std::vector> FNAV_TOW_3_bit({{186,20}}); // WORD 4 Ephemeris (3/3) const std::vector> FNAV_IODnav_4_bit({{6,10}}); const std::vector> FNAV_Cic_4_bit({{16,16}}); const double FNAV_Cic_4_LSB = TWO_N29; const std::vector> FNAV_Cis_4_bit({{32,16}}); const double FNAV_Cis_4_LSB = TWO_N29; const std::vector> FNAV_A0_4_bit({{48,32}}); const double FNAV_A0_4_LSB = TWO_N30; const std::vector> FNAV_A1_4_bit({{80,24}}); const double FNAV_A1_4_LSB = TWO_N50; const std::vector> FNAV_deltatls_4_bit({{104,8}}); const std::vector> FNAV_t0t_4_bit({{112,8}}); const double FNAV_t0t_4_LSB = 3600; const std::vector> FNAV_WNot_4_bit({{120,8}}); const std::vector> FNAV_WNlsf_4_bit({{128,8}}); const std::vector> FNAV_DN_4_bit({{136,3}}); const std::vector> FNAV_deltatlsf_4_bit({{139,8}}); const std::vector> FNAV_t0g_4_bit({{147,8}}); const double FNAV_t0g_4_LSB = 3600; const std::vector> FNAV_A0g_4_bit({{155,16}}); const double FNAV_A0g_4_LSB = TWO_N35; const std::vector> FNAV_A1g_4_bit({{171,12}}); const double FNAV_A1g_4_LSB = TWO_N51; const std::vector> FNAV_WN0g_4_bit({{183,6}}); const std::vector> FNAV_TOW_4_bit({{189,20}}); // WORD 5 Almanac SVID1 SVID2(1/2) const std::vector> FNAV_IODa_5_bit({{6,4}}); const std::vector> FNAV_WNa_5_bit({{10,2}}); const std::vector> FNAV_t0a_5_bit({{12,10}}); const double FNAV_t0a_5_LSB = 600; const std::vector> FNAV_SVID1_5_bit({{22,6}}); const std::vector> FNAV_Deltaa12_1_5_bit({{28,13}}); const double FNAV_Deltaa12_5_LSB = TWO_N9; const std::vector> FNAV_e_1_5_bit({{41,11}}); const double FNAV_e_5_LSB = TWO_N16; const std::vector> FNAV_w_1_5_bit({{52,16}}); const double FNAV_w_5_LSB = TWO_N15; const std::vector> FNAV_deltai_1_5_bit({{68,11}}); const double FNAV_deltai_5_LSB = TWO_N14; const std::vector> FNAV_Omega0_1_5_bit({{79,16}}); const double FNAV_Omega0_5_LSB = TWO_N15; const std::vector> FNAV_Omegadot_1_5_bit({{95,11}}); const double FNAV_Omegadot_5_LSB = TWO_N33; const std::vector> FNAV_M0_1_5_bit({{106,16}}); const double FNAV_M0_5_LSB = TWO_N15; const std::vector> FNAV_af0_1_5_bit({{122,16}}); const double FNAV_af0_5_LSB = TWO_N19; const std::vector> FNAV_af1_1_5_bit({{138,13}}); const double FNAV_af1_5_LSB = TWO_N38; const std::vector> FNAV_E5ahs_1_5_bit({{151,2}}); const std::vector> FNAV_SVID2_5_bit({{153,6}}); const std::vector> FNAV_Deltaa12_2_5_bit({{159,13}}); const std::vector> FNAV_e_2_5_bit({{172,11}}); const std::vector> FNAV_w_2_5_bit({{183,16}}); const std::vector> FNAV_deltai_2_5_bit({{199,11}}); //const std::vector> FNAV_Omega012_2_5_bit({{210,4}}); // WORD 6 Almanac SVID2(1/2) SVID3 const std::vector> FNAV_IODa_6_bit({{6,4}}); //const std::vector> FNAV_Omega022_2_6_bit({{10,12}}); const std::vector> FNAV_Omegadot_2_6_bit({{22,11}}); const std::vector> FNAV_M0_2_6_bit({{33,16}}); const std::vector> FNAV_af0_2_6_bit({{49,16}}); const std::vector> FNAV_af1_2_6_bit({{65,13}}); const std::vector> FNAV_E5ahs_2_6_bit({{78,2}}); const std::vector> FNAV_SVID3_6_bit({{80,6}}); const std::vector> FNAV_Deltaa12_3_6_bit({{86,13}}); const std::vector> FNAV_e_3_6_bit({{99,11}}); const std::vector> FNAV_w_3_6_bit({{110,16}}); const std::vector> FNAV_deltai_3_6_bit({{126,11}}); const std::vector> FNAV_Omega0_3_6_bit({{137,16}}); const std::vector> FNAV_Omegadot_3_6_bit({{153,11}}); const std::vector> FNAV_M0_3_6_bit({{164,16}}); const std::vector> FNAV_af0_3_6_bit({{180,16}}); const std::vector> FNAV_af1_3_6_bit({{196,13}}); const std::vector> FNAV_E5ahs_3_6_bit({{209,2}}); // Galileo E5a-I primary codes const std::string Galileo_E5a_I_PRIMARY_CODE[Galileo_E5a_NUMBER_OF_CODES] = { "3CEA9DA7B07B13A6CC0AE53DAD1EE2A0FCC70009338C08AC0EE457F76A1690815C3C940AB722487CC8F3D1F4C428828E7FD2A21230E42A3BBDF1E792165F644D0E0335F95EBDC93D6005CC0C680DB7B0E1B8C4946B7974319F9816141DB9E01011E4F20DA8F1B8E15A6F618CF599C3F5C1A1B276D51318ED4119BCE0ACD0332F3DD8F88EC5215AB311C51FF4987DA93B09A43BA84CF08032F6CB28F43043C54586811D870AD6FA27AA63785345C8BCDD3DA26A0134738BC7E08461D5409FF0B791D8574CE797FC5EF7821055028CB4AF92AE1088F8806CD55F0E5FDFCD8D74ED801B2B44AD5D79D1924D41DDC6AB2070B5360CB64CCF487FE517420348CC39BF50BDF78BE7DA91542FEAB689457B3EE69E43C75FADC303F31032FD96B7DC70A88C3B7BAC7322B285D9CFB3A93AC8B890165F23848FAD8477DBDD3D0AA4CB3CD73A48000B6D134DA2DA70B56E590A101AEE78864DA0C64A7BCC6B37CD6F31E9AFF10CA4D47630752D253944632DF6EC60AECDCD223F29399CDA3B74D1DFA5471277EE6C814464A8C55D3C0B83B36B6AC9FA90CE876ACDF65E3EA3FD61D309EB71ED29A3D510B2F4C0B6D6C5B57EC9060CFBE48389DCB17CBB2284E7F578565B91503B06F49CF3E8534870AEB6AD9707265A9A1E6E2E5E6DF6DAA367239A96EF5B02C19A4543D537EB4D9D73966C09E9B52B4706F57B3E0987885EB84DEA26F7823D895F62015188ED38C04CC6714F797FDB0BC713E3D0208462F9A68E3872A167BF1BF9791AEE8BB73CF527C50975B55C4E5C2F2E95B677F833ECC878D1764839608CC1108A75EE9E58FFCFE4CB52884E7AF15EE0632E0729DA1CF5B7A227028CFE1E08F8B881E1A743D52DD27BED33DE0EE75DC031B4864CF192DFEAF64F726D73321363A233F81C57232432D2B0A5A4C44F4320847A9C143F378F204185D2B571482FE45D6BCA152E6EA7223BFC6DCE06CEF90CE9114623EAB9B1EC789B2051B4AB711DABF5B16FCD970F437B8860313B4F1F14D384EE3976B7E55D2FDCB7E1BD9BE18B722E37C853ADC7E1CC2870A02881F95B78487780E1D1C296415109CF07AB63D0782A9F451CBEB3E8B919917AEDBCA8A8E563AD3784639793E0F25CC9CC62240FA04B2F141E71BF5C84EAC56431159556B8BCE077A51469A87737D3D6F06D97DD479FCC35129F4499C19EF98BDCEA9D4941B3756CDE1997C3AFCAE62B6D9E23341E11CD05A7FFF52F5814011A84D737E1264109006BEF5F19E3C6A9C7521B44741A8282755A8F0DC2FA0E1F6CA4FB34D8CD5FAA27E18808868725B9634376137C1BBC46934F83958112D03082DDD6148F353BD1DD24B9F8FD7AD89C40DA0A92A8DBE3608038CD56FFC4ACA35241D76FAC4CAE1211AAD9D73D51C81C59BCE05F71C345730D3A2C670F8F533A950EF24B00EFE6A3F1354694ABCC6FD9EC4E74DDE1F287AD4F847A297ECCCC39AF029EFCDDDB19932D906B9CEDFCBE0D422CEE305DD05E407340F28EEEA866664D60AF293A45D5D6D5C0000B05F79463DB513ED488DE7BD4EC9EACFEF973B23CE4E9539EFCB797456CF5FD1EC54FDCEE80B39063C48B91A5C2D2BEBC81B9B46D0AD6503BE5AACED2BA5EBE81F630B4E07510356E8229F7FC5EA532B8729CDB819E066A15379AC6942CD4BC5E97C6791E098105C323A3A3DA3880D5EE5562ABBA2BDC9906F4486B51ACF8AA4405E9D7A63DB9E3058782DD9AF3995FFB3D34AEF98234A0B3DC62C339325B60706C068F0198BD8FA658396D06931B069155217690C7F88FD230CDB38E3E48530BD47722FC", "9D8CF144C4B667345D44F765622A956CAC4E097AB1CAB05CFBCC6BB68C709503AD9DB09C09C983D46A04A05B6F7EB26DB4D46F868C10E112828B1AEDB3C0074BE0DE3C9B7821BABB4F8B8E24F69869CCD981B09A783BF6A95F39ECFAF25DED6B16F89EA09D3A8413CCEBB545651B363DD385D12BB72420440C40E804FA27DE029A1E08629BAAB598C035DC58FDD309844F3BEBDE40FCC231F38605DED06572ADD85DC51D3D8B89B4480143D0B75283522354330E5CCF4DE1A6E68047D5B8D45D835A891F2D40C9DB8A76CEB1D18FE2BC38D080A8D97064CC87D692DF21184ABFDDA7642D0BD6F3209D06B4AE7600F7DDDB71DA751120599117ECCE645FD109CCA2EC7DB98F4177F14DB854FEB314B5D7CDC3385AD203464EADEAFF4AD08DFEF3D21240BFB8EFCAAC1356C72A0F5C61BE03CD2A21A7D756FA9003D562FC4A49A6BE788EC8D80054ACA881DFFF72C2966EECD09F185EDD11218C6696DB14E05FFF3644D11E508F4F1E9C5AB3074FB1C3FB21092A1C8D5AE05688FA4A9226C3C30D0BC3981933DC8648240F8CB67085F53AC5295428DC8447A1E5A46C2BA86796982C4C6CC647FD8079BC4024BB69E2B226E6F3D0F8A90B4D36DA2AED4C6BB60D318AA7479FDC2031143C67CB4381C27072E12935001524C7BECEDAA9954BCC2AA218E9EC2C95498FD8DF655C015896D9ED42CE7F91CBBA2CC4A7920038EBB5F5CE638F969F8B179E72AE252BE7E826E5CB53C2E85AAF1E1F1AD8D534F78A681928818AC3154651FFC583DEB0A6A1F40B98771ACC528AAF80D210ADAF83597869968D499ADE9A19BAF341E8CBA20F0E1473BDD898C24C7A5466F9924EC7EE992A2086AF295BEE1F6D0F8843D91180BF2C981C11FD978B23B6BAF7786BD526B458B76A87C31D7C52DFA43F3D362C8EEFFFB3FE5FB3F6E5F34B1FEC7EF1031146F3F609B32677F148F7DEBCF3526BB45582436A3092408193D6312626E46ECFA96FEAD12A234CACE10FAF9DE75EE2D238088146328E10E9ECDBB0B018ECDF2725415CF5A06AAB857403BBF6CBFC350903A982864827988BC805A3484A31FECF7A40D4FE251BC7E487613B9D3A48D3C7DAEFDC49C4B7E625F868DB53A798515A61050978552699EF2A5BF2F13BDD444EADC9B60B479FDD4633EB4C1062AA78BEF06692DED203819D3160310FD7F2343732156A9CBCB0B50BA9A8F93E339B702670E54BFA6DB2E2E773202C690FB71EB03671AB0B1B02B2F189BD99061ADD23F75F4914067AE638C9A29DD3661C28AE272CE692CBDE6AE880FBCF272E548342372CBAF6370C7E3AE9648341CE7310BE1C534B5702B0611AF65868F840B6B7613FDAEA21DEFB4F2024487023B02B8B58C9E9F27AA787EE775249EFC40913CBBD69C38538F239B203815F00F7B9CB30DC79E6A0C3E069D109E4A1BAEEE36D354C3D0121F1342F1F4AC504A68D69DEC158D54B04BE8164B48F31BC0827A0379C5237070B6F963741AD9ED4F3865698FB8233D7F49ED4E0EEF3AD927CBAF4FAE183252BC56AE4CDE3E329B1D9C87C6C11429B15B8EE589213CFAC208A12AA01B4F1F7CC35CD0AEAE217471B3DAC1C279F353DC61994FC45FEDBBE0005D8EC729385645864EF98A3A417E62F1EACA7E60D4E773BB2E4024D62830F103A7988733DD7BBCF3AB0CD0049006FE2F7EB3821724BEC37EAE44681A9699A025D212724CD98CA3415FE2BD09FADC02F1501FA38A6083427B662DDCBD0460E12A09072698EC8966C47B8A640AC79C1B7722E78A6C28680F4BB77BBA477BE0A6FAB959B9753217C5708", "45D1C8FF162EE106CC87C3EBF6A837930F8CC797EC7A446E8A213ABD239582350636B19B5BE428A9C13F980B7AF5CD7F32630AFE8693CDF0EC0BC2C84F2472F5B86576E8C43136C14717A24705953D392BAC96C1055B782C7941D82FEA357E5FDEFF772FB9F3DF248455CADEAC4CBA2EBA9C91184006D1680E000D59E4BC8FBE2C2F7CC2E78BFA5B60EB292F244E6CF497D5A287432F2520B31B9D9FEC1210923299EDFF043CE077195509E92372F5959AAB4666AE486DEFA400D81463C388CD05C677BFD4953D2627105B0A776960FEE916C75D53981D30DC689581B7E8E0723D65949662ECFAA6FCC9F0CE8892E367721718F906207663F9AD450AE98D75DF004080FC15DC2CD7A1DCE013A0E547ADDC29A397ECB9E7FA02035327AC40240E2091098708D424563AB7C5867F3F2D78EE3EF5B658FDDBD49435060CA2EA3D559CDE957B7E48B98DB41CF875F7B3D9EBDF6547B4EDD98DF4B747B0793152FA8CC07C6D9EE5A2002464566D86466C2EDE54A2BF4BBE823049E57364C127A14BFE1B88ECF70EFB81EB831BBF50F6AE124E5F6A775F3F2620E91D489CCF24811C0890EF905E9E2ACD399E13DC81333A54BDD295B872EB74E412E2FB654A9874854FBC3A68C73434C5FC5CED27534B2B13C316205FF4E432FAFC13A7B5B7A7FFA9FEEDB5AE69036F8F2955DA124CE5856E8C53F24E609F7D3386DC5212B2E78B5AA23B59D45FE98AA08E9CFAA9D52ED260A36AF07522C047ED43808A39D7019E444EDF84D885A9AC84092A0F6BFED562F3E0D79FB5CF62F98E67EF219FA3F5AEB7D4E344642D3D4B1A7EEA18464F6CE8D4CB3181D9EBF6F4122751B54D0D7F3FC470A91B547148AAB1CA0DF59872120190640555A7561B0F2C11280768F74B1A56674FD5480B0F510491431810D99CECBC6DB85888BACBE2B020FB8B3D78039773229714156494EAEC3A2D0A59E718F72205747D69C05DDF1C678E2E154A1F84EF0CA2E24DC4A6A996F0850A396D2432596EAE84AEC0935B8C25D5C65B52A32722F01D281C4F753EE03EB10020E9FA02462CA303DA39560669637532D381EB78AE5EC0F6DBF6273EC979442E6243F65FC51F26C6C9554C6C0E3EFF33BC4EAB6A27CAB9383BE7DDDE4218C4998033B47919503E1C9A789711EBEAAD6C0298B3DC563F54D28675260F6D896F1B8D4FD0001C429210398E9544B3DAA12C31F7EE82EF4D2234E26F873610B76756DDACD24B6132BCFFE735FE75513ED527DD04D7DC6D24059F85706679DCD1474A9DB9571426BE17E6DEBA58B33B708567697F471CA8B78E8FA73B0E18CB6F88BF9E4F442F0FC21FAB89305484828F18B65F9D373A6A2B380D73F5924F80DA234C1DD87416D025E4E663C96F287B0C83DC92C2164D81830781B715209FD11A65E64962D805389BAAA91DFBB990D3511E506A8EC101131C5B7284252F861D047DB2C2027DBAAD487ABFE429CA21CBEA7671350618E441F4D62F2D579CAE29D97023A8873869B553293D9F54D4A929E252AF132325A6E3BCBF7B36D0DAFA1E56A39A5D801FD0D5A41111017BF62AAF8346C7D424FE007C32B437ADE60AAA9540AA5078FE6C3C3CCEA53EE863086646C976FE6C79434A0AA4F53B2E9E2C3B4CF9C9C4015391E27CDFF5C1FCCCC00BBF5B99715A1265F591E294D530DB14DFD485AD34BBCEA32E5B5D0EED15F88BF5D96D058E6D70BB1A232597E35A625E5E8C2EF5E7031A71F70309019A0591BA0A50E87C839498255A3602C0FAE53166BE5E49E29D24AEC47002B698F80FC49E718B66A8959259ACC540", "7A0133D5CC3754D6B259A2CC4EC0298111D098CDFB40549E5C40B36A2846CB4B256672BA189CD3A05293BB36B167508A7BECA3110BFF339BA06340585DE8EDA03AD244A77F54B7931610B6F9C5C54D688A0526A9B52605BD7D7BB01A63F3D1565CF78ED904BBE4AFA4A290EADFE9DC156E59BAC162A818B6CDF38D2BC715144D44A1578BFC727423777784D15ACFE80FACAB61F9E58B5D3FFDDB065A00C5D49DF0237EA6C488D7758F1A689DC59DBFF78261016A7C723FE52FFE571F5876FE0ED50FB00A90BB82B27BCAF5A67374284844E06BB1B2D84B1D20228F5C2208CA7E8EEC2E95027B09372A309223A15C132543FF3A89B7AFBA56AA7A8DBE70E0805D3A54191CC6884D75ED0FC00C06D9D488B0F4816E12D6C2A4324EF742AC8FF885E42100849DA05E3B7C451D43ADBEDDFDD13076CD8D22BDA101F665B5878E321A009B970D1F4C48503CE35365543B3F36786802E5C53FDD756C595784E4F130904044660784ECD9C9161477F5BCEFC98987540AD1E86CABD3EC7823D83877605FFC79820F1381DA29282C3C5B3443B6A67973F0622EA5DAA14FA239542EB140082F242958B39014486E5D5632C62C3EC8BE0E09E038C0ABD52B1322E0F7407FA53AE8D761858136CB371AED5E6FC9D32CADC8F870EE833B7120BC0278D9A05554D90DBEB24ED6F5A8861698D48B4BF7AFE7763C1401572643E246DC65853996B0480D38DB7302364409357137DCD0B416561B9511BA43CA34341FEF7954C28B2D9FF96EA110E0818309C32AD306DA077CC911299FAD6396C872F3F6AF7871395D7E67879EFED929E4C05AB4C09E8BB396048150A4161D7944CBD99C94DD16CD8E0D8BB73768B17EC02C0D4206AF623037D6F4257DAB4C07B4A6C0B4D2E0C9923FBADE3DFF7FDAB45F4E6BC5A895FAE4F5BB9EA247F2D4446E260F7988C452203EEA1DFA64DEC2DCC090BB3ABE13F6A8718F8DA2BE551407B59B8EF1806A65526B6B872CB8922BB929F09341554A71E69B41B60987FE3A5E7E3424D947455083A827FFE27FB5BC5365C80998DE01CCDB66213575FB61B3E6F877D0E2E4EFDE4467D9F07B6A28148FE2FD6EDC9202F55FC855D0DF8C49E244C40CC3D95FC06C6778D397461BD157F4A0FFD915799820D55F52C96AEC0CC5A3E7A2151A845EECEE78B82ED9A217E326CF6C49F7D31C4D8ACAFD827E6ABB760150203448C000819E7E0B6E424C43A5500164CF128D686B4810D9838480604A891792987FDC549D87F95BCA120AB84FCCD8C9F93F988C87E79599F3C1952BC0F7773BDFFC50B19BDF8E3D8F52D887E45B643297650044E80124BEA0ED60FEC4449BB3BBE394CDF7CC7AA39BC1A5023044F6A843186C01EE1BF5834EB5401AF7905FC04447AE00DAC50B051B432F831FE5AAA7506160CFD7D4639C489ECA447F4F993AF0503CE5EF68A837FCF85B85993ECC55A9A3673F8F2C5CB8D3DD4C60E8421E3417EA958EF87E0764B061A39C32ABD5E0E3A712B54B0A3E2D351A0E00F4E901521C63C1F4ED829F6E259A1F720FDE96EA9CBB8F7BD7485531A81A49CDEFCE725493A04B5EAAF7411DEACDE5A95AB6C2AA7BE3269F6AE4D166D8A5FD5264B135FF8361FF75B2FF22A61905A349C6B2C1DB2BD7B385B8FBDCB2768C7926F138D5F8107111563CE527322AC42E6BD42485668106B8CE91F157E0C94448869F7AABA255821DF981CD5298D40378FB0E33A3DF8A037BC21F0AE268E69F7CF61E7E117BB463EDE3C7D2EF95987C66AC3E5C7D79C44A7590BFCF998683701DAD7B98731DBCB455E61428", "64D4236F326627BC08E9B2B96C1A9E5BA2631DCCA3F7A5B63736E4EA8074056DCD6BF0E5D6DB8845D9271C0D706F972AF22E652E3B2A7CC482B125EF8BE005F25D5109F6F9DD84DF966E2E0B8950FE1C01E2DF15205EC48BECEFB32511DCC39678F9DB08ED0EFF64C7B5DAED1DFD202F63B6EDBCFB7E4FBB431718BBFA2B65594D78D3983B0457DDDB350AF2C1B9743AB9EFC260A78C3144622C50D528B7D47DDE46FB9DA33D1E7DE6D5829258C2F02D54085AD0121A1BC8339A2847F6F161CB6EEFC5E3FFB12E6C77E5FE10E0D4B02E58142DBE5BF900B7B64EA79D520A35506AF4987E67BCC80D00FF467A0889A14B85B4745888B09DF7B4D3316D9B4A9B17C4CEDFCB0A55E2AAC53B538705673B2A2EE4ABA914E20ECAED730E3D5E272A65A74C366177A711095624A679C9300FEC18E20E65DA3645F23AABEF7EB7C7FF49B289FD2F44661F6F5F689B6E06EFCC99F8A5EAF558E10F2236E002F7D97C316698D6833792C456F812A339166E9FB3B3F61734B98AD2DC9A484A14A6025114D072B68C47DDE97322E213F5D6A93762A45C4C73C7832BB31209C4B1F0094BD24BA23CA9378FB893AB078FA3BC4763704EB6A0C8EC965690CA5B858DAFE623AB88ED39154F46B9030462DEC9070DA9DC34063C1CAB3FB84D60337F1D6D95D1A173650C96128D3C036D0B72B4D2A298186CCA8E1F386E1F70C0716F0BE370A6B325CDFDEAD3CC67E021E9D4C839230708DCCB062096F32C4DBE3C4876A7D1A26072673A6CABDD8D65A5E91CC5E973F00FA67619F749930F9D40B767E434D0955D47FC17BB37E4B7CCE63B1D666AF5D67FCE5FE5469D3DF6B6855F9C308DDFDF6733FA7B8511B25193C27925F3619F5F836014A64A2C8B783A50C6B3001001D621CEC582FA4E52C2B916A418F49ECFDB5ABCA40E1A8D38FE400FC2D0C185009E85546A92E829DC1AD2A7AC3DD23EB77F3D80015BDA4135B1194B10ECFC87C1102B3D366C5460D20D83E778142F1A4EDFDECF3D0BC448CE24A49C609B035A99B64FABF071C58DF592BBC625359BC23A565F4BB077DCF879E14ACE87F709D276982A3D10B23A9538A6A3DEEBBF0B712DB4C16B0FF508F3E4AF4AA759738302D24C6D13037DC81B0394FE785FD14A322BC00ED95E0E9D527FE5316748DD893DB03D5C4149D471DE98C386A2E9DCFF05181E837A1814D54C9CA708CB5E7A10B0FF4F540338BE403E4B9713015A99260795DF5832CCE8D5F763C68BDA51133AF1D012C283E8F4B1DDBB4EE8C351C4AF86FB436571F53B2E80AC04BE26EA617EFA9C5578FBBD81DD1809EC5BCA5DF4A85B24970EBD88D9856B2136616F85A338771BEE80F20F6E5652FAD00F49F3C349061DE3052841992EAA04CE15DB6C48888BD3CC5EF4D6CEBF00431CCB7C5289D79E67FC6CF2DA88AB60CB65D0F687455A535C33547553966D197BAD9778542F6CC7182289AED366ED1CDB0C5EC1E9C0F0E21D4D2B8D01EF4BA394E0C6B05B8EF42D81F773D3D251D6264CA23DA5CA2D4884544FDB81A243974FEECB416D0748449BA0CDC69E56D666FCD24D9BD7C322CBC038CEC658B5253227D87C527473F34BBA3E2FC18784F864233FF8528A874A8503840AAD03B63F79FEAA6C07E4467C4A04366ACD35E32A142DD76A23417EDBB8004944A1E51880CAA97937493EA5BD5A41298863A71D33156CDB942C166748DF66B80ECAD27675A673C8692805B42E97F1B28DCC9BCB58FDF8BE55E2034E73E444A225DDDCA5B46BEBA51AE98A27990F622B32B2C337046E459B173D94BBE5FDAE31FFD4", "23300D5D80ECA6A471DE5CBA1D29B7010240D95FE341A62FF8175ECAA9566011AEDE6EDA0EF2CFFA7BFF9F4C9AB2C97F6554BB182B23F2772090FE7C4ACB8BE7427E7A8535DA3A670341D88CFE694D1CF40156E9B0557EA317A0B3E21F3A629D1CA971482B1A54697BBC2020BBACBBB9D1E67DC33F52C4B446A36D4331FB02F19BF1A647D05714450E591C65853176A04DD561E0933CF3F24A2E4707C44FE29C5D7706723FF53ADDDC67A67C23769CA32876F0CF31D233D352FF6A7277E5A3A7578A6F2A76456C0AA876680CDF2702B114E02D22D9F59077B9DB2ABFED673158EFAE4C23A75FC8BE701D973169AA7015297BDCAD4870D4F152DC556A06BBBBAEDFFCE40E6BA4F0FEB154F32D8E1492F74EE7085937600EE176ABFD6B8638E983EAD26C63805B98745BA290813CB65CCE33DF6B98240E571DEC4BFB2430C4B8FEC23C1BD5C3E87E0E746BA8A7722A6A660C5095FEA8E1C4978B966F487376DF42C9668E5D3102F123FDCE7B8D80E8BC84AF0D91E9355FF6F7482BA74E0BBA7DACE85BC053F31074151566334B4DDA37C6C51BB947811F284B671FE53FC464CC30DDE59A3D9CAD26822183E96D2F4BE60905B94BB8B167B734A0F0B26AD0E5083A34E68A620151966D073293E5D430D0726C0FE35BA3F1F44D851D374ABD80E826DD84A665165B3B82D540CDED9EF60CE48E87802F16F5DD89163AEC8E9C523E9F99AACCC6F00126C4C8663A7D64D919EC41ACA337379496D0CC876199A86404CE5844F8E2CACFB00A985B92B7A393CE464DB19E0B5FD65BA92D8EC1164CB1ECD994F82396F6A52BE2B66C8780A5AEFC0293EE437E7FBF9BF8880B61C8313C3865561A4287BFCABABB90B3A11F6AA57C2B2A6047F1316AFE1DFE540C4F1D5270F3EE3E023E202AA530211DC51F8C2E87636C14EC8300271A6454A924A8093716756F79780D94DC6863C24C80A405D6F52DEE81810EB850C1F60732AB24209773F66B2D2AEDEDAD6FFF60902910D4858B0F706414F5779590F2DA7C249E5DC1484EC40EDBB01920A5175CB9D74EFF957A61FE3E08DD7C5DED5B299C03299F25E39B161E1DC1C586E39D0BAF38C09C2EC0B22589AC489C3199EA4E66611C45A68A7254D292C78C3978C381F297D7DCD8C0F7646E7AB6DCF155B67F10C3F915F9B3AD96C21379993D8C5D6957847EA81B3BB4BB0863F0CED12F5CC48A4325CDA65268110C1C156F845951AF3C3C90280F8883CE0236FF02DB0CB07721261432C7E0D479F859D8EB7C433F67721B06E001498656578F0E3CEF2A6B941519885BBBB03F33DEEA07802226AEBA473CFEA6EB894F45D1BB937ADF5180F5FE22857CE0EB75D251B02D89E5502560A0B6B012C191DE9D62FD28CF503375F2A1FA9EFE0E42DA81A6EB3A6DBA299726EACC6F3BE91ED51A25EAD5F3E7067720F7D4BB72F8BE2DF978C46E1DFB4B0EA17BFCEFEBBFE40C66ED1F288BE08D6CD0B097C7ED1205E43F8FFB7086120FD153C47272188799D0F4554E9A4131C6B1460077A99E8198B3717AFE5E7C95D3F49B3779EFF9E935FA63A6F881F039436EBDCA2EBE6FE00109B658BA5555BAAA4A401D1FFCBCE0369798BB3BF8B54FCEAA5FE25F31AA02208B0F070270F9E043BAEEDAD4432B1C2DAC9F7B4CDCB52965EC43C2E99764AD2613BCBE468C9477E64B8BDCB64CFCE01C06EB66A15FB034D1AAA507AFB6842AF66AC8C18807E98884C6A780805720718A3A4D1A7B094846C55B0808736199CF4EC3F66B713259CC715B22B92AFB1599B7AD539B188E99B39F9A92987D0ED15C94", "91CEF241899B4DD47BF31F3BBEF20F5BF13D9A98D3F133AE61F3E4A87A299A6B115B96DA6B2811414D204A49EDA0E1A763E1EAFB78CE05C181DD0947CD50276A10D62543A0ECBA57DAB5DC794AD7006A520B419533CE8519F4EE4194B58B2E36F9E9705266B6E304D1DBC6B73491045548637449E5C657B263CBD9577AD8DB7D5A5BB5DF43A869FF91BB8706D4E81A4F8243C214D9884104675F2BCB426CD785A28F4856E363E1ECC974325487DC40E7304D3D7CADA5DCCA6E60F4457DA181A39801D35F20E1DFA05BC09E7699FA289A87EAB311BA8700AEC0F90950E5FF740DAE7EAE7FCAE8B0D9FB82ABD25BF46FAA635F570C22A76C52F9733D5BE64BA67AEB5D826288D03D8A23C5BD3FD6DBA68082B7815044E24859865ED557C7DE8F866823CD4716E573BFF30067F0931D0AFED0146D55B0B2A3D6C57481D94F61279DC4D2C6DCA1CEE27DF24426E55AB4FFB87068AC8AA6F286151356CEB29D993B4FB26192319C373A1F0F58FF5949783E71671FB58A683DC1CFE166FE1AEFEC8A41C5FC06A31F4EFFFA3EB7C388E1BF99667A5D2697F7132409641AA812EE84EA8735BB46E5069A7BF1B2618B56ACB97C368AA7BDE1BE0F0BF286B6D08B42702F1EDEF408BC529B4158824F673B30E3D3247FA59DCB83D004459CC5EF87BD6C7D188FD91A2A7FFDB008244F8618ED46A73323E9C7F9D5A83298F8C81702FB4523AFEA589D4CC269BD226D04689F132F766770FF23C832EB5695713AB99B74035540031AD1D9D9047D72B1910BC320A65A9F63A40C02FAFE217BA0C51FFE24E96DACE57C1318351038FBB81E76EA34853484E7ECEB672A4180A3D24B6C692747E9D306DD0AF275EC0581A30AC2E80EC73B04B1EF83160FD88DC43406CD715EAB1677F1422FCAB85D1D1EAC64F698B9ED69FC9F2B5519AF9153D5AB722339434C780886B81DC2878B27177B4616450BC1DE99C49C965DC9257BC78ACA052E998493A0CBF7B6AC86EDBC2627E43E7521A9DE7824DFA7DE19AEEA5892685D50EB10128B3D14F3C670F639AF6F2B2F6168A1E551A65781A418ED697E6AB3CF91EA2470995A401B08380CA58B9439DDA7BDB7A92E91016567D57D57D5D0DC4D8E3C1490CA1BEC03FDE065C7B7F34DBC40BF704149A0573C55A0EE4C415533829EEE71BD8C392FD622572DE009044E937AEEDF672886CF4A36ECFE7B0F8BA9CD9EBDEAEC40BD74AD34CCD2C7DD07F7AA64EBF4DA9C8810C05F55619B808127CCA00D171BFEA3E1EC0895A22218DF1A0514FE5D16DC416D9FFEEA8EA3BC9FC650F678EB731E70A6110E138E059371D5A10BEF6420A0C8BD45F836B7D310E732BDD0FE57D93A6934317FD8E2449BA0F0C6E1B36821B62D1F80B9CB6A5B407B6755977C06BB2C3CEED0B14D4D73A3554FAA54EF2C350C388B230B30148605035E4F481A769564E2814A160A67E6F0DFFA7814D0C12772C0496737C52016A93C6753C82FA896BDFF3BCC72105D6EA5B52B3810004DDEDC266F1C90CACF49BA7DB5016A4E485F06355441CA204F7D589F2A3159541F991682E6AEAC0C7359B3282A04B2DC69BB0AD6CF49C48343C8A769D3EFBE8D0814E72934F7CDE698061EC68FAAB39016B96BDC5363D2B53363A548E6476647C10F55611469828564C189430D351CA01D2F1029CA3CE1D2853E8E595D46C9C3EE9F7D3EB9C72A25F7B2138063A0F9186FF41CA9C579DA61772FD60408668A877CCF6B65FC2B88935822A6DDABB97D19F7455A9725A8DF2B8E6B28D83ACDACC66F02370575831490B8D8838D4E56AF36ADF8", "AA82DC5072A45A21B7880DEA3E2691FCC22EFF3AC815A2576A7F480ADA6F8426EADB4A96A17EB949BC049A646D46926F0D69E0B3E1911D2CE652FF4D9CBFCFDC30065FF4F779DF896D38587B297BE8E224EFB1DFD04BC2D22832B2955A250B7D0448AD9C0A76DE7C33A4E2B5DA1B3A868852B7F04D848EA6495BE8D2501BB47F24E8DC4B254DC56BB5A4760DF62BDB229F3DF0E0C06274A63A28D11F928AE2DEA72A9974E3C55CE261943F78B771CAE7B5B98642A01DBC06111B137774898F0F113A4DB23BC240BFF147568493FCF0C3D767D3548A1C0EF7AA4B6B2DF566C3E94BF9A183264F63E4FBA58B517FC46C4F0017F8D763A54D044C644D6326677A425F0F5A2A7C8796B9C9F8CD0FC49A1F035BB6662C0CCC0E9508AF8D2B834B929D80096F9BFC922BBF1BFC6F101317EC08ECC1DB52404B30B153F43C266D3E64FC496CFBBD350668B2AB3B596B5E0F0A00757E0D4A771F5A386AE86F5105C1718F7E93CF00F588C722509A03597B95512CFC705F08D3B4D5A3E23C56EB461A719A955AFD3EDC8329BC97E3EC6BAB24D97E16A724ED2D4C02B2371FA3ACAF49175A441C3FDE53C2DDA440C18BDB8A6F27805F944EAA7991D404CA74544E2F3A669DCC4052B6770AAD9EE29A6EF7791C6DF93054D07A2B3CB2327B0EBE7D983624639961AC4C3CEC2A84DBB3A10A830DCAABA9600DED87FD5CBAF4D5F1DB357ED42374175257474BAC200AC1B6A5B87D2FB2092458F51185C380B8BFF682C5BA1D2CBF8BC02E5D485FD811797AED167DE6ACA66B927363D12EA405D75A2E9182B1FD30ABA700C5683611A24EC5DC453F523EAEA44C6E06261A98346328ED9E86CA8F7EA79EEC551F36836272127A45984EE165BEF8AED80D26DC45E34E1794F56C1265DD92B4078FD2AF2F13981C08FE27C55C3C9238BBDE193A956E3F834445D949CAD84D3FF0FCD511C6C598735D5B3B07BDD7D437ADED3ABD6EC3171F3735883C9F511A06F4C6C7D0B137DD0D57869B8FB1375FBFCF9C3D08CDCB12B8D01614AA3C965550E5862AF49B04410D25BA4BE86FA6B0B9D9142461AD3CB4BD6D902EFA49632A78F1463619E1309CC89452C2B453BF9F08A714D67ED90972C62C0468CE17006F9B60138D28DA6362670BA3048CD8D099AF193619AA8384A1758FDF4A04CE56ABE464A66E913DB7BBBFF7EB2ADBD47E6347D7054CCA13000DE13F550C6263AA4135A2E16F1A2A58BEF962113C209CF58CE514FB51EC162D05A4DF832697E544037CA18E62A267D81D539F879F50C654E74BA21B47FFA5C704FAD2147EB3DD8617DE98B3ED4859B605310A777F3DD161F4038486F0872AF55FA3610EE0D68C1D51E0F91EF7D9AF4ED01BFF53FDA16BA3197A518BAC0F82F8895A2BDD9FF4C3035379E870C49DA1AF18B3668792B6640E687BB71F13DF1650C4E1A2CC487C247D1D1356EE16DB8F97363465614E9E63F36C853FB63C12963A8A5D98B52BE8DB31F0954B35C3C749A62C2B34A690803FA66087015506225181C5D6FC101D1494C3A7961ACFB4D9B905323DAADABA1DCD2DDC1F9CBFED7D726E602578CFDC1519925F8DBF9AC5FB4E4CA723BB264B5D106B6206574C46C1A49309C22E1935904942C36148F764B59F10A5CBA0C9397F5798E200A606EFC75DEEA1FFB10A85398E5BFBBC6AA3619A0F611E591245D03B6ADC0C50440A1B1C236ADBA933B2BF84D2C60C807E9F52436904BC62B813FFF8B9C824819C760D0BD636B10572C781B112CC0C603A260AB87986B0280FB913A9E0BCCDEE347F0C744BF8299A9099B8", "F2A17D19ECA96F67ADACC0D83FDCF235F07832E8E78A44A53F9C4CD09C3F88DB226701963147EE0E1AD0F549E11BBA70053A105BD62C40DA810BA37BA72D999CC4FF9BA4D01FCFC670E0D7819871D06C4935C10B85594CB7202F037B25F85141A580AE1CB3E0CA91AD73C6947D2492B8FD2F889B1421E04FF0FB7866218A491D9EF6A35DCACC12CE098EC575C697F5F8D1BF9178B3B36C999EADFFB5CB3A41DB672165CF73A7874FF68B3B901C4E9B8112EF4FF9B9308742ED678DF30E2F7C40BF922099C1A95BE0C231E9F8332EBEEFD99C6DDEF25CA5EBB2985A9689912616815AEA022BFBB87353B8B799D64280A6922CB09044ECAFA51037AC2FCB11516E9E286F64B4CE3E30A55191F24AB53F2E10E5A8920FFBAED77FD4C476E9AEC751763D68409ED9BF7F435E53D401CAD787A50033BB8547C910D90DE100FDF6B904A1F529830E3A51919299FD4476F02C3600AD5D42E3E154AEDCD1C99C1C5B531FE179860EC1EAC69EA0381CD4DCDE8716F94D6510F10FD1915864BA968440CCA6D0D5AD8983C421079B033B56FC34481B9F27188F829F91DD73F27BE8E0456B0F75DBEF40A3C67F274F6A50CDBFFF9798F8DBF1A6CE7158B577550E40639D38861A3CC4E060C9E5BC1F0D3760FA9A89C2CF0A23505F4A642F5EB0A055B96843198CE20133DFE022AFEE043191007276427DC82E877BDE27E20D65DFF8232E9E4DD786C23D4E8B5E84637A22AE5562651BA45369947C159B641710C98494ACAD48B4AD6AD9828897437AFACEE442DF2330669D5F2C6A9893E08507ADBF104C62F6B4D568C5381B28D5162EF0FBECF396E7C622B54A7864F9B31CCB396A0DF82AB86D950B4657237FB769122BE6B783ECE3F798AF68E354C521C77735EDB97D580CC80877ED702231CE2F8B73262AE39EF94E84736949292E065515D40A16BAB13EB9437D30AEC44AD8C67E3AFCE9AB377753BDC481E8E79EB10F89A7C4F7AA24E6FA48A36DD1CFC02CF3FF6DFD0CC1C4030C312532A70B60F678FF2B3586D77DDE74167CFFA62C12F7D0086A6FA59B36C6A025DEA1EA0BFA9861BEFEBEC6B2601DF225E29F36AC97EBDDB21D7E8206E1EC42F3B9CB314E7AE6464D54ABD53D090DE83B466FAF5384E0FAAA6E67F2FBD6A72E00D9274C9B5C768DB4AA4281F25EB2DC6BBE0EA85CE1CD31B32BD1971D6AA20B6C68D66426F09C0C1128A679AF06CAD490DCE3A2DB50181278BC40DF9E094D1D09B281CD1EF1C369E5927407E04918BD21315E12583D7D845933AEF186DAF8B6609C3CA9452857DD2112E86227422491DC7821D7E41DF759BABE6ADD11A4C771CF16469F86262D169F221D97DAC9686B6DA29568B4A2D2579C76CBF948C321F5158EB3FF5F6D4D6D68FA255C81F62A8DD605507D0C6C9D82E6AD258B32DE4AB6FF8FCC4A8C237E270B9673C208E56AA6F4796867762399FC8549DBD232B2CD0F9957A8A24FCEC6E8B3DCCBC67085C542A134F3E80A3CCE8D3DBEF0528432F2BAB2F5DC89D6015BE7F24B2B1F378EE75222EF125A5645AE37AFE6ABDF84CCC3026507BAD9CD8C2EB4020E7763E0F85164734C851532FFE705C111CCB7D738BA8C0D29C5A0A50250D0BE53353A6C407D4F7EDD62F271F099528CCB520E5B6B5695D3FBE628FF65D67CC0D1B766149B9C89D3C770AA133FAE2BF3C9846B30C46584E9F93A8216627CFAD84C37AAD7986B8D69F83392FF8F98C828F8B136633A09718D375327B98A0CF8B7736D229499A52D91D19CBB896A5BF4131691682741797A25FFFE6AC60E30C79385DC778C90", "3D84AE0F7756BCB2518300DB110A07EC46869AC35F1B02650A36C3CA0350356E2808B84A0D9A8A648F920B7D48AFBBF6CA9A37F673DE2B6FB15B189FBBF2444BDE8808118595AA995AE0DF53F5146B011A0AF5B7FCB4B3D3EC074F2DF15CC9708EC50EBEEAFE06F7A0235A50E2DF7F6C023B53819AEA87318C4E67C4742FDEACF57DC539FBD5BA01F64CB45322212C707923303D96E58EB95F7392292885391283DD9477218697698AD6D83AA96B06D68F58FC2B8FD9D61E75337C6815BBFA8B76833FE1856B714ACCB6FB1B5E957DD385658AC760AC5811E3BC079DDF2CE30BDC21AB8D2C7B56D2F6B384FECDE4EB0206A6C00282950C1B72B3E464570364A919812E86BBFD0E1CB2DC98D6FF42617355F2131F72A11F50618CF21A4C4961083FC6BFAB63F544677428BB9F10FE341B947C41AAC1B367E338CC2AA08D6CAD1067F02654794571FA4AA11E211F5E75D194197BE4AF6543009C40EA86F74AEADAAB134CA9E35D79F7CD062B53BE2AD86FA7C2E30D9222A494A25044153420AEB6C8FFC4E0D4C514B8D9F5DD922D8EA387003409539D0B40210B05C9209B008D3E47E8F84C376F46001FFE463F21A92E34D3345751E8E94205EA06FAC16292B8C6D4FA028867AD4C4E8DE0D51BB7AED59547707CFBC2CF3A9235C29EE3A3873B96FB75DD50E758CB2C7196BDC09336A97756DAB994C46D5BBB87F9D80008D09C603A68022BADB1D2F6B98B6B76CB3C0EDAEA07A23065B93DAD67BC59C9BDEF7BDCDEF39D9AC04C9CE8F6DB4A925F77BBF8150AD478E3C6D7D32512ED75BFBCB82C66D505CD8BC5A5679014B355BDC66F365BE9AAF15B76C0CFC0B51E53F86BB4763F0302B448E84B9792F34442743E2D979C5133514D4BB1DE5E8AF938C4CF158336D04B6723F9422161805D5EB059E55C86D0C461399073A705FD6E919D1760B2D6860D65665B486DC0AAD8F7B3ADA9BD681D7FAE4185350BAA543E9F8671F1B4BAEB6D18674516033B2E2E4E427521C290A6E44E1EAF9974BBB360FEA3535CF46D68193C0E208AE5B2F85C2049C906725C92F598E6C0B67DC5F8B7C48CD411E107F4860CFB3C4229A44694ADE0E31A4FD70AE5702C0A7710678763B035C5C6B4B9214D507313F5ED85C444B98278B40446C861057AB9B897638DE4739088FC28A577CBD52A3910885276A2DC8DA99EC74D30DF707BFC60663C869DA4C47BBF4D64A789425C5C894EC2B512C3296D0070DE4942113FFC0B13D03515F2B4EC07A0E3BB7AAF08DE24779F9EEBE26CE7C316EAF47396E538672BB646E1B2016356A407B8828DC25D8F8A8296B4F855290131734C94CB92CBA5689574CE95B60988C42558DAD978F36D67BDDDAA92FEF21282683EBF6D59763384781EB4D3431DF5BB909ADACB397D36D55D2ADEE537D7B1B942F3A815917A388B12285689B40C3B45C04A591672A2B957F924F1CF6049B96A38E304B8641DF6A079614C9F9984FD9C9F0A82ED6E440164AC484252B45147929A58B069E663663CEDF0FA44FD67580BFD23BF77C61B95B533107A25684FDBAA4C1285AB568C9FAB387C6FDDFD5EBDF5AF1CE094C59630E19F621CDED14E3847BDE9B0EEC64C159F23C779C4B80163554900393CD7F1B885F92F183839CDAD7801DC7FCFD08B7E08D23BE21BC80F8655A2F3BD0C483B2C1D23D447682CCD9CE098AECFD7BA7C48F5BDEAC8397220A7852077A8D7933FD353C25E37DAA473E996A5920DEDB80C26DE4FC3AFBD6ACEA16DD3208C9384021D9B1FC1C884319B59276D48D8BF5A0A37D84B8C579EE0D9BC", "446D385D09A3464D1ABDC6D6CCB015280BBE7DCF00078634371D7F327322DD720E8DBD7B8CD97FB9505A118B469762ACA10C4E135ED782FC905EF30F9FBA82F11AE679431F270351F70F0508BA998AD9A71D2BE05F55348B275A0E537C63699C96DD8AB8E0645CA2606E35805F66CE586C81B4A65E2EF036697A18DA49C36CB22404497577107924DC02FD87072490D7EC8D5B376D0C3370F9753E0E7C781952C03D844490370D6853FCA49E12139805C24FE9C9914E3CF91464D332C934570DCD5D1C3C609C6984E28C9BFCBA3669B75452478DA4099CFE0F6311FF782D1D0123A120F657CB536A3810984871B69D25913C305117A7E51D199A56387C2777E349748B9C2C40DECC03DE7235F7237CF43FD421039743CA72361DFEF2491953A3C3F0091FE3EE064B838BD73E9E6EDF8FD90235CDB374892BFC42759792E5636D031795C0DCC70D7DB86C161FE7059CE17B6926FE5D024D6B1B9DD5608839DF85C7802F5655525B633BDAD0803CE14649095C0A7F870F66888C072C410E0E0854238BA7FB259901CAFE3570D398B621518193BBDD75258BCB53AF2789EC66DBE2311DACDC1F9CDB6DBD4BCDCD15F9C2E77E0D2736CD191D2B83389A71B1804A0FB5F2480E38343CA48EC6D1830BA3466E53FC51C4EF05F4D10711A78AB215650462E9A26D9301EFDF15A3CD5EEE14DDAFEFA45171BA3A757CD6FAA5887A5D5A98045BEC7FEB331D01A997282910B6B946CADF0AEA57973520EF0561B233BCF798805B3B048751EA086FA71BCAAE15F8BEB837CD2974EB3E54D3B6D3F99A51F88313FB64218610CD1831E2E6E18EADCFCBE72BE5818B4AE4F3780BAA7D8C4A55DAFC10ACA3EE7AB7D1337506C485C83EB0C41748C668705B4D41D926221D33C31BE7D56B42BAC7E9240FE4C2287B5B41FE88F9B9E19970D0E4569DBFF167EC42BAA2566676EB055B69D159358D23DABFFC86A917490B4942A220038CDADBE24C335DEB895F3472F0D22778BC79B169D1EDA9FD18B31DA66F0246359DB3EBA36269EC5F92E5A1A89560C7DEEFA121A7035EC2501C553854724C5176AE60F87004F6FAEA907B91D1C58837C9FE25BD9C32F66257BD78169B1A4B8ADEBA72B5699D4C2D14F67BB347EC8A96B04278AD9F97A9B40DBB56E7593CF4B3C905108F10968F0AE6A2E7F1D214FC7B45637A256ADA5EEB70E03C02DA2ABF86C36E581A31032DFFEF4343C3E59EC7A2A715E9C199DAFD3BF8C9B43C1D016DCD33E2590A20EC8B657C08E5C0C0BB4F159A07206504780715A252D1F4F5DC65ACCC43E3CDC255123A77792685C9B68AF281863AC89ADBD5F778733E95050ACF781FFA386B3EBCD633D6E8E6D4A42EA85F005AA80A4597D40738A8E8823FE3C84B10CEF044E9651E45D1ECDF59C537AACA58D2BE42655259DFE6CFFFBDAED252254B732EDC93B4D610C50DC81B576C5A5C5BBCAC0BAFD7BDD7771EF1A19C29D7A82E448AFA07E7FAA8651C11D1BD550DDC69F4C9C6A44435034D80B47B512155E5141378A94CD277D4BE11B2A383B1539AC9731079624E81D3A3404F5325F5D2EFBC0929F510529C84B1BC3E7C08F661640E55AC49452C00256BEB49B7A52DA23EFFD85B8C303C6EEDD2202768ECABBFBEE87FBF1DAA992C8439602B1645C462D3297DDA1AD941617B508E481A28D1540212CB281B5388A3691A26AD7D3CEF52FEEE9F59F477EC98AFCFE38034B762B9D4B5DF3BB312758C4238EFFF94BD16D9C39655CF07263CD6DBA96D1C0EA425610C1FC81061FAAC5C0F8E6AA9591EDE2FAA1AAB8F76EE18", "C514F282EE4B5E02A90A2AE126DA52A9FF5274735ECAFA74CB36D607EF299E0227E94B6CC2B78B1F71D6B5FB8BB4C78C09B3A6E3ED6CD590AD526F74CBF869085F2BD3A9DF66D7DA9DD06FC6748D8FBB78D98A4D860B362BEC6295F34A6A16A58BB21C9632F8B3A64370B7A7547E329B39BCC82D17B82F6E4ADB514444F62AA800C97B748D73B0168ACF2FA898C262820F8981713D00CEB8453E3E9E452F5EF41452A9C8CD1F1260000C4CA9AF4E6E629B13DFF203187C0DEDA08315AF24181015D2E68D6AA4E7E938FC4FA9A8B80CBF49E3A9F27953A05FC7609146EE39F09FF485015168636D1F452FF311D4D8749C31AC8420865A87A707E540D7FDF0D25F63C7F3AC906E048281BFEA46263B4350BAFA8B5A27E0CFB23DE145622BC2FE34DCF4E1B4DCBF60ECD5426C27B3559B73A59CB1B71587C685542F5E6DF9FE3C5E75A8E9600E89217343D29C67A7AE80F9A8589D82AAE7B2A1B8D6546D3CE2482DDABCE7FFD3BEB2F1009297A77503E7155ABD4692F1244A49AB32628947A681388AD75A750AB92C81ADFBCED0AF166326FADAE6B79070473D67A8FCEBA7F21BBA932168CEC2A754247CA324081900636D87D001A605C4E5C31AEAA44A8DB9693617566726C7120AD15D96D917F5ADD0D86A5A9CDD7527644EED58A9BED014D9F4C0F62FCAD8D7D5DA2899D57C5510EF15B7482CB3E087493959AA12D73D55E194E48CD128FBA2788829AB4A86C325D60227074EA55BEB601128D5FF42371E74972B802D3117E1F2AF2018177D4E994903996DC365D3B52582AF2085EE5919DA7E84A2F3A200F4F6E76F11CC95F87BD2EE5935CDA0D52D9EE6FBA6D59E80427EEF4B80372091C65E059B566C38A6B3664974396BD0383A35EED0494C2BDDC167725C4160AFA58D408978D5A345EB03A55127C6BFB08FC0B4EF7037482EA724D9D121E26F2249C0C7A927946A846A67FB7C565E86C8C59A49265ECC4927A8FC88873DDEAEF6F8B629BAA1819807F38AFAC501EC9F206346581174A037B1D7EA56628C660E17BA0A97F2E189299A7844FEDC562BE678B0606CE18493F717559365F66201AA598C68F99A8F28AFD74AAB0E3619BC342AE9F36D3811EEB52C8DF6544C96B679CF434B9C64FCA0F43DA73B9BC8FEBD609678F5E691AA706E3586176ACDC25652BCB68D98417D3FEE12B23724EBDF496D6AC3B35EF706EAC11BB0090066F3C421C3E298B00821C90DDADE472331B9B2CA1F1E53E6D68BFB059EE0811EB7E7FDBEF394E3E35E59BCC4B63FA8E09851843F28CD941F9A97E5B72C8DCB9D32F37B79DFDD1B9D7C22C10E6F65DF07DBC7734430B811BCDD450A10F491B1E0DA3746868622E457774D0BCB1B29F9C1CB161DEFAE78354B7F718D18F07ED6672665D35562D6F05A2B3666B667A7C57D2617711F27DEC15D0A4079519D0ACC6B3591EBF0A61A12C42A6820CBA755C07FC531610C4192A0BE9BF241BBC5ADF758FAA4DE47C6B766AFAD728BB1D2C672EE0969303E42AF789FB295E766E90319D98F0618C1B4B8BD31CD2C5EBABEADA30C6E43D03F380F4C2B9C3AEA20BC89B852BFCD042AD3C9440AB395E9E251DA758D317E39792973083B20B79BA36A14057E1DFFADCF903B10F8D3D4D35222E4584D520D6FF675D3EBE9FB43ED1B79252648A5E0C2552E388AA3D1168790A09854F1151A94DB4E5AAF1C941FA61B196D869B16051B75F56AC1BC769C6E7A7EC173264A2E56BDE4BB9952A422855D65AF1C209D561F8210FFD7C2FD6A540BE788BE3D2822D49DBD2C6B33299604A835F07A34", "0C0184CC1854C2013817663EBD9E23F3B78DB8009E761F1B38C2DA2036F26819D2DC68AC38C18FC15EB00BDBF5A11316C7B6075BF9DEAE9B0A651527DB3E3B3039BA01398B3923A2C40DC4706A0BC186D2F8FFB124EDE35E8C427FB6FF05A3C2ECB81E275D1AE370AFDFB6F731E27F4B22B877B1990FE479239526C655796BBB8545051527ED0E532E0440048912C64D0913227C2F6657B8B80FDA076E49B7E3DBA1D0E23C9D7F43280A324DF16BEE2A87B87C21692FEACBC3348C9186DC6C0BCB7C1DBEC60AFCF4F1D76FD3D45A24ACFAEB8E7C95145D07427CD67003019AB57DC233D566BB9A20AB82ED4130D9B4C0FAA6F2EFEDC8977498315FED436F67F3B170877040265EBA49415B1B2904C8277A11598432B973AA63F628456AF2320D3478FE669E2835C00D13EEC7B6ABC6BB94F1677C9A05B2D0CB87ED3E529AE1D2E3354B1E30C6634E10AB3BB0F39815049DD5321B11B80CF1D1F1426A413D0D11FAE969F3BA266F4F7B60684224A6279380D08D46FFBA2E1D684416405A02A2AB2E260ADB23498AF716EE58B03C8CC442DE0EA201C4DE39FA7038EA4E0E1544BB08F149F57F03FA910E09C27303038EDCA21A618A54DA87CA747763EE6D4D1DD4912AB7E3BBFC999939F82563B944CFC5F4460D41A47573DA92CBB28439BCDDBEBFF16491C404B356E5889D33A034680F8648F2CBB1888FEAFC410FD5A3C8ED85B90EC875D7D4466904F5D4A4048D8DAD848313232B80FEBAA09D4D86F70045C0C2499A93610DD088A6263DE5AD71067B9B3C82E20658AE98677889BDFEC65C2574E4AB7C9059F1C13CBEC17EC630F9E5B891DCDE1E81552738D4C8612F3BEBD570EB39B24EC94A153465D1326765D9B8F23D7E4AE3F2782F6F9738C189D0D20C4DFCCCD37D9A510250F0941423CB9055C7BFED84520AB119FF921CF81CBC6967E9CE1D759E5F4481ACCC5881F9328093B63ACB7D04404D8C0FAE8747D39A270399000CB690CDE17A46E81DC5CCED183BB863FD7A535CCBC592C25B059496C45DAD179B83EE02543B5EF93213E10E2BDD480F7C7D007CA2988942F65E46B886EBCEF05498C655048C4B32A081A059A28DCF4D84AAA586F0291F322B25D186FCB5ED2DE7AF7EBE58CD8314CF846AA39C67E2F284162524A14BD2765642B31F31EF4704548C13D5F5A132E983203EEB91795BCA934BA7EB26DAA5450745333446D2B86ADE99788476A3417DB7FE9E53F4906CAECBBA984657969B4592F9213612AE6812C215D5C6E28BC89BB76B9CCC937BA4D4C6368CD4C491BDF41B242BD8FCF9DE2D35907F08AB80BE71EF90F84BFDBC6777A020DC97BCA1E963050FF991A4F0E1E468813AE1CCF05B819012377334AD6B5A41A87A7D7C4F0AAD241FF7D3AFFFF40D7E6D5E62F9884B63E23C3A8B96260A6E9E3BCEC001D487E3E75DF4D35959633BE719FE592C4659970C0B67596E9CDA4EE3B05237C02CF2E36FFDB7CAE37F0BE993FAC46DA6F56B15FA74EB4511AEC2C861C2A9253259268A9BB95468FB02867394AA8D83EEB6464A65CD15DAB6A696FABAC4661F439F377560F3D2F3B668A7648BA4017DB5083BDD0D76B0DE99FBC06D7938D7D2F0566D3DDD036CF6A5E336359F0896B9B1E3B685D963A0EA70CAC175574C5AD41E20EA1332CF103BDE6B1C3B3F117C21E8FE7450866C5036C244856B5FAC176671270EF7225BE7CC36D24498C92E5306C2870FA7839DB1D7646A62AE0623EEF3199E8DBE32020B71F23FEF2F2BF3C9E0EBF0FDC629D97837B97D76C99398EAB044AFEEBD5BFBC35FD4", "8767E0FD01FC0DFEFA6640DA0B47AB5B2B2CFD25C8943FDAE6AF46C3898AA1FD2E2DD0FE19D1A9BD0353A16ED03C448B7005D56D108FF2035E948E3C4FB8F0F928A5797D491389AC431F271DD1C8FDDA2B1FE623D410190FA81F74E042C0BE9F97F99120DDF442D5A4ECD1EC9789DBDFA8C8E577E0AC5A1BA7DD6D5A474CAC3C2C04E71A14DD2244A30D64B17E4C9B081EA8AF0175D7D0A6E039B6A289EFEEAA20763B1F106667745EE2795CC588721BFBCA6D659D81192A02FF2CE11CC878CDCE73CAC9B92A972CC9340ABA7A03C3384ECD28301103F347D35FCC9B12B85FFF170894F7D104F34D95B56A23C486CD9E7520EF8CC0BD928EACCFDC5D230D77EB9B19EE274113E1F8BFA79FCA93EF54B86900859BA6688FD29444E03E2F14033F076FF2F23711129099051C59E0126A907B57905A021F024D98736C3F5D1AA11C25F32319546F91DCFD4940FDC7C4428CE78A998694E6B19AA3CFF470AE4582666D350ACB02CFECD0E9EC39D1607912B892479EF94CC67797F443EE6BA4008F46C0E61C3819C5F82DE7A7802E62E7050C8AC506186878F08ADCA8A7674DC3D0D156060AB7BB08511D2F8DB46EAB9B46AF359135030A9EB46A6137A9419D97C7069147BF5065712B1F03BB8B328CBD1E583F59B662B64C0F06ECEC8B71AA2213EC29F8968E0F3093AD04E739F01DF51C644FD4CB65AEFC7073018DDAA81185627B613242260CA7A9270FDBAC3EBEF62865D0341B5392DD5FEA4827D60D5AD1C9AF0739CF5BFE0F658E72C436BFABEFCC403B87AD4B64F3143DBAE1D2CC25130E65D72ADECA1A8FDE09EDFD723072D538792F50A067BA78D7E4749F0344AB1AC1CC0E8EFA1A42515877C4539EDE35556D444516474628BE9D8B29DE428BEFA12EF99C985F1EED4F937BA4794776C63033C03EE356991607473835A50718E473D036F3C522A9DE2E49FEC2E686F17A5023FB7E82E94B26A4AC6236E0B656A938BD7A8575D734F53CA419836110DF78197D7DE4D45B6589CC31F5057759B8402F43ED9A423A7D69DB02EB9357B1E51207161E08FFEC8FE286722159C570ED4AF63EB554BBA582404C0E978CEAEC1CC1404CD15BA22EE6D8C98C4278C1714695927C2389D74BBAC72C2516AF1E5D0C52066A656170091B68A7E4C8399ADE63605E9DA1727C189C541A404B7335DA27843A32E470FB4DED8EB5EFCFD30BF15AAF37D7CFF4B545DD09DE3E7C8D0E77427B3C0764608912616E5DA2A3B885688F25E83DC8D632BC00015C2C8E6923A3D9E7C7344CDE87D6F0DEECA2006F644F7BDFA0A524759B2B16313501A1CB8D4D762D3E9D9C8D32154F69F0DBABEBD26AEDA947485FE0B40D1D7731D7F4E41D1EA5FC645DE31CD850273B6EF9C374CC8E8149960B349BA16FBDFAADFF12E86EF05AA38B6B17EEF7B55D27D7CE27FEC916DF99F0715F1DDFB93C7E1130EDFA44663CF19F4008D5CACA48262C1E8209D0C353ACD72A542B93EF18EC7E15FD4C9B1633161D94B285FE8CFAC30FBB1E140E9561A35715AF982370AB4DDF25BC30850E5F0509297289C0045BD3B3912843A9B0BB88CB7E961639849B8A0A75E3E903182F0CC6C7ECAD4A38081BEB18DA72EF9F9439DA7DB2B4D59AF6CB71808E604E56E1D4BFEF627226FC28875888BD486D0C8052068D12BBEC6B27E9DCDD73DBC93D33EE66AB63936C2273525A517280FB4BC33A724D20BB7D988B938018EAC4738D03D583A71C16671B87CD60BD6FDD101BF2AD07492A794FB8696E84CF24B9707D7706F0AEED606C3A7FB5B1DF7FCF86E65F6DEAA4", "CB8EFFE09FE09C622B34574E74D4B061C284F96FB7937481FA7C204F449BE9B2DB0957E428D177C5525C67BD75D75989EE98D97C4D0DEB5E72E2B0DD62E66EDBEF0D22D2EA97D42A3374B9B659804F1EEB01D7743DD9AEADDEF356C7C4FE94077411DE58DFA5035271015AF65FD1D78C0F17632C10EA02C537706A7C14E3A1D7124FCC11F579333A68A1AF70BD3E86F7B1D13A3B4EBCDE343F36A2B226DC53A0E1A084EE966272EE852A349D7A5606F1AFDBD81B8C3CB556DAE83D6A34ED4F9C06BBFFCD5953C51814FE0F4CF5A697EEF5559886D92F811004C04FB399E06DFA845DEF183160BEF8546F6E8995E403FE0E464008646330CEC4B4149DC464F229A47E0CD9F89C83A28FBD0C1E758D380C2A7C17A487191A46C04C23F7906418B69E2527F3293588952919D220EDC36BD9687C7347AEEEFC8CD24E91299900AE4ACF018FA2829E215CB13CDDECC918DC85BBFA317FEF7D2FFA9E3A30D9D1F1B9DFA0AD0D641E800850B43D7E0B187F2ACFA74FC5DBC99471A7511B838BEBD6E2744C3AA9AA9D46060C83FFF803C148C35209F840AC23D60FD046B461CC2D776AF51612DD166E1450B8A998052EBB25D1C8F426391A8571C88C2012A8940CB0B4DB3223CCB39021D20142FB5039A6ACB250994AD7A99B1A43494EFFBD8D3692F213B46C6CE9AF3477BD6061398CB19C099F27F48F4F785E9E741988412F070F39727FB8B74071E007210D939B0EC5D6148A5931D38A030374E5C0B575AE27D49DF49A77245BE310E49262C56A616C757A80C5989F27962303825EAA3AA014A4C9C9E5B3CF93F1A031F82D6A0C877277EC41356D1BE2154F03D807940A1CB2848A6A23B905BDE9A907F7C20E333586389014126765CBA8D5C8951CE09DF085B5F18A24E1E5D638651687CD2A2F75CBAF738F65A8B24E7C67E64FFD9CB8A34A473F11996E3663607A49EF663C4D87A0F65D92067132B5EF3CFCFA9B49FF66CB6E363BC1C7EAAC392605200A5EE704D1E754CBD1C9CDAB75355BCA41DC129722F855215220092CF6248609DE9EDC5603562F5C82B5414BA305CEFA60020E1CD93FC756241FE7A20CB4B550D980A7266E7B23B6FFCFFC4461F925A14EF6584B02005E1D795ECFEF93312B3369C52A8A2ABF99AB5255E8E09C05AC722F37A5E95AE46B226C7319411750562DBD0296F0CD1326055577BEAAF270E75F4433D5312038854C30AB23BD51F1246EC46599FEC1B628137A73A702606112CF61CEA7C3977BCA6701C8E5F63132C15EFF01CA1EDFA5CCA8FC0E3FAD392F21972F857B53F62CAF3BDB75D556E6857067015E11C5E217F5D1C1AB1D603571F9EDDE04499E23D39DCAAEF16263A5EBAB9BEAD8F61B0ED942EF261E0ACD309A903E73AC4E4569A65FE6490F6DD6842812DF61CD858D9AB54D3456C89CFEDF2621426E3F9D13FB94177104F6EB4E30B018C01F78CB4FA9C89F453B87FA7D4716B96B0BD2DC532D4AA7D8FB9D264B095BCE39BA017E8BB90D600DD2C58647B9D95F63783B4B90BDB83A175E5201784AE000A493A387E16F5F0C5CAEBF62A360A6A927B3FE4CBFD310A3163BFFF1836FBF9770583FA4F88E5A6E7BE5796145890A41FAE8BD1839110EC05C325012E19C69C3868C7507D04458C074DB3440A0E018A23CDD32ED35E7A28DC8AA8BD63C8CD0A9F4876B56C04D5D3D5CE52A0601ABE2AD3CF3106CFEA6D761335F420EE3D277DA358DF4F6813D543424653B256E325346F677EB7F69B2FAF9536DE80E8EB018D978484509804D600783708D48C4F7100E0AF891BDFC75352C", "93EBCDC22C36C3BDC8B579B31AD5F5C9B2B08218BCCD1B29829A365DF4A8D5259753381B6786877A5250DCE6A2B182734E363B39560D3DF44E88CD6394324765087DD1A77B3D8121CBA61F665F9B719E75B740BD930D6FEF316325B8B3A2FDD93AC488714AD9AB525248EF60B2649B70DDE6849BED793264062B38EE74270CC190C6A86AC4E106781BB3D09F0A6D7AA4DDBB0116D3452CE041BFF4247819FD8D78304088355D8DE741B1A6461C74A4832ACF4D4004BFB22F6C9BB397D7CADC6FC05AB74919CA346F9A54DBDA80F8E1303A1D43239C5DE043C2AC21E182CF49BEF9BCFC109BC884E41FE2D8669915701992200BCB938A745FB0994E6AD01187C4A24212DA421A178E42216287DB1F6A25E8370E4209E09057E16253BF477A061399AD1B3FE985D6A10D8B05FD94B67F878649862D68F285EC0BFC06B7006589A590AE7B116EFEFC871010993F4768197473BF22AD54B2A8FDB0BBF2B181A2A1CB9FF0D0989F2F68B339A8D8B27FE1781F3DD6F7CB972D73E3DD702FCD0CC3CBDF66A6237460E3B2F45DE273D2BCADB96C118DCC19F7C1E703BCBAA04DA5370A5CB3B78112B8E95B63328B43C51557AD84B3564749C2802B52EB33458394747C176E119E1774BC905119312963401C1DEE02964DC9F1D836069CFBB9B33791C908ADCC717B08FE3C0AE98C0D5DC0C22876595AF95A02AB33BCE3502A92E532E72D0E3455A3D7EE796B3CD5D61DB902B8C0057F2D47F2655E95DF55DA562F632A4F9A2CA8B1D2DB8F5745A71318C37043D3EB08F9950D06C1301F9E9FAF4EF560B238BEC483DF0E017E3CB27A251156221F183F3E9B0581838D04BEB5DFD9EFC26B979BCAC7DF631F1ECCB777E2617EE7386C8BE9834D26B96D80074BBEFE8CBBD203299AFAE8E6F90273B92182CE7EDCA9154E0A33AF9981B8CEC94E6A7C78C4716B47790EAFC771C3DFDE276E4E617CC0DA50F05099B9BF587127D1D18D5F892E0090C8D033F21E7382738F1EAACFBA493D776821DBDFCCBC24B1D5F877B157AE6BF6D307AE9BA54CD053E68594505D038747A7D8450EC3CB4F2E980C5D97A2AFB31147906CFD3E9000BF166EACA8D16A532BCF69526FB4B86B1F71D2C5F38958EB11F9ACC438CCE14E88A11DC431CE4E20B99DF0ABDD2B5AF358260A64012F4A408C6840D365AB95167B54FD479E8527B5FF662161F75FBA7CF790DBAA51613DE7C52A2A94E4AB78E051F32D10233161A4EBD8682389D091B5C4509171650ABA574F1FE954698268450E11D2FB52C1AB3E4DF426D26DC6D5319FB762CCCDD552F4B1BF4E82AD1F78606C644185AE87827F022C9508805472136DC48E71D1C45944413485EC1CC72BC092D6F9990148E12C2A3FFB3D8C9F91C18CC9086F176733A83F2CC9BAFFBBD810A99B66DC3B399891B2045BA402749B55E7E363F5D062427A9BFA8B599367F1D07A38DA16074F75A4E095A528C26DE4083B044055F73D207A6571196263D8BF5A53B7679791BDE49E869F0F58431829396A34415CDF4CB986281840BC48857361281CB4BADF8FF5B86ADC76FD3A812D7641C5FC88A21F137A6980B42FD3858E2A057BD4D3FF57A5ED3F5C41C71C70036E1762C0079DEDE282175072A073A90AB83C9DB447AC07E6BF99DB04BF276FD876F4E4816B0294333BF3403DACA2077BCAC3889B55E76D62F58DE7D1C49816D03DA2D492D1F3CDB2B6B186439CBBFAABB645E9745F404538BE8FC4C698765A3C67D01CB54D404D2A2E78098FC334F0A375EB41C3031F57FF9A773612445AD3D98BD09C949616D4", "5D55CEF58C74B4C681E813564F1903FDB56BE053280D438BBE5E2480CF279CE47FBAFD179E270D838F764C2E7F496AEA9C0800056F2E0456EAA7E59CB20432B65875455975AB37186D6B06FC7D0BEE743CB974DF92B19F4D2EEE82F36598F8E400DCAACA4EEB110ABE352D3A0F58DEFF8D51DBDCE5C23E84D1166FFEE5428541ACA407B9578E4295C3F79F9376384B630D25F11271C6234B9AA9C1B4C8015AC2C73CF768B9EC30C61BBFEAE1426F72FFBC995A834C9D4FB8350C301133F123313370C33FCFD711D1847CFA84E782F4B39762A02F9476D5F45237A29E3E269D16DAD60033E0907D5431C1CE36D37BD388024A020B612E1DE42492A3759AB82AB393237F4A1AFEB8217D2733916B7B610342C0D182C17BFBD4556B071D82E6C6E554F2127654C15671FA1A843347BDFBF9498C7B5E7636318C3EDBAF7BC4BCE123698A05538DD5D42F01970A41A75F0A46E61520911D86A39D892700AA23A033EDC836EBC17CD2EA274252F53A4BFFD5CAD88F8066744C737B364A0DD0B5FFD96787F7D18357DF728FB66B212DD4DACAF7218292216808E7B81E3514BDA947E436A301C4181CE53A298250835AB98DC89D0A3D6240C57C699A5BC31EC4CBF8C111149CF6802942256520BC7FA22968556E2B390E63C9DB7D0AB79939924ABF068BC3D44264D607F088A38FA67F8E25933091BD3EB0A3590F3E62E63CC6C66AF66128F7C3F97B76E62F1AB82F24D8C147FB2C8BE207FBAD7E5CD355230EFD48DC9FDAA4FD1C970781674E901D35D7C651EEFEE2356F825ACD348FF0FF590E8CBFA0332F77A063581E6F19F53CDF1BFE952585E93EA13A83BBAD06070850EC824397A9FF13227F4C60D65B67AF810EF1BF5D5EA95A5512F95AECAEFA25BFBB24CBE6785E91A4874E81E465AB91B1F2E990F37AB145645F2681B47592990CA78264DF8902620E796D4DA9A260D1BA67DF9BB0292561FACCB2478AD7F7D7CAB3DF179897596604F2B0F1E3F10CF842C311F49C6B5EFD5D73DFEFF59127384D3B4D855F8C412E949E3A941782C186413946DF8AE33C9640704CB0D930C12F5FA1C4CEC5883CDA699E294019562948AB028548FA974D6C56AD667023F9C417F067810C4C7E4A712FC3417A92C075423A57C208AF683DDD695AAAA5F027CE535412DFE0029B292D32B2366DF978294FD263DAF8C6A6F7CC895BEB1437CA189C2AD9B6FD5BAC06DDC3D075DF55BAA6E75865CE375DBAE862EEB7A51D0DDB5DFE03234CC8F14EA99110DE78A3463546C6CCE5F7C623028134968C59E247E642CE17D8933B6701DB7952FBCDC6CAF7F2FD24A241D82D8BB1C0F5D55BF55E57BE4AFEB4200C1C57938F4A6B1BE9AA02FA86AA811577BCF1D6BE545D6F12046735AE963DC7FDAA9A2F7270B8BB37B3BCEF7C73F59013041B6CF9FE10FAAA86DE369E868FEE7A37F62E2E9CB1409DFF11FBB09A76AEEAD0F8E443582319F6F74ED0AA3229BB7A50043636E881BD139EB7442FA35F5DE1D6CC227B921A1343E34030D2F1F361D7651C487282C907577765161DB781C49655A5F87BBCB68D08C04290B4A2A94B61BD0C7CFA41821B7F5641B899E90DA026290FDCFA4FB956414523041E14ABD7B1AC7CDAA1148A03B6EA17C49503F01707BD3373EACFD4E248BA0F8D4B845251BAA35D41DB186E10464F6FCCD2CAFC9CB06FFE9DC97FF41E07084B00B7B31FADE0E093C8968D1CEEF9810986821F1741F11A71F5F20C809F54852307FBF33A6C33C6A230EC7CB2CC6C44A3A53AFA49477037E55BE691ABDF6D4A852799453930A4", "B19B7C4DE003906A0001E0DEEF57CFDD2B50514CDD6F57FAA2859061678DB9F8B5AAC67442D8B737F635DC297E3A46C34735AE4D2C607B06964D1FE264B7786B8B0604781D4814E2A81F3A0250D4EDDB77C121B962D0E7109A738630557F5AD47F95A0971A58704CB5B53AC378781B48D67FE5D5349440261C58C26D9370DF37255CFE845F7B0F735CAACF4921CC9D55B3431C6C888787D7C2B436C9DCF1DB94FF0D510BCF15DF0DE42AAC7640741B4893C960FADDCE4261E6284681BDBFB0F471C864FD560DFD87DDFEB4EE7A1267E285BBF2966F6A8BB408A105034220F2565E38F6A15A45B7FFA82DA63965BF44A182FB4672E90BA7933A0120A449323340D0368CF057DF299A8CF60035170D197104B394CA9F2A05983980A1BD93CF3AF8799E613BCEF26234DB2550A15BD53FFA306D3F616D78A6204AD1D50FF4F9972B0CFEB48B76516155791C14E0C9E18457900CE13F672882BF423400D2E6FF94CB16BF3071F44CF2DFE8317A9B761FDC8FDE90D7D05827521B070492AEAC90187EE48D93374B463C3381C7D80178F54C676479BC92470FEA7069CBA95BFDAF099A994AB8244CA786E7767B8400464BD08D5C560D61F27A96E3886A4E821E0087E7A56F96DC6F6E85F1FDFB5C82FD7BD48B63EA794BDE01439FE4C3D7F08864263A0A8B1C1ADAA5DDE86B99EB2A619A12A1A76A39D8B1F04AB55B67D15C7878651BA1F6621658757B890DB0D2BB533BA1C6A5E3226DB4FEE7D561842EFCB5B459598CF5AD3F98217CA720B6781E83C2297C96F4F51CBBBEFA708AD4B3F682FA0C67C82A5F5797030E0724AE9715A911CEE347E80F774EC780DF7E2279924F67ADF9D07FE4F56DE99E06B58099E1104DCE62CCA82D100D90BAF44F26F19ED7AEDEAE609C04C530CFBEBDD161A2C324A382FC8234D405BF900F0B6CE895F9BD534A6474680A7D63C0CF7B4AF1D1E93958CFC02FB379AC09B205708A68D11683B9282564C06290F5E6B57E3E7A75D30C9E21DF8F27F85E1FF347B32105A000BC613006BD7FA6D845C8E6D4053FF012D0D85F99737D045871BE017D672C8FDEB16F944E3020BA7FF0351A303A0D3280D71CBDE42F55657671A79CA30A7A33E744E74B34D27453654DCC8E87911B3701FBC27CD16C4D9D6C29D1BB9AFCCDAB28DB6C2B42C5D6BC1D1386AB26669985B626BD54791930CED4A13716BC9AF8F4DC37A04184FCF711EFF515B92C943E53879B5098BCC4E87B98000BD0BA2E1CA3C7A97AC95C1AD145EBA3950B154888272A0ED49289157091DB2C55D43AE77FA3384BCE92E5840459B405237E194B6F5788F16B217D8BF7539EF8809FC7AE1BA931DBDB2A7D15F139EF4FDA60F02FFF9462777647D675309AAB8201B5FCC1ED7AE066FC0E4F32D260DD9406BCEFE7DC5DFB38D66CFA08E5CEDBA636EFC23B3CB7AC38FF7C390542C9814A86D2D8F676720B7E2FD93217F916F10FF34A1AF34E3B8563319E92A3BAEE34258B4DD63FBFED854E08B1A2F4B560FFC40AA1048F081E66748E05EC3EA02837272FBD9CBF1A658B86B19B7DFC63436185D02C6411142291645692A92E3EA6A113B5436B0BB78990942146956795DFE003A4AB6D9ED875FE7E5B895EBD69C43BB7317CA5C97BCAEA97CFC6068431B24673FEA931EC1DC1A3F72625AD531CD89CBEB0E07F47B26971059FEEAE3986E23286D13BADEA3585D73F1092E41AD041D59120D3D25FD3BB0AAABABA738049C91B22649E715F3710EA51C41C1705C4F1FFB1DCEC85F0EE704240EA8A20526DC01C7C8389B21DA979B99FBF44", "5805FC5E7042027201F3517AB8BA6F5C3BFB0BC7657337ECCC99CA480BA9C3D36033336AFAC0BE172AF430A98D8462D46453E935805E594C18C0EBF735D90D5027067006193854E7DB6424688BD715A7BE72EAF93C2F763F3BC340EF4BCF90B03AF20C28A59F72114F693848289873BE3869590A64658C0A3938A414BDE86BE8DBC25165217B1605EB0402FED48DC09139751DC1DCFF532CBF599E9AA13F3A72142E05A1D8E47A4044269A0B414976670094C9785811628718C6FE5201221A5822E29DAD564B6EECF025DE7783B7842DEA40D4F72D083D112C608C596F25E09EA85BC6CBDEA39300774301C1C36790D7D9C0B59741F6B53E16BCABF8120112C81D70F30E44561EBF3A3A4571F207305BB3A292C46C46E285C246EE9A7442F869711F52D921EF379DF7CFEC4CE64BAE4D7AE7DBA3CAF47EFCEEE78B477C02550D1DABE4FF4EC67A38A705F60706D948C017E333B645C0D80AAC1CEA393CF3ECF711CA3D59ADD7CA02DB6C5E3F259B4ABC138D24C47A650EFB96AAAE93E69F08077D0CF38B230F199C3B353229C529278DB1F5846086BC8F5F54F9631423105673FE92799FFBE5DE6ED167658BA5DB5AAAF921926FFC27956758CAE8B2367E3C5C5C6CC81DA875AEBC8F3460275C4EE6EF43570B4F571994C7690DFDA3DE311F2FB77057732B19E6FFC96221DE1DAAF9B8CCC21609160457365877519D2B332FA3A85B9801EF435D04DAEC3643CBB5413A036CC1AA0968A40F4EB5A76D2D0C3DFCC53C97BB3896E855957B1941FEF59048562171F6241AF278F6D6B580B4C94C5CED65CBC0F810D46E864C2B567BEC920F6D1DE42CDF32300805E6022EF184B43C1733F809F98B129C937930B984F5539F574AE144EDAF7BABBF379EF1A1AE69B7B4FF9212BA817A4F223FA8B182FEA231E7029F80DB126641725C36AB4AE950725435561C6FE37F960E37927585026B8ADD92E4ACA3B4500F0CBE078680D16DBB90ADF6A127FBC7F791B4F93D5463F8C71EEC1EBDEECA881FBDF3D2940C2EA0F8E4DEA1074EB5C0C9EB34534C9C3992E988DAF8979FD8AA90F540F028708BC6D0EBBFC00FA946DEE5E9D01CC272A4FE61E5B86FF1347340FE64F650996F65E5702A61FB53EADCD457A5ED66DCFE1B019A79104842C51B60142267392DC51F86F69367C25B999B3153C1B7895298B6B1B43EFCD8CEC3694F90BBF1A417C48E5CC4983782F874A7C64E05BBF462220950DA9E8F56BA324002E91D934469225E57309C7F562407DB900267553B85C4314A63351F20D57DED0B3D210269B09B976C07878C324F74758D9D507A4CCEB4AA30CC9CD05CEF32F1174C7B0F7AF93875F66E3A7B12F163920825885CBE5092CB7728A1B74B2F3FA9A01264214761DC5101BB0C18D65BF972A3587F95B3E13F52EB6D1F334B15220ADA5A59497558EAA0F4ED358A995F7444B633FEB900EFD9528B51FD82F5AA30699900D3EA3F3644E4FE3F6F2900ED45DFD997FA905D91521CD9C898AF4CE09B6EE00A15057C17DF4C656E00DD876529CD75A169977962DF3F6E4CB6950BCA37A79C98F108AA7B02AA488AA4ECE05F702B468C20C81630F51F884AD74A76491DA378DDB8290ECB8F5879F019BFB416BAF1D9361126F3514557403415F286C8E77C0BCE4FDF0F4EAA96D19F22F189971155F749EC19687657B245D392BDDA62935A44BF6C82E0AF3593BE06745099F06DC4A66C0768F17916AA360988D5E578D169CA84AD1A36B12CA4929223BCC52AA9B47FB138E999CD6423D1171AD3BF87B5D405A174B0398A689DB4", "F99EA1599DA410098772B05B5D7F9AFD485A04CA036BAA9C71AD5DAA3EA5F1C757BC83F3C0028DCB93DDEFFD157EFC2CB29C0F8146D6704D34091EAF1EAA29AB915E652309491F0BDE632172914C132CB9A533E97F89F567A7A9B0776B400FDBEE71B49AAAEAD156753F5BF564CACE2C1285C4E65B5D8B2803A11B22350ADF79645AB6E458B1C9E2031C4D4D6361F77B53329C3530F6EF727225DE668A960FEE1F6D7588BC126D0E2AD23C2ACDED06AA2331E9D0E7F99234A391926F0DBE610C600964E89BE1842CB1F1551D5CDD4AE3FE45B628E9A990C872622C9257BE40A8A124FFD6B135BDD2EBAC05E2DDE5B7DCC13C76C27C8A3E778063F3DBB3488CC52836E92A89641F4559F377273FD51FC45550C727689CA4D5CEBB26263F4268502658F40D4EC2BBC0DFD0E41F16A399F02711BCFA96C2456EB8A77FBEB852726B0DE4F927C13CCB329F8B9BDD760D1DD299863BABF42EA7D7F6204BF13F7355610527A38E89F66D3D73522B421AF013197D649D64EAD17F6A6BC8148D9989E786AAA94FA19077292015EF7CABA4B1545CA9CA20E5A816D6EFF7FCA31FDFABC611253FEE80FF0D75518001C2DD6C604387C2656E1362A3EFC1AB85461A5B55C6374733FB6B17090E6EC1186EDCE2C49EAFE84B139C66A2E8308CF2370095B0129B6CE7FF6E17D14F79258BB3E555EDDEF12E634A5AF748BA40735B90BA1E7DE7EA00D2F4A8B3BED32BFAC17D10050B420DA32EB6D14035CEEA1B7951592AD75FB751FCCF190452FA88AEF45080161C5544AF80FB0FF93C62B02B2E5D1966F77760D446F2625C3FFC91A07A5E852BE406F1638B521579FF299227769DC4B88A805E168F08ABE606B5D745433584BEED712453785B1C01D2B9F1020BDB7EF11936F0BC449EF26DBC2D5FB35A2131BE9C0DE2746DDB6D0356294D0E09076C9A77A076F6B659B7B4F54A06BE2F353A3A0EDC6A5123598DF9BA1CA852A5D1FA16877A78D88F0B367E6C4471758F0663A7498CB1C8F13B03F0E2A941DA89C717A15143F4ECF594B0DE2E43B657DD87E4BF536ECAF3820127B1FBBCC0BF2E53B9E0E1CF10191BA9B43D4D33FAA379B1B543C593F1BD5CC05E0B7511E8D4925BBFC5923AB0E2FA90D05ED580F56071A62A334408D3C454C892328AE1DAF16CBD530ADA7B858DA3763BACBC989F056EE1D46192CFF6DDD7F066D2EEDCEE5BC6B72551245EF8D10389984D3B3455A7B9664475CF6B837D72D42E49BA2F61298DE9BCC707209D7F1E56BCECE1B21FDE69293D2560B8940223E0AE966459C249751A2BAB98323F184532F4D6FA396D5C0AA2A4A41C75C638DC3DA5822AD7D3D7D51FE0811ED3673D875039D3625362D7D00356E8461FBFFC49FE1B0624F6D30D550FE1F5FE4211341B9D57D210237902BB7C62514AD872C1CA87976809717817AECE1E224733079478A5DDF5F2A067DDE111A3FF911D0B511A6AEE16046039B229C00D6D10317F66E1202449DF20CF28BBAB4112948C65DD7342D09059EE2701B36E2ACAA6A9948F818B61B9A3155729EEA670D4AEDD6F0AC314DB12E0DA62FBA01D419F7C48B09BEED87F7292FB0315A597CCCB7B51AF776509818A73A0BED7A656AEBD7ACA2646605797940CB737548E83653E204B6A7A5AFE2EF16EBBFD73484314C5699EC8D24E899BAA0E202F37E3C8D8B5F75ED34417E608EEE4B26B453C07DFC6E62FAC215B6122CB14A07739E86FCF816398DD49970AE8A216BDD8C4C478647A8D07EE8BBCE6631C22920474154B3C83942C842A728EDCE7466565D9A6BB030CE684", "B23CE558D0DE0D584768E83A066B9BF6A12C78D173AA3262866339B86EB8A8D5208159C5873CB29E9C4C0BE918CE4E8DA85C85E070CAC29850CDE48E2DC5E0609F419CFA46EF650B9022273AF14BD9EA28FA856B7BCB580D8949C1F732F87EB34BC1257205BCB6820FDF3BD1E7B9C99E114B3C7607D01235E111E3AB1F30E8A9311F0F30B601C833FB0D8C4D76AC1B02F85E93D4C3D0205F735E20223410CCF56317B6A12D07F3BCD42D2023BA0676A00E7268733C41C8C7DED2555FBD2BE09584B3063BE41BFE93340955788603F1D52190B35FFB8148CEC733CFC1BA49F609ECD3C4512A99308043F3C377EB65870535388376C2C748D18A748F5828B3362666C49F803828B4A019F26D6A9362726E32B650A85523484C4BB2ACFCABD16E754EECE0466D1B370175C37C8CE9DE236FC58ADFAB4FAEAAA12E048BF40CE084467C8835A1E209D2CD67C5BF01E0D62CC78A12130F5EF2E3CFCDEDF86D489C4C5D9AB99484CDD469F2F8EE5E14BE43B9EACB92E72237FB54F9615627EEEB193EFF888AA0A908327C61C50D20C613C933D736F6C3D7F60969A5D3770275081365BA8A57DF600F10A1652167AE3E18AD3715532B7C4BAD97980DFB0C4F69D9137EC7B21BC72AF16F0BEC30B94A4A5C2F55074ABC6233CDF4D8D347F4FA942944D9B2539D0211B24E2C7FCB56BA877371AD7701ED087269DD643C4B62E4B40D3F6572C0730E465C5ADE50FDDD11BD30C07EFF35AA6218D0B73B22095D320448E0671E1CA59BFD52A517A50932A06C4897BA6F7E7038A39C92C20F6DB18D6F6AFB3563D10BDF48BC194B79FEA6861F1CB9756281E969968B65161D3980C4CBD036467850EDE9397321913D57C1EBD7743A44A12E8C85F8D2D1EFE2A8754B5ED0E93EE9649C53F28129130DEEE66E58181787137B262E1EB3FDFEE0604ED1AFC798B198044DD5D0A3E87A754C7EBF0852953ACF3371BBFA0FD5979901252EFF69473FC5655709EA193DCA2A2BA63D706C84F49802684F80C576706FCF1BCEB2892B9179A72B7CD886AF36C7D3ED09270A4077C481736BB69A333AB4BD864AEC1EFA944A591608A2469C85AA6431C47F657AA9C2043F373A69323E735B56BC8177E1E37AB03BAE93A7B304EA1C5C52B244FC265EBD674FA7F1647E29CED527FCBC93CA7A56A4E771D7D2E576C40B2EC736DDBB4FD7411168C5C568C446D1E454249E6F7529AD83215EDB62F57D25272F351CB2C40965B1DB65EF5835923EC2D2FC7D8AD56B67980A3DBB77E6C4415F54F3FC00A790DBCF39A2FB699A20FC634F1B1C177C37898A81D7693B21020C6B592E5A6359AE395A841B434B675F1C30A9CDD0ECF987ABC2406178EB2DE941393AB4F96BCD43626978AEA548173413EC9DEAE7B53B175AFAAC5A1E02D6EF7E27AC41268C1FD8DD83D1AC55ED45D087083C0D136048B7F61EADB94C88CBA5503000A90F91A39A8C9E2DED567F7FA0DF605AD7870189600B941B99240A15310E7B3FCCF5ABDDB56D50CECC06B4303BA39EFCAB2F7E9F5CC8F542E96034145115AFE3788DE0A4985EE1929D4935EF975E760DF7FED8A257718DFDC5A0B4B87024C59DCC6FEF6F2715582023C3C80EAADBC7AA8712FFAF80CF5E159CF5418A1CB50845C97A7F19DF3CC5FA344562DFDD819DD736E9ECEB7BD57AF324256934CE6DB0CF295AA0ADC5931D339027CCCDE1441891067DEA40F69F6EE07187F9B78DDF6D59CE02EC3BA6DD68F06851B10AFE9672EF84020CD53ECA25B3D5E527405AAADF60593A8080373A387111EA898499F096FF46FC58", "8515E8CF42FC33A8CEECBD6E1B65BE307A5BFEA9CA59FC51A382C24CCCF012C38DFAD3FF3DCA3180934DD6AA52D828439F1052A959DE23BDDC3EA3F2E8CD70F7A765F77549BDE6CF8E444762DE51CBA3431439D1F1E42F1773FCA2F90E48126A000E69C0964B1955F586CDE1895419083322FB4E6528F61768F8BE4CDCB37FE9D02B27193A0BD79D15F3CC9AC6DDDDC82B02201BEAB86D13EA560F7EB5328AC0B534C52BB9D266F291425EF1607A19AECB9AD681815EC4FD1888BF5449421D92E473C21BD44F2C419A0B3E0603EE3C5C82E56466C5A76B76F81A6C394BA693991A5808334EFF1E996AA1B1394A4DAAE00995F02E9518053FC744BA391214DF2464DB9F01A5A53870173B3E8FB6B9B698A8DEE80745D7F71B70B811867D3513197B32115882348FC704B2AF8BD6FB3BCCE30361C1198B84865162734719D88BB62B7431FA39D452E0A1B0A7E45534BF76B6AEC48DC25B7487FEB4B5FFA9C56CC7C83E39AC196987747D664943A600B106F0C3D6B2D0D4425073EAAF89AB33BF6AD76B151CAC32A670A2B03BA31FBDB48B949D3074CD9F56D39553708CB0EF2BC96170E2FCAA3CB2811EF1C67FEF6FE85CD450FEA37A04A07EA732A696EAE8E76D497F5C350CDF72F8970FAD94C03909F67FC895785D5DB6C3A68641D68895AC8544C6A1096DC4CCD45A68BFED7ED86961B5E035E61E9C126319A7B3C1468457C423C4A4E2DD1D42BB90C8BDE2A162F999A8C3A99BE998B9DB7A14C101CE78F08857ADD9A96059DC22592B90488D77D6F0A6D459CA65FC947D742714A42277A79745C73CB157BB825E65872D9BEF5066C444229ED1A097AF6B0308DF2793A2284F911C764BD1158742EF4109CD8AE6111DCF8A40BE03409FA6C430829D0C9BA28B466916C67311F8BAEA2D8CD2DF9C95094E4FC6D43F4491AC5FFBF05BA6B7DB9D7FE4A6DFC386D136B1710DA5F30E67C8DE97A981895476B8E4E0DB5E1AE630C8034F949AA4095DC81EAA0F645B0B440138AA7C5C7C5FAF3B57E1504A5FE477CD61A355D9AA66C39FF89E2DDCBC1862E19102205A9F343FAEA71D4C67192D4D5A1AB08BFADAF6753244BE5B14B1F911700B4A947D53645DCE170401135D0D7E968F03A9B19D2ABBDC94BEE623FB64C1DFC4AD9040197C319A79391016D6D44B8EBAAD5B2F1AAEA58AEFA21B5B3D9ECB66B3B70626AB31CEE5CA759499073B4FDD96457392E58C0EC871B95C7B77F74B81C4CF5B1B243BD35F4D540C1CE878E80AAFC635D363B9D72DFCDAFF62FA8339BAFF4DE1EB3E146DB93E7E444403E0D4290AF501C841B66302A345F5541B1C797D630B5B7E788A793192CE1F362B22B91A837184106D852391A241A903E3BECD192C4FE52586BA4044C4FBDB20B711D2624B6CC13E0C5EF62F2B2E00CA516991C7572732DB94DB809FA0535D2E8376685506186170E3702903A6D08996BDE20F74BEAD391245680A029FB439FFB96EB829F0BFE58A6446B00B4E1894BE1B5017F706156072E2DCFAB25A3BED2DB310DA1A7262ACF24A65F41FADAE3F81A32077BB9CB64AADCC2F92B95EE56F20CCBA24DEC9F5F75B36EF1A101D0F3FF6D730DC199869F8F26DEFC6F51451BFEA2C0EE77CB17422E2790A8B29573405F112EDD704E3F46C7CD8ACF0E495C6BA9ED448B0B89A9997850F09A813FB23788681D3CC04996E931CB00A879E2FFA1BA6A63F9D3BBFC20405244B0F838A040F125AC2B4999A197A2D53DEF8CB167FB7E37DA3862CE3ECB57B081DCFD98894E45C6019B9229315108E37DCFC57C9F80201486AEC", "4368224792A5CD4ACD64D6956A334DB4614EE5EF8F98EDE0B4A5CD3D06819A4858EE0037DE64ED93BCC7FDB47E90409638B3789BBC63134308B972765565651902A9CAF4F310E93BB08EF1E4B325D414DB5DD7CBF660A880642A27378A7427F2627BAB3444149181C54E9D3FB7967DE33BED89AAC255A47482835D17E329ACF3F08F23AA1DDEB730D9602243A6894989EE2D900FF6AC0579864C2361EA56CBCE2F39A75A12100670AF3FF1A36E98D1931D17CA68D8D031CC527EF7FFFB35AD6E046F4AF1B2B3F66210D978F8607039BBA99AFBC6A499A5A948C5C59055A140293CA97306BFFCEE37CE77C114478D0F73D1C8C9954780830D56878EB786967DDBC71951ECF815CC4266D66F84195CA1AE0375E90017FA5C66DB8329D668BE6C0BFD85742088B7A3256A3277AE2A1F4E72BBB82BB2A59B08FC59FE5F24EAD5DF43D95917A144B4DC6587C893314D5C2C427EA92D02E6922FB0B60ACA646092E0D4A127799FEE4B76587F26AC1EB89BE0BA46F2A212ACF50D93D3345AFE72AEDA1A0F855C45AFE14161E22DA3E223CAD6B47E591896F4283F10C4073AB524CF5D0ED88F979458BB928F1C179E2C5914B4CC52CC000383D154830A54332D4C0E652F98B91BC086370B04CCB1AACA56C9A33B9F0A65C33467BF45C74905B67607B83FEDA063857AC4E326B4293483C8841572174CC8A384014945F5C3072C5575A5BE322E3F2FE3A7E30F3F21118FDDAF23645A40E0A359A3572153F5C3ADBE1BBC4EBA5E063E9F73510C5D1D4326D3D7A20384724279C3B4795C68BA332EA706E8127672E41DE4BF1E8B5EA60B39CAE2C3B7B21A225115BAE051FB0401A69A7FC56AE4B7E31CE2CD575D82C8279E8B8499EEDFC134503E6798056324B17B8AB045FFDC2A35B190B39FF212C17C36537A1F99F2EC3A4CE693DCEC7DA80861FC6F3D064B82CE5581F9781289A085A300CCEFB6E80A86D961408250846A374ED00F5379F446FE6E551F608AC3D71346B738C75DCDF63E19EA79AFCADD5E1E07E2F7C0AC709F6428FEA1DCDD835E3F56B026CD8DC9D4629AFDA9015295C2CE55DFD9C83223821682B5AF876B1CE156343A0F4C1655448FEDBC992602BED5DA4B299B86EE2F86D02C757CB5696B32D60357B21F9DAAA06EB3BE2E9117D2C99DFBB5328B3636F41A06A020E3CB47851891AC3825369C037B0C0D8412204FC3D5FA9585F3218F01295375A09463AEC65F591A594551E19DD00D5738086A31712AE9FA7BABD4E9C10E9F4DA82C12EB2F3319E852B96E61EAD2F85BB6765DAF874FC8AF42746F14B8FA489DFAA9540B4D0470CB31F99B10C335F672C2E06E8A2378B9DD28E8F56BC7A4C017327404C79F1E8E67BCAEB5C4C793C176F0A3C1833007FC44103DCC6E273C9FD1909AEF1656E2B5756B7F4D69F4F2EA576228DD794777BEB2F34296691A1FC38AE44FE60A44AD894CE92DB77FC0246C779C13E8AA16648843BA68CFC5E4E02FB564B0ADF3163C5E167C275A8C15E58659E2F70A3AF792565422D3327CCE25C9D488EF3C32B195066BD27DBD44EF1A20AC6AA22250BC0592AEC734477E1112DC3913F6B7CE323FD1F7B3F8299B8C9BBAC23487F735070AFD5C3627506D4C96B0A1427F7EFC07EFCC62DDC5455A77B57D3FD0B8CAD30A346F8C34F42D87827FAFADD54264A323907A89334C0E7F98AFC9060D7767BC9D8D261BC0BF64FCA389BB192A9B4B00CB566D254CB0226FA17F3BF21E2926CA52CE5DDC401E74A92C7989552CA66675A9BB9E9C198BCFFC488BE1DD5E47DEDD94015BE09B44", "30F77B7E7E40E42A52452A26283CF3A29B02DE3398DE5179773F2CCA4978059495B9DB13069B00107462C0034064A024DF3AD33C063F9608783E79E38F706B92AB117029EBD6156CB5D278149875B95AFBE877A21AC3128BD6D0B11D31DE7A2BF7CCB68911309BBD2215F592D56AF0F700D962E49E4C6D089548C7587B0598374C3D7BE80F7F20D6855AA28A27AF668A8AD3552CFDE3CE0B35DCEFD5240C8FAAB89D013D0DDF5B66E60328AE32BF4EDB8021E43762E96E5999CF23BF2457B1CD75D1457D4926E7C2A324BCFF70A7CF59047DF3F08EAF2922CAE6A7BE1BBFA3BDDFB864AC965B7FF093CFE74B53DB332B411962DA01D4E6C62CE6731E893574A097328CA7606ECF373CC987F98C31AD74EB4A863084266869D28C07F9C5B5F10385EE44E463324A81D523DFCFBABEF20F3F71FDA33B7EC1B2A35A98F01D13693CECFF23E00CBDBA2A2D09C8A86A819E82D781AE88B9F207889EDA1EBC54CADE6A69A564ABF48F950FFBE7A86243C544A78362D9BFB6CCDF20CEDE386B9E3F8D7EE0E4A58596F095AC1B99E4F787472A734252D6C00B177FD2B99A85D49B9C0F32D728F7D9BA4DF96D1BF6C365F5F4EED7D38727B339A223263B58560ECA6778069DFCE48703AAD1BFAD59CE298C6BB464552408946265B1E19C1FFEE000771814FB5E4688140E1333B270F05EC9345E8BDFA7B412F295AE3DD4DBF33D6D2D62582887D4CBB9EB55F5FE3C1BC32DC689548B66893356704968C143AD3CC2E48BDC154620ECADF336E218FF1B22521D183EB2D13B15A15D39A42A25B46F1AEC07A14CB805AC382DAC8CF96829B8F1D241CF5CDE5D849DEB242295D7870432EBB642A45A6C6F1C2786B88C883B9B47343E822978155D079AD9F6C8CD4A21479B32B2112EB0121C3C74E7C23284812F74A2B413B9A18D6372AA3E09BB04A262E7FCFB6FABBB074C7C603C89FF607F83DA32DA50F2A19C38BA0965BEDC7A961966895E17A20A4D8028FAF7B6947A1964601DA45643C5FCECEBDEAAAA83EA5420F2984CB606E9F3191EF323D644635EDD801130893D84DFB19E661E04188C6CE596DD38C11D1CE5DE1EDE0D15D8FC427842085D300E6801CDE02768E44BAFBB302684FD945C9AC722561B0EDA92E8D845EEB99F6FB1889328C74D6D9CC6DAB59D55463A613AF33226660C0C034B896075D9EC2F51165A754A7D2393E15955BE327587943ECC1F3BB97180E751941728B94948B6648D2C606D66B9BA1898FA28EFA38A413B066D715F7DC5F0C755B6A3126AFCB606EC6B12E332FD71E386ACDDD1DEEF1533D6386AE5994BFD857380874B14ED836D9DED47DE4760ABB05E80DC622C8D7882CD74B2720884DA747BAC3ED9A6EFA2287D5F7D6AC7821E79C79EAFE7A68D2543D7CDDEDB63A13FBA4B894A6D0B3E14C44876364C9FCF93DC066CE953E89851A49B6EDB38661C9316C82ED902EEB894321C84331F6646A5C1AFEF832F38AFEAB89D181D3DD1338DAA236BE0E87A6381D00845CCFCF4DBEC3D41F8AE1E6F39167A499945DAFE77601147EB29804A8B98E7EEB31DE20C84E9148BCCB15CD02D1E3B519EE0A2E4F70F57A69281E651B189C08D575D52E997E3A435B4CC86F938BC79EF4961CD03DF8B92A8C507DFB2DE4D5EB0ECAC2F3D712A46CD3EE01B8D4DCB845D23E53A2E01DF3FFA100078F7B2467A45BBB4A18D14E0CFCD089433959F07F6F60F651DD7FD9828069D340D048FC079E4F8B92824D54322611A3698FAF181008DB5E3E327EDC431A8F6E481484BD5A429D0F5DC55AEA8A18F719A7865B0", "A7D629A25F82015CD70688CC461244E4AABDCBF2CFFC2D73A3247F4264101FEFBD5759FFB83E8ABE9EF5B6662DA3CF7196385C05D0E5BD50C71D3CED424AB805AD632F2C1930868ABEDF493BB4E3A9DE538D8E35146320EB9F5B71C40E6F32E9243E6A25F503B68EB484ECB73C436930F30E2776D17A2E5F9CAF157F368E0FD9C26A9E9AE30A30E15DDD8A56482C85B46F973D000292CFCF0021577E5DCE8220353E23DD8507D0F561BBCD96F6FAA451E9C595E00CE0F99C8C40359B103D621CE0C837A3D1598D814BE6E22B7A509DBF1ABD2EA60955364791A5910414646F9928B5676ED590F41BD128A55549170211A0630BF5C5BEFEA204896C7FBB40F0C72E40DF19C95F3A0ACD641834E5BCBD26E91315DA34708E2025E0B7D38F9513945DE44AEE57077C8CC32C707D9A39BF098E4928420B3FDE8C74F39F81790D827A628B8F2776251F51095C1193B2FFEE8C93F49DF6D4E3C2E1BDA52F7356394BD5A675543493E04D602F332761AA1D57DF3EF8213E4E9B8D4BF6C8BE8BCCF661507C394CC9D5E9DD4D81DEAEB6D638FB9225247818710E4724111F522610075AE757AB5ECF6FF32CF087DEC9A04A7DAD8C613B22F2AFD31466574AA87CF0B8545B38C53A8F4597D5F1BB6837AF26114D72C609B624252722DD867572D449ED7C170F99D4ECB995B76C8DBD14F50F3DEA077FBE4F838A03AF1DA6757C70C5F3394092D7EADB1E0A859A8487F70D9F7EE523AFCA08DAA5F8E9260D63330773FB7EBE01373C3719129E483DE3D132697EC4C108654256315A38D7060C6F52B4A444EF33E87946C2537A3FB3B5FACBB0F3292C7F2498F0A11509FD9678CC7C678D4623DC07D8F218E4B65F2EB844D24D696A31483E1EDD1063AED60D7A110F7992E3E46F8C7D5CB1AF02D598440D79D649AA415E5F3ED033A8FDCADF8DBAC48F9905BACB37E31ABB0174CC08A9584E25B94423BF395E097E2D0B7ED76B55C6231F180D1A7BD969F6B874B9255138A1C3A2847EBA159C7EA281433A39D2F88D724B6350E846B365BE838F25B904E7B02B12ABE543961D33D991D0DA93310CDDA1EF551D7B6A02765DCF0D870C2BBF578BF8457CA1B599D0FE445B1E9C39E9C8756EDAAC6A10F62C84F60A27268FC5B436A323AC5BF4A9ACFC55510558C5A354D96A5D74F69687385C123C497543EC14C40117ABE46C22FE54DC4D2D6F4823A7F3DBFD3A1FEED428B90945B8F6B2C9A162F9C0287C758603E2C7845A11DDFC37B815A62A1A665C3FC003DC9F064CD5D950DEE02F48505CBE1A1E515E6516E926FF6DC0123E1E4F94587F1F1568DFBACC3728BDC1D153196CD91D9F6DA84ED6B70D0DBA7E7DB4A71B224E5122328D1DCDB9FAA98E88E9823A49E7560DF822D67C908E9AFF7D429E84350163E49AFA4015337532B6E928BE2001CA202C5D975A3E54808AF8E110575AD5FCA28185B2A7D8A3019B97AFBA933BE2F9CD5F279266EBEF52E0B92114AACC30237B712FE53DB1B8596CA72DC82BEA99DF8FE845D390B8DE1C00F24D0D9C619651FB16A280102CA8BD7FC3F7868E4649C636064F4D0EB06D06595A0023E6C5D32654EAB9C8EB011186A32C3E5DB9BA6489895FD50A26CDF1BC27D599F7A8BD1922B30187E0DDC54AD369CC61E958661C4FA76054C2C6658AECAD7D0AE23A9F36DB1B0E1141ED6A1084A8EBF8975325A1DE4A679BBD0E022BC35A07B40C52FA1B0BCDFE17BB6EAD099088963D7937CFA5B51ACCF722FE4F9DF99DADA8CB05C17B6A6AE884F1C7DA09049027D6EA570BAA064736219CE1DBEA7DB0", "9BFAC777848D427BC9D39876B843378E100DDB87ED269AA91097FA433CA7EEC7D6210E7F100C449876F83439E3E494941D8CFB3E11ED7AF04EDFFAD2729FF75A8FB14A9BCF386ED8D95C046A326A9A92D3F316C758F6939F14BC88789B17F3DFB5AA691A872CA44E908AB966D5F672FB90196D71136ED26591404202AF5858D44C8E0B0ADE3441F554040E458F5AA64AC3D5B32399E453FA1565F4E71FC9EE5BAAC97552AD75D0154FDE48AD914F6D59800A7FEF91BFB6465A296E217E554631FCAC48FB7FDE1244F00697C2155A3161169225109AF5AE218D51D70BFD452433BED94FAFA5920B35353013BE2CD0C32B8AACDFAC6C6B4CCCC2C222AE845FD76630E963CA22F5214033FEDEE3296112F9C127865137CE6182BBF09D1489A1DFFA82D9B391A5AFAE6C80414698703EF03BA42893786FB10C9DBD21E7292E197A2959D605EC466CD202BB4E7BB1E9D5B9B3F07F55FD8637314E3D68C763CBE79982FCCC0147AE6D4C96F7A1C251BC35D8EE3A4F6FDD9CEBF771878B80E3AE481619D80B7BB7EFCFA9C20F11A0FE18505299EF1BB195EC7A93263420D183BD89335411CDD66B4809BEB30AC649CF76552A6F08E9D77C2E9C5AE05FE469705E2E6F44485395C054F401DC6CB9F581E52978BD93CD927D47472DC52D81960F98D60A061C5ACBF9F5E4434B31BC3C55CCD71CC2F2DA6385A3D040DE8B8D5F5CAABB6FC301FE3D5DEB95A00F01772505201B33464F2BB1D45A2F55EC907E86803A94F9340960A5E99C727517C520D338A41320E7E8BAAD6C4470300DB904B1848AC84F67F67C6BDD6AB71E2531C5C662AA9DCC2E84634A5ACA48C5A5CD1CDA454C6689E2484274EB1A2D1CE2D94876F4978987331D16AFBA205E1D81CF287E5E59A6DE000FFFC99E50B0B124E718CAC8FB51A708B42C0FE669894383C01D020E45B301DB2FE85B177FCDD1A688264A0327614A4483BFB689DAA49E8F59BD2D3943BA06F39119D46E5DCD0DEF78BA40798384BEB03292F231A62F7B6E456F3542425599B2BCF96978626543266E8AC0426B3C4346AEAA1E2FE20B54F70273A5DEB9BDF92B8B4DE940C48963DDC569FEA89B4A6940B7644E33D105C5BDC61C3EB7D823D4CF3FA0AC7196D6004CF6654BB4E4602974FBFCF6E74FB58A83540254EAAA4ACFF41C5E1481B2C38E7084B944684B21B7C661F92A28508F449D8ADE8881D40AF4A161A08C5846C78FC5C562CBD36ACB83284223B2891F73947804B6AD40BB99A4E7D9ED1912448C99E5B572760E53DFC434D06DCCA06DDAD3BA09DE063378A98943EFA0CD3E75B1B860E8D1350CB920BD6FBE30D437B96290F49E37BEBCD2FF9F8A4BAC7CF8F4571DAA9E788A3A411AE231D369D35055EA48D03AF54D968EB71F7BD14E51A1E617F81B492FBC3AF3761C601CF108DEA9E198BD1B576F94DB9A15975CA55D356C209E5CE1D8329A5D353223AE3C5C9BC55468AD4C2756BB54B6FC66FCC3B0BBA3962EFB4ABA17B1B08B01C296A578D5AD63F605BAB75C90924AD456D53CB72436F3A2086EE61D7C3479E0381A52715292DCB8CD2833720572A40CFF97928D4EB54265F3110714C360A0479AE7D51126C5CCAC09372AE7139C20C46AE13E4C41E89AE12097C6A198A979DCE9FCBEC5D1AF9D9189059E5E317B77B6E98C29F38E29A35FCC3BEBE3ED0267C5503BAB0FDC46C7D89766475F2676C80CBA71110F815A84CA7EF91ACBA63AF7933056DDA345D527DCB5549C9CCBD5B201BF9D0C82683A8865DBB4DDD057002025D088B7121C118B3A6C901BFF83DC1114", "18A25B1D741562F456B84CF500F138FBB34AE1D18E9BD6FBAD05D0AFA14BD1FFD10334E6AF3ACC7AC2698BA10465ED5EC26B13265E5ECD1C79359095F36B1B5333EF87E78FC44571ECC00F294243FE64C4BD7833FED71F3B6471ABDDBBBF4C374519D24DEB11A8D2EBDEFB8D2CB3BF517AD92CA598040D0F5F8E5607CD879C75E15755087EFF796EF432073AB647C9DCED072FCC9DC74D78326EEC1BDC9CD3272180E38DF556715CD1D37DEB8B6BA06B81F01C26A3E97B9475B688D32BB642EBBAFC4406B7625944603FC085B38E5E4C9ACF0D0F92A65EC9BAEC8AFD9A1C7805854B19EF516BCF65125603F131084CD13BA6E72201B13C1897D0ACCB8C4266884F3439F6833D22C08A68CA0EB7B636D866182E6F42B35EE9E255F3FD30014F4EF3484EF31FB1D17A6FC0913DCC1443439494BDA221336D05CEF0FF168A9C54830066A6E986672EB92B2CA01C7ECABD5B5B40049B2161F8F52445FC27379B0706866AF20800C521BD0DCAD90E8F4367929A9D21F1921049FBFFCB2BFFB69B27A2A4FC9E48256CE24302A57B69B04D6E51469D5D7C7E41DB6113693322E1DAD218FCBBFD47892E8BFDC28FE1461AFC769286C6F75165CF945E5CD3C9322955261922B6C00CA2C006070EF26141BD8B44798110A9F20E86C52CE88D6FAE122FD7208C9216011D7D91750A800576F575B8EDDA2545B3D60310D61F7351CA1C82C90E18641FCD747FE901351524B9D0B92CCBE86067EE5F126FF4B2C582B280CC1549CB3A18D5D9FD25A09A67DB83A8F3F7DABFAA3C09CDF00C6F16D722EBCE259723B97017885B70CEBBC1C164E1A5361738B1F3FA426D077AA97AFC56F4F147D3EC04E52AF0CC518AB4CE8B3ED66A1EDEA49E904B81DF00EEABBB5EA8437C18C0282EA1AEE445331C5B0414C2E3CEE637933753B30FBD2160E93C3E7956BC032FF839B81179DC5C41CC81E6B8A74EDADE4F6EA0FC2077D3AFEE342D75DDEC1539F5C00F640A56EBA718A77A88E2E8070AB9663037AD66D9B6314C268806C2856E233D37BA73E61B8CE393F9DE86DF5C76610766DAF68A8DADD37C3146F59115E8AC18330977D7BBF677C755B79C902A50DC457FEC314323927BFD45DD4A5AB7AF351228986F3B03E51581C8A8D5E4F8C24ED9E14FDB5D0D6BD2A6F563D66A31247D4EA17CF6C158BE7FDA81DBA14B9A1549D5092658BEE5542BCFD42C8DB540447AA13F208223DE36AEE06BCC2F280333D81964ED05A275EEF56C21F0BE0EAD9D6A8F2C70660C0CB04AF6D84E0D18D3EF56504CB18EA259BDA23AC1D8CAB42BC340448283D9CEF770872F3B94FE85A23CD9A864F76FA82EB637086D12244DBBB9E7B2951D3B0B6C345E513883F261D3EE312A31017BA33A08586F58084A8087144CDF634517F42AEDF185D53366FF728C0E7C0748A776F3932CA874D3C2C48B30D01A5F579DDB1A038AE1E20D986515309A13B369F644A856C995C2F6942B7E6BB624A0DF34FBF31CD9F96C486E530A2F3FF8A43D7DDD578D72B1E93338EAACC244650F8BB37AA9CDF721B1EDC334755B63CD34AAA832725A883333A4AF4ECE71416146A4F05232968680AD41C89872E14AE1CE2FA65B7A3BC099FE265173B0B7159662259FA64FB70902BA09988A30697F110B892D7D6C763EF80D6E904A2CE47BECED5E98AB2A3BB70A73D6AF7175BABF8CF8F38F2AADE3BAFBBEADF208415A2C2FD4A1ACC3140E185A2534AFFE6C01EB30FF0137503349EEDC1F9BB263C18F427E2B119BFC692D5FF44421208E8AF146FDE964C2DEC3E1C9D5699ED01A7D78", "69A39F2889ADC98D94B5C678A3D3D8736BC17256367EEE3FE8EF5AC6453A0691D894F1F3202CE84EA8BA5A341D1733C6BD0150CE9C0019168E67768B33B64DD4C9F0E2BCCCF2FF7E370C2BDE4F403C270F36937119950121A840913CC1D663F32F01B665840EC9E09E5A9C345EE001F84B2C1154359BC066D29E0405941476C5B7B11CFF124F5324D4D090E2BC49C3E8D83122DA9268FF58B523EAAAE4493217609FDD5A5C510038CF383B65FFC7671119556702F630404C0BC686975E853C86AB392D25C853964693AA7F4A63BEC12BF51762DB46295D2062FFF24000E4F9FDD21972D747ED2F37DBBA2D6DECE1009222EE06B846FB7D49E8014DACFAECBEF2560CCF5E06EAD04B113D1F8E341F200DD8CDB3F36AB99B566B16A84F8C040ED8827F0E9F0D4FA340B0ECCC98F5CA4B05A990F3B410CAEBAFB409E985A722E4C442F59AF3ECEB1AF0B148A3E8B958D9F6C0E45BA4EC8553332DF170872E60967E106BD27AAE4A6C15D391C1B4DF7D77357B4D4E8B29FC874947A75CDB1A1ACE512C5CD08405F2D9F21D50197DC151B5E5A735F759628BCB5A70B5CC9855A39188FBBA8E6BA0F5B6538ACCAF394A809C68F810441BB81CE71F7DBB2A11D3905225DC9B1F0F0D8B7E5268020039E03FD97D42204E503EF98C26B5D9DCCF5424573775E536C4AA26BF4B0351530857B8F640495377E9A08AE82F227BA487FA1D945EC233EB1B42C18FEC4BEC651D4CE1313C9574976F092A5E52D1B37B5D4B33800F5C3803BC6ED2759AE3F6888E7120D3AC2F24729A08B2B4C8D44EF807987C156DD3ED871B0A6217E9783A78BFE56C819F2C8FFC2D2D83945FE846833E5ADE3F840B53EE67E5D13BF0B7031B6C1D004D274F43C1982C43FB58011389D2C7E9111B8ADDD89C37756F1E4C4A931D828ADC3597429AF3A00C0C9A71A44A62F922102CABA479BDDF25A088BEFDF630E2AED4351A90B9567FB6DB5FECD6F168966DB2EB6161DA84479DBED9090026C3CACC19B91EF5680A40073FEAFCAE161E3A2F0DAC9C0A5A7AA31D93B425D5B5A7BF6D38FE797FB53793EED791C82DDFBB2D224455349F26F147FE0D59747AB091585DAE61A32B04DCEF19D907C1159FF69443843248D75E772B558E7AA0FFAE2A9D2B6B1E9F34B79DABBC98B2FAB34F76FEEC635E6E756F7724106D08F296019FDEC94FA7B7CBFD780F2C0B75B1D88EA0D5885237F4D09F03B2E8E1A98879656AA33AB23583DAFF96D8FCEF548302F323A8BA959710A78A803185D88A9C971D9491613E5BA2044D0B640FECF219CEFE377445E5256FD687A15C9F66475C0270C9C1A7189507E881DC6FD5B31FFF9949342586E24C7827F260CDAE356F874CC7C913ABCB40E892E495CD4388AFB84AADB45069F37ABF7DF966CBB8EC86C0CA5A86E79350DA5D6BC2B23EEB51B9C9C352FD9D3FFAE368891D8FD4E2861B8002BB16DA0C4A96E6A9B8D8FF553CA1E6D85B16F996FAB677FE58608BF58AC1AFA9482CA957B03924945B4260A4147625EE657C7763B4C9F4C00466394DB4F222DDC16B72C579FB80B3861D6B4364007FE856DD8D498F3732AF3A7041A2D71498ACB3793C250CEA60DE84FCD0C227A08F903A0B5ADC936FBDB7BC6AB8F7AF002266C8740AC3D75B0628EF6A05C0481CB283E3645F7D8A0ED7415EECD52E4BF70F00ADB11BAEB947F03140446AF31C2BD41F1D34D75FEAE64B91C6007CABC91A07DFE8AD753CE183C611178B8F63B822F03AFBD41AEF17F6A1D58F341D172D4682F38FED397FB01B396352C37397991D2E1473784900B4", "39B27D6129F6C84173251B68B742EACD5A1BBD49DA6A4DE039831B66B054A9BB13299EE828282F1779AAB7FDFD82F4CC3296E9777A03C64AC4F08DC8882A9454B301264284F7226A4AABABBDC8336CA2BD1EC6517A9F54A776446C5A12FEAE387629FE5A66188C671C80A6C83B08322C2068ABBBC03261AAB8280F4E36507788CDAC4D3F0817327FC0D19B0BCA35D89819A9DC2D5C0CED08A87AF8DDD99304505EA08855CDB514357F8A9A7F3F4D062705E7B26632CA617F640F4D99417CE5C90D432D6B8955DE269460B9DB3C08432FB7BA08F5A658DD79DA8E9AE5B0751152847EA6ADA78D0BB4A8BD9F6E221990CEAF771B5AF603F463D2369DF9BF556A1CE60D1EA6172BD05EDCD166255810C1FEFE029EF21147DFE8EDD5B333F6C7274997E1BC61F253AA375B9CC6B5B64BE8DE11CA00C9530DDB1F218870611D4037BBB88F257614EB7F2A6FF395376C5DAEE4E83C5D11BD6600DEDA47D1CAD95B11E5BCE680D2F18CF92353A11840DB88C38B363BE8813E8004D2BC1DBF95E86C64E060F735C404E8945EAA3DB31A27C63AD818D96EDC6B0111CEE3B3E9F0E1B7DAAB22364FC1B36D25ACF77630DBD1E3CDB194FF8B8D1BE8ADABCF4D0760BF5CD406E982E0F743AFA2C4B333152A74177DD79E64566BF34A10515AC0E050CA135D7357E1F94F1653E9EFB0FBA0BEA1C2B09D6378E4E33EB98B5DB2A2DDA5D9F29CC68766AACBA09DE25B338BEE82700203628ACBDD4B828B34856910D0F2230260FF41EC371D08BE96EE2E821A1F3F328B631B53BECA81BBC74A92F608F2B040548BB5E805EAAB46815793F1D01D121D2E347ABF1FE62B4E00E31C8DAA01202340219430E88938D859D62B709D43934265B9DA9DBDA01537F54B439111126613FFF46ED0A39B2B19C22B8776618B065E15A515B752E1846F51F8469CE32FA076F47A5C49541A19D54CD63512DDE1126D7850B4300610E066AD53E094F26DDB40980B47D632DA9B4524EE5473B521A8F79A4B84CAE714B65E30824068305858CE9F39BB2EB06821C3C07EF2E030DA4BB3DC2D7A29A69DED7EF7B03825C663F5EF44B9A1A174ACFBB164FFFFF0419E13A8DDD108FCA9B2A8CF1A5A2E0471046FCFE32555E72D857ADFBC123B190B48CFC91CE8F0BF86CE2B439DCD3AF6F2CB26EEBF393FFB34290D2B7EC33FEE285547BDCC922312D36D9D25AE5DCB0A03EB0B603A6F75A5EE878266221C9B606B185250231E4B5C8B9470E5BAAA9859A963A51B83ECC111DA4779F012AC23AD2E2DF2965A39E52BD684A0E8D2406A173465B57BA6DC095298DD716BFE30E42CFDB0F2202D56E97772E3D64F1CA9B628B6EF2217A837165A1BA1A8612638C8387EC3854AC557C326CE88DA10F9DA027B204CFE634A695F2B59BC57F987C613131DF2F0F6A5F6081C96098DC03F82B3691AE9E4F14C32324CE495FC94EFCD1CBA88842223DDA27999E0B1762C581162FD1839352E8FB7E4FC143E8D3C774BE9BFD7BA4C3091A04D08EFCAA98B5D3AEBD1FBC65BF1CD7BEE784B58A877D8AE9DA9B3D459521A53010D42242DA0181F661F7CFECC2E74BF3C8E959D84F91904F4F8DE602B214A2E3C42B93BF904058FDBC37528D467E323039F101209D60C56BCEA60BF9C3714A05437A978F3601FA625B31562B5C9B5DE2C6B84F560FE35296E2715D905BCA71BAF6B577E7A03CA4A5DC816E79E21C9B688B0857887A25AB624E2233FE8C9A80C6FFE9AE77108F44A72AAE91885BA9541939A34519C457C41964D4FBD492E11B2890BE2BE0E069D274621FABEE60934", "4545989EE35583C07E91C0FF1F5FD605F39D51A0485105A71ECAF9C7EC0748F7FE5FB5C4E90F1A59B1E31F74912BA831BCB9C95A315008F4C7C72D8AFF51DD09D9E4738E72C325B128E03F7D90915066AFC3FDDE335EBC4EB34895FB9807731EE6E123A28E815E5927BC9FEB02AA960308978D8DB5E131A22CD601D88069D145D4366FAF97FD7B71F4B39AB73A97C715BEE20A175931D7108AC1FCEF63CBE82D9CFA3569883A448220CD92C433ADD11A52F72303BB4A5D1DCBDCDEF605913D8D424F513EB8920EB864641B5833A39839822AB8ED011762756D6E16540D544B5CC8D9F8B671F19DE2BF7ED74CDF8EC9592CF1FF61095D0749A6404BE49AEB7434C75379DC02A87D213FDD6E0E6DA751657D7D221BC5EFFC8211F6C86B0F77096A81B1F60F51C23A5D525C3411DFF07CD5FCD54A60FE7AEA7E4C182885B2EF08BDE99995121FCDD5DDB0335DAC07DE1AEDBC9E988D7D90CD81D30E6C8E598BE6743D2853D975F236E6AED206846FE8F6AC9FF72C585606FDF6C25F5CBEC0C47567F389D5F317DA01F4A801FA2E2CA60344EAC2CCDEF9274608D8EA0A0D6323A1510FBE7BDF1EB8C0F580DBD3BAD17B268BB6E232B109504CFA3DBA305C7F273F8FBB7D8880303492CBED0B8AE374ACDF582A945A1B1D2000E71FCA445CAB59EDA8977E5595734A508495F2A742E30A006D383FBB6F83BFF1D0DA35805B6CC6A54BD1A7C3BFE81DCBF47021D6813B0E28000AEAA0654D085A9D5A0F0E0BEF802AFCEACE79FAB3F85E09E968BBED03B00AD50D079D9290F7E18904ACA46A2F0472E64CD16429547DA8A35CB1D9D532D4223483E7CDCDDD9E406B4920EFDD2E134B169A1DFC3F2AE54C3CE78A121F9F46F5D7BA6BFDD9CA25FEDAF0B2AD447902DAB3282AA9339C235FFD874C5E893E7E171CA838678C05936F9C9F794300DFBE63AA842A3B9541B07EF486C4823EF1EC56ADDA3143B89052D624EBCA9DC5A3A68E19F7E50E4DD71F4B111B24459EA8FB211053AC3CEE16F0D2C75B68E6F264A4E2874DFA99D6C6B3330B634A65D1B3617AFD7C32981D73C8607996F107211A7F37C6D6FD1D72B56432D66A8CE99E30E16847E549E54E7A3EFDEDD39741A55E94B1B735238093F856D8690A813E0ABCDB630747EC7A9D4729A6E0A70F001F5867E9AF613E9A0494BBBAA59CD1D75C83265E494530711F18313B0643890492BD13B49296827D7444876A98DBF99A6FDCFAF7883E02FD4ABFAD610FDD2BC8306377EDBEDA3EFE03041101A489051431B91BECD6E9DAA5633C8E99839DFE70F4C156FC2B1D27ED307757E0335EAA699C3FBC43CF47E520CA1404054F38D13CFE0339D87FC1440504AFE91AF4088820F7A1D8128ABA53DAD634250CB0C467592C27D1DDF7C64E7E5308567375FF73C02951DAE125866C53F845852C5008A69DEECA708E5A621FFC81C3C932319D15E867AFB67B1B1E07B261ECB56A013C441A7DB94523F103E93D95A7A0FD95141A6342922D1A7130ED95F4B1FED18F3FC61315A1FF0CFA66382BF10DD284AA4B54B80FC2415CB8AF7F3E686AD0664C21EE9F20070F99A8A44A5D51D8CB4BA010659C3070EB3374DAF2168562D89FEFB10100670663E71D029C2B09107611C41B202B0815DA2071256988918DCE69B35F46B8AA4F11DE63CE565AAA1172D7CAC8296B9334FAEA08D3BFFB34264D3487ACAE3C9781C1664E800732C387F9D65C152948FACFABD175C0FBA3B45F9892F8E98F2BAAC48E304EC9CB9D2A41487751B8E37F3B58F66710EA2A2CE02354B85E56EF7AEBE52388", "F2BC6298F0B96E3B736B5A6EFF22ED079C8AE2FF586E0F4D53ADFB17300D11CA7B8C2E79C0877970ADD0579DD90187CB8095278FEA5F4BD3D9123D300100AE63635463FB5019926B9B53BA7CC826A14EC4B5AA5E9B6C72685B4517A4564028FB6D5584994F8999F9AE7E59D4327FD95C2A45E83A63E9D9F04B554C8906E0E2095448F75DDB68C8057F54630BAFEF06232F7609282B1EC5D0AECFA93E8A7EF3E6FFED7F6E4A2EB8B82D22C5B9AA7B8617DC13B69386742C09C2055AE5C2E71E73EE0DDF1D23E4928D7120B8C171A4F4421DDDEE6229656295430B936F6AE18254A11612B9ECAED23869178CF6B1E6ED7430958039A7DA988C1DA03E0DF5E1D8EACB7C726A9108E5472329280184861ACFEB110ADAB5ED03ACF5EE7E806AB0C850AB7E2256F817883394177AC0E0EF5B74E27CF6B315D0F134B282EE527E32A762C1AD06991C733A7F2E23776B01EAD68363A361F28F381F6190635A6BB38CA9461749E8E3117CE4F767007E2C38FC0EFFA4AAA693664F30A5704D369C9BEE225890021DF8450EF25B28CC123EB178D113B07B99ADC4AA47FE0078EF3D750B2E600B09353CCCC8BACFF198EDD2B3C551C212D005CF33763875B3753E14B14F96847142410DAD4046C9C8340946D922B6EB6CF2D2BF3ADA92A492D2C43397716A4BFEACA01BF2051E029D5C664E4D9C3B7248A9142092DC25FD0DE44275AFFE90848463E7E68A7DC4ECDBD5325AEA355E111929BF700179AEBAE60E26AB2C6ADC3967AA55FC9A2BB1CAC49098C16CF85C569E2E4A146568C41C815C76629061A483AC30DD27ABAA1469C1AC6C527BBBA5BE8BB0541358FEAB34B1E3EDD7E37EAF307AC213055FCF44E65882CCC9A12AFE5F7FFFEF4262C19AC072C291ED636C3FB1D36D7B99F77E93A5DC2848B01595D8DD3C7DCB95075AC52168897126055E8EA8D1028AF2718DCDA34496ED6FD1D86B49BA42F77A714D65D594965A748EBE83501D963F7B8D3EF55804B4FD5462D12571B77384E3D23C77ADDBE7F4BF667CECE0717C7156623AA6FAED9C1D2ED3C46403F750951AD8BD192FCB1A7FF95A590D085E7A733DB1CA0A821631245100FF92A5B1F63F53A6D831EE041966571EBA5914D81F838FC3CC5C449BC39709A489CF31B7CB91ABDE6FC8BA6E4D41E048D5C59377EF4DE7BBFA2406C6F400232E6B502A10802B420A11316D93638A926FD0BE4A368A223FF767B11ED73E6DD1AFDA6508D4CA6EF3517CD3362CD1604CEC574DD35FABF6D5004208146C93BF179ECAE54D9794FD13C34053FEAE2E7286C964BF2B2371D9BA8AE3F0114BC138EB3C304102846E65E7908B40358BEF9F290038FC645979951AD82D98106440CFE2261C5BDB6BED587C19EBABC54469D6ECA9D9DD59A92DB30868297CECC90AA8228E28C4D1B074881B939C60D8A4530A193290C5E5399FADEBDFC42CEC5FC2738DB18FFE9FB20B7D443FA3F1FEEF91E65279460D27F6308B6B0F8B450452DA56E81D37851E8D589F9B0822ED525BAC86575FCBA54E67BEE4512A7F215820E1885F79A5406772A8241FF96533C644B1B5200FDDF4CD1F270E6EEC77324DEF0150183CBDE7D042C33DC0C27AC6F17D670D379AA778E6EF48D41DCB6C9F0F7C5E57BD0A7875D4B2D8E31AEBAA58AAF78947683E373AD517DEF236B037F29C2A09AA4D596609B7AB761FC8D7F566A6BC8840CA626BD36B1D50AF74342BE0B54475D0AE3E30CAE146306AA540E0D63AC325252DD66D5DF50AF7C1D3A651E5A145192E1F05FD31AD2F37719B62DBBFDEB84EDFE0D64490", "9DDBC6F5221BD70BDA886C59D62F7A95BEB41276DC3B5B505D883DCC478B697388421D5C217C8DD2E56A4130A28BBD7176163980EB820899CF74F3074DD7E74A77B54677A35EEEAE93C32D44EC4D2E4196366E40FD0C2A4741575ECFB8FC927142229E63FAEA97C51E12809FFD336BCFDDEA3FC03A1FE99EA685DAAB6F27DA6BACACD5D432352FC6FCC323EA9BC72FAF2569A7C6D55E1260DF0963EDD6CD3CCF97A033F74201E4390F64F06F89080C830986F8D6E90AFED3BE6A54202A59ECCEF101E5DB790E997918DDBFA1B160D472490F3CCC2B0E1C10AEC61ACC1F36BB6A8735AA86C50D2AC986721C003A2A8F1056BB9910F5A8D62D358DDB31589280BD14319C27A13D847D84C02A039B869B52669DDAD47CBEE6892E2A881A020867405FC1756DF2AAF2E5706A16F53E1E459BCDC430C26403F60B979A4D74F78CCD34E48321E67A8B896A162C873CFDEE8D58BE234C34FA20FAD472F0EB570F5B2BDABEDEA0D0483176163E20E47EBF51262B19442016EE5867BD3345DAA7CADFB2BFBF14B4EAF986951B024D876150CD64B7B0A188CA79B122F274FFB39F1EF88D5B9D36437AE8BA43770DD69E3994F8CD673EC3E1F0A51E798271AA7793CACD7E53E27A325193A9B9FA33ADA3BDBDB9A916DC8BC6188C3D4C38848E3506E38621DB57C2B0FA80BE5CA34C295159163F23ADC249BFB1ACD94FF0A42054C1A2C304F3C515B8B44F2AB1A760E784B95D9FFA905EB5541D14D5F12B4489403645A15F004828AC8FD3D8B44C5C070E8A64BA086462E5CD447C58E0D96130E9BA3400CD7AC266AF3E3D33DF214D3E98C6B7585C552979738879552FC758F04B122889E81B887B653FD7D4A8A5CCECFB0850B58CFD4BE990FAE223803EAE972D0C65A97960421D3FF5B2B75079AEB42A92E0D0EC2F04967C91CCB84FE6E39B6B136CB64424686DC6CDC4AC39C26BFCE81478AB6429D4E9B4877EFFC8740FCB5D9968ACF8D69C771E9E48CB542BA5BBF0327A4C55CC83E466D6DE0E639A54576D85A44F305958A325CE98A45E2C227AA9E85BED652F3EA5CD31AB99E299930F5AE92B12E10D597F69272ACC8185C1E83412A67CCA39DB06A77329475A3A87A1D4586B191E2E8E7C3EC39171CE6E775E7B369C8EED0B2E74A7233CDB5905F6AAC099820A227B6FA0FE5057CDCE6C8175F4CF27D70EE76CC0D769A324AD66D013A3F699C7F024C22C03B353177C3D721EC56E472AD6B383A653FFCD078774C728258146BD8D928B209C0A6A8CC60069F160D33F673C139534362B58E065F7D1176FE95F4A6DB7CC75FAA408C4FB09B7026DD640BB08945B364646D9154D00CDF5BBE432390607904BC3D70A0207F696152CE6FC5A0BD79625E437197B929203CF028384558071B625E0F8801EC1B13F6DF17EB8135687F08071DFC3BB06C8EB4ED296C821CFDDB7F2779B0B913E623ACA6E3C5FF023C58EAAB547BF1A67EA020F317658E1328FC845F65464D2E06ABB63F678A94614E3EFE281E41ECD6C85FE10ACE427FB1960BDF06630B20CF0401F450D71D3FCF0C477682FE342F5511DE926AA24E776CB9C798058A7576E1F76ABFD2C86B8C741230D6D95ADE980ADEA22547B88E607AAA8C3462FA34114DFA46046848CB10482314D1240516AA7EC7160215A54F69EBC39FE4CC97EF710BB7E8B55F9AC158B7F9C87B738FD993D2F0E35E4E9969FE5FC4B301BFCBA8A28D7150602ABE7635A2FB48AC65EA29B829DAE037D8711127F80CE85BE003B4F94E958E493D7C2236DF970D7DFE8495CE083E79B777D44F96C6C", "33282734E9BBA791CE9CAA5CD9F80DEA9EDFCA4E3F5E32FE046FA978612D25F79FEC5DCD026666C35CAF0B5A682C9FC6C97F54BEDC056A6D900DAD88CBCA846702B0BC435DDD5ECEF1D3356E85247940A3892CB61BC8FBFDAACBC1DCA9208DE593DEE6944822EC80F823B2ACEA3FFF66E4CD6F542CED77C81F29F144C9D0FCF3B61C4887C6B42EC97C83ED2C5DAF28CB8C9B352B37255F54835EEB978966A14AC91D58857CB7FED677EB87F8556B343BE0056744655B6D97615F7F32BD4A537D8D586F477EF6B2871AF0524F71763748C57DE63D62D6824EC5075498D492A2C621FCDA2A5540038A50E6765ECD69CDD45D10153171DECB85AD45A8A6D3C609E350023C32E1F72B8D5E1AF803F68E288CEB2F5CEE3F10B7BCD7FB15D11DB3445266BDA913D5930776EEA4446337EC5A50F9E4CB230BA735B656EE26BD6BB5632B907CB81BB65EF4D85BA379E4C164DE83CDCC023FD458606E09552303B8535B63E37FF038F2AAFDBBEFAC8BBBCF04EEB41BF126C20C533DBBAD8FE10771F01BDD14AE113760DDE4C0D71FC7C29EB8D23D668E401B3A026C46913E2F08DF8434FF64B48036A37166F32CFC8747F13B656BA6D18300935195D0411E8B24E1F47298AE9F9617DAD3F39C4251566CD92A64860949BFEC05EE2EDD7F2DA0FFBF3D3C9F5A349130B7A5BC5B839000431D00FFEDB344C0DF86073F73C6833C091AE132D121F4568D011BA0DDC27DFDA5284478F5AFF037D89DD8EB9FB0EC066AF20740DAD8D29C1866DA0998E580BEBD311BF6E3BBB31D89D2DB162A680D2AFAC4903F9838B616EEBAB56C2D0386C65CFCA946D33073684FA119B2A6411E1786C723A466C7070E58248ECBE1D86C6D6CAA199944D9944BD6E8B108060B612F8FE724742DC158BC1E5E3F71AAEF1864A7989CFC68CB2396D010E1485C3238F6385D68E20D36A4D3BB8A5A265E686DF558A73020588EA16B4B0D3F74916038A9954F75232087822BBD8831222F7B94968C5A324018192A6377661AD1E15FF05AFFF75FF60B60C5B41C08F001D85A237443EDF3E361030FEC44573B044CE66F7A036EA78EB83E1863259BA363D517049B13F61956740B1DA3CCB5C9EDF190C89A2FE908916F9DF9B2BDF0DB50D032FAB059309F3DAFE1723D8031C93F9CF657F17D1B214492786F0D297D3C4C01A25DF2B1C3892B6724DC7CCA704E9AF0163D37F91DEE0850D9F2AD4860BBD2266FD7EE4E3D56349B90155BD843EBC0899FAD39C67050B5F8A1A9DB38EE821EF7561FCDCD6F833DD3C9FF3C5D978BF7E70288BBF665F4F20260A74DD0D414B3538FCA93671DB4371F2CF6AD94070014BCD5ABAC89157836CBA9A34FC8D84090A3BACD7D641C5FF58A5E1489E1D2F410E65650AA30D7FEE4AC3AB37D5AFE208EF3023E88D96F4760120DB5FC705A005976BB27F580CF5C10988BD2221507F8A6BF84B19CC3BAA186050870D88C6B14F98E56CC470291FC96AC5BE10704CAFB10CCCDD8E3EEC9D58E448BC655A0A899C2FB39073CF28252FE3FBC6BB61189B154EEAA37A797A8E6F329C64DE5836EA44F7FE04837E343963FE89B0624779212F1E5E399427ACC8BA83C10F3893C7551FFFDB62BE893DCEE02AC893928E81A080CC2EC8B95C4FEF1A6B65723408F12F6E3B7B384B149F4002135EF114B67AA3CCD406A78A732374CD7C72814BCA01F4D44909E6CA1245B25E27A67F2350D285E3B37218495CDFBB9C7FBF2C40FE31C57702519B5DF1D41D85F48DE4E46639104445FC2C078CFC853B25BDC3E4C58222B2F2C5AB40F5906C314", "6E2FCAD2FBC021102FBD4F992C597E4B91D2AC56A22E8FCA938D9C74533912782F75670F31BADFEA83FB93A0F6D449092FCB9236F50446A4655586FBEF31323F1795AC3216315BC9F4C92FF583AF7E977A996F10989067975A53E153364B59662B6CE9E1EB65D6D69B9EFEFE57ADD58A7921506C2BCF4D51A01F79A67D41436B519D314D1953C6D133305AC06A45428C0D6FD9228B7B9228C3A2C03EBCFAAA09B9343C736BF99022D1CA0B5C25A6179EC0ADD8AC95E8D6C00D6273AEC61E1196741DA2ED9436F353919A8D25BFB8234DA7A2229CCF0FDC4C65CC6C0374A4ABB918E1B5BC7B929F6554C568DCEA62D5289E45284DFA975D5AF56609EF4DCB3CA54A26F100E00D48446C4C35D1D911CE7EBECC58347940BB411F475ED18D8A1315C069C63E59CE2F69E6F7B48B005107A69EBD9715303563F6A217E2ED4CD373648DA437E10754CC5636790930947650E6C5D1B3D1AB853A52A89D208301C54F8E7DA8D419559555859AD1B4D096A1805DA251B6767DC2C0D917919E119E71CC78A884A24F5061CA1A999DA65AED69CA02C20B6EB163B2CF435135D3B34FE6EF52F3AB84DE084E37958BAA4EFCE8165E2F5AAD1D84E9F7669FEFB6E60F1B9F69C79DE9296B7A01BDB04CAAE8E6A16ACF9A119A8E577919CB22B58EEB7EB289E708F229ADF81E2350B211AB48043A491D4CEF1721936B71145F07A40947D2A89A584D5D0A708F3480F0892E331B2B73D8B7D88B7E85F73DBE5346D801B1904CD41A8070A0DC74073217AC415654F4170F42314AC0AF4213CBD28094F8C4FFAC06BB0114B2C1924A4A1B7655965468574845864ACE82B8839036DEF45E88F341A5DA37A511D583C51DDBDD51577488A29D7663CCA7AB2AEBB53A4EEE7F38B8637C96CDB86B23092FE0CF669858C5374F6F078FCE4E945FED340903FF26A6AD6C408E390F08ADBFCA9646CF224A5410D0ACE93380314541982A8AB6443FC358B66B027A15722A0BB7C61484CA65A62E4496053C947D5F4744B69B4A73F7801453FE20557224878B8FBD318E8B572911D09839FABFC267416B4E2245FEEA6967677C1C57A3F72E76BC297CBA73AA729B890E90A4B29CCAE4DF5D959BEE30D836C859F4F67A06B4A479954CF20C7D0639D680EB61A2CA11B007EC9772293EB8E6525A56CC0F380ED4F088D8CADB0B95BDCBC84C0C746D4DE3307AC7050FA2531FD24164D29294D492A07024FDF1B988060FD766128120226E63F4973278DC9F07FD5699A1313002CC9FA7CB44A72C9C9D740AEF0984D7D4C5749F9071138BF93BCC6DCB601CEF5F60E4BF2361A083D158BE93134DBC1D4FC79FB866B0B215E230713137EB6BFF388307CF2F07CB07E974C8A874EB20B06C843579921ED0839F9454DCAF71BF56387E01F3DDCDBDE6C15C58BEEBC137B673F122179100613D6708B6B16AB750A3A311AC85E795FDBA002CFB2A9D9734FEE1922D984DA9F76EF65EBC9F647B280B0433A3C2E73B08A3669C78CB9885F65E97A6B4D64D2B3A29184EA87163B06F267FE94714977525AC061BC54F7FD95CC0C4285E45D75772AA3543AC00EAA32626CE2F9DC48862657C1E156E08136F3B1EECAD329072EE4EDAB16F385D736AB806157409496A9CBFEEB3F5AFC91E2FC5569DA2C5DF20FFDEDEB6BB57D18AEF1DF03C7D5A16BACAD645772C4C016D147EC11EE9996D2E791C5251CA8FB7719F2093DD2E4505B7BF320204556D06B91D547C9C6B0B19FB57608934D4A4F748FD07F3F57CB108A310319F7835C082FAED651ECA42EF823AD83D6B22375B20", "22C6D5CF65DCB08CFEEF580D53CA6571787AA81CDD29C4918F5EFAF89E285A37DA51E01500BA0192D2F45573533F540BB1569E27A8865FF94923B81AC26FAC1DD03DF79DB5B5064F84A2B15E0BE7CC53BA875E477159D0352CBFC374B07573FEC884A699E93497514E7375E49FF5D9D9DEFED637DB89158F30B27E802EEE4E806FD61A46F8F7D7AFF89C9101A9375F73A2164C18B0109CBA1CADD42E13C9170378E28382EDFD85B80A02469D9A78637494BC6DD284557ABCD5756225EE3B26C7BCD597E9744FA1674C5088D3301D779B1C3A922A0723AE1BB253EF2BFFFC99BC8BB4CE539BF6D2D0951F6C76BB001B48E52387C95E49FF1A9D1DC12FAAA2B967754113FE59822A1E5C56A6053F73A2CAFDB0CA0B58312ED54B4F9D1832FA089C5923133F47EAB56C56EB7AF20D8006EF8D9674089CC49D37E82A1FFB88C97C3267569B5AD1A57CD67A0C94219AAACEEF99A11B28D01EA4329568E42A7E717437B030D3B649DAB105C700F30AEEA7B82A9759ED54F890C6E9B2C9F3F1D1A7A14A245817DDD4E2343BFDC5DE774EC60C5C41362805281C3019CB2915182F525576B3BF537FDD5236300DBFFFBCF8A8C9489B1A119D66181A79AE93E7DA8AB81A1A3E8D5A888F5144AE0DEA33ED8B7B6392B789EF9C544F876D179DDD822E3906F76FBD579FBE27B4A2752D4878962008B7873765B9BDD3FA581FA192C0C422C15153D7FF16F2732EF68B66042B5053E458518EB65C66E3955CCE4AA212ED4980411D3E4BDC6918B30BBC400A8A338DB982CF55F2C3B0C3DC6D64DF10A8CE1BC117338DA3987965A5EAB6C2E8E368F59C7D9C77750717B4440AADFF57D0EADFEE7C1A92EE72283D425BDB0CFA9F3BCF602634BD8526AA80E0247BD0A043D277A3E575C1D1EBDC0565330FCB30C63AD02F48D485AA43358D957ECBC6991D0358AFA953A41C67019E96576BF88122CA76D2804B73EABB88007A121BED76F33AE0E0433EA74FB2C7AD672D0DF5927D87BABFB30989EB91BBBDDCA40ED8BCAF7684E8EC9D1017D6147039D3C3423A9A0081A17B70F56FA300E8F2F97C399498F4AE85FF2707B50E3A4492BBEF19E14834B261F700DF4E685DEFF476ADD919D5A15A7BCA06F382E1F0649B6934D70A80416F732552872BEA44A5A42D64844532DCE8ACD5D20039D397BA9EBE04EC4742F4E2DCAD29F89E0A9FF572579237863890DD13E7168CF2B4CA8F6A36B49A5734BC85F811087B9541605F44FBEB3313D3B56EA13676CB69F4FCF14A1BD285455BA516F20B2B0D3E8922B71C0731F2BFD1124067D4CEF2111FB754CEE5AB73DF629797FB5E012515609B1E9A2085643691BAE5E4A2A52E904651DDB340090EEF578675B778D1E6EA868FC1106F19B0435BB464887DA311545300841E10441E9316656698C879089FD009D3F8F49097B6AB6AD2D744AE79F1D15F0DADCA70C1177374ACF5D07979CED4F3173FA4ABF571F6DF2112E8AB26C257D6861923CD92CBDE33683F27D2CD542ADC623230470FF7E950475EDB761E57ACEE78318FD60325B871936A51FE23A63C9B4B7DD8A72556311877DD6A8EE053D6CA28261BD359C0C997F2A184270847A13FD3C952741C5D1C47ECE09DEC3D8E0223110A627084BF826548E60886D7EA15C585F5A16A813F030EF3D150FE7A4D271856623D96742E848F7797526238E56C102191600AF7756C562A9B627B1F05B56FB2C768F6B57986BDBA95816E0842759438E262FD9BEDAFCB594731E9A04512A22D1EFFE104EB8F7E502B94FD846C71004E534FEF2A30812F84A8", "E881D91D5F8EBA0700605336E6BCA6A1B1BD1D58F39650CD55F056FC8360EC9A2CFD0CF440EC2C6E98EE88E6B31558B838EC9D473F75CE2FB04155330C9FEE2C381F872C3A79331C536A05C766124E69AE1EBE9425387279FF9FDCD28CE6569215A65F678611C96103D710E45029521D6EF7D5A2AFF378C9C26ABB52AF1ECBBF615561932791A23A3BFF2824CD3810EFE7143A79B4E14132E306C48D9B2FCAA475A7D2AA0BAD046314E5BB4839B27FF4ACB7F4B3CA8C97CE976F11DF6DDC71144A600DBF9AD43B6E471791CCE636D67CED546A377D786CB085D0E4E91258719A9233F342180C9A827FBAF77C8B5C1BF72E9A81E4E4908EEAD39772DABCC8CC0BEEF0812DEDCDEDD7B4110C6A0B89484C2F0F6CBAEDC219BEBC85903CD03AE727B1849735F62B385F4D5CB58C527CACDB3586AF4525BE1CE424A0879546505F86E324EFC4FBB0B9E86EC243432866DC9CCD4D9FB258886EA75AB006D87CA5C10B5BD0E0CC4DFDC6B152D65D5FB268DB6AEAEFC9EDB4954CCA7E88DE2269533D54AAC447124EFA9BA62FACD2FA914885C162D59BC6BA2FAA3389DB9AEA4C350843B3361C9F343955AA616E661ED1A137EC0BF957BD7DD7105856499367E91849C99F0F7138CC7AE120CA36164658BF3B67BCFC1BECDFFF49606448AC8B38619EF4A997AAA688D3FA7FF169B8BF537314CA8ED865F395E300E5AEC2CBCBC5A8B5AAA31C811E3968FCE32B82CE5EB1EE839134EFCA68E4CC4C2957329A7CAEF675AE2F990CB108CAE8EA5EC21F6C442CE1B818ABC203327087146D67275300868B95052261AFCCEA3EE854F38DE7CE1FA5649AD7E9083DF2DFB3ED4186244045390F0C843777A677B8A82B69EBF43D8FD24C9BC0792A2336581F3B45EA6F8BBBAC89A0314570084D683C76D32C2B0A6868A428DA7D72D9C6D37D99BC05D14ECE27C6C1E3F849332C1CD67381B6CCC907E1A911D3C97F1B40CC11822257491AC9C22642C4FA2CF8754E6AB2574AFEC65062ED5C1E914F8DADD52ABD7A9D74E545C362880F38A567BC3E6D7BD7156C87F698C870008C2AFC78F94354C2DB9833A0635E2C63E5A47A828610E2A5E8B2F914306C966D1EF8222BD8FDA2DCADA05991ABADAE250B942F8FC82AAC026696D62BFB27C8731149C49114EFD2AC47250E0454E33383082E7826569AA4D6F5661A9968C1A784E0A080D6BA7F8956E37AA55C07257AB5971E03069E74D245C4A2A0BA0BA397376141FCDD486B2B3C865E97D1CC327E4E3320A131A91B61F5A78AEE77D1DA75A1F121D777DC4E3714B0B515DD96F477E9232472353FF7FF07B0C23D1C88F7DC4516C36B3D1820AEFFEE62EC3DFB6143630E1C532A4FC9740369617E80312BF3CDD7E3723F287DF666A34FEEE38B3A1461E1B5FA03907125359025AC125D6E86FC6AAF0223F83F252AC0C6D578DDAA8A2841DC35AE6B6DAB2E7A31EF4282DF4E20D471A3A8B28EC6F510453728F981D7BC2F1BC2A8E024FA65BE18AE8CD272B05403E05C6006AB1E612CBD9F8A71C50D618E9FE46B243AFF2529F2A0FB42C7B990BFBFCF6C4CFF59DE230EDD411BC93C398C49E76FCE8EBA3C2C93752B38886162745ECF4F80EB59AA3F3660C4B1D4B9850632548A6D5A9F5A8DFB5A74881C0E93E38AD2FD1F0C23E66AE4631F25DD442E1A010D6A04FB73559C76CB30494352B24FEFB1E529BB6407BA7B68535D06C7207B2126A585BD59C43ED1E36AF6408E33EA1CD6F43BA41401048AE9C5638077C8AA8A033F0C18E5899A6E9400531731486774E30C1A6292FDA7D06A6A48", "74C4DB6B3E8A4BDA889FF8264534407C16B05809DB70004C8EEEB10156C32686ACC5076D21A2F583EAAC92954996BFEFEB1A28DD699B55B5B94A122A1349C58DDFEEE9D4270368DEF85D86CCA4FFEA81880739A934BB8831AD75794986D60A92AA6DE661ABAB1010F3999A57A53F3868026C64307C47370E0B82FCF8C02A3155E787DE359624510D5008E229E9DAD0005CFC9DFDBE5080BFD01D7342E570360E411FC27146147EE2C72931D0577CE6D7183386C754A6820BA97BDF080F6EBD063934E13B005CADA4D2D8492E143402C9D1BF8A04077C4BC7314532474704BEF9D24E4566A1409F085C76B65158E4EF6B30141DB42B0A96454E451BD63117428273D3629E2E5FDE4D9E53FEE5F9EA2F111A0FE5F50D2B72DD26E941A57213EED915147473D630F7556CA46FF8EF1F0C88E6272D6E95FD3741AA675BB0ED839BDE162F9A308B3B092663B1963221708404CE8BB54F61BE9AE987344228BB60921726D90FCC07D5F64BEF673E06B969511E111F0293BC5E57186B283AE81CB2803363A1266E7A78B47F5A35AAC2FF0B3A348DE73C81D74E7868683918FFAA42A91B89E1E2AFF4BBE6F11867DE292A6FAAA689CFF87F4A629FC354ABA202EDBEA3F08609D1A4C350A7BB7376A897AC15A1B0CFEA0D35DA71039A97B8C99A5367DE46C338D75A845A4CC7CA292DF57F2AD8C5E20D95670E3748E8A1BBD3D728980DED4FE0DEC90884B7A528D0B4C27DA315195B7D8D8CCAFEFEA3D62AE34B40F5049D06C3AC92CC59A85C5D5BD04DFE0CC89A7DD7A1B6AC4F5F3D2AD8858B83C761485B77F6D512DC2EE1DA402FC6158C644F14C2F6274E8113B453F9130BB6C24E36BF84C2942F8B28A3914110BB3D48DCAA3ACB1D7A89769E0B9048566671760AD83BA7F7209832AC10FDDC299F7F90A3744F72ABFBAC19382EDA24D0BD5859634EC3790C7390AC2866B1379ECEDED50D5127324A4EE6AF50D9A6826DFB3E27B9922E4A8652526A6DA29A4C2B9B8465E3F99E72A82A27645CDEFF1C42E77359FC913A9074516720BC61EB171AF90AD427A574080970282539A05471AB7AE2EB027DFD3D496BD27746D0ABA30EBD9D13AD9DB6D405CA19EEB90CB088D9CFF93B20DE07F86B978C7FEBA8AC29FD4E257D23380B955CD79E93E3135BD14AA338FCA16560A123131DDBA8A2B63923860EC3EFC2E0339015662C3DF1E837C879969573E0DC4A63EB7C0D6E7419F079D4CD05A1A9791330F1F1B7EBAD8CE76933D54A224571796A3A046116964B98A7EB5D9FD8311CDD6BCC9B63F2B7302347C0D3407219228BBA73B8B53DC3645EDE1969D345D8C23E691A58370B351BD6C86EA6EC9349D524BD05D07E68F853FD9214414507ED507F0E3CED126F95630FC6A3B40152A318278B8605F30C389C1826478635753FCFA9D227325463581DC51EF4AC47E1C49EA005D5AAB9138706671D64082F6E2BC39A802685BD8EE8001031F7C56CBE5FC68CA5B14109249C210B4ED7B9B2ABB4D4E83C9EC82911E9CBCE5DFAC8D4A1A6CC81B5378D29E8E339CCB31B85D9DEE3080ED75057CD5EEDBEDAAE7F3CAB4BB1BFF54042E28C8CC79741FB04246ED66B3E34D83F08D98D7070D3D6A032BA442E46CE38F45957D7485B17B51C562B94985FAEC8362A8D6DE43FC0EFE1529E662899F1D21BFB643C22293E0A0F2E1D40EAC1934A0421C1617DDEC3D40A3AC9EFAF0F8D94FB7DEA085C8179290FB4C917C7D6F8B75DA8790404F8191C0EEFCFF9DA2208E7E5D382B5A9D1E72089B3C4976036AD530BFD31F6D08C2CDE5C26E68C", "13AB0304EA5EC4D96147EB5EF8AEB8FDEEE70A62E36686ACDC275D2FCA1ECFCAEFDC4F8CBBE5BFC2BBD343742EE011379103102BC11E824732D147FF93CA6C9B0A503C49BB2B621B47D4C5971643EFC01E760EE958A9764397AA551423EFD49AEC50E22FBD9AE99659E36341361286D8452EF70C662DBB3A421898FB34EDA3314A1C7A6AA9E9B5A6960156A549C32B91246A9CDDCCFE0FF278C3285A5F20081EE6FE121E3CAF922C75915DA773D0673EEBBB268998861C3018642A6A1B1FA1DD8DD54991254067B4E9BB95D1AE807B8A41B88B772B5590FA9F0D71093854C213283093D5EB9D4C7B1D57DEB27B1E2A1F0CEA306B28A5DD3D1B23EBB7494AF61F771052798C6FA104940EAA5698AC24910DF692D5C89C29F318E090F30CB12397B88702418C467EAD9599670DA2F993D5B6FD7A9A43CB89274719A2F1491FC3C3E1528EC00A6D3117C5D2E0CBCEBB7B91881CB7540809B5B9BD4DD37BB6B94133504981829410B4F348A5A7DC553F089C5F759F032F0F45C13991C1F442F2DAA5C43C5A6815383091ACA7101735A0A3D8E5E88A454067F8D92C4090DA1035B7880A303125ED48A5E4EBDD9308BBD45B77BA6B84093210D9B011E3FC5313F2CF1B20A9C08D3F4D8AD7003B32A49850808F1B78115D1E727A7BD387D2D4C4CBAA4CB94CE71FF25229B37BF1D671CA50A04EFCACFBD980263EF16015A97909BAC6FE4F981B96AFA2692CF3603C5C655BBF7AD4DCB06CC3BBF8BC819CCF20619535D399BDB5FD0D40CB261FEFCCD4B0B0FF3684FB0D992ADF1AC6046BAA8C8E0F16B6E691A23DFF7014AAA67C7F84A9429064139809E1569145DF3CD8240D49BB9D9FEFC2176C697D9950F11D56979DDC01ED19EBC9690893D6D8E76041BC4FE35982D5C535FBB883654FA3A2253D52F06B62022744442D880EF9DD4CC2141DD25ACF2EE3B26103D6A16710D8BDCD43731A59DAADC1B40092D9B166E822A8A7AE0B4323B8CEAED7AC3BF3CA6F24BD79A58DDFFB59FC2E5FF634C83F6F7B03441DF9B5763FF827D4E74764C3E0EEA21ABC1AFEDFC2BB9F73E3FBA165A7DF3ED9997A588CFFEA8E3C193F505C741C1863C3437A80B41B7668D12B0DC7CDC6A61923C102D3D9071D9937F36A39484ACF1A2497F238E78A9D8C9C1B96CAB0AA15B643B81F6C5439C2336055C8DE4A392B8C110753E060CE92325C3B67F0610D79D46F2E7FDA96538D43B09DED1D647E8289986EDFF482FF7E24F40FD489E4051F7D0C9267E934ED16B13827A8C3D47C192F5C5FCF6A8E82521B7062F6A23B463262E425F4820AAAD8E23E85DF0448B00533FA29FCB815BC83AD29B32D12F614AF4A6C60F7F1339E639706C4C671B71C99B55056832544A23C996C6BE5230AB5D8AA6B89A0E05B4235CEB352C70D3787F740EA6B8F05CD97409EEBDC9F1F98E428AECCB124F656EBC316664376CA4B38046E5640B377457EB82A5CF0E81966865908DB4B1E9B482F8740A470E4F5F0333A11E1D67A350ED7BD9C8306186E83FDF6FEA9A09BA1AE266A24AB6D3C192A4DF53D0A627EA2A2847AAE9D5EAB2DB183A45632B2145C3A2FB9C4EDCEA521E4DFC5AD34FB6E2CFC2E5C38B30996542C09CE9542E2F692B863CFAAB27FB549BA99A1DD77CFAB7E26057055737E6D08E5592D17DA8322B0DB650AFD6ACF4ECE23F1C9613AA7670302428512238E608B6AF8E0862452319E3ADE719928AFD059A58D39EA819F3C14DEA608F80D3C93E374C2170D2836E2EE9F600A010B97418B52CEA1592F4D6C4E91547EF019AF4BB4F1ED010242DC", "1193230653E34BEC0CC617609C775D5DC198C2F533BEE5C3537F381DE8AD1995303FCEA2468BBE8713A3770F59EB4F58397BF63DD3AEB17BA59D1D906C853B6BB55030F2E0FC04C0BD746B755358EF16B44A6494E65FA26A294D25E7567E7ECFE7A830896D9CF2A8D97DD5D6FFBC521907C1677F195AE7539C564DAD1D78DF994A3F33DF3F0400EA6AD3A742FE3EB8A1855BC78F5E9ECB5F6E41A13E2411902BA48D0061D318C1D026FD379C5E4D9ECC3FC5AFDF0ED8D99E35FDBAAE7DBC9E228411D203FE2645169B3E8144F508F88D380EF8F9D6B6B7696CCB9041BC145BE25FBE39017DE8120DC3989669DE5B587E5F2C5C057ABEF2195F5E0AA441E05E256B5BDFCF636350777392CC1D5B5BCDD59C82BF8F3F885C86F5E6ACED0F0BA503944A9E2F15E8ECFFBC5B2C1444776A5FA7DC54EA0B1C9739E21E2ACD85DF739DD5761C17D71444039B3CD53EA47D67E8E8C505C39690D09E52127C8F055521EE8BE8ADC6479EC436B96DE2CF8784C71B585B1EC1475F16D92DAE9C29BE7375C527B1CFCEAC5FAEC37C3D892525FE1ADAA164E1E90680EDF0876A0C50CEC8123CF2EE2CAE3C35409ED5C5E6840E004C9F69918AC8B39899D0B846590F17243210FB32D3CBD4E3F8AB4C7C42DACB17716CC5B330B009EABEB31FDBE086602F370EE9172D66A8B4991CC56A0AEBAA3A623BB37EFFDDBE273DCA7B0C09649B1D0CB5F811F6A27ED3370D1A1E922A70214AD71C2668077E59C562DEED43C282333BADD38CF3B01E3C1F8A55B3822A7D41991CF4E4ED36D2D7AD71BF6BF100643EDDDD23B6C04486DF1193F552EFE21BD9B5A6A1D93D4459CB147647052906599533AF69D3CF1ACB1EB89EAF3004B2E4CCCF6D4CE8E3D6CBF8BD90E6D4637335D5939A3CCB8CBF6F6423388FDCC9B11A159813FABBA39263F337B3856B0A6B3102D920AB5D216FF4D370C836A85B753EA0E43E2D9E9442C9A4E64A061A0BE7CA61B67B0F012CC43E42ACD298B3057F9CD3089C59B39200E8B005772AAE2C2138172DAE25B7D54FCE9C6F8A410C50079012F069A9A7D6581CB6B2A3EA9E09E4F2C1C57BC9F127B4EF8E39220371EEFEF0254877B19B37E0785583683E5AC8062B438889130038ACD1F52098E5E4AEFC3717016321C263B4155BE8418F22E523F514B1F8BE737449A48EDB9F3B38D55E9C26DFD4C8BCA111D162DE23984DF208D5AB1B82623D2A4F4E3A104E3F84F65A020BE96711BA3B3BCE7E6630F8336B16EAC987E8FF10D97C62E9B2B1B10AE466451FB70D345A88A549967C367F6DC1C87D817EB7B4B0A5032E1A72D2078AF3CEB8116B1BFA0BA64F9C1352577BD9D0C552084898EE52AC1613617DB42209B5A8406DA72EBA89CBB1893E69BCB0E0058E4C227ECC507108152C248ACD033DB3C276E77D80AA7FB7C7D3ED6DA7CA79D469B1F2668DF1278FDDFD20CD02668C429CCB2D64E6AE7EA6C65A52B49D2A18EB48CDB26861AA872D74D51BBF34C56F5455C98E02AEBA0D3E658FFBBB82960205A1ACC2988D274E74A3C885F1E1F0660EEC75EBF839E8E3D5057F7C39DD8369F9BD6EC41A918BC8A42291384E2688F20A7B78A96746263991D57BE8BB2A516D9FBFA2028EE46CCA591086EFDA8C97B2DF9CD939D99A87A0AF0AAC65ED40B6551E6F84E699483CEF2C9099693B895C475C52C56598AAE7A9848CA6AF2E7970FB80768704209F117776AFC230158067B52AD83AEEE587F81014B0947A183F629D319FAD66FAC270A4D115F469833097897A40F185687084816F1D2CE615FFCDB27D060331F0", "594886432182182A60A8457BB3531920208BCA5F9B84F988DEC9D71119DEFE0956740D55AFCF2FF33EF9801B2C9EA25E0565F587553A9DB639F3843EFED712A9FE49D67C197615E1930423A24D464A113C76A8545601964EBB9AF89E236A2021D25D5A4F71E592716BEA4B4F9A9BBD46A835D49379873CF2B0129E236DBD2E510F2CE164F08307C4EB11CF12AD26AC9ED8863B0EF1FE28D2FBE71859BA4340B13DBF103F6A1A855C4D51717B4B6435E6A34F7122AB6C214028766BD398C6A03AF19D67D7E9CE96EC95FF00CCB56851289D52FC2F2BBD6CF27F8D7BEFCE6817A52FC06A468C0BCCC6E27581F11A9394226D7EF8E1E7FCA24295275042F14FE0BEB7C1BFA5A1161FA57796F21C5860D6CC3C9F2D28F5C3EB0F18D27D9C512A4C7D3A3C8B55E0452405643091F679A9352E2B3EB74C0562DD08A45339B1517339C19B88D1E6B13E341C7B932D3613CADCE8B349EFF25DFB15B9306B0520006C72C01B8E1F5D625C76778DC8ED95D62DBCC655500EEFE96F90C8F5D83E4A9FBD2BE87594B6DE62DFFBC056824A4E4EB61B6E83AB9BDFCC9804FE3E2EDBB788BF3E421E62644BCF44B8023213A8FF374A14B8A1EEA61830771C6E2B48AE0AC68B14601D8AAE182A840F98198A8BECF4EC119EECFC5D7FB4D2920AFDB10968F70E65D2C8D5C8102DF73BF6AB44BDAD9B8577FAE45C83D76A3C6E425664131FB3F38E5946B47C0C9444416877D9FD7F3923C5EECAFC435FC17A806C13D79055844164A8216A605615312EA5792592AED524608BFA44DF569B5C6DA880DAB9C2B7CC0171C785ED77104E08B61C7B7625E80EF034EEEF7E13502CC6510A8EBEE8D7C2D6DD85A6DF2D13999042C0B3E78C0188A741B399E212FE05053B9F166EF9B876B17AB413072CE8DCC6004B99233B73F1E9C494B23457767C2197B101D9BAA41BABFE33224B2C1C112E1C3C5F099320603968AA648B2792E7D0F009C1C7C33D6CB5B94CCAA72F7CA5EECC827F34457DA961B39DD98A64C0DF1A1618DBA84681657E108C8620723F31F04728814055924B638319F13011EBDA0289A0BEEB732ACBCB71FDC411B9F981969023F6A3F8411D9D9681DA28DEAFFC84195A442340A537244E69989DD7F5A0F9A33D9ADEF27362321D4CD3A6DD3624D98E8DD1709C3AC48167D91CAC26705A549CD2E0C62621BC275530EBF37AE97458C3CA841E264976F2CE212462AED47D5A0F6EFB27BB657D47BF6BA303CD66FBB1C273A83EC36A4A2EFE2AAE0CE1FEC1B8740E83A73DF7A3B24CA22BBFE52584824445B2ED95D8B8A0BFF28DA14D382B8B54ADF00AD82B3CD5ABBD4935738679DE633243B4C6A6CFDAFC43C908492CAC991FE4000124E0745CBFC21FCA91FB90E6F1183E5E96F67240DCF790D87A569F6603B185DFB5524BFC6959F717891FCDF39C7B66210BA5837A5645C62777D83C07125DEF9E6371991DA53E79A7B5767B6FA08450A806B2E2148B50F9FBC79FC66C47844E3CB6EA74C7DA86F313BA8C54F0FAC364F5C0D49F2C10238D44446AB58EA8FA3B5A5F14ADF3B9FF1AA225BACB62F3BD6028EB1066D7DF265BD210CB4EC7DE71CF028E354FF81B76E3C621ADDE054CBC1366FE069ED6F99BB74DE007B9E2BD31D1A96536F2260FC137AD11C5D2C2108C2C8F3C893F4A6C4A7FA2DE0AAC7931FB85C5882933C128A9C3191C35FE3CA022427B6AD9447A09B6EA0AA9AD70916E9127900DF0457C6B901FA2740353988E26E4B9BA1711E451F375029FED9AC02564333761603E99A1B725136B5494538C88FA2357FD7D9C", "9F4D899456FD3841B890A61EDAFD40C7B43FECF9D700EE269E58F40BF2CF47CC1C1EC7F28D78909A53C7B79C4E6AFD275BEA739A3617E8B3C3C77ABD4EB770B9E663BF154E77205ED1F2C5669CFCA18DA365B988499547B2C36D4A56582FC610E06E4D43E54CAB563B7E5DBD04CD04EA83DA72645F1F26422D416AA26CB2AE11C1EA270CF7E7AE3679FC2D69E012F0C950FC64A56C7B766F909526EFA0AC383E4A28CC5C52A26CDFD2C3FD2AD820EAD3885DE63114DF5D19A2EA6C2BB338A2171C73A7C10AF41A9E4F0E49142B363AE9D306378B3211CA3B0F21EBA2E72BC131459E9D05CECFC76D6E540587073B0CEA1EE973B56EA2E671353210885EBF3A6465C1D2AD12C89217F1ACB1B209552F1DA1543293D6D1D273C4AC5AA5A4B9D2B368AA82A7FF8E10259FD1FE52BA14F45A40F72B75AB7DA9F73DAEF5642CC1744E6550ED6CE2E547F33598034E8970A74D7B1D58FA2D4248186083BFBB8BC1A34C744B6F08AAC374C28B1C0F9E8C2B220C6EF0B5C0400D3B725005A711EE66FEBA353778ABD4552DEF9E5309FD0002FEAF1F3C5AA3753CFD7CFD62907CAD3B1F68071C01886748201050E39EB0DB18240C5D598D213CBC508B8F0EE7708CED659CE85BCA8BE714DA5A607E023F9609EA3D790501C4A9969FFCDC7B3E7317F6AA6B99CFC32FF1B74AFBD42A9773EB0615598C943BF55C1E8AA3B85D5D2EA2892CC33FA809D71621B02D141C74722397318B8CA0F4F9DEA01096234025573995DD2F915D35F7EBB6F7F3A9E83C2D23D769B639042FC669BE9778390A3E4404C04FC9991FA6860AC811BC07BCAE69756FE9DAB27B91B91C51892D61E94DB2B486C25D13C225810620023F1B9FED1E89B002B7B11A609FF348867E1CFD827199A5F0D6FA267F60F89B09B5A1D8FF62744B386709990589D0557F5EA477974CBB87A86F2E6E94B758607454E3937A539C85569B5E68ACFE4911CB053CE207394B686B962A7487516971740287DE8C51CFD26A14AAA3D974068D227089093812DE910649512D966CB97FCDED09F4BCF7749E16E3391B75A4846F65EEAABC5A1CC89B1D9D52C541DC65CC468B27493F76F6D68AFFCFADAACF20BD979CD63A42EA3B8961EAA2F731C6250436A5A739D3E015FB32E07D373FF650CDCE417EA85A6DB8A9A24FDF62487855DA1C807943154C162AE17BA4E477531100431D647F2D8AE76DEF070A0418D2365549BC66DCA95722801F3A77E435205E919B4B349ABACDB2BD111087B05C05FF01E4BF04F5685665B361D37634855BBA312E96F2C6314590E298770C3CFC4207A0FC944622D4CD7280CDF5AA241232B6B5E78BBE5C6684319AF624124BE84CD2F1512E89D6CAAB620009206AAC993A9F4D6A67859C20A8B9307D8F8E370F2E600A9B363C2A460E0DF5AC007EE110F4C088CFBC2EE82D623D5EC42DB739C2267DFC81C830244A6DEFFD4966480D6EA8D258FC047500062F42446230456F9B5405610863500A8AE2440A00CD16E5B6136B0BF1611345CE7D70319962896B3F5E69583F8D305B760E0ACFFAD762DD06C54EBF8075C1B0ED97FEF59FBB48A7A65C2251DA406D5E9E5F67586C64E5F8FCC805DA4F33BB583DE2D5F85A348AFF0215233EF88C310FD1343934F5AA2A2AAF8F58DED34D0E35D210FF01AB4114E18019A2F7D6927FD843F842AD6AA0E171DDDC2BCF6B49EBF5D91C35665D8F88C0924A453FE96CC06617D81DCE66A3C813F1D3DCD5C37E60BC672ABA16C2025C78E9A1A6B1CBC4C02249AACCF55862C538ECC42D0169B7E3F4B188F2698C", "47A3C0CD552EDF50F80D3E5FE68A22F85EFBC41BEEB787E5CF0CBE3266EF310BA5E1B29A7FFFB0945121EFCFF811A1B7DD768D3ACFC21C4E6EA1EF06E851F2FB37A5F8E0C49F59A28A4CC2380A0C0B4043A7493320AF4E34A2A20E36A6BDD2AA49088FCFF24C84A4D53FD6D3B29178F921768F21C5827D64C125DE4F7F435C6BD000BCC1C95D0F82D61581049CDF2A34A27F2D9DDC409895B9742443D0CF74F8A7DB13CBAD88E1F1D6F52E4486809E20AAFBFD82B297B038BE774BA13649ED922FC67F6DB9F0864B742F6FB60E849F9A253E8B0B873C8501F72D3523EEF62C1430350852FD17177203DD2BD4065984190EA2075B5385E1D29226236ED894DD10FF82F1DAF16AF55F0940415685B3A58D1DF7CE0B0F069F33E6FFA29FFE6134285CCCEA2DBDF1B901A700765449D67C24766A042D43695D1F5D241974E62817FF9259879813F37AB1E8E51F6C654324118E411ABFBB6448E9EA3CF1F636D2142D65775EF9FE046B80F0DC1D1480158D603626F7002290058E62DA252328927BD20C05E5D3BB0CDFB6C60C04DD8BF4A3C9413241339AC186B054B34B24D9ADE710A79978158F1E2EA5AF6FAE9077CEFA4E335473D29BEEF00624FE6A9DEF0BA52464028BA25D9A9C1BC85901F507AF046D56B17CEE0F23433959CD7F1085481697808B99EE619BD0500B55945186A81B89A9C6B0E32F1D5196C4787BDBB08A6F1D79AF329B38304B1203E9B8093146B15F1207C7EABB020B72B2B92EDB95377D698F10CE7737FA3DA501E0CD09F3FAE9504ACC414E63F60E2721E759CBF2CA1E2671A98656707F4629626219E4F16D8A765AF3E75DEC1B6AA82622916E47872DF33689D820DBEE6EFF26E70F61ADB2EC3D8FC9A0AE30F12E3CC5E9A8E1A820DA15952401D3910F6F500D4CDB7D85401AA4C8F418F7E2A166B491D5CA3B415378891B359112894274F25E9DD2B391A96636D468290AF22FC6BD5C2E7842AC5A62BE24D80E6AF79C6F2118C126D60720601272FA89F966C812EB875052A0BCEC16D0E6C973EBB683214ADAC9BCD0541D32D33AFE16EC2BB424EC8BEAEF0BB8A3DDB18EFDF58EBD84B2DC8C7AD54B86E698BE762E73CEC7C1DFB290F6CC1B63F5257FBFECD9EC87D8DCD2FF393B1C1D1BB2EA9BC10323E6CA3EB8EDCFCCED055680109C03C5C668BB8848F38C4C3369A4E5C0515C7245B0C092F0B8525434468E775F40C4D4206B6420039BE1F695DE802DD718B9AE4FB41320C220F6B9971A4CB8E67C6B0CA3049C2772D2B3C1024A502B48362CE9A1B84BF4C9D47D62409B5CD9BAF1E18DE57E9BA9CCE077266D720DEB23F192C70145FE201561AA2A46B55F9B6E5BC8FAF888FB74BF6510AA7E6BCC40DFD471D6CBD2FCC28B33EBC763E8CA58D5D74C1996D66CD827A6A6B9F22AE7C24B13799A7D0A9C9DE940CA217FDB870A1640B55C69B2E704EA21262DA831C7E23411D81773A965DF6AE015CFAA0D5DD3890D0327C514968C2F72A02A0A35243616AAD673DCF57A684E1C9A6B6F35E12C09553AEA89DD40CFF53EB16C5EB9F98B6D04674F8DE9B6AC125B8B0BBFBA71267A6BFBDE26B64FFAB35E5C5F27B7CA273B901D28997E6298E610404C07569E906AF09A968A9E40475EFEBE524357B044B964136C989FFFC70244DAEC0CE3BBAC48B5A0CC79F20AA1E58DDEFE7BCC9B3C3A04EFA49769A50F81AA8F3D152757F33E935CC6ECE9959B47BB90810BFEB6108C8DE4643B24B4154CB7EC3889F5FEF9045A59E82300275EB4D379BD85A29915796B8125351C1CA84EAEEB7607894508", "C9ED53081796789261D7D209BF086C92C36B574AFC6ED55C3410E0723C799696D9E7DDDAFB114606EBF4256461FDC9B86BB21A134F735837E6845571F6C2712AE42FE113878AAA18C76D5383FBDD38E43FD1314166DC0B7CFCF3F07ACA56740A582173D2DF20F7E94F0CE29693AEAC6B3D1E4B22BC63395BDA6B49E30B49261FE045CAC9AC29BE5A2D91347EE4543495CCC1A38CAA59593BC3DA05611BDC74806284B4ED73013A415E6B36BC2CE31181971BF4C7B488E78E921C6AC1070772EC36A9BE74DA8AC4FF68B6210A392866B689110D9BC2C7ABB2D82A38EB990891F264DDE5FEC75C6B4E539F971AF2728343F1641F4B05EE8EF3A520DC170B3D8D562A7AB72C409995034F6CE1C258F486ADC9E44FEE47D5E81BF1259C0AAD3BDA4A9E17CA9C74AEE77FABA25B3481C0317199D585BC75BE5A774F8D5CFFDFA9FA652C4B14E29AF2DB5ECBE682CA724BD98E05BBFC82320C8883A56F687F840319DF2D8BDB3FA8553BA3FFFAE0D4EE33E84B62228F924A86C5FD5B3E12672DB6377D807356144009F741325714B5B6AF0803F3DD1AF558C0B76620F77056A18896D2047C967BF69ED972BDCA50409929CC2E2DE802ED09EF87433B978A850ED7710508889EEA4558097A7FD83EACB365371F80FB6EE1F7A6D258B97BF1AF9C321A629A5AB7559CF1B82311F816836E391BDAF741E493298B49C001783921ED1569C149C90D26CBA94F8604BFFC94FE303CCEDD8812A95F7B0E71DE95869D2515E524083C7B2E06C4B5E9DA12BFCA74049F03A352C15DF3B79C3F2015E86FA527BEA76102DCDDC863263F0C7E43CD9D49F05D8F6A124354036388FAE37DEEB43909E415EF9F5877D04CB5A86AFB74FCDC990623C9D4D034816E39B692B68B732322695C97CA93CFF0FE7FACFC1DA29BF0D0C08D93B4485D6664E96B09C8B011B3107FF5232DCDD9B3B8DE7BFDB4CABF31D2E92AF686EB8C2FDFCBEB80B5F5591B3F7AAEEE0FC7A3E4BBDA652C8E857AEE81F499D9DD537139B7A6275C64DDBDD17BFF7594DA69335C01AC24270403E880987F69D4EFBC2BF2B787A631859241063E7EE106D3EFFFE60479A8BB5C11ABE38A76804D43A44327FB4D4F986BE3C52DF109E4D72A092F25CE7FD384B0404628936256877CDDF543099D5B0389A9E05CA93A2B12C3C89BD76F55084A03148E29275159DD41A75FDDC75994B8E8D9FB10E6E80A4E30E2CCE8F8DF3FD7A8DD567BEFF109ECFE3B8C843BAFFEEF5B70D5747471FB84DE2A26747DC73C9B2BE9905C53743159E489E1D0CC14E72046E4C8D84F893CFC7EF15CD9F52C71D91A503802FB5A6813A7BD2DB705BADB58C06E0883F0848E44C20A4948119058226031B5731F36B3A9177065BE9A0294F726E80B5AD2F2723B8698D831DBA376061FC2029979F0EA7AC4BCCD87B6A432051DDA7AB2387260082E6D3BFFD3B2ACE807FB6792DB21AC235C1A58D9E47D42EE055E716D389066AB0814B36291AC71B0AACB666F7CAEA37B89CB424C4EC3CBC68F97AD6FCCF5F3B5094E60D68C2F1180E5CF2141EFC84DAE7509490138E0EE466AE0C7469F4EAB2E5ACC29EBF2BB225E595181F96700B552BC0E1171428FB2A2F0448463CC86DA6F7DD10FB5F789857A29FFE9535D7CA35F70640B9D4B9862234554770331B52E42002D123560BA7DCF9114BA9B8B23D08C3240E3EBCB7359D13767810AD3F3F66A8D698D17F20DA5242259090C0A9AADB9385A2897A5A1F32A7B1549A45D4EA8787523AA210BCB55AF6B15A1F150E79FECB104CE01DAC70125FAE9D1B8D0", "334994DCE050CEED5471E648F7010ADD69AA0CD3DBB3679C9D3863F86319BEAEF1370902CF4978B8237638507B392AEFEF731E6FB42DFC2A23142EDCECFBA399F9C583866B1BFD7C280CAA43C2CCEC29C6657654C251F7BBC0F83E2C356934C825BCCCB36073A5D540AB82DB7158C7893AFF166B108363405B206E53B13A51BAD149AFEA2A40A37328D4CB3961C9EE2EAD29C76F70FB4E6409F468364DDE7A2439D24FBB05719A6A489513B14229E1949142301AB538AC775AF716707193959417B14A65E2D20319721FCAEE6364D04C480C07D732AE0182090C517B96DB8FBBF66B8B6FBBA35CDCFC87B1C8C0F2E4ADB486474F842434CE9383A57B69D4CDAE68E5306DFD737AB075A60073846634AA6E2A6D6F7CE56A631FE1E3DF256A1E39F0C44C3EDC3A9457EB4FD4477F2AE094979599B9B90EFD1BB9347DF2E654BB9687A2EFB857D9AC1306E20769FEC4329BD54804354E0235AE443AF3BE01E26F0D5998D7FC36DDFA5EDBD3958623B6F065627D6A4EC9901891E3C63522744CBC48BAC51BCC89602D66D1B3E0966398927E869E73AA8B986D9FBB428BB3A71AE7B273A16228349B81927B53DD9B7E96E3D078F25EE564495BFE7B7E6CC042E016499952DCD37F171C709D4734CBD8D46E7989C2C497B5EB9613DC311643ED4B1B08C0C4C2A5854CBA30AA225C683913B5BD46E1DA483BD7EFC2C469DF017BFCB5BB07C64A68E3CE828A537115A07876D30999468358869AC7681380A7E462ECD497A6A6FB6AA134C15C6BDF89A2B8D58B875C00892C50A791D8A50514029F790F7748EB0C1CDDBB07AADEB920238F9C19BFA31097F9AE3B26509DE5C4040CBD82C859EE7C4D094CD7CF8F04395684BF7BAFADF75027B4A47A21CBCC6E3ADFA6A2AC66EA32F670F49BF245F6CDD0FECA201E3E7706F8E37C25FE87B3040C0D8431A00FD4B49E7A050837560D458BB5C2E93986EBED14944F9E92463C312942E6D8340BAF149042FF611DA8ADFF9DC86CD28185555E033F3E22856A80C482D52B2EB21E2D51625FDEC689595EFC3160351B5F30E1B802D5F4F35CFA2C25D8E4101298E6B0B917B5ABEE5DAE3CE09DA595122AA3BB3D8BA8BF0D68EC99C2DE8B4BD7C2A0E0E32ADD32D72696C43C7CDDDF92DACF13D18DE4A1403D0002454E7081B92EBA207DF9411870B91CE9DCC5E26887A437726B6CE2B2DC51907FB108EBFD2F089F893A6D5B5141393C08F497C180AC4A95357E417D40C5E7FB324F0D72F417F688D45B980E215DA436CEAD3794A135A719942FD0C998F3F6F165C16612E2B3ECD4CFAA9A18631AD9D878D63A8E09B0F82C12EAC730E6C5A083399B7A098819F2F25FB2CBD1B6E65E3C30302CEC61680B699F504E5AEB959370E32B58B9FBC832F85AB0846AE4BF678C272CADCB5277EF13A38B1AB787F8E5344D7DDDB074A92DD68A2A2F9695FD52DD685E4316FA7E913DCBF34C3F0D9E9D22CA862D76DF3B5E9E3B54992A7F731C893980F151BF29EB1AAF677B439DB6D20AC69A5A41166799FC54FA68AFFB8D54EFC45B49E25A93B28E87E41CD7B3C61FF24F1D0BB74CB20D2A8D817473188FF8E56EE9C4006083BAD781C3F46BCEC777B2C72A9A3F551353DF186FF9D7B342D86629C4085FF2108B98D8EBC886CFE3C7A4B673D447DAC5B1DBF6BE6064936AAD014C0AEF0078C5D1A626830C480E8B72439C9BD0ECA0B41561E5B0D6618E77042FFEB6CA0F29622EB9F21B83A4560FB26BB98468F33BBFD5CB29AC4F45EE9D68A1E5DFA757DC218B536A9231D7FE228925F96C32E0ADC0", "1B2A30E6054391704DAD57B34530294AA46DEEA044EA5E707811036742E50DECFE891FF88372A4AF65CAA193E1D8DDA016ECC2A2E3F6D8F2DCF9AD1449C614A70D253161E2B05AC67489E13345C779F3D36BFDFD7AEB2AA30604692969E0C4E375D18293D5D3CC39E31189698BCEED3290A2CFFEA79EDE157F2A52B4EA52FCD82DC4BBD11EABED2F311DB72EAA53A1B6811D03D3C2A30C76A8638E6A775EB3A51FFD4CDFFBB4B961075E6102D2E5555ACB06548D119ECB6895AA00394D4A98C8302E02F8D4FC5CA34B405F25D2B090932A10A4A68CA18D799C1DF1C86B1F88AB219D69C25CAB6AF6CA0B3A4AE390CAE3AA65D3AC95339EE734126226D1F292BA3ED968FD2CD835F621C3CB09E59B9DA5CD23163F573821FB64E296853A8263AC9DC896D6E355A4C4377BDB4E7004CF399C0891C1D23E39F03CDDD94DF7FCDA06261E923C9E0FBD8DE32B49935A03E66C13FE7B00E83674E64D5CBC14C0B9F62A842A17551E5E7001BBFBADAEF36228513A43D4864B8D2C8B272562A6B548C0B3E4610609191B807CE861538B89FA079217C91745EA61ADA6AA96464A135DF216FE5DA5143F55D76D44131FE6E329826F2BA062EAC329161C8D158EC7A3BD5FE57908C7523430ACCAEE3091FAD4B14DFFE0DFED92F014D19641EBAD22052FF8D262D39D6FAB21ED66A82CF8336FE8E3CB3641F15EC5F2E2AC0E99CA07223868BAB78DB3A008B233FCC7966D816082C231C18165422F7123325F365D257FE69867CF0CCBBB875D5153B8C1C0300EBB1AFBA3371B83488143EA2562FA477D210BF68251312A7EC26BC837F9D861101B580249FF24C364DA978C0F57C3A3C29F03F3696C04A3CD330247DEC04A385739D90739847867592B09DF211D8B349FBAA760D64D5E00C9D596CBB8B73E7B17317AD315004B35E7F98672085811DCFE7C86DC0169997F2F9EC9B2B77B97FFA6CE2AA70E2A1030BD3ACC5FC3241F291D0304B71D727828BAD824445226CAA77E210A48EC8F79E0DBCA01505D1AB9F79642716146F7A8F9EA25238FCB2F9C46BDC1489D35B958C44C7928BB4503DB8DFE4C1AF5406C04575C4DAB11995BAC0C7FD72B10ECAE376937B56A035DC0A4D7B2E1A180EDA4A84F97D53B57EFC5562643AA62C37211C2363EEBAB6A2AAC22FFD0BF623CE6867F3C50FE502FF535A68BED2FC98C50BF673B2C5BE8D7D690764C256CDED17E4023A04E70387EC53947395B00E8ED6541CBF0B076AD2B2A26CBF220BC665598D9BC1D1EDD309E687F7D1E7D71F4B2C1B5BA020EFB1DE4248C234A68670916EC8A72FD1EDAF0615CF3FA768FEAA586B08990E05E24E7D8E0DB32F4370CEE72D74BAAB68F6E57F2B9B0F51691990DB46DFADDA7503BE7F64A13F5EB5D49788CE21BA768D028037BBB06F3573CCB244CA51362374776B9EFC776AD71AD1F5635B6CB73822A112149208F10E657E1297026113481BE7C862FA099F331FA5C6B1099AE77D4F6DF2C74736CCD9AE8342287986842063A65845ABF45BA037441D967FA102134B25BC7F1F9E8BD4E54306BF8C36DC01A500F4A1184D7412841329DE6B27BA4D772B1B2B68348228037A9A048C0989AB12B42FBEC45C69203ABF843423D51CFA2D67FA548BB39D0996D4C215157C707DC251032ABE51686BAE8F00E0CB4EDB664A3CABBBDEC85EA7AC7724A461F9F650F9752C1E5B8DF204C3520CEE4A51BF8D3BC9A0AA3AF9D31B95FACD006ECD27889F1D0D1B696DF57403EF0E6FD83164E5900691FB29B19BA4F64084ACFE98567987632483F2EB2CE76E1E0B8", "5513F3F1C262853F074269AF598A2E43052CA2C0141729078A17BEE4CCD35B761B1766B3C118C06724B0459AF3E973110D7096044F5CAAD9A70F3BC7AABE628848D2A4891AD18CF4A3D9BE900A2F42F5D54AFC7FDC7DBFD3155F9D06078C89F8DB684B62E4CE0DC0AE0E4EE6F0E26A86CEC1DCDD96EE175FECB827BDAB3DD53D465E796FE4C49F46B0B6BEFB951BB1A679190F3FAEC58C00E2FCA744A97907765A3834585E4E00B952B5B7B5F10E34F43C8EA3F46C58F8E31B3239C0658F81FC7DDD5049FD8D67587C85C78C12CF122CCA327A7860A0E34A34DADC677F82014EC7217D2710112B6C0067AD402A941877970C95097A47AACB74A8DAE4C9B5F360B755EFC4546D7D63C580F108B197375AC08EBB1F51E8AAC68C39BEE69EB886BFC2558F0A52AE16F514EC168992775060A5E474E8B2A1180C8F9FD6F3E106963DFA09D48007CC276C1464B00C86CEB1B7372684ED6BFED1DBFA6248F4725E7F8123904BD0552EF70A2E21B8A078CB90EBE75B127A1C887002D70E32CBFB6875138D8DA5B312A97AEAC2DAF9D6506FB08FAA9C334FD686F6CE07F4BAC70766C6FDB001BCDD43421CF70B8B33D22795303769B2C37D25752C9C4494A8E8A0D9A1205A03889946833C065AFECBBEB026E95987C022CFE65DED4F4CB78ABD4DB2CEFC3D69A4303EEA5CB2E8F39A2FCC995DC4BABA644F65411F6809891DF1C0958FB281A7852C8330109EE9D87362F461D3266BA8C2D3E82C9B1400220B19277649CC804A9FDE4C2730AE11CE633975EB3126E8AF60803DDB5C0258F7974BA7C93499B2C2ED1E71CB64E61854D3FC186333328D14A12AC06586246EC7621FBF1BCA2578F2E16A83C9A6800A378C8E280C7F3378CC71011681C884B83A56865F138FE35C123E28F1FD461F60836645A9F9F8CE211A8FD6B07D477674A34F78E3B916A7AC73A0AD9C8323D0229706A8C2214B5ECE1301E470C37818D68092D5DA3F0F794B8D476878A5B9FB339999F5422EAD28A16D8F8B39CDE00D14B659AD8DC33A46F64DDB8E4F142FEAE8A9F55B94C40D62723CC51EF718C0DFA6D9799AA1863498173A0659F816FDEACF2DDCAC54C1D535E1C0FD9922B333C780C1149C4B294AFC5CD23CA8EFF423A3FEFD0EE1A5B0CB28964B8E80C42AB660665C4B55E06E44557689AC22196CE641644959BC7F80D1AA828DE75CC21E0A8FD211BCF6185A7DA81222CAE0B632A7F98484ADD6E83A220CD49D5942B7D16309AB1DFB705852A22A4D51EDD96DB3E318CAD7E96D5531193DB24B50D3EBF55DF8214093ED0491B037E1B38FBCED71199A063ED101C227A10313051F0B4BF4142057A73C491AEDBBE916CE4BC05D1A44FE7A2E7DD76CBD24C13F3758BF7E3BB8139690E33631F180ABA7425DE3E512B53663CF9A8D1B28C0B886C655AD3A03FA8698A5F5AB5484E3CE53CDE1F34A66FCBD734D15BEB727B0FDFDF68BAE40299C73A8F455ED471C82F6DCE240B3BA4EF6364A56828FE2D6BD8DFF03F35F5C6CBDF0C907F7473F24938016615835D801598409F1004C478BB1B2283AEAB437BEEA2F5FC51D8E43F78C0092ED4D0B08FFBDF1CD60454D3BFE6EA1F41EDC5EEC06357DB41F73CAB23556634416369365D13FC8FF9E20EDD8FDEC673F0BD6C8A1EF60E394B596B70F751EF0D9D7E8D573E3526D2D90325B52A08D25F18DB0E6757EBB6002251809ED47C85D4FA37C5890D60B40BAE3AD22258BBEC4CEAA1B6B585EEF32615F7254268DB82532BACBD9C553624AFEA6BE2AE9E1401F9BE05D68A881AC8D9E0CD437F60C00", "7831C1BA1031B6B0E0ECE28BC7E6A8ED16E3068E8F0006DA96B8740114397B19AA19370B1E1F061AEE3895C30D0B7099668BE752BCD8B1CCBC497E06BB0F75AF47A36EF8925A59E070115D3ED63C6D7FFE54D037B4A818703F6D78BB37725D7F0AECF6CAF120A80C938FF44BFF16544C7847B1A989598F1602A220392CAAC2EBC390FD53D15CFD3372426CA41DCF816E29C731FDCA2E84CF90180039FB1AED0DB9630BC28D54201D5606906091A3F867D257C3A0F8193DCCAB2625D40DE5EDE651C20F2DBC83FD551EF46C4E724D2C516560749AA89D35C7283385E98AB34BB88F8ACF50A0EDCB70888DCBBCF0B792A5D1F2F6977FA081B4EB08BBDA076A43BF1EFCF1C387DD5B92BEB5000B4139938CB0A3B6DFF47B729BB5826C7E188A177CF6DB1B88F051B537DA014B396645218DF4EFDB0DA597B3A78E9884DE4A7B3D06C259C10B78DEA1DB711CBA8FAA2CDF37EF0378091E408960B011F4E4FE24771D0FF3B8DD01DB0527087AC5C0F64EB693D38E0A128FBCB8053E811602A05F3DADF2166CE49EBA13F382E90EF4A143B2CF4FC12DD4873A40FF7354C6E648A56623457665402632C41942D23001C08470AAF1F3FF0A474AC6586C76915FC91AF074103A1CB9304485F92F9639399028EBBFDF9394B4BACD6BD3B2177368B94F639AA8D202D6BCA88D74AF0610C7B565067ABDE4F2BFCF8CFFAAF93274CBC913EE7DC5C77BBE978AB9F82B546462DB933D67E0C6748F943F39B8FD6791847C50A5A834A78C2FBE5D21448A035D83D45F9ECF44C21C4DE726AE8111CF277049331D78B06E9D7D3D0D8915C7C32CD6954D37045E7AFF8AB496A4827574C457523AD6B85F78641BCC4C9535D29B3F8AB4D944125E6E54B3B3F23EBC04BAE3AB102977EF829337F51CD833B4F5D4559D79E695470F498EB4388E573D004D725FE41AB1B39F9526867BF7B99301E0E50AA569B3B23EF78D02FA53C4BB2A184B02977F2D2AB3B71DB09E3E8D9D5B13DB8AEB0A95F9296B7C49B1B3D6903BEEB1B9792B5ACC1A5D11672CA5D8E3825D044DA986D01F6E1E292D74443583E49CEFBCA177BE275977BB4A4F77ECD6FEDC886B4B83AEF5F34AF1A78DDF6B11C201760175D57823DEE0FA5C6A9C1A91638561B857E993779B6B0576994CE86E7DCCA4A89BA2ED84ADD1D8B4E11446C41DD4B1EA71352E26B2AD4B8A1C5C64822CE21BA4B8D7D6589FCFA906768A2BA0C5AD1758AE7B8A2BD757C8E459814CBDD6375DC58497279C0C327F67D14FFA5C90167941CF9AC642B1693D7DE52578AAAA56E0EEDFA4CC12C7469DBFAEAF5F9D3D72FF103918B6F6DF7E0DDACB208A8764B459EB01092A101D42E762FD5C5AB381AEA19BA6EB8CC9CE138892FEDDCBDBF818E97EA8AE9846C0CDABE9B4FD5D80431FE03A4CBDA566314BD1AF59AF120EEE4105E1B701A4058F1112F2A5C8D9F68EECC870DBE78D851F89AFACAEA3A2A068C59654EF5E5BE2F6727136908D993434E5EB1B84331119DB1C02547EAF7C9DD479C5B326CEA6224B16A2E108E76CDF0C54D16E472D0CBC80DAE7980713602FDA31A6B04E4FECCCED96AA3901D7B35D445BDBA020DDF1BE5E9914ACE600ED24E492138F82AE583A2EA454EE7548882C1A192F11345A3F5A3F2CF64B85DF6306F7FD396C4E773FA66CC098EDB3CF8E5599C2EA13A6F726161BB0C0D6673F02E3DB24FF75A5698E91C1522424D443165B52C90FFECFFCE6C42656138BD85409C45D8AC453D6742B42A43A7626E70C212B7318834B7D29CAD0C29F22E6AC3A59359B1A75F727E1DC", "30B93A783620E3E094D47590AA38B10FF12C3E421887E9081F9A9C5BA1D753F341C33B7322187317C6610EFBD0382DBDC2D863C48F15AC3FA86B3C5A5B9EDB937AE961E8EBC3D880CC79141B79869F95D6E90C5C5E7D9448CDACCBDE184F6FB545324995184770CD2838B61376B148ADF3A42123AEFCF8890CAC7D3AA87A624DF3B883E86AA5FE6DB385778F50BD4E528C6604CFAE0E39BD949118EEA3972327EA355EFB98E9DB563FF72C5B860103AD262BF34BE17295E37A81D1C98EE6FD6690914467048A50AF09435A68FF9A70B59DF8FA7A543BBA24EF8E13AA509C7A311E12773405A4024A0C2D7C2802025FC48E8FC12E4B60543001971FD20F1641B968CAC283BCF8140629DA13D1289B7130F3714B8318518770EE1399CECFF1D3074A65F8913596F92B269529B5FC63D824AC7B6390580C516BDA78BB1F158B2C69AD2FC1BC610AC24DA696F44B58DF813D9DA52529D325BF2B3575768DB43AC3BE5D0402C717FB587B6976E6701B0A70D04F3250B6C54E99983E2B1057DFD9EB7B621504A1004E7E67B33B138628EC7C43A199D00D9FAB8B1990A5FF29E4399051D1C62AD0D86B651E9DD94D27DD6A7B09AFBF1EC737B161A4A398F7F424889C0BE6FBF8EBAE9F1A835FCF4AFD45FB36919D362CF73F0786D93552A7B4E421EFF9D6F98078F85098DC99A1009D6551F02B60E12BC28499A27FD7DEBE1047CD44EFC0D9081323DC08866DDE79F8AE34136B04787F6A5918F5AEE705CFDD5071ACF8FF54A232FE39E1D79D82EFFCB6CE1B68A17B4585817CC9AC33FD6CA21A00929F1EE5B9E3518B27060867624D8262EA18F1B01A525EB6CB337B257C8855FCAB72D7A83DE52E4F1D5E29EA697930C25109182B95A202E519B3757092239BFC633C4A7099290FF7B99FEBF81DF5AC41366D3DAC3384C65AD0EC84F0DA4A0ABF7D8E1E2F8B898FC97325878D911512F1FA5C24F009856D44123EE49C77370F1D58E8476542384A0E45CD852D19EE00025A8BCDCC011BD259AD7360D12B6A630BFEC8A97AC40781694B0D5B3D50D9E843FFAF7A023D451E282FAFFBC38BFDAFEDB34528DC792ACD499179ACD26AA3765523E91A137F52BC959D5969B301B1893564AB348606864916C8D79DE6FFBDB0C2ECE83B0A3BB846FC37C7D4D2A37B2B841CFF9820DB444FB090B430D9714FE2ED731F097FD30C2ECDA7B6A276990647741496729219F244FBC6F1CE02F24F98D0212AD005E54F242A77858622D6BA961190F97438FC4B33217A84B5EA9D3471C27D08C2D52DF19F2DE486C9A5EDBA2A56E1349C3BFD312B8927A9E86A97830DD0B11F505AC481FC6834F8FF7D0E67126033502EB5C593D15E1A56DCB03ACA1A5DBDBD6E6FA9DD3D7D152E8FC1741BD876760F99CE780EA5BDC018022397587357614ED37266C69AFE4644D7D5259770B85B70E7E395D2ABCA3FAEDD5AB32C4B61117BBF707A58530EC435D36370D6AD8F9DA503F8994F6CD627336A731BB149D3D3E96075385DF8CEB3D9B48757A79C67C0E0C701A2CEFA092D5462E28D12548FA041C5407AC321FF049B37225742345E065720A81098B5785AF12927167ADD2F72F766292F421C290C2648E270C34443ABE5B95B7E635B4CBEFF74478F65C77899418C8ABEA6A4C3FE217D784823CB448A7EC0739C7166F4AF733BE758B6D5011EAA9B05ED995DC70E3D5A2D2298801C25049661FCF4CB2E9F7501C86D763CECADB0C86B348C7BF31DF7BB0CEFB4A2EE6861D3D9D441AFF4CDDB979465C1ED95692C5A46F5ABEC180ACDA140AD11BCD5B8", "84D5B404488AFCC35CFC6EF1CF7A848EE5EE527B7D2D2081EBD8FA8432414FCCB271A43FD618EF95CAF1CEF445B50F02AFDC6B41D5C1F1FF4B6B8F2AB94F90F259383F44246B2D400C3012FD76E2980827C9B5476C4651293CBE9FAA77EFC53E369B94F51BE480EEAA389D88AE421E75EC67C76E30A6FA7EF02500372E4C9AB875EBA1C357C003938B979859B0A914D58F21B3BF1BE8C33A1AF079C5A0A4EA532F93A10F6D96D0A63F3C99E6F06CBC072CC5D71A517FFF40BC260A26E3A46688E79E733E1E2F0010846937689E2998BC769186E0B977AE0A1689245D255AE7D5F34715AD526E824838B62546D9569009A191BA5192535E23142236F4035C90D1405C8530A57B402118FDED2A5DA4B40635D2F95AC7CEAA370686F0AB23AB31DED369BEFB066909B76F2C04039E49FF0CFD323628D03C26F0BD4054C127F21355C33B49F86895D5354C3BBD2C0D38ECD169289F7D8403AA1753B393AC06C887F98315324DBD78F9BFD1AD8880D41D4EA98956EC89BBDAD08F7CFEBF26988EB5AB01D4E49AA8273CAB6AFDFA1CC1C95EDF85284E6570332A0B8242FBA495D87A01A945E61CD36E865CD4F430F04A3B3EE74CE0486B5676F7A938B18E1DB2DAE2FE1C04B3D56892C7394D0B07C5A2F7698D196711DC83FFF6ABDD4E8131E1106EBA23245FB0E2A696E440FB6B0B1CB4DD22C9720AC76F09863711647A7E369FDE5D6911A5FCF987470B8C06C4EF7063B08A8320B4371866789147E9D7C5D477A662A501627F91E95C6E2CB6814651E9DFACD67CA0B1FE62F44081E3BDDB964C1E5ADDC093AD185F0203B4C0F7E3E96811F14C79BC54F2919FCE5B653F6845CF1AC34DA9E4CF52EBA626B739246E25204F9EF2CCF4F5ADBFC53CD8F629FDB82186CB52BEB7136F105D3CFF9CCCC2610BF2C8F943DF5BD03877ED7AFA25CA81C4063E1B97452A937FCF77F1AA068FE2A26F6ECDF662ACDF18391AF7D627C2AA07CF5597B5F33AA0ED4DAC98AA73C8321EBF6918EE568ADEB1A823527AD75CD5BF7ED3EB5633A4EDC8C59DB0A91DA79C248D6894CAF9CB411F302635BEEF1A1C7916C7545B8BE7C577692245E285D32B4FD18E1478F88F8373E22A5CEC6D22EACAD2A41612F05AB2C54A1C03C0512359B0F9C5F91615EF2EA80DE97230480F489FEDA38D52FC84E2F1258CB20FF0E850639B31C2958BA6C064D0D0F4AAEFF313E43C65EFFFBB47CF09F2A122D15F76E8B704DA8F2B8C71449AA49774EBB7B2DC97CF6004D2FF6D37B9C689261189B85CFD50C20C961F22A644F51497377426556B956DB8C899045B175A8B9CB22EFDE535CF487E9D958281E0467539853054FC3475D2E142D58F9201C1DC6B2C1A12B2878F9366E2216405069B7D03852AB37EE83112EF2EE172F4E5317A41653A656A06F6633AF59062A47263A9977A50B9115456A58F9C3424FE7E0CC57DA70FEE0411C1479B4CC2E6E720B01432CFB3C503983B37FFBE38C92E50D6C5795443F73244F6D28AE6270E27D46A25621F86A2BC4259DE6C04CCAA657FE656C640833B290F00A1660329A3F09FFE60152A23925F4D8B0933AC016B5802CA863F66F8CEB5C8383B1180A515AE6C51B5F56597C3A004F8D25F8A6235C97B4DE38468B63E3B859A487AFC4320598EB6D143E5C914409D25F6DFF6E957D575C71D3ECBC6743CCCC03E5F34791744637A994F3ADF86966B4FE911C06F7BA1A6C20A2971D82B64E49721A530D9D5A2319D5BE0F47B8119C5A835CABEC735A935E23CB439970437C6F4CCDE2525EF0D7B1555CBE70280D5E760", "A5029C9EB4623226D321FF78D3C4EAB1F672A8B2B24A09CAEF21F561A851323C05A3C5E136A2DA7104ED19FBFFCAC3FC49B6D598F3060E93552EA6C700B837F7CE04721919B9C96A57B42AA1D832307C7A847091848066CB84947BE5F6B54654479E39F654819D3EF7AF4939FB9F4C9B20CA7F83DA0FDA2F171FDB72455B7ED0D43206992520CDD86B29C48BCC687573AAC4217D0B7DCF852811ADC3ECADDB2B34B4572675CCAEFDAAA01F83561E6E240878F229698185A80E6FECEE89455A72A377C24CE3FECAEC2A34B9CA98D288596D1C769CDEAB06871316CA7D1DDC5862E6282DECE33F362C64A73E57AB266715068932ECC31E62AD2ECFF7C6FBFE213384DA086ADF49E30F432EE2C715D9AC4DEF53A7B09B0D722CAC560FE8CF0059B80428458282F7E81717647D72E321A3E4BEF16FAEF76009BD98B8D9822B771EB62F1D0748E462FB7F3BEE9B12AA86D9629085AEDF8E43E1252EE59970CFF66A6F865C7651EF83F8FE10EB0E2615BF8F5C7F12FC601B0CF795C0D8B7057F54408BEFF86747C0F6F23EF212A9086EADD464A25341AB71FBA4ADED8F599C38FC15E790A5B86E64977C5AC718DD0B47C1A476AC9D7369396144F6288E84F7FFBDE02EC00EEAE8ED415C84648364ECBEC42164514D3E26BFD3187E0641C216FFC57E00DD752CDA581686916221DCD1AF07582391C5FBEF047FD1B7B956B458DE925C02A756FE197233E0304D0E034FF9A176B5B3F5FB683AB41D2691E13F97B3F4EB33238851331197C49C60233232DA0E2610430461876FF6F77FF3CCAF1BB2424B8B347588667B48480476D40BD9E487468CD5AFEB597C750A5E665B4E7C4C169ED08ADFC731FEA928052C4FB85B3064EC07B0CB988E324893B3F084291D964403F0350B7E1B06DFB73362C38318B762A972972BFB76CC5C08B5D47DBA0F3A2473D7749DE9F49F50C4C1620A9EE9FE56296124D72906497411DB87D4D8EC4E1F79BEF27232008A2299F5317FC1A6F455F1B827F1712BC01814F0B9D0CC162B25B804278B9C7BC5FC5616B317F2050234A7AF92FE35A59E22C959C7163DFA5F142022BE5CC4D5EF16D218216C57C2E29DA926436C00DCB82E68E16CA5A07158D8B8864D38A765D14E82175114A28CD97D11D564C8C7B87411589A4FBD49F9900D08939B7A73B5E6466B6F607F8AD22120A559A02BFCEF6456E7AECE8C9B7C9D2B322D2197124C05363B2CBFA58B74CD88877F22A5E5C202FC2C33531125F1518F4F0F38FA788E5E6B3307A75EC73E545391CEA200243DD6D25A5B8654A00B82BA57437BF0ACCB0ED37ED2FED221E54EC12B93AFA6E3939223596075F4C47340355D7222A8234A1F65EDDA42FFF5D19F7FACBF09AA77E7962F4CFBF61A0F26FB18E31A504B371714048874BEB286AFF71B43E4739A17E8AC25FA77121ABBE6E99754AF42F1D0021EA1E3FF088D0734BB191F91A520C96E22B4A28F9A2BD7DF81E8079EE5D0DDCBD517046F12098FAF6920E0EBA10DE8CFB391C63C60D62C1F4BB26BF8B6E421A830575731F67D306CEB5D6FF04637144790EC4AA2F435906320114CB81EB40C22B271FBB065474687AA5880F1DBAAA1744AB3E9B831A932A9208BEA9F5D526C52F5FDA56320E123CFB553E2B71A595DDED2ECBBD6E890B0421D765D2E9FD0D3995DF2A9523A65FE2040710DF16F2A83F510DCA08493DC138541E5681B51EE87D84C9AC11612EB5C06F5A63E22BD6275E35216766D79B215DBD087E9CADA0CEB09BFE435DF9B7809A76DE323B373682B8C58CB4F08D9C708EB050DEC", }; // Galileo E5a-Q primary codes const std::string Galileo_E5a_Q_PRIMARY_CODE[Galileo_E5a_NUMBER_OF_CODES] = { "515537AD5E5F4216C16046FB0AC50DCDBE5CEE7E3CBB51B6ABB4E87A407B90E0EFD49DE1DE5ED29184E7FF0DC31F75FBB94F46FF6586B36C7771E5A68D060A965ACCF8D640C6B6E4530FDF19DD2491BCAB69ACBCFD3EC7281CCC31253A471B652E21C4CB0B43613EC542266460F0A6199B436BEFD95572DEBEE920A915FD854D17FFD0DF8C74E23B21B28493A0927709709B07C65878C43B69DC501E9D0AA21061ECF173876CAE708C764435832D9D6FCFE62DDF2543016D6325A56D9BF1007886E62E8A832BC32063CB0717D723C5E8C5F0C0EB3960577D364C93060B64EE04A539B7601CC3113E0AEC53CF21AFAD0154DC5CCECF038474E0F4004A65B1EE2801F81968B88C3D35E87CBB126C02D770CC3D32A552883D351DEF47847391484F80646728221F993921BFC14126EE3D9527DE607152724C6D2DD305D3FEA0AAAEDF6509A2FE3248494A54FDA8E3CE7E6BBCE234E4686BA5A19724BA2CB78CFE71A6AF45532EFB286C5BB47BC3C1EEF4E4A8C757786AE974F30A86CD60EBCBFDF5502AA8F643819CBA4301E731ADBA1345B61C0B444FE7B817EA86F8DD749C451AE7D24A68D914F26C918238953E8AE61CC8553213DD6856C7863F9F6BAB1B4C84B225911E7B92BFFC12AC211B2B2CD905877FE976E07057963D47C437FE47D89648053F81AC39E8FD2F3A726866F6693E503CB6F0C3F0AA9B3EE2EA3BCDB16D726E1C6D8B073AA15F64EB68D53B1F8CDAC19C7AC33361226E81F1C793BF188755A3FE1BAC38B91ABBD4F077F7A28983EAFADC346CB941D49492625893453B364D07FE06FE42B160C16FE0462AB6366FFDEE54DC9CE4DCCA21E4E4AE5E92C872D1E4EC6FF6D3063C98A5AA5EE72481A0BDF15152E2A5425AB722101474D0E1EC8401273EA1BE1DAF7403190A94305BD1C7DFBE1F35F65D5CB97E82B7A297047507FFA0012FB73360FB8719C174E78A989A96E60A9184B3F3A8188DE100AB361921D38E8142859C8F0F7D441DB1B2E9687BBD1086643987C83DEE0BE8CED4C83BCC82B62B45311CE4F13ABC55BF5EB1ECDF15F5A07F8B2C42F07FACE0E299E87727E2D534FEBF7B9C3894CC3E2E4127A294B9FA2A671273B174DBB81D247CD2846116500A072DC3962C65FFECD0C0B46DC2AF52882058259C26FDE50BEB319AEECFA1FABA34C069680B9EBAA9D96EEBD7EA30E748213E1283396A2AFC63527624641D4E1F1022A973B1898BD4CEF4D712B49371A51D60E08F42ED1EA90AC49EEFBCC53E7F9E899DD1AA4056F11462DF1A4C81620A73C831CEB897430A22252B901EC3D6F3DF58EF26422F796EA31AA4E0E9CE5B4A9C312A22305E298FEB3B3628283D405EDF726937327D90C542434BA3B60684584A9DB244839D2ACBCD7EF147A541E35687B5B8F5F07764973112D20D1ED75DC31F6A938542B42EFAAEE0F11B0583AA4925C3132356200E8D6BDB3127B975F4115A7A8A1C471836E3C5450B501A24D4A1308BB319AA827222B550F253F64B6F7D2322C6A2D3012FEC265A66A60102A3340CBDAB900DFDB36693D41DAD8DDB8875F8C3BE76AD5355DD81D67AAEBFFFE9458E522BE0312E60F63DD92F25C0D7CF82F223AEC0BD7456752CBD5151FEB5368F8857EAFAA90E8C7499B75D46EC4CA20BA8A24C90C016B5BD2CD7864828C6140E98EDB9509AD1194F56D49675D077DE92CD481B469E3A37F7DF0D5392DA4CE4CB282530F1C73482CC0926B877B00B0CE49FAD21E4C26194C7E950E0078F3854EF88755E08E9380165C584A3DBF1ECEF6A31B224FC321326B93797BFE8", "D67539AFB80711A0BA3CD67D963BAD346BA813D35A2EEA104D36AAAB863C656A07AD61BA60598C07744D32ED01EFCE928346C09EAAC2D392E5655F0FEBC486815AE30A38014DD8520F73CCBB71D9D42636328A50998A2A3BED3E4B34D0DCD65B94807064E2EF0C420898DB96E3B99EA9A0AD91C63857DEAEDDA5E644E62212B23D72FEDBBAA78C6581C677B10689C4AF387626DAC55F4EBE1893D52D28D20EA365702448A64A0C553ED337C3BB911DDAE2A91727299D8064BEC880183064574B5E3631E70A0590210143F4079C572BD5E2F7634C2D53B1FB1DABE79C484799E7075EFF98F033F5B2EC66C373825335D883911CEC9CFBBE2E38129B7E03D9646A7E513D5069043BC62AF4C524F12D8F98D8C9DAC5D8642DFFF48CF6737AFBBCBE965925F55F03BBD5123C9DB47AAC780301DE91FBED3C01D03E6464C2C2915BFA187A4BD93E20C24574FB91F0358CBE0921DCC8D6B7E9976763A1D2158511861EFF5D1C0B71F608E7ADE91D9DCFF5640B55BC9BD1BB322C879C7EB5C06EB2601D06241D09CFB1BC1695DFA55FA044E0E2E4BC86EFBF6A55740C4640512DDD6CA069940BC0FE1738FD376C68BA8AF7CCBA7D89F7966B29355538836372EF418D149EBF3AC104919D91BCA2F13E79A7CF7684A4DC0AC556A2843E041A71F97C94B859FE009659F593EFFEBAA6F6C1C57A5BF22752613AFB26379C42AC25804AEDAE22D63B230FCB858F496B8EA6F37104D0890525DBDE06AD988BA0287B0938572F14A98EC9E60E973FD693DB1F2AFF671AB03FB12B729D0867938DF6B60EC69790C992C6C33A531FE56D0ECC1465F65E3E57FC9E45F0F65A1061CE6D3190B6C1B8708A8A5A47222369AE889D26499CDE8F0548B8D7071F2D4DF6C0F2418BE449552327981CB0B54F792F29A71E30DE257CE1B3A7553A22275E4C8B9FAC3B8D4E9912BB22B0A899E7337513C7ACBEDA15FAD3D6919FDDD941CA659D78B74FD39E2E2F622691B89CA82FFE602DB2578A20D4665184456F32DF4DD6CBC412EC7C6914CA427CEE02F6D9810AAE1406DD68ED3869BD8E3947A2B3A803E875FF82005D853E3F43A6BF936030744C34C8B71B7722BE0AD3F475E531C9249A42671D5F3A5C77C4C28DE29AE953EBFB572578B17B636F8365FC755C22871E7D53A1F1561C92909305C9FD36AAF79E8844B63370B800B25CC1355211D9919B830A988926829F808DD2C66400279E6AC14F8EECBBE8B6E9ABFA3BDBB38A49535F64F719EF48C5FE6B2738DC6F71AACD70274FD40A29BFCAA594AC3E7D0C3C522E406BA6392444C9F362339E8FF34BE330911DC7EB11A47FF3A62A46CDE961A40CD5B24020909E5B034F45FE96CB156FFE8E2FDBC12A7C12D60D24BFBE596544E4F03AF26F086A5A667496B7DF302E4DCFC568C7ABD665EA7EAD8A7F5A000DAD9F43E68C4D8A14742E050769B3CB270E3856D7E8F4E827046D3E55A52F0E02C883881914DE87AE3C24D93E61A94919B40398D3EABB1B5142431AB919208A9785962D05061EDC951C83C73FBF6AE8DD6FF839E631C9FCF6635FA053DBCF932E359F83FBB3EE310281569741E3A8975FAAD1E573E0EC3207F6DBCDB8CC90DCA1CE517C8DFC1D31AE4841F87A5157792738DAEE7C29240DAE26C6C3E9D8A899D2271B0C374BD2EE846C6625E31B2F8379A96F601323039D281608A01A1844E5D1D20CF1D92C52107CDA71BB3B7EC4DEA958CFD7A79F71868116CD1DD2B2E66BB94D1373B733F324BE489DA51BE72B01A8572880AE1E61650B839D03B0192D290D5B36A9CF93B304", "58B2E58A13D4D5F84F37A389E6B01DFA66DBC6A25338B2884EF08056BF0A9124DA29254AA79CDF1B0944DDED4BC7FE683EF7A3C7A1C359E61E959471E30F9D534F43EEF274AC6535C616ADC7455BFBFF43ABF268F7C995CE020CEC73BDBD04007562F2710498AD1A324F25A6233B2DF2D9A429F1C39943E45F934986D1979D293F90CFBEBE01665C98C0D72D09A382348136980B31F5D4696B85C3F42D5C445996804159CD4C4CE7547C4A3FB718AB62D9E9826D05C44C6BD21D708CABB01F46514F29FBE7352866EDBFABD0ADBB6093E1A519D0E11E27737239A07866752B6D864686AF1E308481C53C635046C0756E8008D3CD26DB970C5D6EF8CB9DE6BC4339EE9F88EA45D11B74A1525E2F1B9F91567A78E403F7ECD47A99E95C098870B928E1B0DAA984CCECA13C6857F350E808BBF66AB4EDFB0F369F6F009268D19DEEB377F7D0C4ED6414EF6D23A0A5F37A25AAD3CD62C2115CB70409049CF0CE6D4DBCC5C96767614C6FAF73E9A76C7550BB970AB3D3ACE0C07FAA9F36F1935DFCD5228427BBEB5FC7A2F951D9210A5BC32ACCA7E78AFD5FD460CE2A79348714E5542BF2D453680B070E85F3244E8A6B4EB6ED49F803E60B8A383C8BE6283B1C4DF79E0C4A23D5DAFCB26DFC5DF1D1520FB6CDA23A05A1513F751EBD0143C2B9F5494BAA74F9F95F189C5767C6F5623559D9F20CC9B9C9ADFE285FA4E1BBDA481A52ABAB36A5393370091A49A59B968CFAE89BEAF33BCA5C2A9BCC1758CEEFC2D0A175C8A5CAD5C7E3FA706C2FEA55F4971A7B8A0C5D1F22A26D7DA9A70603AC34566E4929AE78C8F1926239950EC0A6E1B37D919E24431E53FB08B2F7DCDCA2EF4177BD7D2F81BFC784FBEA0471831CDCBB9E11D60C53D0E062E8BB8D98B8EE5A40960EBE10FA642751B96E1407B38A024DC64D5C2005E71198EF394673A4A0097187D2475CF27B3EAA7955AD9F412A89B36AFB27FDF7FE699B2CC8C03F7FA40549178DF8A3C1A39441EAE869BBC89D583ECB18E310885F33B95B719045CA6955720CA75D5CF0B29E5F1B9E9EAC5EC92980B2D37EF6509CCA6E67544A8116494AC7EB9032E1E8CDB053B5AC0F60DE59BBFB78E3491D50C7ADED95042A8885FE284E90C04FFC0370B92B68379B2E7D52392A42FEB26B2419CC64412BFFC036C01109B9EAEC5FAF485F0D61C37A703EAD02127611F9D25E4EC515CABE21247156F0779CAB57C35581646BB71E87941AB5D06FB3C06C423E9E83E0C07E611C89CB000344AF49498EF5C30305DDC8958F45A45E1218837269DEEDBB0AE51D2AD8B41BE425EB7AB798856911B6F0DC721756A8154B9D1CCD61092D16A3E9E1CD5E1D7C2C45D236C9B21A0ED64AD4C0660FE42FC0B543A34FB545B0D88D42F696D53BF54A1A259486846E81B44C16EF146310AEFB3933BA9F9D4497E74AFE1449D69105B9F295DB24B4563C3FC0166CB70F104B3360BC0998EFEBABC6276F570F7679865036DB59B51AD2F91C0CCD3BCF5C07492765D480494AB5B87E83FD04B75A35F88656D3329AA5FD550DBF493B0CD2C19DEBE4358661C72A71FB17C812F75BEB61302AAAA1F757288C1D8626461F4162A2EC6296B3CCABE21B4F0695F2D2CB02B86035251FC9C5F2FB5BBF28237417DC56471629B3B4C25AFEDC4C9CD108ADAD9DB1330AB680E4998C5B3D99BCE8F08156B630A63EF36A51C813CE22A6B178683EDA389ACF58653582BC2AE8170ADEC4BE03C04CBA603C0E4572A74BD9599A8442E894EB504F7703F2353A8A3525EC5535E750303AC07E08D952755F97AF236014", "3059141DB31B84555DDC1C5F40372C50BEF6E82B433D87603BB7803FDE8FFD74DE06809357F11C1D6ABF02D4DB8EBE1D5ABE7F30C91A451EE3C1AA36735FAB9185C785F05D28BD470D433ED4ADDF36406487CA1710ACAB57EA0DD577A49C841F5E78B70FDE90BC1087E79E27E53A4B131C06BF33843BFEBDC0C2A207510590E52158C0855C40146AFCB75DEEEB872ADC5E77CD1DD6A66EA96CC223B3295C136E2766ECE9F2CB807C68C84FD04E0A5179D58473860962083DA8D68B70DB95C0EB91679CF5E1BA468786725EDFB179A2C5E7C28B396A53D89A98C7B79867E240176A9DF9FB0BECCC22A526B617CB8FC2B05A8DE411C8C5F9BE682459B487B26643FA894F9B3C97282EAE397A03DD15F07FBDF7432DD95D29E6D50CE95860BEC2649E482F40F7B83A13135A7C71D83ABA44A363C864BCD78050AC69A8DC0A9E601859087DBD49AA01A75053792F74D9A8EE726608D1F009D06363F6E5A463BC362178918737C5F3E71EBF130691A2048F07F3F8CDAB70C9D0F7B9A1180046076E1B894AFC620244B30A571DF359C7D60969A9436F05417DB5759B2D3ABDF6A238B5B5DCA8A0E4C27F7078DBB6600FC0105463E745A321884A4F6C5963B188919EC24C460F1B9CB9C063B2CD1FD5F49C06AC2E61EEA55056A6ED08B6C7C750E30EE66508FF243FE1B5C494E8EAEE5467AA0ADEA834523C536855D3BF5ACFFFC0802365B3889C31910A5E63B9457E46B4B7E29189F1BC21E7950BF9FB44BF5D76078D8602FFD986E1A1F1A74C677BD8811FC6992F39384CB3F9B2C91F381DC01D4E79D2E66E6D76796728E0C48F71817ED182759D8B10F7B5D361D7138CAFBECA3234B9F2F4A76FB00DEC05D67FA8E7217E488688CF87D59AB4FE7B13C793C1A1711C401B49C381F76B5CE120BDFDF30A858DE62A3F4331E4A3CC167030829906935FAC167A7327B5FC0527E014801A27FE0F2D40EC13C66235EFED070979576DA7268D1871E8487C4DFFC62D27B83488A73FDDEE1470832EAEFF621CE8E126267A47EC00773922BE480C7F26C8E4785D886BF8E6518DF13DA86BB2925A432D479E8B8FA9F92442891F71AC7C05C0BB0E4396158A492BD49E42AB4C4737A952D6B2B2780EAA73DEE13037D659A43DE1A8F0E525D7F96FDD1629FE51560F77E4A1CFE903DF0891B39F50B71E0F84965413DB34B1EE95CC1B6728AC3D1924B34D1BAD4A4E4F7D98D1B938C567B6F3C95770068775F78EFA147ACC619AFD0B6D8C66034C21B2991419217256D88F265922FD49B4BB38D2955305A8D01D01758B01134196C525315726D9BB6D77917A57F2C46A05DE91A3FF80DD2B5AAAD899D679EB55341FAC6D5C2E9C6B703806E342B2C11CF84B394BFDFCA378B26C7E0CD23C8A87B7CBEF6828D9E023B2B7060A0FEEE0D29CE59B379A02AAB7DFCC41A35CB9A94408A321BF78A54D2D4DB0E170101798F6622D8087A2022A993E85DEB5CBF0F4DC2A047877EEC9DD145471D57015DD59A37BA60C9BE39A4AFB92289562601BCE8102C83292E2ED842470D715D34F11981BCCB81ACB443FA732F792C5F11B7DA5D1BCDD84EB80820EB2BA3813F5E6EC5300E622DD81B1FDE8C786387864D78246A432CE245E0883745D9A1DE9D68253CCBFE7C00EA908E452DD3B9669F1E6812E40D9E2C423180BCA98F4591307CF8B8E98B7F828989CA7F3F0BEEA4D408898364C6DC160C94B89D879B1D07286EAA3FFBC6CD7FFE5700304AF3FC049098590DD7F6D4770ED66FF60DB2909C2DC6DC67ACFDB7CDEEF1B714BFE4CA04F2D5172137C", "4427106DF31EF72E43B6C75CB84BE5E375B6B6D4D21226D0FD689E8F14EBB81372B93F5455ACE6C168345234B378500BE6612FC10536607E85B884AEC780550F2A26FBF0445E0AE9C0F4CB95F01BBC76652A9E6FC457D6BA425EA8B9457A6F3C0AD2A0FE7BDD1C1CB19A9F1A8815D84EB5843AECA4DD005378111E9AFBA9C3CFD808C0C3CF2B39B1962EA44B0848452778168F7F60034A68E5980EB63B94E50D170C680FD6345F12CF30E9089A7C0A422661DB7B1BCF2480238AD043FA1D0DADEE998F7CD69FF04BC336BBD5985315D4E1CC78558D4E235CD7E05015A5734896597F16E65E45E0C819CB0B895A38883ABE4F439D10195D88366CD14F45947716AAFD770C27FAF6374CDEB53B118277906F7E61C583E8C7CE3FE733541882C511936076DBCF65094E37FE2FF54E0977595077EA26E03711FE9054E2D31AE7F99939B415F46C05BB55BA7BC4F31F337D624A94C9629526ED51A9B93B1B3C5551F9B92A30759D7A40025E98E50128232A706CF6C3F6734D00571F91307EFDBC9718D78B3B792909C1C56BB8526CF5B229D4DB47E61D962538BBB17E6CE8CFB7854EFEB5591CDFD5DD8BB22FCA50E4D97BFC4C36E2573C0B495FEC9830FAC229976FB651B82DBA34173F5635875B1460A023CDA65333138C89DC81275F7F3446472F5F8C5F93AB130009F5B797D9ED536ADF5A42ABF6345B1457D5C96CFCBFFBA56CF124E78FEBF8A8BCDFFA97831A589D177AD260499130EECF8247FA5C44B3C0C19AFE6BBB0A7B87080E14F3C3457C8424557BD9078DEC09A3A6704E1D77049A1A4431E423B28B9476EAB6292CA1B3B4B43E18EF929EFFCDD574417B15A4DC1269E593F884DF5D492A464AC3F2436B8C691B88658180E53228AD83C4FB843F8571D42A9BDEF37EC4926DCEE5002A12144600C9CE7AFE483F3A64E480CD09F8CAFEABC9710E01A8120E84BE5861D75705A8D18F02756D8FA78392F1C89D05F37CB9F768289B8CA99E22E86F8200770D6DD2D76951A45F73C0730162C363886282524436D029786E7CFA2EFBCD3D05169D362DC8BD472AB376C12097443080F3C83AF1EF7339D8FCB85FA098BBCB5EC3645A03902B758DB263A21C8CC4874F96D672EB192BC1A183A1B271BC1D6429CEAA8208F5CB240F451A71B6F884537ACD49471010ACDF28887F6A02A04E738CF9FB5B00E0C474C460EED1F791F4EAB3F9AEC225B40CCE223D23D07CF0B60846C111A07A86448B9CF119754935E8C350752CC60AACB55C71F4D5F5F2BDC3E412039D336ABC6F3D46EB0D1C2080CF260EE77F5C73A35C23396E2324998B7DD375537DD35B5F27C3B545492F682C4B89F13F65FC4F72539E4A7763BF4AE2443FE0A2F683A86274672FB9581668CD2B075C274B242536087C4DA1E69D0712161B868ABE86C98468FE43A42DD2AE30089ED92B7A750C73B19A6D70FBC0AC08299EE2A9BC94652B35D5B2D679220D34D3372AD756F842861470CC3A3F2BEE75112B138613A40FA585E449FADD6353A09363EB6025D4B81F9F224817FC2DEEAE01D797AA8A0F8C945FC69D5891355C28ACAB8997A0518C8F4465953819113914A7CB472EABDD1A8D943A82FA41315D006E54AEA4CAB21601A2ECF6CA0521579A6A92DFB6B77BEC6D5A05B0A72F16B0328C860FAB66A1D6113B7098FE50F3B09C2306D0B9D00987B351CB2BE099A7AA7EB7AA691A4E2D243DD7D0D864CF80A4D2FACBEC3C1CB222883CED667477D189100A5677CC3FF0DF31D1119D5F31ED2120E5DAAFB99E8F36E77B3B078C47B3D527DFD6521D7C", "593CF84751C21D591BB62FA0B0AB65E993408A016415D6296E0F080FA9149A4C31D8B2EA68CD7209E2FB0B4BCCF654B013D92AD7A4F6B1935995FD106663CD5760E63702196F63563DC994570C1B8E9B0A7705002ED56D335632ABE3ED8BC6CAF109F0588040DFD167DC364EA7F692D5F59C5616A6A7DA0C5EAA4D9FF017820225D5B164B6106CE9307B56EB08C563F123A05A4C93488DF63A6E4274BF5188475E8F7ABB8C3E7A8323F689DD93B043BD98BC948A567E8C6C95FD3788ABE728F7B7E299C460F9B35A59BA4429BF417B9F8C54F2DC475A7109B9C25C0843AA86ADAEF388A9915E65EA08C96C4C84022368E79A3A466B247EE6A37918CA0A8DC6AFE291CB9D360D727B6E7415D360AC414BD34DA40A1D995EE1303896465D52707A4F31A30C7B7DF936391435A5FD3F06E336CDA36E473E3D990A6F04FB5E6340581AE86D8EF81B9BA68979058BCFA1363D3F711D33EE9E3A8402A14AFEBF339BA7C34FA4EA2004FFD09129667646A79B6322CF00E1B46C1418557E0E62E106901176CA771979F4B6B299BEEFEF7B847F4E3ED99F56D44F5C73F00488E1DD862BFFE5290DBA737FAFA0C9D95C8307A10DD309C177BFC46A9F6D3BC86F598DC1AC69B070B9AF1CA2824F456E73747A0CED38631F9AC222914825CC3898F04F6AC09B01EF4CB09A63C9436625E2D0AC3C433A31D86948CE34663E5462652980B3B57C0920EB63879E28CA9565BEADC47F29C43F1718CE34CA5717D7AC2CEB6758A16F6D769CC277BDB483808CCA3A6DB99D1018888BB6A49D325891B5D6B4B77B18A5A4133AFD5E8AFA4542710483B52E3D51D8A4FB77D2458C4FBE2DEC1F6DD8C0FDD8FABE2130297D0606F07B305B2CEDB39204E2B8F8507ABD49C0FEFAD0332F8ED98736FEF5AE4FAF8515CD638E28F1555F54D7A64FB38D0B47734D0AEB8B55A792259427613733F237FC57DFC1AD49930D9844C9F44C3D6265BE3102D93E2B62D3B0D7760F613B1F5F5176E0C5EAE47970D30D211403477894B8D66D03CB3AE8992E16D52F6B2073DED09D504B36289644241EFD21018C570A2CEE6D59667F274CBA5733E41BE3370DFA47464AF850B14DCC32BCF1A5A8385314E8B38B2A642AA90B8A5647DF9B32B83D3B4B2AAA54472BFE84EF7DF68ABD0236DE171E5AEDE1770F63823EC143B30FFC69ECC464CD755F5AFD2B51AB5F05B74E96F6108810CDA94F99DF828EDE147BE061FEA46CF6A84CAC720717733A17677BF620C4963DD1A08512CDB6A96DD3ADA995D84A934C9825FA3B588D916CE1898F6C2F75B75481383B27204C343CCCE41E10DFAFBB42BC6BCCFBF7BA4C460147814014F9470ECC8B99D677EEC872172B72E5839D263F55B9FC91AE6143FCD1BC3AEDB12312ED10647E011A020B27C69E35CBA94623960543DB08D67B8CFD06760450A067E3F868386975793AF43AC4D0F3773AFF6C2CEFC8310C0701CB934098D842604E38370182BF05A401C38B6CFBD19CD7D4BA186A595ABAA48B8740DC321FC031D76F82B4F5FD6949AA101D70A702E18D8C2BC1283C2E2CB138699D507FAEC5B6A092E5AECB0AD9BF2E59F175DACE05DC18E485B04DDB963426A117CA0B761EF485B234971B6F681CE3CC5CE58A9BDAD9267E5C075D1BCEE2C88637E2A10AD441E9B1CF4A324B77C6623F4DF9FC6C4AACE068F66017BC82D562722FC93B02489DFBB5560BF60F57B736212DD8A0533071D10ABFCB4EEAD5AD9E36E856C8ADE0B9C4F6F5116EED43A39AF8FFCFA01BD558D7575AF0E36F2AFF74E29435778F4BA57A5D90", "214AD702A657F5A17A601D77E0F4C6A67B7B8C074514548FF89A781CF2E0B5225D95A944D1048338FF3AF206D331DBCB3F5E9E89C7E592A2295CB783F416C4160FCFD26983ADDDAC52BBFDD6A7125BA4426715F82AD9815F30B2DDA972A2E814D6BD231D453858749D65EE1B4C2025F61EFDF8E12E50A3719899C611682E7B2AE0CC85294542DDC04140ADDCCD5DCA315C22E5ACB196531A3B0071DC787C2753C3069F5D302A9FCF99B71317FF2749749C6E00B73F382983E1C91BC8115FEAEFF083434DEC7E8A22ECF2D1CDFC7B7ACB80FE0DD1EAF7510F694961E09882E50994169BF60C47B95BF37B5D6F13CFE48A9405637F87C157863C58E479488278B918DDF041214BCEE2ADEEF4242F55DE971E1A7F2EC566B362F89DABF163A690C8A8B808ABC1217C7D49933E30272A08689F7519B35FF8C1CE0F338D0B75332D163A5DCDE714B821AD3B8393A1740B6BE4AAC6008EBBBA30B8E5FA2253DDCF16B3F87B4FA47C1D36AC86E2FC39DE8BAFA79E7D58A3A6CD83FE09448EAB6020BF121234B23A72BB7DC02A2E235BB5DE3B2AA97D3931CB800165B93851EC81A1B4B7781F23E5C946F035026888C3D8C31170787F78333FFF8ECD8835AB5E9D165A8B1D97B19936940EC4C74D115A34120EAC800E8D680B36D9E29180BEAF5B3CFCC3913EE7FFDC37AC881C441F79A39F4A4161F3B403564F654B0E7D8D5415DEB9A6E11F845314421CC59C6A90826974B4CC477C280ADF4FBEB368BD848AF7F91D12E9BF4AD3E9587DCD7A280DEE9A7F2B6F2D2EBFF7EC9454173B748D2D90A6AA650D3BB97701EAD27D6AA1D05B817603EF1026E643C8816F183AECE863968664E01D6AC58C2A10AFB51B1A19A5B7BDBAD77D651B78C141AE70B074B9EF74BED349E58CF8A80A910F6DF8887202317BA36950F3B7EBAD45E6E940921043476B0FBC136EB397DB44445706F032FC47C454BA08DDBB8E71D1E7D9045655E1039C3C3D199EBA21596335BB04078DB6B39A4452662D282C7AC9B76D92E112B0027B711151C56A6459FFC70BFFC86941736EEF705E8DF5197B4D3AADCB31E421A90FD5179D9C3EA3EBC8FD7E9F4C29D736076723E2D4146EC325CFD616F6B0B70AE0DE179FA8F33A2536DBCAFAA2BC0A9740BBF41134655EA16438BAA5F8FC96256A6F9999CB1C57B69087C0612FEF4E6CF0BE5D1FB77258AF418EE0B90E8AF3DC38B7A15FF6B8D2BB739FE7D0099AA4694781E581A8F7A49BFCD102B7880E97B89880FC41D0890C33481B01D9BA991BD41B8D6501D34E0A401474CF89D089F3F6A189ED80C3006515CEB7F9DEA85D0766D2989B88280FD46F7BDC7C32C2294B2A1FD435102C2D92E85A03775CAF11D05F2367B57F651C7586FCD32FE920B1B94EB431AD2497E75F4E3C408A0FEF89907C6C830FA14402B1103DA4607F3DFAD625AEBC235D2392954B8D3BAE8A6D02CAE6D12EFC73EB46EC56E13D2729787CBB5C64910347AEE384972A5716B5DEDB99FCDDD5660E9453900DC1AF1B76D151C00E8E4BAD38E84830EDE92CC3099861C92BDBB59D8DE31AD9F4B889D480FC8DC70382E8494E1A25D2140740A5F327D51D0D3CA4259F1CF5DA3474FE28270C9B4E7F8A714F7C69D1F65B48D7C9C69A39CC58E2C77D7A750CC0B0E5D54B2F3450B66994DB524F15AF77CEBACD3CC611B2C95F6C93EDFEB652A70748DF1788E6FA2D45AF171C1AB59B0B2A160C075AA4A92272BC0F22631A24EC94C5D38664B08B46DC96B448C351C77F81051881055ACE0F364C80372EEE5BE7C660C7406B03C8F5345A04", "435EA61E7DE31409D04501BDF0CFA57A84C1387E0684538E8BB651C7CF4EFD6113EAF9383BFEFDEE4C702FD5A070FAA3DC7D644CB3D96C8FF65F18C88C43A2E66EB78FDD1EA91E9CB519CDA9EE1806F0F10653F3AACE782810776AF25C9CE1C580C381D00B95CB02AF3F9892B4D918FEEBB01E7E730079266C4FF0AF0EC305D3A168197158B5A0D4B1C1FBE4FCFBA947A5CD2E5324D0C4182069C6F328465EC2900B468E145C0F41D724D65547808BED468256EEBD76431E715A4ADAC80D5314ECDD03177AD9175EEA9D9149128DE8715534A648069F5EB9ADDE486029C69C81B1ACECE89FC468887962AE2C063C5EC7B594D88E56F2F3FA4A20963F3BC730E74923BC2DCAED6EF38412E9094326930D2D2E3A0FFAB2217E9059A88882E2AFD3E62FA4DFCB5B084D0CE53655539BD0931BC063CBD4E660A0B1BD9C7D6CF2836C947CEF2C07B859686424B57FFDD0DB6C34DEF824D835918505F36755C298A09F935A2F95328248B5E923E55AA4C91BBB0733E4940A34AF5226C21EEE9B0E0C3D15397A4D8C069B94C2C38F61FEA2077AEBC1F7C5E0875B9A7F2041BAEACE95807EE05A366016B6E0FA2E7E722BA34D3654DFECEE78DCAE199BB44E164E61729CC7A924CA6C7A6C061C6DA0936B4C70A02223EDA01D7B8C0D2E012F998C3B94D1387B6CC65DDA36360ED765F0A23EA562626E12145EB2FAC0F49BB0DD7D1ED3E9B2860DE1C54FEE8D60EF56D4382497C36181E864F92A95E76CC516E2E1396E2B0D880ED6CD14D2410C9BCA159F57DC9B763ED7CAB73F9EA5D42F4BEF91977C114900CB0F249B10DE8F4FBE220181D4FDB5D836AD2FB70F06869DD7F197F121FF748ADD6DF6C48ED9910F51BD7528DB60FC5A42CC0B72DCA6FA66B617F12FB2A9530247B1709DFA7729A6C9FF5B13D073FD7165033C45B5B7C7C66045D1735979132C49CA4442986760CF8F0FDEC0C0BD5E992641075C76168B8316057A993F513536FC917BFB783C28B2D4878D120889945FEBAB84BFE4840C61012043E96910A374CE33B45F461B5492E2F96F0EF91E42D7DC755F37117852C4FA99B106F5CB5C70BE5055ECEA5DF90B517B08252DAD6F20013FAD50F47A1682CEB37AA0DB64E4B699E126CEA7034969FC5468D19455A1F2BA4011AE5CFFC2544329E268326345C9970756F8712E7793301E9D3C92787FD10B7637F5511E27A16B8DDC21C116F13B0F27FA2E5B6DE60837F011937A986C00A4D9551D37E994DCA480493DCD5C4DE6F40D0E25349284131B9E0B3B6B9BEF6B9DB6DDBED89CA329D9F3B032E2C05BA9999CB02D7896258E3C4504643DBF49A155F96A69148A51F243CFCC3B2BEA7E8BD534308E752C675CF478A231CA99C2EE402EB5DD5BE2AF5F4FAAC783141BE8D2A3BA44156A3D1EE98763108B9EF4670B25569DFF3568FE0E183938FB150FB79F7F28D51C8CE40089C06D6A09F25845B50E64AD231B367C280883CB7FFCDD5E4C044BAFE6C0915A0C52BB14876088267EB84A01B9931C03DC799995B6969E65CCEC63697F1F0E146B75EB6987550C23DF2793FBA8F04D019C31AF4AA747F3BCF00D6FC86CAA707F1F27DCBE598B18ADD6BA048B2B174FFFCD20F93DD2F8E860885A15CBC2F06CB10537C205E143ADDAD33CE8CE5E6EB22C6A917172BF962080290AD6FB88A91C7B63B64047BBCB60309C01F15271CAAA73AD93DCF99400BEE17F6F771AFD156CF28B788586A18C21739AE5BFDF8F6B8FC94A9CF1EAB0399F9FB53FE70FE5E4278AB909B2A00F5A181F67CA7F7E046209A2394C5583CEF4", "C1A7D5578EE6929147D34AB5B29B97864F46686736A0966EE7298963AE27040F4598E0AEA235B562DE84BB1943891101155AFF6D185D9F66E5F9DD037B048914D7C1B55505455D08DB2E0C58716AA4C4E779EB7348D486F445CB8BF499DA3054F087ED95C2561770335DBA67F1EDEAC600071AB5918ABEAD7E55C5C6E609896ACE2426C47941C1FBDBC4804D8FF4C9290E8ED35C967D65837D6E2B153A3DD843712AA34BE1FD7CE0D829B04DDAF036D9D16063E28F627491C1C37018FBD1EA3D33899BEDE421C1910C2957C13B8CC4B8A06C8D3B2264E8E1B8FB5811622A9986B4B6F673994F6F5FA072ED8A8564C2AD450CF801C9992779F292994A98800AB12A9EF07F777F441F19FED6314404A9949218B2ED4E239EE677D8D1425D0547CBA99C1333FCB1620A8D11DA5CEFC51DEF5B3C4862E17A6BE3C194F88B7BBCED98325D638877757ACD448C0A970D63603B58E3F4B8A361D36EFCB6AAFF2858E14B1830F0FFFC4C5CB08BFC21FB091045B9A7F8DC0FAA02A62D1FDF7178B5DC90D2111A64CFAB0D83680196B21D75EB91A5B3E2568C7E8A6EDC65048C88EB34F6494CB697E44F895012AFCD7AA86DF341CB9C63A7EEE8E5F95E3D60213BC23C5A83CFFAD4225BC731F07B34FCA550DE26E0D6DA29F03A1D9C4233D9A0633D31AC5F55A11C1208C8B85306CAD41EDDE3FF5EC3A61194E724EE2D6A4C94FCDA217BD7C7FB328A9CEA8064D94FC66049B56AA1DB9F977216AB4242D0EFA59AD18540F1430A6F4EBEC5CA7EA81EE4BFC6E77F9EB6352B71275D450843304F073AA82D77EE5602B43DB62B9A733320A67B2727B21B705B86D5DC1459B5EB688D37236FD37A7163E78E8425C589DC600609DF3E9F36F9094D06C60731527B8ADF58A95E40C1390FF657D418D675F528B3B665FB5F3C56504DF40C1D3EAB6F3CB85F5C7954587F87744775382517B4C652B4259571A8AD219A6517E2D6D3212AC1684404DE7CF71478BEF7819DA24B09A11DDAD5717CC63995BF83DDA735C3A50F6B164F26D6A79E3B20A1488DE2AB44347694DB8EDD3D957B6B5510C4A266E514164D23F1594D84487757EE6F4353BD06CA7F90912AAF5188F217FCC11A62198E2DB04A016D36A583891D346C0D84241027DDE80090356ADEE1AAFE7CCDFF983FD7F8827BE286280BE118FD9FCAB26A10D19BCC63A9AD9D202036193CDA36321A5FA7252D0E65FC0D8E588D70C3B629D830CD1DE2798309A6B6113FC2A16B341BCA4271B5994ED767F2064FCA7DA335BD1D6B21F54CFA0DDCD47E2A38CA924DF85D2DA869F6DEA8FDDDBD20728A21034355728DDB4287FF0EB5A9DC113A71F7C69899EE76BE7D186B39C7C868E78C03E923FF199246908FEB48AE45261B3F7A8D6E4FD0C280545A9E3A578916364196E483F57EC37439B0FC9FC37C5CF56E21A5CAE0B70D25B928EEEE456F19821DBB974781C646E860EB3DDA8EF8577CB0E3B9E96245E14CF4E51A5D11F7AD9A77B932467808FF55E588455F810CD50367DB1621469AEE8BA6FCD52C75BB027521C530A918F9D646C69EF8DEA1F7B14354815F11E0187F01F677E2A0FBF78ECA2B1E51E898E26CE55693ABC8812F4CB4C10B9BBDF385C6AF0B340DF8DD2E957D877DC1AEC30D4A6195F40F09B4CF4010E810C764EBB57891652C156DD20584E427902DBE82AAA3CFA728059D31C36253649FDC00CCD29517AF2FFF4F5050B0FCBB73B2888C989761A7F0551375E4D3C54E0C9F8A4679E640A73476BCC6587195A82CF5E6F550B0A85D57A97E3E5D0B9A194EEC3E41C0", "F0E94A299789538824A90801AE02D93A78EA914B9A8F10FEA2D2A7D0812009C732665D48F6DD58CEE4CFC72513CBADCFE171F837E79B8776B392B2224C02766D0468E513D0BD1BFE6ADD6C04374604503A3EC8539CC707110D18FCDC8E000EC1A3DD03F7008D37C1FA02E419FD4FC7A6C81157E07E353F3C4882C2AEF4A0CCE1F7A5CB5EC753528152C521A2ACF7548F19862EC31D8783BEF406EB7F756E41CAC3FBAEB9A901F9268E78E06ED5D6CB19BF4606C9DB660C03A9D5B06BC235DD7936ADD74268577256F72C7F36CFD7D4D09D3726F1908BB3277AFA69C7166EA2F4CC9387B13AAA8131D9F21A5D97C13C7DABEBCE61D72556466093EE0F87E9EAA9CB42245E1BF55157013C4350F38596CD26D2819F98698CE98F5D4023BDB3C974B0E61FC6E6604CB1707BB22FF5689F3DB3AD4831BFFD3F93C702E0DDBEBCAF626FC2655447134570B7150E030A3524A6979579296CEE062D18CFAFFC4474490DA81268B27B60E9E9BAC2A9B7D2E2377A2006AA5C439C263E8F9EE360B42E217646F7C44EBBA6D9E3B98AD20B1BF7CB8CDFC62CA7AB139BC2DD1C85A837F51AC9BF08B3F36CEF176A03F358E2E37EB5DECD0DD2D544E58D203910613EB14744E914F92C5E9274FAB025CB6D8AF16EE03FC86AE3947F7A30FD8C1EA23EC7EDAED4054174E4E6DE048C563B1832F8839927ED3EA54B19BA41CC144C8D8A6D8FB66032BA6F4E16DC81C98D37129B3458C2F2A6517694FD8816E8C71E00D77189768C423702612D9863FC2DC1C4593809C74D0AA881DD7477BC584376DC6C177347EE17F3E17B524D0DFB315196035FE6AEE83675494E23BF2433310D4C72E84DC82BDCA9B791D5BFD620212172AB2562B5C36DCA28C5CB8078CF41F2BDFAEE651B04243326DCE0C51ED88699CFAE4DA3B478DBDB92DCFC8D2EDC4472691173B6C5B9E5E116C30DFFDCE7B0381E8E1013CB392056E3BC7442B2A2EBB631ACB65DE639B3CFD8EF3918531480A35314F3F23F9AA6CA41A9B8F6D08F6C589DD2584B6B8285230808EDBCBB99C0E918D4E73AE7B397328502F2D47078CA2FC0BBACBFC9D9E491EFA2A2DBD69D82E0D829F74D5ADEF4100E6195CF3D7AAD2041078AACAB8A8EA62FA42C6AAB6203D92794F77D4E30B84BD16518A9A0BD0AE4B372A537BEDE43B31A6FC1A58F9B43AABD485C55E630FFF8A4359DCD52552B8A090DFD5CEFD972551714E5F0A2A16442345B33DD9D232AC8431EBFBCC5D5165D12961D1E954D01C0379B5489AC0DC0357667325AA864D44269799DB710BC6A25D90AE8E0C9368BE911C91D68A49815850B4B29708BAD74B4BF3590E6488655622DAF3A7B52356C804487133223337679B33E583B622EF873962E8FE259DA8F5DF61748B6799A14ECC763A1B54542D67E57BB73E411AC023907E54BA0EA8B7F20E55739BEBD7F83E408238B73249CE69FD2DD593565141FDAF12BFAD3A43670935354ADA4067DF0AE4150AF306AAD3071EC4DC0AEDE6F568DCDDBABEC98E4D17AA99F8E881600D35B25CDBDBE5DE184180A9C35EE8B42F6890E068700F06E4829A742FFEBBB214D17BA925B5C0B41244DB5BC7AF49D9A24B2C135131E553CEDB2CF4E6E2EAB840AB37788323024123853A19CC04F6E344A175A4BF1A16776B7F84A17501DE4A594BC515E788FD0AA08ED4BA3602838A6D1D485B1CB80BD24D97905A9A7E2DE71A9A4CA32689C46AA9EE52A9EA985C85C9289ED1577B577C444FC73FD1BC3DE03F9FEFC10E6A17553A7E3FEA6D57AB71E2379C9C5F8904EC43E57D5FB119CDC", "A8C2390D6C3F0B9D01B9794A4207DE3F62F00A4D1188C727B2910153D9BC6337AA46D2D79D09DB7656C0B28654F1FBAC5C3DAA8A75B16BEB5FAD8A256E38EFD232E007A741028319EBA4A6DBD0AE1C1F8989246476AD4090F9F4F560D0CD72815FF6AAC29C8674B1D366120EB3213300E99DF390B3169A1CE03D2A5E471B9B8DCAA957259311B97817088B486CB680047359440DD39386DC2BC24AD2AC30436A08C335199F08861F93177640074A241D9C5884EED07EF0C0FCE8CCE08BA30221150C9EDC6562344CD3E14D3735B41DE2CBFAF4DE0F6D417299FEB38146625F3C70D8872103FDC6970D9D37D1CAE92375F81B26566A78A02139CFD83415BFAA5D328674797DE51E4AD9B3B9E1F9BD18A0FCA255CA8AE7E9E192ECAE5C60E9F5D578E59F7F7074A12FA75F9388CAC0A148CE9223681A93D62A679254AC2F41CDD871BD73BBC6C4E0CC9DA67633B61BFEE815F4E15ABDF639899DE105A5F4D74CCDA3EED32219BB447EA5C6411CEDB351DD76CF11456EA762C2F300671A12DD6ED8EE9AEFB4D0BD86D0CF35AEABC9B9E7822478A6DFEBB887DA0E2D3ED4C010E5031C4332FED83480C21ECF904B65925C4CF64595F20D072C7C6AF12DD3C76C682833CC6296DBDC73DC8C979004DE4ECD749BA45D9748DA728AF757FF5422B862223146AF86AD4AC4D4F407DC2025B8166E2CD64C8E1543E046ED91AB1AA5524E88AB6851752AE5A2F02F933DB3CB7EF48775017E000386805EFEB8CDCEEBABE613A87E0C554F99DF0C8FDE49FE73DFFD48379299FFCF738EE21B9AA1AE4DCE7BAB98A356241545B6F7D186AB544F77CB61B6492BE1F02C4B77DCD5083DE4319D1A1B792961D11D552F8AFA649EB5D2AD64227524722B0CC97260A8B3B6493B00D258A570CB238D3C2511C0582DCB478F878528B8A88A5B33F9FA6C41302DD1BFAC664C692001F7F7D207A8850D6FAF22ED887589405739EA5B5B9812BAE617889A225FB2E6F9EAF77D3B3758F9ECB89637D1FB20C428AE3420C3679B834EFB0F89A389FFD72D7420F2435D118045FF7B7361FFDA0BBB6934F81AD8513A626CC25D9A5E2A5FD1C51229E2D5FF803B8983B672E92A1FD72C16520531C694F44C9C99BC3385A610239F6963E0BB66ECDF4CA29E1C175E414A5D3F9E9F495F2D03A073965643186C46EE9BDB41876A41ECDA224719F5C76AFA6E955061805F023498AAE965184ADD6F6BA1DFE0BBEFC3D1EDCD40D8F55BB518C9B45CEDC95682B24F2818795CBE5D8E504F0885863C750524D9D238E4110AEAEE095E1C545C2989BD7E0BC0BE8AB750A7D319AE69CB080DA562F7DAA7068F38B14AD7282E041835B58E2A48A340F993D10FF4F805280C183A3FB45555B8D54EC145CB7B9BEE71D7BA652FC533ACE1BC8D621F7257422B363A5AD2798FB0E6E536854F2BD25914AA0B6DBEF1E2EF71FC7890E20FBCBDAF751CCB0DD16098D96FF22961B6141257AEAECACA339750950F6895107355F04F9BB3EEAAB3A9024E4CB79B19ED7947EDE79958B669077E6BE182020536F7F234AB2332C2F2790DD96F5816AE3FB5F2CCD72C6D177845DD0CACB44128F6EE6B1C2F673A8A50842E13C8FF0087CF71B8BA0715637A40021998652FEAEAF5719ADB71EEAAFC8093E525602599278B35600C743AEB41EA78CB0427D0894158DD4ED564C4742033324C58B01C15822B97C9634FC8F320C0B103F0A904D98C9AC529FA799B30F8B2C0888E47A3BACDAAE5A3DE6DF39A693A9AB3D95E7C973C7125C0F7D8C59B37EC924D7B9737724DD92818360F2C", "2EB63BA5756AF5865AE33947E311A5EED4A0CD056442E19888A2B8302ED8017085DD5D137A3769058F0AE0476AB202CAD822D6A781291C537120F316E90D2C3CAD13381EDBAD35505A5B7DDC41E46771F460E501B9BE17DF8D4DFFF631C365AAEBDCB7D5CFF7010BE2EBEAA0B99820E0BF3D290CF27DDACF397A5E4922EEB7D8BDFDEC96B87F8202BD409F31A200515EB6A05E25A5FA504093F1D82A83A777F5389B5C90E66C369BB654598CBF3F258E9E14DAE819837A86EA775A05EC829B4889B816154A2B7882EC7FF71BA7CDAFF873B5CA4F35011DCDED8C0CAAD101F7BDCE1CBE67E081D98EFAB71490AD12AB7BD9B4CB9331B6B04D6DA2C12311F96E01AEBBB350BBC7311E8AFC9A6F42CD541ED40E2D7BAB44BF7F1E4465CA942A0E8767A38D89D0231BB897A995627EFF71B3E4483ADDCAED084B402A3CB23D5F91872BAA49AB361281454AADA57AC838AE2B34B799A1B46595AAA02A9738019EC3644C63BFDC72F72CFC35D48D83B831E6EF397474C43CF665D64DC0376A437CC768862A92C941B9BCB8FABC6804C03BEF7BD2C5EEE4609870803A5E9BB2FBC42028C5619C3706F773426CEC39D096FAD267BF5E6C7C7510B0D1948FAC573C5716EB4D6AC6EEC492B347497B47C0D18C77E7C264E9A04A4C3DEB83B1101E40A0A8653D9495D4A7C13A5BFF3C6956E668DFA999926231811F3AE84195B65213FFB824478911230719E8EAF206DD99C7CD7D3D7661E9F39250793C1391033EA99A0E31D8CF83997ACA08C43B47240BF1E5E9D1D741CD9E6D3F5DC2043C9D3D68A2A689615D39014B75FB53B4866488C4B37B68B5DC5F9B9D6AB9AF190789CD610E939960ACF607A488964C33DF0091FA4EE86654142083F68436D9700B3B50949C0D97098D969BA25622C2EC15FBE7D7C7B78C1C49F671672971E38996C2D77A024919FC1A87BB9BFEFC951EB75326CE48D3837068F31B9592DDD8505AFF1E0E31911D1F4E311CB1B81DD8A03D68A5EC075D8ED7D69A1D595E7AAA70928DE93B979438315A4B98EABDC8B5E932257AAF79A9CCC74E6FF88C02C33217FCB3FA8DD72AFA1E549B9E5CF6099E2DABA07C91BD3BA6A9A4936556FFDAD89D5F080DD7F818EBC8ADAFB3D51D8BA7B48209AAFEAC184E1A869FC88BDF92E77C6D4B8B983F4B93A52C473F1BF27B4D7514DBA522ACA79463A0B9C2E0D9A2D47DB238AB9E2A1636B9AA825272F2B9C8D36D64614A4CCE2EF31B67682F328B46D31FAA31DF874FA15799B5D53E143C9E9127AF358BA1B43A9418FFDE00CB16D32AA137FC7A5A1CFC2070FDA112DE600F3C05BA0F50F8AE1703AA2CB64135C29FA621385C803673A4D77195B4B74E554B043FC07B106533D0B41F7D882FF3702692709A64052C4AAE51CDF8B733A92D86D507B6FF4CFF5F3BAE4D0D9F3F90AFFD774591E6E14539CAF99C833D2A1D9A12F7E9CB1CF74FCB353D11E22B8216FB91564DDA8F1D2C9865080422DF0E0D8AA47577F31A7682B54E36BC8344D5F5F725C819D3DD3A948F4E6F6C893491127267145DF1B286C18C4F3EFEF0BB61541883E413EC3EC3BBF99D83E3919501A3CD59341BDED35BC39B655D61686555CBAD7A1B033C2E326887249E6E30AB12E43793DD1B72EBE858B40ADF4400A59363BC56063115492E114688F47447132D606F2B99DB9CA4083A91E35AED045C513EAFB7A3F0040848C1DDEC0FB3C2CFF717BC4CA36C425EC3CA9BC51B3B3C1885FD8B4182AA22AD38CCF8FE3990DA75CDF5712B358BE866A6435329677CED89571C3877F9ACD0D3E66884", "8F0A4621BCBCE418BF2A77BD47D671191216B230C276A0D081C4F79AEF839857586F9DBA52B4E35AEF22D86FBA66DAFE801C686F03342849B5C3A492280950C7F3B725DB4BD6984A6389CEC1AB86F29D653781EED847D7E69C99320F8584700E662070E9C43957F4DDAB28DD2427415FEC6F1503551D972DCF11BC4EC3B3FE745DA7F717F35832B8CE373A00AE6572D8DFBD7720E00517C50E2B634B6BC3942F9A8C035AC80161CDB45AFDD7E9C473F8EEB4F1FEE7A677E820874F03B546464939F3EFDDA157C9F478988F3ABF39BEC02B722C559CEAF997A13AF66BCC0BBB4DA7B68EB6C6E8498129A95D021B7C3A072683593C2990627FEDC52F66F3A16A8064018E6618BE5D7C63BC622DDD4A15A33EE19E4161A50EA38CF6626D5A088FBC5721F567145CCE30C66DE60CAD79D31B703B129D27627BB5AAFBD9BC7D43944B9B0D255D8F338C7CB7EC56D121C3F4E61FC0D46CB0E036262FC182E8F266741842DE923D276CED79D4A25FF7AB3D2571B1B589E01583371BC8D8196A1C991BEB90F7FE71B99EF9E100375D3E767637B2BB1FC907846C53550DC4E6C7B8AD7FFB9DBB65ACB30C9644FE9D59A74B0E81A5BA068CBAEC9D6B362BA05202260B1E86EBB67BAE2D74F60B7E1C0B510BCE4EDD8D71E342D5465A8032E87617790ADE2770D0DEB1ED26D62A863D030C781D2FB02490718A5B55D1BF6B3BD1E3B3C163361B2F13E616FFC87C1BDAA7D7C88A331511ACE5A45CB94DBA557EC47A670BFFE839069A546FEB7183C27697A56B65AD762735782FA009350ED52819C23AEAD72A7150DE845B899669EA37B4A12D63BA7D6DFDCA495A0957BDCCEE6BE11B8B296358E92E60A2317CF4B7542CDDFBADFD18C88F5AA4984614A113E992DEAA18FA172C998EE6FC8E936E69953EDDAA3FD233182C7B986DF90386B3661C649EB0F9A7E65B90572132408929968CDC39D18020C6D81A3665639CD2A3612FB2135A6E057F0F68B10D3CC1C35DDA2600AD1C0A6FCC0C5DD0D82F6218F2C1F8F5B714C47636CF68D5361D97DD1367681116F2A2A045894A85F5FAF1BAA27F93A3B8809404181040C24156433B3B87467B27D7C3ECE44EB763D14356D6EBC7542E21863700505B8A10D4B4B6E9D2A4C2EEC9653BBC0D9FC68DCB53AE7C8B6CF3120C921B824765E7641A3E9CDDA804CF341012964EACBF55D6430673B83C12CDC53100DD8BD6B18A56B5AB68D83EA484F48D4641B94AA2816BF06EC1D1285C11AD060735509367FDD0E300413911442846DB240612C1389CD4554DC8D7D7C7E4D4B79145D4684F1FB75759E2D506F9DFE7632CC553B945D91FE0F9A829AD6A9A18817B09B986B18FECD615414A0FD6B6070B15F2484AE8B3EC3DA36D7F8007A7BE336B749104C2695327A49D34741D76752DC943897B29C9651EA3C034BC4B8E1F380A9FB0F9D2C23B627D9DD8317894AA754B8998573F025A024F43E03EE86A1EF583CE02DC7EC2BF2A8EF9A3C7743DE2E6DE38D72B5E33BC5CDFCD12184C9664EE7A3F4FBE9498F59107BF8B6DF69DBD6732AA8013FF8B4525EA9E40FF6F96FDEA2AEC03311D6E8908D426293E369D52F818233FAE1C2BA2657B38FB82E7864CE1177D5E21EBC8AB773EE928EBC4A7EE9F4A9CD2D9F15146C08E4BE0A77CE272A98AEA05A6DC18D5B856EF1B402F9851BC84DC95FCE71320D2A5540D40BEF67EE2709147EAF3C3D5BABB0B21090BA4C94CF7242982BE35925F691847A7C296B973EF2172F83AC9ED5E0A0C91AA697305F79A3FC6A8EA4E7D1DA88A81D4DDBC1F604BB0", "896DD4C837F11BF155D4605D46411A63FECDCD64D7AAE873E1DE22DD62CC2F8982EAAA66BCAA8DE8DA687910A03200FE437BB87CD5E6D17C6F5B8CCFDA073F29183A1E12917C5D78CC1CCEC5C2B04040D39E1E74867B21192EFF2629AEEE22427EB5D2399515D892EEAD80934668BCA906109F6ED85AF29E702FE6C112992CBF851232A4C140BE6CA9C8DB383D1729B41BE939704297BCB41E4B8C7DA5B24B93FE7E7D2214287145A764D3263C9EE136457A2A270EBD03408ECB657B78CB8C0A5C1767521D75A8E12D9FCCB3CE8F6321B55C50A6102381E95C12644549A0E5AF29183316016B89F6797BD89BA8F1E932F4C91C0460F35EAE32F46D42D66F639A87C25AC6E9B9C4E475B7A4A94F10EE0C1043159CA71BA3FB4F794E766C5A7C6F7B85088CE1A2584D4A765D7888F1496ABE23ACA42FC001E2D30B3959AD7BD941916E27DA648833EC82004AA0937723CAEC0A8E7FE3C6742DF8E1CA797F13FCC4A07BA75874FDB6A66014C0EC688C5F5E0D1ACE231B32A1A14A2503155D412BDA98FBEB450D35797BDF96264D141EEAC77550408F6A63993DF3F89D1EDC90DD0885227C273546C2D86D3513AC3241AAF96C137B69970E273B73EEFBF8668B9946CBD118CD1977445F87557DA03668D4F3A6B5DE6D0088982F6C5DCF082207A99B376B155FDCBA8A5E47F2CA4A50D48DDFBE05F8C1D28A080147FE9FE04FD49C370DD9E4861D8E553A22B7DF7324C51C20F10BCFC18EB59BE931C69232419F5E037333B52FCE4A138617B08767506B793A430CB3EA0A4D9A2CCCF813625FBD2F471C39DEB2DFD0792F3374A980FA4B208185332FC68798DEA1728054F28771E0AC3FC065645B3E996EA729DC6A29CC23F872BABE6A84911B1B6C256C38C0A62331EB66E2F8B9A77ED79E323B4A96728F0ECAC851C3E9C15F2863CE6839D3752F4F206C72EF0BD60F087315E6AD3C7C836FA3C5CA6BF2B72D877E33C17EBEE283EFD62F395637E784A84A3E4EA174BB501D2CC216306673B06433A05ED052860666A3C3D7E7D7C991911A56100A31048BB81FF71110697C941CD0ADB08705A5A73CE66AA87008B08B51DABBBC3FCE66B11135844BCD8CCDF4D010D7B135AC764B678CF307154B5A96D1541B75FBA65D7A0D5C2BA2D1DA48BF0EFB9BEFB5141AA6D30A59695EF7FFAE250AB52DF0969FCC349E1C7B8D90099EF0410A861FB05E37D7156991FC65542B3495CCE223CCBD383DD4432113B817B0AC4000F9EEC55EB377CF48B0F51B8D02359449CBAAFD6AB69E3616D6A3806BF67069F2572D1AA0E7DE28042DCA01533E1C381449E22A68D901424498DEA67F0EE80FAB6FEEC56BE01950969550F01D62ADD52396E927962F209B262674D2F079D0E48D1C994864BA90CC4CCF3CEA06A5995072904CCD97313E82D3CF76F24E3B3946D11FFF45319DDFEE619D2B5D777795567A44767F12B41D84A4BF738A2C6AFC0DA08356DFAC343EF090176425CDDEBD1264871CB7AD526D9B4E469E866817A1ABC9973C598B1724C8C3185DA3C999636074C27320694F0BA758B0842D2D3EC93DA9A9CD3F65B321E378D95F003C744EBD7BCCD4712B6FBFD084D9EEF0C84C70651E3AD999D64BCFB5E8F7D9582C290CE59176072A5157B1CEBB5684D47271ED482B9FEB7FDDE78B424988E88627FB1299AB8B96CAA72239BE6930BBA4396118041D6F3CE51CEAD81DA54CFDC8BBEB0F6C8E9FAEF93E2C404D543A0F0026C291CE992CD71BCB0C6E9C459143D995C92A4A1C9A6AFD36E1CA87E1F8EEBD30EC9D209BB3F6410018", "0245F1FF6639D3C45134190F729CD06608426830011170C357160EAF351BB00AAA61F254B939D89335881D5D15F3DAFAE92ADAB2B59DB7D3EBFF526D9A6F44E1D8DD779753433A9A32A541A798805AD307787C1832385D8B11DE57BC3ABA2A81B70AA2221C8C9247EFB3A40943D8A0677F1D4E6F9149D97D6D83173FD3D3114293D628AB97AA4CC0121E2A88BD5B5C290AE7E5EE4BCBCC1CE73017E3C58FBE575701C919ADE5E94208789CC2BCC330719F022C1F79880B1BAC4E377D486ED467BC58B13F2FF97454BF1B4F4DEFEB3B5998FFFF604EA0BCAFE859CABA133AF969827887AC252B9D21D8AEC49A0D77FC83B4D9A2930732E9A22B7B823E302E469B52537DB5341AA0979642F4505151AED71B690430AFBDB09A8454183A23F86F598719B86D1E3FCCB72DD6599C9895CF6AC28FC5B1D4A821A6F9DD9BB7AA63DCDA1678AD816D96B919E47D0D0E95756BFDDC71AE430C4F71E521701452709B6E670306A20C2F60F84D6009DF6D749C5E02D3DD5495DBCCBE9326D7D302E2A56032F4CA5C82A107E06A867D09A2E5DE7DB9C250E25B5279A4867657AACAE0E3D601DD3BE26C936BF527CA9EEBF3B247F75487A01694C7595619FE6E90AD78BEA799B0BB0C126ACF3DE54F805725CA01879BA5B8412D4FD3D3CBBB37AFA955CF90248CC521B0FBD0214A8D4C9E4A41705714C8DF5EBFBBF2FBDAB93707B0D779357E3DBBB20D5CCAE707BA7BC5D21D4C23D72AA231E83880867FFF3A6B587EDBF5485C516239028271B5462F78E3B226B057F01DE2D348C7D08108B990DE8484E839EDAA174B3CA0DD6D1338513B3D1E4ACABF9C14A9E03CB373D039645B6447D7853257F74665CE10EAF27DC1640C0AF88FF4C207994AA23EFA97D1CE707AB08E4A615C580E3AB971D64371715CF0BCB8421D8178D708E4D3DB24B2AD3143E2176B4BE37DBD8812116E134DC9B72E35E8811F7F404485ADD7321D3DFDCED23BC8209A9DAAA198307EF1BC0E204CA42D7274EBFA74C88251398D6E479D53C5C6E7528BEA5BEDC8677F6F5A81A07BF7CE58E4AC38387824300D14FFF131A54390711F95E03CA59DFECE3EA4696643A16874F98B76F6D280F7328AFADC455C51712BA748D33741998838D33F65F0166BD4D9788B129CF7F9F0802758631E5A718A5058C63B0D38D9E6877778FB8CD8BB7AF099ED442C52DDE7D3C0746BBCB8595C35C815E80C71E98425FDC629C7F8084BA2556CEC31E707408BA6FD7A2F0AB83286A93E565FDAA34B7344474EF48FE5C99017887C8086AE4C8916914142151550B0222C5FF617817EF86920F1FC00B9D9E5BD95C6047731373DB142398EB7E5F1B29EFDBE41ED1E9BE725C2748EAA2F7A1471AAB6C15BC4596B6C6CEA5CB3C9F1E57179F96B3C3017C2244B179C384ACB93557170F4E0CD387D1D3428A7030B4276F8D3FD38074E9348033E3BB3B4A05B3366064C68E0B25F36C2E45FB0AD4606CF5A6B8FEAD45CD9790BF5BA1B0AEB5C67196C05D637E878F6D3108B36ED2CBC007F6BDBC7D74362085D651ECFDAE47FFB069ACCC7C55B726C0C6ADCE2760DD3509649DC58189CD7195B11245D76F64DF2D61B07E0C172313F39961BBC410E4000C7F7BCC52593AB7915D5B5B3E746CE8F15AFD2AFEA8200687BD1E0D767ED297347A1B0634A4F006033322F787FD901E7F2492E1B491D4F5B901FF12CA88B2B2B2982D7EEC9DEC4538F8E946172AC82CD468812EB9E7062AED4075AF0A587A92E9BD971637B3222CDE1A8965DE1EF2CD4A36F2B7457D27CD328016FD2D92B0560", "EB01608B4B6324D02441F4094E82D3DC8ED644FD9D7FE96DC544276D7E02568453EBE375974990442B96B85A9DCF163A5974EE96274A6AAA9EEB0C83AF9A2E27C4A4174EE1D4A4035782AEF83774E93F67A5A7B91E7C8E05611BA6747FA9F83A788DA50C9D4EFA17BCABB0361E055CE6D07DADE204EF601AF3D1C7A54AE1011C2AD46C27FC060A27073781A221D182D4AF531D3056401D61024A29FBB0030B8340E91AE3A32468CA48183567199F34A76209F7846ACEE0B5DE327B3A381087204DBB6FF40E1463CC7BD38311DDB99FBD05BDAF3B84D9E64958F67421CFA09903400DC87E212FA320DB95DF83AD6A6E247E92151AEA0638D3755A6B409E5853E1A7FEB54FEC711D75AB9CAB21DDB34D7115174E01E9F0A3E650F852666D06A2A8E133C872FE9034BF9A61E29CC319255B09E40096B6D15809FCE4C8993A056E4133BA1FC05933B643B5D476D3987E7BD372412852D439D38600BE4A7F22BE1777CD86F70F05DF3B260B41DED95653243419C5BD9B6288697460A0FF7C0E2928D707BBA41E46D1AE11BF3751852DA1516941BF67E5C1775383A7F88CBA065BABD2235C155FC69D3C11F5658B019B089A9B3A983A2D2533BFF7694FC271597C42EF35F8AEF804E18AA37E3F42E49D23FB9171A312A562BBC9B093D92D45EB6A1A8A665257D596174E1FC44E117397AA7C4C77FC1BB176C8284DBF4558B5259FA69836B68322705CF783121E3C4513EC11B76329F1310731CEBD2CC8B7F49AE8D87BCAC07B1CEBABE872B5F83D71FD10F300F9FA30F4054C476F86EE75AC68F1F80E352D3F9753233E53F67C3917C26F4B0E8A61AC0299FEBEF95D9A46BBEC9F5C16B5EF127EA18BFA609B99B0B362036F4AE14D11BD7EC8ED2B02C8BCAEE2CFE409899E06DA304E23305DB1AC0A7746A72746C24E6D073F1FFFD3BFAEF300299C8009043FA392DE2054F237A098EA5FF0E537105F25B7D85355A44FAE707B0A3D1D6B30356CF1BD6EA3BE57B3A6147B943D1C96C4E2C871DB1AB64D9359F1F3D15F9DE5F45FE8E03269EBB9759AC78F47DA7B913F09402EE65271859D623908D464B1B5E59E4580BE30E01C553DCC79B190A809C71D8204A735350C75C3361EF3C89C07B84270502BAB82FF089793838B13B3041A17AB396C09C4BEF716329318B95C7C4779889956961F8D2200C163C86F45C1FBA0567C8615F4E815AE8CE2E05589C006B4560D66A67495C2B99E3A951500FECF953D9FA7FB5843F102FE0F82E72867A65C09318A52D4634A3FA28B032B92160CB2E7D6ED156586D071B8CB147D139212BC47774CE580E80791C14FE49DE7688B3A99E966A9F869B0A7421062F18705AD23AC238B52E6D80F43DCF2B43F66965F6075469E0E789B40687D104DDB5CE5A12C0B741EDBF1A3E57BDACC92265D592FDD63703E534B78DBE9F13CA04B9920EB740FB220E01DC176C09CA51EB905E32398E739C6A39C02043042C5FFBDC9BF959D56842DB894FC108AFCA51039A9B28D19D67127856E29FBA3812F764D31AD4E2FBA5F00A828F85087B4A5ACF24CFA79A3B60C954DCE40BA6BFAAE4466C88A60293AB46FA2FEEFA2E3B0DAF0CD72B0CF914848AE6A9BC26F6578D08E896479879D3469E0CF39E3EA6508A412853C83BD33D0B993678FA08DF14AB40F41CEF0E7A4B992DAE6F884E193B10E5136DE079BF85936D3B5A586323B08FAF8A39B24ADDC2D7E1EAE1F2F90A39F26B130F060ADED352AF085F9169C4E21093FB2256C4E17416F57D29CD37CDE3BBEC8CBAB280DB69643C86696C3A6D3517150", "ED28B364884EDCF3082EBC5FCD11FA0B0823DBD808FA19BFCDFB42BB1BE2B73D5D1434C95DD48DF1ACDFD7DD17C741A387F18E7D78B2A9A894266167897AF1C8FED13D463B6BACDD81BCC2F3BFB17D2DFC0D43DD04FEFE39C801C8917D52BFE8D2E6F8C0C5159E0185805BF9DF91194AC97F6448B9189028D50B274848B429AD4DE45194ABC458485617B59FC5B1F1606DB20283A73F41A6B36731F6F9E978B276B33B5DEA3BF87282D21F63787BEB1F6FCD3B21004E6FA79330A3345F2C01C8CD1FE661FF9AB5B484B3260F2332FDB00216DA42D2840D3180B6521B01281E6D0F09664675531EED14A5C1794F3ED1FE634EF3D6E9D1B6F4871A45A83DB56FE2BBC52FCBC1E05FDCA884F98DEB436A9A238E086FB339E1A7AFE8E04A5110737F021C89EC5DCA1168E5CCAF92A04C950154F6209CDD01B287FC360B93E2A5661E7809FF1BDF3F71B40BA756411894B340CBAFF9E0EDC8292E7C316ADF4F3B827F1B82A406B53AAD8D2D660FD0CD2D6A6C693A73511FBBB97612A8CD3F0E177EE38D46100E64C4C540C834DD87E062DA2C6C3BE8A0BBC46D2070FB8D9E1DC396423D2BD1DD22F1F4FEE0E24F48CAD9241990B5F48A50B3B178A9C1CA71F71321226E98D1F79DD7F3CB75E0B0C16915E34A92750BE9EA173C276421CD0E54319ADB0C4E5ACB4BD599842E5028F613067083522F0D2A891BFDB190855B9BF36A7F2EC81EA89AE11A37B6B89126DA7C51A4BD0C902D0DDA55A4286E36835D2EE95EB46AE7D6B919C05D42E543D96D22CD241A8E6985A18F29184586E6A7C10D4A955D0A1983EEBEDC5A9FDE306FC366F77A25CFC10E5B8732D8F40D068224177288E9A13408F06AEC841C2E8612E6C794DE216A2B758C676022D4C0B99A4A54166CA1153F43FF66AC03F183DC30E9C83E6EC3BA33F63F262F39838E5C044625B4CB1DBEB7ED957B8F7CCCA6C63B837ED93B2C260F276175F2F95B235D4D1DC0C9014192D72CFE014094F29A0AB8F0A9BE896067D74BE5489F7ABFBD7EF442579875CB1795669991438C0B6FF13E06D5BA805DD2D0DD06731ECA45FC8CB9D7CE568921A60E68E31F31392EB82A39982BDFE8D953DE2CE0AEFFBF0243E43ED202FD6FF9E075A90684FED84A4334A8E709979FD5B60BCD60D41907D1FC5D927F9CCAFF2DE85AE1350C8EF8D68EAE38EBD0DA0D252F0B5C82E1C3EF78CADF92CC78BD990B06461BD77B78635C406B4109FE58850D2A97A6C23CAA18B9AEA535D344E41E783B767A439DE0762A23D18244E76D3219A10100264EEFCA45F19022EFEE72B856FC34E59ADF6DFC78D31C8690CECFA45321AEE33DFD40943B158BCBEA764C3579FD5A06BE297D363994E6B959338A3B48F14A3C58CDAF1D91EA1711FB39CF78F04E72B293B80847516DA41D5024CEBFCBB399393E59FC4C89BA310377AF576105CDEB4F6DA314E990B1513BE9DF738AD35B1460DA23326D2FBD86722DEA5D37CE5E34C11408C01E1881BCDA250C7FCAEBA9DF85AA08FC9503546A55F2B4D6A7D0FAB2F50CA8667C7456DF6972273B62A0DAF38BBC7D38B5B62F2F1EA8476F300D0116598725C0903B0323779E02977F33AA8C45C2933B412490EC17FFC2AB2B4130CE8FED8D34419FD15971EEA5759EEAF9F3E8FB4FBB26615B4286AB4C2AC57A6E4BC80DDB396043251DBAE26ADB03767DC9EE4ED3E0FC7D74C58175BC1F393F0CE5D16589879C6D53645B861B079B298E056E4539B2E2E70920D3A273398B4E9247771B8A23B276DA9A06945DCF343E7A4C9E7B06960A1F624A75B1B48AF0", "CB9F5B3A549646C4555D2FBDAF2A79F9921C54C6FEA316D7713D64FD790325A87A30DEDBDF0ADE3B7BEA52A0E319A57084A79DD706228989642E78BF51B7F1246BEF6F1B8724C57B0A3633FCF4440E9D57DAEEB343283D642710266386DED8FFCFD68B32949FAC691E66FE9B8D736EBCA6F4551B39E79557154E9AF590B6F5CA1C6A0ACA82FF4B839B6F9C555CC57255F96B2C963536E48EC9B5BCBD270110EAF7C64AD9DAB53BC791CB111189117A34A74B4F23A8573A59886BF974528D17B31CA9B6A6B7EF7F923B8915B640C599D2453941CD16633383F36F9849C0165D94698D793A58A7869AAC8B4C007CB9E43D8DD100E9504B1942CEABBA733A242599D5B8C60AA42F4C8BE7F040877DA2648D083A2272A46A90D215D96DB2FF1ACA6CE24A2936C18B7A283615E8E6B729602D018174276E2ADCBC869C43879B6BD0CF22CC0601F7491862971F65D3E0BB2474549FA18964B14D9EF81429F08383F77E8880E858B3F350076B709046284A4BF500A6C7D9D694F03ADC9753852285075197FE5F30F5FEA91C7740AF38CBF5B984ED852C99FD27113F690CA7BD5CA46DCA330A7E30E7AA3AEE8CB62251DDDD62DDCC29C94D79759357FD92855279A8516ED0B07D8F2CF6509DEB6C180AFFE120B1C06A4DFB1CB76B9DF3113B08BE85A50BF76480D2FE05E75A4F77909E0D146EDF0D751A1099EB2BD019525048BA145C7E0B3FEBE21A13A41A9BACED48E1A4ED32A57FA061243EE840ECA69191B1BCDC0358A86DDC98920C45F1FD193D529C85B33E0135DCF2B81C7FEED32E07A2431755F3EF3EA685577A6884041C6600CCAEE0E4182CF54EEC1B078D74A18D8C81E0678A7D1309E494938083786C67436FE55FA955D3281F7F6C145B7C769D9019AE1B8666834B51AE95BEE2A8D606825C7609FD3F24057425B27D01573FF353771BD47902A9BBC41B2016086A3F9E366F96DA8AE3C62123DF05113980D8FDEAC5B2C828D44C69F2D1420BF8E7913E59FCB88845A7FA6A84AA296875CA6D2FA21A4FDF8E75B5CDF0E1C0D84FEE983A469FEC80F02923695640FA0858E9B91812DD4D91AF0DFD97655C7FDC60EFEB19DB5AD7D7D0A5F93FC88A2AC1205D1BB60DB2F3BCE203C802752350B5E8240B6FEF4A38D8F35AE5868498DCCF1BA047DC56D67F15E3C3807BD5638A9494DDC268378DDED39A910A6C7A59E6738DC68D1A531C7EFA68BE06AD20BAC86BC36083E45AB0A314ADAAB741C6E24A530B3E3FE318E4A1B3827057F944918664A96277528D185E821093D392012803ADB63A4DDB14983E844392542F2C5A978F1911A2720E201FBB862AE98C3CCDA720A244B5B58AE601C1ED814B0753FCE5F51E7ED797AAA98FCC833EA272D86A238524C07349F5DD0BA4A2F6281B2EC2D29EB546EF52F07B832053AA433A7E8BF81C6C9F562B603421787BCFF621A69ECA5CF07CE8512BEF945DC744AF403B9DF0FDD48AFFF264D4AAEDBD8702863B5A345A733328466B22FFEB20906543639F0F6F85F3F7DBBD28034019F4D517676C5D8C8CABD4118768B10158D83BFF569D3B71F30AB57B8337C50674E2290C950E9D48D6527E885A0F7CF580717CF467759CA0D41CD03A91B75648DFCEC5C5BDCEFC2EB2007AEF2F01651A328DE030546933C1BF88F34AF14D0C1F0F37FC8FF4E015DA5D25D4A1D52EEC44DA8E832F01BB1D9FF6D067021D4703E8F2D511E73ADCE564EB53A048864D191F21C759F0B629E0053845D7049900924832DB7831CCB80B36644BF23EC71847286C959BF54C6CF9EF075B1EB7F43898", "576592F533BF0DC0AC52CA27BF57894E407D8A264496F2196DEA6B4706CFDB4E108E07FD18F5B2253EC3BF1914BEA0E7B8EAC0EAD4C6A3D2E0162411811F8579262AB9F3411327C320D27C7DAEC764EC5277EDFC2635ED39B0C497365B8C3633626E66D83DBFFD8E24BDBBF09A97061D7F530F69D929DEB7AB12488951D753EFF9F8C8DA17F3F4B17ABB9A1955F40A4EDE9D058E6F48BF1B5533D91B55D333CE4AE379E124CFD375D82DD97B682D80704EFA3DDE799DC6F7D5E55B72A99DF2A89159CAC16B47F297A467358EC67A2EC72A01007C47D757DFE274893BB0E141337105C46B159B08A0414A7EF8DE0806F90B5C5A9362E837191DA4573B473C6E4354E62C5667F75721370F036BD6CA025A49C15BF63A8B30AA5DA01CCF9746222F2113AF119DA4370DCE98ABEA322483C127CFC4AB990496CB53BA7D20255E63368FFDA40BB7022A1FC115B91ADE56B2711DDBBDDB9FB00C5FBE928F3121420288CC9001F865D44ABB4D78B3A1F2BF6B1B2C251AB1075A65A233C4472A460FBC76ECF191313D700F73BAE29795EF9A5FBD0DDB5E2E04DD172C85E15CB0A63EFC2A4E317C5FF01965FEB3BCC81CBADFB201C670F4C8AAEE2E7E75F1AC4E4AE0B826FA9F87B300188546E42F3F142AF19A4F91192741ACA71EBF29A6E1BB0D00A4534095A8B9885267F27DB9B676009631114A2EFF9B2D4C10111195F0C178D2634EDE70B4C0C87613CC9344BF2F62E9BCB42C4CECE15AA61A0C7915E51A5645609620695B4D0C913337DEEFD9195CC9545A8B1AFEBFE5F21BBDFA2F140A4D146ACC25B8332861C2EA55BA75086FD948BD27923BD2590C62389CFBE89498C82279258D11689613C21CA8F1788C4926EADE381C9CDB41D09563890433AC4BF9421475EE42AE5735D1CD10653713BD62299F66F793FA095B2E04EEA1CF59EFA731143D5849032DA833E1660A95117A2ED97DBF4D22FC0BEC0B5CB8EC32B63BA18B63F737F3ED775B6D91E052FCDBC0C33A6F4498082542B039A26BCB25CFB1B23088D9BAB9DB12CD18BF2AE73C78792BA9096AF766114337FBC06CD63BA8D1C0A5E5C6BBF5AEAC38D6B4EC2922B8ABC930F58CFAF2C65C43422193F4AEB436C05AE3213CD19F58CC7623886525FDB77DAF08CEDBD5D48233D63F1D6BDA7DAD15E817775DB4C9DFE754F4AEB2A94DE6F883961DF23801A645906BEEF9128F3F6C9FDB57E6D7B5EB46326C4C39F2C0694230CC28852D54281417C4D24470B9EBB625AD1D144B4889D23EC975CAB65A855CDA704128A61CC7C50C5ACFD6355570E07CE55578E4453CEF4582C368E585CE0F08BF786CDC2C0158E1A10971AB769872C52DAEA5D7C8947A2B6300815B42125A7B8773E6E8C79239D32D7AF37CB9D4E8688CEDCD71A213795B0C1BD5ADB0AA337989ED3E4E65DAA164C26946978C9468EAF74617C47EE4328C51F41418F2D35BD33D47A9A1ADBB7C4F5A968946A7A900C293C65648C3127EF62D58BA9995B19B10D931C07D67164B2E685FB840A019EF4752602DC9317714D89F6D9318256EDBAF002C40D5721525AC0D2BD2B4FC64138F0FCC5EE648E84AB6908C1AF71408D51D31F7587F1BC8E19D1C045D8921B447CFA9287AD03B4EDFC3FB85C7792CB2C479BD5A14B72EB8D3077CC511B0A7364C80C32F11CD1EDB4B3A0806BBE9D7765B091E04F46620C23DB801A46C544A935FEE00F0A07927171D37D3FDAD3DFA81C40CE60F93EB65E667FE032A79DB745EBCD7EDE57FD51B647CE25624444199EE2D9647FAAF9F43554433B25CE78098BB33CF24", "A888113D9682BAFE58B278C036FC2EF41CF8C156C39D67C378E4E0EEBE750656D67250F8447C420E6EAEF139A11EC90B1B50CB582E5089694A4BFD843602382C022085141A7B8AA1DC5F68469A2C2AB04BBE91EBEDAFA2A19CF0538AE9D47421C3F98084073F340F0292B8946452251630987DDA49E56A79F1562C1EF57134F036A5DE932B2AF9ED5D24D28463DA55F4E7C29045DE9CFFC4372F7A6AEBDCBF35DFF2D952D90BD4650FDB3BD68F25B65A7876B65C5AFFE8B9CB06CF91B88A588136C80D9CD361AD83F25B6D1E17D161817E64CB06262AFED0417DF26B9B3C0AAB0A06B1310A7375352C46A410E167366AD768559A6DC618B416395F432C0CAAA8D10F88E9765F36B196B37EEF1F1C13C4AC08150C9E4CE45D9B1663FA317263672875E0BB5CFFAE2A132A6B431AA7099E47E7FC8349D04EFF0B84C3E8A743572C4B1EF38F760656E49FB1A4DF4E2D1F6B24090EC675D299B32FC5EBDE40BBC2B1DD44CC01D1935F1FC084749DF9713DE41365D8CC9AE5041D60967B25E16FF1941A9A7336DC2D46DF5AB88C14A4BDEF077EACFB1F08B834AAECFC75B5E3C1BBAFD3EBC73E187D862411AB97D694B2E557C47E5093FC15780805518758B4C5B548306F92B559DC58475464C6DCC18D2B3905FE5F60B4530F87716107A1A4EB40090C23527895582B02141386A726FFA11E9930B6099B22816DEEA2626E60F4B17C5E175A852A2E174D59FE8219C190D0D6C50C14A3C5215BB193FA56209CA4D14AB2DB5CEAC2B3B20CEE6DA1F798B681D2DADE8DD13674B9156E5C3C4AA09B1932CF69D62621DEEF990AD264996069B01E6F7A21F2E5996251D09FD955CCA7DAA902FA7D46E03AABD4FFC5A1A873711FBDFDEA0935C399A0178CF2516FD03746B86B5A80576A34119373EA7F059A0EDA3F0D18CF33ED63DC27C8157E0C43C537E86FD37E58EB5ABEB5524FE8E19B2298B9DF539C7C31FF0F7AE96A56FD3806B81088DC13224131998DF42066802ADC2A08AF6F69D36A7B9B518430C5532D3AEFB20BE0BD1BF4B2C968AA78331C614EE51B8E677B19A98E30756B39BB6A1AEF0E91915BC91D98E86FFE7584BA6ED8D6D51A132EBC124C056FBB9363B8610EB3D7A77A3E581C02E7D25184ECE47A688E718922E4672CA9567BBA9BAEC81CD8DE7FBB8CA04D20B51C850DA2A4AA63E87FFB27AC89D18FAC40AAFB21331AEDABFC3545333E57C73CB7D6B601B7180E4489269001A6786415F4D1ACD8EBC3CCD8E78F6577A9E107ECBA3EF5EFA242F80202C1EDAD26D9FDB8F43F70D250D899EAAC973042149B8F0BF7327D72A49222B5C403645BFDF3FBAF78F2AAC71B9FB582346CA456EC183867409C18E11A1BBFE6FF5B681B0F893778C87A9BE8A67E196919945F4F22D70FF5D85C55D23893E7EFD9D685C41B28B118EFC905C450A9E91112C5CEA2475EBD07DBEF0A125C298F467377E2BF8D4BBCCA25A2DCC4AC83AF877E1FC820D09F31888802B3226FB0129AB9E47FA65BAC527CE74BADAF59F95CAFCB6EFBDAC889EE8075CF7C71518535DA63E7BC9DC5668417123CF11DAB1070B050DEA01F46BD86E59C5B3175EC1C0C1244E0E7B5B6FB5D26979393E430C7B79893E3BF819380D206438174038764B7196DC0FD94D4A9CB8382CEED4490C43C19061D2BECABCDF386F1512EF3D635601E8E9CDECE9A452A0E6C6AE0D6BBBF3AFE226A46AB3285531C7AA9E0FCFDE0D9A557F20E9802139A7C8EC2B2872CBA3AAE87F0BC6DA226BE4AA5681B114E080A399BF7480E8583DF2505AEEE32E45C4112FC48", "DD364986DCF106EED4C8705C1A9FDDF9480D337BE5C61AA3F661C6968AA01E3E454698FFADF366C73599B987DE85005C9743A2416E637E4BBB67FFC4D35F26B7539C33256EDBF680939CC8986F5BF32D2ECE4905A4F6A1727BE1131771954856A1C66A402FDD0DB86B51E9C02E6BB136465FC4253C8D98FED1582EF8AD22828B6A35580FD58A0038A9D97FE2F661F312658041839969752C4ED321D4EC8229C5753F399029B0BD5F065D5A19CB4548C86CCC1F3A9873FFB9E4F421D033E4EEDD4ADBAF302E24371EA97D817AA33C72708C1EDAECBDE7C06AE0C95D8237517666D0FB43B2434BC50EC2BC8DF1E3CB46099BAEB869B251E79E9B175B75FF62F408A5FCAA4F6DEC90F97B926272389696B5E38D26B946E0575907C358DB17D046D58D061683E07F1B075C10934FC4260043AAC28928DC877D27DB9BAE618910564EC3EDE3C402E86BC3981203CB7DCB9940C37D948556A57A11488D1332B05F4E5757D470A22D0B86C88DC456CE014B673CF5FEECAAF26F4662C9B243F46969025692E445ABF375AECBAE50EC9E48AD25EE1D1D0C16624CC5BCD1BEA8C8FFE3579C50B732625A381002115A1D69DAFF5844731F41AFCDE42CCF1A13FC98A64FB9769F03CA631B1C3ADA6A98F40343BFEDCD80966652292B60DE83385FFEA9CBCBFF51450C768EC8C4FF6FDF2F76FDA7D5886148168CE2BF693BE0179DE250D41DAA80553488D4DDB01FF97329E94C7DB33005B498FA8408E13FD5BBFE079F6E40EC5C8B735EBF9914B932A82441D9D5136C662294956CB52939F4F7E335A3B9749CC1B9F374AAC89C9AD1E718BC469CA21D2CA467F5DED54C402BA0CEA000DCC878822EE3E1D329CE76E421305178FDB31F5DAC177838197C5B46A4F96721139695EBBCF39F04BC1BDBEAB567E8FD812C355CF72785CDB3A6909F801BD2F448B3EA0C7F96D09DBE4EFFB1CAAF2A47FE6BB830FDB937CC5ED2B485AA6B85DA799C1266562DF181005A345C62BF94004C1B8D85AC06D114C8F2C5E2D569C709251EB929237C76E9CCFB9CB39206BE3C391FCF5E814E42AC2BE1576B9F0664B20F03BDA1F6431D1D1CD4C0783CDAA2A7AD32281A06B2BEC53EF1568840277EA4341F5570388045526AB214B477EA23023C13F4327DD0C84CD1744677091B21D8F95F38A8904EC5D6542AD6E3A68B355D688B1F6CA50DB7181272B3D564B1DE41C14575217FEE44E5B631CA49995EC2CA787EEC4533657FFDDE7370329C9BCC301B8785F7A307F1D06F88F21F5BD19F94827C128F799A9C354A021146985256B3D3E8BE46AF6E370EE193BDA3494E0FCC7AA287C3A5B93B638AAF9BAEA46288DDF690A464017765FC2F769A5A930FD3E5A5F399B2F972EC286E81062B6BA85FC04DBBBC05B9971799225E2F0867B55CBCDCDD3B85D6D56C6948B03E91080FBCE3B2C5438491050BD2E81C41D5C2F6790AB1F327D2C7023FD891F8D6E13D6F69E7AB1604692F21ECC7794F028A8306657D72B5858301F5296A5FFDCBEC4863D0503749E9B483E4760AFC05682304EB17D67E016553FE9108895DF3EA98890172D795009AB414E4539C47200C56828919DBC1AFFE040FB3319A068264607CE51D387B9291B7483CE1C38C1F059AA86B68BC7F852D21BF759A56557AF5B4E8CAD60356AE1D9D11AB49CFB9F627DFB1AF5BF8A6D85A775B66767616FEFEF6488C383F5ABAD4E06DF0B6C82BD2582B284BC1D4B27168525C69FFE8117FCC38FE758B2DF09E38DCB1688789B2AF3A050142E50787EBF2098C229E6965FE134593AE47AF7FC4", "B59F424CE3388B73A01C7279251C7854C664803D834EBE840CF3851B922071026DC17B967F06E8467AD73F8F70440CF20178BD31F8CC315AD8B3D213029D08746BA9FC70AAFFAFE2F393D0339BBF28FC15B8581667E9B43E0A1534AB70BDE8954B30AFCD4BF10B91B8BE2AEDD6489D590E0947B6155A1E0B4E7DBB7D5DF08A340FE33DEF34330EC77E65B57FEBD4745B0A07CB8BCEF0ABA92E387E2C2F80230818DB1F70F65F872A2C5580A6C39B9EF600C797FF0C61641100903B5243D847C7243EADCB69F69D75F4B1D921C72A4B5B67D11B78F84BD9682963E075C76350BC301641E76BFAA23EFF0FDA33B1A41729AF935C09C1E5257F84A4AA0AA3A54525BDF1E3A51EDDA6A35A2C2B6DA82E5C7FC989475D99585A9DCB66325B98C20BD7550871BF66979BA3D58562C1125EFF230FDC77A3BE8A7A8CAEE2F83C62688E0EE5D72D4C858624C7362A57B7C0065670DD8776D1E97F67CDAE4110E53E78BC17793CD34F11089AF317407B5F43E26424A752DA5AD58470FB8FDC193D2B28FD4620C879BD22A24DE4EFCE4FC46D7A5A4350136F43D21698AEF1B4C318156D574E93BDEAC252675BB1F1819B651D08E637538DC14505779521CBA1C5695CE7C5F9BFA3A7E68E14ECDE399144E6D514CBEA519FFD2C677310214DF222CD79C9B9F763060C48D8FC4E02DBCF0D6396F6A28BED4ADB4F69FA44BF6F52E7516E77CAA981712F10E94DAE683DF1CD858492A6B7C1FDC92B3A8A4B121B1C8B8791E18062548BDD31DC544FD94DA7BD77A0BD18B3940760A3746ECAEFEDBB6B99562E836421F24C2F2A99F686DCF9C57E910748031521E359D21A69933D3B3173D520E7B8810035140A9F30DECF99A117B8C81990473378C58D1313E29A9824034B86D46BDF15479E8273BBFC4710958348B17C8EB8EBF8581AA9D1032AD591B7AB62B3E2DE12F36BF0ED71CB0DB342D5233243F466291DAFFD75971427F37549BC74CC8EA2C9D61C55FF4EEF46EC74F37E30AE9227F9A346A5A379A386E4706FC6DADCC80FC7CAAF6164673DF6B7505C1CF8C1A2C262F13A65CF1DA6D3CD277494735E5E0B4366804A816373AA0A33F3FB3566D9811D26380EF7E049F004E5540E3A984793553B866E364BF3ADE51ADEF86D37A9392B6D0D518C0F07F80E9BCF795C540BCF8BE8AE72C0A0A67160F296E30A0F5727391F82DF95DBF2376B82EE6DD6C87C05CA191AB8F32671C4E404734D6626DA299682D9A49788A7D961B737282CF16DBCB233124C5EF4800E1F25316763BDD92F090088218C071E91EF2D76D80BD05D23C6C06EE975279B0505CA18623A33A4D94EA882A6C0C5510986D537B49BAE93E363833A8571F91C47F022A6E05FC7673149128E3876AB6F423CA96A7F0F4D5AC1682DFC05BD4D3ED478218D40A42A894DAD908A587A83299D9CA685C4E25155760F53B27EC3F3E722E46E63BA2CA0D353C60DBF985F3E10893A0BC01539FBE6126215B090F1355D211E833BC019C7BB351B1A51E5286A178F70DB39D3A8DB65E510A0A93FD717FF30BB586B8FF49D62ABD56F0AA4B01D2A8E6A3BFEA54FF1D36C8ABA385D0974C7F29B25BF12B1036E4926F0E70E6CDC93233E211693F7B315C15594790BFF888ECE21352C8FDF906DEB1085408C877A98BC5B145BB1D0945E33409EB01E243D386492BD62847AA67D4EAEF5E8B84468F70457470C1FA15BBB44AE4D77BC401BC4128654B52B2B8CA48721DBB267EFA7F0B2ADAEF8C2BE9516A42BD2FC2C7AFB8D0D71FBB8A6D7034892078F4FE50A3B63105B31451A7910", "FF81F6EFB1CF3169B63C2F2544105BE42B20467E1FF2E4204601A486928A77571247AD40EF058003E423521B4196118088D773BD1694CC83C02219F5E16C31BBC7350A023E4FE0720DCA713444B455DA085653B539A555F37AEE9357BF538E3EA6A2C3B2BD30EFC32665B597A611EE9DDBDA9A9857FFA648CBB75677DAB55EE8528DB18C4A188C693A9DA0D7DD736401DA333DDA13F572D4652D23F9016CE9D39605B5E2F341F487980331D88511836C7560B9F3E8DF6FF4CDB7F74459BA199E081FA49BA205B368B4D519B2D0ABF92405409EDF1DF280A04F398758E5511B6E6325CE00C57186A0938974207E0059B2B8BC81156E2FC0A76E84C5BBADF4FDFABA379E6F960DFF5DB82FA306535F0A8C4D925246DF1D9B8C7A711554E9087A5FDEDD656CAE74357FC6AAE8EA0C72B74BDA7BD4898C6FC7BC50367FEDE6D5261B0B72E171043C89C8C2149D01466B226F6A1F3F3FF378E34A3956C660F0FC8022E15EA68DE5DAC57BC370B30F9DDCA6404C5A152831230DA9EC3662DE701767953AE8DDB9918598844202DC2AB41A0ED711D640F3C60A8CC69BD8D9340A32330F9D27E7A023CC99D173BFE6CA4F0604FF6E5B4C59EC2E1BD4FAEB3321F755B2494343BB6E647210041A1B96A02B7755EFB6B482B3C7122EEF9242FD64D0D7BE24D320FD33ED0D4DF2756BDB13BBFB622E7E928676D228DC395DC32465E0E3480B7ED2EDDE04101E9C0F8020D48F3D43A0F756622A3DD866B966B7B0BFC1F40B1D460D6A54A45ECCF5AFC93DAF8541FCC62A5FDBE907D2DA6397B3F7B535DD8E30D400610971E4960859DFBD4A441F209021E9E4B05D3EA0C80A738F0C4EE9B03492692C543968122FE39BE1F2E5D682C1FB8549B12D6F32AD5938FAF63C5F490EAFCDA9D7DB70681B5650081B098D0BEC87013C70F890666AE984C5FD92F6939419AB0C1E981FF6EB03B1A48D708438A8F6AF81515D8C42E0DA5E13DC07D22A0CE018105BA075A696BAB7CAF420A65E38EA1961B61ECA43AA0085BF2BA6244EDCB56EAC6DED736712045911D7724E9DDED1C05DC7205580FDF52143C07960AFAC71528C1B87BFD9D21EA5DA5F9649AB037CEFA5713647DBA70A2D0456A24AFB0B55B8C859F9C9617E83E12C0D963397DDCA09CB16E22A47EAD91206E8F3D925444AB85D76DE73A43AA45BD3B0412FBDF254CF273E5F20F6BD0D938E30ECDF159120BFB28FEFC0FEA1DB898D5D1E674452DA86C9AD4AAAAFA07AC6A304CEAADA8AC82870313BBD56E746E7C9C183EF5B53BFB5A374B955D053D1CD7E8EE25108BBB8F2A60663375832213D1B9064C9F12CA77835ADFE28D1A5E1E65FDBA45147F052948A507180EF21052D5FBAC2B3F4E46DBC4ECC7DE08D6FB3B6162432B25EEDA07911CDF4E98A219603E19FCAA8142621F546C898181E1761AE7907F624A5D01E36612F06ACAA157BBC316E9AA7568E359803A408B0C36B4593DA1B4D4D6D1E6AC290C90D19635394E10F0BE0B51165777517AF168F38B702DB2BB43ECB3DA55D9CF9E8166D99B971137F6845653B8CFBFADB778E16A8F64BEF8DBFC6DD4F6F9093FE629C99585D59445ABC30DCAD609903A26C181FDF481642043066E5B0561F13934247D19975F136C0E0F4CD41ED3F8E22739FE2D88358CAED503D7C36FE755ED34B9EF871F2323AB593A0AA8BFDA8DD3D86304E206E5B4FAA6B905751EAAB46FB576C3AAC9387E38A02A6AF8EC72BC953C4831FED1337EA65241E4D94F90A0E99018DA735E1CD4C835AD9F301A618395C8FD4C982CB5282256F8A4894", "CE812897E0C0F7BA13D73227DA8D57F576A25F233384DAC16B5F3AA455222CF8B1C3F0C69F6E1EA86C6BE0DF818820D7611EC41F6078EEA4461C336D02847EC3C5644B85EBA26B68C5927D67E36BD381F8100B6BA90852D529419EBC8118A5354706D2CC769C2402E517A86809687BA7E0B1940A88F0B2586484EB7D1B63E119D489A41691D0C1A88543D43D8962D17FCB8E91A6CBE2635F4D0814A8C9A4DCD7767CE7D62E8BF17117A6650E3E8933DABD4CCBA43F40ECDC46EFC541CAEF6271E87BE92E63DFB7C2E5B7D7D2ABCD56A0A19E3C9F75894860A850029ADA36F990DAAAAC5AF56B157475EB18943D7CCB8D99CD14813A27036ED1F4DE3234BE28FBA413046A26113124B5FEA24F4074E991E163AC879520669ABE6B1A0203FAD6E4082CD5ECE201A86EC87676E350021FB2A1E04AE9B19A03152F8244542B4D21B4173D05F159EDCE12BA12A5767363794DEF4D390F56208EAA7680AB527C2035B065DD58AC8182BD5660DF75511EE1E0F407F4EA72AB3FCB028C82D8FA3003B034EFF4DC1C179029C452BC4B4D75AD02CE9E393C15872F8D130AFFAAE9A95640EC68771EBE628C42DA59AE4AC2E9156534430D00164E3D2D28665BD2DE6AC1482EE3475F7E00F41078B672835B435711C560166CB4DF17B56884C8A66DCE5D4B42AE675335EF457AC20E4BE7FC32FEAAF7EF4CAD795ABA7F9A20C6703E7DADA30B63CD6CC214114242C81A9614712271CC05867595D9938ED557007713F36D1A44AD2285A564C9B242AF6BE9979F7C474385680FD574D9D33B8E2DBC1318EA71977FF83E8977B93BE3EAB2401A136E021DA182B1AE68007FB36067507FF6900AFC4743A9A8503B7A2CEE04A1BDBE9D661691E5E8C6E5568D16F70C15D156F45DC41199A9C67FAAA36D8CF67672717ED0124E996CE855392F5A8BD24EBCD644AE0CD5B1AD2711200130AA4F8D3B4599AE660A56EB6E192709CFB8890510CFB0195D7FE794B9EDBCCB25ABE6F3B6AAECF3FCAB9ADD6D270D3D5B934C46C8D6800CFCF99617AAB8192C28AB627EB0D6234F7C68F0F4241662A9F062B361FE89E92BF9254F823E4164AE54661C2991A56C4AF8884DEDCB20EAA02D3097F2D5BC45FAD616F2DE3F37FE2DA9CAC838ECB3BF649AB6CCC38675126381561D546B37C743241297476497184A861ED1FCC75BD508915AF39752866B39F1BF00799F3B254C6710D15F5F79E29766E3EB75B93CEEAD0F3D454A3A0A4B9B88534AA91B604424CA1F9801F7F16E0A5489CEA18CCF76537CE33481328C83F3205B59AB1BAC1467C56A28DA696DF2B08CD380049C5E0FABC6AC8C5C50F9481161C1D60B0976FF459B2C11679DF8239AF63C1379997A8CDD47954DA1A9ED1606A3D1D2700A2B9B0C9FEED839E011D52752CE543ED224E5241340CFE1219A1A0117E033F48B262A6C83FB13BAEBF036C2ADD4ACC5D1CD9C5C334F4EE7D964851D9A5B7CF5A38B3C1CCD6DFDB5D1AE3FEAEDFEB72A25C7CA779DC4602FA0E6D8C4B35900F634130D48BDB8291B7BA751256EF38FD6FF0D5662C1691B825714442F5B633B30514058C778C78BBD6A70A2096CC9A375AA99CE11E8FE4388ED8D403EFDA3E604EA77820D4D7A1FE7C51B73F286520D56DF828B659FC636DE3DEC09FFBEC46FC143D943A09634A91194D77F0A70DAED26ABD3F6B51457EEC61F9AB544F544B21A1284F0E70D75DAED0B9D0FD864CC73236CB64EFC7C696882B1B408B6B02F35EFC4B5DCAAFC600330C59B1338DC593BC22C86A1C4F16D72E7BD622A3561F60362F3612580", "DCD55CF8406A7CC9BA0A5224797D74777689C4FBC0D202DEA8B9773A0F20DB0438BEFD40A996EB2E3F49CBE2E475DEEF73F112FF742269A701AB43D8E47EF94DA4056086D86B1FAD636D89929C60238133A5B61DC4B7F8DFC765CF0C8C7206F3E0DD3DA13407CA75EA20F172AC38C42ACADC946B3B18BBB30DF871905777CFE0D3BE5363574D2545D0214D6A43E2D34B50D7FF7D9F2DAE7053736B71FAAECFC2C355C1DA645A995981E1D617BDDD14EB9AB230D10085DA1AE55D1C9E55C225997D128CC2393D6E5BE9F1BDE1543DCAE918B38AFD5FAE6031E105BA12EA4162F7E24572688C54291A61635C9DA26BB367348473D4DD4AEF9A5C4E8A6512AB149D62F625D8D45576FAA4CE28E5C3D52D293A0D5C48821E1F5CDAD7257C97B3C1A6DD83A4ABB55F780D09964D4B3940D36B6709D00094B89F319E1C2CBBB3EC33A6F0398880B8079E6A39DE697D76803B04C230EE980765604929D60733BBB6382B4CA4B13AD3FC48AC9F944B97133C5AE6C3B9D295A760D786DDBFF346C873C2DCF3D2591926116A318F63835783A33A17C452AA6C620284BA99DEAF023972082AD2B370CF3016F0739103A518B25AE8D59BB017C8199ECCAF3E908F9F144C778E0F5F47FA06FE8A22E3B2CE3493EAA8745478D653F8D3711F832D9212D060A7F0B0B62AB9A3C9BF012B61A9B5E6DBAF4B48D9031250419627E96076925AF95E2B238E8CD227A0F3D8C9C3BC68D5990952D6CB62803B8D193FB06120BCA9B195E92B995B86B92C455A6145D3F77898E457E1B938183E1D76FF61C163057A4D70697507BE020CC28BE6527CE306A5D2506B86152B5E3B954D5A660C79CDAABB2EEF0D135C0D4AACC7FC3EB5A3575D95070B168FCEF4F9B36FC3D55B84DDBEF10DF6BA659F70CB2AB82FA001D51ED0F040F9DAD4129C324BE8B44316C0E3E15B27C2A8D54A948585834C2DBD40337B61F58F3AB99B3303D56EC1D30ED82F29CF6A68208B07DA120AC4073F102F4D796E38628D344384551810998F6211A082BA225A1B7D63C9A3E8703DD945BE1D979677FEBE715396988A873B88EBCB10209E4DAFF939776AD14C5DC90BBE9C1A57581A145BE0D4BB47CF50721EFECCB50C96E824DF93D675B1A1B4D920CB1EE82B0369094DD84FAB4A3FA94F152F87525ED6D17A800EDB1BAA6C13A2EDB5C9B7C5A82AE5824AE9BA63156EDF78517AE2B357C1A1E8EF6CB12DA415A914FB69FA633527B8A1659292D079B580DEC210231BCA77465BC6A9516F2917226957DDDD9787313FA599BC2BDD14DEC9DCAF0F2520318A85C55DF40881FF65E4AC21F2C9EA3CC06651309E1F89982D45FD6EB5BD588B647A80D27433EF85080A7AB2FFDBFC7D2B54B215E7D27A333D4942CD23D53142F04976093CC0344C19F9CB3A5A4D522E26B7E2C1C85C1ABAE1B4A360945A46D097A1F3676A80E3BB9CBED0BD363CB70C2B250EA053B183CFD1EDF2F6A211CE618F70EA1AB535E96CDD0B2FAB7CB7F0396B6DEB59745C1BDBCD452FFD70C95E45B88325A82CF07EFEAD7176FAF04C8C3E0CC4458540BED99ABB9F52AFBE48E42C636DD076A37C07C8E4EB6830FAC011936EC047F6D5B5857AAF90F80B5D33B502A116828BD27E30B3A69F351E22D943A482BC6BC41BE7BF941F3AA7BF85A2BA5C38FC930680FDE5A4E174AEC4156A755E7650CE488620D6CC62BF9D085FE1782EADB11541A5C19C9061734513316B9CA608A6E48D333A110B57BA5128E9331E6266174B85F7B7D1DB264361B1C6C044A8274A7C8DB19C253BF8DAB819E85130E920", "79E4509D63EC15D4930F17DB3EF8E9ADCDE82C9F2308A0C9F77359575876D90A9CE5ABBBFFE09B8E145F35C7E91B141F66F74B3BA923D9ECF863A8A455086DAADC247872C953476A85772079783A6F37C964AB1788479175F7B4E9651C7DD5EDA94F8BCFA57B3542788FE9547E0A444D249976333F99710930CED2E93B1526A02BFCCCE416F0CFAA631B878BF23E41F95770315F1E169EF22B9DAF0E2F269E06B03B125CC6F20D2AA9A13B98CE23FE3A7FBC70CD05496ABD89ABA5BF58FBD8D88EB9653963F0452CA43CB964F7B145020D637905E8D26E8CCCE4EF892BC48381303161644FCAA1DB9C4775E8F0A6367F1A842C3101C9F94730F6724257F2EE1657CC93950C9C1F20832DCC11E0001AB347781F21DDCD4786234C908772B553D7BDF4795FE69D7D55E950D4C6E2A76C44995CCA5C9CD539ED235CC55DF6A004C1BCA852C2813DD17F333CF67711EB8A5DA439D73271272D0D62B34DD457C7412A26FE2F4F23E5F5AE8C2F91DDF86B7048A40872AB7C728B20DF7AE2A0E8E52B00899C565E68390DFC83344DBEB7257CF8031664FD93DB65738013BA234035F11B611DEA4F74B1000724B2682EDA9639C11F4F4580683DDCA2D9159F637976293FDF76AE2AC7EB5203766009577DF87D9DB654ACD64229495A5B4A94AB3AD8237B9CFA2B5AB6B7239A5146C777C4A3CCA9E1573D96A7C1B333F11D284AEB55DBABE6B4F12A421FF7BD442AB6B8A7FC33A2087886328B33037EA78D9A7015ADA2C8F463AC1FEA8FF3EA886823063992176C31152573C10516BE386CDF81A6568D8E3BA2FF195B23903C95B16277BD60D238F309A7DD6BDB4ACF4541A56DF5D3D4BA4078E58641C0453B1BC8DAAF6F1DB28836D6FBA3474D69870E07997DF4541BDA5C62291A3360F5C5840752A25CFE366186F7E4E21DA0704266B5C14ADC1541E463917D5DA677945574F800BF47FA028E82200F9E53C48C887355D9E3CE5FB778341A356423D00B18D3048C92A80279C2785AECAE9EA57F828766D6F953AACF93FBE8A4C32C7FC9843F466141DD018CBD05ED8A16E27B43C5C0EE16045D39CDCC7E4A27EF636408E968B4C99C895CE77288C819701EE7184DFCE889328E4CD2D8BA7BE5A1DAE50E36D562BF2441B56242EF9C4EE63022F88F0F77E6094AD7DA93F672C06B6BF4ED5523D1DBE7D8F13892BF90DFFD5D2A3BD0E9B56EEF03E560BB28650D873116C0CDD00148C90CFCECB6BE9C4BDD7603B5CE9FC458431C00B1D704702B552D847D0C89265D842FF6599A150854848B730AB33CCF2BA6533638860BA564540C6678061CD97BE3D00B103314894AF13999FCBDECAFB5A895671DD1ECDD95C0C94A250B014CBB657ABE3028C8D6CE436FAD8FB7BDD12AA2DA32FA6435889F1B8C16EA8488FD6AFDC7AFBF5358A31B23E0C05E315B60F180986BA17E26621D92CB639A0B815E65D140BA8A68F99BD42A2F428345AD3037274E515684EEEF018BA41A7B0138D7FF2C0B838823192FDEED577028052EE73D65E92812E4C33FA3CDC11234F47F702AD81F3829ACF1910B9D00167A3541372DB79996FC8F4B15F2A56B272B7DCBC4B074A36543B12B3A5396B0635068B62F81A56E33B40516A376D4ECF7BEA4F8ADBEAEACBDBE23F5F311A39D90D0B11BCAD30609F6CB4A657CC620CF8F727E30F77618E5870F72EDA78EB89399236F7F5432560049262E29A2979F832F2B57CEB25BBC2405A3098CBCD3CA0CDF631B37440A47D316F4860597AF78E5ACEA13E8B8B5420210D7BF54B1F07A433E7A2B193D7EEFDB2288", "B63460020483CDBB47DB98D8D720FAD57072D41EDB5FF2A2CF65DFB70ABF3524003842F7BCF9D36F8E187F86B864C5FE0181E5E3D33AE11A50E67F56DE93387F5CA7D1641CED92F7195F2ABCC7B32C6C7BD8AE561E36A6359BA6171726A2F9B00C7655C7E346310C6EBE10D2D470BD5BB7B4C88378DBE2352AA45EDD728F42A3DF3B5E80BB6B6BF55CD663203437F575F769CACE66809FD25933204387F8C51E0A6B2C4C6113DD45D31AD7567C9B924D5B10F124F6C1CAF3458B3B84E9E42DBA9AC879E2D711ED8681207374CCD299FDB7D7004678D56FFFE0CD34B4858CC0CF4F611D8EB5B47768D69AA69BB1875E9C397EE9453D37D4983359393A02941E772F912708085F2FC7211DB358EA5D4E00263E14A1CA3430A6E6FBCBA94CBC8281C356B4114B0E0B67B3265D3E1B9A64B1D4BA5501CC0F6E19F56A7B3B1BDEFD8018340ADF7640C58FB26ACE46B788FCA44BF228A737B02F160B0462846DBED0792B27FC6B55757BE01FEAD3655FA9E992485E2B29321816B04C2BF079BA5CD01CD7DC0CC8CFA471FAEC74C95041B7C62DC9BDFD11FBD4D3B7173A3A92044C793EDB6AF4DCF760D38D3D412B3B292C74E08EF4B4515B99A0D4A167D9103C3E776E213AC2C1614B432A8A7D243B0EB5E7AE82118DE996BB55329F49ED4A7EE738350B565F50CCC313DF274EA203757B372D542D451DB960DD8D7F0C5E532AFBA105C7963A39426732E2E30C68317C4CBB3C10802C5104923E9EAEC89C6F421B8EA3D5039D5175F1EA854971407C7B260BF57FA912DF3829BA91BEFC9A7A88E5A289366A88E7E6C5C4D4781D583CC15C827A4FC753F66C81B5095D51F3069AF2E3BCBF01362F118690C35D3E6B5C0F41F4A4964226E4646DBD948FE2D1AE837C0C0062F77A40DD02371EA4B69BFD02803AC3AB972CF450F59FFDE724F79DDB7D534D261A44DC4BED2A47E78289BEE615218D1F861896AE5B07729568508B0E35F82BAD9387B52E2243E456C2DAC3F82176E4859A8288FB8E2B86FFF4BEEF93D9F677CCACA1E760D045F28C819A44F5F678E61585B74D49B1F12A9B28D4056CEFB98845385FCA12A6AB0C86DAB01C7E8BF5D77618F797288706F18DD71B33F909CDB15A63047D0EC462BCC02AA7E6D4D4D5C3D0C5FA2C03502EC51D781E8CDBB63A2578CDD9116701F7840D6A268DB082223F3D42376C5D796557BDC568791BB3A5BB6A9F501837CAF0ABEFBCBB500868EBE0FA0184ABFB927A414A87BC3A1903DDFBAC369B77B5C9FA203C7F6CBAA7BA826867CBD37AFD20E32DBCDCBBE7C12E3974BA0133B9ACE768AD4652C3FFB01D7E2F4EA026D543B2292419B10DB09C47C110005D667EED5D066D4634175B58F4BEA53CC39F2D1A9623B7C9AF2ED29A37891F2BE24418746A233743BD340256801EE39E7C05932AA41B56F7DF4E479A365BA224E94D72A395741D3D8135208C96AF089FE2FAB29B9D7DDB02D149275727E12A2358F4CAF9DEF137397AAB54DF78F5CEB17CA323B696C3267A4D2A944C65B2E8F542A2F0AC3DA7A9D6F2AF073FDED7424942B700AABA291FB8672DF10AFDD154218C0B0088E84486EDA5F21615C06770A2607E93A2ABA60B864505434ACC6B6BB15BD00C3881E59F0B481653BE10929E7EAF4A90BC181DF76434C08F3ED37D862038232AE6A5C56F36F98574029AF4B4A280693551082BEE4CB6DD4B55E00AC4954F2A01129861DD2A70FC30FCD9073FD2F45B31CEF9724E673032D0C87B2A9FE7706040293B6DFC3A3197AA58A53997BE5A2A763B027D5E14152774E3FFB8", "6D562B96C4DB6F8783C945E358693B3D99B7D8E77AD50B7FE9F5176AF257ACF63E037ECE9FC071CBA13080A08E1116AE09151BED458CD8BC9DFFE5744E0CD2365293B365A01D30E894F8616AFDB6115663FA15522C8CFED9E6644DAA1AE776E0BB2912CF584AD1DB53E90043B1F93D67D51B1B10179F0FED6EEB52A127BE857341CB5A223864C02E4AE3F3902C90BACAFBDE2A42D73DBE88577F871D9C2EB9885C7CEF0443EE4A1C449951B24764CCBE716487F2EBE474ED6DAA65E393F1AE17E52B75EAFC245A161AA30CC8250631DEDD2B233D202CDFD1C3DB64FEEB2F515F2568DD7C11DDCCFCDD77B9D1182A29AD5813791DD9987BA735082F8A669F38DDD84EE7C09334AC732849119D769DB8CD79375D1C8EB4E051777A057A4738FC4E06ABC70F8FBA6B52948F91FAC2F2E248F0C417E2E727C60872F905DB2CCDCF15B2363696424BA5B62E98D5E4B51ADAF38DC97144CA32BB6DF129EAB07313059C725051883475E30B25C8CEDC63BB517319ACDC1E0ED86D5BC5790F11CD2F4B2CD882345706A4CA5863C0395C3159AC3D7FF8F7B5F7B59907CCFAA53EDE296087B04FFDDB0B221B3DCD1A6C64A591729A039C230CA52C94ED2C3118794876F7478E7968F962004F01E8FD0546207A64C09A2292376F77D7789CE2CF04995C7EFDEC91B5F13EFF915E9158F6202D6A7B0B97BB1FB121FF99AB12F56732E9049A2C33597A308A47FBEEE3F530E357BA6B7C98D58114D89C0E9599C6B17BF409B3B63FCF67DE29FDEE152711B63C02F919FEEE1A31636E36ABB4F9BA607020529814E06AB2D8E4FDE4D6C1A0D709ACDD7E442B1EB65643FE7D9E8D89906915AA868E9DB2E070CE6511EDA0506A19A731C0DFE149788BCC155B829D52E2921430566F9DB82DB062023BA5FF61FD26F8209421EE8C2C22FAC9F58059D223B4659A23BE538BEE894015F8E137849280668B971AD628CC57ECB49701EA1F0CE2D07B2D7D8406FB1D2E010A51C02F6F8F04F38703326711B85ABF70D46D947A42855B7F13B79D39D222A3578D6336C9B8A69A12DD38184EBF9DCF787C0D7611AB4176294C239B60351B62309E5DBC92BE0C0EE1422D9074905131757F70343CA00ACF2CF9DE239D8C794AC868565FF9900A1B9D187580884D509642AB4F6331A89FCBDB367067712B7B4A7A32E266D7FE571E4474FEB5DE28CC0D480D4AD11D0CF6B599A56925D68C1B076CC57612290221AAA0F91C8F7D21EAB354310250A224BC0455C760F62B2981ED68F7E10619AEF954B79D0D0DCF039DF951BA2245DEC02E71968009ED5364774644E995DCB33A41D53B3C9C1BE952449CA8E671E15EA888789CCDFCDCC91E0ED093CBFF538909886E27972C9D262F5E1A481B8F483BFB311D1595F51FE1AC8CB43EBC92C0D17868986B6F2BA8127BF95E159776570E273393FEFE203FB079780E675BD62F475CC0D1DF76CCA50B5145565C3615498DEF9B7BD37887BC6988A9853B4E639C1BFB61E32954D1166156F944C722444C29AF577C12F567E568BB1BB44A9D0783F126D6A079345C3842AD6240F1740585102F558C5DB6C22A057EC2D902CBFED926BA5F9C298E6F9118B9D2B446A47E4DB2F4F1CC30E75B6A1B67FDA687E672E7136AED3E02F8CC346F520E5929526B6E9126450E708D30168D1A60B41D19949AA4BA5CB7A691DB90A7B5040B01518FDDB6035454280BEF79E019FB96D899FD97BA47D0A7EBB39A11A84036659598294B0B9A905CE2E0CBA0E3AFAC85FEF2CD3446057ED5DF2FC389D411CC3128A8DD23188F830D90", "3A9010CF2726ED13F833686B6C7796E87CEEAF4A99B40BE702CF35774B6BBE4EDF528C39A8FCB1B04AB9D25FE6666535391A45D5DA45D8073F705184427C3C5C4225F66F041151A22423A1F5516C744FDA91305B2B70BC11569416ED456BCBE6C1A47A5805B464EF6A645682D88D75E7FCB458BA2F9C44E14589D2805A904AF02FD3693DE69D0CAC00E058B26277018C3339EDA876CF820AD6C99149BF76A8C47ABF795EEF76D55862F4A88B26A73385589048B2E22C542461AA9CBB41DA58C7A5A32047B9F85426119402E531B023E3C8C1EFC7AF70D3D553B50408AB568E4D2EF96E5FAD8BD3EDF830FF2B12829E97C5C57927E69A438737B1920553F2B921E62A3E25331BD3BBBF99C9FE1912E0A84B15EECAD16B03D059876B7B02908C7A7DDCCC51E01213B4829D21C9FE65AE129F3B58B51798C604C9A2D2BDF7376FBB50732D9694E199DC532623309CA43D837EBCE0EE9F3943BF57F9ECAB4D939B2AE599FF5CF5370C9B56B7B9800A651FA64F854962A6D84E1270EFE2A481D399DD3F35C9C43605FB03315259989C4F2EB41B83C62DC2F7EA15B315126D227A0CED8B626022F9F665B49B8C32A10BBCEB0AC7FA80335A255076BEEA7E5BEA0472531B22E07A6579F9726600E661B389A221D2A6D2AE9E0059D24874BA5AEF82B1B53734F0835FAC5732FF0AED0F092E06EA84B3B5191BE3D226A41A6BC39AE3064A789A8DD9CED68FC3B902249622576D4086D63B924CB0C309F75F1FE9A62071FD2629E927A3ECCF3B575961221C5C1E76D2D6F1D330028F262E671905340C7621150074C49D9D3D64563E4E6C8B3221EBDFAD5A369E25DCB2C95A1E19D05B4ECB8E605BBF49623F6C62383A4ABF25FF823CB5F924ACF6D6173BEB850C46E0CCF6AFA873096046B7CE53271A33D18BBEBD6452D1874E312B9DD2035E511FA43BCBDF3E3A9EA8C602EFF6051AC0062232BF8A2C1AAAE76F0C12ACF4A290AC376A0DFA55BCECCDDFC1702D38F74BCC3FDB3160C3F52518EF2B1E14CE9CF22AE5E4CF2DFD531057EC85896708C8BB9D810B7D258AE975D678F19139A760F5609F57E2558E1AC0B6AACA4636017083D25190CECF73D29E2F7B44393D274074A68570B720EE6CEA533AD788F9A7F127BDA09D43F96AB9863B5365C9361A9EADA698F5A616D5EA0EB9F83B0647698DAFFE659979F5A5F086FC8B59D53C737E2D38EBB4F74C5CC6429B526FEFC9D1426969AB14DBD3F54BEBF25A5A8846874562CB282B2BECBECEDAF015F41037486297B30C905572211F80727CEF292CB2DB118157E666B190809A10B177BC63158505BAB5C915D37626EF7CB011041B08B03FA92A40EC3E39BF9B4D7279A5D1E4CF38377BE6C00EE12CFB4549C036E75240D3DF9FF92B50954F461BC25BD155AF84316A1752B9F1834AC4DA1B1B5A4C84992141CCFB0CC6AC5672753F4877403FC3F4A52848786C976B18CE968509A4014F3C69A77F9CB4915A1E389C1EA74A05DC08B6A6BB1BE755365F1E96E06FCFDBC7210099601912F55F639C9C96F28460CFC392C855CB2D3986989FF85A0DC7889AA2F6AEBD3E1AA196F97A3C3A0FBB33ACD3BBEDFEE06606DDAC5DA26290149E6361E8BEEE7F2400588F3FF853EC85B5F5742DE3547F362B0A094D6F935DB0A2B5D1480DB2CEFB9D665887F6030358AB9E5B26DE8955B188C39D6B146063FA59D1BA260796A2DE8CDDE8560915F07087E84589340103CCF7E1B75AD5BFD209A99C429A52E8D4FE96EEB9A32A4CD24A7940B446003E1F8296EAC6653659CCC3C85E01F7A154", "59CD72F81F8FA04AACD73E9C815A312E8C02F1C1769FDA17C16350D9EBD4F8D10F248035EAFFB4FD67933279518E3BE9E1807288A9D63A6504F3A31E7DF322AA1B2A9ED3C23717C0C5B134D2758666CD04C2FA8C1EF5C1E58870C5EE1378619851845BA80DADBC37A764BA17E6DF285BB3DDFE31A56D4BAAB0FA622B8D3D24B7F91034D2F773FE578C874FAF5204F3DDB90B8533906AE05834BE67263447FB4485BA069EAACB68806028CFDAA8FC6DAC6383837F9A059EBD1529A92F98F44D55AC06083D6B751FF8F9FC5A6444C1A7D346025AD4B67EA12439242FC02D228CE537AC9044F6D193E0592684FAA4D259DFB00F5F98DCA9FAE4C0D5F0427C6936E501148C56EAD1817A81DA30989D0D9C85BF8D9972FFE67AE3DEB2A8959D63B3C3E7737A1851EDC8B313D75AA7838C6F7750280FFA6321CC9228ACC596431D72AC0302582CA56C6172599F30D0CA04E71F3FD7A03D467E37A8320CC0FE3AC72099CEF7C4265F7F18E2980168DACF9C058E39EC9FFE1EEBDCEA5F78D63BB18BF054465179401346D4CF8927580B9E0370B2D27E4C6BD4687CF0D4348B04BECE8424A42B2CECC668DF9809F580BBB3F3D59BFD96DC8C2E57EF5D2989D6DA54C04B15F85EFF639253DA3301FB6E6F92264FE48968C2C2CA6D40C54C327E0673BF769CF116DFD70CE374BC447AA1B121827E5BA510E387974B19B050D9909185A514BCD8CD374EFE2089290D3DF46D088D74F556A8E5F36B08AB17E54143B6FC374BEDD6FF88AE74E71C72297A31E13D1F668DDB455DF00DC91DBBDB2E96ACDB811ADF7E4C1C460D8FF1FB03BCF95EC489446A8DFC5D2220E58CC298FBB7A9B8EB33B61F6461D77CEBF9C36BBA32B34998B7B9B7950E7E98857371003F40279FC2623F716B808912651E55A04F9418989047331C454D2AB04FAA192938209261029FB3C070FA056D2AD52BF9C7A0535FE2868888BA55CB9389E358CEEC68D7A0E5505FF0DE4263C6E47406EEE83E8C797BF58EF49F2F8BB4EB3656A2636A5EC604A4990001190A8A7965A36BBB41019EE19C8EB45C10173B513F617B9688D7102ED82E60DDCD080233A7B3B43B641A3282C4AF6D3F01BE30DD78AA184B9D565F7B1F927EDE214E363A18547263412EBE35E939942C4B5EFE81E439B325902EDD4D2AC06340296D00DD5F0908F5C8AD88049D88282D0F2DEC28D133E1D4736869C352A7CD87D8A56687CC25D5517A62F0CA5A023E8709F181A0D96F1154B3D7517EC5B076B7C59DE90A223B96AF93F94B11EA0EB08A280379BE028DC494C296BC46659CF9C26A3F8BBB47E063AA4EBCBC9873CCA2866865CF45076E6E642B8E3BF9F4A3F9F057DCE71D4D5F3B621D8791CA5333398ADB31486D22F608E9A8745B9548EADDA654F1D4BC042DFF9B3C21B15AEBC37050864E4275D5C36F301D533552D119039242BCA25DFABB524C971821B2C0EEA602A4C02C6487DD113DA4DC5ADD7BBBC325CFC896C942682945A1BE921FF71E6D76FA1E3345589B53C549BD5056FA01BD688D0A9011497C0DFDEC20210BC7F8B713C46A100A396A9ABD9A2BB94E5455793BFA28E39E130645973C30FDCDE52F6C272576291F0130474DC2E3C30EAD54818E9F531A538028DD40FE01D993DFCFF82679DC3C66850528A173FBB534843AB540E21C7731C65044D697B42694A1654B3572FE321F61E98EA22171580F5DB90C997D0C9C7CF44D174E8D24F500832C158278CF62BBFC6DFC46AEE5DD3F8906A5770C3BB6CC3B731243974A76C0BCACD9EFE37E52CD9751894A68AE3596E0", "C0211AF7A94B37632C667AE5097F8B5992917210A515C3E48276A363A6F5696AFEF5B3919689CC8F21E077310FDFC5A58D6BD428B8FFC678299FD053E7C016EF3A154A41DE5FD3C3BC5070ED6EC8F16170C880F82EB0B7EDED047436E8FCD4E2290F450963133226D17D7BB99C71097978CEFE496032EC8C6E73B99B05A33C4F5373BB73CA93F7128A9818197E6FD2BD88451A4D8905214157C4259228DEB5F8B216FFB206E4EE1025D3E16987FB6064147D3E99CEED73112F62D513C8B6F19B582D0F6794B307E8AF97354573C758AA95AB0A926386E7D288D74F9C6B0E2C71EAEBB36422C2120511F5F3D2B308674AE355B1FA1E72DA55098AAE3C70CB1B85C902C103056E00EBB70D37F08FA4D90E860C74E841F4E99957B3097ABE602E65F07B8787DA172E8E9ABF9ACDCCDFF6FEE2F902082BDD49547EFD95B54C3B8F6C6D243D07F16819E03189F0A3F3E0D05B3AF3EC92CA08846FC909E809CE9C30F1F3AC6FECED9043245A00590CBBD83EFC41C9EE3CBD0E328426F821ECA32E0E84A8B64F200DFAA5F01B262F4E816A90AA33A2984AB8E269B8CCF61E65094FBB7D10E11F9E1022CD97F17011DA53455B24E4ECD0793486C1E6D4E3BEA94E6DC9C710CFFF30CCD48E43076D763957260D1ED4F7C41EFA0B7F78BFAB7A9274E932013E605246C36CA1FFA003A4B24DAED61D15327BCA1067ACE961E718DD5E57667F5F33411D17BE093A9D7C6675097FC551014545727BA3F19C5D5D23A0922B11C4BADBF285A17EE96C916238C1E1DE8A0D28FB79E72EAF5AC37710B4E6550CEECA2F22697DA18F858507CCB95BB7F25A0056FFA55EE9564782C6042686195BF56901D4ABB3398C557CD47D30EEB344B532E77566887693CFAE50CE8C0BBAA204465FF33456ECFBB1B4DE4F8D6E2F3E8A84E90410EE3A79ABB47D40F4691CEF37E0BDBE1BE386098181EE36051EFFEEB0F5898738E400D44ADA4B3348315E0BE88C4C43E8CF95CE8D56EEAEADE754A09F170D3ACC44DB101037E001DCFBE2C52DC32D040BC27C1A55C9EF5D65FE418F3B761284C461606ACC84D36B9A7A3C9353723BEEEC80CF75D84DA7B2533F844E81EB8835289487CC7EA4EB277A4BA4BD50B59953E3DF3EBB2BB69D7E148792DF55D429B2DAE9B40B00FB14A948F2797B7488EBBBEB4B11880F7D3062D3C0561D7F6FE715C3BA6BC703BAC33C29DD87EBB84C178BA09961F2C10D8CCA42BFC3977EA66D039FC24CBD2A7B3316EF37C0D0F98D3CB8D5E4708B4287FEE6B656F1E300260D5643E9AC323A7F0527A7B98174AFD3277D35D6EC63865BD4E816351B8492474116E2426A3298606039280AEB595293D18EEC671E1E139EFC7936CAE3056F9698BFE95568D050F281F17F2CD65B62B98BF36DE469474F440E27073613A121370C606D5729DDFA12C8C400D0364251D850D90804ABF000ACE57AB195F6EE24163E8C443C8AEB641AACABE70675ECF22A5B9DAB6DDF0078EC89F2354C27D296411041432AF390DC71CC6141B52C54FC778B5BCD31B55EDDEB62EE364983E97BBB65EE98863AFFD2310B482AFCC28A2FE9C7D8E3ED24D20FFAD1F5B0AADB344C77F89FB88BB2FDCD64A77203BC331FC23BF78E284ACE3016FF570E3AF32ACDD5BD5E7B59115950CE804C231AB1AB80276842FAF80A576C9A3148F527596252E2F9F76FD6B4C03EFCE924A4740EDED98B290FF138926811607CC553FFAD5ACE0FC24D7FA1D7F3701A8E0D7F614941C9FB9215389CC5EF6D3CAC193EB15798CB1FF2950E2E0EA96A6B9E672CC343A7FA9C", "28EB964EC60708D60D921BCA637AF0F0E19E127E0E563EEB30DB02F8FBF2848CEC8E351077A8294AD441049000D2A3BD101B691C2F1DF3741B8BE7DC57592C2D09C9F368010B4B3922A8A622887C37E959C9AC31DBE89C9EC9FFC26EFDD9C49362E3400E660928BDD7F67C6E45614ADFFB96622390AACC03F1186D18BD11333AF0348125A92EBB40370A32F5E383ED858F6720D43633A9A3E3559A0ACF5FCC326DF117AA495759FC12398B2E060F8C6DA823F3E58E1158B81AFEDE50B89F956D4F63619332928B4CDF5A16E0536FE7426518B1C50FBBEB4EF3830D77924BE1DB002BF2B0A9A8CD6FDF3BE7D7D1D7A3EB4E8CEFF8BEB9E2CEA9BCA74349D67413E7D05DEC014D1E6990062F0C4CF1E4720D45E23719D748D0C9BE3C3CA444E357F181E44EE841E35CB5207C3F993CF224A4A90EF5E3610254EEC4C2F2EAEFE041E1791518F93BE9080634AD5594B98C6D0161BAD23EF1403FEE6FF846D344BF0B42A65762804A33F00F12D769B3C58F123E14B4001CC631049F6E35013DF92AA50F89E71E78879A9B428341A738CA001E4233652802FC16AE2377C9C0B5650805205D31445EA0AC0F82A109E5F7C0758EBD5C737CF48D3D5D44816504D972CD2FBBF0AE566B8247F81E404D7DAB5A939AAE51375154A3125345C061CD479F8D7D9EB21C6ACD971F75D8430FAE557DE7A669C59E35DAC4E7686C53C34AF64A5AB7F6B5ADF48585417DBA3584D4552C241DEC336E5EBA84C4D295148B29FE824D3934F4D2A8EA2D27D29255988396A5C350421E2C2BD89B5D18155B20260DAED20E3DFF52F2E84E6D6CC2C040FA3D0B8726C63778A601CF95BCFD381FA520F95146292B8D854C5F057440833E78057D13FFFEEF4418E97986A064AC8DB74A001BCBF8B8E26CE9C68BACFCF4895C956666F92B5EADD27FF6FB032207FCD2100FE0DDEAAE8A860F89BDE341E59671BB0368B1C68B44B131139A44BB37EAB251A0339A79D358D73281325A594E2156E981C519419D925F0D6C8661F7C294D91F527454AE82EFF98344A6E39B2BB3E36431255E33DAA31B75E961FB306792510924C3E9B89150691BDDFB275B9128677DFEAFC89E6562FA245DEECEE2E788EFCD06C4BE744CA97693CC1AD7F0EE4C633D706AD278A46A8DBF2DAA0CCB69806912F8C081BF192ED7D17EC222392B6E84D6CD88FE66DB10B1EFB9CC7F3E4F3719338B8D6BBE47644009743829F288A194EB3F6F21FE7D7FF55F8FBFD1312AA603CBB0C011CEA377E6E2AD1541C5BF55AB73777BDC20DE77F701E7DF26728A44D881EC44E905608CEAFEDB670A261F2109DBFF79CE13E98A3519A9A86F3E01B7C3EBE2F01C657EE017F0740328B97392C6824FDF4D5820458F0DC9E999A4F878D09493D249D0B43268D44135C966B05AC8A69518BA5AA10423615DD3BD8B6E38D37D4E7ABAD0F8752A64736EB4D6656F6C3A6C6E1595AE0ADB31ADACFD6B4146F4496E739C4DC98835CE4C5E2F1FA899D4B896B02CE97822E90CABF5850321487D0C9DF07772031F1A438E9D63374373958DD9708C6BC38C3028C2C7DBC7B2A5A0CE8EBF87A72EA394FBC0046B62D60CFCC4256930BE65B22305C750B2A7483CBE0B3FC0824A011D274FCC289B8EEB9ADC5505426D8618369E0135FCA2FFF5456E480109952CFBBDA22758E14643AB48F11AB4F4EB475CEA238C6493166BF384B1DED53072D897E368C8BF8239DE53290766A4727CBBAB88691400E9FB9CD53442B91B5D421323A24571DBAB65B7EA7015775B6C8DE25247D0E7BF3DB7F2506B4384B328", "D7554B01374AB97EE1246C2DA82B0AD5BBC76968B6E058A821418E0707D596E2A7E3AD9AFE623D18812F269C1D347A732BECE58260D2E8F1399AE5BB928716865B902611DA70761A4C3DB3EB0D332E58E081C08D4AF96B1A85DD68CE15A8EAA5B95F73CBA9975924F8F9A3CB57249A6A904A33F6471ED4F389168702EDA2054B4A523B6CE189B26C50900913CBC7693C4E447CAC4CA7B783106698CBB78F5E793284F27E182CE12BC792935FE38CEAA7F659967111AC2607C8316FD3CFF111DC5C2D58502555AA589010F9DE4F735D456CB9F0896FEB163984710BCA11C5D78D9ACE6CC9E2EAA70B177A9D33D8C59245FF9773AC181548BC82C751D59A350C65C895AA79E9B57FBFA2D17F53EFBE0C490B43C3369B71DE45B9AD67C88B2A8F1AEA2F5D871970FE9D4C6D63F81647DEA310F76DE6C050729DA4575087E3AE8F6804128FDA47C1867A6FB5065C4186C47D1199BEDED29D26BF9825676FFD9A98BF91E3921A07EFC949D7473CBF04E6647390E33CF765BBF73714E0AD38C4D1EFBC3BC4144CC9AEEBA0B9B4843F910A7F9CFDD347F6DC1017C010DF0EED1A71958CC5BB8D50BBEC164E186B6572FD09715C29611A3A5162496968C1DFBC1B6A8A4E617922D152FAF2B08BA40E47AA0E9F30515C9AFC74A5C2D87828BAE5243BB7988DED81731126E4C7E9609863929F943930FC72D0F3A4784990E08145485CA0FBCD69BAB2391C82E75BC2CB2DCAF0E94A3717B6A157070C77A8A3B5DD1E30AAB09F5368F46F66575599C04296982E6AE8F8C334ED24CC58449CAB0B7660E0F2BB9D96BE515245DF9654EAFB5060D21291DB8A2D820BF372E795957D59ADED6A72C265D19C852312BFDACCA65431B9AF4DA6AD56B97E9FDA9AE4650C9165037F353D9BE92322B4383C30404706D102F15D8D39B21D22E0B23FFB0AA0F58F477DEBC4F130BF501C765295A54913A7A0190FC907BF2420B329B97F30FA65A7429E7D71E572E1BE0AB0793B606F480A1526085637BBF89CABDBD9D19D808F230AE48505CDA9ADE68FDC826682BC406D4A7575EE913B60769C3BE4D81A073C05FE2BD6D7A1C3B52FD2F22875BE856CE0F6D7A3AEA1897FCDF951DF4A86184E717B4077A25D37935A82E073373ABBA58B0F5F744CE52284D96200CD90F0A7B4A03869A93C9371B7F946EAF2EDF35ADCE873407C7BEF0A750CEE48BE3A33CC47979648FBC5EA7E79DBC725C3901D4D05BC5B804007BD46E48B424665763F028E3777FC1A00F588D9A26F68DC7ADEEAF8214B747B409395016A05D8C72FC3E838DBF7C5A222D03699897E5606433CA760C6D67C8BECAE0FA8C312C9875AE26D61FCBD3A320829B615FED0587E4225E4B62264C9B37D2D2B45FDDCEFC060257960DF6A1AA2AC0544FC333914D192A1629061730213B1455E6FD7A712A08122C8BAD77EAB9CB9687AF97A3AFC02B8F413930DFEC10DB37C385B5643E91F3345C73EF353453F34A5EADC8EB41CB098E9243E57258AE608C9FE7BBEAC524B21A0734D8EE51EB30DD6974B87FDF3B0B1E1DB01FEF13061E4B072DAF927C99BDBB7691069E2493E86239A69BA33AF82998CC1D7B368A4343BC63EACEED280415FFF40B0B61221D7D1C098C6391E5C888228045494F86644F34AFB1B191BFCFD1A29C678956DB16D0BBEE458AC6DDBF00E738198C093170FB37F3F141619E65502AC57E9042CABC72372E5FAB9DFF5E42A00EB023E44B4E536706FD63BFEBCE1C0DD59E465A61DABF566EE7216973ABFF5D34A5A62518E12E8352C61BED9348E5826290EC0F84C", "4251265EB325D261D721A84F62224701C9F564298EFE0C2516330F7AA43CC3D7090581B74C69218D74C8C6563FE276F24F39BB7998CBFB9C49EC649106DFA51E45498DF0F347DE8A562341DB34E94F286F583832E49AB38C09DBCC3B2C307188A980574461CB3C41EDFB933938F89C88F61886B60097F272E511B49CAED645190E98C3AB8AB5CDDC021F76567AC1EAE9F4F8D782B91BDBA3037BFF8FF43879FB6598D84046CA06B3C8EFE275BC61E449853F979AD6BFDF27DF453E2551F09FC1916F4E9884012BD4B946E2A65C86C609CF8EDDEDCECBE9B1DD6715C1792E261A3A013D64F00118DDB1FDAC9900E8BCCCEF9246446D5248D5E3423D859E1AA9BC38F8697F8A4EA08632983F268BF7D0BE639ADFCE6625E00229FD510A41AEE418C3AB85F5D2256D8EA4E9AE47316BE6DCF792537F28514B99BD76D098C8B4CA16DE1A9ED0F2693DFBA9B460BD842452BF563B03874DCCCD3E18B76AA3E352978473A2E02C6398438A35639457DBA7316577B0863762FC177010E0FA0F7537420C0443D8D7F51AEE4F40A67E249D678E77F17503A0A6DBEC3C60FAD140DA592082C334E3B1D021E34104A9A724FB6EE3B5A22CE5D3BB9C5E896956B4C6F7B1F51A74A56A7232E027F706EBB999708BA8ECBF42F44E41EF63A7627C60E5E75C678B5B3F7846CBBECC9A1B6EF78D7912AFF0EA56B7E25C31784DF9D63398FEF53F6193554C4D8B7A96C170A89961D2654B9A663B39C76401A439CAEC482BF44F20DD12140D47D0580DDA48EA905D409BAF5BCADBB8394333B97C0FD9501AA4B4BCEB3F041520422530A09A9B24EC04206CE907A33D0A18CD5C1640CFEF970623B1AB2B7EA5342B6F38C717416C17545D27C21A8F37AC2B98991395D3D170FB2D03C6B152915DDF9CAA12B5EB19E45FAC4CFD4ABA726A723237A6488773C05D0D38D38D920C6E8F2D3476B06B40094463CDAF380026BC36B8EF3DED6A01CA89E015A0B75BDFB97D859C620D329C9B26B1DBE3A3C92D8510B060ADF4151AFEED125ABC0D6FD3FA9F7F3C67B6BAF14A672977F2052A84F0437027956AAED010F63471C5848781BEF8F2BAB9F8CB0DB00253E2C6FD30D2A0794FCEC489376261CDD407B4ACECA129D87FFA0C76E28B9483034A40F84EA21E06C37BBEF2987AC16E77E021D29CBBDF077A912B89CEF82FF0EA59F7FDA55EE99F4602B5437CE71B4183BF28BE79327483898C39D09DCAC59C3CE32333BEF4B0720B30944B9998A01CB3C135D53B4A76FCDAD1C321D39D4466F0BF95710FC975ABCA1181070A4A5741624CE9AB0FEF27A5BB1805BF295861D0208BEBE7DF92EEFA7FB123B6AD42541C1A1057DA2560469A680E3664B1455D6851E6C8DC8C4940281AFF025B2BAD2CBB53D1670641EBDE2AE91E71F7F69AFD0C1A0225351CB1290EE40F81560A52463FB04E1364F9F3E5C454C311240EDA5C6AD78A094A73DDC1463E19A8E12419DE4966A1F12872E566F178E256F257FD1890DAE6F84DE013C2490B57DC1DED2E705C0134E889EECBE5575587EDFC240DE938C6D2D9CE543D5BA3A4A3EADE1A6A5F0CFF996311F72B3C6761414E34342C3D1A48F5D3011D7BC7F936E8E086581AC256DC6A376F9C4ABAF87FFAAD67BAC64401F4D976129EFD57102A84E63DDFEF60CF13EAF8973881FEDEBFF8D4B356B2A03EE9FFBDFA99F77EF7251C11EB1D2514D5E657697EFC47FC42CF10FFA7F09765E2EC39E0A99E4FEEBD410BF4AFE51855341279F7E47DFF0066602618ED5BF70B2F6D002805F41E991C68D64ADEAB7374F25B60", "E0DAFB980D888AA2580DB37930D1942D6D088FDC706871A90D887B5F2CA6B21911BBB8BFEE1376F48428238607AF7CF82C3B3C9223746BA9A5F01523B20889ED8F139EA3D505D55D766BD056416193CACA6D5D6175C16C38BF44D7F89D4A5E3406C7944AD05D86C310E1EC78E0C8AD80FA0DB202AB1768AD446AC7FEC60B30D741114B45857FA5223E64AF32476319F16DE15C04F34F4730AB31F4F6BB13252D706F0B3BD5860BEB864618353CE62469E25CF4AED50D8BDE9633CF18F76AB1EA5552614D4AC3848A0CFFFDFD51F17A4E744533DC52979D7012AE53E9B08C4980AF8876ED2FD8A6F174B3AF651517BDDA1965264F1CCF0EEC8E3A9969D1359C5C9FD20CAD8698F3E28ACE77001F563BF456B5A46FC747E5D7EFED93314F7AA87CFA60405F968A4F9774E30E2266938BB19E9265FB71BE0D40FE6BF14FE02E36FE10FF110D63E02145C78B73217EED9DD87F70077E4229572E6547DD71828C773E46462E30B497F9F5F99D723D657E17A288DC98724B11AE87B7E56D33386A7FDEE0698353CD46409FE8D2236958B166B1C697BB8A42946D66E390A045775A6FE7DEE4BE260490B69C56476B894383091C827D02E960D9359E8D3E151F50EB87FABAEE8ACC6E325B36674D9C7CE249B879B3FDC6AF95E92FAE53047BC211757FD12564EDDA4DDB6AE8C94DD3305C21970E90BE05ABBAF912ACC52C77714F87C2B059A9E21005D8903A604D82EC22192C46CEB63C588A219CBF755B5D44CC0E918CA6705156CB497FAABFF63745C826FE16F65582D4820141DEBE3B949C29EEC6D99C2A4EF34DC878DD82D0FE6D5ACA302ADFB897DAE78EB0BD28A938D6FD5A3535CADEDD7C521E45AF4BA92FD40DDB009E35C21254A6DB959698303D56B59D8F319F18E688F9A20DAC8058E0496E0E46BD01880F3C78EEFE98A511768919116A288CD3CD28098BF5D4719EB64D548A6D791F1A9A9A3E9B08E7184AEFE60A3D7D7179CE47562E9133068789BBE0297FDA2B2D6F4248B288CD899BF3231EB360ED45F769C0167284319D2C2B11375C2B18E5B67594CF499A6AF2687E0C1AAF09F4161F3AA8369BDBA68AB022459A2DA9DEEA13E509AF3A68D011998D9C30BEBEBD04BC9983F36FA549BFF3E3D323722B2136AFCE0A2CC8E593B370C7B48635926B9575A77AD7C0DA18E94FF1C8FABFB57B25981288E1771465360E2D619272CF3F56268B7EE130FD07DE29215FBD5D0A72B73081869F60CB149A1E4871150778A2229F3C886200E0DC2C76AE049231FD3171E49FF44BDADE185883198D21629CE0AB252C7451398E0D411CB01A66BC5B141CB150BA9CFA9F9F46339625E1D5127998302AFD19D5B2D85F3F0B2B354C7CFAACA3D4E7C7B7DF44E22EC2C226178DDD480DF7787EB28F0285B1F973DC47B094491DDDC12BF1CAEB99E0E13781FE8A64DCB0A05A30763A055A6ADFE5434D7694A0F6A0366B5D74E73227F3D503E6B989C5BBF9E6D81EDA7C46D890FB2C5CB439C5B49FE16A9BEB14B12B08C47713331E8932D4AF6B85444E3F848C5AFDC095E984449F0D126EF711F8B43831755BC0FAE8D9FC79E894CEC183DC24B1E3C81FAF6A546E464AF8C0307263680CEAD9ED6E80217F98CA82458BEE59D2A4FA76BD7D4425E0C77164A50A2933972108661820C75EB51C8A0ABDDDEB30F31F2E575AB9DB723DD084656691096B72193C52053EBB8B72C6B30C49185166FC39F3D9F3497606D15E8D696CDC256DCBDB6D01DD2C33C0249D6069788DEC09802630597C13EB1AE152E8E84F6A4BF60BB09E049EEC", "EF79F2E35DA357E9C076B00C6ACE7C50F865830698571E999E544F5025A99C36BCB025B7967846306FADCA22B8BED499BC9A80EFA7BDBDB83B15DC6D48AC4E3978D528DCE0A3E11C3E62B619EBA0C853EDB0EFA1DCE9EFB2E024FFC0B59A8AEC329FAAF418DF9BF70A250F2F6409A9FC0153161F6E8713005E53154DDBE15242AD801C216A1E5CE207757BFFBED75EE4C96CA0C3CF448966540EB434C68E9A4CCF3C5907DA216BA664B073D73B0779204EBCAEB55446AC6E2C40B8BDC666D4C9D33B7C644F867BCD8962274630191EADAEE7248398B9F02744AC5D4DEBDAB2D6D9F8D6C6392683FC1A795F70134E790718D56DB6D424725DF8AE7E11F02D684DA78ACB4B9C311806D082C1FADE4B31B8A6DC0E5F16618C47E03E8D78DDCCC6ED869F77CD39926945466369CC2371D3B51F58DFC6471D742C9C82B1B7A2B1B1BFAD15FEBE592AC0F41B19C126D923BF5944408506ACED28FBED161902EC5FF19CEED25D18F47A76860777A3D86B3E0BA7446C3F1EBDA88F8A8E182CC0938384842D42F41E0042C53C645DC87C88429E06BA9906A7A3C1F6A76671D69703496324406C7FDB20B9C3CE9BC273A743DCECC0016BDF85D82112DBD4C49E2A6A5DCA22738750EB8DD6AF15B27A0601970AD12660A51C560E5CD44B55960AA266A88B82E761B53A8B42E7332EF2FCCE093BCB06FD18D916FA10F4E9891B103DDE5D808963E6F71AE7479A5D0BFCDB8A2B2086308CFB7813EF6B7B5304225C2E9690E47CBFCD534570933541E8DC99227986C0CDE40924D64710A7FE28D248E667E18197B44D83FF1A0691E9049611AA1E04A1DB06595EC32A9B91C46F50096553C0B5716D2EA9C9E3D373C787783B50F28948EF96D21FB323CB69FBA26E8C869C745FF08AC0C71D2B656E42928D09AB4274C307FBB04AE41FE847721D95FDA55510893DF24F56522EE537F609FD54E4DAB4E98E9F3F8E8243C5D056B4CF6F2330408514C6CA22DBC79BE374E2B34B3E9A9B689B9375035F5E32013587C402C14997741654DF70FF5F74C0DC26D82AE7F036731AAE15D596E426EE2E7383EB540A48EF41FE2172F1565AD79202A016EF31255DBA5DE29C8C77B4704EF177C97DD507360FD01B44D612DCB18D7B5650032B1E768851C84EF794F833F9D5D198603224016D3FEA90F3C65DA465418750A69C43050A738A7EC4D415CC0B404B475936F8F675D49C67B875BD8BE2B2D65E05C49EDFE72163CF3F3BCAD87D8E956101964A1C1345F3978E144303FD1AEFA4675F521BBA59F0EF43DE19418993F444C1F75BEA24B295CDB73A51510B8B4B59DD20829466409444D4FF428B3B94164666A642FC2A187FDD7ADFE75E813BF64DE664B131F58B9CD825A19AC360F4F83E43FFBE0923494D978B1B2ECEEF07F2387E03B1D933008C0131A9ABB08DE1EADEF78291141D285EADFE1228554733CD927E9740D39EC9F539FAB960EA829552CFC36CD8BFD9092C821CE4FB4F29115BF533A56D7663CE9FAF2B9DA374B6E1CE5528A5B11ACB9FBE818BF4C41787F5E4FF4D517D46D2234B77F20ED3928BB38A32BBA350A66540E19B586C47EBB9EBF4E4A671CB41DA55BFBE5B39C025BF8F11A786D60C9DA6EE5299B17C0135689AC9D880B594EC51BB52398E78AC7DC2439D0C4BE7BBFB7F044661C9CD8D6D7EB16AFB943589C6210882557C65034BD7D044C6E957722C93537473E2EF1AF5A6D05D7404E274D2DA8B83F6D2AFF9EAA55D122F69F469927EB682977715FB1617B36368C22FD6A2A7B10412E9F202C6FC9BA1D7789311D0", "18085D480B93B422C6BB24B09E05556F8298FCA307341877435D2D76B9DA1A1932F20D2903A63A0856D9C431FA3C4C591D606E0043B0C6BF277971588390BCAFFC01E14C6256290E1A01EB7BDC98611EB4E40BF72B04C21526D4139E3E75A13DC25C0691B67F24B195F57923684BAAF94C7E3CFF4830FB5E828B8F7A8692C1A0CFBB9FD3F021D3FCF12C7497021178A2AB8D3256E8606374D6D0E7FE11BB1F313BE2BDD4D977780C1A2053F6CB0F60F89671AE59C178FE33900FD11B4DEC25C698CE0FD4E451D6A3CEB4E41BDF08F05F556B4394858983D515266F25703C17B48B1AA13056ADB2AF9A865A0FD30BC4BAC0D7B1D185AA2903D1956DDA3D5541873EFE487E08E83613428B64D2A499BCF3783466079714FDC3D0B04ECDCED5C89F77F5E6E6F1141D47EE7A3C32382A89F512F9C9BD96AB24EBD4F77B911D8B8206CEE29ADC1E055B7BDFFEFF94AAFA750B857EC6FFCA693787C0E2817554717CE5DD5568DB1AE585B9BEED0C6E228FF47C43FD7565D3D5664BEBD73F97DCF73D8EBBA3FA092BF6EF21730EB909327313FE1493BFB44397567DFA30BDD7D090245057098AF775CE977528E91D9C3976A4D478A5695482E4EBC1FCB2F7FCF6E5F9B08BA8C7DF12E6F77C3B0362B1132F9209AC1D69579D5E9815535FF72820BE1414020694A3E2DE53BBE7DDB582C70455BCD18AA0A4E0A8BBD718217C616129F236487194B266F95E644D1FA79532D7AC13CD9C839BE14AD4BEC179923EFAC48965A8C915812C0F0886C11ABB0D2DD58FEE6AB2549AF9380B8699F3EBB0F96D295C22B940044819D7FBF2364610893457DDECED6113D1B14BDDDA8077BB32E70D19733CB795BC8964FD9788ED317B5E433CDFAC3CE3E0EA2A8359671F2ABF49946217358E92828AE32E6CE645C3C0E4D1CB64E5C8532DA7FC179CC7ACA241AE496D821EF7FB9E8D878B746C50DEB281604830360C8ABA336D1E8F444FD46A74F6B1A0F1F61EEC42C1DA2B6D88CD1AE94B3208866BD1757B1ACC09BC155DE4690A97D0244B819C0A66785EC764276BF39FCD6A1A172C777F2E9A44817D1B6B3C09AEB4436A3B115605A850AA9D11BE2E660F2B214C45B00134604EE395A77BAB321298ADE920BE3050CD2D7BAC4931C3E3687BC4FD7E2EFB536E26404E9950C928A3CFA8A11BE42D15EA8DB2037154F79C67860844D04DF51F5F21E90B8A16E7504947B90B655744758D97886E4860FBDF28FDE80B8F32C94D09F4F827F34E8FCE92B576A8809738D6227C9A31A43CEB3EDE56BF7306DC6F208D6229CC3E5C4B49AC54486ABA7F0079EDDBCA82C3C77F41C58A88C4ECF4DBEA754DFB3424BC3106A9FF280E8C6A7D086FA06C44ED23A82E23A03D3FD4CF62DE1AAF3A95747CB5CBCEEDA5B1929C13DF6CFDBA6A94A62AD3035C8CBEFA10AD9D37389B2EB90822E10B422BC165A3BA86F37C0A5B96D0EABCAA331FBF2806C65B376665A434A6D59B3BC9C339F4437F4598D0D6C62812A2083C32359B938D78390F9B4F86E42F297405069D350F86B089ADE021C1599FAA2460EF5904A6E25708032540A7747BB254679454A7B38C7491BDCC835033A76514869ADCFE268FE49CF38A9B844A97214E1E1ACE873FE051FAF282664552DC98618E35DBA4AD9B1FBE50700726091534091C631B54C944C28D97DA0961F8E4106408017CF1EC86456BCC1F4EE7118D0691F0F327A0436D3145E5FBF8FAC33E5179094FDB03D9DA0D9A2EEDDC221A21189B68EE1A94B13F062F21472DB5466B266562E2186FE01D028CD4AB5B6AC9F048D8", "D50CD8EB871C5F371648DC07E20BE84263CD676282D56EA5374E21B52752DBE416DB787BCE232226568621ED792A9135A59849451A4A4D8A1DCF3C804AF966881FE5156FB761B3736F4282240FC0BBE72F51F0122D96B3755109E7CDFC70F9DD04C58B4A51C00B4FC0EF252B05ED76440C97DABA04079C121351CD43BCDDD4AA2D2495B49B908A9AF815DEE1405C3CE9CEC7D5BA9919621E8C4E920E08061D228038F73F8E5DD66BAB806D2DD953C6FA5360487957912249DE009655658BE8CACF00E6E0621739648A7A75EA06E93946987E62EDC270B266BBBCEF61D7CC63013AD797589A7CA62B65D4127E701BC95D45C74DBCBFF498D3F87CBD1B288D6012EC392B901A3DDFF16EF1E1685EA1F92B1F32DFED2F9076EF9CB1ADD8B04953E5509B24C48977FFEE6044B8C5B80F9DED6FA7110C3A2EA42EEE8A83F4A28FE78B27E84AAE7B3FABA56C1A4D2414E0341C69C40A43D65E16583A151826F7C7CC0CF0A5999A1016BE6912F067913AEFB525EE41F1B9C82881054E9624C03DECE74976228B119974BC546F823A597C7486DD594F1FEB2B6D0330918936DCBC12E3752A7072C5FD7B145571DC4A22C770E00F24B8C91E27F2C727FB049D04BCA813948D2F7B531C906F2018F51C9EF8B7642C0F1CC06AD338BEDE17683E0BD2A90D4D4746189F792952037E4918D2D6E61C1C8A8B6C437075ABC38913C250BBE6EDDA5CD24B630AB8FE9123B08D5E8FB8B71BC95BDA4AF1A71D5E54BE98B16D7D3083AB1649CBBBF44B3D5DC33B77DC1171A66F6F40E75EB86801EAA36E02D138093F28ECC6DA4CE4B128DAFB8D49A17C683FFAA8E6910B8BB7B832B3A3D0765DE2ECDA9D7BFF0A822F5FD389A04B660F832687CD67F7E1E1C3F5257C6FEB27B763AC7327DE8FDB989413B6D002FDFFB1DE5A80F1C5E39F06E6D716A69ABEF37B2DA9783FC494574689948DB51F78C8812E09367E6C8D70F5FC4139C64B96C71ED851D171AFA69D2A646ABA85279B7D3D31D268A2E8A272C91902F12C49D07D74E82728AD61BBABDA333DE7138A976A2267DCAB1A02E19B0685F64B608E3DA41108D54A07D4BDD24D79D293830C04209C98F037283BAEC00B1923CF404E1F21584F515F9D59B53FA9B4774FA8D3B34B7C66907BA127A095CD8CBB23375CB188CF9DF22CFB4CEC528C581DB63598DDD9A53438409D72507D2CEB5BD45DB5C760415A5E3B3A909EEDA73B7FE122DF04CB1E9F29E7A5A7385F632AEF63771A4CA2164B9B3FAC3C13911DBE9668D1127DB02A94CDCE2C8C7B66F0C21601781552B384DF0FA002DE08892D0881174CA1F6DE80B98BAE545237C5CEF9E1655F9EF8F8293D644CB47963734197F1976600CF2767A59FD56B9B67659168ECD57C485E5726C150DEC6C302456AFD4F12B2F2D1F36B03E100E109827726020BDBA970A6B768C580E34116DD0011299B4DEAAB8B04DE1DCC5FFCCBE57254CA79743D6B00D119CBB2C0B0BBB2FB8FB0B0EC97204E1720F99D16A3257846D09BF8EAE02DB21FCABF03CB0989FB4D99B6D71D5E64C6FCACCABDE63B223A91D1278D676839E1A5CE6C5EE05AB4F10EEC511C366DBFD7AA1E139AF671CBEDB3160A775E5214C862E95C3A7993E508D8F8B7ABD68213A531B5C648C537FA2674346FA0B3AB43A7B58B4F83B36D58C506C188DAF72381DE53F83AD4D9E6C6B1F5D689AE24CD158BB2898F06AA28C8FFAB1703871A6A6FE41ABB6B8B9188C90EEF88E7DA3338F119770B31167E3AB541371FF7F98A2D59D3557438DEAD71C96B97F3839F5E28DA6227E5B4", "0447B9C85642F3F8BEBD1CC7AB0D0E4D07CAFA93A26C75970C8B40443506AF8BB671F30867FE4225F576026F79010AED56CE915AD9AC001447CDCB7CC3846B0E291DE0E9E443984E0ABF7C1C1D2F6D073B0B77116A21C3C0B7F360439D11D2DE370CFF8FF73FFFBABFE4D52BCE58CB32612870B0EA23CDA21E3B6E851B063BC76FBF7BC394A7D3805D45616C6A313C887D2FDC51F065F8F3C05ABCF70F31EA5746A513D2DB3F4F3C61006F19420AA82107AF855649EA5D90ED0A8540D0A2CEC685D18EC8F4508A7D092E52DB2117C233A7BB542B61C26BB92491A88942A506ED60354EC1963ACC189A248E37C9367F3F6FE065EDF6A1205BC80B267C1062BE20950617FE0EB59BF8F1E69982F3E89E7EF85F3319A22A22B8BAA491BE76AC7257A2DF631A98477544E3E57C7D63616D22789968CA5E929B507AC394B6772096CC70B69ACDBADF900D055881FDD209AEF54CE6966767C07EB7A2B40A3410C3417D114FC9E293DA7262171325D8179262B2BF041F5A977E2D648900295B14950EDF245C7EEB663F8292625F804BB839BE3A5510036F7A50288C69F94434A03466701BF1313020A4DC4F87D272FB9D1B7676C195C0B7B4D3C2CC6B20D5C2066C7DE5DFB5C9FAD43D80FA43BA917F200A73F258BF21ED8BF3E39F69E501AB3EB115C9414C82C52CE91F6CAEF4A163E288A6FBAD4FA83477909FBC972E2EE2A5379456105E8EA02F92B0D8F79588E2282D1970C3A033F738011BF273EA65912D3ED09398A7F851BA2D6141F97843E90F5C66B38D71D70DB9D93FAEB07FE1AF5783D71CF50931C282CA8B483D1F2E5DC5AD5FF2B06C4355E46768AE5014A22E7CA26267A1E6CBFAB24C8C436535F23D419819D6D458551EE78AEA4779574BF86DE7960969B0635F0B2996F955D863E078DBF8689C142736BD5177DBFEA3CA8C58871B1FCCBFDFD67BB12AF82C3B8F935CCC507D510CAB63B831721E0ED9C258BA7A3FE245D42DDA1AD8A962847D7C724DD2418F72508FAC194EC43D17533AE522187B44D71B6E993F2CEFC6349141094C8CF935D90F2F238728D29E1F5AA09B46FA7CB651F688A8A06AB97FD2363486F61D3F42B9C015652A53B3CD66372849FD2EBA05CFB5AA28520B01FCBD9C835F98D15FE01C84D7FFBBA4B2DB93E44E4341AE95B8AAA4D59CB88F7E192E89954E22B1B8157FB0B89E3E1E3862BD4C2799F2D8C621064EC9BA1EC30E0F7F5FFD7013A7E1C102DBF01698322992EB05978A5A2878756BEABEDC660DA2D5370A98CA2C0A4C65141EA273EB787B2E7AF646DEF7DA77A93E45C37E69B474D04FBDC3B5982D8492FFC37FDE42385DDFE97A73B8575C1305A0B9AC0B0CE061A423556B6FDADB67D0A5BBA7435929D658FB0869BFFBE5D2FEC96051FE03CB7B0D944304C2D433459A97C43268E43951D4C1708C702FB9C0A0C6D82876057F4D043B21A92FA6D034B1DF5C2B463107AAA814C79022D96D1BD9D33DE5A1FF9E435D9607575856CE4DF5F1E9E90FEF5ACC4AAFBDBE0F982DBFE78C5ABE1D9C85E0452AAD7836D39591411B382BCCE72CA1702A20C9DF384F5BD539F53CEE8B9977AFB705D1D28680D1733BAF5F298282846EFA26B0DD7514422C0EF9088F796B38C15EDF6C8D88009B10CD0D6B4B2FD93679712BEFFC4D1F7A3898AD0CDC61D2FCDC360C66FDFE0AFF0E8A7B26359606CD4F47D28DE115261E6F98F323FBDF3E3046BCC2ACA0831D2BB4DDF1EF443632A229CFE6BBA5179079DC7FA50C56BE7FE5FEA0C5AD09D891895508722861E9EE8568F59616890C6370", "8DE87744B81A0E21A62CD72148FC3782AB560CE136DC3A07F2D2E143EA0DD2ADAB9FF8AB39B2A3E8858DA593B6EF6C46BB5CFD252F6DE446D9165406B3DD18CAFCCE3DC7A6E6200D8F7591169A6AB9DB6665FB72140A416EF30B75EBABB6C284E73809DE2A3A26C7F4F188FEE0B401E9EFF6DA22EF3DBE0FAA6DDFFB5D8C265D1A1855CF7019D8659062AD7A705362D1510ED5013B96D6EE803E7C6418B05828243496753E8616F4075A08346038E3F3549C0AB1E761790E818C2B531F06805D92FE53D45B9A6FA5E30E3D6A2F467AECA07D29E1E9123247C69220E2B9D4501EE42E5BDAD07F0D092B33A938B8FC0EB7E435713E3E428E87DB24AC570E4EF64840A1B4D43C5026C80F321E537755366B16FAFF2423908FB74E9A5B08F0C1064815472AF48240F1C374F2AAF8ADE55117E0FB1D08AA40C4D8AEF35CE6A91E54A89BBE55BF5E78ED5F66B2FA1E8936342656C63263D4E7ABD70F7899DAC9A315E9508AE65287C6660A7D7F3FF408CD06F3B19E1238E6D5EF040B3E54F4469BEC17198AF3F78F660C6753157603138BC98AA9F01FE79036D4564A7396725E57F875FCDA4EAF80C5E2815862AD52340571A571B331CC8122C13CC58403B22B61BD404C6D94C36FEF187C712B524BAE9EF150A71CE32366AE536B5B94ECFA351EF0DE77E729C42BBB32C7D35F9A5BB29D2D84BFC91F510F9A1C907540AE3A80CB7023AE0635EA5C2EA0548D9D14CE4BDE142436521ED1637C7B7CF6CC1DA5F826B800AC6FFFB83509A81ACE30FD969495313F9E18CE4D8A2E1D5F9C7DA14A0A9D4C4D49BF00B622B6AA07FEBFF0A8B274C297C0B4AD1CBD64BB4941543FB63D9E15059E0C0FD250753B2AA664A677780C39A013E1AA6B8F786D677755ADA03E51ED55F936FFA1ABD0430DA8750575C37D1EEADEC5E17148DB9FA202F8748B0611EBB5015F1D26C0D810F1AA5A40D73C32C269EBA5CDA134267231FC3783D3D4CC639E567681275F423439A29118C6A0C1B07D08416537D4707E9CA3FCD3494F64B69E2AE9EDD0079CD428CEB8A00BE0FC9A791FE2DCFC10D7F813315E964828A4DCC2A2D42EB313CCF192F32AA9A17C984E0D3CF3A0BD86E0B751B30C096F5F0B08A0BC439294D2BE2CB387648F8119D8820D39F17C6AEC976A0B8C89C76D12AFF73059B49EE856B2591E8D2E817DC43793F20B2AFBBD49FD9A05F5B4CB69165420AB96F26A46861AD9423F7DAE8829FD392799EF967E1270563BCF3D46025CDBBAFD15DC23F33EE5B621DF6A12263CC0A506A5E9AB191F896D13382B3BC2D536442A62B09F3C2C2252D0BE377CFBD59097259ED243EFB36C9AC0AB01B3AADD502DAACCE17A49CC82FC9ADF67B4EDE81D9355CD8295DE21468FAAA25036B2DB6E24A3AF3E5FE59324867658EAD5198C47D362EF64B71179D107DA748F00400F15167E84B62588F6D81FA4B68A59A24BB3D27167D0720718BD24EE556FB72113FCBD37831251DCD538F6815382E119355CF3490DF0AD552ECAE0D00462C10CBA4011E95C7FEC968AF6E39E1FD15D1026879202C57E2CF7AB02B08B15373C13435D8A55ED6B9BDD98FCD5B4539428D90A2C73D37DB112D2025EC8A4AC8EB82C51C46FACE88AC0E1F161705801C781EA07F6914122E5DD6BFFA3812EE44E314BC09B785B344584AA8522B63FB34BAD2122F9FEE1245E6DC837DB032387EFF5036A021C8112CDF03BEEFD89EEFE1BB88A132CAE9E1E9EED3A855B364F2A4A2F81086172FEBC64614BC04D11E74AF00F54AF6B5D85EE4773644C3FA768532B1821EC6E5C", "0D1FA0561DE4DECF411AB73FF48D0810AA2149FE5F3C22E62E06C02F60189AB5690A991CB88DFA5C4FBED745FCFD63BE3ECD9CC599E35B5FA31AA11C62F3A33796A64EDD0B64F2E51E75C2481D3EC9DDF07DADB71448BB336C0DA9DBCD897F777E3C9DD97C7EBB08827C19316F61420D96F3D94EC395F8BF88F5927C71397F6C24901914826B1BE26E14FE93EED37141109CCD00C92772B96D9EFD74B3EAD3903854801B22DC3F98232023E1F9CDFD4B4C952A6D268DF9FD3FA83C707941F8F1ACDC195AD66E7AF48D7B06C62F3204E8D03D2C92920C589CC56A5C2B0A1F10401BBF747B60B9D2179BF9CD7DDF50B10823372CC4E24005D73B4C5AB918F22918B16D98F15C365FE69786C1ADE9FAD71516E389938D5D38420FC79F82C6C0AB1C6D93D1896FE8A2BEBA134C138EB1FB00115E50A8A676B9D9939E7375F4B7D62D449EB341B0C03EE3FB18564DA3CF64261055594E0F8D322EAA9B56B5328574AB323C4376464F3C27786DF7026BFD6C7757BAEDE7887217A2D3EA22AF7D6809BFE4985EDB32ED503C6034FECE55F4379920C73A515C7390B3405ABCC54F51F686903D5354468AC566D5A03C5AB536934A6CE698E06B9E2C815B15B4F8A1857FE7C0B5486759B150F48AE9745AFBCE856830078EFD7F4CB4A463587B7DDACC79FC9FBD9C2A0351D91DDF27A65CC79005DD24F1C26252BEB8C3F1D69DF79D386401EC5AD57BF2129D1E828D6D57CABEA84C7F77B16B919653C12AA7F770741E4AC11F0AD08507C3E7C4716F14F14C548A88DC4047EA96CF96BC0CF786EF7D02424314BC846682109A2F80044B51B12A0350DB9FE06E72581EE874665B9680EC118C86DB575F9E5F687CF35DB3CA83475051AFDABDC974B2991B47BEB4CB967E3CF20D2B7CA2BB50825EE33FBD7C6E87095DE8E36CA6143F673A8C18882D89F22C08971CC709F1518169123EE59EF50846C95C313F14F9472D4CCB8EB71301488901F27E895B5D44420F91D123E3EF5527121B9B0C9536CC3D4E5EA03F63BA8FED0FDF593AABC3E768962DA165CCACE066ED7D6E46DAE97EA08789C36BD3CA6888229D15714302A39EE4F39DB0751F0E99877237524ED8EAC5F7EE2CC40A69408DC43E2AD88A661D7E443D7E99A14484E3011A41912E2AD4F6B7D62D8D9F3332F79A5FE1E16E8064C91DE56B1F89A9A3A220165872128771745D086DD3F8DDB2C35AAF3DC6DA70684DF270ED50D188FAE62CE4C98B9019D308772EF036F9FB2775137377CE61529A40E03B388CFDA3BAD55FD62D7ECAC2A72FB68068BE08383CC36FB66CC252A0412CFB3C993803C038A1828E8893DB453D47C5727CF8BF80850346063AF4976610F984ACCA00BB5963D5DFD018E0790F4A6B14A9B5FB9517783EC1F16773C49A744D8576F7957D4CD4C4E35D1BD580FC76E2632D47661A6838344CCF6476BB793FB12F92143524E5A01DD5294B6528C5A18B24B0B75D017C4DB3663BCD561AA8F27E510A7C031ABD3708385B03294E3BD1A695C573701B9D4F60232DF767439E252B7DB10D4E3FACAC8C2E8D16F9500828826EA807C2C7C48C0EE8457E757854C1540EFE9BDCE7C09AF5BE09AEA54A4BB0D2A328092F3B8741A128D4BF588384A3848A5E4F55DACFA64F7FE081366330D16589991C52A1BB782364AE969E8A21260518662B00EDB117278170CA2C0D186B173F93879F6F702E03DE768CFEA1E39FF8453C7B3AB46E83FC90FC56D0EC0847DF16A4BF1ECBFE29D94CCBD49DABDCC5FB81B62A2CDE7D2DA3E67042944F33A007096DE5C79133C7F4", "C9FCF7D2DCE0A2341FBEAAFA64F6A50A93F3FAE3B55EB70ABF51A4C001E15A8C78DE54E50CCAEFF8C2421079F7333541018D5EB8045C3AE0F0489D13C593EED560CDACDAEA39BB49FE2FD9C956197967830A0886182D98B5051080DE887638F2E3E626B8941A58D2206B46FB410C155B94FD7D15956EAEC9F855B96A8F1C7202EE600C12DBAFC6E3DE5F075B05AFC037847BB521D1D3638135591B6E1A0137CA74E27ADA3FD673684A8A1330DFA46D449F8B63FF90E36881C09FAEDF61672AC32CBBF71F34367E7547C13BF08C4B688A397DD4D00D8B19212F85EF11C0FEA19C890D73DCAE9B532CAB7BB5931B2F648072F35FAA31C6A77FAF3F72F9F57D5AE65BBC7DFF1C2A5A2A2721AD5B50DBDA2CEBA27A3864A6628F24B0D24FC2450890E278C4599C1015C2B4AE61F2DB2A3A85F02882DCB57A7A471B5F8E51DDC284E0C1869D41EF25E260EDC53AF55BE8217FEADE6C74B9C0EAE7C3417156D671577E05A63E03052663F420B70E99DE068971C5CB8D9055864460D6B2C269E4E5D2585BB7A08E28B15851C6E8438EBC1272D517A076C08631A9890F4FB627D05B91ED2164355D7F20B32498E4773FFFD17F3B15E7F2BAF5EBDC98E617A7437BCF94B0EA1B2FD6F98F8BE6D64F769FEA28A5FED9DBF4B3700BFA8C0495772A14254D7AD9525B6ECDC028C43EEEBF91D2B17C9ADDC071CCC83EFC6401A22846500E0CCD3D4E5184A05AECBD92808AD2DA42C57621C66142784692D4F28662A2B37DA4D3CAE332A97D465D3E492ACC964AED603058CB6BA6972C83C2906CFCC813C0603B775E2DE8BC946DAFA510532CEFF2B2FC5E1F25540FA07B577003D67F8A3C63E9BC2B89EC7AEDD8C2E91CA426398BEC4D98FB6233832BCAB8F10E5DE6668F7DF8FE10AC0EA63B7D46837EE4D1D203D54615042203552430DB97C24FE0088334BA154FB2157DD2D12715ABC6D329A819A1A664727F40CC26204949926E78B0BB8947FDA9026813FCF19795F8BFF2F56DB70DB7EA9280A6C504134A1B653D336101A9C166883599477DB557406FAD495BA31B488D9EDEB783759EDA32968AE4B4B96A14C9DA960ECEF511D4102E1EC27E17AF2746DFEA54F42D2133281ECA9F5CA87F8A2DE4C937B5F9526591A583DD3211F78871BBEDDE79206F946B9CEC6EBD0DA4A25AF259E4B3EC2195578C74B7DF87963BF561D7F4C6755D4DB0F288341D5E525B15F2BDA314DA38D2B2C7CD7D64F6DE35EE782A076333941FC3505AEB1FA5783C6C2553D73AFD6AF896A5C2E1C15EDDC408B6D9D7EE2E7E9F706C2A6CDE36A41BFF88960612C46996A9E7D43511302F925351240B5B77A7183C45A1B66C8FCD34EB6EBF5F5FFEAC8441BD1103D2151689BFCF8D4E29B9C39B1BE4972186B099C2C35572DB1BE2A28D751D6857B7E4EF181B786C2A6FFA30A5D6E2E1120E7B1F313302ADD1012E43EC24E5E5B5D03950E009272452ADEB9DB626FF38F335A520B12CD981636BCFB882FC06B440E348512E6ACF980A1ECF360E33DCADFFF5A2B413DD214D5AD1070E88B63FC9765295BBC92C557F3AAAB6AEB293249761F95EE4338243D35AF883AC33832155AC758ED05AA1BFFF0E9FD58E03384704DA5A9237F1AAF52E12C821BB0F54C0820AF8124AE6D0F4BFECDA6500995B2B61ECB0628BFE2A9E6A05DC94A781137522E85A3BEF28B76E49B27BD05C113C9B3A9AB1285BFD926D65BCCD5CC3837490B21527A1E94544C4ACED0352BC84D378625E3655F74B039CD681D98579A190AB2B89104C83F46235757D2D22FEEF59A250B564", "48116D6CCE73D8BD1E1F45D9676B031D9B0E65684FB88A83D791CE8F5278D33EA9D3A6ADF04F29AE93123376D1CEF52F27E875EC0024A888E688EE2A21A4AAD0448103569C8A7CB2FB072E3D0D09115AD8A1C234F7765E77042156AACC4D4A8AC697E41B71F436ABA09C91E9E4F2C5B573CB1D0B291F915BF922FC75E6FC6AE332B42D7E51BA8EFB1CCA66EC849099834E48C7F79BC16C79B0C87A8EAC8F88D30EEE8FC0EEF8C89520E2602A7226BFAC0E8B30A117B718875687F81A6125D09EB3BD2B2F5209C386DEC5AFF7DA0FF5454FF0451F825E5AC55680EC7DEC56E72CAB953E5B822E0A1D95F3F948E95DA7078C850C43AF46B4EFEEAD6AF807CCFEB1B61CFCEFB770D1923B41BB354C81F340CFD851EDFD537C373CB9F29303A988635C5CD37AFA576D6E8A8C2B7C56DE2FD49E5DB970B50E04436B1F8B22A6DCEE3BC27EE1885CEEA23E12541554EB2EFE615A140831DE6C555804432CAC0A73DC2EE5CEC8ED139ABCA4D17B22BCBE60F05F5D7F526ECB29A51ED6ABB4DE4A2865AD1AEA64041EB0F505BE3CB8F351BA21A8D941902BA565039EFEEAFB87DC6DECEC1C091ACE228931A147C491C11169AC87884D5EE9DF128C98A084CC6EA0A50D494FF8E0B902A9EAA4B4F9D3BB2BA1FFD3DCC93C45133B9008E2B188F57A82B5DC01862D35F633CD6CC3FC12BD6F3A20C1EEE1F9018E41027788950DF09C4B482837677B33B15CE24EFE6797291C0DE291AC04F04AF975703BEFD3CB8E59C1496E547285E3F7A29F99C5F210327CB328B8A3094DB7C27CF7FA077791160A2287F44F92BA6F5346E48D4D4AE6C2C7185926526719537AAD530EEB3B0B4CD718C7BA38BDBA21671ECCE0AB4044B797B7D10797EB1BAA024B76D0B82BF25C94655545227B46DB2A038F87301BCBECE0C99A98AA5BCB648DE58B6CD59AC6471462BF5985C595B00A4DDF2948A84203890E2989D8DFC9864392E7E75262DF1CB78C1E2872CFCD22D561F8788F42A0323CDF3EE1588EFF2F7BEDACF5AF710CC7C6F9957D992A7FE39DB696DA414AC36CBDC99AF050023597734D94C2A8FCBF41D6004C21E4F4357C19ED09488797CA012F4BEF8F1743E396236E708D96A7DAAB07FE03D5483319241CB35F66F66D99D981DB4427C4C84A9EA24AEE4F7C4E023E0ED2FEDF59FEB6D8AC0FE87DD42580F7B0CC6339752230A69BE83AE13FC12AD4719D45CAEAC6E8695F6F403A0713ED37DC120B80DE82F7AC4991B4B9DADB31A304E16D03251CA140659CBF99E891DCBB764293A967DE1E96848B8F225D2F9D28EC2F428AFEBFB57AB79B126E6FC3D66102E3813347D7CDA5499F6AA5BA6AB5EA6F3A82D730EDF3FF74B9BC0F954BED21E77146A5591941962C49F6B2BEBD060A9C82D8FC780FB3AED527D40CC426988F042841250B4A85A3F3501FA3436103313C3C4CDEA772B6C840DB866B9730798B69D6AE12D24E4DDF31FA9B4C8DECF6CBCEA2E8A0F9CC67CCDCB64523725972D81ED2E6562283DE99297458452B94467B83F3111CBFF61006814CCB6550D19A1EC026996695D46C31BFA9BD371CCDF1B512C61CE7BDFBE419B477DAB1E7E1D012DA4BDB05F4C4CD39511D5071C0982F68D9C6F558D22940D541A3C67003D05306FFC070C2131832F737872114566ADF3074F7F6274AEF9B894D0AAD5ED60998A0363B92D841F4A441C39965FC1479E93C99B083CDE6CD6CB9E26D49E16B969A357E28A61B444AB0FA665B853FC89B64E02BB02C5273CC948B00041701459408C95E4BE49EDC7CB605BD2DF31C3C8BB2AA9FC780", "840BCC55474C2F66B7E16C6F527695D367F70F570B13C1ACB546D8439A1AE06F362C224FBD86441D82430A345B8458EB666BC93739E3D679754117C95100E8F00879B891C9E03788543C415AA964C3F861916BD7C141777A93B374943CC4CEDF928AEA3EB72F412DD8256227D7D7244E876955B13FB2EAD1C3980AF6F8F36B3E71FE3B189F8DC22C55E3720DA11C6AC4328DCF670CF948123FC7280D6891EEB356C195D2A79326299A684F5D68DC0ACF00B780CDCEFCD7CBE4140FB5B6DF896883D3C6FFC42BAA41E6A75713F8861C18A833C688C2BF6EED7F0CE66242B8196C7C254F9D48FD56AE5ADA9105A5C4AF28D0042E059A90979C6439BF6D498991CF64C68080B9B5392CC9FCA4397647A9AAC42C3810FA33BCF31C89A641D1078A0822D93EB773F418B9B3B20D5FEEE1067766AC561525F88F8F097BED0CBFF5BC498CDFC9A5B9D20F4D4A03CA190563CE543B2EAFD8DC6E4A5885DEA120DA7D157D00EB1329E500D41C7E6BD603E95BFAE227A9B613A71C7BEFC8449B668C59147E1DD5411CBD967CBBD46A9DDD76C547506A54A8245532FF9AA5312607F1AB99F4F9BCF85D93B58D76C5583856595AF5CA1AAC07C945400B35885071802620855E18E0A3B1EE92BB95241EFCAD82B3435BBB8916C4866471BD5715882F6BE508C7648A59B2AA91A69F60C78482197C04B31759054FFDAA254A143021E37874DE407690B9ECF8DB99CC16B004116F51DC7853370BD3538E14A0F02E7BF74D66FF898AEE93BF0697EB6E8E62B95C6C525A03E1A89CC2F56BAC591FA81BF6A1B3B9F1259F13AB45F2E9B0D93DA7B4984A9C71272CA261CC4EE4A44FBA4CD03C75D216672C18A60183A52B28796B356EC498F4926D833D94007E92EC190E9713354C7506BEA6B7B5DB2BE659E2A5BA92D00C01611347F67971478F2C71648E33F99EF201367CA3AC8814DE0F83B0BAFF34A192349C5DE87453167820C0EB0AC8349ECA683111776980FEBDC993314278B37B289B528DB319CF59B09B83342C71FD5E9F13EDF4F18783FF328BC67A03F1F62FD1A4631AFD76363DB1A79CD1EA95FD43934955AE211E00EF5AFC114BE00EAE2A7AB63042992E086810E61AEE3CE5CB0FE75C04969485899D552AD4B006D543BEB93C1E8578168C66667D62CBCB56F98DFBA248EECD891F9936382087F2AAD6F83FFE25E77F8BAB9C62675D4024E9BDCA5581126BD1ED6035994029BB54615E593D4CA81B31A5AE8CBEF8E1A81C32698FB7B4A339A7E4E575460F79C4F4C5F57F9E8DB459177067869E03E2E1681004EBBF62B4F60A9EFFE47921AD22C7236F25438AF46885E120825509D1E28652361EAC64AF1806317416E5550A39AA8DAE2C6B970D44F4F38D571F67E304AA57BA435C4E06CC97C848422216BA778B2736C30200527960A66D63280AF7DC691F9D0540AA47F0D26416B46A6D53B0B93F1B7C3D4DA8BF8AD2FE410ADDE00B0372E9E830C09B206A08D968AF2F716DD04D220E619FDE28FE70286E7EB9C2068F7A37413BD9E65F1B59C331D45AE914731A564D33875A0939A2185348C197CD14DAC59C5E2BEF09876353FB16D849EE67A774B05C51AA2480F18DE40051654DD2C7B9E3B753FEE5696B10BE40BFFE89487DA1E8B1C2000D53B2A98B4DE6C9DAF07F0B4DB72834361E520E45F5E958FE0760F229C16CCFE0BDBF07E186B28AA69231DDA8378DD6338A94D23541B9D8B63B85962C6304E1ACE2B56A3E433F7E9B2A88FBAD5FC71703231D38DFA8C378E15B6503A3B9959E1759EECCBFF14AA09E6BB8F2CC", "152004D3334E877FE21F773408369872718CDEE15BD489D97F606779A9A38398524E6560260980FABCF179ED91D699D52592AFB3269FFB8DED36AFE7DC79DB773DBA560E3ADF8E12FB8A08EB56BFC4692BEA05AA288012B580E43BE085CE583E9C9DC18A9D32567EA950D8165A2F8A443E7AB5E79F687690A8D8D92FBF877C5B84D26E6FCB3671073BD808A7E908130A845C95A2F5E360645611B4B55B03169CC1F50AE2FFFAAF50FED8CB782BF3C67775B613CF82A2D102199E49A329496C0FA24AAF6370A3636EAFEB992C663C308AD181DC308D81FFD713505916300732FB1F8DCE238CC4104D26C588F28FE7EE4F2B8C2024357D52C7AA29D339249086CB2202DC1C847210EAEBD3F06A39642711B4608638564B0DD2BFDF38CD79CC1CFCE1226CA835E6EE19E4089A6F18E7ECC3597CAD3FFFE13A5F77A58C2B079DA25B928396FFAEE81FBD9C6243CE0EB0872A187E6CF99F16B1511672821D11EF88884964BAC6686C2A7732035493FB9765B7A51E845C1C79FABD99438FD84C09642FBC7CF1740DEB012AD050F5E8FF03E859E85C51D2E87AC41185C67C33820EFFCF2D79D384B11B44A806ABB8247AF36E3972222C805EB9854D9FCCDC7E58A101A5239E60CF4836C38A6ADE67686E6487547933859D46D046BFC15AE95B8D0A42A57C401EBE78ABF495EB390B8922C97270C790C2FAB9849ADE48EA8F4F7C6996F6DB661500199BCFE1EAFA1ECCFAB1F674E0BEB1D03319E73126D7191A64A80FCBBB06B1CFB718275BDDB571E8F53FAF81DBBC0522263FCDFB537B3BE9078F2AD449423152BB9DCCEEE97003D1988540FAE39CAB62593A9EC909489415EEF4229358229BDDD45CC35EBDBA088C4BA097BB0E28814BF5048F4F64E6A587B0BDAAA8A1B3E3E69D3D7B6782FC42474773C61DE12B4C6F183F9E625E337EFDC97A79A5D2C0C939FA668F440688F7A3E0E28A33D36D331069294DBA8BF768010AD93A224E28964A780304F59B7994D972832728249934B5347580C16BCDBE9F84EB34EA7F7645635437B0F5422E3DA99EC2D53B22B1A55BC783CE86CC6B1BE7B11F837CF2BD09A514B12ED7CF0AFC2F70F1D6D08288524263B1129135D664A48B0596C4E880E4E01BA3889014C07ED1B7F172AB4F4A69FC8C04F0ACE8AD1329A4FB594E9EA30EFEF31BBE418CB5515CFF8A375CBE58515B32E799E8449101093A053EC99F9CF78122FA2D36DDFBD258EC81D7B4D18BF882663CBF24D2A35A93C00AE8EA81A3B0E8040C1E259515156D67DC76602924BA51507C4994221A3B1CAD674BECB11574212EBCCFDCAF6AFEE288BCE11B7FFF1D7191AB329B04A237F75B204634676932FB0842E2AB888E7D5A4A6B7F77EA04ABF4B9A567E5DA5267F35CBBC928B5F607E9C08359F0031A934152D77E65C937181C92EF4CF17F6EA45171DEBAB545755795097766318CB132ACD96CDD65777F41BA127CF251A4E9B3348927757A42AD8FA83F6CE7342D935CB54984E45886D888627F0228E50082B85E8E9DDBECAAF049C25C4D7B2EA919716271500D81EDF574C5AE91E5F0FAD7585EF69C5051473AF913F887B31BD730F67B4A44081BBD567B57C061AF465237374E0BF4753F3C6CA28D45220CCA3EE6F07F93A29982EB5AAD70763ACBFBE55015D1C52B64954D4855ABCC319DDCAEE75CDFE3B3C31C329A77C76131F18F3C3904B3EA4E691C03C32CA5E7A1F9460760231473115B5AB7E159013C96AE4885566065883CA3B9661C6773B77819BC68755D529FCE05E80E08A5097EB37BDDC1AF9BDFCD0A04", "0D4897E7FB496EF0C6D62C034088E7E9B8DB52F232CDC9EA88429655ABE366C54CD534DC9038F45AC0D0362E31086CA2FC0FCAC3FE71B2D4EEE548F69CE4433601CD3431D01BA6F0C23D612807EB8E50BFCA736D917F67DD72631BEE8728006D2AE69D1A1BAEA8DE50852CEBF7491FFF989C37A54EAE31652230A0D3E4397B051222C4A22BF481BC52E2012188C7576A7ACE81185C85A2E841119B47B5429DF277A976F15D5652156445905EC797729A6647E1B593484ACF2724E81786A0C062DE87759E82202A561FD077D64FDD3226A1E290F660722040EC7AD4383431E195412DBAD0AE620BFE808D65D3937AC9C5AEFD6FA106C88A6B192D4FEC1FB1A06907B0796F724AAC6A5EFEBF50C168F990BDBD6B1D23E098858C07E8D2144532AFE040E45B25AD9AF7D92F9DCCBFF3DF25DF574A4B65A219289407EB63FF7152BF1E651C6F124BE32545B50E8E2CE37F1042A68A62AB70D9DB540D2B39293E008EBAA632B85EF1052FDA17A07B9B1D89A76FF7E7EDEB7090496855B29A9174780D504F7228F8B7436F4676F51975BCA614554FE6B3F946F5E0D1016371F9CEED4521477CE8E9CD0668643686D8482CEC0BB4D6A9E8678B1835F0952E2700FE0C85A8683DA91638D81A85231CA4C7B55C0C0DA57DE5E6553F22290CE7EE72867285D096C0FC16A60A664C6BAB048939FF9DA476024235DDDBF7F264C90ED44E953C4AC0FB50362FB2CB4C4FC2097F07B71772000D2C2A5DBDF0B6FB83B1BBD70CE9D6A8BF1F924AAC4DAEB6AADD891A8974C9BF46FC6038F6B77D6AC0D6107AE6AF5B93B186253AFFFD8CD21835097C4B764F3E0B2447776549D5045E4346FCD3B7880F1B3BA794ADD6B7F291D3534DF034F822D0A41DB2AF9F1E51F212D5631D2525B1804A75B50D8372B6A1C200B81AC1122AA3C13D7463C383FD123DF4029BDAF6C227B3C4B54F75C5315FE139F6A0A3E2E819D3062B3309E2630EE4A64D1E3DBF23B489B96E198BA98D8D3347217A5FDE4DE453012E8564BAEFBE3939E59C0A725A75CEDE373501F9103011FE0EAA40C583AC73C92F47BD528600C42E0029FB3A4F03A3CCE87E5AAF4FCCB47EA8BC62E0F542DBD455F7163A2A8803583896E3C803C0D01846EBD8BB1B3FD396A7C7BC3F72A9D0503C44FE30E5E77E0FC8B373EE931CBF4A9867406BC91972B946B9ADE62415CE2FFC71C2E64DEB7E6205D635977C778BC40C11E36BFC22A17FE641346C74DADD255D329AEFC2CE5B4AC5B195FE2DB453F1B41B3334D5C480BBF10FDE88C722091ABC85667F2B52A3505A142E4D1546CC41E154B345E8456B9CD0E241D70EB4876A70623DFF3FF43A8D66EF60488A7860485A8E518AF4A7056CD02C72E1BAEA3944781642A36932ABFAEE3B88B57B213F9B358CC3F05154DF8D2132A74DF27556DB6C5E45256481C09D18DA604CB91E6AB7AA29C0C1009A406F1B3AAE268564E04B07E4E9128FF02513AB8A8665BFE1E352F46DBDE7870EE027A6E84560014659888EB6AACF993D7C9F9FBC2974CAE290059802F5D224520CE445C404A2ECC57CE6FD5961EB20DC12D436F0B93614CFC844B476D449416F54459BAD09F886CE3C1C307A91E62FC736051E6F6F8F5AD3372398458299EFDC1809997FAAAFDE14B15566B381714E3522F629A5ED9DDA1EF4B9D4498DD55F8B0A48ABB2F9B1FCBD991B5465108147BB6125FFEA6B6D479DB6A9983A51C041375B39FE6546AB5B5E089DD7E228D5AB17127A3A1E3AE82A31E952E660F72A1F399ADEB4E1E11C390BB8652F2F7B6D05E9F4B6FC90", "AF6D254288BF564C4663014C7A70EB3739D28F1F17B8627FDF714E85B48EEFEB1FD456546328BF2E2EED112992AF78911A89E1248AEBF1F79906EA91D41CAFC6E541D2BB40A7050C5AE4B66547C9DDA88590AB8B0A4B01B5F8216447A310D1E52C155F92659835F1086D381F1F2995138856DEC6FF59380FD6C1B6EEA6E4061930CEF7217701DDFE17742721794DE824377392AF3D949ED9B0455C58F7395DE0FDA5485E310E8457A4270D603BA5AD1854811530FB7178525F4BB1E5DFF89F6FFE0C83C3E47E244D8F3F8AAD8374E3FDF996060E18D2A5397192823681CE6DA561816C0EEC0C0600732A37731ED13948439E8961BE44D32A3097C1AA5E19876ACD21DF812265181774580A8C04ED4FD1DE2FD5A1DFF9DCDF4D97C448BF9A4DACC22D4A55F588C87CCF5C9E178A8FFA032A454908BBE41E13D829FA98C066A7736577CDEFC6D5441656D0AC95C872861BCE0A28C2ED6E9420D4D167F37F96087F9E761F38B882CD41521DE8E2C40564C0E001EDBC04982669B82F05CD0411A6BADDCB704B545FCB19A286BFFAF0FB6DC889BCE75C5763BE1D70DCAD1D39F395A75E637E0663F3D5A855F53F700AF5F82124E72CC2A4E41A4B43FCBA41E55298A1B799368BD5F9B507FB11E8BD2D80FE517A5FA935006064278CDDC5EED43B7C2D309BECCCBB2C0AE3B8D09509315933E2DF91304B1DD3777EC9FA2415F7D18A96CD08095A30F7EB9BC12F8739E409EE7DC062703CB3EA591531F47F5D1C0431E9F1883C3BA249492EE619719C8B3BDFC1DECF7E3C4CE4CE032FB2882247D1D54566E3819464837C248D35647D273A87F8BE667760D26A7EA1FFA682A931A4D35F7407FBBBAD725BEA62449623AADE97A2789F2F8642F1CE12A06C93861DE9D27C5ACE0E4ECE40B58664176113ED6437B8AC8B4059653EA30F71A023544BFFA685343E278129DA12EEAADBDD5AB0E2CCA0B840E87AF0D0E859449893276B9B5894EB0C57C3222E01E7538FF7E91807C10CDB465A12CCD358151D96856C6143C9F8D25AF8E8086C83D4CAE37BD660D15C0C0707691E8366C4AFE6DC0AE1BFECEF9BEF46CFEA3356A3155E027D1C921ECB852BA4B8FE8E0C8C00829CEE4049A21A1C3424D2BE532B735232D12B81C3C9E5B02294701E6BCBC8607F2AFCFB2DD9B1142B4D261418C1B239B0B22451D7D3AC64636B0C7F96B41D7E775C1CFA2E277C957F0D59BD1FB02226A462533850E99E917E310A684E81634F3876D6AB32CB5B8FAE9E82224BD2A17A7C72CDACDC6B3438A083A6B0DB9FD91E05BF4C83A36916EF35C5D4871E94B1671493FDBC497BFA30328DD24D340A07A960828A855FA95EE33FE4FCD15B14B7929D338611239AC34CFDA6503E4DD9570EC339CFDC8D1C3D3536F5176901D012BABB133EBB4560484344E044F86A77C21183C82BB2B6632CF69F5A661C98EFDE5529F8FB965DCC6AF185CA8CDB4D01C5E8902966B063B8D1724AD18DAE495AD47416B61321DEEBF782EF7A6ADE3CD0D5B9ECA84DB5D50C2E5C7D8B8DB9E0F398376CDE3D7E8DC46F0D77D38D6CF6055D6D074CBA92A27C6F9018CAE87C97F1B3ACCEE495ED9DCE46DF4FA5255DB2C7F2669F5201058E90F7567672162E17D5B6D028C6AD23F2AEBA32061E6B33EA86915FAFA2344CC58162C032CE837D5C32F5993013314BD261DE6EBB35B94B8F690C5624A8CF5509BF50D3AF5FDAD77311B6D6F9398213AC1A267CAA0F52A262DA4F85F5ADC79947D2C5128B8E0B0C41B9FDEEF6AEC228EF97762CDBDB78273C16C39E446576D54A4FD0", "4B7593A9ED7897766CACD515D3A55959FF99C1CE28A745DEC1D8F2565F24F4A1E14E9083AFF510F106D982A2911197338499CBE38CDF3D99463B13EE26B47D26A62CE45EAAA04A3E70850D5F23470FB94C42D3235D5FF9E6C37CEE8C93591CB69E0735B03EB262CE6BE6F0144DFD66BC089B36D66287EA588C78E39D9B6907EFE85C1211612952CF13C369C2AB3D921E4630ACC75F2AE99014776B26CD1F296F736A4616FF662D5C6E18C4EDA6D1791A71BE969556FF11E1192D3941F8020D2C731403ACD856A3AEE6ED7F23023BAD7BF138C702B6449E2601042D7990ADB988B650AE202F3433CF26EE132A7CB13650E86A6DBA6F7FA53B2354DEBF1268734D7120F721E18FEED2F93C268A2D3EA012F3D7F68DB0B18A5CDEBE13CE4A05683947DD985D4AED1E192FBD2719755846C9B758FC8FF28B9999D07E634645064C2C9DB4CFE50BB8A030B60F43AFBD588EC17102F614D3029FA811457568D7726C651C062391A2EC2843A95A3A48AF58A898BB65FB852F73E9A82C6AA9D406D80C072A3B426D8EBF261BF7AE0E9DC0C6DE9F4BEE880D775783F910AF19DFD8EC2656213FB9B74EEBD8E1BF860E4650D446683B7794086ECE1E2AA723024C219E3DCB371624C6D721BB60C797003D89096BA0F489D1CA60C57AD907BFC8E97F4E057B6D709414FB0A302D3057FB4635F70BB6A32CFD842DCD8D9C9D45FE082B3746951A862EA870D903382C138425DF936A505120D93FABB8F523C1D3946B85425FB338CA7DC4B2FB6512F0C8A67FA47A416284EAA943E1A9C0607A02D27F55F1DF2EB6090F94B64076FC2D3D3B3694DA5C7EB2A180DEA14AEC21156E1110DF75616685FD53C72252FB87E7D19EF5AE8D9E129D0984A06520C789DE22CBF6E2271801691E0C3CC672F6865A41559910D0279AB9E0112E66B2A1C2B22B6679CF70E3FF870084562ADB36F532E64D44C7264E44D488076F7714A1089526118D4655FFE16B02D803AC2601493CEC3AB27878CE95ED3F321913217DE12B8E5E8FB75A85707EAF6F1FF08CC86B91632ABC7CDC42D1C5D0F2F49D5F412B4AD0C5C46CFA74643C9333C5F3558DC3ABDBCBE23A3573146D648D540116136F3F29E42FF07E26C1504E47FCAD1FDAE63357E421E46440424921404ED02FD4BFA2FDE68CBE6CE49E4E120C141013DF5C0BDF776EE36FD5899C0FC057DAE2C9DAEF6D37BF8E85258BB36B54ED8374BDDD49B6AC2C8BF3105A194F76DD512336EAAFC7BD2054AF6A9606517DE03AF445CCA5FA65307D2E116E42A3676EB6033AA17D76A87F52D144CE25E3A8DAFD3E044289C4600BFAA9CCD963D14A19C5911C3DE649439440D11A21154EF25649F7DA295E0FDAE8C48351BC005C011A10D201B3062492A7CC933AB5D854B26232B7091CD0B7AA3135F28E3AE75E267C223C5E03B60FAC1BF78123C5AF76719191CB6BA277A5BE81E64117AB344D92837B6D600F36702F4BB4532C5EB1C9BAD8A111C540F52A225DACFAB37641898B1FF770A523F8BC8BB0DADB59235DE055810396F1993539A9CAAB622389607DCDFDD51FB67CBE89F0F868DB4D27A7A38542A076D158919DCB621BD325F23AA0DF694C444206FD42192FE7F9A05743CD54D8F111676AC35A3230E372A5A6D7E213C4584EEA1A4993067FD28DF6690BE9D3E94AC06BCF89BF1AA47496F8F6A18524187BE80D59A4E80193CFD757B706AD483A916AFBE2A56E0A69F3B1BBF9F4B239D05C6C556A8D22B00E9BB1FDAA620D949ECDE86EAA299BE93A7884C99FA782F2BB3BEEE86046489B3B8A5930", "71BB1B2E833793D854F8A9A81E6A6947057B9571F2BA99380DDB25D878D6B48F09ED7DBFACE92B6B82F413E038128F6128AF3BC467E9A4DF2861DAAC674B6D948A10F28F7D43657FEE26577AF438A2F4422186930702EBC6C9173E661D59CE7594DF95B861F9D12EB060FCD3BA43159C9A1BDC1EF13E04893E411267331588CF4831978469FF569C1A738C54001BB5CF4FABD289075A165EDE0A58F6CF6D215D306A7840CBECD0E87E3AD186F7A67A967373551E13D2956E5C578A7F5BD50E2D570F9B914848D46A640913EBED2E2ABFB86916BC34EEB3E8A671AD771F6D3780B6FEC143E26F53B02977255314BAE9A2CD9E5BA2B49C73226FDC724A859F8BAD3A9FACA1B0E5F2DFE7E1E45DB6D4BE2B76535A817F94594A4541C01BB62AA83A690B6D84FC13B632972C61D940F2C9D32837413AF8E42045ECA3072CD044B2183400CE63C418879D13FD281A8D0835256DDD2BC3C9750C1D44CF1037FD7264B7716398FCF1D31CFFD0B7C52C6370E4CE6FC163B40436490A757465B20B8890C3B5C0AFB971ABFD01796569E3BC73C13D1E4B1FBC1CDCE59D21B6B110272E5770C589603FE67779A49AD0EC66910A2BF4D8C8ECC18A32EF92F502126A5DC3DE618233B9914A9608B2F17E5161115D9A3BEF1D5701A9D465A1437DE24371C9179800CB5728A7F3D734A2A706BC64D356BDF591389970B6CC139AC510A98E3C75F20120450CE45373AAEA6A279BBD17221BCD32ECF82C11B4C1CEE0A44792CF56978D3D2399F7ECDE9F8D9217F8BA22770E210D0F1AA852178B872E296762873765A73DEC08873C04ED69C995C5751B97DEC23B94CA674FE3F66211317B074D8203EC530A20B6E6DD21AB55895BEE1CBD0876183D652F4A0D2EFC95749F8F192F860BEA534598FD709B396C209CEAE4D9190980733E7E98C8ABE52A53C68D86053B56BA6FCAB5C827292D729CB8BFD1FC8CAFCDE15E4527B604018F28AA16C1E913F55461AF87C9A7BE1A742002E52B3A14EC30B259DDE7BB892CEAF77D25B7670B339B334878F697C00CE6740117AE7C67DF3F8A7BEAC89D4872682C47F368F835AFD7ECF0D8471AD01468B7BBB0A974EC469A8F79ECF8D379DC13685D2A8F6F19CE102C3DE34B11422AFB42E894C8D00F606296DABA7123FCE039ED27324D60E853BA94DC638454088281335D437A954333FF1A8D08E2A4D25CB3BA0D08BF6625E25EAD3C1EBFA2666AA49550578D3763ECDCE81303B53F18B00C8900AF4E0532C5ECBC94513DD9F50BE511CFE4D3DDBB3F112AE148DB062B2EADDB901CDA6AB6BF59D37F356AB34AF97D3DAAAA417642E87C9B95AA546C682ED641214605F82A4F486C9C72576106F76D7152615EC8E77187D4485071CFC6B0AE44880442790696E057A3AE20C860691353B3F6BEC5F1C2DA07563B423BC01E0334099571158A432441256D7C409B7B6EF26442075ED17E2BE37F8EBC049CFBE0FA89CDA7A58DD32C417B34E899FBE86E2FAB8D30846DA17144A6A66AAE1C24FCFABDA5B573FD2D6337226B5E49BB031B4D2B455B6DB871076F67AC03C3A73CEC01BD0B1EC42ABD177127E62A66FE8E475B982B4490F0877466EEFC7317A703C5C07937340ED4B53E5DE5325197FA31B8C8E05AA2222064EE5D7C06D4A1EB53151F75C94A2E259688CA0716548465C5C255D81FF10BACC2C13098ED8CF7F5B15193EE14FB5D258E95EDCC93E9796FA823892C705A5771D561787C12592D269D657FBB71F021F365B7453D50C35F748FB2B7F36DF28769B81EF12A26A237FB0239C173559540", "53DA0E7B84741AA9E225483630169ACBCC03EB8CDA28B7BDA685C756D66B14488A2D0AEF7E6CB2D80F2726327257B7284B93EA1B56AB80FAE668C04FA49FCD658D896A997685E1EDB4DDF85456B37F32FC8CDE50882EF0F09BE4ED4AB9A425806A49E8347A42A50B38FA8D1DA2FD2C9438618B6701DEE159060C186D50170F24F38E07B185E3272EAEA4A0A7CA41A69C69E9D95E271287D3AB8284146A58440EA131A7F47D73CB2BCF40FE3A58E1B998C2E5EF9CEEC8EA2F8467BB7757C03A99FC8F014EE933A7080CD46625A2A7A251B7A37E4208956A8C9BD35E6F8674BC06FCAA5DD04A2558C9665C7985014D3AD95ED256FAFA358962EF5BB26AE2FCE899392DF858F99303E2417BCA7672E991FEB891F5DFCA2D461148367C5C0DE1460BF557194533DAF01A5E8E0E43D57B825AF7EEFF163DAA23B9F95C063A26B3D213459D885AA96023715CD21DFA2A2250F7610B78A77123443BD06EFB7DC85D1F16D0019D2937C3DEC4DE6389485ABB21642B6E41ADD43CE96F228C08DF6288A647EC2FE96032B6DCD651FF950B72964EE08FC2030272E3F601DB7F7E770E655389CA6CFA2F9B87CE76FB0E0CDCA4EEE5E80FC756BE46CC09F84BDB34ADA2AFC024ABDE0066ED939F8EBC236CB3F577C1BFD741F9D101A038EC86AB0A85462BAFB2E484D6722499A6310FA449D979030B2A21206D44225800BE2228FA00AE6D92C8DA652E1B003BD2734D30557B735CC2A591E090394DB791245C22B4D29E706476593B6F90C694C5B87BBB0FA2C479E292A768A9687A713336A21D1199186F852C41F586E9BBC64004D8BB6814BFE739834C99923177AAF87B926D56A7AFC0879C027332A60951C84E9314380A5A78E1196D094F15D856AA36742825D2B397156BCAD8ABE7291FB41DB4365AAE49CA82CA066D3B4366D3122ABBC00F05559DAFEBA9F98361DDAEF068D60B18265E7184C4D6BC9C3619CFF5C758090FF6398CCCEB78176D2A8A2A4B9854C4ACF5CB614DC1CA0E15E7E85442241D48FD3D6E851A5D3947FA769560928948FA26FA16EFBD2159994BD92B3D6B0C62818C91D4724413A7F40B2A2D67F4FC97B5DF6A7E3CEC03158E201D6643F402D3DD6995A42900D46C2881198CAD28A27489F5116ECEC3E38D999B2020E0C381DB3B8230811270D75950D9BB61548802DBBCB68ED8C7BCCB50D606BE400BECF873498621E66ABD2AA179B3E90E055C3719CE2FE047F815B95B065BA086B467AF4124E276F8CEAD000BCA5499D36217B250009A7B43E81CB3F8B1A3238EE436FE61F2F942796DBCBE570BB4FC783B35C3CA31BDD432B33AD75B08107253E8F910EFE0D0B5453A8A055D884892278688B3ECA612452B590AF38DBDD9A7070C5610E7A3CA6C91D24438E7F45E7A2A330F164AEDFFF1789D5E875EEF121298DB79C77278ABFEC3FE3DF843C46F40E847272EB2669BABA808C38E31F13516D5066AF4DFCDE6EDB2FF0B0A4CE9FA9B4101F6F144B02384868617CD39175852E065473D6F566CD18D7403FFD24DD33ADDB52C7CC22167E49102C46DC369A92CE2D2FCB81B4D1F14B7CD2F80A65D8FBD20FDAA23219873ACB8CF934E68D6F8FED6B41193CFAB1F44CE4BFC7C67DE1E8804B47DFD7E8AE281E19846AEB6FF94AE7E7CF6FFAB46242843811E6C5BDB78157C76DF4F92FD3653D7FA5978316EB055059C6A2B6306C957418860A88F63355E76D96F4727128D9B3EB98501AF5B093F2C314F98EA2CDB89468E1BD51138CBF25E8B911C26B97DCCA47F1A1D6C1CD415A5079A756B8A8715DD3164", }; // Galileo E5a-I secondary code const std::string Galileo_E5a_I_SECONDARY_CODE = "10000100001011101001"; // Galileo E5a-Q secondary codes const std::string Galileo_E5a_Q_SECONDARY_CODE[Galileo_E5a_NUMBER_OF_CODES] = { "1000001111110110111101101001110110001111011011100001010101000001000111111011100011001001101100011100", "0110011001010101100010111101001111001110000011000111011110010010111010000011001101010000010100100101", "0101100110100000001001011010100111000001101011110000011001010001101101110111100110101000001110000001", "1101001110100011001001100100000001111000001011110111101100011000111001001101111101110101010010110111", "1011100100011111110010101101011101110110000011000010000110001111101001011001001101001000101010010011", "1011101011000111011111101001001100111010011101111001000101000000111100001001010011111011111110011000", "0101001101110111100001011101111000101000000010010010011111000110101101011000101110100110011101110110", "1110111111001010101101001011011001011111001110000101001100011110110010100010001000100101011111100010", "0111100111111000110010101110100000111000010001110101111010100101010110000100101111101111110010011011", "1100101001010001011100001111111010100011101010000001000011101100011000000110101101100110010010010100", "0001111111000011001001000001000001100101001010100010110001001001101111011000010001011110010101100111", "1111111000001010100110100111101011111101101011000100010011100100001011001011100101011101001001100001", "1011000000110000011000101101110000101011011100011001100101011101010110101101100010110111110110111110", "1111011011000011100110001001100100111111010110011000111000101101111101000010001101011101001111010101", "0001101110110010111110111000101101011011111100100100001110010101110000101110111100111100010110100001", "0010111110010010000001101000011111010010001110001100110001110000010001101110111101101010111111001001", "0011010000010110001110001000011011111100010011101101011111110010101010010010111011111101101110111000", "0110011010101000011100101100111001000111100000110011111110110010110111111101010101100010010110101101", "1001100111010101101001110000000101100010110010010010000010100100101110111001110111100001110010101000", "1000000111010111000110111101011011100000011010011010011110101100110010111110110111000110011011001010", "1010011001010100010100100100000001110100101010011110011001111000000011011011100111010011111011000110", "1100001100111001011010100001000000011011111011011010111101100010001111001111110001011011101100110111", "1100001111010100101010110010000100011101111100110110111100100001000100011111001000010100000111001101", "0011110111111111001001011110101011100111011000010111001110010010011001011010111100010100010111000001", "1001100101001001000010011110000001110101011111010111000011001101111000111000100100010000001010110101", "1011100100111000010100110101010100100010110100010001100111110100000011000010010111111101101011101100", "1100011100011010101101010100100111000000010010010001010100110111000000100110101100111001000010110111", "0000110011011011100011001001111001111011010100111111010101011111010110110000101000000101100101111011", "0110000111000101111110100010010100101111000110101111100000010001010001000111011001100100100101001111", "0110001001100000001001110111011110001111110100111100011010111011010010111010101001111010010110011101", "1110011101000101010000010010111111110101001111011110101111010000001111110001110010011010011000110011", "0011010110010010101011000000100000111111001100010111010111111010011100100100011000111001000010011000", "0101001000101000010011011001010000011100001111011100101011110010011100100001110111011011000111111101", "0111001110110011110110001111000010101101010101011101111101001111111010000001010011101101100010010000", "1001010010111111000101101100100000111011110101110100011000101111011001001001100011100000001010000010", "1010100011000011110111100001101011000110011010000000100010011011000010110100010110110011010101111001", "0010001011010110111000101010011101101000111001011111001101011111111111001000111000000001011110010110", "0010010100110001000010100000011001100111010111101011001001110001111100101010000010011110101000011101", "1001111101111001100100111100011000100001110101001011111011001000000110100000010100110101011100000011", "1101011000101001100110011110101011001111000111001001100100001000001111000000101101001010010000010111", "1111011001100101101001111110101001000100000110111010101001001110101000001101000000010000011110001100", "0100011011110011110100110000010000111111001001001100110111101010101111010110111101111001010101000011", "1110001011100011111010000010010101000110000101101011110110010110110011101111110010100110010100011010", "1110010101001000001000110001101010000010111110011010000000011010000110011101101101011110000110110010", "0010011001011100011111111001000010100001011011110100100111101101111000101010101001110000011011001000", "0011011001001010001110101001111010110000111100000100100000011101101000000001100110011101011111101010", "1001100000010000101001111010100010011000100101100001001001100011101000001111011101001001111101010110", }; #endif /* GNSS_SDR_GALILEO_E5A_H_ */ gnss-sdr-0.0.9/src/core/system_parameters/MATH_CONSTANTS.h000066400000000000000000000110571305042567700231210ustar00rootroot00000000000000/*! * \file MATH_CONSTANTS.h * \brief Defines useful mathematical constants and their scaled versions * \author Javier Arribas, 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_MATH_CONSTANTS_H_ #define GNSS_SDR_MATH_CONSTANTS_H_ /* Constants for scaling the ephemeris found in the data message the format is the following: TWO_N5 -> 2^-5, TWO_P4 -> 2^4, PI_TWO_N43 -> Pi*2^-43, etc etc Additionally some of the PI*2^N terms are used in the tracking stuff TWO_PX ==> 2^X TWO_NX ==> 2^-X PI_TWO_NX ==> Pi*2^-X PI_TWO_PX ==> Pi*2^X ONE_PI_TWO_PX = (1/Pi)*2^X */ const double TWO_P4 = (16); //!< 2^4 const double TWO_P11 = (2048); //!< 2^11 const double TWO_P12 = (4096); //!< 2^12 const double TWO_P14 = (16384); //!< 2^14 const double TWO_P16 = (65536); //!< 2^16 const double TWO_P19 = (524288); //!< 2^19 const double TWO_P31 = (2147483648.0); //!< 2^31 const double TWO_P32 = (4294967296.0); //!< 2^32 this is too big for an int so add the x.0 const double TWO_P56 = (7.205759403792794e+016); //!< 2^56 const double TWO_P57 = (1.441151880758559e+017); //!< 2^57 const double TWO_N2 = (0.25); //!< 2^-2 const double TWO_N5 = (0.03125); //!< 2^-5 const double TWO_N8 = (0.00390625); //!< 2^-8 const double TWO_N9 = (0.001953125); //!< 2^-9 const double TWO_N10 = (0.0009765625); //!< 2^-10 const double TWO_N11 = (4.882812500000000e-004); //!< 2^-11 const double TWO_N14 = (0.00006103515625); //!< 2^-14 const double TWO_N15 = (0.00003051757813); //!< 2^-15 const double TWO_N16 = (0.0000152587890625); //!< 2^-16 const double TWO_N19 = (1.907348632812500e-006); //!< 2^-19 const double TWO_N20 = (9.536743164062500e-007); //!< 2^-20 const double TWO_N21 = (4.768371582031250e-007); //!< 2^-21 const double TWO_N24 = (5.960464477539063e-008); //!< 2^-24 const double TWO_N25 = (2.980232238769531e-008); //!< 2^-25 const double TWO_N27 = (7.450580596923828e-009); //!< 2^-27 const double TWO_N29 = (1.862645149230957e-009); //!< 2^-29 const double TWO_N30 = (9.313225746154785e-010); //!< 2^-30 const double TWO_N31 = (4.656612873077393e-010); //!< 2^-31 const double TWO_N32 = (2.328306436538696e-010); //!< 2^-32 const double TWO_N33 = (1.164153218269348e-010); //!< 2^-33 const double TWO_N34 = (5.82076609134674e-011); //!< 2^-34 const double TWO_N35 = (2.91038304567337e-011); //!< 2^-35 const double TWO_N38 = (3.637978807091713e-012); //!< 2^-38 const double TWO_N43 = (1.136868377216160e-013); //!< 2^-43 const double TWO_N44 = (5.684341886080802e-14); //!< 2^-44 const double TWO_N46 = (1.4210854715202e-014); //!< 2^-46 const double TWO_N48 = (3.552713678800501e-15); //!< 2^-46 const double TWO_N50 = (8.881784197001252e-016); //!< 2^-50 const double TWO_N51 = (4.44089209850063e-016); //!< 2^-51 const double TWO_N55 = (2.775557561562891e-017); //!< 2^-55 const double TWO_N57 = (6.938893903907228e-18); //!< 2^-57 const double TWO_N59 = (1.73472347597681e-018); //!< 2^-59 const double TWO_N60 = (8.673617379884036e-19); //!< 2^-60 const double PI_TWO_N19 = (5.992112452678286e-006); //!< Pi*2^-19 const double PI_TWO_N43 = (3.571577341960839e-013); //!< Pi*2^-43 const double PI_TWO_N31 = (1.462918079267160e-009); //!< Pi*2^-31 const double PI_TWO_N38 = (1.142904749427469e-011); //!< Pi*2^-38 const double PI_TWO_N23 = (3.745070282923929e-007); //!< Pi*2^-23 #endif /* GNSS_SDR_MATH_CONSTANTS_H_ */ gnss-sdr-0.0.9/src/core/system_parameters/galileo_almanac.cc000066400000000000000000000047111305042567700241610ustar00rootroot00000000000000/*! * \file galileo_almanac.cc * \brief Implementation of a Galileo ALMANAC storage * \author Javier Arribas, 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_almanac.h" Galileo_Almanac::Galileo_Almanac() { /*Word type 7: Almanac for SVID1 (1/2), almanac reference time and almanac reference week number*/ IOD_a_7 = 0; WN_a_7 = 0.0; t0a_7 = 0.0; SVID1_7 = 0; DELTA_A_7 = 0.0; e_7 = 0.0; omega_7 = 0.0; delta_i_7 = 0.0; Omega0_7 = 0.0; Omega_dot_7 = 0.0; M0_7 = 0.0; /*Word type 8: Almanac for SVID1 (2/2) and SVID2 (1/2)*/ IOD_a_8 = 0; af0_8 = 0.0; af1_8 = 0.0; E5b_HS_8 = 0.0; E1B_HS_8 = 0.0; E5a_HS_8 = 0.0; SVID2_8 = 0; DELTA_A_8 = 0.0; e_8 = 0.0; omega_8 = 0.0; delta_i_8 = 0.0; Omega0_8 = 0.0; Omega_dot_8 = 0.0; /*Word type 9: Almanac for SVID2 (2/2) and SVID3 (1/2)*/ IOD_a_9 = 0; WN_a_9 = 0.0; t0a_9 = 0.0; M0_9 = 0.0; af0_9 = 0.0; af1_9 = 0.0; E5b_HS_9 = 0.0; E1B_HS_9 = 0.0; E5a_HS_9 = 0.0; SVID3_9 = 0; DELTA_A_9 = 0.0; e_9 = 0.0; omega_9 = 0.0; delta_i_9 = 0.0; /*Word type 10: Almanac for SVID3 (2/2)*/ IOD_a_10 = 0; Omega0_10 = 0.0; Omega_dot_10 = 0.0; M0_10 = 0.0; af0_10 = 0.0; af1_10 = 0.0; E5b_HS_10 = 0.0; E1B_HS_10 = 0.0; E5a_HS_10 = 0.0; /*GPS to Galileo GST conversion parameters*/ A_0G_10 = 0.0; A_1G_10 = 0.0; t_0G_10 = 0.0; WN_0G_10 = 0.0; } gnss-sdr-0.0.9/src/core/system_parameters/galileo_almanac.h000066400000000000000000000055271305042567700240310ustar00rootroot00000000000000/*! * \file galileo_almanac.h * \brief Interface of a Galileo ALMANAC storage * \author Javier Arribas, 2013. jarribas(at)cttc.es * \author Mara Branzanti 2013. mara.branzanti(at)gmail.com * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_ALMANAC_H_ #define GNSS_SDR_GALILEO_ALMANAC_H_ /*! * \brief This class is a storage for the GALILEO ALMANAC data as described in GALILEO ICD * * See https://www.gsc-europa.eu/system/files/galileo_documents/Galileo_OS_SIS_ICD.pdf paragraph 5.1.10 */ class Galileo_Almanac { public: /*Word type 7: Almanac for SVID1 (1/2), almanac reference time and almanac reference week number*/ int IOD_a_7; double WN_a_7; double t0a_7; int SVID1_7; double DELTA_A_7; double e_7; double omega_7; double delta_i_7; double Omega0_7; double Omega_dot_7; double M0_7; /*Word type 8: Almanac for SVID1 (2/2) and SVID2 (1/2)*/ int IOD_a_8; double af0_8; double af1_8; double E5b_HS_8; double E1B_HS_8; double E5a_HS_8; int SVID2_8; double DELTA_A_8; double e_8; double omega_8; double delta_i_8; double Omega0_8; double Omega_dot_8; /*Word type 9: Almanac for SVID2 (2/2) and SVID3 (1/2)*/ int IOD_a_9; double WN_a_9; double t0a_9; double M0_9; double af0_9; double af1_9; double E5b_HS_9; double E1B_HS_9; double E5a_HS_9; int SVID3_9; double DELTA_A_9; double e_9; double omega_9; double delta_i_9; /*Word type 10: Almanac for SVID3 (2/2)*/ int IOD_a_10; double Omega0_10; double Omega_dot_10; double M0_10; double af0_10; double af1_10; double E5b_HS_10; double E1B_HS_10; double E5a_HS_10; /*GPS to Galileo GST conversion parameters*/ double A_0G_10; double A_1G_10; double t_0G_10; double WN_0G_10; Galileo_Almanac(); //!< Default constructor }; #endif gnss-sdr-0.0.9/src/core/system_parameters/galileo_ephemeris.cc000066400000000000000000000243751305042567700245560ustar00rootroot00000000000000/*! * \file galileo_ephemeris.cc * \brief Interface of a Galileo EPHEMERIS storage and orbital model functions * \author Javier Arribas, 2013. jarribas(at)cttc.es * \author Mara Branzanti 2013. mara.branzanti(at)gmail.com * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_ephemeris.h" #include #include "Galileo_E1.h" Galileo_Ephemeris::Galileo_Ephemeris() { flag_all_ephemeris = false; IOD_ephemeris = 0; IOD_nav_1 = 0; SV_ID_PRN_4 = 0; M0_1 = 0; // Mean anomaly at reference time [semi-circles] delta_n_3 = 0; // Mean motion difference from computed value [semi-circles/sec] e_1 = 0; // Eccentricity A_1 = 0; // Square root of the semi-major axis [metres^1/2] OMEGA_0_2 = 0; // Longitude of ascending node of orbital plane at weekly epoch [semi-circles] i_0_2 = 0; // Inclination angle at reference time [semi-circles] omega_2 = 0; // Argument of perigee [semi-circles] OMEGA_dot_3 = 0; // Rate of right ascension [semi-circles/sec] iDot_2 = 0; // Rate of inclination angle [semi-circles/sec] C_uc_3 = 0; // Amplitude of the cosine harmonic correction term to the argument of latitude [radians] C_us_3 = 0; // Amplitude of the sine harmonic correction term to the argument of latitude [radians] C_rc_3 = 0; // Amplitude of the cosine harmonic correction term to the orbit radius [meters] C_rs_3 = 0; // Amplitude of the sine harmonic correction term to the orbit radius [meters] C_ic_4 = 0; // Amplitude of the cosine harmonic correction term to the angle of inclination [radians] C_is_4 = 0; // Amplitude of the sine harmonic correction term to the angle of inclination [radians] t0e_1 = 0; // Ephemeris reference time [s] /*Clock correction parameters*/ t0c_4 = 0; // Clock correction data reference Time of Week [sec] af0_4 = 0; // SV clock bias correction coefficient [s] af1_4 = 0; // SV clock drift correction coefficient [s/s] af2_4 = 0; // SV clock drift rate correction coefficient [s/s^2] /*GST*/ WN_5 = 0; TOW_5 = 0; // SV status SISA_3 = 0; E5a_HS = 0; E5b_HS_5 = 0; E1B_HS_5 = 0; E5a_DVS = false; E5b_DVS_5 = 0; E1B_DVS_5 = 0; BGD_E1E5a_5 = 0; // E1-E5a Broadcast Group Delay [s] BGD_E1E5b_5 = 0; // E1-E5b Broadcast Group Delay [s] Galileo_satClkDrift = 0.0; Galileo_dtr = 0.0; // satellite positions d_satpos_X = 0.0; d_satpos_Y = 0.0; d_satpos_Z = 0.0; // Satellite velocity d_satvel_X = 0.0; d_satvel_Y = 0.0; d_satvel_Z = 0.0; i_satellite_PRN = 0; } double Galileo_Ephemeris::Galileo_System_Time(double WN, double TOW) { /* GALIELO SYSTEM TIME, ICD 5.1.2 * input parameter: * WN: The Week Number is an integer counter that gives the sequential week number from the origin of the Galileo time. It covers 4096 weeks (about 78 years). Then the counter is reset to zero to cover additional period modulo 4096 TOW: The Time of Week is defined as the number of seconds that have occurred since the transition from the previous week. The TOW covers an entire week from 0 to 604799 seconds and is reset to zero at the end of each week WN and TOW are received in page 5 output: t: it is the transmitted time in Galileo System Time (expressed in seconds) The GST start epoch shall be 00:00 UT on Sunday 22nd August 1999 (midnight between 21st and 22nd August). At the start epoch, GST shall be ahead of UTC by thirteen (13) leap seconds. Since the next leap second was inserted at 01.01.2006, this implies that as of 01.01.2006 GST is ahead of UTC by fourteen (14) leap seconds. The epoch denoted in the navigation messages by TOW and WN will be measured relative to the leading edge of the first chip of the first code sequence of the first page symbol. The transmission timing of the navigation message provided through the TOW is synchronised to each satellite’s version of Galileo System Time (GST). * */ double t = 0; double sec_in_day = 86400; double day_in_week = 7; t = WN * sec_in_day * day_in_week + TOW; // second from the origin of the Galileo time return t; } double Galileo_Ephemeris::sv_clock_drift(double transmitTime) { // Satellite Time Correction Algorithm, ICD 5.1.4 double dt; dt = transmitTime - t0c_4; Galileo_satClkDrift = af0_4 + af1_4 * dt + af2_4 * (dt * dt) + sv_clock_relativistic_term(transmitTime); //+Galileo_dtr; return Galileo_satClkDrift; } // compute the relativistic correction term double Galileo_Ephemeris::sv_clock_relativistic_term(double transmitTime) // Satellite Time Correction Algorithm, ICD 5.1.4 { double tk; double a; double n; double n0; double E; double E_old; double dE; double M; // Restore semi-major axis a = A_1*A_1; n0 = sqrt(GALILEO_GM / (a*a*a)); // Time from ephemeris reference epoch //t = WN_5*86400*7 + TOW_5; //WN_5*86400*7 are the second from the origin of the Galileo time tk = transmitTime - t0e_1; // Corrected mean motion n = n0 + delta_n_3; // Mean anomaly M = M0_1 + n * tk; // Reduce mean anomaly to between 0 and 2pi M = fmod((M + 2*GALILEO_PI), (2*GALILEO_PI)); // Initial guess of eccentric anomaly E = M; // --- Iteratively compute eccentric anomaly ---------------------------- for (int ii = 1; ii < 20; ii++) { E_old = E; E = M + e_1 * sin(E); dE = fmod(E - E_old, 2*GALILEO_PI); if (fabs(dE) < 1e-12) { //Necessary precision is reached, exit from the loop break; } } // Compute relativistic correction term Galileo_dtr = GALILEO_F * e_1* A_1 * sin(E); return Galileo_dtr; } void Galileo_Ephemeris::satellitePosition(double transmitTime) { // when this function in used, the input must be the transmitted time (t) in second computed by Galileo_System_Time (above function) double tk; // Time from ephemeris reference epoch double a; // Semi-major axis double n; // Corrected mean motion double n0; // Computed mean motion double M; // Mean anomaly double E; // Eccentric Anomaly (to be solved by iteration) double E_old; double dE; double nu; // True anomaly double phi; // Argument of Latitude double u; // Correct argument of latitude double r; // Correct radius double i; double Omega; // Find Galileo satellite's position ---------------------------------------------- // Restore semi-major axis a = A_1*A_1; // Computed mean motion n0 = sqrt(GALILEO_GM / (a*a*a)); // Time from ephemeris reference epoch tk = transmitTime - t0e_1; // Corrected mean motion n = n0 + delta_n_3; // Mean anomaly M = M0_1 + n * tk; // Reduce mean anomaly to between 0 and 2pi M = fmod((M + 2* GALILEO_PI), (2* GALILEO_PI)); // Initial guess of eccentric anomaly E = M; // --- Iteratively compute eccentric anomaly ---------------------------- for (int ii = 1; ii<20; ii++) { E_old = E; E = M + e_1 * sin(E); dE = fmod(E - E_old, 2*GALILEO_PI); if (fabs(dE) < 1e-12) { //Necessary precision is reached, exit from the loop break; } } // Compute the true anomaly double tmp_Y = sqrt(1.0 - e_1 * e_1) * sin(E); double tmp_X = cos(E) - e_1; nu = atan2(tmp_Y, tmp_X); // Compute angle phi (argument of Latitude) phi = nu + omega_2; // Reduce phi to between 0 and 2*pi rad phi = fmod((phi), (2*GALILEO_PI)); // Correct argument of latitude u = phi + C_uc_3 * cos(2*phi) + C_us_3 * sin(2*phi); // Correct radius r = a * (1 - e_1*cos(E)) + C_rc_3 * cos(2*phi) + C_rs_3 * sin(2*phi); // Correct inclination i = i_0_2 + iDot_2 * tk + C_ic_4 * cos(2*phi) + C_is_4 * sin(2*phi); // Compute the angle between the ascending node and the Greenwich meridian Omega = OMEGA_0_2 + (OMEGA_dot_3 - GALILEO_OMEGA_EARTH_DOT)*tk - GALILEO_OMEGA_EARTH_DOT * t0e_1; // Reduce to between 0 and 2*pi rad Omega = fmod((Omega + 2*GALILEO_PI), (2*GALILEO_PI)); // --- Compute satellite coordinates in Earth-fixed coordinates d_satpos_X = cos(u) * r * cos(Omega) - sin(u) * r * cos(i) * sin(Omega); d_satpos_Y = cos(u) * r * sin(Omega) + sin(u) * r * cos(i) * cos(Omega); // ********NOTE: in GALILEO ICD this expression is not correct because it has minus (- sin(u) * r * cos(i) * cos(Omega)) instead of plus d_satpos_Z = sin(u) * r * sin(i); // Satellite's velocity. Can be useful for Vector Tracking loops double Omega_dot = OMEGA_dot_3 - GALILEO_OMEGA_EARTH_DOT; d_satvel_X = - Omega_dot * (cos(u) * r + sin(u) * r * cos(i)) + d_satpos_X * cos(Omega) - d_satpos_Y * cos(i) * sin(Omega); d_satvel_Y = Omega_dot * (cos(u) * r * cos(Omega) - sin(u) * r * cos(i) * sin(Omega)) + d_satpos_X * sin(Omega) + d_satpos_Y * cos(i) * cos(Omega); d_satvel_Z = d_satpos_Y * sin(i); } gnss-sdr-0.0.9/src/core/system_parameters/galileo_ephemeris.h000066400000000000000000000157261305042567700244200ustar00rootroot00000000000000/*! * \file galileo_ephemeris.h * \brief Interface of a Galileo EPHEMERIS storage * \author Javier Arribas, 2013. jarribas(at)cttc.es, * \author Mara Branzanti 2013. mara.branzanti(at)gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_EPHEMERIS_H_ #define GNSS_SDR_GALILEO_EPHEMERIS_H_ #include #include /*! * \brief This class is a storage and orbital model functions for the Galileo SV ephemeris data as described in Galileo ICD paragraph 5.1.1 * (See https://www.gsc-europa.eu/system/files/galileo_documents/Galileo_OS_SIS_ICD.pdf ) * */ class Galileo_Ephemeris { public: /* Galileo ephemeris are 16 parameters and here are reported following the ICD order, paragraph 5.1.1. The number in the name after underscore (_1, _2, _3 and so on) refers to the page were we can find that parameter */ bool flag_all_ephemeris; int IOD_ephemeris; int IOD_nav_1; int SV_ID_PRN_4; double M0_1; //!< Mean anomaly at reference time [semi-circles] double delta_n_3; //!< Mean motion difference from computed value [semi-circles/sec] double e_1; //!< Eccentricity double A_1; //!< Square root of the semi-major axis [metres^1/2] double OMEGA_0_2; //!< Longitude of ascending node of orbital plane at weekly epoch [semi-circles] double i_0_2; //!< Inclination angle at reference time [semi-circles] double omega_2; //!< Argument of perigee [semi-circles] double OMEGA_dot_3; //!< Rate of right ascension [semi-circles/sec] double iDot_2; //!< Rate of inclination angle [semi-circles/sec] double C_uc_3; //!< Amplitude of the cosine harmonic correction term to the argument of latitude [radians] double C_us_3; //!< Amplitude of the sine harmonic correction term to the argument of latitude [radians] double C_rc_3; //!< Amplitude of the cosine harmonic correction term to the orbit radius [meters] double C_rs_3; //!< Amplitude of the sine harmonic correction term to the orbit radius [meters] double C_ic_4; //!< Amplitude of the cosine harmonic correction term to the angle of inclination [radians] double C_is_4; //!< Amplitude of the sine harmonic correction term to the angle of inclination [radians] double t0e_1; //!< Ephemeris reference time [s] /*Clock correction parameters*/ double t0c_4; //!< Clock correction data reference Time of Week [sec] double af0_4; //!< SV clock bias correction coefficient [s] double af1_4; //!< SV clock drift correction coefficient [s/s] double af2_4; //!< SV clock drift rate correction coefficient [s/s^2] /*GST*/ //Not belong to ephemeris set (page 1 to 4) double WN_5; //!< Week number double TOW_5; //!< Time of Week double Galileo_satClkDrift; double Galileo_dtr; //!< relativistic clock correction term // SV status double SISA_3; unsigned int E5a_HS; //!< E5a Signal Health Status double E5b_HS_5; //!< E5b Signal Health Status double E1B_HS_5; //!< E1B Signal Health Status bool E5a_DVS; //!< E5a Data Validity Status double E5b_DVS_5; //!< E5b Data Validity Status double E1B_DVS_5; //!< E1B Data Validity Status double BGD_E1E5a_5; //!< E1-E5a Broadcast Group Delay [s] double BGD_E1E5b_5; //!< E1-E5b Broadcast Group Delay [s] // satellite positions double d_satpos_X; //!< Earth-fixed coordinate x of the satellite [m]. Intersection of the IERS Reference Meridian (IRM) and the plane passing through the origin and normal to the Z-axis. double d_satpos_Y; //!< Earth-fixed coordinate y of the satellite [m]. Completes a right-handed, Earth-Centered, Earth-Fixed orthogonal coordinate system. double d_satpos_Z; //!< Earth-fixed coordinate z of the satellite [m]. The direction of the IERS (International Earth Rotation and Reference Systems Service) Reference Pole (IRP). // Satellite velocity double d_satvel_X; //!< Earth-fixed velocity coordinate x of the satellite [m] double d_satvel_Y; //!< Earth-fixed velocity coordinate y of the satellite [m] double d_satvel_Z; //!< Earth-fixed velocity coordinate z of the satellite [m] unsigned int i_satellite_PRN; //!< SV PRN NUMBER void satellitePosition(double transmitTime); //!< Computes the ECEF SV coordinates and ECEF velocity double Galileo_System_Time(double WN, double TOW); //!< Galileo System Time (GST), ICD paragraph 5.1.2 double sv_clock_drift(double transmitTime); //!< Satellite Time Correction Algorithm, ICD 5.1.4 double sv_clock_relativistic_term(double transmitTime); //!< Satellite Time Correction Algorithm, ICD 5.1.4 Galileo_Ephemeris(); template /*! * \brief Serialize is a boost standard method to be called by the boost XML serialization. Here is used to save the ephemeris data on disk file. */ void serialize(Archive& archive, const unsigned int version) { using boost::serialization::make_nvp; archive & make_nvp("i_satellite_PRN",i_satellite_PRN); archive & make_nvp("M0_1", M0_1); archive & make_nvp("e_1", e_1); archive & make_nvp("A_1", A_1); archive & make_nvp("OMEGA_0_2", OMEGA_0_2); archive & make_nvp("i_0_2", i_0_2); archive & make_nvp("omega_2", omega_2); archive & make_nvp("OMEGA_dot_3", OMEGA_dot_3); archive & make_nvp("iDot_2", iDot_2); archive & make_nvp("C_uc_3", C_uc_3); archive & make_nvp("C_us_3", C_us_3); archive & make_nvp("C_rc_3", C_rc_3); archive & make_nvp("C_rs_3", C_rs_3); archive & make_nvp("C_ic_4", C_ic_4); archive & make_nvp("C_is_4", C_is_4); archive & make_nvp("t0e_1", t0e_1); archive & make_nvp("t0c_4", t0c_4); archive & make_nvp("af0_4", af0_4); archive & make_nvp("af1_4", af1_4); archive & make_nvp("af2_4", af2_4); } }; #endif gnss-sdr-0.0.9/src/core/system_parameters/galileo_fnav_message.cc000066400000000000000000000764601305042567700252350ustar00rootroot00000000000000/*! * \file galileo_fnav_message.h * \brief Implementation of a Galileo F/NAV Data message * as described in Galileo OS SIS ICD Issue 1.1 (Sept. 2010) * \author Marc Sales, 2014. marcsales92(at)gmail.com * \based on work from: *
      *
    • Javier Arribas, 2011. jarribas(at)cttc.es *
    * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_fnav_message.h" #include // for boost::crc_basic, boost::crc_optimal #include #include #include typedef boost::crc_optimal<24, 0x1864CFBu, 0x0, 0x0, false, false> CRC_Galileo_FNAV_type; void Galileo_Fnav_Message::reset() { flag_CRC_test = false; flag_all_ephemeris = false; //!< Flag indicating that all words containing ephemeris have been received flag_ephemeris_1 = false; //!< Flag indicating that ephemeris 1/3 (word 2) have been received flag_ephemeris_2 = false; //!< Flag indicating that ephemeris 2/3 (word 3) have been received flag_ephemeris_3 = false; //!< Flag indicating that ephemeris 3/3 (word 4) have been received flag_iono_and_GST = false; //!< Flag indicating that ionospheric and GST parameters (word 1) have been received flag_TOW_1 = false; flag_TOW_2 = false; flag_TOW_3 = false; flag_TOW_4 = false; flag_TOW_set = false; //!< it is true when page 1,2,3 or 4 arrives flag_utc_model = false; //!< Flag indicating that utc model parameters (word 4) have been received flag_all_almanac = false; //!< Flag indicating that all almanac have been received flag_almanac_1 = false; //!< Flag indicating that almanac 1/2 (word 5) have been received flag_almanac_2 = false; //!< Flag indicating that almanac 2/2 (word 6) have been received IOD_ephemeris = 0; page_type = 0; /* WORD 1 SVID, Clock correction, SISA, Ionospheric correction, BGD, GST, Signal * health and Data validity status*/ FNAV_SV_ID_PRN_1 = 0; FNAV_IODnav_1 = 0; FNAV_t0c_1 = 0; FNAV_af0_1 = 0; FNAV_af1_1 = 0; FNAV_af2_1 = 0; FNAV_SISA_1 = 0; FNAV_ai0_1 = 0; FNAV_ai1_1 = 0; FNAV_ai2_1 = 0; FNAV_region1_1 = 0; FNAV_region2_1 = 0; FNAV_region3_1 = 0; FNAV_region4_1 = 0; FNAV_region5_1 = 0; FNAV_BGD_1 = 0; FNAV_E5ahs_1 = 0; FNAV_WN_1 = 0; FNAV_TOW_1 = 0; FNAV_E5advs_1 = 0; // WORD 2 Ephemeris (1/3) and GST FNAV_IODnav_2 = 0; FNAV_M0_2 = 0; FNAV_omegadot_2 = 0; FNAV_e_2 = 0; FNAV_a12_2 = 0; FNAV_omega0_2 = 0; FNAV_idot_2 = 0; FNAV_WN_2 = 0; FNAV_TOW_2 = 0; // WORD 3 Ephemeris (2/3) and GST FNAV_IODnav_3 = 0; FNAV_i0_3 = 0; FNAV_w_3 = 0; FNAV_deltan_3 = 0; FNAV_Cuc_3 = 0; FNAV_Cus_3 = 0; FNAV_Crc_3 = 0; FNAV_Crs_3 = 0; FNAV_t0e_3 = 0; FNAV_WN_3 = 0; FNAV_TOW_3 = 0; /* WORD 4 Ephemeris (3/3), GST-UTC conversion, GST-GPS conversion and TOW. Note that the clock is repeated in this page type*/ FNAV_IODnav_4 = 0; FNAV_Cic_4 = 0; FNAV_Cis_4 = 0; FNAV_A0_4 = 0; FNAV_A1_4 = 0; FNAV_deltatls_4 = 0; FNAV_t0t_4 = 0; FNAV_WNot_4 = 0; FNAV_WNlsf_4 = 0; FNAV_DN_4 = 0; FNAV_deltatlsf_4 = 0; FNAV_t0g_4 = 0; FNAV_A0g_4 = 0; FNAV_A1g_4 = 0; FNAV_WN0g_4 = 0; FNAV_TOW_4 = 0; // WORD 5 Almanac (SVID1 and SVID2(1/2)), Week Number and almanac reference time FNAV_IODa_5 = 0; FNAV_WNa_5 = 0; FNAV_t0a_5 = 0; FNAV_SVID1_5 = 0; FNAV_Deltaa12_1_5 = 0; FNAV_e_1_5 = 0; FNAV_w_1_5 = 0; FNAV_deltai_1_5 = 0; FNAV_Omega0_1_5 = 0; FNAV_Omegadot_1_5 = 0; FNAV_M0_1_5 = 0; FNAV_af0_1_5 = 0; FNAV_af1_1_5 = 0; FNAV_E5ahs_1_5 = 0; FNAV_SVID2_5 = 0; FNAV_Deltaa12_2_5 = 0; FNAV_e_2_5 = 0; FNAV_w_2_5 = 0; FNAV_deltai_2_5 = 0; // WORD 6 Almanac (SVID2(2/2) and SVID3) FNAV_IODa_6 = 0; FNAV_Omega0_2_6 = 0; FNAV_Omegadot_2_6 = 0; FNAV_M0_2_6 = 0; FNAV_af0_2_6 = 0; FNAV_af1_2_6 = 0; FNAV_E5ahs_2_6 = 0; FNAV_SVID3_6 = 0; FNAV_Deltaa12_3_6 = 0; FNAV_e_3_6 = 0; FNAV_w_3_6 = 0; FNAV_deltai_3_6 = 0; FNAV_Omega0_3_6 = 0; FNAV_Omegadot_3_6 = 0; FNAV_M0_3_6 = 0; FNAV_af0_3_6 = 0; FNAV_af1_3_6 = 0; FNAV_E5ahs_3_6 = 0; } Galileo_Fnav_Message::Galileo_Fnav_Message() { reset(); } //int Galileo_Fnav_Message::toInt(std::string bitString) //{ // int tempInt; // int num=0; // int sLength = bitString.length(); // for(int i=0; i Word_for_CRC_bits(message_word); std::bitset<24> checksum(CRC_data); if (_CRC_test(Word_for_CRC_bits, checksum.to_ulong()) == true) { flag_CRC_test = true; // CRC correct: Decode word decode_page(message_word); } else { flag_CRC_test = false; } } bool Galileo_Fnav_Message::_CRC_test(std::bitset bits, boost::uint32_t checksum) { CRC_Galileo_FNAV_type CRC_Galileo; boost::uint32_t crc_computed; // Galileo FNAV frame for CRC is not an integer multiple of bytes // it needs to be filled with zeroes at the start of the frame. // This operation is done in the transformation from bits to bytes // using boost::dynamic_bitset. // ToDo: Use boost::dynamic_bitset for all the bitset operations in this class boost::dynamic_bitset frame_bits(std::string(bits.to_string())); std::vector bytes; boost::to_block_range(frame_bits, std::back_inserter(bytes)); std::reverse(bytes.begin(), bytes.end()); CRC_Galileo.process_bytes( bytes.data(), GALILEO_FNAV_DATA_FRAME_BYTES ); crc_computed = CRC_Galileo.checksum(); if (checksum == crc_computed) { return true; } else { return false; } } void Galileo_Fnav_Message::decode_page(std::string data) { std::bitset data_bits(data); page_type = read_navigation_unsigned(data_bits, FNAV_PAGE_TYPE_bit); switch(page_type) { case 1: // SVID, Clock correction, SISA, Ionospheric correction, BGD, GST, Signal health and Data validity status FNAV_SV_ID_PRN_1 = static_cast(read_navigation_unsigned(data_bits, FNAV_SV_ID_PRN_1_bit)); FNAV_IODnav_1 =static_cast(read_navigation_unsigned(data_bits, FNAV_IODnav_1_bit)); FNAV_t0c_1 = static_cast(read_navigation_unsigned(data_bits, FNAV_t0c_1_bit)); FNAV_t0c_1 *= FNAV_t0c_1_LSB; FNAV_af0_1 = static_cast(read_navigation_signed(data_bits, FNAV_af0_1_bit)); FNAV_af0_1 *= FNAV_af0_1_LSB; FNAV_af1_1 = static_cast(read_navigation_signed(data_bits, FNAV_af1_1_bit)); FNAV_af1_1 *= FNAV_af1_1_LSB; FNAV_af2_1 = static_cast(read_navigation_signed(data_bits, FNAV_af2_1_bit)); FNAV_af2_1 *= FNAV_af2_1_LSB; FNAV_SISA_1 = static_cast(read_navigation_unsigned(data_bits, FNAV_SISA_1_bit)); FNAV_ai0_1 = static_cast(read_navigation_unsigned(data_bits, FNAV_ai0_1_bit)); FNAV_ai0_1 *= FNAV_ai0_1_LSB; FNAV_ai1_1 = static_cast(read_navigation_signed(data_bits, FNAV_ai1_1_bit)); FNAV_ai1_1 *= FNAV_ai1_1_LSB; FNAV_ai2_1 = static_cast(read_navigation_signed(data_bits, FNAV_ai2_1_bit)); FNAV_ai2_1 *= FNAV_ai2_1_LSB; FNAV_region1_1 = static_cast(read_navigation_unsigned(data_bits, FNAV_region1_1_bit)); FNAV_region2_1 = static_cast(read_navigation_unsigned(data_bits, FNAV_region2_1_bit)); FNAV_region3_1 = static_cast(read_navigation_unsigned(data_bits, FNAV_region3_1_bit)); FNAV_region4_1 = static_cast(read_navigation_unsigned(data_bits, FNAV_region4_1_bit)); FNAV_region5_1 = static_cast(read_navigation_unsigned(data_bits, FNAV_region5_1_bit)); FNAV_BGD_1 = static_cast(read_navigation_signed(data_bits, FNAV_BGD_1_bit)); FNAV_BGD_1 *= FNAV_BGD_1_LSB; FNAV_E5ahs_1 = static_cast(read_navigation_unsigned(data_bits, FNAV_E5ahs_1_bit)); FNAV_WN_1 = static_cast(read_navigation_unsigned(data_bits, FNAV_WN_1_bit)); FNAV_TOW_1 = static_cast(read_navigation_unsigned(data_bits, FNAV_TOW_1_bit)); FNAV_E5advs_1 = static_cast(read_navigation_unsigned(data_bits, FNAV_E5advs_1_bit)); flag_TOW_1 = true; flag_TOW_set = true; flag_iono_and_GST = true; //set to false externally break; case 2: // Ephemeris (1/3) and GST FNAV_IODnav_2 = static_cast(read_navigation_unsigned(data_bits, FNAV_IODnav_2_bit)); FNAV_M0_2 = static_cast(read_navigation_unsigned(data_bits, FNAV_M0_2_bit)); FNAV_M0_2 *= FNAV_M0_2_LSB; FNAV_omegadot_2 = static_cast(read_navigation_signed(data_bits, FNAV_omegadot_2_bit)); FNAV_omegadot_2 *= FNAV_omegadot_2_LSB; FNAV_e_2 = static_cast(read_navigation_unsigned(data_bits, FNAV_e_2_bit)); FNAV_e_2 *= FNAV_e_2_LSB; FNAV_a12_2 = static_cast(read_navigation_unsigned(data_bits, FNAV_a12_2_bit)); FNAV_a12_2 *= FNAV_a12_2_LSB; FNAV_omega0_2 = static_cast(read_navigation_signed(data_bits, FNAV_omega0_2_bit)); FNAV_omega0_2 *= FNAV_omega0_2_LSB; FNAV_idot_2 = static_cast(read_navigation_signed(data_bits, FNAV_idot_2_bit)); FNAV_idot_2 *= FNAV_idot_2_LSB; FNAV_WN_2 = static_cast(read_navigation_unsigned(data_bits, FNAV_WN_2_bit)); FNAV_TOW_2 = static_cast(read_navigation_unsigned(data_bits, FNAV_TOW_2_bit)); flag_TOW_2 = true; flag_TOW_set = true; flag_ephemeris_1 = true; break; case 3: // Ephemeris (2/3) and GST FNAV_IODnav_3 = static_cast(read_navigation_unsigned(data_bits, FNAV_IODnav_3_bit)); FNAV_i0_3 = static_cast(read_navigation_signed(data_bits, FNAV_i0_3_bit)); FNAV_i0_3 *= FNAV_i0_3_LSB; FNAV_w_3=static_cast(read_navigation_signed(data_bits, FNAV_w_3_bit)); FNAV_w_3 *= FNAV_w_3_LSB; FNAV_deltan_3 = static_cast(read_navigation_unsigned(data_bits, FNAV_deltan_3_bit)); FNAV_deltan_3 *= FNAV_deltan_3_LSB; FNAV_Cuc_3 = static_cast(read_navigation_signed(data_bits, FNAV_Cuc_3_bit)); FNAV_Cuc_3 *= FNAV_Cuc_3_LSB; FNAV_Cus_3 = static_cast(read_navigation_signed(data_bits, FNAV_Cus_3_bit)); FNAV_Cus_3 *= FNAV_Cus_3_LSB; FNAV_Crc_3 = static_cast(read_navigation_signed(data_bits, FNAV_Crc_3_bit)); FNAV_Crc_3 *= FNAV_Crc_3_LSB; FNAV_Crs_3 = static_cast(read_navigation_signed(data_bits, FNAV_Crs_3_bit)); FNAV_Crs_3 *= FNAV_Crs_3_LSB; FNAV_t0e_3 = static_cast(read_navigation_unsigned(data_bits, FNAV_t0e_3_bit)); FNAV_t0e_3 *= FNAV_t0e_3_LSB; FNAV_WN_3 = static_cast(read_navigation_unsigned(data_bits, FNAV_WN_3_bit)); FNAV_TOW_3 = static_cast(read_navigation_unsigned(data_bits, FNAV_TOW_3_bit)); flag_TOW_3 = true; flag_TOW_set = true; flag_ephemeris_2 = true; break; case 4: // Ephemeris (3/3), GST-UTC conversion, GST-GPS conversion and TOW FNAV_IODnav_4 = static_cast(read_navigation_unsigned(data_bits, FNAV_IODnav_4_bit)); FNAV_Cic_4 = static_cast(read_navigation_unsigned(data_bits, FNAV_Cic_4_bit)); FNAV_Cic_4 *= FNAV_Cic_4_LSB; FNAV_Cis_4 = static_cast(read_navigation_unsigned(data_bits, FNAV_Cis_4_bit)); FNAV_Cis_4 *= FNAV_Cis_4_LSB; FNAV_A0_4 = static_cast(read_navigation_unsigned(data_bits, FNAV_A0_4_bit)); FNAV_A0_4 *= FNAV_A0_4_LSB; FNAV_A1_4 = static_cast(read_navigation_unsigned(data_bits, FNAV_A1_4_bit)); FNAV_A1_4 *= FNAV_A1_4_LSB; FNAV_deltatls_4 = static_cast(read_navigation_signed(data_bits, FNAV_deltatls_4_bit)); FNAV_t0t_4 = static_cast(read_navigation_unsigned(data_bits, FNAV_t0t_4_bit)); FNAV_t0t_4 *= FNAV_t0t_4_LSB; FNAV_WNot_4 = static_cast(read_navigation_unsigned(data_bits, FNAV_WNot_4_bit)); FNAV_WNlsf_4 = static_cast(read_navigation_unsigned(data_bits, FNAV_WNlsf_4_bit)); FNAV_DN_4 = static_cast(read_navigation_unsigned(data_bits, FNAV_DN_4_bit)); FNAV_deltatlsf_4 = static_cast(read_navigation_signed(data_bits, FNAV_deltatlsf_4_bit)); FNAV_t0g_4 = static_cast(read_navigation_unsigned(data_bits, FNAV_t0g_4_bit)); FNAV_t0g_4 *= FNAV_t0g_4_LSB; FNAV_A0g_4 = static_cast(read_navigation_signed(data_bits, FNAV_A0g_4_bit)); FNAV_A0g_4 *= FNAV_A0g_4_LSB; FNAV_A1g_4 = static_cast(read_navigation_signed(data_bits, FNAV_A1g_4_bit)); FNAV_A1g_4 *= FNAV_A1g_4_LSB; FNAV_WN0g_4 = static_cast(read_navigation_unsigned(data_bits, FNAV_WN0g_4_bit)); FNAV_TOW_4 = static_cast(read_navigation_unsigned(data_bits, FNAV_TOW_4_bit)); flag_TOW_4 = true; flag_TOW_set = true; flag_ephemeris_3 = true; flag_utc_model = true; //set to false externally break; case 5: // Almanac (SVID1 and SVID2(1/2)), Week Number and almanac reference time FNAV_IODa_5 = static_cast(read_navigation_unsigned(data_bits, FNAV_IODa_5_bit)); FNAV_WNa_5 = static_cast(read_navigation_unsigned(data_bits, FNAV_WNa_5_bit)); FNAV_t0a_5 = static_cast(read_navigation_unsigned(data_bits, FNAV_t0a_5_bit)); FNAV_t0a_5 *= FNAV_t0a_5_LSB; FNAV_SVID1_5 = static_cast(read_navigation_unsigned(data_bits, FNAV_SVID1_5_bit)); FNAV_Deltaa12_1_5 = static_cast(read_navigation_signed(data_bits, FNAV_Deltaa12_1_5_bit)); FNAV_Deltaa12_1_5 *= FNAV_Deltaa12_5_LSB; FNAV_e_1_5 = static_cast(read_navigation_unsigned(data_bits, FNAV_e_1_5_bit)); FNAV_e_1_5 *= FNAV_e_5_LSB; FNAV_w_1_5 = static_cast(read_navigation_signed(data_bits, FNAV_w_1_5_bit)); FNAV_w_1_5 *= FNAV_w_5_LSB; FNAV_deltai_1_5 = static_cast(read_navigation_signed(data_bits, FNAV_deltai_1_5_bit)); FNAV_deltai_1_5 *= FNAV_deltai_5_LSB; FNAV_Omega0_1_5 = static_cast(read_navigation_signed(data_bits, FNAV_Omega0_1_5_bit)); FNAV_Omega0_1_5 *= FNAV_Omega0_5_LSB; FNAV_Omegadot_1_5 = static_cast(read_navigation_signed(data_bits, FNAV_Omegadot_1_5_bit)); FNAV_Omegadot_1_5 *= FNAV_Omegadot_5_LSB; FNAV_M0_1_5 = static_cast(read_navigation_signed(data_bits, FNAV_M0_1_5_bit)); FNAV_M0_1_5 *= FNAV_M0_5_LSB; FNAV_af0_1_5 = static_cast(read_navigation_signed(data_bits, FNAV_af0_1_5_bit)); FNAV_af0_1_5 *= FNAV_af0_5_LSB; FNAV_af1_1_5 = static_cast(read_navigation_signed(data_bits, FNAV_af1_1_5_bit)); FNAV_af1_1_5 *= FNAV_af1_5_LSB; FNAV_E5ahs_1_5 = static_cast(read_navigation_unsigned(data_bits, FNAV_E5ahs_1_5_bit)); FNAV_SVID2_5 = static_cast(read_navigation_unsigned(data_bits, FNAV_SVID2_5_bit)); FNAV_Deltaa12_2_5 = static_cast(read_navigation_signed(data_bits, FNAV_Deltaa12_2_5_bit)); FNAV_Deltaa12_2_5 *= FNAV_Deltaa12_5_LSB; FNAV_e_2_5 = static_cast(read_navigation_unsigned(data_bits, FNAV_e_2_5_bit)); FNAV_e_2_5 *= FNAV_e_5_LSB; FNAV_w_2_5 = static_cast(read_navigation_signed(data_bits, FNAV_w_2_5_bit)); FNAV_w_2_5 *= FNAV_w_5_LSB; FNAV_deltai_2_5 = static_cast(read_navigation_signed(data_bits, FNAV_deltai_2_5_bit)); FNAV_deltai_2_5 *= FNAV_deltai_5_LSB; //TODO check this // Omega0_2 must be decoded when the two pieces are joined omega0_1 = data.substr(210, 4); //omega_flag=true; // //FNAV_Omega012_2_5=static_cast(read_navigation_signed(data_bits, FNAV_Omega012_2_5_bit); flag_almanac_1 = true; break; case 6: // Almanac (SVID2(2/2) and SVID3) FNAV_IODa_6 = static_cast(read_navigation_unsigned(data_bits, FNAV_IODa_6_bit)); /* Don't worry about omega pieces. If page 5 has not been received, all_ephemeris * flag will be set to false and the data won't be recorded.*/ std::string omega0_2 = data.substr(10, 12); std::string Omega0 = omega0_1 + omega0_2; std::bitset omega_bits(Omega0); const std::vector> om_bit({{0, 12}}); FNAV_Omega0_2_6 = static_cast(read_navigation_signed(omega_bits, om_bit)); FNAV_Omega0_2_6 *= FNAV_Omega0_5_LSB; // FNAV_Omegadot_2_6 = static_cast(read_navigation_signed(data_bits, FNAV_Omegadot_2_6_bit)); FNAV_Omegadot_2_6 *= FNAV_Omegadot_5_LSB; FNAV_M0_2_6 = static_cast(read_navigation_signed(data_bits, FNAV_M0_2_6_bit)); FNAV_M0_2_6 *= FNAV_M0_5_LSB; FNAV_af0_2_6 = static_cast(read_navigation_signed(data_bits, FNAV_af0_2_6_bit)); FNAV_af0_2_6 *= FNAV_af0_5_LSB; FNAV_af1_2_6 = static_cast(read_navigation_signed(data_bits, FNAV_af1_2_6_bit)); FNAV_af1_2_6 *= FNAV_af1_5_LSB; FNAV_E5ahs_2_6 = static_cast(read_navigation_unsigned(data_bits, FNAV_E5ahs_2_6_bit)); FNAV_SVID3_6 = static_cast(read_navigation_unsigned(data_bits, FNAV_SVID3_6_bit)); FNAV_Deltaa12_3_6 = static_cast(read_navigation_signed(data_bits, FNAV_Deltaa12_3_6_bit)); FNAV_Deltaa12_3_6 *= FNAV_Deltaa12_5_LSB; FNAV_e_3_6 = static_cast(read_navigation_unsigned(data_bits, FNAV_e_3_6_bit)); FNAV_e_3_6 *= FNAV_e_5_LSB; FNAV_w_3_6 = static_cast(read_navigation_signed(data_bits, FNAV_w_3_6_bit)); FNAV_w_3_6 *= FNAV_w_5_LSB; FNAV_deltai_3_6 = static_cast(read_navigation_signed(data_bits, FNAV_deltai_3_6_bit)); FNAV_deltai_3_6 *= FNAV_deltai_5_LSB; FNAV_Omega0_3_6 = static_cast(read_navigation_signed(data_bits, FNAV_Omega0_3_6_bit)); FNAV_Omega0_3_6 *= FNAV_Omega0_5_LSB; FNAV_Omegadot_3_6 = static_cast(read_navigation_signed(data_bits, FNAV_Omegadot_3_6_bit)); FNAV_Omegadot_3_6 *= FNAV_Omegadot_5_LSB; FNAV_M0_3_6 = static_cast(read_navigation_signed(data_bits, FNAV_M0_3_6_bit)); FNAV_M0_3_6 *= FNAV_M0_5_LSB; FNAV_af0_3_6 = static_cast(read_navigation_signed(data_bits, FNAV_af0_3_6_bit)); FNAV_af0_3_6 *= FNAV_af0_5_LSB; FNAV_af1_3_6 = static_cast(read_navigation_signed(data_bits, FNAV_af1_3_6_bit)); FNAV_af1_3_6 *= FNAV_af1_5_LSB; FNAV_E5ahs_3_6 = static_cast(read_navigation_unsigned(data_bits, FNAV_E5ahs_3_6_bit)); flag_almanac_2 = true; break; } } unsigned long int Galileo_Fnav_Message::read_navigation_unsigned(std::bitset bits, const std::vector> parameter) { unsigned long int value = 0; int num_of_slices = parameter.size(); for (int i=0; i bits, const std::vector> parameter) { signed long int value = 0; int num_of_slices = parameter.size(); // Discriminate between 64 bits and 32 bits compiler int long_int_size_bytes = sizeof(signed long int); if (long_int_size_bytes == 8) // if a long int takes 8 bytes, we are in a 64 bits system { // read the MSB and perform the sign extension if (bits[GALILEO_FNAV_DATA_FRAME_BITS - parameter[0].first] == 1) { value ^= 0xFFFFFFFFFFFFFFFF; //64 bits variable } else { value &= 0; } for (int i=0; i *
  • Javier Arribas, 2011. jarribas(at)cttc.es * * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_FNAV_MESSAGE_H_ #define GNSS_SDR_GALILEO_FNAV_MESSAGE_H_ #include #include #include #include #include // for boost::uint16_t #include "galileo_ephemeris.h" #include "galileo_iono.h" #include "galileo_almanac.h" #include "galileo_utc_model.h" #include "Galileo_E5a.h" /*! * \brief This class handles the Galileo F/NAV Data message, as described in the * Galileo Open Service Signal in Space Interface Control Document (OS SIS ICD), Issue 1.2 (Nov 2015). * See https://www.gsc-europa.eu/system/files/galileo_documents/Galileo_OS_SIS_ICD.pdf */ class Galileo_Fnav_Message { public: // void Galileo_Fnav_Message::split_page(std::string page_string); // void Galileo_Fnav_Message::reset(); // bool Galileo_Fnav_Message::have_new_ephemeris(); // bool Galileo_Fnav_Message::have_new_iono_and_GST(); // bool Galileo_Fnav_Message::have_new_utc_model(); // bool Galileo_Fnav_Message::have_new_almanac(); // Galileo_Ephemeris Galileo_Fnav_Message::get_ephemeris(); // Galileo_Iono Galileo_Fnav_Message::get_iono(); // Galileo_Utc_Model Galileo_Fnav_Message::get_utc_model(); // Galileo_Almanac Galileo_Fnav_Message::get_almanac(); // void split_page(std::string page_string); void reset(); bool have_new_ephemeris(); bool have_new_iono_and_GST(); bool have_new_utc_model(); bool have_new_almanac(); Galileo_Ephemeris get_ephemeris(); Galileo_Iono get_iono(); Galileo_Utc_Model get_utc_model(); Galileo_Almanac get_almanac(); Galileo_Fnav_Message(); bool flag_CRC_test; bool flag_all_ephemeris; //!< Flag indicating that all words containing ephemeris have been received bool flag_ephemeris_1; //!< Flag indicating that ephemeris 1/3 (word 2) have been received bool flag_ephemeris_2; //!< Flag indicating that ephemeris 2/3 (word 3) have been received bool flag_ephemeris_3; //!< Flag indicating that ephemeris 3/3 (word 4) have been received bool flag_iono_and_GST; //!< Flag indicating that ionospheric and GST parameters (word 1) have been received bool flag_TOW_1; bool flag_TOW_2; bool flag_TOW_3; bool flag_TOW_4; bool flag_TOW_set; //!< it is true when page 1,2,3 or 4 arrives bool flag_utc_model; //!< Flag indicating that utc model parameters (word 4) have been received bool flag_all_almanac; //!< Flag indicating that all almanac have been received bool flag_almanac_1; //!< Flag indicating that almanac 1/2 (word 5) have been received bool flag_almanac_2; //!< Flag indicating that almanac 2/2 (word 6) have been received int IOD_ephemeris; int page_type; /* WORD 1 SVID, Clock correction, SISA, Ionospheric correction, BGD, GST, Signal * health and Data validity status*/ int FNAV_SV_ID_PRN_1; int FNAV_IODnav_1; double FNAV_t0c_1; double FNAV_af0_1; double FNAV_af1_1; double FNAV_af2_1; double FNAV_SISA_1; double FNAV_ai0_1; double FNAV_ai1_1; double FNAV_ai2_1; bool FNAV_region1_1; bool FNAV_region2_1; bool FNAV_region3_1; bool FNAV_region4_1; bool FNAV_region5_1; double FNAV_BGD_1; double FNAV_E5ahs_1; double FNAV_WN_1; double FNAV_TOW_1; bool FNAV_E5advs_1; // WORD 2 Ephemeris (1/3) and GST int FNAV_IODnav_2; double FNAV_M0_2; double FNAV_omegadot_2; double FNAV_e_2; double FNAV_a12_2; double FNAV_omega0_2; double FNAV_idot_2; double FNAV_WN_2; double FNAV_TOW_2; // WORD 3 Ephemeris (2/3) and GST int FNAV_IODnav_3; double FNAV_i0_3; double FNAV_w_3; double FNAV_deltan_3; double FNAV_Cuc_3; double FNAV_Cus_3; double FNAV_Crc_3; double FNAV_Crs_3; double FNAV_t0e_3; double FNAV_WN_3; double FNAV_TOW_3; /* WORD 4 Ephemeris (3/3), GST-UTC conversion, GST-GPS conversion and TOW. Note that the clock is repeated in this page type*/ int FNAV_IODnav_4; double FNAV_Cic_4; double FNAV_Cis_4; double FNAV_A0_4; double FNAV_A1_4; double FNAV_deltatls_4; double FNAV_t0t_4; double FNAV_WNot_4; double FNAV_WNlsf_4; double FNAV_DN_4; double FNAV_deltatlsf_4; double FNAV_t0g_4; double FNAV_A0g_4; double FNAV_A1g_4; double FNAV_WN0g_4; double FNAV_TOW_4; // WORD 5 Almanac (SVID1 and SVID2(1/2)), Week Number and almanac reference time int FNAV_IODa_5; double FNAV_WNa_5; double FNAV_t0a_5; int FNAV_SVID1_5; double FNAV_Deltaa12_1_5; double FNAV_e_1_5; double FNAV_w_1_5; double FNAV_deltai_1_5; double FNAV_Omega0_1_5; double FNAV_Omegadot_1_5; double FNAV_M0_1_5; double FNAV_af0_1_5; double FNAV_af1_1_5; unsigned int FNAV_E5ahs_1_5; int FNAV_SVID2_5; double FNAV_Deltaa12_2_5; double FNAV_e_2_5; double FNAV_w_2_5; double FNAV_deltai_2_5; // WORD 6 Almanac (SVID2(2/2) and SVID3) int FNAV_IODa_6; double FNAV_Omega0_2_6; double FNAV_Omegadot_2_6; double FNAV_M0_2_6; double FNAV_af0_2_6; double FNAV_af1_2_6; double FNAV_E5ahs_2_6; int FNAV_SVID3_6; double FNAV_Deltaa12_3_6; double FNAV_e_3_6; double FNAV_w_3_6; double FNAV_deltai_3_6; double FNAV_Omega0_3_6; double FNAV_Omegadot_3_6; double FNAV_M0_3_6; double FNAV_af0_3_6; double FNAV_af1_3_6; double FNAV_E5ahs_3_6; private: bool _CRC_test(std::bitset bits,boost::uint32_t checksum); void decode_page(std::string data); unsigned long int read_navigation_unsigned(std::bitset bits, const std::vector> parameter); signed long int read_navigation_signed(std::bitset bits, const std::vector> parameter); std::string omega0_1; //std::string omega0_2; //bool omega_flag; }; #endif /* GNSS_SDR_GALILEO_FNAV_MESSAGE_H_ */ gnss-sdr-0.0.9/src/core/system_parameters/galileo_iono.cc000066400000000000000000000035621305042567700235340ustar00rootroot00000000000000/*! * \file galileo_iono.cc * \brief Interface of a GPS IONOSPHERIC MODEL storage * * \author Javier Arribas, 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_iono.h" Galileo_Iono::Galileo_Iono() { /* Ionospheric correction */ ai0_5 = 0; // Effective Ionisation Level 1st order parameter [sfu] ai1_5 = 0; // Effective Ionisation Level 2st order parameter [sfu/degree] ai2_5 = 0; // Effective Ionisation Level 3st order parameter [sfu/degree] /* Ionospheric disturbance flag */ Region1_flag_5 = false; // Ionospheric Disturbance Flag for region 1 Region2_flag_5 = false; // Ionospheric Disturbance Flag for region 2 Region3_flag_5 = false; // Ionospheric Disturbance Flag for region 3 Region4_flag_5 = false; // Ionospheric Disturbance Flag for region 4 Region5_flag_5 = false; // Ionospheric Disturbance Flag for region 5 TOW_5 = 0; WN_5 = 0; } gnss-sdr-0.0.9/src/core/system_parameters/galileo_iono.h000066400000000000000000000045741305042567700234020ustar00rootroot00000000000000/*! * \file galileo_iono.h * \brief Interface of a Galileo Ionospheric Model storage * \author Javier Arribas, 2013. jarribas(at)cttc.es * \author Mara Branzanti 2013. mara.branzanti(at)gmail.com * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_IONO_H_ #define GNSS_SDR_GALILEO_IONO_H_ /*! * \brief This class is a storage for the GALILEO IONOSPHERIC data as described in Galileo ICD paragraph 5.1.6 * * See https://www.gsc-europa.eu/system/files/galileo_documents/Galileo_OS_SIS_ICD.pdf */ class Galileo_Iono { public: /*Ionospheric correction*/ double ai0_5; //!< Effective Ionisation Level 1st order parameter [sfu] double ai1_5; //!< Effective Ionisation Level 2st order parameter [sfu/degree] double ai2_5; //!< Effective Ionisation Level 3st order parameter [sfu/degree] /*Ionospheric disturbance flag*/ bool Region1_flag_5; //!< Ionospheric Disturbance Flag for region 1 bool Region2_flag_5; //!< Ionospheric Disturbance Flag for region 2 bool Region3_flag_5; //!< Ionospheric Disturbance Flag for region 3 bool Region4_flag_5; //!< Ionospheric Disturbance Flag for region 4 bool Region5_flag_5; //!< Ionospheric Disturbance Flag for region 5 /*from page 5 (UTC) to have a timestamp*/ double TOW_5; //!< UTC data reference Time of Week [s] double WN_5; //!< UTC data reference Week number [week] /*! * Default constructor */ Galileo_Iono(); }; #endif gnss-sdr-0.0.9/src/core/system_parameters/galileo_navigation_message.cc000066400000000000000000001302371305042567700264330ustar00rootroot00000000000000/*! * \file galileo_navigation_message.cc * \brief Implementation of a Galileo I/NAV Data message * as described in Galileo OS SIS ICD Issue 1.1 (Sept. 2010) * \author Mara Branzanti 2013. mara.branzanti(at)gmail.com * \author Javier Arribas, 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "galileo_navigation_message.h" #include // for boost::crc_basic, boost::crc_optimal #include #include #include typedef boost::crc_optimal<24, 0x1864CFBu, 0x0, 0x0, false, false> CRC_Galileo_INAV_type; void Galileo_Navigation_Message::reset() { flag_even_word = 0; Page_type_time_stamp = 0; flag_CRC_test = false; flag_all_ephemeris = false; // flag indicating that all words containing ephemeris have been received flag_ephemeris_1 = false; // flag indicating that ephemeris 1/4 (word 1) have been received flag_ephemeris_2 = false; // flag indicating that ephemeris 2/4 (word 2) have been received flag_ephemeris_3 = false; // flag indicating that ephemeris 3/4 (word 3) have been received flag_ephemeris_4 = false; // flag indicating that ephemeris 4/4 (word 4) have been received flag_iono_and_GST = false; // flag indicating that ionospheric parameters (word 5) have been received flag_utc_model = false; // flag indicating that utc model parameters (word 6) have been received flag_all_almanac = false; // flag indicating that all almanac have been received flag_almanac_1 = false; // flag indicating that almanac 1/4 (word 7) have been received flag_almanac_2 = false; // flag indicating that almanac 2/4 (word 8) have been received flag_almanac_3 = false; // flag indicating that almanac 3/4 (word 9) have been received flag_almanac_4 = false; // flag indicating that almanac 4/4 (word 10) have been received flag_TOW_5 = 0; flag_TOW_set = false; flag_GGTO = false; flag_GGTO_1 = false; flag_GGTO_2 = false; flag_GGTO_3 = false; flag_GGTO_4 = false; IOD_ephemeris = 0; /*Word type 1: Ephemeris (1/4)*/ IOD_nav_1 = 0; t0e_1 = 0; M0_1 = 0; e_1 = 0; A_1 = 0; /*Word type 2: Ephemeris (2/4)*/ IOD_nav_2 = 0; // IOD_nav page 2 OMEGA_0_2 = 0; // Longitude of ascending node of orbital plane at weekly epoch [semi-circles] i_0_2 = 0; // Inclination angle at reference time [semi-circles] omega_2 = 0; // Argument of perigee [semi-circles] iDot_2 = 0; // Rate of inclination angle [semi-circles/sec] /*Word type 3: Ephemeris (3/4) and SISA*/ IOD_nav_3 = 0; // OMEGA_dot_3 = 0; // Rate of right ascension [semi-circles/sec] delta_n_3 = 0; // Mean motion difference from computed value [semi-circles/sec] C_uc_3 = 0; // Amplitude of the cosine harmonic correction term to the argument of latitude [radians] C_us_3 = 0; // Amplitude of the sine harmonic correction term to the argument of latitude [radians] C_rc_3 = 0; // Amplitude of the cosine harmonic correction term to the orbit radius [meters] C_rs_3 = 0; // Amplitude of the sine harmonic correction term to the orbit radius [meters] SISA_3 = 0; // /*Word type 4: Ephemeris (4/4) and Clock correction parameters*/ IOD_nav_4 = 0; // SV_ID_PRN_4 = 0; // C_ic_4 = 0; // Amplitude of the cosine harmonic correction term to the angle of inclination [radians] C_is_4 = 0; // Amplitude of the sine harmonic correction term to the angle of inclination [radians] /*Clock correction parameters*/ t0c_4 = 0; // af0_4 = 0; // af1_4 = 0; // af2_4 = 0; // spare_4 = 0; /*Word type 5: Ionospheric correction, BGD, signal health and data validity status and GST*/ /*Ionospheric correction*/ /*Az*/ ai0_5 = 0; // ai1_5 = 0; // ai2_5 = 0; // /*Ionospheric disturbance flag*/ Region1_flag_5 = 0; // Region1_flag_5; Region2_flag_5 = 0; // Region3_flag_5 = 0; // Region4_flag_5 = 0; // Region5_flag_5 = 0; // BGD_E1E5a_5 = 0; // BGD_E1E5b_5 = 0; // E5b_HS_5 = 0; E1B_HS_5 = 0; E5b_DVS_5 = 0; // E1B_DVS_5 = 0; // /*GST*/ WN_5 = 0; TOW_5 = 0; spare_5 = 0; /*Word type 6: GST-UTC conversion parameters*/ A0_6 = 0; A1_6 = 0; Delta_tLS_6 = 0; t0t_6 = 0; WNot_6 = 0; WN_LSF_6 = 0; DN_6 = 0; Delta_tLSF_6 = 0; TOW_6 = 0; /*Word type 7: Almanac for SVID1 (1/2), almanac reference time and almanac reference week number*/ IOD_a_7 = 0; WN_a_7 = 0; t0a_7 = 0; SVID1_7 = 0; DELTA_A_7 = 0; e_7 = 0; omega_7 = 0; delta_i_7 = 0; Omega0_7 = 0; Omega_dot_7 = 0; M0_7 = 0; /*Word type 8: Almanac for SVID1 (2/2) and SVID2 (1/2)*/ IOD_a_8 = 0; af0_8 = 0; af1_8 = 0; E5b_HS_8 = 0; E1B_HS_8 = 0; SVID2_8 = 0; DELTA_A_8 = 0; e_8 = 0; omega_8 = 0; delta_i_8 = 0; Omega0_8 = 0; Omega_dot_8 = 0; /*Word type 9: Almanac for SVID2 (2/2) and SVID3 (1/2)*/ IOD_a_9 = 0; WN_a_9 = 0; t0a_9 = 0; M0_9 = 0; af0_9 = 0; af1_9 = 0; E5b_HS_9 = 0; E1B_HS_9 = 0; SVID3_9 = 0; DELTA_A_9 = 0; e_9 = 0; omega_9 = 0; delta_i_9 = 0; /*Word type 10: Almanac for SVID3 (2/2) and GST-GPS conversion parameters*/ IOD_a_10 = 0; Omega0_10 = 0; Omega_dot_10 = 0; M0_10 = 0; af0_10 = 0; af1_10 = 0; E5b_HS_10 = 0; E1B_HS_10 = 0; //GST-GPS A_0G_10 = 0; A_1G_10 = 0; t_0G_10 = 0; WN_0G_10 = 0; /*Word type 0: I/NAV Spare Word*/ Time_0 = 0; WN_0 = 0; TOW_0 = 0; flag_TOW_6 = false; Galileo_satClkDrift = 0.0; Galileo_dtr = 0.0; // satellite positions galileo_satpos_X = 0.0; galileo_satpos_Y = 0.0; galileo_satpos_Z = 0.0; // Satellite velocity galileo_satvel_X = 0.0; galileo_satvel_Y = 0.0; galileo_satvel_Z = 0.0; } Galileo_Navigation_Message::Galileo_Navigation_Message() { reset(); } bool Galileo_Navigation_Message::CRC_test(std::bitset bits,boost::uint32_t checksum) { CRC_Galileo_INAV_type CRC_Galileo; boost::uint32_t crc_computed; // Galileo INAV frame for CRC is not an integer multiple of bytes // it needs to be filled with zeroes at the start of the frame. // This operation is done in the transformation from bits to bytes // using boost::dynamic_bitset. // ToDo: Use boost::dynamic_bitset for all the bitset operations in this class boost::dynamic_bitset frame_bits(std::string(bits.to_string())); std::vector bytes; boost::to_block_range(frame_bits, std::back_inserter(bytes)); std::reverse(bytes.begin(),bytes.end()); CRC_Galileo.process_bytes( bytes.data(), GALILEO_DATA_FRAME_BYTES ); crc_computed = CRC_Galileo.checksum(); if (checksum == crc_computed) { return true; } else { return false; } } unsigned long int Galileo_Navigation_Message::read_navigation_unsigned(std::bitset bits, const std::vector > parameter) { unsigned long int value = 0; int num_of_slices = parameter.size(); for (int i = 0; i < num_of_slices; i++) { for (int j = 0; j < parameter[i].second; j++) { value <<= 1; //shift left if (bits[GALILEO_DATA_JK_BITS - parameter[i].first - j] == 1) { value += 1; // insert the bit } } } return value; } unsigned long int Galileo_Navigation_Message::read_page_type_unsigned(std::bitset bits, const std::vector > parameter) { unsigned long int value = 0; int num_of_slices = parameter.size(); for (int i = 0; i < num_of_slices; i++) { for (int j = 0; j < parameter[i].second; j++) { value <<= 1; //shift left if (bits[GALILEO_PAGE_TYPE_BITS - parameter[i].first - j] == 1) { value += 1; // insert the bit } } } return value; } signed long int Galileo_Navigation_Message::read_navigation_signed(std::bitset bits, const std::vector > parameter) { signed long int value = 0; int num_of_slices = parameter.size(); // Discriminate between 64 bits and 32 bits compiler int long_int_size_bytes = sizeof(signed long int); if (long_int_size_bytes == 8) // if a long int takes 8 bytes, we are in a 64 bits system { // read the MSB and perform the sign extension if (bits[GALILEO_DATA_JK_BITS - parameter[0].first] == 1) { value ^= 0xFFFFFFFFFFFFFFFF; //64 bits variable } else { value &= 0; } for (int i = 0; i < num_of_slices; i++) { for (int j = 0; j < parameter[i].second; j++) { value <<= 1; //shift left value &= 0xFFFFFFFFFFFFFFFE; //reset the corresponding bit (for the 64 bits variable) if (bits[GALILEO_DATA_JK_BITS - parameter[i].first - j] == 1) { value += 1; // insert the bit } } } } else // we assume we are in a 32 bits system { // read the MSB and perform the sign extension if (bits[GALILEO_DATA_JK_BITS - parameter[0].first] == 1) { value ^= 0xFFFFFFFF; } else { value &= 0; } for (int i = 0; i < num_of_slices; i++) { for (int j = 0; j < parameter[i].second; j++) { value <<= 1; //shift left value &= 0xFFFFFFFE; //reset the corresponding bit if (bits[GALILEO_DATA_JK_BITS - parameter[i].first - j] == 1) { value += 1; // insert the bit } } } } return value; } bool Galileo_Navigation_Message::read_navigation_bool(std::bitset bits, const std::vector > parameter) { bool value; if (bits[GALILEO_DATA_JK_BITS - parameter[0].first] == 1) { value = true; } else { value = false; } return value; } void Galileo_Navigation_Message::split_page(std::string page_string, int flag_even_word) { // ToDo: Clean all the tests and create an independent google test code for the telemetry decoder. //char correct_tail[7]="011110"; //the viterbi decoder output change the tail to this value (why?) //char correct_tail[7]="000000"; int Page_type = 0; //std::cout << "Start decoding Galileo I/NAV " << std::endl; if(page_string.at(0) == '1')// if page is odd { //std::cout<< "page_string.at(0) split page="< TLM_word_for_CRC_bits(TLM_word_for_CRC); std::bitset<24> checksum(CRC_data); //if (Tail_odd.compare(correct_tail) != 0) // std::cout << "Tail odd is not correct!" << std::endl; //else std::cout<<"Tail odd is correct!"< page_type_bits (page_number_bits); // from string to bitset Page_type = static_cast(read_page_type_unsigned(page_type_bits, type)); Page_type_time_stamp = Page_type; std::string Data_jk_ephemeris = Data_k + Data_j; page_jk_decoder(Data_jk_ephemeris.c_str()); } else { // Wrong CRC... discard frame flag_CRC_test = false; } } // end of CRC checksum control } // end if (page_string.at(0)=='1') else { page_Even = page_string.substr (0,114); std::string tail_Even = page_string.substr (114,6); //std::cout << "tail_even_string: " << tail_Even < data_jk_bits (data_jk_string); //DLOG(INFO) << "Data_jk_bits (bitset) "<< endl << data_jk_bits << endl; page_number = static_cast(read_navigation_unsigned(data_jk_bits, PAGE_TYPE_bit)); LOG(INFO) << "Page number = " << page_number; switch (page_number) { case 1: /*Word type 1: Ephemeris (1/4)*/ IOD_nav_1 = static_cast(read_navigation_unsigned(data_jk_bits, IOD_nav_1_bit)); DLOG(INFO) << "IOD_nav_1= " << IOD_nav_1; t0e_1 = static_cast(read_navigation_unsigned(data_jk_bits, T0E_1_bit)); t0e_1 = t0e_1 * t0e_1_LSB; DLOG(INFO) << "t0e_1= " << t0e_1; M0_1 = static_cast(read_navigation_signed(data_jk_bits, M0_1_bit)); M0_1 = M0_1 * M0_1_LSB; DLOG(INFO) << "M0_1= " << M0_1; e_1 = static_cast(read_navigation_unsigned(data_jk_bits, e_1_bit)); e_1 = e_1 * e_1_LSB; DLOG(INFO) << "e_1= " << e_1; A_1 = static_cast(read_navigation_unsigned(data_jk_bits, A_1_bit)); A_1 = A_1 * A_1_LSB_gal; DLOG(INFO) << "A_1= " << A_1; flag_ephemeris_1 = true; DLOG(INFO) << "flag_tow_set" << flag_TOW_set; break; case 2: /*Word type 2: Ephemeris (2/4)*/ IOD_nav_2 = static_cast(read_navigation_unsigned(data_jk_bits, IOD_nav_2_bit)); DLOG(INFO) << "IOD_nav_2= " << IOD_nav_2; OMEGA_0_2 = static_cast(read_navigation_signed(data_jk_bits, OMEGA_0_2_bit)); OMEGA_0_2 = OMEGA_0_2 * OMEGA_0_2_LSB; DLOG(INFO) << "OMEGA_0_2= " << OMEGA_0_2 ; i_0_2 = static_cast(read_navigation_signed(data_jk_bits, i_0_2_bit)); i_0_2 = i_0_2 * i_0_2_LSB; DLOG(INFO) << "i_0_2= " << i_0_2 ; omega_2 = static_cast(read_navigation_signed(data_jk_bits, omega_2_bit)); omega_2 = omega_2 * omega_2_LSB; DLOG(INFO) << "omega_2= " << omega_2; iDot_2 = static_cast(read_navigation_signed(data_jk_bits, iDot_2_bit)); iDot_2 = iDot_2 * iDot_2_LSB; DLOG(INFO) << "iDot_2= " << iDot_2; flag_ephemeris_2 = true; DLOG(INFO) << "flag_tow_set" << flag_TOW_set; break; case 3: /*Word type 3: Ephemeris (3/4) and SISA*/ IOD_nav_3 = static_cast(read_navigation_unsigned(data_jk_bits, IOD_nav_3_bit)); DLOG(INFO) << "IOD_nav_3= " << IOD_nav_3 ; OMEGA_dot_3 = static_cast(read_navigation_signed(data_jk_bits, OMEGA_dot_3_bit)); OMEGA_dot_3 = OMEGA_dot_3 * OMEGA_dot_3_LSB; DLOG(INFO) <<"OMEGA_dot_3= " << OMEGA_dot_3 ; delta_n_3 = static_cast(read_navigation_signed(data_jk_bits, delta_n_3_bit)); delta_n_3 = delta_n_3 * delta_n_3_LSB; DLOG(INFO) << "delta_n_3= " << delta_n_3 ; C_uc_3 = static_cast(read_navigation_signed(data_jk_bits, C_uc_3_bit)); C_uc_3 = C_uc_3 * C_uc_3_LSB; DLOG(INFO) << "C_uc_3= " << C_uc_3; C_us_3 = static_cast(read_navigation_signed(data_jk_bits, C_us_3_bit)); C_us_3 = C_us_3 * C_us_3_LSB; DLOG(INFO) << "C_us_3= " << C_us_3; C_rc_3 = static_cast(read_navigation_signed(data_jk_bits, C_rc_3_bit)); C_rc_3 = C_rc_3 * C_rc_3_LSB; DLOG(INFO) << "C_rc_3= " << C_rc_3; C_rs_3 = static_cast(read_navigation_signed(data_jk_bits, C_rs_3_bit)); C_rs_3 = C_rs_3 * C_rs_3_LSB; DLOG(INFO) << "C_rs_3= " << C_rs_3; SISA_3 = static_cast(read_navigation_unsigned(data_jk_bits, SISA_3_bit)); DLOG(INFO) << "SISA_3= " << SISA_3; flag_ephemeris_3 = true; DLOG(INFO) << "flag_tow_set" << flag_TOW_set; break; case 4: /* Word type 4: Ephemeris (4/4) and Clock correction parameters*/ IOD_nav_4 = static_cast(read_navigation_unsigned(data_jk_bits, IOD_nav_4_bit)); DLOG(INFO) << "IOD_nav_4= " << IOD_nav_4 ; SV_ID_PRN_4 = static_cast(read_navigation_unsigned(data_jk_bits, SV_ID_PRN_4_bit)); DLOG(INFO) << "SV_ID_PRN_4= " << SV_ID_PRN_4 ; C_ic_4 = static_cast(read_navigation_signed(data_jk_bits, C_ic_4_bit)); C_ic_4 = C_ic_4 * C_ic_4_LSB; DLOG(INFO) << "C_ic_4= " << C_ic_4; C_is_4 = static_cast(read_navigation_signed(data_jk_bits, C_is_4_bit)); C_is_4 = C_is_4 * C_is_4_LSB; DLOG(INFO) << "C_is_4= " << C_is_4; /*Clock correction parameters*/ t0c_4 = static_cast(read_navigation_unsigned(data_jk_bits, t0c_4_bit)); t0c_4 = t0c_4 * t0c_4_LSB; DLOG(INFO) << "t0c_4= " << t0c_4; af0_4 = static_cast(read_navigation_signed(data_jk_bits, af0_4_bit)); af0_4 = af0_4 * af0_4_LSB; DLOG(INFO) << "af0_4 = " << af0_4; af1_4 = static_cast(read_navigation_signed(data_jk_bits, af1_4_bit)); af1_4 = af1_4 * af1_4_LSB; DLOG(INFO) << "af1_4 = " << af1_4; af2_4 = static_cast(read_navigation_signed(data_jk_bits, af2_4_bit)); af2_4 = af2_4 * af2_4_LSB; DLOG(INFO) << "af2_4 = " << af2_4; spare_4 = static_cast(read_navigation_unsigned(data_jk_bits, spare_4_bit)); DLOG(INFO) << "spare_4 = " << spare_4; flag_ephemeris_4 = true; DLOG(INFO) << "flag_tow_set" << flag_TOW_set; break; case 5: /*Word type 5: Ionospheric correction, BGD, signal health and data validity status and GST*/ /*Ionospheric correction*/ /*Az*/ ai0_5 = static_cast(read_navigation_unsigned(data_jk_bits, ai0_5_bit)); ai0_5 = ai0_5 * ai0_5_LSB; DLOG(INFO) << "ai0_5= " << ai0_5; ai1_5 = static_cast(read_navigation_signed(data_jk_bits, ai1_5_bit)); ai1_5 = ai1_5 * ai1_5_LSB; DLOG(INFO) << "ai1_5= " << ai1_5; ai2_5 = static_cast(read_navigation_signed(data_jk_bits, ai2_5_bit)); ai2_5 = ai2_5 * ai2_5_LSB; DLOG(INFO) << "ai2_5= " << ai2_5; /*Ionospheric disturbance flag*/ Region1_flag_5 = static_cast(read_navigation_bool(data_jk_bits, Region1_5_bit)); DLOG(INFO) << "Region1_flag_5= " << Region1_flag_5; Region2_flag_5 = static_cast(read_navigation_bool(data_jk_bits, Region2_5_bit)); DLOG(INFO) << "Region2_flag_5= " << Region2_flag_5; Region3_flag_5 = static_cast(read_navigation_bool(data_jk_bits, Region3_5_bit)); DLOG(INFO) << "Region3_flag_5= " << Region3_flag_5; Region4_flag_5 = static_cast(read_navigation_bool(data_jk_bits, Region4_5_bit)); DLOG(INFO) << "Region4_flag_5= " << Region4_flag_5; Region5_flag_5 = static_cast(read_navigation_bool(data_jk_bits, Region5_5_bit)); DLOG(INFO) << "Region5_flag_5= " << Region5_flag_5; BGD_E1E5a_5 = static_cast(read_navigation_signed(data_jk_bits, BGD_E1E5a_5_bit)); BGD_E1E5a_5 = BGD_E1E5a_5 * BGD_E1E5a_5_LSB; DLOG(INFO) << "BGD_E1E5a_5= " << BGD_E1E5a_5; BGD_E1E5b_5 = static_cast(read_navigation_signed(data_jk_bits, BGD_E1E5b_5_bit)); BGD_E1E5b_5 = BGD_E1E5b_5 * BGD_E1E5b_5_LSB; DLOG(INFO) << "BGD_E1E5b_5= " << BGD_E1E5b_5; E5b_HS_5 = static_cast(read_navigation_unsigned(data_jk_bits, E5b_HS_5_bit)); DLOG(INFO) << "E5b_HS_5= " << E5b_HS_5; E1B_HS_5 = static_cast(read_navigation_unsigned(data_jk_bits, E1B_HS_5_bit)); DLOG(INFO) << "E1B_HS_5= " << E1B_HS_5; E5b_DVS_5 = static_cast(read_navigation_unsigned(data_jk_bits, E5b_DVS_5_bit)); DLOG(INFO) << "E5b_DVS_5= " << E5b_DVS_5; E1B_DVS_5 = static_cast(read_navigation_unsigned(data_jk_bits, E1B_DVS_5_bit)); DLOG(INFO) << "E1B_DVS_5= " << E1B_DVS_5; /*GST*/ WN_5 = static_cast(read_navigation_unsigned(data_jk_bits, WN_5_bit)); DLOG(INFO) << "WN_5= " << WN_5; TOW_5 = static_cast(read_navigation_unsigned(data_jk_bits, TOW_5_bit)); DLOG(INFO) << "TOW_5= " << TOW_5; flag_TOW_5 = true; //set to false externally spare_5 = static_cast(read_navigation_unsigned(data_jk_bits, spare_5_bit)); DLOG(INFO) << "spare_5= " << spare_5; flag_iono_and_GST = true; //set to false externally flag_TOW_set = true; //set to false externally DLOG(INFO) << "flag_tow_set" << flag_TOW_set; break; case 6: /*Word type 6: GST-UTC conversion parameters*/ A0_6 = static_cast(read_navigation_signed(data_jk_bits, A0_6_bit)); A0_6 = A0_6 * A0_6_LSB; DLOG(INFO) << "A0_6= " << A0_6; A1_6 = static_cast(read_navigation_signed(data_jk_bits, A1_6_bit)); A1_6 = A1_6 * A1_6_LSB; DLOG(INFO) << "A1_6= " << A1_6; Delta_tLS_6 = static_cast(read_navigation_signed(data_jk_bits, Delta_tLS_6_bit)); DLOG(INFO) << "Delta_tLS_6= " << Delta_tLS_6; t0t_6 = static_cast(read_navigation_unsigned(data_jk_bits, t0t_6_bit)); t0t_6 = t0t_6 * t0t_6_LSB; DLOG(INFO) << "t0t_6= " << t0t_6; WNot_6 = static_cast(read_navigation_unsigned(data_jk_bits, WNot_6_bit)); DLOG(INFO) << "WNot_6= " << WNot_6; WN_LSF_6 = static_cast(read_navigation_unsigned(data_jk_bits, WN_LSF_6_bit)); DLOG(INFO) << "WN_LSF_6= " << WN_LSF_6; DN_6 = static_cast(read_navigation_unsigned(data_jk_bits, DN_6_bit)); DLOG(INFO) << "DN_6= " << DN_6; Delta_tLSF_6 = static_cast(read_navigation_signed(data_jk_bits, Delta_tLSF_6_bit)); DLOG(INFO) << "Delta_tLSF_6= " << Delta_tLSF_6; TOW_6 = static_cast(read_navigation_unsigned(data_jk_bits, TOW_6_bit)); DLOG(INFO) << "TOW_6= " << TOW_6; flag_TOW_6 = true; //set to false externally flag_utc_model = true; //set to false externally flag_TOW_set = true; //set to false externally DLOG(INFO) << "flag_tow_set" << flag_TOW_set; break; case 7: /*Word type 7: Almanac for SVID1 (1/2), almanac reference time and almanac reference week number*/ IOD_a_7 = static_cast(read_navigation_unsigned(data_jk_bits, IOD_a_7_bit)); DLOG(INFO) << "IOD_a_7= " << IOD_a_7; WN_a_7 = static_cast(read_navigation_unsigned(data_jk_bits, WN_a_7_bit)); DLOG(INFO) << "WN_a_7= " << WN_a_7; t0a_7 = static_cast(read_navigation_unsigned(data_jk_bits, t0a_7_bit)); t0a_7 = t0a_7 * t0a_7_LSB; DLOG(INFO) << "t0a_7= " << t0a_7; SVID1_7 = static_cast(read_navigation_unsigned(data_jk_bits, SVID1_7_bit)); DLOG(INFO) << "SVID1_7= " << SVID1_7; DELTA_A_7 = static_cast(read_navigation_signed(data_jk_bits, DELTA_A_7_bit)); DELTA_A_7 = DELTA_A_7 * DELTA_A_7_LSB; DLOG(INFO) << "DELTA_A_7= " << DELTA_A_7; e_7 = static_cast(read_navigation_unsigned(data_jk_bits, e_7_bit)); e_7 = e_7 * e_7_LSB; DLOG(INFO) << "e_7= " << e_7; omega_7 = static_cast(read_navigation_signed(data_jk_bits, omega_7_bit)); omega_7 = omega_7 * omega_7_LSB; DLOG(INFO) << "omega_7= " << omega_7; delta_i_7 = static_cast(read_navigation_signed(data_jk_bits, delta_i_7_bit)); delta_i_7 = delta_i_7 * delta_i_7_LSB; DLOG(INFO) << "delta_i_7= " << delta_i_7; Omega0_7 = static_cast(read_navigation_signed(data_jk_bits, Omega0_7_bit)); Omega0_7 = Omega0_7 * Omega0_7_LSB; DLOG(INFO) << "Omega0_7= " << Omega0_7; Omega_dot_7 = static_cast(read_navigation_signed(data_jk_bits, Omega_dot_7_bit)); Omega_dot_7 = Omega_dot_7 * Omega_dot_7_LSB; DLOG(INFO) << "Omega_dot_7= " << Omega_dot_7; M0_7 = static_cast(read_navigation_signed(data_jk_bits, M0_7_bit)); M0_7 = M0_7 * M0_7_LSB; DLOG(INFO) << "M0_7= " << M0_7; flag_almanac_1 = true; DLOG(INFO) << "flag_tow_set"<< flag_TOW_set; break; case 8: /*Word type 8: Almanac for SVID1 (2/2) and SVID2 (1/2)*/ IOD_a_8 = static_cast(read_navigation_unsigned(data_jk_bits, IOD_a_8_bit)); DLOG(INFO) << "IOD_a_8= " << IOD_a_8; af0_8 = static_cast(read_navigation_signed(data_jk_bits, af0_8_bit)); af0_8 = af0_8 * af0_8_LSB; DLOG(INFO) << "af0_8= " << af0_8; af1_8 = static_cast(read_navigation_signed(data_jk_bits, af1_8_bit)); af1_8 = af1_8 * af1_8_LSB; DLOG(INFO) << "af1_8= " << af1_8; E5b_HS_8 = static_cast(read_navigation_unsigned(data_jk_bits, E5b_HS_8_bit)); DLOG(INFO) << "E5b_HS_8= " << E5b_HS_8; E1B_HS_8 = static_cast(read_navigation_unsigned(data_jk_bits, E1B_HS_8_bit)); DLOG(INFO) << "E1B_HS_8= " << E1B_HS_8; SVID2_8 = static_cast(read_navigation_unsigned(data_jk_bits, SVID2_8_bit)); DLOG(INFO) << "SVID2_8= " << SVID2_8; DELTA_A_8 = static_cast(read_navigation_signed(data_jk_bits, DELTA_A_8_bit)); DELTA_A_8 = DELTA_A_8 * DELTA_A_8_LSB; DLOG(INFO) << "DELTA_A_8= " << DELTA_A_8; e_8 = static_cast(read_navigation_unsigned(data_jk_bits, e_8_bit)); e_8 = e_8 * e_8_LSB; DLOG(INFO) << "e_8= " << e_8; omega_8 = static_cast(read_navigation_signed(data_jk_bits, omega_8_bit)); omega_8 = omega_8 * omega_8_LSB; DLOG(INFO) << "omega_8= " << omega_8; delta_i_8 = static_cast(read_navigation_signed(data_jk_bits, delta_i_8_bit)); delta_i_8 = delta_i_8 * delta_i_8_LSB; DLOG(INFO) << "delta_i_8= " << delta_i_8; Omega0_8 = static_cast(read_navigation_signed(data_jk_bits, Omega0_8_bit)); Omega0_8 = Omega0_8 * Omega0_8_LSB; DLOG(INFO) << "Omega0_8= " << Omega0_8; Omega_dot_8 = static_cast(read_navigation_signed(data_jk_bits, Omega_dot_8_bit)); Omega_dot_8 = Omega_dot_8 * Omega_dot_8_LSB; DLOG(INFO) << "Omega_dot_8= " << Omega_dot_8; flag_almanac_2 = true; DLOG(INFO) << "flag_tow_set" << flag_TOW_set; break; case 9: /*Word type 9: Almanac for SVID2 (2/2) and SVID3 (1/2)*/ IOD_a_9 = static_cast(read_navigation_unsigned(data_jk_bits, IOD_a_9_bit)); DLOG(INFO) << "IOD_a_9= " << IOD_a_9; WN_a_9 = static_cast(read_navigation_unsigned(data_jk_bits, WN_a_9_bit)); DLOG(INFO) << "WN_a_9= " << WN_a_9; t0a_9 = static_cast(read_navigation_unsigned(data_jk_bits, t0a_9_bit)); t0a_9 = t0a_9 * t0a_9_LSB; DLOG(INFO) << "t0a_9= " << t0a_9; M0_9 = static_cast(read_navigation_signed(data_jk_bits, M0_9_bit)); M0_9 = M0_9 * M0_9_LSB; DLOG(INFO) << "M0_9= " << M0_9; af0_9 = static_cast(read_navigation_signed(data_jk_bits, af0_9_bit)); af0_9 = af0_9 * af0_9_LSB; DLOG(INFO) << "af0_9= " << af0_9; af1_9 = static_cast(read_navigation_signed(data_jk_bits, af1_9_bit)); af1_9 = af1_9 * af1_9_LSB; DLOG(INFO) << "af1_9= " << af1_9; E5b_HS_9 = static_cast(read_navigation_unsigned(data_jk_bits, E5b_HS_9_bit)); DLOG(INFO) << "E5b_HS_9= " << E5b_HS_9; E1B_HS_9 = static_cast(read_navigation_unsigned(data_jk_bits, E1B_HS_9_bit)); DLOG(INFO) << "E1B_HS_9= " << E1B_HS_9; SVID3_9 = static_cast(read_navigation_unsigned(data_jk_bits, SVID3_9_bit)); DLOG(INFO) << "SVID3_9= " << SVID3_9; DELTA_A_9 = static_cast(read_navigation_signed(data_jk_bits, DELTA_A_9_bit)); DELTA_A_9 = DELTA_A_9 * DELTA_A_9_LSB; DLOG(INFO) << "DELTA_A_9= " << DELTA_A_9; e_9 = static_cast(read_navigation_unsigned(data_jk_bits, e_9_bit)); e_9 = e_9 * e_9_LSB; DLOG(INFO) << "e_9= " << e_9; omega_9 = static_cast(read_navigation_signed(data_jk_bits, omega_9_bit)); omega_9 = omega_9 * omega_9_LSB; DLOG(INFO) << "omega_9= " << omega_9; delta_i_9 = static_cast(read_navigation_signed(data_jk_bits, delta_i_9_bit)); delta_i_9 = delta_i_9 * delta_i_9_LSB; DLOG(INFO) << "delta_i_9= " << delta_i_9; flag_almanac_3 = true; DLOG(INFO) << "flag_tow_set" << flag_TOW_set; break; case 10: /*Word type 10: Almanac for SVID3 (2/2) and GST-GPS conversion parameters*/ IOD_a_10 = static_cast(read_navigation_unsigned(data_jk_bits, IOD_a_10_bit)); DLOG(INFO) << "IOD_a_10= " << IOD_a_10; Omega0_10 = static_cast(read_navigation_signed(data_jk_bits, Omega0_10_bit)); Omega0_10 = Omega0_10 * Omega0_10_LSB; DLOG(INFO) << "Omega0_10= " << Omega0_10; Omega_dot_10 = static_cast(read_navigation_signed(data_jk_bits, Omega_dot_10_bit)); Omega_dot_10 = Omega_dot_10 * Omega_dot_10_LSB; DLOG(INFO) << "Omega_dot_10= " << Omega_dot_10 ; M0_10 = static_cast(read_navigation_signed(data_jk_bits, M0_10_bit)); M0_10 = M0_10 * M0_10_LSB; DLOG(INFO) << "M0_10= " << M0_10; af0_10 = static_cast(read_navigation_signed(data_jk_bits, af0_10_bit)); af0_10 = af0_10 * af0_10_LSB; DLOG(INFO) << "af0_10= " << af0_10; af1_10 = static_cast(read_navigation_signed(data_jk_bits, af1_10_bit)); af1_10 = af1_10 * af1_10_LSB; DLOG(INFO) << "af1_10= " << af1_10; E5b_HS_10 = static_cast(read_navigation_unsigned(data_jk_bits, E5b_HS_10_bit)); DLOG(INFO) << "E5b_HS_10= " << E5b_HS_10; E1B_HS_10 = static_cast(read_navigation_unsigned(data_jk_bits, E1B_HS_10_bit)); DLOG(INFO) << "E1B_HS_10= " << E1B_HS_10; A_0G_10 = static_cast(read_navigation_signed(data_jk_bits, A_0G_10_bit)); A_0G_10 = A_0G_10 * A_0G_10_LSB; flag_GGTO_1=true; DLOG(INFO) << "A_0G_10= " << A_0G_10; A_1G_10 = static_cast(read_navigation_signed(data_jk_bits, A_1G_10_bit)); A_1G_10 = A_1G_10 * A_1G_10_LSB; flag_GGTO_2=true; DLOG(INFO) << "A_1G_10= " << A_1G_10; t_0G_10 = static_cast(read_navigation_unsigned(data_jk_bits, t_0G_10_bit)); t_0G_10 = t_0G_10 * t_0G_10_LSB; flag_GGTO_3=true; DLOG(INFO) << "t_0G_10= " << t_0G_10; WN_0G_10 = static_cast(read_navigation_unsigned(data_jk_bits, WN_0G_10_bit)); flag_GGTO_4=true; DLOG(INFO) << "WN_0G_10= " << WN_0G_10; flag_almanac_4 = true; DLOG(INFO) << "flag_tow_set" << flag_TOW_set; break; case 0: /*Word type 0: I/NAV Spare Word*/ Time_0 = static_cast(read_navigation_unsigned(data_jk_bits, Time_0_bit)); DLOG(INFO) << "Time_0= " << Time_0; WN_0 = static_cast(read_navigation_unsigned(data_jk_bits, WN_0_bit)); DLOG(INFO) << "WN_0= " << WN_0; TOW_0 = static_cast(read_navigation_unsigned(data_jk_bits, TOW_0_bit)); DLOG(INFO) << "TOW_0= " << TOW_0; DLOG(INFO) << "flag_tow_set" << flag_TOW_set; break; } return page_number; } gnss-sdr-0.0.9/src/core/system_parameters/galileo_navigation_message.h000066400000000000000000000303041305042567700262670ustar00rootroot00000000000000/*! * \file galileo_navigation_message.h * \brief Implementation of a Galileo I/NAV Data message * as described in Galileo OS SIS ICD Issue 1.2 (Nov. 2015) * \author Mara Branzanti 2013. mara.branzanti(at)gmail.com * \author Javier Arribas, 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_NAVIGATION_MESSAGE_H_ #define GNSS_SDR_GALILEO_NAVIGATION_MESSAGE_H_ #include #include #include #include #include #include // for boost::uint32_t #include "galileo_ephemeris.h" #include "galileo_iono.h" #include "galileo_almanac.h" #include "galileo_utc_model.h" #include "Galileo_E1.h" /*! * \brief This class handles the Galileo I/NAV Data message, as described in the * Galileo Open Service Signal in Space Interface Control Document (OS SIS ICD), Issue 1.2 (Nov 2015). * See https://www.gsc-europa.eu/system/files/galileo_documents/Galileo_OS_SIS_ICD.pdf */ class Galileo_Navigation_Message { private: bool CRC_test(std::bitset bits, boost::uint32_t checksum); bool read_navigation_bool(std::bitset bits, const std::vector > parameter); //void print_galileo_word_bytes(unsigned int GPS_word); unsigned long int read_navigation_unsigned(std::bitset bits, const std::vector< std::pair > parameter); unsigned long int read_page_type_unsigned(std::bitset bits, const std::vector< std::pair > parameter); signed long int read_navigation_signed(std::bitset bits, const std::vector > parameter); public: int Page_type_time_stamp; int flag_even_word; std::string page_Even; bool flag_CRC_test; bool flag_all_ephemeris; //!< Flag indicating that all words containing ephemeris have been received bool flag_ephemeris_1; //!< Flag indicating that ephemeris 1/4 (word 1) have been received bool flag_ephemeris_2; //!< Flag indicating that ephemeris 2/4 (word 2) have been received bool flag_ephemeris_3; //!< Flag indicating that ephemeris 3/4 (word 3) have been received bool flag_ephemeris_4; //!< Flag indicating that ephemeris 4/4 (word 4) have been received bool flag_iono_and_GST; //!< Flag indicating that ionospheric and GST parameters (word 5) have been received bool flag_TOW_5; bool flag_TOW_6; bool flag_TOW_set; //!< it is true when page 5 or page 6 arrives bool flag_utc_model; //!< Flag indicating that utc model parameters (word 6) have been received bool flag_all_almanac; //!< Flag indicating that all almanac have been received bool flag_almanac_1; //!< Flag indicating that almanac 1/4 (word 7) have been received bool flag_almanac_2; //!< Flag indicating that almanac 2/4 (word 8) have been received bool flag_almanac_3; //!< Flag indicating that almanac 3/4 (word 9) have been received bool flag_almanac_4; //!< Flag indicating that almanac 4/4 (word 10) have been received int IOD_ephemeris; bool flag_GGTO; bool flag_GGTO_1; bool flag_GGTO_2; bool flag_GGTO_3; bool flag_GGTO_4; /*Word type 1: Ephemeris (1/4)*/ int IOD_nav_1; //!< IOD_nav page 1 double t0e_1; //!< Ephemeris reference time [s] double M0_1; //!< Mean anomaly at reference time [semi-circles] double e_1; //!< Eccentricity double A_1; //!< Square root of the semi-major axis [metres^1/2] /*Word type 2: Ephemeris (2/4)*/ int IOD_nav_2; //!< IOD_nav page 2 double OMEGA_0_2; //!< Longitude of ascending node of orbital plane at weekly epoch [semi-circles] double i_0_2; //!< Inclination angle at reference time [semi-circles] double omega_2; //!< Argument of perigee [semi-circles] double iDot_2; //!< Rate of inclination angle [semi-circles/sec] /*Word type 3: Ephemeris (3/4) and SISA*/ int IOD_nav_3; // double OMEGA_dot_3; //!< Rate of right ascension [semi-circles/sec] double delta_n_3; //!< Mean motion difference from computed value [semi-circles/sec] double C_uc_3; //!< Amplitude of the cosine harmonic correction term to the argument of latitude [radians] double C_us_3; //!< Amplitude of the sine harmonic correction term to the argument of latitude [radians] double C_rc_3; //!< Amplitude of the cosine harmonic correction term to the orbit radius [meters] double C_rs_3; //!< Amplitude of the sine harmonic correction term to the orbit radius [meters] double SISA_3; /*Word type 4: Ephemeris (4/4) and Clock correction parameters*/ int IOD_nav_4; // int SV_ID_PRN_4; // double C_ic_4; //!. * * ------------------------------------------------------------------------- */ #include "galileo_utc_model.h" #include Galileo_Utc_Model::Galileo_Utc_Model() { //valid = false; /*Word type 6: GST-UTC conversion parameters*/ A0_6 = 0; A1_6 = 0; Delta_tLS_6 = 0; t0t_6 = 0; WNot_6 = 0; WN_LSF_6 = 0; DN_6 = 0; Delta_tLSF_6 = 0; flag_utc_model = false; } double Galileo_Utc_Model::GST_to_UTC_time(double t_e, int WN) { double t_Utc; double t_Utc_daytime; double Delta_t_Utc = 0; // Determine if the effectivity time of the leap second event is in the past int weeksToLeapSecondEvent = WN_LSF_6 - (WN % 256); if ((weeksToLeapSecondEvent) >= 0) // is not in the past { //Detect if the effectivity time and user's time is within six hours = 6 * 60 *60 = 21600 s int secondOfLeapSecondEvent = DN_6 * 24 * 60 * 60; if (std::abs(t_e - secondOfLeapSecondEvent) > 21600) { /* 5.1.7a GST->UTC case a * Whenever the leap second adjusted time indicated by the WN_LSF and the DN values * is not in the past (relative to the user's present time), and the user's * present time does not fall in the time span which starts at six hours prior * to the effective time and ends at six hours after the effective time, * the GST/Utc relationship is given by */ Delta_t_Utc = Delta_tLS_6 + A0_6 + A1_6 * (t_e - t0t_6 + 604800 * static_cast((WN % 256) - WNot_6)); t_Utc_daytime = fmod(t_e - Delta_t_Utc, 86400); } else { /* 5.1.7b GST->UTC case b * Whenever the user's current time falls within the time span of six hours * prior to the leap second adjustment to six hours after the adjustment time, , * the effective time is computed according to the following equations: */ Delta_t_Utc = Delta_tLS_6 + A0_6 + A1_6 * (t_e - t0t_6 + 604800 * static_cast((WN % 256) - WNot_6)); double W = fmod(t_e - Delta_t_Utc - 43200, 86400) + 43200; t_Utc_daytime = fmod(W, 86400 + Delta_tLSF_6 - Delta_tLS_6); //implement something to handle a leap second event! } } else // the effectivity time is in the past { /* 5.1.7c GST->UTC case c * Whenever the leap second adjustment time, as indicated by the WN_LSF and DN values, * is in the past (relative to the user's current time) and the user's present time does not * fall in the time span which starts six hours prior to the leap second adjustment time and * ends six hours after the adjustment time, the effective time is computed according to * the following equation: */ Delta_t_Utc = Delta_tLSF_6 + A0_6 + A1_6 * (t_e - t0t_6 + 604800 * static_cast((WN % 256) - WNot_6)); t_Utc_daytime = fmod(t_e - Delta_t_Utc, 86400); } double secondsOfWeekBeforeToday = 86400 * floor(t_e / 86400); t_Utc = secondsOfWeekBeforeToday + t_Utc_daytime; return t_Utc; } gnss-sdr-0.0.9/src/core/system_parameters/galileo_utc_model.h000066400000000000000000000037071305042567700244060ustar00rootroot00000000000000/*! * \file galileo_utc_model.h * \brief Interface of a Galileo UTC MODEL storage * \author Javier Arribas, 2013. jarribas(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GALILEO_UTC_MODEL_H_ #define GNSS_SDR_GALILEO_UTC_MODEL_H_ /*! * \brief This class is a storage for the GALILEO UTC MODEL data as described in Galileo ICD * https://www.gsc-europa.eu/system/files/galileo_documents/Galileo_OS_SIS_ICD.pdf * paragraph 5.1.7 */ class Galileo_Utc_Model { public: /*Word type 6: GST-UTC conversion parameters*/ double A0_6; double A1_6; double Delta_tLS_6; double t0t_6; //!< UTC data reference Time of Week [s] double WNot_6; //!< UTC data reference Week number [week] double WN_LSF_6; double DN_6; double Delta_tLSF_6; bool flag_utc_model; //double TOW_6; double GST_to_UTC_time(double t_e, int WN); //!< GST-UTC Conversion Algorithm and Parameters /*! * Default constructor */ Galileo_Utc_Model(); }; #endif gnss-sdr-0.0.9/src/core/system_parameters/gnss_satellite.cc000066400000000000000000000442621305042567700241160ustar00rootroot00000000000000/*! * \file gnss_satellite.cc * \brief Implementation of the Gnss_Satellite class * \author Carles Fernandez-Prades, 2012. cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gnss_satellite.h" #include Gnss_Satellite::Gnss_Satellite() { Gnss_Satellite::reset(); } Gnss_Satellite::Gnss_Satellite(const std::string& system_, unsigned int PRN_) { Gnss_Satellite::reset(); Gnss_Satellite::set_system(system_); Gnss_Satellite::set_PRN(PRN_); Gnss_Satellite::set_block(system_, PRN_); } Gnss_Satellite::~Gnss_Satellite() {} void Gnss_Satellite::reset() { system_set = {"GPS", "GLONASS", "SBAS", "Galileo", "Beidou"}; satelliteSystem["GPS"] = "G"; satelliteSystem["GLONASS"] = "R"; satelliteSystem["SBAS"] = "S"; satelliteSystem["Galileo"] = "E"; satelliteSystem["Beidou"] = "C"; PRN = 0; system = std::string(""); block = std::string(""); rf_link = 0; } std::ostream& operator<<(std::ostream &out, const Gnss_Satellite &sat) // output { std::string tag(""); std::string tag2(""); if(sat.get_system().compare("Galileo") == 0) tag = "E"; if(sat.get_PRN() < 10) tag2 = "0"; out << sat.get_system() << " PRN " << tag << tag2 << sat.get_PRN() << " (Block " << sat.get_block() << ")"; return out; } bool operator== (const Gnss_Satellite &sat1, const Gnss_Satellite &sat2) { bool equal = false; if (sat1.get_system().compare(sat2.get_system()) == 0) { if (sat1.get_PRN() == (sat2.get_PRN())) { equal = true; } } return equal; } /* Gnss_Satellite& Gnss_Satellite::operator=(const Gnss_Satellite &rhs) { // Only do assignment if RHS is a different object from this. if (this != &rhs) { // Deallocate, allocate new space, copy values... const std::string system_ = rhs.get_system(); const unsigned int PRN_ = rhs.get_PRN(); const std::string block_ = rhs.get_block(); // const signed int rf_link_ = 0; this->set_system(system_); this->set_PRN(PRN_); this->set_block(system_, PRN_); //this.rf_link = rf_link_; } return *this; }*/ void Gnss_Satellite::set_system(const std::string& system_) { // Set the satellite system {"GPS", "GLONASS", "SBAS", "Galileo", "Compass"} std::set::iterator it = system_set.find(system_); if(it != system_set.end()) { system = system_; } else { DLOG(INFO) << "System " << system_ << " is not defined {GPS, GLONASS, SBAS, Galileo, Beidou}. Initialization?"; system = std::string(""); } } void Gnss_Satellite::set_PRN(unsigned int PRN_) { // Set satellite's PRN if (system.compare("") == 0) { DLOG(INFO) << "Trying to define PRN while system is not defined"; PRN = 0; } if (system.compare("GPS") == 0) { if (PRN_ < 1 or PRN_ > 32) { DLOG(INFO) << "This PRN is not defined"; PRN = 0; } else { PRN = PRN_; } } else if (system.compare("Glonass") == 0) { if (PRN_ < 1 or PRN_ > 24) { DLOG(INFO) << "This PRN is not defined"; PRN = 0; } else { PRN = PRN_; } } else if (system.compare("SBAS") == 0) { if (PRN_ == 122){ PRN = PRN_; } // WAAS Inmarsat 3F4 (AOR-W) else if (PRN_ == 134){ PRN = PRN_; } // WAAS Inmarsat 3F3 (POR) else if (PRN_ == 120){ PRN = PRN_; } // EGNOS AOR-E Broadcast satellite http://www.egnos-pro.esa.int/index.html else if (PRN_ == 124){ PRN = PRN_; } // EGNOS ESA ARTEMIS used for EGNOS Operations else if (PRN_ == 126){ PRN = PRN_; } // EGNOS IOR-W currently used by Industry to perform various tests on the system. else { DLOG(INFO) << "This PRN is not defined"; PRN = 0; } } else if (system.compare("Galileo") == 0) { if (PRN_ < 1 or PRN_ > 36) { DLOG(INFO) << "This PRN is not defined"; PRN = 0; } else { PRN = PRN_; } } else { DLOG(INFO) << "System " << system << " is not defined"; PRN = 0; } } unsigned int Gnss_Satellite::get_PRN() const { // Get satellite's PRN unsigned int PRN_; PRN_ = PRN; return PRN_; } std::string Gnss_Satellite::get_system() const { // Get the satellite system {"GPS", "GLONASS", "SBAS", "Galileo", "Beidou"} std::string system_; system_ = system; return system_; } std::string Gnss_Satellite::get_system_short() const { // Get the satellite system {"G", "R", "S", "E", "C"} return satelliteSystem.at(system); } std::string Gnss_Satellite::get_block() const { // Get the satellite block std::string block_; block_ = block; return block_; } std::string Gnss_Satellite::what_block(const std::string& system_, unsigned int PRN_) { std::string block_ = "Unknown"; if (system_.compare("GPS") == 0) { switch ( PRN_ ) { // info from http://www.navcen.uscg.gov/?Do=constellationStatus case 1 : block_ = std::string("IIF"); //Plane D break; case 2 : block_ = std::string("IIR"); //Plane D break; case 3 : block_ = std::string("IIF"); //Plane E break; case 4 : block_ = std::string("Unknown"); break; case 5 : block_ = std::string("IIR-M"); //Plane E break; case 6 : block_ = std::string("IIF"); //Plane D break; case 7 : block_ = std::string("IIR-M"); //Plane A break; case 8 : block_ = std::string("IIF"); //Plane C break; case 9 : block_ = std::string("IIF"); //Plane F break; case 10 : block_ = std::string("IIF"); //Plane E break; case 11 : block_ = std::string("IIR"); //Plane D break; case 12 : block_ = std::string("IIR-M"); //Plane B break; case 13 : block_ = std::string("IIR"); //Plane F break; case 14 : block_ = std::string("IIR"); //Plane F break; case 15 : block_ = std::string("IIR-M"); //Plane F break; case 16 : block_ = std::string("IIR"); //Plane B break; case 17 : block_ = std::string("IIR-M"); //Plane C break; case 18 : block_ = std::string("IIR"); //Plane E break; case 19 : block_ = std::string("IIR"); //Plane D break; case 20 : block_ = std::string("IIR"); //Plane B break; case 21 : block_ = std::string("IIR"); //Plane D break; case 22 : block_ = std::string("IIR"); //Plane E break; case 23 : block_ = std::string("IIR"); //Plane F break; case 24 : block_ = std::string("IIF"); //Plane A break; case 25 : block_ = std::string("IIF"); //Plane B break; case 26 : block_ = std::string("IIF"); //Plane B break; case 27 : block_ = std::string("IIF"); //Plane C break; case 28 : block_ = std::string("IIR"); //Plane B break; case 29 : block_ = std::string("IIR-M"); //Plane C break; case 30 : block_ = std::string("IIF"); //Plane A break; case 31 : block_ = std::string("IIR-M"); //Plane A break; case 32 : block_ = std::string("IIF"); //Plane F break; default : block_ = std::string("Unknown"); } } if (system_.compare("Glonass") == 0) { switch ( PRN_ ) { // info from http://www.sdcm.ru/smglo/grupglo?version=eng&site=extern // See also http://www.glonass-center.ru/en/GLONASS/ case 1 : block_ = std::string("1"); //Plane 1 rf_link = 1; break; case 2 : block_ = std::string("-4"); //Plane 1 rf_link = -4; break; case 3 : block_ = std::string("5"); //Plane 1 rf_link = 5; break; case 4 : block_ = std::string("6"); //Plane 1 rf_link = 6; break; case 5 : block_ = std::string("1"); //Plane 1 rf_link = 1; break; case 6 : block_ = std::string("-4"); //Plane 1 rf_link = -4; break; case 7 : block_ = std::string("5"); //Plane 1 rf_link = 5; break; case 8 : block_ = std::string("6"); //Plane 1 rf_link = 6; break; case 9 : block_ = std::string("-2"); //Plane 2 rf_link = -2; break; case 10 : block_ = std::string("-7"); //Plane 2 rf_link = -7; break; case 11 : block_ = std::string("0"); //Plane 2 rf_link = 0; break; case 12 : block_ = std::string("-1"); //Plane 2 rf_link = -1; break; case 13 : block_ = std::string("-2"); //Plane 2 rf_link = -2; break; case 14 : block_ = std::string("-7"); //Plane 2 rf_link = -7; break; case 15 : block_ = std::string("0"); //Plane 2 rf_link = 0; break; case 16 : block_ = std::string("-1"); //Plane 2 rf_link = -1; break; case 17 : block_ = std::string("4"); //Plane 3 rf_link = 4; break; case 18 : block_ = std::string("-3"); //Plane 3 rf_link = -3; break; case 19 : block_ = std::string("3"); //Plane 3 rf_link = 3; break; case 20 : block_ = std::string("2"); //Plane 3 rf_link = 2; break; case 21 : block_ = std::string("4"); //Plane 3 rf_link = 4; break; case 22 : block_ = std::string("-3"); //Plane 3 rf_link = -3; break; case 23 : block_ = std::string("3"); //Plane 3 rf_link = 3; break; case 24 : block_ = std::string("2"); //Plane 3 rf_link = 2; break; default : block_ = std::string("Unknown"); } } if (system_.compare("SBAS") == 0) { switch ( PRN_ ) { case 122 : block_ = std::string("WAAS"); // WAAS Inmarsat 3F4 (AOR-W) break; case 134 : block_ = std::string("WAAS"); // WAAS Inmarsat 3F3 (POR) break; case 120 : block_ = std::string("EGNOS"); // EGNOS AOR-E Broadcast satellite http://www.egnos-pro.esa.int/index.html break; case 124 : block_ = std::string("EGNOS"); // EGNOS ESA ARTEMIS used for EGNOS Operations break; case 126 : block_ = std::string("EGNOS"); // EGNOS IOR-W currently used by Industry to perform various tests on the system. break; default: block_ = std::string("Unknown"); } } if (system_.compare("Galileo") == 0) { // Check http://en.wikipedia.org/wiki/List_of_Galileo_satellites switch ( PRN_ ) { case 1: block_ = std::string("FOC-FM10"); // Galileo Full Operational Capability (FOC) satellite FM10 / GSAT-0210, launched on May 24, 2016 break; case 2: block_ = std::string("FOC-FM11"); // Galileo Full Operational Capability (FOC) satellite FM11 / GSAT-0211, launched on May 24, 2016 break; case 3: block_ = std::string("FOC-FM12"); // Galileo Full Operational Capability (FOC) satellite FM12 / GSAT-0212, launched on November 17, 2016 break; case 4: block_ = std::string("FOC-FM13"); // Galileo Full Operational Capability (FOC) satellite FM13 / GSAT-0213, launched on November 17, 2016 break; case 5: block_ = std::string("FOC-FM14"); // Galileo Full Operational Capability (FOC) satellite FM14 / GSAT-0214, launched on November 17, 2016 break; case 7: block_ = std::string("FOC-FM7"); // Galileo Full Operational Capability (FOC) satellite FM7 / GSAT-0207, launched on November 17, 2016 break; case 8: block_ = std::string("FOC-FM8"); // Galileo Full Operational Capability (FOC) satellite FM8 / GSAT0208, launched on December 17, 2015 break; case 9: block_ = std::string("FOC-FM9"); // Galileo Full Operational Capability (FOC) satellite FM9 / GSAT0209, launched on December 17, 2015 break; case 11 : block_ = std::string("IOV-PFM"); // PFM, the ProtoFlight Model / GSAT0101, launched from French Guiana at 10:30 GMT on October 21, 2011 break; case 12 : block_ = std::string("IOV-FM2**"); // Galileo In-Orbit Validation (IOV) satellite FM2 (Flight Model 2) also known as GSAT0102, from French Guiana at 10:30 GMT on October 21, 2011 break; case 14 : block_ = std::string("FOC-FM2*"); // Galileo Full Operational Capability (FOC) satellite FM2 / GSAT0202, launched into incorrect orbit on August 22, 2014. Moved to usable orbit in March, 2015. break; case 18 : block_ = std::string("FOC-FM1*"); // Galileo Full Operational Capability (FOC) satellite FM1 / GSAT0201, launched into incorrect orbit on August 22, 2014. Moved to usable orbit in December, 2014. break; case 19 : block_ = std::string("IOV-FM3"); // Galileo In-Orbit Validation (IOV) satellite FM3 (Flight Model 3) / GSAT0103, launched on October 12, 2012 break; case 20 : block_ = std::string("IOV-FM4**"); // Galileo In-Orbit Validation (IOV) satellite FM4 (Flight Model 4) / GSAT0104, launched on October 12, 2012. Partially unavailable: Payload power problem beginning May 27, 2014 led to permanent loss of E5 and E6 transmissions, E1 transmission restored. break; case 22 : block_ = std::string("FOC-FM4"); // Galileo Full Operational Capability (FOC) satellite FM4 / GSAT0204, launched on March 27, 2015. break; case 24 : block_ = std::string("FOC-FM5"); // Galileo Full Operational Capability (FOC) satellite FM5 / GSAT0205, launched on Sept. 11, 2015. break; case 26 : block_ = std::string("FOC-FM3"); // Galileo Full Operational Capability (FOC) satellite FM3 / GSAT0203, launched on March 27, 2015. break; case 30 : block_ = std::string("FOC-FM6"); // Galileo Full Operational Capability (FOC) satellite FM6 / GSAT0206, launched on Sept. 11, 2015. break; default: block_ = std::string("Unknown(Simulated)"); } } return block_; } void Gnss_Satellite::set_block(const std::string& system_, unsigned int PRN_) { block = what_block(system_, PRN_); } gnss-sdr-0.0.9/src/core/system_parameters/gnss_satellite.h000066400000000000000000000061011305042567700237460ustar00rootroot00000000000000/*! * \file gnss_satellite.h * \brief Interface of the Gnss_Satellite class * \author Carles Fernandez-Prades, 2012. cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GNSS_SATELLITE_H_ #define GNSS_SDR_GNSS_SATELLITE_H_ #include #include #include #include /*! * \brief This class represents a GNSS satellite. * * It contains information about the space vehicles currently operational * of GPS, Glonass, SBAS and Galileo constellations. */ class Gnss_Satellite { public: Gnss_Satellite(); //!< Default Constructor. Gnss_Satellite(const std::string& system_, unsigned int PRN_); //!< Concrete GNSS satellite Constructor. ~Gnss_Satellite(); //!< Default Destructor. unsigned int get_PRN() const; //!< Gets satellite's PRN std::string get_system() const; //!< Gets the satellite system {"GPS", "GLONASS", "SBAS", "Galileo", "Beidou"} std::string get_system_short() const; //!< Gets the satellite system {"G", "R", "SBAS", "E", "C"} std::string get_block() const; //!< Gets the satellite block. If GPS, returns {"IIA", "IIR", "IIR-M", "IIF"} std::string what_block(const std::string& system_, unsigned int PRN_); //!< Gets the block of a given satellite friend bool operator== (const Gnss_Satellite &, const Gnss_Satellite &); //!< operator== for comparison friend std::ostream& operator<<(std::ostream &, const Gnss_Satellite &); //!< operator<< for pretty printing //Gnss_Satellite& operator=(const Gnss_Satellite &); private: unsigned int PRN; std::string system; std::map satelliteSystem; std::string block; signed int rf_link; void set_system(const std::string& system); // Sets the satellite system {"GPS", "GLONASS", "SBAS", "Galileo", "Beidou"}. void set_PRN(unsigned int PRN); // Sets satellite's PRN void set_block(const std::string& system_, unsigned int PRN_ ); std::set system_set; // = {"GPS", "GLONASS", "SBAS", "Galileo", "Compass"}; void reset(); }; #endif gnss-sdr-0.0.9/src/core/system_parameters/gnss_signal.cc000066400000000000000000000042531305042567700234010ustar00rootroot00000000000000/*! * \file gnss_satellite.cc * \brief Implementation of the Gnss_Signal class * \author * Luis Esteve, 2012. luis(at)epsilon-formacion.com * Javier Arribas, 2012. jarribas(at)cttc.es * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gnss_signal.h" Gnss_Signal::Gnss_Signal() { this->signal = ""; } Gnss_Signal::Gnss_Signal(const std::string& signal_) { this->signal = signal_; } Gnss_Signal::Gnss_Signal(const Gnss_Satellite& satellite_, const std::string& signal_) { this->satellite = satellite_; this->signal = signal_; } Gnss_Signal::~Gnss_Signal() {} std::string Gnss_Signal::get_signal_str() const { return this->signal; } Gnss_Satellite Gnss_Signal::get_satellite() const { return this->satellite; } std::ostream& operator<<(std::ostream &out, const Gnss_Signal &sig) // output { out << sig.get_satellite() << " Signal " << sig.get_signal_str(); return out; } bool operator==(const Gnss_Signal &sig1, const Gnss_Signal &sig2) { bool equal = false; if (sig1.get_satellite() == sig2.get_satellite()) { if (sig1.get_signal_str().compare(sig1.get_signal_str()) == 0) { equal = true; } } return equal; } gnss-sdr-0.0.9/src/core/system_parameters/gnss_signal.h000066400000000000000000000042241305042567700232410ustar00rootroot00000000000000/*! * \file gnss_signal.h * \brief Implementation of the Gnss_Signal class * \author * Luis Esteve, 2012. luis(at)epsilon-formacion.com * Javier Arribas, 2012. jarribas(at)cttc.es * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GNSS_SIGNAL_H_ #define GNSS_SDR_GNSS_SIGNAL_H_ #include "gnss_satellite.h" #include #include /*! * \brief This class represents a GNSS signal. * * It contains information about the space vehicle and the specific signal. */ class Gnss_Signal { private: Gnss_Satellite satellite; std::string signal; public: Gnss_Signal(); Gnss_Signal(const std::string& signal_); Gnss_Signal(const Gnss_Satellite& satellite_, const std::string& signal_); ~Gnss_Signal(); std::string get_signal_str() const; //!< Get the satellite signal {"1C" for GPS L1 C/A, "2S" for GPS L2C (M), "1B" for Galileo E1B, "5X" for Galileo E5a} Gnss_Satellite get_satellite() const; //!< Get the Gnss_Satellite associated to the signal friend bool operator== (const Gnss_Signal &, const Gnss_Signal &); //!< operator== for comparison friend std::ostream& operator<<(std::ostream &, const Gnss_Signal &); //!< operator<< for pretty printing }; #endif gnss-sdr-0.0.9/src/core/system_parameters/gnss_synchro.h000066400000000000000000000066251305042567700234600ustar00rootroot00000000000000/*! * \file gnss_synchro.h * \brief Interface of the Gnss_Synchro class * \author * Luis Esteve, 2012. luis(at)epsilon-formacion.com * Javier Arribas, 2012. jarribas(at)cttc.es * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_GNSS_SYNCHRO_H_ #define GNSS_SDR_GNSS_SYNCHRO_H_ #include "gnss_signal.h" /*! * \brief This is the class that contains the information that is shared * by the processing blocks. */ class Gnss_Synchro { public: // Satellite and signal info char System; //!< Set by Channel::set_signal(Gnss_Signal gnss_signal) char Signal[3]; //!< Set by Channel::set_signal(Gnss_Signal gnss_signal) unsigned int PRN; //!< Set by Channel::set_signal(Gnss_Signal gnss_signal) int Channel_ID; //!< Set by Channel constructor // Acquisition double Acq_delay_samples; //!< Set by Acquisition processing block double Acq_doppler_hz; //!< Set by Acquisition processing block unsigned long int Acq_samplestamp_samples; //!< Set by Acquisition processing block bool Flag_valid_acquisition; //!< Set by Acquisition processing block //Tracking double Prompt_I; //!< Set by Tracking processing block double Prompt_Q; //!< Set by Tracking processing block double CN0_dB_hz; //!< Set by Tracking processing block double Carrier_Doppler_hz; //!< Set by Tracking processing block double Carrier_phase_rads; //!< Set by Tracking processing block double Tracking_timestamp_secs; //!< Set by Tracking processing block double Rem_code_phase_secs; //!< Set by Tracking processing block bool Flag_valid_symbol_output; //!< Set by Tracking processing block int correlation_length_ms; //!< Set by Tracking processing block //Telemetry Decoder double Prn_timestamp_ms; //!< Set by Telemetry Decoder processing block double Prn_timestamp_at_preamble_ms; //!< Set by Telemetry Decoder processing block bool Flag_valid_word; //!< Set by Telemetry Decoder processing block bool Flag_preamble; //!< Set by Telemetry Decoder processing block double d_TOW; //!< Set by Telemetry Decoder processing block double d_TOW_at_current_symbol; double d_TOW_hybrid_at_current_symbol; //Galileo TOW is expressed in the GPS time scale (it will be the same for any other constellation) // Pseudorange double Pseudorange_m; bool Flag_valid_pseudorange; }; #endif gnss-sdr-0.0.9/src/core/system_parameters/gps_acq_assist.cc000066400000000000000000000030251305042567700240710ustar00rootroot00000000000000/*! * \file gps_acq_assist.cc * \brief Interface of a GPS RRLL ACQUISITION ASSISTACE storage * * See http://www.gps.gov/technical/icwg/IS-GPS-200E.pdf Appendix II * \author Javier Arribas, 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_acq_assist.h" Gps_Acq_Assist::Gps_Acq_Assist() { i_satellite_PRN = 0; d_TOW = 0.0; d_Doppler0 = 0.0; d_Doppler1 = 0.0; dopplerUncertainty = 0.0; Code_Phase = 0.0; Code_Phase_int = 0.0; GPS_Bit_Number = 0.0; Code_Phase_window = 0.0; Azimuth = 0.0; Elevation = 0.0; } gnss-sdr-0.0.9/src/core/system_parameters/gps_acq_assist.h000066400000000000000000000045441305042567700237420ustar00rootroot00000000000000/*! * \file gps_acq_assist.h * \brief Interface of a GPS RRLL ACQUISITION ASSISTACE storage * \author Javier Arribas, 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_ACQ_ASSIST_H_ #define GNSS_SDR_GPS_ACQ_ASSIST_H_ /*! * \brief This class is a storage for the GPS GSM RRLL acquisition assistance data as described in * Digital cellular telecommunications system (Phase 2+); * Location Services (LCS); * Mobile Station (MS) - Serving Mobile Location Centre (SMLC) * Radio Resource LCS Protocol (RRLP) * (3GPP TS 44.031 version 5.12.0 Release 5) */ class Gps_Acq_Assist { public: unsigned int i_satellite_PRN; //!< SV PRN NUMBER double d_TOW; //!< Time Of Week assigned to the acquisition data double d_Doppler0; //!< Doppler (0 order term) [Hz] double d_Doppler1; //!< Doppler (1 order term) [Hz] double dopplerUncertainty; //!< Doppler Uncertainty [Hz] double Code_Phase; //!< Code phase [chips] double Code_Phase_int; //!< Integer Code Phase [1 C/A code period] double GPS_Bit_Number; //!< GPS Bit Number double Code_Phase_window; //!< Code Phase search window [chips] double Azimuth; //!< Satellite Azimuth [deg] double Elevation; //!< Satellite Elevation [deg] /*! * Default constructor */ Gps_Acq_Assist(); }; #endif gnss-sdr-0.0.9/src/core/system_parameters/gps_almanac.cc000066400000000000000000000027531305042567700233420ustar00rootroot00000000000000/*! * \file gps_almanac.cc * \brief Interface of a GPS ALMANAC storage * * See http://www.gps.gov/technical/icwg/IS-GPS-200E.pdf Appendix II * \author Javier Arribas, 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_almanac.h" Gps_Almanac::Gps_Almanac() { i_satellite_PRN = 0; d_Delta_i = 0.0; d_Toa = 0.0; d_M_0 = 0.0; d_e_eccentricity = 0.0; d_sqrt_A = 0.0; d_OMEGA0 = 0.0; d_OMEGA = 0.0; d_OMEGA_DOT = 0.0; i_SV_health = 0; d_A_f0 = 0.0; d_A_f1 = 0.0; } gnss-sdr-0.0.9/src/core/system_parameters/gps_almanac.h000066400000000000000000000044301305042567700231760ustar00rootroot00000000000000/*! * \file gps_almanac.h * \brief Interface of a GPS ALMANAC storage * \author Javier Arribas, 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_ALMANAC_H_ #define GNSS_SDR_GPS_ALMANAC_H_ /*! * \brief This class is a storage for the GPS SV ALMANAC data as described in IS-GPS-200E * * See http://www.gps.gov/technical/icwg/IS-GPS-200E.pdf Appendix II */ class Gps_Almanac { public: unsigned int i_satellite_PRN; //!< SV PRN NUMBER double d_Delta_i; double d_Toa; //!< Almanac data reference time of week (Ref. 20.3.3.4.3 IS-GPS-200E) [s] double d_M_0; //!< Mean Anomaly at Reference Time [semi-circles] double d_e_eccentricity; //!< Eccentricity [dimensionless] double d_sqrt_A; //!< Square Root of the Semi-Major Axis [sqrt(m)] double d_OMEGA0; //!< Longitude of Ascending Node of Orbit Plane at Weekly Epoch [semi-circles] double d_OMEGA; //!< Argument of Perigee [semi-cicles] double d_OMEGA_DOT; //!< Rate of Right Ascension [semi-circles/s] int i_SV_health; // SV Health double d_A_f0; //!< Coefficient 0 of code phase offset model [s] double d_A_f1; //!< Coefficient 1 of code phase offset model [s/s] /*! * Default constructor */ Gps_Almanac(); }; #endif gnss-sdr-0.0.9/src/core/system_parameters/gps_cnav_ephemeris.cc000066400000000000000000000203051305042567700247270ustar00rootroot00000000000000/*! * \file gps_cnav_ephemeris.cc * \brief Interface of a GPS CNAV EPHEMERIS storage and orbital model functions * * See http://www.gps.gov/technical/icwg/IS-GPS-200E.pdf Appendix II * \author Javier Arribas, 2015. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_cnav_ephemeris.h" #include #include "GPS_L2C.h" Gps_CNAV_Ephemeris::Gps_CNAV_Ephemeris() { i_satellite_PRN = 0; d_Toe1 = -1; d_Toe2 = -1; d_TOW = 0; d_Crs = 0; d_M_0 = 0; d_Cuc = 0; d_e_eccentricity = 0; d_Cus = 0; d_Toc = 0; d_Cic = 0; d_OMEGA0 = 0; d_Cis = 0; d_i_0 = 0; d_Crc = 0; d_OMEGA = 0; d_IDOT = 0; i_GPS_week = 0; d_TGD = 0; // Estimated Group Delay Differential: L1-L2 correction term only for the benefit of "L1 P(Y)" or "L2 P(Y)" s users [s] d_A_f0 = 0; // Coefficient 0 of code phase offset model [s] d_A_f1 = 0; // Coefficient 1 of code phase offset model [s/s] d_A_f2 = 0; // Coefficient 2 of code phase offset model [s/s^2] b_integrity_status_flag = false; b_alert_flag = false; // If true, indicates that the SV URA may be worse than indicated in d_SV_accuracy, use that SV at our own risk. b_antispoofing_flag = false; // If true, the AntiSpoofing mode is ON in that SV d_satClkDrift = 0.0; d_dtr = 0.0; d_satpos_X = 0.0; d_satpos_Y = 0.0; d_satpos_Z = 0.0; d_satvel_X = 0.0; d_satvel_Y = 0.0; d_satvel_Z = 0.0; i_URA = 0; i_signal_health = 0; d_Top = 0.0; d_DELTA_A = 0.0; d_A_DOT = 0.0; d_Delta_n = 0.0; d_DELTA_DOT_N = 0.0; d_DELTA_OMEGA_DOT = 0.0; d_URA0 = 0.0; d_URA1 = 0.0; d_URA2 = 0.0; d_ISCL1 = 0.0; d_ISCL2 = 0.0; d_ISCL5I = 0.0; d_ISCL5Q = 0.0; b_l2c_phasing_flag = false; } double Gps_CNAV_Ephemeris::check_t(double time) { double corrTime; double half_week = 302400.0; // seconds corrTime = time; if (time > half_week) { corrTime = time - 2.0 * half_week; } else if (time < -half_week) { corrTime = time + 2.0 * half_week; } return corrTime; } // 20.3.3.3.3.1 User Algorithm for SV Clock Correction. double Gps_CNAV_Ephemeris::sv_clock_drift(double transmitTime) { double dt; dt = check_t(transmitTime - d_Toc); d_satClkDrift = d_A_f0 + d_A_f1 * dt + d_A_f2 * (dt * dt) + sv_clock_relativistic_term(transmitTime); return d_satClkDrift; } // compute the relativistic correction term double Gps_CNAV_Ephemeris::sv_clock_relativistic_term(double transmitTime) { double tk; double a; double n; double n0; double E; double E_old; double dE; double M; const double GM = 3.986005e14; //!< Universal gravitational constant times the mass of the Earth, [m^3/s^2] const double F = -4.442807633e-10; //!< Constant, [s/(m)^(1/2)] const double A_REF = 26559710.0; // See IS-GPS-200H, pp. 163 double d_sqrt_A = sqrt(A_REF + d_DELTA_A); // Restore semi-major axis a = d_sqrt_A * d_sqrt_A; // Time from ephemeris reference epoch tk = check_t(transmitTime - d_Toe1); // Computed mean motion n0 = sqrt(GM / (a * a * a)); // Corrected mean motion n = n0 + d_Delta_n; // Mean anomaly M = d_M_0 + n * tk; // Reduce mean anomaly to between 0 and 2pi M = fmod((M + 2.0 * GPS_L2_PI), (2.0 * GPS_L2_PI)); // Initial guess of eccentric anomaly E = M; // --- Iteratively compute eccentric anomaly ---------------------------- for (int ii = 1; ii < 20; ii++) { E_old = E; E = M + d_e_eccentricity * sin(E); dE = fmod(E - E_old, 2.0 * GPS_L2_PI); if (fabs(dE) < 1e-12) { //Necessary precision is reached, exit from the loop break; } } // Compute relativistic correction term d_dtr = F * d_e_eccentricity * d_sqrt_A * sin(E); return d_dtr; } void Gps_CNAV_Ephemeris::satellitePosition(double transmitTime) { double tk; double a; double n; double n0; double M; double E; double E_old; double dE; double nu; double phi; double u; double r; double i; double Omega; const double A_REF = 26559710.0; // See IS-GPS-200H, pp. 163 double d_sqrt_A = sqrt(A_REF + d_DELTA_A); const double GM = 3.986005e14; //!< Universal gravitational constant times the mass of the Earth, [m^3/s^2] const double OMEGA_DOT_REF = -2.6e-9; // semicircles / s, see IS-GPS-200H pp. 164 double d_OMEGA_DOT = OMEGA_DOT_REF + d_DELTA_OMEGA_DOT; const double OMEGA_EARTH_DOT = 7.2921151467e-5; //!< Earth rotation rate, [rad/s] // Find satellite's position ---------------------------------------------- // Restore semi-major axis a = d_sqrt_A*d_sqrt_A; // Time from ephemeris reference epoch tk = check_t(transmitTime - d_Toe1); // Computed mean motion n0 = sqrt(GM / (a*a*a)); // Corrected mean motion n = n0 + d_Delta_n; // Mean anomaly M = d_M_0 + n * tk; // Reduce mean anomaly to between 0 and 2pi M = fmod((M + 2 * GPS_L2_PI), (2 * GPS_L2_PI)); // Initial guess of eccentric anomaly E = M; // --- Iteratively compute eccentric anomaly ---------------------------- for (int ii = 1; ii < 20; ii++) { E_old = E; E = M + d_e_eccentricity * sin(E); dE = fmod(E - E_old, 2 * GPS_L2_PI); if (fabs(dE) < 1e-12) { //Necessary precision is reached, exit from the loop break; } } // Compute the true anomaly double tmp_Y = sqrt(1.0 - d_e_eccentricity * d_e_eccentricity) * sin(E); double tmp_X = cos(E) - d_e_eccentricity; nu = atan2(tmp_Y, tmp_X); // Compute angle phi (argument of Latitude) phi = nu + d_OMEGA; // Reduce phi to between 0 and 2*pi rad phi = fmod((phi), (2*GPS_L2_PI)); // Correct argument of latitude u = phi + d_Cuc * cos(2*phi) + d_Cus * sin(2*phi); // Correct radius r = a * (1 - d_e_eccentricity*cos(E)) + d_Crc * cos(2*phi) + d_Crs * sin(2*phi); // Correct inclination i = d_i_0 + d_IDOT * tk + d_Cic * cos(2*phi) + d_Cis * sin(2*phi); // Compute the angle between the ascending node and the Greenwich meridian Omega = d_OMEGA0 + (d_OMEGA_DOT - OMEGA_EARTH_DOT)*tk - OMEGA_EARTH_DOT * d_Toe1; // Reduce to between 0 and 2*pi rad Omega = fmod((Omega + 2*GPS_L2_PI), (2*GPS_L2_PI)); // --- Compute satellite coordinates in Earth-fixed coordinates d_satpos_X = cos(u) * r * cos(Omega) - sin(u) * r * cos(i) * sin(Omega); d_satpos_Y = cos(u) * r * sin(Omega) + sin(u) * r * cos(i) * cos(Omega); d_satpos_Z = sin(u) * r * sin(i); // Satellite's velocity. Can be useful for Vector Tracking loops double Omega_dot = d_OMEGA_DOT - OMEGA_EARTH_DOT; d_satvel_X = - Omega_dot * (cos(u) * r + sin(u) * r * cos(i)) + d_satpos_X * cos(Omega) - d_satpos_Y * cos(i) * sin(Omega); d_satvel_Y = Omega_dot * (cos(u) * r * cos(Omega) - sin(u) * r * cos(i) * sin(Omega)) + d_satpos_X * sin(Omega) + d_satpos_Y * cos(i) * cos(Omega); d_satvel_Z = d_satpos_Y * sin(i); } gnss-sdr-0.0.9/src/core/system_parameters/gps_cnav_ephemeris.h000066400000000000000000000252511305042567700245760ustar00rootroot00000000000000/*! * \file gps_cnav_ephemeris.h * \brief Interface of a GPS CNAV EPHEMERIS storage * \author Javier Arribas, 2015. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_CNAV_EPHEMERIS_H_ #define GNSS_SDR_GPS_CNAV_EPHEMERIS_H_ #include "boost/assign.hpp" #include /*! * \brief This class is a storage and orbital model functions for the GPS SV ephemeris data as described in IS-GPS-200H * * See http://www.gps.gov/technical/icwg/IS-GPS-200H.pdf Appendix III */ class Gps_CNAV_Ephemeris { private: double check_t(double time); public: unsigned int i_satellite_PRN; // SV PRN NUMBER //Message Types 10 and 11 Parameters (1 of 2) int i_GPS_week; //!< GPS week number, aka WN [week] int i_URA; //!< ED Accuracy Index int i_signal_health; //!< Signal health (L1/L2/L5) double d_Top; //!< Data predict time of week double d_DELTA_A; //!< Semi-major axis difference at reference time double d_A_DOT; //!< Change rate in semi-major axis double d_Delta_n; //!< Mean Motion Difference From Computed Value [semi-circles/s] double d_DELTA_DOT_N; //!< Rate of mean motion difference from computed value double d_M_0; //!< Mean Anomaly at Reference Time [semi-circles] double d_e_eccentricity; //!< Eccentricity double d_OMEGA; //!< Argument of Perigee [semi-cicles] double d_OMEGA0; //!< Longitude of Ascending Node of Orbit Plane at Weekly Epoch [semi-cicles] double d_Toe1; //!< Ephemeris data reference time of week (Ref. 20.3.3.4.3 IS-GPS-200E) [s] double d_Toe2; //!< Ephemeris data reference time of week (Ref. 20.3.3.4.3 IS-GPS-200E) [s] double d_DELTA_OMEGA_DOT; //!< Rate of Right Ascension difference [semi-circles/s] double d_i_0; //!< Inclination Angle at Reference Time [semi-circles] double d_IDOT; //!< Rate of Inclination Angle [semi-circles/s] double d_Cis; //!< Amplitude of the Sine Harmonic Correction Term to the Angle of Inclination [rad] double d_Cic; //!< Amplitude of the Cosine Harmonic Correction Term to the Angle of Inclination [rad] double d_Crs; //!< Amplitude of the Sine Harmonic Correction Term to the Orbit Radius [m] double d_Crc; //!< Amplitude of the Cosine Harmonic Correction Term to the Orbit Radius [m] double d_Cus; //!< Amplitude of the Sine Harmonic Correction Term to the Argument of Latitude [rad] double d_Cuc; //!< Amplitude of the Cosine Harmonic Correction Term to the Argument of Latitude [rad] //Clock Correction and Accuracy Parameters double d_Toc; //!< clock data reference time (Ref. 20.3.3.3.3.1 IS-GPS-200E) [s] double d_A_f0; //!< Coefficient 0 of code phase offset model [s] double d_A_f1; //!< Coefficient 1 of code phase offset model [s/s] double d_A_f2; //!< Coefficient 2 of code phase offset model [s/s^2] double d_URA0; //! /*! * \brief Serialize is a boost standard method to be called by the boost XML serialization. Here is used to save the ephemeris data on disk file. */ void serialize(Archive& archive, const unsigned int version) { using boost::serialization::make_nvp; if(version){}; archive & make_nvp("i_satellite_PRN", i_satellite_PRN); // SV PRN NUMBER archive & make_nvp("d_TOW", d_TOW); //!< Time of GPS Week of the ephemeris set (taken from subframes TOW) [s] archive & make_nvp("d_Crs", d_Crs); //!< Amplitude of the Sine Harmonic Correction Term to the Orbit Radius [m] archive & make_nvp("d_M_0", d_M_0); //!< Mean Anomaly at Reference Time [semi-circles] archive & make_nvp("d_Cuc", d_Cuc); //!< Amplitude of the Cosine Harmonic Correction Term to the Argument of Latitude [rad] archive & make_nvp("d_e_eccentricity", d_e_eccentricity); //!< Eccentricity [dimensionless] archive & make_nvp("d_Cus", d_Cus); //!< Amplitude of the Sine Harmonic Correction Term to the Argument of Latitude [rad] archive & make_nvp("d_Toe1", d_Toe1); //!< Ephemeris data reference time of week (Ref. 20.3.3.4.3 IS-GPS-200E) [s] archive & make_nvp("d_Toe2", d_Toe2); //!< Ephemeris data reference time of week (Ref. 20.3.3.4.3 IS-GPS-200E) [s] archive & make_nvp("d_Toc", d_Toc); //!< clock data reference time (Ref. 20.3.3.3.3.1 IS-GPS-200E) [s] archive & make_nvp("d_Cic", d_Cic); //!< Amplitude of the Cosine Harmonic Correction Term to the Angle of Inclination [rad] archive & make_nvp("d_OMEGA0", d_OMEGA0); //!< Longitude of Ascending Node of Orbit Plane at Weekly Epoch [semi-circles] archive & make_nvp("d_Cis", d_Cis); //!< Amplitude of the Sine Harmonic Correction Term to the Angle of Inclination [rad] archive & make_nvp("d_i_0", d_i_0); //!< Inclination Angle at Reference Time [semi-circles] archive & make_nvp("d_Crc", d_Crc); //!< Amplitude of the Cosine Harmonic Correction Term to the Orbit Radius [m] archive & make_nvp("d_OMEGA", d_OMEGA); //!< Argument of Perigee [semi-cicles] archive & make_nvp("d_IDOT", d_IDOT); //!< Rate of Inclination Angle [semi-circles/s] archive & make_nvp("i_GPS_week", i_GPS_week); //!< GPS week number, aka WN [week] archive & make_nvp("d_TGD", d_TGD); //!< Estimated Group Delay Differential: L1-L2 correction term only for the benefit of "L1 P(Y)" or "L2 P(Y)" s users [s] archive & make_nvp("d_A_f0", d_A_f0); //!< Coefficient 0 of code phase offset model [s] archive & make_nvp("d_A_f1", d_A_f1); //!< Coefficient 1 of code phase offset model [s/s] archive & make_nvp("d_A_f2", d_A_f2); //!< Coefficient 2 of code phase offset model [s/s^2] archive & make_nvp("b_integrity_status_flag", b_integrity_status_flag); archive & make_nvp("b_alert_flag", b_alert_flag); //!< If true, indicates that the SV URA may be worse than indicated in d_SV_accuracy, use that SV at our own risk. archive & make_nvp("b_antispoofing_flag", b_antispoofing_flag); //!< If true, the AntiSpoofing mode is ON in that SV } /*! * \brief Compute the ECEF SV coordinates and ECEF velocity * Implementation of Table 20-IV (IS-GPS-200E) */ void satellitePosition(double transmitTime); /*! * \brief Sets (\a d_satClkDrift)and returns the clock drift in seconds according to the User Algorithm for SV Clock Correction * (IS-GPS-200E, 20.3.3.3.3.1) */ double sv_clock_drift(double transmitTime); /*! * \brief Sets (\a d_dtr) and returns the clock relativistic correction term in seconds according to the User Algorithm for SV Clock Correction * (IS-GPS-200E, 20.3.3.3.3.1) */ double sv_clock_relativistic_term(double transmitTime); /*! * Default constructor */ Gps_CNAV_Ephemeris(); }; #endif gnss-sdr-0.0.9/src/core/system_parameters/gps_cnav_iono.cc000066400000000000000000000026701305042567700237170ustar00rootroot00000000000000/*! * \file gps_cnav_iono.cc * \brief Interface of a GPS CNAV IONOSPHERIC MODEL storage * * See http://www.gps.gov/technical/icwg/IS-GPS-200E.pdf Appendix II * \author Javier Arribas, 2015. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_cnav_iono.h" Gps_CNAV_Iono::Gps_CNAV_Iono() { valid = false; d_alpha0 = 0.0; d_alpha1 = 0.0; d_alpha2 = 0.0; d_alpha3 = 0.0; d_beta0 = 0.0; d_beta1 = 0.0; d_beta2 = 0.0; d_beta3 = 0.0; } gnss-sdr-0.0.9/src/core/system_parameters/gps_cnav_iono.h000066400000000000000000000064141305042567700235610ustar00rootroot00000000000000/*! * \file gps_cnav_iono.h * \brief Interface of a GPS CNAV IONOSPHERIC MODEL storage * \author Javier Arribas, 2015. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_CNAV_IONO_H_ #define GNSS_SDR_GPS_CNAV_IONO_H_ #include "boost/assign.hpp" #include /*! * \brief This class is a storage for the GPS IONOSPHERIC data as described in IS-GPS-200H * * See http://www.gps.gov/technical/icwg/IS-GPS-200H.pdf Appendix III */ class Gps_CNAV_Iono { public: bool valid; //!< Valid flag // Ionospheric parameters double d_alpha0; //!< Coefficient 0 of a cubic equation representing the amplitude of the vertical delay [s] double d_alpha1; //!< Coefficient 1 of a cubic equation representing the amplitude of the vertical delay [s/semi-circle] double d_alpha2; //!< Coefficient 2 of a cubic equation representing the amplitude of the vertical delay [s(semi-circle)^2] double d_alpha3; //!< Coefficient 3 of a cubic equation representing the amplitude of the vertical delay [s(semi-circle)^3] double d_beta0; //!< Coefficient 0 of a cubic equation representing the period of the model [s] double d_beta1; //!< Coefficient 1 of a cubic equation representing the period of the model [s/semi-circle] double d_beta2; //!< Coefficient 2 of a cubic equation representing the period of the model [s(semi-circle)^2] double d_beta3; //!< Coefficient 3 of a cubic equation representing the period of the model [s(semi-circle)^3] Gps_CNAV_Iono(); //!< Default constructor template /*! * \brief Serialize is a boost standard method to be called by the boost XML serialization. Here is used to save the ephemeris data on disk file. */ void serialize(Archive& archive, const unsigned int version) { using boost::serialization::make_nvp; if(version){}; archive & make_nvp("d_alpha0",d_alpha0); archive & make_nvp("d_alpha1",d_alpha1); archive & make_nvp("d_alpha2",d_alpha2); archive & make_nvp("d_alpha3",d_alpha3); archive & make_nvp("d_beta0",d_beta0); archive & make_nvp("d_beta1",d_beta1); archive & make_nvp("d_beta2",d_beta2); archive & make_nvp("d_beta3",d_beta3); } }; #endif gnss-sdr-0.0.9/src/core/system_parameters/gps_cnav_navigation_message.cc000066400000000000000000000374261305042567700266250ustar00rootroot00000000000000/*! * \file gps_cnav_navigation_message.cc * \brief Implementation of a GPS CNAV Data message decoder as described in IS-GPS-200H * * See http://www.gps.gov/technical/icwg/IS-GPS-200H.pdf Appendix III * \author Javier Arribas, 2015. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_cnav_navigation_message.h" #include #include "gnss_satellite.h" void Gps_CNAV_Navigation_Message::reset() { b_flag_ephemeris_1 = false; b_flag_ephemeris_2 = false; b_flag_iono_valid = false; // satellite positions d_satpos_X = 0; d_satpos_Y = 0; d_satpos_Z = 0; // info i_channel_ID = 0; i_satellite_PRN = 0; // Satellite velocity d_satvel_X = 0; d_satvel_Y = 0; d_satvel_Z = 0; d_TOW = 0.0; } Gps_CNAV_Navigation_Message::Gps_CNAV_Navigation_Message() { reset(); Gnss_Satellite gnss_satellite_ = Gnss_Satellite(); for(unsigned int prn_ = 1; prn_ < 33; prn_++) { satelliteBlock[prn_] = gnss_satellite_.what_block("GPS", prn_); } b_flag_iono_valid = false; } void Gps_CNAV_Navigation_Message::print_gps_word_bytes(unsigned int GPS_word) { std::cout << " Word ="; std::cout << std::bitset<32>(GPS_word); std::cout << std::endl; } bool Gps_CNAV_Navigation_Message::read_navigation_bool(std::bitset bits, const std::vector> parameter) { bool value; if (bits[GPS_L2_CNAV_DATA_PAGE_BITS - parameter[0].first] == 1) { value = true; } else { value = false; } return value; } unsigned long int Gps_CNAV_Navigation_Message::read_navigation_unsigned(std::bitset bits, const std::vector> parameter) { unsigned long int value = 0; int num_of_slices = parameter.size(); for (int i = 0; i < num_of_slices; i++) { for (int j = 0; j < parameter[i].second; j++) { value <<= 1; //shift left if (bits[GPS_L2_CNAV_DATA_PAGE_BITS - parameter[i].first - j] == 1) { value += 1; // insert the bit } } } return value; } signed long int Gps_CNAV_Navigation_Message::read_navigation_signed(std::bitset bits, const std::vector> parameter) { signed long int value = 0; int num_of_slices = parameter.size(); // Discriminate between 64 bits and 32 bits compiler int long_int_size_bytes = sizeof(signed long int); if (long_int_size_bytes == 8) // if a long int takes 8 bytes, we are in a 64 bits system { // read the MSB and perform the sign extension if (bits[GPS_L2_CNAV_DATA_PAGE_BITS - parameter[0].first] == 1) { value ^= 0xFFFFFFFFFFFFFFFF; //64 bits variable } else { value &= 0; } for (int i = 0; i < num_of_slices; i++) { for (int j = 0; j < parameter[i].second; j++) { value <<= 1; //shift left value &= 0xFFFFFFFFFFFFFFFE; //reset the corresponding bit (for the 64 bits variable) if (bits[GPS_L2_CNAV_DATA_PAGE_BITS - parameter[i].first - j] == 1) { value += 1; // insert the bit } } } } else // we assume we are in a 32 bits system { // read the MSB and perform the sign extension if (bits[GPS_L2_CNAV_DATA_PAGE_BITS - parameter[0].first] == 1) { value ^= 0xFFFFFFFF; } else { value &= 0; } for (int i = 0; i < num_of_slices; i++) { for (int j = 0; j < parameter[i].second; j++) { value <<= 1; //shift left value &= 0xFFFFFFFE; //reset the corresponding bit if (bits[GPS_L2_CNAV_DATA_PAGE_BITS - parameter[i].first - j] == 1) { value += 1; // insert the bit } } } } return value; } void Gps_CNAV_Navigation_Message::decode_page(std::vector data) { std::bitset data_bits; try { for(int i = 0; i < GPS_L2_CNAV_DATA_PAGE_BITS; i++) { data_bits[i] = static_cast(data[GPS_L2_CNAV_DATA_PAGE_BITS - i - 1]); } } catch(std::exception &e) { std::cout << "Exception converting to bitset " << e.what() << std::endl; return; } int PRN; int page_type; bool alert_flag; // common to all messages PRN = static_cast(read_navigation_unsigned(data_bits, CNAV_PRN)); ephemeris_record.i_satellite_PRN = PRN; d_TOW = static_cast(read_navigation_unsigned(data_bits, CNAV_TOW)); d_TOW = d_TOW * CNAV_TOW_LSB; ephemeris_record.d_TOW = d_TOW; alert_flag = static_cast(read_navigation_bool(data_bits, CNAV_ALERT_FLAG)); ephemeris_record.b_alert_flag = alert_flag; page_type = static_cast(read_navigation_unsigned(data_bits, CNAV_MSG_TYPE)); std::cout << "PRN=" << PRN << " TOW=" << d_TOW << " alert_flag=" << alert_flag << " page_type= " << page_type << std::endl; switch(page_type) { case 10: // Ephemeris 1/2 ephemeris_record.i_GPS_week = static_cast(read_navigation_unsigned(data_bits, CNAV_WN)); ephemeris_record.i_signal_health = static_cast(read_navigation_unsigned(data_bits, CNAV_HEALTH)); ephemeris_record.d_Top = static_cast(read_navigation_unsigned(data_bits, CNAV_TOP1)); ephemeris_record.d_Top = ephemeris_record.d_Top * CNAV_TOP1_LSB; ephemeris_record.d_URA0 = static_cast(read_navigation_signed(data_bits, CNAV_URA)); ephemeris_record.d_Toe1 = static_cast(read_navigation_unsigned(data_bits, CNAV_TOE1)); ephemeris_record.d_Toe1 = ephemeris_record.d_Toe1 * CNAV_TOE1_LSB; ephemeris_record.d_DELTA_A = static_cast(read_navigation_signed(data_bits, CNAV_DELTA_A)); ephemeris_record.d_DELTA_A = ephemeris_record.d_DELTA_A * CNAV_DELTA_A_LSB; ephemeris_record.d_A_DOT = static_cast(read_navigation_signed(data_bits, CNAV_A_DOT)); ephemeris_record.d_A_DOT = ephemeris_record.d_A_DOT * CNAV_A_DOT_LSB; ephemeris_record.d_Delta_n = static_cast(read_navigation_signed(data_bits, CNAV_DELTA_N0)); ephemeris_record.d_Delta_n = ephemeris_record.d_Delta_n * CNAV_DELTA_N0_LSB; ephemeris_record.d_DELTA_DOT_N = static_cast(read_navigation_signed(data_bits, CNAV_DELTA_N0_DOT)); ephemeris_record.d_DELTA_DOT_N = ephemeris_record.d_DELTA_DOT_N * CNAV_DELTA_N0_DOT_LSB; ephemeris_record.d_M_0 = static_cast(read_navigation_signed(data_bits, CNAV_M0)); ephemeris_record.d_M_0 = ephemeris_record.d_M_0 * CNAV_M0_LSB; ephemeris_record.d_e_eccentricity = static_cast(read_navigation_signed(data_bits, CNAV_E_ECCENTRICITY)); ephemeris_record.d_e_eccentricity = ephemeris_record.d_e_eccentricity * CNAV_E_ECCENTRICITY_LSB; ephemeris_record.d_OMEGA = static_cast(read_navigation_signed(data_bits, CNAV_OMEGA)); ephemeris_record.d_OMEGA = ephemeris_record.d_OMEGA * CNAV_OMEGA_LSB; ephemeris_record.b_integrity_status_flag = static_cast(read_navigation_bool(data_bits, CNAV_INTEGRITY_FLAG)); ephemeris_record.b_l2c_phasing_flag = static_cast(read_navigation_bool(data_bits, CNAV_L2_PHASING_FLAG)); b_flag_ephemeris_1 = true; break; case 11: // Ephemeris 2/2 ephemeris_record.d_Toe2 = static_cast(read_navigation_unsigned(data_bits, CNAV_TOE2)); ephemeris_record.d_Toe2 = ephemeris_record.d_Toe2 * CNAV_TOE2_LSB; ephemeris_record.d_OMEGA0 = static_cast(read_navigation_signed(data_bits, CNAV_OMEGA0)); ephemeris_record.d_OMEGA0 = ephemeris_record.d_OMEGA0 * CNAV_OMEGA0_LSB; ephemeris_record.d_DELTA_OMEGA_DOT = static_cast(read_navigation_signed(data_bits, CNAV_DELTA_OMEGA_DOT)); ephemeris_record.d_DELTA_OMEGA_DOT = ephemeris_record.d_DELTA_OMEGA_DOT * CNAV_DELTA_OMEGA_DOT_LSB; ephemeris_record.d_i_0 = static_cast(read_navigation_signed(data_bits, CNAV_I0)); ephemeris_record.d_i_0 = ephemeris_record.d_i_0 * CNAV_I0_LSB; ephemeris_record.d_IDOT = static_cast(read_navigation_signed(data_bits, CNAV_I0_DOT)); ephemeris_record.d_IDOT = ephemeris_record.d_IDOT * CNAV_I0_DOT_LSB; ephemeris_record.d_Cis = static_cast(read_navigation_signed(data_bits, CNAV_CIS)); ephemeris_record.d_Cis = ephemeris_record.d_Cis * CNAV_CIS_LSB; ephemeris_record.d_Cic = static_cast(read_navigation_signed(data_bits, CNAV_CIC)); ephemeris_record.d_Cic = ephemeris_record.d_Cic * CNAV_CIC_LSB; ephemeris_record.d_Crs = static_cast(read_navigation_signed(data_bits, CNAV_CRS)); ephemeris_record.d_Crs = ephemeris_record.d_Crs * CNAV_CRS_LSB; ephemeris_record.d_Crc = static_cast(read_navigation_signed(data_bits, CNAV_CRC)); ephemeris_record.d_Cic = ephemeris_record.d_Cic * CNAV_CRC_LSB; ephemeris_record.d_Cus = static_cast(read_navigation_signed(data_bits, CNAV_CUS)); ephemeris_record.d_Cus = ephemeris_record.d_Cus * CNAV_CUS_LSB; ephemeris_record.d_Cuc = static_cast(read_navigation_signed(data_bits, CNAV_CUC)); ephemeris_record.d_Cuc = ephemeris_record.d_Cuc * CNAV_CUS_LSB; b_flag_ephemeris_2 = true; break; case 30: // (CLOCK, IONO, GRUP DELAY) //clock ephemeris_record.d_Toc = static_cast(read_navigation_unsigned(data_bits, CNAV_TOC)); ephemeris_record.d_Toc = ephemeris_record.d_Toc * CNAV_TOC_LSB; ephemeris_record.d_URA0 = static_cast(read_navigation_signed(data_bits, CNAV_URA_NED0)); ephemeris_record.d_URA1 = static_cast(read_navigation_unsigned(data_bits, CNAV_URA_NED1)); ephemeris_record.d_URA2 = static_cast(read_navigation_unsigned(data_bits, CNAV_URA_NED2)); ephemeris_record.d_A_f0 = static_cast(read_navigation_signed(data_bits, CNAV_AF0)); ephemeris_record.d_A_f0 = ephemeris_record.d_A_f0 * CNAV_AF0_LSB; ephemeris_record.d_A_f1 = static_cast(read_navigation_signed(data_bits, CNAV_AF1)); ephemeris_record.d_A_f1 = ephemeris_record.d_A_f1 * CNAV_AF1_LSB; ephemeris_record.d_A_f2 = static_cast(read_navigation_signed(data_bits, CNAV_AF2)); ephemeris_record.d_A_f2 = ephemeris_record.d_A_f2 * CNAV_AF2_LSB; //group delays ephemeris_record.d_TGD = static_cast(read_navigation_signed(data_bits, CNAV_TGD)); ephemeris_record.d_TGD = ephemeris_record.d_TGD * CNAV_TGD_LSB; ephemeris_record.d_ISCL1 = static_cast(read_navigation_signed(data_bits, CNAV_ISCL1)); ephemeris_record.d_ISCL1 = ephemeris_record.d_ISCL1 * CNAV_ISCL1_LSB; ephemeris_record.d_ISCL2 = static_cast(read_navigation_signed(data_bits, CNAV_ISCL2)); ephemeris_record.d_ISCL2 = ephemeris_record.d_ISCL2 * CNAV_ISCL2_LSB; ephemeris_record.d_ISCL5I = static_cast(read_navigation_signed(data_bits, CNAV_ISCL5I)); ephemeris_record.d_ISCL5I = ephemeris_record.d_ISCL5I * CNAV_ISCL5I_LSB; ephemeris_record.d_ISCL5Q = static_cast(read_navigation_signed(data_bits, CNAV_ISCL5Q)); ephemeris_record.d_ISCL5Q = ephemeris_record.d_ISCL5Q * CNAV_ISCL5Q_LSB; //iono iono_record.d_alpha0 = static_cast(read_navigation_signed(data_bits, CNAV_ALPHA0)); iono_record.d_alpha0 = iono_record.d_alpha0 * CNAV_ALPHA0_LSB; iono_record.d_alpha1 = static_cast(read_navigation_signed(data_bits, CNAV_ALPHA1)); iono_record.d_alpha1 = iono_record.d_alpha1 * CNAV_ALPHA1_LSB; iono_record.d_alpha2 = static_cast(read_navigation_signed(data_bits, CNAV_ALPHA2)); iono_record.d_alpha2 = iono_record.d_alpha2 * CNAV_ALPHA2_LSB; iono_record.d_alpha3 = static_cast(read_navigation_signed(data_bits, CNAV_ALPHA3)); iono_record.d_alpha3 = iono_record.d_alpha3 * CNAV_ALPHA3_LSB; iono_record.d_beta0 = static_cast(read_navigation_signed(data_bits, CNAV_BETA0)); iono_record.d_beta0 = iono_record.d_beta0 * CNAV_BETA0_LSB; iono_record.d_beta1 = static_cast(read_navigation_signed(data_bits, CNAV_BETA1)); iono_record.d_beta1 = iono_record.d_beta1 * CNAV_BETA1_LSB; iono_record.d_beta2 = static_cast(read_navigation_signed(data_bits, CNAV_BETA2)); iono_record.d_beta2 = iono_record.d_beta2 * CNAV_BETA2_LSB; iono_record.d_beta3 = static_cast(read_navigation_signed(data_bits, CNAV_BETA3)); iono_record.d_beta3 = iono_record.d_beta3 * CNAV_BETA3_LSB; b_flag_iono_valid = true; break; default: break; } } bool Gps_CNAV_Navigation_Message::have_new_ephemeris() //Check if we have a new ephemeris stored in the galileo navigation class { if (b_flag_ephemeris_1 == true and b_flag_ephemeris_2 == true) { if (ephemeris_record.d_Toe1 == ephemeris_record.d_Toe2) { //if all ephemeris pages have the same TOE, then they belong to the same block // std::cout << "Ephemeris (1, 2) have been received and belong to the same batch" << std::endl; b_flag_ephemeris_1 = false;// clear the flag b_flag_ephemeris_2 = false;// clear the flag return true; } else { return false; } } else { return false; } } Gps_CNAV_Ephemeris Gps_CNAV_Navigation_Message::get_ephemeris() { return ephemeris_record; } bool Gps_CNAV_Navigation_Message::have_new_iono() //Check if we have a new iono data stored in the galileo navigation class { if (b_flag_iono_valid == true) { b_flag_iono_valid = false;// clear the flag return true; } else { return false; } } Gps_CNAV_Iono Gps_CNAV_Navigation_Message::get_iono() { return iono_record; } Gps_CNAV_Utc_Model Gps_CNAV_Navigation_Message::get_utc_model() { return utc_model_record; } gnss-sdr-0.0.9/src/core/system_parameters/gps_cnav_navigation_message.h000066400000000000000000000106041305042567700264540ustar00rootroot00000000000000/*! * \file gps_cnav_navigation_message.h * \brief Interface of a GPS CNAV Data message decoder * \author Javier Arribas, 2015. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_CNAV_NAVIGATION_MESSAGE_H_ #define GNSS_SDR_GPS_CNAV_NAVIGATION_MESSAGE_H_ #include #include #include #include #include #include "GPS_L2C.h" #include "gps_cnav_ephemeris.h" #include "gps_cnav_iono.h" #include "gps_cnav_utc_model.h" //TODO: Create GPS CNAV almanac //#include "gps_almanac.h" /*! * \brief This class decodes a GPS CNAV Data message as described in IS-GPS-200H * * See http://www.gps.gov/technical/icwg/IS-GPS-200H.pdf Appendix III */ class Gps_CNAV_Navigation_Message { private: unsigned long int read_navigation_unsigned(std::bitset bits, const std::vector> parameter); signed long int read_navigation_signed(std::bitset bits, const std::vector> parameter); bool read_navigation_bool(std::bitset bits, const std::vector> parameter); void print_gps_word_bytes(unsigned int GPS_word); Gps_CNAV_Ephemeris ephemeris_record; Gps_CNAV_Iono iono_record; Gps_CNAV_Utc_Model utc_model_record; public: double d_TOW; bool b_flag_ephemeris_1; bool b_flag_ephemeris_2; bool b_flag_iono_valid; //!< If set, it indicates that the ionospheric parameters are filled (page 18 has arrived and decoded) std::map satelliteBlock; //!< Map that stores to which block the PRN belongs http://www.navcen.uscg.gov/?Do=constellationStatus // satellite positions double d_satpos_X; //!< Earth-fixed coordinate x of the satellite [m]. Intersection of the IERS Reference Meridian (IRM) and the plane passing through the origin and normal to the Z-axis. double d_satpos_Y; //!< Earth-fixed coordinate y of the satellite [m]. Completes a right-handed, Earth-Centered, Earth-Fixed orthogonal coordinate system. double d_satpos_Z; //!< Earth-fixed coordinate z of the satellite [m]. The direction of the IERS (International Earth Rotation and Reference Systems Service) Reference Pole (IRP). // satellite identification info int i_channel_ID; unsigned int i_satellite_PRN; // Satellite velocity double d_satvel_X; //!< Earth-fixed velocity coordinate x of the satellite [m] double d_satvel_Y; //!< Earth-fixed velocity coordinate y of the satellite [m] double d_satvel_Z; //!< Earth-fixed velocity coordinate z of the satellite [m] // public functions void reset(); void decode_page(std::vector data); /*! * \brief Obtain a GPS SV Ephemeris class filled with current SV data */ Gps_CNAV_Ephemeris get_ephemeris(); /*! * \brief Check if we have a new iono record stored in the galileo navigation class */ bool have_new_iono(); /*! * \brief Obtain a GPS ionospheric correction parameters class filled with current SV data */ Gps_CNAV_Iono get_iono(); /*! * \brief Obtain a GPS UTC model parameters class filled with current SV data */ Gps_CNAV_Utc_Model get_utc_model(); /*! * \brief Check if we have a new ephemeris stored in the galileo navigation class */ bool have_new_ephemeris(); /*! * Default constructor */ Gps_CNAV_Navigation_Message(); }; #endif gnss-sdr-0.0.9/src/core/system_parameters/gps_cnav_utc_model.cc000066400000000000000000000025451305042567700247270ustar00rootroot00000000000000/* * \file gps_cnav_utc_model.h * \brief Interface of a GPS CNAV UTC MODEL storage * \author Javier Arribas, 2015. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_cnav_utc_model.h" Gps_CNAV_Utc_Model::Gps_CNAV_Utc_Model() { valid = false; d_A1 = 0; d_A0 = 0; d_t_OT = 0; i_WN_T = 0; d_DeltaT_LS = 0; i_WN_LSF = 0; i_DN = 0; d_DeltaT_LSF = 0; } gnss-sdr-0.0.9/src/core/system_parameters/gps_cnav_utc_model.h000066400000000000000000000063341305042567700245710ustar00rootroot00000000000000/*! * \file gps_utc_model.h * \brief Interface of a GPS UTC MODEL storage * \author Javier Arribas, 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_CNAV_UTC_MODEL_H_ #define GNSS_SDR_GPS_CNAV_UTC_MODEL_H_ #include "boost/assign.hpp" #include /*! * \brief This class is a storage for the GPS UTC MODEL data as described in in IS-GPS-200H * * See http://www.gps.gov/technical/icwg/IS-GPS-200H.pdf Appendix III */ class Gps_CNAV_Utc_Model { public: bool valid; // UTC parameters double d_A1; //!< 1st order term of a model that relates GPS and UTC time (ref. 20.3.3.5.2.4 IS-GPS-200H) [s/s] double d_A0; //!< Constant of a model that relates GPS and UTC time (ref. 20.3.3.5.2.4 IS-GPS-200H) [s] double d_t_OT; //!< Reference time for UTC data (reference 20.3.4.5 and 20.3.3.5.2.4 IS-GPS-200H) [s] int i_WN_T; //!< UTC reference week number [weeks] double d_DeltaT_LS; //!< delta time due to leap seconds [s]. Number of leap seconds since 6-Jan-1980 as transmitted by the GPS almanac. int i_WN_LSF; //!< Week number at the end of which the leap second becomes effective [weeks] int i_DN; //!< Day number (DN) at the end of which the leap second becomes effective [days] double d_DeltaT_LSF; //!< Scheduled future or recent past (relative to NAV message upload) value of the delta time due to leap seconds [s] /*! * Default constructor */ Gps_CNAV_Utc_Model(); template /* * \brief Serialize is a boost standard method to be called by the boost XML serialization. Here is used to save the ephemeris data on disk file. */ void serialize(Archive& archive, const unsigned int version) { using boost::serialization::make_nvp; if(version){}; archive & make_nvp("valid",valid); archive & make_nvp("d_A1",d_A1); archive & make_nvp("d_A0",d_A0); archive & make_nvp("d_t_OT",d_t_OT); archive & make_nvp("i_WN_T",i_WN_T); archive & make_nvp("d_DeltaT_LS",d_DeltaT_LS); archive & make_nvp("i_WN_LSF",i_WN_LSF); archive & make_nvp("i_DN",i_DN); archive & make_nvp("d_DeltaT_LSF",d_DeltaT_LSF); } }; #endif gnss-sdr-0.0.9/src/core/system_parameters/gps_ephemeris.cc000066400000000000000000000205021305042567700237170ustar00rootroot00000000000000/*! * \file gps_ephemeris.cc * \brief Interface of a GPS EPHEMERIS storage and orbital model functions * * See http://www.gps.gov/technical/icwg/IS-GPS-200E.pdf Appendix II * \author Javier Arribas, 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_ephemeris.h" #include #include "GPS_L1_CA.h" #include "gnss_satellite.h" Gps_Ephemeris::Gps_Ephemeris() { i_satellite_PRN = 0; d_TOW = 0; d_Crs = 0; d_Delta_n = 0; d_M_0 = 0; d_Cuc = 0; d_e_eccentricity = 0; d_Cus = 0; d_sqrt_A = 0; d_Toe = 0; d_Toc = 0; d_Cic = 0; d_OMEGA0 = 0; d_Cis = 0; d_i_0 = 0; d_Crc = 0; d_OMEGA = 0; d_OMEGA_DOT = 0; d_IDOT = 0; i_code_on_L2 = 0; i_GPS_week = 0; b_L2_P_data_flag = false; i_SV_accuracy = 0; i_SV_health = 0; d_IODE_SF2 = 0; d_IODE_SF3 = 0; d_TGD = 0; // Estimated Group Delay Differential: L1-L2 correction term only for the benefit of "L1 P(Y)" or "L2 P(Y)" s users [s] d_IODC = 0; // Issue of Data, Clock i_AODO = 0; // Age of Data Offset (AODO) term for the navigation message correction table (NMCT) contained in subframe 4 (reference paragraph 20.3.3.5.1.9) [s] b_fit_interval_flag = false; // indicates the curve-fit interval used by the CS (Block II/IIA/IIR/IIR-M/IIF) and SS (Block IIIA) in determining the ephemeris parameters, as follows: 0 = 4 hours, 1 = greater than 4 hours. d_spare1 = 0; d_spare2 = 0; d_A_f0 = 0; // Coefficient 0 of code phase offset model [s] d_A_f1 = 0; // Coefficient 1 of code phase offset model [s/s] d_A_f2 = 0; // Coefficient 2 of code phase offset model [s/s^2] b_integrity_status_flag = false; b_alert_flag = false; // If true, indicates that the SV URA may be worse than indicated in d_SV_accuracy, use that SV at our own risk. b_antispoofing_flag = false; // If true, the AntiSpoofing mode is ON in that SV auto gnss_sat = Gnss_Satellite(); std::string _system ("GPS"); for(unsigned int i = 1; i < 33; i++) { satelliteBlock[i] = gnss_sat.what_block(_system, i); } d_satClkDrift = 0.0; d_dtr = 0.0; d_satpos_X = 0.0; d_satpos_Y = 0.0; d_satpos_Z = 0.0; d_satvel_X = 0.0; d_satvel_Y = 0.0; d_satvel_Z = 0.0; } double Gps_Ephemeris::check_t(double time) { double corrTime; double half_week = 302400.0; // seconds corrTime = time; if (time > half_week) { corrTime = time - 2.0 * half_week; } else if (time < -half_week) { corrTime = time + 2.0 * half_week; } return corrTime; } // 20.3.3.3.3.1 User Algorithm for SV Clock Correction. double Gps_Ephemeris::sv_clock_drift(double transmitTime) { double dt; dt = check_t(transmitTime - d_Toc); for (int i = 0; i < 2; i++) { dt -= d_A_f0 + d_A_f1 * dt + d_A_f2 * (dt * dt); } d_satClkDrift = d_A_f0 + d_A_f1 * dt + d_A_f2 * (dt * dt); return d_satClkDrift; } // compute the relativistic correction term double Gps_Ephemeris::sv_clock_relativistic_term(double transmitTime) { double tk; double a; double n; double n0; double E; double E_old; double dE; double M; // Restore semi-major axis a = d_sqrt_A * d_sqrt_A; // Time from ephemeris reference epoch tk = check_t(transmitTime - d_Toe); // Computed mean motion n0 = sqrt(GM / (a * a * a)); // Corrected mean motion n = n0 + d_Delta_n; // Mean anomaly M = d_M_0 + n * tk; // Reduce mean anomaly to between 0 and 2pi M = fmod((M + 2.0 * GPS_PI), (2.0 * GPS_PI)); // Initial guess of eccentric anomaly E = M; // --- Iteratively compute eccentric anomaly ---------------------------- for (int ii = 1; ii < 20; ii++) { E_old = E; E = M + d_e_eccentricity * sin(E); dE = fmod(E - E_old, 2.0 * GPS_PI); if (fabs(dE) < 1e-12) { //Necessary precision is reached, exit from the loop break; } } // Compute relativistic correction term d_dtr = F * d_e_eccentricity * d_sqrt_A * sin(E); return d_dtr; } double Gps_Ephemeris::satellitePosition(double transmitTime) { double tk; double a; double n; double n0; double M; double E; double E_old; double dE; double nu; double phi; double u; double r; double i; double Omega; // Find satellite's position ---------------------------------------------- // Restore semi-major axis a = d_sqrt_A * d_sqrt_A; // Time from ephemeris reference epoch tk = check_t(transmitTime - d_Toe); // Computed mean motion n0 = sqrt(GM / (a * a * a)); // Corrected mean motion n = n0 + d_Delta_n; // Mean anomaly M = d_M_0 + n * tk; // Reduce mean anomaly to between 0 and 2pi M = fmod((M + 2.0 * GPS_PI), (2.0 * GPS_PI)); // Initial guess of eccentric anomaly E = M; // --- Iteratively compute eccentric anomaly ---------------------------- for (int ii = 1; ii < 20; ii++) { E_old = E; E = M + d_e_eccentricity * sin(E); dE = fmod(E - E_old, 2.0 * GPS_PI); if (fabs(dE) < 1e-12) { //Necessary precision is reached, exit from the loop break; } } // Compute the true anomaly double tmp_Y = sqrt(1.0 - d_e_eccentricity * d_e_eccentricity) * sin(E); double tmp_X = cos(E) - d_e_eccentricity; nu = atan2(tmp_Y, tmp_X); // Compute angle phi (argument of Latitude) phi = nu + d_OMEGA; // Reduce phi to between 0 and 2*pi rad phi = fmod((phi), (2.0 * GPS_PI)); // Correct argument of latitude u = phi + d_Cuc * cos(2.0 * phi) + d_Cus * sin(2.0 * phi); // Correct radius r = a * (1.0 - d_e_eccentricity*cos(E)) + d_Crc * cos(2.0 * phi) + d_Crs * sin(2.0 * phi); // Correct inclination i = d_i_0 + d_IDOT * tk + d_Cic * cos(2.0 * phi) + d_Cis * sin(2.0 * phi); // Compute the angle between the ascending node and the Greenwich meridian Omega = d_OMEGA0 + (d_OMEGA_DOT - OMEGA_EARTH_DOT)*tk - OMEGA_EARTH_DOT * d_Toe; // Reduce to between 0 and 2*pi rad Omega = fmod((Omega + 2.0 * GPS_PI), (2.0 * GPS_PI)); // --- Compute satellite coordinates in Earth-fixed coordinates d_satpos_X = cos(u) * r * cos(Omega) - sin(u) * r * cos(i) * sin(Omega); d_satpos_Y = cos(u) * r * sin(Omega) + sin(u) * r * cos(i) * cos(Omega); d_satpos_Z = sin(u) * r * sin(i); // Satellite's velocity. Can be useful for Vector Tracking loops double Omega_dot = d_OMEGA_DOT - OMEGA_EARTH_DOT; d_satvel_X = - Omega_dot * (cos(u) * r + sin(u) * r * cos(i)) + d_satpos_X * cos(Omega) - d_satpos_Y * cos(i) * sin(Omega); d_satvel_Y = Omega_dot * (cos(u) * r * cos(Omega) - sin(u) * r * cos(i) * sin(Omega)) + d_satpos_X * sin(Omega) + d_satpos_Y * cos(i) * cos(Omega); d_satvel_Z = d_satpos_Y * sin(i); // Time from ephemeris reference clock tk = check_t(transmitTime - d_Toc); double dtr_s = d_A_f0 + d_A_f1 * tk + d_A_f2 * tk * tk; /* relativity correction */ dtr_s -= 2.0 * sqrt(GM * a) * d_e_eccentricity * sin(E) / (GPS_C_m_s * GPS_C_m_s); return dtr_s; } gnss-sdr-0.0.9/src/core/system_parameters/gps_ephemeris.h000066400000000000000000000314251305042567700235670ustar00rootroot00000000000000/*! * \file gps_ephemeris.h * \brief Interface of a GPS EPHEMERIS storage * \author Javier Arribas, 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_EPHEMERIS_H_ #define GNSS_SDR_GPS_EPHEMERIS_H_ #include #include #include "boost/assign.hpp" #include /*! * \brief This class is a storage and orbital model functions for the GPS SV ephemeris data as described in IS-GPS-200E * * See http://www.gps.gov/technical/icwg/IS-GPS-200E.pdf Appendix II */ class Gps_Ephemeris { private: /* * Accounts for the beginning or end of week crossover * * See paragraph 20.3.3.3.3.1 (IS-GPS-200E) * \param[in] - time in seconds * \param[out] - corrected time, in seconds */ double check_t(double time); public: unsigned int i_satellite_PRN; // SV PRN NUMBER double d_TOW; //!< Time of GPS Week of the ephemeris set (taken from subframes TOW) [s] double d_Crs; //!< Amplitude of the Sine Harmonic Correction Term to the Orbit Radius [m] double d_Delta_n; //!< Mean Motion Difference From Computed Value [semi-circles/s] double d_M_0; //!< Mean Anomaly at Reference Time [semi-circles] double d_Cuc; //!< Amplitude of the Cosine Harmonic Correction Term to the Argument of Latitude [rad] double d_e_eccentricity; //!< Eccentricity [dimensionless] double d_Cus; //!< Amplitude of the Sine Harmonic Correction Term to the Argument of Latitude [rad] double d_sqrt_A; //!< Square Root of the Semi-Major Axis [sqrt(m)] double d_Toe; //!< Ephemeris data reference time of week (Ref. 20.3.3.4.3 IS-GPS-200E) [s] double d_Toc; //!< clock data reference time (Ref. 20.3.3.3.3.1 IS-GPS-200E) [s] double d_Cic; //!< Amplitude of the Cosine Harmonic Correction Term to the Angle of Inclination [rad] double d_OMEGA0; //!< Longitude of Ascending Node of Orbit Plane at Weekly Epoch [semi-circles] double d_Cis; //!< Amplitude of the Sine Harmonic Correction Term to the Angle of Inclination [rad] double d_i_0; //!< Inclination Angle at Reference Time [semi-circles] double d_Crc; //!< Amplitude of the Cosine Harmonic Correction Term to the Orbit Radius [m] double d_OMEGA; //!< Argument of Perigee [semi-cicles] double d_OMEGA_DOT; //!< Rate of Right Ascension [semi-circles/s] double d_IDOT; //!< Rate of Inclination Angle [semi-circles/s] int i_code_on_L2; //!< If 1, P code ON in L2; if 2, C/A code ON in L2; int i_GPS_week; //!< GPS week number, aka WN [week] bool b_L2_P_data_flag; //!< When true, indicates that the NAV data stream was commanded OFF on the P-code of the L2 channel int i_SV_accuracy; //!< User Range Accuracy (URA) index of the SV (reference paragraph 6.2.1) for the standard positioning service user (Ref 20.3.3.3.1.3 IS-GPS-200E) int i_SV_health; double d_TGD; //!< Estimated Group Delay Differential: L1-L2 correction term only for the benefit of "L1 P(Y)" or "L2 P(Y)" s users [s] double d_IODC; //!< Issue of Data, Clock double d_IODE_SF2; //!< Issue of Data, Ephemeris (IODE), subframe 2 double d_IODE_SF3; //!< Issue of Data, Ephemeris(IODE), subframe 3 int i_AODO; //!< Age of Data Offset (AODO) term for the navigation message correction table (NMCT) contained in subframe 4 (reference paragraph 20.3.3.5.1.9) [s] bool b_fit_interval_flag;//!< indicates the curve-fit interval used by the CS (Block II/IIA/IIR/IIR-M/IIF) and SS (Block IIIA) in determining the ephemeris parameters, as follows: 0 = 4 hours, 1 = greater than 4 hours. double d_spare1; double d_spare2; double d_A_f0; //!< Coefficient 0 of code phase offset model [s] double d_A_f1; //!< Coefficient 1 of code phase offset model [s/s] double d_A_f2; //!< Coefficient 2 of code phase offset model [s/s^2] // Flags /*! \brief If true, enhanced level of integrity assurance. * * If false, indicates that the conveying signal is provided with the legacy level of integrity assurance. * That is, the probability that the instantaneous URE of the conveying signal exceeds 4.42 times the upper bound * value of the current broadcast URA index, for more than 5.2 seconds, without an accompanying alert, is less * than 1E-5 per hour. If true, indicates that the conveying signal is provided with an enhanced level of * integrity assurance. That is, the probability that the instantaneous URE of the conveying signal exceeds 5.73 * times the upper bound value of the current broadcast URA index, for more than 5.2 seconds, without an * accompanying alert, is less than 1E-8 per hour. */ bool b_integrity_status_flag; bool b_alert_flag; //!< If true, indicates that the SV URA may be worse than indicated in d_SV_accuracy, use that SV at our own risk. bool b_antispoofing_flag; //!< If true, the AntiSpoofing mode is ON in that SV // clock terms derived from ephemeris data double d_satClkDrift; //!< GPS clock error double d_dtr; //!< relativistic clock correction term // satellite positions double d_satpos_X; //!< Earth-fixed coordinate x of the satellite [m]. Intersection of the IERS Reference Meridian (IRM) and the plane passing through the origin and normal to the Z-axis. double d_satpos_Y; //!< Earth-fixed coordinate y of the satellite [m]. Completes a right-handed, Earth-Centered, Earth-Fixed orthogonal coordinate system. double d_satpos_Z; //!< Earth-fixed coordinate z of the satellite [m]. The direction of the IERS (International Earth Rotation and Reference Systems Service) Reference Pole (IRP). // Satellite velocity double d_satvel_X; //!< Earth-fixed velocity coordinate x of the satellite [m] double d_satvel_Y; //!< Earth-fixed velocity coordinate y of the satellite [m] double d_satvel_Z; //!< Earth-fixed velocity coordinate z of the satellite [m] std::map satelliteBlock; //!< Map that stores to which block the PRN belongs http://www.navcen.uscg.gov/?Do=constellationStatus template /*! * \brief Serialize is a boost standard method to be called by the boost XML serialization. Here is used to save the ephemeris data on disk file. */ void serialize(Archive& archive, const unsigned int version) { using boost::serialization::make_nvp; if(version){}; archive & make_nvp("i_satellite_PRN", i_satellite_PRN); // SV PRN NUMBER archive & make_nvp("d_TOW", d_TOW); //!< Time of GPS Week of the ephemeris set (taken from subframes TOW) [s] archive & make_nvp("d_IODE_SF2", d_IODE_SF2); archive & make_nvp("d_IODE_SF3", d_IODE_SF3); archive & make_nvp("d_Crs", d_Crs); //!< Amplitude of the Sine Harmonic Correction Term to the Orbit Radius [m] archive & make_nvp("d_Delta_n", d_Delta_n); //!< Mean Motion Difference From Computed Value [semi-circles/s] archive & make_nvp("d_M_0", d_M_0); //!< Mean Anomaly at Reference Time [semi-circles] archive & make_nvp("d_Cuc", d_Cuc); //!< Amplitude of the Cosine Harmonic Correction Term to the Argument of Latitude [rad] archive & make_nvp("d_e_eccentricity", d_e_eccentricity); //!< Eccentricity [dimensionless] archive & make_nvp("d_Cus", d_Cus); //!< Amplitude of the Sine Harmonic Correction Term to the Argument of Latitude [rad] archive & make_nvp("d_sqrt_A", d_sqrt_A); //!< Square Root of the Semi-Major Axis [sqrt(m)] archive & make_nvp("d_Toe", d_Toe); //!< Ephemeris data reference time of week (Ref. 20.3.3.4.3 IS-GPS-200E) [s] archive & make_nvp("d_Toc", d_Toe); //!< clock data reference time (Ref. 20.3.3.3.3.1 IS-GPS-200E) [s] archive & make_nvp("d_Cic", d_Cic); //!< Amplitude of the Cosine Harmonic Correction Term to the Angle of Inclination [rad] archive & make_nvp("d_OMEGA0", d_OMEGA0); //!< Longitude of Ascending Node of Orbit Plane at Weekly Epoch [semi-circles] archive & make_nvp("d_Cis", d_Cis); //!< Amplitude of the Sine Harmonic Correction Term to the Angle of Inclination [rad] archive & make_nvp("d_i_0", d_i_0); //!< Inclination Angle at Reference Time [semi-circles] archive & make_nvp("d_Crc", d_Crc); //!< Amplitude of the Cosine Harmonic Correction Term to the Orbit Radius [m] archive & make_nvp("d_OMEGA", d_OMEGA); //!< Argument of Perigee [semi-cicles] archive & make_nvp("d_OMEGA_DOT", d_OMEGA_DOT); //!< Rate of Right Ascension [semi-circles/s] archive & make_nvp("d_IDOT", d_IDOT); //!< Rate of Inclination Angle [semi-circles/s] archive & make_nvp("i_code_on_L2", i_code_on_L2); //!< If 1, P code ON in L2; if 2, C/A code ON in L2; archive & make_nvp("i_GPS_week", i_GPS_week); //!< GPS week number, aka WN [week] archive & make_nvp("b_L2_P_data_flag", b_L2_P_data_flag); //!< When true, indicates that the NAV data stream was commanded OFF on the P-code of the L2 channel archive & make_nvp("i_SV_accuracy", i_SV_accuracy); //!< User Range Accuracy (URA) index of the SV (reference paragraph 6.2.1) for the standard positioning service user (Ref 20.3.3.3.1.3 IS-GPS-200E) archive & make_nvp("i_SV_health", i_SV_health); archive & make_nvp("d_TGD", d_TGD); //!< Estimated Group Delay Differential: L1-L2 correction term only for the benefit of "L1 P(Y)" or "L2 P(Y)" s users [s] archive & make_nvp("d_IODC", d_IODC); //!< Issue of Data, Clock archive & make_nvp("i_AODO", i_AODO); //!< Age of Data Offset (AODO) term for the navigation message correction table (NMCT) contained in subframe 4 (reference paragraph 20.3.3.5.1.9) [s] archive & make_nvp("b_fit_interval_flag", b_fit_interval_flag);//!< indicates the curve-fit interval used by the CS (Block II/IIA/IIR/IIR-M/IIF) and SS (Block IIIA) in determining the ephemeris parameters, as follows: 0 = 4 hours, 1 = greater than 4 hours. archive & make_nvp("d_spare1", d_spare1); archive & make_nvp("d_spare2", d_spare2); archive & make_nvp("d_A_f0", d_A_f0); //!< Coefficient 0 of code phase offset model [s] archive & make_nvp("d_A_f1", d_A_f1); //!< Coefficient 1 of code phase offset model [s/s] archive & make_nvp("d_A_f2", d_A_f2); //!< Coefficient 2 of code phase offset model [s/s^2] archive & make_nvp("b_integrity_status_flag", b_integrity_status_flag); archive & make_nvp("b_alert_flag", b_alert_flag); //!< If true, indicates that the SV URA may be worse than indicated in d_SV_accuracy, use that SV at our own risk. archive & make_nvp("b_antispoofing_flag", b_antispoofing_flag); //!< If true, the AntiSpoofing mode is ON in that SV } /*! * \brief Compute the ECEF SV coordinates and ECEF velocity * Implementation of Table 20-IV (IS-GPS-200E) * and compute the clock bias term including relativistic effect (return value) */ double satellitePosition(double transmitTime); /*! * \brief Sets (\a d_satClkDrift)and returns the clock drift in seconds according to the User Algorithm for SV Clock Correction * (IS-GPS-200E, 20.3.3.3.3.1) */ double sv_clock_drift(double transmitTime); /*! * \brief Sets (\a d_dtr) and returns the clock relativistic correction term in seconds according to the User Algorithm for SV Clock Correction * (IS-GPS-200E, 20.3.3.3.3.1) */ double sv_clock_relativistic_term(double transmitTime); /*! * Default constructor */ Gps_Ephemeris(); }; #endif gnss-sdr-0.0.9/src/core/system_parameters/gps_iono.cc000066400000000000000000000026371305042567700227130ustar00rootroot00000000000000/*! * \file gps_iono.cc * \brief Interface of a GPS IONOSPHERIC MODEL storage * * See http://www.gps.gov/technical/icwg/IS-GPS-200E.pdf Appendix II * \author Javier Arribas, 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_iono.h" Gps_Iono::Gps_Iono() { valid = false; d_alpha0 = 0.0; d_alpha1 = 0.0; d_alpha2 = 0.0; d_alpha3 = 0.0; d_beta0 = 0.0; d_beta1 = 0.0; d_beta2 = 0.0; d_beta3 = 0.0; } gnss-sdr-0.0.9/src/core/system_parameters/gps_iono.h000066400000000000000000000063551305042567700225560ustar00rootroot00000000000000/*! * \file gps_iono.h * \brief Interface of a GPS IONOSPHERIC MODEL storage * \author Javier Arribas, 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_IONO_H_ #define GNSS_SDR_GPS_IONO_H_ #include "boost/assign.hpp" #include /*! * \brief This class is a storage for the GPS IONOSPHERIC data as described in IS-GPS-200E * * See http://www.gps.gov/technical/icwg/IS-GPS-200E.pdf Appendix II */ class Gps_Iono { public: bool valid; //!< Valid flag // Ionospheric parameters double d_alpha0; //!< Coefficient 0 of a cubic equation representing the amplitude of the vertical delay [s] double d_alpha1; //!< Coefficient 1 of a cubic equation representing the amplitude of the vertical delay [s/semi-circle] double d_alpha2; //!< Coefficient 2 of a cubic equation representing the amplitude of the vertical delay [s(semi-circle)^2] double d_alpha3; //!< Coefficient 3 of a cubic equation representing the amplitude of the vertical delay [s(semi-circle)^3] double d_beta0; //!< Coefficient 0 of a cubic equation representing the period of the model [s] double d_beta1; //!< Coefficient 1 of a cubic equation representing the period of the model [s/semi-circle] double d_beta2; //!< Coefficient 2 of a cubic equation representing the period of the model [s(semi-circle)^2] double d_beta3; //!< Coefficient 3 of a cubic equation representing the period of the model [s(semi-circle)^3] Gps_Iono(); //!< Default constructor template /*! * \brief Serialize is a boost standard method to be called by the boost XML serialization. Here is used to save the ephemeris data on disk file. */ void serialize(Archive& archive, const unsigned int version) { using boost::serialization::make_nvp; if(version){}; archive & make_nvp("d_alpha0",d_alpha0); archive & make_nvp("d_alpha1",d_alpha1); archive & make_nvp("d_alpha2",d_alpha2); archive & make_nvp("d_alpha3",d_alpha3); archive & make_nvp("d_beta0",d_beta0); archive & make_nvp("d_beta1",d_beta1); archive & make_nvp("d_beta2",d_beta2); archive & make_nvp("d_beta3",d_beta3); } }; #endif gnss-sdr-0.0.9/src/core/system_parameters/gps_navigation_message.cc000066400000000000000000001004051305042567700256020ustar00rootroot00000000000000/*! m * \file gps_navigation_message.cc * \brief Implementation of a GPS NAV Data message decoder as described in IS-GPS-200E * * See http://www.gps.gov/technical/icwg/IS-GPS-200E.pdf Appendix II * \author Javier Arribas, 2011. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_navigation_message.h" #include #include #include void Gps_Navigation_Message::reset() { b_valid_ephemeris_set_flag = false; d_TOW = 0; d_TOW_SF1 = 0; d_TOW_SF2 = 0; d_TOW_SF3 = 0; d_TOW_SF4 = 0; d_TOW_SF5 = 0; d_IODE_SF2 = 0; d_IODE_SF3 = 0; d_Crs = 0; d_Delta_n = 0; d_M_0 = 0; d_Cuc = 0; d_e_eccentricity = 0; d_Cus = 0; d_sqrt_A = 0; d_Toe = 0; d_Toc = 0; d_Cic = 0; d_OMEGA0 = 0; d_Cis = 0; d_i_0 = 0; d_Crc = 0; d_OMEGA = 0; d_OMEGA_DOT = 0; d_IDOT = 0; i_code_on_L2 = 0; i_GPS_week = 0; b_L2_P_data_flag = false; i_SV_accuracy = 0; i_SV_health = 0; d_TGD = 0; d_IODC = -1; i_AODO = 0; b_fit_interval_flag = false; d_spare1 = 0; d_spare2 = 0; d_A_f0 = 0; d_A_f1 = 0; d_A_f2 = 0; //clock terms //d_master_clock=0; d_dtr = 0; d_satClkCorr = 0; d_satClkDrift = 0; // satellite positions d_satpos_X = 0; d_satpos_Y = 0; d_satpos_Z = 0; // info i_channel_ID = 0; i_satellite_PRN = 0; // time synchro d_subframe_timestamp_ms = 0; // flags b_alert_flag = false; b_integrity_status_flag = false; b_antispoofing_flag = false; // Ionosphere and UTC flag_iono_valid = false; flag_utc_model_valid = false; d_alpha0 = 0; d_alpha1 = 0; d_alpha2 = 0; d_alpha3 = 0; d_beta0 = 0; d_beta1 = 0; d_beta2 = 0; d_beta3 = 0; d_A1 = 0; d_A0 = 0; d_t_OT = 0; i_WN_T = 0; d_DeltaT_LS = 0; i_WN_LSF = 0; i_DN = 0; d_DeltaT_LSF= 0; //Almanac d_Toa = 0; i_WN_A = 0; for (int i=1; i < 32; i++ ) { almanacHealth[i] = 0; } // Satellite velocity d_satvel_X = 0; d_satvel_Y = 0; d_satvel_Z = 0; auto gnss_sat = Gnss_Satellite(); std::string _system ("GPS"); for(unsigned int i = 1; i < 33; i++) { satelliteBlock[i] = gnss_sat.what_block(_system, i); } } Gps_Navigation_Message::Gps_Navigation_Message() { reset(); } void Gps_Navigation_Message::print_gps_word_bytes(unsigned int GPS_word) { std::cout << " Word ="; std::cout << std::bitset<32>(GPS_word); std::cout << std::endl; } bool Gps_Navigation_Message::read_navigation_bool(std::bitset bits, const std::vector> parameter) { bool value; if (bits[GPS_SUBFRAME_BITS - parameter[0].first] == 1) { value = true; } else { value = false; } return value; } unsigned long int Gps_Navigation_Message::read_navigation_unsigned(std::bitset bits, const std::vector> parameter) { unsigned long int value = 0; int num_of_slices = parameter.size(); for (int i = 0; i < num_of_slices; i++) { for (int j = 0; j < parameter[i].second; j++) { value <<= 1; //shift left if (bits[GPS_SUBFRAME_BITS - parameter[i].first - j] == 1) { value += 1; // insert the bit } } } return value; } signed long int Gps_Navigation_Message::read_navigation_signed(std::bitset bits, const std::vector> parameter) { signed long int value = 0; int num_of_slices = parameter.size(); // Discriminate between 64 bits and 32 bits compiler int long_int_size_bytes = sizeof(signed long int); if (long_int_size_bytes == 8) // if a long int takes 8 bytes, we are in a 64 bits system { // read the MSB and perform the sign extension if (bits[GPS_SUBFRAME_BITS - parameter[0].first] == 1) { value ^= 0xFFFFFFFFFFFFFFFF; //64 bits variable } else { value &= 0; } for (int i = 0; i < num_of_slices; i++) { for (int j = 0; j < parameter[i].second; j++) { value <<= 1; //shift left value &= 0xFFFFFFFFFFFFFFFE; //reset the corresponding bit (for the 64 bits variable) if (bits[GPS_SUBFRAME_BITS - parameter[i].first - j] == 1) { value += 1; // insert the bit } } } } else // we assume we are in a 32 bits system { // read the MSB and perform the sign extension if (bits[GPS_SUBFRAME_BITS - parameter[0].first] == 1) { value ^= 0xFFFFFFFF; } else { value &= 0; } for (int i = 0; i < num_of_slices; i++) { for (int j = 0; j < parameter[i].second; j++) { value <<= 1; //shift left value &= 0xFFFFFFFE; //reset the corresponding bit if (bits[GPS_SUBFRAME_BITS - parameter[i].first - j] == 1) { value += 1; // insert the bit } } } } return value; } double Gps_Navigation_Message::check_t(double time) { double corrTime; double half_week = 302400; // seconds corrTime = time; if (time > half_week) { corrTime = time - 2 * half_week; } else if (time < -half_week) { corrTime = time + 2 * half_week; } return corrTime; } // 20.3.3.3.3.1 User Algorithm for SV Clock Correction. double Gps_Navigation_Message::sv_clock_correction(double transmitTime) { double dt; dt = check_t(transmitTime - d_Toc); d_satClkCorr = (d_A_f2 * dt + d_A_f1) * dt + d_A_f0 + d_dtr; double correctedTime = transmitTime - d_satClkCorr; return correctedTime; } void Gps_Navigation_Message::satellitePosition(double transmitTime) { double tk; double a; double n; double n0; double M; double E; double E_old; double dE; double nu; double phi; double u; double r; double i; double Omega; // Find satellite's position ---------------------------------------------- // Restore semi-major axis a = d_sqrt_A * d_sqrt_A; // Time from ephemeris reference epoch tk = check_t(transmitTime - d_Toe); // Computed mean motion n0 = sqrt(GM / (a * a * a)); // Corrected mean motion n = n0 + d_Delta_n; // Mean anomaly M = d_M_0 + n * tk; // Reduce mean anomaly to between 0 and 2pi M = fmod((M + 2 * GPS_PI), (2 * GPS_PI)); // Initial guess of eccentric anomaly E = M; // --- Iteratively compute eccentric anomaly ---------------------------- for (int ii = 1; ii < 20; ii++) { E_old = E; E = M + d_e_eccentricity * sin(E); dE = fmod(E - E_old, 2 * GPS_PI); if (fabs(dE) < 1e-12) { //Necessary precision is reached, exit from the loop break; } } // Compute relativistic correction term d_dtr = F * d_e_eccentricity * d_sqrt_A * sin(E); // Compute the true anomaly double tmp_Y = sqrt(1.0 - d_e_eccentricity * d_e_eccentricity) * sin(E); double tmp_X = cos(E) - d_e_eccentricity; nu = atan2(tmp_Y, tmp_X); // Compute angle phi (argument of Latitude) phi = nu + d_OMEGA; // Reduce phi to between 0 and 2*pi rad phi = fmod((phi), (2 * GPS_PI)); // Correct argument of latitude u = phi + d_Cuc * cos(2 * phi) + d_Cus * sin(2 * phi); // Correct radius r = a * (1 - d_e_eccentricity * cos(E)) + d_Crc * cos(2 * phi) + d_Crs * sin(2 * phi); // Correct inclination i = d_i_0 + d_IDOT * tk + d_Cic * cos(2 * phi) + d_Cis * sin(2 * phi); // Compute the angle between the ascending node and the Greenwich meridian Omega = d_OMEGA0 + (d_OMEGA_DOT - OMEGA_EARTH_DOT) * tk - OMEGA_EARTH_DOT * d_Toe; // Reduce to between 0 and 2*pi rad Omega = fmod((Omega + 2 * GPS_PI), (2 * GPS_PI)); // --- Compute satellite coordinates in Earth-fixed coordinates d_satpos_X = cos(u) * r * cos(Omega) - sin(u) * r * cos(i) * sin(Omega); d_satpos_Y = cos(u) * r * sin(Omega) + sin(u) * r * cos(i) * cos(Omega); d_satpos_Z = sin(u) * r * sin(i); // Satellite's velocity. Can be useful for Vector Tracking loops double Omega_dot = d_OMEGA_DOT - OMEGA_EARTH_DOT; d_satvel_X = - Omega_dot * (cos(u) * r + sin(u) * r * cos(i)) + d_satpos_X * cos(Omega) - d_satpos_Y * cos(i) * sin(Omega); d_satvel_Y = Omega_dot * (cos(u) * r * cos(Omega) - sin(u) * r * cos(i) * sin(Omega)) + d_satpos_X * sin(Omega) + d_satpos_Y * cos(i) * cos(Omega); d_satvel_Z = d_satpos_Y * sin(i); } int Gps_Navigation_Message::subframe_decoder(char *subframe) { int subframe_ID = 0; //double tmp_TOW; unsigned int gps_word; // UNPACK BYTES TO BITS AND REMOVE THE CRC REDUNDANCE std::bitset subframe_bits; std::bitset word_bits; for (int i = 0; i < 10; i++) { memcpy(&gps_word, &subframe[i * 4], sizeof(char) * 4); word_bits = std::bitset<(GPS_WORD_BITS + 2) > (gps_word); for (int j = 0; j < GPS_WORD_BITS; j++) { subframe_bits[GPS_WORD_BITS * (9 - i) + j] = word_bits[j]; } } subframe_ID = static_cast(read_navigation_unsigned(subframe_bits, SUBFRAME_ID)); // Decode all 5 sub-frames switch (subframe_ID) { //--- Decode the sub-frame id ------------------------------------------ // ICD (IS-GPS-200E Appendix II). http://www.losangeles.af.mil/shared/media/document/AFD-100813-045.pdf case 1: //--- It is subframe 1 ------------------------------------- // Compute the time of week (TOW) of the first sub-frames in the array ==== // The transmitted TOW is actual TOW of the next subframe // (the variable subframe at this point contains bits of the last subframe). //TOW = bin2dec(subframe(31:47)) * 6; d_TOW_SF1 = static_cast(read_navigation_unsigned(subframe_bits, TOW)); //we are in the first subframe (the transmitted TOW is the start time of the next subframe) ! d_TOW_SF1 = d_TOW_SF1 * 6; d_TOW = d_TOW_SF1; // Set transmission time b_integrity_status_flag = read_navigation_bool(subframe_bits, INTEGRITY_STATUS_FLAG); b_alert_flag = read_navigation_bool(subframe_bits, ALERT_FLAG); b_antispoofing_flag = read_navigation_bool(subframe_bits, ANTI_SPOOFING_FLAG); i_GPS_week = static_cast(read_navigation_unsigned(subframe_bits, GPS_WEEK)); i_SV_accuracy = static_cast(read_navigation_unsigned(subframe_bits, SV_ACCURACY)); // (20.3.3.3.1.3) i_SV_health = static_cast(read_navigation_unsigned(subframe_bits, SV_HEALTH)); b_L2_P_data_flag = read_navigation_bool(subframe_bits, L2_P_DATA_FLAG); // i_code_on_L2 = static_cast(read_navigation_unsigned(subframe_bits, CA_OR_P_ON_L2)); d_TGD = static_cast(read_navigation_signed(subframe_bits, T_GD)); d_TGD = d_TGD * T_GD_LSB; d_IODC = static_cast(read_navigation_unsigned(subframe_bits, IODC)); d_Toc = static_cast(read_navigation_unsigned(subframe_bits, T_OC)); d_Toc = d_Toc * T_OC_LSB; d_A_f0 = static_cast(read_navigation_signed(subframe_bits, A_F0)); d_A_f0 = d_A_f0 * A_F0_LSB; d_A_f1 = static_cast(read_navigation_signed(subframe_bits, A_F1)); d_A_f1 = d_A_f1 * A_F1_LSB; d_A_f2 = static_cast(read_navigation_signed(subframe_bits, A_F2)); d_A_f2 = d_A_f2 * A_F2_LSB; break; case 2: //--- It is subframe 2 ------------------- d_TOW_SF2 = static_cast(read_navigation_unsigned(subframe_bits, TOW)); d_TOW_SF2 = d_TOW_SF2 * 6; d_TOW = d_TOW_SF2; // Set transmission time b_integrity_status_flag = read_navigation_bool(subframe_bits, INTEGRITY_STATUS_FLAG); b_alert_flag = read_navigation_bool(subframe_bits, ALERT_FLAG); b_antispoofing_flag = read_navigation_bool(subframe_bits, ANTI_SPOOFING_FLAG); d_IODE_SF2 = static_cast(read_navigation_unsigned(subframe_bits, IODE_SF2)); d_Crs = static_cast(read_navigation_signed(subframe_bits, C_RS)); d_Crs = d_Crs * C_RS_LSB; d_Delta_n = static_cast(read_navigation_signed(subframe_bits, DELTA_N)); d_Delta_n = d_Delta_n * DELTA_N_LSB; d_M_0 = static_cast(read_navigation_signed(subframe_bits, M_0)); d_M_0 = d_M_0 * M_0_LSB; d_Cuc = static_cast(read_navigation_signed(subframe_bits, C_UC)); d_Cuc = d_Cuc * C_UC_LSB; d_e_eccentricity = static_cast(read_navigation_unsigned(subframe_bits, E)); d_e_eccentricity = d_e_eccentricity * E_LSB; d_Cus = static_cast(read_navigation_signed(subframe_bits, C_US)); d_Cus = d_Cus * C_US_LSB; d_sqrt_A = static_cast(read_navigation_unsigned(subframe_bits, SQRT_A)); d_sqrt_A = d_sqrt_A * SQRT_A_LSB; d_Toe = static_cast(read_navigation_unsigned(subframe_bits, T_OE)); d_Toe = d_Toe * T_OE_LSB; b_fit_interval_flag = read_navigation_bool(subframe_bits, FIT_INTERVAL_FLAG); i_AODO = static_cast(read_navigation_unsigned(subframe_bits, AODO)); i_AODO = i_AODO * AODO_LSB; break; case 3: // --- It is subframe 3 ------------------------------------- d_TOW_SF3 = static_cast(read_navigation_unsigned(subframe_bits, TOW)); d_TOW_SF3 = d_TOW_SF3 * 6; d_TOW = d_TOW_SF3; // Set transmission time b_integrity_status_flag = read_navigation_bool(subframe_bits, INTEGRITY_STATUS_FLAG); b_alert_flag = read_navigation_bool(subframe_bits, ALERT_FLAG); b_antispoofing_flag = read_navigation_bool(subframe_bits, ANTI_SPOOFING_FLAG); d_Cic = static_cast(read_navigation_signed(subframe_bits, C_IC)); d_Cic = d_Cic * C_IC_LSB; d_OMEGA0 = static_cast(read_navigation_signed(subframe_bits, OMEGA_0)); d_OMEGA0 = d_OMEGA0 * OMEGA_0_LSB; d_Cis = static_cast(read_navigation_signed(subframe_bits, C_IS)); d_Cis = d_Cis * C_IS_LSB; d_i_0 = static_cast(read_navigation_signed(subframe_bits, I_0)); d_i_0 = d_i_0 * I_0_LSB; d_Crc = static_cast(read_navigation_signed(subframe_bits, C_RC)); d_Crc = d_Crc * C_RC_LSB; d_OMEGA = static_cast(read_navigation_signed(subframe_bits, OMEGA)); d_OMEGA = d_OMEGA * OMEGA_LSB; d_OMEGA_DOT = static_cast(read_navigation_signed(subframe_bits, OMEGA_DOT)); d_OMEGA_DOT = d_OMEGA_DOT * OMEGA_DOT_LSB; d_IODE_SF3 = static_cast(read_navigation_unsigned(subframe_bits, IODE_SF3)); d_IDOT = static_cast(read_navigation_signed(subframe_bits, I_DOT)); d_IDOT = d_IDOT * I_DOT_LSB; break; case 4: // --- It is subframe 4 ---------- Almanac, ionospheric model, UTC parameters, SV health (PRN: 25-32) int SV_data_ID; int SV_page; d_TOW_SF4 = static_cast(read_navigation_unsigned(subframe_bits, TOW)); d_TOW_SF4 = d_TOW_SF4 * 6; d_TOW = d_TOW_SF4; // Set transmission time b_integrity_status_flag = read_navigation_bool(subframe_bits, INTEGRITY_STATUS_FLAG); b_alert_flag = read_navigation_bool(subframe_bits, ALERT_FLAG); b_antispoofing_flag = read_navigation_bool(subframe_bits, ANTI_SPOOFING_FLAG); SV_data_ID = static_cast(read_navigation_unsigned(subframe_bits, SV_DATA_ID)); SV_page = static_cast(read_navigation_unsigned(subframe_bits, SV_PAGE)); if (SV_page > 24 && SV_page < 33) // Page 4 (from Table 20-V. Data IDs and SV IDs in Subframes 4 and 5, IS-GPS-200H, page 110) { //! \TODO read almanac if(SV_data_ID){} } if (SV_page == 52) // Page 13 (from Table 20-V. Data IDs and SV IDs in Subframes 4 and 5, IS-GPS-200H, page 110) { //! \TODO read Estimated Range Deviation (ERD) values } if (SV_page == 56) // Page 18 (from Table 20-V. Data IDs and SV IDs in Subframes 4 and 5, IS-GPS-200H, page 110) { // Page 18 - Ionospheric and UTC data d_alpha0 = static_cast(read_navigation_signed(subframe_bits, ALPHA_0)); d_alpha0 = d_alpha0 * ALPHA_0_LSB; d_alpha1 = static_cast(read_navigation_signed(subframe_bits, ALPHA_1)); d_alpha1 = d_alpha1 * ALPHA_1_LSB; d_alpha2 = static_cast(read_navigation_signed(subframe_bits, ALPHA_2)); d_alpha2 = d_alpha2 * ALPHA_2_LSB; d_alpha3 = static_cast(read_navigation_signed(subframe_bits, ALPHA_3)); d_alpha3 = d_alpha3 * ALPHA_3_LSB; d_beta0 = static_cast(read_navigation_signed(subframe_bits, BETA_0)); d_beta0 = d_beta0 * BETA_0_LSB; d_beta1 = static_cast(read_navigation_signed(subframe_bits, BETA_1)); d_beta1 = d_beta1 * BETA_1_LSB; d_beta2 = static_cast(read_navigation_signed(subframe_bits, BETA_2)); d_beta2 = d_beta2 * BETA_2_LSB; d_beta3 = static_cast(read_navigation_signed(subframe_bits, BETA_3)); d_beta3 = d_beta3 * BETA_3_LSB; d_A1 = static_cast(read_navigation_signed(subframe_bits, A_1)); d_A1 = d_A1 * A_1_LSB; d_A0 = static_cast(read_navigation_signed(subframe_bits, A_0)); d_A0 = d_A0 * A_0_LSB; d_t_OT = static_cast(read_navigation_unsigned(subframe_bits, T_OT)); d_t_OT = d_t_OT * T_OT_LSB; i_WN_T = static_cast(read_navigation_unsigned(subframe_bits, WN_T)); d_DeltaT_LS = static_cast(read_navigation_signed(subframe_bits, DELTAT_LS)); i_WN_LSF = static_cast(read_navigation_unsigned(subframe_bits, WN_LSF)); i_DN = static_cast(read_navigation_unsigned(subframe_bits, DN)); // Right-justified ? d_DeltaT_LSF = static_cast(read_navigation_signed(subframe_bits, DELTAT_LSF)); flag_iono_valid = true; flag_utc_model_valid = true; } if (SV_page == 57) { // Reserved } if (SV_page == 63) // Page 25 (from Table 20-V. Data IDs and SV IDs in Subframes 4 and 5, IS-GPS-200H, page 110) { // Page 25 Anti-Spoofing, SV config and almanac health (PRN: 25-32) //! \TODO Read Anti-Spoofing, SV config almanacHealth[25] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV25)); almanacHealth[26] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV26)); almanacHealth[27] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV27)); almanacHealth[28] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV28)); almanacHealth[29] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV29)); almanacHealth[30] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV30)); almanacHealth[31] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV31)); almanacHealth[32] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV32)); } break; case 5://--- It is subframe 5 -----------------almanac health (PRN: 1-24) and Almanac reference week number and time. int SV_data_ID_5; int SV_page_5; d_TOW_SF5 = static_cast(read_navigation_unsigned(subframe_bits, TOW)); d_TOW_SF5 = d_TOW_SF5 * 6; d_TOW = d_TOW_SF5; // Set transmission time b_integrity_status_flag = read_navigation_bool(subframe_bits, INTEGRITY_STATUS_FLAG); b_alert_flag = read_navigation_bool(subframe_bits, ALERT_FLAG); b_antispoofing_flag = read_navigation_bool(subframe_bits, ANTI_SPOOFING_FLAG); SV_data_ID_5 = static_cast(read_navigation_unsigned(subframe_bits, SV_DATA_ID)); SV_page_5 = static_cast(read_navigation_unsigned(subframe_bits, SV_PAGE)); if (SV_page_5 < 25) { //! \TODO read almanac if(SV_data_ID_5){} } if (SV_page_5 == 51) // Page 25 (from Table 20-V. Data IDs and SV IDs in Subframes 4 and 5, IS-GPS-200H, page 110) { d_Toa = static_cast(read_navigation_unsigned(subframe_bits, T_OA)); d_Toa = d_Toa * T_OA_LSB; i_WN_A = static_cast(read_navigation_unsigned(subframe_bits, WN_A)); almanacHealth[1] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV1)); almanacHealth[2] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV2)); almanacHealth[3] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV3)); almanacHealth[4] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV4)); almanacHealth[5] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV5)); almanacHealth[6] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV6)); almanacHealth[7] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV7)); almanacHealth[8] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV8)); almanacHealth[9] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV9)); almanacHealth[10] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV10)); almanacHealth[11] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV11)); almanacHealth[12] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV12)); almanacHealth[13] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV13)); almanacHealth[14] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV14)); almanacHealth[15] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV15)); almanacHealth[16] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV16)); almanacHealth[17] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV17)); almanacHealth[18] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV18)); almanacHealth[19] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV19)); almanacHealth[20] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV20)); almanacHealth[21] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV21)); almanacHealth[22] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV22)); almanacHealth[23] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV23)); almanacHealth[24] = static_cast(read_navigation_unsigned(subframe_bits, HEALTH_SV24)); } break; default: break; } // switch subframeID ... return subframe_ID; } double Gps_Navigation_Message::utc_time(const double gpstime_corrected) const { double t_utc; double t_utc_daytime; double Delta_t_UTC = d_DeltaT_LS + d_A0 + d_A1 * (gpstime_corrected - d_t_OT + 604800 * static_cast((i_GPS_week - i_WN_T))); // Determine if the effectivity time of the leap second event is in the past int weeksToLeapSecondEvent = i_WN_LSF - i_GPS_week; if ((weeksToLeapSecondEvent) >= 0) // is not in the past { //Detect if the effectivity time and user's time is within six hours = 6 * 60 *60 = 21600 s int secondOfLeapSecondEvent = i_DN * 24 * 60 * 60; if (weeksToLeapSecondEvent > 0) { t_utc_daytime = fmod(gpstime_corrected - Delta_t_UTC, 86400); } else //we are in the same week than the leap second event { if (std::abs(gpstime_corrected - secondOfLeapSecondEvent) > 21600) { /* 20.3.3.5.2.4a * Whenever the effectivity time indicated by the WN_LSF and the DN values * is not in the past (relative to the user's present time), and the user's * present time does not fall in the time span which starts at six hours prior * to the effectivity time and ends at six hours after the effectivity time, * the UTC/GPS-time relationship is given by */ t_utc_daytime = fmod(gpstime_corrected - Delta_t_UTC, 86400); } else { /* 20.3.3.5.2.4b * Whenever the user's current time falls within the time span of six hours * prior to the effectivity time to six hours after the effectivity time, * proper accommodation of the leap second event with a possible week number * transition is provided by the following expression for UTC: */ int W = fmod(gpstime_corrected - Delta_t_UTC - 43200, 86400) + 43200; t_utc_daytime = fmod(W, 86400 + d_DeltaT_LSF - d_DeltaT_LS); //implement something to handle a leap second event! } if ( (gpstime_corrected - secondOfLeapSecondEvent) > 21600) { Delta_t_UTC = d_DeltaT_LSF + d_A0 + d_A1 * (gpstime_corrected - d_t_OT + 604800 * static_cast((i_GPS_week - i_WN_T))); t_utc_daytime = fmod(gpstime_corrected - Delta_t_UTC, 86400); } } } else // the effectivity time is in the past { /* 20.3.3.5.2.4c * Whenever the effectivity time of the leap second event, as indicated by the * WNLSF and DN values, is in the "past" (relative to the user's current time), * and the user�s current time does not fall in the time span as given above * in 20.3.3.5.2.4b,*/ Delta_t_UTC = d_DeltaT_LSF + d_A0 + d_A1 * (gpstime_corrected - d_t_OT + 604800 * static_cast((i_GPS_week - i_WN_T))); t_utc_daytime = fmod(gpstime_corrected - Delta_t_UTC, 86400); } double secondsOfWeekBeforeToday = 43200 * floor(gpstime_corrected / 43200); t_utc = secondsOfWeekBeforeToday + t_utc_daytime; return t_utc; } Gps_Ephemeris Gps_Navigation_Message::get_ephemeris() { Gps_Ephemeris ephemeris; ephemeris.i_satellite_PRN = i_satellite_PRN; ephemeris.d_TOW = d_TOW; ephemeris.d_Crs = d_Crs; ephemeris.d_Delta_n = d_Delta_n; ephemeris.d_M_0 = d_M_0; ephemeris.d_Cuc = d_Cuc; ephemeris.d_e_eccentricity = d_e_eccentricity; ephemeris.d_Cus = d_Cus; ephemeris.d_sqrt_A = d_sqrt_A; ephemeris.d_Toe = d_Toe; ephemeris.d_Toc = d_Toc; ephemeris.d_Cic = d_Cic; ephemeris.d_OMEGA0 = d_OMEGA0; ephemeris.d_Cis = d_Cis; ephemeris.d_i_0 = d_i_0; ephemeris.d_Crc = d_Crc; ephemeris.d_OMEGA = d_OMEGA; ephemeris.d_OMEGA_DOT = d_OMEGA_DOT; ephemeris.d_IDOT = d_IDOT; ephemeris.i_code_on_L2 = i_code_on_L2; ephemeris.i_GPS_week = i_GPS_week; ephemeris.b_L2_P_data_flag = b_L2_P_data_flag; ephemeris.i_SV_accuracy = i_SV_accuracy; ephemeris.i_SV_health = i_SV_health; ephemeris.d_TGD = d_TGD; ephemeris.d_IODC = d_IODC; ephemeris.d_IODE_SF2 = d_IODE_SF2; ephemeris.d_IODE_SF3 = d_IODE_SF3; ephemeris.i_AODO = i_AODO; ephemeris.b_fit_interval_flag = b_fit_interval_flag; ephemeris.d_spare1 = d_spare1; ephemeris.d_spare2 = d_spare2; ephemeris.d_A_f0 = d_A_f0; ephemeris.d_A_f1 = d_A_f1; ephemeris.d_A_f2 = d_A_f2; ephemeris.b_integrity_status_flag = b_integrity_status_flag; ephemeris.b_alert_flag = b_alert_flag; ephemeris.b_antispoofing_flag = b_antispoofing_flag; ephemeris.d_satClkDrift = d_satClkDrift; ephemeris.d_dtr = d_dtr; ephemeris.d_satpos_X = d_satpos_X; ephemeris.d_satpos_Y = d_satpos_Y; ephemeris.d_satpos_Z = d_satpos_Z; ephemeris.d_satvel_X = d_satvel_X; ephemeris.d_satvel_Y = d_satvel_Y; ephemeris.d_satvel_Z = d_satvel_Z; return ephemeris; } Gps_Iono Gps_Navigation_Message::get_iono() { Gps_Iono iono; iono.d_alpha0 = d_alpha0; iono.d_alpha1 = d_alpha1; iono.d_alpha2 = d_alpha2; iono.d_alpha3 = d_alpha3; iono.d_beta0 = d_beta0; iono.d_beta1 = d_beta1; iono.d_beta2 = d_beta2; iono.d_beta3 = d_beta3; iono.valid = flag_iono_valid; //WARNING: We clear flag_utc_model_valid in order to not re-send the same information to the ionospheric parameters queue flag_iono_valid = false; return iono; } Gps_Utc_Model Gps_Navigation_Message::get_utc_model() { Gps_Utc_Model utc_model; utc_model.valid = flag_utc_model_valid; // UTC parameters utc_model.d_A1 = d_A1; utc_model.d_A0 = d_A0; utc_model.d_t_OT = d_t_OT; utc_model.i_WN_T = i_WN_T; utc_model.d_DeltaT_LS = d_DeltaT_LS; utc_model.i_WN_LSF = i_WN_LSF; utc_model.i_DN = i_DN; utc_model.d_DeltaT_LSF = d_DeltaT_LSF; // warning: We clear flag_utc_model_valid in order to not re-send the same information to the ionospheric parameters queue flag_utc_model_valid = false; return utc_model; } bool Gps_Navigation_Message::satellite_validation() { bool flag_data_valid = false; b_valid_ephemeris_set_flag = false; // First Step: // check Issue Of Ephemeris Data (IODE IODC..) to find a possible interrupted reception // and check if the data have been filled (!=0) if (d_TOW_SF1 != 0 and d_TOW_SF2 != 0 and d_TOW_SF3 != 0) { if (d_IODE_SF2 == d_IODE_SF3 and d_IODC == d_IODE_SF2 and d_IODC!= -1) { flag_data_valid = true; b_valid_ephemeris_set_flag = true; } } return flag_data_valid; } gnss-sdr-0.0.9/src/core/system_parameters/gps_navigation_message.h000066400000000000000000000302011305042567700254400ustar00rootroot00000000000000/*! * \file gps_navigation_message.h * \brief Interface of a GPS NAV Data message decoder * \author Javier Arribas, 2011. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_NAVIGATION_MESSAGE_H_ #define GNSS_SDR_GPS_NAVIGATION_MESSAGE_H_ #include #include #include #include #include #include "GPS_L1_CA.h" #include "gps_ephemeris.h" #include "gps_iono.h" #include "gps_almanac.h" #include "gps_utc_model.h" /*! * \brief This class decodes a GPS NAV Data message as described in IS-GPS-200E * * See http://www.gps.gov/technical/icwg/IS-GPS-200E.pdf Appendix II */ class Gps_Navigation_Message { private: unsigned long int read_navigation_unsigned(std::bitset bits, const std::vector> parameter); signed long int read_navigation_signed(std::bitset bits, const std::vector> parameter); bool read_navigation_bool(std::bitset bits, const std::vector> parameter); void print_gps_word_bytes(unsigned int GPS_word); /* * Accounts for the beginning or end of week crossover * * See paragraph 20.3.3.3.3.1 (IS-GPS-200E) * \param[in] - time in seconds * \param[out] - corrected time, in seconds */ double check_t(double time); public: bool b_valid_ephemeris_set_flag; // flag indicating that this ephemeris set have passed the validation check //broadcast orbit 1 double d_TOW; //!< Time of GPS Week of the ephemeris set (taken from subframes TOW) [s] double d_TOW_SF1; //!< Time of GPS Week from HOW word of Subframe 1 [s] double d_TOW_SF2; //!< Time of GPS Week from HOW word of Subframe 2 [s] double d_TOW_SF3; //!< Time of GPS Week from HOW word of Subframe 3 [s] double d_TOW_SF4; //!< Time of GPS Week from HOW word of Subframe 4 [s] double d_TOW_SF5; //!< Time of GPS Week from HOW word of Subframe 5 [s] double d_IODE_SF2; double d_IODE_SF3; double d_Crs; //!< Amplitude of the Sine Harmonic Correction Term to the Orbit Radius [m] double d_Delta_n; //!< Mean Motion Difference From Computed Value [semi-circles/s] double d_M_0; //!< Mean Anomaly at Reference Time [semi-circles] //broadcast orbit 2 double d_Cuc; //!< Amplitude of the Cosine Harmonic Correction Term to the Argument of Latitude [rad] double d_e_eccentricity; //!< Eccentricity [dimensionless] double d_Cus; //!< Amplitude of the Sine Harmonic Correction Term to the Argument of Latitude [rad] double d_sqrt_A; //!< Square Root of the Semi-Major Axis [sqrt(m)] //broadcast orbit 3 double d_Toe; //!< Ephemeris data reference time of week (Ref. 20.3.3.4.3 IS-GPS-200E) [s] double d_Toc; //!< clock data reference time (Ref. 20.3.3.3.3.1 IS-GPS-200E) [s] double d_Cic; //!< Amplitude of the Cosine Harmonic Correction Term to the Angle of Inclination [rad] double d_OMEGA0; //!< Longitude of Ascending Node of Orbit Plane at Weekly Epoch [semi-circles] double d_Cis; //!< Amplitude of the Sine Harmonic Correction Term to the Angle of Inclination [rad] //broadcast orbit 4 double d_i_0; //!< Inclination Angle at Reference Time [semi-circles] double d_Crc; //!< Amplitude of the Cosine Harmonic Correction Term to the Orbit Radius [m] double d_OMEGA; //!< Argument of Perigee [semi-cicles] double d_OMEGA_DOT; //!< Rate of Right Ascension [semi-circles/s] //broadcast orbit 5 double d_IDOT; //!< Rate of Inclination Angle [semi-circles/s] int i_code_on_L2; //!< If 1, P code ON in L2; if 2, C/A code ON in L2; int i_GPS_week; //!< GPS week number, aka WN [week] bool b_L2_P_data_flag; //!< When true, indicates that the NAV data stream was commanded OFF on the P-code of the L2 channel //broadcast orbit 6 int i_SV_accuracy; //!< User Range Accuracy (URA) index of the SV (reference paragraph 6.2.1) for the standard positioning service user (Ref 20.3.3.3.1.3 IS-GPS-200E) int i_SV_health; double d_TGD; //!< Estimated Group Delay Differential: L1-L2 correction term only for the benefit of "L1 P(Y)" or "L2 P(Y)" s users [s] double d_IODC; //!< Issue of Data, Clock //broadcast orbit 7 int i_AODO; //!< Age of Data Offset (AODO) term for the navigation message correction table (NMCT) contained in subframe 4 (reference paragraph 20.3.3.5.1.9) [s] bool b_fit_interval_flag;//!< indicates the curve-fit interval used by the CS (Block II/IIA/IIR/IIR-M/IIF) and SS (Block IIIA) in determining the ephemeris parameters, as follows: 0 = 4 hours, 1 = greater than 4 hours. double d_spare1; double d_spare2; double d_A_f0; //!< Coefficient 0 of code phase offset model [s] double d_A_f1; //!< Coefficient 1 of code phase offset model [s/s] double d_A_f2; //!< Coefficient 2 of code phase offset model [s/s^2] // Almanac double d_Toa; //!< Almanac reference time [s] int i_WN_A; //!< Modulo 256 of the GPS week number to which the almanac reference time (d_Toa) is referenced std::map almanacHealth; //!< Map that stores the health information stored in the almanac std::map satelliteBlock; //!< Map that stores to which block the PRN belongs http://www.navcen.uscg.gov/?Do=constellationStatus // Flags /*! \brief If true, enhanced level of integrity assurance. * * If false, indicates that the conveying signal is provided with the legacy level of integrity assurance. * That is, the probability that the instantaneous URE of the conveying signal exceeds 4.42 times the upper bound * value of the current broadcast URA index, for more than 5.2 seconds, without an accompanying alert, is less * than 1E-5 per hour. If true, indicates that the conveying signal is provided with an enhanced level of * integrity assurance. That is, the probability that the instantaneous URE of the conveying signal exceeds 5.73 * times the upper bound value of the current broadcast URA index, for more than 5.2 seconds, without an * accompanying alert, is less than 1E-8 per hour. */ bool b_integrity_status_flag; bool b_alert_flag; //!< If true, indicates that the SV URA may be worse than indicated in d_SV_accuracy, use that SV at our own risk. bool b_antispoofing_flag; //!< If true, the AntiSpoofing mode is ON in that SV // clock terms //double d_master_clock; // GPS transmission time double d_satClkCorr; // GPS clock error double d_dtr; // relativistic clock correction term double d_satClkDrift; // satellite positions double d_satpos_X; //!< Earth-fixed coordinate x of the satellite [m]. Intersection of the IERS Reference Meridian (IRM) and the plane passing through the origin and normal to the Z-axis. double d_satpos_Y; //!< Earth-fixed coordinate y of the satellite [m]. Completes a right-handed, Earth-Centered, Earth-Fixed orthogonal coordinate system. double d_satpos_Z; //!< Earth-fixed coordinate z of the satellite [m]. The direction of the IERS (International Earth Rotation and Reference Systems Service) Reference Pole (IRP). // satellite identification info int i_channel_ID; unsigned int i_satellite_PRN; // time synchro double d_subframe_timestamp_ms; //[ms] // Ionospheric parameters bool flag_iono_valid; //!< If set, it indicates that the ionospheric parameters are filled (page 18 has arrived and decoded) double d_alpha0; //!< Coefficient 0 of a cubic equation representing the amplitude of the vertical delay [s] double d_alpha1; //!< Coefficient 1 of a cubic equation representing the amplitude of the vertical delay [s/semi-circle] double d_alpha2; //!< Coefficient 2 of a cubic equation representing the amplitude of the vertical delay [s(semi-circle)^2] double d_alpha3; //!< Coefficient 3 of a cubic equation representing the amplitude of the vertical delay [s(semi-circle)^3] double d_beta0; //!< Coefficient 0 of a cubic equation representing the period of the model [s] double d_beta1; //!< Coefficient 1 of a cubic equation representing the period of the model [s/semi-circle] double d_beta2; //!< Coefficient 2 of a cubic equation representing the period of the model [s(semi-circle)^2] double d_beta3; //!< Coefficient 3 of a cubic equation representing the period of the model [s(semi-circle)^3] // UTC parameters bool flag_utc_model_valid; //!< If set, it indicates that the UTC model parameters are filled double d_A1; //!< 1st order term of a model that relates GPS and UTC time (ref. 20.3.3.5.2.4 IS-GPS-200E) [s/s] double d_A0; //!< Constant of a model that relates GPS and UTC time (ref. 20.3.3.5.2.4 IS-GPS-200E) [s] double d_t_OT; //!< Reference time for UTC data (reference 20.3.4.5 and 20.3.3.5.2.4 IS-GPS-200E) [s] int i_WN_T; //!< UTC reference week number [weeks] double d_DeltaT_LS; //!< delta time due to leap seconds [s]. Number of leap seconds since 6-Jan-1980 as transmitted by the GPS almanac. int i_WN_LSF; //!< Week number at the end of which the leap second becomes effective [weeks] int i_DN; //!< Day number (DN) at the end of which the leap second becomes effective [days] double d_DeltaT_LSF; //!< Scheduled future or recent past (relative to NAV message upload) value of the delta time due to leap seconds [s] // Satellite velocity double d_satvel_X; //!< Earth-fixed velocity coordinate x of the satellite [m] double d_satvel_Y; //!< Earth-fixed velocity coordinate y of the satellite [m] double d_satvel_Z; //!< Earth-fixed velocity coordinate z of the satellite [m] // public functions void reset(); /*! * \brief Obtain a GPS SV Ephemeris class filled with current SV data */ Gps_Ephemeris get_ephemeris(); /*! * \brief Obtain a GPS ionospheric correction parameters class filled with current SV data */ Gps_Iono get_iono(); /*! * \brief Obtain a GPS UTC model parameters class filled with current SV data */ Gps_Utc_Model get_utc_model(); /*! * \brief Decodes the GPS NAV message */ int subframe_decoder(char *subframe); /*! * \brief Computes the position of the satellite * * Implementation of Table 20-IV (IS-GPS-200E) */ void satellitePosition(double transmitTime); /*! * \brief Sets (\a d_satClkCorr) according to the User Algorithm for SV Clock Correction * and returns the corrected clock (IS-GPS-200E, 20.3.3.3.3.1) */ double sv_clock_correction(double transmitTime); /*! * \brief Computes the Coordinated Universal Time (UTC) and * returns it in [s] (IS-GPS-200E, 20.3.3.5.2.4) */ double utc_time(const double gpstime_corrected) const; bool satellite_validation(); /*! * Default constructor */ Gps_Navigation_Message(); }; #endif gnss-sdr-0.0.9/src/core/system_parameters/gps_ref_location.cc000066400000000000000000000024241305042567700244050ustar00rootroot00000000000000/*! * \file gps_ref_location.cc * \brief Interface of a GPS REFERENCE LOCATION storage * * \author Javier Arribas, 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_ref_location.h" Gps_Ref_Location::Gps_Ref_Location() { valid = false; lat = 0.0; lon = 0.0; uncertainty = 0.0; } gnss-sdr-0.0.9/src/core/system_parameters/gps_ref_location.h000066400000000000000000000040631305042567700242500ustar00rootroot00000000000000/*! * \file gps_ref_location.h * \brief Interface of a GPS REFERENCE LOCATION storage * \author Javier Arribas, 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_REF_LOCATION_H_ #define GNSS_SDR_GPS_REF_LOCATION_H_ #include "boost/assign.hpp" #include /*! * \brief Interface of a GPS REFERENCE LOCATION storage * */ class Gps_Ref_Location { public: bool valid; double lat; double lon; double uncertainty; /*! * Default constructor */ Gps_Ref_Location(); template /*! * \brief Serialize is a boost standard method to be called by the boost XML serialization. Here is used to save the Ref location on disk file. */ void serialize(Archive& archive, const unsigned int version) { using boost::serialization::make_nvp; if(version){}; archive & make_nvp("valid", valid); archive & make_nvp("lat", lat); archive & make_nvp("lon", lon); archive & make_nvp("uncertainty", uncertainty); } }; #endif gnss-sdr-0.0.9/src/core/system_parameters/gps_ref_time.cc000066400000000000000000000024271305042567700235360ustar00rootroot00000000000000/*! * \file gps_ref_time.cc * \brief Interface of a GPS REFERENCE TIME storage * * \author Javier Arribas, 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_ref_time.h" Gps_Ref_Time::Gps_Ref_Time() { valid = false; d_TOW = 0.0; d_Week = 0.0; d_tv_sec = 0.0; d_tv_usec = 0.0; } gnss-sdr-0.0.9/src/core/system_parameters/gps_ref_time.h000066400000000000000000000041101305042567700233670ustar00rootroot00000000000000/*! * \file gps_ref_time.h * \brief Interface of a GPS REFERENCE TIME storage * \author Javier Arribas, 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_REF_TIME_H_ #define GNSS_SDR_GPS_REF_TIME_H_ #include "boost/assign.hpp" #include /*! * \brief Interface of a GPS REFERENCE TIME storage * */ class Gps_Ref_Time { public: bool valid; double d_TOW; double d_Week; double d_tv_sec; double d_tv_usec; /*! * Default constructor */ Gps_Ref_Time(); template /*! * \brief Serialize is a boost standard method to be called by the boost XML serialization. Here is used to save the ref time data on disk file. */ void serialize(Archive& archive, const unsigned int version) { using boost::serialization::make_nvp; if(version){}; archive & make_nvp("valid", valid); archive & make_nvp("d_TOW", d_TOW); archive & make_nvp("d_Week", d_Week); archive & make_nvp("d_tv_sec", d_tv_sec); archive & make_nvp("d_tv_usec", d_tv_usec); } }; #endif gnss-sdr-0.0.9/src/core/system_parameters/gps_utc_model.cc000066400000000000000000000116761305042567700237250ustar00rootroot00000000000000/* * \file gps_utc_model.h * \brief Interface of a GPS UTC MODEL storage * \author Javier Arribas, 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "gps_utc_model.h" #include Gps_Utc_Model::Gps_Utc_Model() { valid = false; d_A1 = 0; d_A0 = 0; d_t_OT = 0; i_WN_T = 0; d_DeltaT_LS = 0; i_WN_LSF = 0; i_DN = 0; d_DeltaT_LSF = 0; } double Gps_Utc_Model::utc_time(double gpstime_corrected, int i_GPS_week) { double t_utc; double t_utc_daytime; double Delta_t_UTC = d_DeltaT_LS + d_A0 + d_A1 * (gpstime_corrected - d_t_OT + 604800 * static_cast(i_GPS_week - i_WN_T)); // Determine if the effectivity time of the leap second event is in the past int weeksToLeapSecondEvent = i_WN_LSF - i_GPS_week; if (weeksToLeapSecondEvent >= 0) // is not in the past { //Detect if the effectivity time and user's time is within six hours = 6 * 60 *60 = 21600 s int secondOfLeapSecondEvent = i_DN * 24 * 60 * 60; if (weeksToLeapSecondEvent > 0) { t_utc_daytime = fmod(gpstime_corrected - Delta_t_UTC, 86400); } else //we are in the same week than the leap second event { if (std::abs(gpstime_corrected - secondOfLeapSecondEvent) > 21600) { /* 20.3.3.5.2.4a * Whenever the effectivity time indicated by the WN_LSF and the DN values * is not in the past (relative to the user's present time), and the user's * present time does not fall in the time span which starts at six hours prior * to the effectivity time and ends at six hours after the effectivity time, * the UTC/GPS-time relationship is given by */ t_utc_daytime = fmod(gpstime_corrected - Delta_t_UTC, 86400); } else { /* 20.3.3.5.2.4b * Whenever the user's current time falls within the time span of six hours * prior to the effectivity time to six hours after the effectivity time, * proper accommodation of the leap second event with a possible week number * transition is provided by the following expression for UTC: */ int W = fmod(gpstime_corrected - Delta_t_UTC - 43200, 86400) + 43200; t_utc_daytime = fmod(W, 86400 + d_DeltaT_LSF - d_DeltaT_LS); //implement something to handle a leap second event! } if ( (gpstime_corrected - secondOfLeapSecondEvent) > 21600) { Delta_t_UTC = d_DeltaT_LSF + d_A0 + d_A1 * (gpstime_corrected - d_t_OT + 604800 * static_cast(i_GPS_week - i_WN_T)); t_utc_daytime = fmod(gpstime_corrected - Delta_t_UTC, 86400); } } } else // the effectivity time is in the past { /* 20.3.3.5.2.4c * Whenever the effectivity time of the leap second event, as indicated by the * WNLSF and DN values, is in the "past" (relative to the user's current time), * and the user�s current time does not fall in the time span as given above * in 20.3.3.5.2.4b,*/ Delta_t_UTC = d_DeltaT_LSF + d_A0 + d_A1 * (gpstime_corrected - d_t_OT + 604800 * static_cast(i_GPS_week - i_WN_T)); t_utc_daytime = fmod(gpstime_corrected - Delta_t_UTC, 86400); } double secondsOfWeekBeforeToday = 86400 * floor(gpstime_corrected / 86400); t_utc = secondsOfWeekBeforeToday + t_utc_daytime; return t_utc; } gnss-sdr-0.0.9/src/core/system_parameters/gps_utc_model.h000066400000000000000000000066101305042567700235570ustar00rootroot00000000000000/*! * \file gps_utc_model.h * \brief Interface of a GPS UTC MODEL storage * \author Javier Arribas, 2013. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_UTC_MODEL_H_ #define GNSS_SDR_GPS_UTC_MODEL_H_ #include "boost/assign.hpp" #include /*! * \brief This class is a storage for the GPS UTC MODEL data as described in IS-GPS-200E * * See http://www.gps.gov/technical/icwg/IS-GPS-200E.pdf Appendix II */ class Gps_Utc_Model { public: bool valid; // UTC parameters double d_A1; //!< 1st order term of a model that relates GPS and UTC time (ref. 20.3.3.5.2.4 IS-GPS-200E) [s/s] double d_A0; //!< Constant of a model that relates GPS and UTC time (ref. 20.3.3.5.2.4 IS-GPS-200E) [s] double d_t_OT; //!< Reference time for UTC data (reference 20.3.4.5 and 20.3.3.5.2.4 IS-GPS-200E) [s] int i_WN_T; //!< UTC reference week number [weeks] double d_DeltaT_LS; //!< delta time due to leap seconds [s]. Number of leap seconds since 6-Jan-1980 as transmitted by the GPS almanac. int i_WN_LSF; //!< Week number at the end of which the leap second becomes effective [weeks] int i_DN; //!< Day number (DN) at the end of which the leap second becomes effective [days] double d_DeltaT_LSF; //!< Scheduled future or recent past (relative to NAV message upload) value of the delta time due to leap seconds [s] /*! * Default constructor */ Gps_Utc_Model(); template /* * \brief Serialize is a boost standard method to be called by the boost XML serialization. Here is used to save the ephemeris data on disk file. */ void serialize(Archive& archive, const unsigned int version) { using boost::serialization::make_nvp; if(version){}; archive & make_nvp("valid",valid); archive & make_nvp("d_A1",d_A1); archive & make_nvp("d_A0",d_A0); archive & make_nvp("d_t_OT",d_t_OT); archive & make_nvp("i_WN_T",i_WN_T); archive & make_nvp("d_DeltaT_LS",d_DeltaT_LS); archive & make_nvp("i_WN_LSF",i_WN_LSF); archive & make_nvp("i_DN",i_DN); archive & make_nvp("d_DeltaT_LSF",d_DeltaT_LSF); } /*! * \brief Computes the Coordinated Universal Time (UTC) and * returns it in [s] (IS-GPS-200E, 20.3.3.5.2.4) */ double utc_time(double gpstime_corrected, int i_GPS_week); }; #endif gnss-sdr-0.0.9/src/core/system_parameters/rtcm.cc000066400000000000000000004237141305042567700220460ustar00rootroot00000000000000/*! * \file rtcm.cc * \brief Implementation of RTCM 3.2 Standard * \author Carles Fernandez-Prades, 2015. cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "rtcm.h" #include // for std::reverse #include // std::chrono::seconds #include // for std::fmod #include // for strtol #include // for std::stringstream #include #include // for to_upper_copy #include #include #include #include #include "Galileo_E1.h" using google::LogMessage; Rtcm::Rtcm(unsigned short port) { RTCM_port = port; preamble = std::bitset<8>("11010011"); reserved_field = std::bitset<6>("000000"); rtcm_message_queue = std::make_shared< concurrent_queue >(); boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), RTCM_port); servers.emplace_back(io_service, endpoint); server_is_running = false; } Rtcm::~Rtcm() { if(server_is_running) { try { stop_server(); } catch( boost::exception & e ) { LOG(WARNING) << "Boost exception: " << boost::diagnostic_information(e); } catch(std::exception const& ex) { LOG(WARNING) << "STD exception: " << ex.what(); } } } // ***************************************************************************************************** // // TCP Server helper classes // // ***************************************************************************************************** void Rtcm::run_server() { std::cout << "Starting a TCP Server on port " << RTCM_port << std::endl; try { std::thread tq([&]{ std::make_shared(io_service, rtcm_message_queue, RTCM_port)->do_read_queue(); }); tq.detach(); std::thread t([&]{ io_service.run(); }); server_is_running = true; t.detach(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } } void Rtcm::stop_service() { io_service.stop(); } void Rtcm::stop_server() { std::cout << "Stopping TCP Server on port " << RTCM_port << std::endl; rtcm_message_queue->push("Goodbye"); // this terminates tq Rtcm::stop_service(); servers.front().close_server(); std::this_thread::sleep_for(std::chrono::seconds(1)); server_is_running = false; } void Rtcm::send_message(const std::string & msg) { rtcm_message_queue->push(msg); } bool Rtcm::is_server_running() const { return server_is_running; } // ***************************************************************************************************** // // TRANSPORT LAYER AS DEFINED AT RTCM STANDARD 10403.2 // // ***************************************************************************************************** std::string Rtcm::add_CRC (const std::string & message_without_crc) const { // ****** Computes Qualcomm CRC-24Q ****** boost::crc_optimal<24, 0x1864CFBu, 0x0, 0x0, false, false> CRC_RTCM; // 1) Converts the string to a vector of unsigned char: boost::dynamic_bitset frame_bits(message_without_crc); std::vector bytes; boost::to_block_range(frame_bits, std::back_inserter(bytes)); std::reverse(bytes.begin(), bytes.end()); // 2) Computes CRC CRC_RTCM.process_bytes(bytes.data(), bytes.size()); std::bitset<24> crc_frame = std::bitset<24>(CRC_RTCM.checksum()); // 3) Builds the complete message std::string complete_message = message_without_crc + crc_frame.to_string(); return bin_to_binary_data(complete_message); } bool Rtcm::check_CRC(const std::string & message) const { boost::crc_optimal<24, 0x1864CFBu, 0x0, 0x0, false, false> CRC_RTCM_CHECK; // Convert message to binary std::string message_bin = Rtcm::binary_data_to_bin(message); // Check CRC std::string crc = message_bin.substr(message_bin.length() - 24, 24); std::bitset<24> read_crc = std::bitset<24>(crc); std::string msg_without_crc = message_bin.substr(0, message_bin.length() - 24); boost::dynamic_bitset frame_bits(msg_without_crc); std::vector bytes; boost::to_block_range(frame_bits, std::back_inserter(bytes)); std::reverse(bytes.begin(), bytes.end()); CRC_RTCM_CHECK.process_bytes(bytes.data(), bytes.size()); std::bitset<24> computed_crc = std::bitset<24>(CRC_RTCM_CHECK.checksum()); if(read_crc == computed_crc) { return true; } else { return false; } } std::string Rtcm::bin_to_binary_data(const std::string& s) const { std::string s_aux; int remainder = static_cast(std::fmod(s.length(), 8)); unsigned char c[s.length()]; unsigned int k = 0; if (remainder != 0) { s_aux.assign(s, 0 , remainder); boost::dynamic_bitset<> rembits(s_aux); unsigned long int n = rembits.to_ulong(); c[0] = static_cast(n); k++; } unsigned int start = std::max(remainder, 0); for(unsigned int i = start; i < s.length() - 1; i = i + 8) { s_aux.assign(s, i, 4); std::bitset<4> bs(s_aux); unsigned n = bs.to_ulong(); s_aux.assign(s, i + 4 , 4); std::bitset<4> bs2(s_aux); unsigned n2 = bs2.to_ulong(); c[k] = static_cast(n * 16) + static_cast(n2); k++; } std::string ret(c, c + k / sizeof(c[0])); return ret; } std::string Rtcm::binary_data_to_bin(const std::string& s) const { std::string s_aux; std::stringstream ss; for(unsigned int i = 0; i < s.length(); i++) { unsigned char val = static_cast(s.at(i)); std::bitset<8> bs(val); ss << bs; } s_aux = ss.str(); return s_aux; } std::string Rtcm::bin_to_hex(const std::string& s) const { std::string s_aux; std::stringstream ss; int remainder = static_cast(std::fmod(s.length(), 4)); if (remainder != 0) { s_aux.assign(s, 0 , remainder); boost::dynamic_bitset<> rembits(s_aux); unsigned n = rembits.to_ulong(); ss << std::hex << n; } unsigned int start = std::max(remainder, 0); for(unsigned int i = start; i < s.length() - 1; i = i + 4) { s_aux.assign(s, i, 4); std::bitset<4> bs(s_aux); unsigned n = bs.to_ulong(); ss << std::hex << n; } return boost::to_upper_copy(ss.str()); } std::string Rtcm::hex_to_bin(const std::string& s) const { std::string s_aux; s_aux.clear(); std::stringstream ss; ss << s; std::string s_lower = boost::to_upper_copy(ss.str()); for(unsigned int i = 0; i < s.length(); i++) { unsigned long int n; std::istringstream(s_lower.substr(i,1)) >> std::hex >> n; std::bitset<4> bs(n); s_aux += bs.to_string(); } return s_aux; } unsigned long int Rtcm::bin_to_uint(const std::string& s) const { if(s.length() > 32) { LOG(WARNING) << "Cannot convert to a unsigned long int"; return 0; } unsigned long int reading = strtoul(s.c_str(), NULL, 2); return reading; } long int Rtcm::bin_to_int(const std::string& s) const { if(s.length() > 32) { LOG(WARNING) << "Cannot convert to a long int"; return 0; } long int reading; // Handle negative numbers if(s.substr(0,1).compare("0")) { // Computing two's complement boost::dynamic_bitset<> original_bitset(s); original_bitset.flip(); reading = - (original_bitset.to_ulong() + 1); } else { reading = strtol(s.c_str(), NULL, 2); } return reading; } double Rtcm::bin_to_double(const std::string& s) const { double reading; if(s.length() > 64) { LOG(WARNING) << "Cannot convert to a double"; return 0; } long long int reading_int; // Handle negative numbers if(s.substr(0,1).compare("0")) { // Computing two's complement boost::dynamic_bitset<> original_bitset(s); original_bitset.flip(); std::string aux; to_string(original_bitset, aux); reading_int = - (strtoll(aux.c_str(), NULL, 2) + 1); } else { reading_int = strtoll(s.c_str(), NULL, 2); } reading = static_cast(reading_int); return reading; } unsigned long int Rtcm::hex_to_uint(const std::string& s) const { if(s.length() > 32) { LOG(WARNING) << "Cannot convert to a unsigned long int"; return 0; } unsigned long int reading = strtoul(s.c_str(), NULL, 16); return reading; } long int Rtcm::hex_to_int(const std::string& s) const { if(s.length() > 32) { LOG(WARNING) << "Cannot convert to a long int"; return 0; } long int reading = strtol(s.c_str(), NULL, 16); return reading; } std::string Rtcm::build_message(const std::string & data) const { unsigned int msg_length_bits = data.length(); unsigned int msg_length_bytes = std::ceil(static_cast(msg_length_bits) / 8.0); std::bitset<10> message_length = std::bitset<10>(msg_length_bytes); unsigned int zeros_to_fill = 8 * msg_length_bytes - msg_length_bits; std::string b(zeros_to_fill, '0'); std::string msg_content = data + b; std::string msg_without_crc = preamble.to_string() + reserved_field.to_string() + message_length.to_string() + msg_content; return Rtcm::add_CRC(msg_without_crc); } // ***************************************************************************************************** // // MESSAGES AS DEFINED AT RTCM STANDARD 10403.2 // // ***************************************************************************************************** // ******************************************************** // // MESSAGE TYPE 1001 (GPS L1 OBSERVATIONS) // // ******************************************************** std::bitset<64> Rtcm::get_MT1001_4_header(unsigned int msg_number, double obs_time, const std::map & observables, unsigned int ref_id, unsigned int smooth_int, bool sync_flag, bool divergence_free) { unsigned int reference_station_id = ref_id; // Max: 4095 const std::map observables_ = observables; bool synchronous_GNSS_flag = sync_flag; bool divergence_free_smoothing_indicator = divergence_free; unsigned int smoothing_interval = smooth_int; Rtcm::set_DF002(msg_number); Rtcm::set_DF003(reference_station_id); Rtcm::set_DF004(obs_time); Rtcm::set_DF005(synchronous_GNSS_flag); Rtcm::set_DF006(observables_); Rtcm::set_DF007(divergence_free_smoothing_indicator); Rtcm::set_DF008(smoothing_interval); std::string header = DF002.to_string() + DF003.to_string() + DF004.to_string() + DF005.to_string() + DF006.to_string() + DF007.to_string() + DF008.to_string(); std::bitset<64> header_msg(header); return header_msg; } std::bitset<58> Rtcm::get_MT1001_sat_content(const Gps_Ephemeris & eph, double obs_time, const Gnss_Synchro & gnss_synchro) { bool code_indicator = false; // code indicator 0: C/A code 1: P(Y) code direct Rtcm::set_DF009(gnss_synchro); Rtcm::set_DF010(code_indicator); // code indicator 0: C/A code 1: P(Y) code direct Rtcm::set_DF011(gnss_synchro); Rtcm::set_DF012(gnss_synchro); Rtcm::set_DF013(eph, obs_time, gnss_synchro); std::string content = DF009.to_string() + DF010.to_string() + DF011.to_string() + DF012.to_string() + DF013.to_string(); std::bitset<58> content_msg(content); return content_msg; } std::string Rtcm::print_MT1001(const Gps_Ephemeris & gps_eph, double obs_time, const std::map & observables, unsigned short station_id) { unsigned int ref_id = static_cast(station_id); unsigned int smooth_int = 0; bool sync_flag = false; bool divergence_free = false; //Get a map with GPS L1 only observations std::map observablesL1; std::map::const_iterator observables_iter; for(observables_iter = observables.begin(); observables_iter != observables.end(); observables_iter++) { std::string system_(&observables_iter->second.System, 1); std::string sig_(observables_iter->second.Signal); if((system_.compare("G") == 0) && (sig_.compare("1C") == 0)) { observablesL1.insert(std::pair(observables_iter->first, observables_iter->second)); } } std::bitset<64> header = Rtcm::get_MT1001_4_header(1001, obs_time, observablesL1, ref_id, smooth_int, sync_flag, divergence_free); std::string data = header.to_string(); for(observables_iter = observablesL1.begin(); observables_iter != observablesL1.end(); observables_iter++) { std::bitset<58> content = Rtcm::get_MT1001_sat_content(gps_eph, obs_time, observables_iter->second); data += content.to_string(); } std::string msg = build_message(data); if(server_is_running) { rtcm_message_queue->push(msg); } return msg; } // ******************************************************** // // MESSAGE TYPE 1002 (EXTENDED GPS L1 OBSERVATIONS) // // ******************************************************** std::string Rtcm::print_MT1002(const Gps_Ephemeris & gps_eph, double obs_time, const std::map & observables, unsigned short station_id) { unsigned int ref_id = static_cast(station_id); unsigned int smooth_int = 0; bool sync_flag = false; bool divergence_free = false; //Get a map with GPS L1 only observations std::map observablesL1; std::map::const_iterator observables_iter; for(observables_iter = observables.begin(); observables_iter != observables.end(); observables_iter++) { std::string system_(&observables_iter->second.System, 1); std::string sig_(observables_iter->second.Signal); if((system_.compare("G") == 0) && (sig_.compare("1C") == 0)) { observablesL1.insert(std::pair(observables_iter->first, observables_iter->second)); } } std::bitset<64> header = Rtcm::get_MT1001_4_header(1002, obs_time, observablesL1, ref_id, smooth_int, sync_flag, divergence_free); std::string data = header.to_string(); for(observables_iter = observablesL1.begin(); observables_iter != observablesL1.end(); observables_iter++) { std::bitset<74> content = Rtcm::get_MT1002_sat_content(gps_eph, obs_time, observables_iter->second); data += content.to_string(); } std::string msg = build_message(data); if(server_is_running) { rtcm_message_queue->push(msg); } return msg; } std::bitset<74> Rtcm::get_MT1002_sat_content(const Gps_Ephemeris & eph, double obs_time, const Gnss_Synchro & gnss_synchro) { bool code_indicator = false; // code indicator 0: C/A code 1: P(Y) code direct Rtcm::set_DF009(gnss_synchro); Rtcm::set_DF010(code_indicator); // code indicator 0: C/A code 1: P(Y) code direct Rtcm::set_DF011(gnss_synchro); Rtcm::set_DF012(gnss_synchro); Rtcm::set_DF013(eph, obs_time, gnss_synchro); std::string content = DF009.to_string() + DF010.to_string() + DF011.to_string() + DF012.to_string() + DF013.to_string() + DF014.to_string() + DF015.to_string(); std::bitset<74> content_msg(content); return content_msg; } // ******************************************************** // // MESSAGE TYPE 1003 (GPS L1 & L2 OBSERVATIONS) // // ******************************************************** std::string Rtcm::print_MT1003(const Gps_Ephemeris & ephL1, const Gps_CNAV_Ephemeris & ephL2, double obs_time, const std::map & observables, unsigned short station_id) { unsigned int ref_id = static_cast(station_id); unsigned int smooth_int = 0; bool sync_flag = false; bool divergence_free = false; //Get maps with GPS L1 and L2 observations std::map observablesL1; std::map observablesL2; std::map::const_iterator observables_iter; std::map::const_iterator observables_iter2; for(observables_iter = observables.begin(); observables_iter != observables.end(); observables_iter++) { std::string system_(&observables_iter->second.System, 1); std::string sig_(observables_iter->second.Signal); if((system_.compare("G") == 0) && (sig_.compare("1C") == 0)) { observablesL1.insert(std::pair(observables_iter->first, observables_iter->second)); } if((system_.compare("G") == 0) && (sig_.compare("2S") == 0)) { observablesL2.insert(std::pair(observables_iter->first, observables_iter->second)); } } // Get common observables std::vector< std::pair< Gnss_Synchro, Gnss_Synchro > > common_observables; std::vector< std::pair< Gnss_Synchro, Gnss_Synchro > >::const_iterator common_observables_iter; std::map observablesL1_with_L2; for(observables_iter = observablesL1.begin(); observables_iter != observablesL1.end(); observables_iter++) { unsigned int prn_ = observables_iter->second.PRN; for(observables_iter2 = observablesL2.begin(); observables_iter2 != observablesL2.end(); observables_iter2++) { if(observables_iter2->second.PRN == prn_) { std::pair p; Gnss_Synchro pr1 = observables_iter->second; Gnss_Synchro pr2 = observables_iter2->second; p = std::make_pair(pr1, pr2); common_observables.push_back(p); observablesL1_with_L2.insert(std::pair(observables_iter->first, observables_iter->second)); } } } std::bitset<64> header = Rtcm::get_MT1001_4_header(1003, obs_time, observablesL1_with_L2, ref_id, smooth_int, sync_flag, divergence_free); std::string data = header.to_string(); for(common_observables_iter = common_observables.begin(); common_observables_iter != common_observables.end(); common_observables_iter++) { std::bitset<101> content = Rtcm::get_MT1003_sat_content(ephL1, ephL2, obs_time, common_observables_iter->first, common_observables_iter->second); data += content.to_string(); } std::string msg = build_message(data); if(server_is_running) { rtcm_message_queue->push(msg); } return msg; } std::bitset<101> Rtcm::get_MT1003_sat_content(const Gps_Ephemeris & ephL1, const Gps_CNAV_Ephemeris & ephL2, double obs_time, const Gnss_Synchro & gnss_synchroL1, const Gnss_Synchro & gnss_synchroL2) { bool code_indicator = false; // code indicator 0: C/A code 1: P(Y) code direct Rtcm::set_DF009(gnss_synchroL1); Rtcm::set_DF010(code_indicator); // code indicator 0: C/A code 1: P(Y) code direct Rtcm::set_DF011(gnss_synchroL1); Rtcm::set_DF012(gnss_synchroL1); Rtcm::set_DF013(ephL1, obs_time, gnss_synchroL1); std::bitset<2> DF016_ = std::bitset<2>(0); // code indicator 0: C/A or L2C code 1: P(Y) code direct 2:P(Y) code cross-correlated 3: Correlated P/Y Rtcm::set_DF017(gnss_synchroL1, gnss_synchroL2); Rtcm::set_DF018(gnss_synchroL1, gnss_synchroL2); Rtcm::set_DF019(ephL2, obs_time, gnss_synchroL2); std::string content = DF009.to_string() + DF010.to_string() + DF011.to_string() + DF012.to_string() + DF013.to_string() + DF016_.to_string() + DF017.to_string() + DF018.to_string() + DF019.to_string(); std::bitset<101> content_msg(content); return content_msg; } // ****************************************************************** // // MESSAGE TYPE 1004 (EXTENDED GPS L1 & L2 OBSERVATIONS) // // ****************************************************************** std::string Rtcm::print_MT1004(const Gps_Ephemeris & ephL1, const Gps_CNAV_Ephemeris & ephL2, double obs_time, const std::map & observables, unsigned short station_id) { unsigned int ref_id = static_cast(station_id); unsigned int smooth_int = 0; bool sync_flag = false; bool divergence_free = false; //Get maps with GPS L1 and L2 observations std::map observablesL1; std::map observablesL2; std::map::const_iterator observables_iter; std::map::const_iterator observables_iter2; for(observables_iter = observables.begin(); observables_iter != observables.end(); observables_iter++) { std::string system_(&observables_iter->second.System, 1); std::string sig_(observables_iter->second.Signal); if((system_.compare("G") == 0) && (sig_.compare("1C") == 0)) { observablesL1.insert(std::pair(observables_iter->first, observables_iter->second)); } if((system_.compare("G") == 0) && (sig_.compare("2S") == 0)) { observablesL2.insert(std::pair(observables_iter->first, observables_iter->second)); } } // Get common observables std::vector< std::pair< Gnss_Synchro, Gnss_Synchro > > common_observables; std::vector< std::pair< Gnss_Synchro, Gnss_Synchro > >::const_iterator common_observables_iter; std::map observablesL1_with_L2; for(observables_iter = observablesL1.begin(); observables_iter != observablesL1.end(); observables_iter++) { unsigned int prn_ = observables_iter->second.PRN; for(observables_iter2 = observablesL2.begin(); observables_iter2 != observablesL2.end(); observables_iter2++) { if(observables_iter2->second.PRN == prn_) { std::pair p; Gnss_Synchro pr1 = observables_iter->second; Gnss_Synchro pr2 = observables_iter2->second; p = std::make_pair(pr1, pr2); common_observables.push_back(p); observablesL1_with_L2.insert(std::pair(observables_iter->first, observables_iter->second)); } } } std::bitset<64> header = Rtcm::get_MT1001_4_header(1004, obs_time, observablesL1_with_L2, ref_id, smooth_int, sync_flag, divergence_free); std::string data = header.to_string(); for(common_observables_iter = common_observables.begin(); common_observables_iter != common_observables.end(); common_observables_iter++) { std::bitset<125> content = Rtcm::get_MT1004_sat_content(ephL1, ephL2, obs_time, common_observables_iter->first, common_observables_iter->second); data += content.to_string(); } std::string msg = build_message(data); if(server_is_running) { rtcm_message_queue->push(msg); } return msg; } std::bitset<125> Rtcm::get_MT1004_sat_content(const Gps_Ephemeris & ephL1, const Gps_CNAV_Ephemeris & ephL2, double obs_time, const Gnss_Synchro & gnss_synchroL1, const Gnss_Synchro & gnss_synchroL2) { bool code_indicator = false; // code indicator 0: C/A code 1: P(Y) code direct Rtcm::set_DF009(gnss_synchroL1); Rtcm::set_DF010(code_indicator); // code indicator 0: C/A code 1: P(Y) code direct Rtcm::set_DF011(gnss_synchroL1); Rtcm::set_DF012(gnss_synchroL1); Rtcm::set_DF013(ephL1, obs_time, gnss_synchroL1); Rtcm::set_DF014(gnss_synchroL1); Rtcm::set_DF015(gnss_synchroL1); std::bitset<2> DF016_ = std::bitset<2>(0); // code indicator 0: C/A or L2C code 1: P(Y) code direct 2:P(Y) code cross-correlated 3: Correlated P/Y Rtcm::set_DF017(gnss_synchroL1, gnss_synchroL2); Rtcm::set_DF018(gnss_synchroL1, gnss_synchroL2); Rtcm::set_DF019(ephL2, obs_time, gnss_synchroL2); Rtcm::set_DF020(gnss_synchroL2); std::string content = DF009.to_string() + DF010.to_string() + DF011.to_string() + DF012.to_string() + DF013.to_string() + DF014.to_string() + DF015.to_string() + DF016_.to_string() + DF017.to_string() + DF018.to_string() + DF019.to_string() + DF020.to_string(); std::bitset<125> content_msg(content); return content_msg; } // ******************************************************** // // MESSAGE TYPE 1005 (STATION DESCRIPTION) // // ******************************************************** /* Stationary Antenna Reference Point, No Height Information * Reference Station Id = 2003 GPS Service supported, but not GLONASS or Galileo ARP ECEF-X = 1114104.5999 meters ARP ECEF-Y = -4850729.7108 meters ARP ECEF-Z = 3975521.4643 meters Expected output: D3 00 13 3E D7 D3 02 02 98 0E DE EF 34 B4 BD 62 AC 09 41 98 6F 33 36 0B 98 */ std::bitset<152> Rtcm::get_MT1005_test () { unsigned int mt1005 = 1005; unsigned int reference_station_id = 2003; // Max: 4095 double ECEF_X = 1114104.5999; // units: m double ECEF_Y = -4850729.7108; // units: m double ECEF_Z = 3975521.4643; // units: m std::bitset<1> DF001_; Rtcm::set_DF002(mt1005); Rtcm::set_DF003(reference_station_id); Rtcm::set_DF021(); Rtcm::set_DF022(true); // GPS Rtcm::set_DF023(false); // Glonass Rtcm::set_DF024(false); // Galileo DF141 = std::bitset<1>("0"); // 0: Real, physical reference station DF001_ = std::bitset<1>("0"); // Reserved, set to 0 Rtcm::set_DF025(ECEF_X); DF142 = std::bitset<1>("0"); // Single Receiver Oscillator Indicator Rtcm::set_DF026(ECEF_Y); DF364 = std::bitset<2>("00"); // Quarter Cycle Indicator Rtcm::set_DF027(ECEF_Z); std::string message = DF002.to_string() + DF003.to_string() + DF021.to_string() + DF022.to_string() + DF023.to_string() + DF024.to_string() + DF141.to_string() + DF025.to_string() + DF142.to_string() + DF001_.to_string() + DF026.to_string() + DF364.to_string() + DF027.to_string() ; std::bitset<152> test_msg(message); return test_msg; } std::string Rtcm::print_MT1005( unsigned int ref_id, double ecef_x, double ecef_y, double ecef_z, bool gps, bool glonass, bool galileo, bool non_physical, bool single_oscillator, unsigned int quarter_cycle_indicator) { unsigned int msg_number = 1005; std::bitset<1> DF001_; Rtcm::set_DF002(msg_number); Rtcm::set_DF003(ref_id); Rtcm::set_DF021(); Rtcm::set_DF022(gps); Rtcm::set_DF023(glonass); Rtcm::set_DF024(galileo); DF141 = std::bitset<1>(non_physical); DF001_ = std::bitset<1>("0"); Rtcm::set_DF025(ecef_x); DF142 = std::bitset<1>(single_oscillator); Rtcm::set_DF026(ecef_y); DF364 = std::bitset<2>(quarter_cycle_indicator); Rtcm::set_DF027(ecef_z); std::string data = DF002.to_string() + DF003.to_string() + DF021.to_string() + DF022.to_string() + DF023.to_string() + DF024.to_string() + DF141.to_string() + DF025.to_string() + DF142.to_string() + DF001_.to_string() + DF026.to_string() + DF364.to_string() + DF027.to_string() ; std::string msg = build_message(data); if(server_is_running) { rtcm_message_queue->push(msg); } return msg; } int Rtcm::read_MT1005(const std::string & message, unsigned int & ref_id, double & ecef_x, double & ecef_y, double & ecef_z, bool & gps, bool & glonass, bool & galileo) { // Convert message to binary std::string message_bin = Rtcm::binary_data_to_bin(message); if(!Rtcm::check_CRC(message) ) { LOG(WARNING) << " Bad CRC detected in RTCM message MT1005"; return 1; } // Check than the message number is correct unsigned int preamble_length = 8; unsigned int reserved_field_length = 6; unsigned int index = preamble_length + reserved_field_length; unsigned int read_message_length = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 10))); index += 10; if (read_message_length != 19) { LOG(WARNING) << " Message MT1005 with wrong length (19 bytes expected, " << read_message_length << " received)"; return 1; } unsigned int msg_number = 1005; Rtcm::set_DF002(msg_number); std::bitset<12> read_msg_number(message_bin.substr(index, 12)); index += 12; if (DF002 != read_msg_number) { LOG(WARNING) << " This is not a MT1005 message"; return 1; } ref_id = Rtcm::bin_to_uint(message_bin.substr(index, 12)); index += 12; index += 6; // ITRF year gps = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 1))); index += 1; glonass = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 1))); index += 1; galileo = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 1))); index += 1; index += 1; // ref_station_indicator ecef_x = Rtcm::bin_to_double(message_bin.substr(index, 38)) / 10000.0; index += 38; index += 1; // single rx oscillator index += 1; // reserved ecef_y = Rtcm::bin_to_double(message_bin.substr(index, 38)) / 10000.0; index += 38; index += 2; // quarter cycle indicator ecef_z = Rtcm::bin_to_double(message_bin.substr(index, 38)) / 10000.0; return 0; } std::string Rtcm::print_MT1005_test() { std::bitset<152> mt1005 = get_MT1005_test(); return Rtcm::build_message(mt1005.to_string()); } // ******************************************************** // // MESSAGE TYPE 1006 (STATION DESCRIPTION PLUS HEIGHT INFORMATION) // // ******************************************************** std::string Rtcm::print_MT1006(unsigned int ref_id, double ecef_x, double ecef_y, double ecef_z, bool gps, bool glonass, bool galileo, bool non_physical, bool single_oscillator, unsigned int quarter_cycle_indicator, double height) { unsigned int msg_number = 1006; std::bitset<1> DF001_; Rtcm::set_DF002(msg_number); Rtcm::set_DF003(ref_id); Rtcm::set_DF021(); Rtcm::set_DF022(gps); Rtcm::set_DF023(glonass); Rtcm::set_DF024(galileo); DF141 = std::bitset<1>(non_physical); DF001_ = std::bitset<1>("0"); Rtcm::set_DF025(ecef_x); DF142 = std::bitset<1>(single_oscillator); Rtcm::set_DF026(ecef_y); DF364 = std::bitset<2>(quarter_cycle_indicator); Rtcm::set_DF027(ecef_z); Rtcm::set_DF028(height); std::string data = DF002.to_string() + DF003.to_string() + DF021.to_string() + DF022.to_string() + DF023.to_string() + DF024.to_string() + DF141.to_string() + DF025.to_string() + DF142.to_string() + DF001_.to_string() + DF026.to_string() + DF364.to_string() + DF027.to_string() + DF028.to_string(); std::string msg = build_message(data); if(server_is_running) { rtcm_message_queue->push(msg); } return msg; } // ******************************************************** // // MESSAGE TYPE 1008 (ANTENNA DESCRIPTOR & SERIAL NUMBER) // // ******************************************************** std::string Rtcm::print_MT1008(unsigned int ref_id, const std::string & antenna_descriptor, unsigned int antenna_setup_id, const std::string & antenna_serial_number) { unsigned int msg_number = 1008; std::bitset<12> DF002_ = std::bitset<12>(msg_number); Rtcm::set_DF003(ref_id); std::string ant_descriptor = antenna_descriptor; unsigned int len = ant_descriptor.length(); if (len > 31) { ant_descriptor = ant_descriptor.substr(0, 31); len = 31; } DF029 = std::bitset<8>(len); std::string DF030_str_; for(auto it = ant_descriptor.begin(); it != ant_descriptor.end(); it++) { char c = *it; std::bitset<8> character = std::bitset<8>(c); DF030_str_ += character.to_string(); } Rtcm::set_DF031(antenna_setup_id); std::string ant_sn(antenna_serial_number); unsigned int len2 = ant_sn.length(); if (len2 > 31) { ant_sn = ant_sn.substr(0, 31); len2 = 31; } DF032 = std::bitset<8>(len2); std::string DF033_str_; for(auto it = ant_sn.begin(); it != ant_sn.end(); it++) { char c = *it; std::bitset<8> character = std::bitset<8>(c); DF033_str_ += character.to_string(); } std::string data = DF002_.to_string() + DF003.to_string() + DF029.to_string() + DF030_str_ + DF031.to_string() + DF032.to_string() + DF033_str_; std::string msg = build_message(data); if(server_is_running) { rtcm_message_queue->push(msg); } return msg; } // ******************************************************** // // MESSAGE TYPE 1019 (GPS EPHEMERIS) // // ******************************************************** std::string Rtcm::print_MT1019(const Gps_Ephemeris & gps_eph) { unsigned int msg_number = 1019; Rtcm::set_DF002(msg_number); Rtcm::set_DF009(gps_eph); Rtcm::set_DF076(gps_eph); Rtcm::set_DF077(gps_eph); Rtcm::set_DF078(gps_eph); Rtcm::set_DF079(gps_eph); Rtcm::set_DF071(gps_eph); Rtcm::set_DF081(gps_eph); Rtcm::set_DF082(gps_eph); Rtcm::set_DF083(gps_eph); Rtcm::set_DF084(gps_eph); Rtcm::set_DF085(gps_eph); Rtcm::set_DF086(gps_eph); Rtcm::set_DF087(gps_eph); Rtcm::set_DF088(gps_eph); Rtcm::set_DF089(gps_eph); Rtcm::set_DF090(gps_eph); Rtcm::set_DF091(gps_eph); Rtcm::set_DF092(gps_eph); Rtcm::set_DF093(gps_eph); Rtcm::set_DF094(gps_eph); Rtcm::set_DF095(gps_eph); Rtcm::set_DF096(gps_eph); Rtcm::set_DF097(gps_eph); Rtcm::set_DF098(gps_eph); Rtcm::set_DF099(gps_eph); Rtcm::set_DF100(gps_eph); Rtcm::set_DF101(gps_eph); Rtcm::set_DF102(gps_eph); Rtcm::set_DF103(gps_eph); Rtcm::set_DF137(gps_eph); std::string data; data.clear(); data = DF002.to_string() + DF009.to_string() + DF076.to_string() + DF077.to_string() + DF078.to_string() + DF079.to_string() + DF071.to_string() + DF081.to_string() + DF082.to_string() + DF083.to_string() + DF084.to_string() + DF085.to_string() + DF086.to_string() + DF087.to_string() + DF088.to_string() + DF089.to_string() + DF090.to_string() + DF091.to_string() + DF092.to_string() + DF093.to_string() + DF094.to_string() + DF095.to_string() + DF096.to_string() + DF097.to_string() + DF098.to_string() + DF099.to_string() + DF100.to_string() + DF101.to_string() + DF102.to_string() + DF103.to_string() + DF137.to_string(); if (data.length() != 488) { LOG(WARNING) << "Bad-formatted RTCM MT1019 (488 bits expected, found " << data.length() << ")"; } std::string msg = build_message(data); if(server_is_running) { rtcm_message_queue->push(msg); } return msg; } int Rtcm::read_MT1019(const std::string & message, Gps_Ephemeris & gps_eph) { // Convert message to binary std::string message_bin = Rtcm::binary_data_to_bin(message); if(!Rtcm::check_CRC(message) ) { LOG(WARNING) << " Bad CRC detected in RTCM message MT1019"; return 1; } unsigned int preamble_length = 8; unsigned int reserved_field_length = 6; unsigned int index = preamble_length + reserved_field_length; unsigned int read_message_length = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 10))); index += 10; if (read_message_length != 61) { LOG(WARNING) << " Message MT1019 seems too long (61 bytes expected, " << read_message_length << " received)"; return 1; } // Check than the message number is correct unsigned int read_msg_number = Rtcm::bin_to_uint(message_bin.substr(index, 12)); index += 12; if (1019 != read_msg_number) { LOG(WARNING) << " This is not a MT1019 message"; return 1; } // Fill Gps Ephemeris with message data content gps_eph.i_satellite_PRN = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 6))); index += 6; gps_eph.i_GPS_week = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 10))); index += 10; gps_eph.i_SV_accuracy = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 4))); index += 4; gps_eph.i_code_on_L2 = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 2))); index += 2; gps_eph.d_IDOT = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 14))) * I_DOT_LSB; index += 14; gps_eph.d_IODE_SF2 = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 8))); gps_eph.d_IODE_SF3 = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 8))); index += 8; gps_eph.d_Toc = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 16))) * T_OC_LSB; index += 16; gps_eph.d_A_f2 = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 8))) * A_F2_LSB; index += 8; gps_eph.d_A_f1 = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 16))) * A_F1_LSB; index += 16; gps_eph.d_A_f0 = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 22))) * A_F0_LSB; index += 22; gps_eph.d_IODC = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 10))); index += 10; gps_eph.d_Crs = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 16))) * C_RS_LSB; index += 16; gps_eph.d_Delta_n = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 16))) * DELTA_N_LSB; index += 16; gps_eph.d_M_0 = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 32))) * M_0_LSB; index += 32; gps_eph.d_Cuc = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 16))) * C_UC_LSB; index += 16; gps_eph.d_e_eccentricity = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 32))) * E_LSB; index += 32; gps_eph.d_Cus = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 16))) * C_US_LSB; index += 16; gps_eph.d_sqrt_A = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 32))) * SQRT_A_LSB; index += 32; gps_eph.d_Toe = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 16))) * T_OE_LSB; index += 16; gps_eph.d_Cic = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 16))) * C_IC_LSB; index += 16; gps_eph.d_OMEGA0 = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 32))) * OMEGA_0_LSB; index += 32; gps_eph.d_Cis = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 16))) * C_IS_LSB; index += 16; gps_eph.d_i_0 = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 32))) * I_0_LSB; index += 32; gps_eph.d_Crc = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 16))) * C_RC_LSB; index += 16; gps_eph.d_OMEGA = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 32))) * OMEGA_LSB; index += 32; gps_eph.d_OMEGA_DOT = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 24))) * OMEGA_DOT_LSB; index += 24; gps_eph.d_TGD = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 8))) * T_GD_LSB; index += 8; gps_eph.i_SV_health = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 6))); index += 6; gps_eph.b_L2_P_data_flag = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 1))); index += 1; gps_eph.b_fit_interval_flag = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 1))); return 0; } // ******************************************************** // // MESSAGE TYPE 1029 (UNICODE TEXT STRING) // // ******************************************************** std::string Rtcm::print_MT1029(unsigned int ref_id, const Gps_Ephemeris & gps_eph, double obs_time, const std::string & message) { unsigned int msg_number = 1029; Rtcm::set_DF002(msg_number); Rtcm::set_DF003(ref_id); Rtcm::set_DF051(gps_eph, obs_time); Rtcm::set_DF052(gps_eph, obs_time); unsigned int i = 0; bool first = true; std::string text_binary; for(auto it = message.begin(); it != message.end(); it++) { char c = *it; if(isgraph(c)) { i++; first = true; } else if(c == ' ') { i++; first = true; } else { if(!first) { i++; first = true; } else { first = false; } } std::bitset<8> character = std::bitset<8>(c); text_binary += character.to_string(); } std::bitset<7> DF138_ = std::bitset<7>(i); std::bitset<8> DF139_ = std::bitset<8>(message.length()); std::string data = DF002.to_string() + DF003.to_string() + DF051.to_string() + DF052.to_string() + DF138_.to_string() + DF139_.to_string() + text_binary; std::string msg = build_message(data); if(server_is_running) { rtcm_message_queue->push(msg); } return msg; } // ******************************************************** // // MESSAGE TYPE 1045 (GALILEO EPHEMERIS) // // ******************************************************** std::string Rtcm::print_MT1045(const Galileo_Ephemeris & gal_eph) { unsigned int msg_number = 1045; Rtcm::set_DF002(msg_number); Rtcm::set_DF252(gal_eph); Rtcm::set_DF289(gal_eph); Rtcm::set_DF290(gal_eph); Rtcm::set_DF291(gal_eph); Rtcm::set_DF293(gal_eph); Rtcm::set_DF294(gal_eph); Rtcm::set_DF295(gal_eph); Rtcm::set_DF296(gal_eph); Rtcm::set_DF297(gal_eph); Rtcm::set_DF298(gal_eph); Rtcm::set_DF299(gal_eph); Rtcm::set_DF300(gal_eph); Rtcm::set_DF301(gal_eph); Rtcm::set_DF302(gal_eph); Rtcm::set_DF303(gal_eph); Rtcm::set_DF304(gal_eph); Rtcm::set_DF305(gal_eph); Rtcm::set_DF306(gal_eph); Rtcm::set_DF307(gal_eph); Rtcm::set_DF308(gal_eph); Rtcm::set_DF309(gal_eph); Rtcm::set_DF310(gal_eph); Rtcm::set_DF311(gal_eph); Rtcm::set_DF312(gal_eph); Rtcm::set_DF314(gal_eph); Rtcm::set_DF315(gal_eph); unsigned int seven_zero = 0; std::bitset<7> DF001_ = std::bitset<7>(seven_zero); std::string data; data.clear(); data = DF002.to_string() + DF252.to_string() + DF289.to_string() + DF290.to_string() + DF291.to_string() + DF292.to_string() + DF293.to_string() + DF294.to_string() + DF295.to_string() + DF296.to_string() + DF297.to_string() + DF298.to_string() + DF299.to_string() + DF300.to_string() + DF301.to_string() + DF302.to_string() + DF303.to_string() + DF304.to_string() + DF305.to_string() + DF306.to_string() + DF307.to_string() + DF308.to_string() + DF309.to_string() + DF310.to_string() + DF311.to_string() + DF312.to_string() + DF314.to_string() + DF315.to_string() + DF001_.to_string(); if (data.length() != 496) { LOG(WARNING) << "Bad-formatted RTCM MT1045 (496 bits expected, found " << data.length() << ")"; } std::string msg = build_message(data); if(server_is_running) { rtcm_message_queue->push(msg); } return msg; } int Rtcm::read_MT1045(const std::string & message, Galileo_Ephemeris & gal_eph) { // Convert message to binary std::string message_bin = Rtcm::binary_data_to_bin(message); if(!Rtcm::check_CRC(message) ) { LOG(WARNING) << " Bad CRC detected in RTCM message MT1045"; return 1; } unsigned int preamble_length = 8; unsigned int reserved_field_length = 6; unsigned int index = preamble_length + reserved_field_length; unsigned int read_message_length = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 10))); index += 10; if (read_message_length != 62) { LOG(WARNING) << " Message MT1045 seems too long (62 bytes expected, " << read_message_length << " received)"; return 1; } // Check than the message number is correct unsigned int read_msg_number = Rtcm::bin_to_uint(message_bin.substr(index, 12)); index += 12; if (1045 != read_msg_number) { LOG(WARNING) << " This is not a MT1045 message"; return 1; } // Fill Galileo Ephemeris with message data content gal_eph.i_satellite_PRN = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 6))); index += 6; gal_eph.WN_5 = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 12))); index += 12; gal_eph.IOD_nav_1 = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 10))); index += 10; gal_eph.SISA_3 = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 8))); index += 8; gal_eph.iDot_2 = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 14))) * iDot_2_LSB; index += 14; gal_eph.t0c_4 = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 14))) * t0c_4_LSB; index += 14; gal_eph.af2_4 = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 6))) * af2_4_LSB; index += 6; gal_eph.af1_4 = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 21))) * af1_4_LSB; index += 21; gal_eph.af0_4 = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 31))) * af0_4_LSB; index += 31; gal_eph.C_rs_3 = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 16))) * C_rs_3_LSB; index += 16; gal_eph.delta_n_3 = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 16))) * delta_n_3_LSB; index += 16; gal_eph.M0_1 = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 32))) * M0_1_LSB; index += 32; gal_eph.C_uc_3 = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 16))) * C_uc_3_LSB; index += 16; gal_eph.e_1 = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 32))) * e_1_LSB; index += 32; gal_eph.C_us_3 = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 16))) * C_us_3_LSB; index += 16; gal_eph.A_1 = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 32))) * A_1_LSB_gal; index += 32; gal_eph.t0e_1 = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 14))) * t0e_1_LSB; index += 14; gal_eph.C_ic_4 = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 16))) * C_ic_4_LSB; index += 16; gal_eph.OMEGA_0_2 = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 32))) * OMEGA_0_2_LSB; index += 32; gal_eph.C_is_4 = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 16))) * C_is_4_LSB; index += 16; gal_eph.i_0_2 = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 32))) * i_0_2_LSB; index += 32; gal_eph.C_rc_3 = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 16))) * C_rc_3_LSB; index += 16; gal_eph.omega_2 = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 32))) * omega_2_LSB; index += 32; gal_eph.OMEGA_dot_3 = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 24))) * OMEGA_dot_3_LSB; index += 24; gal_eph.BGD_E1E5a_5 = static_cast(Rtcm::bin_to_int(message_bin.substr(index, 10))); index += 10; gal_eph.E5a_HS = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 2))); index += 2; gal_eph.E5a_DVS = static_cast(Rtcm::bin_to_uint(message_bin.substr(index, 1))); return 0; } // ********************************************************************************************** // // MESSAGE TYPE MSM1 (COMPACT observables) // // ********************************************************************************************** std::string Rtcm::print_MSM_1( const Gps_Ephemeris & gps_eph, const Gps_CNAV_Ephemeris & gps_cnav_eph, const Galileo_Ephemeris & gal_eph, double obs_time, const std::map & observables, unsigned int ref_id, unsigned int clock_steering_indicator, unsigned int external_clock_indicator, int smooth_int, bool divergence_free, bool more_messages) { unsigned int msg_number = 0; if(gps_eph.i_satellite_PRN != 0) msg_number = 1071; if(gps_cnav_eph.i_satellite_PRN != 0) msg_number = 1071; if(gal_eph.i_satellite_PRN != 0) msg_number = 1091; if(((gps_eph.i_satellite_PRN != 0) ||(gps_cnav_eph.i_satellite_PRN != 0) ) && (gal_eph.i_satellite_PRN != 0)) { LOG(WARNING) << "MSM messages for observables from different systems are not defined"; //print two messages? } if(msg_number == 0) { LOG(WARNING) << "Invalid ephemeris provided"; msg_number = 1071; } std::string header = Rtcm::get_MSM_header(msg_number, obs_time, observables, ref_id, clock_steering_indicator, external_clock_indicator, smooth_int, divergence_free, more_messages); std::string sat_data = Rtcm::get_MSM_1_content_sat_data(observables); std::string signal_data = Rtcm::get_MSM_1_content_signal_data(observables); std::string message = build_message(header + sat_data + signal_data); if(server_is_running) { rtcm_message_queue->push(message); } return message; } std::string Rtcm::get_MSM_header(unsigned int msg_number, double obs_time, const std::map & observables, unsigned int ref_id, unsigned int clock_steering_indicator, unsigned int external_clock_indicator, int smooth_int, bool divergence_free, bool more_messages) { Rtcm::set_DF002(msg_number); Rtcm::set_DF003(ref_id); Rtcm::set_DF004(obs_time); Rtcm::set_DF393(more_messages); Rtcm::set_DF409(0); // Issue of Data Station. 0: not utilized std::bitset<7> DF001_ = std::bitset<7>("0000000"); Rtcm::set_DF411(clock_steering_indicator); Rtcm::set_DF412(external_clock_indicator); Rtcm::set_DF417(divergence_free); Rtcm::set_DF418(smooth_int); Rtcm::set_DF394(observables); Rtcm::set_DF395(observables); std::string header = DF002.to_string() + DF003.to_string(); header += DF004.to_string(); header = header + DF393.to_string() + DF409.to_string() + DF001_.to_string() + DF411.to_string() + DF417.to_string() + DF412.to_string() + DF418.to_string() + DF394.to_string() + DF395.to_string() + Rtcm::set_DF396(observables); return header; } std::string Rtcm::get_MSM_1_content_sat_data(const std::map & observables) { std::string sat_data; sat_data.clear(); Rtcm::set_DF394(observables); unsigned int num_satellites = DF394.count(); std::vector > observables_vector; std::map::const_iterator gnss_synchro_iter; std::vector pos; std::vector::iterator it; for(gnss_synchro_iter = observables.begin(); gnss_synchro_iter != observables.end(); gnss_synchro_iter++) { it = std::find(pos.begin(), pos.end(), 65 - gnss_synchro_iter->second.PRN); if(it == pos.end()) { pos.push_back(65 - gnss_synchro_iter->second.PRN); observables_vector.push_back(*gnss_synchro_iter); } } std::vector > ordered_by_PRN_pos = Rtcm::sort_by_PRN_mask(observables_vector); for(unsigned int nsat = 0; nsat < num_satellites; nsat++) { Rtcm::set_DF398( ordered_by_PRN_pos.at(nsat).second ); sat_data += DF398.to_string(); } return sat_data; } std::string Rtcm::get_MSM_1_content_signal_data(const std::map & observables) { std::string signal_data; signal_data.clear(); unsigned int Ncells = observables.size(); std::vector > observables_vector; std::map::const_iterator map_iter; for(map_iter = observables.begin(); map_iter != observables.end(); map_iter++) { observables_vector.push_back(*map_iter); } std::vector > ordered_by_signal = Rtcm::sort_by_signal(observables_vector); std::reverse(ordered_by_signal.begin(), ordered_by_signal.end()); std::vector > ordered_by_PRN_pos = Rtcm::sort_by_PRN_mask(ordered_by_signal); for(unsigned int cell = 0; cell < Ncells ; cell++) { Rtcm::set_DF400(ordered_by_PRN_pos.at( cell ).second); signal_data += DF400.to_string(); } return signal_data; } // ********************************************************************************************** // // MESSAGE TYPE MSM2 (COMPACT PHASERANGES) // // ********************************************************************************************** std::string Rtcm::print_MSM_2( const Gps_Ephemeris & gps_eph, const Gps_CNAV_Ephemeris & gps_cnav_eph, const Galileo_Ephemeris & gal_eph, double obs_time, const std::map & observables, unsigned int ref_id, unsigned int clock_steering_indicator, unsigned int external_clock_indicator, int smooth_int, bool divergence_free, bool more_messages) { unsigned int msg_number = 0; if(gps_eph.i_satellite_PRN != 0) msg_number = 1072; if(gps_cnav_eph.i_satellite_PRN != 0) msg_number = 1072; if(gal_eph.i_satellite_PRN != 0) msg_number = 1092; if(((gps_eph.i_satellite_PRN != 0) ||(gps_cnav_eph.i_satellite_PRN != 0) ) && (gal_eph.i_satellite_PRN != 0)) { LOG(WARNING) << "MSM messages for observables from different systems are not defined"; //print two messages? } if(msg_number == 0) { LOG(WARNING) << "Invalid ephemeris provided"; msg_number = 1072; } std::string header = Rtcm::get_MSM_header(msg_number, obs_time, observables, ref_id, clock_steering_indicator, external_clock_indicator, smooth_int, divergence_free, more_messages); std::string sat_data = Rtcm::get_MSM_1_content_sat_data(observables); std::string signal_data = Rtcm::get_MSM_2_content_signal_data(gps_eph, gps_cnav_eph, gal_eph, obs_time, observables); std::string message = build_message(header + sat_data + signal_data); if(server_is_running) { rtcm_message_queue->push(message); } return message; } std::string Rtcm::get_MSM_2_content_signal_data(const Gps_Ephemeris & ephNAV, const Gps_CNAV_Ephemeris & ephCNAV, const Galileo_Ephemeris & ephFNAV, double obs_time, const std::map & observables) { std::string signal_data; std::string first_data_type; std::string second_data_type; std::string third_data_type; unsigned int Ncells = observables.size(); std::vector > observables_vector; std::map::const_iterator map_iter; for(map_iter = observables.begin(); map_iter != observables.end(); map_iter++) { observables_vector.push_back(*map_iter); } std::vector > ordered_by_signal = Rtcm::sort_by_signal(observables_vector); std::reverse(ordered_by_signal.begin(), ordered_by_signal.end()); std::vector > ordered_by_PRN_pos = Rtcm::sort_by_PRN_mask(ordered_by_signal); for(unsigned int cell = 0; cell < Ncells ; cell++) { Rtcm::set_DF401(ordered_by_PRN_pos.at( cell ).second); Rtcm::set_DF402(ephNAV, ephCNAV, ephFNAV, obs_time, ordered_by_PRN_pos.at( cell ).second); Rtcm::set_DF420(ordered_by_PRN_pos.at( cell ).second); first_data_type += DF401.to_string(); second_data_type += DF402.to_string(); third_data_type += DF420.to_string(); } signal_data = first_data_type + second_data_type + third_data_type; return signal_data; } // ********************************************************************************************** // // MESSAGE TYPE MSM3 (COMPACT PSEUDORANGES AND PHASERANGES) // // ********************************************************************************************** std::string Rtcm::print_MSM_3( const Gps_Ephemeris & gps_eph, const Gps_CNAV_Ephemeris & gps_cnav_eph, const Galileo_Ephemeris & gal_eph, double obs_time, const std::map & observables, unsigned int ref_id, unsigned int clock_steering_indicator, unsigned int external_clock_indicator, int smooth_int, bool divergence_free, bool more_messages) { unsigned int msg_number = 0; if(gps_eph.i_satellite_PRN != 0) msg_number = 1073; if(gps_cnav_eph.i_satellite_PRN != 0) msg_number = 1073; if(gal_eph.i_satellite_PRN != 0) msg_number = 1093; if(((gps_eph.i_satellite_PRN != 0) ||(gps_cnav_eph.i_satellite_PRN != 0) ) && (gal_eph.i_satellite_PRN != 0)) { LOG(WARNING) << "MSM messages for observables from different systems are not defined"; //print two messages? } if(msg_number == 0) { LOG(WARNING) << "Invalid ephemeris provided"; msg_number = 1073; } std::string header = Rtcm::get_MSM_header(msg_number, obs_time, observables, ref_id, clock_steering_indicator, external_clock_indicator, smooth_int, divergence_free, more_messages); std::string sat_data = Rtcm::get_MSM_1_content_sat_data(observables); std::string signal_data = Rtcm::get_MSM_3_content_signal_data(gps_eph, gps_cnav_eph, gal_eph, obs_time, observables); std::string message = build_message(header + sat_data + signal_data); if(server_is_running) { rtcm_message_queue->push(message); } return message; } std::string Rtcm::get_MSM_3_content_signal_data(const Gps_Ephemeris & ephNAV, const Gps_CNAV_Ephemeris & ephCNAV, const Galileo_Ephemeris & ephFNAV, double obs_time, const std::map & observables) { std::string signal_data; std::string first_data_type; std::string second_data_type; std::string third_data_type; std::string fourth_data_type; unsigned int Ncells = observables.size(); std::vector > observables_vector; std::map::const_iterator map_iter; for(map_iter = observables.begin(); map_iter != observables.end(); map_iter++) { observables_vector.push_back(*map_iter); } std::vector > ordered_by_signal = Rtcm::sort_by_signal(observables_vector); std::reverse(ordered_by_signal.begin(), ordered_by_signal.end()); std::vector > ordered_by_PRN_pos = Rtcm::sort_by_PRN_mask(ordered_by_signal); for(unsigned int cell = 0; cell < Ncells ; cell++) { Rtcm::set_DF400(ordered_by_PRN_pos.at( cell ).second); Rtcm::set_DF401(ordered_by_PRN_pos.at( cell ).second); Rtcm::set_DF402(ephNAV, ephCNAV, ephFNAV, obs_time, ordered_by_PRN_pos.at( cell ).second); Rtcm::set_DF420(ordered_by_PRN_pos.at( cell ).second); first_data_type += DF400.to_string(); second_data_type += DF401.to_string(); third_data_type += DF402.to_string(); fourth_data_type += DF420.to_string(); } signal_data = first_data_type + second_data_type + third_data_type + fourth_data_type; return signal_data; } // ********************************************************************************************** // // MESSAGE TYPE MSM4 (FULL PSEUDORANGES AND PHASERANGES PLUS CNR) // // ********************************************************************************************** std::string Rtcm::print_MSM_4( const Gps_Ephemeris & gps_eph, const Gps_CNAV_Ephemeris & gps_cnav_eph, const Galileo_Ephemeris & gal_eph, double obs_time, const std::map & observables, unsigned int ref_id, unsigned int clock_steering_indicator, unsigned int external_clock_indicator, int smooth_int, bool divergence_free, bool more_messages) { unsigned int msg_number = 0; if(gps_eph.i_satellite_PRN != 0) msg_number = 1074; if(gps_cnav_eph.i_satellite_PRN != 0) msg_number = 1074; if(gal_eph.i_satellite_PRN != 0) msg_number = 1094; if(((gps_eph.i_satellite_PRN != 0) ||(gps_cnav_eph.i_satellite_PRN != 0) ) && (gal_eph.i_satellite_PRN != 0)) { LOG(WARNING) << "MSM messages for observables from different systems are not defined"; //print two messages? } if(msg_number == 0) { LOG(WARNING) << "Invalid ephemeris provided"; msg_number = 1074; } std::string header = Rtcm::get_MSM_header(msg_number, obs_time, observables, ref_id, clock_steering_indicator, external_clock_indicator, smooth_int, divergence_free, more_messages); std::string sat_data = Rtcm::get_MSM_4_content_sat_data(observables); std::string signal_data = Rtcm::get_MSM_4_content_signal_data(gps_eph, gps_cnav_eph, gal_eph, obs_time, observables); std::string message = build_message(header + sat_data + signal_data); if(server_is_running) { rtcm_message_queue->push(message); } return message; } std::string Rtcm::get_MSM_4_content_sat_data(const std::map & observables) { std::string sat_data; std::string first_data_type; std::string second_data_type; Rtcm::set_DF394(observables); unsigned int num_satellites = DF394.count(); std::vector > observables_vector; std::map::const_iterator gnss_synchro_iter; std::vector pos; std::vector::iterator it; for(gnss_synchro_iter = observables.begin(); gnss_synchro_iter != observables.end(); gnss_synchro_iter++) { it = std::find(pos.begin(), pos.end(), 65 - gnss_synchro_iter->second.PRN); if(it == pos.end()) { pos.push_back(65 - gnss_synchro_iter->second.PRN); observables_vector.push_back(*gnss_synchro_iter); } } std::vector > ordered_by_PRN_pos = Rtcm::sort_by_PRN_mask(observables_vector); for(unsigned int nsat = 0; nsat < num_satellites; nsat++) { Rtcm::set_DF397( ordered_by_PRN_pos.at(nsat).second ); Rtcm::set_DF398( ordered_by_PRN_pos.at(nsat).second ); first_data_type += DF397.to_string(); second_data_type += DF398.to_string(); } sat_data = first_data_type + second_data_type; return sat_data; } std::string Rtcm::get_MSM_4_content_signal_data(const Gps_Ephemeris & ephNAV, const Gps_CNAV_Ephemeris & ephCNAV, const Galileo_Ephemeris & ephFNAV, double obs_time, const std::map & observables) { std::string signal_data; std::string first_data_type; std::string second_data_type; std::string third_data_type; std::string fourth_data_type; std::string fifth_data_type; unsigned int Ncells = observables.size(); std::vector > observables_vector; std::map::const_iterator map_iter; for(map_iter = observables.begin(); map_iter != observables.end(); map_iter++) { observables_vector.push_back(*map_iter); } std::vector > ordered_by_signal = Rtcm::sort_by_signal(observables_vector); std::reverse(ordered_by_signal.begin(), ordered_by_signal.end()); std::vector > ordered_by_PRN_pos = Rtcm::sort_by_PRN_mask(ordered_by_signal); for(unsigned int cell = 0; cell < Ncells ; cell++) { Rtcm::set_DF400(ordered_by_PRN_pos.at( cell ).second); Rtcm::set_DF401(ordered_by_PRN_pos.at( cell ).second); Rtcm::set_DF402(ephNAV, ephCNAV, ephFNAV, obs_time, ordered_by_PRN_pos.at( cell ).second); Rtcm::set_DF420(ordered_by_PRN_pos.at( cell ).second); Rtcm::set_DF403(ordered_by_PRN_pos.at( cell ).second); first_data_type += DF400.to_string(); second_data_type += DF401.to_string(); third_data_type += DF402.to_string(); fourth_data_type += DF420.to_string(); fifth_data_type += DF403.to_string(); } signal_data = first_data_type + second_data_type + third_data_type + fourth_data_type + fifth_data_type; return signal_data; } // ********************************************************************************************** // // MESSAGE TYPE MSM5 (FULL PSEUDORANGES, PHASERANGES, PHASERANGERATE PLUS CNR) // // ********************************************************************************************** std::string Rtcm::print_MSM_5( const Gps_Ephemeris & gps_eph, const Gps_CNAV_Ephemeris & gps_cnav_eph, const Galileo_Ephemeris & gal_eph, double obs_time, const std::map & observables, unsigned int ref_id, unsigned int clock_steering_indicator, unsigned int external_clock_indicator, int smooth_int, bool divergence_free, bool more_messages) { unsigned int msg_number = 0; if(gps_eph.i_satellite_PRN != 0) msg_number = 1075; if(gps_cnav_eph.i_satellite_PRN != 0) msg_number = 1075; if(gal_eph.i_satellite_PRN != 0) msg_number = 1095; if(((gps_eph.i_satellite_PRN != 0) ||(gps_cnav_eph.i_satellite_PRN != 0) ) && (gal_eph.i_satellite_PRN != 0)) { LOG(WARNING) << "MSM messages for observables from different systems are not defined"; //print two messages? } if(msg_number == 0) { LOG(WARNING) << "Invalid ephemeris provided"; msg_number = 1075; } std::string header = Rtcm::get_MSM_header(msg_number, obs_time, observables, ref_id, clock_steering_indicator, external_clock_indicator, smooth_int, divergence_free, more_messages); std::string sat_data = Rtcm::get_MSM_5_content_sat_data(observables); std::string signal_data = Rtcm::get_MSM_5_content_signal_data(gps_eph, gps_cnav_eph, gal_eph, obs_time, observables); std::string message = build_message(header + sat_data + signal_data); if(server_is_running) { rtcm_message_queue->push(message); } return message; } std::string Rtcm::get_MSM_5_content_sat_data(const std::map & observables) { std::string sat_data; std::string first_data_type; std::string second_data_type; std::string third_data_type; std::string fourth_data_type; Rtcm::set_DF394(observables); unsigned int num_satellites = DF394.count(); std::vector > observables_vector; std::map::const_iterator gnss_synchro_iter; std::vector pos; std::vector::iterator it; for(gnss_synchro_iter = observables.begin(); gnss_synchro_iter != observables.end(); gnss_synchro_iter++) { it = std::find(pos.begin(), pos.end(), 65 - gnss_synchro_iter->second.PRN); if(it == pos.end()) { pos.push_back(65 - gnss_synchro_iter->second.PRN); observables_vector.push_back(*gnss_synchro_iter); } } std::vector > ordered_by_PRN_pos = Rtcm::sort_by_PRN_mask(observables_vector); for(unsigned int nsat = 0; nsat < num_satellites; nsat++) { Rtcm::set_DF397( ordered_by_PRN_pos.at(nsat).second ); Rtcm::set_DF398( ordered_by_PRN_pos.at(nsat).second ); Rtcm::set_DF399( ordered_by_PRN_pos.at(nsat).second ); std::bitset<4> reserved = std::bitset<4>("0000"); first_data_type += DF397.to_string(); second_data_type += reserved.to_string(); third_data_type += DF398.to_string(); fourth_data_type += DF399.to_string(); } sat_data = first_data_type + second_data_type + third_data_type + fourth_data_type; return sat_data; } std::string Rtcm::get_MSM_5_content_signal_data(const Gps_Ephemeris & ephNAV, const Gps_CNAV_Ephemeris & ephCNAV, const Galileo_Ephemeris & ephFNAV, double obs_time, const std::map & observables) { std::string signal_data; std::string first_data_type; std::string second_data_type; std::string third_data_type; std::string fourth_data_type; std::string fifth_data_type; std::string sixth_data_type; unsigned int Ncells = observables.size(); std::vector > observables_vector; std::map::const_iterator map_iter; for(map_iter = observables.begin(); map_iter != observables.end(); map_iter++) { observables_vector.push_back(*map_iter); } std::vector > ordered_by_signal = Rtcm::sort_by_signal(observables_vector); std::reverse(ordered_by_signal.begin(), ordered_by_signal.end()); std::vector > ordered_by_PRN_pos = Rtcm::sort_by_PRN_mask(ordered_by_signal); for(unsigned int cell = 0; cell < Ncells ; cell++) { Rtcm::set_DF400(ordered_by_PRN_pos.at( cell ).second); Rtcm::set_DF401(ordered_by_PRN_pos.at( cell ).second); Rtcm::set_DF402(ephNAV, ephCNAV, ephFNAV, obs_time, ordered_by_PRN_pos.at( cell ).second); Rtcm::set_DF420(ordered_by_PRN_pos.at( cell ).second); Rtcm::set_DF403(ordered_by_PRN_pos.at( cell ).second); Rtcm::set_DF404(ordered_by_PRN_pos.at( cell ).second); first_data_type += DF400.to_string(); second_data_type += DF401.to_string(); third_data_type += DF402.to_string(); fourth_data_type += DF420.to_string(); fifth_data_type += DF403.to_string(); sixth_data_type += DF404.to_string(); } signal_data = first_data_type + second_data_type + third_data_type + fourth_data_type + fifth_data_type + sixth_data_type; return signal_data; } // ********************************************************************************************** // // MESSAGE TYPE MSM6 (FULL PSEUDORANGES AND PHASERANGES PLUS CNR, HIGH RESOLUTION) // // ********************************************************************************************** std::string Rtcm::print_MSM_6( const Gps_Ephemeris & gps_eph, const Gps_CNAV_Ephemeris & gps_cnav_eph, const Galileo_Ephemeris & gal_eph, double obs_time, const std::map & observables, unsigned int ref_id, unsigned int clock_steering_indicator, unsigned int external_clock_indicator, int smooth_int, bool divergence_free, bool more_messages) { unsigned int msg_number = 0; if(gps_eph.i_satellite_PRN != 0) msg_number = 1076; if(gps_cnav_eph.i_satellite_PRN != 0) msg_number = 1076; if(gal_eph.i_satellite_PRN != 0) msg_number = 1096; if(((gps_eph.i_satellite_PRN != 0) ||(gps_cnav_eph.i_satellite_PRN != 0) ) && (gal_eph.i_satellite_PRN != 0)) { LOG(WARNING) << "MSM messages for observables from different systems are not defined"; //print two messages? } if(msg_number == 0) { LOG(WARNING) << "Invalid ephemeris provided"; msg_number = 1076; } std::string header = Rtcm::get_MSM_header(msg_number, obs_time, observables, ref_id, clock_steering_indicator, external_clock_indicator, smooth_int, divergence_free, more_messages); std::string sat_data = Rtcm::get_MSM_4_content_sat_data(observables); std::string signal_data = Rtcm::get_MSM_6_content_signal_data(gps_eph, gps_cnav_eph, gal_eph, obs_time, observables); std::string message = build_message(header + sat_data + signal_data); if(server_is_running) { rtcm_message_queue->push(message); } return message; } std::string Rtcm::get_MSM_6_content_signal_data(const Gps_Ephemeris & ephNAV, const Gps_CNAV_Ephemeris & ephCNAV, const Galileo_Ephemeris & ephFNAV, double obs_time, const std::map & observables) { std::string signal_data; std::string first_data_type; std::string second_data_type; std::string third_data_type; std::string fourth_data_type; std::string fifth_data_type; unsigned int Ncells = observables.size(); std::vector > observables_vector; std::map::const_iterator map_iter; for(map_iter = observables.begin(); map_iter != observables.end(); map_iter++) { observables_vector.push_back(*map_iter); } std::vector > ordered_by_signal = Rtcm::sort_by_signal(observables_vector); std::reverse(ordered_by_signal.begin(), ordered_by_signal.end()); std::vector > ordered_by_PRN_pos = Rtcm::sort_by_PRN_mask(ordered_by_signal); for(unsigned int cell = 0; cell < Ncells ; cell++) { Rtcm::set_DF405(ordered_by_PRN_pos.at( cell ).second); Rtcm::set_DF406(ordered_by_PRN_pos.at( cell ).second); Rtcm::set_DF407(ephNAV, ephCNAV, ephFNAV, obs_time, ordered_by_PRN_pos.at( cell ).second); Rtcm::set_DF420(ordered_by_PRN_pos.at( cell ).second); Rtcm::set_DF408(ordered_by_PRN_pos.at( cell ).second); first_data_type += DF405.to_string(); second_data_type += DF406.to_string(); third_data_type += DF407.to_string(); fourth_data_type += DF420.to_string(); fifth_data_type += DF408.to_string(); } signal_data = first_data_type + second_data_type + third_data_type + fourth_data_type + fifth_data_type; return signal_data; } // ********************************************************************************************** // // MESSAGE TYPE MSM7 (FULL PSEUDORANGES, PHASERANGES, PHASERANGERATE AND CNR, HIGH RESOLUTION) // // ********************************************************************************************** std::string Rtcm::print_MSM_7( const Gps_Ephemeris & gps_eph, const Gps_CNAV_Ephemeris & gps_cnav_eph, const Galileo_Ephemeris & gal_eph, double obs_time, const std::map & observables, unsigned int ref_id, unsigned int clock_steering_indicator, unsigned int external_clock_indicator, int smooth_int, bool divergence_free, bool more_messages) { unsigned int msg_number = 0; if(gps_eph.i_satellite_PRN != 0) msg_number = 1077; if(gps_cnav_eph.i_satellite_PRN != 0) msg_number = 1077; if(gal_eph.i_satellite_PRN != 0) msg_number = 1097; if(((gps_eph.i_satellite_PRN != 0) || (gps_cnav_eph.i_satellite_PRN != 0) ) && (gal_eph.i_satellite_PRN != 0)) { LOG(WARNING) << "MSM messages for observables from different systems are not defined"; //print two messages? } if(msg_number == 0) { LOG(WARNING) << "Invalid ephemeris provided"; msg_number = 1076; } std::string header = Rtcm::get_MSM_header(msg_number, obs_time, observables, ref_id, clock_steering_indicator, external_clock_indicator, smooth_int, divergence_free, more_messages); std::string sat_data = Rtcm::get_MSM_5_content_sat_data(observables); std::string signal_data = Rtcm::get_MSM_7_content_signal_data(gps_eph, gps_cnav_eph, gal_eph, obs_time, observables); std::string message = build_message(header + sat_data + signal_data); if(server_is_running) { rtcm_message_queue->push(message); } return message; } std::string Rtcm::get_MSM_7_content_signal_data(const Gps_Ephemeris & ephNAV, const Gps_CNAV_Ephemeris & ephCNAV, const Galileo_Ephemeris & ephFNAV, double obs_time, const std::map & observables) { std::string signal_data; std::string first_data_type; std::string second_data_type; std::string third_data_type; std::string fourth_data_type; std::string fifth_data_type; std::string sixth_data_type; unsigned int Ncells = observables.size(); std::vector > observables_vector; std::map::const_iterator map_iter; for(map_iter = observables.begin(); map_iter != observables.end(); map_iter++) { observables_vector.push_back(*map_iter); } std::vector > ordered_by_signal = Rtcm::sort_by_signal(observables_vector); std::reverse(ordered_by_signal.begin(), ordered_by_signal.end()); std::vector > ordered_by_PRN_pos = Rtcm::sort_by_PRN_mask(ordered_by_signal); for(unsigned int cell = 0; cell < Ncells ; cell++) { Rtcm::set_DF405(ordered_by_PRN_pos.at( cell ).second); Rtcm::set_DF406(ordered_by_PRN_pos.at( cell ).second); Rtcm::set_DF407(ephNAV, ephCNAV, ephFNAV, obs_time, ordered_by_PRN_pos.at( cell ).second); Rtcm::set_DF420(ordered_by_PRN_pos.at( cell ).second); Rtcm::set_DF408(ordered_by_PRN_pos.at( cell ).second); Rtcm::set_DF404(ordered_by_PRN_pos.at( cell ).second); first_data_type += DF405.to_string(); second_data_type += DF406.to_string(); third_data_type += DF407.to_string(); fourth_data_type += DF420.to_string(); fifth_data_type += DF408.to_string(); sixth_data_type += DF404.to_string(); } signal_data = first_data_type + second_data_type + third_data_type + fourth_data_type + fifth_data_type + sixth_data_type; return signal_data; } // ***************************************************************************************************** // Some utilities // ***************************************************************************************************** std::vector > Rtcm::sort_by_PRN_mask(const std::vector > & synchro_map) const { std::vector >::const_iterator synchro_map_iter; std::vector > my_vec; struct { bool operator()(const std::pair & a, const std::pair & b) { unsigned int value_a = 64 - a.second.PRN; unsigned int value_b = 64 - b.second.PRN; return value_a < value_b; } } has_lower_pos; for(synchro_map_iter = synchro_map.begin(); synchro_map_iter != synchro_map.end(); synchro_map_iter++) { std::pair p(synchro_map_iter->first, synchro_map_iter->second); my_vec.push_back(p); } std::sort(my_vec.begin(), my_vec.end(), has_lower_pos); std::reverse(my_vec.begin(), my_vec.end()); return my_vec; } std::vector > Rtcm::sort_by_signal(const std::vector > & synchro_map) const { std::vector >::const_iterator synchro_map_iter; std::vector > my_vec; struct { bool operator()(const std::pair & a, const std::pair & b) { unsigned int value_a = 0; unsigned int value_b = 0; std::string system_a(&a.second.System, 1); std::string system_b(&b.second.System, 1); std::string sig_a_(a.second.Signal); std::string sig_a = sig_a_.substr(0,2); std::string sig_b_(b.second.Signal); std::string sig_b = sig_b_.substr(0,2); if(system_a.compare("G") == 0) { value_a = gps_signal_map.at(sig_a); } if(system_a.compare("E") == 0) { value_a = galileo_signal_map.at(sig_a); } if(system_b.compare("G") == 0) { value_b = gps_signal_map.at(sig_b); } if(system_b.compare("E") == 0) { value_b = galileo_signal_map.at(sig_b); } return value_a < value_b; } } has_lower_signalID; for(synchro_map_iter = synchro_map.begin(); synchro_map_iter != synchro_map.end(); synchro_map_iter++) { std::pair p(synchro_map_iter->first, synchro_map_iter->second); my_vec.push_back(p); } std::sort(my_vec.begin(), my_vec.end(), has_lower_signalID); return my_vec; } std::map Rtcm::gps_signal_map = [] { std::map gps_signal_map_; // Table 3.5-91 gps_signal_map_["1C"] = 2; gps_signal_map_["1P"] = 3; gps_signal_map_["1W"] = 4; gps_signal_map_["2C"] = 8; gps_signal_map_["2P"] = 9; gps_signal_map_["2W"] = 10; gps_signal_map_["2S"] = 15; gps_signal_map_["2L"] = 16; gps_signal_map_["2X"] = 17; gps_signal_map_["5I"] = 22; gps_signal_map_["5Q"] = 23; gps_signal_map_["5X"] = 24; return gps_signal_map_; }(); std::map Rtcm::galileo_signal_map = [] { std::map galileo_signal_map_; // Table 3.5-100 galileo_signal_map_["1C"] = 2; galileo_signal_map_["1A"] = 3; galileo_signal_map_["1B"] = 4; galileo_signal_map_["1X"] = 5; galileo_signal_map_["1Z"] = 6; galileo_signal_map_["6C"] = 8; galileo_signal_map_["6A"] = 9; galileo_signal_map_["6B"] = 10; galileo_signal_map_["6X"] = 11; galileo_signal_map_["6Z"] = 12; galileo_signal_map_["7I"] = 14; galileo_signal_map_["7Q"] = 15; galileo_signal_map_["7X"] = 16; galileo_signal_map_["8I"] = 18; galileo_signal_map_["8Q"] = 19; galileo_signal_map_["8X"] = 20; galileo_signal_map_["5I"] = 22; galileo_signal_map_["5Q"] = 23; galileo_signal_map_["5X"] = 24; return galileo_signal_map_; }(); boost::posix_time::ptime Rtcm::compute_GPS_time(const Gps_Ephemeris & eph, double obs_time) const { const double gps_t = obs_time; boost::posix_time::time_duration t = boost::posix_time::millisec((gps_t + 604800 * static_cast(eph.i_GPS_week % 1024)) * 1000); boost::posix_time::ptime p_time(boost::gregorian::date(1999, 8, 22), t); return p_time; } boost::posix_time::ptime Rtcm::compute_GPS_time(const Gps_CNAV_Ephemeris & eph, double obs_time) const { const double gps_t = obs_time; boost::posix_time::time_duration t = boost::posix_time::millisec((gps_t + 604800 * static_cast(eph.i_GPS_week % 1024)) * 1000); boost::posix_time::ptime p_time(boost::gregorian::date(1999, 8, 22), t); return p_time; } boost::posix_time::ptime Rtcm::compute_Galileo_time(const Galileo_Ephemeris & eph, double obs_time) const { double galileo_t = obs_time; boost::posix_time::time_duration t = boost::posix_time::millisec((galileo_t + 604800 * static_cast(eph.WN_5)) * 1000); boost::posix_time::ptime p_time(boost::gregorian::date(1999, 8, 22), t); return p_time; } unsigned int Rtcm::lock_time(const Gps_Ephemeris & eph, double obs_time, const Gnss_Synchro & gnss_synchro) { unsigned int lock_time_in_seconds; boost::posix_time::ptime current_time = Rtcm::compute_GPS_time(eph, obs_time); boost::posix_time::ptime last_lock_time = Rtcm::gps_L1_last_lock_time[65 - gnss_synchro.PRN]; if(last_lock_time.is_not_a_date_time() )// || CHECK LLI!!......) { Rtcm::gps_L1_last_lock_time[65 - gnss_synchro.PRN] = current_time; } boost::posix_time::time_duration lock_duration = current_time - Rtcm::gps_L1_last_lock_time[65 - gnss_synchro.PRN]; lock_time_in_seconds = static_cast(lock_duration.total_seconds()); // Debug: // std::cout << "lock time PRN " << gnss_synchro.PRN << ": " << lock_time_in_seconds << " current time: " << current_time << std::endl; return lock_time_in_seconds; } unsigned int Rtcm::lock_time(const Gps_CNAV_Ephemeris & eph, double obs_time, const Gnss_Synchro & gnss_synchro) { unsigned int lock_time_in_seconds; boost::posix_time::ptime current_time = Rtcm::compute_GPS_time(eph, obs_time); boost::posix_time::ptime last_lock_time = Rtcm::gps_L2_last_lock_time[65 - gnss_synchro.PRN]; if(last_lock_time.is_not_a_date_time() )// || CHECK LLI!!......) { Rtcm::gps_L2_last_lock_time[65 - gnss_synchro.PRN] = current_time; } boost::posix_time::time_duration lock_duration = current_time - Rtcm::gps_L2_last_lock_time[65 - gnss_synchro.PRN]; lock_time_in_seconds = static_cast(lock_duration.total_seconds()); return lock_time_in_seconds; } unsigned int Rtcm::lock_time(const Galileo_Ephemeris & eph, double obs_time, const Gnss_Synchro & gnss_synchro) { unsigned int lock_time_in_seconds; boost::posix_time::ptime current_time = Rtcm::compute_Galileo_time(eph, obs_time); boost::posix_time::ptime last_lock_time; std::string sig_(gnss_synchro.Signal); if(sig_.compare("1B") == 0) { last_lock_time = Rtcm::gal_E1_last_lock_time[65 - gnss_synchro.PRN]; } if((sig_.compare("5X") == 0) || (sig_.compare("8X") == 0) || (sig_.compare("7X") == 0) ) { last_lock_time = Rtcm::gal_E5_last_lock_time[65 - gnss_synchro.PRN]; } if(last_lock_time.is_not_a_date_time() )// || CHECK LLI!!......) { if(sig_.compare("1B") == 0) { Rtcm::gal_E1_last_lock_time[65 - gnss_synchro.PRN] = current_time; } if((sig_.compare("5X") == 0) || (sig_.compare("8X") == 0) || (sig_.compare("7X") == 0) ) { Rtcm::gal_E5_last_lock_time[65 - gnss_synchro.PRN] = current_time; } } boost::posix_time::time_duration lock_duration = current_time - current_time; if(sig_.compare("1B") == 0) { lock_duration = current_time - Rtcm::gal_E1_last_lock_time[65 - gnss_synchro.PRN]; } if((sig_.compare("5X") == 0) || (sig_.compare("8X") == 0) || (sig_.compare("7X") == 0) ) { lock_duration = current_time - Rtcm::gal_E5_last_lock_time[65 - gnss_synchro.PRN]; } lock_time_in_seconds = static_cast(lock_duration.total_seconds()); return lock_time_in_seconds; } unsigned int Rtcm::lock_time_indicator(unsigned int lock_time_period_s) { // Table 3.4-2 if(lock_time_period_s <= 0 ) return 0; if(lock_time_period_s < 24 ) return lock_time_period_s; if(lock_time_period_s < 72 ) return (lock_time_period_s + 24 ) / 2; if(lock_time_period_s < 168) return (lock_time_period_s + 120 ) / 4; if(lock_time_period_s < 360) return (lock_time_period_s + 408 ) / 8; if(lock_time_period_s < 744) return (lock_time_period_s + 1176) / 16; if(lock_time_period_s < 937) return (lock_time_period_s + 3096) / 32; return 127; } unsigned int Rtcm::msm_lock_time_indicator(unsigned int lock_time_period_s) { // Table 3.5-74 if(lock_time_period_s < 32 ) return 0; if(lock_time_period_s < 64 ) return 1; if(lock_time_period_s < 128 ) return 2; if(lock_time_period_s < 256 ) return 3; if(lock_time_period_s < 512 ) return 4; if(lock_time_period_s < 1024 ) return 5; if(lock_time_period_s < 2048 ) return 6; if(lock_time_period_s < 4096 ) return 7; if(lock_time_period_s < 8192 ) return 8; if(lock_time_period_s < 16384 ) return 9; if(lock_time_period_s < 32768 ) return 10; if(lock_time_period_s < 65536 ) return 11; if(lock_time_period_s < 131072) return 12; if(lock_time_period_s < 262144) return 13; if(lock_time_period_s < 524288) return 14; return 15; } unsigned int Rtcm::msm_extended_lock_time_indicator(unsigned int lock_time_period_s) { // Table 3.5-75 if( lock_time_period_s < 64 ) return ( lock_time_period_s ); if( 64 <= lock_time_period_s && lock_time_period_s < 128 ) return ( 64 + (lock_time_period_s - 64 ) / 2 ); if( 128 <= lock_time_period_s && lock_time_period_s < 256 ) return ( 96 + (lock_time_period_s - 128 ) / 4 ); if( 256 <= lock_time_period_s && lock_time_period_s < 512 ) return (128 + (lock_time_period_s - 256 ) / 8 ); if( 512 <= lock_time_period_s && lock_time_period_s < 1024 ) return (160 + (lock_time_period_s - 512 ) / 16 ); if( 1024 <= lock_time_period_s && lock_time_period_s < 2048 ) return (192 + (lock_time_period_s - 1024 ) / 32 ); if( 2048 <= lock_time_period_s && lock_time_period_s < 4096 ) return (224 + (lock_time_period_s - 2048 ) / 64 ); if( 4096 <= lock_time_period_s && lock_time_period_s < 8192 ) return (256 + (lock_time_period_s - 4096 ) / 128 ); if( 8192 <= lock_time_period_s && lock_time_period_s < 16384 ) return (288 + (lock_time_period_s - 8192 ) / 256 ); if( 16384 <= lock_time_period_s && lock_time_period_s < 32768 ) return (320 + (lock_time_period_s - 16384 ) / 512 ); if( 32768 <= lock_time_period_s && lock_time_period_s < 65536 ) return (352 + (lock_time_period_s - 32768 ) / 1024 ); if( 65536 <= lock_time_period_s && lock_time_period_s < 131072 ) return (384 + (lock_time_period_s - 65536 ) / 2048 ); if( 131072 <= lock_time_period_s && lock_time_period_s < 262144 ) return (416 + (lock_time_period_s - 131072 ) / 4096 ); if( 262144 <= lock_time_period_s && lock_time_period_s < 524288 ) return (448 + (lock_time_period_s - 262144 ) / 8192 ); if( 524288 <= lock_time_period_s && lock_time_period_s < 1048576 ) return (480 + (lock_time_period_s - 524288 ) / 16384 ); if( 1048576 <= lock_time_period_s && lock_time_period_s < 2097152 ) return (512 + (lock_time_period_s - 1048576 ) / 32768 ); if( 2097152 <= lock_time_period_s && lock_time_period_s < 4194304 ) return (544 + (lock_time_period_s - 2097152 ) / 65536 ); if( 4194304 <= lock_time_period_s && lock_time_period_s < 8388608 ) return (576 + (lock_time_period_s - 4194304 ) / 131072 ); if( 8388608 <= lock_time_period_s && lock_time_period_s < 16777216 ) return (608 + (lock_time_period_s - 8388608 ) / 262144 ); if( 16777216 <= lock_time_period_s && lock_time_period_s < 33554432 ) return (640 + (lock_time_period_s - 16777216) / 524288 ); if( 33554432 <= lock_time_period_s && lock_time_period_s < 67108864 ) return (672 + (lock_time_period_s - 33554432) / 1048576); if( 67108864 <= lock_time_period_s ) return (704 ); return 1023; // will never happen } // ***************************************************************************************************** // // DATA FIELDS AS DEFINED AT RTCM STANDARD 10403.2 // // ***************************************************************************************************** int Rtcm::set_DF002(unsigned int message_number) { if (message_number > 4095) { LOG(WARNING) << "RTCM message number must be between 0 and 4095, but it has been set to " << message_number; } DF002 = std::bitset<12>(message_number); return 0; } int Rtcm::set_DF003(unsigned int ref_station_ID) { //unsigned int station_ID = ref_station_ID; if (ref_station_ID > 4095) { LOG(WARNING) << "RTCM reference station ID must be between 0 and 4095, but it has been set to " << ref_station_ID; } DF003 = std::bitset<12>(ref_station_ID); return 0; } int Rtcm::set_DF004(double obs_time) { // TOW in milliseconds from the beginning of the GPS week, measured in GPS time unsigned long int tow = static_cast(std::round(obs_time * 1000)); if(tow > 604799999) { LOG(WARNING) << "To large TOW! Set to the last millisecond of the week"; tow = 604799999; } DF004 = std::bitset<30>(tow); return 0; } int Rtcm::set_DF005(bool sync_flag) { // 0 - No further GNSS observables referenced to the same Epoch Time will be transmitted. This enables the receiver to begin processing // the data immediately after decoding the message. // 1 - The next message will contain observables of another GNSS source referenced to the same Epoch Time. DF005 = std::bitset<1>(sync_flag); return 0; } int Rtcm::set_DF006(const std::map & observables) { //Number of satellites observed in current epoch unsigned short int nsats = 0; std::map::const_iterator observables_iter; for(observables_iter = observables.begin(); observables_iter != observables.end(); observables_iter++) { nsats++; } if (nsats > 31) { LOG(WARNING) << "The number of processed GPS satellites must be between 0 and 31, but it seems that you are processing " << nsats; nsats = 31; } DF006 = std::bitset<5>(nsats); return 0; } int Rtcm::set_DF007(bool divergence_free_smoothing_indicator) { // 0 - Divergence-free smoothing not used 1 - Divergence-free smoothing used DF007 = std::bitset<1>(divergence_free_smoothing_indicator); return 0; } int Rtcm::set_DF008(short int smoothing_interval) { DF008 = std::bitset<3>(smoothing_interval); return 0; } int Rtcm::set_DF009(const Gnss_Synchro & gnss_synchro) { unsigned int prn_ = gnss_synchro.PRN; if(prn_ > 31) { LOG(WARNING) << "GPS satellite ID must be between 0 and 31, but PRN " << prn_ << " was found"; } DF009 = std::bitset<6>(prn_); return 0; } int Rtcm::set_DF009(const Gps_Ephemeris & gps_eph) { unsigned int prn_ = gps_eph.i_satellite_PRN; if(prn_ > 31) { LOG(WARNING) << "GPS satellite ID must be between 0 and 31, but PRN " << prn_ << " was found"; } DF009 = std::bitset<6>(prn_); return 0; } int Rtcm::set_DF010(bool code_indicator) { DF010 = std::bitset<1>(code_indicator); return 0; } int Rtcm::set_DF011(const Gnss_Synchro & gnss_synchro) { double ambiguity = std::floor( gnss_synchro.Pseudorange_m / 299792.458 ); unsigned long int gps_L1_pseudorange = static_cast(std::round(( gnss_synchro.Pseudorange_m - ambiguity * 299792.458) / 0.02 )); DF011 = std::bitset<24>(gps_L1_pseudorange); return 0; } int Rtcm::set_DF012(const Gnss_Synchro & gnss_synchro) { const double lambda = GPS_C_m_s / GPS_L1_FREQ_HZ; double ambiguity = std::floor( gnss_synchro.Pseudorange_m / 299792.458 ); double gps_L1_pseudorange = std::round(( gnss_synchro.Pseudorange_m - ambiguity * 299792.458) / 0.02 ); double gps_L1_pseudorange_c = gps_L1_pseudorange * 0.02 + ambiguity * 299792.458; double L1_phaserange_c = gnss_synchro.Carrier_phase_rads / GPS_TWO_PI; double L1_phaserange_c_r = std::fmod(L1_phaserange_c - gps_L1_pseudorange_c / lambda + 1500.0, 3000.0) - 1500.0; long int gps_L1_phaserange_minus_L1_pseudorange = static_cast(std::round(L1_phaserange_c_r * lambda / 0.0005 )); DF012 = std::bitset<20>(gps_L1_phaserange_minus_L1_pseudorange); return 0; } int Rtcm::set_DF013(const Gps_Ephemeris & eph, double obs_time, const Gnss_Synchro & gnss_synchro) { unsigned int lock_time_indicator; unsigned int lock_time_period_s = Rtcm::lock_time(eph, obs_time, gnss_synchro); lock_time_indicator = Rtcm::lock_time_indicator(lock_time_period_s); DF013 = std::bitset<7>(lock_time_indicator); return 0; } int Rtcm::set_DF014(const Gnss_Synchro & gnss_synchro) { unsigned int gps_L1_pseudorange_ambiguity = static_cast(std::floor(gnss_synchro.Pseudorange_m / 299792.458)); DF014 = std::bitset<8>(gps_L1_pseudorange_ambiguity); return 0; } int Rtcm::set_DF015(const Gnss_Synchro & gnss_synchro) { double CN0_dB_Hz_est = gnss_synchro.CN0_dB_hz; if (CN0_dB_Hz_est > 63.75) { CN0_dB_Hz_est = 63.75; } unsigned int CN0_dB_Hz = static_cast(std::round(CN0_dB_Hz_est / 0.25 )); DF015 = std::bitset<8>(CN0_dB_Hz); return 0; } int Rtcm::set_DF017(const Gnss_Synchro & gnss_synchroL1, const Gnss_Synchro & gnss_synchroL2) { double ambiguity = std::floor( gnss_synchroL1.Pseudorange_m / 299792.458 ); double gps_L1_pseudorange = std::round(( gnss_synchroL1.Pseudorange_m - ambiguity * 299792.458) / 0.02 ); double gps_L1_pseudorange_c = gps_L1_pseudorange * 0.02 + ambiguity * 299792.458; double l2_l1_pseudorange = gnss_synchroL2.Pseudorange_m - gps_L1_pseudorange_c; int pseudorange_difference = 0xFFFFE000; // invalid value; if(std::fabs(l2_l1_pseudorange) <= 163.82) { pseudorange_difference = static_cast(std::round(l2_l1_pseudorange / 0.02)); } DF017 = std::bitset<14>(pseudorange_difference); return 0; } int Rtcm::set_DF018(const Gnss_Synchro & gnss_synchroL1, const Gnss_Synchro & gnss_synchroL2) { const double lambda2 = GPS_C_m_s / GPS_L2_FREQ_HZ; int l2_phaserange_minus_l1_pseudorange = 0xFFF80000; double ambiguity = std::floor( gnss_synchroL1.Pseudorange_m / 299792.458 ); double gps_L1_pseudorange = std::round(( gnss_synchroL1.Pseudorange_m - ambiguity * 299792.458) / 0.02 ); double gps_L1_pseudorange_c = gps_L1_pseudorange * 0.02 + ambiguity * 299792.458; double L2_phaserange_c = gnss_synchroL2.Carrier_phase_rads / GPS_TWO_PI; double L1_phaserange_c_r = std::fmod(L2_phaserange_c - gps_L1_pseudorange_c / lambda2 + 1500.0, 3000.0) - 1500.0; if (std::fabs(L1_phaserange_c_r * lambda2) <= 262.1435 ) { l2_phaserange_minus_l1_pseudorange = static_cast(std::round(L1_phaserange_c_r * lambda2 / 0.0005)); } DF018 = std::bitset<20>(l2_phaserange_minus_l1_pseudorange); return 0; } int Rtcm::set_DF019(const Gps_CNAV_Ephemeris & eph, double obs_time, const Gnss_Synchro & gnss_synchro) { unsigned int lock_time_indicator; unsigned int lock_time_period_s = Rtcm::lock_time(eph, obs_time, gnss_synchro); lock_time_indicator = Rtcm::lock_time_indicator(lock_time_period_s); DF019 = std::bitset<7>(lock_time_indicator); return 0; } int Rtcm::set_DF020(const Gnss_Synchro & gnss_synchro) { double CN0_dB_Hz_est = gnss_synchro.CN0_dB_hz; if (CN0_dB_Hz_est > 63.75) { CN0_dB_Hz_est = 63.75; } unsigned int CN0_dB_Hz = static_cast(std::round(CN0_dB_Hz_est / 0.25 )); DF020 = std::bitset<8>(CN0_dB_Hz); return 0; } int Rtcm::set_DF021() { unsigned short int itfr_year = 0; DF021 = std::bitset<6>(itfr_year); return 0; } int Rtcm::set_DF022(bool gps_indicator) { DF022 = std::bitset<1>(gps_indicator); return 0; } int Rtcm::set_DF023(bool glonass_indicator) { DF023 = std::bitset<1>(glonass_indicator); return 0; } int Rtcm::set_DF024(bool galileo_indicator) { DF024 = std::bitset<1>(galileo_indicator); return 0; } int Rtcm::set_DF025(double antenna_ECEF_X_m) { long long int ant_ref_x = static_cast(std::round( antenna_ECEF_X_m * 10000)); DF025 = std::bitset<38>(ant_ref_x); return 0; } int Rtcm::set_DF026(double antenna_ECEF_Y_m) { long long int ant_ref_y = static_cast(std::round( antenna_ECEF_Y_m * 10000)); DF026 = std::bitset<38>(ant_ref_y); return 0; } int Rtcm::set_DF027(double antenna_ECEF_Z_m) { long long int ant_ref_z = static_cast(std::round( antenna_ECEF_Z_m * 10000)); DF027 = std::bitset<38>(ant_ref_z); return 0; } int Rtcm::set_DF028(double height) { unsigned int h_ = static_cast(std::round( height * 10000)); DF028 = std::bitset<16>(h_); return 0; } int Rtcm::set_DF031(unsigned int antenna_setup_id) { DF031 = std::bitset<8>(antenna_setup_id); return 0; } int Rtcm::set_DF051(const Gps_Ephemeris & gps_eph, double obs_time) { const double gps_t = obs_time; boost::posix_time::time_duration t = boost::posix_time::millisec((gps_t + 604800 * static_cast(gps_eph.i_GPS_week % 1024)) * 1000); boost::posix_time::ptime p_time(boost::gregorian::date(1999, 8, 22), t); std::string now_ptime = to_iso_string(p_time); std::string today_ptime = now_ptime.substr(0, 8); boost::gregorian::date d(boost::gregorian::from_undelimited_string(today_ptime)); unsigned int mjd = d.modjulian_day(); DF051 = std::bitset<16>(mjd); return 0; } int Rtcm::set_DF052(const Gps_Ephemeris & gps_eph, double obs_time) { const double gps_t = obs_time; boost::posix_time::time_duration t = boost::posix_time::millisec((gps_t + 604800 * static_cast(gps_eph.i_GPS_week % 1024)) * 1000); boost::posix_time::ptime p_time(boost::gregorian::date(1999, 8, 22), t); std::string now_ptime = to_iso_string(p_time); std::string hours = now_ptime.substr(9, 2); std::string minutes = now_ptime.substr(11, 2); std::string seconds = now_ptime.substr(13, 8); //boost::gregorian::date d(boost::gregorian::from_undelimited_string(today_ptime)); long unsigned int seconds_of_day = boost::lexical_cast(hours) * 60 * 60 + boost::lexical_cast(minutes) * 60 + boost::lexical_cast(seconds); DF052 = std::bitset<17>(seconds_of_day); return 0; } int Rtcm::set_DF071(const Gps_Ephemeris & gps_eph) { unsigned int iode = static_cast(gps_eph.d_IODE_SF2); DF071 = std::bitset<8>(iode); return 0; } int Rtcm::set_DF076(const Gps_Ephemeris & gps_eph) { unsigned int week_number = static_cast(gps_eph.i_GPS_week); DF076 = std::bitset<10>(week_number); return 0; } int Rtcm::set_DF077(const Gps_Ephemeris & gps_eph) { unsigned short int ura = static_cast(gps_eph.i_SV_accuracy); DF077 = std::bitset<4>(ura); return 0; } int Rtcm::set_DF078(const Gps_Ephemeris & gps_eph) { unsigned short int code_on_L2 = static_cast(gps_eph.i_code_on_L2); DF078 = std::bitset<2>(code_on_L2); return 0; } int Rtcm::set_DF079(const Gps_Ephemeris & gps_eph) { unsigned int idot = static_cast(std::round(gps_eph.d_IDOT / I_DOT_LSB )); DF079 = std::bitset<14>(idot); return 0; } int Rtcm::set_DF080(const Gps_Ephemeris & gps_eph) { unsigned short int iode = static_cast(gps_eph.d_IODE_SF2); DF080 = std::bitset<8>(iode); return 0; } int Rtcm::set_DF081(const Gps_Ephemeris & gps_eph) { unsigned int toc = static_cast(std::round(gps_eph.d_Toc / T_OC_LSB )); DF081 = std::bitset<16>(toc); return 0; } int Rtcm::set_DF082(const Gps_Ephemeris & gps_eph) { short int af2 = static_cast(std::round(gps_eph.d_A_f2 / A_F2_LSB )); DF082 = std::bitset<8>(af2); return 0; } int Rtcm::set_DF083(const Gps_Ephemeris & gps_eph) { int af1 = static_cast(std::round(gps_eph.d_A_f1 / A_F1_LSB )); DF083 = std::bitset<16>(af1); return 0; } int Rtcm::set_DF084(const Gps_Ephemeris & gps_eph) { long int af0 = static_cast(std::round(gps_eph.d_A_f0 / A_F0_LSB )); DF084 = std::bitset<22>(af0); return 0; } int Rtcm::set_DF085(const Gps_Ephemeris & gps_eph) { unsigned int iodc = static_cast(gps_eph.d_IODC); DF085 = std::bitset<10>(iodc); return 0; } int Rtcm::set_DF086(const Gps_Ephemeris & gps_eph) { int crs = static_cast(std::round(gps_eph.d_Crs / C_RS_LSB )); DF086 = std::bitset<16>(crs); return 0; } int Rtcm::set_DF087(const Gps_Ephemeris & gps_eph) { int delta_n = static_cast(std::round(gps_eph.d_Delta_n / DELTA_N_LSB )); DF087 = std::bitset<16>(delta_n); return 0; } int Rtcm::set_DF088(const Gps_Ephemeris & gps_eph) { long int m0 = static_cast(std::round(gps_eph.d_M_0 / M_0_LSB )); DF088 = std::bitset<32>(m0); return 0; } int Rtcm::set_DF089(const Gps_Ephemeris & gps_eph) { int cuc = static_cast(std::round(gps_eph.d_Cuc / C_UC_LSB )); DF089 = std::bitset<16>(cuc); return 0; } int Rtcm::set_DF090(const Gps_Ephemeris & gps_eph) { unsigned long int ecc = static_cast(std::round(gps_eph.d_e_eccentricity / E_LSB )); DF090 = std::bitset<32>(ecc); return 0; } int Rtcm::set_DF091(const Gps_Ephemeris & gps_eph) { int cus = static_cast(std::round(gps_eph.d_Cus / C_US_LSB )); DF091 = std::bitset<16>(cus); return 0; } int Rtcm::set_DF092(const Gps_Ephemeris & gps_eph) { unsigned long int sqr_a = static_cast(std::round(gps_eph.d_sqrt_A / SQRT_A_LSB )); DF092 = std::bitset<32>(sqr_a); return 0; } int Rtcm::set_DF093(const Gps_Ephemeris & gps_eph) { unsigned int toe = static_cast(std::round(gps_eph.d_Toe / T_OE_LSB )); DF093 = std::bitset<16>(toe); return 0; } int Rtcm::set_DF094(const Gps_Ephemeris & gps_eph) { int cic = static_cast(std::round(gps_eph.d_Cic / C_IC_LSB )); DF094 = std::bitset<16>(cic); return 0; } int Rtcm::set_DF095(const Gps_Ephemeris & gps_eph) { long int Omega0 = static_cast(std::round(gps_eph.d_OMEGA0 / OMEGA_0_LSB )); DF095 = std::bitset<32>(Omega0); return 0; } int Rtcm::set_DF096(const Gps_Ephemeris & gps_eph) { int cis = static_cast(std::round(gps_eph.d_Cis / C_IS_LSB )); DF096 = std::bitset<16>(cis); return 0; } int Rtcm::set_DF097(const Gps_Ephemeris & gps_eph) { long int i0 = static_cast(std::round(gps_eph.d_i_0 / I_0_LSB )); DF097 = std::bitset<32>(i0); return 0; } int Rtcm::set_DF098(const Gps_Ephemeris & gps_eph) { int crc = static_cast(std::round(gps_eph.d_Crc / C_RC_LSB )); DF098 = std::bitset<16>(crc); return 0; } int Rtcm::set_DF099(const Gps_Ephemeris & gps_eph) { long int omega = static_cast(std::round(gps_eph.d_OMEGA / OMEGA_LSB )); DF099 = std::bitset<32>(omega); return 0; } int Rtcm::set_DF100(const Gps_Ephemeris & gps_eph) { long int omegadot = static_cast(std::round(gps_eph.d_OMEGA_DOT / OMEGA_DOT_LSB )); DF100 = std::bitset<24>(omegadot); return 0; } int Rtcm::set_DF101(const Gps_Ephemeris & gps_eph) { short int tgd = static_cast(std::round(gps_eph.d_TGD / T_GD_LSB )); DF101 = std::bitset<8>(tgd); return 0; } int Rtcm::set_DF102(const Gps_Ephemeris & gps_eph) { unsigned short int sv_heath = static_cast(gps_eph.i_SV_health); DF102 = std::bitset<6>(sv_heath); return 0; } int Rtcm::set_DF103(const Gps_Ephemeris & gps_eph) { DF103 = std::bitset<1>(gps_eph.b_L2_P_data_flag); return 0; } int Rtcm::set_DF137(const Gps_Ephemeris & gps_eph) { DF137 = std::bitset<1>(gps_eph.b_fit_interval_flag); return 0; } int Rtcm::set_DF248(double obs_time) { // TOW in milliseconds from the beginning of the Galileo week, measured in Galileo time unsigned long int tow = static_cast(std::round(obs_time * 1000)); if(tow > 604799999) { LOG(WARNING) << "To large TOW! Set to the last millisecond of the week"; tow = 604799999; } DF248 = std::bitset<30>(tow); return 0; } int Rtcm::set_DF252(const Galileo_Ephemeris & gal_eph) { unsigned int prn_ = gal_eph.i_satellite_PRN; if(prn_ > 63) { LOG(WARNING) << "Galileo satellite ID must be between 0 and 63, but PRN " << prn_ << " was found"; } DF252 = std::bitset<6>(prn_); return 0; } int Rtcm::set_DF289(const Galileo_Ephemeris & gal_eph) { unsigned int galileo_week_number = static_cast(gal_eph.WN_5); if(galileo_week_number > 4095) { LOG(WARNING) << "Error decoding Galileo week number (it has a 4096 roll-off, but " << galileo_week_number << " was detected)"; } DF289 = std::bitset<12>(galileo_week_number); return 0; } int Rtcm::set_DF290(const Galileo_Ephemeris & gal_eph) { unsigned int iod_nav = static_cast(gal_eph.IOD_nav_1); if(iod_nav > 1023) { LOG(WARNING) << "Error decoding Galileo IODnav (it has a max of 1023, but " << iod_nav << " was detected)"; } DF290 = std::bitset<10>(iod_nav); return 0; } int Rtcm::set_DF291(const Galileo_Ephemeris & gal_eph) { unsigned short int SISA = static_cast(gal_eph.SISA_3); //SISA = 0; // SIS Accuracy, data content definition not given in Galileo OS SIS ICD, Issue 1.1, Sept 2010 DF291 = std::bitset<8>(SISA); return 0; } int Rtcm::set_DF292(const Galileo_Ephemeris & gal_eph) { int idot = static_cast(std::round(gal_eph.iDot_2 / FNAV_idot_2_LSB)); DF292 = std::bitset<14>(idot); return 0; } int Rtcm::set_DF293(const Galileo_Ephemeris & gal_eph) { unsigned int toc = static_cast(gal_eph.t0c_4); if(toc > 604740) { LOG(WARNING) << "Error decoding Galileo ephemeris time (max of 604740, but " << toc << " was detected)"; } DF293 = std::bitset<14>(toc); return 0; } int Rtcm::set_DF294(const Galileo_Ephemeris & gal_eph) { short int af2 = static_cast(std::round(gal_eph.af2_4 / FNAV_af2_1_LSB)); DF294 = std::bitset<6>(af2); return 0; } int Rtcm::set_DF295(const Galileo_Ephemeris & gal_eph) { long int af1 = static_cast(std::round(gal_eph.af1_4 / FNAV_af1_1_LSB)); DF295 = std::bitset<21>(af1); return 0; } int Rtcm::set_DF296(const Galileo_Ephemeris & gal_eph) { long int af0 = static_cast(std::round(gal_eph.af0_4 / FNAV_af0_1_LSB)); DF296 = std::bitset<31>(af0); return 0; } int Rtcm::set_DF297(const Galileo_Ephemeris & gal_eph) { int crs = static_cast(std::round(gal_eph.C_rs_3 / FNAV_Crs_3_LSB)); DF297 = std::bitset<16>(crs); return 0; } int Rtcm::set_DF298(const Galileo_Ephemeris & gal_eph) { int delta_n = static_cast(std::round(gal_eph.delta_n_3 / FNAV_deltan_3_LSB)); DF298 = std::bitset<16>(delta_n); return 0; } int Rtcm::set_DF299(const Galileo_Ephemeris & gal_eph) { long int m0 = static_cast(std::round(gal_eph.M0_1 / FNAV_M0_2_LSB)); DF299 = std::bitset<32>(m0); return 0; } int Rtcm::set_DF300(const Galileo_Ephemeris & gal_eph) { int cuc = static_cast(std::round(gal_eph.C_uc_3 / FNAV_Cuc_3_LSB)); DF300 = std::bitset<16>(cuc); return 0; } int Rtcm::set_DF301(const Galileo_Ephemeris & gal_eph) { unsigned long int ecc = static_cast(std::round(gal_eph.e_1 / FNAV_e_2_LSB)); DF301 = std::bitset<32>(ecc); return 0; } int Rtcm::set_DF302(const Galileo_Ephemeris & gal_eph) { int cus = static_cast(std::round(gal_eph.C_us_3 / FNAV_Cus_3_LSB)); DF302 = std::bitset<16>(cus); return 0; } int Rtcm::set_DF303(const Galileo_Ephemeris & gal_eph) { unsigned long int sqr_a = static_cast(std::round(gal_eph.A_1 / FNAV_a12_2_LSB)); DF303 = std::bitset<32>(sqr_a); return 0; } int Rtcm::set_DF304(const Galileo_Ephemeris & gal_eph) { unsigned int toe = static_cast(std::round(gal_eph.t0e_1 / FNAV_t0e_3_LSB)); DF304 = std::bitset<14>(toe); return 0; } int Rtcm::set_DF305(const Galileo_Ephemeris & gal_eph) { int cic = static_cast(std::round(gal_eph.C_ic_4 / FNAV_Cic_4_LSB)); DF305 = std::bitset<16>(cic); return 0; } int Rtcm::set_DF306(const Galileo_Ephemeris & gal_eph) { long int Omega0 = static_cast(std::round(gal_eph.OMEGA_0_2 / FNAV_omega0_2_LSB)); DF306 = std::bitset<32>(Omega0); return 0; } int Rtcm::set_DF307(const Galileo_Ephemeris & gal_eph) { int cis = static_cast(std::round(gal_eph.C_is_4 / FNAV_Cis_4_LSB)); DF307 = std::bitset<16>(cis); return 0; } int Rtcm::set_DF308(const Galileo_Ephemeris & gal_eph) { long int i0 = static_cast(std::round(gal_eph.i_0_2 / FNAV_i0_3_LSB)); DF308 = std::bitset<32>(i0); return 0; } int Rtcm::set_DF309(const Galileo_Ephemeris & gal_eph) { int crc = static_cast(std::round(gal_eph.C_rc_3 / FNAV_Crc_3_LSB)); DF309 = std::bitset<16>(crc); return 0; } int Rtcm::set_DF310(const Galileo_Ephemeris & gal_eph) { int omega = static_cast(std::round(gal_eph.omega_2 / FNAV_omega0_2_LSB)); DF310 = std::bitset<32>(omega); return 0; } int Rtcm::set_DF311(const Galileo_Ephemeris & gal_eph) { long int Omegadot = static_cast(std::round(gal_eph.OMEGA_dot_3 / FNAV_omegadot_2_LSB)); DF311 = std::bitset<24>(Omegadot); return 0; } int Rtcm::set_DF312(const Galileo_Ephemeris & gal_eph) { int bdg_E1_E5a = static_cast(std::round(gal_eph.BGD_E1E5a_5 / FNAV_BGD_1_LSB)); DF312 = std::bitset<10>(bdg_E1_E5a); return 0; } int Rtcm::set_DF313(const Galileo_Ephemeris & gal_eph) { unsigned int bdg_E5b_E1 = static_cast(std::round(gal_eph.BGD_E1E5b_5 )); //bdg_E5b_E1 = 0; //reserved DF313 = std::bitset<10>(bdg_E5b_E1); return 0; } int Rtcm::set_DF314(const Galileo_Ephemeris & gal_eph) { DF314 = std::bitset<2>(gal_eph.E5a_HS); return 0; } int Rtcm::set_DF315(const Galileo_Ephemeris & gal_eph) { DF315 = std::bitset<1>(gal_eph.E5a_DVS); return 0; } int Rtcm::set_DF393(bool more_messages) { DF393 = std::bitset<1>(more_messages); return 0; } int Rtcm::set_DF394(const std::map & gnss_synchro) { DF394.reset(); std::map::const_iterator gnss_synchro_iter; unsigned int mask_position; for(gnss_synchro_iter = gnss_synchro.begin(); gnss_synchro_iter != gnss_synchro.end(); gnss_synchro_iter++) { mask_position = 64 - gnss_synchro_iter->second.PRN; DF394.set(mask_position, true); } return 0; } int Rtcm::set_DF395(const std::map & gnss_synchro) { DF395.reset(); if(gnss_synchro.size() == 0) { return 1; } std::map::const_iterator gnss_synchro_iter; std::string sig; unsigned int mask_position; for(gnss_synchro_iter = gnss_synchro.begin(); gnss_synchro_iter != gnss_synchro.end(); gnss_synchro_iter++) { std::string sig_(gnss_synchro_iter->second.Signal); sig = sig_.substr(0,2); std::string sys(&gnss_synchro_iter->second.System, 1); if ((sig.compare("1C") == 0) && (sys.compare("G") == 0 ) ) { mask_position = 32 - 2; DF395.set(mask_position, true); } if ((sig.compare("2S") == 0) && (sys.compare("G") == 0 ) ) { mask_position = 32 - 15; DF395.set(mask_position, true); } if ((sig.compare("5X") == 0) && (sys.compare("G") == 0 ) ) { mask_position = 32 - 24; DF395.set(mask_position, true); } if ((sig.compare("1B") == 0) && (sys.compare("E") == 0 ) ) { mask_position = 32 - 4; DF395.set(mask_position, true); } if ((sig.compare("5X") == 0) && (sys.compare("E") == 0 ) ) { mask_position = 32 - 24; DF395.set(mask_position, true); } if ((sig.compare("7X") == 0) && (sys.compare("E") == 0 ) ) { mask_position = 32 - 16; DF395.set(mask_position, true); } } return 0; } std::string Rtcm::set_DF396(const std::map & observables) { std::string DF396; std::map::const_iterator observables_iter; Rtcm::set_DF394(observables); Rtcm::set_DF395(observables); unsigned int num_signals = DF395.count(); unsigned int num_satellites = DF394.count(); if ((num_signals == 0) || (num_satellites == 0)) { std::string s(""); return s; } std::vector > matrix(num_signals, std::vector()); std::string sig; std::vector list_of_sats; std::vector list_of_signals; for(observables_iter = observables.begin(); observables_iter != observables.end(); observables_iter++) { list_of_sats.push_back(observables_iter->second.PRN); std::string sig_(observables_iter->second.Signal); sig = sig_.substr(0,2); std::string sys(&observables_iter->second.System, 1); if ((sig.compare("1C") == 0) && (sys.compare("G") == 0 ) ) { list_of_signals.push_back(32 - 2); } if ((sig.compare("2S") == 0) && (sys.compare("G") == 0 ) ) { list_of_signals.push_back(32 - 15); } if ((sig.compare("5X") == 0) && (sys.compare("G") == 0 ) ) { list_of_signals.push_back(32 - 24); } if ((sig.compare("1B") == 0) && (sys.compare("E") == 0 ) ) { list_of_signals.push_back(32 - 4); } if ((sig.compare("5X") == 0) && (sys.compare("E") == 0 ) ) { list_of_signals.push_back(32 - 24); } if ((sig.compare("7X") == 0) && (sys.compare("E") == 0 ) ) { list_of_signals.push_back(32 - 16); } } std::sort( list_of_sats.begin(), list_of_sats.end() ); list_of_sats.erase( std::unique( list_of_sats.begin(), list_of_sats.end() ), list_of_sats.end() ); std::sort( list_of_signals.begin(), list_of_signals.end() ); std::reverse(list_of_signals.begin(), list_of_signals.end()); list_of_signals.erase( std::unique( list_of_signals.begin(), list_of_signals.end() ), list_of_signals.end() ); // fill the matrix bool value; for(unsigned int row = 0; row < num_signals; row++) { for(unsigned int sat = 0; sat < num_satellites; sat++) { value = false; for(observables_iter = observables.begin(); observables_iter != observables.end(); observables_iter++) { std::string sig_(observables_iter->second.Signal); sig = sig_.substr(0,2); std::string sys(&observables_iter->second.System, 1); if ((sig.compare("1C") == 0) && (sys.compare("G") == 0 ) && (list_of_signals.at(row) == 32 - 2) && (observables_iter->second.PRN == list_of_sats.at(sat) ) ) { value = true; } if ((sig.compare("2S") == 0) && (sys.compare("G") == 0 ) && (list_of_signals.at(row) == 32 - 15) && (observables_iter->second.PRN == list_of_sats.at(sat) ) ) { value = true; } if ((sig.compare("5X") == 0) && (sys.compare("G") == 0 ) && (list_of_signals.at(row) == 32 - 24) && (observables_iter->second.PRN == list_of_sats.at(sat) ) ) { value = true; } if ((sig.compare("1B") == 0) && (sys.compare("E") == 0 ) && (list_of_signals.at(row) == 32 - 4) && (observables_iter->second.PRN == list_of_sats.at(sat) ) ) { value = true; } if ((sig.compare("5X") == 0) && (sys.compare("E") == 0 ) && (list_of_signals.at(row) == 32 - 24) && (observables_iter->second.PRN == list_of_sats.at(sat) ) ) { value = true; } if ((sig.compare("7X") == 0) && (sys.compare("E") == 0 ) && (list_of_signals.at(row) == 32 - 16) && (observables_iter->second.PRN == list_of_sats.at(sat) ) ) { value = true; } } matrix[row].push_back(value); } } // write the matrix column-wise DF396.clear(); for(unsigned int col = 0; col < num_satellites; col++) { for(unsigned int row = 0; row < num_signals; row++) { std::string ss; if(matrix[row].at(col)) { ss = "1"; } else { ss = "0"; } DF396 += ss; } } return DF396; } int Rtcm::set_DF397(const Gnss_Synchro & gnss_synchro) { double meters_to_miliseconds = GPS_C_m_s * 0.001; double rough_range_s = std::round(gnss_synchro.Pseudorange_m / meters_to_miliseconds / TWO_N10) * meters_to_miliseconds * TWO_N10; unsigned int int_ms = 0; if (rough_range_s == 0.0) { int_ms = 255; } else if((rough_range_s < 0.0) || (rough_range_s > meters_to_miliseconds * 255.0)) { int_ms = 255; } else { int_ms = static_cast(std::floor(rough_range_s / meters_to_miliseconds / TWO_N10) + 0.5) >> 10; } DF397 = std::bitset<8>(int_ms); return 0; } int Rtcm::set_DF398(const Gnss_Synchro & gnss_synchro) { double meters_to_miliseconds = GPS_C_m_s * 0.001; double rough_range_m = std::round(gnss_synchro.Pseudorange_m / meters_to_miliseconds / TWO_N10) * meters_to_miliseconds * TWO_N10; unsigned int rr_mod_ms; if((rough_range_m <= 0.0) || (rough_range_m > meters_to_miliseconds * 255.0)) { rr_mod_ms = 0; } else { rr_mod_ms = static_cast(std::floor(rough_range_m / meters_to_miliseconds / TWO_N10) + 0.5) & 0x3FFu; } DF398 = std::bitset<10>(rr_mod_ms); return 0; } int Rtcm::set_DF399(const Gnss_Synchro & gnss_synchro) { double lambda = 0.0; std::string sig_(gnss_synchro.Signal); std::string sig = sig_.substr(0,2); if (sig.compare("1C") == 0 ) { lambda = GPS_C_m_s / GPS_L1_FREQ_HZ; } if (sig.compare("2S") == 0 ) { lambda = GPS_C_m_s / GPS_L2_FREQ_HZ; } if (sig.compare("5X") == 0 ) { lambda = GPS_C_m_s / Galileo_E5a_FREQ_HZ; } if (sig.compare("1B") == 0 ) { lambda = GPS_C_m_s / Galileo_E1_FREQ_HZ; } if (sig.compare("7X") == 0 ) { lambda = GPS_C_m_s / 1.207140e9; // Galileo_E1b_FREQ_HZ; } double rough_phase_range_rate_ms = std::round(- gnss_synchro.Carrier_Doppler_hz * lambda ); if(rough_phase_range_rate_ms < - 8191) rough_phase_range_rate_ms = -8192; if(rough_phase_range_rate_ms > 8191) rough_phase_range_rate_ms = -8192; DF399 = std::bitset<14>(static_cast(rough_phase_range_rate_ms)); return 0; } int Rtcm::set_DF400(const Gnss_Synchro & gnss_synchro) { double meters_to_miliseconds = GPS_C_m_s * 0.001; double rough_range_m = std::round(gnss_synchro.Pseudorange_m / meters_to_miliseconds / TWO_N10) * meters_to_miliseconds * TWO_N10; double psrng_s; int fine_pseudorange; psrng_s = gnss_synchro.Pseudorange_m - rough_range_m; if (psrng_s == 0) { fine_pseudorange = -16384; } else if(std::fabs(psrng_s) > 292.7) { fine_pseudorange = -16384; // 4000h: invalid value } else { fine_pseudorange = static_cast(std::round(psrng_s / meters_to_miliseconds / TWO_N24)); } DF400 = std::bitset<15>(fine_pseudorange); return 0; } int Rtcm::set_DF401(const Gnss_Synchro & gnss_synchro) { double meters_to_miliseconds = GPS_C_m_s * 0.001; double rough_range_m = std::round(gnss_synchro.Pseudorange_m / meters_to_miliseconds / TWO_N10) * meters_to_miliseconds * TWO_N10; double phrng_m; long int fine_phaserange; double lambda = 0.0; std::string sig_(gnss_synchro.Signal); std::string sig = sig_.substr(0,2); if (sig.compare("1C") == 0 ) { lambda = GPS_C_m_s / GPS_L1_FREQ_HZ; } if (sig.compare("2S") == 0 ) { lambda = GPS_C_m_s / GPS_L2_FREQ_HZ; } if (sig.compare("5X") == 0 ) { lambda = GPS_C_m_s / Galileo_E5a_FREQ_HZ; } if (sig.compare("1B") == 0 ) { lambda = GPS_C_m_s / Galileo_E1_FREQ_HZ; } if (sig.compare("7X") == 0 ) { lambda = GPS_C_m_s / 1.207140e9; // Galileo_E1b_FREQ_HZ; } phrng_m = (gnss_synchro.Carrier_phase_rads / GPS_TWO_PI ) * lambda - rough_range_m; /* Substract phase - pseudorange integer cycle offset */ /* TODO: check LLI! */ double cp = gnss_synchro.Carrier_phase_rads / GPS_TWO_PI; // ? if(std::fabs(phrng_m - cp) > 1171.0) { cp = std::round(phrng_m / lambda) * lambda; } phrng_m -= cp; if(phrng_m == 0.0) { fine_phaserange = - 2097152; } else if(std::fabs(phrng_m) > 1171.0) { fine_phaserange = - 2097152; } else { fine_phaserange = static_cast(std::round(phrng_m / meters_to_miliseconds / TWO_N29)); } DF401 = std::bitset<22>(fine_phaserange); return 0; } int Rtcm::set_DF402(const Gps_Ephemeris & ephNAV, const Gps_CNAV_Ephemeris & ephCNAV, const Galileo_Ephemeris & ephFNAV, double obs_time, const Gnss_Synchro & gnss_synchro) { unsigned int lock_time_period_s = 0; unsigned int lock_time_indicator; std::string sig_(gnss_synchro.Signal); if(sig_.compare("1C")) { lock_time_period_s = Rtcm::lock_time(ephNAV, obs_time, gnss_synchro); } if(sig_.compare("2S")) { lock_time_period_s = Rtcm::lock_time(ephCNAV, obs_time, gnss_synchro); } if(sig_.compare("1B") || sig_.compare("5X") || sig_.compare("7X") || sig_.compare("8X")) { lock_time_period_s = Rtcm::lock_time(ephFNAV, obs_time, gnss_synchro); } lock_time_indicator = Rtcm::msm_lock_time_indicator(lock_time_period_s); DF402 = std::bitset<4>(lock_time_indicator); return 0; } int Rtcm::set_DF403(const Gnss_Synchro & gnss_synchro) { unsigned int cnr_dB_Hz; cnr_dB_Hz = static_cast(std::round(gnss_synchro.CN0_dB_hz)); DF403 = std::bitset<6>(cnr_dB_Hz); return 0; } int Rtcm::set_DF404(const Gnss_Synchro & gnss_synchro) { double lambda = 0.0; std::string sig_(gnss_synchro.Signal); std::string sig = sig_.substr(0,2); int fine_phaserange_rate; if (sig.compare("1C") == 0 ) { lambda = GPS_C_m_s / GPS_L1_FREQ_HZ; } if (sig.compare("2S") == 0 ) { lambda = GPS_C_m_s / GPS_L2_FREQ_HZ; } if (sig.compare("5X") == 0 ) { lambda = GPS_C_m_s / Galileo_E5a_FREQ_HZ; } if (sig.compare("1B") == 0 ) { lambda = GPS_C_m_s / Galileo_E1_FREQ_HZ; } if (sig.compare("7X") == 0 ) { lambda = GPS_C_m_s / 1.207140e9; // Galileo_E1b_FREQ_HZ; } double rough_phase_range_rate = std::round(- gnss_synchro.Carrier_Doppler_hz * lambda ); double phrr = (- gnss_synchro.Carrier_Doppler_hz * lambda - rough_phase_range_rate); if(phrr == 0.0) { fine_phaserange_rate = -16384; } else if(std::fabs(phrr) > 1.6384) { fine_phaserange_rate = -16384; } else { fine_phaserange_rate = static_cast(std::round(phrr / 0.0001)); } DF404 = std::bitset<15>(fine_phaserange_rate); return 0; } int Rtcm::set_DF405(const Gnss_Synchro & gnss_synchro) { double meters_to_miliseconds = GPS_C_m_s * 0.001; double rough_range_m = std::round(gnss_synchro.Pseudorange_m / meters_to_miliseconds / TWO_N10) * meters_to_miliseconds * TWO_N10; double psrng_s; long int fine_pseudorange; psrng_s = gnss_synchro.Pseudorange_m - rough_range_m; if(psrng_s == 0.0) { fine_pseudorange = - 524288; } else if(std::fabs(psrng_s) > 292.7) { fine_pseudorange = - 524288; } else { fine_pseudorange = static_cast(std::round(psrng_s / meters_to_miliseconds / TWO_N29)); } DF405 = std::bitset<20>(fine_pseudorange); return 0; } int Rtcm::set_DF406(const Gnss_Synchro & gnss_synchro) { long int fine_phaserange_ex; double meters_to_miliseconds = GPS_C_m_s * 0.001; double rough_range_m = std::round(gnss_synchro.Pseudorange_m / meters_to_miliseconds / TWO_N10) * meters_to_miliseconds * TWO_N10; double phrng_m; double lambda = 0.0; std::string sig_(gnss_synchro.Signal); std::string sig = sig_.substr(0,2); if (sig.compare("1C") == 0 ) { lambda = GPS_C_m_s / GPS_L1_FREQ_HZ; } if (sig.compare("2S") == 0 ) { lambda = GPS_C_m_s / GPS_L2_FREQ_HZ; } if (sig.compare("5X") == 0 ) { lambda = GPS_C_m_s / Galileo_E5a_FREQ_HZ; } if (sig.compare("1B") == 0 ) { lambda = GPS_C_m_s / Galileo_E1_FREQ_HZ; } if (sig.compare("7X") == 0 ) { lambda = GPS_C_m_s / 1.207140e9; // Galileo_E1b_FREQ_HZ; } phrng_m = (gnss_synchro.Carrier_phase_rads / GPS_TWO_PI ) * lambda - rough_range_m; /* Substract phase - pseudorange integer cycle offset */ /* TODO: check LLI! */ double cp = gnss_synchro.Carrier_phase_rads / GPS_TWO_PI; // ? if(std::fabs(phrng_m - cp) > 1171.0) { cp = std::round(phrng_m / lambda) * lambda; } phrng_m -= cp; if(phrng_m == 0.0) { fine_phaserange_ex = - 8388608; } else if(std::fabs(phrng_m) > 1171.0) { fine_phaserange_ex = - 8388608; } else { fine_phaserange_ex = static_cast(std::round(phrng_m / meters_to_miliseconds / TWO_N31)); } DF406 = std::bitset<24>(fine_phaserange_ex); return 0; } int Rtcm::set_DF407(const Gps_Ephemeris & ephNAV, const Gps_CNAV_Ephemeris & ephCNAV, const Galileo_Ephemeris & ephFNAV, double obs_time, const Gnss_Synchro & gnss_synchro) { unsigned int lock_time_indicator; unsigned int lock_time_period_s = 0; std::string sig_(gnss_synchro.Signal); if(sig_.compare("1C")) { lock_time_period_s = Rtcm::lock_time(ephNAV, obs_time, gnss_synchro); } if(sig_.compare("2S")) { lock_time_period_s = Rtcm::lock_time(ephCNAV, obs_time, gnss_synchro); } if(sig_.compare("1B") || sig_.compare("5X") || sig_.compare("7X") || sig_.compare("8X")) { lock_time_period_s = Rtcm::lock_time(ephFNAV, obs_time, gnss_synchro); } lock_time_indicator = Rtcm::msm_extended_lock_time_indicator(lock_time_period_s); DF407 = std::bitset<10>(lock_time_indicator); return 0; } int Rtcm::set_DF408(const Gnss_Synchro & gnss_synchro) { unsigned int cnr_dB_Hz; cnr_dB_Hz = static_cast(std::round(gnss_synchro.CN0_dB_hz / 0.0625)); DF408 = std::bitset<10>(cnr_dB_Hz); return 0; } int Rtcm::set_DF409(unsigned int iods) { DF409 = std::bitset<3>(iods); return 0; } int Rtcm::set_DF411(unsigned int clock_steering_indicator) { DF411 = std::bitset<2>(clock_steering_indicator); return 0; } int Rtcm::set_DF412(unsigned int external_clock_indicator) { DF412 = std::bitset<2>(external_clock_indicator); return 0; } int Rtcm::set_DF417(bool using_divergence_free_smoothing) { DF417 = std::bitset<1>(using_divergence_free_smoothing); return 0; } int Rtcm::set_DF418(int carrier_smoothing_interval_s) { if(carrier_smoothing_interval_s < 0) { DF418 = std::bitset<3>("111"); } else { if(carrier_smoothing_interval_s == 0) { DF418 = std::bitset<3>("000"); } else if(carrier_smoothing_interval_s < 30) { DF418 = std::bitset<3>("001"); } else if(carrier_smoothing_interval_s < 60) { DF418 = std::bitset<3>("010"); } else if(carrier_smoothing_interval_s < 120) { DF418 = std::bitset<3>("011"); } else if(carrier_smoothing_interval_s < 240) { DF418 = std::bitset<3>("100"); } else if(carrier_smoothing_interval_s < 480) { DF418 = std::bitset<3>("101"); } else { DF418 = std::bitset<3>("110"); } } return 0; } int Rtcm::set_DF420(const Gnss_Synchro & gnss_synchro __attribute__((unused))) { // todo: read the value from gnss_synchro bool half_cycle_ambiguity_indicator = true; DF420 = std::bitset<1>(half_cycle_ambiguity_indicator); return 0; } gnss-sdr-0.0.9/src/core/system_parameters/rtcm.h000066400000000000000000001201661305042567700217030ustar00rootroot00000000000000/*! * \file rtcm.h * \brief Interface for the RTCM 3.2 Standard * \author Carles Fernandez-Prades, 2015. cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_RTCM_H_ #define GNSS_SDR_RTCM_H_ #include #include #include #include #include #include #include #include #include #include #include #include "concurrent_queue.h" #include "gnss_synchro.h" #include "galileo_fnav_message.h" #include "gps_navigation_message.h" #include "gps_cnav_navigation_message.h" /*! * This class implements the generation and reading of some Message Types * defined in the RTCM 3.2 Standard, plus some utilities to handle messages. * * Generation of the following Message Types: * 1001, 1002, 1003, 1004, 1005, 1006, 1008, 1019, 1029, 1045 * * Decoding of the following Message Types: * 1019, 1045 * * Generation of the following Multiple Signal Messages: * MSM1 (message types 1071, 1091) * MSM2 (message types 1072, 1092) * MSM3 (message types 1073, 1093) * MSM4 (message types 1074, 1094) * MSM5 (message types 1075, 1095) * MSM6 (message types 1076, 1096) * MSM7 (message types 1077, 1097) * * RTCM 3 message format (size in bits): * +----------+--------+-----------+--------------------+----------+ * | preamble | 000000 | length | data message | parity | * +----------+--------+-----------+--------------------+----------+ * |<-- 8 --->|<- 6 -->|<-- 10 --->|<--- length x 8 --->|<-- 24 -->| * +----------+--------+-----------+--------------------+----------+ * * * (C) Carles Fernandez-Prades, 2015. cfernandez(at)cttc.es */ class Rtcm { public: Rtcm(unsigned short port = 2101); // & observables, unsigned short station_id); /*! * \brief Prints message type 1002 (Extended L1-Only GPS RTK Observables) */ std::string print_MT1002(const Gps_Ephemeris & gps_eph, double obs_time, const std::map & observables, unsigned short station_id); /*! * \brief Prints message type 1003 (L1 & L2 GPS RTK Observables) */ std::string print_MT1003(const Gps_Ephemeris & ephL1, const Gps_CNAV_Ephemeris & ephL2, double obs_time, const std::map & observables, unsigned short station_id); /*! * \brief Prints message type 1004 (Extended L1 & L2 GPS RTK Observables) */ std::string print_MT1004(const Gps_Ephemeris & ephL1, const Gps_CNAV_Ephemeris & ephL2, double obs_time, const std::map & observables, unsigned short station_id); /*! * \brief Prints message type 1005 (Stationary Antenna Reference Point) */ std::string print_MT1005(unsigned int ref_id, double ecef_x, double ecef_y, double ecef_z, bool gps, bool glonass, bool galileo, bool non_physical, bool single_oscillator, unsigned int quarter_cycle_indicator); /*! * \brief Verifies and reads messages of type 1005 (Stationary Antenna Reference Point). Returns 1 if anything goes wrong, 0 otherwise. */ int read_MT1005(const std::string & message, unsigned int & ref_id, double & ecef_x, double & ecef_y, double & ecef_z, bool & gps, bool & glonass, bool & galileo); /*! * \brief Prints message type 1006 (Stationary Antenna Reference Point, with Height Information) */ std::string print_MT1006(unsigned int ref_id, double ecef_x, double ecef_y, double ecef_z, bool gps, bool glonass, bool galileo, bool non_physical, bool single_oscillator, unsigned int quarter_cycle_indicator, double height); std::string print_MT1005_test(); // & observables, unsigned int ref_id, unsigned int clock_steering_indicator, unsigned int external_clock_indicator, int smooth_int, bool divergence_free, bool more_messages); /*! * \brief Prints messages of type MSM2 (Compact GNSS phaseranges) */ std::string print_MSM_2( const Gps_Ephemeris & gps_eph, const Gps_CNAV_Ephemeris & gps_cnav_eph, const Galileo_Ephemeris & gal_eph, double obs_time, const std::map & observables, unsigned int ref_id, unsigned int clock_steering_indicator, unsigned int external_clock_indicator, int smooth_int, bool divergence_free, bool more_messages); /*! * \brief Prints messages of type MSM3 (Compact GNSS pseudoranges and phaseranges) */ std::string print_MSM_3( const Gps_Ephemeris & gps_eph, const Gps_CNAV_Ephemeris & gps_cnav_eph, const Galileo_Ephemeris & gal_eph, double obs_time, const std::map & observables, unsigned int ref_id, unsigned int clock_steering_indicator, unsigned int external_clock_indicator, int smooth_int, bool divergence_free, bool more_messages); /*! * \brief Prints messages of type MSM4 (Full GNSS pseudoranges and phaseranges plus CNR) */ std::string print_MSM_4( const Gps_Ephemeris & gps_eph, const Gps_CNAV_Ephemeris & gps_cnav_eph, const Galileo_Ephemeris & gal_eph, double obs_time, const std::map & observables, unsigned int ref_id, unsigned int clock_steering_indicator, unsigned int external_clock_indicator, int smooth_int, bool divergence_free, bool more_messages); /*! * \brief Prints messages of type MSM5 (Full GNSS pseudoranges, phaseranges, phaserange rate and CNR) */ std::string print_MSM_5( const Gps_Ephemeris & gps_eph, const Gps_CNAV_Ephemeris & gps_cnav_eph, const Galileo_Ephemeris & gal_eph, double obs_time, const std::map & observables, unsigned int ref_id, unsigned int clock_steering_indicator, unsigned int external_clock_indicator, int smooth_int, bool divergence_free, bool more_messages); /*! * \brief Prints messages of type MSM6 (Full GNSS pseudoranges and phaseranges plus CNR, high resolution) */ std::string print_MSM_6( const Gps_Ephemeris & gps_eph, const Gps_CNAV_Ephemeris & gps_cnav_eph, const Galileo_Ephemeris & gal_eph, double obs_time, const std::map & observables, unsigned int ref_id, unsigned int clock_steering_indicator, unsigned int external_clock_indicator, int smooth_int, bool divergence_free, bool more_messages); /*! * \brief Prints messages of type MSM7 (Full GNSS pseudoranges, phaseranges, phaserange rate and CNR, high resolution) */ std::string print_MSM_7( const Gps_Ephemeris & gps_eph, const Gps_CNAV_Ephemeris & gps_cnav_eph, const Galileo_Ephemeris & gal_eph, double obs_time, const std::map & observables, unsigned int ref_id, unsigned int clock_steering_indicator, unsigned int external_clock_indicator, int smooth_int, bool divergence_free, bool more_messages); unsigned int lock_time(const Gps_Ephemeris & eph, double obs_time, const Gnss_Synchro & gnss_synchro); // get_MT1001_4_header(unsigned int msg_number, double obs_time, const std::map & observables, unsigned int ref_id, unsigned int smooth_int, bool sync_flag, bool divergence_free); std::bitset<58> get_MT1001_sat_content(const Gps_Ephemeris & eph, double obs_time, const Gnss_Synchro & gnss_synchro); std::bitset<74> get_MT1002_sat_content(const Gps_Ephemeris & eph, double obs_time, const Gnss_Synchro & gnss_synchro); std::bitset<101> get_MT1003_sat_content(const Gps_Ephemeris & ephL1, const Gps_CNAV_Ephemeris & ephL2, double obs_time, const Gnss_Synchro & gnss_synchroL1, const Gnss_Synchro & gnss_synchroL2); std::bitset<125> get_MT1004_sat_content(const Gps_Ephemeris & ephL1, const Gps_CNAV_Ephemeris & ephL2, double obs_time, const Gnss_Synchro & gnss_synchroL1, const Gnss_Synchro & gnss_synchroL2); std::bitset<152> get_MT1005_test(); std::string get_MSM_header(unsigned int msg_number, double obs_time, const std::map & observables, unsigned int ref_id, unsigned int clock_steering_indicator, unsigned int external_clock_indicator, int smooth_int, bool divergence_free, bool more_messages); std::string get_MSM_1_content_sat_data(const std::map & observables); std::string get_MSM_4_content_sat_data(const std::map & observables); std::string get_MSM_5_content_sat_data(const std::map & observables); std::string get_MSM_1_content_signal_data(const std::map & observables); std::string get_MSM_2_content_signal_data(const Gps_Ephemeris & ephNAV, const Gps_CNAV_Ephemeris & ephCNAV, const Galileo_Ephemeris & ephFNAV, double obs_time, const std::map & observables); std::string get_MSM_3_content_signal_data(const Gps_Ephemeris & ephNAV, const Gps_CNAV_Ephemeris & ephCNAV, const Galileo_Ephemeris & ephFNAV, double obs_time, const std::map & observables); std::string get_MSM_4_content_signal_data(const Gps_Ephemeris & ephNAV, const Gps_CNAV_Ephemeris & ephCNAV, const Galileo_Ephemeris & ephFNAV, double obs_time, const std::map & observables); std::string get_MSM_5_content_signal_data(const Gps_Ephemeris & ephNAV, const Gps_CNAV_Ephemeris & ephCNAV, const Galileo_Ephemeris & ephFNAV, double obs_time, const std::map & observables); std::string get_MSM_6_content_signal_data(const Gps_Ephemeris & ephNAV, const Gps_CNAV_Ephemeris & ephCNAV, const Galileo_Ephemeris & ephFNAV, double obs_time, const std::map & observables); std::string get_MSM_7_content_signal_data(const Gps_Ephemeris & ephNAV, const Gps_CNAV_Ephemeris & ephCNAV, const Galileo_Ephemeris & ephFNAV, double obs_time, const std::map & observables); // // Utilities // static std::map galileo_signal_map; static std::map gps_signal_map; std::vector > sort_by_signal(const std::vector > & synchro_map) const; std::vector > sort_by_PRN_mask(const std::vector > & synchro_map) const; boost::posix_time::ptime compute_GPS_time(const Gps_Ephemeris& eph, double obs_time) const; boost::posix_time::ptime compute_GPS_time(const Gps_CNAV_Ephemeris & eph, double obs_time) const; boost::posix_time::ptime compute_Galileo_time(const Galileo_Ephemeris& eph, double obs_time) const; boost::posix_time::ptime gps_L1_last_lock_time[64]; boost::posix_time::ptime gps_L2_last_lock_time[64]; boost::posix_time::ptime gal_E1_last_lock_time[64]; boost::posix_time::ptime gal_E5_last_lock_time[64]; unsigned int lock_time_indicator(unsigned int lock_time_period_s); unsigned int msm_lock_time_indicator(unsigned int lock_time_period_s); unsigned int msm_extended_lock_time_indicator(unsigned int lock_time_period_s); // // Classes for TCP communication // unsigned short RTCM_port; //unsigned short RTCM_Station_ID; class Rtcm_Message { public: enum { header_length = 6 }; enum { max_body_length = 1029 }; Rtcm_Message() : body_length_(0) { } const char* data() const { return data_; } char* data() { return data_; } std::size_t length() const { return header_length + body_length_; } const char* body() const { return data_ + header_length; } char* body() { return data_ + header_length; } std::size_t body_length() const { return body_length_; } void body_length(std::size_t new_length) { body_length_ = new_length; if (body_length_ > max_body_length) body_length_ = max_body_length; } bool decode_header() { char header[header_length + 1] = ""; std::strncat(header, data_, header_length); if(header[0] != 'G' || header[1] != 'S') { return false; } char header2_[header_length - 1] = ""; std::strncat(header2_, data_ + 2 , header_length - 2); body_length_ = std::atoi(header2_); if(body_length_ == 0) { return false; } if (body_length_ > max_body_length) { body_length_ = 0; return false; } return true; } void encode_header() { char header[header_length + 1] = ""; std::sprintf(header, "GS%4d", static_cast(body_length_)); std::memcpy(data_, header, header_length); } private: char data_[header_length + max_body_length]; std::size_t body_length_; }; class Rtcm_Listener { public: virtual ~Rtcm_Listener() {} virtual void deliver(const Rtcm_Message & msg) = 0; }; class Rtcm_Listener_Room { public: void join(std::shared_ptr participant) { participants_.insert(participant); for (auto msg: recent_msgs_) participant->deliver(msg); } void leave(std::shared_ptr participant) { participants_.erase(participant); } void deliver(const Rtcm_Message & msg) { recent_msgs_.push_back(msg); while (recent_msgs_.size() > max_recent_msgs) recent_msgs_.pop_front(); for (auto participant: participants_) participant->deliver(msg); } private: std::set > participants_; enum { max_recent_msgs = 1 }; std::deque recent_msgs_; }; class Rtcm_Session : public Rtcm_Listener, public std::enable_shared_from_this { public: Rtcm_Session(boost::asio::ip::tcp::socket socket, Rtcm_Listener_Room & room) : socket_(std::move(socket)), room_(room) { } void start() { room_.join(shared_from_this()); do_read_message_header(); } void deliver(const Rtcm_Message & msg) { bool write_in_progress = !write_msgs_.empty(); write_msgs_.push_back(msg); if (!write_in_progress) { do_write(); } } private: void do_read_message_header() { auto self(shared_from_this()); boost::asio::async_read(socket_, boost::asio::buffer(read_msg_.data(), Rtcm_Message::header_length), [this, self](boost::system::error_code ec, std::size_t /*length*/) { if (!ec && read_msg_.decode_header()) { do_read_message_body(); } else if(!ec && !read_msg_.decode_header()) { client_says += read_msg_.data(); bool first = true; while(client_says.length() >= 80) { if(first == true) { std::cout << "Client from " << socket_.remote_endpoint().address() << " says "; first = false; } std::cout << client_says.substr(0, 80) << std::endl; client_says = client_says.substr(80, client_says.length() - 80); } do_read_message_header(); } else { std::cout << "Closing connection with client from " << socket_.remote_endpoint().address() << std::endl; room_.leave(shared_from_this()); } }); } void do_read_message_body() { auto self(shared_from_this()); boost::asio::async_read(socket_, boost::asio::buffer(read_msg_.body(), read_msg_.body_length()), [this, self](boost::system::error_code ec, std::size_t /*length*/) { if (!ec) { room_.deliver(read_msg_); //std::cout << "Delivered message (session): "; //std::cout.write(read_msg_.body(), read_msg_.body_length()); //std::cout << std::endl; do_read_message_header(); } else { std::cout << "Closing connection with client from " << socket_.remote_endpoint().address() << std::endl; room_.leave(shared_from_this()); } }); } void do_write() { auto self(shared_from_this()); boost::asio::async_write(socket_, boost::asio::buffer(write_msgs_.front().body(), write_msgs_.front().body_length()), [this, self](boost::system::error_code ec, std::size_t /*length*/) { if(!ec) { write_msgs_.pop_front(); if(!write_msgs_.empty()) { do_write(); } } else { std::cout << "Closing connection with client from " << socket_.remote_endpoint().address() << std::endl; room_.leave(shared_from_this()); } }); } boost::asio::ip::tcp::socket socket_; Rtcm_Listener_Room & room_; Rtcm_Message read_msg_; std::deque write_msgs_; std::string client_says; }; class Tcp_Internal_Client : public std::enable_shared_from_this { public: Tcp_Internal_Client(boost::asio::io_service& io_service, boost::asio::ip::tcp::resolver::iterator endpoint_iterator) : io_service_(io_service), socket_(io_service) { do_connect(endpoint_iterator); } void close() { io_service_.post([this]() { socket_.close(); }); } void write(const Rtcm_Message & msg) { io_service_.post( [this, msg]() { bool write_in_progress = !write_msgs_.empty(); write_msgs_.push_back(msg); if (!write_in_progress) { do_write(); } }); } private: void do_connect(boost::asio::ip::tcp::resolver::iterator endpoint_iterator) { boost::asio::async_connect(socket_, endpoint_iterator, [this](boost::system::error_code ec, boost::asio::ip::tcp::resolver::iterator) { if (!ec) { do_read_message(); } else { std::cout << "Server is down." << std::endl; } }); } void do_read_message() { boost::asio::async_read(socket_, boost::asio::buffer(read_msg_.data(), 1029), [this](boost::system::error_code ec, std::size_t /*length*/) { if (!ec ) { do_read_message(); } else { std::cout << "Error in client" << std::endl; socket_.close(); } }); } void do_write() { boost::asio::async_write(socket_, boost::asio::buffer(write_msgs_.front().data(), write_msgs_.front().length()), [this](boost::system::error_code ec, std::size_t /*length*/) { if (!ec) { write_msgs_.pop_front(); if (!write_msgs_.empty()) { do_write(); } } else { socket_.close(); } }); } boost::asio::io_service& io_service_; boost::asio::ip::tcp::socket socket_; Rtcm_Message read_msg_; std::deque write_msgs_; }; class Queue_Reader { public: Queue_Reader(boost::asio::io_service& io_service, std::shared_ptr< concurrent_queue > & queue, int port) : queue_(queue) { boost::asio::ip::tcp::resolver resolver(io_service); std::string host("localhost"); std::string port_str = std::to_string(port); auto queue_endpoint_iterator = resolver.resolve({ host.c_str(), port_str.c_str() }); c = std::make_shared(io_service, queue_endpoint_iterator); } void do_read_queue() { for(;;) { std::string message; Rtcm_Message msg; queue_->wait_and_pop(message); //message += '\n'; if(message.compare("Goodbye") == 0) break; const char *char_msg = message.c_str(); msg.body_length(message.length()); std::memcpy(msg.body(), char_msg, msg.body_length()); msg.encode_header(); c->write(msg); } } private: std::shared_ptr c; std::shared_ptr< concurrent_queue > & queue_; }; class Tcp_Server { public: Tcp_Server(boost::asio::io_service& io_service, const boost::asio::ip::tcp::endpoint& endpoint) : io_service_(io_service), acceptor_(io_service), socket_(io_service) { acceptor_.open(endpoint.protocol()); acceptor_.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true)); acceptor_.bind(endpoint); acceptor_.listen(); do_accept(); } void close_server() { socket_.close(); acceptor_.close(); } private: void do_accept() { acceptor_.async_accept(socket_, [this](boost::system::error_code ec) { if (!ec) { if(first_client) { std::cout << "The TCP Server is up and running. Accepting connections ..." << std::endl; first_client = false; } else { std::cout << "Starting RTCM TCP server session..." << std::endl; std::cout << "Serving client from " << socket_.remote_endpoint().address() << std::endl; } std::make_shared(std::move(socket_), room_)->start(); } else { std::cout << "Error when invoking a RTCM session. " << ec << std::endl; } do_accept(); }); } boost::asio::io_service& io_service_; boost::asio::ip::tcp::acceptor acceptor_; boost::asio::ip::tcp::socket socket_; Rtcm_Listener_Room room_; bool first_client = true; }; boost::asio::io_service io_service; std::shared_ptr< concurrent_queue > rtcm_message_queue; std::thread t; std::thread tq; std::list servers; bool server_is_running; void stop_service(); // // Transport Layer // std::bitset<8> preamble; std::bitset<6> reserved_field; std::string add_CRC(const std::string & m) const; std::string build_message(const std::string & data) const; // adds 0s to complete a byte and adds the CRC // // Data Fields // std::bitset<12> DF002; int set_DF002(unsigned int message_number); std::bitset<12> DF003; int set_DF003(unsigned int ref_station_ID); std::bitset<30> DF004; int set_DF004(double obs_time); std::bitset<1> DF005; int set_DF005(bool sync_flag); std::bitset<5> DF006; int set_DF006(const std::map & observables); std::bitset<1> DF007; int set_DF007(bool divergence_free_smoothing_indicator); // 0 - Divergence-free smoothing not used 1 - Divergence-free smoothing used std::bitset<3> DF008; int set_DF008(short int smoothing_interval); std::bitset<6> DF009; int set_DF009(const Gnss_Synchro & gnss_synchro); int set_DF009(const Gps_Ephemeris & gps_eph); std::bitset<1> DF010; int set_DF010(bool code_indicator); std::bitset<24> DF011; int set_DF011(const Gnss_Synchro & gnss_synchro); std::bitset<20> DF012; int set_DF012(const Gnss_Synchro & gnss_synchro); std::bitset<7> DF013; int set_DF013(const Gps_Ephemeris & eph, double obs_time, const Gnss_Synchro & gnss_synchro); std::bitset<8> DF014; int set_DF014(const Gnss_Synchro & gnss_synchro); std::bitset<8> DF015; int set_DF015(const Gnss_Synchro & gnss_synchro); std::bitset<14> DF017; int set_DF017(const Gnss_Synchro & gnss_synchroL1, const Gnss_Synchro & gnss_synchroL2); std::bitset<20> DF018; int set_DF018(const Gnss_Synchro & gnss_synchroL1, const Gnss_Synchro & gnss_synchroL2); std::bitset<7> DF019; int set_DF019(const Gps_CNAV_Ephemeris & eph, double obs_time, const Gnss_Synchro & gnss_synchro); std::bitset<8> DF020; int set_DF020(const Gnss_Synchro & gnss_synchro); std::bitset<6> DF021; int set_DF021(); std::bitset<1> DF022; int set_DF022(bool gps_indicator); std::bitset<1> DF023; int set_DF023(bool glonass_indicator); std::bitset<1> DF024; int set_DF024(bool galileo_indicator); std::bitset<38> DF025; int set_DF025(double antenna_ECEF_X_m); std::bitset<38> DF026; int set_DF026(double antenna_ECEF_Y_m); std::bitset<38> DF027; int set_DF027(double antenna_ECEF_Z_m); std::bitset<16> DF028; int set_DF028(double height); std::bitset<8> DF029; std::bitset<8> DF031; int set_DF031(unsigned int antenna_setup_id); std::bitset<8> DF032; std::bitset<16> DF051; int set_DF051(const Gps_Ephemeris & gps_eph, double obs_time); std::bitset<17> DF052; int set_DF052(const Gps_Ephemeris & gps_eph, double obs_time); // Contents of GPS Satellite Ephemeris Data, Message Type 1019 std::bitset<8> DF071; int set_DF071(const Gps_Ephemeris & gps_eph); std::bitset<10> DF076; int set_DF076(const Gps_Ephemeris & gps_eph); std::bitset<4> DF077; int set_DF077(const Gps_Ephemeris & gps_eph); std::bitset<2> DF078; int set_DF078(const Gps_Ephemeris & gps_eph); std::bitset<14> DF079; int set_DF079(const Gps_Ephemeris & gps_eph); std::bitset<8> DF080; int set_DF080(const Gps_Ephemeris & gps_eph); std::bitset<16> DF081; int set_DF081(const Gps_Ephemeris & gps_eph); std::bitset<8> DF082; int set_DF082(const Gps_Ephemeris & gps_eph); std::bitset<16> DF083; int set_DF083(const Gps_Ephemeris & gps_eph); std::bitset<22> DF084; int set_DF084(const Gps_Ephemeris & gps_eph); std::bitset<10> DF085; int set_DF085(const Gps_Ephemeris & gps_eph); std::bitset<16> DF086; int set_DF086(const Gps_Ephemeris & gps_eph); std::bitset<16> DF087; int set_DF087(const Gps_Ephemeris & gps_eph); std::bitset<32> DF088; int set_DF088(const Gps_Ephemeris & gps_eph); std::bitset<16> DF089; int set_DF089(const Gps_Ephemeris & gps_eph); std::bitset<32> DF090; int set_DF090(const Gps_Ephemeris & gps_eph); std::bitset<16> DF091; int set_DF091(const Gps_Ephemeris & gps_eph); std::bitset<32> DF092; int set_DF092(const Gps_Ephemeris & gps_eph); std::bitset<16> DF093; int set_DF093(const Gps_Ephemeris & gps_eph); std::bitset<16> DF094; int set_DF094(const Gps_Ephemeris & gps_eph); std::bitset<32> DF095; int set_DF095(const Gps_Ephemeris & gps_eph); std::bitset<16> DF096; int set_DF096(const Gps_Ephemeris & gps_eph); std::bitset<32> DF097; int set_DF097(const Gps_Ephemeris & gps_eph); std::bitset<16> DF098; int set_DF098(const Gps_Ephemeris & gps_eph); std::bitset<32> DF099; int set_DF099(const Gps_Ephemeris & gps_eph); std::bitset<24> DF100; int set_DF100(const Gps_Ephemeris & gps_eph); std::bitset<8> DF101; int set_DF101(const Gps_Ephemeris & gps_eph); std::bitset<6> DF102; int set_DF102(const Gps_Ephemeris & gps_eph); std::bitset<1> DF103; int set_DF103(const Gps_Ephemeris & gps_eph); std::bitset<1> DF137; int set_DF137(const Gps_Ephemeris & gps_eph); std::bitset<1> DF141; int set_DF141(const Gps_Ephemeris & gps_eph); std::bitset<1> DF142; int set_DF142(const Gps_Ephemeris & gps_eph); std::bitset<30> DF248; int set_DF248(double obs_time); // Contents of Galileo F/NAV Satellite Ephemeris Data, Message Type 1045 std::bitset<6> DF252; int set_DF252(const Galileo_Ephemeris & gal_eph); std::bitset<12> DF289; int set_DF289(const Galileo_Ephemeris & gal_eph); std::bitset<10> DF290; int set_DF290(const Galileo_Ephemeris & gal_eph); std::bitset<8> DF291; int set_DF291(const Galileo_Ephemeris & gal_eph); std::bitset<14> DF292; int set_DF292(const Galileo_Ephemeris & gal_eph); std::bitset<14> DF293; int set_DF293(const Galileo_Ephemeris & gal_eph); std::bitset<6> DF294; int set_DF294(const Galileo_Ephemeris & gal_eph); std::bitset<21> DF295; int set_DF295(const Galileo_Ephemeris & gal_eph); std::bitset<31> DF296; int set_DF296(const Galileo_Ephemeris & gal_eph); std::bitset<16> DF297; int set_DF297(const Galileo_Ephemeris & gal_eph); std::bitset<16> DF298; int set_DF298(const Galileo_Ephemeris & gal_eph); std::bitset<32> DF299; int set_DF299(const Galileo_Ephemeris & gal_eph); std::bitset<16> DF300; int set_DF300(const Galileo_Ephemeris & gal_eph); std::bitset<32> DF301; int set_DF301(const Galileo_Ephemeris & gal_eph); std::bitset<16> DF302; int set_DF302(const Galileo_Ephemeris & gal_eph); std::bitset<32> DF303; int set_DF303(const Galileo_Ephemeris & gal_eph); std::bitset<14> DF304; int set_DF304(const Galileo_Ephemeris & gal_eph); std::bitset<16> DF305; int set_DF305(const Galileo_Ephemeris & gal_eph); std::bitset<32> DF306; int set_DF306(const Galileo_Ephemeris & gal_eph); std::bitset<16> DF307; int set_DF307(const Galileo_Ephemeris & gal_eph); std::bitset<32> DF308; int set_DF308(const Galileo_Ephemeris & gal_eph); std::bitset<16> DF309; int set_DF309(const Galileo_Ephemeris & gal_eph); std::bitset<32> DF310; int set_DF310(const Galileo_Ephemeris & gal_eph); std::bitset<24> DF311; int set_DF311(const Galileo_Ephemeris & gal_eph); std::bitset<10> DF312; int set_DF312(const Galileo_Ephemeris & gal_eph); std::bitset<10> DF313; int set_DF313(const Galileo_Ephemeris & gal_eph); std::bitset<2> DF314; int set_DF314(const Galileo_Ephemeris & gal_eph); std::bitset<1> DF315; int set_DF315(const Galileo_Ephemeris & gal_eph); std::bitset<2> DF364; // Content of message header for MSM1, MSM2, MSM3, MSM4, MSM5, MSM6 and MSM7 std::bitset<1> DF393; int set_DF393(bool more_messages); //1 indicates that more MSMs follow for given physical time and reference station ID std::bitset<64> DF394; int set_DF394(const std::map & observables); std::bitset<32> DF395; int set_DF395(const std::map & observables); std::string set_DF396(const std::map & observables); std::bitset<8> DF397; int set_DF397(const Gnss_Synchro & gnss_synchro); std::bitset<10> DF398; int set_DF398(const Gnss_Synchro & gnss_synchro); std::bitset<14> DF399; int set_DF399(const Gnss_Synchro & gnss_synchro); std::bitset<15> DF400; int set_DF400(const Gnss_Synchro & gnss_synchro); std::bitset<22> DF401; int set_DF401(const Gnss_Synchro & gnss_synchro); std::bitset<4> DF402; int set_DF402(const Gps_Ephemeris & ephNAV, const Gps_CNAV_Ephemeris & ephCNAV, const Galileo_Ephemeris & ephFNAV, double obs_time, const Gnss_Synchro & gnss_synchro); std::bitset<6> DF403; int set_DF403(const Gnss_Synchro & gnss_synchro); std::bitset<15> DF404; int set_DF404(const Gnss_Synchro & gnss_synchro); std::bitset<20> DF405; int set_DF405(const Gnss_Synchro & gnss_synchro); std::bitset<24> DF406; int set_DF406(const Gnss_Synchro & gnss_synchro); std::bitset<10> DF407; int set_DF407(const Gps_Ephemeris & ephNAV, const Gps_CNAV_Ephemeris & ephCNAV, const Galileo_Ephemeris & ephFNAV, double obs_time, const Gnss_Synchro & gnss_synchro); std::bitset<10> DF408; int set_DF408(const Gnss_Synchro & gnss_synchro); std::bitset<3> DF409; int set_DF409(unsigned int iods); std::bitset<2> DF411; int set_DF411(unsigned int clock_steering_indicator); std::bitset<2> DF412; int set_DF412(unsigned int external_clock_indicator); std::bitset<1> DF417; int set_DF417(bool using_divergence_free_smoothing); std::bitset<3> DF418; int set_DF418(int carrier_smoothing_interval_s); std::bitset<1> DF420; int set_DF420(const Gnss_Synchro & gnss_synchro); }; #endif gnss-sdr-0.0.9/src/core/system_parameters/sbas_ephemeris.cc000066400000000000000000000033741305042567700240660ustar00rootroot00000000000000/* * \file sbas_ephemeris.cc * \brief Implementation of a SBAS REFERENCE LOCATION storage * * \author Daniel Fehr, 2013. daniel.co(at)bluewin.ch * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include "sbas_ephemeris.h" void Sbas_Ephemeris::print(std::ostream &out) { out << "<> PRN" << i_prn << ":"; out << " d_t0=" << i_t0; out << " d_tof=" << d_tof; out << " i_sv_ura=" << i_sv_ura; out << " b_sv_do_not_use=" << b_sv_do_not_use; out << " d_pos=(x=" << d_pos[0] << ", y=" << d_pos[1] << ", z=" << d_pos[2] << ")"; out << " d_vel=(x=" << d_vel[0] << ", y=" << d_vel[1] << ", z=" << d_vel[2] << ")"; out << " d_acc=(x=" << d_acc[0] << ", y=" << d_acc[1] << ", z=" << d_acc[2] << ")"; out << " d_af0=" << d_af0; out << " d_af1=" << d_af1; } gnss-sdr-0.0.9/src/core/system_parameters/sbas_ephemeris.h000066400000000000000000000040031305042567700237160ustar00rootroot00000000000000/*! * \file sbas_ephemeris.h * \brief Interface of a SBAS REFERENCE LOCATION storage * \author Daniel Fehr, 2013. daniel.co(at)bluewin.ch * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_SBAS_EPHEMERIS_H_ #define GNSS_SDR_SBAS_EPHEMERIS_H_ /*! * \brief This class stores SBAS SV ephemeris data * */ class Sbas_Ephemeris { public: void print(std::ostream &out); int i_prn; //!< PRN number //gtime_t t0; // reference epoch time (GPST) int i_t0; //gtime_t tof; // time of message frame (GPST) double d_tof; int i_sv_ura; //!< SV accuracy (URA index), not standardized bool b_sv_do_not_use; //!< Health status (false:do not use / true:usable) double d_pos[3]; //!< Satellite position (m) (ECEF) double d_vel[3]; //!< Satellite velocity (m/s) (ECEF) double d_acc[3]; //!< Satellite acceleration (m/s^2) (ECEF) double d_af0; //!< Satellite clock-offset (s) double d_af1; //!< Satellite drift (s/s) }; #endif /* GNSS_SDR_SBAS_EPHEMERIS_H_ */ gnss-sdr-0.0.9/src/core/system_parameters/sbas_ionospheric_correction.cc000066400000000000000000000434111305042567700266520ustar00rootroot00000000000000/*! * \file sbas_ionospheric_correction.cc * \brief Implementation of the SBAS ionosphere correction set based on SBAS RTKLIB functions * \author Daniel Fehr 2013. daniel.co(at)bluewin.ch * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "sbas_ionospheric_correction.h" #include #include #include enum V_Log_Level {EVENT = 2, // logs important events which don't occur every update() call FLOW = 3, // logs the function calls of block processing functions MORE = 4}; // very detailed stuff void Sbas_Ionosphere_Correction::print(std::ostream &out) { for(std::vector::const_iterator it_band = d_bands.begin(); it_band != d_bands.end(); ++it_band) { int band = it_band - d_bands.begin(); out << "<> Band" << band << ":" << std::endl; for(std::vector::const_iterator it_igp = it_band->d_igps.begin(); it_igp != it_band->d_igps.end(); ++it_igp) { int igp = it_igp-it_band->d_igps.begin(); out << "<> -IGP" << igp << ":"; //std::cout << " valid=" << it_igp->d_valid; out << " t0=" << it_igp->t0; out << " lat=" << it_igp->d_latitude; out << " lon=" << it_igp->d_longitude; out << " give=" << it_igp->d_give; out << " delay=" << it_igp->d_delay; out << std::endl; } } } /* Applies SBAS ionosphric delay correction * \param[out] delay Slant ionospheric delay (L1) (m) * \param[out] var Variance of ionospheric delay (m^2) * \param[in] sample_stamp Sample stamp of observable on which the correction will be applied * \param[in] longitude_d Receiver's longitude in terms of WGS84 (degree) * \param[in] latitude_d Receiver's latitude in terms of WGS84 (degree) * \param[in] azimuth_d Satellite azimuth/elavation angle (rad). Azimuth is the angle of * the satellite from the user�s location measured clockwise from north * \param[in] elevation_d Elevation is the angle of the satellite from the user's location measured * with respect to the local-tangent-plane */ bool Sbas_Ionosphere_Correction::apply(double sample_stamp, double latitude_d, double longitude_d, double azimut_d, double elevation_d, double &delay, double &var) { const double GPS_PI = 3.1415926535898; //!< Pi as defined in IS-GPS-200E int result; double pos[3]; double azel[2]; // convert receiver position from degrees to rad pos[0] = latitude_d * GPS_PI / 180.0; pos[1] = longitude_d * GPS_PI / 180.0; pos[2] = 0; // is not used by sbsioncorr, for ionocorrection is a fixed earth radius assumed // convert satellite azimut and elevation from degrees to rad , use topocent to obtain it in pvt block azel[0] = azimut_d * GPS_PI / 180.0; azel[1] = elevation_d * GPS_PI / 180.0; result = sbsioncorr(sample_stamp, pos, azel, &delay, &var); return (bool)result; } /* geometric distance ---------------------------------------------------------- * compute geometric distance and receiver-to-satellite unit vector * args : double *rs I satellilte position (ecef at transmission) (m) * double *rr I receiver position (ecef at reception) (m) * double *e O line-of-sight vector (ecef) * return : geometric distance (m) (0>:error/no satellite position) * notes : distance includes sagnac effect correction *-----------------------------------------------------------------------------*/ //extern double geodist(const double *rs, const double *rr, double *e) //{ // double r; // int i; // // if (norm(rs,3)= 0) c += a[n]*b[n]; return c; } /* multiply matrix -----------------------------------------------------------*/ void Sbas_Ionosphere_Correction::matmul(const char *tr, int n, int k, int m, double alpha, const double *A, const double *B, double beta, double *C) { double d; int i, j, x, f = tr[0] == 'N' ? (tr[1] == 'N' ? 1 : 2) : (tr[1] == 'N' ? 3 : 4); for (i = 0; i < n; i++) for (j = 0; j < k; j++) { d = 0.0; switch (f) { case 1: for (x = 0; x < m; x++) d += A[i + x*n]*B[x + j*m]; break; case 2: for (x = 0; x < m; x++) d += A[i + x*n]*B[j + x*k]; break; case 3: for (x = 0; x < m; x++) d += A[x + i*m]*B[x + j*m]; break; case 4: for (x = 0; x < m; x++) d += A[x + i*m]*B[j + x*k]; break; } if (beta == 0.0) { C[i + j*n] = alpha*d; } else { C[i + j*n] = alpha*d + beta*C[i + j*n]; } } } /* ecef to local coordinate transfromation matrix ------------------------------ * compute ecef to local coordinate transfromation matrix * args : double *pos I geodetic position {lat,lon} (rad) * double *E O ecef to local coord transformation matrix (3x3) * return : none * notes : matrix stored by column-major order (fortran convention) *-----------------------------------------------------------------------------*/ void Sbas_Ionosphere_Correction::xyz2enu(const double *pos, double *E) { double sinp = sin(pos[0]), cosp = cos(pos[0]), sinl = sin(pos[1]), cosl = cos(pos[1]); E[0] = -sinl; E[3] = cosl; E[6] = 0.0; E[1] = -sinp*cosl; E[4] = -sinp*sinl; E[7] = cosp; E[2] = cosp*cosl; E[5] = cosp*sinl; E[8] = sinp; } /* transform ecef vector to local tangential coordinate ------------------------- * transform ecef vector to local tangential coordinate * args : double *pos I geodetic position {lat,lon} (rad) * double *r I vector in ecef coordinate {x,y,z} * double *e O vector in local tangental coordinate {e,n,u} * return : none *-----------------------------------------------------------------------------*/ void Sbas_Ionosphere_Correction::ecef2enu(const double *pos, const double *r, double *e) { double E[9]; xyz2enu(pos, E); matmul("NN", 3, 1, 3, 1.0, E, r, 0.0, e); } const double PI = 3.1415926535897932; /* pi */ /* 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 *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) *-----------------------------------------------------------------------------*/ double Sbas_Ionosphere_Correction::satazel(const double *pos, const double *e, double *azel) { const double RE_WGS84 = 6378137.0; /* earth semimajor axis (WGS84) (m) */ double az = 0.0, el = PI/2.0, enu[3]; if (pos[2] > -RE_WGS84) { ecef2enu(pos, e, enu); az = dot(enu, enu, 2) < 1E-12 ? 0.0 : atan2(enu[0], enu[1]); if (az < 0.0) az += 2*PI; el = asin(enu[2]); } if (azel) { azel[0] = az; azel[1] = el; } return el; } /* debug trace function -----------------------------------------------------*/ void Sbas_Ionosphere_Correction::trace(int level, const char *format, ...) { va_list ap; char str[1000]; va_start(ap,format); vsprintf(str,format,ap); va_end(ap); VLOG(FLOW) << "<> " << std::string(str); } /* ionospheric pierce point position ------------------------------------------- * compute ionospheric pierce point (ipp) position and slant factor * args : double *pos I receiver position {lat,lon,h} (rad,m) * double *azel I azimuth/elevation angle {az,el} (rad) * double re I earth radius (km) * double hion I altitude of ionosphere (km) * double *posp O pierce point position {lat,lon,h} (rad,m) * return : slant factor * notes : see ref [2], only valid on the earth surface * fixing bug on ref [2] A.4.4.10.1 A-22,23 *-----------------------------------------------------------------------------*/ double Sbas_Ionosphere_Correction::ionppp(const double *pos, const double *azel, double re, double hion, double *posp) { double cosaz, rp, ap, sinap, tanap; const double D2R = (PI/180.0); /* deg to rad */ rp = re/(re + hion)*cos(azel[1]); ap = PI/2.0 - azel[1] - asin(rp); sinap = sin(ap); tanap = tan(ap); cosaz = cos(azel[0]); posp[0] = asin(sin(pos[0])*cos(ap) + cos(pos[0])*sinap*cosaz); if ((pos[0] > 70.0*D2R && tanap*cosaz > tan(PI/2.0 - pos[0])) || (pos[0] < -70.0*D2R && - tanap*cosaz > tan(PI/2.0 + pos[0]))) { posp[1] = pos[1] + PI - asin(sinap*sin(azel[0])/cos(posp[0])); } else { posp[1] = pos[1] + asin(sinap*sin(azel[0])/cos(posp[0])); } return 1.0 / sqrt(1.0 - rp*rp); } /* variance of ionosphere correction (give=GIVEI) --------------------------*/ double Sbas_Ionosphere_Correction::varicorr(int give) { const double var[15]={ 0.0084, 0.0333, 0.0749, 0.1331, 0.2079, 0.2994, 0.4075, 0.5322, 0.6735, 0.8315, 1.1974, 1.8709, 3.326, 20.787, 187.0826 }; return 0 <= give && give < 15 ? var[give]:0.0; } /* search igps ---------------------------------------------------------------*/ void Sbas_Ionosphere_Correction::searchigp(const double *pos, const Igp **igp, double *x, double *y) { int i; int latp[2]; int lonp[4]; const double R2D = (180.0/PI); /* rad to deg */ double lat = pos[0]*R2D; double lon = pos[1]*R2D; trace(4,"searchigp: pos=%.3f %.3f",pos[0]*R2D, pos[1]*R2D); // round the pierce point position to the next IGP grid point if (lon >= 180.0) lon -= 360.0; if (-55.0 <= lat && lat < 55.0) { latp[0] = (int)floor(lat/5.0)*5; latp[1] = latp[0] + 5; lonp[0] = lonp[1] = (int)floor(lon/5.0)*5; lonp[2] = lonp[3] = lonp[0] + 5; *x = (lon - lonp[0])/5.0; *y = (lat - latp[0])/5.0; } else { latp[0] = (int)floor((lat-5.0)/10.0)*10+5; latp[1] = latp[0] + 10; lonp[0] = lonp[1] = (int)floor(lon/10.0)*10; lonp[2] = lonp[3] = lonp[0] + 10; *x = (lon - lonp[0])/10.0; *y = (lat - latp[0])/10.0; if (75.0 <= lat && lat < 85.0) { lonp[1] = (int)floor(lon/90.0)*90; lonp[3] = lonp[1] + 90; } else if (-85.0 <= lat && lat < -75.0) { lonp[0] = (int)floor((lon - 50.0)/90.0)*90 + 40; lonp[2] = lonp[0] + 90; } else if (lat >= 85.0) { for (i = 0; i < 4; i++) lonp[i] = (int)floor(lon/90.0)*90; } else if (lat <- 85.0) { for (i = 0; i < 4; i++) lonp[i] = (int)floor((lon - 50.0)/90.0)*90 + 40; } } for (i = 0; i < 4; i++) if (lonp[i] == 180) lonp[i] = -180; // find the correction data for the grid points in latp[] and lonp[] // iterate over bands for (std::vector::const_iterator band_it = this->d_bands.begin(); band_it != d_bands.end(); ++band_it) { //VLOG(MORE) << "band=" << band_it-d_bands.begin() << std::endl; // iterate over IGPs in band_it for (std::vector::const_iterator igp_it = band_it->d_igps.begin(); igp_it != band_it->d_igps.end(); ++igp_it) { std::stringstream ss; int give = igp_it->d_give; ss << "IGP: give=" << give; if(give < 15) // test if valid correction data is sent for current IGP { int lat = igp_it->d_latitude; int lon = igp_it->d_longitude; ss << " lat=" << lat << " lon=" << lon; if (lat == latp[0] && lon == lonp[0]) igp[0] = igp_it.base(); else if (lat == latp[1] && lon == lonp[1]) igp[1] = igp_it.base(); else if (lat == latp[0] && lon == lonp[2]) igp[2] = igp_it.base(); else if (lat == latp[1] && lon == lonp[3]) igp[3] = igp_it.base(); } //VLOG(MORE) << ss.str(); } } //VLOG(MORE) << "igp[0:3]={" << igp[0] << "," << igp[1] << "," << igp[2] << "," << igp[3] << "}"; } /* sbas ionospheric delay correction ------------------------------------------- * compute sbas ionosphric delay correction * args : long sample_stamp I sample stamp of observable on which the correction will be applied * sbsion_t *ion I ionospheric correction data (implicit) * double *pos I receiver position {lat,lon,height} (rad/m) * double *azel I satellite azimuth/elavation angle (rad) * double *delay O slant ionospheric delay (L1) (m) * double *var O variance of ionospheric delay (m^2) * return : status (1:ok, 0:no correction) * notes : before calling the function, sbas ionosphere correction parameters * in navigation data (nav->sbsion) must be set by calling * sbsupdatecorr() *-----------------------------------------------------------------------------*/ int Sbas_Ionosphere_Correction::sbsioncorr(const double sample_stamp, const double *pos, const double *azel, double *delay, double *var) { const double re = 6378.1363; const double hion = 350.0; int err = 0; double fp; double posp[2]; double x = 0.0; double y = 0.0; double t; double w[4] = {0}; const Igp *igp[4] = {0}; /* {ws,wn,es,en} */ const double R2D = (180.0/PI); /* rad to deg */ trace(4, "sbsioncorr: pos=%.3f %.3f azel=%.3f %.3f", pos[0]*R2D, pos[1]*R2D, azel[0]*R2D, azel[1]*R2D); *delay = *var = 0.0; if (pos[2] < -100.0 || azel[1] <= 0) return 1; /* ipp (ionospheric pierce point) position */ fp = ionppp(pos, azel, re, hion, posp); /* search igps around ipp */ searchigp(posp, igp, &x, &y); VLOG(FLOW) << "<> SBAS iono correction:" << " igp[0]=" << igp[0] << " igp[1]=" << igp[1] << " igp[2]=" << igp[2] << " igp[3]=" << igp[3] << " x=" << x << " y=" << y; /* weight of igps */ if (igp[0] && igp[1] && igp[2] && igp[3]) { w[0] = (1.0 - x)*(1.0 - y); w[1] = (1.0 - x)*y; w[2] = x*(1.0 - y); w[3] = x*y; } else if (igp[0] && igp[1] && igp[2]) { w[1] = y; w[2] = x; if ((w[0] = 1.0 - w[1] - w[2]) < 0.0) err = 1; } else if (igp[0] && igp[2] && igp[3]) { w[0] = 1.0 - x; w[3] = y; if ((w[2] = 1.0 - w[0] -w[3]) < 0.0) err = 1; } else if (igp[0] && igp[1] && igp[3]) { w[0] = 1.0 - y; w[3] = x; if ((w[1] = 1.0 - w[0] - w[3]) < 0.0) err = 1; } else if (igp[1]&&igp[2]&&igp[3]) { w[1] = 1.0 - x; w[2] = 1.0 - y; if ((w[3] = 1.0 - w[1] - w[2]) < 0.0) err = 1; } else err = 1; if (err) { trace(2, "no sbas iono correction: lat=%3.0f lon=%4.0f", posp[0]*R2D, posp[1]*R2D); return 0; } for (int i = 0; i <4 ; i++) { if (!igp[i]) continue; t = (sample_stamp - igp[i]->t0); // time diff between now and reception of the igp data in seconds *delay += w[i]*igp[i]->d_delay; *var += w[i] * varicorr(igp[i]->d_give) * 9E-8 * fabs(t); } *delay *= fp; *var *= fp*fp; trace(5, "sbsioncorr: dion=%7.2f sig=%7.2f", *delay, sqrt(*var)); return 1; } gnss-sdr-0.0.9/src/core/system_parameters/sbas_ionospheric_correction.h000066400000000000000000000175561305042567700265270ustar00rootroot00000000000000/*! * \file sbas_ionospheric_correction.h * \brief Interface of the SBAS ionosphere correction set based on SBAS RTKLIB functions * \author Daniel Fehr 2013. daniel.co(at)bluewin.ch * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 SBAS_IONOSPHERIC_CORRECTION_H_ #define SBAS_IONOSPHERIC_CORRECTION_H_ #include #include #include #include #include #include #include #include /*! * \brief Struct that represents a Ionospheric Grid Point (IGP) */ struct Igp { public: //bool d_valid; // valid==true indicates that the IGP can be used for corrections. it is set to false when a new IGP mask (MT18) has been received but no corresponding delays (MT26) double t0; // time of reception, time of correction int d_latitude; int d_longitude; int d_give; double d_delay; private: friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int version) { ar & t0; ar & d_latitude; ar & d_longitude; ar & d_give; ar & d_delay; } }; /*! * \brief Struct that represents the band of a Ionospheric Grid Point (IGP) */ struct Igp_Band { //int d_iodi; //int d_nigp; // number if IGPs in this band (defined by IGP mask from MT18) std::vector d_igps; private: friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int version) { ar & d_igps; } }; /*! * \brief Class that handles valid SBAS ionospheric correction for GPS */ class Sbas_Ionosphere_Correction { private: /* Inner product of vectors * params : double *a,*b I vector a,b (n x 1) * int n I size of vector a,b * return : a'*b */ double dot(const double *a, const double *b, int n); /* Multiply matrix */ void matmul(const char *tr, int n, int k, int m, double alpha, const double *A, const double *B, double beta, double *C); /* EFEC to local coordinate transfomartion matrix * Compute ecef to local coordinate transfomartion matrix * params : double *pos I geodetic position {lat,lon} (rad) * double *E O ecef to local coord transformation matrix (3x3) * return : none * notes : matrix stored by column-major order (fortran convention) */ void xyz2enu(const double *pos, double *E); /* Transforms ECEF vector into local tangential coordinates * params : double *pos I geodetic position {lat,lon} (rad) * double *r I vector in ecef coordinate {x,y,z} * double *e O vector in local tangental coordinate {e,n,u} * return : none */ void ecef2enu(const double *pos, const double *r, double *e); /* Compute satellite azimuth/elevation angle * params : double *pos I geodetic position {lat,lon,h} (rad,m) * double *e I receiver-to-satellilte unit vevtor (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) */ double satazel(const double *pos, const double *e, double *azel); /* Debug trace functions */ void trace(int level, const char *format, ...); /* time difference ------------------------------------------------------------- * difference between gtime_t structs * args : gtime_t t1,t2 I gtime_t structs * return : time difference (t1-t2) (s) *-----------------------------------------------------------------------------*/ //double timediff(gtime_t t1, gtime_t t2); /* Compute Ionospheric Pierce Point (IPP) position and slant factor * params : double *pos I receiver position {lat,lon,h} (rad,m) * double *azel I azimuth/elevation angle {az,el} (rad) * double re I earth radius (km) * double hion I altitude of ionosphere (km) * double *posp O pierce point position {lat,lon,h} (rad,m) * return : slant factor * notes : see ref [2], only valid on the earth surface * fixing bug on ref [2] A.4.4.10.1 A-22,23 *-----------------------------------------------------------------------------*/ double ionppp(const double *pos, const double *azel, double re, double hion, double *posp); /* Variance of ionosphere correction (give = GIVEI + 1) */ double varicorr(int give); /* Search igps */ void searchigp(const double *pos, const Igp **igp, double *x, double *y); /* Compute sbas ionospheric delay correction * params : long sample_stamp I sample stamp of observable on which the correction will be applied * sbsion_t *ion I ionospheric correction data (implicit) * double *pos I receiver position {lat,lon,height} (rad/m) * double *azel I satellite azimuth/elavation angle (rad) * double *delay O slant ionospheric delay (L1) (m) * double *var O variance of ionospheric delay (m^2) * return : status (1:ok, 0:no correction) * notes : before calling the function, sbas ionosphere correction parameters * in navigation data (nav->sbsion) must be set by callig * sbsupdatecorr() */ int sbsioncorr(const double sample_stamp, const double *pos, const double *azel, double *delay, double *var); friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int version){ar & d_bands;} public: std::vector d_bands; void print(std::ostream &out); /*! * \brief Computes SBAS ionospheric delay correction. * * \param[out] delay Slant ionospheric delay (L1) (m) * \param[out] var Variance of ionospheric delay (m^2) * \param[in] sample_stamp Sample stamp of observable on which the correction will be applied * \param[in] longitude_d Receiver's longitude in terms of WGS84 (degree) * \param[in] latitude_d Receiver's latitude in terms of WGS84 (degree) * \param[in] azimuth_d Satellite azimuth/elavation angle (rad). Azimuth is the angle of * the satellite from the user's location measured clockwise from north * \param[in] elevation_d Elevation is the angle of the satellite from the user's location measured * with respect to the local-tangent-plane */ bool apply(double sample_stamp, double latitude_d, double longitude_d, double azimut_d, double evaluation_d, double &delay, double &var); }; #endif /* SBAS_IONOSPHERIC_CORRECTION_H_ */ gnss-sdr-0.0.9/src/core/system_parameters/sbas_satellite_correction.cc000066400000000000000000000250201305042567700263120ustar00rootroot00000000000000/*! * \file sbas_satellite_correction.cc * \brief Implementation of the SBAS satellite correction set based on SBAS RTKLIB functions * \author Daniel Fehr 2013. daniel.co(at)bluewin.ch * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "sbas_satellite_correction.h" #include #include #include #include #include #define EVENT 2 // logs important events which don't occur every update() call #define FLOW 3 // logs the function calls of block processing functions #define CLIGHT 299792458.0 /* speed of light (m/s) */ #define MAXSBSAGEF 30.0 /* max age of SBAS fast correction (s) */ #define MAXSBSAGEL 1800.0 /* max age of SBAS long term corr (s) */ void Sbas_Satellite_Correction::print(std::ostream &out) { out << "<> Sbas satellite corrections for PRN" << d_prn << ":" << std::endl; print_fast_correction(out); print_long_term_correction(out); } void Sbas_Satellite_Correction::print_fast_correction(std::ostream &out) { Fast_Correction fcorr = d_fast_correction; out << "<> Fast PRN" << d_prn << ":"; if(fcorr.d_tof.is_related()) { int gps_week; double gps_sec; fcorr.d_tof.get_gps_time(gps_week, gps_sec); out << " d_t0=(week=" << gps_week << ",sec=" << gps_sec << ")"; } else { out << " d_t0=" << fcorr.d_tof.get_time_stamp(); } out << " d_prc=" << fcorr.d_prc; out << " d_rrc=" << fcorr.d_rrc; out << " d_dt=" << fcorr.d_dt; out << " d_udre=" << fcorr.d_udre; out << " d_ai=" << fcorr.d_ai; out << " d_tlat=" << fcorr.d_tlat; } void Sbas_Satellite_Correction::print_long_term_correction(std::ostream &out) { Long_Term_Correction lcorr = d_long_term_correction; out << "<> Long PRN" << d_prn << ":"; out << " d_trx=" << lcorr.d_trx; out << " i_tapp=" << lcorr.i_tapp; out << " i_vel=" << lcorr.i_vel; double *p = lcorr.d_dpos; out << " d_dpos=(x=" << p[0] << ", y=" << p[1] << ", z=" << p[2] << ")" ; double *v = lcorr.d_dvel; out << " d_dvel=(x=" << v[0] << ", y=" << v[1] << ", z=" << v[2] << ")" ; out << " d_daf0=" << lcorr.d_daf0; out << " d_daf1=" << lcorr.d_daf1; } int Sbas_Satellite_Correction::apply_fast(double sample_stamp, double &pr, double &var) { int result; double prc = 0; // pseudo range correction result = sbsfastcorr(sample_stamp, &prc, &var); pr += prc; VLOG(FLOW) << "<> fast correction applied: sample_stamp=" << sample_stamp << " prc=" << prc << " corr. pr=" << pr; return result; } int Sbas_Satellite_Correction::apply_long_term_sv_pos(double sample_stamp, double sv_pos[], double &var) { int result; double drs[3] = {0}; double ddts = 0; result = sbslongcorr(sample_stamp, drs, &ddts); for (int i = 0; i < 3; i++) sv_pos[i] += drs[i]; VLOG(FLOW) << "<> long term sv pos correction applied: sample_stamp=" << sample_stamp << " drs=(x=" << drs[0] << " y=" << drs[1] << " z=" << drs[2] << ")"; return result; } int Sbas_Satellite_Correction::apply_long_term_sv_clk(double sample_stamp, double &dts, double &var) { int result; double drs[3] = {0}; double ddts = 0; result = sbslongcorr(sample_stamp, drs, &ddts); dts += ddts; VLOG(FLOW) << "<> long term sv clock correction correction applied: sample_stamp=" << sample_stamp << " ddts=" << ddts; return result; } bool Sbas_Satellite_Correction::alarm() { return this->d_fast_correction.d_udre == 16; } /* debug trace function -----------------------------------------------------*/ void Sbas_Satellite_Correction::trace(int level, const char *format, ...) { va_list ap; char str[1000]; va_start(ap,format); vsprintf(str,format,ap); va_end(ap); VLOG(FLOW) << "<> " << std::string(str); } /* variance of fast correction (udre=UDRE+1) ---------------------------------*/ double Sbas_Satellite_Correction::varfcorr(int udre) { const double var[14] = { 0.052, 0.0924, 0.1444, 0.283, 0.4678, 0.8315, 1.2992, 1.8709, 2.5465, 3.326, 5.1968, 20.7870, 230.9661, 2078.695 }; return 0 < udre && udre <= 14 ? var[udre - 1] : 0.0; } /* fast correction degradation -----------------------------------------------*/ double Sbas_Satellite_Correction::degfcorr(int ai) { const double degf[16] = { 0.00000, 0.00005, 0.00009, 0.00012, 0.00015, 0.00020, 0.00030, 0.00045, 0.00060, 0.00090, 0.00150, 0.00210, 0.00270, 0.00330, 0.00460, 0.00580 }; return 0 < ai && ai <= 15 ? degf[ai] : 0.0058; } /* long term correction ------------------------------------------------------*/ int Sbas_Satellite_Correction::sbslongcorr(double time_stamp, double *drs, double *ddts) { double t = 0.0; int i; Long_Term_Correction lcorr = d_long_term_correction; trace(3, "sbslongcorr: prn=%2d", this->d_prn); // if (p->sat!=sat||p->lcorr.t0.time==0) continue; // compute time of applicability if(d_long_term_correction.i_vel == 1) { // time of applicability is the one sent, i.e., tapp // TODO: adapt for vel==1 case // t = tow-d_long_term_correction.i_tapp; // vel=1 -> time of applicability is sent in message, needs to be corrected for rollover which can not be done here, since the absolute gps time is unknown. see IS-GPS-200G pdf page 116 for correction /* t = (int)getbitu(msg->msg, p + 90, 13)*16 - (int)msg->tow%86400; if (t <= -43200) t += 86400; else if (t > 43200) t -= 86400; sbssat->sat[n-1].lcorr.t0 = gpst2time(msg->week, msg->tow + t);*/ } else { // time of applicability is time of reception t = time_stamp - lcorr.d_trx; // should not have any impact if vel==0 since d_dvel and d_daf1 are zero, is only used to check outdating } //t=time_stamp-lcorr.d_t0; if (fabs(t) > MAXSBSAGEL) { trace(2,"sbas long-term correction expired: sat=%2d time_stamp=%5.0f", d_prn, time_stamp); return 0; } // sv position correction for (i=0; i<3; i++) drs[i] = lcorr.d_dpos[i] + lcorr.d_dvel[i]*t; // sv clock correction correction *ddts = lcorr.d_daf0 + lcorr.d_daf1*t; trace(5, "sbslongcorr: sat=%2d drs=%7.2f%7.2f%7.2f ddts=%7.2f", d_prn, drs[0], drs[1], drs[2], *ddts * CLIGHT); return 1; /* if sbas satellite without correction, no correction applied */ //if (satsys(sat,NULL)==SYS_SBS) return 1; //trace(2,"no sbas long-term correction: %s sat=%2d\n",time_str(time,0),sat); //return 0; } /* fast correction -----------------------------------------------------------*/ int Sbas_Satellite_Correction::sbsfastcorr(double time_stamp, double *prc, double *var) #define RRCENA { double t; Fast_Correction fcorr = d_fast_correction; trace(3, "sbsfastcorr: sat=%2d", this->d_prn); //if (p->fcorr.t0.time==0) break; // time==0is only true if t0 hasn't been initialised -> it checks if the correction is valid t = (time_stamp - fcorr.d_tof.get_time_stamp()) + fcorr.d_tlat; // delta t between now and tof /* expire age of correction? */ if (fabs(t) > MAXSBSAGEF) { trace(2, "no sbas fast correction (expired): time_stamp=%f prn=%2d", time_stamp, d_prn); return 0; } /* UDRE==14 (not monitored)? */ else if(fcorr.d_udre == 15) { trace(2,"no sbas fast correction (not monitored): time_stamp=%f prn=%2d", time_stamp, d_prn); return 0; } else if(fcorr.d_udre == 16) { trace(2,"SV is marked as unhealthy: time_stamp=%f prn=%2d", time_stamp, d_prn); return 0; } *prc = fcorr.d_prc; #ifdef RRCENA if (fcorr.d_ai > 0 && fabs(t) <= 8.0*fcorr.d_dt) { *prc += fcorr.d_rrc*t; } #endif *var = varfcorr(fcorr.d_udre) + degfcorr(fcorr.d_ai) * t * t / 2.0; trace(5, "sbsfastcorr: sat=%3d prc=%7.2f sig=%7.2f t=%5.0f", d_prn, *prc, sqrt(*var), t); return 1; } /* sbas satellite ephemeris and clock correction ------------------------------- * correct satellite position and clock bias with sbas satellite corrections * args : long time_stamp I reception time stamp * double *rs IO sat position and corrected {x,y,z} (ecef) (m) * double *dts IO sat clock bias and corrected (s) * double *var O sat position and clock variance (m^2) * return : status (1:ok,0:no correction) * notes : before calling the function, sbas satellite correction parameters * in navigation data (nav->sbssat) must be set by callig * sbsupdatecorr(). * satellite clock correction include long-term correction and fast * correction. * sbas clock correction is usually based on L1C/A code. TGD or DCB has * to be considered for other codes *-----------------------------------------------------------------------------*/ int Sbas_Satellite_Correction::sbssatcorr(double time_stamp, double *rs, double *dts, double *var) { double drs[3] = {0}, dclk = 0.0, prc = 0.0; int i; trace(3,"sbssatcorr : sat=%2d",d_prn); /* sbas long term corrections */ if (!sbslongcorr(time_stamp, drs, &dclk)) { return 0; } /* sbas fast corrections */ if (!sbsfastcorr(time_stamp, &prc, var)) { return 0; } for (i = 0; i < 3; i++) rs[i] += drs[i]; dts[0] += dclk + prc/CLIGHT; trace(5, "sbssatcorr: sat=%2d drs=%6.3f %6.3f %6.3f dclk=%.3f %.3f var=%.3f", d_prn, drs[0], drs[1], drs[2], dclk,prc/CLIGHT, *var); return 1; } gnss-sdr-0.0.9/src/core/system_parameters/sbas_satellite_correction.h000066400000000000000000000106011305042567700261530ustar00rootroot00000000000000/*! * \file sbas_satellite_correction.h * \brief Interface of the SBAS satellite correction set based on SBAS RTKLIB functions * \author Daniel Fehr 2013. daniel.co(at)bluewin.ch * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_SBAS_SATELLITE_CORRECTION_H_ #define GNSS_SDR_SBAS_SATELLITE_CORRECTION_H_ #include "sbas_time.h" struct Fast_Correction { Sbas_Time d_tof; // for fast corrections the time of applicability (tof) is defined as the time when the corresponding message was send double d_prc; double d_rrc; double d_dt; int d_udre; // UDRE int d_ai; int d_tlat; }; struct Long_Term_Correction { double d_trx; //!< Time when message was received int i_tapp; //!< Time of applicability (only valid if vel=1, equals the sent t0) int i_vel; //!< Use velocity corrections if vel=1 int d_iode; double d_dpos[3]; //!< position correction double d_dvel[3]; //!< velocity correction double d_daf0; //!< clock offset correction double d_daf1; //!< clock drift correction }; /*! * \brief Valid long and fast term SBAS corrections for one SV */ class Sbas_Satellite_Correction { public: int d_prn; Fast_Correction d_fast_correction; Long_Term_Correction d_long_term_correction; void print(std::ostream &out); void print_fast_correction(std::ostream &out); void print_long_term_correction(std::ostream &out); int apply_fast(double sample_stamp, double &pr, double &var); int apply_long_term_sv_pos(double sample_stamp, double sv_pos[], double &var); int apply_long_term_sv_clk(double sample_stamp, double &dts, double &var); bool alarm(); private: /* debug trace functions -----------------------------------------------------*/ void trace(int level, const char *format, ...); /* variance of fast correction (udre=UDRE+1) ---------------------------------*/ double varfcorr(int udre); /* fast correction degradation -----------------------------------------------*/ double degfcorr(int ai); /* long term correction ------------------------------------------------------*/ int sbslongcorr(double time_stamp, double *drs, double *ddts); /* fast correction -----------------------------------------------------------*/ int sbsfastcorr(double time_stamp, double *prc, double *var); /* sbas satellite ephemeris and clock correction ------------------------------- * correct satellite position and clock bias with sbas satellite corrections * args : long time_stamp I reception time stamp * double *rs IO sat position and corrected {x,y,z} (ecef) (m) * double *dts IO sat clock bias and corrected (s) * double *var O sat position and clock variance (m^2) * return : status (1:ok,0:no correction) * notes : before calling the function, sbas satellite correction parameters * in navigation data (nav->sbssat) must be set by callig * sbsupdatecorr(). * satellite clock correction include long-term correction and fast * correction. * sbas clock correction is usually based on L1C/A code. TGD or DCB has * to be considered for other codes *-----------------------------------------------------------------------------*/ int sbssatcorr(double time_stamp, double *rs, double *dts, double *var); }; #endif /* GNSS_SDR_SBAS_SATELLITE_CORRECTION_H_ */ gnss-sdr-0.0.9/src/core/system_parameters/sbas_telemetry_data.cc000066400000000000000000001121571305042567700251100ustar00rootroot00000000000000/*! * \file sbas_telemetry_data.cc * \brief Implementation of the SBAS telemetry parser based on SBAS RTKLIB functions * \author Daniel Fehr 2013. daniel.co(at)bluewin.ch * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include "sbas_telemetry_data.h" #include "sbas_ionospheric_correction.h" #include "sbas_satellite_correction.h" #include "sbas_ephemeris.h" // logging levels #define EVENT 2 // logs important events which don't occur every update() call #define FLOW 3 // logs the function calls of block processing functions #define DETAIL 4 Sbas_Telemetry_Data::Sbas_Telemetry_Data() { fp_trace = nullptr; // file pointer of trace level_trace = 0; // level of trace tick_trace = 0; // tick time at traceopen (ms) d_nav.sbssat.iodp = -1; // make sure that in any case iodp is not equal to the received one prn_mask_changed(); // invalidate all satellite corrections for(size_t band = 0; band < sizeof(d_nav.sbsion)/sizeof(sbsion_t); band++) { d_nav.sbsion[band].iodi = -1; // make sure that in any case iodi is not equal to the received one igp_mask_changed(band); } } Sbas_Telemetry_Data::~Sbas_Telemetry_Data() { } int Sbas_Telemetry_Data::update(Sbas_Raw_Msg sbas_raw_msg) { VLOG(FLOW) << "<> Sbas_Telemetry_Data.update():"; int parsing_result; // if GPS time from MT12 is known (automatically handled by relate()): // express the rx time in terms of GPS time sbas_raw_msg.relate(mt12_time_ref); int mt = sbas_raw_msg.get_msg_type(); // update internal state if(mt == 12) parsing_result = decode_mt12(sbas_raw_msg); //else if(mt == 9) parsing_result = parse_mt9(sbas_raw_msg); else { // use RTKLIB to parse the message -> updates d_nav structure sbsmsg_t sbas_raw_msg_rtklib; std::vector msg_bytes = sbas_raw_msg.get_msg(); // cast raw message to RTKLIB raw message struct sbas_raw_msg_rtklib.prn = sbas_raw_msg.get_prn(); //sbas_raw_msg_rtklib.tow = sbas_raw_msg.get_tow(); //sbas_raw_msg_rtklib.week = sbas_raw_msg.get_week(); sbas_raw_msg_rtklib.sample_stamp = sbas_raw_msg.get_sample_stamp(); for (std::vector::const_iterator it = msg_bytes.begin(); it != msg_bytes.end() - 3; ++it) { int i = it - msg_bytes.begin(); sbas_raw_msg_rtklib.msg[i] = *it; } parsing_result = sbsupdatecorr(&sbas_raw_msg_rtklib, &d_nav); VLOG(FLOW) << "<> RTKLIB parsing result: " << parsing_result; } // update gnss-sdr correction data sets from RTKLIB d_nav structure, emit SBAS data into queues switch (parsing_result) { case -1: VLOG(FLOW) << "message parsing problem for MT" << sbas_raw_msg.get_msg_type(); break; case 2: case 3: case 4: case 5: case 6: case 7: case 24: case 25: updated_satellite_corrections(); break; case 18: break; // new iono band mask received -> dont update iono corrections because delays are not case 26: received_iono_correction(); break; case 9: /*updated_sbas_ephemeris(sbas_raw_msg);*/ break; default: break; } // send it to raw message queue //TODO: update to new GNURadio msg queue //if(raw_msg_queue != nullptr) raw_msg_queue->push(sbas_raw_msg); return parsing_result; } unsigned int getbitu(const unsigned char *buff, int pos, int len); int getbits(const unsigned char *buff, int pos, int len); int Sbas_Telemetry_Data::decode_mt12(Sbas_Raw_Msg sbas_raw_msg) { const double rx_delay = 38000.0/300000.0; // estimated sbas signal geosat to ground signal travel time unsigned char * msg = sbas_raw_msg.get_msg().data(); uint32_t gps_tow = getbitu(msg, 121, 20); uint32_t gps_week = getbitu(msg, 141, 10) + 1024; // consider last gps time week overflow double gps_tow_rx = double(gps_tow) + rx_delay; mt12_time_ref = Sbas_Time_Relation(sbas_raw_msg.get_sample_stamp(), gps_week, gps_tow_rx); VLOG(FLOW) << "<> extracted GPS time from MT12: gps_tow=" << gps_tow << " gps_week=" << gps_week; return 12; } void Sbas_Telemetry_Data::updated_sbas_ephemeris(Sbas_Raw_Msg msg) { VLOG(FLOW) << "<> updated_sbas_ephemeris():" << std::endl; Sbas_Ephemeris seph; int satidx = msg.get_prn() - MINPRNSBS; seph_t seph_rtklib = d_nav.seph[satidx]; // copy data seph.i_prn = msg.get_prn(); seph.i_t0 = seph_rtklib.t0; seph.d_tof = seph_rtklib.tof; seph.i_sv_ura = seph_rtklib.sva; seph.b_sv_do_not_use = seph_rtklib.svh; memcpy(seph.d_pos, seph_rtklib.pos, sizeof(seph.d_pos)); memcpy(seph.d_vel, seph_rtklib.vel, sizeof(seph.d_vel)); memcpy(seph.d_acc, seph_rtklib.acc, sizeof(seph.d_acc)); seph.d_af0 = seph_rtklib.af0; seph.d_af1 = seph_rtklib.af1; // print ephemeris for debugging purposes std::stringstream ss; seph.print(ss); VLOG(FLOW) << ss.str(); //todo_Update to new GNURadio msg queue //if(ephemeris_queue != nullptr) ephemeris_queue->push(seph); } void Sbas_Telemetry_Data::received_iono_correction() { VLOG(FLOW) << "<> received_iono_correction():"; std::stringstream ss; Sbas_Ionosphere_Correction iono_corr; for (size_t i_band = 0; i_band < sizeof(d_nav.sbsion)/sizeof(sbsion_t); i_band++) { ss << "<> band=" << i_band << " nigp=" << d_nav.sbsion[i_band].nigp << std::endl; ss << "<> -> valid igps:"; Igp_Band igp_band; for (int i_igp = 0; i_igp < d_nav.sbsion[i_band].nigp; i_igp++) { if(d_nav.sbsion[i_band].igp[i_igp].valid) { // consider only valid IGPs, i.e, such ones which got updated at least once since instantiating sbas_telemtry_data ss << " " << i_igp; Igp igp; igp.t0 = d_nav.sbsion[i_band].igp[i_igp].t0; igp.d_latitude = d_nav.sbsion[i_band].igp[i_igp].lat; igp.d_longitude = d_nav.sbsion[i_band].igp[i_igp].lon; igp.d_give = d_nav.sbsion[i_band].igp[i_igp].give; igp.d_delay = d_nav.sbsion[i_band].igp[i_igp].delay; igp_band.d_igps.push_back(igp); } } ss << std::endl; iono_corr.d_bands.push_back(igp_band); } VLOG(DETAIL) << ss.str(); ss.str(""); iono_corr.print(ss); VLOG(EVENT) << ss.str(); // send to SBAS ionospheric correction queue //todo_Update to new GNURadio msg queue //if(iono_queue != nullptr) iono_queue->push(iono_corr); } // helper for comparing two POD structures with undefined padding between members // not guaranteed to work always properly -> don't use it for critical tasks template inline bool are_equal(const Struct &s1, const Struct &s2) { const size_t struct_size = sizeof(Struct); bool is_equal = true; bool is_equal_manual = true; std::stringstream ss; Struct *s1_; Struct *s2_; // reserve zero initialised memory s1_ = (Struct*) calloc (1, struct_size); s2_ = (Struct*) calloc (1, struct_size); // use assignment constructor which doesn't copy paddings *s1_ = s1; *s2_ = s2; // compare struct memory byte-wise is_equal_manual = true; ss.str(); ss << "\n<> compare objects of size=" << sizeof(Struct) << " (memcmp says is_equal=" << is_equal << ") :" << std::endl; for (size_t i = 0; i < sizeof(Struct); ++i) { char byte1 = ((char *)s1_)[i]; char byte2 = ((char *)s2_)[i]; if(byte1 != byte2) is_equal_manual = false; ss << "<> s1=" << std::hex << std::setw(4) << std::setfill('0'); ss << (short)byte1; ss << " s2=" << std::hex << std::setw(4) << std::setfill('0'); ss << (short)byte2; ss << " equal=" << is_equal_manual; ss << std::endl; } free(s1_); free(s2_); return is_equal_manual; } void Sbas_Telemetry_Data::updated_satellite_corrections() { VLOG(FLOW) << "<> updated_satellite_corrections():"; // for each satellite in the RTKLIB structure for (int i_sat = 0; i_sat < d_nav.sbssat.nsat; i_sat++) { std::stringstream ss; ss << "<> sat=" << d_nav.sbssat.sat[i_sat].sat << " fastcorr.valid=" << d_nav.sbssat.sat[i_sat].fcorr.valid << " lcorr.valid=" << d_nav.sbssat.sat[i_sat].lcorr.valid; if(is_rtklib_sat_correction_valid(i_sat)) // check if ever updated by a received message { int prn = d_nav.sbssat.sat[i_sat].sat; // get fast correction from RTKLIB structure sbsfcorr_t fcorr_rtklib = d_nav.sbssat.sat[i_sat].fcorr; Fast_Correction fcorr; fcorr.d_tof = Sbas_Time(fcorr_rtklib.t0, mt12_time_ref); fcorr.d_prc = fcorr_rtklib.prc; fcorr.d_rrc = fcorr_rtklib.rrc; fcorr.d_dt = fcorr_rtklib.dt; fcorr.d_udre = fcorr_rtklib.udre; // UDRE fcorr.d_ai = fcorr_rtklib.ai; fcorr.d_tlat = d_nav.sbssat.tlat; // get long term correction from RTKLIB structure sbslcorr_t lcorr_rtklib = d_nav.sbssat.sat[i_sat].lcorr; Long_Term_Correction lcorr; lcorr.d_trx = lcorr_rtklib.trx; lcorr.i_tapp = lcorr_rtklib.tapp; lcorr.i_vel = lcorr_rtklib.vel; lcorr.d_iode = lcorr_rtklib.iode; memcpy(lcorr.d_dpos, lcorr_rtklib.dpos, sizeof(lcorr.d_dpos)); memcpy(lcorr.d_dvel, lcorr_rtklib.dvel, sizeof(lcorr.d_dvel)); lcorr.d_daf0 = lcorr_rtklib.daf0; lcorr.d_daf1= lcorr_rtklib.daf1; bool fast_correction_updated = false; bool long_term_correction_updated = false; // check if fast corrections got updated std::map::iterator it_old_fcorr = emitted_fast_corrections.find(prn); if(it_old_fcorr == emitted_fast_corrections.end() || !are_equal < Fast_Correction>(fcorr, it_old_fcorr->second )) { // got updated ss << " fast_correction_updated=" << true; //ss << " not_found=" << (it_old_fcorr == emitted_fast_corrections.end()); //ss << " not_equal=" << (!are_equal(fcorr, it_old_fcorr->second )); fast_correction_updated = true; emitted_fast_corrections[prn] = fcorr; } // check if long term corrections got updated std::map::iterator it_old_lcorr = emitted_long_term_corrections.find(prn); if(it_old_lcorr == emitted_long_term_corrections.end() || !are_equal < Long_Term_Correction>(lcorr, it_old_lcorr->second )) { // got updated ss << " long_term_correction_updated=" << true; //ss << " not_found=" << (it_old_lcorr == emitted_long_term_corrections.end()); //ss << " not_equal=" << (!are_equal(lcorr, it_old_lcorr->second )); long_term_correction_updated = true; emitted_long_term_corrections[prn] = lcorr; } Sbas_Satellite_Correction sbas_satelite_correction; sbas_satelite_correction.d_prn = prn; sbas_satelite_correction.d_fast_correction = fcorr; sbas_satelite_correction.d_long_term_correction = lcorr; if(fast_correction_updated) { ss << std::endl; sbas_satelite_correction.print_fast_correction(ss << " "); } if(long_term_correction_updated) { ss << std::endl; sbas_satelite_correction.print_long_term_correction(ss << " "); } if(fast_correction_updated || long_term_correction_updated) { //todo_Update to new GNURadio msg queue //if(sat_corr_queue != nullptr) sat_corr_queue->push(sbas_satelite_correction); } } VLOG(FLOW) << ss.str(); ss.str(""); } } const double Sbas_Telemetry_Data::gpst0[] = {1980, 1, 6, 0, 0, 0}; /* gps time reference */ /* debug trace function -----------------------------------------------------*/ void Sbas_Telemetry_Data::trace(int level, const char *format, ...) { va_list ap; char str[1000]; va_start(ap, format); vsprintf(str, format, ap); va_end(ap); VLOG(FLOW) << "<> " << std::string(str); } /* satellite system+prn/slot number to satellite number ------------------------ * convert satellite system+prn/slot number to satellite number * args : int sys I satellite system (SYS_GPS,SYS_GLO,...) * int prn I satellite prn/slot number * return : satellite number (0:error) *-----------------------------------------------------------------------------*/ int Sbas_Telemetry_Data::satno(int sys, int prn) { if (prn <= 0) return 0; switch (sys) { case SYS_GPS: if (prn < MINPRNGPS || MAXPRNGPS < prn) return 0; return prn - MINPRNGPS + 1; case SYS_GLO: if (prn < MINPRNGLO || MAXPRNGLO < prn) return 0; return NSATGPS + prn - MINPRNGLO + 1; case SYS_GAL: if (prn < MINPRNGAL || MAXPRNGAL < prn) return 0; return NSATGPS + NSATGLO + prn - MINPRNGAL + 1; case SYS_QZS: if (prn < MINPRNQZS || MAXPRNQZS < prn) return 0; return NSATGPS + NSATGLO + NSATGAL + prn - MINPRNQZS + 1; case SYS_CMP: if (prn < MINPRNCMP || MAXPRNCMP < prn) return 0; return NSATGPS + NSATGLO + NSATGAL + NSATQZS + prn - MINPRNCMP + 1; case SYS_SBS: if (prn < MINPRNSBS || MAXPRNSBS < prn) return 0; return NSATGPS + NSATGLO + NSATGAL + NSATQZS + NSATCMP + prn - MINPRNSBS + 1; } return 0; } /*! * \brief Extracts unsigned/signed bits from byte data * params : unsigned char *buff I byte data * int pos I bit position from start of data (bits) * int len I bit length (bits) (len<=32) * return : extracted unsigned/signed bits */ unsigned int Sbas_Telemetry_Data::getbitu(const unsigned char *buff, int pos, int len) { unsigned int bits = 0; int i; for (i = pos; i < pos + len; i++) bits = (bits << 1) + ((buff[i/8] >> (7 - i % 8)) & 1u); return bits; } int Sbas_Telemetry_Data::getbits(const unsigned char *buff, int pos, int len) { unsigned int bits = getbitu(buff,pos,len); if (len <= 0 || 32 <= len || !(bits & (1u << (len - 1)))) return (int)bits; return (int)(bits|(~0u << len)); /* extend sign */ } /* convert calendar day/time to time ------------------------------------------- * convert calendar day/time to gtime_t struct * args : double *ep I day/time {year,month,day,hour,min,sec} * return : gtime_t struct * notes : proper in 1970-2037 or 1970-2099 (64bit time_t) *-----------------------------------------------------------------------------*/ Sbas_Telemetry_Data::gtime_t Sbas_Telemetry_Data::epoch2time(const double *ep) { const int doy[] = {1, 32, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}; gtime_t time = gtime_t(); int days, sec, year = (int)ep[0], mon = (int)ep[1], day = (int)ep[2]; if (year < 1970 || 2099 < year || mon < 1 || 12 < mon) return time; /* leap year if year%4==0 in 1901-2099 */ days = (year - 1970)*365 + (year - 1969)/4 + doy[mon - 1] + day - 2 + (year % 4 == 0 && mon >= 3 ? 1 : 0); sec = (int)floor(ep[5]); time.time = (time_t)days*86400 + (int)ep[3]*3600 + (int)ep[4]*60 + sec; time.sec = ep[5] - sec; return time; } /* time difference ------------------------------------------------------------- * difference between gtime_t structs * args : gtime_t t1,t2 I gtime_t structs * return : time difference (t1-t2) (s) *-----------------------------------------------------------------------------*/ double Sbas_Telemetry_Data::timediff(gtime_t t1, gtime_t t2) { return difftime(t1.time, t2.time) + t1.sec - t2.sec; } /* gps time to time ------------------------------------------------------------ * convert week and tow in gps time to gtime_t struct * args : int week I week number in gps time * double sec I time of week in gps time (s) * return : gtime_t struct *-----------------------------------------------------------------------------*/ Sbas_Telemetry_Data::gtime_t Sbas_Telemetry_Data::gpst2time(int week, double sec) { gtime_t t = epoch2time(gpst0); if (sec < -1E9 || 1E9 < sec) sec = 0.0; t.time += 86400*7*week + (int)sec; t.sec = sec - (int)sec; return t; } /* sbas igp definition -------------------------------------------------------*/ const short Sbas_Telemetry_Data::x1[] = {-75,-65,-55,-50,-45,-40,-35,-30,-25,-20,-15,-10,- 5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 65, 75, 85}, Sbas_Telemetry_Data::x2[] = {-55,-50,-45,-40,-35,-30,-25,-20,-15,-10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55}, Sbas_Telemetry_Data::x3[] = {-75,-65,-55,-50,-45,-40,-35,-30,-25,-20,-15,-10,- 5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 65, 75}, Sbas_Telemetry_Data::x4[] = {-85,-75,-65,-55,-50,-45,-40,-35,-30,-25,-20,-15,-10,- 5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 65, 75}, Sbas_Telemetry_Data::x5[] = {-180,-175,-170,-165,-160,-155,-150,-145,-140,-135,-130,-125,-120,-115, -110,-105,-100,- 95,- 90,- 85,- 80,- 75,- 70,- 65,- 60,- 55,- 50,- 45, - 40,- 35,- 30,- 25,- 20,- 15,- 10,- 5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, 115, 120, 125, 130, 135, 140, 145, 150, 155, 160, 165, 170, 175}, Sbas_Telemetry_Data::x6[] = {-180,-170,-160,-150,-140,-130,-120,-110,-100,- 90,- 80,- 70,- 60,- 50, -40, -30, -20, -10, 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170}, Sbas_Telemetry_Data::x7[] = {-180,-150,-120,- 90,- 60,- 30, 0, 30, 60, 90, 120, 150}, Sbas_Telemetry_Data::x8[] = {-170,-140,-110,- 80,- 50,- 20, 10, 40, 70, 100, 130, 160}; const Sbas_Telemetry_Data::sbsigpband_t Sbas_Telemetry_Data::igpband1[9][8] = { /* band 0-8 */ {{-180,x1, 1, 28},{-175,x2, 29, 51},{-170,x3, 52, 78},{-165,x2, 79,101}, {-160,x3,102,128},{-155,x2,129,151},{-150,x3,152,178},{-145,x2,179,201}}, {{-140,x4, 1, 28},{-135,x2, 29, 51},{-130,x3, 52, 78},{-125,x2, 79,101}, {-120,x3,102,128},{-115,x2,129,151},{-110,x3,152,178},{-105,x2,179,201}}, {{-100,x3, 1, 27},{- 95,x2, 28, 50},{- 90,x1, 51, 78},{- 85,x2, 79,101}, {- 80,x3,102,128},{- 75,x2,129,151},{- 70,x3,152,178},{- 65,x2,179,201}}, {{- 60,x3, 1, 27},{- 55,x2, 28, 50},{- 50,x4, 51, 78},{- 45,x2, 79,101}, {- 40,x3,102,128},{- 35,x2,129,151},{- 30,x3,152,178},{- 25,x2,179,201}}, {{- 20,x3, 1, 27},{- 15,x2, 28, 50},{- 10,x3, 51, 77},{- 5,x2, 78,100}, { 0,x1,101,128},{ 5,x2,129,151},{ 10,x3,152,178},{ 15,x2,179,201}}, {{ 20,x3, 1, 27},{ 25,x2, 28, 50},{ 30,x3, 51, 77},{ 35,x2, 78,100}, { 40,x4,101,128},{ 45,x2,129,151},{ 50,x3,152,178},{ 55,x2,179,201}}, {{ 60,x3, 1, 27},{ 65,x2, 28, 50},{ 70,x3, 51, 77},{ 75,x2, 78,100}, { 80,x3,101,127},{ 85,x2,128,150},{ 90,x1,151,178},{ 95,x2,179,201}}, {{ 100,x3, 1, 27},{ 105,x2, 28, 50},{ 110,x3, 51, 77},{ 115,x2, 78,100}, { 120,x3,101,127},{ 125,x2,128,150},{ 130,x4,151,178},{ 135,x2,179,201}}, {{ 140,x3, 1, 27},{ 145,x2, 28, 50},{ 150,x3, 51, 77},{ 155,x2, 78,100}, { 160,x3,101,127},{ 165,x2,128,150},{ 170,x3,151,177},{ 175,x2,178,200}} }; const Sbas_Telemetry_Data::sbsigpband_t Sbas_Telemetry_Data::igpband2[2][5] = { /* band 9-10 */ {{ 60,x5, 1, 72},{ 65,x6, 73,108},{ 70,x6,109,144},{ 75,x6,145,180}, { 85,x7,181,192}}, {{- 60,x5, 1, 72},{- 65,x6, 73,108},{- 70,x6,109,144},{- 75,x6,145,180}, {- 85,x8,181,192}} }; /* decode type 1: prn masks --------------------------------------------------*/ int Sbas_Telemetry_Data::decode_sbstype1(const sbsmsg_t *msg, sbssat_t *sbssat) { int i, n, sat; // see figure A-6: i corresponds to bit number (and for the GPS satellites is identically to the PRN), n to the PRN mask number trace(4, "decode_sbstype1:"); for (i = 1, n = 0; i <= 210 && n < MAXSAT; i++) { if (getbitu(msg->msg, 13 + i, 1)) { if (i <= 37) sat = satno(SYS_GPS, i); /* 0 - 37: gps */ else if (i <= 61) sat = satno(SYS_GLO, i - 37); /* 38 - 61: glonass */ else if (i <= 119) sat = 0; /* 62 - 119: future gnss */ else if (i <= 138) sat = satno(SYS_SBS, i); /* 120 - 138: geo/waas */ else if (i <= 182) sat = 0; /* 139 - 182: reserved */ else if (i <= 192) sat = satno(SYS_SBS, i + 10); /* 183 - 192: qzss ref [2] */ else if (i <= 202) sat = satno(SYS_QZS, i); /* 193 - 202: qzss ref [2] */ else sat = 0; /* 203 - : reserved */ sbssat->sat[n++].sat = sat; } } // TODO consider the use of the old prn mask in the transition phase such that old data sets still can be used int new_iodp = getbitu(msg->msg, 224, 2); if (sbssat->iodp != new_iodp) prn_mask_changed(); // invalidate all satellite corrections sbssat->iodp = new_iodp; sbssat->nsat = n; trace(5, "decode_sbstype1: nprn=%d iodp=%d", n, sbssat->iodp); return 1; } /* decode type 2-5,0: fast corrections ---------------------------------------*/ int Sbas_Telemetry_Data::decode_sbstype2(const sbsmsg_t *msg, sbssat_t *sbssat) { int i, j, iodf, type, udrei; double prc, dt; double t0_past; trace(4,"decode_sbstype2:"); if (sbssat->iodp != (int)getbitu(msg->msg, 16, 2)) return 0; type = getbitu(msg->msg, 8, 6); iodf = getbitu(msg->msg, 14, 2); for (i=0; i<13; i++) { if ((j = 13*((type == 0 ? 2 : type) - 2) + i) >= sbssat->nsat) break; udrei = getbitu(msg->msg, 174 + 4*i, 4); t0_past = sbssat->sat[j].fcorr.t0; prc = sbssat->sat[j].fcorr.prc; sbssat->sat[j].fcorr.t0 = msg->sample_stamp; sbssat->sat[j].fcorr.prc = getbits(msg->msg, 18 + i*12, 12)*0.125f; sbssat->sat[j].fcorr.udre = udrei + 1; dt = sbssat->sat[j].fcorr.t0 - t0_past; if (!sbssat->sat[j].fcorr.valid || dt <= 0.0 || 18.0 < dt || sbssat->sat[j].fcorr.ai == 0) { sbssat->sat[j].fcorr.rrc = 0.0; sbssat->sat[j].fcorr.dt = 0.0; } else { sbssat->sat[j].fcorr.rrc = (sbssat->sat[j].fcorr.prc - prc)/dt; sbssat->sat[j].fcorr.dt = dt; } sbssat->sat[j].fcorr.valid = true; sbssat->sat[j].fcorr.iodf = iodf; } trace(5, "decode_sbstype2: type=%d iodf=%d", type, iodf); return 1; } /* decode type 6: integrity info ---------------------------------------------*/ int Sbas_Telemetry_Data::decode_sbstype6(const sbsmsg_t *msg, sbssat_t *sbssat) { int i, iodf[4], udrei; trace(4, "decode_sbstype6:"); if(sbssat->iodp < 0) return 0; for (i=0; i<4; i++) { iodf[i] = getbitu(msg->msg, 14 + i*2, 2); } for (i=0; i < sbssat->nsat && i < MAXSAT; i++) { if (!sbssat->sat[i].fcorr.valid || sbssat->sat[i].fcorr.iodf != iodf[i/13]) continue; udrei = getbitu(msg->msg, 22 + i*4, 4); sbssat->sat[i].fcorr.udre = udrei + 1; } trace(5, "decode_sbstype6: iodf=%d %d %d %d", iodf[0], iodf[1], iodf[2], iodf[3]); return 1; } /* decode type 7: fast correction degradation factor -------------------------*/ int Sbas_Telemetry_Data::decode_sbstype7(const sbsmsg_t *msg, sbssat_t *sbssat) { int i; trace(4,"decode_sbstype7"); if (sbssat->iodp != (int)getbitu(msg->msg, 18, 2)) return 0; sbssat->tlat = getbitu(msg->msg, 14, 4); for (i=0; i < sbssat->nsat && i < MAXSAT; i++) { sbssat->sat[i].fcorr.ai = getbitu(msg->msg, 22 + i*4, 4); } return 1; } /* decode type 9: geo navigation message -------------------------------------*/ int Sbas_Telemetry_Data::decode_sbstype9(const sbsmsg_t *msg, nav_t *nav) { seph_t seph; int i; int sat; trace(4,"decode_sbstype9:"); if (!(sat = satno(SYS_SBS, msg->prn))) { trace(2, "invalid prn in sbas type 9: prn=%3d", msg->prn); return 0; } /*t=(int)getbitu(msg->msg,22,13)*16-(int)msg->tow%86400; if (t<=-43200) t+=86400; else if (t> 43200) t-=86400;*/ //seph.t0 =gpst2time(msg->week,msg->tow+t); seph.sat = sat; seph.t0 = getbitu(msg->msg, 22, 13)*16; seph.tof = msg->sample_stamp; seph.sva = getbitu(msg->msg, 35, 4); seph.svh = seph.sva == 15 ? 1 : 0; /* unhealthy if ura==15 */ seph.pos[0] = getbits(msg->msg, 39, 30)*0.08; seph.pos[1] = getbits(msg->msg, 69, 30)*0.08; seph.pos[2] = getbits(msg->msg, 99, 25)*0.4; seph.vel[0] = getbits(msg->msg, 124, 17)*0.000625; seph.vel[1] = getbits(msg->msg, 141, 17)*0.000625; seph.vel[2] = getbits(msg->msg, 158, 18)*0.004; seph.acc[0] = getbits(msg->msg, 176, 10)*0.0000125; seph.acc[1] = getbits(msg->msg, 186, 10)*0.0000125; seph.acc[2] = getbits(msg->msg, 196, 10)*0.0000625; seph.af0 = getbits(msg->msg, 206, 12)*P2_31; seph.af1 = getbits(msg->msg, 218, 8)*P2_39/2.0; i = msg->prn-MINPRNSBS; if (std::abs(nav->seph[i].t0 - seph.t0) < 1E-3) { /* not change */ VLOG(FLOW) << "<> no change in ephemeris -> won't parse"; return 0; } nav->seph[NSATSBS + i] = nav->seph[i]; /* previous */ nav->seph[i] = seph; /* current */ trace(5, "decode_sbstype9: prn=%d", msg->prn); return 1; } /* decode type 18: ionospheric grid point masks ------------------------------*/ int Sbas_Telemetry_Data::decode_sbstype18(const sbsmsg_t *msg, sbsion_t *sbsion) { const sbsigpband_t *p; int i, j, n, m, band = getbitu(msg->msg, 18, 4); trace(4, "decode_sbstype18:"); if (0 <= band && band <= 8) {p = igpband1[band]; m = 8;} else if (9 <= band && band <= 10) {p = igpband2[band - 9]; m = 5;} else return 0; short iodi_new = (short)getbitu(msg->msg, 22, 2); if(sbsion[band].iodi != iodi_new) { // IGP mask changed -> invalidate all IGPs in this band igp_mask_changed(band); } sbsion[band].iodi = iodi_new; for (i=1, n=0; i <= 201; i++) { if (!getbitu(msg->msg, 23 + i, 1)) continue; for (j = 0; j < m; j++) { if (i < p[j].bits || p[j].bite < i) continue; sbsion[band].igp[n].lat = band <= 8 ? p[j].y[i - p[j].bits] : p[j].x; sbsion[band].igp[n++].lon = band <= 8 ? p[j].x : p[j].y[i - p[j].bits]; break; } } sbsion[band].nigp = n; trace(5, "decode_sbstype18: band=%d nigp=%d", band, n); return 1; } /* decode half long term correction (vel code=0) -----------------------------*/ int Sbas_Telemetry_Data::decode_longcorr0(const sbsmsg_t *msg, int p, sbssat_t *sbssat) { int i, n = getbitu(msg->msg, p, 6); trace(4, "decode_longcorr0:"); if (n == 0 || n > MAXSAT) return 0; sbssat->sat[n - 1].lcorr.iode = getbitu(msg->msg, p + 6, 8); for (i = 0; i < 3; i++) { sbssat->sat[n - 1].lcorr.dpos[i] = getbits(msg->msg, p + 14 + 9*i, 9)*0.125; sbssat->sat[n - 1].lcorr.dvel[i] = 0.0; } sbssat->sat[n - 1].lcorr.daf0 = getbits(msg->msg, p + 41, 10)*P2_31; sbssat->sat[n - 1].lcorr.daf1 = 0.0; //sbssat->sat[n-1].lcorr.t0=gpst2time(msg->week,msg->tow); sbssat->sat[n - 1].lcorr.trx = msg->sample_stamp; // vel=0 -> time of applicability is reception time sbssat->sat[n - 1].lcorr.tapp = 0; sbssat->sat[n - 1].lcorr.valid = true; trace(5, "decode_longcorr0:sat=%2d", sbssat->sat[n - 1].sat); return 1; } /* decode half long term correction (vel code=1) -----------------------------*/ int Sbas_Telemetry_Data::decode_longcorr1(const sbsmsg_t *msg, int p, sbssat_t *sbssat) { int i; int n = getbitu(msg->msg, p, 6); trace(4,"decode_longcorr1:"); if (n == 0 || n > MAXSAT) return 0; sbssat->sat[n - 1].lcorr.iode = getbitu(msg->msg, p + 6, 8); for (i=0; i<3; i++) { sbssat->sat[n - 1].lcorr.dpos[i] = getbits(msg->msg, p + 14 + i*11, 11)*0.125; sbssat->sat[n - 1].lcorr.dvel[i] = getbits(msg->msg, p + 58 + i*8, 8)*P2_11; } sbssat->sat[n - 1].lcorr.daf0 = getbits(msg->msg, p + 47, 11)*P2_31; sbssat->sat[n - 1].lcorr.daf1 = getbits(msg->msg, p + 82, 8)*P2_39; // vel=1 -> time of applicability is sent in message, needs to be corrected for rollover which can not be done here, since the absolute gps time is unknown. see IS-GPS-200G pdf page 116 for correction /*t=(int)getbitu(msg->msg,p+90,13)*16-(int)msg->tow%86400; if (t<=-43200) t+=86400; else if (t> 43200) t-=86400; sbssat->sat[n-1].lcorr.t0=gpst2time(msg->week,msg->tow+t);*/ sbssat->sat[n - 1].lcorr.trx = msg->sample_stamp; sbssat->sat[n - 1].lcorr.tapp = (int)getbitu(msg->msg, p + 90, 13)*16; sbssat->sat[n - 1].lcorr.vel = 1; sbssat->sat[n - 1].lcorr.valid = true; trace(5, "decode_longcorr1: sat=%2d", sbssat->sat[n - 1].sat); return 1; } /* decode half long term correction ------------------------------------------*/ int Sbas_Telemetry_Data::decode_longcorrh(const sbsmsg_t *msg, int p, sbssat_t *sbssat) { trace(4,"decode_longcorrh:"); if (getbitu(msg->msg, p, 1) == 0 ) { /* vel code=0 */ if (sbssat->iodp == (int)getbitu(msg->msg, p + 103, 2)) { return decode_longcorr0(msg, p + 1, sbssat) && decode_longcorr0(msg, p + 52, sbssat); } } else if (sbssat->iodp == (int)getbitu(msg->msg, p + 104, 2)) { return decode_longcorr1(msg, p + 1, sbssat); } return 0; } /* decode type 24: mixed fast/long term correction ---------------------------*/ int Sbas_Telemetry_Data::decode_sbstype24(const sbsmsg_t *msg, sbssat_t *sbssat) { int i, j, iodf, blk, udre; trace(4, "decode_sbstype24:"); if (sbssat->iodp != (int)getbitu(msg->msg, 110, 2)) return 0; /* check IODP */ blk = getbitu(msg->msg, 112, 2); iodf =getbitu(msg->msg, 114, 2); for (i=0; i<6; i++) { if ((j = 13*blk+i) >= sbssat->nsat) break; udre = getbitu(msg->msg, 86 + 4*i, 4); //sbssat->sat[j].fcorr.t0 =gpst2time(msg->week,msg->tow); sbssat->sat[j].fcorr.t0 = msg->sample_stamp; sbssat->sat[j].fcorr.prc = getbits(msg->msg, 14 + i*12, 12)*0.125f; sbssat->sat[j].fcorr.udre = udre + 1; sbssat->sat[j].fcorr.iodf = iodf; } return decode_longcorrh(msg, 120, sbssat); } /* decode type 25: long term satellite error correction ----------------------*/ int Sbas_Telemetry_Data::decode_sbstype25(const sbsmsg_t *msg, sbssat_t *sbssat) { trace(4,"decode_sbstype25:"); return decode_longcorrh(msg, 14, sbssat) && decode_longcorrh(msg, 120, sbssat); } /* decode type 26: ionospheric delay corrections -----------------------------*/ int Sbas_Telemetry_Data::decode_sbstype26(const sbsmsg_t *msg, sbsion_t *sbsion) { int i, j, block, delay, give, band = getbitu(msg->msg, 14, 4); trace(4, "decode_sbstype26:"); if (band > MAXBAND || sbsion[band].iodi != (int)getbitu(msg->msg, 217, 2)) return 0; block = getbitu(msg->msg, 18, 4); for (i = 0; i < 15; i++) { if ((j = block*15 + i) >= sbsion[band].nigp) continue; give = getbitu(msg->msg, 2 + i*13 + 9, 4); delay = getbitu(msg->msg, 22 + i*13, 9); //sbsion[band].igp[j].t0=gpst2time(msg->week,msg->tow); sbsion[band].igp[j].t0 = msg->sample_stamp; sbsion[band].igp[j].valid = true; sbsion[band].igp[j].delay = delay == 0x1FF ? 0.0f : delay*0.125f; sbsion[band].igp[j].give = give; if(sbsion[band].igp[j].give > 15) sbsion[band].igp[j].give = 15; // give is not higher than 15, but to be sure } trace(5, "decode_sbstype26: band=%d block=%d", band, block); return 1; } /* update sbas corrections ----------------------------------------------------- * update sbas correction parameters in navigation data with a sbas message * args : sbsmg_t *msg I sbas message * nav_t *nav IO navigation data * return : message type (-1: error or not supported type) * notes : nav->seph must point to seph[NSATSBS*2] (array of seph_t) * seph[prn-MINPRNSBS+1] : sat prn current epehmeris * seph[prn-MINPRNSBS+1+MAXPRNSBS]: sat prn previous epehmeris *-----------------------------------------------------------------------------*/ int Sbas_Telemetry_Data::sbsupdatecorr(const sbsmsg_t *msg, nav_t *nav) { int type = getbitu(msg->msg, 8, 6), stat = -1; trace(3,"sbsupdatecorr: type=%d",type); //if (msg->week==0) return -1; switch (type) { case 0: stat = decode_sbstype2(msg, &nav->sbssat); break; case 1: stat = decode_sbstype1(msg, &nav->sbssat); break; case 2: case 3: case 4: case 5: stat = decode_sbstype2(msg, &nav->sbssat); break; case 6: stat = decode_sbstype6(msg, &nav->sbssat); break; case 7: stat = decode_sbstype7(msg, &nav->sbssat); break; case 9: stat = decode_sbstype9(msg, nav); break; case 10: trace(2, "unsupported sbas message: type=%d", type); break; case 12: trace(2, "unsupported sbas message: type=%d", type); break; case 17: trace(2, "unsupported sbas message: type=%d", type); break; case 18: stat = decode_sbstype18(msg, nav ->sbsion); break; case 24: stat = decode_sbstype24(msg, &nav->sbssat); break; case 25: stat = decode_sbstype25(msg, &nav->sbssat); break; case 26: stat = decode_sbstype26(msg, nav ->sbsion); break; case 63: break; /* null message */ default: trace(2, "Unsupported SBAS message: type=%d", type); break; } return stat ? type : -1; } void Sbas_Telemetry_Data::prn_mask_changed() { d_nav.sbssat.tlat = -1; // for each satellite in the RTKLIB structure for (int i_sat = 0; i_sat < d_nav.sbssat.nsat; i_sat++) { d_nav.sbssat.sat[i_sat].fcorr.valid = false; d_nav.sbssat.sat[i_sat].lcorr.valid = false; } } bool Sbas_Telemetry_Data::is_rtklib_sat_correction_valid(int sat) { return d_nav.sbssat.tlat > -1 && d_nav.sbssat.sat[sat].fcorr.valid && d_nav.sbssat.sat[sat].lcorr.valid; } void Sbas_Telemetry_Data::igp_mask_changed(int band) { for(int i_igp = 0; i_igp < d_nav.sbsion[band].nigp; i_igp++) d_nav.sbsion[band].igp[i_igp].valid = false; } gnss-sdr-0.0.9/src/core/system_parameters/sbas_telemetry_data.h000066400000000000000000000516631305042567700247560ustar00rootroot00000000000000/*! * \file sbas_telemetry_data.h * \brief Interface of the SBAS telemetry parser based on SBAS RTKLIB functions * \author Daniel Fehr 2013. daniel.co(at)bluewin.ch * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_SBAS_TELEMETRY_DATA_H_ #define GNSS_SDR_SBAS_TELEMETRY_DATA_H_ #include #include #include #include #include #include #include #include "boost/assign.hpp" #include "concurrent_queue.h" #include "sbas_time.h" class Sbas_Ionosphere_Correction; class Sbas_Satellite_Correction; struct Fast_Correction; struct Long_Term_Correction; class Sbas_Ephemeris; /*! * \brief Represents a raw SBAS message of 250cbits + 6 bits padding * (8b preamble + 6b message type + 212b data + 24b CRC + 6b zero padding) */ class Sbas_Raw_Msg { public: Sbas_Raw_Msg(){ rx_time = Sbas_Time(0); i_prn = -1; }; Sbas_Raw_Msg(double sample_stamp, int prn, const std::vector msg) : rx_time(sample_stamp), i_prn(prn), d_msg(msg) {} double get_sample_stamp() { return rx_time.get_time_stamp(); } //!< Time of reception sample stamp (first sample of preample) void relate(Sbas_Time_Relation time_relation) { rx_time.relate(time_relation); } Sbas_Time get_rx_time_obj() const { return rx_time; } int get_prn() const { return i_prn; } std::vector get_msg() const { return d_msg; } int get_preamble() { return d_msg[0]; } int get_msg_type() const { return d_msg[1] >> 2; } int get_crc() { unsigned char crc_last_byte = (d_msg[30] << 2) && (d_msg[31] >> 6); unsigned char crc_middle_byte = (d_msg[29] << 2) && (d_msg[30] >> 6); unsigned char crc_first_byte = (d_msg[28] << 2) && (d_msg[29] >> 6); return ((unsigned int)(crc_first_byte) << 16) && ((unsigned int)(crc_middle_byte) << 8) && crc_last_byte; } private: Sbas_Time rx_time; int i_prn; /* SBAS satellite PRN number */ std::vector d_msg; /* SBAS message (226 bit) padded by 0 */ }; /* * \brief Holds an updated set of the telemetry data received from SBAS */ class Sbas_Telemetry_Data { public: int update(Sbas_Raw_Msg sbas_raw_msg); /*! * Default constructor */ Sbas_Telemetry_Data(); /*! * Default deconstructor */ ~Sbas_Telemetry_Data(); private: std::map emitted_fast_corrections; std::map emitted_long_term_corrections; Sbas_Time_Relation mt12_time_ref; int decode_mt12(Sbas_Raw_Msg sbas_raw_msg); void updated_sbas_ephemeris(Sbas_Raw_Msg msg); void received_iono_correction(); void updated_satellite_corrections(); /////// rtklib.h #define SYS_NONE 0x00 /* navigation system: none */ #define SYS_GPS 0x01 /* navigation system: GPS */ #define SYS_SBS 0x02 /* navigation system: SBAS */ #define SYS_GLO 0x04 /* navigation system: GLONASS */ #define SYS_GAL 0x08 /* navigation system: Galileo */ #define SYS_QZS 0x10 /* navigation system: QZSS */ #define SYS_CMP 0x20 /* navigation system: BeiDou */ #define SYS_ALL 0xFF /* navigation system: all */ #define TSYS_GPS 0 /* time system: GPS time */ #define TSYS_UTC 1 /* time system: UTC */ #define TSYS_GLO 2 /* time system: GLONASS time */ #define TSYS_GAL 3 /* time system: Galileo time */ #define TSYS_QZS 4 /* time system: QZSS time */ #define TSYS_CMP 5 /* time system: BeiDou time */ #ifndef NFREQ #define NFREQ 3 /* number of carrier frequencies */ #endif #define NFREQGLO 2 /* number of carrier frequencies of GLONASS */ #ifndef NEXOBS #define NEXOBS 0 /* number of extended obs codes */ #endif #define MINPRNGPS 1 /* min satellite PRN number of GPS */ #define MAXPRNGPS 32 /* max satellite PRN number of GPS */ #define NSATGPS (MAXPRNGPS-MINPRNGPS+1) /* number of GPS satellites */ #define NSYSGPS 1 #ifdef ENAGLO #define MINPRNGLO 1 /* min satellite slot number of GLONASS */ #define MAXPRNGLO 24 /* max satellite slot number of GLONASS */ #define NSATGLO (MAXPRNGLO-MINPRNGLO+1) /* number of GLONASS satellites */ #define NSYSGLO 1 #else #define MINPRNGLO 0 #define MAXPRNGLO 0 #define NSATGLO 0 #define NSYSGLO 0 #endif #ifdef ENAGAL #define MINPRNGAL 1 /* min satellite PRN number of Galileo */ #define MAXPRNGAL 27 /* max satellite PRN number of Galileo */ #define NSATGAL (MAXPRNGAL-MINPRNGAL+1) /* number of Galileo satellites */ #define NSYSGAL 1 #else #define MINPRNGAL 0 #define MAXPRNGAL 0 #define NSATGAL 0 #define NSYSGAL 0 #endif #ifdef ENAQZS #define MINPRNQZS 193 /* min satellite PRN number of QZSS */ #define MAXPRNQZS 195 /* max satellite PRN number of QZSS */ #define MINPRNQZS_S 183 /* min satellite PRN number of QZSS SAIF */ #define MAXPRNQZS_S 185 /* max satellite PRN number of QZSS SAIF */ #define NSATQZS (MAXPRNQZS-MINPRNQZS+1) /* number of QZSS satellites */ #define NSYSQZS 1 #else #define MINPRNQZS 0 #define MAXPRNQZS 0 #define NSATQZS 0 #define NSYSQZS 0 #endif #ifdef ENACMP #define MINPRNCMP 1 /* min satellite sat number of BeiDou */ #define MAXPRNCMP 35 /* max satellite sat number of BeiDou */ #define NSATCMP (MAXPRNCMP-MINPRNCMP+1) /* number of BeiDou satellites */ #define NSYSCMP 1 #else #define MINPRNCMP 0 #define MAXPRNCMP 0 #define NSATCMP 0 #define NSYSCMP 0 #endif #define NSYS (NSYSGPS+NSYSGLO+NSYSGAL+NSYSQZS+NSYSCMP) /* number of systems */ #define MINPRNSBS 120 /* min satellite PRN number of SBAS */ #define MAXPRNSBS 142 /* max satellite PRN number of SBAS */ #define NSATSBS (MAXPRNSBS-MINPRNSBS+1) /* number of SBAS satellites */ #define MAXSAT (NSATGPS+NSATGLO+NSATGAL+NSATQZS+NSATCMP+NSATSBS) /* max satellite number (1 to MAXSAT) */ #ifndef MAXOBS #define MAXOBS 64 /* max number of obs in an epoch */ #endif #define MAXRCV 64 /* max receiver number (1 to MAXRCV) */ #define MAXOBSTYPE 64 /* max number of obs type in RINEX */ #define DTTOL 0.005 /* tolerance of time difference (s) */ #if 0 #define MAXDTOE 10800.0 /* max time difference to ephem Toe (s) for GPS */ #else #define MAXDTOE 7200.0 /* max time difference to ephem Toe (s) for GPS */ #endif #define MAXDTOE_GLO 1800.0 /* max time difference to GLONASS Toe (s) */ #define MAXDTOE_SBS 360.0 /* max time difference to SBAS Toe (s) */ #define MAXDTOE_S 86400.0 /* max time difference to ephem toe (s) for other */ #define MAXGDOP 300.0 /* max GDOP */ //#define MAXSBSAGEF 30.0 /* max age of SBAS fast correction (s) */ //#define MAXSBSAGEL 1800.0 /* max age of SBAS long term corr (s) */ //#define MAXSBSURA 8 /* max URA of SBAS satellite */ #define MAXBAND 10 /* max SBAS band of IGP */ #define MAXNIGP 201 /* max number of IGP in SBAS band */ //#define MAXNGEO 4 /* max number of GEO satellites */ #define P2_11 4.882812500000000E-04 /* 2^-11 */ #define P2_31 4.656612873077393E-10 /* 2^-31 */ #define P2_39 1.818989403545856E-12 /* 2^-39 */ /* type definitions ----------------------------------------------------------*/ typedef struct { /* time struct */ time_t time; /* time (s) expressed by standard time_t */ double sec; /* fraction of second under 1 s */ } gtime_t; typedef struct { /* SBAS message type */ //int week,tow; /* receiption time */ double sample_stamp; int prn; /* SBAS satellite PRN number */ unsigned char msg[29]; /* SBAS message (226bit) padded by 0 */ } sbsmsg_t; typedef struct { /* SBAS messages type */ int n,nmax; /* number of SBAS messages/allocated */ sbsmsg_t *msgs; /* SBAS messages */ } sbs_t; typedef struct { /* SBAS fast correction type */ //gtime_t t0; /* time of applicability (TOF) */ double t0; bool valid; double prc; /* pseudorange correction (PRC) (m) */ double rrc; /* range-rate correction (RRC) (m/s) */ double dt; /* range-rate correction delta-time (s) */ int iodf; /* IODF (issue of date fast corr) */ short udre; /* UDRE+1 */ short ai; /* degradation factor indicator */ } sbsfcorr_t; typedef struct { /* SBAS long term satellite error correction type */ //gtime_t t0; /* correction time */ double trx; /* time when message was received */ int tapp; /* time of applicability (when vel=1 sent as t0) */ int vel; /* use velocity if vel=1 */ bool valid; int iode; /* IODE (issue of date ephemeris) */ double dpos[3]; /* delta position (m) (ecef) */ double dvel[3]; /* delta velocity (m/s) (ecef) */ double daf0,daf1; /* delta clock-offset/drift (s,s/s) */ } sbslcorr_t; typedef struct { /* SBAS satellite correction type */ int sat; /* satellite number */ sbsfcorr_t fcorr; /* fast correction */ sbslcorr_t lcorr; /* long term correction */ } sbssatp_t; typedef struct { /* SBAS satellite corrections type */ int iodp; /* IODP (issue of date mask) */ int nsat; /* number of satellites */ int tlat; /* system latency (s) */ sbssatp_t sat[MAXSAT]; /* satellite correction */ } sbssat_t; typedef struct { /* SBAS ionospheric correction type */ //gtime_t t0; /* correction time */ double t0; bool valid; short lat,lon; /* latitude/longitude (deg) */ short give; /* GIVI+1 */ float delay; /* vertical delay estimate (m) */ } sbsigp_t; typedef struct { /* IGP band type */ short x; /* longitude/latitude (deg) */ const short *y; /* latitudes/longitudes (deg) */ unsigned char bits; /* IGP mask start bit */ unsigned char bite; /* IGP mask end bit */ } sbsigpband_t; typedef struct { /* SBAS ionospheric corrections type */ int iodi; /* IODI (issue of date ionos corr) */ int nigp; /* number of igps */ sbsigp_t igp[MAXNIGP]; /* ionospheric correction */ } sbsion_t; /* * indicators */ typedef struct { /* SBAS ephemeris type */ int sat = 0; /* satellite number */ //gtime_t t0; /* reference epoch time (GPST) */ int t0 = 0; //gtime_t tof; /* time of message frame (GPST) */ double tof = 0; int sva = 0; /* SV accuracy (URA index) */ int svh = 0; /* SV health (0:ok) */ double pos[3] = {0, 0, 0}; /* satellite position (m) (ecef) */ double vel[3] = {0, 0, 0}; /* satellite velocity (m/s) (ecef) */ double acc[3] = {0, 0, 0}; /* satellite acceleration (m/s^2) (ecef) */ double af0 = 0; double af1 = 0; /* satellite clock-offset/drift (s,s/s) */ } seph_t; typedef struct { /* navigation data type */ //int n,nmax; /* number of broadcast ephemeris */ //int ng,ngmax; /* number of glonass ephemeris */ //int ns,nsmax; /* number of sbas ephemeris */ //int ne,nemax; /* number of precise ephemeris */ //int nc,ncmax; /* number of precise clock */ //int na,namax; /* number of almanac data */ //int nt,ntmax; /* number of tec grid data */ //int nn,nnmax; /* number of stec grid data */ //eph_t *eph; /* GPS/QZS/GAL ephemeris */ //geph_t *geph; /* GLONASS ephemeris */ seph_t seph[2*NSATSBS]; /* SBAS ephemeris */ // peph_t *peph; /* precise ephemeris */ // pclk_t *pclk; /* precise clock */ // alm_t *alm; /* almanac data */ // tec_t *tec; /* tec grid data */ // stec_t *stec; /* stec grid data */ // erp_t erp; /* earth rotation parameters */ //double utc_gps[4]; /* GPS delta-UTC parameters {A0,A1,T,W} */ //double utc_glo[4]; /* GLONASS UTC GPS time parameters */ //double utc_gal[4]; /* Galileo UTC GPS time parameters */ //double utc_qzs[4]; /* QZS UTC GPS time parameters */ //double utc_cmp[4]; /* BeiDou UTC parameters */ //double utc_sbs[4]; /* SBAS UTC parameters */ //double ion_gps[8]; /* GPS iono model parameters {a0,a1,a2,a3,b0,b1,b2,b3} */ //double ion_gal[4]; /* Galileo iono model parameters {ai0,ai1,ai2,0} */ //double ion_qzs[8]; /* QZSS iono model parameters {a0,a1,a2,a3,b0,b1,b2,b3} */ //double ion_cmp[8]; /* BeiDou iono model parameters {a0,a1,a2,a3,b0,b1,b2,b3} */ //int leaps; /* leap seconds (s) */ //double lam[MAXSAT][NFREQ]; /* carrier wave lengths (m) */ //double cbias[MAXSAT][3]; /* code bias (0:p1-p2,1:p1-c1,2:p2-c2) (m) */ //double wlbias[MAXSAT]; /* wide-lane bias (cycle) */ //double glo_cpbias[4]; /* glonass code-phase bias {1C,1P,2C,2P} (m) */ //char glo_fcn[MAXPRNGLO+1]; /* glonass frequency channel number + 8 */ // pcv_t pcvs[MAXSAT]; /* satellite antenna pcv */ sbssat_t sbssat; /* SBAS satellite corrections */ sbsion_t sbsion[MAXBAND+1]; /* SBAS ionosphere corrections */ // dgps_t dgps[MAXSAT]; /* DGPS corrections */ // ssr_t ssr[MAXSAT]; /* SSR corrections */ // lexeph_t lexeph[MAXSAT]; /* LEX ephemeris */ // lexion_t lexion; /* LEX ionosphere correction */ } nav_t; //// common static const double gpst0[]; /* gps time reference */ /* debug trace functions -----------------------------------------------------*/ FILE *fp_trace; /* file pointer of trace */ int level_trace; /* level of trace */ unsigned int tick_trace; /* tick time at traceopen (ms) */ void trace(int level, const char *format, ...); /* satellite system+prn/slot number to satellite number ------------------------ * convert satellite system+prn/slot number to satellite number * args : int sys I satellite system (SYS_GPS,SYS_GLO,...) * int prn I satellite prn/slot number * return : satellite number (0:error) *-----------------------------------------------------------------------------*/ int satno(int sys, int prn); /* extract unsigned/signed bits ------------------------------------------------ * extract unsigned/signed bits from byte data * args : unsigned char *buff I byte data * int pos I bit position from start of data (bits) * int len I bit length (bits) (len<=32) * return : extracted unsigned/signed bits *-----------------------------------------------------------------------------*/ unsigned int getbitu(const unsigned char *buff, int pos, int len); int getbits(const unsigned char *buff, int pos, int len); /* convert calendar day/time to time ------------------------------------------- * convert calendar day/time to gtime_t struct * args : double *ep I day/time {year,month,day,hour,min,sec} * return : gtime_t struct * notes : proper in 1970-2037 or 1970-2099 (64bit time_t) *-----------------------------------------------------------------------------*/ gtime_t epoch2time(const double *ep); /* time difference ------------------------------------------------------------- * difference between gtime_t structs * args : gtime_t t1,t2 I gtime_t structs * return : time difference (t1-t2) (s) *-----------------------------------------------------------------------------*/ double timediff(gtime_t t1, gtime_t t2); /* gps time to time ------------------------------------------------------------ * convert week and tow in gps time to gtime_t struct * args : int week I week number in gps time * double sec I time of week in gps time (s) * return : gtime_t struct *-----------------------------------------------------------------------------*/ gtime_t gpst2time(int week, double sec); ////// sbas.c /* sbas igp definition -------------------------------------------------------*/ static const short x1[], x2[], x3[], x4[], x5[], x6[], x7[], x8[]; static const sbsigpband_t igpband1[9][8]; /* band 0-8 */ static const sbsigpband_t igpband2[2][5]; /* band 9-10 */ /* decode type 1: prn masks --------------------------------------------------*/ int decode_sbstype1(const sbsmsg_t *msg, sbssat_t *sbssat); /* decode type 2-5,0: fast corrections ---------------------------------------*/ int decode_sbstype2(const sbsmsg_t *msg, sbssat_t *sbssat); /* decode type 6: integrity info ---------------------------------------------*/ int decode_sbstype6(const sbsmsg_t *msg, sbssat_t *sbssat); /* decode type 7: fast correction degradation factor -------------------------*/ int decode_sbstype7(const sbsmsg_t *msg, sbssat_t *sbssat); /* decode type 9: geo navigation message -------------------------------------*/ int decode_sbstype9(const sbsmsg_t *msg, nav_t *nav); /* decode type 18: ionospheric grid point masks ------------------------------*/ int decode_sbstype18(const sbsmsg_t *msg, sbsion_t *sbsion); /* decode half long term correction (vel code=0) -----------------------------*/ int decode_longcorr0(const sbsmsg_t *msg, int p, sbssat_t *sbssat); /* decode half long term correction (vel code=1) -----------------------------*/ int decode_longcorr1(const sbsmsg_t *msg, int p, sbssat_t *sbssat); /* decode half long term correction ------------------------------------------*/ int decode_longcorrh(const sbsmsg_t *msg, int p, sbssat_t *sbssat); /* decode type 24: mixed fast/long term correction ---------------------------*/ int decode_sbstype24(const sbsmsg_t *msg, sbssat_t *sbssat); /* decode type 25: long term satellite error correction ----------------------*/ int decode_sbstype25(const sbsmsg_t *msg, sbssat_t *sbssat); /* decode type 26: ionospheric deley corrections -----------------------------*/ int decode_sbstype26(const sbsmsg_t *msg, sbsion_t *sbsion); /* update sbas corrections ----------------------------------------------------- * update sbas correction parameters in navigation data with a sbas message * args : sbsmg_t *msg I sbas message * nav_t *nav IO navigation data * return : message type (-1: error or not supported type) * notes : nav->seph must point to seph[NSATSBS*2] (array of seph_t) * seph[prn-MINPRNSBS+1] : sat prn current epehmeris * seph[prn-MINPRNSBS+1+MAXPRNSBS]: sat prn previous epehmeris *-----------------------------------------------------------------------------*/ int sbsupdatecorr(const sbsmsg_t *msg, nav_t *nav); void prn_mask_changed(); bool is_rtklib_sat_correction_valid(int sat); void igp_mask_changed(int band); // RTKLIB SBAS telemetry data representation nav_t d_nav; }; #endif gnss-sdr-0.0.9/src/core/system_parameters/sbas_time.h000066400000000000000000000136071305042567700227050ustar00rootroot00000000000000/*! * \file sbas_time.h * \brief Interface and implementation of classes to handle and relate sample stamp and GPS time based time scales * \author Daniel Fehr 2013. daniel.co(at)bluewin.ch * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_SBAS_TIME_H_ #define GNSS_SDR_SBAS_TIME_H_ #include #include #include #define EVENT 2 // logs important events which don't occur every update() call #define FLOW 3 // logs the function calls of block processing functions class Sbas_Time_Relation { public: Sbas_Time_Relation() { i_gps_week = 0; d_delta_sec = 0; b_valid = false; VLOG(FLOW) << "<> new invalid time relation: i_gps_week=" << i_gps_week << " d_delta_sec=" << d_delta_sec; } Sbas_Time_Relation(double time_stamp_sec, int gps_week, double gps_sec) { i_gps_week = gps_week; d_delta_sec = gps_sec - time_stamp_sec; b_valid = true; VLOG(FLOW) << "<> new time relation: i_gps_week=" << i_gps_week << " d_delta_sec=" << d_delta_sec; } bool to_gps_time(double time_stamp_sec, int &gps_week, double &gps_sec) { int delta_weeks = int(trunc(time_stamp_sec + d_delta_sec))/604800; gps_sec = time_stamp_sec + d_delta_sec - delta_weeks*604800; gps_week = i_gps_week + delta_weeks; VLOG(FLOW) << "<> to gps time: time_stamp_sec=" << time_stamp_sec << " gps_week=" << gps_week << " gps_sec=" << gps_sec; return b_valid; } bool to_sample_stamp(int gps_week, double gps_sec, double &time_stamp_sec) { time_stamp_sec = (gps_sec - d_delta_sec) + (gps_week - i_gps_week)*604800; VLOG(FLOW) << "<> to gps time: gps_week=" << gps_week << " gps_sec=" << gps_sec << " time_stamp_sec=" << time_stamp_sec; return b_valid; } bool is_valid() { return b_valid; } private: int i_gps_week; double d_delta_sec; bool b_valid; }; /*! * \brief Sbas_Time relates the relative sample stamp time scale with the absolute GPS time scale. * There are three different states for a Sbas_Time object: * - only relative time (sample stamp) is known * - only absolute time (gps time) is known * - absolute and relative time and their relation is known */ class Sbas_Time { public: enum Sbas_Time_State {RELATIVE, /*ABSOLUTE,*/ RELATED, UNDEFINED}; Sbas_Time() { e_state = UNDEFINED; i_gps_week = 0; d_gps_sec = 0; d_time_stamp_sec = 0; } Sbas_Time(double time_stamp_sec) { d_time_stamp_sec = time_stamp_sec; i_gps_week = 0; d_gps_sec = 0; e_state = RELATIVE; } /* Sbas_Time(int gps_week, double gps_sec) { i_gps_week = gps_week; d_gps_sec = gps_sec; d_time_stamp_sec = 0; e_state = ABSOLUTE; }*/ Sbas_Time(double time_stamp_sec, Sbas_Time_Relation relation) { if(relation.is_valid()) { // construct a RELATED object d_time_stamp_sec = time_stamp_sec; relation.to_gps_time(d_time_stamp_sec, i_gps_week, d_gps_sec); e_state = RELATED; } else { // construct a RELATIVE object *this = Sbas_Time(time_stamp_sec); VLOG(FLOW) << "<> create RELATIVE time (invalid relation): time_stamp_sec=" << time_stamp_sec; } } /*Sbas_Time(int gps_week, double gps_sec, Sbas_Time_Relation relation) { i_gps_week = gps_week; d_gps_sec = gps_sec; relation.to_sample_stamp(gps_week, gps_sec, d_time_stamp_sec); e_state = RELATED; }*/ void relate(Sbas_Time_Relation sbas_time_realtion) { switch (e_state) { case RELATIVE: *this = Sbas_Time(d_time_stamp_sec, sbas_time_realtion); break; //case ABSOLUTE: return Sbas_Time(i_gps_week, d_gps_sec, sbas_time_realtion); break; case RELATED: LOG(INFO) << "Relating an already related Sbas_Time object is not possible"; break; case UNDEFINED: std::cerr << "Sbas_Time object state undefined" << std::endl; break; default: std::cerr << "Sbas_Time object state not known" << std::endl; break; } return; } double get_time_stamp() { return d_time_stamp_sec; //return (e_state == RELATIVE || e_state == RELATED); } bool get_gps_time(int &gps_week, double &gps_sec) { gps_week = i_gps_week; gps_sec = d_gps_sec; return (/*e_state == ABSOLUTE ||*/ e_state == RELATED); } bool is_only_relativ() { return e_state == RELATIVE; } //bool is_only_absolute() {return e_state == ABSOLUTE;} bool is_related() { return e_state == RELATED; } Sbas_Time_State get_state() { return e_state; } private: Sbas_Time_State e_state; double d_time_stamp_sec; int i_gps_week; double d_gps_sec; }; #endif /* GNSS_SDR_SBAS_TIME_H_ */ gnss-sdr-0.0.9/src/main/000077500000000000000000000000001305042567700150045ustar00rootroot00000000000000gnss-sdr-0.0.9/src/main/CMakeLists.txt000066400000000000000000000132311305042567700175440ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # set(GNSS_SDR_OPTIONAL_LIBS "") set(GNSS_SDR_OPTIONAL_HEADERS "") if(ENABLE_GPERFTOOLS) if(GPERFTOOLS_FOUND) #set(GNSS_SDR_OPTIONAL_LIBS "${GNSS_SDR_OPTIONAL_LIBS};${GPERFTOOLS_LIBRARIES}") set(GNSS_SDR_OPTIONAL_LIBS "${GNSS_SDR_OPTIONAL_LIBS};${GPERFTOOLS_PROFILER};${GPERFTOOLS_TCMALLOC}") set(GNSS_SDR_OPTIONAL_HEADERS "${GNSS_SDR_OPTIONAL_HEADERS};${GPERFTOOLS_INCLUDE_DIR}") endif(GPERFTOOLS_FOUND) endif(ENABLE_GPERFTOOLS) if(ENABLE_UHD) set(GNSS_SDR_OPTIONAL_LIBS ${GNSS_SDR_OPTIONAL_LIBS} ${UHD_LIBRARIES} ${GNURADIO_UHD_LIBRARIES}) set(GNSS_SDR_OPTIONAL_HEADERS ${GNSS_SDR_OPTIONAL_HEADERS} ${UHD_INCLUDE_DIRS}) endif(ENABLE_UHD) if(OPENSSL_FOUND) add_definitions( -DUSE_OPENSSL_FALLBACK=1 ) endif(OPENSSL_FOUND) if(ENABLE_CUDA) add_definitions(-DCUDA_GPU_ACCEL=1) set(GNSS_SDR_OPTIONAL_LIBS ${GNSS_SDR_OPTIONAL_LIBS} ${CUDA_LIBRARIES}) set(GNSS_SDR_OPTIONAL_HEADERS ${GNSS_SDR_OPTIONAL_HEADERS} ${CUDA_INCLUDE_DIRS}) endif(ENABLE_CUDA) if(ORC_FOUND) set(GNSS_SDR_OPTIONAL_LIBS ${GNSS_SDR_OPTIONAL_LIBS} ${ORC_LIBRARIES}) set(GNSS_SDR_OPTIONAL_HEADERS ${GNSS_SDR_OPTIONAL_HEADERS} ${ORC_INCLUDE_DIRS}) endif(ORC_FOUND) include_directories( ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/interfaces ${CMAKE_SOURCE_DIR}/src/core/receiver ${CMAKE_SOURCE_DIR}/src/core/libs ${CMAKE_SOURCE_DIR}/src/core/libs/supl ${CMAKE_SOURCE_DIR}/src/core/libs/supl/asn-rrlp ${CMAKE_SOURCE_DIR}/src/core/libs/supl/asn-supl ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${ARMADILLO_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ${GNSS_SDR_OPTIONAL_HEADERS} ${VOLK_GNSSSDR_INCLUDE_DIRS} ${OPT_GNSSSDR_INCLUDE_DIRS} ) add_definitions( -DGNSS_SDR_VERSION="${VERSION}" ) if(OS_IS_MACOSX) if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(MAC_LIBRARIES "-stdlib=libc++ -std=c++11 -framework Accelerate -lc++") endif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") endif(OS_IS_MACOSX) add_executable(gnss-sdr ${CMAKE_CURRENT_SOURCE_DIR}/main.cc) add_custom_command(TARGET gnss-sdr POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $ ${CMAKE_SOURCE_DIR}/install/$ ) target_link_libraries(gnss-sdr ${MAC_LIBRARIES} ${Boost_LIBRARIES} ${GNURADIO_RUNTIME_LIBRARIES} ${GNURADIO_BLOCKS_LIBRARIES} ${GNURADIO_FFT_LIBRARIES} ${GNURADIO_FILTER_LIBRARIES} ${GFlags_LIBS} ${GLOG_LIBRARIES} ${ARMADILLO_LIBRARIES} ${VOLK_GNSSSDR_LIBRARIES} ${GNSS_SDR_OPTIONAL_LIBS} gnss_sp_libs gnss_rx ) install(TARGETS gnss-sdr RUNTIME DESTINATION bin COMPONENT "gnss-sdr" ) install(DIRECTORY ${CMAKE_SOURCE_DIR}/conf DESTINATION share/gnss-sdr FILES_MATCHING PATTERN "*.conf" ) install(FILES ${CMAKE_SOURCE_DIR}/conf/gnss-sdr.conf DESTINATION share/gnss-sdr/conf RENAME default.conf) if(NOT VOLK_GNSSSDR_FOUND) install(PROGRAMS ${CMAKE_BINARY_DIR}/volk_gnsssdr_module/build/apps/volk_gnsssdr_profile DESTINATION bin COMPONENT "volk_gnsssdr") install(PROGRAMS ${CMAKE_BINARY_DIR}/volk_gnsssdr_module/build/apps/volk_gnsssdr-config-info DESTINATION bin COMPONENT "volk_gnsssdr") endif(NOT VOLK_GNSSSDR_FOUND) find_program(GZIP gzip /bin /usr/bin /usr/local/bin /opt/local/bin /sbin ) if(NOT GZIP_NOTFOUND) execute_process(COMMAND gzip -9 -c ${CMAKE_SOURCE_DIR}/docs/manpage/gnss-sdr-manpage WORKING_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_FILE "${CMAKE_BINARY_DIR}/gnss-sdr.1.gz") install(FILES ${CMAKE_BINARY_DIR}/gnss-sdr.1.gz DESTINATION share/man/man1) if(NOT VOLK_GNSSSDR_FOUND) execute_process(COMMAND gzip -9 -c ${CMAKE_SOURCE_DIR}/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cmake/Packaging/volk_gnsssdr_profile-manpage WORKING_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_FILE "${CMAKE_BINARY_DIR}/volk_gnsssdr_profile.1.gz") execute_process(COMMAND gzip -9 -c ${CMAKE_SOURCE_DIR}/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cmake/Packaging/volk_gnsssdr-config-info-manpage WORKING_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_FILE "${CMAKE_BINARY_DIR}/volk_gnsssdr-config-info.1.gz") install(FILES ${CMAKE_BINARY_DIR}/volk_gnsssdr_profile.1.gz DESTINATION share/man/man1) install(FILES ${CMAKE_BINARY_DIR}/volk_gnsssdr-config-info.1.gz DESTINATION share/man/man1) endif(NOT VOLK_GNSSSDR_FOUND) endif(NOT GZIP_NOTFOUND) gnss-sdr-0.0.9/src/main/main.cc000066400000000000000000000132441305042567700162430ustar00rootroot00000000000000/*! * \file main.cc * \brief Main file of the GNSS-SDR program. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * * It sets up the logging system, creates a ControlThread object, * makes it run, and releases memory back when the main thread has ended. * * ------------------------------------------------------------------------- * * 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_VERSION #define GNSS_SDR_VERSION "0.0.9" #endif #ifndef GOOGLE_STRIP_LOG #define GOOGLE_STRIP_LOG 0 #endif #include #include #include #include #include #include #include #include #include "control_thread.h" #include "concurrent_queue.h" #include "concurrent_map.h" #if CUDA_GPU_ACCEL // For the CUDA runtime routines (prefixed with "cuda_") #include #endif using google::LogMessage; DECLARE_string(log_dir); /* * Concurrent queues that communicates the Telemetry Decoder * to the Observables modules */ // For GPS NAVIGATION (L1) concurrent_queue global_gps_acq_assist_queue; concurrent_map global_gps_acq_assist_map; int main(int argc, char** argv) { const std::string intro_help( std::string("\nGNSS-SDR is an Open Source GNSS Software Defined Receiver\n") + "Copyright (C) 2010-2017 (see AUTHORS file for a list of contributors)\n" + "This program comes with ABSOLUTELY NO WARRANTY;\n" + "See COPYING file to see a copy of the General Public License\n \n"); const std::string gnss_sdr_version(GNSS_SDR_VERSION); google::SetUsageMessage(intro_help); google::SetVersionString(gnss_sdr_version); google::ParseCommandLineFlags(&argc, &argv, true); std::cout << "Initializing GNSS-SDR v" << gnss_sdr_version << " ... Please wait." << std::endl; #if CUDA_GPU_ACCEL // Reset the device // cudaDeviceReset causes the driver to clean up all state. While // not mandatory in normal operation, it is good practice. It is also // needed to ensure correct operation when the application is being // profiled. Calling cudaDeviceReset causes all profile data to be // flushed before the application exits cudaDeviceReset(); std::cout << "Reset CUDA device done " << std::endl; #endif if(GOOGLE_STRIP_LOG == 0) { google::InitGoogleLogging(argv[0]); if (FLAGS_log_dir.empty()) { std::cout << "Logging will be done at " << boost::filesystem::temp_directory_path() << std::endl << "Use gnss-sdr --log_dir=/path/to/log to change that." << std::endl; } else { const boost::filesystem::path p (FLAGS_log_dir); if (!boost::filesystem::exists(p)) { std::cout << "The path " << FLAGS_log_dir << " does not exist, attempting to create it." << std::endl; boost::system::error_code ec; boost::filesystem::create_directory(p, ec); if(ec != 0) { std::cout << "Could not create the " << FLAGS_log_dir << " folder. GNSS-SDR program ended." << std::endl; google::ShutDownCommandLineFlags(); std::exit(0); } } std::cout << "Logging with be done at " << FLAGS_log_dir << std::endl; } } std::unique_ptr control_thread(new ControlThread()); // record startup time struct timeval tv; gettimeofday(&tv, NULL); long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; try { control_thread->run(); } catch( boost::exception & e ) { LOG(FATAL) << "Boost exception: " << boost::diagnostic_information(e); } catch(std::exception const& ex) { LOG(FATAL) << "STD exception: " << ex.what(); } catch(...) { LOG(INFO) << "Unexpected catch"; } // report the elapsed time gettimeofday(&tv, NULL); long long int end = tv.tv_sec * 1000000 + tv.tv_usec; std::cout << "Total GNSS-SDR run time " << (static_cast(end - begin)) / 1000000.0 << " [seconds]" << std::endl; google::ShutDownCommandLineFlags(); std::cout << "GNSS-SDR program ended." << std::endl; return 0; } gnss-sdr-0.0.9/src/tests/000077500000000000000000000000001305042567700152225ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/CMakeLists.txt000066400000000000000000000575461305042567700200030ustar00rootroot00000000000000# Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) # # 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 . # add_subdirectory(unit-tests/signal-processing-blocks/libs) ################################################################################ # Google Test - https://github.com/google/googletest ################################################################################ if(EXISTS $ENV{GTEST_DIR}) set(GTEST_DIR_LOCAL $ENV{GTEST_DIR}) endif(EXISTS $ENV{GTEST_DIR}) if(GTEST_DIR) set(GTEST_DIR_LOCAL ${GTEST_DIR}) endif(GTEST_DIR) if(NOT GTEST_DIR_LOCAL) set(GTEST_DIR_LOCAL false) else() set(GTEST_DIR_LOCAL true) endif(NOT GTEST_DIR_LOCAL) if(GTEST_INCLUDE_DIRS) set(GTEST_DIR_LOCAL true) endif(GTEST_INCLUDE_DIRS) set(GTEST_COMPILER -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}) set(TOOLCHAIN_ARG "") if(NOT ${GTEST_DIR_LOCAL}) # if GTEST_DIR is not defined, we download and build it set(gtest_RELEASE 1.8.0) if(EXISTS $ENV{OECORE_TARGET_SYSROOT}) set(GTEST_COMPILER "") set(TOOLCHAIN_ARG -DCMAKE_TOOLCHAIN_FILE=${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/Toolchains/oe-sdk_cross.cmake) endif(EXISTS $ENV{OECORE_TARGET_SYSROOT}) ExternalProject_Add( gtest-${gtest_RELEASE} GIT_REPOSITORY https://github.com/google/googletest GIT_TAG release-${gtest_RELEASE} SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../thirdparty/gtest/gtest-${gtest_RELEASE} BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/../../gtest-${gtest_RELEASE} CMAKE_ARGS ${GTEST_COMPILER} -DBUILD_GTEST=ON -DBUILD_GMOCK=OFF ${TOOLCHAIN_ARG} UPDATE_COMMAND "" PATCH_COMMAND "" INSTALL_COMMAND "" ) # Set up variables # Set recently downloaded and build Googletest root folder set(GTEST_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../thirdparty/gtest/gtest-${gtest_RELEASE}/googletest") # Source code ExternalProject_Get_Property(gtest-${gtest_RELEASE} source_dir) set(GTEST_INCLUDE_DIR ${source_dir}/googletest/include) set(GTEST_INCLUDE_DIRECTORIES ${GTEST_DIR}/include ${GTEST_DIR} ${GTEST_DIR}/src) # Library ExternalProject_Get_Property(gtest-${gtest_RELEASE} binary_dir) if(OS_IS_MACOSX) if(CMAKE_GENERATOR STREQUAL Xcode) set(binary_dir "${binary_dir}/Debug") endif(CMAKE_GENERATOR STREQUAL Xcode) endif(OS_IS_MACOSX) set(GTEST_LIBRARY_PATH "${binary_dir}/googletest/${CMAKE_FIND_LIBRARY_PREFIXES}gtest.a;${binary_dir}/googletest/${CMAKE_FIND_LIBRARY_PREFIXES}gtest_main.a") set(GTEST_LIBRARY gtest-${gtest_RELEASE}) set(GTEST_LIBRARIES ${binary_dir}/googletest/${CMAKE_FIND_LIBRARY_PREFIXES}gtest.a ${binary_dir}/googletest/${CMAKE_FIND_LIBRARY_PREFIXES}gtest_main.a ) set(GTEST_LIB_DIR "${CMAKE_CURRENT_BINARY_DIR}/../../gtest-${gtest_RELEASE}/googletest") else(NOT ${GTEST_DIR_LOCAL}) if(GTEST_INCLUDE_DIRS) set(GTEST_INCLUDE_DIRECTORIES ${GTEST_INCLUDE_DIRS} ${LIBGTEST_DEV_DIR}) add_library(gtest ${LIBGTEST_DEV_DIR}/src/gtest-all.cc ${LIBGTEST_DEV_DIR}/src/gtest_main.cc) set(GTEST_LIBRARIES gtest) else(GTEST_INCLUDE_DIRS) # If the variable GTEST_DIR is defined, we use the existing Googletest set(GTEST_DIR $ENV{GTEST_DIR}) set(GTEST_INCLUDE_DIRECTORIES ${GTEST_DIR}/include ${GTEST_DIR} ${GTEST_DIR}/src) add_library(gtest ${GTEST_DIR}/src/gtest-all.cc ${GTEST_DIR}/src/gtest_main.cc) set(GTEST_LIBRARIES gtest) endif(GTEST_INCLUDE_DIRS) endif(NOT ${GTEST_DIR_LOCAL}) ################################################################################ # Optional libraries ################################################################################ set(GNSS_SDR_TEST_OPTIONAL_LIBS "") set(GNSS_SDR_TEST_OPTIONAL_HEADERS "") if(ENABLE_CUDA) set(GNSS_SDR_TEST_OPTIONAL_HEADERS ${GNSS_SDR_TEST_OPTIONAL_HEADERS} ${CUDA_INCLUDE_DIRS}) set(GNSS_SDR_TEST_OPTIONAL_LIBS ${GNSS_SDR_TEST_OPTIONAL_LIBS} ${CUDA_LIBRARIES}) endif(ENABLE_CUDA) if(ENABLE_GPERFTOOLS) if(GPERFTOOLS_FOUND) set(GNSS_SDR_TEST_OPTIONAL_LIBS "${GNSS_SDR_TEST_OPTIONAL_LIBS};${GPERFTOOLS_LIBRARIES}") set(GNSS_SDR_TEST_OPTIONAL_HEADERS "${GNSS_SDR_TEST_OPTIONAL_HEADERS};${GPERFTOOLS_INCLUDE_DIR}") endif(GPERFTOOLS_FOUND) endif(ENABLE_GPERFTOOLS) if(Boost_VERSION LESS 105000) add_definitions(-DOLD_BOOST=1) endif(Boost_VERSION LESS 105000) if(OPENSSL_FOUND) add_definitions( -DUSE_OPENSSL_FALLBACK=1 ) endif(OPENSSL_FOUND) if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(CLANG_FLAGS "-stdlib=libc++ -std=c++11 -lc++") endif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") if(OPENCL_FOUND) add_definitions(-DOPENCL_BLOCKS_TEST=1) endif(OPENCL_FOUND) if (ENABLE_CUDA) add_definitions(-DCUDA_BLOCKS_TEST=1) endif(ENABLE_CUDA) ################################################################################ # Optional generator ################################################################################ if(ENABLE_UNIT_TESTING_EXTRA OR ENABLE_SYSTEM_TESTING_EXTRA) ExternalProject_Add( gnss-sim GIT_REPOSITORY https://bitbucket.org/jarribas/gnss-simulator GIT_TAG master SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../thirdparty/gnss-sim BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/../../gnss-sim CMAKE_ARGS ${GTEST_COMPILER} ${TOOLCHAIN_ARG} UPDATE_COMMAND "" PATCH_COMMAND "" INSTALL_COMMAND "" ) set(SW_GENERATOR_BIN ${CMAKE_CURRENT_BINARY_DIR}/../../gnss-sim/gnss_sim) add_definitions(-DSW_GENERATOR_BIN="${SW_GENERATOR_BIN}") add_definitions(-DDEFAULT_RINEX_NAV="${CMAKE_CURRENT_BINARY_DIR}/../../../thirdparty/gnss-sim/brdc3540.14n") add_definitions(-DDEFAULT_POSITION_FILE="${CMAKE_CURRENT_BINARY_DIR}/../../../thirdparty/gnss-sim/circle.csv") ################################################################################ # Local installation of GPSTk http://www.gpstk.org/ ################################################################################ find_package(GPSTK) if(NOT GPSTK_FOUND OR ENABLE_OWN_GPSTK) set(gpstk_RELEASE "2.9") ExternalProject_Add( gpstk-${gpstk_RELEASE} GIT_REPOSITORY https://github.com/SGL-UT/GPSTk GIT_TAG v${gpstk_RELEASE} SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../thirdparty/gpstk-${gpstk_RELEASE} BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/../../gpstk-${gpstk_RELEASE} CMAKE_ARGS ${GTEST_COMPILER} ${TOOLCHAIN_ARG} -DCMAKE_INSTALL_PREFIX=${CMAKE_SOURCE_DIR}/thirdparty/gpstk-${gpstk_RELEASE}/install -DBUILD_EXT=OFF -DBUILD_PYTHON=OFF UPDATE_COMMAND "" PATCH_COMMAND "" ) set(GPSTK_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../../thirdparty/gpstk-${gpstk_RELEASE}/install/include CACHE PATH "Local GPSTK headers") add_library(gpstk UNKNOWN IMPORTED) set_property(TARGET gpstk PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../../thirdparty/gpstk-${gpstk_RELEASE}/install/lib/${CMAKE_FIND_LIBRARY_PREFIXES}gpstk${CMAKE_SHARED_LIBRARY_SUFFIX}) add_dependencies(gpstk gpstk-${gpstk_RELEASE}) set(GPSTK_BINDIR ${CMAKE_CURRENT_SOURCE_DIR}/../../thirdparty/gpstk-${gpstk_RELEASE}/install/bin/ ) add_definitions(-DGPSTK_BINDIR="${GPSTK_BINDIR}") set(gpstk_libs gpstk) else(NOT GPSTK_FOUND OR ENABLE_OWN_GPSTK) set(gpstk_libs ${GPSTK_LIBRARIES}) set(GPSTK_INCLUDE_DIRS ${GPSTK_INCLUDE_DIR}) set(GPSTK_BINDIR ${GPSTK_LIBRARY}/../bin/ ) add_definitions(-DGPSTK_BINDIR="${GPSTK_BINDIR}") endif(NOT GPSTK_FOUND OR ENABLE_OWN_GPSTK) endif(ENABLE_UNIT_TESTING_EXTRA OR ENABLE_SYSTEM_TESTING_EXTRA) if(ENABLE_UNIT_TESTING_EXTRA) add_definitions(-DEXTRA_TESTS) if(NOT EXISTS ${CMAKE_SOURCE_DIR}/thirdparty/signal_samples/gps_l2c_m_prn7_5msps.dat) message(STATUS "Downloading some data files for testing...") file(DOWNLOAD https://sourceforge.net/projects/gnss-sdr/files/data/gps_l2c_m_prn7_5msps.dat ${CMAKE_CURRENT_SOURCE_DIR}/../../thirdparty/signal_samples/gps_l2c_m_prn7_5msps.dat SHOW_PROGRESS EXPECTED_HASH MD5=a6fcbefe155137945d3c33c5ef7bd0f9 ) endif(NOT EXISTS ${CMAKE_SOURCE_DIR}/thirdparty/signal_samples/gps_l2c_m_prn7_5msps.dat) endif(ENABLE_UNIT_TESTING_EXTRA) file(COPY ${CMAKE_SOURCE_DIR}/src/tests/signal_samples/GSoC_CTTC_capture_2012_07_26_4Msps_4ms.dat DESTINATION ${CMAKE_SOURCE_DIR}/thirdparty/signal_samples) file(COPY ${CMAKE_SOURCE_DIR}/src/tests/signal_samples/Galileo_E1_ID_1_Fs_4Msps_8ms.dat DESTINATION ${CMAKE_SOURCE_DIR}/thirdparty/signal_samples) file(COPY ${CMAKE_SOURCE_DIR}/src/tests/signal_samples/GPS_L1_CA_ID_1_Fs_4Msps_2ms.dat DESTINATION ${CMAKE_SOURCE_DIR}/thirdparty/signal_samples) add_definitions(-DTEST_PATH="${CMAKE_SOURCE_DIR}/thirdparty/") include_directories( ${GTEST_INCLUDE_DIRECTORIES} ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/interfaces ${CMAKE_SOURCE_DIR}/src/core/receiver ${CMAKE_SOURCE_DIR}/src/core/libs ${CMAKE_SOURCE_DIR}/src/core/libs/supl ${CMAKE_SOURCE_DIR}/src/core/libs/supl/asn-rrlp ${CMAKE_SOURCE_DIR}/src/core/libs/supl/asn-supl ${CMAKE_SOURCE_DIR}/src/algorithms/libs ${CMAKE_SOURCE_DIR}/src/algorithms/data_type_adapter/adapters ${CMAKE_SOURCE_DIR}/src/algorithms/data_type_adapter/gnuradio_blocks ${CMAKE_SOURCE_DIR}/src/algorithms/resampler/gnuradio_blocks ${CMAKE_SOURCE_DIR}/src/algorithms/channel/adapters ${CMAKE_SOURCE_DIR}/src/algorithms/channel/libs ${CMAKE_SOURCE_DIR}/src/algorithms/tracking/libs ${CMAKE_SOURCE_DIR}/src/algorithms/tracking/adapters ${CMAKE_SOURCE_DIR}/src/algorithms/tracking/gnuradio_blocks ${CMAKE_SOURCE_DIR}/src/algorithms/telemetry_decoder/adapters ${CMAKE_SOURCE_DIR}/src/algorithms/telemetry_decoder/gnuradio_blocks ${CMAKE_SOURCE_DIR}/src/algorithms/telemetry_decoder/libs ${CMAKE_SOURCE_DIR}/src/algorithms/signal_source/adapters ${CMAKE_SOURCE_DIR}/src/algorithms/signal_source/gnuradio_blocks ${CMAKE_SOURCE_DIR}/src/algorithms/signal_generator/adapters ${CMAKE_SOURCE_DIR}/src/algorithms/signal_generator/gnuradio_blocks ${CMAKE_SOURCE_DIR}/src/algorithms/input_filter/adapters ${CMAKE_SOURCE_DIR}/src/algorithms/input_filter/gnuradio_blocks ${CMAKE_SOURCE_DIR}/src/algorithms/acquisition/adapters ${CMAKE_SOURCE_DIR}/src/algorithms/acquisition/gnuradio_blocks ${CMAKE_SOURCE_DIR}/src/algorithms/PVT/libs ${CMAKE_SOURCE_DIR}/src/tests/unit-tests/signal-processing-blocks/libs ${CMAKE_SOURCE_DIR}/src/tests/common-files ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${ARMADILLO_INCLUDE_DIRS} ${VOLK_INCLUDE_DIRS} ${VOLK_GNSSSDR_INCLUDE_DIRS} ${GNSS_SDR_TEST_OPTIONAL_HEADERS} ${GNSS_SDR_TEST_OPTIONAL_HEADERS} ) ################################################################################ # Unit testing ################################################################################ if(ENABLE_UNIT_TESTING) if( ${ARMADILLO_VERSION_STRING} STRGREATER "5.300") # make sure interp1 is present add_definitions(-DMODERN_ARMADILLO) endif( ${ARMADILLO_VERSION_STRING} STRGREATER "5.300") add_executable(run_tests ${CMAKE_CURRENT_SOURCE_DIR}/test_main.cc) add_custom_command(TARGET run_tests POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $ ${CMAKE_SOURCE_DIR}/install/$) target_link_libraries(run_tests ${CLANG_FLAGS} ${Boost_LIBRARIES} ${GFlags_LIBS} ${GLOG_LIBRARIES} ${GTEST_LIBRARIES} ${GNURADIO_RUNTIME_LIBRARIES} ${GNURADIO_BLOCKS_LIBRARIES} ${GNURADIO_FILTER_LIBRARIES} ${GNURADIO_ANALOG_LIBRARIES} ${ARMADILLO_LIBRARIES} ${VOLK_LIBRARIES} channel_fsm gnss_sp_libs gnss_rx gnss_system_parameters signal_generator_blocks signal_generator_adapters pvt_gr_blocks signal_processing_testing_lib ${VOLK_GNSSSDR_LIBRARIES} ${GNSS_SDR_TEST_OPTIONAL_LIBS} ) if(NOT ${GTEST_DIR_LOCAL}) add_dependencies(run_tests gtest-${gtest_RELEASE}) endif(NOT ${GTEST_DIR_LOCAL}) endif(ENABLE_UNIT_TESTING) ######################################################### # Adding Tests to Ctest ######################################################### set(CMAKE_CTEST_COMMAND ctest -V) add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND}) add_executable(control_thread_test ${CMAKE_CURRENT_SOURCE_DIR}/single_test_main.cc ${CMAKE_CURRENT_SOURCE_DIR}/unit-tests/control-plane/control_message_factory_test.cc ${CMAKE_CURRENT_SOURCE_DIR}/unit-tests/control-plane/control_thread_test.cc ) if(NOT ${ENABLE_PACKAGING}) set_property(TARGET control_thread_test PROPERTY EXCLUDE_FROM_ALL TRUE) endif(NOT ${ENABLE_PACKAGING}) target_link_libraries(control_thread_test ${Boost_LIBRARIES} ${GFlags_LIBS} ${GLOG_LIBRARIES} ${GTEST_LIBRARIES} gnss_sp_libs gnss_system_parameters gnss_rx ${VOLK_GNSSSDR_LIBRARIES} ) add_test(control_thread_test control_thread_test) if(NOT ${GTEST_DIR_LOCAL}) add_dependencies(control_thread_test gtest-${gtest_RELEASE}) else(NOT ${GTEST_DIR_LOCAL}) add_dependencies(control_thread_test gtest) endif(NOT ${GTEST_DIR_LOCAL}) set_property(TEST control_thread_test PROPERTY TIMEOUT 30) add_executable(flowgraph_test ${CMAKE_CURRENT_SOURCE_DIR}/single_test_main.cc ${CMAKE_CURRENT_SOURCE_DIR}/unit-tests/control-plane/gnss_flowgraph_test.cc ) if(NOT ${ENABLE_PACKAGING}) set_property(TARGET flowgraph_test PROPERTY EXCLUDE_FROM_ALL TRUE) endif(NOT ${ENABLE_PACKAGING}) target_link_libraries(flowgraph_test ${Boost_LIBRARIES} ${GFlags_LIBS} ${GLOG_LIBRARIES} ${GTEST_LIBRARIES} gnss_sp_libs gnss_rx gnss_system_parameters ${VOLK_GNSSSDR_LIBRARIES} ) add_test(flowgraph_test flowgraph_test) if(NOT ${GTEST_DIR_LOCAL}) add_dependencies(flowgraph_test gtest-${gtest_RELEASE}) else(NOT ${GTEST_DIR_LOCAL}) add_dependencies(flowgraph_test gtest) endif(NOT ${GTEST_DIR_LOCAL}) set_property(TEST flowgraph_test PROPERTY TIMEOUT 30) add_executable(gnss_block_test ${CMAKE_CURRENT_SOURCE_DIR}/single_test_main.cc ${CMAKE_CURRENT_SOURCE_DIR}/unit-tests/signal-processing-blocks/sources/file_signal_source_test.cc ${CMAKE_CURRENT_SOURCE_DIR}/unit-tests/signal-processing-blocks/filter/fir_filter_test.cc ${CMAKE_CURRENT_SOURCE_DIR}/unit-tests/signal-processing-blocks/adapter/pass_through_test.cc ${CMAKE_CURRENT_SOURCE_DIR}/unit-tests/control-plane/gnss_block_factory_test.cc ) if(NOT ${ENABLE_PACKAGING}) set_property(TARGET gnss_block_test PROPERTY EXCLUDE_FROM_ALL TRUE) endif(NOT ${ENABLE_PACKAGING}) target_link_libraries(gnss_block_test ${Boost_LIBRARIES} ${GFlags_LIBS} ${GLOG_LIBRARIES} ${GTEST_LIBRARIES} ${GNURADIO_RUNTIME_LIBRARIES} ${GNURADIO_BLOCKS_LIBRARIES} ${GNURADIO_FILTER_LIBRARIES} ${GNURADIO_ANALOG_LIBRARIES} gnss_sp_libs gnss_rx gnss_system_parameters # signal_generator_blocks ${VOLK_GNSSSDR_LIBRARIES} ) add_test(gnss_block_test gnss_block_test) if(NOT ${GTEST_DIR_LOCAL}) add_dependencies(gnss_block_test gtest-${gtest_RELEASE}) else(NOT ${GTEST_DIR_LOCAL}) add_dependencies(gnss_block_test gtest) endif(NOT ${GTEST_DIR_LOCAL}) add_executable(gnuradio_block_test ${CMAKE_CURRENT_SOURCE_DIR}/single_test_main.cc ${CMAKE_CURRENT_SOURCE_DIR}/unit-tests/signal-processing-blocks/sources/unpack_2bit_samples_test.cc ) if(NOT ${ENABLE_PACKAGING}) set_property(TARGET gnuradio_block_test PROPERTY EXCLUDE_FROM_ALL TRUE) endif(NOT ${ENABLE_PACKAGING}) target_link_libraries(gnuradio_block_test ${Boost_LIBRARIES} ${GFlags_LIBS} ${GLOG_LIBRARIES} ${GTEST_LIBRARIES} ${GNURADIO_RUNTIME_LIBRARIES} ${GNURADIO_BLOCKS_LIBRARIES} ${GNURADIO_FILTER_LIBRARIES} ${GNURADIO_ANALOG_LIBRARIES} gnss_sp_libs gnss_rx gnss_system_parameters # signal_generator_blocks ${VOLK_GNSSSDR_LIBRARIES} ) add_test(gnuradio_block_test gnuradio_block_test) if(NOT ${GTEST_DIR_LOCAL}) add_dependencies(gnuradio_block_test gtest-${gtest_RELEASE}) else(NOT ${GTEST_DIR_LOCAL}) add_dependencies(gnuradio_block_test gtest) endif(NOT ${GTEST_DIR_LOCAL}) # add_executable(acq_test ${EXCLUDE} # ${CMAKE_CURRENT_SOURCE_DIR}/single_test_main.cc # ${CMAKE_CURRENT_SOURCE_DIR}/gnss_block/gps_l1_ca_pcps_acquisition_test.cc # ${CMAKE_CURRENT_SOURCE_DIR}/gnss_block/galileo_e1_pcps_ambiguous_acquisition_test.cc # ) # target_link_libraries(acq_test ${Boost_LIBRARIES} # ${GFlags_LIBS} # ${GLOG_LIBRARIES} # ${GTEST_LIBRARIES} # ${GNURADIO_RUNTIME_LIBRARIES} # ${GNURADIO_BLOCKS_LIBRARIES} # ${GNURADIO_FILTER_LIBRARIES} # ${GNURADIO_ANALOG_LIBRARIES} # gnss_sp_libs # gnss_rx # gnss_system_parameters # signal_generator_blocks # ${VOLK_GNSSSDR_LIBRARIES} # ) # add_test(acq_test acq_test) add_executable(trk_test ${CMAKE_CURRENT_SOURCE_DIR}/single_test_main.cc ${CMAKE_CURRENT_SOURCE_DIR}/unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc ${CMAKE_CURRENT_SOURCE_DIR}/unit-tests/signal-processing-blocks/tracking/tracking_loop_filter_test.cc ) if(NOT ${ENABLE_PACKAGING}) set_property(TARGET trk_test PROPERTY EXCLUDE_FROM_ALL TRUE) endif(NOT ${ENABLE_PACKAGING}) target_link_libraries(trk_test ${Boost_LIBRARIES} ${GFlags_LIBS} ${GLOG_LIBRARIES} ${GTEST_LIBRARIES} ${GNURADIO_RUNTIME_LIBRARIES} ${GNURADIO_BLOCKS_LIBRARIES} ${GNURADIO_FILTER_LIBRARIES} ${GNURADIO_ANALOG_LIBRARIES} gnss_sp_libs gnss_rx gnss_system_parameters signal_generator_blocks ${VOLK_GNSSSDR_LIBRARIES} ) add_test(trk_test trk_test) if(NOT ${GTEST_DIR_LOCAL}) add_dependencies(trk_test gtest-${gtest_RELEASE}) else(NOT ${GTEST_DIR_LOCAL}) add_dependencies(trk_test gtest) endif(NOT ${GTEST_DIR_LOCAL}) add_dependencies(check control_thread_test flowgraph_test gnss_block_test gnuradio_block_test trk_test) ################################################################################ # System testing ################################################################################ if(ENABLE_SYSTEM_TESTING) set(HOST_SYSTEM "Unknown") if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") set(HOST_SYSTEM "GNU/Linux ${LINUX_DISTRIBUTION} ${LINUX_VER} ${ARCH_}") endif(${CMAKE_SYSTEM_NAME} MATCHES "Linux") if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(HOST_SYSTEM "MacOS") endif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") add_definitions(-DHOST_SYSTEM="${HOST_SYSTEM}") add_executable(ttff ${CMAKE_CURRENT_SOURCE_DIR}/system-tests/ttff_gps_l1.cc ) if(NOT ${GTEST_DIR_LOCAL}) add_dependencies(ttff gtest-${gtest_RELEASE}) else(NOT ${GTEST_DIR_LOCAL}) add_dependencies(ttff gtest) endif(NOT ${GTEST_DIR_LOCAL}) target_link_libraries(ttff ${Boost_LIBRARIES} ${GFlags_LIBS} ${GLOG_LIBRARIES} ${GTEST_LIBRARIES} ${GNURADIO_RUNTIME_LIBRARIES} ${GNURADIO_BLOCKS_LIBRARIES} ${GNURADIO_FILTER_LIBRARIES} ${GNURADIO_ANALOG_LIBRARIES} ${VOLK_GNSSSDR_LIBRARIES} gnss_sp_libs gnss_rx gnss_system_parameters ) add_custom_command(TARGET ttff POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $ ${CMAKE_SOURCE_DIR}/install/$ ) if(ENABLE_SYSTEM_TESTING_EXTRA) add_executable(obs_gps_l1_system_test ${CMAKE_CURRENT_SOURCE_DIR}/system-tests/obs_gps_l1_system_test.cc) if(NOT ${GTEST_DIR_LOCAL}) add_dependencies(obs_gps_l1_system_test gtest-${gtest_RELEASE} ) else(NOT ${GTEST_DIR_LOCAL}) add_dependencies(obs_gps_l1_system_test gtest) endif(NOT ${GTEST_DIR_LOCAL}) include_directories(${GPSTK_INCLUDE_DIRS}) target_link_libraries(obs_gps_l1_system_test ${GFlags_LIBS} ${GLOG_LIBRARIES} ${GTEST_LIBRARIES} gnss_sp_libs gnss_rx ${gpstk_libs}) add_custom_command(TARGET obs_gps_l1_system_test POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $ ${CMAKE_SOURCE_DIR}/install/$ ) endif(ENABLE_SYSTEM_TESTING_EXTRA) endif(ENABLE_SYSTEM_TESTING) gnss-sdr-0.0.9/src/tests/common-files/000077500000000000000000000000001305042567700176125ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/common-files/signal_generator_flags.h000066400000000000000000000041101305042567700244560ustar00rootroot00000000000000/*! * \file signal_generator_flags.h * \brief Helper file for unit testing * \author Carles Fernandez-Prades, 2017. cfernandez(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_SIGNAL_GENERATOR_FLAGS_H_ #define GNSS_SDR_SIGNAL_GENERATOR_FLAGS_H_ #include DEFINE_string(generator_binary, std::string(SW_GENERATOR_BIN), "Path of software-defined signal generator binary"); DEFINE_string(rinex_nav_file, std::string(DEFAULT_RINEX_NAV), "Input RINEX navigation file"); DEFINE_int32(duration, 100, "Duration of the experiment [in seconds, max = 300]"); DEFINE_string(static_position, "30.286502,120.032669,100", "Static receiver position [log,lat,height]"); DEFINE_string(dynamic_position, "", "Observer positions file, in .csv or .nmea format"); DEFINE_string(filename_rinex_obs, "sim.16o", "Filename of output RINEX navigation file"); DEFINE_string(filename_raw_data, "signal_out.bin", "Filename of output raw data file"); DEFINE_int32(fs_gen_hz, 2600000, "Samppling frequency [Hz]"); DEFINE_int32(test_satellite_PRN, 1, "PRN of the satellite under test (must be visible during the observation time)"); #endif gnss-sdr-0.0.9/src/tests/data/000077500000000000000000000000001305042567700161335ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/data/config_file_sample.txt000066400000000000000000000011671305042567700225060ustar00rootroot00000000000000; Sample for a configuration file for GNS-SDR [GNSS-SDR] Foo.param1=value SignalSource.implementation=FileSignalSource SignalSource.filename=/Users/carlesfernandez/Documents/workspace/gnss-sdr/trunk/data/sc2_d16.dat SignalSource.item_size=4 SignalSource.repeat=false SignalConditioner.implementation=Pass_Through SignalConditioner.item_type=float SignalConditioner.vector_size=1 Channels.count=1 Channel1.implementation=Pass_Through Channel1.item_type=float Channel1.vector_size=1 PVT.implementation=Pass_Through PVT.item_type=float PVT.vector_size=1 OutputFilter.implementation=NullSinkOutputFilter OuputFilter.item_size=4 gnss-sdr-0.0.9/src/tests/signal_samples/000077500000000000000000000000001305042567700202235ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/signal_samples/GPS_L1_CA_ID_1_Fs_4Msps_2ms.dat000066400000000000000000001750001305042567700253430ustar00rootroot00000000000000 ÿV·?³íyV7 å3ÂäU· Áس@U7ÿ4š‹T·3´hÇS7ãŸV4UóR·bly´HR7Cî4,Q·ôž´éP7šÃ¯4iO·ªXÀ´™ÝM7#¯Ð4e¨L·ÙÂà´ºbK7›ð4‡ J·™µ»¥H7¯¡5G.G·ñµ¦E7:T5. D·eiµocB7LN$5Ô¨@·Å+µSÝ>7¦~15ä=·ÃÅ7µ~;7ñÓ=59·§Cµ´77Çe5¯¼&·çéhµó$$7íFl56|!·Soµ€Â7G r5Ø÷·PptµG7}v5×/·q0xµ”27Nˆy5‹$·’‚zµÊ 7%{5`Ö ·÷U{µ^–7ù*{5×E·!šzµºÉÿ6l¡y5 çø¶×>xµÐãñ6ipv55Àê¶*4tµl|ã6+ˆq5«ܶ‚jnµ'•Ô6JÙj5ò̶¥ÒfµÆ/Å6¾Tb5dN½¶Ã]]µ9Nµ6ìëW5Š/­¶yýQµžò¤6±K5Á—œ¶â£Dµ?”6e5=5i‰‹¶›C5µ‘Ö‚6ìÌ,5t¶ÌÏ#µp6b6¹J5Ô&P¶7<µà=6Ù¢5Äb+¶súô´Ø¯6þ“Ý4ȶ¶Å´vXå5k«4gº¾µ©£´«·—5?ni4¤`µoF/´¦5/—å3‹•´†æO³Þ³`5S²òÃ4ø}¡3%i4µÈ¬´ýÃ5÷ÿ^4µ¨­µÈÝ”´žà×50q»4É4¶z;ã´° 6é5æ2,¶ <µGêA6Z÷05­ÅW¶}OGµêÃm6^E^5æñ¶DÙuµ 6±‡5ÎA˜¶ðm“µ†€£6f% 5”Í®¶,­µQ(º6öº5Ŷ÷&ȵ;Ñ6ýÖ5„ܶæ]äµéè6†ïò5¤ó¶Óç¶ÝBÿ66Hu·/=¶;M 7-"6ê(·Ð- ¶÷7ã_(6ê·.¸0¶°Î"7t696›µ(·sÚA¶cž.7â£J6¥ˆ4·u’S¶ýs:7Ù¥\6`@··Ýe¶]LF7³9o6™8L·i¹x¶S$R79.6#X·0†¶¡ø]7b‹6càc· ¶ÿÅi7~ •6 ©o·èFš¶‰u7‹}Ÿ6¸e{·Ĥ¶AŸ€7[ª6…‰ƒ·ð¯¶nq†7ô´6ÆV‰·æwº¶V9Œ7Ÿ À6ä·`©Å¶:õ‘7ÐVË6Δ·ѶV£—7<ÙÖ6¬tš·s­Ü¶æA7Ìâ6É  ·ßyè¶Ï¢7=qî6©Ž¥·wsô¶3I¨7€ú6þª·XK·V®­7`[7|X°·èo·¸ü²7¯ˆ 7Ïšµ·v¥ ·‡2¸7úÅ7§Ãº·øé·óM½7)72Ñ¿·H;·*MÂ7 h7 ÁÄ·/—·Z.Ç7aÈ"7“É·Yû%·´ïË7È/)7àCη_e,·iÐ7Í›/7ÒÒ·ÂÒ2·¬ Õ7é 67õ;×·í@9·µbÙ7yw<7µÛ·6­?·¼’Ý7ÊáB7‘›ß·ÛF·þ™á7FI7Êã·uL·½vå7h¡O7¢Tç·ÐÊR·A'é7áðU7cîê·7Y·Ó©ì7q1\7\Yî·*K_·Èüï7ü_b7ã“ñ·oe·wó7Ryh7Sœô·}k·A ö72zn7q÷·lpq·ŽÇø7H_t7‡ú·YFw·ÌKû70%z7,yü·_û|·w˜ý7vÈ7}©þ·F·¬ÿ7Ê¢‚7P¸[úƒ·’Â8{L…7¦-¸ð˜†·&‘8߇7ýì¸í‰·A8þYŠ7Y¸w‹·¶Ñ8ºŒ7¸¯ß·fB8ôýŽ7“n¸®·Š’8Ÿ#‘79®¸Š*’·Á81)“7u̸V”·àÎ8º •7½È¸ñ•·ü¹8DÌ–7¢¸í—·a‚8Úe˜7iY¸Ë#™·˜'8×™7ß츽€š·1©8?›7\¸Ç²›·Ä8;œ7î§¸í·œ·ó?8 )7Éθ2Ž·fT8 ç7ƒ¡ÿ·˜3ž·£‡þ7Zsž7[ý·%¦ž·ßü7½Ëž7ÞÉú·àãž· eù7Qîž7]í÷·Ðêž·Çbö7 Ùž7?Åô·¹ž·¿ó79Šž7?Qñ·†Lž·ºzï7­ÿ7+‘í·q£·”ë7•77å„é·Ü»œ·,bç7 0œ7e,å·ç“›·‘ãâ75çš7µ‡à·º)š·ÖÞ7<[™7ø–Û·ƒ{˜·%Ù7TŠ—7dZÖ·x‡–·¿ŸÓ7·r•7CÒзÛK”·üñÍ7¬“7ùþÊ·õÆ‘·HùÇ7h7üàÄ·÷Ž·%¶Á7‘r7Ùx¾·¯Ú‹·,)»7C/Š75Ç··pˆ· S´7 †7Ḛ̀·Ýµ„·‡4­7gº‚7dŠ©·zª€·|Î¥7Ô }7™x·Û!ž7büs7e1š·g5o·­/–7ÕCj7Ù’·Z'e·ù7¬ß_7uĉ·~lZ·5…7ˆÍT7y)·…O·Ö†y71 I7sšp·KçB·#Žg7“–<7Fb^·Î6·=U7Âm/7m­K·8•(·=%B7üŽ!78·ÜZ·g».7©ø7Ú$·9h ·)Ý7`©7÷ôw÷¶Ž7Æ?ç6âzø¶õ©Ö¶ý£ã6G¶Å6…˜Î¶ˆd´¶}Y¹6‰´¢6ê磶$¦¶ÙDŽ6nr|6·âp¶NÛV¶ ÝD6Á†06êz¶«t ¶}×5þIÃ5è¨zµõ^dµ-Š4?Ï|4½çã4ÚÑ46•µoеqÏñ5má5\'¶x¶‰‚V6'¾I6ÝÝ‚¶ßuw¶±œš6–ô’6u|²¶È‹ª¶Ü{Ê6;€Â6’™â¶ ÑÚ¶@Ôú6Ÿó6G• ·íD·ŽÍ7ô÷7E"·­Ø·¹b.7Þæ,77¾:·F":·$G7£ŠG7v“S·­U·Æ `7áb7@Œl·–Îp·&y7Òç~7^Ñ‚·;–†·¡‰7Î7}h·@•··•7}œ7zœ·Ñô£·ÙZ¢7Ë€«7K®¨·G!³·k¯7 Öº7ØVµ·ÖžÂ·-«»7o{Ê7ÿÁ·“kÒ·ýQÈ7ÿnÚ7¯£Î·o…â·µóÔ7›®ê7ªAÛ·:êò·'á78û7ÇÕç·Ò˸!î7h8Ñ\ô·›E ¸nšú7A8Èi¸.á¸êƒ87;8g›¸/¸ ° 8ç 8¥Á ¸1x$¸ÿÏ8Üð(8åÚ¸¶p-¸%â8Ž÷18Šå¸1…6¸âä8h;8÷߸´?¸˜Ö!8ÂTD8È$¸vûH¸­µ'8ä§M8»*¸ÒYR¸ˆ€-8W8á]0¸CÍ[¸“538NŽ`8m6¸êSe¸<Ó88×j8Θ;¸Öën¸òW>8§½s8wA¸ “x¸+ÂC8¹k}8ßlF¸º#¸aI8ú’ƒ8‚¬K¸|†¸AN8uˆ8ãÍP¸µçЏÄRS8%[8‰ÏU¸GϸDX8÷C’8°Z¸¹”¸\]8j.—8äm_¸â£™¸n¿a8Pœ8Íd¸Žž¸ØFf8s¡8b|h¸Úw£¸C¨j8šë¥8QÊl¸Š^¨¸cân8‚Ъ8Qðp¸YA­¸ôór8æ°¯8$ít¸þ²¸»Ûv8y‹´8”¿x¸*ö¶¸Š˜z8é^¹8xf|¸ŠÅ»¸;)~8á)¾8±à¸Ã‹À¸[Æ€8ëÂ8•–¸zGŸ÷`‚8ö Ç8p%ƒ¸M÷ɸðãƒ8QJÌ8jœ„¸Ö™Î¸ÍN…8®åÐ8 û…¸¬-Ó¸¡†8¢qÕ8é@‡¸c±×¸lÚ‡8ÁìÙ8•mˆ¸#ܸZúˆ8™UÞ8¯€‰¸·‚จŠ8·ªâ8ÛyЏmÍ丟ìŠ8¨êæ8ÈX‹¸:é¸N¾‹8ôë8(Œ¸¦í¸NuŒ8#%ï8¹ÆŒ¸:$ñ¸`8½ó8>U¸|õ¸K’8Hùö8ƒÈ¸óÜø¸á÷8L¹ú8^ ޏ&Žü¸ùAŽ8P[þ8¬\ޏN¹upŽ8íî9Q}ޏnɹ?ƒŽ8ºŸ9=‚ޏ¹q¹JzŽ8T?9ekޏt¹UŽ8Í9Ë8ޏ挹Ž8 H9vê¸Vþ¹ê¸8µ¯9x€¸\ ¹!A8N 9ëúŒ¸\¥ ¹Û­Œ8!B 9ôYŒ¸‰Ù ¹?ÿ‹8}k 9À‹¸æ÷ ¹5‹8±~ 9„ÆŠ¸Æÿ ¹ÖPŠ8{9Ô‰¸|ð¹‡Q‰8ó_9úLj¸`ɹà7ˆ8¯,9E¡‡¸Ë‰¹5‡8¡à9¼`†¸1¹ç¶…8){9Â…¸³¾¹\P„8©û9Ä“ƒ¸ö1¹Ñ‚8ˆa95‚¸Lй`980¬9–d€¸"ǹÔ8Û9ÙR}¸éç¹a†{8›í9‘®y¸ì¹Ëw8Jã9ƒÝu¸%Ó¹—äs8™»9òàq¸”œ¹ÁÒo8 v9.ºm¸çG¹g—k8!9™ji¸¨Ô¹ó3g8n9¤ód¸fB¹Þ©b8‚í9ÒV`¸¶¹±ú]8ô+9°•[¸1¿¹(Y8aJ9à±V¸y͹{3T8nH9 ­Q¸5» ¹ËO8Ä% 9ñˆL¸ˆ ¹·ëI8â 9WGG¸Â3 ¹ œD8} 9êA¸¾ ¹¥1?8ö9s<¸&¹j®98"N9ä6¸5m¹N48Áƒ9J?1¸Á‘¹Ne.80—9›†+¸ ”¹r£(8Jˆ9¼%¸ís¹ÍÐ"8Þ­þ8Öá¸bü¸xï8ú8öù¸7˜÷¸—8 õ8Ÿ¸ˆò¸U 8Àæï8ÿ ¸ž3í¸ä 8*oê8K¸h™ç¸}8Y²ä8Áý¸ºá¸½ðý7k°Þ8?å÷·—•Û¸—Ùñ7iØ8ZÎë·W,Õ¸Äå7ýÝÑ8g»ß·‰~θ״Ù7Ë8þ°Ó·ƒŒÇ¸p°Í7 úÃ8À³Ç·©VÀ¸ƒ»Á7q¢¼8MÈ»·qݸ¸´Úµ7¹µ8Jó¯·^!±¸¦ª7p*­8\9¤·#©¸hž72 ¥8%Ÿ˜· ã ¸aß’7«ªœ8G)·'b˜¸j}‡7— ”8^Ü·¡¸jx7Â(‹8zm·³ †¸ªb7 ‚8ŸW·¹Ãz¸«ÚL7¢Vq8F2B· Ëg¸q§772!^8I;-·\YT¸ëî"7ÏsJ8o÷Ñp@¸í¹7ªP68}Ó·¥,¸d"ö6º!8î|<ï¤À=4Ž<¬áÀ=6mŒ<º×À=TzŠB€¼xÁ½¶[|¼Á½®Tx¼ÞŸÁ½ò2t¼å«Á½J#p¼5ÆÁ½?l¼b×Á½bðg¼ëÁ½bÖc< ýÁ=¯Ä_<Â=S¡[<ÍÂ=`•WÂ=}S¼ÐQ½9OO¼HQ½"KK¼ðw½èG¼{p½‰C¼·œÂ½fÝ>¼BŽÂ½Pâ:¼$À½Ģ6¼ªÂ½„«2¼7â½g.¼‹Å½4s*¼ïýb*&¼ ß½m9"¼K"ýÃì¼#÷½=þ¼K@ýE®¼Î ý±Á¼í\ýùn ¼#ý׃ ¼2xýï.¼â6ý¨›ñ;úQÃ=½Çé;_¶Ã=á;EbÃ=ÇCÙ;ÖÌÃ=¶“Ð;'qÃ=´½È;íáÃ=À;Ÿ~Ã=¡5¸;¢õÃ=ˆ¯;¯ŠÃ=;E§»0ýfŸ»˜ĽA¾–»#šÃ½qÙŽ»× ĽÈ6†»¯¢Ã½…–|»±/Ľá]k»Ô©Ã½0w[»'=ĽzæJ;\CÄ=|Å9;ë±Ã=Ã);ºNÄ=þ´;µÃ=Ä,»Ý¶Ã½Uðº']Ľ9κj¸Ã½ˆÁ­ºeĽ?—Œ:mhÄ=V:"¸Ã=p€:/nÄ=…²£95¶Ã=qÕ{¸º´Ã½´8¼6Â=lš=¼MÃ=»A<)>ýՃD<÷ÛÁ½ƒûI<`ýѯL<}·Á½5ÅP¼Á¤Á=¶YV¼wîÂ=ÂîX¼L~Á=Ë–^¼ ÌÂ=Ë´bJ=}ü¹½¥.=C¸½Ù'½·¸=:½{v¹=Ÿ½4À·=ä-½^¹=o'=Gí¸½³=«:·½º = ¸½Xò="à¶½ï =b1¸½á =d„¶½ û =RÑ·½Ï =p'¶½ ê=Úo·½¼=Hɵ½è×=ü ·½¨=ìiµ½Ì½Ê9µ=º½v¶=‚ˆ½ŸØ´=ƒ}=—§´½š=ܵ½Òf=žD´½Àƒ=™sµ½,O=rà³½ºk=Ì µ½6={³½{R= ž´½ù=€³½ÿ7=2´½f=º¬²½B =0ij½ê !½»Œ³=§Ø ½Ð²=Eð"½Î³=Œ»"½ ¤±=œ¬#=4n±½aÁ%=dr²½ó%=¡±½} '=ÿ±½Œ(½øÄ±=û](½„\°=«l*½³O±=©<*½ñì¯=˜++=´´¯½Ô5-=Q°½£-=TC¯½’/=Á$°½íû/½üç¯=Ò/½—®=›Ó1½ym¯=]¬1½£"®=™2=ÿç­½ƒ”4=H³®½”q4=Ðq­½²h6=5®½AR7½5ö­=*47½I¾¬=M$9½‘v­=¼ 9½E¬=ô9= ¬½¯Ü;=¾´¬½ÔÇ;= «½>±<½O«=Í‘>½ð«=&ƒ>½KÒª= ^@½uk«=ÌS@½GTª=Ô(B½•åª=-#B½Õ©=òC½|^ª=6ÖD=zª½Ò×D=õ©½DF=‘©½ó£F=·‘¨½ÑbH=p©½¾nH=B¨½Ú&J=|¨½08J=˜‰§½fK½ÎF§=ÊL½í¨§=ÉãL½RÀ¦=IŠN½¨§=ÓiO=Ó¦½?ŒO=Rô¥½¾'Q=C¦½PQ=Íj¥½äR=ê±¥½‹S=ऽïžT=›¥½‚ÓT=T¤½2XV=*Œ¤½“V=óÆ£½äX=˜÷£½ýPX=‘8£½k/Y½ëð¢=~ Z½¥£= ëZ½¶`¢=AT\½K¢=I¥\½IÏ¡=p^½Ùæ¡=á]^½¤<¡=·_½PM¡=ã`½Ç¨ = fa½²² =IÊa½³ =sc½ =~c½g}Ÿ=C¿d½BzŸ=/0e½ãåž=Ÿf=­™ž½û=g=(ž½<¸g=Vž½Éåh=Éí½¹i½µ=v½ZI¬=IÎ?½p˜ª=Ù¾<½±Ð¬= >½û«=<ê:½ÇV­=C6<½Tˆ«=}9½™Û­=îg:½}þ«=¢=7½%_®=˜8½vs¬=®e5½fá®=¦Æ6½Bç¬=¨Œ3½Yb¯=·ó4½áY­=“²1½üá¯=D3½VË­=v×/½J`°=MI1½¢;®=Tû-½Bݰ=Õq/½Æª®=2,½ÞX±=ߘ-½Ä¯=@*½Ó±=m¾+½ž…¯=a(½ûK²=â)½Uñ¯=ú€&½tò=(½«þ²½à'=ʰ½2¯#=t³½N6%=°ù°½ßÌ!=ùç³½LU#=za±½§é=zZ´½Ýr!=(ȱ½=‰Ë´½=¼-²½š =";µ½Ã©=7’²½Ì:= IJ=•G½Äßµ=HϽæ&³=ˆ`½ªK¶=•æ½ ¶½¹ñ=&¹³½n„=±ê¶½ÿ=N´½]›=üH´=Ц½M†·=j$½Œ§´=M¼½nÖ´½åÆ=v¸½â>=h3µ½ƒÛ =ö¸½ìN=!³¸=xV ½ç¼µ= ù ½H¹=d ½D¶=Ì ½Üs¹=„q ½—p¶=Õ½Úѹ=3}½áȶ=&/½£ô¶½‹7=×[º½xŒ=cK·½ÎG=Òµº½-•=5âº=™½™Ë·=̽ü¼Á9»='@ÿ¼Í¸=àÚø¼«»=ÝKû¼ýr¸=šöô¼òã»=_U÷¼,Ÿ=þñ¼’6¼=µ\ó¼X¹=*í¼Š‡¼=ìa$f¹=ÐAé¼:޹½4Mç<ßý¼½Ýeé<æÜ¹½cã<«J½½÷eåÍ<Ä绽KØÇ<å4¿½J2É<.¼½äÃ<~Q¼=ŒéÁ¼“¿=Dü¼–¼=ˆó½¼³Ï¿=¡ ¿¼_í¿½¿½<¾ü¼½A¸4<Œ$½âÓ.< •ý›ñ+<öœÃ=éÊ'¼ŽbÂ=à–"¼“«Ã=M}¼wŠÂ=žk¼þ½8U»©ÐÃ=ÀF-»eÌý;·;iFĽfƒ ;ÀÂýŒ6÷:?[Ľ‚ÊÖ:¡·Ã½Qµ:ÁnĽ2‚”: «Ã½¤Âe:í€Ä½†\$:‰Ä=BĹv•Ã=;­û¸£™Ä=8$ 9G…Ã=úFÉ9g¨Ä=^§':¬sÃ=‚¦h:ȵÄ=ôL–:ª`Ã=8I¶:£Výº?׺;ÇĽËúº‹AýÀ‘ »ÑĽ¢R»+ýJ}-»‰ÙĽŸ?»?ýEbN»ˆàĽuï`»ú½}@o»æÄ½Â!»ŽßÂ½ß ˆ»(êĽ|Í‘»¸Ã½ës˜»ÂìĽÄz¢»“¦Â½Lب»ÞíĽt)³»ÜíÄ=H»;nxÂ=ÌgÁ;·ìÄ=Í1Ì;XÂ=¢ÂÑ;iG½’îÙ»%èĽt<å»(%½qCê»-ãĽ<ïõ»¨½?”ú»¨ÜĽQQ¼íÜÁ½up¼ÊÁ=ׂ <ôÏÄ=BØ<Œ£Á=¦<ƒÅÄ=[2<Ë{Á= Ç<{¹Ä=uŒ <ÙRÁ=éå!<Ú«Ä=yæ(<º(Á=“*<œÄ=O@1ýò¼Z¼·½À¬í¼Ô“·=Áœï< ½=Íüø<B·=à{ó8="®=o!==_Bª=¶:=Ž–­=&ë>=2Ï©=wî;=» ­= ³@=ðZ©=VÅ==Œ{¬=yB=–å¨=L›?=ì«=[=D=#o¨=VpA=€3¨½€ZB½D«½FàF½b»§½.D½vª½éŸH½%B§½¿F½`멽´]J½ÆÇ¦½aÒG½)Ц=кH=â ©=ìöL=¦=èŠJ=ªs¨=°N=™'¨½ø‹O½ÅQ¥½ AM½Ž§½XBQ½ÇÒ¤½tO½Oô¦½ÞöR½šR¤½½ÚP½âX¦½‰©T½>Ñ£½à¥R½L¼¥½YZV½¯N£½ØoT½¥½O X½ëÊ¢½8V½´¤½k¶Y½ðE¢½(X½ºß£½®a[½»¿¡½rÆY½+|¡=©Z=·í¢=ß]=ô =xm\=K¢=È…_=Kù¡½mX`½±% ½‚_½ U¡½Xüa½‚šŸ½~Ò`½qTŸ=w²a=¹\ =Índ=[Çž=Vqc=쵟=-f=&bŸ½/Ýf½Uñ½ì f½Þ¹ž½Úyh½ a½Èg½j=%¥h=¥»=~áj=.†œ= ^j=û=°yl=¥ò›=[l=deœ=n=Ì]›=Ëm=丛=Ȥo=¢Çš=!o=} ›=±7q=%0š=†1q=è㙽 r½½š½Ìs½mJ™½å¹s½)V™½`u½ þ˜=æu=µa˜=P>v=4M˜=rw=âÄ—=ªéw=øu—½§¾x½cB—½ÛÀy½!×–½9gz½~–½¤H{½À5–=ç |=Væ•=„à|=«•=0‘}=D•=H„~=ò”½lU½r”½Ö½>N”½{€½¼“½™«€½ ¨“½yJ½V“½`k½§“½Ï‚½ÙM’½Y*‚½Ôñ‘=‰‰‚=£’=WLƒ=@9‘=PGƒ=BZ‘=„=õ=M„=„®=™â„=÷Å=À„=k=¬…=F =î{…=õR=it†=æOŽ=–6†=$£Ž=œ;‡=Ø“=yð†=÷ñ=¦ˆ=׌=š©‡=p?=ƒÆˆ=½Œ=úaˆ=‹Œ=.Љ=³[‹=™‰=oüн!u‰½9{‹½i­Š½l=н¤+нüʽn‹½ÞgŠ=ÞÍ‹=¶‰=<‹= ®‰=œŒŒ=]ˆ=²ð‹=ôˆ=J=㛇=¥¤Œ=+8ˆ=CŽ= Ú†=ßW=öz‡=&ÁŽ=”†=b Ž=r¼†=¹z=€T…=.¼Ž= ü…=ù2=Є=Dm=ƒ;…=áé=…̃=¥=y„=oŸ‘=Ÿƒ=RÍ=nµƒ=ŸS’=B‚=K|‘={ð‚=n“=|=‘*’=E*‚=Ú·“=Rµ€=%Ø’=Ïb=ßg”= Ü=…“=š€=z•=DL~=51”=Z =©Ã•=I»|=³Ü”= ~=io–=){=‡•=•_z½£Ü•½¤{½Tn—½ŸËx½e†–½2x=Û–=½8y=÷i˜=qkv=»ƒ—=ê˜w=ã™=~Ôt=À+˜=Æöu=U´™=XÈO½/0¦½)O½ì–¦½rN½Æ¦½@M½…§½G]L½ø[§½…nK½˜–§½'…J=Õ§=rÉI=‰:¨=J±H=]R¨=ÒH=Ïͨ={2G½©½¿ðE½½ ©½ÂvE½©©½FD½Çƒ©½Ÿ¹C½:ª½i@B½Sû©½ûA½ʪ½2f@½aqª½—x?=Ù«ª=Z?=l «=hœ==¯«=o˜==.¬=ó¾;= ’«=ÝÔ;=ʺ¬=Aà9=ò¬=Ø:=}F­=Z8=dr¬=^I8=,Ñ­=F6=cà¬=p6=ÔZ®= =4=ñL­= ¸4=qã®=·Y2=¸­=,í2=ÿj¯=Ku0=Ç!®=Ö 1=zñ¯=Ò.=Š®=S/=Þv°=S©,=÷ð®=ºƒ-=%û°=ÕÁ*=wV¯=¹Í)½³ˆ¯½Ê*½u¿±½Êä'½!쯽÷(½å@²½ðú%½2N°½…"'½+Á²½0$½è®°½ŒL%½C@³½‘$"½E±½u#½'¾³½8 ½Ml±½&œ!½Ô:´½¯ =´x´=âS=Þö±=ôÓ=†ó´=me=›Q²=N÷=mµ=5v= «²=.=]åµ=C†=6³=•9=[\¶=›•=Z³=„X= Ò¶=D¤=¹¯³=X«½Ú³½,„½€·½¹½Ñ-´½uŸ½dò·½ ƽV€´½K¹½Zc¸½zÒ ½¡Ñ´½°Ñ½íÒ¸½YÝ =1 ¹=ä =MIµ=™ó =¨w¹=ýî=–—µ=Eô½H¾µ½Q ½.º½pþ½Ë ¶½ %½ ƒº½½#V¶½^6½t뺽9½R ¶½PF½aR»½¿3þ¼\é¶½åT½Î·»½Dú¼B1·½;Äþ¼¸¼½‹Sö¼x·½ÿÛú¼~¼½bò¼°½·½ñö¼õÞ¼½Èoî¼<¸½–ó¼?>½½¢|ê¼°E¸½yï¼ù›½½«ˆæ¼ ˆ¸½Í ë¼ø½½é“â¼Tɸ½›+缨R¾½cžÞ¼Š ¹½ê3ã¼—«¾½¨Ú¼¯H¹½Å9߼追±Ö¼Ç†¹½5=Û¼–X¿½f¹Ò¼Òù½D>×¼Ÿ¬¿½ÿÀμÔÿ¹½ü<Ó¼ÿ¿½êÇʼÍ:º½ ËÈ<çWº=Å6;=[–e¼ Q¾½j¼ÓˆÅ½bŠ]¼gu¾½Ã±a¼/±Å½Ó…]<±ÄÅ=ŽvQ< ª¾=b,U<\êÅ=hI< ̾=`E¼¦Ü¾½ƒ¢H¼€ƽP=¼ý¾½JD@¼±@ƽ¦?5¼“¿½Xä7¼`ƽÄ--¼ ;¿½w$)<ëI¿=sQ+<Ú‹Æ=$!<çf¿=±í"<˦Æ=O»¼š³Æ½^ò¼¿½˜U¼âËÆ½­Ü ¼÷ª¿½¶î ¼dâÆ½ ƼkÄ¿½Ä†¼#÷ƽ]ù»ÙÜ¿½ÈDñ;®è¿=0Òñ;ôÇ=÷á;ÿ¿=ïýà;N#Ç=\ßÐ;hÀ=N(Ð;é1Ç=ý©À;4*À=‚Q¿;Æ>Ç=âr°;ò=À=Ày®;èIÇ=: ; PÀ==¡;PSÇ=—ÿ;=bÀ=,ÈŒ;[Ç=ð†;ÅrÀ=ƒÝw;ú`Ç=ôg»Scǽ—ÌN»‡‰À½ÌPE»Àfǽ}L.»S—À½P ;ÏÀ=²Ä;¹hÇ=ƒ û:ñ©À=ß%â:ðgÇ=útÀºëfǽ9u™ººÀ½¿*zº£cǽ€¼0ºUÃÀ½@Cß9ŽÇÀ=cf@9[Ç=Ý”¸#ÏÀ=Ï{§9~ÒÀ½æâ:æOǽe V:SØÀ½¹>:Fǽ 㱺ˆ@Ç=ƒÅ̺ÞÞÀ=™&õºF4Ç=äú»½áÀ=©G;¹âÀ½ÿ,;äǽ„â7;ÊãÀ½—N;¨ǽý~X;£ãÀ½¹*p;Úüƽêy;AâÀ½Î܈;{鯽—?‘»7߯=•»ÜÝÀ=2¢»†ÉÆ=zV¥»]ÙÀ=IJ»M²Æ=I§µ»šÓÀ=‚Ã»Ž™Æ=jøÅ»’ÌÀ= =Ô»KÆ=ÁIÖ»@ÄÀ=âô仉cÆ=5›æ»£ºÀ=ñÃî;XµÀ½tþ;7ƽ[ÿ;Å©À½îX<¤ƽ„ ¼\Æ=‘Ç ¼ï•À=Ù¼µåÅ=öï¼ ‡À=8,¼›ÂÅ=!¼ÐvÀ=d}$¼žÅ=@$¼:eÀ=ÐS(<ì[À½eó0<šdŽ"{0Þ¸½Ccú<2»½Wù<½¸½qOþ<ë׺½óü<À?¸½è=£|º½'½Nº=jh½Å·=õ ½ˆñ¹=ƒ=”¹½ýT=ðF·½éö=Íc¹½ØF=ñ¶½]è=ܹ½»7=¼™¶½ÛØ =¿¢¸½¡' =ó@¶½aÈ =x@¸½… =·æµ½ê¶=Ý·½d= ‹µ½ðú½ª\µ=Úš½«E·=?ç½Öþ´=↽Mß¶=ƒ|=­«¶½¸Ç=mo´½g=ŽC¶½Z±= ´½qP=BÚµ½ä™=B«³½Ó8=Éoµ½Q=G³½# =$µ½Ÿg=}á²½^=Q—´½ÊL=„z²½ë=P)´½Î0=+²½„Ï!=!º³½©!=r¨±½¦"½s±=l£$½#³=¼å#½O±=™„&½ÿž²=¡Å%½1š°=›d(½ª+²=Q¤'½¼+°=oC*½&·±=Ê)½ð»¯=!,½qA±= ^+½ÐJ¯=ý-½ŠÊ°= 9-½_Ø®=²Ø/½rR°=Î/½žd®=6ÿ/=@*®½(Ÿ2=œ¯½×1=Œ´­½8w4=ú ¯½­­3==­½N6=±¤®½ý‚5=FŬ½z#8=4'®½¹ 9½è­=ˆ@8½y¬=8á:½¸h­=˜:½“«="û:=ÕT«½ñ›==†§¬½9Ë<=‚ת½ l?=8%¬½ü™>=ñXª½Å:A=µ¡«½ig@=%Ù©½C=ý«½6îC½-Úª=C½'©=d¹E½¥Sª=ãD½O”¨=ƒG½çË©=Ä«F½B¨=bKI½óB©=sH½‹§=*K½Ê¸¨=9J½’§=r×L½k-¨=’ýK½ó|¦=4›N½Ö §=»ÀM½(ô¥=m]P½ §=}‚O½1j¥=ÖbP=Æ$¥½×ýR=<¦½{"R=™¤½$¼T=I«¥½´àS=7 ¤½ØxV=E¥½€U=8~£½]{V½Ë6£=ÝY½ý;¤=6X½§¢=}ÉZ½÷¦£=6ïY½D¢=u€\½½£=ö¦[½Q„¡=¿5^½Qy¢=Â_=(-¢½Ù7^=M§ ½Â`=ñ“¡½ðë_=“ ½nÅ`½ÌÇŸ=aKc½á« =Mwb½l1Ÿ=Êùd½° =¯'d½ô™ž=p¦f½PrŸ=‘Öe½fž=OQh½ÂÓž=&i= „ž½Zh=‰½?Îj=·ã½/j=Hœ½+Új½A1œ=Gm½ ñœ=ý‚l½f”›=´ên½ÌMœ=E*n½zöš=tŒp½e©›=Ðo½Wš=U,r½×›=’ûr=¡°š½°Er= g™½Ÿ˜t=Y š½„çs=pŘ½×·t½=t˜= w½J ™=LWv½Ñ—=å˜x½)b˜=*õw½Ö,—=:/z½é¶—=l‘y½”‡–=œÃ{½‰ —=,{½Iá•=V}½ ]–=Å|½÷9•=zæ~½r®•=y\~½œ‘”=x:€½¾þ”=6ò½<è“=´½òM”=%À½Õ=“=ðŽœ“=YŒ½i’’=£ð=Q<’½äë‚=6’½“¸‚=_‘½˜®ƒ=£Ú‘½ªƒ=há½Gp„=%‘½åE„=o2½ï0…=Pn½á…½“=žm…½*=þO†½QZ=­1†½”xŽ=`“†=t޽¹l‡=ÿC޽V‡=rl½>)ˆ=,‰½ôˆ=p¸Œ½¹äˆ=UÍŒ½å؈=nŒ½'Ÿ‰=}Œ½úû‰½±±‹=›ø‰½ òŠ=մн\óŠ=D·Š½‰:Š=@‹=iÞ‰½$È‹=Ô‰½…Ó‹=j%‰½\~Œ==‰½ÙŒ½~²ˆ=©íŒ½ˆ=´½Gð‡=‘¨½”R‡=FA޽-‡=ƒb޽–†=Çó޽i†=¡L=Ÿ†½w=y…½‰ý="A…½ /=¢º„½‚нÌZ„=摽/„=ˆ@‘½dšƒ=#³‘½mOƒ=Û ’=6낽­O’=òw‚½}¶’="‚½,“=µ½b“=$X½£µ“=Cñ€½ ”=M€½g”=u,€½e¿”½a“=I •½Ú¶~=@o•½Ú~=²•½æ}=–=LO|½ u–=o°{½Ô«–=Ö²z½<"—=z½ùP—=»y½VΗ=É‹x½ õ—=ÿtw½Xy˜=“öv½˜˜=¦Óu½?#™=s_u½ÿ9™=´0t½ Ì™=iÆs½ßÚ™=/Œr½³sš=x+r½­zš=æp½:›=¡Žp½m›½¿o=dh›½jn=Ýœ½Òn=‰œ½/Àl=ƒµœ½C~l=ž¡œ½Çk=üW½ÓÚj=¤<½âgi=Gù½…5i=›Ö½…¹g=b™ž½[Žg=üèž=ºf½»ž=B1e½H‡Ÿ=#e½âRŸ=Kc½&žŸ½Ç¥b=rr ½Çb=â3 ½²ñ`=¯ ¡½Aß`=×Z¡=P`½„¡=ø`^½7ô¡=V^½Ÿ¥¡=o©\½VŒ¢=£\½®7¢=ŒðZ½1#£=.îZ½°È¢=P6Y½Æ¸£=7Y½¦X£=ÁzW½M¤=+W½ç£=á½U½¡.¤½óÞT=)¥½IçT=ú»¤½! S="º¥½†*S=HH¥½`Q=ÝI¦½lQ=ŒÓ¥½¤žO=Eئ½Ò«O=Å]¦½ÜM=Xe§½ééM=󿦽L=ñ§½P&L=o§½SJ=u{¨½ aJ=2ö§½¨ŒH=z©½šH=B|¨½ÅF="Œ©½‡ÑF=I©½UüD=jª½QE=F…©½`2C=P—ª½~;C=9ª½½wÝ«=ú¶>½¥¬½Î==ÙŠ«½Îþ;=ñœ¬½`ü;=¥ ¬½/:=¨H¬=´F9½9½äŬ=7u7½ûÔ­=ih7½Q®½å|6=Ì­½ß¸4=é‹®½Á¤4=nú­½•ä2=¯½(Ë2=t®½01=Çz¯½ð0=쮽°8/=p(¯=M.½ *°=å$.½iŸ¯=åt,½3°=WF,½1Ö°½‹V+=äO°½«®)=G±½ðu)=;ݽÖÓ'=}¶±½ý“'=ƒ7±½ñ÷%=o$²½·°%=»©±½ü$=qâ±=,#½–Ʋ=aÙ"½S²=“M!½Ø0³=åò ½ŸÂ²=þm½ž™³=) ½1³=_½é´=4"½ƒž³=·«½·f´= 8½Ö ´=ɽ Ë´=±L½v´=Qå½ß-µ=.`½:à´=–½8µ=ˆr½IIµ=ؽïµ=ă½>±µ=4½qM¶=擽¶=XL½Rª¶=÷¢½Ö}¶=—c½J°¶½Øn =Ø2·½˜· =Z·½›„ =Œ·½Ä =Jw·½b™ =¬ã·½ŒÏ=Ù·½/­=Û9¸½Ú=Ä9¸½À=ŽŽ¸½ã=J™¸½ÝÑ=Åḽ=ì=©÷¸½Áâ=‚3¹½öó=ßT¹½båÿ<ă¹½˜õý<ë°¹½Yü<ŒÒ¹½Šú<Ê º½mø<ܺ½Ï ö<öEº=Tô¼à‘º=Fò¼‘º=)𼶺½|îÀ=`4‡¼}Â=²c†¼=dÀ=ȃ¼©JÂ=FO‚¼iˆÀ=B~¼`}Â=s|¼J«À=áéu¼ž®Â=Et¼°ÆÂ½1-p<3ÝÀ½ï¦i<¶õ½ûg<ßüÀ½!ya<; Á=åa]¼q9Ã=„¬[¼*Á=Ì2U¼·dÃ=útS¼Éyý_XOÄ=+3<ªTÁ=4˜4¿=Âk»ë#½Æ™±½ú'$½›+²½GÓ%½Ö#±½P&½CÁ±½º'½×¬°½}Ù'½pU±½´Ÿ)½Ê4°½ƒ°)½$è°½ „+½³»¯½`†+½]y°½g-½“A¯½[-½ °½ÝH/½mÆ®½ ./½^—¯½I)1½BJ®½1½%$¯½Y3½Í­½<Ò2½q¯®½æ4½çN­½L¢4½@9®½LÂ6½ºÏ¬½2q6½”Á­½!8½O¬½ï>8½kH­½€v:½kΫ½‚ :½ÆÍ¬½cN<½LL«½ëÖ;½¥Q¬½Â$>½6ɪ½+¡=½Ô«½˜ù?½)Eª½Aj?½ðT«½ÝÌA½(À©½-2A½\Ôª½‹žC½4:©½îøB½NRª½œnE½¹ª=VF=€o¨=â E=sŒ©= #H=1ç§=ºdG=±¢§½7FH½Hè½ÞÔJ½ý§½PJ½T;¨½9žL½Íö§=@‚M=´H¦=E©L=¦l§=ýHO=³¼¥=shN= á¦=ó Q=Ç/¥=v&P=÷S¦=ÑR=ó¡¤=NãQ=²Z¤½IÁR½£}¥½lrU½Ë£½`|T½ð줽û0W½k;£½J6V½ÍZ¤½§íX½nª¢½ïW½9Ç£½k¨Z½æ|£=…[=DÏ¡=ïZ=.ç¢=ó<]= <¡=»7\= P¢=Úò^=î§ =Yì]=z·¡=Ʀ`=«j¡½üa½ÈŸ½ y`½ÿÏ ½ä0c½Ä1Ÿ½³*b½Eæž=c=^åŸ=l¶e=Nž=ð²d=7GŸ=3bg=¶=™af=­§ž=ã i=§=h=Åž=x³j=͵½v†k½ß4œ½ýj½Ú½Ù*m½?™›½l;l½Œnœ½Ín½¿üš½£äm½çÈ›½%mp½]_š½¡Œo½Wš=)`p=ðÍš=!Ùr=¢q™=Mr=ú$š=°st= Ò˜=4«s=µz™= v=”1˜=ÚNu=$Ϙ=¢w=9—=?ñv=H"˜=í5y=üí–=_’x=&t—=zÇz=›—½d{½÷ø•½¬{½“l–½}½‚T•½šŸ|½ò•=n}=/b•=Wn='\”= = ¯”=T{€=xµ“=\R€=±ú“=R>=ã “==¹’½…½äé’½š`‚½Õ’½ÇP‚½ˆ2’½¥ ƒ½hÖ‘=9€ƒ=¿‘=ƒ=I‘=|>„=f=÷J„= ½¯¯„½m½¤Y…½d½šx…½mI½é†½¶Ž½Ð@†½LŒŽ½ûΆ½<޽O‡½νه‡½ðX½χ½¶½?ˆ½¸¨Œ½$•ˆ½GNŒ½óõˆ½“÷‹½tZ‰½ÅŒ‹½/«‰½E‹½н3ÊŠ½4_н’нÖ⊽•н‹½‘Þ‰½ã¥‹½ïA‰½™Ã‹½:߈=ðŒ=çΈ=ÉŒ= ˆ=³ËŒ=ˆ=Š=½‡½\ê½ì톽ѽh‡½AªŽ½G%†½Ç}޽—À…=®ÓŽ=ð…=“È=‚ö„=“~=ö5…=j†=ŽØ„½彞ѽ¢|½„½™¡‘½ã¾ƒ=‘ÿ‘=§’‚=÷w‘=èƒ=Ùº’=âÄ=’=ª]½“p’½œä½ Ò“½’Ž€½Î“½2%½2‹”½ Å€=cç”= ¬~=å”=>€=Ÿ•=+ }=ª”=Ä„~=ÝU–= f{='J•=ÿ|=² —=LÀy=ýè•=iw{=”À—=ñx=¤†–=Æíy=}t˜=pv=#—=öšu½æp—½˜›w½ƒ€™½¶ïs½™ ˜½ý v½ò1š½ñDu=HŠš=lq=tñ˜=Y³s=/:›= ½o=;‰™=ån½°Ô™½7Uq½@œ½å3m½»jš½Ÿ¾o½]휽“òn=šC=”§j=¥I›=ûXm=Bï=ýòh=ÓÜ›=a½k=Ò™ž==g=ßnœ=Åj=ECŸ=Ï…e=Ëÿœ='€h=—ëŸ=DÍc=—=‡Þf=Ã’ =ub=Fž=6a½3ež½Shd½Y‹¡½jz_½9òž½ œ^=S8Ÿ=›ía=E¢=¦Þ\=µÃŸ=õC`=¶#£=bn_½yt£½<@Z½¿’ ½»Á]½¤½ÛX½n¡½\½o´¤½Z¾V½ £¡½qbZ½‡R¥½¾ûT½š)¢½T=|l¢=ÀÕW=D=¦=ÏUR=wñ¢=% V=#ئ=šDU½%§½€­O½þ¶£½ ŒS½÷½§½­æM½c9¤½âM=4z¤=óP=Æ ¨=Ž:K=û¤= 6O=G6©=’VN½„€©½8ŒH½}º¥½0–L½ñª½wÁF½Ù8¦½ßÓJ½÷¥ª½ÄõD½9¶¦½¡I½’6«½%)C½2§½zIG½¾Å«½œ[A½ ®§½kE½wS¬½-?½|(¨½ ¥>=Ze¨=ÌÑB=M%­=ßÕ<=_Þ¨= A=U¯­=A;=qV©=m6?=Þ7®=È39=’Í©=÷e==ã¾®=xa7=ÄCª=­“;=`D¯=TŽ5= ¹ª=s¤4½Tóª½ÙÔ8½· °½Ð2½9g«½ þ6½R‹°½éú0½5Ú«½|%5½Y ±½ñ$/½JL¬½)K3½Ê‰±½X]2=iȱ=„b,=¼õ¬=k€0=qD²=˜Š*=–e­=É¡.=Ú¾²=è±(=ŽÔ­=vÁ,=¡7³=uØ&=¦B®=wß*=î³=Aþ$=Þ¯®=Óû(=<$´=L##=9¯=‹5"½R¯½O#&½QÑ´½yY ½$½¯½£;$½›Bµ½«|½Y'°½dR"½2²µ½!Ÿ½´°½˜g ½ ¶½ÜÀ½6ù°½F{½CŒ¶½Ýá½à`±½s½·ö¶½û•=K+·==Ìú±=ô¥=%“·=51=]`²=‰@½Õ’²½8»½§+¸½¨^½&÷²½¤Ç½"¸½|½¡Z³½°Ò½Ù𸽾˜ ½H½³½Ñ¦ =Kî³=¾à=€¹=m =³O´=zè =dݹ=Üë ½] º½ê½Bà´½°ñ ½øeº½P½—?µ½ó=ònµ=ø=…êº=°)= ͵=éú=£@»=Þû½k»½rM½X¶½íü½p¾»½ÃÈü¼ ´¶½Þü½ ¼½/õø¼Ì·½o÷ý¼Ù_¼½' õ¼#j·½óù¼Ö­¼½ªIñ¼¢Ã·½‹ìõ¼ú¼½·qí¼I¸½0…ë¼%%½™ ;¼5ý)#6¼¥X½ß2<íqÂ=v’.<Ì.Ã=#í)<Š£Â=ÓB&Ã=(›<êÃ=¥<ØCÃ=ð}¼Fý]V ¼GýG0 ¼hIý%¼¼rýw <ˆÃ=`zù;»KÃ=j¬ñ;DZÃ=ãè;‚KÃ=²<á;ÚÃ=yMØ;äIÃ=àÇÐ;ûÄ=æ¹Ç;äFÃ=ãp¿»áDýN¸»¬8Ľà®»×?ý2ާ»ÿ[ĽÞKŸ;mÄ=2 –;Ç5Ã=½ÃŽ;<ŽÄ=ù}†»>žÄ½Åzz»Â(ý9Þk» ½Ä½wmY»xýÒèH;ØÃ=ˆ!:;šèÄ=©ã';¨ Ã=¿î;ªÅ=)ä;9ÿÂ=hï:*Å=öÔË:ðÂ=‚ã¬:5Å=·›‹ºs@ŽàüQºOØÂ½ºùUަœ¹¨ÆÂ½ïxH8d½Â=v÷W¹7sÅ=[øí¹ÿ©Â=\s;º§„Å=ïezºu•Â=1€ ºn”Å=§Ú¾ºËÂ=¹Q㺆¢Å=0_;ð¨Å½†ž;;]½}Ï#;{´Å½a1;ÔD½PDE;N¾Å½™R;]+½@½f;dÆÅ½ÆÒr;ؽð„;ºÌŽ}À‰;KõÁ½áÜ”;KÑŽš;¸ØÁ½‘<¢»ÊÁ=]ÿ­»ÍÔÅ=㊲»ý«Á=g¾»âÔÅ=­Õ»ðŒÁ=H†Ï»&ÓÅ=ñÓ»ëlÁ=ÃJ໕ÏÅ=­`ã»ôKÁ=šñ»,ÊÅ=ä ó» *Á=¯¿û;¿Á½€<‘¾Å½Rý»=“ż‰ÐÀ=×DÁ¼»=[$ɼî‡À=Ö<żůº=Ï-ͼU=À=V4ɼ‰º=Ý4ѼÂð¿=\+ͼLº=t9Õ¼6¢¿=è!Ñ¼Ž º=…;Ù¼²Q¿=üÕ¼\ι=þ:ݼ:ÿ¾=› Ù¼m޹=Ð7á¼Ðª¾=ÅݼÀM¹=ë1å¼vT¾=|÷à¼S ¹=?)é¼/ü½=Àëä¼&ʸ=½í¼ý¡½=’ßè¼5‡¸=PÙê½÷«= t>½×·ª=[’@½"«= &@½ ª=ú{B½ó!«=CÖA½…©=ÆdD½vµª=v„C½ê¨=ÖZD= œ¨½[@G=@ª½%F=rÿ§½ÛF½´°§=æJ½h©=„ƒH½p§=ÿK½-ö¨=KñL=½¼¨½™üJ=#¦½øÔN=ÒH¨½J L=O‚¥½mqM½‹1¥=…¨Q½S˜§=LO½H¤=†‰S½å §=›yT=¦ä¦½€Q= 𣽿XV=k¦½YS=‰õ¢½ÆéS½ç¢¢=˜%Y½²¥=CƒU½úü¡=Ù[½Ì4¥=ðW½/V¡=ÐÜ\½¶¤=аX½Š® =u¶^½õ5¤=èDZ½ =½Ž`½M´£=:×[½É\Ÿ=žeb½$1£=…Pc=þn/^=a]ž½8%e=i¢½e½_=%²½køf=™â¡½§Ia=)½Êh=Z¡½6Ôb=rYœ½Ü˜c½Ñœ=“k½vŠ =è e½U›=1Om½þŸ=L§f½¦š=o½+pŸ=,h½e÷™=Ôíh=‘Ÿ™½ÃÉq=V˜ž½+pj=lJ‘s={ž½ëðk=¢>˜½üVu= s½pm=8—½Îw=Þœ½ÿûw½ê’œ=õ«o½ò–=í¼y½‚û›=J'q½Ï•=däq=Vu•½˜Z|=j›½x]s=‰Á”½~=zš½Õt=, ”½PÐ=Ý™½5Kv=@X“½Ä€=n>™½…1½ˆî˜=¹yx½ÚG’=¼ ‚½‰M˜=Lìy½—‘‘=¥z=C6‘½öPƒ= Y—½‹|=9½[(„= ´–½¨„}=¬Ç½•þ„=p –½lò~= ½¡Ó…=?e•½´=†½•=IŠ€½¡ú=÷e”=„?½]A=ä™=ŽäŒ½xKˆ=c“½(N‚=“*Œ½–‰=Ž´’½Éƒ="p‹½lê‰=m’½Ê´ƒ=:µŠ½„½šWŠ=>‹½Hù=$À„½œ‰=Í鋽;E=OŒ=Ÿê½Ê…=Lj½=<4½²z†=Ň½ÂÒ†½‹f‡=ZD޽ÁŽ=s‚‡½*©†=o ½„e=1ˆ½Yë…=ϽÀ©Œ=àˆ½-…=\’½xì‹=މ½en„=*T‘½­-‹=s;нD¯ƒ=ƒ’½dmŠ=J芽²ï‚=dÓ’½«‰=’”‹½±/‚=È“½]èˆ=M@Œ½@o=«L”½¦#ˆ=|댽^®€= •½{]‡= –½Ú=ä¿•½à•†=9@޽“V~=3w–½×Ì…=É鎽*Ò|=ô,—½e…=Ï’½ÝL{=$á—½Œ6„=L;½ªÆy=“˜½Piƒ=Aã½?x=ÉD™½µš‚=®Š‘½·v=7ô™½¿Ê=“1’½Ÿ.u= ¢š½qù€=ð×’½Ã¤s=?N›½Ð&€=Å}“½ør=|Г=8Tq½‚Mœ=×Ð}½„u”=Èo½£õœ=%|½•=Õ:n½œ=Ïvz½ú½•=±¬l½ó@ž=Æx½ga–=‘k½äž=Äw½I—=si½¡…Ÿ=]u½Ÿ¦—=Süg½x% =ý¤s½iH˜=/jf½¢Ã =Šêq½¡½p q=:™½ d=º­¡½„No=tÚ™½Kxb=¯G¢½RŽm=Izš½|â`=óߢ½åËk=Œ›½™K_=‡v£½Fj=;¸›½Ÿ³]=j ¤½@h=TVœ½Š\=›ž¤½›wf=Õóœ½U€Z=0¥½¢¬d=½½ýäX=è¿¥½Ÿßb= -ž½HW=N¦½œa=·Èž½ÖªU=RŸ=‘ÛT½ÿ§=mV^½±Ÿ=!y½š<¹=ß½dm·=ǘ½ÿ£·½ú§=ù¥¹½¨ý=¸½?Å=¼ê¹½·ù=Çz¸½ Âÿv¼ŒÀÀ=:ªo¼tÖÂ= n¼•ãÀ=3€g¼ÍôÀ½ùjc<¬ý©ºa<¥Á½@[<¯@ýY™;=ð½È;§ùÂ=ÿT‡»;ÑÄ=#I€»Ø Ã=#Äm»¢ÓÄ=÷J_»/Ã=£ÚL»ÔÄ=)>»«-Ã=pí+»ŸÒÄ=`¾»H=Ã=‚ü »:ÏÄ=;ôöºLÃ=œÔºëÉÄ=Æo´ºÆÄ½a/“:w`ý}Fb:c¾Ä½Âe!:ùlý ›¼9U´Ä½‰Îã8xý=ë¹g¨Ä½GÆÐ¹<ƒÃ½‹Ò)º›šÄ½5/mºøŒÃ½Öü–ºóŠÄ½Cô¸ºÁ•ýÙºtyĽ Fûº•ý| »!fĽåÆ»È[Ä=rV/;~§Ã=Ã>?;¼EÄ=ÍpP;ݬÃ=£Y`;-¯Ã½vèp»N!ĽÔ»³Ã½n‰»ËĽAŠ‘»ÝµÃ½o–™»‡êýР¢»§·Ã½5*ª»„ÌýP‡²»Ü¼Ã=ûú;Y¸Ã= Ã;CœÃ=:Ë;x·Ã=£Ó;Ÿ¶Ã½¸ïÛ»,hýâ㻴ýŠì»XCýïLô»N0Ã=E€ü;3®Ã=Fº<ýÃ=q<Ù¨Ã=N < àÂ=b ª=ÒÜ1=ø/±=3~:==_ª3=§®°=xY<=ã%©=9w5=š+°=Í2>=®¨=`C7=Ѧ¯=- @=œ5¨=Õ9=R ¯=’ßA=]¼§=–Ù:=˜®=ó²C=`B§=¥£<=7®=M„E=£Ç¦=ÿl>=¢‚­=˜SG=&L¦=¦5@=bõ¬=Î I=æÏ¥=—ýA={f¬=ëëJ=i¬½®ÐK½¥½*¨D½ «½™˜M½ì•¤½QnF½‹V¤=QG=õ¯ª=p@P=4×£=/I=‘ª=ðR=W£=ƒÚJ=–ƒ©=>ÃS=#Ö¢=žL=^•¢½œM½.ž¨½‰_V½:¢½BO½N¨½DX½Kµ§=ÉöX=zN¡=QäQ=!§=®Z=FÊ =ؤS=܇ ½Ð„T½)¦½Û<]½f ½'DV½ªˆ¥½yî^½ª7¥=kÆ_=›8Ÿ=¥áX=””¤=‘ta=±ž=ñžZ= ð£=d c=…(ž=f[\=J£=áÉd='Ÿ=ÿ^=¢¢=qf=æ=¹Ñ_=ú¡=Ïh=½‰œ=‹a=ÑCœ½%hb½^ú ½ˆj½I·›½Ÿ d½AN ½o'l½´÷Ÿ=ûõl=Àâš=•³f=IŸ=J‘n=âSš=±ih= š½aDi½Bž½Èõp½Í{™½ùj½È½!‹r½Šê˜½£¬l½AÞœ½t½NX˜½:_n½€*œ½¦®u½+Л=vv={—= ép=››=x=aæ–= ™r=¤›–½“ps½š½þQz½h–½Îu½ç¹•=}õu=íò˜=š›|= "•=ü¡w=Ã8˜=~=P‰”=JMy=}—= =sï“=a÷z=%Á–=^€=ˆT“=9 |=¹–=ƒM=Œ¸’=ÍG~=BE•=y ‚=£å”½ƒh‚½Ì‘½\`€½¡%”½´#ƒ½Ý-‘½€2½Þ=P›=À“=J:„=Æ==kl‚=FA’=ò„=Uœ=Ð<ƒ=×}‘=¥©…=ÆùŽ=} „=w¹=”_†=VŽ=lÛ„=,ô=[‡=G±=›©…=ù-=üLJ=ŠÊ޽^!ˆ½ì·Œ½m݆½޽GÓˆ½@Œ½§©‡½û»‹=vˆ=ÖŒ=܉=“‹=wÚˆ=w Œ=‹Š=hŠ=¢¤‰=þA‹= 9‹=D¼‰=ómŠ=¸vŠ=ßå‹=Èнß;Œ½t¸ˆ½Jš‹½TD‰½ çŒ½Ä ˆ½gaŒ½wˆ½‘½åY‡½›'½!©‡½:޽ÞA‡=,ŽŽ=ÚO†=*OŽ=Êr†=…5=ÿœ…==C…½“t½×:…½‡.½uŽ„½ö6½j„½3Ó½™Øƒ½Zø½|˜ƒ½Ðv‘½‡!ƒ½»¸‘½KÆ‚½_’½ô\‚=Cj’=© ‚=\×’=ɉ=B “=’R= •“=ûµ€=9«“=D—€=ÒQ”=Ã=*J”=€µ=l •=~=è”= :~=êÇ•=¶m|=þ„•=+¼|=I–=;Áz=æ –=Ý;{=„9—=–y=Ï»–=$¹y=–ð—=Ídw=ºU—=ÿ3x={¦˜=å´u=ªî—=q¬v=/[™=ât=¡†˜=y"u=®š=ÉQr= ™=–s=ôÀš=Ïr½ ›½£Äo½Qþ™½ ?q½Ê›½æn½ë’𽱬o½-yœ½"Zl½”&›½ôn½ '½[£j½M¹›½Ø€l½Ó½“ëh½Kœ½`çj½à~ž½Âj=Ôž=Vf= $=Ä|h=H}Ÿ=Ù›d=…³=a¾c½ìú½è f½ªx ½¼b½ ‰ž½jd½Œ¡½'F`½AŸ½ÿÄb½ á½¥ˆ^½’¢Ÿ½ša½(f¢½ I`=/·¢=©ê[=_s =Až^=-X£=ß*Z=vý =¤JY½,B¡½Ù\½ýF¤½‚‰W½ðÊ¡½viZ½f䤽qY=Ž2¥='æT=q–¢=ÁÜW=ÆÍ¥=Ñ"S=£=ã&V=…g¦=^Q=»¢£=ÝnT=Èÿ¦=Š™O=’'¤=´´R=–§=›ÓM=«¤=møP=Ð+¨=Ñ L=ª.¥=)K½æo¥½ZN½Þ©½aI½ºñ¥½›˜L½Tš©½˜G½±r¦½ÕJ½A*ª½XÎE½Íò¦½$éD=‰2§= ,H==ÿª=C=\±§=†cF=J‹«=ˆ~E½¹Ð«½ùk@½þm¨½³C½lZ¬½Ôž>½¬ê¨½ñ·==±(©=Vþ@=&­=‰é;=¤©=%.?=Ä«­=J:=Ÿª=\==í/®=2J8=L˜ª=;ˆ;=~²®=Cy6=«=²9=v3¯={§4= ‰«=Û7=Ó²¯=»î6½çñ¯½9ë1½W;¬½®5½Ún°½S0½±¬½-/=©ë¬=iJ2=A'±=áW-=`­='l0=* ±=Ù+=­Ó­=BŒ.=u²=öª)=[F®=Ī,="²=m¹+½\Dz½ç&½³ð®½”Õ)½™:³½ú %½#a¯½"!$=™¯=òü&=jä³=ÌF"=°=T%=˜S´=–k =@v°=A,#=&Á´=‚=}ã°=ÁA!=-µ=²=ÌO±=ÚU=d—µ=¸Ô=+»±=yå½€ð±½sq½Ñ3¶½Q½sZ²½/‚½š¶½G&½rò½ ‘½»þ¶½ZE½z+³½ÍŸ½Ãa·½Šc½‰’³½¿¬½0÷½Õ€½ø³½{¸½#¸½è½=QR¸=« =Þ´=äÇ=¼¯¸=)Æ =ró´=¾Ð = ¹=Sà =Vµ=}Ø =Êe¹=—ù=Ž·µ=*ß =o¾¹=ô=¶=Êä=€º=l)=„w¶=Ñ4½Ú¦¶½Të½%•º½îJ½¸·½uî½H躽«ï=C»=ÕÔü<‚·=Çâÿ<b»=üø<¬ê·=Á÷¼Ø¸½Œäù¼ZØ»½Ê4ó¼Zq¸½ãõ¼I%¼½X^ɸ½ßàñ¼°p¼½{yë¼!¹½‰‰é<4L¹=ÏÙë<íÞ¼=P¨å<¿¡¹=&Óç<‡&½=OÅá< ö¹=ýÊã<žl½=‰àÝýÐ6Ä»¾Ľ*»»gTýÞì²;™^Ã=ÕW«;ž)Ä=²p¢;ÌqÃ=Þš;³2Ä=hò‘;hƒÃ=»-Š;•:Ä=+r;l“Ã=û0s;DAÄ=¶›b»(DĽ ]Q»s¨Ã½.qA» IĽLT0»y´Ã½ÈF »¼LĽÔH»å¾Ã½L9þº:OĽöuܺ¸Çý‹f»:‰ËÃ={¼š:¹PÄ=ù‰r:öÑÃ=jÕ0:9PÄ=xÜ9ÊÖÃ=/Ó09†NÄ=4j°¸ÚÃ=¶Ð°¹ KÄ=vµ:ºIĽIˆ\:ßÛý3¦:EĽ*n°:Ûý;ƒÑº$ÚÃ=Éóº·;Ä=‡Ö »ÿÖÃ=Ù«»4Ä=<+;°/Ľät;;OÏý\L;(&Ľïë\»ï Ä=m»ÄÃ=F ~»•Ä= ‡»˜ºÃ=O’» Ä=¬˜—»¯Ã=ç »5ûÃ=?¨»ñ¢Ã=b°; œÃ½œï¸;5äÃ½ËæÀ;ý+yÉ;UÓýjÑ;—|ý`Ú;8Áý¼ëá;‰jý$ˆê;ݭýõÊò»¸£Ã=ðªú»LÃ=´§¼}ŽÃ=ý“¼§6Ã=ܲ \¼ÈPÂ=ï_¼€âÁ=¿sd¼,Â=³h<>½Š2l<[¦Á½zÀp<ŽòÁ½8]t³½C5¶=*ù½ i¶=F¡½>Öµ=P㽩¶=ê×=kе½À„=™Eµ½,À=Õhµ½¯p=Äã´½$§=Èÿ´½Ã[=Ѐ´½ÏŒ=F•´½ûE=½´½&q=P)´½U/=Œ·³½&T=绳½Î=½M«=§Î?=ß_«½õ@=’ª½e¤A=&䪽ÇÜA=¬ ª½’¾B½¾Ä©=çbD½i(ª=í€D½ð9©=Ñ5F½Ï©©=¡AF½Þ­¨=‘H½ *©=ªH½Œ ¨=#ØI½"©¨=¾I½ý‘§=‚§K½ '¨=¹yK½2§=ªuM½Ë£§=H\N=»a§½N=;(¦½•(P=¸Ü¦½ŽÇO=j•¥½§¢P½K¥=©ØR½þ¦=WR½÷¶¤=Ä¡T½‹¥=Ä T½2!¤=iV½â¥=B¼U½DŠ£=0X½Œw¤=lW½0ò¢=!õY½ì£=Y½ùX¢=ݸ[½I_£=kÆZ½¡¾¡=3{]½\Ñ¢=q\½,#¡=®E]=Õ ½ `=6ú¡½±í^=ì7 ½ÉÚa=Di¡½œ¹b½W ¡=wfa½;JŸ=$vd½” =& c½oªž=)1f½šùŸ=¬d½” ž=¦êg½gdŸ=OLf½­g=”¢i½üÍž=Êêg½¾Äœ=ïXk½W6ž=‰‡i½È œ=AUj=lΛ½rçm=”P½fïk=ô(›½¿™o=ݵœ½Erp½ hœ=^Sn½â.š="r½|Ë›=/éo½ñ†™='Ðs½°-›=E}q½ Þ˜=„|u½¨Žš=¡s½+4˜=)Øs=áÞ—½Åûw=Ê™½îgu=˜3—½µ£y=©û˜½ÿvz½"ª˜=[¼w½ì0–=4|½&˜=ÓGy½Tƒ•=Ž¿}½í`—=“Ñz½ÒÔ”=a½vº–=Y|½k%”=þ}=aÍ“½Öç€=q¾•½w¢~=¥“½,¶=ᕽ€=k’½†ƒ‚=j”½%Ô€=ޏ‘½âOƒ= ¾“½S”=7‘½<„=Å“½¨S‚=Q½³‚½ö=WJ…½ ’=qƒ½*A=†½2Z‘=G.„½âŠŽ=×Ú†½ž¨=¦ê„½ÇÓ=¡‡½Ðõ=-¦…½Û=gˆ½ÈA=Ý`†½ cŒ=–+‰½‰ŒŽ=µ‡½—©‹=ýÖ=¶Ó‡½CïŠ=G±Š½e=‹=ÂŒ½¦çˆ=JÖ‰½šÒ‹=žŒ½ž‰=ÿ‰½’Œ=ïM‹½£TŠ=í\ˆ½`P= ’Š½á ‹=Ÿ‡½† Ž=úÔ‰½I¾‹=}à†½€ÉŽ=¸‰½ÛqŒ= !†½TËŒ½*Á…=>á½÷‡=¦}½¬…=>š½ì5‡=#/޽n?„=R‘½s†=Êߎ½s}ƒ=Í7=.ƒ½nc’=ÚM…½4ç=Y‚½'“=œˆ„½ r“½%„=¾ì½3=è$”½œ^ƒ=š‘½(n€=gð‘=l €½Õ.•=2‚½wœ’=ÕŠ~½ˆÞ•=Rh½ç5–½=ûœ“½6|=®ã–½ž7€=òF”½~¦z=+—½9Ö~=ð”½ty=\;˜½ ;}=X˜•½ü‚w=?嘽´{=Ç?–½ïu=Ñ™½;þy=]æ–½ÉYt=V9—=™Žs½3ˆš=‹w½¥Þ—=,÷q½u-›=Yæu½–›½7u=Õ˜½b‘o=×"œ½gks=,x™½oöm=ÀÄœ½Áq=zš½Zl=Ne½µp=뻚½T¼j=‚ž½Ügn=|\›½-i=Y¢ž½ ¸l=/ü›½ |g=Ó>Ÿ½Hk=›œ½­Úe=íÙŸ½—Ri=ð8½U7d=“‡=#ec½À =€Áf½.$ž=´¿a½«W¡= e½ä¿ž=à`½òí¡=ÚNc½³ZŸ=¨p^½Ä§Ÿ½œ]=ÂÌ¢½´`=8A ½¸ñ[=_£½Qõ^=ÂÙ ½FZ=ùð£½Ì4]=`q¡½ð˜X=ý€¤½‹r[=yȤ=ÅZ½S¢=´V½dV¥=óËX½\è¢=%bT½¨2£½X‰S=¤(¦½–!V=ˆÆ£½³ÖQ=³¦½žXT=uY¤½«"P=<§½ŽR=m뤽@mN=­Ã§½ÛÁP=m|¥½r¶L=âI¨½ôN=s ¦½AþJ=¯Î¨½Ó$M=~›¦½­DI=R©½TK=Œ)§½·‰G=Ô©½¸I=š¶§½^ÍE=ªTª½ó­G=¦B¨½¢D=ÚÓª½½ØE=ë«=˜íD½Ò©=rpA½«=BC½Qœ©=B¯?½± ¬=Š=A½Ç$ª=±ì=½ü…¬=uc?½1¬ª=À(<½àþ¬= ˆ=½2«=nc:½`v­=Q«;½›±­½w¼:=ú«½à¸7='®½ÑÝ8=É}¬½ ð5= ›®½éý6=b­½&4=® ¯½Ç5=ã­½…Z2=9­=Et1½ ·¯=ÓH2½B®=¾¦/½<&°=¸d0½P]°½Ã½ÏKWG£º Ã=‹ €ºw ýÓ`?:uŽ»Ÿý9Yýésn9qެãÊ·×Å=Ò‘9çÃ= :sÅ=$ N:ÁÃ=Tî†:¸ýøá§ºêŽ*ØÊº¼ýÊ麘þĽ"°»ÙùÄ=XQ;òÃ=¾S&;0ïÄ=ñ‘8;ß Ã=sHG;^ýÎÂW»IÜĽµmj»lým·x»ÁÍĽ‚Ó…»êÅÄ=3!Ž;(÷Â=æ•;µÄ=7»ž;îÂ=µŒ¥; é½|É­»÷˜Ä½Žž·» Þ½¸B¾»ØÂ=)Æ;ryÄ= }Ð;'ËÂ=÷Ö;ŒbÄ=oá;ò¼Â=moç;'JÄ=Sñ;r­Â=~æ÷;E0Ä=Ê<Å"ĽV7¼¿“½½K¼«Ľ]{ ¼ú€Â½†¼éýè½¼âl½ð¿¼Êýèþ¼wW½%ù ¼BLÂ=%<̘Ã=b]*<Ö4Â=¯M-<'vÃ=Bš2¼bôÁ½²ÖA¼Mý«*G¼:ØÁ½ö J¼°ñ½,aO¼³ºÁ½A@R¼­È½¼•W¼Ë›Á½‚sZ¼FžÂ½MÈ_¼{Á½¨¥b¼×jÁ=K¾f<\Â=Mlˆ½=ÚæÊ<-)½=>¥Ì<½?½=ÜâÎ<•æ¼=b¦Ð<ö¼=oÝÒ%½ôÕ³½½Â¹³½f ½¾…³=$=Õ2³=„Ù=æ³=öç==IJ=Òº =ù²²=áÍ!=.T²=»š"=öG²=ä²#=©â±==y$=ÝÛ±=û–%=±o±=RV&=¯n±=%z'=Fû°=÷1(=j±=_\)=k…°=& *=‘°=¦=+="°=Üä+=œ °=÷-=m•¯=¼-=¯¯=Pý.=O¯=Í‘/=¹Ý®½|0½´¯½~Ê1½€a®½‡O2½lŽ®½]§3½äã­½l!4½ ®½8ƒ5½æd­½Äñ5½Œ¢­½ ^7½ãf­=K8=Ø£¬=V§8=½î¬=Y$:=r!¬=½s:=½ß«½XY;½m8¬½Cè<½T[«½Y#=½}½«½Ú¾>½™«=½©?=8’ª=SÏ?=ú«=®~A= ª=G•A=)Æ©½¤wB½îEª½û;D½<©½";D½/÷¨=BE=V†©=µöF=šk¨=FÝF=.©=ÇH=-Ĩ½Ì®I½Ú—§½¬{I½NA¨½\}K½ §½ƒ8K½KÁ¦=NL=×z§=ì0N=·0¦= ÐM=õ¦=hüO=DZ¦½­áP½U¥½ïdP½G*¦½B«R½öÁ¤½R½¡¥½‹sT½+-¤½iÏS½Ç¥½ƒ:V½3—£½‚U½ÄŒ¤½$X½£½3W½’¤½iÄY½Êg¢½UâX½0s£½M‡[½_Ρ½âZ½žä¢½ÉH]½Ó3¡½¸;\½#æ =þ]=† ¢=Uè_=íI =Aº^=öz¡=4¦a=º1¡½–„b½‘]Ÿ½í4a½[ž ½8@d½¥¾ž½åÙb½Æ  ½Uúe½ªž½&}d½úsŸ½å²g½¡}½°f½öÜž½ãii½Ûœ½‚¾g½¹Dž½Hk½v8œ½Ÿ\i½C«½ Ól½Y”›½ùj½’½,…n½=ïš½·“l½¦tœ½5p½#Iš½µ,n½}×›½[äq½¢™½ÿÃo½9›½]‘s½ú˜½–Yq½v™š½ž›=ø×‡=4ìŒ=é†=ÁåŽ=ø›ˆ=ŒŠŽ½‹ýˆ½Ü׋½ó‡½3Ó½Ö¿‰½ª‹½QÖ‡½ž½ø€Š½´dŠ½åˆ½Í`Œ½ð@‹½û©‰½¯H‰½VL‰=ɤ‰=ÆG‹=ª^Œ=}ˆ=f\Š=劊=¥=,н¯y½Ru‡½Zn‹½Km‰½×4޽ž·†½$Œ½a­ˆ½Ã0ù…½èØŒ½C쇽p§½:…½½ñ)‡½Û^½(z„½]@޽nf†½‘½¹ƒ½ðò޽Yƒ=ïK=ñ>…=Ï#’=W—‚=[ý=zx„=»Ö’=Ï„½³/“½‡s½ ‘½˜Lƒ½¥à“½°€½µ‘½9ƒ‚½E”½û×½Md’½´¸½>•½[N~½H“½‰}=üh“=ʆ€=sA–=Rý{=Ò”=Þr=Yì–==pz=äÁ”=íÕ}=à•—=Çáx=3m•= x½‘•½\f{½“‘˜½…‰v½»l–½êÃy½¢7™½àñx=#Š™=..t=‰j—=0Lw=.š=?šr=Ș=]¤u=¢Ðš=óq=Bº˜=nús=Áq›=Ino=ö`™=gNr=rœ=CÖm=åš=P p=µ¯œ=àm=æç=i=ô›=q7h½„Eœ½¯j½<Ξ½H™f½î眽ö÷h½øeŸ½Áùd½‰½î>g½=üŸ½ÜXc½`*ž½ÿƒe½ ‘ ½—¶a½eÊž½.Çc½_$¡½ó`½iŸ½ƒb½;¶¡½ðm^½ ½H`½œF¢½‹Ç\½š¥ ½¸…^½‚Õ¢½Å[½^B¡½¦Á\½íb£½œvY½MÞ¡½‚¡X=ô+¢=HZ=D4¤=EöV=¡Æ¢=çOX=ù½¤=¢IU=u`£=Ù…V=1F¥=š›S=nù£=&ºT=ìÌ¥=,ìQ=Š‘¤=ÔìR=+R¦=V;P=Ç(¥=ìQ=íÕ¦=‰N=#¿¥=uMO=3X§=pÕL=œT¦=u{M=üا=ä‘L½Ó¨½LEJ½!3§½¦½J½d—¨½ŽH½VƧ½ö±G=˜¨=üG=wR©=ŸøE=j¡¨=º$F=VÍ©=J8E½8 ª½î_C½bz©½b^C½ã‚ª½£A½× ª½Ä@=5Qª=•@="5«=ì?=6ߪ=з>=#ª«=eD==-=33°=Ò+=ùì¯==o+=µµ°=Ûè)=FR°=´ž)=7±=ãµ(½\w±½”'½Ÿç°½*ã&½÷±½%½wI±½û%½Šu²½¤/#½ñ©±½W9#½àò²½×A!½ ²½žJ =8²=(v =¥¬³=‹[=6•²=ãœ=ú&´=§k=øð²=,Â= ´=÷z=gK³=æ=òµ=‚‰=ƒ¤³=i=ŽŽµ=N—=Qü³=`)=ä¶=_¤=ÑR´=éH=ñw¶=¼°=¨´=g=°ê¶=Œu½‘#·½Â½r%µ½‰‘½U”·½´Ì ½ywµ½ÐÑ = µ=Ḡ=ö:¸=‘Û =(ðµ=]Ñ =X¨¸=¸ä=?¶=vè =Z¹=Jí=»Œ¶=\ñ½³¶½†½¿³¹½ù½óþ¶½1½=º½G½•I·½‚.½Nƒº½ò½“·½{?½ì躽8ü¼EÛ·½>žþ¼M»½’%ø¼X"¸½ãºú¼Â¯»½ú/ô¼@h¸½ìÔö¼ó¼½v9ð¼­¸½^ìò¼£p¼½B켚ð¸½Aï¼Îμ½ÎIè¼3¹½ë¼p+½½·Pä¼ft¹½z#缆†½½ÑV༞´¹½Þ0㼠ཽ#\ܼ¹ó¹½Ó;ß¼8¾½³`ؼ»1º½`DÛ¼]޾½ÃGÙ<ò¸¾=,fÒ<³Œº=ÆLÕ<ç ¿=ðhÎ<Ⱥ=j̼?庽øOϼˇ¿½Ðkȼò»½DO˼¬×¿½NÉ<þþ¿=7mÂ<„s»=JŽ“û«=Y‡>½;¼ª=„@½rs«=Å[@½¿Aª=¬JB½Ãéª=b/B½`Æ©=]D½Š^ª=-D½J©=DëD=¤ ©½¶²F=ÙŠ©½Ñ¼F=ލ½trH=×û¨½‡H=}¨½20J=Wk¨½a]J= §½ëëK=^Ù§½^,L=¨§½œ¥M=ïE§½zúM=Wަ½2áN½TM¦=P8P½f¦=ö­P½™Ê¥=áìQ½Ï¥=ÎyR½èF¥=`ŸS½©6¥=¹DT½A¤=ÌOU½Ýœ¤=±V½ <¤=!þV½²¤=²×W½¶£=_ªX½-e£=µY=j£½[ƒZ=>ꢽÌ([=åw¢½ÞI\=#a¢½¾,]½5¢=z¢]½¬‡¡=´ñ^½”‘¡=KF_½êå =šµ`½ì¡=ýç`½äB =lxb½;y =‡b½ŸžŸ=ŽVc=LŸ½“e=:¤Ÿ½óòd=꥞½˜Úf=矽8f=›þ½s™h=‚„ž½^%h=V½Wj= ó½e»i=r¬œ½“l=z`½MOk=¡œ½ÌÎm=ÒÌœ½ál=¯U›½Âˆo=8œ½Âpn= ¨š½mAq=.¢›½Rþo=xú™½Èør=/ ›½Å‰q=N½ƒƒ½¥ïŽ=;j†½SQ‘=i9„½Ö1Ž=á8‡½»¦=J6s=™ˆ½æú=1¢…½Ê³Œ=_Óˆ½ÔM=f9‰=Óö޽9®†=1“‹½¸Š=ãG޽µ_‡=ÕÑŠ½¸‡½ßpŠ=Ù3‹½"?=%hˆ½d®‰=«ü‹½Œ=@‰½-ëˆ=vÄŒ½¿Ù‹=jʼn½='ˆ=5‹½,%‹=¤rн—b‡=åP޽WoŠ=ñ‹½?†=€½@¸‰=RÊ‹½7×…=Ù½èÿˆ=ÇtŒ½…=i›½NFˆ=T½!I„=¯\‘½r‹‡=ùƽƒ=Ð’½Uφ=¸n޽j¸‚=ÈÛ’½÷†=’½ï=”™“½YS…=‰»½%%=/V”½|“„=ž`½’Z€=••½_Òƒ=Ò‘½Å=ÃË•½ƒ='¨‘½0‡}=µ„–½mL‚=ŸJ’½gî{=g<—½™‡=9ì’½pTz=´<“=‡y½’M˜= ^€½Ý“=Jëw½™=R,½Ù[™½ƒc~=çË”½Œu=gš½Ð|=j•½öàs=㸕=?s½Ã›=jnz½ÒU–=ùpq½ÿÆ›=øÔx½ìñ–=•Ïo½átœ=%9w½1—=-n½ƒÚ—½n[m=&w½ûÊt=‰t˜½J·k=›!ž½G)s=» ™½j=«Êž½?…q=¦™½Àkh=UrŸ½éÞo=§=š½]Äf=• ½J6n=aÔš½çe=i½ ½e‹l=J¡=µk½ï´›=6b½÷±¡=Ùj½œIœ=ò`½¤“œ½!`=C£¢½P}g='½ko^=NB£½ŽÉe=F‘£=Üîd½»ž=^ê[½.¤=Þ7c½!”ž=;Z½yɤ=¾~a½¶$Ÿ=œŠX½Xc¥=„Ã_½w´Ÿ=&ÙV½ üŸ½V=ZG¦½Ç&]=Š ½üLT={ݦ½ef[=ú'§=r…Z½É^¡=r¾Q½Ø»§= ÂX½;ë¡=ÅP½%1¢½‰-O=Ë–¨½>V=V¼¢½EvM=Ü&©½òPT=±F£½ó½K=fµ©½¼†R=3У½J=£¤=y'I½Wˆª=åÓO½ßœ¤=}lG½ «=N½ÓW«½èM=žg¥½ÒD=:૽RKK=´í¥½[C=g¬½÷wI=ër¦½ŸUA=h쬽ݢG=B÷¦½Ï•?=9§=€µ>½~±­=àD½¼§=ô<½ó2®=ªC½<>¨=‹1;½Þ²®=®+A½u¿¨=îm9½=1¯=O?½Å?©=:©7½®¯=çp=½,¿©=mã5½[)°=*‘;½¥=ª=†4½£°=æ¯9½1»ª=…T2½N±=#Í7½ÕV±½3Û6=¾u«½q¦/=¼Ì±½?ö4=ë𫽫Û-=%.¬=Ýõ,½¶z²=&2½à§¬=k)+½Éì²=°30½?%³½ò>/=¡\­½©t(=•³½wT-=åÓ­½k¥&=&®=`½%½Ü9´=Lr*½è„®=tì#½g¿®½‘#=GÛ´½G'= 3¯½õ0!=Eµ½º%=Nyµ=€¥$½à¯=ír½Èàµ=*´"½¢Q°=½ а½\²=0y¶½È=ú°½<Û=ïܶ½ÕÓ=ÿh±½ü=2?·½‘Þ=ØÖ±½œ)=üŸ·½?è=ÓÏ·=±ì½Šy²=oa½i.¸=Óô½›ä²=>…½ˆ‹¸=õû½‹N³=í§½3ç¸=½U·³=~É ½jA¹=V½÷´=ñé ½1š¹=¡ ½o…´=G ½:¸´½‡ =ªº½d =ëµ½36=Ýqº½{ ==6 ½µ±µ=¢`½ïº= ½c¶={½«@»=½Ös¶=a•½î»=U½ Ó¶==\ý¼0·½+tû<µ¼½È=…_·½k¢÷<~S¼½Tü<•»·½‡Îó<æž¼½­ø<^¸½„øï<ïè¼½¤ ô<Ýo¸½f ì<š1½½Dð<ȸ½2Fè<ªó¸=PX漜½=Çóé¼âI¹={â¼Yá½=8çå¼Çž¹=©›Þ¼J%¾=tÙá¼Uò¹=KºÚ¼äg¾=ƒÊݼ²ˆ¾½œÂÛ˜¼—[Ä=Âv¼;fĽœO†b»3ýSÛp»ÕĽ–á»JøÂ½;戻}ÇĽÓ~’»-ÀÄ=òÌš;?èÂ=È™¡;„°Ä=h«;ÆÛÂ=n²;Õ½fKº»s–ĽNÄ»jÆÂ½ŠÀÊ»XƒÄ½.åÔ»k¶Â½‡4Û»ÛnĽŠz廥½?§ë»øXĽ÷ ö»MÄ=êVþ;PˆÂ=Y(<‡5Ä=›sÊ0X¼—WÁ=åT\­=ν8=I‹¬=:*9=ÙĬ=•:=$ ¬=ø:=‘I¬=øj<=l ¬½gU=½ZF«½sª=½Ž«½9)?½sª½u?½€ª=áY@=¡Ïª=IäA=ú©=‡"B=óNª=…´C=ª½œD½>0©½ ÍD½f‹©½jF½¨¨½f’F½X©½ 6H½Â¨½pVH½ð¨½J½n”§½&J½0û§½ËK½ §½‡ÚK½s§½í’M½¤|¦½”šM½ 6¦=zN=j¤¦=¿;P=¨¥=%8P=ô¦=™ÿQ=¥=ÙôQ=&Œ¥=ÏÁS=‰¤=4°S=þ¤=Y‚U=ø£=7jU=†n¤=3AW= f£=ß"W=µÝ£=XþX=Ó¢=,ÚX=K£=Á¹Z=û>¢=Z=¸¢=js\=÷©¡=³D\=F#¢=N+^=ö¡=ê÷]=%¡=fá_=ù| =©_=³õ =®•a=åŸ=;Za=ª˜Ÿ½ó1b½ ½© d½=ÿž½Yàc½WuŸ½RÐe½}'Ÿ=r§f=Kž=Zcf=ÏŠž=FTh=v{=Ih=0-½:ãh½]½îÓj½ëœ½Œj½týœ½ò{l½­œ=8Om=;¢›=­m=0 œ=Kôn=•›=ý«n=h›=a—p=þaš=âOp=·Ãš=w8r=uÀ™=[òq=Wo™½Ãr½ÌÊ™½M¦t½e̘½`ct½J#™½OBv½Ϙ=Šw=8Ö—='Ñv=²%˜=s¨x=ð0—=Ûmx={—=G?z=¸Š–= z=EÏ–=Ô{=’ã•=â¢{=¦•½8o|½@Ë•½!/~½甽È~½g•½Œ¾½¢=”½Úœ½[l”½é¥€½<““½·˜€½»“½wk½èç’½@b½·“½ï/‚½¨;’½+‚½#U’½Oó‚½{Ž‘½ ó‚½f ‘½–µƒ½aà½Gºƒ½„ê½Ãv„½Z1½¿€„½}3½Ó6…½g½oF…½U{½Çõ…½‡Ð޽U †½Â޽œ³†½»޽qφ½|Å=21‡=ª=?·=L=ô‡= îŒ=C‰ˆ=0^Œ=4¶ˆ=í0Œ=%C‰='©‹=|w‰=½r‹=ãû‰=1óŠ=ò7Š=}³Š=}³Š=N<Š=“÷Š=1ó‰=ói‹=~„‰=^¶‹=Ú1‰=CŒ=Áˈ=QtŒ={oˆ=nÓŒ=ˆ=i1=¬‡=q†=~W‡=¤í=³ç†=M8Ž= …†½Ì޽Ü=†½\½>¿…½í@½ï[…=Ž˜=""…==–”„=òF=Òc„=ËÕ=P„½Î1‘½Ägƒ½[J‘½šDƒ½%鑽 ž‚½Ùõ‘½Ò8‚=(K’=J#‚=oú’=³m=èô’=@a=v¯“=áÿ€½Ÿ ”½M;€½[ñ“½p<€½;½”½ÑÛ~½5˜”½Ã ~=2ë”= +~=ÙÈ•=Tp|=N•=€Ÿ|= z–=Ù{½FÒ–½íz½Ì…–½¬Jz½þ—½0_x½(—½rºx½µ0˜½Å»v½É—½[(w½jÞ˜½±u½øh˜½f”u½‹™½úos½¸™½’þs½Â6š½¦Çq½R¥™½ãòp=°ó™=Tšq=G6›=-Ho=‘š=×ÿo=Nß›=è›m=L*›=|cn=B‡œ=îk=âÛ=EÅl=!.=võk½(½Žfi½!¨œ½vTj½b&ž½ÿ´g½Þ>½š±h½Êž½úf½yÔ½ã g½|mŸ½ƒMd½óhž½Tfe½W ½ —b½Lüž½ì½c½ ° ½Và`½†ŽŸ½­b½šO¡½ª'_½  ½˜g`½ûí¡½ m]½œ¯ ½­¹^½-‹¢½?²[½z>¡½ï ]½.'£½b1\=»t£=³Y=³¢=é~Z=ì¤= XW=Ìž¢=:xV½o䢽ÐïW½è󤽨·T½án£½Ó8V½‹¥½©\U=Ö¥=uR=}<¤=ü¢S=Tk¦=ÈPP=3Ĥ=~nO½¦¥½# Q½ÉH§½©M½º¥½KO½ÐÚ§½VâK½¹¦½(‹M½‹k¨½J½¤–¦½‰ÉK½÷ú¨½QH½{§½-J½‰©½\‡F½@›§½AH½Öª½¼D½ó¨½HzF½C¡ª½·ïB½–›¨½Å±D½U+«½<"A½(©½çB½ ´«½¬S?½¬—©½ýk>=Ö©=5@=†~¬=Ò›<=öQª=¸f>=Ç­=™Ê:=×̪=¯–<=¡‡­=Vø8=¬F«=Å:= ®=“Û9½ÄJ®½;6½tû«½{8½Ë®½2f4½¬r¬½Ê16½ôI¯½`2½Ú謽…Z4½dǯ½¹0½þ]­½ÉÍ/=-˜­=®”1=Ò€°=€õ-=à ®=‡¹/=ú°=@,=Q~®=ÚÜ-=ïr±= B*=Öï®=«þ+=Æé±=+½£$²½ñx'½0˜¯½œ.)½>™²½^œ%½"°½¾L'½Z ³½Þ¾#½ u°½oi%½ô}³½qà!½ñá°½ãð =±=Ï‘"=„%´==Zƒ±=ûª =S“´=e0=­í±=ÈÂ=šÿ´=ÌN=ùV²=;Ù=Yjµ=Pl=>¿²=Yî=ŽÓµ=ðˆ=|&³=ì–½¸Y³½“ ½xn¶½<²½k¿³½u½ÎÓ¶½­Ì½$´½.½–7·½@潸‡´½y=½Ï™·½÷þ½Rê´½§K½xú·½Ô ½âKµ½¥X½Y¸½³^ =„ˆ¸=9 =Iܵ=òi =Aå¸=ÅN=@;¶=t =k@¹=®c=,™¶=}=š¹=Àw= ö¶=ý„=ò¹=ÿŠ=ßQ·=Ø‹=qHº=j=£¬·=¢Lÿ¼ Ù·½0”½ Ǻ½oû¼Î2¸½û0ý¼š»½Ä÷¼ëЏ½ 7ù¼j»½æ®ó¼öḽ[<õ¼Ð¹»½>ó<àà»=“Úí<ƒb¹=ù?ï<Ñ-¼=±õé<ݶ¹=§輡๽Ž?é¼Dž¼½cä¼Y3º½=å¼Aç¼½Š2à¼ø„º½9Ἣ.½½ Hܼ}Õº½URÚü»f7Ä=»<¼¡Â=™i¼„$Ä=Ž =rh·½w: ½£>·=$½ ½lx¶=,2½ê¶= ½j ¶=‘=äÕµ½|$=i¶½s=Ígµ½€=„¶½?½Gåµ=€B½À´=3 ½â‹µ=g=¸^µ½º=_´½@ø=vµ½nê=⡳½¿×½¥g³=—ä½:x´=M±½0ò²=Ö½Ô´=&Ï='ê³½ít=”?²½Ô¿!=؉³½ÝJ!=鯱½¬¯#=A(³½W#=ûL±½¥ž%=_Ų½\ò$=ÏѰ½¼Œ'=1a²½éÃ&=gU°½ëy)=´û±½ý“(=Çׯ½z{)½„˜¯=ï[,½a±=XI+½¯=¾F.½8ø°=Æ;/=Sð½`û-=¿W®½%1=‰X°½ŒÅ/=eÕ­½ª0½Ê“­=4½Òµ¯=r2½¹­=Íç5½¦G¯=½Ú6=¯½)5=…G¬½Ç¿8=ÖŸ®½gß6=«À«½¯£:=>.®½)¢8=º8«½o†<=D»­½pc:=¶¯ª½þg>=æF­½=#<=¡%ª½VH@=$Ѭ½á==š©½+À>½T©=‚C½Þ¬=H|@½àǨ=ÉYA=(¨½ÊáE=kg«½³C=öò§½ü¼G=쪽ªH½Ç­ª=Ò§E½Ð§=7ƒJ½;0ª=^G½(‹¦=õZL½@±©=ãI½Šù¥=B1N½Ô0©=@ÆJ½øf¥=cŸK=U¥½õïP=}m¨½—PM=\‰¤½ŠÂR=sé§½@«S½â¦§=´×O½¯©£={U½© §=U…Q½o£=ž[R=úÇ¢½æ0X=—T¦½T=e0¢½ýY=µÊ¥½šâZ½8…¥=¿…V½dK¡=O¬\½"ù¤=¿-X½¦± =Lt^½”k¤=\ÔY½ =‰:`½ŒÜ£=˜y[½ {Ÿ=ÿþa½ L£=t]½_ßž=¤Ác½º¢=ò¿^½LBž=®_=uó½$bf=PÜ¡½#1a=-U½ h=¢F¡½@Ðb=¶œ½+Üi=y¯ ½nd=<œ½C–k=Õ ½w f=™u›½^Nm=·|Ÿ½–¥g=0Ôš½§rh½2ƒš=ºÞo½Ä’ž=Í j½¥à™=¹‘q½õô=¦£k½W=™= Bs½­U=3:m½K™˜=eñt½ì´œ=øÇu=þcœ½ž™o=Ø¡—½}sw= Á›½ö,q=÷û–½Íy=ž›½ ¿r=\U–½áÃz=¼vš½ÚOt= ®•½±h|=fÏ™½ißu=•½5 ~=&™½¹mw=D]”½i4x½¡”=N=€½¸&˜=ÛÀy½Õ^“=¢ ½Sz—=L{½W´’=ÃØ½€Ì–= Ö|½' ’=­¤‚½?–=Ð^~½F]‘=^oƒ½“l•=[æ½µ°=Ò8„½}º”=„=ë`”½²=’¬½¥d…=º¬“½ôÙ=Jþ޽Û:‚½å¦Ž=†½Ô›’=5ü‚½™÷=ûQ‡½,ä‘=ö¼ƒ½žG= ˆ½$+‘=}„½ö–Œ=øÜ„=a>Œ½-7‰= ½:œ…=µŒ‹½ðö‰=¡V½QVнë÷Ž=ý¹†½î€Š=‹½9Ž=Áw‡½Í‰=iÖ‡= s‰½ .Œ=d½G“ˆ=>¿ˆ½tèŒ=°WŒ½E½Zö‹=t­‰½d¯‡=[ý½·2‹=ÓhнNù†=6´Ž½ÍmŠ=—#‹½‰B†=ªi½ §‰=ÁÝ‹½‹…=´½3àˆ=P—Œ½ñÒ„=Rн‰ˆ=CP½„=‚¬=o½ƒ½Ù‘=@膽ŠdŽ=ƒ½™ˆ’=†½’ß’½A¶…=ow½rë=oŒ“½Çè„=ì-½Ó/=ïˆ=ÀÑ€½ÿŒ”=a²ƒ½{>‘=€½66•=₽EŠ•½fy‚=žM’½oñ}=H1–½W§=““½‚t|=ÑÖ–½,Ô€=ã´“½"öz=áz—½Ñÿ=[Ì—=¿*½¡À”=Ûµx½1n˜=}½Lr•=Ö3w½âÊ•½Grv=*^™½sùz=‹{–½ ît=Iü™½€Hy=ÊJš=Dox½Cƒ—=è¤r½­æš=J»v½52˜=ðq½›=Wu½tà˜=u“o½ûœ=rMs½ý™=sn½}䙽_Bm=‹üœ½ ¶p=ñš½µk=º‘½nùn=ÂÛ=qn½=’›=0^i½µnž=[l½Õ<œ=üÌg½Ù‘œ½Êg=XHŸ½Î¸i=L;½8pe=•ן½õg=÷ã½Ûc=Xe ½¸/f=Ù‹ž½KDb=¡ñ ½­hd=ì2Ÿ½ë«`=q|¡½ b=/ÙŸ½ë_=Ê¢½ÅÕ`=~ ½Iv]=­¢½ú _=4#¡½Ù[=-u¡= [½ÇV£=sU\½z¢=jY½Û£=í…Z½ž¤½ Y=Æ £½=÷V=·ž¤½÷ËW=Ù¬£½MSU= ý£=²€T½._¥=æU½½œ¤=8ÚR½¶Ý¥=Ú9S½r¦½×NR=…Š¥½O]P=ݘ¦½ÜwP=×'¦½²N="v¦=ŠÜM½ßP§=³M½ù§=4/L½Ïɧ=ÙK½Ð¬§=#€J½^A¨=ÎýI½¡F¨=TÏH½·¨=v!H½&ò¨½à2G=f+©½ØBF=Of©½ãTE=”©½©D=Ä ª=i²C½ ª=í…B½P£ª=–úA½ß‚ª=Y¥@½À7«=ÿ@@½dòª=ÊÃ>½Ë«=¤…>½›`«=Fá<½:—«½ªï;=Ú¥¬½Gé;=ƒ¬½Æ :=?6­½|):=ÿ}­=ìH9½£¬=I47½— ®=u†7½mS®½¤6=Ê@­½èZ4=+஽nß4=¨­½¤s2=>Û­=·1½ì°¯=f42½°@®=L—/½|:°=Òj0½ï¤®=#®-½¾Â°=wŸ.½þ¯=CÄ+½­I±=WÒ,½£Œ±½ë+=bš¯½(ä(=‹²½U*=ˆú¯½˜ø&=.*°=“&½PÖ²=\`'½Ÿˆ°=$½½W³=.Œ%½òå°=ó("½½×³=A¶#½*B±=@; ½JV´=–Þ!½•´½ò =tʱ½¦U=\µ½Õ=ø#²½’f=6Œµ½Ø;=m|²½ùv=ж½%^=ØÓ²½à†=V}¶½¾~=;*³½J–=“ó¶½§=›³½;¥=ꩳ=‡¬½ú¡·=áȽÊý³=ʺ½>¸=Ÿã½¯P´=Ƚㄸ=¸ü½œ¢´=Ö ½ãó¸=1½•ó´=ã ½;a¹= * ½œCµ=™ï½Gkµ½Àõ=º½ÛG =ë¹µ½Â=4kº½ÂY=¦¶½e =—Òº½j=|T¶½ª=>8»½ïx=hj»=ƽƶ=ÍQþ¼jÍ»=WŒ½¹·=”fú¼¤.¼=Ø.ÿ¼‚Z·=¬zö¼޼=Bû¼s£·=Žò¼¯ë¼=zR÷¼ë·=Û î¼xG½= `ó¼×2¸=÷²ê¼i¡½=Òjï¼Py¸=nÄæ¼~ù½=ârë¼û¾¸=AÕ⼄ḽmÝà<z¾½úyå<þ%¹½LíÜ<{;½u{á:ÓBýLûô9¶×Ľ•÷c9ˆ[ýÌÔ¸W¿Ä½ ç—¹)sýüx ºC¥Ä½ÜÃPº²‰Ã½‹Òˆº}‰Ä½Z¸ªºŸÃ½øÊº lĽlüìºi³Ã½@—»ðLĽµ–»ÆÃ½ý¹'»2,ĽQ¥8»†ØÃ½cäH»áÃ=l|Y;øÃ=ó'j;?ñÃ= ²z;RÓÃ=1Ž…;6Ä=}÷;­Ã=å–;ð Ä=ƒ™ž;'…Ã=òq¦;hÄ=?¯;Å[Ã=2Û¶;š%Ä=Þç¿;â0Ã=ƒ>Ç;€/Ä=”Ð;‚Ã=Ä›×;8Ä=ICá;¬ÖÂ=×òç;T?Ä=õñ;d§Â=Cø;9EÄ=nU<±vÂ=þF<Ð]½]X¼yKĽóß ¼+½¦x¼Â=‹‡Ö½ɢ«¼wü»½É®§¼n±Â½êÒ¯¼€­»½_’«¼ÊŠÂ½Z´¼ÆvÂ=ɶZ=:¯=!ú=ñ·¸=’O =RÒ®=½Ñ==L¸=DC"=‚i®=è=Þ·=I5$=®=4=o·=›%&=÷•­=U=žý¶=0(=<+­=_* =Eж=*=Ü¿¬=ÿ!=¶= ì+=ÕS¬=DÓ#=“¬½#½$½©aµ½$É.½‘°«½v&½Áç´½Œ¯0½åB«½:c(½ÿk´½”2½Ôª½o5*½gî³½¦v4½Œeª½,½ýn³½JW6½Ûõ©½-Ø-½Ãí²½ô58½{…©½¶¨/½½j²½:½h©½¯x1½ïå±½@í;½Þ¢±=ÍÙ<=|i¨=—/4=k±=\±>=¤ö§=(þ5=:’°=Õ†@=ƒ§=&Ì7=M°=3ZB=ʧ=‘™9=ªz¯=r+D=Á™¦=gf;=Uì®=‹úE=ù#¦=¦2==R\®={ÇG=n­¥=Nþ>=¦Ê­=<’I=6¥=[É@=T7­=ÊZK=¾¤=Ë“B=b¢¬=!!M=&E¤=]D=h¤½IBE½ô¿«½tÆO½RŽ£½( G½ùP£=YïG=øÙª=µfR=¨Õ¢==·I=³>ª= $T=Y¢=v~K=å¡©=ßU=‚Ü¡=EM=”©=Ù—W=¨^¡=Ù O=Åc¨=LNY=îß =üÏP=|§=p[=S` =d”R=¿§=A´\=Óߟ=XT=“{¦=¾c^=õ(¦½œ:_½_Ÿ½üV½¬‚¥½˜æ`½–šž½×½X½Û¤½\½œ‡£½yÜe½ ½þ]½ëÛ¢½g½ñ…œ½i¼_½DBœ=@›`=õס=Œîi=+º›=?Xb=)¡=B‹k=1›=Nd=ëx =%m=ó¦š=gÏe=ÇŸ= ½n=knŸ½Àˆo½ÕÕ™½0fh½A»ž½=q½I™½Åj½\™=ªúj=Q¬=•ws= t˜=§±l=Cöœ=:u=¦ä—=Šgn=?œ=Œ’v=*T—=Lp=І›=‹x=“–=æÏq=wÍš=:¤y=ß/–=N‚s=敽[t½wµ™½oë{½´Q•½ž v½ƒù˜½`m}½*¼”½êºw½<˜½í~½y%”½çhy½›~—½65€½F—=#”€=@A“=]ë{=ã_–=$Q=¡§’=ñ•}=`Z’½²j~½?•½j‚½÷¾‘½ €½_}”½Å$ƒ½2”=wƒ=˜Ó=}F=.Y“= :„=(5=Ђ=O•’=ƒñ„=~•=[ê‚=™Ð‘=è§…=˜ôŽ=»ƒ=®£Ž½'#„½ÿ§½}·†½ê޽¥ò„½Cá½6k‡½å\½IÁ…½À½áˆ½·Œ½ †½zQŽ½Ïˆ½Œ½í[‡½vˆ½€‰½=¾Ž‡=sŒŽ=UU†=ƒŽ= À†=Ÿ4=uX†½[ˆ½ˆH…½2'½Úˆ…½/½¯“„½î轫¸„½òÔ½…݃½ˆ©½é烽Ýy‘½ &ƒ½ûh‘½ÌÉ‚=DÈ‘=¼­‚=‰o’=T‚=ñ…’=šÛ=3“=Wr½4c“½¨÷€½2 “½jŸ€½Œ”½ã:€½ÔZ”½¸=¬·”=$Ä~=ñô”=‰:~=kp•=Á}=$”•=2G|½l㕽_ù{½ƒ–½Wz½[–½Puz½ 8—½N²y=à’—=Åx=µl—=S*x=`F˜=pv=—˜=šu½:V˜½zÙu½Q™½€ìs½èð˜½Kt½%š½>r½ÊŠ™½ò¹r½Ð¯š½ŸŽp½ä#š½R&q½]›½\Þn½7¼š½#o½Þœ½;-m½ÆS›½h÷m½8³œ½?{k½“꛽'\l½\½jÈi½Ÿ€œ½®îh=]Ëœ=îi=¡Vž=—:g=L`= Mh=Ãûž=\{g½ÂMŸ½æªd½R>ž½&Öe½˜ðŸ½½ôb½nÑž½[b=·Ÿ=ÀYc=ðá =ùa`=À¬Ÿ=w®a=߀¡=í×`½¿Ï¡½aÍ]½x† ½)_½Ml¢½ù\½¼¡½Õw]½@£½ÃYZ½N¦¡½EÄ[½• £½¾žX½.5¢½îÀW=[|¢=™2Y=†ƒ¤=´V=2 £=MyW=Ã¥=Ï›V½Âb¥½ØhS½«Ý£½&ßT½‚õ¥½™ªQ½Ìi¤½+ËP=œ¯¤=@R=}Φ=³ O=¸:¥=¨+N½€¥½œO½­£§½öjL½ ¦½¶ÖM½­/¨½CóL= u¨=_ÈI=ûצ=Ï*K=xþ¨=›H=a`§=O`I=0†©=BF=è§=Ê“G=- ª=}D=&o¨=JÅE=oª=E¸B=ƒõ¨=ÖôC=ô«=ò@=1{©=v"B=º“«=+?=0ª=3N@=Á¬=:c==„ª=x>=¬=wš;=«=' <=Ž ­=ÐÐ9= ‹«=oÆ:=R…­=E8=A ¬=÷ê8=Sý­=Ñ:6=ÅŽ¬=ÀT5½CϬ½Ž6½®®½í‡3½µO­½Þ>4½ !¯½,º1½oÏ­½]2½v“¯½{ë/½oN®½¤z0½‰°½×.½³Ì®½.–.½Ùq°½?K,½:J¯½4°,½fÞ°½§¼+=±=Š)=°=wÔ)=í}±=‚½'=»€°=Úê'=æ±=|é%=—û°=Øÿ%=L²=u$=ªu±=|$=)±²=l>"=òî±=Ï%"=³=^g =lg²=Ú6 =Cu³=G=ß²=¦F=¶Ô³=N½Ê´½2ɽ‘³½\½§`´½}î½–´½½= A´=ðn=¼è´=p$=Sµ´=z=SAµ=G=¸(µ=<„=7˜µ=˜h=9›µ=S=kíµ=‘½d¶½Ú˜½EE¶½™½j¶½¥·½zµ¶½ Æ =:í¶=Å¢ =þâ¶=Àã =\·=¨ =Š1·=oª ½2X·½U ½]¸½|®½I¤·½¤'½²l¸½»±½Àî·½Ñ@½ظ½5´½œ7¸½ÚX½QB¹½qd=w¹=ж=桸=Âz=Íß¹=qný<Èæ¸=Úý¹½=˜>ؼaç½½C8Ó¼ ^»½¢PÔ¼²B¾½ì-ϼ‘»½_`мºœ¾½å"˼Ä»½Óm̼tõ¾½;Ǽúô»½,Å<ì ¼=½}Æ<x¿=£Á<Ê;¼=……ÂvW<Žõ¾=ÿ‰Z<øsÅ=MUO

    È=šÁߺrÚ¿=,;Ù׿½ •;ƒ6Ƚ†z ; Ò¿½gd8;Ý.Ƚfà@;tË¿½¥1Z;8%ȽÜEa;Ä¿½:ü{;”ȽzÕ€;Û»¿½ÐáŽ;ó ȽÞ‘;Ù²¿½©ÃŸ;Uüǽ":¡; ©¿½e£°;»êǽJl±;kž¿½Á€Á;%×ǽ^žÁ;ü’¿½z[Ò;”ÁǽcÐÑ;½†¿½P3ã; ªÇ½^â;­y¿½ô;‰Ç½T4ò;Ék¿½¥l<uǽ$3<]¿½xÓ <¥Wǽ!L <„M¿½W8Â=zÔ§¼–µ¼=p£®¼–òÁ=Àß«¼Ã¼=µª²¼=¥Á=}­´<õ}Á½;ð±<òO¼½T±¸<2.Á½æúµ»½u–Ð<í.¿½ã3Î<0 »½h‰Ô½9¼©=ØUB½Áô«=ta@½¾.©=p3D½Â|«=tB½t ¨=€F½#«=óüF=·Åª½ ²D=‡É§½¨ÖH=§Iª½‡jF=C9§½FG½Õð¦=1šK½„Œ©=üH½d_¦=ÓoM½e ©=ZN=»Ë¨½ÝŠK=ȃ¥½-P=/I¨½Þ=M=kð¤½{þQ=ŧ½¨ïN=J\¤½ÎS=B?§½< P=gÇ£½ï›U=â·¦½›OR=Ã1£½ögW=ç.¦½ÅýS=^›¢½fÔT½äO¢=‹Z½r^¥=€V½a¸¡=íÝ[½}Ѥ=ë+X½ ¡=h£]½òB¤=áÕY½‡ =iªZ=V: ½ÿG`=/j£½“R\=9 Ÿ½šb=·×¢½(èb½å¢=”Ì^½ª·ž=Ä¥d½ù¡=Àq`½´ž=ãCa=rͽ^>g=þ¡½Dçb=`0½Üöh=W~ ½r‰d=’’œ½D­j=)䟽l*f=ô›½‘al=wHŸ½2Êg=½T›½½n=D«ž½Ähi=¶´š½ÃÃo=’ ž½öšp½«¼=ZÔk½HÙ=¹Gr½¿=äom½f!™=4=n=.И½½Æt=ž'œ½éÖo=--˜½ømv= ƒ›½eoq=l‰—½õx=Ýš½¤s=ëä–½°µy=–5š½3†z½Uá™=0gu½¿ì•=‚%|½Ä7™=Rûv½ZF•=gnss-sdr-0.0.9/src/tests/signal_samples/GPS_L1_CA_ID_1_Fs_4Msps_signal_analysis.txt000066400000000000000000000033031305042567700300650ustar00rootroot00000000000000Matlab Signal Generator: function [E1]=GPS_L1(Fs,BB_BW,CN0_IN,Tsig,FI,Doppler,Delay,numsat,flag_Datos,flag_local,flag_noise) %[L1]=GPS_L1 %Fs= Sampling frequency [Hz] %BB_BW= BaseBand bandwidth [Hz] %CN0_IN= Carrier-to-noise-density ratio [dB] %Tsig= Total signal time to generate [s] %FI= Intermediate Frequency, 0 means baseband [Hz] %Doppler = Doppler frequency [Hz] %Delay = Code delay [s] %numsat= Satellite Vehicle number(1-31) %flag_datos = 1 -> Signal contains random telemetry bits 0 -> No telemetry %flag_local = 1 -> Signal will be used as a local replica %flag_noise = 1 -> Signal contains noise 0 -> signal is noise-free s = GPS_L1(4e6,1.99e6,42,0.2,0,1680,131e-6,1,1,0,0); fs: 4e06 CN0: 42 dbHz Doppler: -1680 Hz Delay: 131e-6 s x 4e6 sps/s = 524 sps ============================================================================================================= Matlab analysis: Probing data (/media/DATA/Proyectos/Signals/signal.dat)... Raw IF data plotted (run setSettings or change settings in "initSettings.m" to reconfigure) Enter "1" to initiate GNSS processing or "0" to exit : 1 Starting processing... Acquiring satellites... (01 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ) *=========*=====*===============*===========*=============*========* | Channel | PRN | Frequency | Doppler | Code Offset | Status | *=========*=====*===============*===========*=============*========* | 1 | 1 | -1.67847e+03 | -1678 | 525 | T | *=========*=====*===============*===========*=============*========* Tracking started at 31-May-2012 12:55:03 Tracking is over (elapsed time 00:00:00) Saving Acq & Tracking results to file "trackingResults.mat" gnss-sdr-0.0.9/src/tests/signal_samples/GSoC_CTTC_capture_2012_07_26_4Msps_4ms.dat000066400000000000000000003720001305042567700272040ustar00rootroot00000000000000cC˜B Ã,C(Ã$ÂÃÃøAÃÃ0Ã]ÀÙÃ@CÉÃTÃÈÂA@ÀBØÂ$€À A€ÃâÂC'CC,Â5CöÂëCøÁ Â†BUÃlCúB€ÚC B†Â-CêBŽBÆB0A‡Ã€°ÃËÀØÃÃ`ÁøÁ’BÃÔBÈ€¢ÃšBdÂÐÂT²ÃÀA¸Â5CºB ÃÀ•ÃC°Á1C/C2ÃpCæÂdC¥C®BšBªÂhBÃPBÀ™Ã€€C€­ÃÞC¢Â°ÁŠÂB€CšB0ÁÂLÂ9ÃDÃ|CÃ8®ÂtÂ,BÂÂtÃÁÒ–€ÁÃ\ÃìÃxÃÌB[CÃ…CXÂðÁ8‰ÃC%CCØAøB?C€·CSC¢ÂKC\Â’B\Â%ØÂðA6ìBTÂ,BPÁÊÂÃøÁ€ŸÃ¢Â ÞÂ|®B ÃÁgCB`B@@–¨ÁX¦B|îB„ÂlÃ*CnÃB‰Ã<ÂgÀ—CºÂBˆÂþ²ÂH€ÄäÂ0ÂPB€€C C#ÃFÃXÂ2Ã`ÃB€ÐðBNÃXBœÂÁxB<À—CxÂ’ÂB€šÃèA‚ÂLBö€B¸ÂäÂxBVäB€,ÄÆBÞÂhC¨ÂÂÂDB4C3C¬BðÁBÁ0‡ÃþÂCEèC @„€À¸Aà@;ÃˆÃøÁ€‡ÃtÃ8BÃôÂæBàÀ+C²C@@NCcÃBêÂHCˆÂBŽÂ4ÂDC0BhÂDÃ'C€ÐôBÃTC´ÃÃÃÄBÆÂ¬ÂðÁ¸AC@þB`Á€ŒÃ Á€‚èÂ@ÂìÂXB CðÂÒBà B¦B„B€@€Á@B?Ã-CþÂàÁ’ÂÃà B Â$Â+CÂPA€”CqÃ_ÃÂSÃìBœB–BTBœB€ŽC(ÃFC€ÁbC¸APÁÃ\ÂðAB Á$C?CšBŠBÖCüÂ,à Ã^à Á?ÃCˆÁ¸Ad®Â쀛ÃÂÀÂ0Â}CsÃ0Â#ÃQClÂ2CŒB/úB€…ÃÀÁ€­ÃH–BpA|BPÁÆBÃoC\ÂiÀ£Ã[Ã4Bà@PÁ¸ÂèA¦Â¨Á ÂüÂ8B\B"CpCkCÃiC4Â\B€™CC,CéC&ÃyCÃPÁ3ÃSÃÃIÃ"C0A…à ªÃèÂAúÂ}ÄB^ÃCUøAÂfCÀAXÂ9C'ÃBÚÃ<Â?ÃC(ÂQCÙC¦B¸AÐA CôÂpÁÆÂÃòÂHºà BЖ¸ÁpÂ$îÃ쀄ÃHÂCÃøÁ¨Á>ðÁNÀ†CÈÁ}ëÃÀ3ÄÐB[ÃaCèB’ ÂÄ€?:ÃBC€ÁšÂÂ=ÃxBºÃfÃ5À±ÃpBkÃICˆÂÒBHÂøÁ¸B(°ÂQÃC ClB`C C(ÂÀ–ÃìÂB¬Â´Â€ŒÃ€½ÃCàÂÐÁ¶Â5ÃAÂBACPÃÀBhCŠBÁ¬Ã€ÆCäÂNCÃÀÁÃ)CÁCÁTÂÃ<¨ÁâB€¼CŒÂ˜AkC´Ã‡C=ÀCrÀŒCkCâÂCÃ|êÂÒÀ†Ã ÁfC.CcCjCDBIC@@xCC*CÃAC˜BÞÂsC^ÃÄBUòB¸AÖ¨ÁC¢B`A^C@ÂPC€©ÃCCC€ÃC•ÀC¾ÂCfCÃJà ÃsÃECèªÂjà òB2ÃÈBQÃLBŒB€ƒCÃ.CŠÃHÂXB¶ÂlÂAClÂXBAÄB˜Â€®C$CÜBðBÂŒBªÂ€ÉCtÃÂÂÀîÂsC˜ÂCzÃh Ãà ÃÃÆÃÂ,ÃA‚ÂøAÃâÂÒÂ8Â|¢ÈÂîÂRCÈAC¤Â–B Âþ¢Â`ÃîB7C B€¨C}À•C€¨ÃˆÁCÞBÌ€C-CHCCSÀ‡ÃAöÂUC^ÃèB(ÃYC´B îºÂÂÐÂèA¤Ã€°C ÃÂlÂôBÈA¸AþBôB Á]ØÃ\ÃÈBpÂÁÂC À€DCÃ1CÃÃÆÂ\ÂÊB$BŠB˜ÁÃ@À€˜ÃÊB#Ã&ÃøÂ”Ã CÃ0ÂC B”BìÂGC€ƒCZC&C#C:C!à Áú‹óÙÃpÁÃ7C²BCÒB'C¦BxÀºCPÀC¨ÁøAîBÄB,BKCÃŽB0BC,šÂPÃ`ÁŒÂà C@ÂoCVÃ<ÂCÔÂ9C C…CÜ€BPÁò¶B¦Â€@ÁÃCÚBAÃ4Â(Â…CKCLBÃÔBpCkCæÂ B Ã%ÃpAˆÁ‘C¾ÂúBÃò¤CüÂ*C$ø€ÂÀ›CÃÒB¢BÄÂlÂpC¡CšB,à ÀØÃ€ˆC€ ÃC€†Ã ˜Â`BŠÂ!ChBdÂÞÂÁXÂÃðBÃCøÂT€?¦BDÂØB¸A­C¢B@æÂ€ïÃ.Ã@À`A<ÃäÂ8ÃdÀ ÂdBŒCúB+CCC^ÃxBlØB–CÄÂBXÂkÃàÂLŠB€†Ã€ƒC€Â5C C\CLChÀÁC$ÃÁÁÃ|Cà@WC¼BC¢ÃB A8Â@BÌÂC BÈAæÂüÂÖBòÂÞB8®B¸BàÁÆBÂBþB¨CWà CÀ’C8ÂÀÁæÂ°AÜÂ(Â_CòÂtBàBsÃÃÈAdÔBtà C4BOC7CèÁB\BÔBøA¤BTCB=À¿.òÂ/CÀÀAäÂ5C§ÃlCCÃ"CA1C8BB€ŸC”B€ÁÆB‚B²BqCPÁÀ‹C¨A BˆBÃÀÀDÃîB@@B:CöÃC¬ÃÃ/ÈAC€¤CÃB˜BèA(BB’Â8ÂÊÂêBCÀÉÀ¨Ã€§Ã!C\€ÊC¤BhB C\žC8B¨ÁøA–ÂØB,ÈÂ=ÃDB¢ÂÈAnCˆB€ºC+C€ËCPBìCdÃRCšBâÂ)C°AƒÃ AfCŽÃÛC3CCC€žCºÂ«CŸÃ€ÁÃþ˜A¹Ã–B–ÃÁþÂ$ØÂ(ÂoCÐBàÀuÃ\B€‚ÃOC®Â B„BlCDCŠCÃBCB¸Aþ¸AðÁ˜BˆC:ÃpÁ+Ã8ÂðAÜÂ+ÃøÂ˜AUÊÃHÃ$Â"CBÃC$BðB¤ÂqÃuÀ’ü®B@ÃA`Â,BØÂ€‡CÅÃnÃCòBdBTCPÁ AŸÃoÃÀÁ’BÐÂMâÃhC C£CXÂ^CLÂKC´CBC‘CðÁ€šÃ€ŠÃ€ËÃÔÂØÁ€@‡Ã,Ã|ÃÎB’B±ÃeÃÃ}ÃNC¨ÁÀÁ€ÀîBtÂÁÃ`Á(ÂÃúÂ"CÀÀCðBÃÜB Á-Ã5ÃèCpBÒBìB`’BºÃÃäÃÞÂ'À¥CÂŽCðÁòBC0ÃæBIÀˆC†CàÁBä·C@B Â[à ìBtÃ@ÀzÀÇÀÂlÃhBCþBšCgÃC”šB¶Â”¨BÖÂHB Aà BÌB±ÃCDB„€ÇCdB²ÂmðB€ÖÃÞB€¨ÃÂÀªÃeÀ¬Ã'ØÂÚˆÀ¨Ãl§èÁÞÂÎBFÃC€Ã¸BAžÂ AŠÃ0à C–BàCˆB”B,CÁC!C”BDàÃ6ÃPÁ>ÀªÃ€ŒÃ CÁ†C€œÃqC€ŒÃ#C=ÃoCÞÂæÂpÂÊÂFC0ÂpAÒÂèÁàA°AÀB¦BPÂ`Â|BhÂÞ­CxBCCtÃÂPÁ€ÀÃà Ã(ÃxˆCÌB€ŒCøB%CCCªÂpÁ ÉC¬CÆBxCðAC CC€ÂC=C´ÂäÂpÁ…C¤ÂyCÃôBˆÂ€ÃðAæÂzà CiÃPAŠÂYC ÃpÃãÃxÃ6Ã?CÀA Ž­CBMCfà AÃ8¸BâÂÀÀSÃŽÂÐÁ®ÂÃØÁ.C`Á¡CàAØAuÃÃcCÀB‰Ã"ÃFÀ@–ÃÊ€æÃ B€‡Ã°Â€ˆÃCôB(B^ÀC C4C€A´Â8BÐB€¬C À™CCÀ@€·C¼BŽBÀÂÖÂ@Á5ÃpÂÔÃäÂèA°C<ÃfCôBpAàÁ`ÁÂðBCÈB`ÁÊÃ!CØÂ&ÄBÚB°AÌBÆÂPÂÀ? Á(C(ÀÁÃÀÁ4ÂUCDÂAÀ—C†Ã‚ÂlBtB)CÎBKÃÄ›ÃXBÆBaC}C6CìÂ΀ôÃ$ÃGÃCKC‘CìBCÀ C<Â)C–ÂÎÂÊÂÜÂPÃfCÃÀÁ B€ŽÃ˜AÊÂÂ`Á ÂZÃ\Â+CÒBâB BÁ„ÃQíÃvÃôÂlªÂÃ-C¸A€‘CøA€˜Ã@A´BœÂšB­Ã7Ã@@§Ãdà C‚ÃpB¢B BC´BC¦ÂøBìÂBCÃAþÂdÂÒB+ÃMC€†Ã`ˆÁ¤Â”BÂ’ÃHÂÔ€‘CÃúBœC_CpBÁÈÂ\ BBÐÁBGC™CÂBChBØÂ6CªB€ÃCdB˜B6CdÂC“ÃÐÂDÂêB¶CZÃÿC2ÀŽC¤Â$•C ÃÂü à CÃ@AsCÔBHCvÃpÃÃWÕCžCRCQCþBöBB”ÂTCŠÂ¤B€Êà CCˆAˆB&Ã΀˜C A DPA\C8ÃFC€‰Ã"ÀäÃâ¢ÂÚÂÄBXÂÀ@ Ã@@€Ã(ÃÃ@à CjÃèBÀÀUCIJÂðBÐÁ°Á€ŒÃÂB-ÃiCèÁ$ˆBCwCôˆÂ}Ã’ÂC:C°Â,B|C€›CYCˆCXÂØB€‰Ã øÂ$ÃC‚B@ÁBC}CŠCCpÁP–Â9ÃX‹À¾Ã€BØAøÁpB€C€„ÃÂà âBðA1C€A˜ASÈÂ`ÁB´C¾ÂC+ÃÃà@€BöBìBdCmC–C€‰C4¦ÂÔB9C€ÀBCÒBDB…CtÂoCðA†CðBmÃ@°B€£C€€CôBàAÃ3Ã@AdBÂNÃxÂRîBzC¤ÃCoÃ6ÃèÁ°A ÃXÀƒC€µÃ_C#ÃhB®B‚C@žC’ÂÆB¶BâB>CºBRC4 à ÃC\¾ C€ÀpC$CZCMCŠC€¯C`CAÖBBÊà ÃgÃECC,CTBŠBdC`A¶Â<À@ÀÁ~ÃÖB ÂACîBèÁC¬B[ÖÂʈÁÃŒB€›Ã0C°Â4€†ÃÂÂìÂh§ÒÂèÁaCðB7CÂ(C°B¤C C€”C‹ÃEC @C$CD€”Ã>CŸÃÂTÀžÃ(B,ÂB*CÃECABC’  ÃC€Ã|C@A†ÂÞBšÂ‘ÃfCÀµCuÃêB„ÂB@BøB€˜CØA\²ÂB€ÃICWC€ÀCÀB€‚C€Á”CŠÃêB€ŽÃ(BUC6C–C'CÀ¾BBèBÞÂÌBÀœÂXÂiÃøÁÃÀ„CAC„CÀDÐACC€ÔÃCC€ÃðÁ¸Â¾ÂÂ(°€¿˜AºB€@EC€ÀÃæÂÃ'CÐÁ$ÃöB`C€ÜC€äC-CôBÃæBeÀŒCuÃêBªÂBâB&CœÂ`ÂxÂÃ9ÃðÁLÃØÂ%ÃACÈÁÞÂòÂiC¸AC’BmÃ9CœBOCBêÂÃà@RCtC€¯C€âC€‚ÀÇC€†Ã°Â!âÂpA4BPÃÁ˜ÂVÃLB€ŠChÂCÈBØÂCpCAÚÂ0Á‘ÜBqC@ÀêC¨Á5CŽBhBAÃpÁ Â`CÂÃ/CãÃÃ4BðÂèBÂÂàÂÃ’ÂmÃzC€¿PCOÃÃÃCªBKÃnCÃ(CöB†Â#ÃÌÂÀAÂB¬CªÂ]À‚ÃzÃ'Ã+CÂC—ÃC€’À´CtÂCQÀŽÃAà«C@BºCÃtC¼Â8CpÃPÁ<ÂÀÁ€»ÃŠÂ òÂC¶BŒBÂ>ÃPÁ€Ã C$ÃøA[ØÀAÃ(CÃC @ÎÂ5C\ÂÆB°BzÃCÖÃôB€Ã•C?ÈB8B ÃTÂŒB0Á€«C@À€CÀ@ÂA€À@C¨A%CØÁÂÂ^ÖB@ÀÃàÁ¦Â€Â0ÂUC´BàÀ¼BFÔB0¬Âà@)ÃC€À¸A‘ChBCæB€À@C)C4ÂeÃú ÃxÂÌBJÃ<ÃSÃÀ@˜Â}àÂnÃöÂNCœÃ†Â=ÀšCˆÁ€ŸC3C!C ÃÃâBÂÜBäBàBdB$BˆAzC¨AJCÂB@ˆB ÂDBC( CCÃðÁTÂ-C BÀ°ÃÐøÂTÃþÀ‡Ã¨Â€ŠÃ,ÃRÈÃBÃÃ8ˆÁÃlÂÃYCÎÂbÃpA*CÀÓC ¨A’ÂCC@øA,BCSCÚÂæBYÃæB€ƒC0C2C0²BC ÀeC€À8C!ÃkÆÂÂÂhBøBCPBþB_ÉC²B@B€‰ÃÃ0À’Ã9ÃCÃÌB AÞ BàÀ4ÂlÂèÂD¶B¼Ã/C†ÂòBUÃ` Áô®BÉC‚€À\ÂÔBC,CäBÎÂ0Á€ÃèÁðAA ÂHB;ÀÁÈÃB9C|ÂÈCúÂbCüžBÞÂ@€¶CCªBfÃHB€žÃ!ô¢ BC@A€@ØA'ChÃ@AyÊÃÂCÃrC2C€¹CxCCtî¨B‡ÃŒCúÂB¸ÂúB3CC€½C¸Â°Á À”ÃÐÁ-ÚBèÁ¦BEC A’BCÃ&ÃpBÀËC¤BUC€…CÀÁòšÂ:ÃC¸Á)C ÃTCPB!CʘÃÐÂBPà Ã@@€ˆÃ/à Ã,ÃÜBŽÃD’Â8CPÃDÃÒÂhBCmC€B–C™CÖB|ÂXBŒÂˆÁHÂ´ÂØÂ²Â¼BÚ˜CÃ8BÖÂ’Â>Ã@AÃÜBÐB@ÁÞšÂ;CC€µCLÂ$B¸B ÂJC€€ÃZC€äÃKCQÃ'CvÃC‚B¨B B€”C8CTCC`ÂDÂx€@bÃàÁ%Ã8¹CCÄÂ%CòÂ@B×àÁèÂŽÃCÃÔB†ÂžÂtBšB–B@BÀÁ,BÃvC0Á)CÊB\BÀÀ€ÆC\CÂäÂkÃÐBŒB€ÝÃ@Á| ÁÆÂþBCLCPÁNÃpÃOÃèÁÀ‰CÃ4ÂÐB¤BnCC€‘CDÀšÃ€¦Ã€¢Ã4BbÃôBpÁBMÃUCCÃDÂqC@ÃhB4BC\C`Â@@ ÃnC¶ByCÎBÃ@B¾Â-CPÁ€™C,€‡ÃÂèšC€„CrCÁ€«C B}C/C¢Â9ÃÎBøAàC@ÃÀAàÂðBÖÂÀÁ¤Â8BPÂÚBâB˜BlBÀœÃtÂKÃVÀ„CpªÂ&C,ÃCÔ ¶ÂÃÃhB†Â¼BžBÚBÀAà À¬Ã€‘C€@ À§Ã€ÊÃÚÂxÂÀÀC€¶ÃJC,Â@€³Ã`AÇÜÂÃÜB´ÂºCòBPÂhÀœÃ{Ã€ÂøA¨ÂƒÃ%ðÂÀæÃTÃdÂ@À0CmC˜ÂQÃNCaÃMCÚB¹ÃêB+ÃA(BÃdÃjÔBpAîB$€ŸÃ’À‘ÃÁ`Ãþ €£ÃàBŽÂ(B–ÂÌÂWCC4ÂACT CÖ†B²ÂˆÁ0BÀžÃpAÃäB6Ãp¨ÂÈBŽB³CúBfãÞBªÃ€šC0ÃÄÃ!øA ÂICæÂäÂoÀ˜Ã¤BˆÁ}C¸AÃÌBÀÀ+CB8ÃRÃjúÂXBXÂxB˜ÂÃJC`B@AA AÂCèÁ @ BÖÂ-ÃÐAÐÂÃ0CRC°A@AC‘à CC]C¼CnÃìBQÃ&C.CâB€ÓCC/C˜A€šC4ÃÔB B¸Á\ ÂhÞBcCCPAžÂ>C"CCLÂÂBÃ,BtÂpÂSCÍÚB”€’À¨C€¢ÃHCA(ÂÀ;Ã@C–BtÂSCBàC¨Á€˜C‚B®BBDùC@BòCCC @ ÃèA¿Ã C@ˆÁpC¨ÁèÂ0A¨Â,BÊÂÆB¼BÀ@Á½Ã}ÃÅà@1ÃLCÌB€œC¨C@ D€€C’CÁà Â.ÃÁ€‘ÃÈAÁIÃðÁ$Â\BšBŽÂB:À¾C€BC1C=CßC€ÜÀ¿²Â†ÂÔ€B•à Ã_ÃÚBC0AÀ@BCâÂÔÂøÁ|ÂfC€ÑÃúBp‚Bd C(ÃÁCÖBÂBêB(ÂÂàÂpÂθBˆB.C²B À²ÂÃ7C#Ã\ìÂHÂ/Ã1ClB€AˆBqCúÂ;ÃNÜBÃ_Ã@Á@Á,C„Â&C;ÃŽB¦ÂCàÁàÂÀÁÃ@ÀXBlCšÂ®ÂA9ÃJCaÀ€CØAÆÂòB€‘à CCÃ8BpÁMÚBHÃßC@À€ÀC1ÃIÃ3ÃDBlÃÃô²ÂCÐÁøAÃÔâB<ÂCéÃ$Ã3CŽB€ØCWC¤ÂyCðÁTB€­ÃðÁ Ã)C¼B€¢C)À¡C¨B°B8CXÂúB0Âh€ÀHƒC¨ÁnC$ÃÕCÃA ÂäŠBBÃÀ,¸AèA‚BàB@À¨Á‚Â<ÃÁ‚ÂUC;ÃØÂÃÀÂÐÁ‚ÂB.CxCA‚Â<Ã'ÃEC¸AC@ ÃðBÃ!CkÃÀ‚çÃ$C ÁoC5ÃÊÂvÃD€”ÃŽC@ÂÃ6C'CpÁ"C4ÂsC#ÃêBÀÓC€BŸCÀ™C¨ARCCC;CC C—À©C$ÂC´ÂªBB€ÐCTÂ!CÜÂ,B¤B€Ã Ã¾ÂˆÂØÁ ChC,CŽBpÁeÃ( C@'à C€†CèA@ÄâÂÎÂLÃhCEÃAC,ÂEÃæBIÔB†BÀLÂ|Â0C®ÂšCÎB%C€žCªÂC6ÀÀÃÂNò”BC¶Â À¨ABÂC8B¢B¶BÎBøAsÃEÃBCÜBÁÃÁþÂüÂ×ÃCKCÈÁ!C¢Ã€ŽC@BCAÐBÆCPB€“CCdÀÁ–¸A€€C~CÂôÂ\BŒBvÖBJÃjCB¾Â{ÃWÃÃ|B0Bú„C0ÂGCœÂøB}ÈÃ!ÃÊBþBÂl†C”ÂèA B€ŠÃÃC€@ C(BPC|BøÂPCà C€ƒCÞB˜A<´C7CˆCËCCEC”B€Â:ÃÐAÀÀBÃCÃ^ÃtÂ@ڒÂ#ÃxBòBÀA€‹CkÃÜBŽB®B€¯C,ÃÃÆÂ¼Ã€²CŠÂ0 AÃøAC\ÂTBšÃsC$B/C ÈB¢Â€èCsCôÂæÂÀÂ(C C0BB|CKC€ÁàÂCC@A×C7ÀÁ ÃCPA–ÂÆÂC|„ ØA=ÃðA€–ÃÂ(ÂCÃ`Á©ÃàBC€A€óCžB€•C8ÃCôÃÃhCòÃiÀÃÀ´C Á°AÜB’˜BˆA Â€ƒÃTÂDÂÔCäB€ÕCC$CBÃŒBÃÐA$ÃMÃÊ€£Ã8BPÁàA€©CHB‘C¿C´B?ðÂèA€›C CœBÐB'CÀÀCCÃßCCkCPÂÂîB ÃðAnÃŽÂÌB€±Ã!C€§Ã¸AªÂêBøÁDB0BæÂLÂÃ@Á‡èB,B B°B.CCÖBLœÂ=CB7CB¨B`A¦B€˜ÃHÂuþBèÂTBðÂÁ´ÃÂràÀ B£ÃðÁ€ÇÃ4BCŠÂ C&C¤B4œB Ã7C6ÃÃüB€ÀÀ³C¾Âì BDÂ5àÁ^À§C„úB Ã]CÐACBXB¨BÏC°Á5C€„CaC ÂUËÃA4B0A€?SÃCÎBÆÂDCdB7C!ÃfCÃCøB*êBà@BPÂXB`”Â8Â0ÁpÁäB²Â¢BpBXB0ÖB´B"C€ÀHÃ6ÀÀ ÂCôÂCÚÂbCîÂ5Cú€‚CÀIJÂèÃDÂ0Ã;ÞÂÌÂ"ÃÊÃaÃÎÃèÂÉCÃACxB C¸Á+CÀCšÂÁ²BØA^ÃÞÂBA!èBÐÁÔÂCuCXC²B…ChCÆÂ‘CÃ"Ã|ÃÈÂLB€Â„CYà Cê†CÀAsC®ÂÂHÂFÃ^CC|B€C¼ÃÃÃ_Ã@[ÃÌB¨AÀÀdÂ[êÂTC¦B®B,´BÃüBL€€ÃåÃAÃ0ÂDðBŠÂCÃèÁ„C•ÃÃÃzÃXBˆÁ,B:ÃhBC†BÌBØA€ˆÃ€„ÃüBÃ0 BÃàÁæBÀäCKÃ#C C\B†BÆB€‹ÃDàÀ‰ÃCX–BÈBÃjìÃäÂ/Ã(ÃÀBÁC€›C°AºBpÁ B¢ÂÂ*CwC¸BPBðÁlÃhB9C¨A°B€–Ã1C„BCC(À™ÃÃÜÂ@@ÄnC­ÃÁC¶B C0CÂCC8œÂ^C`Á$ˆBØÁ\CpAØB—Ã"C€ŸÃ ÁIâÂÃBC˜BuC8Ã…CaÀÀCFÚ´ÂNüBÃ{Cò€œC[À‰C‹Ã+Ã(CïCzÃAçÃúB@ÐÁªBøÂ#C€ºCC7C ÃpBCØÂdBÖÂC –BìB€£Ã@@€˜Ã€®ÃèÁ ÁÃYòÂ8B€³CCLCBBÃÆÂ¨A ÁÐÁ€–C`Á(C!Ã@@ÃÃCCC³C€‚C]CôÂþB­Ã¸ALÃ8ÂÎBˆAæB-àB…Ã~CüÂâ´B@øBÃ0AÎÂ)CC\Ã4CKÔÂÂBÈA`B0Ã:C B?C€šCpÁxÀ@¡ÃCYCâ„CƒÃ°ACIC CBAC€«Ã2ÃPÄÂÈB†Â"Ã@AwÃ@@?CôB€‰CGC†ÂèA Ã…C:ÃCIÃêBPÁŽBà@ Â€´ÃC€£Ã ÁÀÀ—ÃlBÒÂGC€™CuCèAðB4ÃÀÁ"ØCøÁB\C=C€ÝCŽB€¢C<ÂBØÂÒ€ŽC€ËÀ¿’ÃZCPA CÖBÁÀ Â"C'ÀCmÃÚB,Â\ÂÈÂøÂ A®B€’CˆACìB€„Ã`C€Ã B\ÂÁ€ŒÃÃiÃVòBdB‰Ã Àéԓæà ÁŠÃÆBÐÂÂB†BzÃLBøBlÂ&C‚B˜Á0B C¨Á=C€ÀC°Á¦C‘ÃCAfÃC!Ã8ªBèAÃCWÃRêÂàÂŽÂÄB¶ÂpÁ=CˆÂ‰C¨Á}CøÁ?C ÁÅÃÚ€ÅÃT Ã@À Á@ÈÂCÎÃÃä A€ ÃA–ÂÃ¬ÂøÂôÂÚÂlÂÌÂCBàÀ´BÃÜÂ`ÂDÂlBŽÂ ÃàBøB‚B¨AoêÂÃlÂÃÔÂCC BCäBøA@C¤B”–ÂPÁCðÁ@A€¶Ã¨ÂB€›ÃÃÃ*ÃÃÂCºÂ¨B€µClÂAÀÀB8B‰Ãü€òÃXÂcC'C¸BDÂÃkCðÁ½C˜A$ ÃkCBÃ|€ŒÃCCà CöC€ÙCŠCèB=ÃC„ÂnÃ#ÃpA$ÂÄÂÚBxÃÀ CÆÂ0C€ÃÀÁdC”€˜C0ÁÃ\B€ŒCàÂC Á˜ÃÀµC( ChÂ(Â@À€À(BθA.Ã&ÃÃà@#C,C€—C C°Á”BÐÂHÃ_Ã|BÁ²C,B€ƒÃ€¿ÃÃB*CC‡ÃÂæÃ0ÂÚÂŽBÞB A¸Á C¢ÂjÀÁ\ÂECÀÁ0BTÂBƒÃàÃMÃ$B@@€¦C€›ÃîÂWÃãà ÀžÃØÁ Ã@@€”C¬BäÃ{Cüà ÁDÃðÁÃ4BBAìÂPACÀB @ Ã)Ã`BžÃ•ÃpAÃà@$ÂÀÀzÃÈAJÃÁÀÂôÂáCBOC@A€˜ÃÎB¼ÂÒB0B„”CˆA"CòBÀÂ$BšÂüÂÂBBCCh€ˆC>ÃTBB.ÃsC¨ÁÆBèBÀ’CÂLB²BÀAwCðAÂB Á^CC€žC`ÂwøA¬Â€ÀÃC€¢C€•CXCÂÂC:ÃC@¦B>ÃÀB¨BPBCC ÀŽÃðApÃBGÃÈAH BŒBàÂBBªBŒÂpÁúÂçàA’ à ÃÁ¤ÂT°B ÁBÂXʄ¨ÁÜÂÃàÁ C*ÀŠCCyCöB BŒBKÀŒÃ ÃôÂB€¢ÃÂ*à C”BÚ€ŽÂÀÀÀœBXÕC*ÃðÁ9à C€®CC¥CðÁÃCÃ'ÃPÃeÃÁÃÁ@ÀmÀŸC,ÃóC¨ÁCÎÃC€ÝÃÃnÃ,BLBbÃøBîÂgÃ|B%Ã`°B-äÂwÔBÀBµCœCA>C€ÛÃÁÂÃèÂAØA\ÃÜB¦Â C€¬CpÂÁC2Ã\C´BÖB¨BpBÂ(C€•ÃÀÁCÃ\B0CœÃ9Ã$ÖÃîBæBˆÁ ÃÀîBàÁÐBäBGÃOChÂBŸÃSCòÂ@Á­ÃCÃHB€A.CBBúBÈÁKC@ÃCTCTBC A!ÃÄB@Á C@ÄC€±Ã AÃ+ÃÃ\ÂB–C€À€¤CÀ@ÐÁ À·C˜ÁpC´BÄÂþB@ÁD7ÃÐC€¤Ã_CyÃCúBà@€ªÃ CÃÀDÂCÃwÃAŒÂÃÒBÈÂJC耣CÃjC€ŒC-C@Á€»C(ÃàB°AaÃ,ÂÄœB êÂàÂzC€“Ã0CUØBAàBgİÁ€ªÃ’€©Ã¢ÂeÃB ÞBCpBèB5äBÆÂ@ÂhBà@ØB:ØAÒB¤B{C`ÁÂBXÕCBCˆANÃØÁBšÃÖB¿ÃÈÂ'Ã{äB(ÃCÃÛÃÈÁgÃ,ðB›ÃpÁvC%CÀBæÂ–B‰Ã C€@C°ÁÎB$C@AOCØB€ˆCUC˜BB@ÂÀAÃàÀZÃ,Â0AšBŒÂšBDBÂB&ÃBUÓÃ@ðÂPBC C²Â:ÃèA2Ã7C¼Ât€AXB4BúÂ+Cp€¤C\ÂæBrC`B Â AÃDÂ@BKCdB¡CxC B¨Á=CÜB€¨CβB ÃÀ“CØÁ9C8ÃCjÃòBbÀ©ÃTBgÀÂÃlÃÆBÎÃAC€?äBôB”B6CÃØB BC¼B€…C€ˆCpAC AðA‚¸Á€A’C€šC§C€ËC‡C ÁCeCPACCÁ{CÃUCØA€ËC0ÁØApÂ<ÂCCC¶BkC!CˆASÃâÂpÃôB ÁeCÂ}ÃÎBUCÂCèAÇÃ’B2ÃYÃDÀ‚ÃüÂ\Â,BþBšB€žC¸A€²C®Ã€þCÀ°BwCpÃAÚÂB0ÁdB]àÁ|BC€ÂÃèAhÃÀÂC[C BhBÃÈÁœÃVC€ÎØÂdÂ(ÃÅÃCCÁtC8ú€’ÃdÂꀲÃC¸Ã)C7ÃtBƒC`A¸BˆÁ ÂÔBC#CpÁ€A€—ÈBªÂ¨B CHC'ÃÀBoÃB¸A&C¤BêB\ÂÚÂ̘Á„ClBBCÀÁèA_C\ÂêBBÂàA€‹CA-CØÁ(BKC€@CCšB€‚C¸A€–C–ÃC€ŒÃ\CÞÂÃ7Ã1ÃB’BôBàÂÄÂHB‰ÃÀDÃC–ÂCCÈC‹CLÂzà ÞÃBÃ@Á¤ÂÒBaC¸AaCÊBlàÂÃ0A£CÂBðB€‚C±CžÂ…ÃÀÀJÃàA@B.CÃèB€ÆC ïCFÃúBtÂŽÂ…ÃhÇèA3ÃØÂ£C`ÁvC€£CÁ•CèÂàÁèB@ÀCà ÃIÄÂ@ÁÐÁ¦B`Â0ACðCtèB€Á€?7C A¼CºB°CˆÁÜBœB@AÂAÆÂXB€‡ÃœÂÈBpBÂB°A”ÂÃüÂÌ °Þ¢BÀðÁ)ÀŸÃôÂàÀ¥CB€±C Ã@AnÀšC@AC$ÂÀAÀÂjCªB`ÂÂBSC.CHÂ@ÀÃ5CäÂÀ€—Ã+Ã9Ã#C®B@@î²BLB|ÂLÂ|Â+CCàBPÁ@ÂBCC0ÂMÃC˜AeCiC¨Á‡ÃaCÀÂlÃò€‡ÃÏÃZÃxÂ+CÊB€ÁzCÀÀŠBöB5äÂ(ÂpÁÚB|BDB‚ºÂÂÂpÁÒª¥C CÞ€¸C êBÎBMÃŒÃÂEÊÂ^ÃUÃQÃØÁà@ÈÂôBàÀ…CŒBCPBlBhBÀ@ÈBŽBˆÂŒÂˆÂAB€…ÃPÁ€‰Ã€¤CQÃCæB°ÁlBmðÂcÀ…C‘à BVC`CPB˜Â€‡CšB¦B±ÃJà €•ÃcìBrÀ@ BÃ@Á ÃÚØÃuÃCWC@AòÂ1èACÀÚC€…Ã/CîBfâC'Ã=CÈ€CèB”€…CþÂÄBØA‚ÂÔÂ+ôBZÃLÂ>ÀÒCŠÂ4C5ÃÈÁh€¨ÃßCˆCžÂJÀ©ÃÜ€«Ã‚B ASC®C¶Â‘CÐAhœB@ÂNÃ@ÁtÂ#C˜Á¨C9CðB!C¼BÞBBtC€„C€›Ã,BÆÂ§C€C‘CCöBùCØÁ'CMCæÂÜB¼Â¬ÂÜBÀŽC BpBÎÂmC8BÒC²Â?ÃðÁˆÂqC]C3C'ÃUC"ÃCĶB¦ÂâBËÃnà ÃTÂÃôÂ`Á®Â*C{ÃÔBŠÂC€¢Ã’ÂÃCTB€ÀàA ÁÔC:C€A(BBCDøÁC@À)ClÂTC®ÂC‚Ã<ÂèBÆB’B\ÂúB@ARC C€ŸCÈÁ~C€ÑCC”¾‰Ã-ÃÀÁØÂºÂÃ`A€§C€‘ÑCLB?CÃ@°APÃ7CÃ\ÃtÂ×òÂÈÂ&C¬ÂÌBòÂüB`ÂC”Â$BÔBØÃàÀÁ€¨C @ CÀBˆA$B¢ÃxBbðC€ÇêÂjòB¸BàBvCVCúÂd ÂxÂC7C?C0ÁdÂHBC@€žC\BÃXCÅÀ³C€€Ã¾B‚Ã@DðB7CÂlBà@ÒBtBÀÂÃ!CAÀ‚CÃÓC€·CŠCC€Á@AšÂRC ÄBpÁâB€ Ã\ÂhÂ\B€@ BÞÂBÀA(BÞ€®ÃÚB ABžB%CiøA[À´ÃCàÁêBxÂüÂ"ÃuÃê˜ÃxÂFøBwÃ`Aò€ˆÃ ÃÈAgÃhC A$B€ŸC“CUC¶Â=þÃ`ЍÁ(B(ÂöBÞB°BúBÈÁÀÁ€ˆÃÊBT€¿0AlÂÃB|àA@À B$Â(ÃUCBÎBªC\èACÂö„ÂàÂ*ÆCpÁÊBCÃC&ÖBÂ|B\B€C€ØCìBCÃ3ÜC¸A®B‚C®BHB@ÃXBÎÂÄB_CPÂC‚B†ÃˆA AnCœB=ÃÔÂàÁ]CˆÂ™CøAvCUCÂ6úÂ`AˆÂ…ÃÔÂUÃŒC€¿C€Ñà ÁÃ0À”C€”Ã*Ã@C0A2C"CèÁÈBŠÂÃECðÁ C€•ðäÃ CMCÃ×CUÃäBÜBÒÂ(¬ÂCÃôÂ@ÁBÃCoÃ@À"Ã`B€À @tÂCHâC@@@ÖBÀhÂ$CšBTÃB3CìÂLÃCà C6ÃaÃÂÒøÁ€ªÃšÂl€§ÃµCBÞB C=CêBHÂ$CB¨Â@ÂJC–BžÂ0BȘÂtÂÀ©CBpA%Ã?Ã[C5ÃkC€­ÃàA0ÁNCÀ@’ÃÈAÁÂNC¤B€’CxB€¶C¦Ã˜Á,B4ÂÖBià °B@À¢Â‚B¬BPÂ+CŠBbÃèÂÁC­Ã€C AÂHBCðÁBÃòÂΈÁ”C@Á@B°BàÀüÂÀA˜Á*C¹C¨Â€èCAQC–ÃB€¨ÃŒÃÂ^ÃCA.ÈChBLÂØÁ€ŸÃ’Â`A¬BGCdBêBÀÃDB ÂQCCðÁ8ÂCŒB$ÂAXÂvC|ÂÂÂB2ÙC…à AÐÁ A„CPà Ã?à C€‡ÃØAàºÂC›Ã’ÂhB°Â @ àApA AŠB˜A”B¬CÀAC$CBÔB®ÂdB5ðÁÂ1Ã;ÃÃÎà BiÃdÂMÃäÂCkà CXÃ`C$B&CCCþB`ÀC+C)CPÁD˜žC€‚C{C C‚BàÁ\B`B,BCÀ0A CìÂlCC*ÃiCvÃÐCDÂ0B¸B™ÃFCÐA†Ã CšCpÁTCÃHB„B¹CÀÂ`Á ÁDBwáCCˆB BCÃúBiCNÃBÃ,B$ÃB}C°A€‹CpÂþBˆÁ`˜ÁàÀ ÃÁðApBæBˆC°ÁèÁ€ƒÃXCÃKC)ÃÃøÁBUÃNÀÁPBC8Â=C$C`¸Â@@€ÄÃFÃÌÂèÂÃfCŠÂeC€˜CÈBC0Â0C`Á!C¥ÃüÂâÂC‚B¸AkCšÂØÂH¨‹Ã`ÂxB0A€¬ÃvCÃÊB®BdÃ:ÃÃTC±ÃºÂÐÂ?ðBÃÂÝÀÁCœÃèÂÃÃ-CNÃeÃ]ÀAUCfÃVC‰Ã ÀoC`Á€”C`AÄB8CCèB€À€CŠÃ¨ÂúÂêÂCCÁèA‘ÃÆB§ÃÊÂþÂÃÆBØA C”C€’CöBÐACèÂúB€¿æÂ*C6CÃ’CC€“C%èBjÃüÂT€Ã`ÁÐÂCÖB0ASCÔB-CÐÁœB:CVC$ÂØBBCÐA^CTBàŠÂiÃGCèÁFC@À ÃæBDBhCCÃÈACÃAPÃìÂÃÃÃKÃBØAœÂ¨A€?C€…CpCˆA¸Ã ÀÈÀ•ÃÃÆÃ*Ã:ÃÀLÂìÂøÁü B,B„B†Bâ’B€ÂÀB„BˆAÄÂTÂ@@{ÃÃhÃÃLBBœC C›CCC`B€?À@ÀÀ%à BC ôB«Ã°B€ÅÃC¸A¸AÀB€’ÕÃÃÔBLBCšCAdC˜ÁÄB!ÃVÃ(Â4ÃàÁl´ÂüBœBÃ,B´BÃCŽÂ†ÂŸÃÁ'Ã0ÂdÂBÃ@Á@€@ƒCCºBðA€ƒC€ÇC–C@D€©ÃeC-CÞB_C7Ã@ÂΜB¢B(B4CÎB@CPC€¶ÃœBkÃAÀÁ€ÁÃA”BCÆBL‚B0A¢Â€ CpA°ApAC @˜A°Á0Á_CxÂpÃCC€–ÔCŒÂ€ŠC B€§C€Âà C¤B˜B ÁÁªÂhÃ’ÂWÃ,B&CèÂeCÍÀµÃ4BʲByÃQÃ+à@,C€½CJCÈÂyCØÂLŠÂÞÂ`AUà BÃÃ:C6CØAYC,ÃpCPÀ³C AÌC)C'C|B`AsC(ÃÞB\À­CÂ-CØÁÀÁOÀŽÃLCÈACˆCZCÒBC|B¨BTB'CÃÀBÖÃÐÁêÂCWCÃC6ÃXCøA²CœB@ÆB\à ÂTÂC À5C€€C¾ÂžC!Ã'ÃìÂ^CA\C–BCOC€BªBt€A…ÃÐÁŠÃ4ÂXÃÀ†ÃNC0BŽC=C Â0CiÃhÂÃÀð̀§ÃæÂèÁÁ¬BpÁ ChC4BCXB€´ÃCBÃØAÌÂLBoà CUÃøÂ¶ÂIøÁøŽ€ÎÃpÃÃÖ BACAÃH®BøBÔCþÂCÆÂÃÃAºÂîÂ`AzCCîBÀAC€«CšBÜB€Â@ApBçÃáÃdÀ™Ã…CAÃÂoCÒBêBÁhB$ÃÃøÁ Ã,BˆÁðA²Â)ÃoC^ÜB$B0A²ÂÀÂ4€ªÃšB;âÂDÃLÃ1àÂlBÃpÃCoÃjCXÂ’BÂ(ÂcÃLÂÜBÞÂ=CüÂLB à ÂPÁʪÂ$ÂÂMÃTBJÃþÂyÆÂC(COCÃ@C%ÀƒÃ5CdBöBNCTBÀA<€£ÃúBZC8¶BØÂ¶BžBCˆÁîœBÃ@B€¼ÃC<ÂÀ à Á&CC BPAðÃt¨èÂeÀŠÃäÃãCà¾B‚BjøB– C<ÂbC$B}ÃÂ0ÂøB€BèÁC”ÀµCPB€¼C€B{ChBÌBbÃÒBD¢CˆBC0CBoC\BÃPBDÃjà CªÃZC?à B0AžÂ°BÃ4B]Ã\À§Ã{ÃC C$ÂÄBΠB$BHC`ÁÚBnCèBSC@‹CSÃC0C˜B½C€ÆÃèÂeÂÂcÃWÃDB€Ã4C.Ã0ÂLCZCÃtCD–ÂÊÂÃ*ëÃÃ`A5øAÈAè”BøBìBPA‚ÂXC€±ÃÂ\ÃÀ CC8CCÎBdB<ÂÀÁKÃÉÃÑÃ%ÃvÀCLC€ßCqCpÁ°A ChBˆCuCäÂDCCaÃCÜÂÀ‹CH€žCC7ÃöBÞBÀÀA®ÂMÃêBüBˆÁ%ÃC@B€”Ã/CKÃ@À`Á†Â Ã.CÀ@îÂpÂvÃpÁC€ÀD¾B)ÃþÂÈÀÃ#à ÆÂC€ÈCPÂgC0Á¯C B^C„B!÷ÃtB^ÀµC A€¿C Á C2ÃæB¤BxB AXÂKC’ÂÀÀÐB8CAC!C˜Á–C°Â’C*à ÂÃgÀêC<ÃRCÃ5ÃSÃÀÃÈA%ÃA€‘CyÀˆC€šÃšÂÃ9Ãà ÂmÃÂzÃà@ÀB€@àªBšBšCòB6CnC¨ÂŒC¬Â†BÀÁàB»C€ÀÐB$B‚B8CEÃØB€À€÷CbCØA]ÃD”ÂÃäÂ@ÁÚÂ|BôÂIC`æÂÃIÃøÁ×ÃÌ’¸A­CBUCÇC€¥Ã@C-ÃÃ/CàÀTÂÃÃC CÂÐA|ÂAÃìBIÃ@ÁÚ€¦ÃÃPBC¯C B°AƒÃÈA®ÂÀÀ4ÂhBHÂC#CLB¸BoCàB~C€‚CÐÁì‹CíÃ$CRÃmÃ+Ãoڀ”CÃ)CÃêB€ÔøÁè¤BZCÒ ÃÒ¸ÂÄ€¹ÃT€ÂìB(B´BUÃ5ÃÂÃC'CC4ÂL¾ÂC7CðÁÃ2Ã@@8B@€ÁC¼ÂœBØAæÂ(ÂGCwÃtBÖ€ìÃÚà B`üB¨Á@@ Bþ„ÂÃCÀÁ C¢BKCCNÃ@À1ÃVèÁPÁ@›CžB¨BPÂЊÃEÃ6ÃÀA€@´Â&Ã0Â4C¸BcC@€ALÃ\B*ÃjæÂ9ìÂ2ÃÂðA B‚C€²Ã€‡C‰ÃEÃÃKÃPÁ€ÝÃdÂKÃpBCÐBGC À›C$ Ÿà ÁÊ Ã!ÈBØÁ`BèAjCÁCh CРCàÀhÂ]ÃnCCH€ÛC C¸CÒÂ…C\øÁØÁ¤ÂTÂÞÂJC–ÂCàÁ,CÃB%à ÃkÃÜB€@ØA˜BæBÒB€¿œB(BÀÁIà ÃLÂ<Âè¢ÂÂÆÂAC”Ã,ÃÃ2ÃlBzúBæÂÃ\Ã`€±C-CìBŠÃ€”CºÂ¦ÂŠÃÕÃèŠÃC€¬Ãü Á˜ÃÈBC€¯C¯C Bp€‡ÃŽCFÃ@D€Þà BàÁ†BCàA5C;Ã@ÆB€—ðÂÃÃWÃÀ¦C Â7C/CB¬ÂœBÃMÈAøÂ.ÃBPÃÜB‚BYCüÂPBè€BtCˆÂ„BøÂÈÁwC!C˜BCÀÀ3Ã\C€‹ÃóCPÁèA†B©CªÂpCDÃfÃDB€¬Ã®BêÂ6C|ÂÀAÃ4–ÂBDB\BPÁGC†BÃ\âÂÙÃ=CÂèÁÑCÀAWCèBBCbC4BÂÎB(B^àBþB9ùC7CîBaCÞBÄ À¸ÂÃ8Â(BSÈ®ÂÃÆB0CŠÂÃ!ÉCÀ¦CÀBŒÂ0BÎC$À§C´B€íCšB’B>ChÃ.CŽÃ3C€@°Á§CeÈBÄÃ&C8BtB5ÃqCPBøÁŠBöCpÂøÁ(Â`AB®BÊšB€ŒC¨B”B)Ã>CüB8CC¨Á–C€•ÓCrÀ·Ã`ÁàB¸A¬B*ÆÂÖB@BDCLBÆB€?AC)ÊÂÁ È®BBÀßCCòBB @¤BoCҀ»C0ÁCUâBÀBÃdB@AÐÁ Ã,BâÂBÄÂ_CèBOÄB#CµCºÂC’ÂPA<êÂ'CUC†BÃ(ÂŒBCAC˜AxÂAðAfCC(ÃUC æB CUÃ0ÂHÂ(ÃqàACpAÖBè€ÂÃêBHB°Â˜AtBBÃC”ÂCÃ\Ãh€«Ã€‹C€âÃhB€˜C^ÑC9À˜C‚¨BmøÂ:ÃdÃàB®CCÌCxB}CšÂÄBCgCÀÀkÃCDC„BžBÂ@ÁêÂQCžÂ€Ã8C¬Â`B A*Ã(ÂÐBfÃÂZÃìB-CbCrC€ÂºÂ”¢œC A€ÂCÂ0ÃæÂ˜Â€Â=C*ÃBCôB€BÀ5CÀœÃ>ÃjÃ8BöÂ;Ã0Á€œÃRCâÂÄBXÂÔBÈÂÁ¨ÁCÁ€B°ÃºB€®Ã…ÔBÒ÷C@ÃCüÂCÃkCHBèB¢ÂœÂÃCTBBQC ÃðB^ÃHBSÆÂtÃØÂ€‰Ã<ÂpÁQC|ÂvC4Â-C CC„C˜BHB¨B€B­ÃC|ÃAÀºÂâB(ÂnC&CMC B>CÇÖBàÂUÃÁÂyÃ*CàB@B¨AL¾€’΀à ÃWCBÃÈÁÈA)CÓCvCC8¨‚CÂBÃ<ÂŒÂ7ÃLBCyÃ$BõäC8B¬CC?ÃÐÂ"CWÃC0˜ÁpB4BÂÂÞBAÃðBžÂ B>à CêBÂÐAˆA€ÆC€ºC C8CCòÂ1CÃJC @€BhBøÂ9ÄÈÂgÀ@ÃÊ„B ÃCÃ6ÀøÃÈBЬBæBÜBC€@CWC¸Á€C ÀØC`B€DJÃBxÂæÂ¾B‹CöBpBÔÂ4ÂÃÃÀpÁ\Â|B)CXB™C€ÓÃÃ0ÀšC(ÃÄBDB“Ã&Cà C8Â`C9CH CDCBCžÂ@C>ÀÉC,C€–C€BÄCÜÂC,À‹ÃmÀšÃàÁÜÂpÁ¸AÂÂÂB”CBÖB4ÃÂ&C€³Ã0AÁöB€žCCTCDB(ÃÖBdÂBpAÂ!Ã2CDÒ„CH˜BºB@Àp€ÃÃbÃøA¨AøÂ BÃMÃðÁ0Á|CPAACDBÚB4Â$CBÂBŽÂYÃ1C"ÃDBÀ½Ã@AÃÐBCºB@AÊB¨A}ClÃþBHBPÃXC`ÁŒBlBàÀÃ@à@ÀAd€?¡Ã€C€BdBöB/C„B,CîBðA AÂhà B @€C€Ã CÀÃpÁ1ÃÃRC4B°CTÃ@A<ÃIC B5C€ŽCSC¤CCuCC„B@Ã8BàÁ–Ã@ªÃ€¿¨A¶ÂFCÀÀ›CˆÂBC€¦ÃsC€Á€¿’ÂÃlèAȺBtBà@WÃàÀìBCÃÜB“ÃZÃÂÃB @ ÁäÂ!C°AäBRÃÄÂYà B°ÁC4CÀÁdCŒÂ¹C(Â0ÁDÂÃSC¾ÂÈA’ŠÂ$C)ÀCDÂpBtÂøÂsÃÀ@&Ã`ÃŒB|ÂPÁC˜ÂOC°C–B`ÃÄÂÃÃ4ÂÃ^Ã`CàAGÃÆBøAuÃBêB@ÁB®BxBÈÁòBXÃlÂ%ÀœCKÃCìBRÃøA$Âþ°ÁwCÃŒÂ:ÃþÂÚÂÃ#Ãü¾Ã+Ã&C\BpB®BL¦Â[C¾ÂÄB“ÃCÃHCÖÂxÃÃö¬B€Að†Â`ÁÂÂ.CîÂCÌB@ÁøBžÃ€À€ŠÃ)Ã`BC°Â[ÃDà CÐÃÐB—ÀÁîÂ.æBìÂøB”B$À€C*CAC ÁàÁpÁeC#ÃðÂhC˜A€ßC%C˜BÜBèBöB0C€B€ÍC ÃBöBèÂøÁ°ÂˆA@Á€çCÃ^C{CšBhÂDC ÂlCoC CuC‡C¬B8CCC˜BaÃBøA\BÒÂ(BmÃÂÂÃ@ÀŸÃ.ÃàÀ8ÂèBðÁEC5ÃÂ_CÃICoÃÔBöÂJÀ¬Ã^ÃtC ÊÂ|ÃòBPÂ!CjCÐÁàBPÁ4C[ÀÎCLÃFC&C8B×CPAÀA¸ÂTÂòÂâÂjÃ`ÈÂhÃC,BèÁðAxB™Ã’Â¥ÃÆÂ¤Â€ÙCªÃ¸C€ØÃ C¥ÃA€˜Ã-ÃCmÃÀúÃ|€B8ÃÂäÂkC€ƒC@%D+C€ÛCXC8BCØAlÂtBêB€²ÃøÁïäÃLÜÂC*Ã$CöB-ÜÃÀÀ€¼Ã9CÁpAdB CìB¤B`ÃìB`BˆC€CPC”CGCFC€‹CCCMCLÃA Ad´B¢CAHBòÂtÂd€‡C @ Aà@€œÃCèÂ@C.C¦Ã+CƒÃ`CŒÂšBeÃÊB;CdB ÃC4Ã|B CÀ@þBCTBTC´B€œC°Á€C,ÂPÂ@ÂÜÂ>ÃA`B'ÈÂ%ÃTB€Ã1CpBÖ–B€’ÃÖÂd™à ÃÈÁ;Ã4ÂØB€ÏÃVCCÎC¬B&ÃŽB@@ AЀ˜CjÃÈB BPB`BàÂÃ.Ã@ùÃ#ÃACÃCpÁLÂC?À…CSÀëC®BÎB£C ACÀÁ~C ÂLB¾BOC€“CCÞBPBÜBzC$ÂÈA(CMC´BCÂC²C.C€ÀC̦B€›C€ƒC´BCpBpBÐÁÚBÀÁÈBÒB\BƒC‚ªB‚C€îC€C*ÀB>C´B8BÃÀAˆBCBºÂÁC¸Â0€ŒÃC{ÃÐBÐÂOCC,ÂtÂðB¾Â„C€ÖC€£Ã€ôÃUC,ÂPBÆÂËØÁ0Á˜BPCøA Ã*CôB|B¸AŠCtˆÂèÂHB@BúÂ?ÀÁxÂêBšÂ BCÃÀÁ¶Â8à CÃnCÊBcCŠC¤BBðBpÃì óÃXBiÃÈ¢B€¢ÃlBìÂC@@€†ÃÐA|Â"ÃöBÜBLCCPÉCMÃÒB¬Â€ŸCCPBüCBXBhÃ@@þÂC BGÀ¿RàÀ¼B%Ã"CðÂ0CGÃÈÂ8B€Á/CƒC`Á°CÃrÃÀ£Ã€†ÃÔÃhÂŽÂ6ÃdBÃ@¢˜ÃzÀ£ÃœÂ†Â·Ã@B¶B‹Ã,C ÂêB†B•C4B€›Ã<ÂðÁ ÀBàAlÃwØA†ÃCºÂ BC¦BÀÀ„Bl‚C¨A0A¢B¨Á@ÃTÂÎB8ÂDBðÂ%èATCHB˜B”Â/ÖB@@0ÂÃHCâÂÃ:ÞÂ@ÂÀBTÂÚÂ0ÁNC¨ÂPCEÃECÀ@ð BiÃÃÃ8BlÂèÁYC’ÂìB(BìÂʨÁlÃÂtCÜÂFC-ÃìB@ÀC€BØBB_C< C®B€ÀnÃðúÃÞÂôBhÂÒÂxÂ0Al @ËðB€ÃØÂ„Â'CIÃC®BpÁ€‘ÃÃ:Ã"ØìBBˆÁIC†ÂÀBsÃjÃÌÂòØÈÂÂBžBNC=Ã@@šBÃÀ¿C¬C¤ÃlB€€ÃÀAC˜Á¶ÂàATÂjCÔB2C´B C€ÀiC5ÃÔBTÃøÁxÃpÁ!ÃàABÐB¶ÂÃzÃmÃd ¤B€ºÃÀÊÀ‚C[C=CÚB+ÈÂÈÁ€úC^À˜CA A”CÀ@XºÂTÂCÀÁ Áì¼B0A|ÃÈBPÃqCÀA‚BXÃUC¨A†B€´C Á¥CÀ…CÂB€…CðÁÃpA3ÃèÁØÁ€Á€AdÂ0C¨Á’¸ÂC€‹ÃWClÃ4CÃêÂÃDÂxB/Ã]ԮàBÂÀ@ÈÁ€À|BBxÃTÂÃBâBÁzC€°ÃÚBÂÂÂÃ#C0Á*äBVÃCÖ°BCB$BrÃÂ:ÃèÁDÂÆÂpÂ{ÃÃ0ÂQÃpBŽÂ Â#ÃüB´ÂÃ]ÃÂèÁiÀâCØÁ€£C€ÁÃÃʤÂ\C Ã+ÃÁPÁtŠÃÐA0€?ÊÂÏÃ\ÂÂMCú€AsâB¨Á€¹ÃÈA À3CàA8BBžB€ªC'ÃŒB à BlÃìÂøB Ã_CàAÞÂØÂ€©ÃvÃCØ€šÃ€æCNþCBÈÂ!CÐAC?C¸BòB–€çCôÂQC|Ã8CjÀ¢C À…CPÁ`ÂØÂ ÁaÃÃÃ\ÃCŽÂXÃÈÁÀÁC”B„BØB^ÃtCYÃCCÃŽÃèÁ4BèB Ã@€ˆÃˆÂnâÂÃŽÃA$€ÒCØA°B€ CdBCC€ÔÃö˜A˜ÁªÂÃØÂÀAoÃeC¤Â0C–B€›C&CÂcÃB€¶ÃBCdBA C@AØCØÂÞ©ðÂHÃÒÂòB¼BPA”BÐÁÈB¤BPÁ/ÃÂiC0ÁtBœÂHÃüB€CìB€À5CcÃàÀ®BØÂ ÀŸÃ@@øBC¼B*ÃTÂ0A‚ÂÀ@ÃGÃ=CÃRÀœÃÃ@ ÁàBìB¨Áà@DÂ8B+ÃÀ’ªÂyÃSC€…Ã)ÃàA?CLÂîÂMދÃî ÃqÃÖBÒÂ=à C*CÂÎBŽÂ‰Ã˜Áƒ؀Ã'ÃÆÂ”C¸A CMC BÂBÈBÞBCCÃ|B ÿC4ÂÃpBÜÂPB4B.C@ÃÃà¢C CC ÂÈÁ€¹CéÃÀÀ¦ÃCC¶ÂÄÂôBB€ÃàBdÂÃÃÀÄÃjÃUÉÃHÂ5à ÃpÁ€ªÃÆB€’À’C*CzC@¦ÂfÀ¬Ã€–ÃúB äBÂÂÂCÖÂÆB4BäBÂÂÂB®Â€³ÃÄÂLÂdÂ~CC,CÂC&C€À¤Â,C•ÃBFCºCà@€C…CwC|C)C*àÁúÂŒÂüBšÂÔBCÃZÃÐBæB0AÐÂŒB€õÃ{CÃ[À„ÃBÆBÐC<ÂFCÈÂrCB‹C€ÁÀAÀ˜C€ðÃ]C C@ÁØÁC€£C€C¢CÊ€À>ÃøÁ†ÂChB`BcC¸Â€‹CÃ0CÃ@ÀôÂÃ蜦ŒB¬ÂsCUÃÃ]C€›C?CDÂÃÃ|”BÂpB€ÃðA ÃàÂBÁ.CBà@ŽCžÂˆÂ¨ÃÃÃCiCÐÁ|CØÂ¨Á%à B•À‘C ÂvÃAUÃ~ðAö ArÃÞ¸°Á„Â;ÃzÃ0ºB;öÂ+ÃÃ7ÃQÃÄÂC ÁC¾BpÂ6ÃÐÂ#ðA¼Â'Ct€ÉCÃC¨AHØÁšBÂÀÀÀÀsÃoäÂCêB BÂÂèÂ3ÃÀÂÐÃæBÈB”Â’Â1Cp²CºÂ(CøÁdÃ4˜APB•CâC=CKC€¢CœB€AÖÂSÃÃzÃÔBtBA€«C•CÆÂ€A€ŽÃмƮB…Ã'C­ÃÔBèAACÃÞBC€Á@B€‹ÃþB€æÃoCÂÌBCLBˆÁ¨AFC€@Þ¼°A®BtCÂàÀzÃkC~CPBT¶ˆÂAÃæÂC€¿pÁB,B-ÃâBxÂüÂÐÁ’B¶BÀÀ@ÁkC(B„ÂÂeCpACC'ÃÃ-C8CÞÂRàÂC€À€²CKÃÁC¶ÂOCpÁÃXCeÃ=CøB€?@ÁC”BˆC`ÁüB@Á¸Â A0BNC!CšB´BpàA@@ ÃCöBÈB‚B C/ÃðÁºÂYÃÒÂ@ÂÂ(C€³Ã CœÃ€ÖC€‚ðÂ1Ã,ÃÁðAtÃCÐÁ€ÄC„BÃÃCàB˜Á@ÀBCÞBPAöÂXBQCPB¨ÁC0Á ÂÊB€‹C)C ÂRÃ@BàÀÆB®BîBZC8C€‰C€?ÂC0ÂXC€›C~CC€ŠCÖBŒÂ6ÃKÃxÂäBÁÁhB@BØB€Â¨BžBpAwÃÀÁ@A°AìB¦ÂÃöÂ(ÂAüBCÞBÁÐÂÃÐÁ‚ÃCÂChB†BCÃ|B(ÀC\C@@ïÀ…CÀÁÀÀÀBäB;CDB]àAjC6øBfþBC€‡CÂC Ã>CHBÔB4CœB@AC-êBÃACàACôÂB`BlBà@HB€‚CºCäB¤ÃêÂ@ ÄHÂÃ@Ã:à@vC@@¸CZÃC¸Á»CSÃüBÈÁCØA‚BÀÀÂÂXCæB`ÁJC˜Ã“CEC(B€ŒCìÂCàA€‡C]CqCGÃ#CuC€¿AœBCÐÂæBÊÂ4C€·C0A¦BhB@Â(ÂÚÂÎB£ÃC¼B€†CšBóC¦BPB_CtCBWC€“Ã΀œÃdÂÂ@B»CÃÊÂλCžÂ0C€šÃÈÁÚBgCoC,BCÎB€C(BÊBÂÝCÃÈÁÃC[C€ÄC’CJÃÀA€ÁpÁ4BêÂ"Ã4ÂPÁ0C‰Ã@@ÖB8’ŸCøÂ€‰CŽÂVÃ-CÂ#C(€Á9CŠCgCVCÄB–øB€ÃŠÂXB€¿ÃæÂ€AHÂêÂúBCiÃÃöBC€?€…C~ÀŽCŒÃøÂÃ{C4 €¿Ã$ÂoC‚B–CvCÚBˆÁ8ÃÉC€¸ÃâB=ÃôBBBC"CoCÕÃŽÂÀ@ Á1C ÂŽC BC0ÂhÃT¸A6CXCJÀ@ÁDB?C B0CˆÁTCC¨ÂXºÂ-CøÂLCŒBPBúÂ=ÃâÃÀ@WòC˜Â CC‚B¬Â ÃÜBZC¸B7C€­ÃhCØARCCPC½C4ÂÀÁÃì€ÞâÂÃÂIC˜Cî¨ÁiÃ?CÄ ÀZÃÊB7ÃÁÆÂÈAèAMCÈÂÂÃ.ÃÃÐA,€±CDBîBTÃ/ÃpÂÀA ÂàA€D`B C°Á@ÃfÃ,BDÃòB€•ÀžÃ AcCœC~C€ÆCÐÁŒBT€’ÃC€•CŽCÍC€?«C`C7C CµÃÃCC¥ÃúBÃUÃ;üB~ÃÃÃÌÂAÃÂŒÂ$BPA¨BdÂ|BÖÂÄ8B@@Ü€¢ÃÃ?ÀADBCBpÜÃÃzà CÌBxBÀÅC CBÂÍÀ˜ÃZÃÚ«ÃÎB'Ãþ¼ÂðÂÄBwC€¢CC@ÁÀÁÞÂ\B,ÃøAœB˜ACLBDªÂÀÂ^ÃÂIà@€APÁBC€‚CTCVC¨BYÀ´ÃŠÂÉÃ'CEÃÎB@@¨AÃ=CnÃúBˆÃ#Ã|BIÃHB @@@€C8Â`ÂèÂòBC-C"C¾Â(CPA~C¬Ã9C»ÃÈÁˆÂTà B<ÃlËÆCºÂþÂŽB`¸ÁlB™Ã]C^Ã@AÖB|C@B€BþB@B´BàAÂCVCèBâÂ4Cl£CðÂ3C6CÌBB€ÙCÐÃÂpÁ ÃÃÃðÂ@@ÃÀÀ¶Â ÂBÂBÃ`Á§ÃCqÀ•C‚Ã.CšÂZCòBìBÚB@Á ÁÃÀÁžÂ€‹C¬BÐÁ€°C9CˆA]C€éÃòB:Ã@B4ÃÖÂC CCCŠCNÃÆBþÂlC¤ÂàÁ-Ã8B¨A CCCžÂ|BðAÞBLB¸AlB7Ã[ÃfõÀ€Ã€´ÃƒÃ ÂwÃÃÊÂÂêB‚BöB¶BuCÀ@¾BºÂäÂ+C€ÁüŠ€‰Ã/àÀ CXBœBjÃ\BpÁˆÁ’B/CCÃBξBxÂÃwðÂØÂgC AB-C ABnà ªÃÀ@„BCLBHÂC`ÃGÃx¯ÃÁ ÃhC¶ÂŠÂ`ÂÌÂÏC¨AxCÜÂ2Ã@AdB Â”°âÂwÃ^CBÂÂèAÜB°BžÂt°Â€ŽÃ\BMCC¬B˜Â Á€ÂÃÌBVÃÀAC‡CwC¨Á{Ã$ÃÜB¶B À#CçC€¥ÃšBÃÒÂpAmC1ÀÀC1ÀÂJCÎÂ0A@C³ÃlCŒÂÃâBqÃ#C˜Á0CÃ`BlBlÃ$Â8ÃTBäÂPÁ¢B%À¢C9C!Ã8BšBPCB(ÂÌÂvCÀAøB CHÂxÂ,C€‹C!ÃúB$ÃtÃøBÔÂ`Â8C¾Â/CÃWCPèÁ–CFÀ¥C€ÉÃC]ÃÈAÀ½Ã¨AGÃjÃ6àA/ÃÃBC(üB @0ÁÂ$BxÂ!ÃèÂC€­ÃÄCÃÊCt€CÌBÐB"ÃÂtŠÂDÃÃ-C ÂgCCÂÀÁüBLB6CÀÁpC¾BTB˜A®BÁ–B(C†ÂCŽB0Ã@B€ïú”ÃCKÀ¹CÀÀ€CâBÂÂþBmÃXCAC€žÃòB(ÃÎBpC¹ÃCÎÂFÈBµÃYÃòÂ”ÂÆBœBHBœB‚BvCºÂvC€A€”C¨Â€ÁÐAžBÂDCCCúBSC#C_CC°Á°Á€ƒÃCÎÂ@@|€‰CöÂoC4Â2ÞÃPÁB@ÃC¢ÂCC,C B¤BC$BCèACBÃ$BCÂÂGC:C+CPÂCAC€¿²ÂVCØÂ¸AÃChÂhBÀAÂDÂB AhCÖÂBCB*ÀÂ*CªÂ\BÀÀ‡CB„B¸Al€‰Ã AÃà€…C¨ÁC¼ÂˆCàÁ¶BÐÁ¦ÂnC€ŠCìBvØÂgC€ŽÃ¸A"Ã À´CøÁ€CiC%CChÂBÃ6àB)ÃÀA€„ÃCöB±CƒÃ²Â€ÄÃaÃÜBjÃB€”ÃÖBICÂÂuCLòCfÃCÃPÃ5CÚB€•CGC°CÂÂ1C„Bð€¥C`BvCü€@ ÂìÂìBÀîC¾B€ÙÃÈAÉȀËÃÃ@A@ÀèÁNCÂeC Ãà¤BÐÀ’C]ÃÙCmCBRCMÃŽBDB@B†Â ÿÃÃKÃWÃ3CRÚÂTBCBC˜A€ààÀ°ÂúÂÂ4B\BlBÚBâ¯C°BÒÂèB€†Ã¢BꀦúÂ`A€‚CLC2CDÂCøÁÀdBCÎBCôBVÃ*CÂľB¶ÃÁ¸AØÂŒÂÃDÂŽBÀÁïC7ÃJC0Á&ÃâBxB|ÂÃÀ§Ã@ÂÜÂ.ÃÂBxÂ+à C*ÃhBTÂÂÁ Á€·Ã§C)üB­C Á@A3ClBCQC A8CØÂCèÂÃøA€ÇÃØA€ÂMÃ]ö¸Á¦C@B8B¨A4C B0CSCÃC6CfCÔ¶B0BvC€ŽC„ÂÈÂC@Á€€C€÷ÃjCÃüÂÀÁ€ÙÃÂ%à €íC]ÃãCðB_C@C>ÃÃ}Ã{ÃòÂpC B€ÌCÄÂuCÆBCÃÂØÂxÃèÂÂôÂÃ}C\Ã/CŽÂàÀ– CBðBÀ@€¿èBœÂØÁà Á CLB$B:üB€ÂØÂÁòÂàÀBðÁhC;ÃTÃÎÃèÁôBâÂ8C1Ã]CˆA!CîÂFCŒB+C0ÁÃXèA>ÑÃТBNCC˜ÃÃXÂDCvC€CÃÀÀSC€‹CÄBC¸AÒBþBXBšÂžB€Á†CÂBÂРÀ~Ê ÆB(C¸B€¿pÂÃXC€³ÃèA¸ÂÌB¦C8Â=ClØB$ÃäÂBÞÂòƒC’ÂoÃÁÄ€±Ã¡ÃSÃqÀƒCCÀ¿PÃØB¨BªÂÃPÂÁœBDBpÂ$ÂT€‡Ã€€Ã1ÃÁ BÄB"øAäBLBfC€•òCOÃNÃBCŽÃˆBà@è€ÁkÃ…C¸ÁCACœÂ€›CèÁ.C•à ÃaClÂøAPA®BÌB\B€·ÃðB"C€²CøB™ÃöÂÀ ÄEÃÃyÃêBBˆA#CèAÞB,CžÂxB”ÂÖC Â[C€—C@BÞBpBÖðCÂÌBCÀ»C!Ã(ÃÁ?Ã,BHî¸ÂÌö ÚB$B:C€ŠÃ`ÂPAúÂúB ÀXÂÃ?ÃåÃðÁ6ÃlÂÃÂÂ¢ÂøA<ÂBHìÂCÃðÂ@ÀÛCÃhBxÂ7CøÂCöÂæÂ B€‚ÃÃ"þÃkÃlÃ`Á€¿€Ã0Á@ÀCC€Á¯Ã¼ÂÃÈÁ€CèAPBˆÃ8B\Â\B,CœÂ ÀuClCÌÂhBMòBà@BHBÃ~CHÂDBJCkÀ’CŽÃ*Ã=ÃbâB¼BDB°ÁöÂ:ÃÀ®À¨ÃdBt ÃÖÃÞB9CPÁC¸AˆBªÂKæÂ@B€BSC@À€¼CdCÔB`B°A_ÊÂZÀ™Ã¹CºÂUCAðBØB ÃîÂ\BMÃ,C®B$C˜B®BpA'CœB‡CôBˆÁðB ÂàÀúBôBpÁZÄÂ!ÃUÃPC€ÀÃÈAPÂØBœÂøB€Ã>Ã8CÎB”CCUC€‘C¦B€¨C@ÀÝöBüÊÂ`ÃŽBpAØA[C€ØC|B ÂdCÃ*CdB+C ÃºB€ÃBCLBÐA„BiCþ À€ÚÃ4BoÃàA¨ÂìˆÁTBYÀ±ÃMÃ}ÃC€àC„BpBXÂàÀdB0CÌÂÂC€CêB€Á ÂäBHBªBJÃ!ÃYÃèÂ0AÈ‚B€›CCPA¸BtüCÃCPBCVCªÂžCöBöBˆBgÃ:C€ÀÜBªBØBCCfÃCÂLBpBSÃCnC0BðBNÃNC€åà C€‹C¦Â¦C AÈA ´ÆÂÃúB˜ÁpÃvC€£CBpBÈÁŠBžBáC@İ ÃPBOC¬C`BlBPACÃAÊÂìB¸AœB`ÂÀA·Ã B?Ã/C'C¬BÖB>ÃPC¸Â€ÃÎB<à ÃBC†BC ÃjÀ Ã€¥ÃLB€ŠÃÒ”ÀåøA/øÂôBè€CEÊB}CAÁüÂ8Â$ÃÂèBdÞChBC¶BC„B ÁdÃÌÂ5ÃÒÂXÃãC1CQCKCàÀ®C1ÃMC–B©Ã®BA À‰CHC.CøÁ€;D‘ÃC€ŒCqC/C¬Â$Â…Ã+ÃÐÁ ÂØBÂ"ÀÀ–°AfØÂÄÃA-ÃâBÐÁX¶ÂdˆBÀAàB@ÁOCDB,B€ŽCéCØBCÕÃHÃ0àÃÂBøB€À˜BŽB¸ÂfÃ>C6à€¬ÃØAVCˆAèÁ@À€ÂÞBÂlªB @3C&C‡CðÁ9C†B~CÀÁ@AžÂÂâBÃÐB/æB8C¼BfC€êCÃÓC¤B/C0CGìCÜ ÀBClÃ`ÁФÂT´BFC Á8C`A¾Â‹ÃZÃïÃVÃ@AÄBjC€ûC;CðAÐÁ€ÀCAA@A@@;ÃàÂBÃVC-ÊB|CŠÂ€Á$ÂVÃB ÃBpÄÂÖÂCÃÜB¾Ã‚ÂüÂàÀºCëC@ÄBžÂõCüÂCpÁ)C$CðB‚Â3ÜÃàÀ CÊCŠCC|Ã9ÃÞÂhCÎB¬Â€´CШAC’B²B-Ã4C7à CvÃÃØÁ€@¨A$BDÃCXÃ1C€Â8C€ˆÃ4B°CŒBHBÀ¥C Ä{C€ÈÃÈÁCCwÀBÁ_CÁîB4Â)C–BˆÂUÜB€ÃnCtB`BÀBcC€À€˜CXB€¹ÃÂWÃÔB¦B BˆÂÀÀ­CB€ÄCŠB^CœBÞBâBšÂîBpA†BÈApBÇÃtBYÃC€ŽCœB°BÈÁ€›Ã¦BØÂÈB4 C`ÂTBaÀ£ÃØC†BðÂlÃiÃàÂÁÀÂPÂCCÀ@bCÃ(C;ÃPB„ÂOCmÃ7CÂÀB´ÂàA(BÈCC…CCÃÚB€æÃPÂ2Ã/C†B‚Â|B8ÂCàA” Á€ŠÃ0ÁgÃ8ÂÀÂ+ÃC•Ã,ÃöÂŽBC€ŒC€¥C°B€ÑCDÃèÁÃ<Â?C@qCGÆBˆÂRÃÄBPÂÆBUÃâÂdBøBöÂ6CâBæBB€‚CoC¤CðÁŽC€ÃC?ÊBÈÁ‰CCUC€´C³C B€ÛCC†CVÃøÂUÃSÃlÂL€‰C‚ÀÀ4¤ÂAþ AgC\Â8ÂHÂ0¶ÂGÃVC¦B³C¤C ÀICìB¨AÂ+ClÂtB0ÃÚÂ8ÂRÃKÃMÃÂÂÂ, À0Cî BðB8¢ÂÊBWÃnC†Ã…CÈÁú C„BæB@ÔÂ<Â(˜À¦C îƒC4CèÁ®B<ÃUãC–ÚBC€À¬CòÂVC€ËÃCæÂ°A2ÂBdB„BàBî¶ÂrÃ\Ã0ÂæÂ²BeCµÃÊB°Á*CX€ŸCÂÜ´€¼ÃºÂ€´ÃÐÂOCÊB¨C0CLBPBˆÁÌB²BBØACÃC˜Â+C@A¬Â¢B]CªCÐA|BUCZCžÃÃPÃCôCHBÒÂöB'À¸C€“C9C9CˆÂ&ÃMC¸A C\C9CðAXCBÂì€ÀlB%C€@DBB¬ÂÃ6C'CCtCB‚€DðÁ´CPA€ƒCØÁ¦Â4ÃxÂÐAAjC‰C6ÃC ÓòÂ*Ã/C4ÃåC ÃÆB®ÂrCŒBB!ÃÞ€ªÃØÂC Â{Ã*CøÂA[C€ŸÃ?ëÃRCB€“CˆÁ C$BÌÂ8¦CìÂVCCˆA?CøB€Áè ÂÈÂêÂÂÂOCÃNCÃB(À‹ÃØÂÌÂà@8ÂÒÂ$CºÂ¤B6C`B€C€ÄÃ?Ã[ÃlCpÃ’BËÃCBChB®B*Ã(ÂCÂ|ÃPÃèBZCLB€¤C„€CC C°Á$Ã;CnCC°B˜ÃJC¦ÂžCBC€†CÒˆAºÂˆÃžBÈB¾ÂAÃÀèÁHCØÁÃrÀ–Ã(CdÂ[CeÃ"ÃËÃìÂ!ðB`ÁACPA`ACAzCSÃ`Â+ÃtÃÂÂVC²B™C‚B¦C‹ÃCØÂêBîÂeÃdÂ4BðBBdÂ8ÂcC(BšÂÐBöÂCpÂaÃ@@À¿ŠÂÚÂgC@B¨Â@ÁChˆÁˆÂ'ÃæÂC@@ŒBÂBðAŒB€²ÃüB`ÂÈÁCÈBÀ@¢Â€A¨Á®C@Áü€CÊC C’B€CðAÃ#ÃÐÁÃC{CDÂðÁ¬BMC ChÂlB$Ã{C’¢BC„Â+Ã\BÞBöÀ–ÃaÀ”Ã2ÈA2CC˜C5CLC9Ã(B9ÿCÌBpÂC B•CþBYCCcÃwCÖÃCØAÆÂäBà BÀBtBCAAdÃpÁ ÃpÂ4BCÈÁ쀵òB)ÃPA ÃCºÂ1øA9C>CäB€A¨ÁLB?À“C C@BŠÂÒB€ˆÃÞÂSà Ã}Ã%ÃÐB‚B€ŠC€ C³C€©ÃxB ÃÚ€ÃÃOÃpÁ€ŽÃ€¿Ä=ÃðÁ˜Á|BÁ A®ÂêBB Â1ÃCœB’ÃÔCdBNCPÁÀ@Þ¨Á–°Á C™Ã’ÂÃÔBŽB@!ÃLÂhÃ’ÂCEÃÊBøÁÃpAÃ(ÂíùÃ&ÃTB¸ÁpA½Ã2ÀîôByÃA+Ã`AlÃ{ÃTÃTÂpÁ ßÀ@èATBªB¶C¸B‰C ÁpACÁÃÃCPÁ ÁŸCðÁDôB²CKC*C„Â@ ÀÖ€‡CAkC€‚C@‰CæÂ€‘C8ÃC#ÃÃ<Â<èÁ|ÃDB AHC4²B€½Ã ÁMÃ|€ÂþB0C`ÁlÃK̀¬ÃOCðAÊÂ>ÄCæÂ€“CàÀ€@–BìBðB€±CÀ¶CCC–ÂHBB;C0B/CðÁŠBDÂLBÖÂ\BàÀàA€ÁxÂèƒC€¿8Ã#C–®BC€êÃTÃRÃ3ÃB–CÔBŒC ÃBgÃPCBRÀˆCÃCà C @úB¤B9CÀÂäB*Ã~C CÀ@€C¸AC«CŒÂ€?ÒÂl®Âdà CðÂPÁÃÃFà B€²Ã˜CbÀ˜CÃøB¤BãC`AÀD C€C@Ã6C0ÁÈAŒÂrCCzCC°A$BøÁCÆB À)ØÂdBDÃÂÀÂ[øCiCÈA€BªÂ-Ã*Ã@ÁæÂkÃò€‹ÃÀ@ÀC ÃC¸Á-Ã-C4ÃTCÃâBÀB AdB°A€‰Ã(Ã}ÃLC0Á€CpÂØÁŽÂ®ÃC¼Ã€‘CgÃ#ÃUC CC @SÃÔB¢Â¸ÂnÉÃÕÃ0Âà ÂÜÂÂB/ÃBCÀ@ B ÃÀAîB€@ŽBªBT¬B˜BdÂAÞÂoC Ã(BøAøÁüB@¾ÂäÂäÂ|B†Â¬ÂÀ@šÂÃ]ÃDBgÃÈBsÃ&C%ÃŒB¸A‘ÃqCBAàBªÂ¢B¶ÂÀBaÀ‹C4BÃÃðAC@ÁêBŒBiÃÁ¸ÂBC¨ÂC€ˆÃÐÁŒÃ¼C0ÂlCÈÁèAXBºBC•Ãä BïClB,BôB+CdÂTBòÂ`ÁÐÂqCÐÁ ÁˆA¦Â Ã'C¼ÃÔÂøB’B4BÂyÃ|ÂÀÀCB#ÃðB€‘C¾ÂB»ÃÀµÃøÁ)Ã(B€†C+C¯C°BbCÀBúBpC€ŠC@Á ÃèA÷Cà CpÜB3ÃtðA_ÃmCpA’BC¼B®BB5CÎBÎB3CC(ÂlC˜BîÂîBðÁˆAÁ‚B^C€„C AÃÈÁ@CxÃŽÂ,ÃÞÂ0ÃâB?ÃÃNCÃxBBȘÁ¨B¬Â°A+CZC,B/ÀÜðÁ[ÃîB=CYÖB€›C|BuC+Ã{C@A|CdB¢CMC¶ÂaC€¢ÃìÂ-ÃC\C€³CÃ’Â8BšÃcC Á&C´ÂPÁ^Ã%ÃPAdÂ@Á ÂÂîB¨ÂB_ÃìBðÂBÓC!À—C„Â:CpÁÂBˆAðAÂÃBC€¢C0Â,À´Ã(ÃèA`C|BÜÂ3ÀÀŽB=C†ÂŒBPA`ÁIÃC°C–B¼BÃhC B€‰C|ÂxCC¸B$B$BBÀ´Ã®Âà¸ÂBLÂÃÃ}ÃÁÂ%CCAÙC’BhC0ÂÖBÂBCŠÂäB@Á€—CÃsCêÂd°ÁòB²B(C9C.ÃsCBvC5CôÂC'ÃàA$ÂÚÂøA3ÃæBGà ÁÃÃÁ1ÃøAÃúÂSCˆBŠCJC*C°ÁöÂ¥C AFÃôBðÂøÂzCȺBæÂÂ"èÂ@ÀWîBC ÀÎB AàÁ¸ÁpAjÃàÁÃC¦ÃZC€ÀxB'ÃB:ÃÃÃC4ÃFÃ)ÀýÀÞÃCtÀšCòB–BÂB‚€‹CÓÙC­Ã€–C ÃúBCŠBøÂøÁÜB@A€‚À”C€‡Ã¾B•C@Ã3ÖB€…İB¦ÂÃFCÀÀà €½ÃÐÃØAdþBÞ¨ABøÁðÂÆÂŒÂ×Ã/CªÂòBþÂÂÂÃdÂNÃÁ€ƒCtCÐB–C­Ã:C®Â²B0 @<ÂyCaÀÂ;CÆB¾BØA¡Ã0ADØB´B†BÒBJêB\C®B®Â €­ÃÃQæÂ~܀èÃC|ÃB4ÂÃöÂÜB³ÃÔB(Â-Ã<Ã7ÃÃLCHÂ8ÂdB–ªB°B@ÁAÃÌÒC@Á:C>À£ÃúB†Â CÃkCÀÁŒCpÂÚÂAC>Ã<ÂXÃ@Á²ÂèÁ‡Ã”BÀÀDÂ’ÃÒ®Â(BƒCÃJCB€ªÃžB$Ã`CÌBBÀÃÃ`ÂMæC{CGCCHÂC\Ã&C°B\ÂhÃCeÃX ÁlBÈA!à Ã8 ÁPA(ÂHBÂp ÃpÁ"ÂCà@nC§ÃaCCèBOCÀAA,ÂÃÊÂB†Â‘C?CAzC€ÂC´ðBàA¨AÀÀà@àÀ"CØÂþÂtÂÃÃx€…ÃBÀÀkCŽÂ¸ÁöB«C ÀBCbÃ#CˆAêBäBBàB”Â2ÃÃBC B#CþÂâ¨B @{CCà@{À‘CÒÂxB€’CˆÁFCA(B€„Ã6C B @tBèÂ@CT€¥C Â¦Â€¿CJC€©CBÔB€ÀºBòÂpA’°¤B€¼Ã§Ã¸Á€¿ÃzCÐÁþBBÃ}À¹Ã-ÃèA†ÂªC À$œÃÀ/Ã$CWC„B>CPA¸ÁËCšBÈ A|B˜Â3ØB΀£ÃxÂÀÁŠBQC^C–Â`Á¸B–CHCÃÊ€ªÃÃC|ÂÚB/CЈA”BïÃüB"Ã%ÃäÂæBpÁ@D&CvC´ÂŒÂÃòÂðÁöBÂLBÒÂBðB–ÂÀÁ¯Ã‡ÃdàBFÃÁ‚Â0CàA Âà B!à C¡ÃÐÁöBþÂQC€‚ÀŠÃ-ÃàÀOÃÁXCCaC-Ã$BÂwÃÃBÃØÁÆBxÂöBðA$ÂÁœÂ°ÁÂPÂÂCÞBfCpB´BLÃÁ¶BPÁJCkCaC€…CLB€D6C€C*C0Á€‰C€ÃpBHªCŠÂ°B<Âà@®CC€“C CÃzCÂ,BÒÂÃDC8BƒÃ€œÃJÃÈACÈA’B€¨C$쀠ÀAøB€åÀ¬C„€?€À€?C®B€A@AÞBcCnC3CPAnCºÂØÂÃdB€®C3ÀØCÁ<ÂèÂ$CUÃÎÂÀšÃ,²BC`A´Â€ŸCtCC£CxÀ–CøÂÃC¦ÂPBšB CÚBŽÂ0ÁðÁ BHBòÂÊÂ|ÃDÃàÀ>Ã=à Ã0B‚Ã`ãÀÃ0ÁlÀäC€„àB< Ã}ÀšÃ‰ÃøA Â쬎ÂÃÐÂxBÀÔC\€÷C€Á@@}ÀCÌÂCÀ€œÃBdÀ“C¶ÂØBöBCC€œC€žC¨A,C6ÃæÂ(ÂLÃC@B3ÖC’ÂÈÁLÂÀAœÂîÂJÃqÃ)CÒ²B¾ÂPC¼ÂhÀÓÃ\ÜÂ?ÃøÁ¢Ã>CÂCÀB¾Â€µC~àÁ4à  †Â6Ã0BdÞÂDBB€ÅCDÄB¸Á€‡ÃäÂêÂðÁ5C€¿¦BXÃàÂ$ÂaC€’CòÂd°Bà ÃEìCJÃKCøB´Bl A@ÂC¦BšCšÂ¾B„Â$ÂÀÂ9CƒÃChBCÒB¶BpÁCUCkCàA€ŠCPBECìÂC€?øÂtÂ|BlÂ`A€«CACBÓC>ÃäBŽÃ5C€¡ÃÂÂÂøÂîB0CšBC€ŸÃøAkÃà B¶Â B;ÃÈBrà Á¬ÃœÃ„BöÂ\ÂÔÂêÂ@¶BC¢ÃUCØÁŠCx€£C„BÁ(B+Ã(ÃyÃRüÂ8ÃBìÂp˜ÂC¤B¦BøÁžÂC†B`Á¨Á¸Âd€ŒÃØA$CÈCÀÁ_ChÂlBdÂ@¨AlÂdB€ÂqCâÂC4šˆÂÂC@ÂîÂÈÁgÃ$ÂÚÂH”B€šÃCCÃC³C€‰CPCÂC€¢Ã,ÂŽBeC1CÀ@¸ÂTÂîÂÂÀÂÃmÃÈÁ¨A!ChBÂBäÂ`A6ÃÊÂhCºBàA4C¸Á€¾CÔ¦CxÃÖB€”ÃÈB@ÀC>à ÂLBÁBXÂgÃÀÀ$ÃlCà@€¢C ÃHCÃC°Ã’BÃÀ@XBÎB ÂöB\Â0C C¢ÂžB°A.CAC=Ã@A @ôBÁÜB´Â Â€ŽÃÒÂ/Ã@ C\B4ÂÜBÀBžBlB@@0A€•CC—CÎÂ9CÀAÈBEÃ)ÃÐÃÙÃÊBÀÈC Ã,BoC¶ÂCÂBCCgÀ¿òÂGÃÀBÎÂC|C4ÂÊÂ>ÀšÃ3ÃÃÎÂVÀ‚À‚CÃSCÃ@tC A¾B¢ÂÂWÃÀ@– @ÂÃÀD¦Ã„ºB‚ÂÈÁˆBB€?Ã`Âò€žCÆÂ„CºB€©C4B‚B€žÃºB’Â}C™Ã€­C-â¸BÊÂàÀ€ƒÃ@A0ÃBBðÁ€‚ÃpC€®Ãü§Ã@zÃúBCpÃòÂŽBò ˆÁ´B8Â|C€Ã%C'ÃYC˜B C CACÎÂÖB€‰Ã„C]C:CkC€ŽÃBbÀ?¨B“ÃÃoÃ]à A€£ÃÆÂbÃB`Â>Ã0ÂÃßÇCÞÂBÃ`Á,ÂÐA€CHÃ^CŽBðBCðÁ‡C€€CÚÂ,ÃPš€¬C>ÃÃCVìCÜB®Â\º®œBpA€ŽÃÃ]ÔÂsÃ/CøÂŠC°Á€ÃC¨ÂBšBøB`‡C€‹ÃbC?ÃlˆA€²CªBçC9CÀ€“C“ÃÀµÃ¼Â‘C¤BpÂGCÀÂøBôÂÃÃÀÚB€Á0ÁAØA«ÃÆB-ÄÃA'ÃxÂ9ÃŽBÆÂ€Á< CÀ@€…ÃEC–ÃÁÃÌBDBàÁX€´Ã€Ã;ÃôB€ŽCNCA…C-CƒC‹C AÄB‚BpAèÁˆBpÁ C0BRCJC®BÔC’Â1Ã@AC=CpACrÃìœÀÛÃCBHC¬Â€?BÃÀ ÃPAYàA€ëàÀ ÃØÂTÂÌÃ]C€™ÃðAÃú€ðÃD Ã@ÁB+C’B€? C Ã<ÂäÂ|B@À€˜ÃŒÂ=Ã\C@Â@ D€Áð€ŒÃMÂÂ&ÃAÐÁMC”ÃÀÁ€ÁÃìBÃ$BšÂ€ÊÃCC€…ÃC†BÃÂOÄÂIÃaCC¨ÂÂ`C€AaÃÌÂÂjC¸Â¼B‡ÃœBŠÂ@BÂøAÐÂüÂÃÐA²ÂæÂ‚BÃ=C€ƒCLC¾B’B€ŠÃ@Â(áÃ$CΠB@àBÒÂ6C,CtCìBÀ@žÂÒÂÀÁEÀŸÃ€ŽÃ¼ÂÃÃÃÃuC€C€ÈC˜B1C²B´ÃC†Ã`ÂÀ Ä“ÃcÃTB ÁOCXÂðÁ¸A€²ÃHïÃCCæB B¬ÂÀB&ÆB€’ðÁvÀ¿(Ã|BÃ>ÃYC€—C¶CsC6CPÃCÃlBÀA:C°Ã€?CB€ÔCŽBC¼BC€–ÃÃþB\ÃCnà BÓCÌÂ¥C€šCHBBàÂÜÂpÃnCtÂ|ÂÔÂ£ÃøÂC¼ÂlBÃÔÂXB8B†B°Ã`Á€?€ªÃâÂpÁ¸BAbCPBäÂCWÃFÃÆBÀþCTÂÁ0Á)CâB¨B€‡Ã˜Â2Ã0C9CCBà@UÃðÂ[ÃÚÃHB€ÞÃdÄրÃ)Ã=Ã_øÁ CØA‹CXÆBB6CTCžBx´ÂÃDÂtÃÒB«ÃøBÈÁmCCPÁ¾B C€@UÃÄB¨Á;ÃAøÁÞBÔBÃñêÂvÃPÂ@ÀŽB ÃþBvÃIÃËÃPB Â8C€ÁþÂiÃ0Á¸Â–Â(Â]òB@ÁŽBAC€C€ˆCLB¨ÁSÃÀÀIÀŽÃgÃXÃÔB{ÃCÈB¸ÁÔBò¾BCtBˆÁbCVCICnC¦B AlCÃ@B’ÂdêÂ0Ã}à CÂö„ÂC…CIÃxB8Ã9Ãx ÃC ÂÙCæÂÒÂ`ÁÁ€•ÃÃÂÂC9ÃðÂXÂ6Ã@€…ÃȦBCÒB-C€ÜÃ&Ã!ÃòBdCøA¶ÂÂÌB`BˆÂþB´BèAC‚ÂØA<àÁ`ÁÈÁ8CäBqC€žCÃêB'ÃXÂ@@èBÀÀB‚BC@À€¹CECºBPCÂPÁ©CICšBØBÀÂÃtB€ÑÃÀHC€œÃ€ÓCØÂÊBºÂŒBHBØBî²Â'àäÂ&CÆÂTC0B¾B܀ŽCÃÀÁ1C€°Ã”BîB€™CÁLŠÃuC´Ã½CèBøA¬B+ÃÀ(B€Á|B€B‚BêB CøA+Ã$CÃìBØÁ8CÂDB6ÃxøÂ`CèÁ¨ALÃÞžÂ$ÂNC€€C/CB{ÃCCCTÂÔÂiCˆÂC4ÃÜÂðB\¬BdBIC€€C¨Á(CCðAÀÀÒœÂÄBÀ@ÊB˜ÂÃCjC0ÁêBÂ#CªBÂLCâBœC A¬B ÀüÂ@À²Ãð€¼Ã€?gÀ@B–BC1ÚÂ` AÈB–BˆBHBC CÃCÂ@B8Â=ÃCdÃÉC€—ÃCX€‰C¤B€¿¸BÖ‘ÃÀ‡Ã²Â€°ÃCpB˜C.ÀBLÃx€‚ÀÁü€À B‹Ã„Cö€C?CÈBWÃ@ÒBÈÂCúBˆBHB€ÃAXÞC°Â,C0Âd€ŒCÈB€£C€¥ÃªÂ@@ÈÂCCBkC/C²ÂHB!ÃÃìBœB-Ch€ŠC3C€ñCDB€A$BÂÈA€¥ÃCC€•ðÁ<ÃÜB@ÁþB€ÃŸÃÂCÁ@Àü Ã`ÂCÂÂpA ÃC¦Â²CiCPAC€ÂÃÀÁrÃÒÂÀÀLB)C @CPCÖBðB‡C Â.CÁˆÁ£Ã Â,à Â,Â~C”ÃÃÀÁœBpAàÀà ÃÃÐA€šÃ&CœÂ"CÊÂC0Á¾B8Ã@B‰ÃàÀVCÃpÂ0BðAÊÂÀT˜ÁC;ÃA/ÃðB/ÃwހC B€€CØAiCàApB0ÁPÁ€BCìÂoC4€›CÀAxCyCÆB€ÍC CC}C?ÃøÂà ÃC`ÁîBÂ6C¸Â ÃKÀ„à ÂöÂHÂâÂ#ÃB‫Ã.CCÖB€D"CÃLB€Ã¢BÃЀÀ‚˜C_À”CðÂ3C@Àà BšÂPÂpACÃtBAÃC¨Á¾B=ÃPBÚBàA”B B€Á0Á?Ãl¢öB Ã&CUCSC€‡CÁÌB!ÞBœÂÂàÂB[Ø Â?CWC?CòÂØA¸Á¾B4BÈÁ†Â¹C†B¼C„BöBƒCCØA˜BC„B`Ã`A€ÛÔB4ÃÂB¬BºBhÃ< BPÁLªÂJØBQC Ã-ÃŽBlBC„BÄBgÀÀ…CˆA!CÃ@@"C„Ã"ÃdÀ‘ÃŒÂ@Á#Ã4Ã0CŒÂdCÆÂ@ÀC¨AÀd ÃIÃÂT€@¯C0€ÍC,ÃtC$B¨Â6Ã0BÜB€‚ôÂöB€C CƒCÁC—CTCÈ€¿ÃÙîÃ@B€‰Ã˜ÁDÂCEÃMCÃòB@ÀÈCÃlCp à CÃ{C@A²BCÃ@LÃðÁ@ÀÌÂÀÀHBÁAC‡ÃŽB†Ã¢B¨AYCàÀºÂ¨A€?®Â€–CšÂ¨BAžB`ÁÈAèAèÂ$BÚÂ@@àB A=C4îÂZøBÄBlà A{C–B€¿C@Á¨Á(ÃÈÂÂÃÆÂC‚€¹C¾B%ÃàÁ€¤C¬B€‡ÃC€ÃÂÂøA¨ACÃ1ÃÃÃ%CÃàÂàB€Â€‹Ã_ÃàÂOÃFCx„ÂÇCdCœBÊŒ€¬ÃC<ÃòBPÃÀ`BPB B€°CÃ@B9Ã#Ã…Ã’B1CÖB®CÂæB€AC@ÃÊÂÃîÂ0ÃŽBWCŠB{C"C¤Â0öB6ÀˆCxB,C€ÂÃpBgÃžÂøÁ¶Â”C†BxCªCäB€C€­CâB€BC0C ÁÀDøBQC?ÃB ÃèA€‹CC€ŒC”ÂBÂÃ7ä ÃàAgCžB @>ÀC¨ÁžB0ÂBCÀÀ€’CÃ/C²ÂjC4BîB¨ÂB@AÃ@A_C2ÀDÃCÀÀÃàAhÃPAGÃÀ@ÐB€…ÃXÀÏÃ)Ã@ÁC€šCìºÂÈÁCBBCmÃÃöB¸AŽÂôBÃâÂàÂKÀ¸ÃÃøÂ¾ÂVÚC€•COCÊCL®B€¤CÜÂyÀ¢Ãü¸ÁÚB:Ã,°ÎB¿ÃB€­ÃŽÂeóÃpÂÀ†C5C¸ÂlÃÃÃÃÀ²ÃC¶° €C8BüÂÜÂaCpÃClšÂpÀÄ^úò®ÂÀ…ÃA€ôꀇÃRÊB"øB<²CBØAxBCÄBàÁPBˆB•CxB€ˆC{Ã_CðA¾B²Â™Ã€Ã€ŒÃˆÂœBøÂ¾BA°AdÃŒBÌšB:ÃUC²ÃâÂêÂXC\€@¢BŒBöÂC ÂÖBC²BWCA+CBPÂnCÀÄLÂoÊÂìB'CÃ’ÃxBHÂ0BÁ=ÃÀŒÃEÕÃKÃ(CÀB/CæBÂB BPÁ3ÀÃCÔ†ÂÂÂŒBˆÂ€¥C3C°Â¤B‡Ã€¡Ã„†ÃC8Â…C‚ˆÂÃ’C CÐA”C\CŒBVCÚÂCÃîB€†CBC€Aà@€‡Ã€–ÃÆÂ€ƒÃ€°CtBÀÁ9C(ÃCPACC†BîBtÂÀÁCpAC¸ÂâB0ÃB0ÂÀB¶CÔ¸AàÀuÃCÁ`Á%C€À3C°CA Ã^CÂà B„‚€?H€ŽÃ)C£Ã€@€’C8ÃÀ€™ÃäÂeà ÀÉÃ[ÃDÂ#ïCªBC€˜C€žÃÃ&ÃÈÁÄB¡Ã¼ÂØÂcÃ)öÂäÂlBæB8ÂRÑ×ÃÃúª˜ÂÀ€ÃCPÃA@Ä€ˆCOÀ@ÃàÂ1CÈÁ,B\BCC0³CØÂœB®BH¨BCnCÃÎCdB0A C äB@À‹C€ÂÃrC, à Á,ÂÃ耆ÃBdBÚÂØA2À…CECC†ÂGÃBCpáC@ÂOÃhÂCÃ|BÃ`A|à C ÃÖÂêB€¬ÃLBœÃC°ÂCÎÂÃøBC$À D?ÀC À€«C€˜CCCgnss-sdr-0.0.9/src/tests/signal_samples/GSoC_CTTC_capture_2012_07_26_4Msps_4ms_analysis.txt000066400000000000000000000034441305042567700311610ustar00rootroot00000000000000Signal capturing: Hardware: USRP1 + DBSRX daughterboard (Rev 4.5) + Antenna Novatel GPS-600. The USRP1 uses its internal 64 MHz onboard reference for deriving the sampling clock. Date: July 26th, 2012 Time: 13:31:49 (UTC) Location: Roof of the Centre Tecnològic de Telecomunicacions de Catalunya (CTTC), (40.396764 N, 3.713379 E), located at the Parc Mediterrani de la Tecnologia, Av. Carl Friedrich Gauss, 7, 08860 Castelldefels, Barcelona, Spain. Signal capture utility: we used the Universal Hardware Driver (UHD). UHD driver capture to file example located in uhd/host/build/examples/$.rx_samples_to_file File sink: In order to avoid buffer overflows the target destination for the capture file was a 4 GB RAM unit (in a system equipped with 8 GB of RAM). The linux command used to setup the RAM drive was: $ mkdir /tmp/ram $ mount -t tmpfs -o size=4G tmpfs /tmp/ram The command for capturing data was: $ ./rx_samples_to_file --file /tmp/ram/usrpcap1.dat --type short --freq 1575420000 --gain 50 --rate 8000000 --nsamps 800000000 This captures samples in interleaved (I&Q) short format (signed 16-bits, or 2 bytes), which is still not implemented in GNSS-SDR. Thus, the file was converted to gr_complex using a simple script in GNU Radio Companion. ===== MATLAB Results using plot_acq_grid_gsoc.m =========================================================================================== Settings: sampling_freq_Hz = 4000000 Doppler_max_Hz = 9875 Doppler_min_Hz = -10000 Doppler_step_Hz = 125 Results: PRN 11 POSITIVE ACQUISITION maximum_correlation_peak = 23.0285 delay_error_sps = 13873 Doppler_error_Hz = -9500 noise_floor = 1.8919 Gain_dbs = 10.8538 PRN 12 POSITIVE ACQUISITION maximum_correlation_peak = 16.5534 delay_error_sps = 10583 Doppler_error_Hz = -7250 noise_floor = 1.9020 Gain_dbs = 9.3968 gnss-sdr-0.0.9/src/tests/signal_samples/Galileo_E1_ID_1_Fs_4Msps_8ms.dat000066400000000000000000007640001305042567700257260ustar00rootroot00000000000000ÑÜ =S2¸%Ü ½­18ó ½Ú(×8r =(q¹éÙ =’û2¹Ù ½pÆV9=Ø =ðz¹ =ds¹e ½ib¡9yÕ ½÷²9{Ô =ˆÛĹ! =$0×¹M ½˜é9MÑ ½°‡ú9ˆ ½d:Ï ½[':ÐÍ =òºš =g!ºŒ ½_*:Ê ½í2:±È ='Þ;º) =%GEºô ½9?N:ƒÄ ½Ï°V:à =r¡_º ='iº¼ ½¯r:}¾ ½›rz:ç¼ =^±ºh = „†ºã ½‹:÷· ½,:B¶ =ú“º =Ht˜ºc ½Rðœ:ô° ½ü÷ :!¯ =…o¥º =\dªº: ½Wà®:y© ½¶Õ²:‡§ =ùL·ºj ='T¼ºd ½ ÐÀ:ˆ¡ ½W²Ä:zŸ =S)ɺ =‰CÎºÝ ½M¿Ò:&™ ½ÝÖ:ü– =’Ûº =]2ຢ ½÷­ä:7 =†)麎 =´Þìº= =} òºt‰ =\Ëõº‡ ½–Aú:oý ½ˆ’ÿ:¾û =á»ì =íÑ»{} ½ç ;aö ½‡¿;†x ½Â‚ ;’ò ½r: ;˜ð =Úw»ép =L3»Tn ½n;`ê ½Ñ/;4è = m»qf =<»¸ã =bç»a =„“»\^ ½Î ;žÜ ½ƒž#;&Ú =sÛ%»V =¹}'»JS ½4¸);sÒ ½ï‘,;ÇÏ =¥Î.»ÆJ =yg0»æG ½Ø¡2;wÇ ½g„5;B ½7;©Á ½Aý9;¯¾ =“9<»99 =OÅ=»;6 ½ˆÿ?;nµ ½îB;=² =#*E»'- =®F»²« =õ¡I»' =M"K»ë# ½d\M;{¡ ½UP;® ½„ÐQ;‰ = T»Æ– =mW»3 =’~X»] =ß}[»“‹ ½ó¸];” ½{,_;W =lfa»à =™id»Ý{ ½G¤f;‰ý ½+h;¬s ½Sk;îö ½ò‡l;›ó =ÑÁn»õf =Èq»ëì =Š5s»3^ =§;¦v ½rƒ¨;½Q ½›x©;Æh ½©¶ª;¾a =Ы»1F =Ь»S =¼®»r> ={ ¯»: ½³'°;±= ½äM±;À2 ½.b²;Ú. ½y³;X' =˜´»ö& =ºµ»% = ɶ»  =¨ô·» ½¹;å ½¥º;ù =Ÿ)»» ="j¼» ½‹‡½;á ½âp¾; ½l¿;ÎÐ ½ÓŸÀ;–È =·Á»×ö =ßûø· =_åû¨î =íUÅ»ê ½{sÆ;›ž ½Ý)Ç;Lâ ½¥®È;'Þ =BÌÉ»º„ =HmÊ»ý{ ½„ƒË;£Ñ ½3%Í;pÍ =âBλma =|ÅλvX ½;ÛÏ;ÃÀ ½ œÑ;‚¼ =ιһ:= =¸Ó»ö³ =`õÔ»Ë* =FÕ»! ½[Ö;§ ½ÝNØ;¼ ½µ„Ø;Rž ½œŠÚ;ñ™ =‚¨Û»1ò =.ÂÛ»%‘ =[äÝ»æÞ =†êÝ»,Õ ½þÞ;Ѓ ½@>á;Á ½&á;×z ½Bzã;Sv =H˜ä»Ã£ =y`ä»=m =aÔæ»¤ =À†æ»‚… ½²™ç;w_ ½Ÿ.ê;ÕZ =ºLë»Îf =ÁÑê»y\ ½-äë;ÐL ½§î;H =DÅï»1= =«ﻫ2 ½’,ð;Ð9 ½Çó;| ½ýOò;-0 ½(\õ;S+ =\zö»]ý="„õ»Š! =Ƕø»ºç=@¦÷»ØÜ½·ø;® ½qü;ñƽsØú;í»=íèû»• =!lÿ»Æ¥=~ þ»bù =KÔ¼=ô ½hc<;„½±œ<Þé ½¢<ªm½V¬p.¼×ýý.<<޽×n+<@=áò+¼Ž¨=ø¢0¼UŸ½|/1<"½Ù9½¬C<( ½æü><,“=s€?¼2†½þ@kO="W¼f·=ì‘]¼œ¨½ž^<ß½g¬X<Ö =Û/Y¼ã{=¤_¼{áÿ<À6Z¼É]=…¬`¼§N½–0a<“ÿ¼ Á[<ãxÿü¼=&lº¼^¢Ò<-´¼:tÒ¼€Ò´<æÙ¼庽¼‚Ð<¸ˆ·¼Šïϼ6¾·<ÏrÖ¼¤à½<¥“ϼ;)¸¶Ì¼“ƒ»<€ˆÌ<[¹»¼f¹Ò<ÂÊÁ¼†Ò¼cþÁË<¤ÇȼÓÀÅ<߾üäÏÊ<ð&ɼ²˜Ê¼nVÉ<}7ż€aÄ<® Å<·—ļÛÛļíÍÄ<»É¼gÊ<'€Ä¼Y:Å<ÁKɼJqÊ<úÉ< Ê¼töÃ<õÜż/¤ÈÊ̼wÍÁ<Ífȼ2ŸÁ¼âœÈß¼Ù«<öß¼8ž«¼ˆà<ô«¼ÏÊß<…'«¼}oà<½–ª¼±'à<`ª<ýUà¼ruª<Îèà¼:ª¼5áíï<¨t“¼‚çð<-8“<4ñ¼õu’–ü<]š}¼xVú=§V¼Ãà=($V¼£á=¦h><0‹½ƒ¸=¼˜=¡˜8¼T`=E8<Åj½%#< =î ¼šu=ìx ä»E= ºé»kø =¡⻦=×€ç»> =#dæ;˜ ½]×Þ;'½‰*ä;, ½­Ü;5½«˜Û»<=¢Ó໾2 =‰¶ß;Ù9 ½ŒYØ;èP½jD×»ËW=Û^Ü»íN =AÛ;ßU ½½Ô;El½lïÒ» s=é×»uj =¨Äл}€=È­Õ»ùw = Ô;«~ ½.„Í;t”½fTÒ;ï‹ ½ùXË; ¡½NCÊ»+¨=™-É;¯®½]ÜÍ;ö¥ ½4¾Ì»\¬ =7ìÅ»Â=´Ê»¹ =lÀûÚÎ=vªÂ;5Õ½&Ç;¸Ë ½ýÆ»ÜÑ =Xh¿»è=9R¾;ZÂ;ä ½Þ%¼;Äú½‡nÀ;éï ½ªO¿»Êõ = 㸻2 =°Ì·;I ½»ò»;' ½¤Óº»Ú =h‰´»i% =K•¸» =^\²»_1 =ËE±;P7 ½\7µ;©( ½Š¯;!C ½wø²;v3 ½ïر»Ë8 =cÔ«»¬T =¸™¯»PC =Ȧ©»@` =ì¨;f ½:¬;½R ½§«»ÈW ='K¥»#w =)4¤;Í| ½Ðº§;¢f ½¢;ˆ ½«z¥;Jp ½…Z¤» u =·Àž»Ï˜ =¢»h~ =O’œ»Ý£ ={›;\© ½Æcš»Ö® =œ˜»‡ =xœ;ï” ½¼—;%¿ ½7š;— ½äî”;ìÉ ½kד»HÏ =Õ–»0ª =d¨‘»òÙ =q“”»T² =˜r“;Q¶ ½aŽ;Îé ½Å0‘;$¾ ½H2Œ;Iô ½’‹»ù =¸Í»{É =ž¬Œ;&Í ½AÓ‡; ½m»†»3 =I‰»×× =Ó'ˆ;KÛ ½Ásƒ; ½Î[‚»£" =ÓÄ»Tå =Ò+€»Ã, =ù€‚»½ë =_;Üî ½<Çy;×; ½Þ8~;ïô ½¬fu;ÒE ½M6s»ËJ =/ow»žý =Ó+u;f½Õ¤l;žY ½9tj»‰^ =aan»e=Çl;ò ½ âc;5m ½0±a»r =£Re»>=Ñc;½F[;™€ ½.íX»k… = C\»'=ÿY;;½õºW»?=/(P»”˜ =ÇöM;W ½}îP;ñ$½@ªN»¹&=.bG»‘« =©!J»*=ËþB»µ =Í@;´¹ ½‚TC;³.½9i<;à ½•Ë>;v1½‡<»À2= Ó5»Ñ =üý7»%5=˜n1»ZÚ =C=á »T =¬Ú;Û ½Ô÷;#?½³»M?=”@»e# = ;ä' ½þä ;i?½Å¥;Ý0 ½¡[;*?½ø»ó>=: »D> =m¬ý:·B ½.’þ:ë=½ úºs==RsðºP =› ì:rT ½¸¡çºÜX =Öäçºï:=ñ[ã:&:½ýeÚ: f ½büÕºoj =ªÁÕºi7=9Ñ:_6½w¾È:‡w ½Tĺá{ =»ŸÃºà2=Ü~»º„ =Nºº<0=>¶:Ò.½‡=®:~‘ ½Ò©ºË• =²o¨º4*=è£:Š(½RŽœ:¡¢ ½0Ùš:%½µ“:#« ½ÊHºa¯ =ÒCºM=¼n†ºÔ· =B6„º-=d_:½&Lr:nÄ ½1piº›È =Ò9dº4=î-[:н¶ÙN:Õ ½üEº4Ù => @ºG=³7:¦½>`+:‡å ½Ã€"ºœé =;äºiý =&Û:Œú ½™ß:Æõ ½#Ê:§ô ½9ì9Ñý ½ŸtڹР=4g˹bë =òè¶¹Ä =µ!¥9¸ ½˜A•9œá ½Ç6ƒ¹>Þ =²Œ_¹| =¬ö;9_ ½G79ÏÓ ½Ú‰é8% ½d8¤8–Ì ½ÏE8¸æÈ =¿·Œ0 =›òÏ7\Á =Âcu88 =’üÁ¸Ô; ½g¹ªµ ½t*9ª± =êùK9íF =ÿ¦o¹•J ½µûй^¥ ½"÷œ9,¡ =î\­9kU =X7¿¹üX ½ãÒ¹J” ½JÚä9ç =dÌô9‹c =VUºg ½ª\ ºu‚ ½5ºàm ½íNºEy ½8G(:›t =?0:øw =6::'k =ÁìA:~ =¸ßJºÑ ½/Uº§\ ½Ç\º<ˆ ½YgºÇR ½õo:ÇM =—¥w:¢‘ =®M€º´” ½Vf…ºŒ> ½߉:d9 =´¿:¸ =;’º¨  ½„·–:£ =¾›:f$ =7°Ÿ:C© =׬¤:° =n#©ºG ½è&­ºŒ± ½µ²º\ ½Æ!¶ºâ¶ ½…Ÿº:~¹ =Üo¿:»ø =£›Ã:™¾ =YÈ:}í =MÍ̺Óç ½TѺóÅ ½Á´ÕºfÜ ½pÚº¥Ê ½È”Þ:íÌ =¬ ã: Ë =”ç:]Ñ =òë:Y¿ =äcðºu¹ ½Cõº¯× ½ŒFùº™­ ½Jþº«Û ½K;—Ý ='L;¡› ='„»—• ½« »ã ½_M ;Ëä =E+ ;Zƒ =°b»:} ½í»­é ½ìP;4ë =;½j =ë>»Šd ½O»xï ½‘U;Éð =œâ;ÔQ =å »K ½²#»iô ½/[%;‚õ =íº&;§8 =QÞ);Š÷ =E&+;ù+ =¾[-»% ½‘/;= =%å2;éú =õ&5»œû ½S06» ½&e8;Ÿ =ì;;Yý =.>»Îý ½Þ?»Kò ½27A;Ôë =‘ôD;Ñþ =6G»ÿ ½sÓG»cØ ½ÄºK»Eÿ ½;L»bË ½¥nN;ßÄ =R;&ÿ =6ÃT»ûþ ½ÑU»L± ½ü;W;ª =™‰[;þ =¹Ë]»©ý ½ÛÔ]»— ½š`;‘ = ’d;øû =Êld;rƒ =3i;‚ú =@Xk»­ù ½Ôk»½o ½ü5m;+i =Ar;Äö =3`t»©õ ½æËs»pU ½±ýu;ÝN =Ô%{;ëñ = g}»‡ð ½’|» ; ½Ä~;Œ4 =`‚;ñë =/7ƒ»Eê ½ò«‚»Ð ½¶x…»¶æ ½ Ý„»© ½‹õ…; =‡»„ ½fû‰»»Þ ½ü‹;ŽÜ =.WŠ;Ðò = ];ü× =̇Œ;±å = »"ß ½Z¾»”Ð ½лÒ ½ÿ’»FË ½D”;‚È =ð“;e¾ =1”»Û· ½Â—»Æ¿ ½ÒŸ˜;·¼ =(y—;C¤ =Êßš;_¶ =©™;9— =Á𻵠½T?ž»L¬ ½_Ÿ;˨ =Ìž;0} =ª Ÿ»°v ½ã½¢»Ó ½_Ý£;š =*h¢;8c =ö£»¼\ ½n;§»)Ž ½¦Z¨;Š =CǦ;QI =ß§»ÙB ½á·«»M} ½pª»î5 ½«õ­»lt ½s¯;ào =U­;•" =,m®»$ ½Up²»Èa ½Í޳;ð\ =´±;Ö =˵;S =]ã³;üû =úú´»õ ½–¶;%ï =âCº;S> =Äa»»÷8 ½_Y¹»èÛ ½C½». ½ˆˆ»»Ï ½ ¼;±È =ÔõÀ; =+»K ½Ïæ¿»~µ ½^þÀ;¯ =žjÅ;} ={-Ã;N¢ =o¤Ç;Cù =2ÁÈ» ó ½#tÆ»! ½°‹Ç;¼ˆ =ãÌ;öß =?3Í»vÙ ½TÒÊ»Žu ½ªkÏ»AÌ ½lÍ»Äh ½øÎ;_b =‚¿Ò;î· =?ÛÓ»± ½›_Ñ»,O ½(wÒ;ÄH =Ò-×;à› =A¦Ô;ó; =TdÙ;r =kÚ»!† ½çì×»³( ½uÙ;G" =ÐÝ;Ëo =«êÞ»7h ½KÜ»ú ½¬bÝ;‰ =í9â;Q =Tã»CI ½X©à»+õ½çÀá;´î=¢æ;`1 =¾»ç»J) ½\Õè;$! =$æ;ÃÔ=³6ç»Bν‚!ì»S ½Ñeé»9Á½°Sî»y÷ ½šlï;õî =|¬ì;š­= Äí» §½Ÿ¶ò»Õ ½Ïó;NÌ =° ñ;M“=’ÿõ; º =Æ9ó;†=PQô»t½oGù»­Ÿ ½a€ö»)r½¾vû»m ½6Žü;8„ =òÆù;^=ʼþ;¢q =÷õû;°P=w ý»ôI½ß¼YU ½r<ÿ»n<½¼9B ½Í¢<•8 =mA<(='ͼ1!½.D¼W ½/Ï<} =Mp<– =å<£ý =µ‡<Áþ=g¼Ï÷½H…¼{ß ½Å*¼Ýé½~š¼ Ë ½% <áÀ =ÄÍ<ËÔ=Ú9 <<¬ =å<£Æ=²p ¼ˆ¿½¨Ø ¼ëŒ ½ð‡ ¼?±½‹ <ª=ëv <.m =º* <¥›=ÉŠ<ËW =¡¼M ½mÍ ¼Õ…½øX<ƒ~=˱<|, =e;¼! ½‡û¼gh½jN¼Œ ½€¼ˆY½ø<R=ê<;ê=¼s¼ ß½I@¼y;½²Ë<ã3=<9½=˜¼ß±½Õm¼÷½.ù½~Þ¼¥Î½€ÿ¼š&½Ëô¼œ¾½é<‹¶= ˜<ñ= ¼üö½#!¼'ž½+¬<õ•=ñ· <åÒ=Æ?!¼ÌƽM ¼,}½Ø <×t=îÖ"B<"=BÃB¼1½^ÇB¼>½ëËC¼=e½€ØC¼Œ½þ`D<£û=‰XE< ;=ÓqE<¯å=²`F<î=´äF¼Ì½³ G¼pĽä’G×Y<úõ=Z”Z< =_[¼=ý½Ã][¼É½7&\¼ã½âa\¼îª½âã\<Ü›=y·]<м==^¼v¯½i^¼ˆn½pë^f¼ï×½Ÿg<Ê=úgˆi¼ü½®j¼©g½Ó1k€¼kŒû¼ªH€¼V„ú¼oˆ€<ïcú<ˆ>é<3¼Xé¼¶^ž¼ Nê¼[¤¼Ùºè¼óÜ<è<ÈŸXÏ<ŸH½¼Ô+ϼ¨H¿¼…ñм²¸½¼Óμƫ¿¼–ˆÐ¼+Ý¿<÷SÐ<ê`¾<ÃMÎ<¢?À ¿¼€ÈͼƒÒÀ¼RKϼBÁ<Ï<¬±¿<4CÍ<Ö鿼ÂͼٔÁ¼Ðuμ*ÅÁ<2@ÎZ¶¼Š²Ú<ÿ&¶<˜ÄÖ<È„²<ÖìÖ¼òI²¼{LÛ¼ºŒµ¼ Û±<'ß¼7 ±¼¬Ú¼MŬ¼ÉÓÚ¼'=´=<…²½û>¼Þ:½»8¼u@=¸ÿ7<öè=¦†<<œK=Öã6<ô =…;<Û½;¼M\½Z:5¼Úa=Ÿ¬4½†)9¼©?=¦j8¦¹=UÖw<ä_¥<Ðk[;ÏS¥¼vZ»fG¥<ü˜X;¦:¥¼c/W»‘-¥<­ÅU;& ¥¼Ú[T»d¥<íñR;J¥¼æ‡Q»ýV»¼¾Yl»Ùs»<Ÿ÷j;ø»¼y•i»Y®»v(;y¿<ñD; ,¿¼sµB»è†¢¼å8$»"m¢¾=±òó;œL¾½?úð»ñ~5½Õíb»œm5=ùñ_;@w¾=Æè;l…¾½åå»95½³W»M'5=T;ɯ¾=%Ü;I›<ŸË°:¦ÈԼΌÙ:5%Ô;®ÄK=.5»›#²=O7+¼Ô.²½£±,<ÜMK½®Æ;z%K=Ì)È»9Q²=ø"1¼í\²½Þž2<ªJ½—Ì;…4½²,·;…›½½®xB^¶½w=S¼Î{>½0$·=oZž¼\0·½à'Ÿ<Ýz8½r ![²½8¥¡<ÐSC= Ä?¼Õ °=Ö”­¼ÀTœ¼)Ìš;£þ›<;›»©›¼2r›;T›<Å›»ÿš¼Üœ;¡«š<–jœ»FXš¼C½œ;~š<ç»Ý>1½—~5=ã¾£="c>½{ò=Zeº¼×ܽ ¹º<s£½úX?=2Àœ½}ì7=èÈ,½á2Ë<Ô­,=8‰Ë¼Â{œ=~Ý8½ÈU½;©¼=òú¼¼1Ä¢=™A½r«¢½˜ëA=ïö½oî½<¤Þ= ?¾¼Ša¢=ªãB½.¿›= Y;½t§+=sòμŽ+½¸JÏÂ< t=ë‹Â¼ ¡=5pG½ö ½ÃÃG=!½{qÃ<à%Š”½‘P=—ü$½)è<â$=5mè¼—ê“=óP½Â+ <ʼb¼ ¼ec<ëûŸ<†mc¼t㟼)Åc<²š=ýÕ\½í"$½1Îê<(“½ñôR=Š.‚< ;¼‚¼áA;<ëù<ž€;¼#à¼Û¿;<¸Æ<›ÿ;¼«­¼ã?<<ÿ”<µ€<¼¶|¼Â<<Òd< =¼UM¼—F=¼*žVt¼³4¼ Ut<[1€¼n([<*#‹=ãXn½EÍ=â½Ü•½g£=0ꊽtgo=xˆ€<õ]¼&›€¼‡^<;®€< _¼´Á€¼ˆ¯_<³0Œ¼© t<ìà‹<Úûs¼µ‹¼ñìs<@‹<ñÜs¼ÛËs<ŠŠ<³¹s¼ST<…Úc¼¢j¼Ávd»¼ è¼£È<ú®<çÔ¼ùt¼ à<:< ê¼kþ€¼ïò<ãjb½âæŠ=¹¦½ f=.s=|y½Õ·a=iQ‹½Ó|a½du‹=Ö½°=Ä =Á½Ò5â<Ë ½¾@¼Ø[p<1¸@<àÑp¼Ì³@¼üIq<Ô°@<,Äq¼Œ±þ<# ½Cx_=ÂÃŒ½k@_½êŒ=Û^ý¼n@ =°»à¼öm=ËŒl½¤9–=5/l=¼L–½MIàE½ÐGR=3˜½‹II¼pX’<'vI<¶È’¼‡¢I¼09“<¤ÎI<Ø©“¼yúI¼ª”<ÿ%J<¡‹”¼/QJ¼¸ü”<|J<ëm•¼$ÝD<±—‘¼áD¼Y‘<ó\C½él§=rK°¼-^=Rè¯<Æb½!‰==Ч½/=ˆe›½pË<­4½ªÓʼÖ4=Z.½?‘›=ßkJ¼FQµ<>-J<‚…µ¼öìI¼b¸µ< «I<äéµ¼‘e,=Òß›½é|:=Ï©½o,:½p©=,$«¼RÕ=˜Ëª<„â½U89=s©½æ8½Ž©=]Æ©¼=Ó) <‚¼ÈÜ ¼î‚'=#½…2Ã<Á¾7½›Ó¼ Ö7=Q&½ÕO=Œ&=af½²Á<–8½àOÁ¼Ù+8=%%½ú«=Ê < 5ƒ¼­Ù¼Tƒ<ÿ¥<ösƒ¼½s¼K•ƒ<s?¼9¹è!¼²†² <+ Š<ÞT0½,G=é”®½+½·Ä®=qˆ¼(Ò/=]è‡Nº»d‹<´;¹;; ‹¼8+¸»<µŠ<Í·;%_м-ƒþU;­@Œ¼Ê,Ÿ;ÀÇѼ%&ƒnÁ¼p8;ë8½uº;j6½½M"·»&J½=•D/»°18=&Ü–:{>¡¼3d³:éü™ƒ°º]QÃ<:‘ü?¹ªº¦ÐÃ<šÏ§:wļ 㤺KÄ<Ÿó¡:m†Ä¼ ’;©´½F ;AþI½‹å»^J=AF‰»jˆ´=“:l:¨ž¼èfº\xžÀK½’ë•:ÿ°K=Ó@ ;O´=)ÿ»©´½µ/©ºZ€K½YbºŠØœ¼äz :Ú÷œ<ÿÍ8:80;éH=¦R3»ÍH½«¤»#)µ½Â†*; _8=U ²;">½=Vµ»;.½½Õ›3»¥8½.¿ºY_Á¼+ Â:ë&Á<·åĺîÀ¼$¾Ç:Ø´À<âR»d¦G½¬ýÁ»|‘µ½áîÄ;$œµ=JH[;–IG=QO;~9=cÕ;Lv¼=Øfd»ëF½ð«Ó»Çѵ½%úàº/¢¾¼I½ã:½e¾¨¼-èñ:ou¨<;êôº*¬¨¼î÷:Ûâ¨<ü ;¸º=]Æ´»>½7A1¼|Ú¸½]X-;E³<‘.»þ ³¼/È/;&ϲ<<ÿ0»™”²¼MU8=º°Á»æÃ>½}’<¼}B¸½·­=¼ãã·½Ö‹Æ;öý>=@Î@<9 ¸=7B½¸ÀF¼ ¸½ÏA;Æv±<´B»ˆ ±¼¦QD;Ëɱ½E<àô==¢¶¹<ä±=nú­»»ù¥¼Ï½®;¦< ß¼;J¼²<Ƥ¼<α=µI<ó[==ÊfJ¼`A=½íؾ¼Œ¾±½F•¿<†¹±=xyL<Õï<=x)M¼ Ô<½7ËÁ¼òª±½2ˆ¶;á°¦<»S·»JĦ¼ ¸;#ئ<í¸»l즼ں¹;"§¡¼øí:½‹½ðT¥½L=ð8¥=Ž¢<ë:=Ôù;«<âßù»Ö⎼O/ú;k­Ž<ú»lx޼eK’<ö%=Lª=ý®=ø˜¥¼îÚ:½nô½!@¤½Ì½IÜ®½ ¢“¼A%½Ýæ“B¼ŽÔµ¼èB<ä²µ<:©<µ¨=îa6=é‚©="µ6½þh©½í;ª¼Vx½bÎļZž5½9*½N½¬ã*=ùôœ=ÍÅ<û>5=Öô<Ô‚„<ùH¼·„¼Õ½º™½ÛÕ¼8 ,½kÖåS¼¿›¼NòS<O<ÿS¼Z¼‚ T<£µœ<«T¼ëhœ¼#T<7œ:½Dj½V‡‘½ng½4T½¯ûõ¼n½WYöX‡¼d)z<¦'‡?{<Ý¿|¼^<{¼Ì=}<¹9{<3¼}¼L7{¼Ì ½±`½¾8„½Üc‚½Úa„=J‚=â8 =öÈ=Š&}¼:)x¼x$}<*©w<ç!}¼Þ(w¼Ú}5=}Ý½å ½ ‡½<Œy½ ²‰½pÓ}½òR ½x(½b =êÿ<á,Š=1}='+‰¼µØz¼ªm‰<5Òz<°‰¼OËz¼tò‰<Äz<¼ =ƒý<4!‹=Œè{=ÀI‹½A±{½¡é ½Qü¼¨<‹¼ø˜z¼V~‹<ùŽz<á¿‹¼}„z¼GŒ<€yz<.p½‹Ÿ½å´ˆ½#™s½Ëˆ=æDs==[=Ö7½ûC½ˆ‰½ŠHr½3&‰=ôq= S=¶Òx=åR{<ÎÍ\<`K{¼$V\¼,D{<øÞ[8ʽtks½ˆ {¼¶™R¼[{¼rs€<—B><*Œ€¼>¼ cž¼ý i¼\žÑ‡¼‹3¼oû‡<è2<¥¢<¶°T<È ¢¼ODT¼ª¢<¯×S<Õ?˜=®”F=2ë'=/‹Ú<¡ü'½h(Ú¼Ùš˜½]ÀE½3¹˜=ŽyE=0(=_ÿØ<A(½$œØ¼L™½ý¤D½«2™=^D=ör(=Ûq×<`ƒ(½>׼ƙ½+‰C½r”Ÿ½°ÃJ½¬÷½Ǽ×è™=í³B=ÊÓ(=ÕŒ,<8ÃŽ¼é_,¼jð޽Ä5¢=¶ž>=Èë!=Ù½<)"½û“½¼Um¢½g“=½x‘¼b~)¼:¹‘<7N)<Ù䑼Æ)¼T’< í(<¨;’¼ ¼(¼Öf’<»Š(<Û‘’¼"Y(¼¸¢¼¶w:¼hç’¼õ'¼ì“<ƒÂ'¥¿¼×ÿ$½ w·¼Ä,½á¾¼’ ,=+¾<á¿ =÷|1=¯w•¼ô¤$¼Ìž•<ùl$<©Å•¼ 4$¼Eì•<èû#< –¼ÑÂ#¼·8–§<ßü<ÞV§¼E¬¼/o§<Û[<¹‡§¼Ÿ ¼ ž¼Ž' ¼ûž<ãÑ <²Ò§<ó< ì§¼d̼Ũ<þ|< ¨¼À-¼«=Ij=.='š˜<ƒ#.½D>˜¼û]«½?j½樽ݽÿs3½/ž›¼Œ3=¶F›Ûû>½a~i¼ö‡®½ˆžÕ¼B’®=éÔ<ðW>= Rg<}àž=gõb<øé>½À:b¼¶í®½ ˆÎ¼¼÷®=§ÒͼCζ½ "Á¼Kݶ=kÀ›¼´¹;»²)›<É]:;‰›¼9»,é¼½mÕ_¼Jü3½>ÌÓ»*õ3=NÒ; ½=m[<§š<~92;yš¼·Þ0»¢yš<"„/;bš¼¿).»SêÆ¼‚É^»_Ç—‘9b&޼Hƒˆ¹ËŽºÜ8¼@>C:Õ¼””:¯çÔ<þä—º“ÌÔ¼¶4›:ȰÔ<"ƒžºZ/=Üy»%îÁ=•´–»íäÁ½¿Ã™;>|/½Êõ ;É<î¯mº÷-¼~tr:»I<ì;wºÙ¹Ó<<ĸºM©Á½h¬;øÇ/½;†Õ/=–Ù!»»ˆÁ= :µ»?ú°=<‹¨»¦ãP=ÌCJ»ÏP½„M; ±½ø±;dNÁ½:lÄ;Æ;0½²â5;lK0=¼Â8»ú(Á=~„Í»Á½‹Ð;æ{0½hA;:9±=© Å»#KÑ< 캧Ѽ~/ï:†ñÐ<çQòºÃÃм?rõ:ᓼSG¯:">“ƒ==缼͠=½œ<Ƶ½-4<>w­<à_‰»¾ ­¼MÒ‰;Iʬ< DŠ»•Sµ½ŠØ‘½dÜ<3m>=K½¼ˆý´=õÑ“¼šD²<’U’»aˆ²¼aJ“;û˲<®?”»f³¼w5•;Sé¼G*Ž;­m©<`–Ž»%©¼ð;»Â¨<÷l»¹ö¶=ŠAœ¼Ú_9=©¼Î/9½d±¯@½a-<Ç/=Æ>¼a=¸=R¾È¼(?¸½ƒ‰É<7K/½~@<‚™D½xºX<=l­½wë¿<"Ñ.=Ê5B¼†E¸=„€Í¼Ë ¼¼;Ù;Ô4Â<ž>Ú»L]¼VAÛ;3…Â<áCܻ絬=TOļE=6Ø`¼ñE½y¾a<i¬½»0Æ<£O¬=0ÑÆ¼?E=fpd¼ JE½Ve<謽Œ²È)=îOY¼ç)½¾æY<šÊ·½œšížÚ»™IÃ=ï$½2ÐÃ<-$=y:ļ ÓŸ=Ÿ”?½®\›¼­¦:<Ó›<íÈ:¼Xãš¼në:<¼Dž½–m?=žÕ%½vÉ—<‹ñ<¼^#½3ÁÌ<™½ÊXE=Oüœ=‘ŸE½f;#=ƒðͼϼ"=ÄͼÁâœ=ÎF½<М½V&G=¡E"½ÐˆÎ7—¼¬mC<5—<‚ØC¼ø“<@¼[É“¼-?@<›“<Àm@¼m“¼ºœ@<}Ú="£J½«6"="ÚÔ¼±%"½Ó9Õ<ðfš½özK=Ì—¼„ƒGގ×=ÃY½šŒ=Ã9Þ¼Ûm½´„Þ<És—½¦¯Z=”<€áV¼sj”¼3W<S”Š½Ô¯½ÆgŠ=…ü¼Á="u\¼¾ri<><ªoi¼\±=¼!mi·o=s"—½ro½ F—=´±Ü¼÷µ =†‘\=¥ê‹½b=Ñ6#½@½ç`#=¡¥[½W0Œ=FW[=µGŒ½²ÿ<¨Ý#½Ø 6<9Íi¼b´5¼øÙi<­_5<çi¼¹ 5¼úõi<î Ù<‡ ½Þk=à™½F–k½m)™=;ؼúà =ss3<%Kj¼Ú~<£,¦¼SÆ}¼TY¦<çƒ}<|…¦¼Í:2<‰Ÿj¼šî1¼ù¶j<1£1<]Ïj¼“X1¼·èj<îU=øù½Eú<¯–&½Ë0ú¼¥º&=ñ U½!EŽ=w†g½ îš= ºÓ¼»ù =\mÓ<‹½Î f=ÓJ›½ðÔÒ<áA½G‰Ò¼gZ=º¸e½ð¥›=O.¼ófl<×-<…l¼œ—-¼(µl<ôX-<ÜÝl¼Ñ‘Q½»z=L³õ¼)‘(=’]õ=ï`½Z¦=LÃ_=Á½¨Ì<Ö–½ÃÕq<é6«¼`rq¼ßL«<%q<2b«¼©p¼âv«<.Cp<ðŠ«¼1»(<‘sq¼Ž(¼Åµq<³a(<ùq¼6(¼‰=r< (<ƒr¼½à'¼ÆÉr<"·'<‘s¼ ÊI½k‰’=ê£ë¼µ{+=‹Aë½n·—=ÉYX¼¼m¬< ÔWG¼^šª<Í´F<̇ª¼+F¼uª¨½|I¦<¿ê)½‚ü¥¼ *=±$½Ún¨=î!<ˆ¸¦¼o<>š¼0¼üašÀ¼èª=þ,d¼§J=? š»ÃV‰ÚR½@Õ2¼QîR=@À¼Êbª=61¼FS=Ñe0<((S½ë®<„rª½“rV»M£<3UU;Þœ¼9T»—мÐ2ÛºªdŠ<÷6Ù:(‹Š¼:׺»±ŠaÙº|>Ô<Ù‘ºÔ<ðÝŽ:œù¼Æ¶Œºý<]ŽŠ:Ç’¼æIAº6é’<® d;• ±½¸O;A(P½ïýºYP=+;S»½½±=)X_»JÁ=!ŽÇºëi1=,dB;Ú±½ÝþºVñ“ºïyM½ÌºK:jnM=K"½:o:³=Z‹Èºò>³½ ½rºLM½J»:ž@M=ðÉê:üK³=¼¶Ò¹wv™¼”Ü9Š™<Ú9:ýðÊ<‡œº¢Ûʼ:ú¹”Ù¼N:mÖ™<±º陼/ú : û™<Çðºü š¼wè:0 š<;áº>2š¼Û:&Dš<- Áº.¾4½2„R»h¿½u“X;¦a¿=‘dÒ:ªÕ4=¤3q:1ÌÉ<ë…wº§·É¼ ×}:$£É<„‚º¨ŽÉ¼ùÒLº_ßš¼B×Q: ðš<‘ÜVºš›¼èâ[:›;ëIÁ<‚î;kÈ æ`¼Ÿº½"Äß»p8½QTá;”}8=u¯ñ;ï’D=€lK;ù]¤<©ïL» ‚¤¼úsN;y¦¤=Fà“<‡Pµ=-¥”¼{Vµ½£4¼š=½¢Û<‰q==Ðô–<Œhµ=Vº—¼¢nµ½Î¼?õ<½Ws½{f1<ðS>=Žæ§<ŠT³=Ùî»Áî§¼ Xž;[Ÿ§@¢¼|=¥;@î¡<˜¥».œ¡¼[ó¥; J¡<åƒ3=þ[?¼ãS3½ÞÔü4ʶ½ ­©»Ó¿¼ª;cmÜé»yÁ¼:òê;8­Áy<«ÐD=pøy¼qàD½{ÕØ¼:1ª½xnÙ<ɪ=ìÈ|$‚þÄ»—‚¼B ½í®¶½¡Xv¼®!½™àv<â‹!=ýí =¥•¶=᪼ŸÑ˼ß-<>áË<ãÇ;Q¸€<.\Ç»#‰€¼ï©Ç;uZ€<)øÇ»G,€¼ÜFÈ;2ý< –Ȼ֢¼¶åÈ;yI<à5É»ñ~¼‰†É;»™~<´×É»ZC~¼b)Ê;÷í}<“{Ê»‘™}¼IÎÊ;(F}<†!Ë»ºó|¼KuË;H¢|<˜ÉË»ÑQ|¼pÌ;T|<Òs̻г{¼Æô=Œý¡=Áó¡< @F=¥b¢¼Ð7F½cܽ¸¡½'Î;µ9z<¾λõðy¼ ÙÎ;&©y<å2Ï»Iby¼e½¬Nµ½߃¼ŸÕ½€&„=°Ç¼Ï>½çê!½ŸXš½³jȼ¿•>½ÏÇÈ<µx>=±Û"= š=ó+#½' š½_Þɼú >½ú:Ê<‰>=±$=lÔ™=†qR< ÉÄ<#ÍR¼ §Ä¼(S'=)™=´Ž'½™½Väμ¹|<½a?Ï<^<=ó~(=kɘ=þÎ(½*¶˜½êOмÖ<½x3¼dxj¼ßx<ïhj5½f:½ñA”½Cj:=H,”=  ä<µÛ4=}`ä¼¹º4½S;½듽Rÿk¼ûð¹¼ÌSl<˹<9¨l¼7¥¹¼—ül=%ø’=$¼*pe¼7h«_/U=Ù÷‹=ÁŸ=(=8ƽªf(½ƒV½õ®‹½=”*<'^<ÙÞ*¼Î^¼30„¼Hs«¼k?W½½M‹½ßª½ô}'½Ð=ÈV'="X=Ñ‹=œmX½‚슽1A½•à&½€f=ô¸&=|PY=˜£Š=z]…<1Ñ©<~…¼Ë¡©¼Vž…<3r©<ßA[[¼¦¤?<è:[T¼÷S[¼¬T<^U[W<^[[<™¬W¼á[[¼°X<;\[€½E¶|½¬9ˆ½0ô…½jѽæÌþ¼6ÿ=4¥þè>¼¹9<ø ><2¼=›=¼¥*<É*=<,"¼Ÿ¹<¼<ÁG<e¼O§<»*e<ŠT§¼³e¼.¢§<ôe<Ó†}¨¾¢=PQ=r•=ŽÊ?=ãñ/=XNá<9£½íŽP½À²< öb<œZ²¼\åb¼–±²<„Ôb<®³¼~Ãb¼Ú¤=rKO=o¦=%t»<ñ ½´»¼§€¤½LˆN½is¼3:¼~¹r<ï²c<–<û;òc¼3iú»Òb<„—ù;ab¼ŽÇø»´>½ìÜм`ÿ—½^&½g ˜= ¼%=Å??=‰ûÏ<-¨a<Òô;öza¼Í ô»Oa(Ï»¿ÊkÏ»÷"˜<}DÏ;¿¥˜¼ŠIÏ»Ï(™<ïMÏ;&¬™¼¨QÏ»gà·¼A÷»gy·<çõ;§7›<‹XÏ;ð»›¼XYÏ»l@œ<[YÏ;Åœ¼XÏ»øqµ¼Ì.ï»L µ<ÝØí;g ´¼¯ƒì»J7´º¶½^Ðü`á¶=3Ã<%ï2=:>;Ü„¼#&»\„<Ö ;x„¼Xø »/„<¤â ;€ „¼µÍ »j„<…¹;센¦»„V½Æ%ª»5|­½àb¼B3Þ¼øæ,»¨-Þ<ª+;‚'Þ¼N)»Ð Þ;0}ݼ8p »b*½ÙXU»Oçýc+ò»æÃ=”ï;ìŠ*=³^M;,†¼ÐŸº7—†<ÜÆ:£¯†¼ë¼›ºqȆ<¶²™:4åÜî¯=[à%;¿S=ºéÀ:ÆÄ-=Ûɘ:ãïÂ=34%;‘ç½û»Þ.½Vgˆº­–×¼v%"º°¼cO˹H<ŽÂ9¶p¼æÈ¹¹oüÖ¼«\ºÕÖ<‹àþ9K­Ö¼… ñ¹9…ÖI¹6±½SÒ¹xÑQ½ý¾C¹U»Q=ö\9#±=¬p9Pμ„E·¦û<±¶.)‘¼×!Ä7çV‘<‘,¸Ñ„‘¼=v8벑<îL ¸5ᑼ“Å8ö•Ò¼ˆ])9¢ÔP=Æ}¹蔱=wô;ºX ±½<“R:@ŒP½!Þ:£1½ºüþ9ÂUÁ½>t—:IÁ=¥²£º d1=_‚!º‰P=®¨Jºð±=ûŸ¸ºü±½ ûÃ:†ÄO½’ûq:˜Ð<›ÿ¹éϼJ:—Ü”¼ÛÂÉ9‘ •<¾~Ó¹FPÏ<¨«ºæϼß :NéÎ<»†&ºµÎ¼7ï,:V–¼EF: 6–<÷7ºÛg–¼þ, :Æ™–<[%ºËË–¼!:éý–<$ º0—¼”" :kb—½<ˆè>=Ö¼"¶=#W‚¼0¶½nƒ=/¼iòµ=H­‰¼˜ìµ½zhŠ<é>½‡e=¤"¼Úµ=P™Œ¼kÓµ½T<Ü=½ÝZ<@e¶=XF¼±‰<=à¼Ëƒ<½£<\D¶½%n‘<˜9¶=5&’¼p<=é¼Íh<½šª<è¶½ÒN”<Û£­¼›"Ž;ä­<¦ÕŽ»M—­¼2ˆ;­øœ<¿ß;½ ##ú9=X8¼±´=˜³¼uª´½T´<¦¹9½ò):<’£9=mÜ:¼8—´=ÔŠ¶¼ñ´½ÏG·<´_9½´ñ< <"Ê»%  ¼¥Ë;ÑÙŸ<´v˻ϴ<Áæ»Sk2=Þ¨d¼ÌH³=»æ¼ŠC³½Pç<2½¥f<­Ö<½Su<‹¨­½¾]â<±­=åã¼[à<=Ýw¼ê^1=†‹i¼˜³=‹¡ì¼þ³½!dí<|ù0½Ã\k<œ×0=k÷k¼Zò<=²ó|¼#õ<½Í}‘¼˜ë;y‘<ù€ë»‚ê¼èë;:u¹¼èaŠˆ¼ í<5qˆ¸<¸»4¼).¸¼Ó5<ïz¬=7 *½?Á =‹áž¼(ª ½`0Ÿ<<>¬½R+=n‡¼GÛ<ýW‡<(¼ B‡¼A[<€,‡<›¼‡¼Üƒ¼PÕ<‚9ƒ<&*¼#z™½®f9=Óœ/½÷Ô<æy/=¡íÔ¼?™=à^:½]#ƒ¼$×<†ƒ<ë- ¼áƒ¼… ƒ¼Ãä!<5¬¼Ç1U<¾¬<ÂrU¼6Ú«¼O³Uö‘=ÂÿZ½tû=>ï¼D˽6=ïaâ¼÷ß•=x$d½ê]‘=‰¼]½Ûw=±°ð¼©m•½&ßd=:нfä<þ|•¼èe<5;•<¶ûe¼Xù”¼ûf ‰¼ò[h<¨Éˆ…<.Óh¼«þ„¼àÚh<ð¾„<”âh¼Y„¼Jêh<è?„<òh¼„¼Æùh~½·ÿ =Þï½”l‡<#¾{¼i‡¼8|d =]õ ½ƒ™=ßD½^îƒ=4冽Ÿ ½Ûx=–Š~½ê¥‚=žÐfü<@§½êû¼UÄ=ÜYd½à{={m½‘p“=X0è¼›r=@ìç÷¼M=¤çö<h½–I`=ÄG½Vâh=©•½*:ä<%e½÷ã¼Ò†=Ñóg½:e•=I×k†¼dåB¼;e†<¿µB¼Êp<¸|><ßw¼ w2<Ü“¼~@2¼E”<« 2<è+”¼¨Ò1¼wS”¨.=Ýø½§ ¨=Ф=Ð5¨½Ql¢<õÞ.½æ<£Î¡¼˜¼Gæ¡<öI<Åý¡¼¦û¼¢<0­ £¼k‡¼—£<üÀ¼áÌ£<p<©á£¼÷¼Xö£<ÏÍ <î ¤¼8Ý <—f£¼ ˆ ¼v£<ä2 ¤¼F༑M¤<‹<Ñ\¤¼ç5¼l¤<°à<6{¤¼r‹¼YФ==÷C<ü=½®â·<#x²½‘&¬»øÄ§<m«;NÁ§¼¶³ª»›½§µ<`}ž;¹µ¼ÿλú2µ»¬<}ô;«/¬¼þ)¼º:·=N§»D$B=²€¥;úB½ãÚ< [·½k¼Üe·=à» B=®.Ÿ;B½ñ<`†·½(';n¯µ¼ù¡»9›µ<û;¿†µ¼¬i;†­¼‡»Ý£­<Ï;ÆÁ­¼a»×ß­=ï¼± ¹=Èp½Âîÿ:z¬´¼êüºk•´< æù:)~´¼’âöºµf´½a‚©ºÝ>=©»Nsº=C9:1¶¼" :ð>®¼ …ºç%®½±Ul:4íº½­›Tº›óº=î࿹ó==Ý_9Œ¬¼a¹†u¬<ºÐØ8‹^¬¼!문«G¬;¼©½½eµ»IU5½‚Ä;ÖÅœ<¾Í»Œœ¼vÕ;ªQœ<¤Û »™œ¼+zÑ»…¯I½6 ;¼y±²½Åf<<²=¡Ö;ïI=!²T»¶šÆ¼)„V;£ÍÆ<½WX» Ǽá,Z;.5Ç<˜\»ÌiǼæÛ];ùžÇ<͵_»µÔǼR‘a; È<8™-;<Û˜a0»Ä ˜¼‰ój»½"ɼûØl;R\É<Àn»q–ɼµý3»¢ð–¼Oà4; ¨–<Á5»Ø^–¼ 6;–<ïËh»;b“¼­î>;¤“<í †;j;Í<‹‡»n}ͼ–àç»ùN/½Õž}¼I’¾½¶;<6¾=úsë;¤Æ.=TND»ÈÖ¼/ E;ƒ< ÆE»è.¼&F;EÚ<ÃUñ» Þ-½H…¼ë¾½™†<çö¾=UÑô;uO-=ŸÿI»p,޼m„•»›CѼu“–;=‹Ñ<^£—»)ÓѼ‹Ê|¼Åè­½¬e¼Ï#O½ŽV¼1T½5&˜¼Cö¨½á¹®¼u#Á½U¤¼#½¢$<ÿY#=Ù?±¡½J¿È<Ð/¡=ƒù†<ìþW=ÿ5…;¨nT‹»e-T¼;™‹;b=T<]Œ»fPT¼‰Þ¼uaè¼*,»‡T¼ß¶;¥›T<‘eÖ¼bK ½Á§¼V½= <íùU=:jØ<7 =‚Ù¼ 1 ½ó1‘¼’”U½ì’‘<#qU=˜"Û<ç  =ø =pé¾=¿ÆP¼x«¼øã><`M«<êÛļ ?0½`Á0½(á½³ú0=E¶=rÆ<@n0=ü¸³<j=x;=Yæ¥=â;½¾á¥½ì(´¼ù±½ ¡gc½ó&›½Qªc=›=ŸÔ<'w=Õ¼yl½2rd½’š½â£s<à‚¤<ƒÅs¼;B¤¼væs¼h=¸ ˜=›jÜ<Ö±=hÐܼЍ½”xi½Á”—½ ·i=¢m—=¯Þ<ÂŒ= iÞ¼…ƒ½yqj½ç÷–½iÞ?¼Ž™v¼ÅX@Ýx¼0d‘¼ÓoW¼38{¼ØíW<ÎI{<,n½1Aнõ½å¡½è =õn=+o=Š=ybZ¼É›{¼ÞßZ<òª{<&][¼¯¹{¼MÚ[<È{<…[y<êŽ<þfy¼v=޼{ry<(û<ü}y¼¹¼r½<‰½}y½ìðŒ½Uy=ÁÈŒ=énùj<™©|a{<º„ªv¼(|¼‘w<œ|<¹w¼Ò|¼·x<©|<‹vx¼ ü{¼6éx<8ð{<·[y¼óã{¼6Ù‚½?ꃽü½‹s½)Í=¡]=Ø*ƒ=€sƒ=Ø•{<-¡{t<´¼¾t¼Òç<\ös<|޼°Ñs¼Ý½'éô¼¡Ï޽- t½¾óŽ=JËs=PF=oÚó<‰<s<®O¼œïr¼»‚<éÈr<°µ¼ê¡r¼ªŒ½§ñk½ý_½Ü‹þ¼CŠ=”Oþ<…RŒ=Úk=nkŒ½A³j½¨½Ÿ™ý¼¥2=™\ý<¶Œ=xÄi=æÎŒ½âti½+°½e¤ü¼ÛÙ=žfü<*/<¥ãT<-7¼¬‚T¼=?<ç!TÒk½lÊ½Ç é¼C¶<ìíN1@¼G¯ƒ<à?<¾ƒ¼N?¼&̓<Ô>?3<ô.½ƒÊ»¼ÿ:¡½½-½ŠW¡=Ã4-=:9.=ï–º<ó¶¥¼¸ 1¼ñ²¥<<0<¿®¥¼°,0¼Úi•¼±~¼¼¢= r+=v.=*.¸Ú¦¼ÙÞ/=¤s¦<”§=©®=C¢¨=¦È=L-=芢<´4-½Ò?¢¼ïɨ½´½LŸ¼=>¼ZAŸ<®<}°£<ðý <;Ù£¼_¾ ¼¸¤<|~ <ó)¤¼D> ¼íQ¤<¹ý <£y¤¼Ú¼ ¼¡¤<¦{ ²½æ@Ú¼žÍ6½n _¼Gà6=V^¨¼ÌþÅ»²U¨=*e<ε=·ÿ‡½_* ¼mÜ>=Øk <Ðæµ==…<úìµ½§Z„¼™?½x/ ¼º?=jp ­<{–<;ID­¼­5;»îǸ½(F¼b=½™É»Œh==”È;‰Ú¸=®ÀA<‹à¸½²H@¼[ð@=WÇ;2·=%”;<‰Z´<67; _´¼Æ5»Oc´<×U4;Tg´¼eå2»ü‘­¼f¸*»y™­<…Y);¡­¼Áú'»è¨­<œ&;j·½~.¼ž(A½Ÿ4¶»Ø,A=qª´;G}·=T!*</¹=6*<lj·=À8'<·½qÄ%¼Å?A½ëõ¬»CA=k«;Т·=og!<©·½ó¼CLA½ʦ»ì>½ ¢»ÞS¹½Wï¼yW¹=cu=ž;ØD®¼†_»_O®<; Z®¼¨¤ »÷~´¼Í&» k¹=„˜= þ”;i>½£}“»¬s¹½i)¼‹r´%;UW´¼ï`ýº…R´ºô«¼~C:qØ«<|ÕHº«¸<¹±]ºÿø¼s°c:ùܸ<í°iºýõ¸¼)³o:M®·½Ìâs;$D½úQ;’)D=ßx»ÚòªF½zz’;>HF=m”»hµ=ü ¼’c¾¼ó%ƼŽÏ½;²$Æ<ËCÀ<Ÿ¼Ý0À¼á<çÀ<ûa¼ë À¼Ã<è÷¿<$¼ß俼%…½<ñ¾¼á*½¼`<½<ɼ¤8±½×ö=#\%½ma‹<7J%=Mµ‹¼ïÿ°=%½ª³¼¼na <ªŸ¼<«Á ¼ök‹<½3t¹<ÄÝ.¼Å\¹¼ã:/<1E¹<Ü—/¼u-¹¼¯ô/<ËŒ­=mT%½0ñ!=›ªš¼aÞ!½»ýš<Ô9½ûb²ž<4p¬½úÃ)=ÁY¬=Á*½Kì =/9Ÿ¼G·½°ñ=©ó´¼,彋Oµ<…’¥½ãÆ?=¶t¥=¼@½[À=_d¶¼T´½ Á¶<¥½>ý@=ç[­<ÎK¼¼*­¼~VK<5ù¬< ’K¼PǬ¼5ÎK<·€/='}ϼ¹çš=s7½¡Öš½–ã7=ï /½ë[Ð<šä.=¥Ð¼˜£š=|æ8½©’š½ô<9=em.½˜€Ñ<‘œ†¼G "=¦),½ZYÕ<Îþ+=RÕ¼…x™=©?½ç'‡¼õš(<É2‡< )¼è=‡¼u)P…<Ö}[¼K Ž<ìVj¼» ޼Ñj<Ì¡„¼Â²[ácp<£pd¼Ù÷o¼c¡d„<¤šX<°n„¼3zX¼“Ÿ„<©j¼q¸<±i¼}-d=´µ½~ˆñ<3~½2&ñ¼û=ænc½á‘= f½~“=5þï< T¼$øŒM=”è½gÛF=ÀS™½r·×=§mš½ðÒ<7+½ )¥<=¡µš½…–Ñ<åD,½S\Ѽ¸w,=;½Ùš=­D½ø¾¢=³½¼¿(=À½<«(½/àC=ý-£½!þJ¼_}©½á¥=š˜H<Þ㮼çsH¼ø*¯/½ä\œ=™È¼Ig3==¸¼ Q…<ÄD<(9…¼ÂѼh!…<8_<à …¼(í¼”ò„<‘{<„Û„¼w ¼²Ä„<Ù™ ¼é}ƒ<f&=§ƒ½e«Á<;Å7½#`Á¼ï7=„Z%½÷¨=|: <ð(ƒ¼ Õ¼ƒ<'p< ƒ¼× ¼oú‚<Ñy@¼ Á¹<ü;@<›ù¹¼U⼪s»<Œ5><¤§»¼Áñ=¼Û»=ª›’¼@D=Z "½–°=óÇ!=#¬°½l ‘<ör½ÛX®<ïe?½ü==Ð÷ ½Pë½t ¡=Î9­¼·­?=0a/<Ž“Â¼/¼Æ«ÂļÄý<5ñ¥½w”<(ðB½O ”¼ìôB=aªû¼v6¦=_-“¼»ýB=<¿’<ÈC½ Ðù<1|¦½2ù¼ˆ“¦=0t‘¼Œ C=¤‘<¯C½ØW÷<ÔÙ¦½õá=Ì-µ½ªu<Ö»&½ u¼dÛ&=þ»½¬Hµ=LAô¼ÒO§=Tý¼ŸC=Ž<!C½¸fò< —§½ù«q¼›'=£n½{µ=@ =ƒµ½æõo&¨½î¼0>¨=Š¢‰¼²%C=#m¼ (=Ö´þ¼¸µ=xïý<#¿µ½ dk<;)½Ëû<Ðu¼¼BbÂâ·<ædi;¼Þ·¼<ág»/Û·<´Qc¼iµ=Eèñ»oPB=bVð;œRB½ _<Іµ½q.b<#P¹½:—â;‚ä:½è!á»<ñ:=ì¹]¼']¹=ÏÛH»à©W;E¯·¼ÕÈW¼¤m¹=ª_Ø»A=;=™éÖ;æI;½®SS»Ÿ©<¿8=;±©¼#í;»7é<½¦I»¥€·<$H;¥z·¼€¡F»ut·<ßE;n·¼›gB< F¶½eËÍ;"mB½ŸøB¼'ž¹=:ãûï;=lÂ;pü;½Ü>ž,»ÙqŸ¼1.;”ˆŸ<8e/»áŸŸ¼WÊ0;½·Ÿ<02»(П¼ Ëß»5DG½e'K¼ ˜³½’L<…™³=ŸnW<»=þ ^»Y«À¼¯`;»‚À<"aa»…YÀ¼T¿b;¶/À<¸gU<]¤³=ÁRí;‰kF=UÐî»ÝQF½ÐY¼üª³½¾H[<[­³=Eó;F=ö¿ô»"èE½´_¼ï´³½Ön»ž¾¼“'p;Ên¾<¨žM;—¢<φn<»º=8Öë;‚t7=fí»¾7½ûÐr¼…º½M>t<­rº=¾ò;jª7=ªó»I¸7½ „x¼Ò:º½ xq¼DÙ³½Ë˜¼1SD½+Q ¦¼²y;å3¦<~¡z»²]¦¼R?|;¡‡¦<)Þ}»±±¦¼~;ÞÛ¦<Ð<Ä=¸=%l˜9=ä~¼{¨9½ §’¼y¤·½à#‡» [¨¼yø‡;×…¨<‹ª’;=Ú´<”g•¼mK·½ëh¼“ :½@;<§:=gv—<·=ÿj•»^©³¼}ö•;Al³<ˆ–»/³¼# —;õñ²æœ»"S°¼Bl;’°‡k<â.2=€;l¼B2½Ì‰í¼eƒ²½4?î[2½¯>:½Â·–½ãAL½í¤½r}¹¼Mq½}¹¹<ïL=UM=¨²¤=G•;=!–=ËÑÞ<Èï1=QfN½v¤½™éº¼ ›½¹c¼!´¼Z†c<¥´½Û•½ŸJ>=ü”=¨Úâ<ò81=…m<¹Áp<(•¼óxp¼m½N¼”Og¼U¦N<ÈMg<0O¼œKg¼àuO< Ig ½ê󂽇{½•׈½æ(ƒ½“’½)‹ÿ¼Ú¶=ˆNÿ<°5‰=ôº‚=P«Œ¼žÂ…¼rÆŒ<[˜…<ÎጼUn…¼dýŒŽ½õ_½ÒUŽ=a0_=!F=P=ù<=o½ûø¼ŠœŽ½ó@^½í³Ž=êð]=ë=Æ4ø<|Ç=Ð?à<}«–=&åh=Ζ½O h½þ½74ß¼"¼€Rq¼…I"<#z¼ëÝ!¼ øy<í}!<ïy¼)!¼>æy< ¾ <Ýy¼S_ ¼ Õy4=¼•Õ<ˆ‡˜=lU4=7š˜½è4½A©4½d Ô¼úey¼n¼?ky<ì< qy¼7ʼ\wy<çx<9~y¼ý'¼¢…yây¼¼ïy<‘È <„ ©=ÿW?=’À=n¬½´;z¼¥P ¼èLz<¹ <Ç^z¼9½ ¼Tqz<&t <É8½=ª¼ŒJ=Öê©<ª=a<=uÂz<T <Øz¼) ¼Dïz<¥Æ <À{¼Ž€ ¼Äª½÷j:½5˽谧¼:Þ=>`§< Ûª=^j9=Ùk›=BD(=//9=­È<J9½§Ç¼Ë?½ÃÏ¥¼ÐS=<€¥<¬k«=Êd7=Bƒ«½ö 7½ç½Æ’¤¼[¾¼¼¥{H¼¾×¼<H<¥ð¼¼»G¼ ½<ZG<@H:½Íùüó{œ½ ;$½\‘œ=ì#=`:=ÚÂ<Œ¦:½†y¼Òœ½˜ÿ"½’~=r:¡<¨¬=ª–2=FL~<™2ï»Rª‡<1îî;¬Ú‡¼Šžî»g ˆ<=Oî;„<ˆ¼Iî»Ê¾¼íþ%¼€¾<Õ%<êq¾¼ƒ%¼Mc¾<÷€$<ëV>½„¤¼K⣽äÔ ½Xý£=o‰ =&^>=²¢<`>½FA¢¼ÕN¤½§ ½j¤=©[ =id>=]î ½,} ¼<¼¤½Ty ½·×¤=â- =çf>=ú(Ÿ<ôf>½a·ž¼q*¥½€K ½F¥= =š±=OÎ=–}¥= i=Öc>= ~œ<Žb>½é œ¼!Ñ¥½x†½áͼ¼=à¼/¶¼< ]<ž¼¼éÙ¼±…¼<›V<)]¦= =®S>= ë˜<¼P>½_x˜¼±¦½w)½Ôͦ=¼Ý=™(½u…¼!²½µý ½=¼ùtã»C<€+ã;€¼ûáâ»D½ý¼”Ó=½Ç­¼VÌ==‚:<·y©=orû<]–©½åØú¼Æµ=½Ãà‹¼Yñ•¼àoÜ»“2–<…"Ü;îs–¼äÔÛ»’j¸¼@P¼@Bª½==÷¼…=½¾-‰¼‚|==©ºˆ<$˜ª=Ämõþ®=µÊܹ½¯'”¼¦n6½ð&¼Ga6=™[<£|¹== ’<(‘¹½{Y‘¼ý86½ú ¼€+6=à/ <ûD=b}<¢D½ÐƼZ—²½5ˆ¼È”²=ÿv‡<ÇE=±¡<îÙ5=$s<_Gº=‹á2½û/¿»*¾½8¥I¼¼‘É<.T;“Áɼ/¿R»<ñÉüŽ<:(¥°½§¨=»/=öd¶:5IÂ=ù=D;óƒÕ¼-àPºÜ…Õ<ýJ:‡Õ¼OCº`‡Õ<„…<:1<jó9½¼aXê¹ûgÕ¼%ºþ¹9¼9Û¡¹ŠC<œË˜9AN¼‹»¹ûK/=Ê­$:¸EÂ=Ë(ª:AC½aκq`/½ôQº6Õ¼8’¹îÕ½™k³;Õɸ½}Ç/=Úƒ¸»_Ø?=!»» ¸=´ÿ4¼J¸½›Ž6<™0?½T¿;M°Hq<ݶ©½…ÚÌ<ϳ©=“ͼÐ*H=éXs¼åÌɼW5ö; ’É<”Íö»=˜‹<»†«»¥º‹¼L¬;Þ‹<ë­»zŒ¼úÜ­;á'Œ<¯§®»DNŒ¼ t¯;q×ǼQÆú;ñ“Ç<‰Pû»hOǼþØû;Ö Ç<®_ü» ©=ùÑ×¼¦÷E==¿|¼SËE½Gd}< ¡©½v Ú½Ø ¢½•=•‡6½ÿÿ²KÐ<Ôᙽf2=ü’~<ù”¼_d~¼aÐ<+7~<• ¼ß‚™½ 63=‚æ3½SÒ<Ì3=²ÛÒ¼'=™=z4½èi}¼‡E<íD}<†¼F!}¼AÈ<ðþ|<Ì ¼.&´<µ)V¼²´¼`V<~è³<,ØV¼•ȳ¼.W<÷§³<'ƒW¼¦†³¼W×W<¥d³<ª*X¼1|½f£=Æ_N½­L=°˜¾¼‚>½Ûñ¾À“=qbK½2Ø(=>êè¼è©(½ü(é<ˆ‹“½"fL=·U¦¼ëf›=•q^½8ä=“ZÔ¼,Û½Ž¿Ô¸¼d;‹½kÝo=×½ºB=Ðq=^½qôŠ=Ïp½•œ¼ta<þ}‹¼/¶r<™I‹<‚×r¼ƒ‹¼9ùrÞ<Þm£/¼#Ii#5½kÔ>=R¿½ý¸¼Âž =IY½‚g¥=ZÑ=½Ëê=%î¼Ï6=u¿í<\L6½\Ð<={‘½  ¼BW<Å^ <· W¼†ü ¼»W”= rk¼ÎxÇ<¡k<ВǼpj¼È«Ç< 1j<¶ÃǼ¯ü;“X¼†Sü»V7X<)úû; iX¼õ¢û»®œX<èMû;EÒX¼ógÔ*½:Ç•=8¢Ø¼œ`>=36Ø<:r>½x*=–½T0ø»‘ [<ùó÷;–í[¼’¹÷»<\<÷;w\¼J÷»Rà\¯<9 <#þ®¼’~¼ÿ½®<Œæ<0~®¼btˆï<|Ю½ì {<˜8½œŠz¼£C8=‹ñì¼5Õ®=.ì<×®½ÆÂx<5Â8½4)x¼‰ë8=ì“q¼ã›4=L»pRÙ».³<@MY¼ 4=èSؼÏö³=ã£×½Zr<ÎEµ½žŽ<ðù¶½÷<ÕÃ;½¡I¼´ã;=p½‹¼Åò¶= Š¼äªµ=. ¼D >=×5<’>½™ó‡<ÿçµ½˜÷€»Òƒ­Û»ÿjB=éÐÙ;RŒB½9J<(ðµ½U~:»©<ÚJ»9†¸<ÑÞH;1Á¸¼ÒŸG»ü¸<Ü_F;Ï6¹¼îE»sq¹<ÝC;ù«¹¼$šB»]æ¹;»”º¼Æ„=»Îº<õ<<;=»¼&ô:»ÁA»À¼1º<ÌÓ´½Íû›;ЦG½Êwš»¦ÂG=zP ¼l¾´=«„ô:It¡¼¿¯ñº…J¡ o» ý6=ö£ô»;–½=‰ÀʺŸ<ój÷º3œÄ<Í~ô:pÉļìñºXöÄ<>gt;ØçI½;9×;k-´½·PÔ»Å&´=k»ˆ/J=Œîg; GJ½D™Ë;ý´½$²È»s ´=‹^»\ŒJ=Ù$E»^6=ü Ë»T¾=öÈ;»`¾½Õ<<;Úã5½zN·»Óå³=¢­K»œK=î…H;'K½¡®;êÒ³½B½«»«Ì³=+ ?»gfK=cß;;{K½¨£;!º³½1 »´³=“Z2»î·K=Ø,/;ÍËK½#‹—;Ø¡³½K¦:ºèȼ5£º‰ É<ÃÁvº¶›L½Ù»QL=vgƒ»“x³=ˆ€;Ïr³½d=;*‡L½7 »Ä˜L=êÖo»³a³=×ãy»’t¿=‡ÕåºL}4=_à:_p4½;¿g;g¿½Ê±a»m™¿=A£Îº?J4=Ù¸G;é:³½½Þ:â-M½cH½:%4½²eC;¬Ä¿½ÄT=»òÌ¿=fö«ºï4=7ýºƒyM=f²»¯³=nü;~³½äMª:l¤M½)¨ò9Z˜¼%Ôè¹5B˜<¬ß9—*˜¼°6Õ¹=˜<9ëºS—Ìæ‹»y1½¥.$».μðÅ%;þÎ<£\'»‹μ¼ò(;¨ðÍ<µ¨ª»N½Am¼ês±½Ù<[s±=­{¯;úØM=UN;,•<»û'•¼Ÿû3»Rͼ€Œ5;ž9Í<Èe<#q±=û¹;M=·°º»?oM½”­"¼Äp±½8U ;¿’•<™ »v£•¼~Ý ;‹´•<¬"»þÅ•¼WÙ6¼  ¿½¾£«»Ø1½•­;!Þ1=cU;<™ê¾=ˆ‘Ê»¡ÂL½¡%Ì;õ¯L=Rj2<Ís±=N3N;mtË<²¶O»+T˼09Q;r3Ë<ǺR»@˼ɗ9¼†w±½5%×»ù%L½|µØ;8L=Pè=_ɼŒ-»ÕÙ—¼æ.;Âô—<A0»˜¼ 1;À+˜<0Àk;ô•È<Ž/m»HlȼÎn;$BÈ<ï p»‡ȼê~ô;ðnJ=ïW<—±=ÐÛ»êì2½–i¼X0½½õ>»6™¼Lm?;U™<·Ô@»hu™¼:=B;£•™<צC»>¶™¼E;7×™¼Æ–H½<Åp¼™Ä±½b=r<ÁDZ=Q< <ß;H=¦ø ¼H½T§v¼ˆÑ±½q`Y;Ë›<¶ÜZ»bñ›¼4Z\;œ<íØ]»?œ¼í‹»'´Â¼7ª‹;y|Â<ÑMŒ»`D¼»ðŒ;Ü Â<2ee;JgV<Ÿ¶5=kýV¼Ò‹5½VsÕ¼Q—³½.eûÙÍ£¼ÏÆÃ;凣<>(Ä»0B£¼~‰Ä;½ü¢½½ˆ<#>= Âõ<16ª=çbö¼,ª½2мþ=½“oŠ<¿ü==ÙEø<­Ö©=8>Û»ð„•¼Ï¨Û;"X•<Ì<¡r¹<Ä@ ¼ý~¹¼¹´ <Àй<\( ¼ç•¹¼­› î6½Ð̱<Ï6=É=Û¢=G. ¼yÝ#½³Û'½µI«½½ð꡽}p³¼z06½Éó<@6=½ =5¼¡=¶n ½ª¬¡½q¼´¼›®5½ìµ<¿5=Ús!=~¡=€¯1<J±<õ1¼±¼_:2<Þó°Ž<¸{¼"B޼ôÞ<FŽ<:B¼J޼ˆ¥<ÑMŽ<äŒ=<‘¨<Ç=¼a¨¼Eà2½cVž½ý;ż /.½÷†Å< .=Öå3=ã#ž=ë><Õp§<%?¼å@§¼_?<þ§<ù˜?¼#ᦼµê#¼/q޼N$<³sŽ=ä›=U®.¼‡{޼</š½öE=*š=§µÕ<µ&=)ñ˼Íe¼å}Q½›½6IÓ¼9½T¡Ó<°z=^R=6›=ƾ?<ä+<¿=Q¢=Ñ:„=¦®=¨\„½è½÷g ½–3½ˆ =±=´ =Uû=Ì× ½ùÙ½”|…½3]½s…~¼Ò+v¼‚Ê~pr¼í‚< 3r<¤¼°õq¼.Å<(¸q<0æ¼tzq¼‚<–Œ<Ðö]<›¹‘½¶+f½R9½w^î¼ZX=Äî< ’=rKe=ü‘=ò´d=D=äÃí<”1½/uí¼ÚT’½%Øc½¶+¼ë[[¼™E<[<`_¼ÆZ¼ y<ïzZ<\Ž=ë<±,“=¨Zb=ÙH“½ìb½W뽂9꼎R½ \ê¼#z“½ö`½`—“=¬`=±§=ßké<¶ß<–W<úý¼êÐV¼MŽþÞ¼ÿz—½AðU½=Z‘<ÚL ”¼KŠJ¼€d’¼"ÜG¼Ót’<^…G<ù„’¼j.G¼ò”’¼2D˜¼KEC¼¥i˜<C<*˜¼ÝÊB¼”¼U¯<¼Ž$”ÆP<5¸²=—lÈ«¼K ¨»b:«<êO§;WV¯<û–ª;¾à´½F8¯¼JV:½¹3¼ Z:=dõ2<† µ=“­<÷µ½Íe¬¼»g:½(©0¼!l:=8å/<ÓEµ=àFª< ´=ô_¨<®== 0½K%¼„ˆ´½¡œ¼ª´=ºK›<"B>=…Ø"<0ë±¼‹—»[ÿ±<®ß–;Y²¼‚3–»)'²<‡•;?åª<`ºŽ;D䪼LŽ»`ãª<`N;“⪼œ˜Œ»ä¿¶½ù™•¼(ý:½aL¼!;={Š<8ã¶="r“<âߪ< ‰;œßª¼*Yˆ»yõ²¼¯Ž»-³<œ`;³³¼T±Œ» *³<׌;;;³¼%R‹»Æßª¼Ý„»àª<ôjƒ;„઼-·‚»áª<†‚;†Ž³<«à‡;ªž³¼Ê/‡»£®³<¸~†;o¾³¼uÍ…»´“·=àæ‡<ž^;=®ð <Üfµ½VÍ„¼5ó?½™¼ ¼å ´»p÷½_W°»ò#¬<œq¢:j"¬¼Ó±Ÿº² ¬<òœ:Ȭ¼"2šº¬¬<;r—:]¬¼M²”ºÙ¬lª<ô\ç8îJº<ÓÍ86\º¼ Fž¸Ãmºx¨<´¼Ç¹e7¼<‹빎O¼¼×2÷9h¼<_¦ºÃ€¼¼)µ:Й¼<ÏÅ º)³¼¼\Ø:Î̼<Öìºç'¼½a;Z;½ö§¤:¼J;=䎪ºÌ8¼=±c1»‚>¼½Ze7;œ;½=¼:w ;=ˆºÝO¼=RmI»z°¦<˜™7º¹¦¼ßÂ<:—p¦<ÈéAºP¦¼KG: ¦:=MU库s¼=J‹m»¨y¼½,’s;pp:½[ßö: áF½<Ö;>:¶½ñä|;å/¶=ŠQ»M G=ct»°¥<¼åtº{ö¤¼Šðy:k¿¼ ”:…‹¿<ê4—º¸‡¤<:€„ºb¤¼‡:<¤<ƒ~‰ºÍ¤¼ƒû‹:…Áµ=ñó»z£G=—¬0»&³G½é3;žµ½†ƒ¦;ˆ»À¼¶Æ³:‰ÞÀȺ'ÄŸ¼g’Ê:ö•Ÿ<âä̺ Ä<ÎáþºL;ļ ;¬bÄ<÷Ç»*ŠÄ¼¨t;›I=|{‰»t´=ç|ø»s´½¸Iû;ãÏI½¿wŽ;b/6½‚;ǽ½· <äͽ=³Œ ¼:¹³=e¡¼oÛ½=*¡ ¼"ª5=7ùˆ»/5½YYŠ;“ï½½A<=ö½=̼Î=5='wŽ»ƒ"5½Õ; ¾½æm<•¾=ù¼0Ð4=?î“»œ´4½öJ•;ù#¾½3<-Úš¼Žk;ãÿǼæ *;I(È<ÖÊ+»£Pȼx‰-;ïxÈ<ËH/»+¡È¼Ì1;VÉÈ@=ùÞz¼@½ p{<çø«½Ûíáœ<âg×»þ­´Š <í黫Ҡ¼%+ê;*¡Å¼ÇŸ’¼Ð<H’<Û¼ñ‘¼4æ²<T¡½›œ=Óꬽž6'=»L9=8¤³¼Aò =1m½ðÑ ½á²=ƒR9½Qµ<™S9=}µ¼ßq =p„½e±¸½šñ¨½&¼>=½Š?­<:s{<Ì™¼¶J{¼E×<}#{=õˆ/½Ëß<å_/=4à¼/Ú•=Lã?½©¯<{ma¼z¼­'<ðPz<Ô(¼¸cz¼Ô~(N=\Ê’=Œ”N½~m'=æì¼É?'½Î]ì<ó’’½p•O=[€’=üêO½·¶&= í¼‰&½¦Xí<,H’½VëP=‹™›½ž±^=ØY½²TÓ<>N=‚µÓ¼£¦|¼Îï5<ß´|<§[6¼±Â|¼bÇ6<Ð|<ü27¼)¢< ‚k¼wí¡¼a©k<²¡<ÄÐk¼ãv¡¼9øk< }¼¢J9<–}<5µ9¼‘ }¼’:<*}<µ‰:¼w‘½8V=ÑZ#½þºñ<<.#=vùñ¼$‚=ó³Ù¼šP}¼Ÿ˜<<„V}<,=¼Í[}¼ji=v’=º˜p½6U’½!ßp=]¦½ßHë<É™•¼¯?w<Îq•<Š}w¼0J•¼ô»w<ñ"•<ëúw¼ü”¼r:x<‹Õ”<†zx¼ÂÅy<.ëP¼úœy¼û4Q<{‘½E¤s=@ ½ùVîzi¼»Š[¼ÂºiÚ<…<Êó¼ãY<)l¼0¸Y¼-slR½Ö%Ÿ=®È¼`]=Bß¼à)=<²E½À–=üUE=3Í–½ÈœÞ<›|*½5dÞ¼û¯*=¸BD½’õ–=wçC=P—½…¶Ý<§G+½ÝZ¼íÕ¨<&o(¼E°‚¾<ó¥<Ì»¼RI¼Zº< î<è¹¼”¼zº<‹;<¼¼œ :½ƒß˜=YßÕ¼µ#0= Õ<‚F0½:©¹<Š—½ûÆS<7—¯¼|S¼¾¯<É/S<Ç㯼âR¼Q°<Ú¸¼Þñ=žøD½±)¥=…¦D=GD¥½¨ ·<_.½Î7¼•1‚<>òг=B¼ú¼X¨=6·½œÊ³=€z¼üë(=–©y<ß(½ÑÄ=¯(´½2ûöæc<4g(½–.c¼ql(=Ðö¼ ·=àbõ<—·½Ã a¼[B=|¶;ˆº¼(Xµ»Á*º<.4´;^̹¼³»õl¹<§›»Fº¡=he(<¢>½n%Ÿ<¥n´½°Ÿ<¯çµ½É #<óG;½þ#¼û;=jÛ—»¡z¯<¾–;¯¼:¡•»ì”®<…”;X!®¼t¶”;†5¯¼•n”»Â¼¯<ð%”;PD°¼€Ü“»,̰<\–¼‡ü´=„«¼…i>=]<(³>½ö&”<¹´½`’;)w³¼ó’»X´¿¼ï@Š»ÑÅ¿<7œc»?ÞÅi¼Ò5±=)6h<©±½ì<ý‚J½D¼ÉÅJ=ÁŒc¼ëݰ= »!éÉ<™‹€;õcʼ²€»øÝÊ<ØÛ:»à•<!9;Œ˜”¼þh7»/”<ų5;FÆ“¼\4»^^“<šù»éIM=-T¼j °=§R®½VP;-ÄV½ËÕ»¹­V=ÔIl»Ýi®=ƒÇ’º;æÝ<ÛÞ-º»ª†<†Ý):•ㆼF·:„FݼŸ'„ºSÝ<ú€:¬ÔܼԺyº”™Ü<[s@»¨ê®=­AäºÄ¢U=tVÝ:ôƒU½¸ø/;ﯽýx*»F2¯=%Ⱥ7#U=º·Á:ŽU½Ëô;ùj¯½Ãâé¹±@Šåºeª¼ùû:$Öª<”ºßF«¼À¡;#²·=ì4/; qC=2»,5C½5Ъ»Ëÿ·½Xþ¯»"aº½ìÐ6»d>½Mç³;/L¸=¥ƒ@;ÿ B=„”°:¡+¯<¶Î³º˜¯¼æ ·:ô°< LººLo°¼ËÝ¿º,³¼Õ>Â:á²<õœÄº!²¼4øÆ:ر±<ŸPɺ#C±¼B¦Ë:ÿÔ°<)ùͺpg°¼`IÐ:zú¯<ó–Òº!ޝ¼ðáÔ:i"¯» ©Â¼»ç?;¾ÝÂ<­A»6ürC;qCÃ<5<ƒx³=ö Ì;; H=ê¿Í»#´H½•39¼o?³½®$;Û<: %»hI¼9&;"<JI<÷è¼=¶`Â;Ó 5=˸ûrð4½LîM¼×ö¼½c+»}œ¼`s,;Pí›]¼2/7½J^í»Ì¬¼¬î;³¬<©ï»›Ç¬¼Å·ã»¤¼+õ¼$a°½3øz¼H²3½U—{<‰‘3=(Ê÷õ­<±¼˜ú­¼D¼Kÿ­¼H <–ú­<ú¼4õ­¼&¥‰¼º‰/½_ ½¨­®½Í¹ =®ž®=tè= ª=d=½±yª½¦½‘¼w.7½º’<«7=±<=T@ª=²ü»ßY¼”$ý;0D<[¼ý»/¼ Uþ;“<^Ë <ùq­<& ¼1c­¼8€ <¾S­<ÙÙ ¼¡C­¼¯¼¿¼œ¼3þ<¸«œ<ƒã¤=3“´<ó(=3.½û¢½ªÅ·¼O+½˜Kµ¼#j(½Ñþ0½¡¤½^1=‘ü£=ö<.à'=@ô¹<]+=Þˆ0=<¢=‹Î0½,í¡½(E»¼æ+½t0<| <ˆ”0¼y” ¼ê1<ÿ¬ <šŸ1¼“Å ¼)b'¼&—¼Ü«2¼Þö ¼k23<’¡=Ž^¢=ÃL?½½#Çš½`ÓF½#L¡½]O¼ÆH½€ƒÂ<Ÿ=ØòG=Ì!¡=‹RH½{¡½Åü§Œ½ÔSÃ<Õ]=:qI=ëç =\åO¼ç±¥¼þoP<ÁÂ¥]½¦øœ½2pϼ¾Ý½ž«Ï< ¸=wD^=:´œ=pm¼˦¼‹„m<ÒÀ¦<ïôm¼ÿµ¦¼˜dn<–ª¦<¢&ð¼*‹'½È¯P½”I‘½góP=¼*‘=Kñ¼2Bk¼y¼>w¼’x‚<¾´v<ƒr‚¼Õ+v¼©l‚<˜£u<.}<~ds<£À¼3gs¼Ì‚<is<§F‚¼js¼Ì±‡½â}½ãC ½s½Åv =]_=×÷‡=ÿ|=úÛ =N7=J½ë"½C>ˆ½d {½¶Q„¼0Ss¼‚‘„³=ªöè<&Ž©•è¼û3”½-k[½ìU”=Í([=%ù=‹pç<è ½&ç¼@¼”½0bZ½Šâ=yá<ç—–=R1\=lüŒ=sRÞ<{j½æÞ¼ŠÆ—½%W½˜ï’<…ÃO<²è’¼ÚIO¼iá’<ÕÏN<½Ù’¼yUN¼'8‘¼’œK¼t‘<ƒK¼=9‘<¿&>=Ä4œ½E6>½ ë ½ƒC½ ¼ƒh-¼cýŽ<ô,Ç»¼¥¡ =Uc»=3}£½BÚ=½» ½9º¼Áà =Ö¹<ÄÛ£=Žú<=׎<:i#<îû¼ #¼_ô<“—"<)í¼’/"¼¹ó=S4=<•¤=ç5;=¨³¤½Æé:½!½šf¶¼]#!=%¶< ¥=4:=ä+¥½H·9½6C!½Qæ´¼ð¼<¿ <…¹¼`>¼€¶<”Ü<ä³¼[{¼±±<´<鯼¡º¼‹®< [8<Ô<á°<Ö ½•Ÿ)½ S2½¼¼‰q2=º;¼<[? =ð¡(=™÷¼7 ¼Ž<¶< ޼’c¼~Ž<Ž<– ½@ý&½ž:3½·ã¹¼(V3=«Œ¹<&× = &=¬H޼h¼T(¬3¼ý ¯<7Y3<'¯¼¯3¼'õ3=œ{·<“L¡=8$=q`¡½>»#½¦@4½Ñn¶¼:Y4=š¶<œ¡=×Â"=Á°¡½6p"½0¡4½'µ¼:ú޼°í¼ <¥¤¼e'²<7Ò<‹••¼¸þ¼ed•<Å<"Š•¼…‹¼X²¼8²¼â²<þD<(²¼£×¼G§½¥8½¯s8½dœ¼4|8=¿ü›< ާ=¿G =»¥§½g÷ ½å”8½FÆš¼Úœ8=©^š<Ñì§=; =ƒ¨½Êµ ½î³8½~'™¼_»8=¬¿˜<•K¨=EÄ =bÜ®=8Æ=Æõ+=ýŒ<•’¨½qÒ ½ÚÞ8½þ·–¼Öȱ<¿‡<_±¼A¼Â»±<Áª<µ±¼C<¼!®±<ÇÍ< §±¼O_¼ ±<Üð <ر¼p‚ ¼·A-½&§‰¼ët¯½gÿ ½6€¯=0¡ =œ-=ͼˆ<'º-½ˆnˆ¼Ã59½u‘¼n;9=[ž´½ýeļT¨7½ôUG¼ø´7=;›F®<Ê$³=öòª<0M>=HÌ4½)4¼C>³½ìɨ¼x¨<Õ;±C³]O;¶¦¼™÷M»šnº¼C¨e»Ã…º<¢@d;Óœº¼¡Øb»È³º<=pa;£º½.9_¼Ûq9½€èÜ» q9=7fÛ;e?º=s×Z<1Jº½DaY¼Ÿ-D=ãSã;2ø´=¨n;—lµ=è[„;äU½=‡;‹«8=OÙ;ˆhµ½W_w»€ H½è˜»S!¢¼óÃRºí¢<“‹M:[¢¼àSHºœû¡<ÝC:‚{Â<—d:æ‹Â¼•õ]ºbœÂ<À×W:ø¬Â¼¹Qº¹¡¼)º6«¡<Øá#:#¡¼÷¯ºÛŽ¡<Þ~:~Ã<ñ3:½üï,º$Ã4;Ç ¿½ `Ã;b³²½” ¹;BdM½ÈõW;>qM={J[»µ‘²=™tÁ»š—¼Þ¦:ç]—<Ѩº :—¼"«:G—< T­ºÂÄÌ<ˆ.îºâ̼C–ñ:tÿÌ<ÿôº¾ͼÈhø:ý9Í<Óûº/WͼS?ÿ:StÍ< V»'í¿½0µô;¬42½ f;h 2=öÎh»(ú¿=ûý»>Ö±=/î»0TN=¾È‹»>`N½‹w;¬º1½v;xN½ÇÕ;‹™±½—ü;Q±=öÈþ»H›N=¦ä•»MçμöÃ;Ï<Á€»–ϼõ=;:Ï<‘û»ú²“<È$âº6“¼–Kä:ˆk“<qæºñG“¼†–è:r$“<¯ºêº“¼ýÝì: õϼr5);üÐ<ýõ*»0à°=ÿÁ¼Ò2O=¬”­»¶;!ÿ<ÏJ»KÞ¼êV;«½<Ãb»0&°½Kf'<µ¶O½ÃÇ;¾O=YÅÈ»f°=e„+¼¼’š ;Îþ#Œ¼Wj9;E®=Ág¼HP=BZ ¼šP½™0 <¯ù­½Þk<Ô翽Rß‚›¾½Ø¡œ/+½¯<ÔI½½.ݬ<08½=—­¼19+=@̼…ŒŒ¼Í‚;› Œ< Ç‚»@µŒ¼ qƒ;ñoμ÷´Á;,ʼ=Rð±¼T+=ý2"¼fY+½ð"<‚¼½e´<åf¬½Ób¥<àsK½D<‚VK=ŽÅD¼~`¬=‰§¼„,¼=®·¼ö…+= &(¼Q+½?æ(<5úй<Ù»=¾†º¼Õ¤+=ý(+¼U¬½Þ’¬<>{˼ Ì;¤FË<ìFÍ»o˼ÖìÍ;ŸÛÊ<ˑλ¯åŽ<¹’»5¼éÙ’;<'<ú–“»ÅH¼íT”;aM¬=)³¼¡ I=ÖQ¼ýèH½‹R[¼ži˜¼ÇØ¿;ªŸ˜<`ÇÀ»õÕ˜¼Ý¶Á;} ™<>§Â»Ùü?=[u¼å¢¬={ݼ¥¬½´ØÝ<`h?½¤Êv<ˆ6?=aw¼w®¬=m)à¼g±¬½Xïà<ÿŸ>½!y<&›¼BË;Ã9›<;Ì»Žr›¼ù4Í;…«›<¶/λ’¶<Ÿò»(<¶¼ úò;浚o<6‡²½²Åò<β¼O%×;!í<((Ø»'ž¼Ê+Ù;bž<10Ú»²œž¼^5Û;eמȼ³7½o§È<É¡›½ò+=军=_P+½º½ZÕª<h©½Öz;='m¼†« <&%”=lÿE½rL,=LŸæ¼† ½.ÅV=ƒGx¼Dà&<_x<ÄK'¼Ewx¼õ·'±G¼¼/¼9:Hëê<ѽï—ê¼á.=>úf½#/“=iOT¼Ø‡µ•=‹@_<-‰”¼§_¼ž¶”<#Ý^ד½j é<Ýô½"Éè¼=/9X½ì”=K#]½›È—=’nݼ‹M=·ÝP¼Ž†ª„¼HÚ¼`0„½ ¹;=s¨½›¥ƒ<µÝ<ã6ƒ¼Ü 8=•q©½´Î©<Ù²½r©¼_¼=À7½É©=§Î6=¦æ©½‹]¨< Ú½›-(½ =ù°Ã¼P.7=)_Ã<ÆQ7½ý,'==½­×&½HM=Žg¼nº7=~F ¼üþ‚<.ð <Òý‚¼xš ¼"ý‚Ê—<.ý½ r%=Ô®½M%½‡ç®=Há–¼»B =].2¼m¿½<ªÄ1<0̽¼[Z1¼@ؽ=Ê%컊<¨Îë;*0мxë»Õ^Š<"ë;ŽŠ¼¡<×M>½ê =ÀŸ¤½ø ½Ó¹¤=!»Ÿ¼TX>=˜_мŸZ%=q½x±=È·=m‚±½Í‰<ÑÄ%½„2è»MLŒ<)áç;-€Œ¼©Ÿ<¥½¼N ¼] ½<—¡½Ã¥=êZ›¼+h>=êš<:h>½š¼=¦½? <¥ª¼¼¦¼€•¼<ßž<ç¼¼ï¼Þi¼<vä»oÕŽ<Õ'ä;ï ¼ºÙã»ÃF<¾‹ã;é¼Ú=ã»_¹< ðâ;!ó¼K¢â».-½rB”¼BL>=C½b°§=€ö=.̧½æë’<÷@>½¥y’¼Ö<>=·½³¨=æß;C’¼Ü—ß»y’í“<…ï ¼ î¹<£m <8й¼×ë ¼6²¹<#j < ”¹¼Šè¼ºu¹<g˜Ú»1³<)Ż͢–²<’MÑ;в¼ü.Ò¼Âó³={8S¼v‚5=R<›5½«õÏ< ´½L8ϼ´=4‰P¼rä5=ûÛO<íû5½gÍ<«)´½Ñ Ê»1:²<÷^º»ß¥<Ýʹ;0%¥¼µ5¹»³A¥6¨„¼ñä\7> „<¾ô·q„¼Ž=8?„<<Ú8 €à<îŽ ¹»u༫ &9¨jà<‡B¹è^à¼V‰¹4R„¼æg9‹^„®½qGÁ9ˆD…<çÞɹÍX…¼ËyÒ9m…<4۹Ă…¼>L·ºäW½~#»¼X®½¿²;_]®=“©Ë:øçV=JqÒºÚV½9c0»½k®½Pô5;«p®=õÁæ:µ®V=ÍuºÞ¼à¼|:gþÝ<6Õº3áݼ×J…:†ÃÝ<€C»ú`V½¿ù\»û”®½ÜŽb;hš®=öe‚;Î-Ä=¡~…»Q$Ľ¬tîºt-+½Zúó:²:+=žÆŽ;ÿÄ=m ‚;ÿ»®=5";=ÅU="Ú%»Ç²U½ªrŠ»bÍ®½¤7ž»iÓý¡a »ÿš+½B);9©+=#w§;ê²Ã=x˜;ë®=Ùƒ»ƒÔ+½M³°»S‘ýVÞ{º÷ˆ¼ƒ<€:‰<+‹‚ºž8‰¼#Û„:¯Y‰; Ÿ•<ƒIÔª» gš¼ÁÁ<èr®=9·X<¾_B=rY¼gHB½æäü\®½P®;¸š<Н»W˜š¼T·¯;#¡š<k°»ªš¼› Ѽ&•¶½«bK¼»ø0½•"L<8ö0='Ó=àðr¼÷Š>½ÜÅݼoX­½½±È;ªUœ<íwÉ»dgœ¼Ë>Ê;qyœm¼ í0½œ…ð¼×Dz½8/ñ<‘¯²=ߢoð*=9§›=qÉ<ˆÿ6=T›ª<œ²q<;Ök<ªS¼,rk¼Ai<k¼t½g¼X<¼cg½v\’½×¸<;a<þÛ¼*Ø`¼—ÿ<î‘`<¤#¼†L`¼$H<ñ`<m¼,Ä_¼|’<7_^¼(y½< ¤ =P[=^s£=7u[½^Z£½Ê9¾¼xJ ½Êy¼ô"¹¼š6z<{ ¹<¢z¼“÷¸¼û {<;á¸<—~¿Æ‰=‹ =Ð$*=Q5½*½µCV½sy‰½ŒV=Õ_‰=%¯=V‘)=—×½=l)½:eW½ê‰½м£i¯¼*AŠ<Š?¯<hмR¯¼îŽŠ<üê®<˜¦t½Tš½†+Ô¼Ó`½(uÔ<‡I=6@=°(=ìg½Îô'½%8Z½„ˆ½U€Z=¬÷‡=¦Þ=¿‚'=½™\'½ÀX[½ÿ©‡½Ö [=‡=|=Æé&=U)<ŸéO< ])¼rÎO¼Óž)LJ<Nj½‚½VZ½ÄÁ½]=«™=õk=¬=ck½½Cî½?!½*=ù=:2l=€;=Á”}½]‰s½Z½.½5ŽH¼@¼eÏH<»ö?<¼I¼}Ó?¼;RI<‚§K¼bx>¼ÖêK<_.L¼P4>¼ rL<¶L¼Ãð=¼LúL<0Ï=<º>M¼Á­=¼dƒMX¼ƒ89¼X<]9<)àX¼m9¼$÷¢¼<¿Š¼ç£<ò†Š€¼Øéi¼Z5¼Nj<¾ö4<‰²j¼8å4¼`k<ÆÓ4<‰|k¼gÂ4¼âk<±4<ÏGl¼ÞŸ4¼d™½! j½ð¹ ½|Ë×¼Žã =™×<7¨™=œÿh=JF¥¼*z¼+I¥<ƒ™y<×K¥¼ºy¼NN¥<Ñ™x<’P¥¼Èx¼£R¥<£™w<ƒT¥¼aw¼1V¥<™v<oš½ïÛe½k°½lÕ¼Õ=ËT=µÿ%=5Šõ2<0{¼b+2¼»…’=lO=–K'=ªTì<ÒY'½]éë¼Pì’½·­N½ƒM}+<ìÖ‰¼ä+¼w+¡½–G½ø?½ßL¼½b=_  ½S™»¼£Z =[M»<âb£=¾h>=_¦¼)rA¼Ðo¦Š==÷¤b<·9Æ;¿ÿ˸=²µ=^¸½ñb½Æ’ ½œk¼ö¤=Ciï<Ñ<ë<1RѼ£Ó¼ëžÑ<Æ’<-ëѼPQ¼¤¤½¿ë¼RÑJ½#J‘¼”ÿJ=åö<¦ ¤=˜é<¾|y¼õ ±»í&y<†@°;Òx¼?v¯».~x<#­®;o-º=üt=á¤=6å<”¤½h}ä¼C’L½¨ú¼fêv¼}Ѫ»õœv<ª;­Pv¼ûN©»—v<™¨;¹»u¼yѧ»su<ž§;¾+u¼ Y¦»¯åt<¿ž¥;úN=ðáŠ<º/¤=ŸÜ<Þ2¤½”éÛ¼Ø~N½Ó‰¼±›s¼Ô¢»í]s˼À¶¤=CÊ<²Q=<|€<ÌQ½‘€¼—Τ½ö‡È¼J¢Ý¼[¼©ÃÝ<°ô<‚Do<§;[:o¼ùw»<=x"><#®¾=áãq<˜ƒ;U3q¼’.ƒ»Ëeqƒ¼°?f»P’ƒ<“ºe;F烼6e»TÛª=|½“<ò\Q=¨*4<ï?Q½,33¼õ3«½ô瑼4F×¼i’¶»ÍýÖ<­pµ;O´Ö¼ºN´»2´†¼d!a»T‡<, `;oq‡¼`»Ñ‡<2ž_;‡2ˆ¼]_»åÔ¼­»+”Ô<§\¬;PBÔ¼¯9«»uïÓ<®ª;³*=‘J<`¿=ÎÉ—<ä ¿½yô–¼ý]+½‡³¼—+=¯+<6¯N= »åe¢< <>;S袼‚=»çj£<<Ç<;{½»q¶<ãÊ<;R_¹½„%>¼@Ý<½84À»å!==^ó¾;b¹=¥\9€±¼éÂ'»å ±<"æ%;À:?½Q¨±»³š¸½K*¼Î¾¸=©(<“>=àr¬;×Õ@=ñ¬;"°·=LC#<Ü–·½³!¼¿œA½•ø¨»r}=½ÊÙ£»C¸¹½=¼ÅaB=0õ¤;·=Mé<øÿ¶½\¼»$C½\ç »;eC=‹Ÿ;(µ¶=²·Ü;ÒÝÛ<;Ñ*½Ér¨;œÚ*=¹Ü©»eÃÙ¥À<{@¿»–þ¿¼èÏ¿;æ1š¼û²š;ý[š< „›»ù…š¼nUœ;Ù¯š<%'»Æ½¾<­–»°}¾¼˜#Ã;¥=¾<°Ã»¥ý½¼?<Ä;±½½<þÇÄ»~¨›<ø¢»sÑ›¼Ìë¢;1þ¼¼ühÆ;~¾¼ ¼Ž¼;Ó_ <+ô¼»# ¼Ê̽;’Iµ¼Æ(×;µ<³«×»âÔ´¼Š.Ø;íš´Þ<6;½°wn<`;=­o¼Í¯=¸xà¼.1£¼oÒ;w°¼mã;‘ì¯<ìðã» º¯¼étä;HŒ£¼|WÕ;ã¡£<Ã+Ö»·£¼ºÿÖ;«Ë£<\Ó×»²U4½Ÿin<-u±½dë<ò]±=t ì¼Y4=nÑp¼G9=K7x¼U²®=ÿÏê¼1«®½Œë<×ê°½·\ï<1o¤¼z3ß;Ï~¤<7à»æ¤¼€Òà;vœ¤;ª=>½#/=Ê^›¼b/½ç¯›<íª½¬=Hª=½ð®.=™¡œ¼G‘.½ñœ<ºÔ©½K=TÆ©=/r½Î6.= à¼).½ø.ž< !¨=*½›ä0=“¡¼6Û0½/÷¡<»Õ§½f=c©½ð=S[-½ð <;-=P ¼R9©==½Lž<Óÿ¼¯Ù¼ä8<²­<{q¼V¼›©<@t¥¼ûƒ<¾z¥<Ñð¼úœ•¼Éh<•<¼²Ñ”¼¸<5›” <5Ã=¦_½oì¸<8=Í*¹¼±.=µèʼڊ<°8"¼m¦Š¼[Z"мÁ"< Š<€¿"¼‡×‰¼Há"<;¤‰<#¼q‰¼ù$#<,>‰<æF#¼k ‰¼àh#<ÚØˆ<ëŠ#¼z¦ˆ¼­#<=’¼¼¶$£=2JD½¼n-½ƒ#Ñ<¶ š½á:=:Ò\E= U½,ʽ<à.=‹¾¼Ô¸¢=°nF½xš=2?<½Ÿ-=PÔ¼9-½ékÔ<3ª™½Õ==‡l©¼[ëP<]l©<bQ¼çk©¼”ØQ<#k©<ØNR¼¥m…<©ÿ%¼?…¼Â#&<Î…<H&¼½â„¼hl&<ç´„<÷&¼O‡„¼°µ&<óY„<“Ú&¼ßY©<øU¼NV©¼lVX=È@$½ ù<›!$=bôù¼´'Ž=öîX½4jp¼‰Ñ7<Œ:p<é 8¼F p¼•J8—½«†m=ˆ—=’Òm½Ó =xÞ¼uÖ!=é¹ÿ¼7Œ=^½«Œ½¡K^=+„–½ßKo=Ód–=ã–o½3 =ðÍß¼­ ½pà„<)!›dc¼2^<õ3c<y^¼Ú)c¼hà^<çì€=×|}½û=Ùñ ½ ê½Á =‽Fd~=‹ƒ€=ƒ±~½™Y=˜T½@)½él=†4€½™=.€=îæ½ž—=ý´½;)†½.‰†=ÏʽÛi=î¸b<©Bd¼±b¼]¯d<\ªb¼Î'‰<@6><4'‰¼Î=¼È&‰<&g=<Š&‰¼7uá<›#½ æN=!u–½n‘N½~‰–=¬à¼R$=¼ŸÒ¼ã%=^…T½KÞ›=gàß<-Œ$½DëL=•ï–½ÇÖ9¼Ò,‰YT¼£ÌŸ<"T=øŠš½\{Ò<®ÿ*½®*Ò¼+=±=½ÑËš=.ÙJ¼í楪“8½O>佩;=¼ >=—±¼ ²=b ¥;1§¼Æe¤»÷=§<š¾£;QK§¼ß£»$Y§<ã­»g2³<²Ë¡»7v§<=&¡;w…§¼ ²«;]D³¼öª»9I³<‰9ª;„M³¼|©»>Q³<ñ»âا<N;ë§¼V«œ»™ý§< œ;­¨¼·Ä¥;`[³¼ÿ¥»´[³<ØD¤;w[³¼D„£»¨Z³<;)(¼L9=º¤¼Z¶=Úý£<\a¶½&<9½øc–»àѨ<Å•;¹é¨¼_&•» ©<ˆ”;Ó©¼ïé“»4©<"L“;ÏM©¼™®’»h©½Æß™<ÒN´½w,™¼J]´=Ecš¼Â¯¶=ìÅ—¼wz´=ª¾¼æ>=éó<Íå>½J¬•<Ϧ´½ù”¼¿µ´=»’¼/ã>=`Ç<»á>½²ß’<ã´½=A;’²¼Ex»þ‚²<¯Ž;ts²¼³å»fc²<鿇»ÂŒ«T<ܪ¸½ŽÓR¼8¼¸=AÞÕ»–½<=jFÔ;ô®<½gN<4ð¸½?zJC½i8¼»¬ZC=­.¼-=¶=!†0¼‚Tº=E믻H;=GZ®;p8;½v3,<§…º½/þ;-D¨¼ò€»î¨Æ »ù£¦¥<ªŽù:}[¥¼}Å ;zä½¼]` »-¾<Ùâ;ÔQF½w9<4œµ½[Á¼Â–µ=¹QŒ»ú˜F=KŠ»8q9=ñù¼9¼=”( ¼WÀhº1 J= É»–¼´=ˆ ;.¼´½"Ž˜:’KJ½»"’º|ż8ÿѹ6~Ň9J=’9ß~7=|º9^J=Ÿ4Ô¹tJ½-Uºó´½w xºñ#¾½«sºþ£7½l%:8¬7=s8 :¾=âG¬º¼¾½òB2º{Æ7½dú=:ÂÏ7=PqÐ:tþ½=ÈŒã¹ Ä¼Öæï9¼öÃaµ=ôÅ?»7gµ½h™ÚºU½H½Œèà:¬H=XíÔ:6½8=À‚í:¢ˆH=‘Å\;h†µ=”b»æŒµ½Å/»#QH½Wª}:›dÁ^¥<¸ÿ›ºí…¥¼„Éž:ó­¥<ý”¡ºNÖ¥¼(b¤:üþ¥<1§ºû'¦¼™ª:JQ¦<´®M;Ì F=ǼP»,F½É#û*^¶½(Uµ:xù¦=²¥»1>½dÇ"¼É"¹½È»%´®¼h”;ã®<Í&»ï¯¼ô¹;¶@¯<=)¼¬ê·½ÆU²»nF@½~ij;å&@=g -<¸=d);ÿ±<‹œ*»/Ʊ¼5Ô+;U±< -»‡T±¼2A.;Ʊ<Šv/»ã°¼«0;uª°<õÞ1»èq°¼Ú±Â»©™?½ßJ<¼ëÖ·½’³=ù¢¼ú’»›+»¼ Ô“;mE»<÷ê€;Bw¢R‡;€~ À¼<£o‰;¿ÚŸ<ö‰»²Ÿ¼N}Š;ˆ‰Ÿ<ß‹»aŸ¼þ|<×4=ûå¢<éþ¸=ñ¨£¼\ü¸½z ¼FŠ4½ð.¼JãC½)öž¼Ò+±½I£Ÿ<ù±=Àw§<ƒî¸=𫬻–ͽ¼çˆ­;Fá½<f®»×ô½¼JC¯;M¾<âÆ‘;Y½ú ’½z V½¡g¤½¨¼»¼Yã½;C¼><“/‚¼°w‚¼<¸?…¼•j¼†V޼K=k<ƒrŽ<ôãk¼”޼v‰l<¹§ŽÈl¼x§\<¤|l<Þ‘=?—Š='2ü<ï›='oü¼ïw½ð‚½3:нúý =øm=& ½çM½.Cy½ ºƒ½¡’‚½»‰½cçý¼¦¥½Ã'þ<„ƒ=$þ‚=’Z‰=¦!ƒ½é9‰½¥ëþ¼š½Ù-ÿ‹¼?îˆ<‹<] ‰¼v*‰<èÅŠ<2G‰¼çœŠ¼ìc‰c¼Á-h<øc<#€h¼ øb¼*À½W ½AÝ={â =Ç[‚=ƒ}=ˆ=΃=ò =ù™=¯4½÷~½Êqˆ½ß[ƒ½wš‹<"†<“­‹¼Eð…¼`À‹<0¾…<ÞÒ‹¼Þ‹…¼å‹½½Gý¼SyнýŸ€½U•Š=ux€=çŒ=«ü<õJr¼¸_¼ªr<Í_M›<ÆeK<2E=6Öν„þ‹¼kÞ!¼lí‹<Ðk!?¼o¯<¬w><ƒ±2½œ¼A€ž½±+½Mž=…W+=Ï/3=Œ.Á<ªY3½æÀ¼n´ž½§I*½zÁž=Êï)=sÖ3=T À7=ƒ¹<ÿŸ= ”!=Rˆ¼è‘ ¼]…ˆ<ì0 <³{ˆ¼]мTrˆ<=p<~À¶<¤I6<«ñ¶¼¢6¼s"·<Ã5<ÖR·¼5¼rI¬=Ú$*=ú!=;±ž< !½rSž¼ 9½'kµ¼É99=µ<,Á =bÆ=kÏ ½'o½Ž 9½É´¼ˆó¸<Ñ3<¦¹¼q¹2¼PK¹<…o2<„v¹¼%2¼A¡¹< Ú1<…˹¼~Ž1¼Qõ¹&=Ù\ƒ<§X&½kƒ¼t7³½Ê ½LL¦½ŒB½ƒ†@½ê\–¼@=.ó•<茦=“P=䌼çÁÙ»dÈŒ<’TÙ;ˆìŒ¼ÓçØ»-<¨{Ø;ª¾@=‰t“<²§=êÛþ<ü&§½[;þ¼ïÑ@½ž2’¼óϼgÖ»—÷<"þÕ;¹޼±•Õ»WHŽ<½-Õ;DN(½h{¼j´½Q ½ùó@=I=<œó§=·™ø<}¿<êL <[u¿¼rÕ ¼­h¿<µ] #Á»0™Ñ;‡*·¼*Kл²8?=/¢X<ÇÆ¯=ÙaÆ<è߯½>½Å¼{?½qV¼ ?=7(U<ú*°=lÎÃ<äC°½%)üêhµ½Üȼ5¢¼ø ²»=K¢<¥œ±;'ˆ¢¼Ã-±»ïÄ¢½eñI¼Ji>=I<®±=L´º<á#´<²µ¼;Âÿ³¼`Ì»»¦V¥¼.Í«»?‘¥¯9<Îjµ=^¶<çjµ½“šµ¼OY8½¨Â7¼¡{8=»7½)ø¼&ȵ½c‘ˆ¼ó˵=óÔ‡<ˆÏ>=dÈ <þŬð»L¸=^²d< °<=Uœè;¬¼«PS»–“¬<–ñQ;™š¬¼!“P»¢¬;O1­¼D¡=»»?­<><ºÕ¸=#m><ð­==àâÁ;‰º=½ÂgÀ»Ÿô³¼× 5»xì³<3;Ëã³¼ 2»›Ú³<»–0;çг¼'/»²Æ³½C²«»‡>=»7ª;â£@=ˆª;Ÿ@½â÷¨»x¸½uï¼Ú ¸=è}<ôŽ@=ŽE¤;Òó²¼(:»$â²<€»; в¼Û<»„½²<<¾;”.?=_l›;Zë¸=3Ù<ü鸽`\¼™a?½Õú–»ÚZ²¼ôE »bº°¼ –»Vذ=ˆ&;cº=Ž ;ŽÇB½H*$»(¸½PG˜»—U­<È‘Œ:6­¼¶‰º}­<}Û†:Ûö¬¼ã„º×l·¼9‰º¾·<A†:–´·¼¸nƒº]Ø·== ”Ò:0=½̺_>»½§pD»$H»=<†>;T==nFº:oô<½¨5´ºþd»½eÃ,»í}ª¼‡ÂºÍ^ª<><:Ç?ª¼¸ ºÜ ª<6:,àD=þ5–:Gj·=l;pc·½BC»ÏE½’ƒºS »<óÞí98-»¼ì!â¹ßL»<¬`Ö9Gl»¼>›Ê¹YdE=™ÖH:—3·=êÁ®:Ç,·½p£ºj“E½³[#ºY¼<œ‚9!#¼¼Þ¤ƒ¹Pb¨¼Ó>V¹ûE¨»Yݼ=»þK»p¶=»fJ»°‰G=d7亠G½ç”ê:¿ùµ½µ[;Tõµ=¼ya»¶—G=y­ýº~šG½u;…èµ½-Çr;¯*À¼ÙJƒ:À0À<ó]†ºG6À¼îp‰:C;À<ÁƒŒº²?À¼f–:Eü£¼X-z:“ô£<ZºÙà¼=e–»Ls9= R»În9½eB;šÜ¼½òŸ;N¼µ½1þ›;¢G½‰.;S G=Ƶ1»³µ=‹¥¤»xÄ£¼Ü—:‚Á£U» [©¼ @@;Æ~©<ÈA»Å¢©¼AQC;Ç©<|ÛD»Ï멼ÏfF;Öª<;óG»}¹=>$[¼F®;=ó´ß»ý ¶½5xZ<9xA½Ä¿é;.˵<„]»Š–µ¼GX^;aµ<Ï_»,µ¼È`;Ö<½Âéê;uu¸½YÜg<=b¸=aDi¼7K<=2¿ï»’[<½¾\ñ;Ï'¸½Wzm<¸=òàn¼J<=•8ö»u:³<åk»d³¼¼¬l;þDz½ÌÁ<º™;½V<¨é¶½{-<’î¶=“ò¼ê(;=ò¼.ʪ¼ ¼ˆ;Àˆª<•<‰»0Gª¼ö»‰;€ª<Å:Š»ýj:½ÂTÿ¢¼Ò–;f©¸¼º£«;v׸<£”¬»`¹¼â…­;"3¹w¼Ì ª=po×¼é+½ÀX<Óô*=úWY¼6·=…¹é¼Ž/·½‡~ê<¤˜*½' [Eü‰n!<\QÂ<Žž!¼¬ô†<á»ìꆼé¯á;á†6ž=F"(½„l5=…CÁ¼ŠI5½œ”Á<Žž½$)=ææ†<(½¼)5³<Ú»@¼³¼ºA<Û²<ˆEA¼-ï†<(¼öð†¼Æ‚<¡ò†y9½å†§½É9=Ù½P¶¯<Ÿ•°¼f¿D<^i°<§E¼3=°¼çGE<°<&ŒE¼Fû†<\ͼµú†¼'<øù†<°€¼ ù†¼3Ú<þYœ=$y1½F™1=¢ʼ‹v1½”^Ê<³#œ½Óv2=Lj®¼öòG<¹]®Ì¢›=eÄ4½/¥=gL@½Bñ=·¼&â½mx·†¼´%<´5†<&¼Úõ¨<{Q¼¯Ï¨¼‹ÂQ<¨©¨j&½×så<Ö”½¾¦M=P졼~5`<­Ê¡<¨€`¼ ©¡¼ÊË`<Ò œ=ËuY½|=º$Ò¼Ûc½±tÒ<ý¶›½=^Z=|Ђ¼%Ö7<¾‚<œ8¼¢«‚¼ i8<&™‚¹ƒ¼o›{<äsƒ<Ù–{¼fí =Î@½±c†=ú½m9†½7= …½ W€=Í·|ep½CW“=‹Ïç¼^=€Ðþ¼"Ð=¨ãc½0‡Œ=¨–c=´ Œ½Nþ<¨E½ž=HÛs¼2¬›<Á”s<´Ð›¼ÛjC<†z¼$C¼}®z<îÝB<Ú×z¼Âg]½xËŽ=è÷¼ù6 =—˜÷<ÈW ½±Š\=¶½íBq<1✼ õp¼<[¦p¼c~<ŽW~¼ÿ+>¼•‘~<)ó=½lBX=Öœ½>ìW½]+œ=Ÿ½ÆäÇ<Óš½.¨Ç¼¦Ã=ñYI½tŸ=ÿH=Ä…Ÿ½qòÆ<>½ÝµÆ¼©g=¦Ò¼âJ(=k<Ò<•U(½íMA=®›½& A½X?›=ÿмËt(=vÿF<ÞÀ ¼ì„F¼¹ =c§œ½!ë¼!=ë1B½>Å =îB=½Å =Ñ+˼võ(=ÀÀÊ<Ÿý(½òr<=6l½~J?¼Ò <# ¼.Ö=¼; <äñ-¼ýô’<"Ò-F¹¼R»'=û9.¼¾ž<­¼-<ž¼=¿)< Ú¼”)¼½›<°D,¼ŒÍŸ¼2'¼ÕŸ<é'<ïÀŸ¼¢ ,½ýÿ¤=?è°¼=þ)=Ðz°<Šþ)½GG+=­b¥½Œ]&¼d¡<Í9&<'™¼¡Á¼=s™<> $½@™¨= ꤼEÖ)=U|¤<ÿÒ)½B#=ôû¨½â÷"½Ú©=ò2£¼nÈ)='Å¢<©Ä)½ø"=ˆ©½~¹=ÞX¥½Æ{¡¼¸)=~9!½0â©=š½¦o¥=„©¼03=è<š33½cz=µ…¥½{½æŒ¥=ì÷§¼¿3= ´§<í3½±ú=¢¥½} ¼ —<» <æ–¼  ¼ÓÄ–›±½˜½¡º±=µN†¼øá'=4lä;Á,¼®†ã»z<¯¡â;;àŽ¼;½á»ºŽ<[Ÿ–¼B?=é&½%Ц=ÜÇ=¸Ó¦½<¹•<ìŒ?½KOÝ;¬û¼:nÜ»ÉÕ<ÀÛ;ú¯¼à­Ú»@Š<r¼òn¿<08<µ¿¼ðý¼ëú¿´½&ëÒ;e;Œ¼©Ò»ÓŒ<¼°"Â<¨«=ó´´½­xÍ<-¨½|w<À K½ÆåH<ÞË%½Ñá<Ù»½Àá¼Ó»=?ÃF¼ Ð%=Ë=s¼#§K=ß`ȼ%`¨=¯¯Ç<Ëg¨½Môp< óK½BSö»&CÑ<ÌΛ»íÙ„<í2›;Ò„¼â—š»¬Ê„<ŒÃ<û—¨½äSl< ƒL½ÇŒk¼³™L=‰|Á¼“±¨=ꜗ;Ä®„¼¼—»öª„±¼{n¾=À¼u(=ˆtíã:墼—áº]K¢<ç>ß:}z¢¼,­z»“—8=š#ý»£ ¼=oú;û™¼½Ò4r;;ã8½Xšø:€À¼ìWõºÍ÷¿<0ò:bÒ¿¼!ØîºB­¿<Óɺ_¤<ÆhÇ:Ð=¤¼¶üĺÞh¤<éŽÂ:‡“¤¼jäg;Õ×F½Ó)Ñ;Þ×µ½HQλÉäµ=NÒ»ÇF¼=RP¶ºØb¥3;€Ñ:½’70»Lå:=yC®»u¼=rK¦»‹¶=ÿ{';<;½C8¥;ö﻽k­; «¶½Çƒ';•¶E½ÔR$»©E=þ •»Âɶ=Ðe–º\¼º_ç»<ù+:dÌ»¼ŠºÂ±»<\ ‡:w—»¼Éüƒº„}»<=JDN:‚|©¼öÿHº|—©<ˆ¹C: ²©¼ q>º*Ì©<þKKº©Œº<ŸEE:ivº¼A?º|`º9:âJº¼þ©µ:Eº<½æy.;Ás»½w€(»žo»=0»-‘·= _;¼—·½1ê:—D½#¤—º‰xD=¤ë»œª·=©qºœ–¹<@þú9„¹¼ï¹àq¹<›<ã9ñ_¹¼ç_×¹KN¹<Ü…Ë9í<¹¼i®¿¹Õ+¹<€Ù³9¹¼JÍ›9Ê“«¼Ùô¹R¥«½rG?9v׬<ÑKU¹C⬼¾Rk9Øì¬<®€¹4÷¬¼t‡:Ž >=Ä¢:nܺ=ý ®º+Ùº½Ô=º.>½¸YƺœÒº½à Vº{6>½…%b:„:>=Tìé:«Èº=Ö ä9ÇK­<ï¹UT­¼J,ú9¾\­<Ÿºe­¼¶ÄºÐ·¼zŽ:‡·<¯WºD ·¼W !:·<¨#(;VO¸=ó"¸:= C=Í 6»l¢º½X=8:×¶<,>ºà̶¼lÈC:›Â¶<IºO¸¶¼S0Q»4T¸½¦]ãº,âB½M‰é:üÛB=QÉb;‹U¸=Kbk;Ùº= |ö:~>=üºm€>½6}»nsº½·qºRø­¼‚Jw:Pÿ­;e/B=aÙ·;tV¸=™à°ºqŽ®¼ ²³:ô–®<„¶ºœŸ®¼|V¹:h¨®<®IÈ;Só¹=÷P;†Á>=pS»YÄ>½oÑ»T๽&PÒ»!U¸½°1`»{ÉA½ê=c;L¿A=äþÏ:£ô®<½ÖÒºùþ®¼D¯Õ: ¯<|ˆØº<¯¼™ëæ;†T¸=r~u;¯~A=¥‡x»NsA½|Âï»}T¸½…Ñæ:M¯<=¯éºY¯¼Ãì:De¯<mﺼq¯¼SMøºñÖ³¼û:*³<ü–·=SŒÈ;ú@=ä"Ê»Î#@½S€É»‰>½QÍ»½5@½TME¼ÌQ·½v¹F<œC·=ìÒ;NQ@=Yp?;#ó­<®@»¦Ì­¼÷êA;Ý¥­<û&C»Ç~­¼¸Ú»è€@½G§P¼2ݶ½_R<"ζ=èÞ;^ž@=€ƒà»S¨@½ÌÝ»@Ð<½:üÞ;æ·<=g˜[<Ú”¸=‡ˆZ<˜q¶=#’è;Û@=¶/ê»Må@½žÀ^¼B¶½]äR;Þi«¶¼àÄ_»%‰©¼—ë`;h\©<b»‡/©¼ž6c;ƒ©Ü»Ìä¼¼VA˼ý­­½ ¤c¼…ÍA½çdd<†»A=YÍ—¼f1½:½©ªª½˜¼¼ 1½™ˆ˜<¯ 1=f =ËOª=òl½ˆ1ª½Ò™¼”1½x@š<â1=ZR=ÙÖ©=Àž½©¸©½ñ‰›¼¾$1½©÷›1=ž‘¼ 覼<õ¦<'z¼“§¼Üí< §¹¨=¹Š#½ä«¨½N3¥¼´ó)½Ã{¥-=‚TÀ¼Ú"-½ìù1½:ן½ùc7½¹Q¤½Æ&·¼¹#½·B¼Åb›¼dÂC½Æ@œ½ypϼ 6%½ùªÏÑD¼¾•¼N_E<Õ-•<ÿíE¼/G•¼O}F<É`•<< G¼¡z•¼ÅG<´”•<å.H¼¯•¼ÀH<†É•<ç†O½‚š½.¬ØD<ÜœŒ<<7D¼ùKŒ¼ü/D<ýú‹lœ<à›p¼„¥œ¼¼:qe½B¿ˆ½‰8½b½‚µå¼ãx½^šx½if“½òx=£N“=È5æ<.ò=1aæ¼ÉŽaùy½<“½{Pz=»í’=qåæ<'B=qg½AN‡½ÏI½Þ½r}= É=~h=¾á†=äã@¼»_¼Iñ@<±W_<ÿ@¼õ^¼‡A¥P<‡Œv½Ý¹~½ÞǽQ½/ê=(=Zw=† ~=òžw½Ï}½sO½J«½¥p=*=§nx=Á }=>´x½÷æ|½”Ò½9½Kˆ=Þ‰=Ï7ø<¨èúq]¼­±L¼\Ý]<&­L<êI^¼Ñ¨L¼ý=ÊŽò„¼”¿G¼å®–½Ô!c½˜ ½¯R༽G=Úà¼éÏ‹<á>< 6R>¼Ñ Œ< ><9Ç—½äŒM½K{#½Líܼ”#=W–Ü<­˜=õªL=³y›<áÂP½eˆÏ¼/Z=ú9Ï=uœ =ÚþB=mé =qìÂ<þ ½¦•¼Êì ½.B½œ¡=úÁA=ü:!=@Á<úN!½È8Á¼+X¡½oÔ@½·æ¼¤É,¼Ðò<°ª¢¼‰ >¼‘΢<‡È=<ò¢¼§ƒ=¼óf‘¼Ö¸(¼p‘<`(<Üx‘¼/(¼u‘<Œ¯'<÷œ"½šøº¼6>£½¬C;½PY£={ô:=žÖž=Î_5=;êž½( 5½KK,½:Õü*k,=“…Ã<$Ÿ=» 4=˜Ä‘¼7‰$¼ôÊ‘<¾.$<Ñ‘¼Ô#¼ ב#ª<]-1<Ž%=b{«<íɧ=”â-=Âä§½0’-½.6%½bª¼î4’¼û¿<Þã<¡¿¼Ñˆ¼÷‰©½ê+ì¼èA½Ëa†¼£A=1†<¹°©=<êÚ+½&¬[¼YO’<Üaº;[X’¼‡É¹»‰a’j­=ž¹<–.½û‡9¼A¹½°»E•<태;º$•¼Hõ›»]7•<Âf›; t¹=¶ZÀ<Ý/=TË4</½84¼r‘¹½°¾¼‡ÿÃ<òøÇ;'ļv'Ç»ƒÄ<ÉUÆ;šļîƒÅ»M畼åh–»ú ļ­ßûD Ä;”޼€µ<»Ð«½==`;ÞT=½H¤]»·„º½Ë^×»)‚=½ÌW»×˜==ßT;Úqº=>[Î;Š·¼ž±Çº¼ì¶½†S@»O>=½a=;ö;º=•[¶;?¸=Cy±;mWB=¡8;g&º½‘_­»˜Á>½’Ÿ.»ÑÀ®=º††9Ÿöº=Û Ù9€»½…§©¹<Î=½Ãç÷¸Û)¬<ÂZ 8€¬¸<¶ßU7Û¸¼!Á!7Ÿ ¹<[ˆ¸-I»½÷[g9á@=½þ$9 )==_üT¹l»=¹Tº/ö¹¼Jô9Q%ºa¹Ä¿©¼÷v9™©<Ñë…¹]_©¼ ‰9o»¼ÞÛ«9ž»¶=øhG»•0¶½¸%M;ÄFG½È¹æ:ÅΤ¼PD:ž¤<Iº{m¤¼èN:è<¤<ÎSºc ¤¼ÊX:íÛ£<àÿ\º§À<‡û„ºoÓÀ¼¼+ˆ:½=Šˆ»39=³–»îù8½Ùu ;ô1½½.§‘;;½=±”»B®8=»•8½Që;úU½½8Ò;-;µ½½ó™;Ù½H½9¹-;‰ÑH=Gý0»îµ= x¢»Ðþ7½¦(;ìå7=.Þ*»“‘½=t(³»„ ’;ì;³½»<*/³=Ìç¼ò9K=T;—»áEK½å˜;? ³½s<Ôo¾½ÐJ<4b4½ïŒ;ÓM4=/f»ˆy¾=ç¼¹š<ó’öº¡ìÈ<¡g"»tɼœ$;˨™¼™Uý:°‡™<–ÿºg™¼ë;ÑF™<& »1Œ¾=2#¼RŒ3=°7›»z3½™œ;^¾½±Í'<šÌÉ<³Q3»íßɼk5;ªòÉ<³6»Ðʼwc8;,ÿK=ÕÕ»»Á²=#e%¼å²½íÉ&<ŠL½‰ÑÀ;‡VÊ<íÒ@»eʼ ‚B;ärÊ< 1D» €Ê¼­ßE;¸ŒÊ<üG»ª˜Ê¼ö;I;÷£Ê<•éJ»›®Ê¼Ô–L;–¸Ê<®CN»çÁʼðO;ŒÊÊ<œQ»˜Ø–<á"»xy±½O:<>-L½^ý×;»,L=B£Ù»ó]±=>¼ðÊ<À™[»×óʼB];ðöÊ<Üé^»Rùʼü`;t2±½V{E<ŽL½‡#å;ýL=»Ææ»Ó±=†­I¼–¼«,;_øÊ¼gmj;¢õÊ<Œl»º:¾½"Ì^<{1½INÑ;s1=‰µÒ»A'¾=‡Vc¼Éݰ=”ãT¼táK=¼÷»yÙK½®ø;vɰ½QY<¤½•<49»"º•¼™N:;Q·•<æ‚;»2µ•¼!¸<;à½½Ûæp<ƒ¤°½™Œa<Øž°=©õb¼ç~K=“¼ÖQʼø£ƒ; AÊ<-l„»ž/ʼÊ3…;MÊ<Ëú…»¡1=¾=컇½=¢]~¼á{½½ÚÚ<1½XŽð;ôK½q· <ôi°½-ˆr<f°=ôs¼¥@½=ž£ƒ¼—^°=¥Ìv¼j­J=Ó¢¼3›J½bj“<}nG½ìu'<NG==.(¼Ô=°==s•¼•?°½ý/–<"êF½úS*¼{BB½ µ><–¹°½Á<®<½™±µ= ‰J¼Ü>½#K<û8±½¾»½<±(µ½ÿ·Âæ6=öDI¼‚H´=')Ǽø'´½`ÊÇ<Ì67½$÷K<ÚQ7=ÞL¼¥Å³=8¬É¼=ˆ7=b­N¼£7½®•O½D†<^A>=Ê“†¼ª=¸ò¼×mª½Z¡ò½'ˆ<7’>=…ˆ¼<,=t„w¼,,½Åþw<@³½Eš=õ⺠Signal contains random telemetry bits 0 -> No telemetry %flag_E1_B = 1 -> Activates Galileo E1B primary spreading code %flag_E1_C = 1 -> Activates Galileo E1C primary spreading code %flag_local = 1 -> Signal will be used as a local replica %flag_second_code = 1 -> Activates Galileo E1C secondary spreading code %flag_noise = 1 -> Signal contains noise 0 -> signal is noise-free x = fcboc_E1_baseband(25e6,12.276e6,40,0.2,0,632,0.73e-3,1,1,1,1,0,1,0); Fs: 4e06 CN0: 40 dbHz Doppler: 632 Hz Delay: 0.73e-3 s x 4e6 sps/s = 2920 sps gnss-sdr-0.0.9/src/tests/single_test_main.cc000066400000000000000000000042041305042567700210550ustar00rootroot00000000000000/*! * \file single_test_main.cc * \brief This file contains the main function for tests (used with CTest). * \author Carles Fernandez-Prades, 2012. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include "concurrent_queue.h" #include "concurrent_map.h" #include "gps_navigation_message.h" #include "gps_ephemeris.h" #include "gps_cnav_ephemeris.h" #include "gps_cnav_iono.h" #include "gps_acq_assist.h" #include "gps_ref_location.h" #include "gps_ref_time.h" #include "galileo_navigation_message.h" #include "sbas_ionospheric_correction.h" #include "sbas_telemetry_data.h" #include "sbas_ephemeris.h" #include "sbas_satellite_correction.h" concurrent_queue global_gps_acq_assist_queue; concurrent_map global_gps_acq_assist_map; int main(int argc, char **argv) { google::ParseCommandLineFlags(&argc, &argv, true); testing::InitGoogleTest(&argc, argv); google::InitGoogleLogging(argv[0]); return RUN_ALL_TESTS(); } gnss-sdr-0.0.9/src/tests/system-tests/000077500000000000000000000000001305042567700177065ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/system-tests/obs_gps_l1_system_test.cc000066400000000000000000000731361305042567700247220ustar00rootroot00000000000000/*! * \file obs_gps_l1_system_test.cc * \brief This class implements a test for the validation of generated observables. * \author Carles Fernandez-Prades, 2016. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2016 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include #include #include #include "RinexUtilities.hpp" #include "Rinex3ObsBase.hpp" #include "Rinex3ObsData.hpp" #include "Rinex3ObsHeader.hpp" #include "Rinex3ObsStream.hpp" #include "concurrent_map.h" #include "concurrent_queue.h" #include "control_thread.h" #include "in_memory_configuration.h" #include "signal_generator_flags.h" // For GPS NAVIGATION (L1) concurrent_queue global_gps_acq_assist_queue; concurrent_map global_gps_acq_assist_map; class Obs_Gps_L1_System_Test: public ::testing::Test { public: std::string generator_binary; std::string p1; std::string p2; std::string p3; std::string p4; std::string p5; const double baseband_sampling_freq = 2.6e6; std::string filename_rinex_obs = FLAGS_filename_rinex_obs; std::string filename_raw_data = FLAGS_filename_raw_data; int configure_generator(); int generate_signal(); int configure_receiver(); int run_receiver(); void check_results(); bool check_valid_rinex_nav(std::string filename); // return true if the file is a valid Rinex navigation file. bool check_valid_rinex_obs(std::string filename); // return true if the file is a valid Rinex observation file. double compute_stdev(const std::vector & vec); std::shared_ptr config; std::string generated_rinex_obs; }; bool Obs_Gps_L1_System_Test::check_valid_rinex_nav(std::string filename) { bool res = false; res = gpstk::isRinexNavFile(filename); return res; } double Obs_Gps_L1_System_Test::compute_stdev(const std::vector & vec) { double sum__ = std::accumulate(vec.begin(), vec.end(), 0.0); double mean__ = sum__ / vec.size(); double accum__ = 0.0; std::for_each (std::begin(vec), std::end(vec), [&](const double d) { accum__ += (d - mean__) * (d - mean__); }); double stdev__ = std::sqrt(accum__ / (vec.size() - 1)); return stdev__; } bool Obs_Gps_L1_System_Test::check_valid_rinex_obs(std::string filename) { bool res = false; res = gpstk::isRinexObsFile(filename); return res; } int Obs_Gps_L1_System_Test::configure_generator() { // Configure signal generator generator_binary = FLAGS_generator_binary; p1 = std::string("-rinex_nav_file=") + FLAGS_rinex_nav_file; if(FLAGS_dynamic_position.empty()) { p2 = std::string("-static_position=") + FLAGS_static_position + std::string(",") + std::to_string(std::min(FLAGS_duration * 10, 3000)); if(FLAGS_duration > 300) std::cout << "WARNING: Duration has been set to its maximum value of 300 s" << std::endl; } else { p2 = std::string("-obs_pos_file=") + std::string(FLAGS_dynamic_position); } p3 = std::string("-rinex_obs_file=") + FLAGS_filename_rinex_obs; // RINEX 2.10 observation file output p4 = std::string("-sig_out_file=") + FLAGS_filename_raw_data; // Baseband signal output file. Will be stored in int8_t IQ multiplexed samples p5 = std::string("-sampling_freq=") + std::to_string(baseband_sampling_freq); //Baseband sampling frequency [MSps] return 0; } int Obs_Gps_L1_System_Test::generate_signal() { pid_t wait_result; int child_status; char *const parmList[] = { &generator_binary[0], &generator_binary[0], &p1[0], &p2[0], &p3[0], &p4[0], &p5[0], NULL }; int pid; if ((pid = fork()) == -1) perror("fork error"); else if (pid == 0) { execv(&generator_binary[0], parmList); std::cout << "Return not expected. Must be an execv error." << std::endl; std::terminate(); } wait_result = waitpid(pid, &child_status, 0); if (wait_result == -1) perror("waitpid error"); EXPECT_EQ(true, check_valid_rinex_obs(filename_rinex_obs)); std::cout << "Signal and Observables RINEX files created." << std::endl; return 0; } int Obs_Gps_L1_System_Test::configure_receiver() { config = std::make_shared(); const int sampling_rate_internal = baseband_sampling_freq; const int number_of_taps = 11; const int number_of_bands = 2; const float band1_begin = 0.0; const float band1_end = 0.48; const float band2_begin = 0.52; const float band2_end = 1.0; const float ampl1_begin = 1.0; const float ampl1_end = 1.0; const float ampl2_begin = 0.0; const float ampl2_end = 0.0; const float band1_error = 1.0; const float band2_error = 1.0; const int grid_density = 16; const int decimation_factor = 1; const float zero = 0.0; const int number_of_channels = 8; const int in_acquisition = 1; const float threshold = 0.01; const float doppler_max = 8000.0; const float doppler_step = 500.0; const int max_dwells = 1; const int tong_init_val = 2; const int tong_max_val = 10; const int tong_max_dwells = 30; const int coherent_integration_time_ms = 1; const float pll_bw_hz = 30.0; const float dll_bw_hz = 4.0; const float early_late_space_chips = 0.5; const float pll_bw_narrow_hz = 20.0; const float dll_bw_narrow_hz = 2.0; const int extend_correlation_ms = 1; const int display_rate_ms = 500; const int output_rate_ms = 1000; const int averaging_depth = 1; config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(sampling_rate_internal)); // Set the assistance system parameters config->set_property("GNSS-SDR.SUPL_read_gps_assistance_xml", "false"); config->set_property("GNSS-SDR.SUPL_gps_enabled", "false"); config->set_property("GNSS-SDR.SUPL_gps_ephemeris_server", "supl.google.com"); config->set_property("GNSS-SDR.SUPL_gps_ephemeris_port", std::to_string(7275)); config->set_property("GNSS-SDR.SUPL_gps_acquisition_server", "supl.google.com"); config->set_property("GNSS-SDR.SUPL_gps_acquisition_port", std::to_string(7275)); config->set_property("GNSS-SDR.SUPL_MCC", std::to_string(244)); config->set_property("GNSS-SDR.SUPL_MNS", std::to_string(5)); config->set_property("GNSS-SDR.SUPL_LAC", "0x59e2"); config->set_property("GNSS-SDR.SUPL_CI", "0x31b0"); // Set the Signal Source config->set_property("SignalSource.implementation", "File_Signal_Source"); config->set_property("SignalSource.filename", "./" + filename_raw_data); config->set_property("SignalSource.sampling_frequency", std::to_string(sampling_rate_internal)); config->set_property("SignalSource.item_type", "ibyte"); config->set_property("SignalSource.samples", std::to_string(zero)); // Set the Signal Conditioner config->set_property("SignalConditioner.implementation", "Signal_Conditioner"); config->set_property("DataTypeAdapter.implementation", "Ibyte_To_Complex"); config->set_property("InputFilter.implementation", "Fir_Filter"); config->set_property("InputFilter.dump", "false"); config->set_property("InputFilter.input_item_type", "gr_complex"); config->set_property("InputFilter.output_item_type", "gr_complex"); config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", std::to_string(number_of_taps)); config->set_property("InputFilter.number_of_bands", std::to_string(number_of_bands)); config->set_property("InputFilter.band1_begin", std::to_string(band1_begin)); config->set_property("InputFilter.band1_end", std::to_string(band1_end)); config->set_property("InputFilter.band2_begin", std::to_string(band2_begin)); config->set_property("InputFilter.band2_end", std::to_string(band2_end)); config->set_property("InputFilter.ampl1_begin", std::to_string(ampl1_begin)); config->set_property("InputFilter.ampl1_end", std::to_string(ampl1_end)); config->set_property("InputFilter.ampl2_begin", std::to_string(ampl2_begin)); config->set_property("InputFilter.ampl2_end", std::to_string(ampl2_end)); config->set_property("InputFilter.band1_error", std::to_string(band1_error)); config->set_property("InputFilter.band2_error", std::to_string(band2_error)); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", std::to_string(grid_density)); config->set_property("InputFilter.sampling_frequency", std::to_string(sampling_rate_internal)); config->set_property("InputFilter.IF", std::to_string(zero)); config->set_property("Resampler.implementation", "Pass_Through"); config->set_property("Resampler.dump", "false"); config->set_property("Resampler.item_type", "gr_complex"); config->set_property("Resampler.sample_freq_in", std::to_string(sampling_rate_internal)); config->set_property("Resampler.sample_freq_out", std::to_string(sampling_rate_internal)); // Set the number of Channels config->set_property("Channels_1C.count", std::to_string(number_of_channels)); config->set_property("Channels.in_acquisition", std::to_string(in_acquisition)); config->set_property("Channel.signal", "1C"); // Set Acquisition config->set_property("Acquisition_1C.implementation", "GPS_L1_CA_PCPS_Tong_Acquisition"); config->set_property("Acquisition_1C.item_type", "gr_complex"); config->set_property("Acquisition_1C.if", std::to_string(zero)); config->set_property("Acquisition_1C.coherent_integration_time_ms", std::to_string(coherent_integration_time_ms)); config->set_property("Acquisition_1C.threshold", std::to_string(threshold)); config->set_property("Acquisition_1C.doppler_max", std::to_string(doppler_max)); config->set_property("Acquisition_1C.doppler_step", std::to_string(doppler_step)); config->set_property("Acquisition_1C.bit_transition_flag", "false"); config->set_property("Acquisition_1C.max_dwells", std::to_string(max_dwells)); config->set_property("Acquisition_1C.tong_init_val", std::to_string(tong_init_val)); config->set_property("Acquisition_1C.tong_max_val", std::to_string(tong_max_val)); config->set_property("Acquisition_1C.tong_max_dwells", std::to_string(tong_max_dwells)); // Set Tracking config->set_property("Tracking_1C.implementation", "GPS_L1_CA_DLL_PLL_Tracking"); //config->set_property("Tracking_1C.implementation", "GPS_L1_CA_DLL_PLL_C_Aid_Tracking"); config->set_property("Tracking_1C.item_type", "gr_complex"); config->set_property("Tracking_1C.if", std::to_string(zero)); config->set_property("Tracking_1C.dump", "false"); config->set_property("Tracking_1C.dump_filename", "./tracking_ch_"); config->set_property("Tracking_1C.pll_bw_hz", std::to_string(pll_bw_hz)); config->set_property("Tracking_1C.dll_bw_hz", std::to_string(dll_bw_hz)); config->set_property("Tracking_1C.early_late_space_chips", std::to_string(early_late_space_chips)); config->set_property("Tracking_1C.pll_bw_narrow_hz", std::to_string(pll_bw_narrow_hz)); config->set_property("Tracking_1C.dll_bw_narrow_hz", std::to_string(dll_bw_narrow_hz)); config->set_property("Tracking_1C.extend_correlation_ms", std::to_string(extend_correlation_ms)); // Set Telemetry config->set_property("TelemetryDecoder_1C.implementation", "GPS_L1_CA_Telemetry_Decoder"); config->set_property("TelemetryDecoder_1C.dump", "false"); config->set_property("TelemetryDecoder_1C.decimation_factor", std::to_string(decimation_factor)); // Set Observables config->set_property("Observables.implementation", "GPS_L1_CA_Observables"); config->set_property("Observables.dump", "false"); config->set_property("Observables.dump_filename", "./observables.dat"); config->set_property("Observables.averaging_depth", std::to_string(100)); // Set PVT config->set_property("PVT.implementation", "GPS_L1_CA_PVT"); config->set_property("PVT.averaging_depth", std::to_string(averaging_depth)); config->set_property("PVT.flag_averaging", "true"); config->set_property("PVT.output_rate_ms", std::to_string(output_rate_ms)); config->set_property("PVT.display_rate_ms", std::to_string(display_rate_ms)); config->set_property("PVT.dump_filename", "./PVT"); config->set_property("PVT.nmea_dump_filename", "./gnss_sdr_pvt.nmea"); config->set_property("PVT.flag_nmea_tty_port", "false"); config->set_property("PVT.nmea_dump_devname", "/dev/pts/4"); config->set_property("PVT.flag_rtcm_server", "false"); config->set_property("PVT.flag_rtcm_tty_port", "false"); config->set_property("PVT.rtcm_dump_devname", "/dev/pts/1"); config->set_property("PVT.dump", "false"); config->set_property("PVT.rinex_version", std::to_string(2)); return 0; } int Obs_Gps_L1_System_Test::run_receiver() { std::shared_ptr control_thread; control_thread = std::make_shared(config); // start receiver try { control_thread->run(); } catch( boost::exception & e ) { std::cout << "Boost exception: " << boost::diagnostic_information(e); } catch(std::exception const& ex) { std::cout << "STD exception: " << ex.what(); } // Get the name of the RINEX obs file generated by the receiver FILE *fp; std::string argum2 = std::string("/bin/ls *O | grep GSDR | tail -1"); char buffer[1035]; fp = popen(&argum2[0], "r"); if (fp == NULL) { std::cout << "Failed to run command: " << argum2 << std::endl; return -1; } char * without_trailing = (char*)"0"; while (fgets(buffer, sizeof(buffer), fp) != NULL) { std::string aux = std::string(buffer); without_trailing = strtok(&aux[0], "\n"); } generated_rinex_obs = std::string(without_trailing); pclose(fp); return 0; } void Obs_Gps_L1_System_Test::check_results() { std::vector> > pseudorange_ref(33); std::vector> > carrierphase_ref(33); std::vector> > doppler_ref(33); std::vector> > pseudorange_meas(33); std::vector> > carrierphase_meas(33); std::vector> > doppler_meas(33); // Open and read reference RINEX observables file try { gpstk::Rinex3ObsStream r_ref(FLAGS_filename_rinex_obs); r_ref.exceptions(std::ios::failbit); gpstk::Rinex3ObsData r_ref_data; gpstk::Rinex3ObsHeader r_ref_header; gpstk::RinexDatum dataobj; r_ref >> r_ref_header; while (r_ref >> r_ref_data) { for (int myprn = 1; myprn < 33; myprn++) { gpstk::SatID prn( myprn, gpstk::SatID::systemGPS ); gpstk::CommonTime time = r_ref_data.time; double sow(static_cast(time).sow); gpstk::Rinex3ObsData::DataMap::iterator pointer = r_ref_data.obs.find(prn); if( pointer == r_ref_data.obs.end() ) { // PRN not present; do nothing } else { dataobj = r_ref_data.getObs(prn, "C1C", r_ref_header); double P1 = dataobj.data; std::pair pseudo(sow,P1); pseudorange_ref.at(myprn).push_back(pseudo); dataobj = r_ref_data.getObs(prn, "L1C", r_ref_header); double L1 = dataobj.data; std::pair carrier(sow, L1); carrierphase_ref.at(myprn).push_back(carrier); dataobj = r_ref_data.getObs(prn, "D1C", r_ref_header); double D1 = dataobj.data; std::pair doppler(sow, D1); doppler_ref.at(myprn).push_back(doppler); } // End of 'if( pointer == roe.obs.end() )' } // end for } // end while } // End of 'try' block catch(gpstk::FFStreamError& e) { std::cout << e; exit(1); } catch(gpstk::Exception& e) { std::cout << e; exit(1); } catch (...) { std::cout << "unknown error. I don't feel so well..." << std::endl; exit(1); } try { std::string arg2_gen = std::string("./") + generated_rinex_obs; gpstk::Rinex3ObsStream r_meas(arg2_gen); r_meas.exceptions(std::ios::failbit); gpstk::Rinex3ObsData r_meas_data; gpstk::Rinex3ObsHeader r_meas_header; gpstk::RinexDatum dataobj; r_meas >> r_meas_header; while (r_meas >> r_meas_data) { for (int myprn = 1; myprn < 33; myprn++) { gpstk::SatID prn( myprn, gpstk::SatID::systemGPS ); gpstk::CommonTime time = r_meas_data.time; double sow(static_cast(time).sow); gpstk::Rinex3ObsData::DataMap::iterator pointer = r_meas_data.obs.find(prn); if( pointer == r_meas_data.obs.end() ) { // PRN not present; do nothing } else { dataobj = r_meas_data.getObs(prn, "C1C", r_meas_header); double P1 = dataobj.data; std::pair pseudo(sow, P1); pseudorange_meas.at(myprn).push_back(pseudo); dataobj = r_meas_data.getObs(prn, "L1C", r_meas_header); double L1 = dataobj.data; std::pair carrier(sow, L1); carrierphase_meas.at(myprn).push_back(carrier); dataobj = r_meas_data.getObs(prn, "D1C", r_meas_header); double D1 = dataobj.data; std::pair doppler(sow, D1); doppler_meas.at(myprn).push_back(doppler); } // End of 'if( pointer == roe.obs.end() )' } // end for } // end while } // End of 'try' block catch(gpstk::FFStreamError& e) { std::cout << e; exit(1); } catch(gpstk::Exception& e) { std::cout << e; exit(1); } catch (...) { std::cout << "unknown error. I don't feel so well..." << std::endl; exit(1); } // Time alignment std::vector> > pseudorange_ref_aligned(33); std::vector> > carrierphase_ref_aligned(33); std::vector> > doppler_ref_aligned(33); std::vector> >::iterator iter; std::vector>::iterator it; std::vector>::iterator it2; std::vector> pr_diff(33); std::vector> cp_diff(33); std::vector> doppler_diff(33); std::vector>::iterator iter_diff; std::vector::iterator iter_v; int prn_id = 0; for(iter = pseudorange_ref.begin(); iter != pseudorange_ref.end(); iter++) { for(it = iter->begin(); it != iter->end(); it++) { // If a measure exists for this sow, store it for(it2 = pseudorange_meas.at(prn_id).begin(); it2 != pseudorange_meas.at(prn_id).end(); it2++) { if(std::abs(it->first - it2->first) < 0.01) // store measures closer than 10 ms. { pseudorange_ref_aligned.at(prn_id).push_back(*it); pr_diff.at(prn_id).push_back(it->second - it2->second ); //std::cout << "Sat " << prn_id << ": " << "PR_ref=" << it->second << " PR_meas=" << it2->second << " Diff:" << it->second - it2->second << std::endl; } } } prn_id++; } prn_id = 0; for(iter = carrierphase_ref.begin(); iter != carrierphase_ref.end(); iter++) { for(it = iter->begin(); it != iter->end(); it++) { // If a measure exists for this sow, store it for(it2 = carrierphase_meas.at(prn_id).begin(); it2 != carrierphase_meas.at(prn_id).end(); it2++) { if(std::abs(it->first - it2->first) < 0.01) // store measures closer than 10 ms. { carrierphase_ref_aligned.at(prn_id).push_back(*it); cp_diff.at(prn_id).push_back(it->second - it2->second ); // std::cout << "Sat " << prn_id << ": " << "Carrier_ref=" << it->second << " Carrier_meas=" << it2->second << " Diff:" << it->second - it2->second << std::endl; } } } prn_id++; } prn_id = 0; for(iter = doppler_ref.begin(); iter != doppler_ref.end(); iter++) { for(it = iter->begin(); it != iter->end(); it++) { // If a measure exists for this sow, store it for(it2 = doppler_meas.at(prn_id).begin(); it2 != doppler_meas.at(prn_id).end(); it2++) { if(std::abs(it->first - it2->first) < 0.01) // store measures closer than 10 ms. { doppler_ref_aligned.at(prn_id).push_back(*it); doppler_diff.at(prn_id).push_back(it->second - it2->second ); } } } prn_id++; } // Compute pseudorange error prn_id = 0; std::vector mean_pr_diff_v; for(iter_diff = pr_diff.begin(); iter_diff != pr_diff.end(); iter_diff++) { // For each satellite with reference and measurements aligned in time int number_obs = 0; double mean_diff = 0.0; for(iter_v = iter_diff->begin(); iter_v != iter_diff->end(); iter_v++) { mean_diff = mean_diff + *iter_v; number_obs = number_obs + 1; } if(number_obs > 0) { mean_diff = mean_diff / number_obs; mean_pr_diff_v.push_back(mean_diff); std::cout << "-- Mean pseudorange difference for sat " << prn_id << ": " << mean_diff; double stdev_ = compute_stdev(*iter_diff); std::cout << " +/- " << stdev_ ; std::cout << " [m]" << std::endl; } else { mean_diff = 0.0; } prn_id++; } double stdev_pr = compute_stdev(mean_pr_diff_v); std::cout << "Pseudorange diff error stdev = " << stdev_pr << " [m]" << std::endl; ASSERT_LT(stdev_pr, 1.0); // Compute carrier phase error prn_id = 0; std::vector mean_cp_diff_v; for(iter_diff = cp_diff.begin(); iter_diff != cp_diff.end(); iter_diff++) { // For each satellite with reference and measurements aligned in time int number_obs = 0; double mean_diff = 0.0; for(iter_v = iter_diff->begin(); iter_v != iter_diff->end(); iter_v++) { mean_diff = mean_diff + *iter_v; number_obs = number_obs + 1; } if(number_obs > 0) { mean_diff = mean_diff / number_obs; mean_cp_diff_v.push_back(mean_diff); std::cout << "-- Mean carrier phase difference for sat " << prn_id << ": " << mean_diff; double stdev_pr_ = compute_stdev(*iter_diff); std::cout << " +/- " << stdev_pr_ << " whole cycles (19 cm)" << std::endl; } else { mean_diff = 0.0; } prn_id++; } // Compute Doppler error prn_id = 0; std::vector mean_doppler_v; for(iter_diff = doppler_diff.begin(); iter_diff != doppler_diff.end(); iter_diff++) { // For each satellite with reference and measurements aligned in time int number_obs = 0; double mean_diff = 0.0; for(iter_v = iter_diff->begin(); iter_v != iter_diff->end(); iter_v++) { //std::cout << *iter_v << std::endl; mean_diff = mean_diff + *iter_v; number_obs = number_obs + 1; } if(number_obs > 0) { mean_diff = mean_diff / number_obs; mean_doppler_v.push_back(mean_diff); std::cout << "-- Mean Doppler difference for sat " << prn_id << ": " << mean_diff << " [Hz]" << std::endl; } else { mean_diff = 0.0; } prn_id++; } double stdev_dp = compute_stdev(mean_doppler_v); std::cout << "Doppler error stdev = " << stdev_dp << " [Hz]" << std::endl; ASSERT_LT(stdev_dp, 1.0); } TEST_F(Obs_Gps_L1_System_Test, Observables_system_test) { std::cout << "Validating input RINEX nav file: " << FLAGS_rinex_nav_file << " ..." << std::endl; bool is_rinex_nav_valid = check_valid_rinex_nav(FLAGS_rinex_nav_file); EXPECT_EQ(true, is_rinex_nav_valid) << "The RINEX navigation file " << FLAGS_rinex_nav_file << " is not well formed."; std::cout << "The file is valid." << std::endl; // Configure the signal generator configure_generator(); // Generate signal raw signal samples and observations RINEX file generate_signal(); std::cout << "Validating generated reference RINEX obs file: " << FLAGS_filename_rinex_obs << " ..." << std::endl; bool is_gen_rinex_obs_valid = check_valid_rinex_obs( "./" + FLAGS_filename_rinex_obs); EXPECT_EQ(true, is_gen_rinex_obs_valid) << "The RINEX observation file " << FLAGS_filename_rinex_obs << ", generated by gnss-sim, is not well formed."; std::cout << "The file is valid." << std::endl; // Configure receiver configure_receiver(); // Run the receiver EXPECT_EQ( run_receiver(), 0) << "Problem executing the software-defined signal generator"; std::cout << "Validating RINEX obs file obtained by GNSS-SDR: " << generated_rinex_obs << " ..." << std::endl; is_gen_rinex_obs_valid = check_valid_rinex_obs( "./" + generated_rinex_obs); EXPECT_EQ(true, is_gen_rinex_obs_valid) << "The RINEX observation file " << generated_rinex_obs << ", generated by GNSS-SDR, is not well formed."; std::cout << "The file is valid." << std::endl; // Check results check_results(); } int main(int argc, char **argv) { std::cout << "Running Observables validation test..." << std::endl; int res = 0; try { testing::InitGoogleTest(&argc, argv); } catch(...) {} // catch the "testing::internal::::ClassUniqueToAlwaysTrue" from gtest google::ParseCommandLineFlags(&argc, &argv, true); google::InitGoogleLogging(argv[0]); // Run the Tests try { res = RUN_ALL_TESTS(); } catch(...) { LOG(WARNING) << "Unexpected catch"; } google::ShutDownCommandLineFlags(); return res; } gnss-sdr-0.0.9/src/tests/system-tests/ttff_gps_l1.cc000066400000000000000000000637271305042567700224440ustar00rootroot00000000000000/*! * \file ttff_gps_l1.cc * \brief This class implements a test for measuring * the Time-To-First-Fix * \author Carles Fernandez-Prades, 2016. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2016 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "concurrent_map.h" #include "concurrent_queue.h" #include "control_thread.h" #include "file_configuration.h" #include "in_memory_configuration.h" #include "gnss_flowgraph.h" #include "gps_acq_assist.h" DEFINE_int32(fs_in, 4000000, "Sampling rate, in Samples/s"); DEFINE_int32(max_measurement_duration, 90, "Maximum time waiting for a position fix, in seconds"); DEFINE_int32(num_measurements, 2, "Number of measurements"); DEFINE_string(device_address, "192.168.40.2", "USRP device IP address"); DEFINE_string(subdevice, "A:0", "USRP subdevice"); DEFINE_string(config_file_ttff, std::string(""), "File containing the configuration parameters for the TTFF test."); // For GPS NAVIGATION (L1) concurrent_queue global_gps_acq_assist_queue; concurrent_map global_gps_acq_assist_map; std::vector TTFF_v; const int decimation_factor = 1; typedef struct { long mtype; // required by SysV message double ttff; } ttff_msgbuf; class TTFF_GPS_L1_CA_Test: public ::testing::Test { public: void config_1(); void config_2(); void print_TTFF_report(const std::vector & ttff_v, std::shared_ptr config_); std::shared_ptr config; std::shared_ptr config2; const double central_freq = 1575420000.0; const double gain_dB = 40.0; const int number_of_taps = 11; const int number_of_bands = 2; const float band1_begin = 0.0; const float band1_end = 0.48; const float band2_begin = 0.52; const float band2_end = 1.0; const float ampl1_begin = 1.0; const float ampl1_end = 1.0; const float ampl2_begin = 0.0; const float ampl2_end = 0.0; const float band1_error = 1.0; const float band2_error = 1.0; const int grid_density = 16; const float zero = 0.0; const int number_of_channels = 8; const int in_acquisition = 1; const float threshold = 0.01; const float doppler_max = 8000.0; const float doppler_step = 500.0; const int max_dwells = 1; const int tong_init_val = 2; const int tong_max_val = 10; const int tong_max_dwells = 30; const int coherent_integration_time_ms = 1; const float pll_bw_hz = 30.0; const float dll_bw_hz = 4.0; const float early_late_space_chips = 0.5; const int display_rate_ms = 500; const int output_rate_ms = 100; const int averaging_depth = 10; }; void TTFF_GPS_L1_CA_Test::config_1() { config = std::make_shared(); config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(FLAGS_fs_in)); // Set the assistance system parameters config->set_property("GNSS-SDR.SUPL_gps_ephemeris_server", "supl.google.com"); config->set_property("GNSS-SDR.SUPL_gps_ephemeris_port", std::to_string(7275)); config->set_property("GNSS-SDR.SUPL_gps_acquisition_server", "supl.google.com"); config->set_property("GNSS-SDR.SUPL_gps_acquisition_port", std::to_string(7275)); config->set_property("GNSS-SDR.SUPL_MCC", std::to_string(244)); config->set_property("GNSS-SDR.SUPL_MNS", std::to_string(5)); config->set_property("GNSS-SDR.SUPL_LAC", "0x59e2"); config->set_property("GNSS-SDR.SUPL_CI", "0x31b0"); // Set the Signal Source config->set_property("SignalSource.item_type", "cshort"); config->set_property("SignalSource.implementation", "UHD_Signal_Source"); config->set_property("SignalSource.freq", std::to_string(central_freq)); config->set_property("SignalSource.sampling_frequency", std::to_string(FLAGS_fs_in)); config->set_property("SignalSource.gain", std::to_string(gain_dB)); config->set_property("SignalSource.subdevice", FLAGS_subdevice); config->set_property("SignalSource.samples", std::to_string(FLAGS_fs_in * FLAGS_max_measurement_duration)); config->set_property("SignalSource.device_address", FLAGS_device_address); // Set the Signal Conditioner config->set_property("SignalConditioner.implementation", "Signal_Conditioner"); config->set_property("DataTypeAdapter.implementation", "Pass_Through"); config->set_property("DataTypeAdapter.item_type", "cshort"); config->set_property("InputFilter.implementation", "Fir_Filter"); config->set_property("InputFilter.dump", "false"); config->set_property("InputFilter.input_item_type", "cshort"); config->set_property("InputFilter.output_item_type", "gr_complex"); config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", std::to_string(number_of_taps)); config->set_property("InputFilter.number_of_bands", std::to_string(number_of_bands)); config->set_property("InputFilter.band1_begin", std::to_string(band1_begin)); config->set_property("InputFilter.band1_end", std::to_string(band1_end)); config->set_property("InputFilter.band2_begin", std::to_string(band2_begin)); config->set_property("InputFilter.band2_end", std::to_string(band2_end)); config->set_property("InputFilter.ampl1_begin", std::to_string(ampl1_begin)); config->set_property("InputFilter.ampl1_end", std::to_string(ampl1_end)); config->set_property("InputFilter.ampl2_begin", std::to_string(ampl2_begin)); config->set_property("InputFilter.ampl2_end", std::to_string(ampl2_end)); config->set_property("InputFilter.band1_error", std::to_string(band1_error)); config->set_property("InputFilter.band2_error", std::to_string(band2_error)); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", std::to_string(grid_density)); config->set_property("InputFilter.sampling_frequency", std::to_string(FLAGS_fs_in)); config->set_property("InputFilter.IF", std::to_string(zero)); config->set_property("Resampler.implementation", "Pass_Through"); config->set_property("Resampler.dump", "false"); config->set_property("Resampler.item_type", "gr_complex"); config->set_property("Resampler.sample_freq_in", std::to_string(FLAGS_fs_in)); config->set_property("Resampler.sample_freq_out", std::to_string(FLAGS_fs_in)); // Set the number of Channels config->set_property("Channels_1C.count", std::to_string(number_of_channels)); config->set_property("Channels.in_acquisition", std::to_string(in_acquisition)); config->set_property("Channel.signal", "1C"); // Set Acquisition config->set_property("Acquisition_1C.implementation", "GPS_L1_CA_PCPS_Tong_Acquisition"); config->set_property("Acquisition_1C.item_type", "gr_complex"); config->set_property("Acquisition_1C.if", std::to_string(zero)); config->set_property("Acquisition_1C.coherent_integration_time_ms", std::to_string(coherent_integration_time_ms)); config->set_property("Acquisition_1C.threshold", std::to_string(threshold)); config->set_property("Acquisition_1C.doppler_max", std::to_string(doppler_max)); config->set_property("Acquisition_1C.doppler_step", std::to_string(doppler_step)); config->set_property("Acquisition_1C.bit_transition_flag", "false"); config->set_property("Acquisition_1C.max_dwells", std::to_string(max_dwells)); config->set_property("Acquisition_1C.tong_init_val", std::to_string(tong_init_val)); config->set_property("Acquisition_1C.tong_max_val", std::to_string(tong_max_val)); config->set_property("Acquisition_1C.tong_max_dwells", std::to_string(tong_max_dwells)); // Set Tracking config->set_property("Tracking_1C.implementation", "GPS_L1_CA_DLL_PLL_Tracking"); config->set_property("Tracking_1C.item_type", "gr_complex"); config->set_property("Tracking_1C.if", std::to_string(zero)); config->set_property("Tracking_1C.dump", "false"); config->set_property("Tracking_1C.dump_filename", "./tracking_ch_"); config->set_property("Tracking_1C.pll_bw_hz", std::to_string(pll_bw_hz)); config->set_property("Tracking_1C.dll_bw_hz", std::to_string(dll_bw_hz)); config->set_property("Tracking_1C.early_late_space_chips", std::to_string(early_late_space_chips)); // Set Telemetry config->set_property("TelemetryDecoder_1C.implementation", "GPS_L1_CA_Telemetry_Decoder"); config->set_property("TelemetryDecoder_1C.dump", "false"); config->set_property("TelemetryDecoder_1C.decimation_factor", std::to_string(decimation_factor)); // Set Observables config->set_property("Observables.implementation", "GPS_L1_CA_Observables"); config->set_property("Observables.dump", "false"); config->set_property("Observables.dump_filename", "./observables.dat"); // Set PVT config->set_property("PVT.implementation", "GPS_L1_CA_PVT"); config->set_property("PVT.averaging_depth", std::to_string(averaging_depth)); config->set_property("PVT.flag_averaging", "true"); config->set_property("PVT.output_rate_ms", std::to_string(output_rate_ms)); config->set_property("PVT.display_rate_ms", std::to_string(display_rate_ms)); config->set_property("PVT.dump_filename", "./PVT"); config->set_property("PVT.nmea_dump_filename", "./gnss_sdr_pvt.nmea"); config->set_property("PVT.flag_nmea_tty_port", "false"); config->set_property("PVT.nmea_dump_devname", "/dev/pts/4"); config->set_property("PVT.flag_rtcm_server", "false"); config->set_property("PVT.flag_rtcm_tty_port", "false"); config->set_property("PVT.rtcm_dump_devname", "/dev/pts/1"); config->set_property("PVT.dump", "false"); } void TTFF_GPS_L1_CA_Test::config_2() { if(FLAGS_config_file_ttff.empty()) { std::string path = std::string(TEST_PATH); std::string filename = path + "../../conf/gnss-sdr_GPS_L1_USRP_X300_realtime.conf"; config2 = std::make_shared(filename); } else { config2 = std::make_shared(FLAGS_config_file_ttff); } int d_sampling_rate; d_sampling_rate = config2->property("GNSS-SDR.internal_fs_hz", FLAGS_fs_in); config2->set_property("SignalSource.samples", std::to_string(d_sampling_rate * FLAGS_max_measurement_duration)); } void receive_msg() { ttff_msgbuf msg; ttff_msgbuf msg_stop; msg_stop.mtype = 1; msg_stop.ttff = -200.0; double ttff_msg = 0.0; int msgrcv_size = sizeof(msg.ttff); int msqid; int msqid_stop = -1; key_t key = 1101; key_t key_stop = 1102; bool leave = false; while(!leave) { // wait for the queue to be created while((msqid = msgget(key, 0644)) == -1){} if (msgrcv(msqid, &msg, msgrcv_size, 1, 0) != -1) { ttff_msg = msg.ttff; if( (ttff_msg != 0) && (ttff_msg != -1)) { TTFF_v.push_back(ttff_msg / (1000.0 / decimation_factor) ); LOG(INFO) << "Valid Time-To-First-Fix: " << ttff_msg / (1000.0 / decimation_factor ) << "[s]"; // Stop the receiver while(((msqid_stop = msgget(key_stop, 0644))) == -1){} double msgsend_size = sizeof(msg_stop.ttff); msgsnd(msqid_stop, &msg_stop, msgsend_size, IPC_NOWAIT); } if( std::abs(ttff_msg - (-1.0) ) < 10 * std::numeric_limits::epsilon() ) { leave = true; } } } return; } void TTFF_GPS_L1_CA_Test::print_TTFF_report(const std::vector & ttff_v, std::shared_ptr config_) { std::ofstream ttff_report_file; std::string filename = "ttff_report"; std::string filename_; time_t rawtime; struct tm * timeinfo; time ( &rawtime ); timeinfo = localtime ( &rawtime ); std::stringstream strm0; const int year = timeinfo->tm_year - 100; strm0 << year; const int month = timeinfo->tm_mon + 1; if(month < 10) { strm0 << "0"; } strm0 << month; const int day = timeinfo->tm_mday; if(day < 10) { strm0 << "0"; } strm0 << day << "_"; const int hour = timeinfo->tm_hour; if(hour < 10) { strm0 << "0"; } strm0 << hour; const int min = timeinfo->tm_min; if(min < 10) { strm0 << "0"; } strm0 << min; const int sec = timeinfo->tm_sec; if(sec < 10) { strm0 << "0"; } strm0 << sec; filename_ = filename + "_" + strm0.str() + ".txt"; ttff_report_file.open(filename_.c_str()); std::vector ttff = ttff_v; bool read_ephemeris; bool false_bool = false; read_ephemeris = config_->property("GNSS-SDR.SUPL_read_gps_assistance_xml", false_bool); bool agnss; agnss = config_->property("GNSS-SDR.SUPL_gps_enabled", false_bool); double sum = std::accumulate(ttff.begin(), ttff.end(), 0.0); double mean = sum / ttff.size(); double sq_sum = std::inner_product(ttff.begin(), ttff.end(), ttff.begin(), 0.0); double stdev = std::sqrt(sq_sum / ttff.size() - mean * mean); auto max_ttff = std::max_element(std::begin(ttff), std::end(ttff)); auto min_ttff = std::min_element(std::begin(ttff), std::end(ttff)); std::string source; std::string default_str = "default"; source = config_->property("SignalSource.implementation", default_str); if (ttff_report_file.is_open()) { ttff_report_file << "---------------------------" << std::endl; ttff_report_file << " Time-To-First-Fix Report" << std::endl; ttff_report_file << "---------------------------" << std::endl; ttff_report_file << "Initial receiver status: "; if (read_ephemeris) { ttff_report_file << "Hot start." << std::endl; } else { ttff_report_file << "Cold start." << std::endl; } ttff_report_file << "A-GNSS: "; if (agnss && read_ephemeris) { ttff_report_file << "Enabled." << std::endl; } else { ttff_report_file << "Disabled." << std::endl; } ttff_report_file << "Valid measurements (" << ttff.size() << "/" << FLAGS_num_measurements << "): "; for(double ttff_ : ttff) ttff_report_file << ttff_ << " "; ttff_report_file << std::endl; ttff_report_file << "TTFF mean: " << mean << " [s]" << std::endl; if (ttff.size() > 0) { ttff_report_file << "TTFF max: " << *max_ttff << " [s]" << std::endl; ttff_report_file << "TTFF min: " << *min_ttff << " [s]" << std::endl; } ttff_report_file << "TTFF stdev: " << stdev << " [s]" << std::endl; ttff_report_file << "Operating System: " << std::string(HOST_SYSTEM) << std::endl; ttff_report_file << "Navigation mode: " << "3D" << std::endl; if(source.compare("UHD_Signal_Source")) { ttff_report_file << "Source: File" << std::endl; } else { ttff_report_file << "Source: Live" << std::endl; } ttff_report_file << "---------------------------" << std::endl; } ttff_report_file.close(); std::cout << "---------------------------" << std::endl; std::cout << " Time-To-First-Fix Report" << std::endl; std::cout << "---------------------------" << std::endl; std::cout << "Initial receiver status: "; if (read_ephemeris) { std::cout << "Hot start." << std::endl; } else { std::cout << "Cold start." << std::endl; } std::cout << "A-GNSS: "; if (agnss && read_ephemeris) { std::cout << "Enabled." << std::endl; } else { std::cout << "Disabled." << std::endl; } std::cout << "Valid measurements (" << ttff.size() << "/" << FLAGS_num_measurements << "): "; for(double ttff_ : ttff) std::cout << ttff_ << " "; std::cout << std::endl; std::cout << "TTFF mean: " << mean << " [s]" << std::endl; if (ttff.size() > 0) { std::cout << "TTFF max: " << *max_ttff << " [s]" << std::endl; std::cout << "TTFF min: " << *min_ttff << " [s]" << std::endl; } std::cout << "TTFF stdev: " << stdev << " [s]" << std::endl; std::cout << "Operating System: " << std::string(HOST_SYSTEM) << std::endl; std::cout << "Navigation mode: " << "3D" << std::endl; if(source.compare("UHD_Signal_Source")) { std::cout << "Source: File" << std::endl; } else { std::cout << "Source: Live" << std::endl; } std::cout << "---------------------------" << std::endl; } TEST_F(TTFF_GPS_L1_CA_Test, ColdStart) { unsigned int num_measurements = 0; config_1(); // Ensure Cold Start config->set_property("GNSS-SDR.SUPL_gps_enabled", "false"); config->set_property("GNSS-SDR.SUPL_read_gps_assistance_xml", "false"); config_2(); // Ensure Cold Start config2->set_property("GNSS-SDR.SUPL_gps_enabled", "false"); config2->set_property("GNSS-SDR.SUPL_read_gps_assistance_xml", "false"); config2->set_property("PVT.flag_rtcm_server", "false"); for(int n = 0; n < FLAGS_num_measurements; n++) { // Create a new ControlThread object with a smart pointer std::shared_ptr control_thread; if(FLAGS_config_file_ttff.empty()) { control_thread = std::make_shared(config); } else { control_thread = std::make_shared(config2); } // record startup time struct timeval tv; gettimeofday(&tv, NULL); long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; std::cout << "Starting measurement " << num_measurements + 1 << " / " << FLAGS_num_measurements << std::endl; // start receiver try { control_thread->run(); } catch( boost::exception & e ) { std::cout << "Boost exception: " << boost::diagnostic_information(e); } catch(std::exception const& ex) { std::cout << "STD exception: " << ex.what(); } // stop clock gettimeofday(&tv, NULL); long long int end = tv.tv_sec * 1000000 + tv.tv_usec; double ttff = static_cast(end - begin) / 1000000.0; std::shared_ptr flowgraph = control_thread->flowgraph(); EXPECT_FALSE(flowgraph->running()); num_measurements = num_measurements + 1; std::cout << "Just finished measurement " << num_measurements << ", which took " << ttff << " seconds." << std::endl; if(n < FLAGS_num_measurements - 1) { std::srand(std::time(0)); // use current time as seed for random generator int random_variable = std::rand(); float random_variable_0_1 = static_cast(random_variable) / static_cast( RAND_MAX ); int random_delay_s = static_cast(random_variable_0_1 * 25.0); std::cout << "Waiting a random amount of time (from 5 to 30 s) to start a new measurement... " << std::endl; std::cout << "This time will wait " << random_delay_s + 5 << " s." << std::endl << std::endl; std::this_thread::sleep_until(std::chrono::system_clock::now() + std::chrono::seconds(5) + std::chrono::seconds(random_delay_s)); } } // Print TTFF report if(FLAGS_config_file_ttff.empty()) { print_TTFF_report(TTFF_v, config); } else { print_TTFF_report(TTFF_v, config2); } std::this_thread::sleep_until(std::chrono::system_clock::now() + std::chrono::seconds(5)); //let the USRP some time to rest before the next test } TEST_F(TTFF_GPS_L1_CA_Test, HotStart) { unsigned int num_measurements = 0; TTFF_v.clear(); config_1(); // Ensure Hot Start config->set_property("GNSS-SDR.SUPL_gps_enabled", "true"); config->set_property("GNSS-SDR.SUPL_read_gps_assistance_xml", "true"); config_2(); // Ensure Hot Start config2->set_property("GNSS-SDR.SUPL_gps_enabled", "true"); config2->set_property("GNSS-SDR.SUPL_read_gps_assistance_xml", "true"); config2->set_property("PVT.flag_rtcm_server", "false"); for(int n = 0; n < FLAGS_num_measurements; n++) { // Create a new ControlThread object with a smart pointer std::shared_ptr control_thread; if(FLAGS_config_file_ttff.empty()) { control_thread = std::make_shared(config); } else { control_thread = std::make_shared(config2); } // record startup time struct timeval tv; gettimeofday(&tv, NULL); long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; std::cout << "Starting measurement " << num_measurements + 1 << " / " << FLAGS_num_measurements << std::endl; // start receiver try { control_thread->run(); } catch( boost::exception & e ) { std::cout << "Boost exception: " << boost::diagnostic_information(e); } catch(std::exception const& ex) { std::cout << "STD exception: " << ex.what(); } // stop clock gettimeofday(&tv, NULL); long long int end = tv.tv_sec * 1000000 + tv.tv_usec; double ttff = static_cast(end - begin) / 1000000.0; std::shared_ptr flowgraph = control_thread->flowgraph(); EXPECT_FALSE(flowgraph->running()); num_measurements = num_measurements + 1; std::cout << "Just finished measurement " << num_measurements << ", which took " << ttff << " seconds." << std::endl; if(n < FLAGS_num_measurements - 1) { std::srand(std::time(0)); // use current time as seed for random generator int random_variable = std::rand(); float random_variable_0_1 = static_cast(random_variable) / static_cast( RAND_MAX ); int random_delay_s = static_cast(random_variable_0_1 * 25.0); std::cout << "Waiting a random amount of time (from 5 to 30 s) to start new measurement... " << std::endl; std::cout << "This time will wait " << random_delay_s + 5 << " s." << std::endl << std::endl; std::this_thread::sleep_until(std::chrono::system_clock::now() + std::chrono::seconds(5) + std::chrono::seconds(random_delay_s)); } } // Print TTFF report if(FLAGS_config_file_ttff.empty()) { print_TTFF_report(TTFF_v, config); } else { print_TTFF_report(TTFF_v, config2); } } int main(int argc, char **argv) { std::cout << "Running Time-To-First-Fix test..." << std::endl; int res = 0; TTFF_v.clear(); try { testing::InitGoogleTest(&argc, argv); } catch(...) {} // catch the "testing::internal::::ClassUniqueToAlwaysTrue" from gtest google::ParseCommandLineFlags(&argc, &argv, true); google::InitGoogleLogging(argv[0]); // Start queue thread std::thread receive_msg_thread(receive_msg); // Run the Tests try { res = RUN_ALL_TESTS(); } catch(...) { LOG(WARNING) << "Unexpected catch"; } // Terminate the queue thread key_t sysv_msg_key; int sysv_msqid; sysv_msg_key = 1101; int msgflg = IPC_CREAT | 0666; if ((sysv_msqid = msgget(sysv_msg_key, msgflg )) == -1) { std::cout << "GNSS-SDR can not create message queues!" << std::endl; exit(1); } ttff_msgbuf msg; msg.mtype = 1; msg.ttff = -1; int msgsend_size; msgsend_size = sizeof(msg.ttff); msgsnd(sysv_msqid, &msg, msgsend_size, IPC_NOWAIT); receive_msg_thread.join(); msgctl(sysv_msqid, IPC_RMID, NULL); google::ShutDownCommandLineFlags(); return res; } gnss-sdr-0.0.9/src/tests/test_main.cc000066400000000000000000000147111305042567700175200ustar00rootroot00000000000000/*! * \file test_main.cc * \brief This file implements all system tests. * \author Carles Fernandez-Prades, 2012. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include #include #include "concurrent_queue.h" #include "concurrent_map.h" #include "control_thread.h" #include "gps_navigation_message.h" #include "gps_ephemeris.h" #include "gps_cnav_ephemeris.h" #include "gps_almanac.h" #include "gps_iono.h" #include "gps_cnav_iono.h" #include "gps_utc_model.h" #include "galileo_ephemeris.h" #include "galileo_almanac.h" #include "galileo_iono.h" #include "galileo_utc_model.h" #include "sbas_ephemeris.h" #include "sbas_telemetry_data.h" #include "sbas_ionospheric_correction.h" #include "sbas_satellite_correction.h" #include "sbas_time.h" using google::LogMessage; DECLARE_string(log_dir); #include "unit-tests/arithmetic/complex_carrier_test.cc" #include "unit-tests/arithmetic/conjugate_test.cc" #include "unit-tests/arithmetic/magnitude_squared_test.cc" #include "unit-tests/arithmetic/multiply_test.cc" #include "unit-tests/arithmetic/code_generation_test.cc" #include "unit-tests/arithmetic/fft_length_test.cc" #include "unit-tests/control-plane/file_configuration_test.cc" #include "unit-tests/control-plane/in_memory_configuration_test.cc" #include "unit-tests/control-plane/control_message_factory_test.cc" #include "unit-tests/control-plane/control_thread_test.cc" #include "unit-tests/control-plane/gnss_flowgraph_test.cc" #include "unit-tests/control-plane/string_converter_test.cc" #include "unit-tests/control-plane/gnss_block_factory_test.cc" #include "unit-tests/signal-processing-blocks/sources/file_signal_source_test.cc" #include "unit-tests/signal-processing-blocks/sources/gnss_sdr_valve_test.cc" #include "unit-tests/signal-processing-blocks/adapter/pass_through_test.cc" #include "unit-tests/signal-processing-blocks/filter/fir_filter_test.cc" #include "unit-tests/signal-processing-blocks/resampler/direct_resampler_conditioner_cc_test.cc" #include "unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test.cc" #include "unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_gsoc2013_test.cc" #include "unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_quicksync_acquisition_gsoc2014_test.cc" #include "unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_tong_acquisition_gsoc2013_test.cc" #include "unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_test.cc" #include "unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc_test.cc" #include "unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc2013_test.cc" #include "unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_8ms_ambiguous_acquisition_gsoc2013_test.cc" #include "unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_tong_ambiguous_acquisition_gsoc2013_test.cc" #include "unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_cccwsr_ambiguous_acquisition_gsoc2013_test.cc" #include "unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_quicksync_ambiguous_acquisition_gsoc2014_test.cc" #include "unit-tests/signal-processing-blocks/acquisition/galileo_e5a_pcps_acquisition_gsoc2014_gensource_test.cc" //#include "unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_multithread_acquisition_gsoc2013_test.cc" #if OPENCL_BLOCKS_TEST #include "unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_opencl_acquisition_gsoc2013_test.cc" #endif #include "unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc" #include "unit-tests/signal-processing-blocks/tracking/galileo_e5a_tracking_test.cc" #include "unit-tests/signal-processing-blocks/tracking/tracking_loop_filter_test.cc" #include "unit-tests/signal-processing-blocks/tracking/cpu_multicorrelator_test.cc" #if CUDA_BLOCKS_TEST #include "unit-tests/signal-processing-blocks/tracking/gpu_multicorrelator_test.cc" #endif #include "unit-tests/signal-processing-blocks/pvt/rtcm_test.cc" #include "unit-tests/signal-processing-blocks/pvt/rtcm_printer_test.cc" #include "unit-tests/signal-processing-blocks/pvt/rinex_printer_test.cc" #if EXTRA_TESTS #include "unit-tests/signal-processing-blocks/acquisition/gps_l2_m_pcps_acquisition_test.cc" #include "unit-tests/signal-processing-blocks/tracking/gps_l2_m_dll_pll_tracking_test.cc" #if MODERN_ARMADILLO #include "unit-tests/signal-processing-blocks/tracking/gps_l1_ca_dll_pll_tracking_test.cc" #include "unit-tests/signal-processing-blocks/telemetry_decoder/gps_l1_ca_telemetry_decoder_test.cc" #endif #endif // For GPS NAVIGATION (L1) concurrent_queue global_gps_acq_assist_queue; concurrent_map global_gps_acq_assist_map; int main(int argc, char **argv) { std::cout << "Running GNSS-SDR Tests..." << std::endl; int res = 0; try { testing::InitGoogleTest(&argc, argv); } catch(...) {} // catch the "testing::internal::::ClassUniqueToAlwaysTrue" from gtest google::ParseCommandLineFlags(&argc, &argv, true); google::InitGoogleLogging(argv[0]); try { res = RUN_ALL_TESTS(); } catch(...) { LOG(WARNING) << "Unexpected catch"; } google::ShutDownCommandLineFlags(); return res; } gnss-sdr-0.0.9/src/tests/unit-tests/000077500000000000000000000000001305042567700173415ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/arithmetic/000077500000000000000000000000001305042567700214725ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/arithmetic/code_generation_test.cc000066400000000000000000000132251305042567700261700ustar00rootroot00000000000000/*! * \file code_generation_test.cc * \brief This file implements tests for the generation of complex exponentials. * \author Carles Fernandez-Prades, 2014. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include "gps_sdr_signal_processing.h" #include "gnss_signal_processing.h" TEST(CodeGenGPSL1_Test, CodeGeneration) { std::complex* _dest = new std::complex[1023]; signed int _prn = 1; unsigned int _chip_shift = 4; int iterations = 1000; struct timeval tv; gettimeofday(&tv, NULL); long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; for(int i = 0; i < iterations; i++) { gps_l1_ca_code_gen_complex( _dest, _prn, _chip_shift); } delete[] _dest; gettimeofday(&tv, NULL); long long int end = tv.tv_sec * 1000000 + tv.tv_usec; ASSERT_LE(0, end - begin); std::cout << "Generation completed in " << (end - begin) << " microseconds" << std::endl; /* std::complex* _dest2 = new std::complex[1023];gettimeofday(&tv, NULL); long long int begin2 = tv.tv_sec * 1000000 + tv.tv_usec; for(int i = 0; i < iterations; i++) { gps_l1_ca_code_gen_complex2( _dest2, _prn, _chip_shift); } gettimeofday(&tv, NULL); long long int end2 = tv.tv_sec * 1000000 + tv.tv_usec; std::cout << "Generation 2 completed in " << (end2 - begin2) << " microseconds" << std::endl; for (int j=0; j<1023;j++) { if(_dest[j] != _dest2[j]) std::cout << "Error!" << std::endl; } delete _dest2; */ } TEST(CodeGenGPSL1Sampled_Test, CodeGeneration) { signed int _prn = 1; unsigned int _chip_shift = 4; double _fs = 8000000; const signed int _codeFreqBasis = 1023000; //Hz const signed int _codeLength = 1023; int _samplesPerCode = round(_fs / (double)(_codeFreqBasis / _codeLength)); std::complex* _dest = new std::complex[_samplesPerCode]; int iterations = 1000; struct timeval tv; gettimeofday(&tv, NULL); long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; for(int i = 0; i < iterations; i++) { gps_l1_ca_code_gen_complex_sampled( _dest, _prn, _fs, _chip_shift); } gettimeofday(&tv, NULL); long long int end = tv.tv_sec * 1000000 + tv.tv_usec; delete[] _dest; ASSERT_LE(0, end - begin); std::cout << "Generation completed in " << (end - begin) << " microseconds" << std::endl; /* std::complex* _dest2 = new std::complex[_samplesPerCode]; gettimeofday(&tv, NULL); long long int begin2 = tv.tv_sec * 1000000 + tv.tv_usec; for(int i = 0; i < iterations; i++) { gps_l1_ca_code_gen_complex_sampled2( _dest2, _prn, _fs, _chip_shift); } gettimeofday(&tv, NULL); long long int end2 = tv.tv_sec * 1000000 + tv.tv_usec; std::cout << "Generation completed in " << (end2 - begin2) << " microseconds (New)" << std::endl; for (int j=0; j<_samplesPerCode;j++) { if(_dest[j] != _dest2[j]) std::cout << "Error!" << std::endl; } delete[] _dest2; */ } TEST(ComplexCarrier_Test, CodeGeneration) { double _fs = 8000000; double _f = 4000; const signed int _codeFreqBasis = 1023000; //Hz const signed int _codeLength = 1023; int _samplesPerCode = round(_fs / (double)(_codeFreqBasis / _codeLength)); std::complex* _dest = new std::complex[_samplesPerCode]; int iterations = 1000; struct timeval tv; gettimeofday(&tv, NULL); long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; for(int i = 0; i < iterations; i++) { complex_exp_gen_conj( _dest, _f, _fs, _samplesPerCode); } gettimeofday(&tv, NULL); long long int end = tv.tv_sec * 1000000 + tv.tv_usec; delete[] _dest; ASSERT_LE(0, end - begin); std::cout << "Carrier generation completed in " << (end - begin) << " microseconds" << std::endl; /* std::complex* _dest2 = new std::complex[_samplesPerCode]; gettimeofday(&tv, NULL); long long int begin2 = tv.tv_sec * 1000000 + tv.tv_usec; for(int i = 0; i < iterations; i++) { complex_exp_gen_conj2( _dest2, _f, _fs, _samplesPerCode); } gettimeofday(&tv, NULL); long long int end2 = tv.tv_sec * 1000000 + tv.tv_usec; std::cout << "Carrier generation completed in " << (end2 - begin2) << " microseconds (New)" << std::endl; for (int j=0; j<_samplesPerCode;j++) { if(std::abs(_dest[j] - _dest2[j]) > 0.1) std::cout << "Error!" << std::endl; } std::cout << _dest[10] << "and " << _dest2[10] << std::endl; delete[] _dest2;*/ } gnss-sdr-0.0.9/src/tests/unit-tests/arithmetic/complex_carrier_test.cc000066400000000000000000000120601305042567700262150ustar00rootroot00000000000000/*! * \file complex_carrier_test.cc * \brief This file implements tests for the generation of complex exponentials. * \author Carles Fernandez-Prades, 2014. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include "gnss_signal_processing.h" DEFINE_int32(size_carrier_test, 100000, "Size of the arrays used for complex carrier testing"); TEST(ComplexCarrier_Test, StandardComplexImplementation) { // Dynamic allocation creates new usable space on the program STACK // (an area of RAM specifically allocated to the program) std::complex* output = new std::complex[FLAGS_size_carrier_test]; const double _f = 2000; const double _fs = 2000000; const double phase_step = (double)((GPS_TWO_PI * _f) / _fs); double phase = 0; struct timeval tv; gettimeofday(&tv, NULL); long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; for(int i = 0; i < FLAGS_size_carrier_test; i++) { output[i] = std::complex(cos(phase), sin(phase)); phase += phase_step; } gettimeofday(&tv, NULL); long long int end = tv.tv_sec * 1000000 + tv.tv_usec; std::cout << "A " << FLAGS_size_carrier_test << "-length complex carrier in standard C++ (dynamic allocation) generated in " << (end - begin) << " microseconds" << std::endl; std::complex expected(1,0); std::vector> mag(FLAGS_size_carrier_test); for(int i = 0; i < FLAGS_size_carrier_test; i++) { mag[i] = output[i] * std::conj(output[i]); } delete[] output; for(int i = 0; i < FLAGS_size_carrier_test; i++) { ASSERT_FLOAT_EQ(std::norm(expected), std::norm(mag[i])); } ASSERT_LE(0, end - begin); } TEST(ComplexCarrier_Test, C11ComplexImplementation) { // declaration: load data onto the program data segment std::vector> output(FLAGS_size_carrier_test); const double _f = 2000; const double _fs = 2000000; const double phase_step = (double)((GPS_TWO_PI * _f) / _fs); double phase = 0; struct timeval tv; gettimeofday(&tv, NULL); long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; for (int i = 0; i < FLAGS_size_carrier_test; i++) { output[i] = std::complex(cos(phase), sin(phase)); phase += phase_step; } gettimeofday(&tv, NULL); long long int end = tv.tv_sec * 1000000 + tv.tv_usec; std::cout << "A " << FLAGS_size_carrier_test << "-length complex carrier in standard C++ (declaration) generated in " << (end - begin) << " microseconds" << std::endl; ASSERT_LE(0, end - begin); std::complex expected(1,0); std::vector> mag(FLAGS_size_carrier_test); for(int i = 0; i < FLAGS_size_carrier_test; i++) { mag[i] = output[i] * std::conj(output[i]); ASSERT_FLOAT_EQ(std::norm(expected), std::norm(mag[i])); } } TEST(ComplexCarrier_Test, OwnComplexImplementation) { std::complex* output = new std::complex[FLAGS_size_carrier_test]; double _f = 2000; double _fs = 2000000; struct timeval tv; gettimeofday(&tv, NULL); long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; complex_exp_gen(output, _f, _fs, (unsigned int)FLAGS_size_carrier_test); gettimeofday(&tv, NULL); long long int end = tv.tv_sec * 1000000 + tv.tv_usec; std::cout << "A " << FLAGS_size_carrier_test << "-length complex carrier using fixed point generated in " << (end - begin) << " microseconds" << std::endl; std::complex expected(1,0); std::vector> mag(FLAGS_size_carrier_test); for(int i = 0; i < FLAGS_size_carrier_test; i++) { mag[i] = output[i] * std::conj(output[i]); } delete[] output; for(int i = 0; i < FLAGS_size_carrier_test; i++) { ASSERT_NEAR(std::norm(expected), std::norm(mag[i]), 0.0001); } ASSERT_LE(0, end - begin); } gnss-sdr-0.0.9/src/tests/unit-tests/arithmetic/conjugate_test.cc000066400000000000000000000115111305042567700250160ustar00rootroot00000000000000/*! * \file conjugate_test.cc * \brief This file implements tests for conjugation of long arrays. * \author Carles Fernandez-Prades, 2012. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include DEFINE_int32(size_conjugate_test, 100000, "Size of the arrays used for conjugate testing"); TEST(Conjugate_Test, StandardCComplexImplementation) { std::complex* input = new std::complex[FLAGS_size_conjugate_test]; std::complex* output = new std::complex[FLAGS_size_conjugate_test]; memset(input, 0, sizeof(std::complex) * FLAGS_size_conjugate_test); struct timeval tv; gettimeofday(&tv, NULL); long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; for(int i = 0; i < FLAGS_size_conjugate_test; i++) { output[i] = std::conj(input[i]); } gettimeofday(&tv, NULL); long long int end = tv.tv_sec * 1000000 + tv.tv_usec; std::cout << "Conjugate of a " << FLAGS_size_conjugate_test << "-length complex float vector in standard C finished in " << (end - begin) << " microseconds" << std::endl; delete[] input; delete[] output; ASSERT_LE(0, end - begin); } TEST(Conjugate_Test, C11ComplexImplementation) { const std::vector> input(FLAGS_size_conjugate_test); std::vector> output(FLAGS_size_conjugate_test); struct timeval tv; gettimeofday(&tv, NULL); long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; int pos = 0; for (const auto &item : input) { output[pos++] = std::conj(item); } gettimeofday(&tv, NULL); long long int end = tv.tv_sec * 1000000 + tv.tv_usec; std::cout << "Conjugate of a " << FLAGS_size_conjugate_test << " complex vector (C++11-style) finished in " << (end - begin) << " microseconds" << std::endl; ASSERT_LE(0, end - begin); std::complex expected(0,0); std::complex result(0,0); for (const auto &item : output) { result += item; } ASSERT_EQ(expected, result); } TEST(Conjugate_Test, ArmadilloComplexImplementation) { arma::cx_fvec input(FLAGS_size_conjugate_test, arma::fill::zeros); arma::cx_fvec output(FLAGS_size_conjugate_test); struct timeval tv; gettimeofday(&tv, NULL); long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; output = arma::conj(input); gettimeofday(&tv, NULL); long long int end = tv.tv_sec * 1000000 + tv.tv_usec; std::cout << "Conjugate of a " << FLAGS_size_conjugate_test << "-length complex float Armadillo vector finished in " << (end - begin) << " microseconds" << std::endl; ASSERT_LE(0, end - begin); } TEST(Conjugate_Test, VolkComplexImplementation) { std::complex* input = static_cast*>(volk_gnsssdr_malloc(FLAGS_size_conjugate_test * sizeof(std::complex), volk_gnsssdr_get_alignment())); std::complex* output = static_cast*>(volk_gnsssdr_malloc(FLAGS_size_conjugate_test * sizeof(std::complex), volk_gnsssdr_get_alignment())); memset(input, 0, sizeof(std::complex) * FLAGS_size_conjugate_test); struct timeval tv; gettimeofday(&tv, NULL); long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; volk_32fc_conjugate_32fc(output, input, FLAGS_size_conjugate_test); gettimeofday(&tv, NULL); long long int end = tv.tv_sec * 1000000 + tv.tv_usec; std::cout << "Conjugate of a "<< FLAGS_size_conjugate_test << "-length complex float vector using VOLK finished in " << (end - begin) << " microseconds" << std::endl; ASSERT_LE(0, end - begin); volk_gnsssdr_free(input); volk_gnsssdr_free(output); } gnss-sdr-0.0.9/src/tests/unit-tests/arithmetic/fft_length_test.cc000066400000000000000000000051741305042567700251670ustar00rootroot00000000000000/*! * \file fft_length_test.cc * \brief This file implements timing tests for the FFT. * \author Carles Fernandez-Prades, 2016. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2016 (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 . * * ------------------------------------------------------------------------- */ #include #include DEFINE_int32(fft_iterations_test, 1000, "Number of averaged iterations in FFT length timing test"); TEST(FFT_Length_Test, MeasureExecutionTime) { unsigned int d_fft_size; struct timeval tv; unsigned int fft_sizes [18] = { 1000, 1024, 1960, 2000, 2048, 4000, 4096, 4725, 8000, 8192, 10368, 12000, 16000, 16384, 27000, 32768, 50000, 65536 }; double execution_times [18]; EXPECT_NO_THROW( for(int i = 0; i < 18; i++) { gr::fft::fft_complex* d_fft; d_fft_size = fft_sizes[i]; d_fft = new gr::fft::fft_complex(d_fft_size, true); std::fill_n( d_fft->get_inbuf(), d_fft_size, gr_complex( 0.0, 0.0 ) ); gettimeofday(&tv, NULL); long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; for(int k = 0; k < FLAGS_fft_iterations_test; k++) { d_fft->execute(); } gettimeofday(&tv, NULL); long long int end = tv.tv_sec * 1000000 + tv.tv_usec; execution_times[i] = static_cast(end - begin) / (1000000.0 * static_cast(FLAGS_fft_iterations_test)); std::cout << "FFT execution time for length=" << d_fft_size << " : " << execution_times[i] << " [s]" << std::endl; delete d_fft; } ); } gnss-sdr-0.0.9/src/tests/unit-tests/arithmetic/magnitude_squared_test.cc000066400000000000000000000117671305042567700265550ustar00rootroot00000000000000/*! * \file magnitude_squared_test.cc * \brief This file implements tests for the computation of magnitude squared * in long arrays. * \author Carles Fernandez-Prades, 2014. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include DEFINE_int32(size_magnitude_test, 100000, "Size of the arrays used for magnitude testing"); TEST(MagnitudeSquared_Test, StandardCComplexImplementation) { std::complex* input = new std::complex[FLAGS_size_magnitude_test]; float* output = new float[FLAGS_size_magnitude_test]; unsigned int number = 0; struct timeval tv; gettimeofday(&tv, NULL); long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; for(number = 0; number < (unsigned int)FLAGS_size_magnitude_test; number++) { output[number] = (input[number].real() * input[number].real()) + (input[number].imag() * input[number].imag()); } gettimeofday(&tv, NULL); long long int end = tv.tv_sec * 1000000 + tv.tv_usec; std::cout << "The squared magnitude of a " << FLAGS_size_magnitude_test << "-length vector in standard C computed in " << (end - begin) << " microseconds" << std::endl; delete[] input; delete[] output; ASSERT_LE(0, end - begin); } TEST(MagnitudeSquared_Test, C11ComplexImplementation) { const std::vector> input(FLAGS_size_magnitude_test); std::vector output(FLAGS_size_magnitude_test); struct timeval tv; int pos = 0; gettimeofday(&tv, NULL); long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; for (const auto &item : input) { output[pos++] = std::norm(item); } gettimeofday(&tv, NULL); long long int end = tv.tv_sec * 1000000 + tv.tv_usec; std::cout << "The squared magnitude of a " << FLAGS_size_magnitude_test << " complex vector (C++11-style) finished in " << (end - begin) << " microseconds" << std::endl; ASSERT_LE(0, end - begin); std::complex expected(0,0); std::complex result(0,0); for (const auto &item : output) { result += item; } ASSERT_EQ(expected, result); } TEST(MagnitudeSquared_Test, ArmadilloComplexImplementation) { arma::cx_fvec input(FLAGS_size_magnitude_test, arma::fill::zeros); arma::fvec output(FLAGS_size_magnitude_test); struct timeval tv; gettimeofday(&tv, NULL); long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; output = arma::abs(arma::square(input)); gettimeofday(&tv, NULL); long long int end = tv.tv_sec * 1000000 + tv.tv_usec; std::cout << "The squared magnitude of a " << FLAGS_size_magnitude_test << "-length vector using Armadillo computed in " << (end - begin) << " microseconds" << std::endl; ASSERT_LE(0, end - begin); } TEST(MagnitudeSquared_Test, VolkComplexImplementation) { std::complex* input = static_cast*>(volk_gnsssdr_malloc(FLAGS_size_magnitude_test * sizeof(std::complex), volk_gnsssdr_get_alignment())); memset(input, 0, sizeof(std::complex) * FLAGS_size_magnitude_test); float* output = static_cast(volk_gnsssdr_malloc(FLAGS_size_magnitude_test * sizeof(float), volk_gnsssdr_get_alignment())); struct timeval tv; gettimeofday(&tv, NULL); long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; volk_32fc_magnitude_squared_32f(output, input, static_cast(FLAGS_size_magnitude_test)); gettimeofday(&tv, NULL); long long int end = tv.tv_sec * 1000000 + tv.tv_usec; std::cout << "The squared magnitude of a " << FLAGS_size_magnitude_test << "-length vector using VOLK computed in " << (end - begin) << " microseconds" << std::endl; volk_gnsssdr_free(input); volk_gnsssdr_free(output); ASSERT_LE(0, end - begin); } // volk_32f_accumulator_s32f(&d_input_power, d_magnitude, d_fft_size); gnss-sdr-0.0.9/src/tests/unit-tests/arithmetic/multiply_test.cc000066400000000000000000000167411305042567700247300ustar00rootroot00000000000000/*! * \file multiply_test.cc * \brief This file implements tests for the multiplication of long arrays. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Carles Fernandez-Prades, 2012. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include DEFINE_int32(size_multiply_test, 100000, "Size of the arrays used for multiply testing"); TEST(Multiply_Test, StandardCDoubleImplementation) { double* input = new double[FLAGS_size_multiply_test]; double* output = new double[FLAGS_size_multiply_test]; memset(input, 0, sizeof(double) * FLAGS_size_multiply_test); struct timeval tv; gettimeofday(&tv, NULL); long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; for(int i = 0; i < FLAGS_size_multiply_test; i++) { output[i] = input[i] * input[i]; } gettimeofday(&tv, NULL); long long int end = tv.tv_sec * 1000000 + tv.tv_usec; std::cout << "Element-wise multiplication of " << FLAGS_size_multiply_test << " doubles in standard C finished in " << (end - begin) << " microseconds" << std::endl; double acc = 0; double expected = 0; for(int i = 0; i < FLAGS_size_multiply_test; i++) { acc += output[i]; } delete[] input; delete[] output; ASSERT_LE(0, end - begin); ASSERT_EQ(expected, acc); } TEST(Multiply_Test, ArmadilloImplementation) { arma::vec input(FLAGS_size_multiply_test, arma::fill::zeros); arma::vec output(FLAGS_size_multiply_test); struct timeval tv; gettimeofday(&tv, NULL); long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; output = input % input; gettimeofday(&tv, NULL); long long int end = tv.tv_sec * 1000000 + tv.tv_usec; std::cout << "Element-wise multiplication of " << FLAGS_size_multiply_test << "-length double Armadillo vectors finished in " << (end - begin) << " microseconds" << std::endl; ASSERT_LE(0, end - begin); ASSERT_EQ(0, arma::norm(output,2)); } TEST(Multiply_Test, StandardCComplexImplementation) { std::complex* input = new std::complex[FLAGS_size_multiply_test]; std::complex* output = new std::complex[FLAGS_size_multiply_test]; memset(input, 0, sizeof(std::complex) * FLAGS_size_multiply_test); struct timeval tv; gettimeofday(&tv, NULL); long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; for(int i = 0; i < FLAGS_size_multiply_test; i++) { output[i] = input[i] * input[i]; } gettimeofday(&tv, NULL); long long int end = tv.tv_sec * 1000000 + tv.tv_usec; std::cout << "Element-wise multiplication of " << FLAGS_size_multiply_test << " complex in standard C finished in " << (end - begin) << " microseconds" << std::endl; std::complex expected(0,0); std::complex result(0,0); for(int i = 0; i < FLAGS_size_multiply_test; i++) { result += output[i]; } delete[] input; delete[] output; ASSERT_LE(0, end - begin); ASSERT_EQ(expected, result); } TEST(Multiply_Test, C11ComplexImplementation) { const std::vector> input(FLAGS_size_multiply_test); std::vector> output(FLAGS_size_multiply_test); int pos = 0; struct timeval tv; gettimeofday(&tv, NULL); long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; // Trying a range-based for for (const auto &item : input) { output[pos++] = item * item; } gettimeofday(&tv, NULL); long long int end = tv.tv_sec * 1000000 + tv.tv_usec; std::cout << "Element-wise multiplication of " << FLAGS_size_multiply_test << " complex vector (C++11-style) finished in " << (end - begin) << " microseconds" << std::endl; ASSERT_LE(0, end - begin); std::complex expected(0,0); auto result = std::inner_product(output.begin(), output.end(), output.begin(), expected); ASSERT_EQ(expected, result); } TEST(Multiply_Test, ArmadilloComplexImplementation) { arma::cx_fvec input(FLAGS_size_multiply_test, arma::fill::zeros); arma::cx_fvec output(FLAGS_size_multiply_test); struct timeval tv; gettimeofday(&tv, NULL); long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; output = input % input; gettimeofday(&tv, NULL); long long int end = tv.tv_sec * 1000000 + tv.tv_usec; std::cout << "Element-wise multiplication of " << FLAGS_size_multiply_test << "-length complex float Armadillo vectors finished in " << (end - begin) << " microseconds" << std::endl; ASSERT_LE(0, end - begin); ASSERT_EQ(0, arma::norm(output,2)); } TEST(Multiply_Test, VolkComplexImplementation) { std::complex* input = static_cast*>(volk_gnsssdr_malloc(FLAGS_size_multiply_test * sizeof(std::complex), volk_gnsssdr_get_alignment())); std::complex* output = static_cast*>(volk_gnsssdr_malloc(FLAGS_size_multiply_test * sizeof(std::complex), volk_gnsssdr_get_alignment())); memset(input, 0, sizeof(std::complex) * FLAGS_size_multiply_test); struct timeval tv; gettimeofday(&tv, NULL); long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; volk_32fc_x2_multiply_32fc(output, input, input, FLAGS_size_multiply_test); gettimeofday(&tv, NULL); long long int end = tv.tv_sec * 1000000 + tv.tv_usec; std::cout << "Element-wise multiplication of " << FLAGS_size_multiply_test << "-length complex float vector using VOLK finished in " << (end - begin) << " microseconds" << std::endl; ASSERT_LE(0, end - begin); float* mag = static_cast(volk_gnsssdr_malloc(FLAGS_size_multiply_test * sizeof(float), volk_gnsssdr_get_alignment())); volk_32fc_magnitude_32f(mag, output, FLAGS_size_multiply_test); float* result = new float(0); volk_32f_accumulator_s32f(result, mag, FLAGS_size_multiply_test); // Comparing floating-point numbers is tricky. // Due to round-off errors, it is very unlikely that two floating-points will match exactly. // See http://code.google.com/p/googletest/wiki/AdvancedGuide#Floating-Point_Comparison float expected = 0; ASSERT_FLOAT_EQ(expected, result[0]); volk_gnsssdr_free(input); volk_gnsssdr_free(output); volk_gnsssdr_free(mag); } gnss-sdr-0.0.9/src/tests/unit-tests/control-plane/000077500000000000000000000000001305042567700221165ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/control-plane/control_message_factory_test.cc000066400000000000000000000067421305042567700304100ustar00rootroot00000000000000/*! * \file control message_factory_test.cc * \brief This file implements tests for the ControlMessageFactory. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Carles Fernandez-Prades, 2012. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include "control_message_factory.h" TEST(Control_Message_Factory_Test, GetQueueMessage) { std::shared_ptr factory = std::make_shared(); gr::message::sptr queue_message = factory->GetQueueMessage(0, 2); auto control_messages = factory->GetControlMessages(queue_message); unsigned int expected0 = 0; unsigned int expected2 = 2; EXPECT_EQ(expected0, control_messages->at(0)->who); EXPECT_EQ(expected2, control_messages->at(0)->what); EXPECT_EQ(sizeof(ControlMessage), queue_message->length()); } TEST(Control_Message_Factory_Test, GetControlMessages) { std::shared_ptr factory = std::make_shared(); gr::message::sptr queue_message = gr::message::make(0, 0, 0, sizeof(ControlMessage)); std::shared_ptr control_message = std::make_shared(); control_message->who = 1; control_message->what = 4; memcpy(queue_message->msg(), control_message.get(), sizeof(ControlMessage)); std::shared_ptr>> control_messages = factory->GetControlMessages(queue_message); unsigned int expected1 = 1; unsigned int expected4 = 4; EXPECT_EQ(expected1, control_messages->size()); EXPECT_EQ(expected1, control_messages->at(0)->who); EXPECT_EQ(expected4, control_messages->at(0)->what); } /* TEST(Control_Message_Factory_Test, GetControlMessagesWrongSize) { std::shared_ptr factory = std::make_shared(); std::shared_ptr control_message = std::make_shared(); control_message->who = 1; control_message->what = 4; int another_int = 10; gr::message::sptr queue_message = gr::message::make(0, 0, 0, sizeof(ControlMessage) + sizeof(int)); memcpy(queue_message->msg(), control_message.get(), sizeof(ControlMessage)); memcpy(queue_message->msg() + sizeof(ControlMessage), &another_int, sizeof(int)); std::shared_ptr>> control_messages = factory->GetControlMessages(queue_message); unsigned int expected0 = 0; EXPECT_EQ(expected0, control_messages->size()); } */ gnss-sdr-0.0.9/src/tests/unit-tests/control-plane/control_thread_test.cc000066400000000000000000000252211305042567700264750ustar00rootroot00000000000000/*! * \file control_thread_test.cc * \brief This file implements tests for the ControlThread. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Carles Fernandez-Prades, 2013. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "control_thread.h" #include "in_memory_configuration.h" #include "control_message_factory.h" class Control_Thread_Test: public ::testing::Test { public: static int stop_receiver(); typedef struct { long mtype; // required by SysV message double message; } message_buffer; }; int Control_Thread_Test::stop_receiver() { message_buffer msg_stop; msg_stop.mtype = 1; msg_stop.message = -200.0; int msqid_stop = -1; int msgsend_size = sizeof(msg_stop.message); key_t key_stop = 1102; // wait for the receiver control queue to be created while(((msqid_stop = msgget(key_stop, 0644))) == -1){ } // wait for a couple of seconds std::this_thread::sleep_until(std::chrono::system_clock::now() + std::chrono::seconds(2)); // Stop the receiver msgsnd(msqid_stop, &msg_stop, msgsend_size, IPC_NOWAIT); return 0; } TEST_F(Control_Thread_Test, InstantiateRunControlMessages) { std::shared_ptr config = std::make_shared(); config->set_property("SignalSource.implementation", "File_Signal_Source"); std::string path = std::string(TEST_PATH); std::string file = path + "signal_samples/GSoC_CTTC_capture_2012_07_26_4Msps_4ms.dat"; const char * file_name = file.c_str(); config->set_property("SignalSource.filename", file_name); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.sampling_frequency", "4000000"); config->set_property("SignalSource.repeat", "true"); config->set_property("SignalConditioner.implementation", "Pass_Through"); config->set_property("SignalConditioner.item_type", "gr_complex"); config->set_property("Channels_1C.count", "2"); config->set_property("Channels_1E.count", "0"); config->set_property("Channels.in_acquisition", "1"); config->set_property("Acquisition_1C.implementation", "GPS_L1_CA_PCPS_Acquisition"); config->set_property("Acquisition_1C.threshold", "1"); config->set_property("Acquisition_1C.doppler_max", "5000"); config->set_property("Acquisition_1C.doppler_min", "-5000"); config->set_property("Tracking_1C.implementation", "GPS_L1_CA_DLL_PLL_Tracking"); config->set_property("Tracking_1C.item_type", "gr_complex"); config->set_property("TelemetryDecoder_1C.implementation", "GPS_L1_CA_Telemetry_Decoder"); config->set_property("TelemetryDecoder_1C.item_type", "gr_complex"); config->set_property("Observables.implementation", "GPS_L1_CA_Observables"); config->set_property("Observables.item_type", "gr_complex"); config->set_property("PVT.implementation", "GPS_L1_CA_PVT"); config->set_property("PVT.item_type", "gr_complex"); std::shared_ptr control_thread = std::make_shared(config); gr::msg_queue::sptr control_queue = gr::msg_queue::make(0); std::unique_ptr control_msg_factory(new ControlMessageFactory()); control_queue->handle(control_msg_factory->GetQueueMessage(0,0)); control_queue->handle(control_msg_factory->GetQueueMessage(1,0)); control_queue->handle(control_msg_factory->GetQueueMessage(200,0)); control_thread->set_control_queue(control_queue); try { control_thread->run(); } catch( boost::exception & e ) { std::cout << "Boost exception: " << boost::diagnostic_information(e); } catch(std::exception const& ex) { std::cout << "STD exception: " << ex.what(); } unsigned int expected3 = 3; unsigned int expected1 = 1; EXPECT_EQ(expected3, control_thread->processed_control_messages()); EXPECT_EQ(expected1, control_thread->applied_actions()); } TEST_F(Control_Thread_Test, InstantiateRunControlMessages2) { std::shared_ptr config = std::make_shared(); config->set_property("SignalSource.implementation", "File_Signal_Source"); std::string path = std::string(TEST_PATH); std::string file = path + "signal_samples/GSoC_CTTC_capture_2012_07_26_4Msps_4ms.dat"; const char * file_name = file.c_str(); config->set_property("SignalSource.filename", file_name); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.sampling_frequency", "4000000"); config->set_property("SignalSource.repeat", "true"); config->set_property("SignalConditioner.implementation", "Pass_Through"); config->set_property("SignalConditioner.item_type", "gr_complex"); config->set_property("Channels_1C.count", "4"); config->set_property("Channels_1E.count", "0"); config->set_property("Channels.in_acquisition", "1"); config->set_property("Acquisition_1C.implementation", "GPS_L1_CA_PCPS_Acquisition"); config->set_property("Acquisition_1C.threshold", "1"); config->set_property("Acquisition_1C.doppler_max", "5000"); config->set_property("Acquisition_1C.doppler_min", "-5000"); config->set_property("Tracking_1C.implementation", "GPS_L1_CA_DLL_PLL_C_Aid_Tracking"); config->set_property("Tracking_1C.item_type", "gr_complex"); config->set_property("TelemetryDecoder_1C.implementation", "GPS_L1_CA_Telemetry_Decoder"); config->set_property("TelemetryDecoder_1C.item_type", "gr_complex"); config->set_property("Observables.implementation", "GPS_L1_CA_Observables"); config->set_property("Observables.item_type", "gr_complex"); config->set_property("PVT.implementation", "GPS_L1_CA_PVT"); config->set_property("PVT.item_type", "gr_complex"); std::unique_ptr control_thread2(new ControlThread(config)); gr::msg_queue::sptr control_queue2 = gr::msg_queue::make(0); std::unique_ptr control_msg_factory2(new ControlMessageFactory()); control_queue2->handle(control_msg_factory2->GetQueueMessage(0,0)); control_queue2->handle(control_msg_factory2->GetQueueMessage(2,0)); control_queue2->handle(control_msg_factory2->GetQueueMessage(1,0)); control_queue2->handle(control_msg_factory2->GetQueueMessage(3,0)); control_queue2->handle(control_msg_factory2->GetQueueMessage(200,0)); control_thread2->set_control_queue(control_queue2); try { control_thread2->run(); } catch( boost::exception & e ) { std::cout << "Boost exception: " << boost::diagnostic_information(e); } catch(std::exception const& ex) { std::cout << "STD exception: " << ex.what(); } unsigned int expected5 = 5; unsigned int expected1 = 1; EXPECT_EQ(expected5, control_thread2->processed_control_messages()); EXPECT_EQ(expected1, control_thread2->applied_actions()); } TEST_F(Control_Thread_Test, StopReceiverProgrammatically) { std::shared_ptr config = std::make_shared(); config->set_property("SignalSource.implementation", "File_Signal_Source"); std::string path = std::string(TEST_PATH); std::string file = path + "signal_samples/GSoC_CTTC_capture_2012_07_26_4Msps_4ms.dat"; const char * file_name = file.c_str(); config->set_property("SignalSource.filename", file_name); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.sampling_frequency", "4000000"); config->set_property("SignalSource.repeat", "true"); config->set_property("SignalConditioner.implementation", "Pass_Through"); config->set_property("SignalConditioner.item_type", "gr_complex"); config->set_property("Channels_1C.count", "4"); config->set_property("Channels_1E.count", "0"); config->set_property("Channels.in_acquisition", "1"); config->set_property("Acquisition_1C.implementation", "GPS_L1_CA_PCPS_Acquisition"); config->set_property("Acquisition_1C.threshold", "1"); config->set_property("Acquisition_1C.doppler_max", "5000"); config->set_property("Acquisition_1C.doppler_min", "-5000"); config->set_property("Tracking_1C.implementation", "GPS_L1_CA_DLL_PLL_C_Aid_Tracking"); config->set_property("Tracking_1C.item_type", "gr_complex"); config->set_property("TelemetryDecoder_1C.implementation", "GPS_L1_CA_Telemetry_Decoder"); config->set_property("TelemetryDecoder_1C.item_type", "gr_complex"); config->set_property("Observables.implementation", "GPS_L1_CA_Observables"); config->set_property("Observables.item_type", "gr_complex"); config->set_property("PVT.implementation", "GPS_L1_CA_PVT"); config->set_property("PVT.item_type", "gr_complex"); std::unique_ptr control_thread(new ControlThread(config)); gr::msg_queue::sptr control_queue = gr::msg_queue::make(0); control_thread->set_control_queue(control_queue); std::thread stop_receiver_thread(stop_receiver); try { control_thread->run(); } catch( boost::exception & e ) { std::cout << "Boost exception: " << boost::diagnostic_information(e); } catch(std::exception const& ex) { std::cout << "STD exception: " << ex.what(); } stop_receiver_thread.join(); } gnss-sdr-0.0.9/src/tests/unit-tests/control-plane/file_configuration_test.cc000066400000000000000000000053031305042567700273330ustar00rootroot00000000000000/*! * \file file_configuration_test.cc * \brief This file implements tests for the file_configuration. * \author Carles Fernandez-Prades, 2012. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include "file_configuration.h" TEST(File_Configuration_Test, OverridedProperties) { std::string path = std::string(TEST_PATH); std::string filename = path + "data/config_file_sample.txt"; //std::shared_ptr configuration = std::make_shared(filename); std::unique_ptr configuration(new FileConfiguration(filename)); std::string default_value = "default_value"; std::string value = configuration->property("NotThere", default_value); EXPECT_STREQ("default_value", value.c_str()); configuration->set_property("NotThere", "Yes!"); value = configuration->property("NotThere", default_value); EXPECT_STREQ("Yes!", value.c_str()); } TEST(File_Configuration_Test, LoadFromNonExistentFile) { std::unique_ptr configuration(new FileConfiguration("./i_dont_exist.conf")); std::string default_value = "default_value"; std::string value = configuration->property("whatever.whatever", default_value); EXPECT_STREQ("default_value", value.c_str()); } TEST(File_Configuration_Test, PropertyDoesNotExist) { std::string path = std::string(TEST_PATH); std::string filename = path + "data/config_file_sample.txt"; std::unique_ptr configuration(new FileConfiguration(filename)); std::string default_value = "default_value"; std::string value = configuration->property("whatever.whatever", default_value); EXPECT_STREQ("default_value", value.c_str()); } gnss-sdr-0.0.9/src/tests/unit-tests/control-plane/gnss_block_factory_test.cc000066400000000000000000000425251305042567700273470ustar00rootroot00000000000000/*! * \file gnss_block_factory_test.cc * \brief This class implements a Unit Test for the GNSSBlockFactory class. * \authors

      *
    • Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com *
    • Luis Esteve, 2012. luis(at)epsilon-formacion.com *
    * * This class test the instantiation of all blocks in gnss_block_factory * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include "in_memory_configuration.h" #include "gnss_block_interface.h" #include "acquisition_interface.h" #include "tracking_interface.h" #include "telemetry_decoder_interface.h" #include "observables_interface.h" #include "pvt_interface.h" #include "gnss_block_factory.h" #include "channel.h" TEST(GNSS_Block_Factory_Test, InstantiateFileSignalSource) { std::shared_ptr configuration = std::make_shared(); configuration->set_property("SignalSource.implementation", "File_Signal_Source"); std::string path = std::string(TEST_PATH); std::string filename = path + "signal_samples/GPS_L1_CA_ID_1_Fs_4Msps_2ms.dat"; configuration->set_property("SignalSource.filename", filename); gr::msg_queue::sptr queue = gr::msg_queue::make(0); // Example of a factory as a shared_ptr std::shared_ptr factory = std::make_shared(); // Example of a block as a shared_ptr std::shared_ptr signal_source = factory->GetSignalSource(configuration, queue); EXPECT_STREQ("SignalSource", signal_source->role().c_str()); EXPECT_STREQ("File_Signal_Source", signal_source->implementation().c_str()); } TEST(GNSS_Block_Factory_Test, InstantiateWrongSignalSource) { std::shared_ptr configuration = std::make_shared(); configuration->set_property("SignalSource.implementation", "Pepito"); gr::msg_queue::sptr queue = gr::msg_queue::make(0); // Example of a factory as a unique_ptr std::unique_ptr factory; // Example of a block as a unique_ptr std::unique_ptr signal_source = factory->GetSignalSource(configuration, queue); EXPECT_EQ(nullptr, signal_source); } TEST(GNSS_Block_Factory_Test, InstantiateSignalConditioner) { std::shared_ptr configuration = std::make_shared(); configuration->set_property("SignalConditioner.implementation", "Signal_Conditioner"); std::unique_ptr factory; std::unique_ptr signal_conditioner = factory->GetSignalConditioner(configuration); EXPECT_STREQ("SignalConditioner", signal_conditioner->role().c_str()); EXPECT_STREQ("Signal_Conditioner", signal_conditioner->implementation().c_str()); } TEST(GNSS_Block_Factory_Test, InstantiateFIRFilter) { std::shared_ptr configuration = std::make_shared(); gr::msg_queue::sptr queue = gr::msg_queue::make(0); configuration->set_property("InputFilter.implementation", "Fir_Filter"); configuration->set_property("InputFilter.number_of_taps", "4"); configuration->set_property("InputFilter.number_of_bands", "2"); configuration->set_property("InputFilter.band1_begin", "0.0"); configuration->set_property("InputFilter.band1_end", "0.45"); configuration->set_property("InputFilter.band2_begin", "0.55"); configuration->set_property("InputFilter.band2_end", "1.0"); configuration->set_property("InputFilter.ampl1_begin", "1.0"); configuration->set_property("InputFilter.ampl1_end", "1.0"); configuration->set_property("InputFilter.ampl2_begin", "0.0"); configuration->set_property("InputFilter.ampl2_end", "0.0"); configuration->set_property("InputFilter.band1_error", "1.0"); configuration->set_property("InputFilter.band2_error", "1.0"); configuration->set_property("InputFilter.filter_type", "bandpass"); configuration->set_property("InputFilter.grid_density", "16"); std::unique_ptr factory; std::unique_ptr input_filter = factory->GetBlock(configuration, "InputFilter", "Fir_Filter", 1, 1); EXPECT_STREQ("InputFilter", input_filter->role().c_str()); EXPECT_STREQ("Fir_Filter", input_filter->implementation().c_str()); } TEST(GNSS_Block_Factory_Test, InstantiateFreqXlatingFIRFilter) { std::shared_ptr configuration = std::make_shared(); gr::msg_queue::sptr queue = gr::msg_queue::make(0); configuration->set_property("InputFilter.implementation", "Freq_Xlating_Fir_Filter"); configuration->set_property("InputFilter.number_of_taps", "4"); configuration->set_property("InputFilter.number_of_bands", "2"); configuration->set_property("InputFilter.band1_begin", "0.0"); configuration->set_property("InputFilter.band1_end", "0.45"); configuration->set_property("InputFilter.band2_begin", "0.55"); configuration->set_property("InputFilter.band2_end", "1.0"); configuration->set_property("InputFilter.ampl1_begin", "1.0"); configuration->set_property("InputFilter.ampl1_end", "1.0"); configuration->set_property("InputFilter.ampl2_begin", "0.0"); configuration->set_property("InputFilter.ampl2_end", "0.0"); configuration->set_property("InputFilter.band1_error", "1.0"); configuration->set_property("InputFilter.band2_error", "1.0"); configuration->set_property("InputFilter.filter_type", "bandpass"); configuration->set_property("InputFilter.grid_density", "16"); configuration->set_property("InputFilter.sampling_frequency","4000000"); configuration->set_property("InputFilter.IF","34000"); std::unique_ptr factory; std::unique_ptr input_filter = factory->GetBlock(configuration, "InputFilter", "Freq_Xlating_Fir_Filter", 1, 1); EXPECT_STREQ("InputFilter", input_filter->role().c_str()); EXPECT_STREQ("Freq_Xlating_Fir_Filter", input_filter->implementation().c_str()); } TEST(GNSS_Block_Factory_Test, InstantiateDirectResampler) { std::shared_ptr configuration = std::make_shared(); configuration->set_property("Resampler.implementation", "Direct_Resampler"); std::unique_ptr factory; std::unique_ptr resampler = factory->GetBlock(configuration, "Resampler", "Direct_Resampler", 1, 1); EXPECT_STREQ("Resampler", resampler->role().c_str()); EXPECT_STREQ("Direct_Resampler", resampler->implementation().c_str()); } TEST(GNSS_Block_Factory_Test, InstantiateGpsL1CaPcpsAcquisition) { std::shared_ptr configuration = std::make_shared(); configuration->set_property("Acquisition.implementation", "GPS_L1_CA_PCPS_Acquisition"); std::unique_ptr factory; std::shared_ptr acq_ = factory->GetBlock(configuration, "Acquisition", "GPS_L1_CA_PCPS_Acquisition", 1, 1); std::shared_ptr acquisition = std::dynamic_pointer_cast(acq_); EXPECT_STREQ("Acquisition", acquisition->role().c_str()); EXPECT_STREQ("GPS_L1_CA_PCPS_Acquisition", acquisition->implementation().c_str()); } TEST(GNSS_Block_Factory_Test, InstantiateGpsL1CaPcpsQuickSyncAcquisition) { std::shared_ptr configuration = std::make_shared(); configuration->set_property("Acquisition.implementation", "GPS_L1_CA_PCPS_QuickSync_Acquisition"); std::shared_ptr factory = std::make_shared(); std::shared_ptr acq_ = factory->GetBlock(configuration, "Acquisition", "GPS_L1_CA_PCPS_QuickSync_Acquisition", 1, 1); std::shared_ptr acquisition = std::dynamic_pointer_cast(acq_); EXPECT_STREQ("Acquisition", acquisition->role().c_str()); EXPECT_STREQ("GPS_L1_CA_PCPS_QuickSync_Acquisition", acquisition->implementation().c_str()); } TEST(GNSS_Block_Factory_Test, InstantiateGalileoE1PcpsQuickSyncAmbiguousAcquisition) { std::shared_ptr configuration = std::make_shared(); configuration->set_property("Acquisition.implementation", "Galileo_E1_PCPS_QuickSync_Ambiguous_Acquisition"); std::shared_ptr factory = std::make_shared(); std::shared_ptr acq_ = factory->GetBlock(configuration, "Acquisition", "Galileo_E1_PCPS_QuickSync_Ambiguous_Acquisition", 1, 1); std::shared_ptr acquisition = std::dynamic_pointer_cast(acq_); EXPECT_STREQ("Acquisition", acquisition->role().c_str()); EXPECT_STREQ("Galileo_E1_PCPS_QuickSync_Ambiguous_Acquisition", acquisition->implementation().c_str()); } TEST(GNSS_Block_Factory_Test, InstantiateGalileoE1PcpsAmbiguousAcquisition) { std::shared_ptr configuration = std::make_shared(); configuration->set_property("Acquisition.implementation", "Galileo_E1_PCPS_Ambiguous_Acquisition"); std::unique_ptr factory; std::shared_ptr acq_ = factory->GetBlock(configuration, "Acquisition", "Galileo_E1_PCPS_Ambiguous_Acquisition", 1, 1); std::shared_ptr acquisition = std::dynamic_pointer_cast(acq_); EXPECT_STREQ("Acquisition", acquisition->role().c_str()); EXPECT_STREQ("Galileo_E1_PCPS_Ambiguous_Acquisition", acquisition->implementation().c_str()); } TEST(GNSS_Block_Factory_Test, InstantiateGpsL1CaDllPllCAidTracking) { std::shared_ptr configuration = std::make_shared(); configuration->set_property("Tracking.implementation", "GPS_L1_CA_DLL_PLL_C_Aid_Tracking"); std::unique_ptr factory; std::shared_ptr trk_ = factory->GetBlock(configuration, "Tracking", "GPS_L1_CA_DLL_PLL_C_Aid_Tracking", 1, 1); std::shared_ptr tracking = std::dynamic_pointer_cast(trk_); EXPECT_STREQ("Tracking", tracking->role().c_str()); EXPECT_STREQ("GPS_L1_CA_DLL_PLL_C_Aid_Tracking", tracking->implementation().c_str()); } TEST(GNSS_Block_Factory_Test, InstantiateGpsL1CaDllPllTracking) { std::shared_ptr configuration = std::make_shared(); configuration->set_property("Tracking.implementation", "GPS_L1_CA_DLL_PLL_Tracking"); std::unique_ptr factory; std::shared_ptr trk_ = factory->GetBlock(configuration, "Tracking", "GPS_L1_CA_DLL_PLL_Tracking", 1, 1); std::shared_ptr tracking = std::dynamic_pointer_cast(trk_); EXPECT_STREQ("Tracking", tracking->role().c_str()); EXPECT_STREQ("GPS_L1_CA_DLL_PLL_Tracking", tracking->implementation().c_str()); } TEST(GNSS_Block_Factory_Test, InstantiateGpsL1CaTcpConnectorTracking) { std::shared_ptr configuration = std::make_shared(); configuration->set_property("Tracking.implementation", "GPS_L1_CA_TCP_CONNECTOR_Tracking"); std::unique_ptr factory; std::shared_ptr trk_ = factory->GetBlock(configuration, "Tracking", "GPS_L1_CA_TCP_CONNECTOR_Tracking", 1, 1); std::shared_ptr tracking = std::dynamic_pointer_cast(trk_); EXPECT_STREQ("Tracking", tracking->role().c_str()); EXPECT_STREQ("GPS_L1_CA_TCP_CONNECTOR_Tracking", tracking->implementation().c_str()); } TEST(GNSS_Block_Factory_Test, InstantiateGalileoE1DllPllVemlTracking) { std::shared_ptr configuration = std::make_shared(); configuration->set_property("Tracking.implementation", "Galileo_E1_DLL_PLL_VEML_Tracking"); std::unique_ptr factory; std::shared_ptr trk_ = factory->GetBlock(configuration, "Tracking", "Galileo_E1_DLL_PLL_VEML_Tracking", 1, 1); std::shared_ptr tracking = std::dynamic_pointer_cast(trk_); EXPECT_STREQ("Tracking", tracking->role().c_str()); EXPECT_STREQ("Galileo_E1_DLL_PLL_VEML_Tracking", tracking->implementation().c_str()); } TEST(GNSS_Block_Factory_Test, InstantiateGpsL1CaTelemetryDecoder) { std::shared_ptr configuration = std::make_shared(); configuration->set_property("TelemetryDecoder.implementation", "GPS_L1_CA_Telemetry_Decoder"); std::unique_ptr factory; std::shared_ptr telemetry_decoder = factory->GetBlock(configuration, "TelemetryDecoder", "GPS_L1_CA_Telemetry_Decoder", 1, 1); EXPECT_STREQ("TelemetryDecoder", telemetry_decoder->role().c_str()); EXPECT_STREQ("GPS_L1_CA_Telemetry_Decoder", telemetry_decoder->implementation().c_str()); } TEST(GNSS_Block_Factory_Test, InstantiateChannels) { std::shared_ptr configuration = std::make_shared(); configuration->set_property("Channels_1C.count", "2"); configuration->set_property("Channels_1E.count", "0"); configuration->set_property("Channels.in_acquisition", "2"); configuration->set_property("Tracking_1C.implementation","GPS_L1_CA_DLL_PLL_C_Aid_Tracking"); configuration->set_property("TelemetryDecoder_1C.implementation","GPS_L1_CA_Telemetry_Decoder"); configuration->set_property("Channel0.item_type", "gr_complex"); configuration->set_property("Acquisition_1C.implementation", "GPS_L1_CA_PCPS_Acquisition"); configuration->set_property("Channel1.item_type", "gr_complex"); gr::msg_queue::sptr queue = gr::msg_queue::make(0); std::unique_ptr factory; std::unique_ptr>> channels = std::move(factory->GetChannels(configuration, queue)); EXPECT_EQ((unsigned int) 2, channels->size()); channels->erase(channels->begin(), channels->end()); } TEST(GNSS_Block_Factory_Test, InstantiateObservables) { std::shared_ptr configuration = std::make_shared(); configuration->set_property("Observables.implementation", "Pass_Through"); std::unique_ptr factory; auto observables = factory->GetObservables(configuration); EXPECT_STREQ("Observables", observables->role().c_str()); EXPECT_STREQ("Pass_Through", observables->implementation().c_str()); } TEST(GNSS_Block_Factory_Test, InstantiateGpsL1CaObservables) { std::shared_ptr configuration = std::make_shared(); configuration->set_property("Observables.implementation", "GPS_L1_CA_Observables"); std::unique_ptr factory; std::unique_ptr observables = factory->GetObservables(configuration); EXPECT_STREQ("Observables", observables->role().c_str()); EXPECT_STREQ("GPS_L1_CA_Observables", observables->implementation().c_str()); } TEST(GNSS_Block_Factory_Test, InstantiatePvt) { std::shared_ptr configuration = std::make_shared(); configuration->set_property("PVT.implementation", "Pass_Through"); std::unique_ptr factory; auto pvt_ = factory->GetPVT(configuration); EXPECT_STREQ("PVT", pvt_->role().c_str()); EXPECT_STREQ("Pass_Through", pvt_->implementation().c_str()); } TEST(GNSS_Block_Factory_Test, InstantiateGpsL1CaPvt) { std::shared_ptr configuration = std::make_shared(); configuration->set_property("PVT.implementation", "GPS_L1_CA_PVT"); std::unique_ptr factory; std::shared_ptr pvt_ = factory->GetPVT(configuration); std::shared_ptr pvt = std::dynamic_pointer_cast(pvt_); EXPECT_STREQ("PVT", pvt->role().c_str()); EXPECT_STREQ("GPS_L1_CA_PVT", pvt->implementation().c_str()); } TEST(GNSS_Block_Factory_Test, InstantiateWrongPvt) { std::shared_ptr configuration = std::make_shared(); configuration->set_property("PVT.implementation", "Pepito"); std::unique_ptr factory; std::shared_ptr pvt_ = factory->GetPVT(configuration); std::shared_ptr pvt = std::dynamic_pointer_cast(pvt_); EXPECT_EQ(nullptr, pvt); } gnss-sdr-0.0.9/src/tests/unit-tests/control-plane/gnss_flowgraph_test.cc000066400000000000000000000371101305042567700265110ustar00rootroot00000000000000/*! * \file gnss_flowgraph_test.cc * \brief This file implements tests for a flowgraph * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Carles Fernandez-Prades, 2012. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include "gnss_flowgraph.h" #include "gnss_block_interface.h" #include "in_memory_configuration.h" #include "file_configuration.h" #include "channel.h" #include "acquisition_interface.h" #include "tracking_interface.h" #include "channel_interface.h" #include "pass_through.h" #include "file_signal_source.h" TEST(GNSSFlowgraph, InstantiateConnectStartStopOldNotation) { std::shared_ptr config = std::make_shared(); config->set_property("GNSS-SDR.SUPL_gps_enabled", "false"); config->set_property("SignalSource.sampling_frequency", "4000000"); config->set_property("SignalSource.implementation", "File_Signal_Source"); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.repeat", "true"); std::string path = std::string(TEST_PATH); std::string filename = path + "signal_samples/Galileo_E1_ID_1_Fs_4Msps_8ms.dat"; config->set_property("SignalSource.filename", filename); config->set_property("SignalConditioner.implementation", "Pass_Through"); config->set_property("Channels_1C.count", "1"); config->set_property("Channels.in_acquisition", "1"); config->set_property("Acquisition_1C.implementation", "GPS_L1_CA_PCPS_Acquisition"); config->set_property("Acquisition_1C.threshold", "1"); config->set_property("Acquisition_1C.doppler_max", "5000"); config->set_property("Tracking_1C.implementation", "GPS_L1_CA_DLL_PLL_Tracking"); config->set_property("TelemetryDecoder_1C.implementation", "GPS_L1_CA_Telemetry_Decoder"); config->set_property("Observables.implementation", "GPS_L1_CA_Observables"); config->set_property("PVT.implementation", "GPS_L1_CA_PVT"); std::shared_ptr flowgraph = std::make_shared(config, gr::msg_queue::make(0)); EXPECT_NO_THROW(flowgraph->connect()); EXPECT_TRUE(flowgraph->connected()); EXPECT_NO_THROW(flowgraph->start()); EXPECT_TRUE(flowgraph->running()); flowgraph->stop(); EXPECT_FALSE(flowgraph->running()); } TEST(GNSSFlowgraph, InstantiateConnectStartStop) { std::shared_ptr config = std::make_shared(); config->set_property("SignalSource.sampling_frequency", "4000000"); config->set_property("SignalSource.implementation", "File_Signal_Source"); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.repeat", "true"); std::string path = std::string(TEST_PATH); std::string filename = path + "signal_samples/Galileo_E1_ID_1_Fs_4Msps_8ms.dat"; config->set_property("SignalSource.filename", filename); config->set_property("SignalConditioner.implementation", "Pass_Through"); config->set_property("Channels_1C.count", "8"); config->set_property("Channels.in_acquisition", "1"); config->set_property("Channel.signal", "1C"); config->set_property("Acquisition_1C.implementation", "GPS_L1_CA_PCPS_Acquisition"); config->set_property("Acquisition_1C.threshold", "1"); config->set_property("Acquisition_1C.doppler_max", "5000"); config->set_property("Tracking_1C.implementation", "GPS_L1_CA_DLL_PLL_Tracking"); config->set_property("TelemetryDecoder_1C.implementation", "GPS_L1_CA_Telemetry_Decoder"); config->set_property("Observables.implementation", "GPS_L1_CA_Observables"); config->set_property("PVT.implementation", "GPS_L1_CA_PVT"); std::shared_ptr flowgraph = std::make_shared(config, gr::msg_queue::make(0)); EXPECT_NO_THROW(flowgraph->connect()); EXPECT_TRUE(flowgraph->connected()); EXPECT_NO_THROW(flowgraph->start()); EXPECT_TRUE(flowgraph->running()); flowgraph->stop(); EXPECT_FALSE(flowgraph->running()); } TEST(GNSSFlowgraph, InstantiateConnectStartStopGalileoE1B) { std::shared_ptr config = std::make_shared(); config->set_property("SignalSource.sampling_frequency", "4000000"); config->set_property("SignalSource.implementation", "File_Signal_Source"); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.repeat", "true"); std::string path = std::string(TEST_PATH); std::string filename = path + "signal_samples/Galileo_E1_ID_1_Fs_4Msps_8ms.dat"; config->set_property("SignalSource.filename", filename); config->set_property("SignalConditioner.implementation", "Pass_Through"); config->set_property("Channels_1B.count", "8"); config->set_property("Channels.in_acquisition", "1"); config->set_property("Channel.signal", "1B"); config->set_property("Acquisition_1B.implementation", "Galileo_E1_PCPS_Ambiguous_Acquisition"); config->set_property("Acquisition_1B.threshold", "1"); config->set_property("Acquisition_1B.doppler_max", "5000"); config->set_property("Tracking_1B.implementation", "Galileo_E1_DLL_PLL_VEML_Tracking"); config->set_property("TelemetryDecoder_1B.implementation", "Galileo_E1B_Telemetry_Decoder"); config->set_property("Observables.implementation", "Galileo_E1B_Observables"); config->set_property("PVT.implementation", "GALILEO_E1_PVT"); std::shared_ptr flowgraph = std::make_shared(config, gr::msg_queue::make(0)); EXPECT_NO_THROW(flowgraph->connect()); EXPECT_TRUE(flowgraph->connected()); EXPECT_NO_THROW(flowgraph->start()); EXPECT_TRUE(flowgraph->running()); flowgraph->stop(); EXPECT_FALSE(flowgraph->running()); } TEST(GNSSFlowgraph, InstantiateConnectStartStopHybrid) { std::shared_ptr config = std::make_shared(); config->set_property("SignalSource.sampling_frequency", "4000000"); config->set_property("SignalSource.implementation", "File_Signal_Source"); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.repeat", "true"); std::string path = std::string(TEST_PATH); std::string filename = path + "signal_samples/Galileo_E1_ID_1_Fs_4Msps_8ms.dat"; config->set_property("SignalSource.filename", filename); config->set_property("SignalConditioner.implementation", "Pass_Through"); config->set_property("Channels_1C.count", "8"); config->set_property("Channels_1B.count", "8"); config->set_property("Channels.in_acquisition", "1"); config->set_property("Acquisition_1C0.implementation", "GPS_L1_CA_PCPS_Acquisition"); config->set_property("Acquisition_1C0.threshold", "1"); config->set_property("Acquisition_1C0.doppler_max", "5000"); config->set_property("Acquisition_1C1.implementation", "GPS_L1_CA_PCPS_Acquisition"); config->set_property("Acquisition_1C1.threshold", "1"); config->set_property("Acquisition_1C1.doppler_max", "5000"); config->set_property("Acquisition_1C2.implementation", "GPS_L1_CA_PCPS_Acquisition"); config->set_property("Acquisition_1C2.threshold", "1"); config->set_property("Acquisition_1C2.doppler_max", "5000"); config->set_property("Acquisition_1C3.implementation", "GPS_L1_CA_PCPS_Acquisition"); config->set_property("Acquisition_1C3.threshold", "1"); config->set_property("Acquisition_1C3.doppler_max", "5000"); config->set_property("Acquisition_1C4.implementation", "GPS_L1_CA_PCPS_Acquisition"); config->set_property("Acquisition_1C4.threshold", "1"); config->set_property("Acquisition_1C4.doppler_max", "5000"); config->set_property("Acquisition_1C5.implementation", "GPS_L1_CA_PCPS_Acquisition"); config->set_property("Acquisition_1C5.threshold", "1"); config->set_property("Acquisition_1C5.doppler_max", "5000"); config->set_property("Acquisition_1C6.implementation", "GPS_L1_CA_PCPS_Acquisition"); config->set_property("Acquisition_1C6.threshold", "1"); config->set_property("Acquisition_1C6.doppler_max", "5000"); config->set_property("Acquisition_1C7.implementation", "GPS_L1_CA_PCPS_Acquisition"); config->set_property("Acquisition_1C7.threshold", "1"); config->set_property("Acquisition_1C7.doppler_max", "5000"); config->set_property("Acquisition_1B8.implementation", "Galileo_E1_PCPS_Ambiguous_Acquisition"); config->set_property("Acquisition_1B8.threshold", "1"); config->set_property("Acquisition_1B8.doppler_max", "5000"); config->set_property("Acquisition_1B9.implementation", "Galileo_E1_PCPS_Ambiguous_Acquisition"); config->set_property("Acquisition_1B9.threshold", "1"); config->set_property("Acquisition_1B9.doppler_max", "5000"); config->set_property("Acquisition_1B10.implementation", "Galileo_E1_PCPS_Ambiguous_Acquisition"); config->set_property("Acquisition_1B10.threshold", "1"); config->set_property("Acquisition_1B10.doppler_max", "5000"); config->set_property("Acquisition_1B11.implementation", "Galileo_E1_PCPS_Ambiguous_Acquisition"); config->set_property("Acquisition_1B11.threshold", "1"); config->set_property("Acquisition_1B11.doppler_max", "5000"); config->set_property("Acquisition_1B12.implementation", "Galileo_E1_PCPS_Ambiguous_Acquisition"); config->set_property("Acquisition_1B12.threshold", "1"); config->set_property("Acquisition_1B12.doppler_max", "5000"); config->set_property("Acquisition_1B13.implementation", "Galileo_E1_PCPS_Ambiguous_Acquisition"); config->set_property("Acquisition_1B13.threshold", "1"); config->set_property("Acquisition_1B13.doppler_max", "5000"); config->set_property("Acquisition_1B14.implementation", "Galileo_E1_PCPS_Ambiguous_Acquisition"); config->set_property("Acquisition_1B14.threshold", "1"); config->set_property("Acquisition_1B14.doppler_max", "5000"); config->set_property("Acquisition_1B15.implementation", "Galileo_E1_PCPS_Ambiguous_Acquisition"); config->set_property("Acquisition_1B15.threshold", "1"); config->set_property("Acquisition_1B15.doppler_max", "5000"); config->set_property("Tracking_1C0.implementation", "GPS_L1_CA_DLL_PLL_Tracking"); config->set_property("Tracking_1C1.implementation", "GPS_L1_CA_DLL_PLL_Tracking"); config->set_property("Tracking_1C2.implementation", "GPS_L1_CA_DLL_PLL_Tracking"); config->set_property("Tracking_1C3.implementation", "GPS_L1_CA_DLL_PLL_Tracking"); config->set_property("Tracking_1C4.implementation", "GPS_L1_CA_DLL_PLL_Tracking"); config->set_property("Tracking_1C5.implementation", "GPS_L1_CA_DLL_PLL_Tracking"); config->set_property("Tracking_1C6.implementation", "GPS_L1_CA_DLL_PLL_Tracking"); config->set_property("Tracking_1C7.implementation", "GPS_L1_CA_DLL_PLL_Tracking"); config->set_property("Tracking_1B8.implementation", "Galileo_E1_DLL_PLL_VEML_Tracking"); config->set_property("Tracking_1B9.implementation", "Galileo_E1_DLL_PLL_VEML_Tracking"); config->set_property("Tracking_1B10.implementation", "Galileo_E1_DLL_PLL_VEML_Tracking"); config->set_property("Tracking_1B11.implementation", "Galileo_E1_DLL_PLL_VEML_Tracking"); config->set_property("Tracking_1B12.implementation", "Galileo_E1_DLL_PLL_VEML_Tracking"); config->set_property("Tracking_1B13.implementation", "Galileo_E1_DLL_PLL_VEML_Tracking"); config->set_property("Tracking_1B14.implementation", "Galileo_E1_DLL_PLL_VEML_Tracking"); config->set_property("Tracking_1B15.implementation", "Galileo_E1_DLL_PLL_VEML_Tracking"); config->set_property("TelemetryDecoder_1C0.implementation", "GPS_L1_CA_Telemetry_Decoder"); config->set_property("TelemetryDecoder_1C0.decimation_factor", "4"); config->set_property("TelemetryDecoder_1C1.implementation", "GPS_L1_CA_Telemetry_Decoder"); config->set_property("TelemetryDecoder_1C1.decimation_factor", "4"); config->set_property("TelemetryDecoder_1C2.implementation", "GPS_L1_CA_Telemetry_Decoder"); config->set_property("TelemetryDecoder_1C2.decimation_factor", "4"); config->set_property("TelemetryDecoder_1C3.implementation", "GPS_L1_CA_Telemetry_Decoder"); config->set_property("TelemetryDecoder_1C3.decimation_factor", "4"); config->set_property("TelemetryDecoder_1C4.implementation", "GPS_L1_CA_Telemetry_Decoder"); config->set_property("TelemetryDecoder_1C4.decimation_factor", "4"); config->set_property("TelemetryDecoder_1C5.implementation", "GPS_L1_CA_Telemetry_Decoder"); config->set_property("TelemetryDecoder_1C5.decimation_factor", "4"); config->set_property("TelemetryDecoder_1C6.implementation", "GPS_L1_CA_Telemetry_Decoder"); config->set_property("TelemetryDecoder_1C6.decimation_factor", "4"); config->set_property("TelemetryDecoder_1C7.implementation", "GPS_L1_CA_Telemetry_Decoder"); config->set_property("TelemetryDecoder_1C7.decimation_factor", "4"); config->set_property("TelemetryDecoder_1B8.implementation", "Galileo_E1B_Telemetry_Decoder"); config->set_property("TelemetryDecoder_1B8.decimation_factor", "1"); config->set_property("TelemetryDecoder_1B9.implementation", "Galileo_E1B_Telemetry_Decoder"); config->set_property("TelemetryDecoder_1B9.decimation_factor", "1"); config->set_property("TelemetryDecoder_1B10.implementation", "Galileo_E1B_Telemetry_Decoder"); config->set_property("TelemetryDecoder_1B10.decimation_factor", "1"); config->set_property("TelemetryDecoder_1B11.implementation", "Galileo_E1B_Telemetry_Decoder"); config->set_property("TelemetryDecoder_1B11.decimation_factor", "1"); config->set_property("TelemetryDecoder_1B12.implementation", "Galileo_E1B_Telemetry_Decoder"); config->set_property("TelemetryDecoder_1B12.decimation_factor", "1"); config->set_property("TelemetryDecoder_1B13.implementation", "Galileo_E1B_Telemetry_Decoder"); config->set_property("TelemetryDecoder_1B13.decimation_factor", "1"); config->set_property("TelemetryDecoder_1B14.implementation", "Galileo_E1B_Telemetry_Decoder"); config->set_property("TelemetryDecoder_1B14.decimation_factor", "1"); config->set_property("TelemetryDecoder_1B15.implementation", "Galileo_E1B_Telemetry_Decoder"); config->set_property("TelemetryDecoder_1B15.decimation_factor", "1"); config->set_property("Observables.implementation", "Hybrid_Observables"); config->set_property("PVT.implementation", "Hybrid_PVT"); std::shared_ptr flowgraph = std::make_shared(config, gr::msg_queue::make(0)); EXPECT_NO_THROW(flowgraph->connect()); EXPECT_TRUE(flowgraph->connected()); EXPECT_NO_THROW(flowgraph->start()); EXPECT_TRUE(flowgraph->running()); flowgraph->stop(); EXPECT_FALSE(flowgraph->running()); } gnss-sdr-0.0.9/src/tests/unit-tests/control-plane/in_memory_configuration_test.cc000066400000000000000000000116761305042567700304240ustar00rootroot00000000000000/*! * \file in_memory_configuration_test.cc * \brief This file implements tests for the in_memory_configuration. * \author Carles Fernandez-Prades, 2013. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "configuration_interface.h" #include "in_memory_configuration.h" TEST(InMemoryConfiguration, IsPresent) { //std::shared_ptr configuration = std::make_shared(); std::unique_ptr configuration(new InMemoryConfiguration); EXPECT_FALSE(configuration->is_present("NotThere")); configuration->set_property("NotThere", "Yes!"); EXPECT_TRUE(configuration->is_present("NotThere")); } TEST(InMemoryConfiguration, StoreAndRetrieve) { //std::shared_ptr configuration = std::make_shared(); std::unique_ptr configuration(new InMemoryConfiguration); configuration->set_property("Foo.property1", "value"); std::string default_value = "default_value"; std::string value = configuration->property("Foo.property1", default_value); EXPECT_STREQ("value", value.c_str()); } TEST(InMemoryConfiguration, NoStoringAndRetrieve) { //std::shared_ptr configuration = std::make_shared(); std::unique_ptr configuration(new InMemoryConfiguration); std::string default_value = "default_value"; std::string value = configuration->property("Foo.property1", default_value); EXPECT_STREQ("default_value", value.c_str()); } TEST(InMemoryConfiguration, RetrieveBool) { //std::shared_ptr configuration = std::make_shared(); std::unique_ptr configuration(new InMemoryConfiguration); configuration->set_property("Foo.property1", "true"); bool value = configuration->property("Foo.property1", false); bool expectedtrue = true; EXPECT_EQ(expectedtrue, value); } TEST(InMemoryConfiguration, RetrieveBoolFail) { //std::shared_ptr configuration = std::make_shared(); std::unique_ptr configuration(new InMemoryConfiguration); configuration->set_property("Foo.property1", "tru"); bool value = configuration->property("Foo.property1", false); bool expectedfalse = false; EXPECT_EQ(expectedfalse, value); } TEST(InMemoryConfiguration, RetrieveBoolNoDefine) { //std::shared_ptr configuration = std::make_shared(); std::unique_ptr configuration(new InMemoryConfiguration); bool value = configuration->property("Foo.property1", false); bool expectedfalse = false; EXPECT_EQ(expectedfalse, value); } TEST(InMemoryConfiguration, RetrieveSizeT) { //std::shared_ptr configuration = std::make_shared(); std::unique_ptr configuration(new InMemoryConfiguration); configuration->set_property("Foo.property1", "8"); unsigned int value = configuration->property("Foo.property1", 4); unsigned int expected8 = 8; EXPECT_EQ(expected8, value); } TEST(InMemoryConfiguration, RetrieveSizeTFail) { //std::shared_ptr configuration = std::make_shared(); std::unique_ptr configuration(new InMemoryConfiguration); configuration->set_property("Foo.property1", "true"); unsigned int value = configuration->property("Foo.property1", 4); unsigned int expected4 = 4; EXPECT_EQ(expected4, value); } TEST(InMemoryConfiguration, RetrieveSizeTNoDefine) { //std::shared_ptr configuration = std::make_shared(); std::unique_ptr configuration(new InMemoryConfiguration); unsigned int value = configuration->property("Foo.property1", 4); unsigned int expected4 = 4; EXPECT_EQ(expected4, value); } gnss-sdr-0.0.9/src/tests/unit-tests/control-plane/string_converter_test.cc000066400000000000000000000045341305042567700270670ustar00rootroot00000000000000/*! * \file string_converter_test.cc * \brief This file implements unit tests for the StringConverter class. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Carles Fernandez-Prades, 2012. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "string_converter.h" TEST(String_Converter_Test, StringToBool) { std::unique_ptr converter(new StringConverter()); bool conversion_result = converter->convert("false", true); bool expected_false = false; EXPECT_EQ(expected_false, conversion_result); } TEST(String_Converter_Test, StringToSizeT) { // Example using a raw pointer StringConverter* converter; converter = new StringConverter(); size_t conversion_result = converter->convert("8", 1); unsigned int expected8 = 8; EXPECT_EQ(expected8, conversion_result); delete converter; } TEST(String_Converter_Test, StringToBoolFail) { std::unique_ptr converter(new StringConverter()); bool conversion_result = converter->convert("lse", true); bool expected_true = true; EXPECT_EQ(expected_true, conversion_result); } TEST(String_Converter_Test, StringToSizeTFail) { std::unique_ptr converter(new StringConverter()); size_t conversion_result = converter->convert("false", 1); unsigned int expected1 = 1; EXPECT_EQ(expected1, conversion_result); } gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/000077500000000000000000000000001305042567700242435ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/acquisition/000077500000000000000000000000001305042567700265735ustar00rootroot00000000000000galileo_e1_pcps_8ms_ambiguous_acquisition_gsoc2013_test.cc000066400000000000000000000622641305042567700417150ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/acquisition/*! * \file galileo_e1_pcps_8ms_ambiguous_acquisition_gsoc2013_test.cc * \brief This class implements an acquisition test for * GalileoE1Pcps8msAmbiguousAcquisition class. * \author Marc Molina, 2013. marc.molina.pena(at)gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include #include "gnss_block_interface.h" #include "in_memory_configuration.h" #include "gnss_synchro.h" #include "galileo_e1_pcps_8ms_ambiguous_acquisition.h" #include "signal_generator.h" #include "signal_generator_c.h" #include "fir_filter.h" #include "gen_signal_source.h" #include "gnss_sdr_valve.h" // ######## GNURADIO BLOCK MESSAGE RECEVER ######### class GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test_msg_rx; typedef boost::shared_ptr GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test_msg_rx_sptr; GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test_msg_rx_sptr GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test_msg_rx_make(concurrent_queue& queue); class GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test_msg_rx : public gr::block { private: friend GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test_msg_rx_sptr GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test_msg_rx_make(concurrent_queue& queue); void msg_handler_events(pmt::pmt_t msg); GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test_msg_rx(concurrent_queue& queue); concurrent_queue& channel_internal_queue; public: int rx_message; ~GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test_msg_rx(); //!< Default destructor }; GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test_msg_rx_sptr GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test_msg_rx_make(concurrent_queue& queue) { return GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test_msg_rx_sptr(new GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test_msg_rx(queue)); } void GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test_msg_rx::msg_handler_events(pmt::pmt_t msg) { try { long int message = pmt::to_long(msg); rx_message = message; channel_internal_queue.push(rx_message); } catch(boost::bad_any_cast& e) { LOG(WARNING) << "msg_handler_telemetry Bad any cast!"; rx_message = 0; } } GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test_msg_rx::GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test_msg_rx(concurrent_queue& queue) : gr::block("GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test_msg_rx", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)), channel_internal_queue(queue) { this->message_port_register_in(pmt::mp("events")); this->set_msg_handler(pmt::mp("events"), boost::bind(&GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test_msg_rx::msg_handler_events, this, _1)); rx_message = 0; } GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test_msg_rx::~GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test_msg_rx() {} // ########################################################### class GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test: public ::testing::Test { protected: GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test() { item_size = sizeof(gr_complex); stop = false; message = 0; factory = std::make_shared(); gnss_synchro = Gnss_Synchro(); init(); } ~GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test() {} void init(); void config_1(); void config_2(); void start_queue(); void wait_message(); void process_message(); void stop_queue(); concurrent_queue channel_internal_queue; gr::msg_queue::sptr queue; gr::top_block_sptr top_block; std::shared_ptr acquisition; std::shared_ptr factory; std::shared_ptr config; Gnss_Synchro gnss_synchro; size_t item_size; bool stop; int message; boost::thread ch_thread; unsigned int integration_time_ms = 0; unsigned int fs_in = 0; double expected_delay_chips = 0.0; double expected_doppler_hz = 0.0; float max_doppler_error_hz = 0; float max_delay_error_chips = 0; unsigned int num_of_realizations = 0; unsigned int realization_counter; unsigned int detection_counter; unsigned int correct_estimation_counter; unsigned int acquired_samples; unsigned int mean_acq_time_us; double mse_doppler; double mse_delay; double Pd; double Pfa_p; double Pfa_a; }; void GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test::init() { message = 0; realization_counter = 0; detection_counter = 0; correct_estimation_counter = 0; acquired_samples = 0; mse_doppler = 0; mse_delay = 0; mean_acq_time_us = 0; Pd = 0; Pfa_p = 0; Pfa_a = 0; } void GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test::config_1() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'E'; std::string signal = "1C"; signal.copy(gnss_synchro.Signal, 2, 0); integration_time_ms = 8; fs_in = 4e6; expected_delay_chips = 600; expected_doppler_hz = 750; max_doppler_error_hz = 2/(3*integration_time_ms*1e-3); max_delay_error_chips = 0.50; num_of_realizations = 1; config = std::make_shared(); config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.num_satellites", "1"); config->set_property("SignalSource.system_0", "E"); config->set_property("SignalSource.PRN_0", "10"); config->set_property("SignalSource.CN0_dB_0", "44"); config->set_property("SignalSource.doppler_Hz_0", std::to_string(expected_doppler_hz)); config->set_property("SignalSource.delay_chips_0", std::to_string(expected_delay_chips)); config->set_property("SignalSource.noise_flag", "false"); config->set_property("SignalSource.data_flag", "false"); config->set_property("SignalSource.BW_BB", "0.97"); config->set_property("InputFilter.implementation", "Fir_Filter"); config->set_property("InputFilter.input_item_type", "gr_complex"); config->set_property("InputFilter.output_item_type", "gr_complex"); config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", "11"); config->set_property("InputFilter.number_of_bands", "2"); config->set_property("InputFilter.band1_begin", "0.0"); config->set_property("InputFilter.band1_end", "0.97"); config->set_property("InputFilter.band2_begin", "0.98"); config->set_property("InputFilter.band2_end", "1.0"); config->set_property("InputFilter.ampl1_begin", "1.0"); config->set_property("InputFilter.ampl1_end", "1.0"); config->set_property("InputFilter.ampl2_begin", "0.0"); config->set_property("InputFilter.ampl2_end", "0.0"); config->set_property("InputFilter.band1_error", "1.0"); config->set_property("InputFilter.band2_error", "1.0"); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", "16"); config->set_property("Acquisition.item_type", "gr_complex"); config->set_property("Acquisition.if", "0"); config->set_property("Acquisition.coherent_integration_time_ms", std::to_string(integration_time_ms)); config->set_property("Acquisition.max_dwells", "1"); config->set_property("Acquisition.implementation", "Galileo_E1_PCPS_8ms_Ambiguous_Acquisition"); config->set_property("Acquisition.threshold", "0.2"); config->set_property("Acquisition.doppler_max", "10000"); config->set_property("Acquisition.doppler_step", "250"); config->set_property("Acquisition.dump", "false"); } void GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test::config_2() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'E'; std::string signal = "1C"; signal.copy(gnss_synchro.Signal, 2, 0); integration_time_ms = 8; fs_in = 4e6; expected_delay_chips = 600; expected_doppler_hz = 750; max_doppler_error_hz = 2/(3*integration_time_ms*1e-3); max_delay_error_chips = 0.50; num_of_realizations = 100; config = std::make_shared(); config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.num_satellites", "4"); config->set_property("SignalSource.system_0", "E"); config->set_property("SignalSource.PRN_0", "10"); config->set_property("SignalSource.CN0_dB_0", "44"); config->set_property("SignalSource.doppler_Hz_0", std::to_string(expected_doppler_hz)); config->set_property("SignalSource.delay_chips_0", std::to_string(expected_delay_chips)); config->set_property("SignalSource.system_1", "E"); config->set_property("SignalSource.PRN_1", "15"); config->set_property("SignalSource.CN0_dB_1", "44"); config->set_property("SignalSource.doppler_Hz_1", "1000"); config->set_property("SignalSource.delay_chips_1", "100"); config->set_property("SignalSource.system_2", "E"); config->set_property("SignalSource.PRN_2", "21"); config->set_property("SignalSource.CN0_dB_2", "44"); config->set_property("SignalSource.doppler_Hz_2", "2000"); config->set_property("SignalSource.delay_chips_2", "200"); config->set_property("SignalSource.system_3", "E"); config->set_property("SignalSource.PRN_3", "22"); config->set_property("SignalSource.CN0_dB_3", "44"); config->set_property("SignalSource.doppler_Hz_3", "3000"); config->set_property("SignalSource.delay_chips_3", "300"); config->set_property("SignalSource.noise_flag", "true"); config->set_property("SignalSource.data_flag", "true"); config->set_property("SignalSource.BW_BB", "0.97"); config->set_property("InputFilter.implementation", "Fir_Filter"); config->set_property("InputFilter.input_item_type", "gr_complex"); config->set_property("InputFilter.output_item_type", "gr_complex"); config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", "11"); config->set_property("InputFilter.number_of_bands", "2"); config->set_property("InputFilter.band1_begin", "0.0"); config->set_property("InputFilter.band1_end", "0.97"); config->set_property("InputFilter.band2_begin", "0.98"); config->set_property("InputFilter.band2_end", "1.0"); config->set_property("InputFilter.ampl1_begin", "1.0"); config->set_property("InputFilter.ampl1_end", "1.0"); config->set_property("InputFilter.ampl2_begin", "0.0"); config->set_property("InputFilter.ampl2_end", "0.0"); config->set_property("InputFilter.band1_error", "1.0"); config->set_property("InputFilter.band2_error", "1.0"); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", "16"); config->set_property("Acquisition.item_type", "gr_complex"); config->set_property("Acquisition.if", "0"); config->set_property("Acquisition.coherent_integration_time_ms", std::to_string(integration_time_ms)); config->set_property("Acquisition.max_dwells", "1"); config->set_property("Acquisition.implementation", "Galileo_E1_PCPS_8ms_Ambiguous_Acquisition"); config->set_property("Acquisition.pfa", "0.1"); config->set_property("Acquisition.doppler_max", "10000"); config->set_property("Acquisition.doppler_step", "250"); config->set_property("Acquisition.dump", "false"); } void GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test::start_queue() { stop = false; ch_thread = boost::thread(&GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test::wait_message, this); } void GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test::wait_message() { struct timeval tv; long long int begin = 0; long long int end = 0; while (!stop) { acquisition->reset(); gettimeofday(&tv, NULL); begin = tv.tv_sec *1e6 + tv.tv_usec; try { channel_internal_queue.wait_and_pop(message); } catch( boost::exception & e ) { DLOG(FATAL) << "Boost exception: " << boost::diagnostic_information(e); } gettimeofday(&tv, NULL); end = tv.tv_sec*1e6 + tv.tv_usec; mean_acq_time_us += (end - begin); process_message(); } } void GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test::process_message() { if (message == 1) { detection_counter++; // The term -5 is here to correct the additional delay introduced by the FIR filter double delay_error_chips = std::abs((double)expected_delay_chips - (double)(gnss_synchro.Acq_delay_samples-5)*1023.0/((double)fs_in*1e-3)); double doppler_error_hz = std::abs(expected_doppler_hz - gnss_synchro.Acq_doppler_hz); mse_delay += std::pow(delay_error_chips, 2); mse_doppler += std::pow(doppler_error_hz, 2); if ((delay_error_chips < max_delay_error_chips) && (doppler_error_hz < max_doppler_error_hz)) { correct_estimation_counter++; } } realization_counter++; std::cout << "Progress: " << round((float)realization_counter/num_of_realizations*100) << "% \r" << std::flush; if (realization_counter == num_of_realizations) { mse_delay /= num_of_realizations; mse_doppler /= num_of_realizations; Pd = (double)correct_estimation_counter / (double)num_of_realizations; Pfa_a = (double)detection_counter / (double)num_of_realizations; Pfa_p = (double)(detection_counter-correct_estimation_counter) / (double)num_of_realizations; mean_acq_time_us /= num_of_realizations; stop_queue(); top_block->stop(); } } void GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test::stop_queue() { stop = true; } TEST_F(GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test, Instantiate) { config_1(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_8ms_Ambiguous_Acquisition", 1, 1); } TEST_F(GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test, ConnectAndRun) { int nsamples = floor(fs_in*integration_time_ms*1e-3); struct timeval tv; long long int begin = 0; long long int end = 0; config_1(); queue = gr::msg_queue::make(0); top_block = gr::make_top_block("Acquisition test"); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_8ms_Ambiguous_Acquisition", 1, 1); acquisition = std::dynamic_pointer_cast(acq_); boost::shared_ptr msg_rx = GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->set_channel(1); }) << "Failure setting channel." << std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(config->property("Acquisition.doppler_max", 10000)); }) << "Failure setting doppler_max." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(config->property("Acquisition.doppler_step", 500)); }) << "Failure setting doppler_step." << std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(config->property("Acquisition.threshold", 0.0)); }) << "Failure setting threshold." << std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); boost::shared_ptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000, 1, gr_complex(0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); top_block->connect(source, 0, valve, 0); top_block->connect(valve, 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec *1e6 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec *1e6 + tv.tv_usec; }) << "Failure running he top_block." << std::endl; std::cout << "Processed " << nsamples << " samples in " << (end - begin) << " microseconds" << std::endl; } TEST_F(GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test, ValidationOfResults) { config_1(); queue = gr::msg_queue::make(0); top_block = gr::make_top_block("Acquisition test"); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_8ms_Ambiguous_Acquisition", 1, 1, queue); acquisition = std::dynamic_pointer_cast(acq_); boost::shared_ptr msg_rx = GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->set_channel(1); }) << "Failure setting channel." << std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(config->property("Acquisition.doppler_max", 10000)); }) << "Failure setting doppler_max." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(config->property("Acquisition.doppler_step", 500)); }) << "Failure setting doppler_step." << std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(config->property("Acquisition.threshold", 0.0)); }) << "Failure setting threshold." << std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); }) << "Failure connecting acquisition to the top_block." << std::endl; acquisition->init(); ASSERT_NO_THROW( { boost::shared_ptr signal_source; SignalGenerator* signal_generator = new SignalGenerator(config.get(), "SignalSource", 0, 1, queue); FirFilter* filter = new FirFilter(config.get(), "InputFilter", 1, 1); signal_source.reset(new GenSignalSource(signal_generator, filter, "SignalSource", queue)); signal_source->connect(top_block); top_block->connect(signal_source->get_right_block(), 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; // i = 0 --> satellite in acquisition is visible // i = 1 --> satellite in acquisition is not visible for (unsigned int i = 0; i < 2; i++) { init(); if (i == 0) { gnss_synchro.PRN = 10; // This satellite is visible } else if (i == 1) { gnss_synchro.PRN = 20; // This satellite is not visible } acquisition->set_local_code(); //acquisition->set_state(1); start_queue(); EXPECT_NO_THROW( { top_block->run(); // Start threads and wait }) << "Failure running the top_block." << std::endl; stop_queue(); if (i == 0) { EXPECT_EQ(1, message) << "Acquisition failure. Expected message: 1=ACQ SUCCESS."; if (message == 1) { EXPECT_EQ((unsigned int)1, correct_estimation_counter) << "Acquisition failure. Incorrect parameters estimation."; } } else if (i == 1) { EXPECT_EQ(2, message) << "Acquisition failure. Expected message: 2=ACQ FAIL."; } ch_thread.join(); } } TEST_F(GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test, ValidationOfResultsProbabilities) { config_2(); queue = gr::msg_queue::make(0); top_block = gr::make_top_block("Acquisition test"); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_8ms_Ambiguous_Acquisition", 1, 1); acquisition = std::dynamic_pointer_cast(acq_); boost::shared_ptr msg_rx = GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->set_channel(1); }) << "Failure setting channel." << std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(config->property("Acquisition.doppler_max", 10000)); }) << "Failure setting doppler_max." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(config->property("Acquisition.doppler_step", 500)); }) << "Failure setting doppler_step." << std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(config->property("Acquisition.threshold", 0.0)); }) << "Failure setting threshold." << std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); }) << "Failure connecting acquisition to the top_block." << std::endl; acquisition->init(); ASSERT_NO_THROW( { boost::shared_ptr signal_source; SignalGenerator* signal_generator = new SignalGenerator(config.get(), "SignalSource", 0, 1, queue); FirFilter* filter = new FirFilter(config.get(), "InputFilter", 1, 1); signal_source.reset(new GenSignalSource(signal_generator, filter, "SignalSource", queue)); signal_source->connect(top_block); top_block->connect(signal_source->get_right_block(), 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; std::cout << "Probability of false alarm (target) = " << 0.1 << std::endl; // i = 0 --> satellite in acquisition is visible (prob of detection and prob of detection with wrong estimation) // i = 1 --> satellite in acquisition is not visible (prob of false detection) for (unsigned int i = 0; i < 2; i++) { init(); if (i == 0) { gnss_synchro.PRN = 10; // This satellite is visible } else if (i == 1) { gnss_synchro.PRN = 20; // This satellite is not visible } acquisition->set_local_code(); //acquisition->set_state(1); start_queue(); EXPECT_NO_THROW( { top_block->run(); // Start threads and wait }) << "Failure running the top_block." << std::endl; stop_queue(); if (i == 0) { std::cout << "Estimated probability of detection = " << Pd << std::endl; std::cout << "Estimated probability of false alarm (satellite present) = " << Pfa_p << std::endl; std::cout << "Mean acq time = " << mean_acq_time_us << " microseconds." << std::endl; } else if (i == 1) { std::cout << "Estimated probability of false alarm (satellite absent) = " << Pfa_a << std::endl; std::cout << "Mean acq time = " << mean_acq_time_us << " microseconds." << std::endl; } ch_thread.join(); } } galileo_e1_pcps_ambiguous_acquisition_gsoc2013_test.cc000066400000000000000000000606071305042567700411250ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/acquisition/*! * \file galileo_e1_pcps_ambiguous_acquisition_gsoc2013_test.cc * \brief This class implements an acquisition test for * GalileoE1PcpsAmbiguousAcquisition class. * \author Marc Molina, 2013. marc.molina.pena(at)gmail.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include "gnss_block_interface.h" #include "in_memory_configuration.h" #include "gnss_synchro.h" #include "galileo_e1_pcps_ambiguous_acquisition.h" #include "signal_generator.h" #include "signal_generator_c.h" #include "fir_filter.h" #include "gen_signal_source.h" #include "gnss_sdr_valve.h" // ######## GNURADIO BLOCK MESSAGE RECEVER ######### class GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx; typedef boost::shared_ptr GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx_sptr; GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx_sptr GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx_make(concurrent_queue& queue); class GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx : public gr::block { private: friend GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx_sptr GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx_make(concurrent_queue& queue ); void msg_handler_events(pmt::pmt_t msg); GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx(concurrent_queue& queue); concurrent_queue& channel_internal_queue; public: int rx_message; ~GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx(); //!< Default destructor }; GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx_sptr GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx_make(concurrent_queue& queue) { return GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx_sptr(new GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx(queue)); } void GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx::msg_handler_events(pmt::pmt_t msg) { try { long int message = pmt::to_long(msg); rx_message = message; channel_internal_queue.push(rx_message); } catch(boost::bad_any_cast& e) { LOG(WARNING) << "msg_handler_telemetry Bad any cast!"; rx_message = 0; } } GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx::GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx(concurrent_queue& queue) : gr::block("GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)), channel_internal_queue(queue) { this->message_port_register_in(pmt::mp("events")); this->set_msg_handler(pmt::mp("events"), boost::bind(&GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx::msg_handler_events, this, _1)); rx_message = 0; } GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx::~GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx() {} // ########################################################### class GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test: public ::testing::Test { protected: GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test() { factory = std::make_shared(); item_size = sizeof(gr_complex); stop = false; message = 0; gnss_synchro = Gnss_Synchro(); } ~GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test() {} void init(); void config_1(); void config_2(); void start_queue(); void wait_message(); void process_message(); void stop_queue(); concurrent_queue channel_internal_queue; gr::msg_queue::sptr queue; gr::top_block_sptr top_block; std::shared_ptr acquisition; std::shared_ptr factory; std::shared_ptr config; Gnss_Synchro gnss_synchro; size_t item_size; bool stop; int message; boost::thread ch_thread; unsigned int integration_time_ms = 0; unsigned int fs_in = 0; double expected_delay_chips = 0.0; double expected_doppler_hz = 0.0; float max_doppler_error_hz = 0; float max_delay_error_chips = 0; unsigned int num_of_realizations = 0; unsigned int realization_counter = 0; unsigned int detection_counter = 0; unsigned int correct_estimation_counter = 0; unsigned int acquired_samples = 0; unsigned int mean_acq_time_us = 0; double mse_doppler = 0.0; double mse_delay = 0.0; double Pd = 0.0; double Pfa_p = 0.0; double Pfa_a = 0.0; }; void GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test::init() { message = 0; realization_counter = 0; detection_counter = 0; correct_estimation_counter = 0; acquired_samples = 0; mse_doppler = 0; mse_delay = 0; mean_acq_time_us = 0; Pd = 0; Pfa_p = 0; Pfa_a = 0; } void GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test::config_1() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'E'; std::string signal = "1C"; signal.copy(gnss_synchro.Signal, 2, 0); integration_time_ms = 4; fs_in = 4e6; expected_delay_chips = 600; expected_doppler_hz = 750; max_doppler_error_hz = 2/(3*integration_time_ms*1e-3); max_delay_error_chips = 0.50; num_of_realizations = 1; config = std::make_shared(); config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.num_satellites", "1"); config->set_property("SignalSource.system_0", "E"); config->set_property("SignalSource.PRN_0", "10"); config->set_property("SignalSource.CN0_dB_0", "44"); config->set_property("SignalSource.doppler_Hz_0", std::to_string(expected_doppler_hz)); config->set_property("SignalSource.delay_chips_0", std::to_string(expected_delay_chips)); config->set_property("SignalSource.noise_flag", "false"); config->set_property("SignalSource.data_flag", "false"); config->set_property("SignalSource.BW_BB", "0.97"); config->set_property("InputFilter.implementation", "Fir_Filter"); config->set_property("InputFilter.input_item_type", "gr_complex"); config->set_property("InputFilter.output_item_type", "gr_complex"); config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", "11"); config->set_property("InputFilter.number_of_bands", "2"); config->set_property("InputFilter.band1_begin", "0.0"); config->set_property("InputFilter.band1_end", "0.97"); config->set_property("InputFilter.band2_begin", "0.98"); config->set_property("InputFilter.band2_end", "1.0"); config->set_property("InputFilter.ampl1_begin", "1.0"); config->set_property("InputFilter.ampl1_end", "1.0"); config->set_property("InputFilter.ampl2_begin", "0.0"); config->set_property("InputFilter.ampl2_end", "0.0"); config->set_property("InputFilter.band1_error", "1.0"); config->set_property("InputFilter.band2_error", "1.0"); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", "16"); config->set_property("Acquisition.item_type", "gr_complex"); config->set_property("Acquisition.if", "0"); config->set_property("Acquisition.coherent_integration_time_ms", std::to_string(integration_time_ms)); config->set_property("Acquisition.max_dwells", "1"); config->set_property("Acquisition.bit_transition_flag","false"); config->set_property("Acquisition.implementation", "Galileo_E1_PCPS_Ambiguous_Acquisition"); config->set_property("Acquisition.threshold", "0.1"); config->set_property("Acquisition.doppler_max", "10000"); config->set_property("Acquisition.doppler_step", "250"); config->set_property("Acquisition.dump", "false"); } void GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test::config_2() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'E'; std::string signal = "1C"; signal.copy(gnss_synchro.Signal, 2, 0); integration_time_ms = 4; fs_in = 4e6; expected_delay_chips = 600; expected_doppler_hz = 750; max_doppler_error_hz = 2/(3*integration_time_ms*1e-3); max_delay_error_chips = 0.50; num_of_realizations = 100; config = std::make_shared(); config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.num_satellites", "4"); config->set_property("SignalSource.system_0", "E"); config->set_property("SignalSource.PRN_0", "10"); config->set_property("SignalSource.CN0_dB_0", "44"); config->set_property("SignalSource.doppler_Hz_0", std::to_string(expected_doppler_hz)); config->set_property("SignalSource.delay_chips_0", std::to_string(expected_delay_chips)); config->set_property("SignalSource.system_1", "E"); config->set_property("SignalSource.PRN_1", "15"); config->set_property("SignalSource.CN0_dB_1", "44"); config->set_property("SignalSource.doppler_Hz_1", "1000"); config->set_property("SignalSource.delay_chips_1", "100"); config->set_property("SignalSource.system_2", "E"); config->set_property("SignalSource.PRN_2", "21"); config->set_property("SignalSource.CN0_dB_2", "44"); config->set_property("SignalSource.doppler_Hz_2", "2000"); config->set_property("SignalSource.delay_chips_2", "200"); config->set_property("SignalSource.system_3", "E"); config->set_property("SignalSource.PRN_3", "22"); config->set_property("SignalSource.CN0_dB_3", "44"); config->set_property("SignalSource.doppler_Hz_3", "3000"); config->set_property("SignalSource.delay_chips_3", "300"); config->set_property("SignalSource.noise_flag", "true"); config->set_property("SignalSource.data_flag", "true"); config->set_property("SignalSource.BW_BB", "0.97"); config->set_property("InputFilter.implementation", "Fir_Filter"); config->set_property("InputFilter.input_item_type", "gr_complex"); config->set_property("InputFilter.output_item_type", "gr_complex"); config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", "11"); config->set_property("InputFilter.number_of_bands", "2"); config->set_property("InputFilter.band1_begin", "0.0"); config->set_property("InputFilter.band1_end", "0.97"); config->set_property("InputFilter.band2_begin", "0.98"); config->set_property("InputFilter.band2_end", "1.0"); config->set_property("InputFilter.ampl1_begin", "1.0"); config->set_property("InputFilter.ampl1_end", "1.0"); config->set_property("InputFilter.ampl2_begin", "0.0"); config->set_property("InputFilter.ampl2_end", "0.0"); config->set_property("InputFilter.band1_error", "1.0"); config->set_property("InputFilter.band2_error", "1.0"); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", "16"); config->set_property("Acquisition.item_type", "gr_complex"); config->set_property("Acquisition.if", "0"); config->set_property("Acquisition.coherent_integration_time_ms", std::to_string(integration_time_ms)); config->set_property("Acquisition.max_dwells", "1"); config->set_property("Acquisition.bit_transition_flag","false"); config->set_property("Acquisition.implementation", "Galileo_E1_PCPS_Ambiguous_Acquisition"); config->set_property("Acquisition.pfa", "0.1"); config->set_property("Acquisition.doppler_max", "10000"); config->set_property("Acquisition.doppler_step", "250"); config->set_property("Acquisition.dump", "false"); } void GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test::start_queue() { stop = false; ch_thread = boost::thread(&GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test::wait_message, this); } void GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test::wait_message() { struct timeval tv; long long int begin = 0; long long int end = 0; while (!stop) { acquisition->reset(); gettimeofday(&tv, NULL); begin = tv.tv_sec*1e6 + tv.tv_usec; channel_internal_queue.wait_and_pop(message); gettimeofday(&tv, NULL); end = tv.tv_sec*1e6 + tv.tv_usec; mean_acq_time_us += (end - begin); process_message(); } } void GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test::process_message() { if (message == 1) { detection_counter++; // The term -5 is here to correct the additional delay introduced by the FIR filter double delay_error_chips = std::abs((double)expected_delay_chips - (double)(gnss_synchro.Acq_delay_samples-5)*1023.0/((double)fs_in*1e-3)); double doppler_error_hz = std::abs(expected_doppler_hz - gnss_synchro.Acq_doppler_hz); mse_delay += std::pow(delay_error_chips, 2); mse_doppler += std::pow(doppler_error_hz, 2); if ((delay_error_chips < max_delay_error_chips) && (doppler_error_hz < max_doppler_error_hz)) { correct_estimation_counter++; } } realization_counter++; std::cout << "Progress: " << round((float)realization_counter/num_of_realizations*100) << "% \r" << std::flush; if (realization_counter == num_of_realizations) { mse_delay /= (double)num_of_realizations; mse_doppler /= (double)num_of_realizations; Pd = (double)correct_estimation_counter / (double)num_of_realizations; Pfa_a = (double)detection_counter / (double)num_of_realizations; Pfa_p = (double)(detection_counter-correct_estimation_counter) / (double)num_of_realizations; mean_acq_time_us /= (double)num_of_realizations; stop_queue(); top_block->stop(); } } void GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test::stop_queue() { stop = true; } TEST_F(GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test, Instantiate) { config_1(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_Ambiguous_Acquisition", 1, 1); acquisition = std::dynamic_pointer_cast(acq_); } TEST_F(GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test, ConnectAndRun) { int nsamples = floor(fs_in*integration_time_ms*1e-3); struct timeval tv; long long int begin = 0; long long int end = 0; top_block = gr::make_top_block("Acquisition test"); queue = gr::msg_queue::make(0); config_1(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_Ambiguous_Acquisition", 1, 1); acquisition = std::dynamic_pointer_cast(acq_); boost::shared_ptr msg_rx = GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->connect(top_block); boost::shared_ptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000, 1, gr_complex(0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); top_block->connect(source, 0, valve, 0); top_block->connect(valve, 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec*1e6 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec*1e6 + tv.tv_usec; }) << "Failure running the top_block." << std::endl; std::cout << "Processed " << nsamples << " samples in " << (end - begin) << " microseconds" << std::endl; } TEST_F(GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test, ValidationOfResults) { config_1(); top_block = gr::make_top_block("Acquisition test"); queue = gr::msg_queue::make(0); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_Ambiguous_Acquisition", 1, 1); acquisition = std::dynamic_pointer_cast(acq_); boost::shared_ptr msg_rx = GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->set_channel(1); }) << "Failure setting channel." << std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(config->property("Acquisition.doppler_max", 10000)); }) << "Failure setting doppler_max." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(config->property("Acquisition.doppler_step", 500)); }) << "Failure setting doppler_step." << std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(config->property("Acquisition.threshold", 0.0)); }) << "Failure setting threshold." << std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); }) << "Failure connecting acquisition to the top_block." << std::endl; acquisition->init(); ASSERT_NO_THROW( { boost::shared_ptr signal_source; SignalGenerator* signal_generator = new SignalGenerator(config.get(), "SignalSource", 0, 1, queue); FirFilter* filter = new FirFilter(config.get(), "InputFilter", 1, 1); signal_source.reset(new GenSignalSource(signal_generator, filter, "SignalSource", queue)); signal_source->connect(top_block); top_block->connect(signal_source->get_right_block(), 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; // i = 0 --> satellite in acquisition is visible // i = 1 --> satellite in acquisition is not visible for (unsigned int i = 0; i < 2; i++) { init(); if (i == 0) { gnss_synchro.PRN = 10; // This satellite is visible } else if (i == 1) { gnss_synchro.PRN = 20; // This satellite is not visible } acquisition->set_local_code(); acquisition->set_state(1); start_queue(); EXPECT_NO_THROW( { top_block->run(); // Start threads and wait }) << "Failure running the top_block." << std::endl; stop_queue(); if (i == 0) { EXPECT_EQ(1, message) << "Acquisition failure. Expected message: 1=ACQ SUCCESS."; if (message == 1) { EXPECT_EQ((unsigned int)1, correct_estimation_counter) << "Acquisition failure. Incorrect parameters estimation."; } } else if (i == 1) { EXPECT_EQ(2, message) << "Acquisition failure. Expected message: 2=ACQ FAIL."; } ch_thread.join(); } } TEST_F(GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test, ValidationOfResultsProbabilities) { config_2(); top_block = gr::make_top_block("Acquisition test"); queue = gr::msg_queue::make(0); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_Ambiguous_Acquisition", 1, 1); acquisition = std::dynamic_pointer_cast(acq_); boost::shared_ptr msg_rx = GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->set_channel(1); }) << "Failure setting channel." << std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(config->property("Acquisition.doppler_max", 10000)); }) << "Failure setting doppler_max." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(config->property("Acquisition.doppler_step", 500)); }) << "Failure setting doppler_step." << std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(config->property("Acquisition.threshold", 0.0)); }) << "Failure setting threshold." << std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); }) << "Failure connecting acquisition to the top_block." << std::endl; acquisition->init(); ASSERT_NO_THROW( { boost::shared_ptr signal_source; SignalGenerator* signal_generator = new SignalGenerator(config.get(), "SignalSource", 0, 1, queue); FirFilter* filter = new FirFilter(config.get(), "InputFilter", 1, 1); signal_source.reset(new GenSignalSource(signal_generator, filter, "SignalSource", queue)); signal_source->connect(top_block); top_block->connect(signal_source->get_right_block(), 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; std::cout << "Probability of false alarm (target) = " << 0.1 << std::endl; // i = 0 --> satellite in acquisition is visible (prob of detection and prob of detection with wrong estimation) // i = 1 --> satellite in acquisition is not visible (prob of false detection) for (unsigned int i = 0; i < 2; i++) { init(); if (i == 0) { gnss_synchro.PRN = 10; // This satellite is visible } else if (i == 1) { gnss_synchro.PRN = 20; // This satellite is not visible } acquisition->set_local_code(); acquisition->set_state(1); start_queue(); EXPECT_NO_THROW( { top_block->run(); // Start threads and wait }) << "Failure running the top_block." << std::endl; stop_queue(); if (i == 0) { std::cout << "Estimated probability of detection = " << Pd << std::endl; std::cout << "Estimated probability of false alarm (satellite present) = " << Pfa_p << std::endl; std::cout << "Mean acq time = " << mean_acq_time_us << " microseconds." << std::endl; } else if (i == 1) { std::cout << "Estimated probability of false alarm (satellite absent) = " << Pfa_a << std::endl; std::cout << "Mean acq time = " << mean_acq_time_us << " microseconds." << std::endl; } ch_thread.join(); } } galileo_e1_pcps_ambiguous_acquisition_gsoc_test.cc000066400000000000000000000300031305042567700406020ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/acquisition/*! * \file galileo_e1_pcps_ambiguous_acquisition_gsoc_test.cc * \brief This class implements an acquisition test for * GalileoE1PcpsAmbiguousAcquisition class based on GSoC 2012 experiments. * * This test is a part of an experiment performed by Luis Esteve in the * framework of the Google Summer of Code (GSoC) 2012, with the collaboration * of Javier Arribas and Carles Fernández, related to the extension of GNSS-SDR * to Galileo. The objective is perform a positive acquisition of in-orbit * Galileo signals in the E1 band. * * Report: * https://docs.google.com/document/d/1SZ3m1K7Qf9GsZQGEF7VSOEewBDCjbylCClw9rSXwG7Y/edit?pli=1 * * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include #include "gnss_block_factory.h" #include "gnss_block_interface.h" #include "in_memory_configuration.h" #include "gnss_sdr_valve.h" #include "gnss_signal.h" #include "gnss_synchro.h" #include "galileo_e1_pcps_ambiguous_acquisition.h" // ######## GNURADIO BLOCK MESSAGE RECEVER ######### class GalileoE1PcpsAmbiguousAcquisitionGSoCTest_msg_rx; typedef boost::shared_ptr GalileoE1PcpsAmbiguousAcquisitionGSoCTest_msg_rx_sptr; GalileoE1PcpsAmbiguousAcquisitionGSoCTest_msg_rx_sptr GalileoE1PcpsAmbiguousAcquisitionGSoCTest_msg_rx_make(concurrent_queue& queue); class GalileoE1PcpsAmbiguousAcquisitionGSoCTest_msg_rx : public gr::block { private: friend GalileoE1PcpsAmbiguousAcquisitionGSoCTest_msg_rx_sptr GalileoE1PcpsAmbiguousAcquisitionGSoCTest_msg_rx_make(concurrent_queue& queue); void msg_handler_events(pmt::pmt_t msg); GalileoE1PcpsAmbiguousAcquisitionGSoCTest_msg_rx(concurrent_queue& queue); concurrent_queue& channel_internal_queue; public: int rx_message; ~GalileoE1PcpsAmbiguousAcquisitionGSoCTest_msg_rx(); //!< Default destructor }; GalileoE1PcpsAmbiguousAcquisitionGSoCTest_msg_rx_sptr GalileoE1PcpsAmbiguousAcquisitionGSoCTest_msg_rx_make(concurrent_queue& queue) { return GalileoE1PcpsAmbiguousAcquisitionGSoCTest_msg_rx_sptr(new GalileoE1PcpsAmbiguousAcquisitionGSoCTest_msg_rx(queue)); } void GalileoE1PcpsAmbiguousAcquisitionGSoCTest_msg_rx::msg_handler_events(pmt::pmt_t msg) { try { long int message = pmt::to_long(msg); rx_message = message; channel_internal_queue.push(rx_message); } catch(boost::bad_any_cast& e) { LOG(WARNING) << "msg_handler_telemetry Bad any cast!"; rx_message = 0; } } GalileoE1PcpsAmbiguousAcquisitionGSoCTest_msg_rx::GalileoE1PcpsAmbiguousAcquisitionGSoCTest_msg_rx(concurrent_queue& queue) : gr::block("GalileoE1PcpsAmbiguousAcquisitionGSoCTest_msg_rx", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)), channel_internal_queue(queue) { this->message_port_register_in(pmt::mp("events")); this->set_msg_handler(pmt::mp("events"), boost::bind(&GalileoE1PcpsAmbiguousAcquisitionGSoCTest_msg_rx::msg_handler_events, this, _1)); rx_message = 0; } GalileoE1PcpsAmbiguousAcquisitionGSoCTest_msg_rx::~GalileoE1PcpsAmbiguousAcquisitionGSoCTest_msg_rx() {} // ########################################################### class GalileoE1PcpsAmbiguousAcquisitionGSoCTest: public ::testing::Test { protected: GalileoE1PcpsAmbiguousAcquisitionGSoCTest() { factory = std::make_shared(); config = std::make_shared(); item_size = sizeof(gr_complex); stop = false; message = 0; gnss_synchro = Gnss_Synchro(); } ~GalileoE1PcpsAmbiguousAcquisitionGSoCTest() {} void init(); void start_queue(); void wait_message(); void stop_queue(); concurrent_queue channel_internal_queue; gr::msg_queue::sptr queue; gr::top_block_sptr top_block; std::shared_ptr factory; std::shared_ptr config; Gnss_Synchro gnss_synchro; size_t item_size; bool stop; int message; boost::thread ch_thread; }; void GalileoE1PcpsAmbiguousAcquisitionGSoCTest::init() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'E'; std::string signal = "1C"; signal.copy(gnss_synchro.Signal, 2, 0); gnss_synchro.PRN = 11; config->set_property("GNSS-SDR.internal_fs_hz", "4000000"); config->set_property("Acquisition.item_type", "gr_complex"); config->set_property("Acquisition.if", "0"); config->set_property("Acquisition.coherent_integration_time_ms", "4"); config->set_property("Acquisition.dump", "false"); config->set_property("Acquisition.implementation", "Galileo_E1_PCPS_Ambiguous_Acquisition"); config->set_property("Acquisition.threshold", "0.1"); config->set_property("Acquisition.doppler_max", "10000"); config->set_property("Acquisition.doppler_step", "125"); config->set_property("Acquisition.repeat_satellite", "false"); config->set_property("Acquisition0.cboc", "true"); } void GalileoE1PcpsAmbiguousAcquisitionGSoCTest::start_queue() { ch_thread = boost::thread(&GalileoE1PcpsAmbiguousAcquisitionGSoCTest::wait_message, this); } void GalileoE1PcpsAmbiguousAcquisitionGSoCTest::wait_message() { while (!stop) { try { channel_internal_queue.wait_and_pop(message); stop_queue(); } catch( boost::exception & e ) { DLOG(WARNING) << "Boost exception: " << boost::diagnostic_information(e); } } } void GalileoE1PcpsAmbiguousAcquisitionGSoCTest::stop_queue() { stop = true; } TEST_F(GalileoE1PcpsAmbiguousAcquisitionGSoCTest, Instantiate) { init(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_Ambiguous_Acquisition", 1, 1); std::shared_ptr acquisition = std::dynamic_pointer_cast(acq_); EXPECT_STREQ("Galileo_E1_PCPS_Ambiguous_Acquisition", acquisition->implementation().c_str()); } TEST_F(GalileoE1PcpsAmbiguousAcquisitionGSoCTest, ConnectAndRun) { int fs_in = 4000000; int nsamples = 4*fs_in; struct timeval tv; long long int begin = 0; long long int end = 0; queue = gr::msg_queue::make(0); top_block = gr::make_top_block("Acquisition test"); init(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_Ambiguous_Acquisition", 1, 1); std::shared_ptr acquisition = std::dynamic_pointer_cast(acq_); boost::shared_ptr msg_rx = GalileoE1PcpsAmbiguousAcquisitionGSoCTest_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->connect(top_block); boost::shared_ptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000, 1, gr_complex(0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); top_block->connect(source, 0, valve, 0); top_block->connect(valve, 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec * 1000000 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec * 1000000 + tv.tv_usec; }) << "Failure running the top_block." << std::endl; std::cout << "Processed " << nsamples << " samples in " << (end - begin) << " microseconds" << std::endl; } TEST_F(GalileoE1PcpsAmbiguousAcquisitionGSoCTest, ValidationOfResults) { struct timeval tv; long long int begin = 0; long long int end = 0; queue = gr::msg_queue::make(0); top_block = gr::make_top_block("Acquisition test"); init(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_Ambiguous_Acquisition", 1, 1); std::shared_ptr acquisition = std::dynamic_pointer_cast(acq_); boost::shared_ptr msg_rx = GalileoE1PcpsAmbiguousAcquisitionGSoCTest_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->set_channel(gnss_synchro.Channel_ID); }) << "Failure setting channel." << std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro." << std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(config->property("Acquisition.threshold", 0.00001)); }) << "Failure setting threshold." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(config->property("Acquisition.doppler_max", 10000)); }) << "Failure setting doppler_max." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(config->property("Acquisition.doppler_step", 250)); }) << "Failure setting doppler_step." << std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); }) << "Failure connecting acquisition to the top_block." << std::endl; ASSERT_NO_THROW( { std::string path = std::string(TEST_PATH); //std::string file = path + "signal_samples/GSoC_CTTC_capture_2012_07_26_4Msps_4ms.dat"; std::string file = path + "signal_samples/Galileo_E1_ID_1_Fs_4Msps_8ms.dat"; const char * file_name = file.c_str(); gr::blocks::file_source::sptr file_source = gr::blocks::file_source::make(sizeof(gr_complex), file_name, false); top_block->connect(file_source, 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; ASSERT_NO_THROW( { start_queue(); acquisition->init(); acquisition->reset(); acquisition->set_state(1); }) << "Failure starting acquisition" << std::endl; EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec * 1000000 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec * 1000000 + tv.tv_usec; }) << "Failure running the top_block." << std::endl; stop_queue(); unsigned long int nsamples = gnss_synchro.Acq_samplestamp_samples; std::cout << "Acquired " << nsamples << " samples in " << (end - begin) << " microseconds" << std::endl; EXPECT_EQ(2, message) << "Acquisition failure. Expected message: 0=ACQ STOP."; ch_thread.join(); } galileo_e1_pcps_ambiguous_acquisition_test.cc000066400000000000000000000251221305042567700375750ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/acquisition/*! * \file galileo_e1_pcps_ambiguous_acquisition_test.cc * \brief This class implements an acquisition test for * GalileoE1PcpsAmbiguousAcquisition class based on some input parameters. * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include #include #include "gnss_block_factory.h" #include "gnss_block_interface.h" #include "in_memory_configuration.h" #include "gnss_sdr_valve.h" #include "gnss_signal.h" #include "gnss_synchro.h" #include "galileo_e1_pcps_ambiguous_acquisition.h" // ######## GNURADIO BLOCK MESSAGE RECEVER ######### class GalileoE1PcpsAmbiguousAcquisitionTest_msg_rx; typedef boost::shared_ptr GalileoE1PcpsAmbiguousAcquisitionTest_msg_rx_sptr; GalileoE1PcpsAmbiguousAcquisitionTest_msg_rx_sptr GalileoE1PcpsAmbiguousAcquisitionTest_msg_rx_make(); class GalileoE1PcpsAmbiguousAcquisitionTest_msg_rx : public gr::block { private: friend GalileoE1PcpsAmbiguousAcquisitionTest_msg_rx_sptr GalileoE1PcpsAmbiguousAcquisitionTest_msg_rx_make(); void msg_handler_events(pmt::pmt_t msg); GalileoE1PcpsAmbiguousAcquisitionTest_msg_rx(); public: int rx_message; ~GalileoE1PcpsAmbiguousAcquisitionTest_msg_rx(); //!< Default destructor }; GalileoE1PcpsAmbiguousAcquisitionTest_msg_rx_sptr GalileoE1PcpsAmbiguousAcquisitionTest_msg_rx_make() { return GalileoE1PcpsAmbiguousAcquisitionTest_msg_rx_sptr(new GalileoE1PcpsAmbiguousAcquisitionTest_msg_rx()); } void GalileoE1PcpsAmbiguousAcquisitionTest_msg_rx::msg_handler_events(pmt::pmt_t msg) { try { long int message = pmt::to_long(msg); rx_message = message; } catch(boost::bad_any_cast& e) { LOG(WARNING) << "msg_handler_telemetry Bad any cast!"; rx_message = 0; } } GalileoE1PcpsAmbiguousAcquisitionTest_msg_rx::GalileoE1PcpsAmbiguousAcquisitionTest_msg_rx() : gr::block("GalileoE1PcpsAmbiguousAcquisitionTest_msg_rx", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)) { this->message_port_register_in(pmt::mp("events")); this->set_msg_handler(pmt::mp("events"), boost::bind(&GalileoE1PcpsAmbiguousAcquisitionTest_msg_rx::msg_handler_events, this, _1)); rx_message = 0; } GalileoE1PcpsAmbiguousAcquisitionTest_msg_rx::~GalileoE1PcpsAmbiguousAcquisitionTest_msg_rx() {} // ########################################################### class GalileoE1PcpsAmbiguousAcquisitionTest: public ::testing::Test { protected: GalileoE1PcpsAmbiguousAcquisitionTest() { factory = std::make_shared(); config = std::make_shared(); item_size = sizeof(gr_complex); gnss_synchro = Gnss_Synchro(); } ~GalileoE1PcpsAmbiguousAcquisitionTest() {} void init(); gr::top_block_sptr top_block; std::shared_ptr factory; std::shared_ptr config; Gnss_Synchro gnss_synchro; size_t item_size; }; void GalileoE1PcpsAmbiguousAcquisitionTest::init() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'E'; std::string signal = "1C"; signal.copy(gnss_synchro.Signal, 2, 0); gnss_synchro.PRN = 1; config->set_property("GNSS-SDR.internal_fs_hz", "4000000"); config->set_property("Acquisition.item_type", "gr_complex"); config->set_property("Acquisition.if", "0"); config->set_property("Acquisition.coherent_integration_time_ms", "4"); config->set_property("Acquisition.dump", "false"); config->set_property("Acquisition.implementation", "Galileo_E1_PCPS_Ambiguous_Acquisition"); config->set_property("Acquisition.threshold", "0.0001"); config->set_property("Acquisition.doppler_max", "10000"); config->set_property("Acquisition.doppler_step", "250"); config->set_property("Acquisition.repeat_satellite", "false"); config->set_property("Acquisition1.cboc", "true"); } TEST_F(GalileoE1PcpsAmbiguousAcquisitionTest, Instantiate) { init(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_Ambiguous_Acquisition", 1, 1); std::shared_ptr acquisition = std::dynamic_pointer_cast(acq_); } TEST_F(GalileoE1PcpsAmbiguousAcquisitionTest, ConnectAndRun) { int fs_in = 4000000; int nsamples = 4*fs_in; struct timeval tv; long long int begin = 0; long long int end = 0; top_block = gr::make_top_block("Acquisition test"); gr::msg_queue::sptr queue = gr::msg_queue::make(0); init(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_Ambiguous_Acquisition", 1, 1); std::shared_ptr acquisition = std::dynamic_pointer_cast(acq_); boost::shared_ptr msg_rx = GalileoE1PcpsAmbiguousAcquisitionTest_msg_rx_make(); ASSERT_NO_THROW( { acquisition->connect(top_block); boost::shared_ptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000, 1, gr_complex(0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); top_block->connect(source, 0, valve, 0); top_block->connect(valve, 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(),pmt::mp("events"), msg_rx,pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec*1000000 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec*1000000 + tv.tv_usec; }) << "Failure running the top_block." << std::endl; std::cout << "Processed " << nsamples << " samples in " << (end-begin) << " microseconds" << std::endl; } TEST_F(GalileoE1PcpsAmbiguousAcquisitionTest, ValidationOfResults) { struct timeval tv; long long int begin = 0; long long int end = 0; double expected_delay_samples = 2920; //18250; double expected_doppler_hz = -632; init(); top_block = gr::make_top_block("Acquisition test"); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_Ambiguous_Acquisition", 1, 1); std::shared_ptr acquisition = std::dynamic_pointer_cast(acq_); boost::shared_ptr msg_rx = GalileoE1PcpsAmbiguousAcquisitionTest_msg_rx_make(); ASSERT_NO_THROW( { acquisition->set_channel(gnss_synchro.Channel_ID); }) << "Failure setting channel." << std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro." << std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(config->property("Acquisition.threshold", 1e-9)); }) << "Failure setting threshold." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(config->property("Acquisition.doppler_max", 10000)); }) << "Failure setting doppler_max." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(config->property("Acquisition.doppler_step", 250)); }) << "Failure setting doppler_step." << std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); }) << "Failure connecting acquisition to the top_block." << std::endl; ASSERT_NO_THROW( { std::string path = std::string(TEST_PATH); std::string file = path + "signal_samples/Galileo_E1_ID_1_Fs_4Msps_8ms.dat"; const char * file_name = file.c_str(); gr::blocks::file_source::sptr file_source = gr::blocks::file_source::make(sizeof(gr_complex), file_name, false); top_block->connect(file_source, 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; acquisition->init(); acquisition->reset(); acquisition->set_state(1); EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec * 1000000 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec * 1000000 + tv.tv_usec; }) << "Failure running the top_block." << std::endl; unsigned long int nsamples = gnss_synchro.Acq_samplestamp_samples; std::cout << "Acquired " << nsamples << " samples in " << (end - begin) << " microseconds" << std::endl; ASSERT_EQ(1, msg_rx->rx_message) << "Acquisition failure. Expected message: 1=ACQ SUCCESS."; std::cout << "Delay: " << gnss_synchro.Acq_delay_samples << std::endl; std::cout << "Doppler: " << gnss_synchro.Acq_doppler_hz << std::endl; double delay_error_samples = std::abs(expected_delay_samples - gnss_synchro.Acq_delay_samples); float delay_error_chips = (float)(delay_error_samples * 1023 / 4000000); double doppler_error_hz = std::abs(expected_doppler_hz - gnss_synchro.Acq_doppler_hz); EXPECT_LE(doppler_error_hz, 166) << "Doppler error exceeds the expected value: 166 Hz = 2/(3*integration period)"; EXPECT_LT(delay_error_chips, 0.175) << "Delay error exceeds the expected value: 0.175 chips"; } galileo_e1_pcps_cccwsr_ambiguous_acquisition_gsoc2013_test.cc000066400000000000000000000620011305042567700424570ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/acquisition/*! * \file galileo_e1_pcps_cccwsr_ambiguous_acquisition_gsoc2013_test.cc * \brief This class implements an acquisition test for * GalileoE1PcpsCccwsrAmbiguousAcquisition class. * \author Marc Molina, 2013. marc.molina.pena(at)gmail.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include "gnss_block_interface.h" #include "in_memory_configuration.h" #include "gnss_synchro.h" #include "galileo_e1_pcps_cccwsr_ambiguous_acquisition.h" #include "signal_generator.h" #include "signal_generator_c.h" #include "fir_filter.h" #include "gen_signal_source.h" #include "gnss_sdr_valve.h" // ######## GNURADIO BLOCK MESSAGE RECEVER ######### class GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx; typedef boost::shared_ptr GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx_sptr; GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx_sptr GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx_make(concurrent_queue& queue); class GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx : public gr::block { private: friend GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx_sptr GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx_make(concurrent_queue& queue ); void msg_handler_events(pmt::pmt_t msg); GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx(concurrent_queue& queue); concurrent_queue& channel_internal_queue; public: int rx_message; ~GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx(); //!< Default destructor }; GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx_sptr GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx_make(concurrent_queue& queue) { return GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx_sptr(new GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx(queue)); } void GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx::msg_handler_events(pmt::pmt_t msg) { try { long int message = pmt::to_long(msg); rx_message = message; channel_internal_queue.push(rx_message); } catch(boost::bad_any_cast& e) { LOG(WARNING) << "msg_handler_telemetry Bad any cast!"; rx_message = 0; } } GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx::GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx(concurrent_queue& queue) : gr::block("GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)), channel_internal_queue(queue) { this->message_port_register_in(pmt::mp("events")); this->set_msg_handler(pmt::mp("events"), boost::bind(&GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx::msg_handler_events, this, _1)); rx_message = 0; } GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx::~GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx() {} // ########################################################### class GalileoE1PcpsCccwsrAmbiguousAcquisitionTest: public ::testing::Test { protected: GalileoE1PcpsCccwsrAmbiguousAcquisitionTest() { factory = std::make_shared(); item_size = sizeof(gr_complex); stop = false; message = 0; gnss_synchro = Gnss_Synchro(); init(); } ~GalileoE1PcpsCccwsrAmbiguousAcquisitionTest() { } void init(); void config_1(); void config_2(); void start_queue(); void wait_message(); void process_message(); void stop_queue(); concurrent_queue channel_internal_queue; gr::msg_queue::sptr queue; gr::top_block_sptr top_block; std::shared_ptr acquisition; std::shared_ptr factory; std::shared_ptr config; Gnss_Synchro gnss_synchro; size_t item_size; bool stop; int message; boost::thread ch_thread; unsigned int integration_time_ms = 0; unsigned int fs_in = 0; double expected_delay_chips = 0.0; double expected_doppler_hz = 0.0; float max_doppler_error_hz = 0; float max_delay_error_chips = 0; unsigned int num_of_realizations = 0; unsigned int realization_counter; unsigned int detection_counter; unsigned int correct_estimation_counter; unsigned int acquired_samples; unsigned int mean_acq_time_us; double mse_doppler; double mse_delay; double Pd; double Pfa_p; double Pfa_a; }; void GalileoE1PcpsCccwsrAmbiguousAcquisitionTest::init() { message = 0; realization_counter = 0; detection_counter = 0; correct_estimation_counter = 0; acquired_samples = 0; mse_doppler = 0; mse_delay = 0; mean_acq_time_us = 0; Pd = 0; Pfa_p = 0; Pfa_a = 0; } void GalileoE1PcpsCccwsrAmbiguousAcquisitionTest::config_1() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'E'; std::string signal = "1C"; signal.copy(gnss_synchro.Signal,2,0); integration_time_ms = 4; fs_in = 4e6; expected_delay_chips = 600; expected_doppler_hz = 750; max_doppler_error_hz = 2/(3*integration_time_ms*1e-3); max_delay_error_chips = 0.50; num_of_realizations = 1; config = std::make_shared(); config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.num_satellites", "1"); config->set_property("SignalSource.system_0", "E"); config->set_property("SignalSource.PRN_0", "10"); config->set_property("SignalSource.CN0_dB_0", "44"); config->set_property("SignalSource.doppler_Hz_0", std::to_string(expected_doppler_hz)); config->set_property("SignalSource.delay_chips_0", std::to_string(expected_delay_chips)); config->set_property("SignalSource.noise_flag", "false"); config->set_property("SignalSource.data_flag", "false"); config->set_property("SignalSource.BW_BB", "0.97"); config->set_property("InputFilter.implementation", "Fir_Filter"); config->set_property("InputFilter.input_item_type", "gr_complex"); config->set_property("InputFilter.output_item_type", "gr_complex"); config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", "11"); config->set_property("InputFilter.number_of_bands", "2"); config->set_property("InputFilter.band1_begin", "0.0"); config->set_property("InputFilter.band1_end", "0.97"); config->set_property("InputFilter.band2_begin", "0.98"); config->set_property("InputFilter.band2_end", "1.0"); config->set_property("InputFilter.ampl1_begin", "1.0"); config->set_property("InputFilter.ampl1_end", "1.0"); config->set_property("InputFilter.ampl2_begin", "0.0"); config->set_property("InputFilter.ampl2_end", "0.0"); config->set_property("InputFilter.band1_error", "1.0"); config->set_property("InputFilter.band2_error", "1.0"); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", "16"); config->set_property("Acquisition.item_type", "gr_complex"); config->set_property("Acquisition.if", "0"); config->set_property("Acquisition.coherent_integration_time_ms", std::to_string(integration_time_ms)); config->set_property("Acquisition.max_dwells", "1"); config->set_property("Acquisition.implementation", "Galileo_E1_PCPS_CCCWSR_Ambiguous_Acquisition"); config->set_property("Acquisition.threshold", "0.7"); config->set_property("Acquisition.doppler_max", "10000"); config->set_property("Acquisition.doppler_step", "250"); config->set_property("Acquisition.dump", "false"); } void GalileoE1PcpsCccwsrAmbiguousAcquisitionTest::config_2() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'E'; std::string signal = "1C"; signal.copy(gnss_synchro.Signal, 2, 0); integration_time_ms = 4; fs_in = 4e6; expected_delay_chips = 600; expected_doppler_hz = 750; max_doppler_error_hz = 2/(3*integration_time_ms*1e-3); max_delay_error_chips = 0.50; num_of_realizations = 100; config = std::make_shared(); config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.num_satellites", "4"); config->set_property("SignalSource.system_0", "E"); config->set_property("SignalSource.PRN_0", "10"); config->set_property("SignalSource.CN0_dB_0", "44"); config->set_property("SignalSource.doppler_Hz_0", std::to_string(expected_doppler_hz)); config->set_property("SignalSource.delay_chips_0", std::to_string(expected_delay_chips)); config->set_property("SignalSource.system_1", "E"); config->set_property("SignalSource.PRN_1", "15"); config->set_property("SignalSource.CN0_dB_1", "44"); config->set_property("SignalSource.doppler_Hz_1", "1000"); config->set_property("SignalSource.delay_chips_1", "100"); config->set_property("SignalSource.system_2", "E"); config->set_property("SignalSource.PRN_2", "21"); config->set_property("SignalSource.CN0_dB_2", "44"); config->set_property("SignalSource.doppler_Hz_2", "2000"); config->set_property("SignalSource.delay_chips_2", "200"); config->set_property("SignalSource.system_3", "E"); config->set_property("SignalSource.PRN_3", "22"); config->set_property("SignalSource.CN0_dB_3", "44"); config->set_property("SignalSource.doppler_Hz_3", "3000"); config->set_property("SignalSource.delay_chips_3", "300"); config->set_property("SignalSource.noise_flag", "true"); config->set_property("SignalSource.data_flag", "true"); config->set_property("SignalSource.BW_BB", "0.97"); config->set_property("InputFilter.implementation", "Fir_Filter"); config->set_property("InputFilter.input_item_type", "gr_complex"); config->set_property("InputFilter.output_item_type", "gr_complex"); config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", "11"); config->set_property("InputFilter.number_of_bands", "2"); config->set_property("InputFilter.band1_begin", "0.0"); config->set_property("InputFilter.band1_end", "0.97"); config->set_property("InputFilter.band2_begin", "0.98"); config->set_property("InputFilter.band2_end", "1.0"); config->set_property("InputFilter.ampl1_begin", "1.0"); config->set_property("InputFilter.ampl1_end", "1.0"); config->set_property("InputFilter.ampl2_begin", "0.0"); config->set_property("InputFilter.ampl2_end", "0.0"); config->set_property("InputFilter.band1_error", "1.0"); config->set_property("InputFilter.band2_error", "1.0"); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", "16"); config->set_property("Acquisition.item_type", "gr_complex"); config->set_property("Acquisition.if", "0"); config->set_property("Acquisition.coherent_integration_time_ms", std::to_string(integration_time_ms)); config->set_property("Acquisition.max_dwells", "1"); config->set_property("Acquisition.implementation", "Galileo_E1_PCPS_CCCWSR_Ambiguous_Acquisition"); config->set_property("Acquisition.threshold", "0.00215"); // Pfa,a = 0.1 config->set_property("Acquisition.doppler_max", "10000"); config->set_property("Acquisition.doppler_step", "250"); config->set_property("Acquisition.dump", "false"); } void GalileoE1PcpsCccwsrAmbiguousAcquisitionTest::start_queue() { stop = false; ch_thread = boost::thread(&GalileoE1PcpsCccwsrAmbiguousAcquisitionTest::wait_message, this); } void GalileoE1PcpsCccwsrAmbiguousAcquisitionTest::wait_message() { struct timeval tv; long long int begin = 0; long long int end = 0; while (!stop) { acquisition->reset(); gettimeofday(&tv, NULL); begin = tv.tv_sec *1e6 + tv.tv_usec; channel_internal_queue.wait_and_pop(message); gettimeofday(&tv, NULL); end = tv.tv_sec *1e6 + tv.tv_usec; mean_acq_time_us += (end-begin); process_message(); } } void GalileoE1PcpsCccwsrAmbiguousAcquisitionTest::process_message() { if (message == 1) { detection_counter++; // The term -5 is here to correct the additional delay introduced by the FIR filter double delay_error_chips = std::abs((double)expected_delay_chips - (double)(gnss_synchro.Acq_delay_samples-5)*1023.0/((double)fs_in*1e-3)); double doppler_error_hz = std::abs(expected_doppler_hz - gnss_synchro.Acq_doppler_hz); mse_delay += std::pow(delay_error_chips, 2); mse_doppler += std::pow(doppler_error_hz, 2); if ((delay_error_chips < max_delay_error_chips) && (doppler_error_hz < max_doppler_error_hz)) { correct_estimation_counter++; } } realization_counter++; std::cout << "Progress: " << round((float)realization_counter/num_of_realizations*100) << "% \r" << std::flush; if (realization_counter == num_of_realizations) { mse_delay /= num_of_realizations; mse_doppler /= num_of_realizations; Pd = (double)correct_estimation_counter / (double)num_of_realizations; Pfa_a = (double)detection_counter / (double)num_of_realizations; Pfa_p = (double)(detection_counter-correct_estimation_counter) / (double)num_of_realizations; mean_acq_time_us /= num_of_realizations; stop_queue(); top_block->stop(); std::cout << std::endl; } } void GalileoE1PcpsCccwsrAmbiguousAcquisitionTest::stop_queue() { stop = true; } TEST_F(GalileoE1PcpsCccwsrAmbiguousAcquisitionTest, Instantiate) { config_1(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_CCCWSR_Ambiguous_Acquisition", 1, 1); acquisition = std::dynamic_pointer_cast(acq_); } TEST_F(GalileoE1PcpsCccwsrAmbiguousAcquisitionTest, ConnectAndRun) { int nsamples = floor(fs_in*integration_time_ms*1e-3); struct timeval tv; long long int begin = 0; long long int end = 0; config_1(); top_block = gr::make_top_block("Acquisition test"); queue = gr::msg_queue::make(0); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_CCCWSR_Ambiguous_Acquisition", 1, 1); acquisition = std::dynamic_pointer_cast(acq_); boost::shared_ptr msg_rx = GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->connect(top_block); boost::shared_ptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000, 1, gr_complex(0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); top_block->connect(source, 0, valve, 0); top_block->connect(valve, 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test."<< std::endl; EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec *1e6 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec *1e6 + tv.tv_usec; }) << "Failure running the top_block."<< std::endl; std::cout << "Processed " << nsamples << " samples in " << (end - begin) << " microseconds" << std::endl; } TEST_F(GalileoE1PcpsCccwsrAmbiguousAcquisitionTest, ValidationOfResults) { config_1(); top_block = gr::make_top_block("Acquisition test"); queue = gr::msg_queue::make(0); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_CCCWSR_Ambiguous_Acquisition", 1, 1); acquisition = std::dynamic_pointer_cast(acq_); boost::shared_ptr msg_rx = GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->set_channel(1); }) << "Failure setting channel."<< std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro."<< std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(config->property("Acquisition.doppler_max", 10000)); }) << "Failure setting doppler_max."<< std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(config->property("Acquisition.doppler_step", 500)); }) << "Failure setting doppler_step."<< std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(config->property("Acquisition.threshold", 0.00001)); }) << "Failure setting threshold."<< std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); }) << "Failure connecting acquisition to the top_block."<< std::endl; acquisition->init(); acquisition->reset(); ASSERT_NO_THROW( { boost::shared_ptr signal_source; SignalGenerator* signal_generator = new SignalGenerator(config.get(), "SignalSource", 0, 1, queue); FirFilter* filter = new FirFilter(config.get(), "InputFilter", 1, 1); signal_source.reset(new GenSignalSource(signal_generator, filter, "SignalSource", queue)); signal_source->connect(top_block); top_block->connect(signal_source->get_right_block(), 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; // i = 0 --> satellite in acquisition is visible // i = 1 --> satellite in acquisition is not visible for (unsigned int i = 0; i < 2; i++) { init(); if (i == 0) { gnss_synchro.PRN = 10; // This satellite is visible } else if (i == 1) { gnss_synchro.PRN = 20; // This satellite is not visible } acquisition->set_gnss_synchro(&gnss_synchro); acquisition->set_local_code(); acquisition->reset(); acquisition->set_state(1); start_queue(); EXPECT_NO_THROW( { top_block->run(); // Start threads and wait }) << "Failure running the top_block." << std::endl; stop_queue(); if (i == 0) { EXPECT_EQ(1, message) << "Acquisition failure. Expected message: 1=ACQ SUCCESS."; //EXPECT_EQ(2, message) << "Acquisition failure. Expected message: 1=ACQ SUCCESS."; if (message == 1) { EXPECT_EQ((unsigned int)1, correct_estimation_counter) << "Acquisition failure. Incorrect parameters estimation."; } } else if (i == 1) { EXPECT_EQ(2, message) << "Acquisition failure. Expected message: 2=ACQ FAIL."; } #ifdef OLD_BOOST ASSERT_NO_THROW( { ch_thread.timed_join(boost::posix_time::seconds(1)); }) << "Failure while waiting the queue to stop" << std::endl; #endif #ifndef OLD_BOOST ASSERT_NO_THROW( { ch_thread.try_join_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(50)); }) << "Failure while waiting the queue to stop" << std::endl; #endif } } TEST_F(GalileoE1PcpsCccwsrAmbiguousAcquisitionTest, ValidationOfResultsProbabilities) { config_2(); top_block = gr::make_top_block("Acquisition test"); queue = gr::msg_queue::make(0); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_CCCWSR_Ambiguous_Acquisition", 1, 1); acquisition = std::dynamic_pointer_cast(acq_); boost::shared_ptr msg_rx = GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->set_channel(1); }) << "Failure setting channel."<< std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro."<< std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(config->property("Acquisition.doppler_max", 10000)); }) << "Failure setting doppler_max."<< std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(config->property("Acquisition.doppler_step", 500)); }) << "Failure setting doppler_step."<< std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(config->property("Acquisition.threshold", 0.00215)); }) << "Failure setting threshold."<< std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); }) << "Failure connecting acquisition to the top_block."<< std::endl; acquisition->init(); acquisition->reset(); ASSERT_NO_THROW( { boost::shared_ptr signal_source; SignalGenerator* signal_generator = new SignalGenerator(config.get(), "SignalSource", 0, 1, queue); FirFilter* filter = new FirFilter(config.get(), "InputFilter", 1, 1); signal_source.reset(new GenSignalSource(signal_generator, filter, "SignalSource", queue)); signal_source->connect(top_block); top_block->connect(signal_source->get_right_block(), 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; std::cout << "Probability of false alarm (target) = " << 0.1 << std::endl; // i = 0 --> satellite in acquisition is visible (prob of detection and prob of detection with wrong estimation) // i = 1 --> satellite in acquisition is not visible (prob of false detection) for (unsigned int i = 0; i < 2; i++) { init(); if (i == 0) { gnss_synchro.PRN = 10; // This satellite is visible } else if (i == 1) { gnss_synchro.PRN = 20; // This satellite is not visible } acquisition->set_gnss_synchro(&gnss_synchro); acquisition->init(); acquisition->reset(); acquisition->set_local_code(); acquisition->set_state(1); start_queue(); EXPECT_NO_THROW( { top_block->run(); // Start threads and wait }) << "Failure running the top_block."<< std::endl; stop_queue(); if (i == 0) { std::cout << "Estimated probability of detection = " << Pd << std::endl; std::cout << "Estimated probability of false alarm (satellite present) = " << Pfa_p << std::endl; std::cout << "Mean acq time = " << mean_acq_time_us << " microseconds." << std::endl; } else if (i == 1) { std::cout << "Probability of false alarm (satellite absent) = " << Pfa_a << std::endl; std::cout << "Mean acq time = " << mean_acq_time_us << " microseconds." << std::endl; } ch_thread.join(); } } galileo_e1_pcps_quicksync_ambiguous_acquisition_gsoc2014_test.cc000066400000000000000000001074311305042567700432140ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/acquisition/*! * \file galileo_e1_pcps_quicksync_ambiguous_acquisition_gsoc2014_test.cc * \brief This class implements an acquisition test for * GalileoE1PcpsQuickSyncAmbiguousAcquisition class. * \author Damian Miralles, 2014. dmiralles2009@gmail.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include #include #include "gnss_block_interface.h" #include "in_memory_configuration.h" #include "gnss_synchro.h" #include "signal_generator.h" #include "signal_generator_c.h" #include "fir_filter.h" #include "gen_signal_source.h" #include "gnss_sdr_valve.h" #include "galileo_e1_pcps_quicksync_ambiguous_acquisition.h" DEFINE_double(e1_value_threshold, 0.3, "Value of the threshold for the acquisition"); DEFINE_int32(e1_value_CN0_dB_0, 50, "Value for the CN0_dB_0 in channel 0"); using google::LogMessage; // ######## GNURADIO BLOCK MESSAGE RECEVER ######### class GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test_msg_rx; typedef boost::shared_ptr GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test_msg_rx_sptr; GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test_msg_rx_sptr GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test_msg_rx_make(concurrent_queue& queue); class GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test_msg_rx : public gr::block { private: friend GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test_msg_rx_sptr GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test_msg_rx_make(concurrent_queue& queue); void msg_handler_events(pmt::pmt_t msg); GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test_msg_rx(concurrent_queue& queue); concurrent_queue& channel_internal_queue; public: int rx_message; ~GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test_msg_rx(); //!< Default destructor }; GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test_msg_rx_sptr GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test_msg_rx_make(concurrent_queue& queue) { return GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test_msg_rx_sptr(new GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test_msg_rx(queue)); } void GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test_msg_rx::msg_handler_events(pmt::pmt_t msg) { try { long int message = pmt::to_long(msg); rx_message = message; channel_internal_queue.push(rx_message); } catch(boost::bad_any_cast& e) { LOG(WARNING) << "msg_handler_telemetry Bad any cast!"; rx_message = 0; } } GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test_msg_rx::GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test_msg_rx(concurrent_queue& queue) : gr::block("GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test_msg_rx", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)), channel_internal_queue(queue) { this->message_port_register_in(pmt::mp("events")); this->set_msg_handler(pmt::mp("events"), boost::bind(&GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test_msg_rx::msg_handler_events, this, _1)); rx_message = 0; } GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test_msg_rx::~GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test_msg_rx() {} // ########################################################### class GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test: public ::testing::Test { protected: GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test() { factory = std::make_shared(); item_size = sizeof(gr_complex); stop = false; message = 0; gnss_synchro = Gnss_Synchro(); init(); } ~GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test() { } void init(); void config_1(); void config_2(); void config_3(); void start_queue(); void wait_message(); void process_message(); void stop_queue(); concurrent_queue channel_internal_queue; gr::msg_queue::sptr queue; gr::top_block_sptr top_block; std::shared_ptr acquisition; std::shared_ptr factory; std::shared_ptr config; Gnss_Synchro gnss_synchro; size_t item_size; bool stop; int message; boost::thread ch_thread; unsigned int integration_time_ms = 0; unsigned int fs_in = 0; unsigned int folding_factor = 0; double expected_delay_chips = 0.0; double expected_doppler_hz = 0.0; float max_doppler_error_hz = 0.0; float max_delay_error_chips = 0.0; unsigned int num_of_realizations = 0; unsigned int realization_counter; unsigned int detection_counter; unsigned int correct_estimation_counter; unsigned int acquired_samples; unsigned int mean_acq_time_us; double mse_doppler; double mse_delay; double Pd; // Probability of detection double Pfa_p; // Probability of false alarm on present satellite double Pfa_a; // Probability of false alarm on absent satellite double Pmd; // Probability of miss detection std::ofstream pdpfafile; unsigned int miss_detection_counter; bool dump_test_results = false; }; void GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test::init() { message = 0; realization_counter = 0; detection_counter = 0; correct_estimation_counter = 0; acquired_samples = 0; mse_doppler = 0; mse_delay = 0; mean_acq_time_us = 0; Pd = 0; Pfa_p = 0; Pfa_a = 0; miss_detection_counter = 0; Pmd = 0; } void GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test::config_1() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'E'; std::string signal = "1C"; signal.copy(gnss_synchro.Signal, 2, 0); integration_time_ms = 8; fs_in = 4e6; expected_delay_chips = 600; expected_doppler_hz = 750; max_doppler_error_hz = 2/(3*integration_time_ms*1e-3); max_delay_error_chips = 0.50; num_of_realizations = 1; config = std::make_shared(); config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.num_satellites", "1"); config->set_property("SignalSource.system_0", "E"); config->set_property("SignalSource.PRN_0", "10"); config->set_property("SignalSource.CN0_dB_0", "44"); config->set_property("SignalSource.doppler_Hz_0", std::to_string(expected_doppler_hz)); config->set_property("SignalSource.delay_chips_0", std::to_string(expected_delay_chips)); config->set_property("SignalSource.noise_flag", "false"); config->set_property("SignalSource.data_flag", "false"); config->set_property("SignalSource.BW_BB", "0.97"); config->set_property("InputFilter.implementation", "Fir_Filter"); config->set_property("InputFilter.input_item_type", "gr_complex"); config->set_property("InputFilter.output_item_type", "gr_complex"); config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", "11"); config->set_property("InputFilter.number_of_bands", "2"); config->set_property("InputFilter.band1_begin", "0.0"); config->set_property("InputFilter.band1_end", "0.97"); config->set_property("InputFilter.band2_begin", "0.98"); config->set_property("InputFilter.band2_end", "1.0"); config->set_property("InputFilter.ampl1_begin", "1.0"); config->set_property("InputFilter.ampl1_end", "1.0"); config->set_property("InputFilter.ampl2_begin", "0.0"); config->set_property("InputFilter.ampl2_end", "0.0"); config->set_property("InputFilter.band1_error", "1.0"); config->set_property("InputFilter.band2_error", "1.0"); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", "16"); config->set_property("Acquisition.item_type", "gr_complex"); config->set_property("Acquisition.if", "0"); config->set_property("Acquisition.coherent_integration_time_ms", std::to_string(integration_time_ms)); config->set_property("Acquisition.max_dwells", "1"); config->set_property("Acquisition.bit_transition_flag","false"); config->set_property("Acquisition.implementation", "Galileo_E1_PCPS_QuickSync_Ambiguous_Acquisition"); config->set_property("Acquisition.threshold", "1"); config->set_property("Acquisition.doppler_max", "10000"); config->set_property("Acquisition.doppler_step", "250"); config->set_property("Acquisition.folding_factor", "2"); config->set_property("Acquisition.dump", "false"); } void GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test::config_2() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'E'; std::string signal = "1C"; signal.copy(gnss_synchro.Signal, 2, 0); integration_time_ms = 8; fs_in = 4e6; expected_delay_chips = 600; expected_doppler_hz = 750; max_doppler_error_hz = 2 / (3 * integration_time_ms * 1e-3); max_delay_error_chips = 0.50; /*Unset this flag to eliminates data logging for the Validation of results probabilities test*/ dump_test_results = true; num_of_realizations = 100; config = std::make_shared(); config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.num_satellites", "4"); config->set_property("SignalSource.system_0", "E"); config->set_property("SignalSource.PRN_0", "10"); config->set_property("SignalSource.CN0_dB_0", std::to_string(FLAGS_e1_value_CN0_dB_0)); config->set_property("SignalSource.doppler_Hz_0", std::to_string(expected_doppler_hz)); config->set_property("SignalSource.delay_chips_0", std::to_string(expected_delay_chips)); config->set_property("SignalSource.system_1", "E"); config->set_property("SignalSource.PRN_1", "15"); config->set_property("SignalSource.CN0_dB_1", "44"); config->set_property("SignalSource.doppler_Hz_1", "1000"); config->set_property("SignalSource.delay_chips_1", "100"); config->set_property("SignalSource.system_2", "E"); config->set_property("SignalSource.PRN_2", "21"); config->set_property("SignalSource.CN0_dB_2", "44"); config->set_property("SignalSource.doppler_Hz_2", "2000"); config->set_property("SignalSource.delay_chips_2", "200"); config->set_property("SignalSource.system_3", "E"); config->set_property("SignalSource.PRN_3", "22"); config->set_property("SignalSource.CN0_dB_3", "44"); config->set_property("SignalSource.doppler_Hz_3", "3000"); config->set_property("SignalSource.delay_chips_3", "300"); config->set_property("SignalSource.noise_flag", "true"); config->set_property("SignalSource.data_flag", "true"); config->set_property("SignalSource.BW_BB", "0.97"); config->set_property("InputFilter.implementation", "Fir_Filter"); config->set_property("InputFilter.input_item_type", "gr_complex"); config->set_property("InputFilter.output_item_type", "gr_complex"); config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", "11"); config->set_property("InputFilter.number_of_bands", "2"); config->set_property("InputFilter.band1_begin", "0.0"); config->set_property("InputFilter.band1_end", "0.97"); config->set_property("InputFilter.band2_begin", "0.98"); config->set_property("InputFilter.band2_end", "1.0"); config->set_property("InputFilter.ampl1_begin", "1.0"); config->set_property("InputFilter.ampl1_end", "1.0"); config->set_property("InputFilter.ampl2_begin", "0.0"); config->set_property("InputFilter.ampl2_end", "0.0"); config->set_property("InputFilter.band1_error", "1.0"); config->set_property("InputFilter.band2_error", "1.0"); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", "16"); config->set_property("Acquisition.item_type", "gr_complex"); config->set_property("Acquisition.if", "0"); config->set_property("Acquisition.coherent_integration_time_ms", std::to_string(integration_time_ms)); config->set_property("Acquisition.max_dwells", "1"); config->set_property("Acquisition.bit_transition_flag","false"); config->set_property("Acquisition.implementation", "Galileo_E1_PCPS_QuickSync_Ambiguous_Acquisition"); config->set_property("Acquisition.threshold", std::to_string(FLAGS_e1_value_threshold)); config->set_property("Acquisition.doppler_max", "10000"); config->set_property("Acquisition.doppler_step", "125"); config->set_property("Acquisition.folding_factor", "2"); config->set_property("Acquisition.dump", "false"); } void GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test::config_3() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'E'; std::string signal = "1C"; signal.copy(gnss_synchro.Signal, 2, 0); integration_time_ms = 8; fs_in = 4e6; expected_delay_chips = 600; expected_doppler_hz = 750; max_doppler_error_hz = 2 / (3 * integration_time_ms * 1e-3); max_delay_error_chips = 0.50; num_of_realizations = 1; config = std::make_shared(); config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.num_satellites", "4"); config->set_property("SignalSource.system_0", "E"); config->set_property("SignalSource.PRN_0", "10"); config->set_property("SignalSource.CN0_dB_0", std::to_string(FLAGS_e1_value_CN0_dB_0)); config->set_property("SignalSource.doppler_Hz_0", std::to_string(expected_doppler_hz)); config->set_property("SignalSource.delay_chips_0", std::to_string(expected_delay_chips)); config->set_property("SignalSource.system_1", "E"); config->set_property("SignalSource.PRN_1", "15"); config->set_property("SignalSource.CN0_dB_1", "44"); config->set_property("SignalSource.doppler_Hz_1", "1000"); config->set_property("SignalSource.delay_chips_1", "100"); config->set_property("SignalSource.system_2", "E"); config->set_property("SignalSource.PRN_2", "21"); config->set_property("SignalSource.CN0_dB_2", "44"); config->set_property("SignalSource.doppler_Hz_2", "2000"); config->set_property("SignalSource.delay_chips_2", "200"); config->set_property("SignalSource.system_3", "E"); config->set_property("SignalSource.PRN_3", "22"); config->set_property("SignalSource.CN0_dB_3", "44"); config->set_property("SignalSource.doppler_Hz_3", "3000"); config->set_property("SignalSource.delay_chips_3", "300"); config->set_property("SignalSource.noise_flag", "false");// config->set_property("SignalSource.data_flag", "false");// config->set_property("SignalSource.BW_BB", "0.97"); config->set_property("InputFilter.implementation", "Fir_Filter"); config->set_property("InputFilter.input_item_type", "gr_complex"); config->set_property("InputFilter.output_item_type", "gr_complex"); config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", "11"); config->set_property("InputFilter.number_of_bands", "2"); config->set_property("InputFilter.band1_begin", "0.0"); config->set_property("InputFilter.band1_end", "0.97"); config->set_property("InputFilter.band2_begin", "0.98"); config->set_property("InputFilter.band2_end", "1.0"); config->set_property("InputFilter.ampl1_begin", "1.0"); config->set_property("InputFilter.ampl1_end", "1.0"); config->set_property("InputFilter.ampl2_begin", "0.0"); config->set_property("InputFilter.ampl2_end", "0.0"); config->set_property("InputFilter.band1_error", "1.0"); config->set_property("InputFilter.band2_error", "1.0"); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", "16"); config->set_property("Acquisition.item_type", "gr_complex"); config->set_property("Acquisition.if", "0"); config->set_property("Acquisition.coherent_integration_time_ms", std::to_string(integration_time_ms)); config->set_property("Acquisition.max_dwells", "1"); config->set_property("Acquisition.bit_transition_flag","false"); config->set_property("Acquisition.implementation", "Galileo_E1_PCPS_QuickSync_Ambiguous_Acquisition"); config->set_property("Acquisition.threshold", "0.2"); config->set_property("Acquisition.doppler_max", "10000"); config->set_property("Acquisition.doppler_step", "125"); config->set_property("Acquisition.folding_factor", "4"); config->set_property("Acquisition.dump", "false"); } void GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test::start_queue() { stop = false; ch_thread = boost::thread(&GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test::wait_message, this); } void GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test::wait_message() { struct timeval tv; long long int begin = 0; long long int end = 0; while (!stop) { acquisition->reset(); gettimeofday(&tv, NULL); begin = tv.tv_sec*1e6 + tv.tv_usec; channel_internal_queue.wait_and_pop(message); gettimeofday(&tv, NULL); end = tv.tv_sec*1e6 + tv.tv_usec; mean_acq_time_us += (end - begin); process_message(); } } void GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test::process_message() { if (message == 1) { detection_counter++; // The term -5 is here to correct the additional delay introduced by the FIR filter double delay_error_chips = std::abs((double)expected_delay_chips - (double)(gnss_synchro.Acq_delay_samples - 5) * 1023.0 / ((double)fs_in * 1e-3)); double doppler_error_hz = std::abs(expected_doppler_hz - gnss_synchro.Acq_doppler_hz); mse_delay += std::pow(delay_error_chips, 2); mse_doppler += std::pow(doppler_error_hz, 2); if ((delay_error_chips < max_delay_error_chips) && (doppler_error_hz < max_doppler_error_hz)) { correct_estimation_counter++; } } else if(message == 2 && gnss_synchro.PRN == 10) { /* if ((delay_error_chips < max_delay_error_chips) && (doppler_error_hz < max_doppler_error_hz)) { miss_detection_counter++; } */ miss_detection_counter++; } realization_counter++; std::cout << "Progress: " << round((float)realization_counter / num_of_realizations * 100) << "% \r" << std::flush; if (realization_counter == num_of_realizations) { mse_delay /= (double)num_of_realizations; mse_doppler /= (double)num_of_realizations; Pd = (double)correct_estimation_counter / (double)num_of_realizations; Pfa_a = (double)detection_counter / (double)num_of_realizations; Pfa_p = (double)(detection_counter - correct_estimation_counter) / (double)num_of_realizations; Pmd = (double)miss_detection_counter / (double)num_of_realizations; mean_acq_time_us /= (double)num_of_realizations; stop_queue(); top_block->stop(); } } void GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test::stop_queue() { stop = true; } TEST_F(GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test, Instantiate) { config_1(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_QuickSync_Ambiguous_Acquisition", 1, 1); acquisition = std::dynamic_pointer_cast(acq_); } TEST_F(GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test, ConnectAndRun) { LOG(INFO) << "**Start connect and run test"; int nsamples = floor(fs_in*integration_time_ms*1e-3); struct timeval tv; long long int begin = 0; long long int end = 0; top_block = gr::make_top_block("Acquisition test"); queue = gr::msg_queue::make(0); config_1(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_QuickSync_Ambiguous_Acquisition", 1, 1); acquisition = std::dynamic_pointer_cast(acq_); boost::shared_ptr msg_rx = GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->connect(top_block); boost::shared_ptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000, 1, gr_complex(0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); top_block->connect(source, 0, valve, 0); top_block->connect(valve, 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test."<< std::endl; EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec * 1e6 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec * 1e6 + tv.tv_usec; }) << "Failure running the top_block."<< std::endl; std::cout << "Processed " << nsamples << " samples in " << (end - begin) << " microseconds" << std::endl; LOG(INFO) << "----end connect and run test-----"; LOG(INFO) << "**End connect and run test"; } TEST_F(GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test, ValidationOfResults) { LOG(INFO) << "Start validation of results test"; config_1(); top_block = gr::make_top_block("Acquisition test"); queue = gr::msg_queue::make(0); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_QuickSync_Ambiguous_Acquisition", 1, 1); acquisition = std::dynamic_pointer_cast(acq_); boost::shared_ptr msg_rx = GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->set_channel(0); }) << "Failure setting channel."<< std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro."<< std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(config->property("Acquisition.doppler_max", 10000)); }) << "Failure setting doppler_max."<< std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(config->property("Acquisition.doppler_step", 125)); }) << "Failure setting doppler_step."<< std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(1); }) << "Failure setting threshold."<< std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); }) << "Failure connecting acquisition to the top_block." << std::endl; acquisition->init(); acquisition->reset(); ASSERT_NO_THROW( { boost::shared_ptr signal_source; SignalGenerator* signal_generator = new SignalGenerator(config.get(), "SignalSource", 0, 1, queue); FirFilter* filter = new FirFilter(config.get(), "InputFilter", 1, 1); signal_source.reset(new GenSignalSource(signal_generator, filter, "SignalSource", queue)); signal_source->connect(top_block); top_block->connect(signal_source->get_right_block(), 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; // i = 0 --> satellite in acquisition is visible // i = 1 --> satellite in acquisition is not visible for (unsigned int i = 0; i < 2; i++) { init(); if (i == 0) { gnss_synchro.PRN = 10; // This satellite is visible } else if (i == 1) { gnss_synchro.PRN = 20; // This satellite is not visible } acquisition->set_gnss_synchro(&gnss_synchro); acquisition->set_local_code(); acquisition->reset(); acquisition->set_state(1); start_queue(); EXPECT_NO_THROW( { top_block->run(); // Start threads and wait }) << "Failure running the top_block."<< std::endl; stop_queue(); if (i == 0) { EXPECT_EQ(1, message) << "Acquisition failure. Expected message: 1=ACQ SUCCESS."; EXPECT_EQ((unsigned int)1, correct_estimation_counter) << "Acquisition failure. Incorrect parameters estimation."; } else if (i == 1) { EXPECT_EQ(2, message) << "Acquisition failure. Expected message: 2=ACQ FAIL."; } ch_thread.join(); } DLOG(INFO) << "End validation of results test"; } TEST_F(GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test, ValidationOfResultsWithNoise) { LOG(INFO) << "Start validation of results with noise+interference test"; config_3(); top_block = gr::make_top_block("Acquisition test"); queue = gr::msg_queue::make(0); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_QuickSync_Ambiguous_Acquisition", 1, 1); acquisition = std::dynamic_pointer_cast(acq_); boost::shared_ptr msg_rx = GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->set_channel(1); }) << "Failure setting channel."<< std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro."<< std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(config->property("Acquisition.doppler_max", 10000)); }) << "Failure setting doppler_max."<< std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(50); }) << "Failure setting doppler_step."<< std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(5); }) << "Failure setting threshold."<< std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); }) << "Failure connecting acquisition to the top_block." << std::endl; acquisition->init(); acquisition->reset(); ASSERT_NO_THROW( { boost::shared_ptr signal_source; SignalGenerator* signal_generator = new SignalGenerator(config.get(), "SignalSource", 0, 1, queue); FirFilter* filter = new FirFilter(config.get(), "InputFilter", 1, 1); signal_source.reset(new GenSignalSource(signal_generator, filter, "SignalSource", queue)); signal_source->connect(top_block); top_block->connect(signal_source->get_right_block(), 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; // i = 0 --> satellite in acquisition is visible // i = 1 --> satellite in acquisition is not visible for (unsigned int i = 0; i < 2; i++) { init(); if (i == 0) { gnss_synchro.PRN = 10; // This satellite is visible } else if (i == 1) { gnss_synchro.PRN = 20; // This satellite is not visible } acquisition->set_gnss_synchro(&gnss_synchro); acquisition->set_local_code(); acquisition->reset(); acquisition->set_state(1); start_queue(); EXPECT_NO_THROW( { top_block->run(); // Start threads and wait }) << "Failure running the top_block." << std::endl; stop_queue(); if (i == 0) { EXPECT_EQ(1, message) << "Acquisition failure. Expected message: 1=ACQ SUCCESS."; EXPECT_EQ((unsigned int)1, correct_estimation_counter) << "Acquisition failure. Incorrect parameters estimation."; } else if (i == 1) { EXPECT_EQ(2, message) << "Acquisition failure. Expected message: 2=ACQ FAIL."; } ch_thread.join(); } DLOG(INFO) << "End validation of results with noise+interference test"; } TEST_F(GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test, ValidationOfResultsProbabilities) { config_2(); top_block = gr::make_top_block("Acquisition test"); queue = gr::msg_queue::make(0); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_QuickSync_Ambiguous_Acquisition", 1, 1); acquisition = std::dynamic_pointer_cast(acq_); boost::shared_ptr msg_rx = GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->set_channel(1); }) << "Failure setting channel."<< std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro."<< std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(config->property("Acquisition.doppler_max", 10000)); }) << "Failure setting doppler_max."<< std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(config->property("Acquisition.doppler_step", 500)); }) << "Failure setting doppler_step."<< std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(config->property("Acquisition.threshold", 0.0)); }) << "Failure setting threshold."<< std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); }) << "Failure connecting acquisition to the top_block." << std::endl; acquisition->init(); ASSERT_NO_THROW( { boost::shared_ptr signal_source; SignalGenerator* signal_generator = new SignalGenerator(config.get(), "SignalSource", 0, 1, queue); FirFilter* filter = new FirFilter(config.get(), "InputFilter", 1, 1); signal_source.reset(new GenSignalSource(signal_generator, filter, "SignalSource", queue)); signal_source->connect(top_block); top_block->connect(signal_source->get_right_block(), 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; std::cout << "Probability of false alarm (target) = " << 0.1 << std::endl; // i = 0 --> satellite in acquisition is visible (prob of detection and prob of detection with wrong estimation) // i = 1 --> satellite in acquisition is not visible (prob of false detection) for (unsigned int i = 0; i < 2; i++) { init(); if (i == 0) { gnss_synchro.PRN = 10; // This satellite is visible } else if (i == 1) { gnss_synchro.PRN = 20; // This satellite is not visible } acquisition->set_gnss_synchro(&gnss_synchro); acquisition->set_local_code(); acquisition->reset(); acquisition->set_state(1); start_queue(); EXPECT_NO_THROW( { top_block->run(); // Start threads and wait }) << "Failure running the top_block." << std::endl; stop_queue(); if (i == 0) { std::cout << "Estimated probability of detection = " << Pd << std::endl; std::cout << "Estimated probability of false alarm (satellite present) = " << Pfa_p << std::endl; std::cout << "Estimated probability of miss detection (satellite present) = " << Pmd << std::endl; std::cout << "Mean acq time = " << mean_acq_time_us << " microseconds." << std::endl; if(dump_test_results) { std::stringstream filenamepd; filenamepd.str(""); filenamepd << "../data/test_statistics_" << gnss_synchro.System << "_" << gnss_synchro.Signal << "_sat_" << gnss_synchro.PRN << "CN0_dB_0_" << FLAGS_e1_value_CN0_dB_0 << "_dBHz.csv"; pdpfafile.open(filenamepd.str().c_str(), std::ios::app | std::ios::out); pdpfafile << FLAGS_e1_value_threshold << "," << Pd << "," << Pfa_p << "," << Pmd << std::endl; pdpfafile.close(); } } else if (i == 1) { std::cout << "Estimated probability of false alarm (satellite absent) = " << Pfa_a << std::endl; std::cout << "Mean acq time = " << mean_acq_time_us << " microseconds." << std::endl; if(dump_test_results) { std::stringstream filenamepf; filenamepf.str(""); filenamepf << "../data/test_statistics_" << gnss_synchro.System << "_" << gnss_synchro.Signal << "_sat_" << gnss_synchro.PRN << "CN0_dB_0_" << FLAGS_e1_value_CN0_dB_0 << "_dBHz.csv"; pdpfafile.open(filenamepf.str().c_str(), std::ios::app | std::ios::out); pdpfafile << FLAGS_e1_value_threshold << "," << Pfa_a << std::endl; pdpfafile.close(); } } ch_thread.join(); } } galileo_e1_pcps_tong_ambiguous_acquisition_gsoc2013_test.cc000066400000000000000000000611461305042567700421530ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/acquisition/*! * \file galileo_e1_pcps_tong_ambiguous_acquisition_gsoc2013_test.cc * \brief This class implements an acquisition test for * GalileoE1PcpsTongAmbiguousAcquisition class. * \author Marc Molina, 2013. marc.molina.pena(at)gmail.com * * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include #include #include #include "gnss_block_interface.h" #include "in_memory_configuration.h" #include "configuration_interface.h" #include "gnss_synchro.h" #include "galileo_e1_pcps_tong_ambiguous_acquisition.h" #include "signal_generator.h" #include "signal_generator_c.h" #include "fir_filter.h" #include "gen_signal_source.h" #include "gnss_sdr_valve.h" // ######## GNURADIO BLOCK MESSAGE RECEVER ######### class GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx; typedef boost::shared_ptr GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx_sptr; GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx_sptr GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx_make(concurrent_queue& queue); class GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx : public gr::block { private: friend GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx_sptr GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx_make(concurrent_queue& queue); void msg_handler_events(pmt::pmt_t msg); GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx(concurrent_queue& queue); concurrent_queue& channel_internal_queue; public: int rx_message; ~GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx(); //!< Default destructor }; GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx_sptr GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx_make(concurrent_queue& queue) { return GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx_sptr(new GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx(queue)); } void GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx::msg_handler_events(pmt::pmt_t msg) { try { long int message = pmt::to_long(msg); rx_message = message; channel_internal_queue.push(rx_message); } catch(boost::bad_any_cast& e) { LOG(WARNING) << "msg_handler_telemetry Bad any cast!"; rx_message = 0; } } GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx::GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx(concurrent_queue& queue) : gr::block("GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)), channel_internal_queue(queue) { this->message_port_register_in(pmt::mp("events")); this->set_msg_handler(pmt::mp("events"), boost::bind(&GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx::msg_handler_events, this, _1)); rx_message = 0; } GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx::~GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx() {} class GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test: public ::testing::Test { protected: GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test() { factory = std::make_shared(); item_size = sizeof(gr_complex); stop = false; message = 0; gnss_synchro = Gnss_Synchro(); init(); } ~GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test() { } void init(); void config_1(); void config_2(); void start_queue(); void wait_message(); void process_message(); void stop_queue(); concurrent_queue channel_internal_queue; gr::msg_queue::sptr queue; gr::top_block_sptr top_block; std::shared_ptr acquisition; std::shared_ptr factory; std::shared_ptr config; Gnss_Synchro gnss_synchro; size_t item_size; bool stop; int message; boost::thread ch_thread; unsigned int integration_time_ms = 0; unsigned int fs_in = 0; double expected_delay_chips = 0.0; double expected_doppler_hz = 0.0; float max_doppler_error_hz = 0; float max_delay_error_chips = 0; unsigned int num_of_realizations = 0; unsigned int realization_counter; unsigned int detection_counter; unsigned int correct_estimation_counter; unsigned int acquired_samples; unsigned int mean_acq_time_us; double mse_doppler; double mse_delay; double Pd; double Pfa_p; double Pfa_a; }; void GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test::init() { message = 0; realization_counter = 0; detection_counter = 0; correct_estimation_counter = 0; acquired_samples = 0; mse_doppler = 0; mse_delay = 0; mean_acq_time_us = 0; Pd = 0; Pfa_p = 0; Pfa_a = 0; } void GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test::config_1() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'E'; std::string signal = "1B"; signal.copy(gnss_synchro.Signal, 2, 0); integration_time_ms = 4; fs_in = 4e6; expected_delay_chips = 600; expected_doppler_hz = 750; max_doppler_error_hz = 2/(3*integration_time_ms*1e-3); max_delay_error_chips = 0.50; num_of_realizations = 1; config = std::make_shared(); config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.num_satellites", "1"); config->set_property("SignalSource.system_0", "E"); config->set_property("SignalSource.PRN_0", "10"); config->set_property("SignalSource.CN0_dB_0", "44"); config->set_property("SignalSource.doppler_Hz_0", std::to_string(expected_doppler_hz)); config->set_property("SignalSource.delay_chips_0", std::to_string(expected_delay_chips)); config->set_property("SignalSource.noise_flag", "false"); config->set_property("SignalSource.data_flag", "false"); config->set_property("SignalSource.BW_BB", "0.97"); config->set_property("InputFilter.implementation", "Fir_Filter"); config->set_property("InputFilter.input_item_type", "gr_complex"); config->set_property("InputFilter.output_item_type", "gr_complex"); config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", "11"); config->set_property("InputFilter.number_of_bands", "2"); config->set_property("InputFilter.band1_begin", "0.0"); config->set_property("InputFilter.band1_end", "0.97"); config->set_property("InputFilter.band2_begin", "0.98"); config->set_property("InputFilter.band2_end", "1.0"); config->set_property("InputFilter.ampl1_begin", "1.0"); config->set_property("InputFilter.ampl1_end", "1.0"); config->set_property("InputFilter.ampl2_begin", "0.0"); config->set_property("InputFilter.ampl2_end", "0.0"); config->set_property("InputFilter.band1_error", "1.0"); config->set_property("InputFilter.band2_error", "1.0"); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", "16"); config->set_property("Acquisition_Galileo.item_type", "gr_complex"); config->set_property("Acquisition_Galileo.if", "0"); config->set_property("Acquisition_Galileo.coherent_integration_time_ms", std::to_string(integration_time_ms)); config->set_property("Acquisition_Galileo.tong_init_val", "1"); config->set_property("Acquisition_Galileo.tong_max_val", "8"); config->set_property("Acquisition_Galileo.implementation", "Galileo_E1_PCPS_Tong_Ambiguous_Acquisition"); config->set_property("Acquisition_Galileo.threshold", "0.3"); config->set_property("Acquisition_Galileo.doppler_max", "10000"); config->set_property("Acquisition_Galileo.doppler_step", "250"); config->set_property("Acquisition_Galileo.dump", "false"); } void GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test::config_2() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'E'; std::string signal = "1B"; signal.copy(gnss_synchro.Signal, 2, 0); integration_time_ms = 4; fs_in = 4e6; expected_delay_chips = 600; expected_doppler_hz = 750; max_doppler_error_hz = 2/(3*integration_time_ms*1e-3); max_delay_error_chips = 0.50; num_of_realizations = 100; config = std::make_shared(); config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.num_satellites", "4"); config->set_property("SignalSource.system_0", "E"); config->set_property("SignalSource.PRN_0", "10"); config->set_property("SignalSource.CN0_dB_0", "50"); config->set_property("SignalSource.doppler_Hz_0", std::to_string(expected_doppler_hz)); config->set_property("SignalSource.delay_chips_0", std::to_string(expected_delay_chips)); config->set_property("SignalSource.system_1", "E"); config->set_property("SignalSource.PRN_1", "15"); config->set_property("SignalSource.CN0_dB_1", "44"); config->set_property("SignalSource.doppler_Hz_1", "1000"); config->set_property("SignalSource.delay_chips_1", "100"); config->set_property("SignalSource.system_2", "E"); config->set_property("SignalSource.PRN_2", "21"); config->set_property("SignalSource.CN0_dB_2", "44"); config->set_property("SignalSource.doppler_Hz_2", "2000"); config->set_property("SignalSource.delay_chips_2", "200"); config->set_property("SignalSource.system_3", "E"); config->set_property("SignalSource.PRN_3", "22"); config->set_property("SignalSource.CN0_dB_3", "44"); config->set_property("SignalSource.doppler_Hz_3", "3000"); config->set_property("SignalSource.delay_chips_3", "300"); config->set_property("SignalSource.noise_flag", "true"); config->set_property("SignalSource.data_flag", "true"); config->set_property("SignalSource.BW_BB", "0.97"); config->set_property("InputFilter.implementation", "Fir_Filter"); config->set_property("InputFilter.input_item_type", "gr_complex"); config->set_property("InputFilter.output_item_type", "gr_complex"); config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", "11"); config->set_property("InputFilter.number_of_bands", "2"); config->set_property("InputFilter.band1_begin", "0.0"); config->set_property("InputFilter.band1_end", "0.97"); config->set_property("InputFilter.band2_begin", "0.98"); config->set_property("InputFilter.band2_end", "1.0"); config->set_property("InputFilter.ampl1_begin", "1.0"); config->set_property("InputFilter.ampl1_end", "1.0"); config->set_property("InputFilter.ampl2_begin", "0.0"); config->set_property("InputFilter.ampl2_end", "0.0"); config->set_property("InputFilter.band1_error", "1.0"); config->set_property("InputFilter.band2_error", "1.0"); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", "16"); config->set_property("Acquisition_Galileo.item_type", "gr_complex"); config->set_property("Acquisition_Galileo.if", "0"); config->set_property("Acquisition_Galileo.coherent_integration_time_ms", std::to_string(integration_time_ms)); config->set_property("Acquisition_Galileo.tong_init_val", "1"); config->set_property("Acquisition_Galileo.tong_max_val", "8"); config->set_property("Acquisition_Galileo.implementation", "Galileo_E1_PCPS_Tong_Ambiguous_Acquisition"); config->set_property("Acquisition_Galileo.threshold", "0.00028"); // Pfa,a = 0.1 config->set_property("Acquisition_Galileo.doppler_max", "10000"); config->set_property("Acquisition_Galileo.doppler_step", "250"); config->set_property("Acquisition_Galileo.dump", "false"); } void GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test::start_queue() { stop = false; ch_thread = boost::thread(&GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test::wait_message, this); } void GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test::wait_message() { struct timeval tv; long long int begin = 0; long long int end = 0; while (!stop) { acquisition->reset(); gettimeofday(&tv, NULL); begin = tv.tv_sec *1e6 + tv.tv_usec; channel_internal_queue.wait_and_pop(message); gettimeofday(&tv, NULL); end = tv.tv_sec *1e6 + tv.tv_usec; mean_acq_time_us += (end - begin); process_message(); } } void GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test::process_message() { if (message == 1) { detection_counter++; // The term -5 is here to correct the additional delay introduced by the FIR filter double delay_error_chips = std::abs((double)expected_delay_chips - (double)(gnss_synchro.Acq_delay_samples-5)*1023.0/((double)fs_in*1e-3)); double doppler_error_hz = std::abs(expected_doppler_hz - gnss_synchro.Acq_doppler_hz); mse_delay += std::pow(delay_error_chips, 2); mse_doppler += std::pow(doppler_error_hz, 2); if ((delay_error_chips < max_delay_error_chips) && (doppler_error_hz < max_doppler_error_hz)) { correct_estimation_counter++; } } realization_counter++; std::cout << "Progress: " << round((float)realization_counter/num_of_realizations*100) << "% \r" << std::flush; if (realization_counter == num_of_realizations) { mse_delay /= num_of_realizations; mse_doppler /= num_of_realizations; Pd = (double)correct_estimation_counter / (double)num_of_realizations; Pfa_a = (double)detection_counter / (double)num_of_realizations; Pfa_p = (double)(detection_counter-correct_estimation_counter) / (double)num_of_realizations; mean_acq_time_us /= num_of_realizations; stop_queue(); top_block->stop(); std::cout << std::endl; } } void GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test::stop_queue() { stop = true; } TEST_F(GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test, Instantiate) { config_1(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_Tong_Ambiguous_Acquisition", 1, 1); acquisition = std::dynamic_pointer_cast(acq_); } TEST_F(GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test, ConnectAndRun) { int nsamples = floor(fs_in*integration_time_ms*1e-3); struct timeval tv; long long int begin = 0; long long int end = 0; top_block = gr::make_top_block("Acquisition test"); queue = gr::msg_queue::make(0); config_1(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_Tong_Ambiguous_Acquisition", 1, 1); acquisition = std::dynamic_pointer_cast(acq_); ASSERT_NO_THROW( { acquisition->connect(top_block); boost::shared_ptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000, 1, gr_complex(0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); top_block->connect(source, 0, valve, 0); top_block->connect(valve, 0, acquisition->get_left_block(), 0); }) << "Failure connecting the blocks of acquisition test." << std::endl; EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec * 1e6 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec * 1e6 + tv.tv_usec; }) << "Failure running the top_block." << std::endl; std::cout << "Processed " << nsamples << " samples in " << (end-begin) << " microseconds" << std::endl; } TEST_F(GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test, ValidationOfResults) { config_1(); top_block = gr::make_top_block("Acquisition test"); queue = gr::msg_queue::make(0); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_Tong_Ambiguous_Acquisition", 1, 1); acquisition = std::dynamic_pointer_cast(acq_); boost::shared_ptr msg_rx = GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->set_channel(1); }) << "Failure setting channel." << std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(5000); }) << "Failure setting doppler_max." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(100); }) << "Failure setting doppler_step." << std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(0.01); }) << "Failure setting threshold." << std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); }) << "Failure connecting acquisition to the top_block." << std::endl; acquisition->reset(); acquisition->init(); ASSERT_NO_THROW( { boost::shared_ptr signal_source; SignalGenerator* signal_generator = new SignalGenerator(config.get(), "SignalSource", 0, 1, queue); FirFilter* filter = new FirFilter(config.get(), "InputFilter", 1, 1); signal_source.reset(new GenSignalSource(signal_generator, filter, "SignalSource", queue)); signal_source->connect(top_block); top_block->connect(signal_source->get_right_block(), 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; // i = 0 --> satellite in acquisition is visible // i = 1 --> satellite in acquisition is not visible for (unsigned int i = 0; i < 2; i++) { init(); if (i == 0) { gnss_synchro.PRN = 10; // This satellite is visible } else if (i == 1) { gnss_synchro.PRN = 20; // This satellite is not visible } acquisition->reset(); acquisition->set_gnss_synchro(&gnss_synchro); acquisition->set_local_code(); acquisition->set_state(1); start_queue(); EXPECT_NO_THROW( { top_block->run(); // Start threads and wait }) << "Failure running the top_block." << std::endl; stop_queue(); if (i == 0) { EXPECT_EQ(1, message) << "Acquisition failure. Expected message: 1=ACQ SUCCESS."; EXPECT_EQ((unsigned int)1, correct_estimation_counter) << "Acquisition failure. Incorrect parameters estimation."; } else if (i == 1) { EXPECT_EQ(2, message) << "Acquisition failure. Expected message: 2=ACQ FAIL."; } //std::cout << "Delay: " << gnss_synchro.Acq_delay_samples << std::endl; //std::cout << "Doppler: " << gnss_synchro.Acq_doppler_hz << std::endl; ch_thread.join(); } } TEST_F(GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test, ValidationOfResultsProbabilities) { config_2(); top_block = gr::make_top_block("Acquisition test"); queue = gr::msg_queue::make(0); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition", "Galileo_E1_PCPS_Tong_Ambiguous_Acquisition", 1, 1); acquisition = std::dynamic_pointer_cast(acq_); boost::shared_ptr msg_rx = GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->set_channel(1); }) << "Failure setting channel." << std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(config->property("Acquisition.doppler_max", 10000)); }) << "Failure setting doppler_max." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(config->property("Acquisition.doppler_step", 500)); }) << "Failure setting doppler_step." << std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(config->property("Acquisition.threshold", 0.00028)); }) << "Failure setting threshold." << std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); }) << "Failure connecting acquisition to the top_block." << std::endl; acquisition->init(); ASSERT_NO_THROW( { boost::shared_ptr signal_source; SignalGenerator* signal_generator = new SignalGenerator(config.get(), "SignalSource", 0, 1, queue); FirFilter* filter = new FirFilter(config.get(), "InputFilter", 1, 1); signal_source.reset(new GenSignalSource(signal_generator, filter, "SignalSource", queue)); signal_source->connect(top_block); top_block->connect(signal_source->get_right_block(), 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; std::cout << "Probability of false alarm (target) = " << 0.1 << std::endl; // i = 0 --> satellite in acquisition is visible (prob of detection and prob of detection with wrong estimation) // i = 1 --> satellite in acquisition is not visible (prob of false detection) for (unsigned int i = 0; i < 2; i++) { init(); if (i == 0) { gnss_synchro.PRN = 10; // This satellite is visible } else if (i == 1) { gnss_synchro.PRN = 20; // This satellite is not visible } acquisition->set_local_code(); acquisition->set_state(1); start_queue(); EXPECT_NO_THROW( { top_block->run(); // Start threads and wait }) << "Failure running the top_block." << std::endl; stop_queue(); if (i == 0) { std::cout << "Estimated probability of detection = " << Pd << std::endl; std::cout << "Estimated probability of false alarm (satellite present) = " << Pfa_p << std::endl; std::cout << "Mean acq time = " << mean_acq_time_us << " microseconds." << std::endl; } else if (i == 1) { std::cout << "Estimated probability of false alarm (satellite absent) = " << Pfa_a << std::endl; std::cout << "Mean acq time = " << mean_acq_time_us << " microseconds." << std::endl; } ch_thread.join(); } } galileo_e5a_pcps_acquisition_gsoc2014_gensource_test.cc000066400000000000000000000750251305042567700412720ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/acquisition/*! * \file galileo_e5a_pcps_acquisition_gsoc2014_gensource_test.cc * \brief This class implements an acquisition test for * GalileoE5a3msNoncoherentIQAcquisition class. * \author Marc Sales, 2014. marcsales92(at)gmail.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include "gnss_block_factory.h" #include "gnss_block_interface.h" #include "in_memory_configuration.h" #include "configuration_interface.h" #include "gnss_synchro.h" #include "galileo_e5a_noncoherent_iq_acquisition_caf.h" #include "signal_generator.h" #include "signal_generator_c.h" #include "fir_filter.h" #include "gen_signal_source.h" #include "gnss_sdr_valve.h" #include "pass_through.h" #include "gnss_block_factory.h" // ######## GNURADIO BLOCK MESSAGE RECEVER ######### class GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx; typedef boost::shared_ptr GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx_sptr; GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx_sptr GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx_make(concurrent_queue& queue); class GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx : public gr::block { private: friend GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx_sptr GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx_make(concurrent_queue& queue); void msg_handler_events(pmt::pmt_t msg); GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx(concurrent_queue& queue); concurrent_queue& channel_internal_queue; public: int rx_message; ~GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx(); //!< Default destructor }; GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx_sptr GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx_make(concurrent_queue& queue) { return GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx_sptr(new GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx(queue)); } void GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx::msg_handler_events(pmt::pmt_t msg) { try { long int message = pmt::to_long(msg); rx_message = message; channel_internal_queue.push(rx_message); } catch(boost::bad_any_cast& e) { LOG(WARNING) << "msg_handler_telemetry Bad any cast!"; rx_message = 0; } } GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx::GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx(concurrent_queue& queue) : gr::block("GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)), channel_internal_queue(queue) { this->message_port_register_in(pmt::mp("events")); this->set_msg_handler(pmt::mp("events"), boost::bind(&GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx::msg_handler_events, this, _1)); rx_message = 0; } GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx::~GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx() {} class GalileoE5aPcpsAcquisitionGSoC2014GensourceTest: public ::testing::Test { protected: GalileoE5aPcpsAcquisitionGSoC2014GensourceTest() { item_size = sizeof(gr_complex); stop = false; message = 0; gnss_synchro = Gnss_Synchro(); init(); } ~GalileoE5aPcpsAcquisitionGSoC2014GensourceTest() {} void init(); void config_1(); void config_2(); void config_3(); void start_queue(); void wait_message(); void process_message(); void stop_queue(); concurrent_queue channel_internal_queue; gr::msg_queue::sptr queue; gr::top_block_sptr top_block; //std::shared_ptr factory = std::make_shared(); std::shared_ptr acquisition; std::shared_ptr config; Gnss_Synchro gnss_synchro; size_t item_size; bool stop; int message; boost::thread ch_thread; unsigned int integration_time_ms = 0; unsigned int fs_in = 0; double expected_delay_chips = 0.0; double expected_delay_sec = 0.0; double expected_doppler_hz = 0.0; double expected_delay_chips1 = 0.0; double expected_delay_sec1 = 0.0; double expected_doppler_hz1 = 0.0; double expected_delay_chips2 = 0.0; double expected_delay_sec2 = 0.0; double expected_doppler_hz2 = 0.0; double expected_delay_chips3 = 0.0; double expected_delay_sec3 = 0.0; double expected_doppler_hz3 = 0.0; float max_doppler_error_hz = 0.0; float max_delay_error_chips = 0.0; int CAF_window_hz = 0; int Zero_padding = 0; unsigned int num_of_realizations = 0; unsigned int realization_counter; unsigned int detection_counter; unsigned int correct_estimation_counter; unsigned int acquired_samples; unsigned int mean_acq_time_us; double mse_doppler; double mse_delay; double Pd; double Pfa_p; double Pfa_a; int sat = 0; }; void GalileoE5aPcpsAcquisitionGSoC2014GensourceTest::init() { message = 0; realization_counter = 0; detection_counter = 0; correct_estimation_counter = 0; acquired_samples = 0; mse_doppler = 0; mse_delay = 0; mean_acq_time_us = 0; Pd = 0; Pfa_p = 0; Pfa_a = 0; } void GalileoE5aPcpsAcquisitionGSoC2014GensourceTest::config_1() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'E'; // std::string signal = "5I"; // std::string signal = "5Q"; std::string signal = "5X"; signal.copy(gnss_synchro.Signal,2,0); integration_time_ms = 3; //fs_in = 11e6; //fs_in = 18e6; fs_in = 32e6; //fs_in = 30.69e6; //fs_in = 20.47e6; // unsigned int delay_samples = (delay_chips_[sat] % codelen) // * samples_per_code_[sat] / codelen; expected_delay_chips = round(14000*((double)10230000/(double)fs_in)); expected_doppler_hz = 2800; //expected_doppler_hz = 0; expected_delay_sec = 94; // CAF_window_hz = 3000; CAF_window_hz = 0; Zero_padding = 0; //expected_delay_chips = 1000; //expected_doppler_hz = 250; max_doppler_error_hz = 2/(3*integration_time_ms*1e-3); max_delay_error_chips = 0.50; //max_doppler_error_hz = 1000; //max_delay_error_chips = 1; num_of_realizations = 1; config = std::make_shared(); config->set_property("Channel.signal",signal); config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.num_satellites", "1"); config->set_property("SignalSource.system_0", "E"); config->set_property("SignalSource.signal_0", "5X"); config->set_property("SignalSource.PRN_0", "11"); config->set_property("SignalSource.CN0_dB_0", "50"); config->set_property("SignalSource.doppler_Hz_0", std::to_string(expected_doppler_hz)); config->set_property("SignalSource.delay_chips_0", std::to_string(expected_delay_chips)); config->set_property("SignalSource.delay_sec_0", std::to_string(expected_delay_sec)); config->set_property("SignalSource.noise_flag", "false"); config->set_property("SignalSource.data_flag", "false"); config->set_property("SignalSource.BW_BB", "0.97"); config->set_property("SignalSource.dump", "false"); config->set_property("SignalSource.dump_filename", "../data/signal_source.dat"); config->set_property("InputFilter.implementation", "Fir_Filter"); config->set_property("InputFilter.input_item_type", "gr_complex"); config->set_property("InputFilter.output_item_type", "gr_complex"); config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", "11"); config->set_property("InputFilter.number_of_bands", "2"); config->set_property("InputFilter.band1_begin", "0.0"); config->set_property("InputFilter.band1_end", "0.97"); config->set_property("InputFilter.band2_begin", "0.98"); config->set_property("InputFilter.band2_end", "1.0"); config->set_property("InputFilter.ampl1_begin", "1.0"); config->set_property("InputFilter.ampl1_end", "1.0"); config->set_property("InputFilter.ampl2_begin", "0.0"); config->set_property("InputFilter.ampl2_end", "0.0"); config->set_property("InputFilter.band1_error", "1.0"); config->set_property("InputFilter.band2_error", "1.0"); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", "16"); config->set_property("Acquisition_Galileo.item_type", "gr_complex"); config->set_property("Acquisition_Galileo.if", "0"); config->set_property("Acquisition_Galileo.coherent_integration_time_ms", std::to_string(integration_time_ms)); config->set_property("Acquisition_Galileo.max_dwells", "1"); config->set_property("Acquisition_Galileo.CAF_window_hz",std::to_string(CAF_window_hz)); config->set_property("Acquisition_Galileo.Zero_padding",std::to_string(Zero_padding)); config->set_property("Acquisition_Galileo.implementation", "Galileo_E5a_Noncoherent_IQ_Acquisition_CAF"); config->set_property("Acquisition_Galileo.pfa","0.003"); // config->set_property("Acquisition_Galileo.threshold", "0.01"); config->set_property("Acquisition_Galileo.doppler_max", "10000"); config->set_property("Acquisition_Galileo.doppler_step", "250"); // config->set_property("Acquisition_Galileo.doppler_step", "500"); config->set_property("Acquisition_Galileo.bit_transition_flag", "false"); config->set_property("Acquisition_Galileo.dump", "false"); config->set_property("SignalSource.dump_filename", "../data/acquisition.dat"); } void GalileoE5aPcpsAcquisitionGSoC2014GensourceTest::config_2() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'E'; std::string signal = "5Q"; //std::string signal = "5X"; signal.copy(gnss_synchro.Signal,2,0); integration_time_ms = 3; //fs_in = 10.24e6; //fs_in = 12e6; fs_in = 12e6; //expected_delay_chips = 600; //expected_doppler_hz = 750; expected_delay_chips = 1000; expected_doppler_hz = 250; max_doppler_error_hz = 2/(3*integration_time_ms*1e-3); max_delay_error_chips = 0.50; //max_doppler_error_hz = 1000; //max_delay_error_chips = 1; num_of_realizations = 1; config = std::make_shared(); config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(fs_in)); config->set_property("Acquisition_Galileo.item_type", "gr_complex"); config->set_property("Acquisition_Galileo.if", "0"); config->set_property("Acquisition_Galileo.coherent_integration_time_ms", std::to_string(integration_time_ms)); config->set_property("Acquisition_Galileo.max_dwells", "1"); config->set_property("Acquisition_Galileo.implementation", "Galileo_E5a_PCPS_Acquisition"); //config->set_property("Acquisition_Galileo.implementation", "Galileo_E5a_Pilot_3ms_Acquisition"); //config->set_property("Acquisition_Galileo.implementation", "Galileo_E5ax_2ms_Pcps_Acquisition"); config->set_property("Acquisition_Galileo.threshold", "0.1"); config->set_property("Acquisition_Galileo.doppler_max", "10000"); config->set_property("Acquisition_Galileo.doppler_step", "250"); config->set_property("Acquisition_Galileo.bit_transition_flag", "false"); config->set_property("Acquisition_Galileo.dump", "false"); config->set_property("SignalSource.dump_filename", "../data/acquisition.dat"); } void GalileoE5aPcpsAcquisitionGSoC2014GensourceTest::config_3() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'E'; //std::string signal = "5Q"; std::string signal = "5X"; signal.copy(gnss_synchro.Signal,2,0); integration_time_ms = 3; //fs_in = 10.24e6; //fs_in = 12e6; fs_in = 12e6; //expected_delay_chips = 600; //expected_doppler_hz = 750; expected_delay_chips = 0; expected_delay_sec = 0; expected_doppler_hz = 0; expected_delay_chips1 = 6000; expected_delay_sec1 = 10; expected_doppler_hz1 = 700; expected_delay_chips2 = 9000; expected_delay_sec2 = 26; expected_doppler_hz2 = -1500; expected_delay_chips3 = 2000; expected_delay_sec3 = 77; expected_doppler_hz3 = 5000; max_doppler_error_hz = 2/(3*integration_time_ms*1e-3); max_delay_error_chips = 0.50; //max_doppler_error_hz = 1000; //max_delay_error_chips = 1; num_of_realizations = 10; config = std::make_shared(); config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.num_satellites", "4"); config->set_property("SignalSource.system_0", "E"); config->set_property("SignalSource.signal_0", "5X"); config->set_property("SignalSource.PRN_0", "11"); config->set_property("SignalSource.CN0_dB_0", "46"); config->set_property("SignalSource.doppler_Hz_0", std::to_string(expected_doppler_hz)); config->set_property("SignalSource.delay_chips_0", std::to_string(expected_delay_chips)); config->set_property("SignalSource.delay_sec_0", std::to_string(expected_delay_sec)); config->set_property("SignalSource.system_1", "E"); config->set_property("SignalSource.signal_1", "5X"); config->set_property("SignalSource.PRN_1", "12"); config->set_property("SignalSource.CN0_dB_1", "46"); config->set_property("SignalSource.doppler_Hz_1", std::to_string(expected_doppler_hz1)); config->set_property("SignalSource.delay_chips_1", std::to_string(expected_delay_chips1)); config->set_property("SignalSource.delay_sec_1", std::to_string(expected_delay_sec1)); config->set_property("SignalSource.system_2", "E"); config->set_property("SignalSource.signal_2", "5X"); config->set_property("SignalSource.PRN_2", "19"); config->set_property("SignalSource.CN0_dB_2", "43"); config->set_property("SignalSource.doppler_Hz_2", std::to_string(expected_doppler_hz2)); config->set_property("SignalSource.delay_chips_2", std::to_string(expected_delay_chips2)); config->set_property("SignalSource.delay_sec_2", std::to_string(expected_delay_sec2)); config->set_property("SignalSource.system_3", "E"); config->set_property("SignalSource.signal_3", "5X"); config->set_property("SignalSource.PRN_3", "20"); config->set_property("SignalSource.CN0_dB_3", "39"); config->set_property("SignalSource.doppler_Hz_3", std::to_string(expected_doppler_hz3)); config->set_property("SignalSource.delay_chips_3", std::to_string(expected_delay_chips3)); config->set_property("SignalSource.delay_sec_3", std::to_string(expected_delay_sec3)); config->set_property("SignalSource.noise_flag", "true"); config->set_property("SignalSource.data_flag", "true"); config->set_property("SignalSource.BW_BB", "0.97"); config->set_property("SignalSource.dump", "false"); config->set_property("SignalSource.dump_filename", "../data/signal_source.dat"); config->set_property("InputFilter.implementation", "Fir_Filter"); config->set_property("InputFilter.input_item_type", "gr_complex"); config->set_property("InputFilter.output_item_type", "gr_complex"); config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", "11"); config->set_property("InputFilter.number_of_bands", "2"); config->set_property("InputFilter.band1_begin", "0.0"); config->set_property("InputFilter.band1_end", "0.97"); config->set_property("InputFilter.band2_begin", "0.98"); config->set_property("InputFilter.band2_end", "1.0"); config->set_property("InputFilter.ampl1_begin", "1.0"); config->set_property("InputFilter.ampl1_end", "1.0"); config->set_property("InputFilter.ampl2_begin", "0.0"); config->set_property("InputFilter.ampl2_end", "0.0"); config->set_property("InputFilter.band1_error", "1.0"); config->set_property("InputFilter.band2_error", "1.0"); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", "16"); config->set_property("Acquisition_Galileo.item_type", "gr_complex"); config->set_property("Acquisition_Galileo.if", "0"); config->set_property("Acquisition_Galileo.coherent_integration_time_ms", std::to_string(integration_time_ms)); config->set_property("Acquisition_Galileo.max_dwells", "1"); config->set_property("Acquisition_Galileo.implementation", "Galileo_E5a_PCPS_Acquisition"); //config->set_property("Acquisition.implementation", "Galileo_E1_PCPS_Ambiguous_Acquisition"); //config->set_property("Acquisition.implementation", "Galileo_E5a_Pilot_3ms_Acquisition"); config->set_property("Acquisition_Galileo.threshold", "0.5"); config->set_property("Acquisition_Galileo.doppler_max", "10000"); config->set_property("Acquisition_Galileo.doppler_step", "250"); config->set_property("Acquisition_Galileo.bit_transition_flag", "false"); config->set_property("Acquisition_Galileo.dump", "false"); config->set_property("SignalSource.dump_filename", "../data/acquisition.dat"); } void GalileoE5aPcpsAcquisitionGSoC2014GensourceTest::start_queue() { stop = false; ch_thread = boost::thread(&GalileoE5aPcpsAcquisitionGSoC2014GensourceTest::wait_message, this); } void GalileoE5aPcpsAcquisitionGSoC2014GensourceTest::wait_message() { struct timeval tv; long long int begin = 0; long long int end = 0; while (!stop) { acquisition->reset(); gettimeofday(&tv, NULL); begin = tv.tv_sec *1e6 + tv.tv_usec; channel_internal_queue.wait_and_pop(message); gettimeofday(&tv, NULL); end = tv.tv_sec *1e6 + tv.tv_usec; mean_acq_time_us += (end-begin); process_message(); } } void GalileoE5aPcpsAcquisitionGSoC2014GensourceTest::process_message() { if (message == 1) { double delay_error_chips = 0.0; double doppler_error_hz = 0.0; switch (sat) { case 0: delay_error_chips = std::abs((double)expected_delay_chips - (double)(gnss_synchro.Acq_delay_samples-5)*10230.0/((double)fs_in*1e-3)); doppler_error_hz = std::abs(expected_doppler_hz - gnss_synchro.Acq_doppler_hz); break; case 1: delay_error_chips = std::abs((double)expected_delay_chips1 - (double)(gnss_synchro.Acq_delay_samples-5)*10230.0/((double)fs_in*1e-3)); doppler_error_hz = std::abs(expected_doppler_hz1 - gnss_synchro.Acq_doppler_hz); break; case 2: delay_error_chips = std::abs((double)expected_delay_chips2 - (double)(gnss_synchro.Acq_delay_samples-5)*10230.0/((double)fs_in*1e-3)); doppler_error_hz = std::abs(expected_doppler_hz2 - gnss_synchro.Acq_doppler_hz); break; case 3: delay_error_chips = std::abs((double)expected_delay_chips3 - (double)(gnss_synchro.Acq_delay_samples-5)*10230.0/((double)fs_in*1e-3)); doppler_error_hz = std::abs(expected_doppler_hz3 - gnss_synchro.Acq_doppler_hz); break; default: // case 3 std::cout << "Error: message from unexpected acquisition channel" << std::endl; break; } detection_counter++; // The term -5 is here to correct the additional delay introduced by the FIR filter /* double delay_error_chips = abs((double)expected_delay_chips - (double)(gnss_synchro.Acq_delay_samples-5)*10230.0/((double)fs_in*1e-3)); double doppler_error_hz = abs(expected_doppler_hz - gnss_synchro.Acq_doppler_hz); */ mse_delay += std::pow(delay_error_chips, 2); mse_doppler += std::pow(doppler_error_hz, 2); if ((delay_error_chips < max_delay_error_chips) && (doppler_error_hz < max_doppler_error_hz)) { correct_estimation_counter++; } } realization_counter++; //std::cout << correct_estimation_counter << "correct estimation counter" << std::endl; std::cout << "Progress: " << round((float)realization_counter/num_of_realizations*100) << "% \r" << std::flush; //std::cout << message << "message" <stop(); } } void GalileoE5aPcpsAcquisitionGSoC2014GensourceTest::stop_queue() { stop = true; } TEST_F(GalileoE5aPcpsAcquisitionGSoC2014GensourceTest, Instantiate) { config_1(); acquisition = std::make_shared(config.get(), "Acquisition", 1, 1); } TEST_F(GalileoE5aPcpsAcquisitionGSoC2014GensourceTest, ConnectAndRun) { config_1(); //int nsamples = floor(5*fs_in*integration_time_ms*1e-3); int nsamples = 21000*3; struct timeval tv; long long int begin = 0; long long int end = 0; acquisition = std::make_shared(config.get(), "Acquisition", 1, 1); boost::shared_ptr msg_rx = GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx_make(channel_internal_queue); queue = gr::msg_queue::make(0); top_block = gr::make_top_block("Acquisition test"); ASSERT_NO_THROW( { acquisition->connect(top_block); boost::shared_ptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000, 1, gr_complex(0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); top_block->connect(source, 0, valve, 0); top_block->connect(valve, 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test."<< std::endl; EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec *1e6 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec *1e6 + tv.tv_usec; }) << "Failure running the top_block."<< std::endl; std::cout << "Processed " << nsamples << " samples in " << (end - begin) << " microseconds" << std::endl; } /* TEST_F(GalileoE5aPcpsAcquisitionGSoC2014GensourceTest, SOURCEValidation) { config_1(); ASSERT_NO_THROW( { boost::shared_ptr signal_source; SignalGenerator* signal_generator = new SignalGenerator(config.get(), "SignalSource", 0, 1, queue); FirFilter* filter = new FirFilter(config.get(), "InputFilter", 1, 1); signal_source.reset(new GenSignalSource(signal_generator, filter, "SignalSource", queue)); signal_source->connect(top_block); //top_block->connect(signal_source->get_right_block(), 0, acquisition->get_left_block(), 0); }) << "Failure generating signal" << std::endl; } */ /* TEST_F(GalileoE5aPcpsAcquisitionGSoC2014GensourceTest, SOURCEValidationTOFILE) { config_1(); ASSERT_NO_THROW( { std::string filename_ = "../data/Tiered_sinknull.dat"; boost::shared_ptr file_sink_; boost::shared_ptr signal_source; SignalGenerator* signal_generator = new SignalGenerator(config.get(), "SignalSource", 0, 1, queue); FirFilter* filter = new FirFilter(config.get(), "InputFilter", 1, 1); signal_source.reset(new GenSignalSource(signal_generator, filter, "SignalSource", queue)); //signal_source->connect(top_block); file_sink_=gr::blocks::file_sink::make(sizeof(gr_complex), filename_.c_str()); top_block->connect(signal_source->get_right_block(),0,file_sink_,0); //top_block->connect(signal_source->get_right_block(), 0, acquisition->get_left_block(), 0); }) << "Failure generating signal" << std::endl; } */ TEST_F(GalileoE5aPcpsAcquisitionGSoC2014GensourceTest, ValidationOfSIM) { config_1(); queue = gr::msg_queue::make(0); top_block = gr::make_top_block("Acquisition test"); acquisition = std::make_shared(config.get(), "Acquisition", 1, 1); boost::shared_ptr msg_rx = GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->set_channel(0); }) << "Failure setting channel."<< std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro."<< std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(config->property("Acquisition_Galileo.doppler_max", 10000)); }) << "Failure setting doppler_max."<< std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(config->property("Acquisition_Galileo.doppler_step", 500)); }) << "Failure setting doppler_step."<< std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(config->property("Acquisition_Galileo.threshold", 0.0)); }) << "Failure setting threshold."<< std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); }) << "Failure connecting acquisition to the top_block."<< std::endl; acquisition->init(); // USING SIGNAL GENERATOR ASSERT_NO_THROW( { boost::shared_ptr signal_source; SignalGenerator* signal_generator = new SignalGenerator(config.get(), "SignalSource", 0, 1, queue); FirFilter* filter = new FirFilter(config.get(), "InputFilter", 1, 1); filter->connect(top_block); signal_source.reset(new GenSignalSource(signal_generator, filter, "SignalSource", queue)); signal_source->connect(top_block); top_block->connect(signal_source->get_right_block(), 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; acquisition->reset(); acquisition->init(); // USING SIGNAL FROM FILE SOURCE //unsigned int skiphead_sps = 28000+32000; // 32 Msps // unsigned int skiphead_sps = 0; // unsigned int skiphead_sps = 84000; // ASSERT_NO_THROW( { // //noiseless sim // //std::string file = "/home/marc/E5a_acquisitions/sim_32M_sec94_PRN11_long.dat"; // // real // std::string file = "/home/marc/E5a_acquisitions/32MS_complex.dat"; // // const char * file_name = file.c_str(); // gr::blocks::file_source::sptr file_source = gr::blocks::file_source::make(sizeof(gr_complex), file_name, false); // // gr::blocks::skiphead::sptr skip_head = gr::blocks::skiphead::make(sizeof(gr_complex), skiphead_sps); // top_block->connect(file_source, 0, skip_head, 0); // top_block->connect(skip_head, 0, acquisition->get_left_block(), 0); // // // top_block->connect(file_source, 0, acquisition->get_left_block(), 0); // }) << "Failure connecting the blocks of acquisition test." << std::endl; // i = 0 --> satellite in acquisition is visible // i = 1 --> satellite in acquisition is not visible for (unsigned int i = 0; i < 1; i++) { init(); switch (i) { case 0: { gnss_synchro.PRN = 19; // present } case 1: { gnss_synchro.PRN = 11; } } start_queue(); acquisition->reset(); acquisition->init(); acquisition->set_gnss_synchro(&gnss_synchro); acquisition->set_local_code(); acquisition->set_state(1); EXPECT_NO_THROW( { top_block->run(); // Start threads and wait }) << "Failure running the top_block."<< std::endl; stop_queue(); ch_thread.join(); //std::cout << gnss_synchro.Acq_delay_samples << "acq delay" <. * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include "gnss_block_interface.h" #include "in_memory_configuration.h" #include "configuration_interface.h" #include "gnss_synchro.h" #include "gps_l1_ca_pcps_acquisition.h" #include "signal_generator.h" #include "signal_generator_c.h" #include "fir_filter.h" #include "gen_signal_source.h" #include "gnss_sdr_valve.h" #include "boost/shared_ptr.hpp" #include "pass_through.h" // ######## GNURADIO BLOCK MESSAGE RECEVER ######### class GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx; typedef boost::shared_ptr GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_sptr; GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_sptr GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_make(concurrent_queue& queue); class GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx : public gr::block { private: friend GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_sptr GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_make(concurrent_queue& queue); void msg_handler_events(pmt::pmt_t msg); GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx(concurrent_queue& queue); concurrent_queue& channel_internal_queue; public: int rx_message; ~GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx(); //!< Default destructor }; GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_sptr GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_make(concurrent_queue& queue) { return GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_sptr(new GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx(queue)); } void GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx::msg_handler_events(pmt::pmt_t msg) { try { long int message = pmt::to_long(msg); rx_message = message; channel_internal_queue.push(rx_message); } catch(boost::bad_any_cast& e) { LOG(WARNING) << "msg_handler_telemetry Bad any cast!"; rx_message = 0; } } GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx::GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx(concurrent_queue& queue) : gr::block("GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)), channel_internal_queue(queue) { this->message_port_register_in(pmt::mp("events")); this->set_msg_handler(pmt::mp("events"), boost::bind(&GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx::msg_handler_events, this, _1)); rx_message = 0; } GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx::~GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx() {} // ########################################################### class GpsL1CaPcpsAcquisitionGSoC2013Test: public ::testing::Test { protected: GpsL1CaPcpsAcquisitionGSoC2013Test() { item_size = sizeof(gr_complex); stop = false; message = 0; gnss_synchro = Gnss_Synchro(); acquisition = 0; init(); } ~GpsL1CaPcpsAcquisitionGSoC2013Test() { } void init(); void config_1(); void config_2(); void start_queue(); void wait_message(); void process_message(); void stop_queue(); concurrent_queue channel_internal_queue; gr::msg_queue::sptr queue; gr::top_block_sptr top_block; GpsL1CaPcpsAcquisition *acquisition; std::shared_ptr config; Gnss_Synchro gnss_synchro; size_t item_size; bool stop; int message; boost::thread ch_thread; unsigned int integration_time_ms = 0; unsigned int fs_in = 0; double expected_delay_chips = 0.0; double expected_doppler_hz = 0.0; float max_doppler_error_hz = 0.0; float max_delay_error_chips = 0.0; unsigned int num_of_realizations = 0; unsigned int realization_counter; unsigned int detection_counter; unsigned int correct_estimation_counter; unsigned int acquired_samples; unsigned int mean_acq_time_us; double mse_doppler; double mse_delay; double Pd; double Pfa_p; double Pfa_a; }; void GpsL1CaPcpsAcquisitionGSoC2013Test::init() { message = 0; realization_counter = 0; detection_counter = 0; correct_estimation_counter = 0; acquired_samples = 0; mse_doppler = 0; mse_delay = 0; mean_acq_time_us = 0; Pd = 0; Pfa_p = 0; Pfa_a = 0; } void GpsL1CaPcpsAcquisitionGSoC2013Test::config_1() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'G'; std::string signal = "1C"; signal.copy(gnss_synchro.Signal,2,0); integration_time_ms = 1; fs_in = 4e6; expected_delay_chips = 600; expected_doppler_hz = 750; max_doppler_error_hz = 2/(3*integration_time_ms*1e-3); max_delay_error_chips = 0.50; num_of_realizations = 1; config = std::make_shared(); config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.num_satellites", "1"); config->set_property("SignalSource.system_0", "G"); config->set_property("SignalSource.PRN_0", "10"); config->set_property("SignalSource.CN0_dB_0", "44"); config->set_property("SignalSource.doppler_Hz_0", std::to_string(expected_doppler_hz)); config->set_property("SignalSource.delay_chips_0", std::to_string(expected_delay_chips)); config->set_property("SignalSource.noise_flag", "false"); config->set_property("SignalSource.data_flag", "false"); config->set_property("SignalSource.BW_BB", "0.97"); config->set_property("InputFilter.implementation", "Fir_Filter"); config->set_property("InputFilter.input_item_type", "gr_complex"); config->set_property("InputFilter.output_item_type", "gr_complex"); config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", "11"); config->set_property("InputFilter.number_of_bands", "2"); config->set_property("InputFilter.band1_begin", "0.0"); config->set_property("InputFilter.band1_end", "0.97"); config->set_property("InputFilter.band2_begin", "0.98"); config->set_property("InputFilter.band2_end", "1.0"); config->set_property("InputFilter.ampl1_begin", "1.0"); config->set_property("InputFilter.ampl1_end", "1.0"); config->set_property("InputFilter.ampl2_begin", "0.0"); config->set_property("InputFilter.ampl2_end", "0.0"); config->set_property("InputFilter.band1_error", "1.0"); config->set_property("InputFilter.band2_error", "1.0"); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", "16"); config->set_property("Acquisition.item_type", "gr_complex"); config->set_property("Acquisition.if", "0"); config->set_property("Acquisition.coherent_integration_time_ms", std::to_string(integration_time_ms)); config->set_property("Acquisition.max_dwells", "1"); config->set_property("Acquisition.implementation", "GPS_L1_CA_PCPS_Acquisition"); config->set_property("Acquisition.threshold", "0.8"); config->set_property("Acquisition.doppler_max", "10000"); config->set_property("Acquisition.doppler_step", "250"); config->set_property("Acquisition.bit_transition_flag", "false"); config->set_property("Acquisition.dump", "false"); } void GpsL1CaPcpsAcquisitionGSoC2013Test::config_2() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'G'; std::string signal = "1C"; signal.copy(gnss_synchro.Signal,2,0); integration_time_ms = 1; fs_in = 4e6; expected_delay_chips = 600; expected_doppler_hz = 750; max_doppler_error_hz = 2/(3*integration_time_ms*1e-3); max_delay_error_chips = 0.50; num_of_realizations = 100; config = std::make_shared(); config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.num_satellites", "4"); config->set_property("SignalSource.system_0", "G"); config->set_property("SignalSource.PRN_0", "10"); config->set_property("SignalSource.CN0_dB_0", "44"); config->set_property("SignalSource.doppler_Hz_0", std::to_string(expected_doppler_hz)); config->set_property("SignalSource.delay_chips_0", std::to_string(expected_delay_chips)); config->set_property("SignalSource.system_1", "G"); config->set_property("SignalSource.PRN_1", "15"); config->set_property("SignalSource.CN0_dB_1", "44"); config->set_property("SignalSource.doppler_Hz_1", "1000"); config->set_property("SignalSource.delay_chips_1", "100"); config->set_property("SignalSource.system_2", "G"); config->set_property("SignalSource.PRN_2", "21"); config->set_property("SignalSource.CN0_dB_2", "44"); config->set_property("SignalSource.doppler_Hz_2", "2000"); config->set_property("SignalSource.delay_chips_2", "200"); config->set_property("SignalSource.system_3", "G"); config->set_property("SignalSource.PRN_3", "22"); config->set_property("SignalSource.CN0_dB_3", "44"); config->set_property("SignalSource.doppler_Hz_3", "3000"); config->set_property("SignalSource.delay_chips_3", "300"); config->set_property("SignalSource.noise_flag", "true"); config->set_property("SignalSource.data_flag", "true"); config->set_property("SignalSource.BW_BB", "0.97"); config->set_property("InputFilter.implementation", "Fir_Filter"); config->set_property("InputFilter.input_item_type", "gr_complex"); config->set_property("InputFilter.output_item_type", "gr_complex"); config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", "11"); config->set_property("InputFilter.number_of_bands", "2"); config->set_property("InputFilter.band1_begin", "0.0"); config->set_property("InputFilter.band1_end", "0.97"); config->set_property("InputFilter.band2_begin", "0.98"); config->set_property("InputFilter.band2_end", "1.0"); config->set_property("InputFilter.ampl1_begin", "1.0"); config->set_property("InputFilter.ampl1_end", "1.0"); config->set_property("InputFilter.ampl2_begin", "0.0"); config->set_property("InputFilter.ampl2_end", "0.0"); config->set_property("InputFilter.band1_error", "1.0"); config->set_property("InputFilter.band2_error", "1.0"); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", "16"); config->set_property("Acquisition.item_type", "gr_complex"); config->set_property("Acquisition.if", "0"); config->set_property("Acquisition.coherent_integration_time_ms", std::to_string(integration_time_ms)); config->set_property("Acquisition.max_dwells", "1"); config->set_property("Acquisition.implementation", "GPS_L1_CA_PCPS_Acquisition"); config->set_property("Acquisition.pfa", "0.1"); config->set_property("Acquisition.doppler_max", "10000"); config->set_property("Acquisition.doppler_step", "250"); config->set_property("Acquisition.bit_transition_flag", "false"); config->set_property("Acquisition.dump", "false"); } void GpsL1CaPcpsAcquisitionGSoC2013Test::start_queue() { stop = false; ch_thread = boost::thread(&GpsL1CaPcpsAcquisitionGSoC2013Test::wait_message, this); } void GpsL1CaPcpsAcquisitionGSoC2013Test::wait_message() { struct timeval tv; long long int begin = 0; long long int end = 0; while (!stop) { acquisition->reset(); gettimeofday(&tv, NULL); begin = tv.tv_sec *1e6 + tv.tv_usec; channel_internal_queue.wait_and_pop(message); gettimeofday(&tv, NULL); end = tv.tv_sec *1e6 + tv.tv_usec; mean_acq_time_us += (end-begin); process_message(); } } void GpsL1CaPcpsAcquisitionGSoC2013Test::process_message() { if (message == 1) { detection_counter++; // The term -5 is here to correct the additional delay introduced by the FIR filter double delay_error_chips = std::abs((double)expected_delay_chips - (double)(gnss_synchro.Acq_delay_samples-5)*1023.0/((double)fs_in*1e-3)); double doppler_error_hz = std::abs(expected_doppler_hz - gnss_synchro.Acq_doppler_hz); mse_delay += std::pow(delay_error_chips, 2); mse_doppler += std::pow(doppler_error_hz, 2); if ((delay_error_chips < max_delay_error_chips) && (doppler_error_hz < max_doppler_error_hz)) { correct_estimation_counter++; } } realization_counter++; std::cout << "Progress: " << round((float)realization_counter/num_of_realizations*100) << "% \r" << std::flush; if (realization_counter == num_of_realizations) { mse_delay /= num_of_realizations; mse_doppler /= num_of_realizations; Pd = (double)correct_estimation_counter / (double)num_of_realizations; Pfa_a = (double)detection_counter / (double)num_of_realizations; Pfa_p = (double)(detection_counter - correct_estimation_counter) / (double)num_of_realizations; mean_acq_time_us /= num_of_realizations; stop_queue(); top_block->stop(); } } void GpsL1CaPcpsAcquisitionGSoC2013Test::stop_queue() { stop = true; } TEST_F(GpsL1CaPcpsAcquisitionGSoC2013Test, Instantiate) { config_1(); acquisition = new GpsL1CaPcpsAcquisition(config.get(), "Acquisition", 1, 1); delete acquisition; } TEST_F(GpsL1CaPcpsAcquisitionGSoC2013Test, ConnectAndRun) { int nsamples = floor(fs_in*integration_time_ms*1e-3); struct timeval tv; long long int begin = 0; long long int end = 0; queue = gr::msg_queue::make(0); top_block = gr::make_top_block("Acquisition test"); config_1(); acquisition = new GpsL1CaPcpsAcquisition(config.get(), "Acquisition", 1, 1); boost::shared_ptr msg_rx = GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->connect(top_block); boost::shared_ptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000, 1, gr_complex(0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); top_block->connect(source, 0, valve, 0); top_block->connect(valve, 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test."<< std::endl; EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec *1e6 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec *1e6 + tv.tv_usec; }) << "Failure running the top_block."<< std::endl; std::cout << "Processed " << nsamples << " samples in " << (end - begin) << " microseconds" << std::endl; delete acquisition; } TEST_F(GpsL1CaPcpsAcquisitionGSoC2013Test, ValidationOfResults) { config_1(); queue = gr::msg_queue::make(0); top_block = gr::make_top_block("Acquisition test"); acquisition = new GpsL1CaPcpsAcquisition(config.get(), "Acquisition", 1, 1); boost::shared_ptr msg_rx = GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->set_channel(1); }) << "Failure setting channel."<< std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro."<< std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(10000); }) << "Failure setting doppler_max."<< std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(500); }) << "Failure setting doppler_step."<< std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(0.5); }) << "Failure setting threshold."<< std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting acquisition to the top_block."<< std::endl; acquisition->init(); ASSERT_NO_THROW( { boost::shared_ptr signal_source; SignalGenerator* signal_generator = new SignalGenerator(config.get(), "SignalSource", 0, 1, queue); FirFilter* filter = new FirFilter(config.get(), "InputFilter", 1, 1); signal_source.reset(new GenSignalSource(signal_generator, filter, "SignalSource", queue)); signal_source->connect(top_block); top_block->connect(signal_source->get_right_block(), 0, acquisition->get_left_block(), 0); }) << "Failure connecting the blocks of acquisition test." << std::endl; // i = 0 --> satellite in acquisition is visible // i = 1 --> satellite in acquisition is not visible for (unsigned int i = 0; i < 2; i++) { init(); if (i == 0) { gnss_synchro.PRN = 10; // This satellite is visible } else if (i == 1) { gnss_synchro.PRN = 20; // This satellite is not visible } acquisition->set_local_code(); acquisition->set_state(1); // Ensure that acquisition starts at the first sample start_queue(); EXPECT_NO_THROW( { top_block->run(); // Start threads and wait }) << "Failure running the top_block."<< std::endl; if (i == 0) { EXPECT_EQ(1, message) << "Acquisition failure. Expected message: 1=ACQ SUCCESS."; if (message == 1) { EXPECT_EQ((unsigned int) 1, correct_estimation_counter) << "Acquisition failure. Incorrect parameters estimation."; } } else if (i == 1) { EXPECT_EQ(2, message) << "Acquisition failure. Expected message: 2=ACQ FAIL."; } #ifdef OLD_BOOST ASSERT_NO_THROW( { ch_thread.timed_join(boost::posix_time::seconds(1)); }) << "Failure while waiting the queue to stop" << std::endl; #endif #ifndef OLD_BOOST ASSERT_NO_THROW( { ch_thread.try_join_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(50)); }) << "Failure while waiting the queue to stop" << std::endl; #endif } delete acquisition; } TEST_F(GpsL1CaPcpsAcquisitionGSoC2013Test, ValidationOfResultsProbabilities) { config_2(); queue = gr::msg_queue::make(0); top_block = gr::make_top_block("Acquisition test"); acquisition = new GpsL1CaPcpsAcquisition(config.get(), "Acquisition", 1, 1); boost::shared_ptr msg_rx = GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->set_channel(1); }) << "Failure setting channel."<< std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro."<< std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(config->property("Acquisition.doppler_max", 10000)); }) << "Failure setting doppler_max."<< std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(config->property("Acquisition.doppler_step", 500)); }) << "Failure setting doppler_step."<< std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(config->property("Acquisition.threshold", 0.0)); }) << "Failure setting threshold."<< std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting acquisition to the top_block."<< std::endl; acquisition->init(); ASSERT_NO_THROW( { boost::shared_ptr signal_source; SignalGenerator* signal_generator = new SignalGenerator(config.get(), "SignalSource", 0, 1, queue); FirFilter* filter = new FirFilter(config.get(), "InputFilter", 1, 1); signal_source.reset(new GenSignalSource(signal_generator, filter, "SignalSource", queue)); signal_source->connect(top_block); top_block->connect(signal_source->get_right_block(), 0, acquisition->get_left_block(), 0); }) << "Failure connecting the blocks of acquisition test." << std::endl; std::cout << "Probability of false alarm (target) = " << 0.1 << std::endl; // i = 0 --> satellite in acquisition is visible (prob of detection and prob of detection with wrong estimation) // i = 1 --> satellite in acquisition is not visible (prob of false detection) for (unsigned int i = 0; i < 2; i++) { init(); if (i == 0) { gnss_synchro.PRN = 10; // This satellite is visible } else if (i == 1) { gnss_synchro.PRN = 20; // This satellite is not visible } acquisition->set_local_code(); start_queue(); EXPECT_NO_THROW( { top_block->run(); // Start threads and wait }) << "Failure running the top_block."<< std::endl; if (i == 0) { std::cout << "Estimated probability of detection = " << Pd << std::endl; std::cout << "Estimated probability of false alarm (satellite present) = " << Pfa_p << std::endl; std::cout << "Mean acq time = " << mean_acq_time_us << " microseconds." << std::endl; } else if (i == 1) { std::cout << "Estimated probability of false alarm (satellite absent) = " << Pfa_a << std::endl; std::cout << "Mean acq time = " << mean_acq_time_us << " microseconds." << std::endl; } #ifdef OLD_BOOST ASSERT_NO_THROW( { ch_thread.timed_join(boost::posix_time::seconds(1)); }) << "Failure while waiting the queue to stop" << std::endl; #endif #ifndef OLD_BOOST ASSERT_NO_THROW( { ch_thread.try_join_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(50)); }) << "Failure while waiting the queue to stop" << std::endl; #endif } delete acquisition; } gps_l1_ca_pcps_acquisition_test.cc000066400000000000000000000232451305042567700353550ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/acquisition/*! * \file gps_l1_ca_pcps_acquisition_test.cc * \brief This class implements an acquisition test for * GpsL1CaPcpsAcquisition class based on some input parameters. * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include #include #include #include "gnss_block_factory.h" #include "gnss_block_interface.h" #include "in_memory_configuration.h" #include "gnss_sdr_valve.h" #include "gnss_synchro.h" #include "gps_l1_ca_pcps_acquisition.h" // ######## GNURADIO BLOCK MESSAGE RECEVER ######### class GpsL1CaPcpsAcquisitionTest_msg_rx; typedef boost::shared_ptr GpsL1CaPcpsAcquisitionTest_msg_rx_sptr; GpsL1CaPcpsAcquisitionTest_msg_rx_sptr GpsL1CaPcpsAcquisitionTest_msg_rx_make(); class GpsL1CaPcpsAcquisitionTest_msg_rx : public gr::block { private: friend GpsL1CaPcpsAcquisitionTest_msg_rx_sptr GpsL1CaPcpsAcquisitionTest_msg_rx_make(); void msg_handler_events(pmt::pmt_t msg); GpsL1CaPcpsAcquisitionTest_msg_rx(); public: int rx_message; ~GpsL1CaPcpsAcquisitionTest_msg_rx(); //!< Default destructor }; GpsL1CaPcpsAcquisitionTest_msg_rx_sptr GpsL1CaPcpsAcquisitionTest_msg_rx_make() { return GpsL1CaPcpsAcquisitionTest_msg_rx_sptr(new GpsL1CaPcpsAcquisitionTest_msg_rx()); } void GpsL1CaPcpsAcquisitionTest_msg_rx::msg_handler_events(pmt::pmt_t msg) { try { long int message = pmt::to_long(msg); rx_message = message; } catch(boost::bad_any_cast& e) { LOG(WARNING) << "msg_handler_telemetry Bad any cast!"; rx_message = 0; } } GpsL1CaPcpsAcquisitionTest_msg_rx::GpsL1CaPcpsAcquisitionTest_msg_rx() : gr::block("GpsL1CaPcpsAcquisitionTest_msg_rx", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)) { this->message_port_register_in(pmt::mp("events")); this->set_msg_handler(pmt::mp("events"), boost::bind(&GpsL1CaPcpsAcquisitionTest_msg_rx::msg_handler_events, this, _1)); rx_message = 0; } GpsL1CaPcpsAcquisitionTest_msg_rx::~GpsL1CaPcpsAcquisitionTest_msg_rx() {} // ########################################################### class GpsL1CaPcpsAcquisitionTest: public ::testing::Test { protected: GpsL1CaPcpsAcquisitionTest() { factory = std::make_shared(); config = std::make_shared(); item_size = sizeof(gr_complex); gnss_synchro = Gnss_Synchro(); } ~GpsL1CaPcpsAcquisitionTest() {} void init(); gr::top_block_sptr top_block; std::shared_ptr factory; std::shared_ptr config; Gnss_Synchro gnss_synchro; size_t item_size; }; void GpsL1CaPcpsAcquisitionTest::init() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'G'; std::string signal = "1C"; signal.copy(gnss_synchro.Signal, 2, 0); gnss_synchro.PRN = 1; config->set_property("GNSS-SDR.internal_fs_hz", "4000000"); config->set_property("Acquisition.item_type", "gr_complex"); config->set_property("Acquisition.if", "0"); config->set_property("Acquisition.coherent_integration_time_ms", "1"); config->set_property("Acquisition.dump", "false"); config->set_property("Acquisition.implementation", "GPS_L1_CA_PCPS_Acquisition"); config->set_property("Acquisition.threshold", "0.001"); config->set_property("Acquisition.doppler_max", "5000"); config->set_property("Acquisition.doppler_step", "500"); config->set_property("Acquisition.repeat_satellite", "false"); config->set_property("Acquisition.pfa", "0.0"); } TEST_F(GpsL1CaPcpsAcquisitionTest, Instantiate) { init(); boost::shared_ptr acquisition = boost::make_shared(config.get(), "Acquisition", 1, 1); } TEST_F(GpsL1CaPcpsAcquisitionTest, ConnectAndRun) { int fs_in = 4000000; int nsamples = 4000; struct timeval tv; long long int begin = 0; long long int end = 0; gr::msg_queue::sptr queue = gr::msg_queue::make(0); top_block = gr::make_top_block("Acquisition test"); init(); boost::shared_ptr acquisition = boost::make_shared(config.get(), "Acquisition", 1, 1); boost::shared_ptr msg_rx = GpsL1CaPcpsAcquisitionTest_msg_rx_make(); ASSERT_NO_THROW( { acquisition->connect(top_block); boost::shared_ptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000, 1, gr_complex(0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); top_block->connect(source, 0, valve, 0); top_block->connect(valve, 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec * 1000000 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec * 1000000 + tv.tv_usec; }) << "Failure running the top_block." << std::endl; std::cout << "Processed " << nsamples << " samples in " << (end - begin) << " microseconds" << std::endl; } TEST_F(GpsL1CaPcpsAcquisitionTest, ValidationOfResults) { struct timeval tv; long long int begin = 0; long long int end = 0; top_block = gr::make_top_block("Acquisition test"); double expected_delay_samples = 524; double expected_doppler_hz = 1680; init(); std::shared_ptr acquisition = std::make_shared(config.get(), "Acquisition", 1, 1); boost::shared_ptr msg_rx = GpsL1CaPcpsAcquisitionTest_msg_rx_make(); ASSERT_NO_THROW( { acquisition->set_channel(1); }) << "Failure setting channel." << std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro." << std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(0.1); }) << "Failure setting threshold." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(10000); }) << "Failure setting doppler_max." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(250); }) << "Failure setting doppler_step." << std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); }) << "Failure connecting acquisition to the top_block." << std::endl; ASSERT_NO_THROW( { std::string path = std::string(TEST_PATH); //std::string file = path + "signal_samples/GSoC_CTTC_capture_2012_07_26_4Msps_4ms.dat"; std::string file = path + "signal_samples/GPS_L1_CA_ID_1_Fs_4Msps_2ms.dat"; const char * file_name = file.c_str(); gr::blocks::file_source::sptr file_source = gr::blocks::file_source::make(sizeof(gr_complex), file_name, false); top_block->connect(file_source, 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; acquisition->set_state(1); // Ensure that acquisition starts at the first sample acquisition->init(); EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec * 1000000 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec * 1000000 + tv.tv_usec; }) << "Failure running the top_block." << std::endl; unsigned long int nsamples = gnss_synchro.Acq_samplestamp_samples; std::cout << "Acquired " << nsamples << " samples in " << (end - begin) << " microseconds" << std::endl; ASSERT_EQ(1, msg_rx->rx_message) << "Acquisition failure. Expected message: 1=ACQ SUCCESS."; double delay_error_samples = std::abs(expected_delay_samples - gnss_synchro.Acq_delay_samples); float delay_error_chips = (float)(delay_error_samples * 1023 / 4000); double doppler_error_hz = std::abs(expected_doppler_hz - gnss_synchro.Acq_doppler_hz); EXPECT_LE(doppler_error_hz, 666) << "Doppler error exceeds the expected value: 666 Hz = 2/(3*integration period)"; EXPECT_LT(delay_error_chips, 0.5) << "Delay error exceeds the expected value: 0.5 chips"; } gps_l1_ca_pcps_multithread_acquisition_gsoc2013_test.cc000066400000000000000000000510511305042567700412740ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/acquisition/*! * \file gps_l1_ca_pcps_multithread_acquisition_gsoc2013_test.cc * \brief This class implements an acquisition test for * GpsL1CaPcpsMultithreadAcquisition class. * \author Marc Molina, 2013. marc.molina.pena(at)gmail.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include "gnss_block_interface.h" #include "in_memory_configuration.h" #include "configuration_interface.h" #include "gnss_synchro.h" #include "gps_l1_ca_pcps_multithread_acquisition.h" #include "signal_generator.h" #include "signal_generator_c.h" #include "fir_filter.h" #include "gen_signal_source.h" #include "gnss_sdr_valve.h" #include "signal_generator.h" #include "signal_generator.cc" #include "signal_generator_c.h" #include "signal_generator_c.cc" class GpsL1CaPcpsMultithreadAcquisitionGSoC2013Test: public ::testing::Test { protected: GpsL1CaPcpsMultithreadAcquisitionGSoC2013Test() { item_size = sizeof(gr_complex); stop = false; message = 0; gnss_synchro = Gnss_Synchro(); } ~GpsL1CaPcpsMultithreadAcquisitionGSoC2013Test() { } void init(); void config_1(); void config_2(); void start_queue(); void wait_message(); void process_message(); void stop_queue(); gr::msg_queue::sptr queue; gr::top_block_sptr top_block; std::shared_ptr acquisition; std::shared_ptr config; Gnss_Synchro gnss_synchro; size_t item_size; bool stop; int message; boost::thread ch_thread; unsigned int integration_time_ms = 0; unsigned int fs_in = 0; double expected_delay_chips = 0.0; double expected_doppler_hz = 0.0; float max_doppler_error_hz = 0.0; float max_delay_error_chips = 0.0; unsigned int num_of_realizations = 0; unsigned int realization_counter = 0; unsigned int detection_counter = 0; unsigned int correct_estimation_counter = 0; unsigned int acquired_samples = 0; unsigned int mean_acq_time_us = 0; double mse_doppler = 0.0; double mse_delay = 0.0; double Pd = 0.0; double Pfa_p = 0.0; double Pfa_a = 0.0; }; void GpsL1CaPcpsMultithreadAcquisitionGSoC2013Test::init() { message = 0; realization_counter = 0; detection_counter = 0; correct_estimation_counter = 0; acquired_samples = 0; mse_doppler = 0; mse_delay = 0; mean_acq_time_us = 0; Pd = 0; Pfa_p = 0; Pfa_a = 0; } void GpsL1CaPcpsMultithreadAcquisitionGSoC2013Test::config_1() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'G'; std::string signal = "1C"; signal.copy(gnss_synchro.Signal,2,0); integration_time_ms = 1; fs_in = 4e6; expected_delay_chips = 600; expected_doppler_hz = 750; max_doppler_error_hz = 2/(3*integration_time_ms*1e-3); max_delay_error_chips = 0.50; num_of_realizations = 1; config = std::make_shared(); config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.num_satellites", "1"); config->set_property("SignalSource.system_0", "G"); config->set_property("SignalSource.PRN_0", "10"); config->set_property("SignalSource.CN0_dB_0", "44"); config->set_property("SignalSource.doppler_Hz_0", std::to_string(expected_doppler_hz)); config->set_property("SignalSource.delay_chips_0", std::to_string(expected_delay_chips)); config->set_property("SignalSource.noise_flag", "false"); config->set_property("SignalSource.data_flag", "false"); config->set_property("SignalSource.BW_BB", "0.97"); config->set_property("InputFilter.implementation", "Fir_Filter"); config->set_property("InputFilter.input_item_type", "gr_complex"); config->set_property("InputFilter.output_item_type", "gr_complex"); config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", "11"); config->set_property("InputFilter.number_of_bands", "2"); config->set_property("InputFilter.band1_begin", "0.0"); config->set_property("InputFilter.band1_end", "0.97"); config->set_property("InputFilter.band2_begin", "0.98"); config->set_property("InputFilter.band2_end", "1.0"); config->set_property("InputFilter.ampl1_begin", "1.0"); config->set_property("InputFilter.ampl1_end", "1.0"); config->set_property("InputFilter.ampl2_begin", "0.0"); config->set_property("InputFilter.ampl2_end", "0.0"); config->set_property("InputFilter.band1_error", "1.0"); config->set_property("InputFilter.band2_error", "1.0"); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", "16"); config->set_property("Acquisition.item_type", "gr_complex"); config->set_property("Acquisition.if", "0"); config->set_property("Acquisition.coherent_integration_time_ms", std::to_string(integration_time_ms)); config->set_property("Acquisition.max_dwells", "1"); config->set_property("Acquisition.implementation", "GPS_L1_CA_PCPS_Multithread_Acquisition"); config->set_property("Acquisition.threshold", "0.8"); config->set_property("Acquisition.doppler_max", "10000"); config->set_property("Acquisition.doppler_step", "250"); config->set_property("Acquisition.bit_transition_flag", "false"); config->set_property("Acquisition.dump", "false"); } void GpsL1CaPcpsMultithreadAcquisitionGSoC2013Test::config_2() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'G'; std::string signal = "1C"; signal.copy(gnss_synchro.Signal,2,0); integration_time_ms = 1; fs_in = 4e6; expected_delay_chips = 600; expected_doppler_hz = 750; max_doppler_error_hz = 2/(3*integration_time_ms*1e-3); max_delay_error_chips = 0.50; num_of_realizations = 100; config = std::make_shared(); config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.num_satellites", "4"); config->set_property("SignalSource.system_0", "G"); config->set_property("SignalSource.PRN_0", "10"); config->set_property("SignalSource.CN0_dB_0", "44"); config->set_property("SignalSource.doppler_Hz_0", std::to_string(expected_doppler_hz)); config->set_property("SignalSource.delay_chips_0", std::to_string(expected_delay_chips)); config->set_property("SignalSource.system_1", "G"); config->set_property("SignalSource.PRN_1", "15"); config->set_property("SignalSource.CN0_dB_1", "44"); config->set_property("SignalSource.doppler_Hz_1", "1000"); config->set_property("SignalSource.delay_chips_1", "100"); config->set_property("SignalSource.system_2", "G"); config->set_property("SignalSource.PRN_2", "21"); config->set_property("SignalSource.CN0_dB_2", "44"); config->set_property("SignalSource.doppler_Hz_2", "2000"); config->set_property("SignalSource.delay_chips_2", "200"); config->set_property("SignalSource.system_3", "G"); config->set_property("SignalSource.PRN_3", "22"); config->set_property("SignalSource.CN0_dB_3", "44"); config->set_property("SignalSource.doppler_Hz_3", "3000"); config->set_property("SignalSource.delay_chips_3", "300"); config->set_property("SignalSource.noise_flag", "true"); config->set_property("SignalSource.data_flag", "true"); config->set_property("SignalSource.BW_BB", "0.97"); config->set_property("InputFilter.implementation", "Fir_Filter"); config->set_property("InputFilter.input_item_type", "gr_complex"); config->set_property("InputFilter.output_item_type", "gr_complex"); config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", "11"); config->set_property("InputFilter.number_of_bands", "2"); config->set_property("InputFilter.band1_begin", "0.0"); config->set_property("InputFilter.band1_end", "0.97"); config->set_property("InputFilter.band2_begin", "0.98"); config->set_property("InputFilter.band2_end", "1.0"); config->set_property("InputFilter.ampl1_begin", "1.0"); config->set_property("InputFilter.ampl1_end", "1.0"); config->set_property("InputFilter.ampl2_begin", "0.0"); config->set_property("InputFilter.ampl2_end", "0.0"); config->set_property("InputFilter.band1_error", "1.0"); config->set_property("InputFilter.band2_error", "1.0"); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", "16"); config->set_property("Acquisition.item_type", "gr_complex"); config->set_property("Acquisition.if", "0"); config->set_property("Acquisition.coherent_integration_time_ms", std::to_string(integration_time_ms)); config->set_property("Acquisition.max_dwells", "1"); config->set_property("Acquisition.implementation", "GPS_L1_CA_PCPS_Multithread_Acquisition"); config->set_property("Acquisition.pfa", "0.1"); config->set_property("Acquisition.doppler_max", "10000"); config->set_property("Acquisition.doppler_step", "250"); config->set_property("Acquisition.bit_transition_flag", "false"); config->set_property("Acquisition.dump", "false"); } void GpsL1CaPcpsMultithreadAcquisitionGSoC2013Test::start_queue() { stop = false; ch_thread = boost::thread(&GpsL1CaPcpsMultithreadAcquisitionGSoC2013Test::wait_message, this); } void GpsL1CaPcpsMultithreadAcquisitionGSoC2013Test::wait_message() { struct timeval tv; long long int begin = 0; long long int end = 0; while (!stop) { acquisition->reset(); gettimeofday(&tv, NULL); begin = tv.tv_sec *1e6 + tv.tv_usec; channel_internal_queue.wait_and_pop(message); gettimeofday(&tv, NULL); end = tv.tv_sec *1e6 + tv.tv_usec; mean_acq_time_us += (end-begin); process_message(); } } void GpsL1CaPcpsMultithreadAcquisitionGSoC2013Test::process_message() { if (message == 1) { detection_counter++; // The term -5 is here to correct the additional delay introduced by the FIR filter double delay_error_chips = std::abs((double)expected_delay_chips - (double)(gnss_synchro.Acq_delay_samples-5)*1023.0/((double)fs_in*1e-3)); double doppler_error_hz = std::abs(expected_doppler_hz - gnss_synchro.Acq_doppler_hz); mse_delay += std::pow(delay_error_chips, 2); mse_doppler += std::pow(doppler_error_hz, 2); if ((delay_error_chips < max_delay_error_chips) && (doppler_error_hz < max_doppler_error_hz)) { correct_estimation_counter++; } } realization_counter++; std::cout << "Progress: " << round((float)realization_counter/num_of_realizations*100) << "% \r" << std::flush; if (realization_counter == num_of_realizations) { mse_delay /= num_of_realizations; mse_doppler /= num_of_realizations; Pd = (double)correct_estimation_counter / (double)num_of_realizations; Pfa_a = (double)detection_counter / (double)num_of_realizations; Pfa_p = (double)(detection_counter-correct_estimation_counter) / (double)num_of_realizations; mean_acq_time_us /= num_of_realizations; stop_queue(); top_block->stop(); std::cout << std::endl; } } void GpsL1CaPcpsMultithreadAcquisitionGSoC2013Test::stop_queue() { stop = true; } TEST_F(GpsL1CaPcpsMultithreadAcquisitionGSoC2013Test, Instantiate) { config_1(); acquisition = std::make_shared(config.get(), "Acquisition", 1, 1); } TEST_F(GpsL1CaPcpsMultithreadAcquisitionGSoC2013Test, ConnectAndRun) { int nsamples = floor(fs_in*integration_time_ms*1e-3); struct timeval tv; long long int begin = 0; long long int end = 0; queue = gr::msg_queue::make(0); top_block = gr::make_top_block("Acquisition test"); config_1(); acquisition = std::make_shared(config.get(), "Acquisition", 1, 1); ASSERT_NO_THROW( { acquisition->connect(top_block); boost::shared_ptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000, 1, gr_complex(0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); top_block->connect(source, 0, valve, 0); top_block->connect(valve, 0, acquisition->get_left_block(), 0); }) << "Failure connecting the blocks of acquisition test." << std::endl; EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec *1e6 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec *1e6 + tv.tv_usec; }) << "Failure running the top_block." << std::endl; std::cout << "Processed " << nsamples << " samples in " << (end - begin) << " microseconds" << std::endl; } TEST_F(GpsL1CaPcpsMultithreadAcquisitionGSoC2013Test, ValidationOfResults) { config_1(); queue = gr::msg_queue::make(0); top_block = gr::make_top_block("Acquisition test"); acquisition = std::make_shared(config.get(), "Acquisition", 1, 1); ASSERT_NO_THROW( { acquisition->set_channel(1); }) << "Failure setting channel." << std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(config->property("Acquisition.doppler_max", 10000)); }) << "Failure setting doppler_max." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(config->property("Acquisition.doppler_step", 500)); }) << "Failure setting doppler_step." << std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(config->property("Acquisition.threshold", 0.0)); }) << "Failure setting threshold." << std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); }) << "Failure connecting acquisition to the top_block." << std::endl; acquisition->init(); ASSERT_NO_THROW( { boost::shared_ptr signal_source; SignalGenerator* signal_generator = new SignalGenerator(config.get(), "SignalSource", 0, 1, queue); FirFilter* filter = new FirFilter(config.get(), "InputFilter", 1, 1); signal_source.reset(new GenSignalSource(signal_generator, filter, "SignalSource", queue)); signal_source->connect(top_block); top_block->connect(signal_source->get_right_block(), 0, acquisition->get_left_block(), 0); }) << "Failure connecting the blocks of acquisition test." << std::endl; // i = 0 --> satellite in acquisition is visible // i = 1 --> satellite in acquisition is not visible for (unsigned int i = 0; i < 2; i++) { init(); if (i == 0) { gnss_synchro.PRN = 10; // This satellite is visible } else if (i == 1) { gnss_synchro.PRN = 20; // This satellite is not visible } acquisition->set_local_code(); start_queue(); EXPECT_NO_THROW( { top_block->run(); // Start threads and wait }) << "Failure running the top_block." << std::endl; if (i == 0) { EXPECT_EQ(1, message) << "Acquisition failure. Expected message: 1=ACQ SUCCESS."; if (message == 1) { EXPECT_EQ((unsigned int)1, correct_estimation_counter) << "Acquisition failure. Incorrect parameters estimation."; } } else if (i == 1) { EXPECT_EQ(2, message) << "Acquisition failure. Expected message: 2=ACQ FAIL."; } } } TEST_F(GpsL1CaPcpsMultithreadAcquisitionGSoC2013Test, ValidationOfResultsProbabilities) { config_2(); queue = gr::msg_queue::make(0); top_block = gr::make_top_block("Acquisition test"); acquisition = std::make_shared(config.get(), "Acquisition", 1, 1); ASSERT_NO_THROW( { acquisition->set_channel(1); }) << "Failure setting channel." << std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(config->property("Acquisition.doppler_max", 10000)); }) << "Failure setting doppler_max." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(config->property("Acquisition.doppler_step", 500)); }) << "Failure setting doppler_step." << std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(config->property("Acquisition.threshold", 0.0)); }) << "Failure setting threshold." << std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); }) << "Failure connecting acquisition to the top_block." << std::endl; acquisition->init(); ASSERT_NO_THROW( { boost::shared_ptr signal_source; SignalGenerator* signal_generator = new SignalGenerator(config.get(), "SignalSource", 0, 1, queue); FirFilter* filter = new FirFilter(config.get(), "InputFilter", 1, 1); signal_source.reset(new GenSignalSource(signal_generator, filter, "SignalSource", queue)); signal_source->connect(top_block); top_block->connect(signal_source->get_right_block(), 0, acquisition->get_left_block(), 0); }) << "Failure connecting the blocks of acquisition test." << std::endl; std::cout << "Probability of false alarm (target) = " << 0.1 << std::endl; // i = 0 --> satellite in acquisition is visible (prob of detection and prob of detection with wrong estimation) // i = 1 --> satellite in acquisition is not visible (prob of false detection) for (unsigned int i = 0; i < 2; i++) { init(); if (i == 0) { gnss_synchro.PRN = 10; // This satellite is visible } else if (i == 1) { gnss_synchro.PRN = 20; // This satellite is not visible } acquisition->set_local_code(); start_queue(); EXPECT_NO_THROW( { top_block->run(); // Start threads and wait }) << "Failure running the top_block." << std::endl; if (i == 0) { std::cout << "Probability of detection = " << Pd << std::endl; std::cout << "Probability of false alarm (satellite present) = " << Pfa_p << std::endl; // std::cout << "Mean acq time = " << mean_acq_time_us << " microseconds." << std::endl; } else if (i == 1) { std::cout << "Probability of false alarm (satellite absent) = " << Pfa_a << std::endl; // std::cout << "Mean acq time = " << mean_acq_time_us << " microseconds." << std::endl; } } } gps_l1_ca_pcps_opencl_acquisition_gsoc2013_test.cc000066400000000000000000000562671305042567700402500ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/acquisition/*! * \file gps_l1_ca_pcps_opencl_acquisition_gsoc2013_test.cc * \brief This class implements an acquisition test for * GpsL1CaPcpsOpenClAcquisition class. * \author Marc Molina, 2013. marc.molina.pena(at)gmail.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include "gnss_block_interface.h" #include "in_memory_configuration.h" #include "configuration_interface.h" #include "gnss_synchro.h" #include "gps_l1_ca_pcps_opencl_acquisition.h" #include "signal_generator.h" #include "signal_generator_c.h" #include "fir_filter.h" #include "gen_signal_source.h" #include "gnss_sdr_valve.h" // ######## GNURADIO BLOCK MESSAGE RECEVER ######### class GpsL1CaPcpsOpenClAcquisitionGSoC2013Test_msg_rx; typedef boost::shared_ptr GpsL1CaPcpsOpenClAcquisitionGSoC2013Test_msg_rx_sptr; GpsL1CaPcpsOpenClAcquisitionGSoC2013Test_msg_rx_sptr GpsL1CaPcpsOpenClAcquisitionGSoC2013Test_msg_rx_make(concurrent_queue& queue); class GpsL1CaPcpsOpenClAcquisitionGSoC2013Test_msg_rx : public gr::block { private: friend GpsL1CaPcpsOpenClAcquisitionGSoC2013Test_msg_rx_sptr GpsL1CaPcpsOpenClAcquisitionGSoC2013Test_msg_rx_make(concurrent_queue& queue); void msg_handler_events(pmt::pmt_t msg); GpsL1CaPcpsOpenClAcquisitionGSoC2013Test_msg_rx(concurrent_queue& queue); concurrent_queue& channel_internal_queue; public: int rx_message; ~GpsL1CaPcpsOpenClAcquisitionGSoC2013Test_msg_rx(); //!< Default destructor }; GpsL1CaPcpsOpenClAcquisitionGSoC2013Test_msg_rx_sptr GpsL1CaPcpsOpenClAcquisitionGSoC2013Test_msg_rx_make(concurrent_queue& queue) { return GpsL1CaPcpsOpenClAcquisitionGSoC2013Test_msg_rx_sptr(new GpsL1CaPcpsOpenClAcquisitionGSoC2013Test_msg_rx(queue)); } void GpsL1CaPcpsOpenClAcquisitionGSoC2013Test_msg_rx::msg_handler_events(pmt::pmt_t msg) { try { long int message = pmt::to_long(msg); rx_message = message; channel_internal_queue.push(rx_message); } catch(boost::bad_any_cast& e) { LOG(WARNING) << "msg_handler_telemetry Bad any cast!"; rx_message = 0; } } GpsL1CaPcpsOpenClAcquisitionGSoC2013Test_msg_rx::GpsL1CaPcpsOpenClAcquisitionGSoC2013Test_msg_rx(concurrent_queue& queue) : gr::block("GpsL1CaPcpsOpenClAcquisitionGSoC2013Test_msg_rx", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)), channel_internal_queue(queue) { this->message_port_register_in(pmt::mp("events")); this->set_msg_handler(pmt::mp("events"), boost::bind(&GpsL1CaPcpsOpenClAcquisitionGSoC2013Test_msg_rx::msg_handler_events, this, _1)); rx_message = 0; } GpsL1CaPcpsOpenClAcquisitionGSoC2013Test_msg_rx::~GpsL1CaPcpsOpenClAcquisitionGSoC2013Test_msg_rx() {} // ########################################################### class GpsL1CaPcpsOpenClAcquisitionGSoC2013Test: public ::testing::Test { protected: GpsL1CaPcpsOpenClAcquisitionGSoC2013Test() { queue = gr::msg_queue::make(0); top_block = gr::make_top_block("Acquisition test"); item_size = sizeof(gr_complex); stop = false; message = 0; gnss_synchro = Gnss_Synchro(); init(); } ~GpsL1CaPcpsOpenClAcquisitionGSoC2013Test() {} void init(); void config_1(); void config_2(); void start_queue(); void wait_message(); void process_message(); void stop_queue(); concurrent_queue channel_internal_queue; gr::msg_queue::sptr queue; gr::top_block_sptr top_block; std::shared_ptr acquisition; std::shared_ptr config; Gnss_Synchro gnss_synchro; size_t item_size; bool stop; int message; boost::thread ch_thread; unsigned int integration_time_ms = 0; unsigned int fs_in = 0; double expected_delay_chips = 0.0; double expected_doppler_hz = 0.0; float max_doppler_error_hz = 0; float max_delay_error_chips = 0; unsigned int num_of_realizations = 0; unsigned int realization_counter; unsigned int detection_counter; unsigned int correct_estimation_counter; unsigned int acquired_samples; unsigned int mean_acq_time_us; double mse_doppler; double mse_delay; double Pd; double Pfa_p; double Pfa_a; }; void GpsL1CaPcpsOpenClAcquisitionGSoC2013Test::init() { message = 0; realization_counter = 0; detection_counter = 0; correct_estimation_counter = 0; acquired_samples = 0; mse_doppler = 0; mse_delay = 0; mean_acq_time_us = 0; Pd = 0; Pfa_p = 0; Pfa_a = 0; } void GpsL1CaPcpsOpenClAcquisitionGSoC2013Test::config_1() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'G'; std::string signal = "1C"; signal.copy(gnss_synchro.Signal,2,0); integration_time_ms = 1; fs_in = 4e6; expected_delay_chips = 600; expected_doppler_hz = 750; max_doppler_error_hz = 2/(3*integration_time_ms*1e-3); max_delay_error_chips = 0.50; num_of_realizations = 1; config = std::make_shared(); config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.num_satellites", "1"); config->set_property("SignalSource.system_0", "G"); config->set_property("SignalSource.PRN_0", "10"); config->set_property("SignalSource.CN0_dB_0", "44"); config->set_property("SignalSource.doppler_Hz_0", std::to_string(expected_doppler_hz)); config->set_property("SignalSource.delay_chips_0", std::to_string(expected_delay_chips)); config->set_property("SignalSource.noise_flag", "false"); config->set_property("SignalSource.data_flag", "false"); config->set_property("SignalSource.BW_BB", "0.97"); config->set_property("InputFilter.implementation", "Fir_Filter"); config->set_property("InputFilter.input_item_type", "gr_complex"); config->set_property("InputFilter.output_item_type", "gr_complex"); config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", "11"); config->set_property("InputFilter.number_of_bands", "2"); config->set_property("InputFilter.band1_begin", "0.0"); config->set_property("InputFilter.band1_end", "0.97"); config->set_property("InputFilter.band2_begin", "0.98"); config->set_property("InputFilter.band2_end", "1.0"); config->set_property("InputFilter.ampl1_begin", "1.0"); config->set_property("InputFilter.ampl1_end", "1.0"); config->set_property("InputFilter.ampl2_begin", "0.0"); config->set_property("InputFilter.ampl2_end", "0.0"); config->set_property("InputFilter.band1_error", "1.0"); config->set_property("InputFilter.band2_error", "1.0"); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", "16"); config->set_property("Acquisition.item_type", "gr_complex"); config->set_property("Acquisition.if", "0"); config->set_property("Acquisition.coherent_integration_time_ms", std::to_string(integration_time_ms)); config->set_property("Acquisition.max_dwells", "1"); config->set_property("Acquisition.implementation", "GPS_L1_CA_PCPS_OpenCl_Acquisition"); config->set_property("Acquisition.threshold", "0.8"); config->set_property("Acquisition.doppler_max", "10000"); config->set_property("Acquisition.doppler_step", "250"); config->set_property("Acquisition.bit_transition_flag", "false"); config->set_property("Acquisition.dump", "false"); } void GpsL1CaPcpsOpenClAcquisitionGSoC2013Test::config_2() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'G'; std::string signal = "1C"; signal.copy(gnss_synchro.Signal, 2, 0); integration_time_ms = 1; fs_in = 4e6; expected_delay_chips = 600; expected_doppler_hz = 750; max_doppler_error_hz = 2/(3*integration_time_ms*1e-3); max_delay_error_chips = 0.50; num_of_realizations = 10; // Change here the number of realizations config = std::make_shared(); config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.num_satellites", "4"); config->set_property("SignalSource.system_0", "G"); config->set_property("SignalSource.PRN_0", "10"); config->set_property("SignalSource.CN0_dB_0", "44"); config->set_property("SignalSource.doppler_Hz_0", std::to_string(expected_doppler_hz)); config->set_property("SignalSource.delay_chips_0", std::to_string(expected_delay_chips)); config->set_property("SignalSource.system_1", "G"); config->set_property("SignalSource.PRN_1", "15"); config->set_property("SignalSource.CN0_dB_1", "44"); config->set_property("SignalSource.doppler_Hz_1", "1000"); config->set_property("SignalSource.delay_chips_1", "100"); config->set_property("SignalSource.system_2", "G"); config->set_property("SignalSource.PRN_2", "21"); config->set_property("SignalSource.CN0_dB_2", "44"); config->set_property("SignalSource.doppler_Hz_2", "2000"); config->set_property("SignalSource.delay_chips_2", "200"); config->set_property("SignalSource.system_3", "G"); config->set_property("SignalSource.PRN_3", "22"); config->set_property("SignalSource.CN0_dB_3", "44"); config->set_property("SignalSource.doppler_Hz_3", "3000"); config->set_property("SignalSource.delay_chips_3", "300"); config->set_property("SignalSource.noise_flag", "true"); config->set_property("SignalSource.data_flag", "true"); config->set_property("SignalSource.BW_BB", "0.97"); config->set_property("InputFilter.implementation", "Fir_Filter"); config->set_property("InputFilter.input_item_type", "gr_complex"); config->set_property("InputFilter.output_item_type", "gr_complex"); config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", "11"); config->set_property("InputFilter.number_of_bands", "2"); config->set_property("InputFilter.band1_begin", "0.0"); config->set_property("InputFilter.band1_end", "0.97"); config->set_property("InputFilter.band2_begin", "0.98"); config->set_property("InputFilter.band2_end", "1.0"); config->set_property("InputFilter.ampl1_begin", "1.0"); config->set_property("InputFilter.ampl1_end", "1.0"); config->set_property("InputFilter.ampl2_begin", "0.0"); config->set_property("InputFilter.ampl2_end", "0.0"); config->set_property("InputFilter.band1_error", "1.0"); config->set_property("InputFilter.band2_error", "1.0"); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", "16"); config->set_property("Acquisition.item_type", "gr_complex"); config->set_property("Acquisition.if", "0"); config->set_property("Acquisition.coherent_integration_time_ms", std::to_string(integration_time_ms)); config->set_property("Acquisition.max_dwells", "1"); config->set_property("Acquisition.implementation", "GPS_L1_CA_PCPS_OpenCl_Acquisition"); config->set_property("Acquisition.pfa", "0.1"); config->set_property("Acquisition.doppler_max", "10000"); config->set_property("Acquisition.doppler_step", "250"); config->set_property("Acquisition.bit_transition_flag", "false"); config->set_property("Acquisition.dump", "false"); } void GpsL1CaPcpsOpenClAcquisitionGSoC2013Test::start_queue() { stop = false; ch_thread = boost::thread(&GpsL1CaPcpsOpenClAcquisitionGSoC2013Test::wait_message, this); } void GpsL1CaPcpsOpenClAcquisitionGSoC2013Test::wait_message() { struct timeval tv; long long int begin = 0; long long int end = 0; while (!stop) { acquisition->reset(); gettimeofday(&tv, NULL); begin = tv.tv_sec *1e6 + tv.tv_usec; channel_internal_queue.wait_and_pop(message); gettimeofday(&tv, NULL); end = tv.tv_sec *1e6 + tv.tv_usec; mean_acq_time_us += (end-begin); process_message(); } } void GpsL1CaPcpsOpenClAcquisitionGSoC2013Test::process_message() { if (message == 1) { detection_counter++; // The term -5 is here to correct the additional delay introduced by the FIR filter double delay_error_chips = std::abs((double)expected_delay_chips - (double)(gnss_synchro.Acq_delay_samples- 5 )*1023.0/((double)fs_in*1e-3)); double doppler_error_hz = std::abs(expected_doppler_hz - gnss_synchro.Acq_doppler_hz); mse_delay += std::pow(delay_error_chips, 2); mse_doppler += std::pow(doppler_error_hz, 2); if ((delay_error_chips < max_delay_error_chips) && (doppler_error_hz < max_doppler_error_hz)) { correct_estimation_counter++; } } realization_counter++; std::cout << "Progress: " << round((float)realization_counter/num_of_realizations*100) << "% \r" << std::flush; if (realization_counter == num_of_realizations) { mse_delay /= num_of_realizations; mse_doppler /= num_of_realizations; Pd = (double)correct_estimation_counter / (double)num_of_realizations; Pfa_a = (double)detection_counter / (double)num_of_realizations; Pfa_p = (double)(detection_counter-correct_estimation_counter) / (double)num_of_realizations; mean_acq_time_us /= num_of_realizations; stop_queue(); top_block->stop(); std::cout << std::endl; } } void GpsL1CaPcpsOpenClAcquisitionGSoC2013Test::stop_queue() { stop = true; } TEST_F(GpsL1CaPcpsOpenClAcquisitionGSoC2013Test, Instantiate) { config_1(); acquisition = std::make_shared(config.get(), "Acquisition", 1, 1); } TEST_F(GpsL1CaPcpsOpenClAcquisitionGSoC2013Test, ConnectAndRun) { int nsamples = floor(fs_in*integration_time_ms*1e-3); struct timeval tv; long long int begin = 0; long long int end = 0; config_1(); acquisition = std::make_shared(config.get(), "Acquisition", 1, 1); boost::shared_ptr msg_rx = GpsL1CaPcpsOpenClAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->connect(top_block); boost::shared_ptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000, 1, gr_complex(0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); top_block->connect(source, 0, valve, 0); top_block->connect(valve, 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec * 1e6 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec * 1e6 + tv.tv_usec; }) << "Failure running the top_block." << std::endl; std::cout << "Processed " << nsamples << " samples in " << (end - begin) << " microseconds" << std::endl; } TEST_F(GpsL1CaPcpsOpenClAcquisitionGSoC2013Test, ValidationOfResults) { config_1(); acquisition = std::make_shared(config.get(), "Acquisition", 1, 1); boost::shared_ptr msg_rx = GpsL1CaPcpsOpenClAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->set_channel(1); }) << "Failure setting channel." << std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(config->property("Acquisition.doppler_max", 10000)); }) << "Failure setting doppler_max." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(config->property("Acquisition.doppler_step", 500)); }) << "Failure setting doppler_step." << std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(config->property("Acquisition.threshold", 0.0)); }) << "Failure setting threshold." << std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); }) << "Failure connecting acquisition to the top_block." << std::endl; acquisition->init(); ASSERT_NO_THROW( { boost::shared_ptr signal_source; SignalGenerator* signal_generator = new SignalGenerator(config.get(), "SignalSource", 0, 1, queue); FirFilter* filter = new FirFilter(config.get(), "InputFilter", 1, 1); signal_source.reset(new GenSignalSource(signal_generator, filter, "SignalSource", queue)); signal_source->connect(top_block); top_block->connect(signal_source->get_right_block(), 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; // i = 0 --> satellite in acquisition is visible // i = 1 --> satellite in acquisition is not visible for (unsigned int i = 0; i < 2; i++) { init(); if (i == 0) { gnss_synchro.PRN = 10; // This satellite is visible } else if (i == 1) { gnss_synchro.PRN = 20; // This satellite is not visible } acquisition->set_local_code(); start_queue(); EXPECT_NO_THROW( { top_block->run(); // Start threads and wait }) << "Failure running the top_block." << std::endl; if (i == 0) { EXPECT_EQ(1, message) << "Acquisition failure. Expected message: 1=ACQ SUCCESS."; if (message == 1) { EXPECT_EQ((unsigned int)1, correct_estimation_counter) << "Acquisition failure. Incorrect parameters estimation."; } } else if (i == 1) { EXPECT_EQ(2, message) << "Acquisition failure. Expected message: 2=ACQ FAIL."; } } } TEST_F(GpsL1CaPcpsOpenClAcquisitionGSoC2013Test, ValidationOfResultsProbabilities) { config_2(); acquisition = std::make_shared(config.get(), "Acquisition", 1, 1); boost::shared_ptr msg_rx = GpsL1CaPcpsOpenClAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->set_channel(1); }) << "Failure setting channel." << std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(config->property("Acquisition.doppler_max", 10000)); }) << "Failure setting doppler_max." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(config->property("Acquisition.doppler_step", 500)); }) << "Failure setting doppler_step." << std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(config->property("Acquisition.threshold", 0.0)); }) << "Failure setting threshold." << std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); }) << "Failure connecting acquisition to the top_block." << std::endl; acquisition->init(); ASSERT_NO_THROW( { boost::shared_ptr signal_source; SignalGenerator* signal_generator = new SignalGenerator(config.get(), "SignalSource", 0, 1, queue); FirFilter* filter = new FirFilter(config.get(), "InputFilter", 1, 1); signal_source.reset(new GenSignalSource(signal_generator, filter, "SignalSource", queue)); signal_source->connect(top_block); top_block->connect(signal_source->get_right_block(), 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; std::cout << "Probability of false alarm (target) = " << 0.1 << std::endl; // i = 0 --> satellite in acquisition is visible (prob of detection and prob of detection with wrong estimation) // i = 1 --> satellite in acquisition is not visible (prob of false detection) for (unsigned int i = 0; i < 2; i++) { init(); if (i == 0) { gnss_synchro.PRN = 10; // This satellite is visible } else if (i == 1) { gnss_synchro.PRN = 20; // This satellite is not visible } acquisition->set_local_code(); start_queue(); EXPECT_NO_THROW( { top_block->run(); // Start threads and wait }) << "Failure running the top_block." << std::endl; if (i == 0) { std::cout << "Estimated probability of detection = " << Pd << std::endl; std::cout << "Estimated probability of false alarm (satellite present) = " << Pfa_p << std::endl; std::cout << "Mean acq time = " << mean_acq_time_us << " microseconds." << std::endl; } else if (i == 1) { std::cout << "Estimated probability of false alarm (satellite absent) = " << Pfa_a << std::endl; std::cout << "Mean acq time = " << mean_acq_time_us << " microseconds." << std::endl; } } } gps_l1_ca_pcps_quicksync_acquisition_gsoc2014_test.cc000066400000000000000000001034761305042567700407750ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/acquisition/*! * \file gps_l1_ca_pcps_quicksync_acquisition_gsoc2014_test.cc * \brief This class implements an acquisition test for * GpsL1CaPcpsQuickSyncAcquisition class based on some input parameters. * \author Damian Miralles Sanchez, 2014. dmiralles2009(at)gmail.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include #include #include "gnss_block_factory.h" #include "gnss_block_interface.h" #include "in_memory_configuration.h" #include "gnss_sdr_valve.h" #include "gnss_synchro.h" #include "signal_generator.h" #include "signal_generator_c.h" #include "gps_l1_ca_pcps_quicksync_acquisition.h" DEFINE_double(value_threshold, 1, "Value of the threshold for the acquisition"); DEFINE_int32(value_CN0_dB_0, 44, "Value for the CN0_dB_0 in channel 0"); using google::LogMessage; // ######## GNURADIO BLOCK MESSAGE RECEVER ######### class GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test_msg_rx; typedef boost::shared_ptr GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test_msg_rx_sptr; GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test_msg_rx_sptr GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test_msg_rx_make(concurrent_queue& queue); class GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test_msg_rx : public gr::block { private: friend GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test_msg_rx_sptr GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test_msg_rx_make(concurrent_queue& queue); void msg_handler_events(pmt::pmt_t msg); GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test_msg_rx(concurrent_queue& queue); concurrent_queue& channel_internal_queue; public: int rx_message; ~GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test_msg_rx(); //!< Default destructor }; GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test_msg_rx_sptr GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test_msg_rx_make(concurrent_queue& queue) { return GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test_msg_rx_sptr(new GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test_msg_rx(queue)); } void GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test_msg_rx::msg_handler_events(pmt::pmt_t msg) { try { long int message = pmt::to_long(msg); rx_message = message; channel_internal_queue.push(rx_message); } catch(boost::bad_any_cast& e) { LOG(WARNING) << "msg_handler_telemetry Bad any cast!"; rx_message = 0; } } GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test_msg_rx::GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test_msg_rx(concurrent_queue& queue) : gr::block("GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test_msg_rx", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)), channel_internal_queue(queue) { this->message_port_register_in(pmt::mp("events")); this->set_msg_handler(pmt::mp("events"), boost::bind(&GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test_msg_rx::msg_handler_events, this, _1)); rx_message = 0; } GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test_msg_rx::~GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test_msg_rx() {} // ########################################################### class GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test: public ::testing::Test { protected: GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test() { factory = std::make_shared(); item_size = sizeof(gr_complex); stop = false; message = 0; gnss_synchro = Gnss_Synchro(); } ~GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test() {} void init(); void config_1(); void config_2(); void config_3(); void start_queue(); void wait_message(); void process_message(); void stop_queue(); concurrent_queue channel_internal_queue; gr::msg_queue::sptr queue; gr::top_block_sptr top_block; std::shared_ptr factory; std::shared_ptr acquisition; std::shared_ptr config; Gnss_Synchro gnss_synchro; size_t item_size; bool stop; int message; boost::thread ch_thread; unsigned int integration_time_ms = 0; unsigned int fs_in = 0; unsigned int folding_factor = 0; double expected_delay_chips = 0.0; double expected_doppler_hz = 0.0; float max_doppler_error_hz = 0.0; float max_delay_error_chips = 0.0; unsigned int num_of_realizations = 0; unsigned int realization_counter = 0; unsigned int detection_counter = 0; unsigned int correct_estimation_counter = 0; unsigned int acquired_samples = 0; unsigned int mean_acq_time_us = 0; double mse_doppler = 0.0; double mse_delay = 0.0; double Pd = 0.0; double Pfa_p = 0.0; double Pfa_a = 0.0; double Pmd = 0.0; std::ofstream pdpfafile; unsigned int miss_detection_counter = 0; bool dump_test_results = false; }; void GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test::init() { message = 0; realization_counter = 0; detection_counter = 0; correct_estimation_counter = 0; acquired_samples = 0; mse_doppler = 0; mse_delay = 0; mean_acq_time_us = 0; Pd = 0; Pfa_p = 0; Pfa_a = 0; miss_detection_counter = 0; Pmd = 0; } void GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test::config_1() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'G'; std::string signal = "1C"; signal.copy(gnss_synchro.Signal,2,0); integration_time_ms = 4; fs_in = 8e6; expected_delay_chips = 600; expected_doppler_hz = 750; max_doppler_error_hz = 2/(3*integration_time_ms*1e-3); max_delay_error_chips = 0.50; num_of_realizations = 1; config = std::make_shared(); config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.num_satellites", "1"); config->set_property("SignalSource.repeat", "true"); config->set_property("SignalSource.system_0", "G"); config->set_property("SignalSource.PRN_0", "10"); config->set_property("SignalSource.CN0_dB_0", "44"); config->set_property("SignalSource.doppler_Hz_0", std::to_string(expected_doppler_hz)); config->set_property("SignalSource.delay_chips_0", std::to_string(expected_delay_chips)); config->set_property("SignalSource.noise_flag", "false"); config->set_property("SignalSource.data_flag", "false"); config->set_property("SignalSource.BW_BB", "0.97"); config->set_property("InputFilter.implementation", "Fir_Filter"); config->set_property("InputFilter.input_item_type", "gr_complex"); config->set_property("InputFilter.output_item_type", "gr_complex"); config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", "11"); config->set_property("InputFilter.number_of_bands", "2"); config->set_property("InputFilter.band1_begin", "0.0"); config->set_property("InputFilter.band1_end", "0.97"); config->set_property("InputFilter.band2_begin", "0.98"); config->set_property("InputFilter.band2_end", "1.0"); config->set_property("InputFilter.ampl1_begin", "1.0"); config->set_property("InputFilter.ampl1_end", "1.0"); config->set_property("InputFilter.ampl2_begin", "0.0"); config->set_property("InputFilter.ampl2_end", "0.0"); config->set_property("InputFilter.band1_error", "1.0"); config->set_property("InputFilter.band2_error", "1.0"); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", "16"); config->set_property("Acquisition.item_type", "gr_complex"); config->set_property("Acquisition.if", "0"); config->set_property("Acquisition.coherent_integration_time_ms", std::to_string(integration_time_ms)); config->set_property("Acquisition.max_dwells", "1"); config->set_property("Acquisition.implementation", "GPS_L1_CA_PCPS_QuickSync_Acquisition"); config->set_property("Acquisition.threshold", "250"); config->set_property("Acquisition.doppler_max", "10000"); config->set_property("Acquisition.doppler_step", "250"); config->set_property("Acquisition.bit_transition_flag", "false"); config->set_property("Acquisition.dump", "false"); } void GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test::config_2() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'G'; std::string signal = "1C"; signal.copy(gnss_synchro.Signal,2,0); integration_time_ms = 4; fs_in = 8e6; expected_delay_chips = 600; expected_doppler_hz = 750; max_doppler_error_hz = 2/(3*integration_time_ms*1e-3); max_delay_error_chips = 0.50; /*Unset this flag to eliminates data logging for the Validation of results probabilities test*/ dump_test_results = false; num_of_realizations = 100; config = std::make_shared(); config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.num_satellites", "4"); config->set_property("SignalSource.system_0", "G"); config->set_property("SignalSource.PRN_0", "10"); config->set_property("SignalSource.CN0_dB_0", std::to_string(FLAGS_value_CN0_dB_0)); config->set_property("SignalSource.doppler_Hz_0", std::to_string(expected_doppler_hz)); config->set_property("SignalSource.delay_chips_0", std::to_string(expected_delay_chips)); config->set_property("SignalSource.system_1", "G"); config->set_property("SignalSource.PRN_1", "15"); config->set_property("SignalSource.CN0_dB_1", "44"); config->set_property("SignalSource.doppler_Hz_1", "1000"); config->set_property("SignalSource.delay_chips_1", "100"); config->set_property("SignalSource.system_2", "G"); config->set_property("SignalSource.PRN_2", "21"); config->set_property("SignalSource.CN0_dB_2", "44"); config->set_property("SignalSource.doppler_Hz_2", "2000"); config->set_property("SignalSource.delay_chips_2", "200"); config->set_property("SignalSource.system_3", "G"); config->set_property("SignalSource.PRN_3", "22"); config->set_property("SignalSource.CN0_dB_3", "44"); config->set_property("SignalSource.doppler_Hz_3", "3000"); config->set_property("SignalSource.delay_chips_3", "300"); config->set_property("SignalSource.noise_flag", "false"); config->set_property("SignalSource.data_flag", "false"); config->set_property("SignalSource.BW_BB", "0.97"); config->set_property("InputFilter.implementation", "Fir_Filter"); config->set_property("InputFilter.input_item_type", "gr_complex"); config->set_property("InputFilter.output_item_type", "gr_complex"); config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", "11"); config->set_property("InputFilter.number_of_bands", "2"); config->set_property("InputFilter.band1_begin", "0.0"); config->set_property("InputFilter.band1_end", "0.97"); config->set_property("InputFilter.band2_begin", "0.98"); config->set_property("InputFilter.band2_end", "1.0"); config->set_property("InputFilter.ampl1_begin", "1.0"); config->set_property("InputFilter.ampl1_end", "1.0"); config->set_property("InputFilter.ampl2_begin", "0.0"); config->set_property("InputFilter.ampl2_end", "0.0"); config->set_property("InputFilter.band1_error", "1.0"); config->set_property("InputFilter.band2_error", "1.0"); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", "16"); config->set_property("Acquisition.item_type", "gr_complex"); config->set_property("Acquisition.if", "0"); config->set_property("Acquisition.coherent_integration_time_ms", std::to_string(integration_time_ms)); config->set_property("Acquisition.max_dwells", "1"); config->set_property("Acquisition.implementation", "GPS_L1_CA_PCPS_QuickSync_Acquisition"); config->set_property("Acquisition.threshold", std::to_string(FLAGS_value_threshold)); config->set_property("Acquisition.doppler_max", "10000"); config->set_property("Acquisition.doppler_step", "100"); config->set_property("Acquisition.bit_transition_flag", "false"); config->set_property("Acquisition.dump", "false"); } void GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test::config_3() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'G'; std::string signal = "1C"; signal.copy(gnss_synchro.Signal,2,0); integration_time_ms = 4; fs_in = 4e6; expected_delay_chips = 600; expected_doppler_hz = 750; max_doppler_error_hz = 2/(3*integration_time_ms*1e-3); max_delay_error_chips = 0.50; /*Unset this flag to eliminates data logging for the Validation of results probabilities test*/ dump_test_results = true; num_of_realizations = 1; config = std::make_shared(); config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.num_satellites", "4"); config->set_property("SignalSource.system_0", "G"); config->set_property("SignalSource.PRN_0", "10"); config->set_property("SignalSource.CN0_dB_0", std::to_string(FLAGS_value_CN0_dB_0)); config->set_property("SignalSource.doppler_Hz_0", std::to_string(expected_doppler_hz)); config->set_property("SignalSource.delay_chips_0", std::to_string(expected_delay_chips)); config->set_property("SignalSource.system_1", "G"); config->set_property("SignalSource.PRN_1", "15"); config->set_property("SignalSource.CN0_dB_1", "44"); config->set_property("SignalSource.doppler_Hz_1", "1000"); config->set_property("SignalSource.delay_chips_1", "100"); config->set_property("SignalSource.system_2", "G"); config->set_property("SignalSource.PRN_2", "21"); config->set_property("SignalSource.CN0_dB_2", "44"); config->set_property("SignalSource.doppler_Hz_2", "2000"); config->set_property("SignalSource.delay_chips_2", "200"); config->set_property("SignalSource.system_3", "G"); config->set_property("SignalSource.PRN_3", "22"); config->set_property("SignalSource.CN0_dB_3", "44"); config->set_property("SignalSource.doppler_Hz_3", "3000"); config->set_property("SignalSource.delay_chips_3", "300"); config->set_property("SignalSource.noise_flag", "false"); config->set_property("SignalSource.data_flag", "false"); config->set_property("SignalSource.BW_BB", "0.97"); config->set_property("InputFilter.implementation", "Fir_Filter"); config->set_property("InputFilter.input_item_type", "gr_complex"); config->set_property("InputFilter.output_item_type", "gr_complex"); config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", "11"); config->set_property("InputFilter.number_of_bands", "2"); config->set_property("InputFilter.band1_begin", "0.0"); config->set_property("InputFilter.band1_end", "0.97"); config->set_property("InputFilter.band2_begin", "0.98"); config->set_property("InputFilter.band2_end", "1.0"); config->set_property("InputFilter.ampl1_begin", "1.0"); config->set_property("InputFilter.ampl1_end", "1.0"); config->set_property("InputFilter.ampl2_begin", "0.0"); config->set_property("InputFilter.ampl2_end", "0.0"); config->set_property("InputFilter.band1_error", "1.0"); config->set_property("InputFilter.band2_error", "1.0"); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", "16"); config->set_property("Acquisition.item_type", "gr_complex"); config->set_property("Acquisition.if", "0"); config->set_property("Acquisition.coherent_integration_time_ms", std::to_string(integration_time_ms)); config->set_property("Acquisition.max_dwells", "2"); config->set_property("Acquisition.implementation", "GPS_L1_CA_PCPS_QuickSync_Acquisition"); config->set_property("Acquisition.threshold", "0.01"); config->set_property("Acquisition.doppler_max", "10000"); config->set_property("Acquisition.doppler_step", "250"); config->set_property("Acquisition.bit_transition_flag", "false"); config->set_property("Acquisition.dump", "false"); } void GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test::start_queue() { stop = false; ch_thread = boost::thread(&GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test::wait_message, this); } void GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test::wait_message() { struct timeval tv; long long int begin = 0; long long int end = 0; while (!stop) { acquisition->reset(); gettimeofday(&tv, NULL); begin = tv.tv_sec * 1e6 + tv.tv_usec; channel_internal_queue.wait_and_pop(message); gettimeofday(&tv, NULL); end = tv.tv_sec * 1e6 + tv.tv_usec; mean_acq_time_us += (end - begin); process_message(); } } void GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test::process_message() { if (message == 1) { detection_counter++; // The term -5 is here to correct the additional delay introduced by the FIR filter double delay_error_chips = std::abs((double)expected_delay_chips - (double)(gnss_synchro.Acq_delay_samples - 5) * 1023.0/ ((double)fs_in * 1e-3)); double doppler_error_hz = std::abs(expected_doppler_hz - gnss_synchro.Acq_doppler_hz); mse_delay += std::pow(delay_error_chips, 2); mse_doppler += std::pow(doppler_error_hz, 2); if ((delay_error_chips < max_delay_error_chips) && (doppler_error_hz < max_doppler_error_hz)) { correct_estimation_counter++; } } else if(message == 2 && gnss_synchro.PRN == 10) { miss_detection_counter++; } realization_counter++; std::cout << "Progress: " << round((float)realization_counter / num_of_realizations * 100) << "% \r" << std::flush; if (realization_counter == num_of_realizations) { mse_delay /= num_of_realizations; mse_doppler /= num_of_realizations; Pd = (double)correct_estimation_counter / (double)num_of_realizations; Pfa_a = (double)detection_counter / (double)num_of_realizations; Pfa_p = (double)(detection_counter-correct_estimation_counter) / (double)num_of_realizations; Pmd = (double)miss_detection_counter / (double)num_of_realizations; mean_acq_time_us /= num_of_realizations; stop_queue(); top_block->stop(); } } void GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test::stop_queue() { stop = true; } TEST_F(GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test, Instantiate) { config_1(); acquisition = std::make_shared(config.get(), "Acquisition", 1, 1); } TEST_F(GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test, ConnectAndRun) { int nsamples = floor(fs_in * integration_time_ms * 1e-3); struct timeval tv; long long int begin = 0; long long int end = 0; top_block = gr::make_top_block("Acquisition test"); queue = gr::msg_queue::make(0); boost::shared_ptr msg_rx = GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); config_1(); acquisition = std::make_shared(config.get(), "Acquisition", 1, 1); ASSERT_NO_THROW( { acquisition->connect(top_block); boost::shared_ptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000, 1, gr_complex(0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); top_block->connect(source, 0, valve, 0); top_block->connect(valve, 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test."<< std::endl; EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec * 1e6 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec * 1e6 + tv.tv_usec; }) << "Failure running the top_block."<< std::endl; std::cout << "Processed " << nsamples << " samples in " << (end-begin) << " microseconds" << std::endl; } TEST_F(GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test, ValidationOfResults) { config_1(); top_block = gr::make_top_block("Acquisition test"); queue = gr::msg_queue::make(0); acquisition = std::make_shared(config.get(), "Acquisition", 1, 1); boost::shared_ptr msg_rx = GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->set_channel(1); }) << "Failure setting channel."<< std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro."<< std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(10000); }) << "Failure setting doppler_max."<< std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(250); }) << "Failure setting doppler_step."<< std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(100); }) << "Failure setting threshold."<< std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); }) << "Failure connecting acquisition to the top_block."<< std::endl; acquisition->init(); acquisition->reset(); ASSERT_NO_THROW( { boost::shared_ptr signal_source; SignalGenerator* signal_generator = new SignalGenerator(config.get(), "SignalSource", 0, 1, queue); FirFilter* filter = new FirFilter(config.get(), "InputFilter", 1, 1); signal_source.reset(new GenSignalSource(signal_generator, filter, "SignalSource", queue)); signal_source->connect(top_block); top_block->connect(signal_source->get_right_block(), 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; // i = 0 --> satellite in acquisition is visible // i = 1 --> satellite in acquisition is not visible for (unsigned int i = 0; i < 2; i++) { init(); if (i == 0) { gnss_synchro.PRN = 10; // This satellite is visible } else if (i == 1) { gnss_synchro.PRN = 20; // This satellite is not visible } acquisition->reset(); acquisition->set_gnss_synchro(&gnss_synchro); acquisition->set_local_code(); acquisition->set_state(1); start_queue(); EXPECT_NO_THROW( { top_block->run(); // Start threads and wait }) << "Failure running the top_block." << std::endl; stop_queue(); if (i == 0) { EXPECT_EQ(1, message) << "Acquisition failure. Expected message: 1=ACQ SUCCESS."; if (message == 1) { EXPECT_EQ((unsigned int)1, correct_estimation_counter) << "Acquisition failure. Incorrect parameters estimation."; } } else if (i == 1) { EXPECT_EQ(2, message) << "Acquisition failure. Expected message: 2=ACQ FAIL."; } ch_thread.join(); } } TEST_F(GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test, ValidationOfResultsWithNoise) { //config_3(); config_1(); top_block = gr::make_top_block("Acquisition test"); queue = gr::msg_queue::make(0); acquisition = std::make_shared(config.get(), "Acquisition", 1, 1); boost::shared_ptr msg_rx = GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->set_channel(1); }) << "Failure setting channel."<< std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(10000); }) << "Failure setting doppler_max."<< std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(250); }) << "Failure setting doppler_step."<< std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(100); }) << "Failure setting threshold." << std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); }) << "Failure connecting acquisition to the top_block." << std::endl; acquisition->init(); acquisition->reset(); ASSERT_NO_THROW( { boost::shared_ptr signal_source; SignalGenerator* signal_generator = new SignalGenerator(config.get(), "SignalSource", 0, 1, queue); FirFilter* filter = new FirFilter(config.get(), "InputFilter", 1, 1); signal_source.reset(new GenSignalSource(signal_generator, filter, "SignalSource", queue)); signal_source->connect(top_block); top_block->connect(signal_source->get_right_block(), 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; // i = 0 --> satellite in acquisition is visible // i = 1 --> satellite in acquisition is not visible for (unsigned int i = 0; i < 2; i++) { init(); if (i == 0) { gnss_synchro.PRN = 10; // This satellite is visible } else if (i == 1) { gnss_synchro.PRN = 20; // This satellite is not visible } //acquisition->set_local_code(); acquisition->reset(); acquisition->set_gnss_synchro(&gnss_synchro); acquisition->set_local_code(); acquisition->set_state(1); start_queue(); EXPECT_NO_THROW( { top_block->run(); // Start threads and wait }) << "Failure running the top_block." << std::endl; stop_queue(); if (i == 0) { EXPECT_EQ(1, message) << "Acquisition failure. Expected message: 1=ACQ SUCCESS."; if (message == 1) { EXPECT_EQ((unsigned int)1, correct_estimation_counter) << "Acquisition failure. Incorrect parameters estimation."; } } else if (i == 1) { EXPECT_EQ(2, message) << "Acquisition failure. Expected message: 2=ACQ FAIL."; } ch_thread.join(); } } TEST_F(GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test, ValidationOfResultsProbabilities) { config_2(); top_block = gr::make_top_block("Acquisition test"); queue = gr::msg_queue::make(0); acquisition = std::make_shared(config.get(), "Acquisition", 1, 1); boost::shared_ptr msg_rx = GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->set_channel(1); }) << "Failure setting channel."<< std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro."<< std::endl; /* ASSERT_NO_THROW( { acquisition->set_doppler_max(config->property("Acquisition.doppler_max", 10000)); }) << "Failure setting doppler_max."<< std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(config->property("Acquisition.doppler_step", 500)); }) << "Failure setting doppler_step."<< std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(config->property("Acquisition.threshold", 0.0)); }) << "Failure setting threshold."<< std::endl; */ ASSERT_NO_THROW( { acquisition->connect(top_block); }) << "Failure connecting acquisition to the top_block."<< std::endl; acquisition->init(); acquisition->reset(); ASSERT_NO_THROW( { boost::shared_ptr signal_source; SignalGenerator* signal_generator = new SignalGenerator(config.get(), "SignalSource", 0, 1, queue); FirFilter* filter = new FirFilter(config.get(), "InputFilter", 1, 1); signal_source.reset(new GenSignalSource(signal_generator, filter, "SignalSource", queue)); signal_source->connect(top_block); top_block->connect(signal_source->get_right_block(), 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; std::cout << "Probability of false alarm (target) = " << 0.1 << std::endl; // i = 0 --> satellite in acquisition is visible (prob of detection and prob of detection with wrong estimation) // i = 1 --> satellite in acquisition is not visible (prob of false detection) for (unsigned int i = 0; i < 2; i++) { init(); if (i == 0) { gnss_synchro.PRN = 10; // This satellite is visible } else if (i == 1) { gnss_synchro.PRN = 20; // This satellite is not visible } acquisition->reset(); acquisition->set_gnss_synchro(&gnss_synchro); acquisition->set_local_code(); acquisition->set_state(1); start_queue(); EXPECT_NO_THROW( { top_block->run(); // Start threads and wait }) << "Failure running the top_block." << std::endl; stop_queue(); if (i == 0) { std::cout << "Estimated probability of detection = " << Pd << std::endl; std::cout << "Estimated probability of false alarm (satellite present) = " << Pfa_p << std::endl; std::cout << "Estimated probability of miss detection (satellite present) = " << Pmd << std::endl; std::cout << "Mean acq time = " << mean_acq_time_us << " microseconds." << std::endl; if(dump_test_results) { std::stringstream filenamepd; filenamepd.str(""); filenamepd << "../data/test_statistics_" << gnss_synchro.System << "_" << gnss_synchro.Signal << "_sat_" << gnss_synchro.PRN << "CN0_dB_0_" << FLAGS_value_CN0_dB_0 << "_dBHz.csv"; pdpfafile.open(filenamepd.str().c_str(), std::ios::app | std::ios::out); pdpfafile << FLAGS_value_threshold << "," << Pd << "," << Pfa_p << "," << Pmd << std::endl; pdpfafile.close(); } } else if (i == 1) { std::cout << "Estimated probability of false alarm (satellite absent) = " << Pfa_a << std::endl; std::cout << "Mean acq time = " << mean_acq_time_us << " microseconds." << std::endl; if(dump_test_results) { std::stringstream filenamepf; filenamepf.str(""); filenamepf << "../data/test_statistics_" << gnss_synchro.System << "_" << gnss_synchro.Signal << "_sat_" << gnss_synchro.PRN << "CN0_dB_0_" << FLAGS_value_CN0_dB_0 << "_dBHz.csv"; pdpfafile.open(filenamepf.str().c_str(), std::ios::app | std::ios::out); pdpfafile << FLAGS_value_threshold << "," << Pfa_a << std::endl; pdpfafile.close(); } } ch_thread.join(); } } gps_l1_ca_pcps_tong_acquisition_gsoc2013_test.cc000066400000000000000000000567361305042567700377400ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/acquisition/*! * \file gps_l1_ca_pcps_tong_acquisition_gsoc2013_test.cc * \brief This class implements an acquisition test for * GpsL1CaPcpsTongAcquisition class. * \author Marc Molina, 2013. marc.molina.pena(at)gmail.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include #include "gnss_block_interface.h" #include "in_memory_configuration.h" #include "configuration_interface.h" #include "gnss_synchro.h" #include "gps_l1_ca_pcps_tong_acquisition.h" #include "signal_generator.h" #include "signal_generator_c.h" #include "fir_filter.h" #include "gen_signal_source.h" #include "gnss_sdr_valve.h" // ######## GNURADIO BLOCK MESSAGE RECEVER ######### class GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx; typedef boost::shared_ptr GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx_sptr; GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx_sptr GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx_make(concurrent_queue& queue); class GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx : public gr::block { private: friend GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx_sptr GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx_make(concurrent_queue& queue); void msg_handler_events(pmt::pmt_t msg); GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx(concurrent_queue& queue); concurrent_queue& channel_internal_queue; public: int rx_message; ~GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx(); //!< Default destructor }; GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx_sptr GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx_make(concurrent_queue& queue) { return GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx_sptr(new GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx(queue)); } void GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx::msg_handler_events(pmt::pmt_t msg) { try { long int message = pmt::to_long(msg); rx_message = message; channel_internal_queue.push(rx_message); } catch(boost::bad_any_cast& e) { LOG(WARNING) << "msg_handler_telemetry Bad any cast!"; rx_message = 0; } } GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx::GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx(concurrent_queue& queue) : gr::block("GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)), channel_internal_queue(queue) { this->message_port_register_in(pmt::mp("events")); this->set_msg_handler(pmt::mp("events"), boost::bind(&GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx::msg_handler_events, this, _1)); rx_message = 0; } GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx::~GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx() {} // ########################################################### class GpsL1CaPcpsTongAcquisitionGSoC2013Test: public ::testing::Test { protected: GpsL1CaPcpsTongAcquisitionGSoC2013Test() { item_size = sizeof(gr_complex); stop = false; message = 0; gnss_synchro = Gnss_Synchro(); } ~GpsL1CaPcpsTongAcquisitionGSoC2013Test() { } void init(); void config_1(); void config_2(); void start_queue(); void wait_message(); void process_message(); void stop_queue(); concurrent_queue channel_internal_queue; gr::msg_queue::sptr queue; gr::top_block_sptr top_block; std::shared_ptr acquisition; std::shared_ptr config; Gnss_Synchro gnss_synchro; size_t item_size; bool stop; int message; boost::thread ch_thread; unsigned int integration_time_ms = 0; unsigned int fs_in = 0; double expected_delay_chips = 0.0; double expected_doppler_hz = 0.0; float max_doppler_error_hz = 0.0; float max_delay_error_chips = 0.0; unsigned int num_of_realizations = 0; unsigned int realization_counter = 0; unsigned int detection_counter = 0; unsigned int correct_estimation_counter = 0; unsigned int acquired_samples = 0; unsigned int mean_acq_time_us = 0; double mse_doppler = 0.0; double mse_delay = 0.0; double Pd = 0.0; double Pfa_p = 0.0; double Pfa_a = 0.0; }; void GpsL1CaPcpsTongAcquisitionGSoC2013Test::init() { message = 0; realization_counter = 0; detection_counter = 0; correct_estimation_counter = 0; acquired_samples = 0; mse_doppler = 0; mse_delay = 0; mean_acq_time_us = 0; Pd = 0; Pfa_p = 0; Pfa_a = 0; } void GpsL1CaPcpsTongAcquisitionGSoC2013Test::config_1() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'G'; std::string signal = "1C"; signal.copy(gnss_synchro.Signal,2,0); integration_time_ms = 1; fs_in = 4e6; expected_delay_chips = 600; expected_doppler_hz = 750; max_doppler_error_hz = 2/(3*integration_time_ms*1e-3); max_delay_error_chips = 0.50; num_of_realizations = 1; config = std::make_shared(); config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.num_satellites", "1"); config->set_property("SignalSource.system_0", "G"); config->set_property("SignalSource.PRN_0", "10"); config->set_property("SignalSource.CN0_dB_0", "44"); config->set_property("SignalSource.doppler_Hz_0", std::to_string(expected_doppler_hz)); config->set_property("SignalSource.delay_chips_0", std::to_string(expected_delay_chips)); config->set_property("SignalSource.noise_flag", "false"); config->set_property("SignalSource.data_flag", "false"); config->set_property("SignalSource.BW_BB", "0.97"); config->set_property("InputFilter.implementation", "Fir_Filter"); config->set_property("InputFilter.input_item_type", "gr_complex"); config->set_property("InputFilter.output_item_type", "gr_complex"); config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", "11"); config->set_property("InputFilter.number_of_bands", "2"); config->set_property("InputFilter.band1_begin", "0.0"); config->set_property("InputFilter.band1_end", "0.97"); config->set_property("InputFilter.band2_begin", "0.98"); config->set_property("InputFilter.band2_end", "1.0"); config->set_property("InputFilter.ampl1_begin", "1.0"); config->set_property("InputFilter.ampl1_end", "1.0"); config->set_property("InputFilter.ampl2_begin", "0.0"); config->set_property("InputFilter.ampl2_end", "0.0"); config->set_property("InputFilter.band1_error", "1.0"); config->set_property("InputFilter.band2_error", "1.0"); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", "16"); config->set_property("Acquisition.item_type", "gr_complex"); config->set_property("Acquisition.if", "0"); config->set_property("Acquisition.coherent_integration_time_ms", std::to_string(integration_time_ms)); config->set_property("Acquisition.implementation", "GPS_L1_CA_PCPS_Tong_Acquisition"); config->set_property("Acquisition.threshold", "0.8"); config->set_property("Acquisition.tong_init_val", "1"); config->set_property("Acquisition.tong_max_val", "8"); config->set_property("Acquisition.doppler_max", "10000"); config->set_property("Acquisition.doppler_step", "250"); config->set_property("Acquisition.dump", "false"); } void GpsL1CaPcpsTongAcquisitionGSoC2013Test::config_2() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'G'; std::string signal = "1C"; signal.copy(gnss_synchro.Signal,2,0); integration_time_ms = 1; fs_in = 4e6; expected_delay_chips = 600; expected_doppler_hz = 750; max_doppler_error_hz = 2/(3*integration_time_ms*1e-3); max_delay_error_chips = 0.50; num_of_realizations = 100; config = std::make_shared(); config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.fs_hz", std::to_string(fs_in)); config->set_property("SignalSource.item_type", "gr_complex"); config->set_property("SignalSource.num_satellites", "4"); config->set_property("SignalSource.system_0", "G"); config->set_property("SignalSource.PRN_0", "10"); config->set_property("SignalSource.CN0_dB_0", "44"); config->set_property("SignalSource.doppler_Hz_0", std::to_string(expected_doppler_hz)); config->set_property("SignalSource.delay_chips_0", std::to_string(expected_delay_chips)); config->set_property("SignalSource.system_1", "G"); config->set_property("SignalSource.PRN_1", "15"); config->set_property("SignalSource.CN0_dB_1", "44"); config->set_property("SignalSource.doppler_Hz_1", "1000"); config->set_property("SignalSource.delay_chips_1", "100"); config->set_property("SignalSource.system_2", "G"); config->set_property("SignalSource.PRN_2", "21"); config->set_property("SignalSource.CN0_dB_2", "44"); config->set_property("SignalSource.doppler_Hz_2", "2000"); config->set_property("SignalSource.delay_chips_2", "200"); config->set_property("SignalSource.system_3", "G"); config->set_property("SignalSource.PRN_3", "22"); config->set_property("SignalSource.CN0_dB_3", "44"); config->set_property("SignalSource.doppler_Hz_3", "3000"); config->set_property("SignalSource.delay_chips_3", "300"); config->set_property("SignalSource.noise_flag", "true"); config->set_property("SignalSource.data_flag", "true"); config->set_property("SignalSource.BW_BB", "0.97"); config->set_property("InputFilter.implementation", "Fir_Filter"); config->set_property("InputFilter.input_item_type", "gr_complex"); config->set_property("InputFilter.output_item_type", "gr_complex"); config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", "11"); config->set_property("InputFilter.number_of_bands", "2"); config->set_property("InputFilter.band1_begin", "0.0"); config->set_property("InputFilter.band1_end", "0.97"); config->set_property("InputFilter.band2_begin", "0.98"); config->set_property("InputFilter.band2_end", "1.0"); config->set_property("InputFilter.ampl1_begin", "1.0"); config->set_property("InputFilter.ampl1_end", "1.0"); config->set_property("InputFilter.ampl2_begin", "0.0"); config->set_property("InputFilter.ampl2_end", "0.0"); config->set_property("InputFilter.band1_error", "1.0"); config->set_property("InputFilter.band2_error", "1.0"); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", "16"); config->set_property("Acquisition.item_type", "gr_complex"); config->set_property("Acquisition.if", "0"); config->set_property("Acquisition.coherent_integration_time_ms", std::to_string(integration_time_ms)); config->set_property("Acquisition.implementation", "GPS_L1_CA_PCPS_Tong_Acquisition"); config->set_property("Acquisition.threshold", "0.00108"); // Pfa,a = 0.1 config->set_property("Acquisition.tong_init_val", "1"); config->set_property("Acquisition.tong_max_val", "8"); config->set_property("Acquisition.doppler_max", "10000"); config->set_property("Acquisition.doppler_step", "250"); config->set_property("Acquisition.dump", "false"); } void GpsL1CaPcpsTongAcquisitionGSoC2013Test::start_queue() { stop = false; ch_thread = boost::thread(&GpsL1CaPcpsTongAcquisitionGSoC2013Test::wait_message, this); } void GpsL1CaPcpsTongAcquisitionGSoC2013Test::wait_message() { struct timeval tv; long long int begin = 0; long long int end = 0; while (!stop) { acquisition->reset(); gettimeofday(&tv, NULL); begin = tv.tv_sec *1e6 + tv.tv_usec; channel_internal_queue.wait_and_pop(message); gettimeofday(&tv, NULL); end = tv.tv_sec*1e6 + tv.tv_usec; mean_acq_time_us += (end - begin); process_message(); } } void GpsL1CaPcpsTongAcquisitionGSoC2013Test::process_message() { if (message == 1) { detection_counter++; // The term -5 is here to correct the additional delay introduced by the FIR filter double delay_error_chips = std::abs((double)expected_delay_chips - (double)(gnss_synchro.Acq_delay_samples-5)*1023.0/((double)fs_in*1e-3)); double doppler_error_hz = std::abs(expected_doppler_hz - gnss_synchro.Acq_doppler_hz); mse_delay += std::pow(delay_error_chips, 2); mse_doppler += std::pow(doppler_error_hz, 2); if ((delay_error_chips < max_delay_error_chips) && (doppler_error_hz < max_doppler_error_hz)) { correct_estimation_counter++; } } realization_counter++; std::cout << "Progress: " << round((float)realization_counter/num_of_realizations*100) << "% \r" << std::flush; if (realization_counter == num_of_realizations) { mse_delay /= num_of_realizations; mse_doppler /= num_of_realizations; Pd = (double)correct_estimation_counter / (double)num_of_realizations; Pfa_a = (double)detection_counter / (double)num_of_realizations; Pfa_p = (double)(detection_counter-correct_estimation_counter) / (double)num_of_realizations; mean_acq_time_us /= num_of_realizations; stop_queue(); top_block->stop(); std::cout << std::endl; } } void GpsL1CaPcpsTongAcquisitionGSoC2013Test::stop_queue() { stop = true; } TEST_F(GpsL1CaPcpsTongAcquisitionGSoC2013Test, Instantiate) { config_1(); acquisition = std::make_shared(config.get(), "Acquisition", 1, 1); } TEST_F(GpsL1CaPcpsTongAcquisitionGSoC2013Test, ConnectAndRun) { int nsamples = floor(fs_in*integration_time_ms*1e-3); struct timeval tv; long long int begin = 0; long long int end = 0; top_block = gr::make_top_block("Acquisition test"); queue = gr::msg_queue::make(0); config_1(); acquisition = std::make_shared(config.get(), "Acquisition", 1, 1); boost::shared_ptr msg_rx = GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->connect(top_block); boost::shared_ptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000, 1, gr_complex(0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); top_block->connect(source, 0, valve, 0); top_block->connect(valve, 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec *1e6 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec *1e6 + tv.tv_usec; }) << "Failure running the top_block." << std::endl; std::cout << "Processed " << nsamples << " samples in " << (end - begin) << " microseconds" << std::endl; } TEST_F(GpsL1CaPcpsTongAcquisitionGSoC2013Test, ValidationOfResults) { config_1(); top_block = gr::make_top_block("Acquisition test"); queue = gr::msg_queue::make(0); acquisition = std::make_shared(config.get(), "Acquisition", 1, 1); boost::shared_ptr msg_rx = GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->set_channel(1); }) << "Failure setting channel." << std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(config->property("Acquisition.doppler_max", 10000)); }) << "Failure setting doppler_max." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(config->property("Acquisition.doppler_step", 500)); }) << "Failure setting doppler_step." << std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(config->property("Acquisition.threshold", 0.0)); }) << "Failure setting threshold." << std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); }) << "Failure connecting acquisition to the top_block." << std::endl; acquisition->init(); ASSERT_NO_THROW( { boost::shared_ptr signal_source; SignalGenerator* signal_generator = new SignalGenerator(config.get(), "SignalSource", 0, 1, queue); FirFilter* filter = new FirFilter(config.get(), "InputFilter", 1, 1); signal_source.reset(new GenSignalSource(signal_generator, filter, "SignalSource", queue)); signal_source->connect(top_block); top_block->connect(signal_source->get_right_block(), 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; // i = 0 --> satellite in acquisition is visible // i = 1 --> satellite in acquisition is not visible for (unsigned int i = 0; i < 2; i++) { init(); if (i == 0) { gnss_synchro.PRN = 10; // This satellite is visible } else if (i == 1) { gnss_synchro.PRN = 20; // This satellite is not visible } acquisition->set_local_code(); acquisition->set_state(1); start_queue(); EXPECT_NO_THROW( { top_block->run(); // Start threads and wait }) << "Failure running the top_block." << std::endl; stop_queue(); if (i == 0) { EXPECT_EQ(1, message) << "Acquisition failure. Expected message: 1=ACQ SUCCESS."; if (message == 1) { EXPECT_EQ((unsigned int)1, correct_estimation_counter) << "Acquisition failure. Incorrect parameters estimation."; } } else if (i == 1) { EXPECT_EQ(2, message) << "Acquisition failure. Expected message: 2=ACQ FAIL."; } ch_thread.join(); } } TEST_F(GpsL1CaPcpsTongAcquisitionGSoC2013Test, ValidationOfResultsProbabilities) { config_2(); top_block = gr::make_top_block("Acquisition test"); queue = gr::msg_queue::make(0); acquisition = std::make_shared(config.get(), "Acquisition", 1, 1); boost::shared_ptr msg_rx = GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); ASSERT_NO_THROW( { acquisition->set_channel(1); }) << "Failure setting channel." << std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(config->property("Acquisition.doppler_max", 10000)); }) << "Failure setting doppler_max." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(config->property("Acquisition.doppler_step", 500)); }) << "Failure setting doppler_step." << std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(config->property("Acquisition.threshold", 0.0)); }) << "Failure setting threshold." << std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); }) << "Failure connecting acquisition to the top_block." << std::endl; acquisition->init(); ASSERT_NO_THROW( { boost::shared_ptr signal_source; SignalGenerator* signal_generator = new SignalGenerator(config.get(), "SignalSource", 0, 1, queue); FirFilter* filter = new FirFilter(config.get(), "InputFilter", 1, 1); signal_source.reset(new GenSignalSource(signal_generator, filter, "SignalSource", queue)); signal_source->connect(top_block); top_block->connect(signal_source->get_right_block(), 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; std::cout << "Probability of false alarm (target) = " << 0.1 << std::endl; // i = 0 --> satellite in acquisition is visible (prob of detection and prob of detection with wrong estimation) // i = 1 --> satellite in acquisition is not visible (prob of false detection) for (unsigned int i = 0; i < 2; i++) { init(); if (i == 0) { gnss_synchro.PRN = 10; // This satellite is visible } else if (i == 1) { gnss_synchro.PRN = 20; // This satellite is not visible } acquisition->set_local_code(); acquisition->set_state(1); start_queue(); EXPECT_NO_THROW( { top_block->run(); // Start threads and wait }) << "Failure running the top_block." << std::endl; stop_queue(); if (i == 0) { std::cout << "Estimated probability of detection = " << Pd << std::endl; std::cout << "Estimated probability of false alarm (satellite present) = " << Pfa_p << std::endl; std::cout << "Mean acq time = " << mean_acq_time_us << " microseconds." << std::endl; } else if (i == 1) { std::cout << "Estimated probability of false alarm (satellite absent) = " << Pfa_a << std::endl; std::cout << "Mean acq time = " << mean_acq_time_us << " microseconds." << std::endl; } ch_thread.join(); } } gps_l2_m_pcps_acquisition_test.cc000066400000000000000000000257531305042567700352350ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/acquisition/*! * \file gps_l2_m_pcps_acquisition_test.cc * \brief This class implements an acquisition test for * GpsL1CaPcpsAcquisition class based on some input parameters. * \author Javier Arribas, 2015 (jarribas@cttc.es) * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "gnss_block_factory.h" #include "gnss_block_interface.h" #include "in_memory_configuration.h" #include "gnss_sdr_valve.h" #include "gnss_synchro.h" #include "gps_l2_m_pcps_acquisition.h" #include "GPS_L2C.h" // ######## GNURADIO BLOCK MESSAGE RECEVER ######### class GpsL2MPcpsAcquisitionTest_msg_rx; typedef boost::shared_ptr GpsL2MPcpsAcquisitionTest_msg_rx_sptr; GpsL2MPcpsAcquisitionTest_msg_rx_sptr GpsL2MPcpsAcquisitionTest_msg_rx_make(); class GpsL2MPcpsAcquisitionTest_msg_rx : public gr::block { private: friend GpsL2MPcpsAcquisitionTest_msg_rx_sptr GpsL2MPcpsAcquisitionTest_msg_rx_make(); void msg_handler_events(pmt::pmt_t msg); GpsL2MPcpsAcquisitionTest_msg_rx(); public: int rx_message; ~GpsL2MPcpsAcquisitionTest_msg_rx(); //!< Default destructor }; GpsL2MPcpsAcquisitionTest_msg_rx_sptr GpsL2MPcpsAcquisitionTest_msg_rx_make() { return GpsL2MPcpsAcquisitionTest_msg_rx_sptr(new GpsL2MPcpsAcquisitionTest_msg_rx()); } void GpsL2MPcpsAcquisitionTest_msg_rx::msg_handler_events(pmt::pmt_t msg) { try { long int message = pmt::to_long(msg); rx_message = message; } catch(boost::bad_any_cast& e) { LOG(WARNING) << "msg_handler_telemetry Bad any cast!"; rx_message = 0; } } GpsL2MPcpsAcquisitionTest_msg_rx::GpsL2MPcpsAcquisitionTest_msg_rx() : gr::block("GpsL2MPcpsAcquisitionTest_msg_rx", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)) { this->message_port_register_in(pmt::mp("events")); this->set_msg_handler(pmt::mp("events"), boost::bind(&GpsL2MPcpsAcquisitionTest_msg_rx::msg_handler_events, this, _1)); rx_message = 0; } GpsL2MPcpsAcquisitionTest_msg_rx::~GpsL2MPcpsAcquisitionTest_msg_rx() {} // ########################################################### class GpsL2MPcpsAcquisitionTest: public ::testing::Test { protected: GpsL2MPcpsAcquisitionTest() { factory = std::make_shared(); config = std::make_shared(); item_size = sizeof(gr_complex); sampling_freqeuncy_hz = 0; nsamples = 0; gnss_synchro = Gnss_Synchro(); } ~GpsL2MPcpsAcquisitionTest() {} void init(); gr::msg_queue::sptr queue; gr::top_block_sptr top_block; std::shared_ptr factory; std::shared_ptr config; Gnss_Synchro gnss_synchro; size_t item_size; int sampling_freqeuncy_hz; int nsamples; }; void GpsL2MPcpsAcquisitionTest::init() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'G'; std::string signal = "2S"; //strncpy(gnss_synchro.Signal, signal.c_str(), 3); std::memcpy((void*)gnss_synchro.Signal, signal.c_str(), 3); // copy string into synchro char array: 2 char + null gnss_synchro.Signal[2] = 0; // make sure that string length is only two characters gnss_synchro.PRN = 7; sampling_freqeuncy_hz = 5000000; nsamples = round((double)sampling_freqeuncy_hz*GPS_L2_M_PERIOD)*2; config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(sampling_freqeuncy_hz)); config->set_property("Acquisition.item_type", "gr_complex"); config->set_property("Acquisition.if", "0"); config->set_property("Acquisition.dump", "false"); config->set_property("Acquisition.implementation", "GPS_L2_M_PCPS_Acquisition"); config->set_property("Acquisition.threshold", "0.001"); config->set_property("Acquisition.doppler_max", "5000"); config->set_property("Acquisition.doppler_step", "100"); config->set_property("Acquisition.repeat_satellite", "false"); } TEST_F(GpsL2MPcpsAcquisitionTest, Instantiate) { init(); queue = gr::msg_queue::make(0); std::shared_ptr acquisition = std::make_shared(config.get(), "Acquisition", 1, 1); } TEST_F(GpsL2MPcpsAcquisitionTest, ConnectAndRun) { struct timeval tv; long long int begin = 0; long long int end = 0; top_block = gr::make_top_block("Acquisition test"); queue = gr::msg_queue::make(0); init(); std::shared_ptr acquisition = std::make_shared(config.get(), "Acquisition", 1, 1); ASSERT_NO_THROW( { acquisition->connect(top_block); boost::shared_ptr source = gr::analog::sig_source_c::make(sampling_freqeuncy_hz, gr::analog::GR_SIN_WAVE, 1000, 1, gr_complex(0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); top_block->connect(source, 0, valve, 0); top_block->connect(valve, 0, acquisition->get_left_block(), 0); boost::shared_ptr msg_rx = GpsL2MPcpsAcquisitionTest_msg_rx_make(); }) << "Failure connecting the blocks of acquisition test." << std::endl; EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec * 1000000 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec * 1000000 + tv.tv_usec; }) << "Failure running the top_block." << std::endl; std::cout << "Processed " << nsamples << " samples in " << (end - begin) << " microseconds" << std::endl; } TEST_F(GpsL2MPcpsAcquisitionTest, ValidationOfResults) { struct timeval tv; long long int begin = 0; long long int end = 0; top_block = gr::make_top_block("Acquisition test"); queue = gr::msg_queue::make(0); double expected_delay_samples = 1;//2004; double expected_doppler_hz = 1200;//3000; init(); std::shared_ptr acquisition = std::make_shared(config.get(), "Acquisition", 1, 1); boost::shared_ptr msg_rx = GpsL2MPcpsAcquisitionTest_msg_rx_make(); ASSERT_NO_THROW( { acquisition->set_channel(1); }) << "Failure setting channel." << std::endl; ASSERT_NO_THROW( { acquisition->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro." << std::endl; ASSERT_NO_THROW( { acquisition->set_threshold(0.001); }) << "Failure setting threshold." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_max(5000); }) << "Failure setting doppler_max." << std::endl; ASSERT_NO_THROW( { acquisition->set_doppler_step(10); }) << "Failure setting doppler_step." << std::endl; ASSERT_NO_THROW( { acquisition->connect(top_block); }) << "Failure connecting acquisition to the top_block." << std::endl; ASSERT_NO_THROW( { std::string path = std::string(TEST_PATH); //std::string file = path + "signal_samples/GSoC_CTTC_capture_2012_07_26_4Msps_4ms.dat"; std::string file = path + "signal_samples/gps_l2c_m_prn7_5msps.dat"; //std::string file = "/datalogger/signals/Fraunhofer/L125_III1b_210s_L2_resampled.bin"; const char * file_name = file.c_str(); gr::blocks::file_source::sptr file_source = gr::blocks::file_source::make(sizeof(gr_complex), file_name, false); //gr::blocks::interleaved_short_to_complex::sptr gr_interleaved_short_to_complex_ = gr::blocks::interleaved_short_to_complex::make(); //gr::blocks::char_to_short::sptr gr_char_to_short_ = gr::blocks::char_to_short::make(); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); //top_block->connect(file_source, 0, gr_char_to_short_, 0); //top_block->connect(gr_char_to_short_, 0, gr_interleaved_short_to_complex_ , 0); top_block->connect(file_source, 0, valve , 0); top_block->connect(valve, 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of acquisition test." << std::endl; ASSERT_NO_THROW( { acquisition->set_state(1); // Ensure that acquisition starts at the first sample acquisition->init(); }) << "Failure set_state and init acquisition test" << std::endl; EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec * 1000000 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec * 1000000 + tv.tv_usec; }) << "Failure running the top_block." << std::endl; //unsigned long int Acq_samplestamp_samples = gnss_synchro.Acq_samplestamp_samples; std::cout << "Acquisition process runtime duration: " << (end - begin) << " microseconds" << std::endl; std::cout << "gnss_synchro.Acq_doppler_hz = " << gnss_synchro.Acq_doppler_hz << " Hz" << std::endl; std::cout << "gnss_synchro.Acq_delay_samples = " << gnss_synchro.Acq_delay_samples << " Samples" << std::endl; ASSERT_EQ(1, msg_rx->rx_message) << "Acquisition failure. Expected message: 1=ACQ SUCCESS."; double delay_error_samples = std::abs(expected_delay_samples - gnss_synchro.Acq_delay_samples); float delay_error_chips = (float)(delay_error_samples * 1023 / 4000); double doppler_error_hz = std::abs(expected_doppler_hz - gnss_synchro.Acq_doppler_hz); EXPECT_LE(doppler_error_hz, 200) << "Doppler error exceeds the expected value: 666 Hz = 2/(3*integration period)"; EXPECT_LT(delay_error_chips, 0.5) << "Delay error exceeds the expected value: 0.5 chips"; } gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/adapter/000077500000000000000000000000001305042567700256635ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/adapter/pass_through_test.cc000066400000000000000000000035031305042567700317400ustar00rootroot00000000000000/*! * \file pass_through_test.cc * \brief This file implements tests for the Pass_Through block * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Carles Fernandez-Prades, 2012. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "pass_through.h" #include #include "in_memory_configuration.h" TEST(Pass_Through_Test, Instantiate) { std::shared_ptr config = std::make_shared(); config->set_property("Test.item_type", "gr_complex"); config->set_property("Test.vector_size", "2"); std::shared_ptr signal_conditioner = std::make_shared(config.get(), "Test", 1, 1); EXPECT_STREQ("gr_complex", signal_conditioner->item_type().c_str()); unsigned int expected2 = 2; EXPECT_EQ(expected2, signal_conditioner->vector_size()); } gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/filter/000077500000000000000000000000001305042567700255305ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/filter/fir_filter_test.cc000066400000000000000000000346741305042567700312410ustar00rootroot00000000000000/*! * \file fir_filter_test.cc * \brief Implements Unit Test for the FirFilter class. * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include #include #include "gnss_block_factory.h" #include "gnss_block_interface.h" #include "in_memory_configuration.h" #include "gnss_sdr_valve.h" #include "interleaved_byte_to_complex_byte.h" #include "interleaved_short_to_complex_short.h" #include "fir_filter.h" #include "file_signal_source.h" DEFINE_int32(filter_test_nsamples, 1000000 , "Number of samples to filter in the tests (max: 2147483647)"); class Fir_Filter_Test: public ::testing::Test { protected: Fir_Filter_Test() { queue = gr::msg_queue::make(0); item_size = sizeof(gr_complex); config = std::make_shared(); } ~Fir_Filter_Test() {} void init(); void configure_cbyte_cbyte(); void configure_cbyte_gr_complex(); void configure_gr_complex_gr_complex(); void configure_cshort_cshort(); boost::shared_ptr queue; gr::top_block_sptr top_block; std::shared_ptr config; size_t item_size; int nsamples = FLAGS_filter_test_nsamples; }; void Fir_Filter_Test::init() { config->set_property("InputFilter.taps_item_type", "float"); config->set_property("InputFilter.number_of_taps", "5"); config->set_property("InputFilter.number_of_bands", "2"); config->set_property("InputFilter.band1_begin", "0.0"); config->set_property("InputFilter.band1_end", "0.45"); config->set_property("InputFilter.band2_begin", "0.55"); config->set_property("InputFilter.band2_end", "1.0"); config->set_property("InputFilter.ampl1_begin", "1.0"); config->set_property("InputFilter.ampl1_end", "1.0"); config->set_property("InputFilter.ampl2_begin", "0.0"); config->set_property("InputFilter.ampl2_end", "0.0"); config->set_property("InputFilter.band1_error", "1.0"); config->set_property("InputFilter.band2_error", "1.0"); config->set_property("InputFilter.filter_type", "bandpass"); config->set_property("InputFilter.grid_density", "16"); //config->set_property("InputFilter.dump", "true"); } void Fir_Filter_Test::configure_cbyte_cbyte() { config->set_property("InputFilter.input_item_type", "cbyte"); config->set_property("InputFilter.output_item_type", "cbyte"); } void Fir_Filter_Test::configure_gr_complex_gr_complex() { config->set_property("InputFilter.input_item_type", "gr_complex"); config->set_property("InputFilter.output_item_type", "gr_complex"); } void Fir_Filter_Test::configure_cshort_cshort() { config->set_property("InputFilter.input_item_type", "cshort"); config->set_property("InputFilter.output_item_type", "cshort"); } void Fir_Filter_Test::configure_cbyte_gr_complex() { config->set_property("InputFilter.input_item_type", "cbyte"); config->set_property("InputFilter.output_item_type", "gr_complex"); } TEST_F(Fir_Filter_Test, Instantiate_gr_complex_gr_complex) { init(); configure_gr_complex_gr_complex(); std::unique_ptr filter(new FirFilter(config.get(), "InputFilter", 1, 1)); int res = 0; if (filter) res = 1; ASSERT_EQ(1, res); } TEST_F(Fir_Filter_Test, Instantiate_cshort_cshort) { init(); configure_cshort_cshort(); std::unique_ptr filter(new FirFilter(config.get(), "InputFilter", 1, 1)); int res = 0; if (filter) res = 1; ASSERT_EQ(1, res); } TEST_F(Fir_Filter_Test, Instantiate_cbyte_cbyte) { init(); configure_cbyte_cbyte(); std::unique_ptr filter(new FirFilter(config.get(), "InputFilter", 1, 1)); int res = 0; if (filter) res = 1; ASSERT_EQ(1, res); } TEST_F(Fir_Filter_Test, Instantiate_cbyte_gr_complex) { init(); configure_cbyte_gr_complex(); std::unique_ptr filter(new FirFilter(config.get(), "InputFilter", 1, 1)); int res = 0; if (filter) res = 1; ASSERT_EQ(1, res); } TEST_F(Fir_Filter_Test, ConnectAndRun) { int fs_in = 4000000; struct timeval tv; long long int begin = 0; long long int end = 0; top_block = gr::make_top_block("Fir filter test"); init(); configure_gr_complex_gr_complex(); std::shared_ptr filter = std::make_shared(config.get(), "InputFilter", 1, 1); item_size = sizeof(gr_complex); ASSERT_NO_THROW( { filter->connect(top_block); boost::shared_ptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000, 1, gr_complex(0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); boost::shared_ptr null_sink = gr::blocks::null_sink::make(item_size); top_block->connect(source, 0, valve, 0); top_block->connect(valve, 0, filter->get_left_block(), 0); top_block->connect(filter->get_right_block(), 0, null_sink, 0); }) << "Failure connecting the top_block."<< std::endl; EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec * 1000000 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec * 1000000 + tv.tv_usec; }) << "Failure running the top_block." << std::endl; std::cout << "Filtered " << nsamples << " samples in " << (end-begin) << " microseconds" << std::endl; } TEST_F(Fir_Filter_Test, ConnectAndRunGrcomplex) { struct timeval tv; long long int begin = 0; long long int end = 0; top_block = gr::make_top_block("Fir filter test"); init(); configure_gr_complex_gr_complex(); std::shared_ptr filter = std::make_shared(config.get(), "InputFilter", 1, 1); std::shared_ptr config2 = std::make_shared(); config2->set_property("Test_Source.samples", std::to_string(nsamples)); config2->set_property("Test_Source.sampling_frequency", "4000000"); std::string path = std::string(TEST_PATH); std::string filename = path + "signal_samples/GPS_L1_CA_ID_1_Fs_4Msps_2ms.dat"; config2->set_property("Test_Source.filename", filename); config2->set_property("Test_Source.item_type", "gr_complex"); config2->set_property("Test_Source.repeat", "true"); item_size = sizeof(gr_complex); ASSERT_NO_THROW( { filter->connect(top_block); boost::shared_ptr source(new FileSignalSource(config2.get(), "Test_Source", 1, 1, queue)); source->connect(top_block); boost::shared_ptr null_sink = gr::blocks::null_sink::make(item_size); top_block->connect(source->get_right_block(), 0, filter->get_left_block(), 0); top_block->connect(filter->get_right_block(), 0, null_sink, 0); }) << "Failure connecting the top_block."<< std::endl; EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec * 1000000 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec * 1000000 + tv.tv_usec; }) << "Failure running the top_block." << std::endl; std::cout << "Filtered " << nsamples << " gr_complex samples in " << (end-begin) << " microseconds" << std::endl; } TEST_F(Fir_Filter_Test, ConnectAndRunCshorts) { struct timeval tv; long long int begin = 0; long long int end = 0; top_block = gr::make_top_block("Fir filter test"); init(); configure_cshort_cshort(); std::shared_ptr filter = std::make_shared(config.get(), "InputFilter", 1, 1); std::shared_ptr config2 = std::make_shared(); config2->set_property("Test_Source.samples", std::to_string(nsamples)); config2->set_property("Test_Source.sampling_frequency", "4000000"); std::string path = std::string(TEST_PATH); std::string filename = path + "signal_samples/GPS_L1_CA_ID_1_Fs_4Msps_2ms.dat"; config2->set_property("Test_Source.filename", filename); config2->set_property("Test_Source.item_type", "ishort"); config2->set_property("Test_Source.repeat", "true"); item_size = sizeof(std::complex); ASSERT_NO_THROW( { filter->connect(top_block); boost::shared_ptr source(new FileSignalSource(config2.get(), "Test_Source", 1, 1, queue)); source->connect(top_block); interleaved_short_to_complex_short_sptr ishort_to_cshort_ = make_interleaved_short_to_complex_short(); boost::shared_ptr null_sink = gr::blocks::null_sink::make(item_size); top_block->connect(source->get_right_block(), 0, ishort_to_cshort_, 0); top_block->connect(ishort_to_cshort_, 0, filter->get_left_block(), 0); top_block->connect(filter->get_right_block(), 0, null_sink, 0); }) << "Failure connecting the top_block."<< std::endl; EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec * 1000000 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec * 1000000 + tv.tv_usec; }) << "Failure running the top_block." << std::endl; std::cout << "Filtered " << nsamples << " std::complex samples in " << (end-begin) << " microseconds" << std::endl; } TEST_F(Fir_Filter_Test, ConnectAndRunCbytes) { struct timeval tv; long long int begin = 0; long long int end = 0; top_block = gr::make_top_block("Fir filter test"); init(); configure_cbyte_cbyte(); std::shared_ptr filter = std::make_shared(config.get(), "InputFilter", 1, 1); std::shared_ptr config2 = std::make_shared(); config2->set_property("Test_Source.samples", std::to_string(nsamples)); config2->set_property("Test_Source.sampling_frequency", "4000000"); std::string path = std::string(TEST_PATH); std::string filename = path + "signal_samples/GPS_L1_CA_ID_1_Fs_4Msps_2ms.dat"; config2->set_property("Test_Source.filename", filename); config2->set_property("Test_Source.item_type", "ibyte"); config2->set_property("Test_Source.repeat", "true"); item_size = sizeof(std::complex); ASSERT_NO_THROW( { filter->connect(top_block); boost::shared_ptr source(new FileSignalSource(config2.get(), "Test_Source", 1, 1, queue)); source->connect(top_block); interleaved_byte_to_complex_byte_sptr ibyte_to_cbyte_ = make_interleaved_byte_to_complex_byte(); boost::shared_ptr null_sink = gr::blocks::null_sink::make(item_size); top_block->connect(source->get_right_block(), 0, ibyte_to_cbyte_, 0); top_block->connect(ibyte_to_cbyte_, 0, filter->get_left_block(), 0); top_block->connect(filter->get_right_block(), 0, null_sink, 0); }) << "Failure connecting the top_block."<< std::endl; EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec * 1000000 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec * 1000000 + tv.tv_usec; }) << "Failure running the top_block." << std::endl; std::cout << "Filtered " << nsamples << " std::complex samples in " << (end-begin) << " microseconds" << std::endl; } TEST_F(Fir_Filter_Test, ConnectAndRunCbyteGrcomplex) { struct timeval tv; long long int begin = 0; long long int end = 0; top_block = gr::make_top_block("Fir filter test"); init(); configure_cbyte_gr_complex(); std::shared_ptr filter = std::make_shared(config.get(), "InputFilter", 1, 1); std::shared_ptr config2 = std::make_shared(); config2->set_property("Test_Source.samples", std::to_string(nsamples)); config2->set_property("Test_Source.sampling_frequency", "4000000"); std::string path = std::string(TEST_PATH); std::string filename = path + "signal_samples/GPS_L1_CA_ID_1_Fs_4Msps_2ms.dat"; config2->set_property("Test_Source.filename", filename); config2->set_property("Test_Source.item_type", "ibyte"); config2->set_property("Test_Source.repeat", "true"); item_size = sizeof(gr_complex); ASSERT_NO_THROW( { filter->connect(top_block); boost::shared_ptr source(new FileSignalSource(config2.get(), "Test_Source", 1, 1, queue)); source->connect(top_block); interleaved_byte_to_complex_byte_sptr ibyte_to_cbyte_ = make_interleaved_byte_to_complex_byte(); boost::shared_ptr null_sink = gr::blocks::null_sink::make(item_size); top_block->connect(source->get_right_block(), 0, ibyte_to_cbyte_, 0); top_block->connect(ibyte_to_cbyte_, 0, filter->get_left_block(), 0); top_block->connect(filter->get_right_block(), 0, null_sink, 0); }) << "Failure connecting the top_block."<< std::endl; EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec * 1000000 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec * 1000000 + tv.tv_usec; }) << "Failure running the top_block." << std::endl; std::cout << "Filtered " << nsamples << " samples in " << (end-begin) << " microseconds" << std::endl; } gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/libs/000077500000000000000000000000001305042567700251745ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/libs/CMakeLists.txt000066400000000000000000000023751305042567700277430ustar00rootroot00000000000000# Copyright (C) 2012-2017 (see AUTHORS file for a list of contributors) # # 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 . # set(SIGNAL_PROCESSING_TESTING_LIB_SOURCES tracking_dump_reader.cc tlm_dump_reader.cc tracking_true_obs_reader.cc ) include_directories( $(CMAKE_CURRENT_SOURCE_DIR) ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ) file(GLOB SIGNAL_PROCESSING_TESTING_LIB_HEADERS "*.h") list(SORT SIGNAL_PROCESSING_TESTING_LIB_HEADERS) add_library(signal_processing_testing_lib ${SIGNAL_PROCESSING_TESTING_LIB_SOURCES} ${SIGNAL_PROCESSING_TESTING_LIB_HEADERS}) source_group(Headers FILES ${SIGNAL_PROCESSING_TESTING_LIB_HEADERS}) gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/libs/tlm_dump_reader.cc000066400000000000000000000062601305042567700306520ustar00rootroot00000000000000/*! * \file tlm_dump_reader.cc * \brief Helper file for unit testing * \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 . * * ------------------------------------------------------------------------- */ #include "tlm_dump_reader.h" bool tlm_dump_reader::read_binary_obs() { try { d_dump_file.read((char *) &TOW_at_current_symbol, sizeof(double)); d_dump_file.read((char *) &Prn_timestamp_ms, sizeof(double)); d_dump_file.read((char *) &d_TOW_at_Preamble, sizeof(double)); } catch (const std::ifstream::failure &e) { return false; } return true; } bool tlm_dump_reader::restart() { if (d_dump_file.is_open()) { d_dump_file.clear(); d_dump_file.seekg(0, std::ios::beg); return true; } else { return false; } } long int tlm_dump_reader::num_epochs() { std::ifstream::pos_type size; int number_of_vars_in_epoch = 3; int epoch_size_bytes = sizeof(double) * number_of_vars_in_epoch; std::ifstream tmpfile( d_dump_filename.c_str(), std::ios::binary | std::ios::ate); if (tmpfile.is_open()) { size = tmpfile.tellg(); long int nepoch = size / epoch_size_bytes; return nepoch; } else { return 0; } } bool tlm_dump_reader::open_obs_file(std::string out_file) { if (d_dump_file.is_open() == false) { try { d_dump_filename=out_file; d_dump_file.exceptions ( std::ifstream::failbit | std::ifstream::badbit ); d_dump_file.open(d_dump_filename.c_str(), std::ios::in | std::ios::binary); std::cout << "TLM dump enabled, Log file: " << d_dump_filename.c_str() << std::endl; return true; } catch (const std::ifstream::failure & e) { std::cout << "Problem opening TLM dump Log file: " << d_dump_filename.c_str() << std::endl; return false; } } else { return false; } } tlm_dump_reader::~tlm_dump_reader() { if (d_dump_file.is_open() == true) { d_dump_file.close(); } } gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/libs/tlm_dump_reader.h000066400000000000000000000032471305042567700305160ustar00rootroot00000000000000/*! * \file tlm_dump_reader.h * \brief Helper file for unit testing * \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_TLM_DUMP_READER_H #define GNSS_SDR_TLM_DUMP_READER_H #include #include #include #include class tlm_dump_reader { public: ~tlm_dump_reader(); bool read_binary_obs(); bool restart(); long int num_epochs(); bool open_obs_file(std::string out_file); //telemetry decoder dump variables double TOW_at_current_symbol; double Prn_timestamp_ms; double d_TOW_at_Preamble; private: std::string d_dump_filename; std::ifstream d_dump_file; }; #endif //GNSS_SDR_TLM_DUMP_READER_H gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/libs/tracking_dump_reader.cc000066400000000000000000000104541305042567700316600ustar00rootroot00000000000000/*! * \file tracking_dump_reader.cc * \brief Helper file for unit testing * \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 . * * ------------------------------------------------------------------------- */ #include "tracking_dump_reader.h" bool tracking_dump_reader::read_binary_obs() { try { d_dump_file.read((char *) &abs_E, sizeof(float)); d_dump_file.read((char *) &abs_P, sizeof(float)); d_dump_file.read((char *) &abs_L, sizeof(float)); d_dump_file.read((char *) &prompt_I, sizeof(float)); d_dump_file.read((char *) &prompt_Q, sizeof(float)); d_dump_file.read((char *) &PRN_start_sample_count, sizeof(unsigned long int)); d_dump_file.read((char *) &acc_carrier_phase_rad, sizeof(double)); d_dump_file.read((char *) &carrier_doppler_hz, sizeof(double)); d_dump_file.read((char *) &code_freq_chips, sizeof(double)); d_dump_file.read((char *) &carr_error_hz, sizeof(double)); d_dump_file.read((char *) &carr_error_filt_hz, sizeof(double)); d_dump_file.read((char *) &code_error_chips, sizeof(double)); d_dump_file.read((char *) &code_error_filt_chips, sizeof(double)); d_dump_file.read((char *) &CN0_SNV_dB_Hz, sizeof(double)); d_dump_file.read((char *) &carrier_lock_test, sizeof(double)); d_dump_file.read((char *) &aux1, sizeof(double)); d_dump_file.read((char *) &aux2, sizeof(double)); } catch (const std::ifstream::failure &e) { return false; } return true; } bool tracking_dump_reader::restart() { if (d_dump_file.is_open()) { d_dump_file.clear(); d_dump_file.seekg(0, std::ios::beg); return true; } else { return false; } } long int tracking_dump_reader::num_epochs() { std::ifstream::pos_type size; int number_of_double_vars = 11; int number_of_float_vars = 5; int epoch_size_bytes=sizeof(unsigned long int) + sizeof(double) * number_of_double_vars + sizeof(float) * number_of_float_vars; std::ifstream tmpfile( d_dump_filename.c_str(), std::ios::binary | std::ios::ate); if (tmpfile.is_open()) { size = tmpfile.tellg(); long int nepoch = size / epoch_size_bytes; return nepoch; } else { return 0; } } bool tracking_dump_reader::open_obs_file(std::string out_file) { if (d_dump_file.is_open() == false) { try { d_dump_filename = out_file; d_dump_file.exceptions ( std::ifstream::failbit | std::ifstream::badbit ); d_dump_file.open(d_dump_filename.c_str(), std::ios::in | std::ios::binary); std::cout << "Tracking dump enabled, Log file: " << d_dump_filename.c_str() << std::endl; return true; } catch (const std::ifstream::failure & e) { std::cout << "Problem opening Tracking dump Log file: " << d_dump_filename.c_str() << std::endl; return false; } } else { return false; } } tracking_dump_reader::~tracking_dump_reader() { if (d_dump_file.is_open() == true) { d_dump_file.close(); } } gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/libs/tracking_dump_reader.h000066400000000000000000000044551305042567700315260ustar00rootroot00000000000000/*! * \file tracking_dump_reader.h * \brief Helper file for unit testing * \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_TRACKING_DUMP_READER_H #define GNSS_SDR_TRACKING_DUMP_READER_H #include #include #include #include class tracking_dump_reader { public: ~tracking_dump_reader(); bool read_binary_obs(); bool restart(); long int num_epochs(); bool open_obs_file(std::string out_file); //tracking dump variables // EPR float abs_E; float abs_P; float abs_L; // PROMPT I and Q (to analyze navigation symbols) float prompt_I; float prompt_Q; // PRN start sample stamp unsigned long int PRN_start_sample_count; // accumulated carrier phase double acc_carrier_phase_rad; // carrier and code frequency double carrier_doppler_hz; double code_freq_chips; // PLL commands double carr_error_hz; double carr_error_filt_hz; // DLL commands double code_error_chips; double code_error_filt_chips; // CN0 and carrier lock test double CN0_SNV_dB_Hz; double carrier_lock_test; // AUX vars (for debug purposes) double aux1; double aux2; private: std::string d_dump_filename; std::ifstream d_dump_file; }; #endif //GNSS_SDR_TRACKING_DUMP_READER_H gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/libs/tracking_true_obs_reader.cc000066400000000000000000000066221305042567700325370ustar00rootroot00000000000000/*! * \file tracking_true_obs_reader.cc * \brief Helper file for unit testing * \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 . * * ------------------------------------------------------------------------- */ #include "tracking_true_obs_reader.h" bool tracking_true_obs_reader::read_binary_obs() { try { d_dump_file.read((char *) &signal_timestamp_s, sizeof(double)); d_dump_file.read((char *) &acc_carrier_phase_cycles, sizeof(double)); d_dump_file.read((char *) &doppler_l1_hz, sizeof(double)); d_dump_file.read((char *) &prn_delay_chips, sizeof(double)); d_dump_file.read((char *) &tow, sizeof(double)); } catch (const std::ifstream::failure &e) { return false; } return true; } bool tracking_true_obs_reader::restart() { if (d_dump_file.is_open()) { d_dump_file.clear(); d_dump_file.seekg(0, std::ios::beg); return true; } else { return false; } } long int tracking_true_obs_reader::num_epochs() { std::ifstream::pos_type size; int number_of_vars_in_epoch = 5; int epoch_size_bytes = sizeof(double) * number_of_vars_in_epoch; std::ifstream tmpfile( d_dump_filename.c_str(), std::ios::binary | std::ios::ate); if (tmpfile.is_open()) { size = tmpfile.tellg(); long int nepoch = size / epoch_size_bytes; return nepoch; } else { return 0; } } bool tracking_true_obs_reader::open_obs_file(std::string out_file) { if (d_dump_file.is_open() == false) { try { d_dump_filename = out_file; d_dump_file.exceptions ( std::ifstream::failbit | std::ifstream::badbit ); d_dump_file.open(d_dump_filename.c_str(), std::ios::in | std::ios::binary); std::cout << "Observables dump enabled, Log file: " << d_dump_filename.c_str() << std::endl; return true; } catch (const std::ifstream::failure & e) { std::cout << "Problem opening Observables dump Log file: " << d_dump_filename.c_str() << std::endl; return false; } } else { return false; } } tracking_true_obs_reader::~tracking_true_obs_reader() { if (d_dump_file.is_open() == true) { d_dump_file.close(); } } gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/libs/tracking_true_obs_reader.h000066400000000000000000000033631305042567700324000ustar00rootroot00000000000000/*! * \file tracking_true_obs_reader.h * \brief Helper file for unit testing * \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_TRACKING_TRUE_OBS_READER_H #define GNSS_SDR_TRACKING_TRUE_OBS_READER_H #include #include #include #include class tracking_true_obs_reader { public: ~tracking_true_obs_reader(); bool read_binary_obs(); bool restart(); long int num_epochs(); bool open_obs_file(std::string out_file); bool d_dump; double signal_timestamp_s; double acc_carrier_phase_cycles; double doppler_l1_hz; double prn_delay_chips; double tow; private: std::string d_dump_filename; std::ifstream d_dump_file; }; #endif //GNSS_SDR_RACKING_TRUE_OBS_READER_H gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/pvt/000077500000000000000000000000001305042567700250545ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/pvt/rinex_printer_test.cc000066400000000000000000000366331305042567700313250ustar00rootroot00000000000000/*! * \file rinex_printer_test.cc * \brief Implements Unit Tests for the Rinex_Printer class. * \author Carles Fernandez-Prades, 2016. cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2016 (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 . * * ------------------------------------------------------------------------- */ #include #include #include "rinex_printer.h" TEST(Rinex_Printer_Test, GalileoObsHeader) { std::string line_aux; std::string line_str; bool no_more_finds = false; const Galileo_Ephemeris eph = Galileo_Ephemeris(); std::shared_ptr rp1; rp1 = std::make_shared(); rp1->rinex_obs_header(rp1->obsFile, eph, 0.0); rp1->obsFile.seekp(0); while(!rp1->obsFile.eof()) { std::getline(rp1->obsFile, line_str); if(!no_more_finds) { if (line_str.find("SYS / # / OBS TYPES", 59) != std::string::npos) { no_more_finds = true; line_aux = std::string(line_str); } } } std::string expected_str("E 4 C1B L1B D1B S1B SYS / # / OBS TYPES "); EXPECT_EQ(0, expected_str.compare(line_aux)); if(remove(rp1->obsfilename.c_str()) != 0) LOG(INFO) << "Error deleting temporary file"; line_aux.clear(); std::shared_ptr rp2; rp2 = std::make_shared(); std::string bands("1B 5X 7X"); rp2->rinex_obs_header(rp2->obsFile, eph, 0.0, bands); rp2->obsFile.seekp(0); no_more_finds = false; while(!rp2->obsFile.eof()) { std::getline(rp2->obsFile, line_str); if(!no_more_finds) { if (line_str.find("SYS / # / OBS TYPES", 59) != std::string::npos) { no_more_finds = true; line_aux = std::string(line_str); } } } std::string expected_str2("E 12 C1B L1B D1B S1B C5X L5X D5X S5X C7X L7X D7X S7X SYS / # / OBS TYPES "); EXPECT_EQ(0, expected_str2.compare(line_aux)); if(remove(rp2->obsfilename.c_str()) != 0) LOG(INFO) << "Error deleting temporary file"; } TEST(Rinex_Printer_Test, MixedObsHeader) { std::string line_aux; std::string line_aux2; std::string line_str; bool no_more_finds = false; const Galileo_Ephemeris eph_gal = Galileo_Ephemeris(); const Gps_Ephemeris eph_gps = Gps_Ephemeris(); std::shared_ptr rp1; rp1 = std::make_shared(); rp1->rinex_obs_header(rp1->obsFile, eph_gps, eph_gal, 0.0, "1B 5X"); rp1->obsFile.seekp(0); int systems_found = 0; while(!rp1->obsFile.eof()) { std::getline(rp1->obsFile, line_str); if(!no_more_finds) { if (line_str.find("SYS / # / OBS TYPES", 59) != std::string::npos) { systems_found++; if(systems_found == 1) { line_aux = std::string(line_str); } if(systems_found == 2) { line_aux2 = std::string(line_str); no_more_finds = true; } } } } std::string expected_str("G 4 C1C L1C D1C S1C SYS / # / OBS TYPES "); std::string expected_str2("E 8 C1B L1B D1B S1B C5X L5X D5X S5X SYS / # / OBS TYPES "); EXPECT_EQ(0, expected_str.compare(line_aux)); EXPECT_EQ(0, expected_str2.compare(line_aux2)); if(remove(rp1->obsfilename.c_str()) != 0) LOG(INFO) << "Error deleting temporary file"; } TEST(Rinex_Printer_Test, GalileoObsLog) { std::string line_aux; std::string line_str; bool no_more_finds = false; const Galileo_Ephemeris eph = Galileo_Ephemeris(); std::shared_ptr rp; rp = std::make_shared(); rp->rinex_obs_header(rp->obsFile, eph, 0.0); std::map gnss_pseudoranges_map; Gnss_Synchro gs1 = Gnss_Synchro(); Gnss_Synchro gs2 = Gnss_Synchro(); Gnss_Synchro gs3 = Gnss_Synchro(); Gnss_Synchro gs4 = Gnss_Synchro(); std::string sys = "E"; gs1.System = *sys.c_str(); gs2.System = *sys.c_str(); gs3.System = *sys.c_str(); gs4.System = *sys.c_str(); std::string sig = "1B"; std::memcpy((void*)gs1.Signal, sig.c_str(), 3); std::memcpy((void*)gs2.Signal, sig.c_str(), 3); std::memcpy((void*)gs3.Signal, sig.c_str(), 3); std::memcpy((void*)gs4.Signal, sig.c_str(), 3); gs1.PRN = 3; gs2.PRN = 8; gs3.PRN = 10; gs4.PRN = 22; gs4.Pseudorange_m = 22000000; gs4.Carrier_phase_rads = 23.4; gs4.Carrier_Doppler_hz = 1534; gs4.CN0_dB_hz = 42; gnss_pseudoranges_map.insert( std::pair(1,gs1) ); gnss_pseudoranges_map.insert( std::pair(2,gs2) ); gnss_pseudoranges_map.insert( std::pair(3,gs3) ); gnss_pseudoranges_map.insert( std::pair(4,gs4) ); rp->log_rinex_obs(rp->obsFile, eph, 0.0, gnss_pseudoranges_map); rp->obsFile.seekp(0); while(!rp->obsFile.eof()) { std::getline(rp->obsFile, line_str); if(!no_more_finds) { if (line_str.find("E22", 0) != std::string::npos) { no_more_finds = true; line_aux = std::string(line_str); } } } std::string expected_str("E22 22000000.000 7 3.724 7 1534.000 7 42.000 "); EXPECT_EQ(0, expected_str.compare(line_aux)); if(remove(rp->obsfilename.c_str()) != 0) LOG(INFO) << "Error deleting temporary file"; } TEST(Rinex_Printer_Test, GpsObsLogDualBand) { std::string line_aux; std::string line_str; bool no_more_finds = false; const Gps_Ephemeris eph_gps = Gps_Ephemeris(); const Gps_CNAV_Ephemeris eph_cnav = Gps_CNAV_Ephemeris(); std::shared_ptr rp; rp = std::make_shared(); rp->rinex_obs_header(rp->obsFile, eph_gps, eph_cnav, 0.0); std::map gnss_pseudoranges_map; Gnss_Synchro gs1 = Gnss_Synchro(); Gnss_Synchro gs2 = Gnss_Synchro(); Gnss_Synchro gs3 = Gnss_Synchro(); Gnss_Synchro gs4 = Gnss_Synchro(); std::string sys = "G"; gs1.System = *sys.c_str(); gs2.System = *sys.c_str(); gs3.System = *sys.c_str(); gs4.System = *sys.c_str(); std::string sig = "1C"; std::memcpy((void*)gs1.Signal, sig.c_str(), 3); std::memcpy((void*)gs2.Signal, sig.c_str(), 3); sig = "2S"; std::memcpy((void*)gs3.Signal, sig.c_str(), 3); std::memcpy((void*)gs4.Signal, sig.c_str(), 3); gs1.PRN = 3; gs2.PRN = 8; gs3.PRN = 7; gs4.PRN = 8; gs2.Pseudorange_m = 22000002.1; gs2.Carrier_phase_rads = 45.4; gs2.Carrier_Doppler_hz = 321; gs2.CN0_dB_hz = 39; gs4.Pseudorange_m = 22000000; gs4.Carrier_phase_rads = 23.4; gs4.Carrier_Doppler_hz = 1534; gs4.CN0_dB_hz = 42; gs3.Pseudorange_m = 22000007; gs3.Carrier_phase_rads = -23.4; gs3.Carrier_Doppler_hz = -1534; gs3.CN0_dB_hz = 47; gnss_pseudoranges_map.insert( std::pair(1,gs1) ); gnss_pseudoranges_map.insert( std::pair(2,gs2) ); gnss_pseudoranges_map.insert( std::pair(3,gs3) ); gnss_pseudoranges_map.insert( std::pair(4,gs4) ); rp->log_rinex_obs(rp->obsFile, eph_gps, eph_cnav, 0.0, gnss_pseudoranges_map); rp->obsFile.seekp(0); while(!rp->obsFile.eof()) { std::getline(rp->obsFile, line_str); if(!no_more_finds) { if (line_str.find("G08", 0) != std::string::npos) { no_more_finds = true; line_aux = std::string(line_str); } } } std::string expected_str("G08 22000002.100 6 7.226 6 321.000 6 39.000 22000000.000 7 3.724 7 1534.000 7 42.000"); EXPECT_EQ(0, expected_str.compare(line_aux)); if(remove(rp->obsfilename.c_str()) != 0) LOG(INFO) << "Error deleting temporary file"; } TEST(Rinex_Printer_Test, GalileoObsLogDualBand) { std::string line_aux; std::string line_str; bool no_more_finds = false; const Galileo_Ephemeris eph = Galileo_Ephemeris(); std::shared_ptr rp; rp = std::make_shared(); std::string bands("1B 5X"); rp->rinex_obs_header(rp->obsFile, eph, 0.0, bands); std::map gnss_pseudoranges_map; Gnss_Synchro gs1 = Gnss_Synchro(); Gnss_Synchro gs2 = Gnss_Synchro(); Gnss_Synchro gs3 = Gnss_Synchro(); Gnss_Synchro gs4 = Gnss_Synchro(); std::string sys = "E"; gs1.System = *sys.c_str(); gs2.System = *sys.c_str(); gs3.System = *sys.c_str(); gs4.System = *sys.c_str(); std::string sig = "1B"; std::memcpy((void*)gs1.Signal, sig.c_str(), 3); std::memcpy((void*)gs2.Signal, sig.c_str(), 3); sig = "5X"; std::memcpy((void*)gs3.Signal, sig.c_str(), 3); std::memcpy((void*)gs4.Signal, sig.c_str(), 3); gs1.PRN = 3; gs2.PRN = 8; gs3.PRN = 3; gs4.PRN = 8; gs2.Pseudorange_m = 22000002.1; gs2.Carrier_phase_rads = 45.4; gs2.Carrier_Doppler_hz = 321; gs2.CN0_dB_hz = 39; gs3.Pseudorange_m = 22000003.3; gs3.Carrier_phase_rads = 43.3; gs3.Carrier_Doppler_hz = -321; gs3.CN0_dB_hz = 40; gs4.Pseudorange_m = 22000000; gs4.Carrier_phase_rads = 23.4; gs4.Carrier_Doppler_hz = 1534; gs4.CN0_dB_hz = 42; gnss_pseudoranges_map.insert( std::pair(1,gs1) ); gnss_pseudoranges_map.insert( std::pair(2,gs2) ); gnss_pseudoranges_map.insert( std::pair(3,gs3) ); gnss_pseudoranges_map.insert( std::pair(4,gs4) ); rp->log_rinex_obs(rp->obsFile, eph, 0.0, gnss_pseudoranges_map, bands); rp->obsFile.seekp(0); while(!rp->obsFile.eof()) { std::getline(rp->obsFile, line_str); if(!no_more_finds) { if (line_str.find("E08", 0) != std::string::npos) { no_more_finds = true; line_aux = std::string(line_str); } } } std::string expected_str("E08 22000002.100 6 7.226 6 321.000 6 39.000 22000000.000 7 3.724 7 1534.000 7 42.000"); EXPECT_EQ(0, expected_str.compare(line_aux)); if(remove(rp->obsfilename.c_str()) != 0) LOG(INFO) << "Error deleting temporary file"; } TEST(Rinex_Printer_Test, MixedObsLog) { std::string line_aux; std::string line_str; bool no_more_finds = false; const Galileo_Ephemeris eph_gal = Galileo_Ephemeris(); const Gps_Ephemeris eph_gps = Gps_Ephemeris(); std::shared_ptr rp; rp = std::make_shared(); rp->rinex_obs_header(rp->obsFile, eph_gps, eph_gal, 0.0, "1B 5X"); std::map gnss_pseudoranges_map; Gnss_Synchro gs1 = Gnss_Synchro(); Gnss_Synchro gs2 = Gnss_Synchro(); Gnss_Synchro gs3 = Gnss_Synchro(); Gnss_Synchro gs4 = Gnss_Synchro(); Gnss_Synchro gs5 = Gnss_Synchro(); Gnss_Synchro gs6 = Gnss_Synchro(); Gnss_Synchro gs7 = Gnss_Synchro(); Gnss_Synchro gs8 = Gnss_Synchro(); std::string sys = "G"; gs1.System = *sys.c_str(); gs2.System = *sys.c_str(); gs3.System = *sys.c_str(); gs4.System = *sys.c_str(); sys = "E"; gs5.System = *sys.c_str(); gs6.System = *sys.c_str(); gs7.System = *sys.c_str(); gs8.System = *sys.c_str(); std::string sig = "1C"; std::memcpy((void*)gs1.Signal, sig.c_str(), 3); std::memcpy((void*)gs2.Signal, sig.c_str(), 3); std::memcpy((void*)gs3.Signal, sig.c_str(), 3); std::memcpy((void*)gs4.Signal, sig.c_str(), 3); sig = "5X"; std::memcpy((void*)gs5.Signal, sig.c_str(), 3); std::memcpy((void*)gs6.Signal, sig.c_str(), 3); sig = "1B"; std::memcpy((void*)gs7.Signal, sig.c_str(), 3); std::memcpy((void*)gs8.Signal, sig.c_str(), 3); gs1.PRN = 3; gs2.PRN = 8; gs3.PRN = 14; gs4.PRN = 16; gs5.PRN = 3; gs6.PRN = 16; gs7.PRN = 14; gs8.PRN = 16; gs2.Pseudorange_m = 22000002.1; gs2.Carrier_phase_rads = 45.4; gs2.Carrier_Doppler_hz = 321; gs2.CN0_dB_hz = 39; gs4.Pseudorange_m = 22000000; gs4.Carrier_phase_rads = 23.4; gs4.Carrier_Doppler_hz = -1534; gs4.CN0_dB_hz = 40; gs6.Pseudorange_m = 22000000; gs6.Carrier_phase_rads = 52.1; gs6.Carrier_Doppler_hz = 1534; gs6.CN0_dB_hz = 41; gs8.Pseudorange_m = 22000000; gs8.Carrier_phase_rads = 0.8; gs8.Carrier_Doppler_hz = -20; gs8.CN0_dB_hz = 42; gnss_pseudoranges_map.insert( std::pair(1,gs1) ); gnss_pseudoranges_map.insert( std::pair(2,gs2) ); gnss_pseudoranges_map.insert( std::pair(3,gs3) ); gnss_pseudoranges_map.insert( std::pair(4,gs4) ); gnss_pseudoranges_map.insert( std::pair(5,gs5) ); gnss_pseudoranges_map.insert( std::pair(6,gs6) ); gnss_pseudoranges_map.insert( std::pair(7,gs7) ); gnss_pseudoranges_map.insert( std::pair(8,gs8) ); rp->log_rinex_obs(rp->obsFile, eph_gps, eph_gal, 0.0, gnss_pseudoranges_map); rp->obsFile.seekp(0); while(!rp->obsFile.eof()) { std::getline(rp->obsFile, line_str); if(!no_more_finds) { if (line_str.find("E16", 0) != std::string::npos) { no_more_finds = true; line_aux = std::string(line_str); } } } std::string expected_str("E16 22000000.000 7 0.127 7 -20.000 7 42.000 22000000.000 6 8.292 6 1534.000 6 41.000"); EXPECT_EQ(0, expected_str.compare(line_aux)); if(remove(rp->obsfilename.c_str()) != 0) LOG(INFO) << "Error deleting temporary file"; } gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/pvt/rtcm_printer_test.cc000066400000000000000000000072261305042567700311410ustar00rootroot00000000000000/*! * \file rtcm_printer_test.cc * \brief Implements Unit Test for the Rtcm_Printer class. * \author Carles Fernandez-Prades, 2013. cfernandez(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ //#include //#include #include //#include //#include #include "rtcm_printer.h" //#include "gps_ephemeris.h" TEST(Rtcm_Printer_Test, Instantiate) { std::string filename = "hello.rtcm"; bool flag_rtcm_tty_port = false; std::string rtcm_dump_devname = "/dev/pts/4"; bool flag_rtcm_server = false; unsigned short rtcm_tcp_port = 2101; unsigned short rtcm_station_id = 1234; std::unique_ptr RTCM_printer(new Rtcm_Printer(filename, flag_rtcm_server, flag_rtcm_tty_port, rtcm_tcp_port, rtcm_station_id, rtcm_dump_devname)); } TEST(Rtcm_Printer_Test, Run) { // std::string file_name = "./gps_ephemeris_rx.xml"; // std::map gps_ephemeris_map; // try // { // std::ifstream ifs(file_name.c_str(), std::ifstream::binary | std::ifstream::in); // boost::archive::xml_iarchive xml(ifs); // gps_ephemeris_map.clear(); // xml >> boost::serialization::make_nvp("GNSS-SDR_ephemeris_map", gps_ephemeris_map); // ifs.close(); // } // catch (std::exception& e) // { // //LOG(WARNING) << e.what() << "File: " << file_name; // //std::cout << "File not found" << std::endl; // } std::string filename = "test.rtcm"; bool flag_rtcm_tty_port = false; std::string rtcm_dump_devname = "/dev/pts/4"; bool flag_rtcm_server = false; unsigned short rtcm_tcp_port = 2101; unsigned short rtcm_station_id = 1234; std::unique_ptr RTCM_printer(new Rtcm_Printer(filename, flag_rtcm_server, flag_rtcm_tty_port, rtcm_tcp_port, rtcm_station_id, rtcm_dump_devname)); std::string reference_msg = "D300133ED7D30202980EDEEF34B4BD62AC0941986F33360B98"; /* Convert the reference message to binary data */ std::string reference_msg_binary; unsigned char c[1]; for(unsigned int i = 0; i < reference_msg.length(); i = i + 2) { unsigned long int n, n2; std::istringstream(reference_msg.substr(i,1)) >> std::hex >> n; std::istringstream(reference_msg.substr(i + 1, 1)) >> std::hex >> n2; c[0] = static_cast(n * 16) + static_cast(n2); std::string ret(c, c+1); reference_msg_binary += ret; } std::string testing_msg = RTCM_printer->print_MT1005_test(); EXPECT_EQ(0, reference_msg_binary.compare(testing_msg)); } gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/pvt/rtcm_test.cc000066400000000000000000000514131305042567700273730ustar00rootroot00000000000000/*! * \file rtcm_test.cc * \brief This file implements unit tests for the Rtcm class. * \author Carles Fernandez-Prades, 2015. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include "rtcm.h" #include "Galileo_E1.h" TEST(Rtcm_Test, Hex_to_bin) { auto rtcm = std::make_shared(); std::string test1 = "2A"; std::string test1_bin = rtcm->hex_to_bin(test1); EXPECT_EQ(0, test1_bin.compare("00101010")); std::string test2 = "FF"; std::string test2_bin = rtcm->hex_to_bin(test2); EXPECT_EQ(0, test2_bin.compare("11111111")); std::string test3 = "ff"; std::string test3_bin = rtcm->hex_to_bin(test3); EXPECT_EQ(0, test3_bin.compare("11111111")); std::string test4 = "100"; std::string test4_bin = rtcm->hex_to_bin(test4); EXPECT_EQ(0, test4_bin.compare("000100000000")); std::string test5 = "1101"; std::string test5_bin = rtcm->hex_to_bin(test5); EXPECT_EQ(0, test5_bin.compare("0001000100000001")); std::string test6 = "3"; std::string test6_bin = rtcm->hex_to_bin(test6); EXPECT_EQ(0, test6_bin.compare("0011")); } TEST(Rtcm_Test, Bin_to_hex) { auto rtcm = std::make_shared(); std::string test1 = "00101010"; std::string test1_hex = rtcm->bin_to_hex(test1); EXPECT_EQ(0, test1_hex.compare("2A")); std::string test2 = "11111111"; std::string test2_hex = rtcm->bin_to_hex(test2); EXPECT_EQ(0, test2_hex.compare("FF")); std::string test4 = "000100000000"; std::string test4_hex = rtcm->bin_to_hex(test4); EXPECT_EQ(0, test4_hex.compare("100")); std::string test5 = "0001000100000001"; std::string test5_hex = rtcm->bin_to_hex(test5); EXPECT_EQ(0, test5_hex.compare("1101")); std::string test6 = "0011"; std::string test6_hex = rtcm->bin_to_hex(test6); EXPECT_EQ(0, test6_hex.compare("3")); std::string test7 = "11"; std::string test7_hex = rtcm->bin_to_hex(test7); EXPECT_EQ(0, test7_hex.compare("3")); std::string test8 = "1000100000001"; std::string test8_hex = rtcm->bin_to_hex(test8); EXPECT_EQ(0, test8_hex.compare("1101")); } TEST(Rtcm_Test, Hex_to_int) { auto rtcm = std::make_shared(); std::string test1 = "2A"; long int test1_int = rtcm->hex_to_int(test1); long int expected1 = 42; EXPECT_EQ(expected1, test1_int); } TEST(Rtcm_Test, Hex_to_uint) { auto rtcm = std::make_shared(); long unsigned int expected1 = 42; EXPECT_EQ(expected1, rtcm->hex_to_uint(rtcm->bin_to_hex("00101010"))); } TEST(Rtcm_Test, Bin_to_double) { auto rtcm = std::make_shared(); std::bitset<4> test1(5); long int test1_int = static_cast(rtcm->bin_to_double(test1.to_string())); long int expected1 = 5; EXPECT_EQ(expected1, test1_int); std::bitset<4> test2(-5); EXPECT_DOUBLE_EQ(-5, rtcm->bin_to_double(test2.to_string())); std::bitset<65> test3(-5); EXPECT_DOUBLE_EQ(0, rtcm->bin_to_double(test3.to_string())); } TEST(Rtcm_Test, Bin_to_uint) { auto rtcm = std::make_shared(); long unsigned int expected1 = 42; EXPECT_EQ(expected1, rtcm->bin_to_uint("00101010")); long unsigned int expected2 = 214; EXPECT_EQ(expected2, rtcm->bin_to_uint("11010110")); } TEST(Rtcm_Test, Bin_to_int) { auto rtcm = std::make_shared(); long unsigned int expected1 = 42; EXPECT_EQ(expected1, rtcm->bin_to_int("00101010")); long unsigned int expected2 = -42; EXPECT_EQ(expected2, rtcm->bin_to_int("11010110")); } TEST(Rtcm_Test, Bin_to_binary_data) { auto rtcm = std::make_shared(); std::string bin_str("1101101011010110"); std::string data_str = rtcm->bin_to_binary_data(bin_str); std::string test_binary = data_str.substr(0,1); std::string test_bin = rtcm->binary_data_to_bin(test_binary); std::string test_hex = rtcm->bin_to_hex(test_bin); EXPECT_EQ(0, test_hex.compare("DA")); std::string recovered_str = rtcm->binary_data_to_bin(data_str); EXPECT_EQ(0, recovered_str.compare(bin_str)); } TEST(Rtcm_Test, Check_CRC) { auto rtcm = std::make_shared(); bool expected_true = true; bool expected_false = false; std::string good_crc = rtcm->bin_to_binary_data(rtcm->hex_to_bin("D300133ED7D30202980EDEEF34B4BD62AC0941986F33360B98")); std::string bad_crc = rtcm->bin_to_binary_data(rtcm->hex_to_bin("D300133ED7D30202980EDEEF34B4BD62AC0941986F33360B99")); EXPECT_EQ(expected_true, rtcm->check_CRC(good_crc)); EXPECT_EQ(expected_false, rtcm->check_CRC(bad_crc)); EXPECT_EQ(expected_true, rtcm->check_CRC(rtcm->print_MT1005_test())); EXPECT_EQ(expected_true, rtcm->check_CRC(rtcm->print_MT1005_test())); // Run twice to check that CRC has no memory } TEST(Rtcm_Test, MT1001) { auto rtcm = std::make_shared(); Gps_Ephemeris gps_eph = Gps_Ephemeris(); Gnss_Synchro gnss_synchro; gnss_synchro.PRN = 2; std::string sys = "G"; bool expected_true = true; unsigned short station_id = 1234; std::string sig = "1C"; gnss_synchro.System = *sys.c_str(); std::memcpy((void*)gnss_synchro.Signal, sig.c_str(), 3); gnss_synchro.Pseudorange_m = 20000000.0; double obs_time = 25.0; std::map pseudoranges; pseudoranges.insert(std::pair(1, gnss_synchro)); std::string MT1001 = rtcm->print_MT1001(gps_eph, obs_time, pseudoranges, station_id); EXPECT_EQ(expected_true, rtcm->check_CRC(MT1001)); } TEST(Rtcm_Test, MT1005) { auto rtcm = std::make_shared(); std::string reference_msg = rtcm->print_MT1005_test(); std::string reference_msg2 = rtcm->print_MT1005(2003, 1114104.5999, -4850729.7108, 3975521.4643, true, false, false, false, false, 0); EXPECT_EQ(0, reference_msg.compare(reference_msg2)); unsigned int ref_id; double ecef_x; double ecef_y; double ecef_z; bool gps; bool glonass; bool galileo; bool expected_true = true; bool expected_false = false; rtcm->read_MT1005(reference_msg, ref_id, ecef_x, ecef_y, ecef_z, gps, glonass, galileo); EXPECT_EQ(expected_true, gps); EXPECT_EQ(expected_false, glonass); EXPECT_EQ(expected_false, galileo); EXPECT_EQ(2003, ref_id); EXPECT_DOUBLE_EQ(1114104.5999, ecef_x); EXPECT_DOUBLE_EQ(-4850729.7108, ecef_y); EXPECT_DOUBLE_EQ(3975521.4643, ecef_z); gps = false; ecef_x = 0.0; rtcm->read_MT1005(rtcm->bin_to_binary_data(rtcm->hex_to_bin("D300133ED7D30202980EDEEF34B4BD62AC0941986F33360B98")), ref_id, ecef_x, ecef_y, ecef_z, gps, glonass, galileo); EXPECT_EQ(expected_true, gps); EXPECT_EQ(expected_false, glonass); EXPECT_EQ(expected_false, galileo); EXPECT_EQ(2003, ref_id); EXPECT_DOUBLE_EQ(1114104.5999, ecef_x); EXPECT_DOUBLE_EQ(-4850729.7108, ecef_y); EXPECT_DOUBLE_EQ(3975521.4643, ecef_z); } TEST(Rtcm_Test, MT1019) { auto rtcm = std::make_shared(); bool expected_true = true; Gps_Ephemeris gps_eph = Gps_Ephemeris(); Gps_Ephemeris gps_eph_read = Gps_Ephemeris(); gps_eph.i_satellite_PRN = 3; gps_eph.d_IODC = 4; gps_eph.d_e_eccentricity = 2.0 * E_LSB; gps_eph.b_fit_interval_flag = true; std::string tx_msg = rtcm->print_MT1019(gps_eph); EXPECT_EQ(0, rtcm->read_MT1019(tx_msg, gps_eph_read)); EXPECT_EQ(3, gps_eph_read.i_satellite_PRN); EXPECT_DOUBLE_EQ(4, gps_eph_read.d_IODC); EXPECT_DOUBLE_EQ( 2.0 * E_LSB, gps_eph_read.d_e_eccentricity); EXPECT_EQ(expected_true, gps_eph_read.b_fit_interval_flag); EXPECT_EQ(1, rtcm->read_MT1019(rtcm->bin_to_binary_data(rtcm->hex_to_bin("FFFFFFFFFFF")), gps_eph_read)); } TEST(Rtcm_Test, MT1029) { auto rtcm = std::make_shared(); std::string s_test("UTF-8 проверка wörter"); unsigned int ref_id = 23; double obs_time = 0; Gps_Ephemeris gps_eph = Gps_Ephemeris(); std::string m1029 = rtcm->bin_to_hex(rtcm->binary_data_to_bin(rtcm->print_MT1029(ref_id, gps_eph, obs_time, s_test))); std::string encoded_text = m1029.substr(24, 60); std::string expected_encoded_text("5554462D3820D0BFD180D0BED0B2D0B5D180D0BAD0B02077C3B672746572"); EXPECT_EQ(0, expected_encoded_text.compare(encoded_text)); std::string characters_to_follow = m1029.substr(22, 2); std::string expected_characters_to_follow("1E"); EXPECT_EQ(0, expected_characters_to_follow.compare(characters_to_follow)); } TEST(Rtcm_Test, MT1045) { auto rtcm = std::make_shared(); bool expected_true = true; Galileo_Ephemeris gal_eph = Galileo_Ephemeris(); Galileo_Ephemeris gal_eph_read = Galileo_Ephemeris(); gal_eph.i_satellite_PRN = 5; gal_eph.OMEGA_dot_3 = 53.0 * OMEGA_dot_3_LSB; gal_eph.E5a_DVS = true; std::string tx_msg = rtcm->print_MT1045(gal_eph); EXPECT_EQ(0, rtcm->read_MT1045(tx_msg, gal_eph_read)); EXPECT_EQ(expected_true, gal_eph_read.E5a_DVS); EXPECT_DOUBLE_EQ( 53.0 * OMEGA_dot_3_LSB, gal_eph_read.OMEGA_dot_3); EXPECT_EQ(5, gal_eph_read.i_satellite_PRN); EXPECT_EQ(1, rtcm->read_MT1045(rtcm->bin_to_binary_data(rtcm->hex_to_bin("FFFFFFFFFFF")), gal_eph_read)); } TEST(Rtcm_Test, MSMCell) { auto rtcm = std::make_shared(); Gps_Ephemeris gps_eph = Gps_Ephemeris(); Galileo_Ephemeris gal_eph = Galileo_Ephemeris(); std::map pseudoranges; Gnss_Synchro gnss_synchro; Gnss_Synchro gnss_synchro2; Gnss_Synchro gnss_synchro3; Gnss_Synchro gnss_synchro4; Gnss_Synchro gnss_synchro5; gnss_synchro.PRN = 4; gnss_synchro2.PRN = 8; gnss_synchro3.PRN = 32; gnss_synchro4.PRN = 10; gnss_synchro5.PRN = 10; std::string gps = "G"; std::string gal = "E"; std::string c1 = "1C"; std::string s2 = "2S"; std::string x5 = "5X"; gnss_synchro.System = *gal.c_str(); gnss_synchro2.System = *gps.c_str(); gnss_synchro3.System = *gps.c_str(); gnss_synchro4.System = *gal.c_str(); gnss_synchro5.System = *gps.c_str(); std::memcpy((void*)gnss_synchro.Signal, x5.c_str(), 3); std::memcpy((void*)gnss_synchro2.Signal, s2.c_str(), 3); std::memcpy((void*)gnss_synchro3.Signal, c1.c_str(), 3); std::memcpy((void*)gnss_synchro4.Signal, x5.c_str(), 3); std::memcpy((void*)gnss_synchro5.Signal, c1.c_str(), 3); gnss_synchro.Pseudorange_m = 20000000.0; gnss_synchro2.Pseudorange_m = 20001010.0; gnss_synchro3.Pseudorange_m = 24002020.0; gnss_synchro4.Pseudorange_m = 20003010.1; gnss_synchro5.Pseudorange_m = 22003010.1; pseudoranges.insert(std::pair(1, gnss_synchro)); pseudoranges.insert(std::pair(2, gnss_synchro2)); pseudoranges.insert(std::pair(3, gnss_synchro3)); pseudoranges.insert(std::pair(4, gnss_synchro4)); pseudoranges.insert(std::pair(5, gnss_synchro5)); unsigned int ref_id = 1234; unsigned int clock_steering_indicator = 0; unsigned int external_clock_indicator = 0; int smooth_int = 0; bool divergence_free = false; bool more_messages = false; double obs_time = 25.0; gps_eph.i_satellite_PRN = gnss_synchro2.PRN; gal_eph.i_satellite_PRN = gnss_synchro.PRN; std::string MSM1 = rtcm->print_MSM_1(gps_eph, {}, gal_eph, obs_time, pseudoranges, ref_id, clock_steering_indicator, external_clock_indicator, smooth_int, divergence_free, more_messages); std::string MSM1_bin = rtcm->binary_data_to_bin(MSM1); unsigned int Nsat = 4; unsigned int Nsig = 3; unsigned int size_header = 14; unsigned int size_msg_length = 10; EXPECT_EQ(0, MSM1_bin.substr(size_header + size_msg_length + 169, Nsat * Nsig).compare("001010101100")); // check cell mask std::map pseudoranges2; pseudoranges2.insert(std::pair(1, gnss_synchro5)); pseudoranges2.insert(std::pair(2, gnss_synchro4)); pseudoranges2.insert(std::pair(3, gnss_synchro3)); pseudoranges2.insert(std::pair(4, gnss_synchro2)); pseudoranges2.insert(std::pair(5, gnss_synchro)); std::string MSM1_2 = rtcm->print_MSM_1(gps_eph, {}, gal_eph, obs_time, pseudoranges2, ref_id, clock_steering_indicator, external_clock_indicator, smooth_int, divergence_free, more_messages); std::string MSM1_bin_2 = rtcm->binary_data_to_bin(MSM1_2); EXPECT_EQ(0, MSM1_bin_2.substr(size_header + size_msg_length + 169, Nsat * Nsig).compare("001010101100")); // check cell mask Gnss_Synchro gnss_synchro6; gnss_synchro6.PRN = 10; gnss_synchro6.System = *gps.c_str(); std::memcpy((void*)gnss_synchro6.Signal, s2.c_str(), 3); gnss_synchro6.Pseudorange_m = 24000000.0; std::map pseudoranges3; pseudoranges3.insert(std::pair(1, gnss_synchro)); pseudoranges3.insert(std::pair(2, gnss_synchro2)); pseudoranges3.insert(std::pair(3, gnss_synchro6)); pseudoranges3.insert(std::pair(4, gnss_synchro4)); pseudoranges3.insert(std::pair(5, gnss_synchro5)); std::string MSM1_3 = rtcm->print_MSM_1(gps_eph, {}, gal_eph, obs_time, pseudoranges3, ref_id, clock_steering_indicator, external_clock_indicator, smooth_int, divergence_free, more_messages); std::string MSM1_bin_3 = rtcm->binary_data_to_bin(MSM1_3); EXPECT_EQ(0, MSM1_bin_3.substr(size_header + size_msg_length + 169, (Nsat-1) * Nsig).compare("001010111")); // check cell mask } TEST(Rtcm_Test, MSM1) { auto rtcm = std::make_shared(); bool expected_true = true; Gps_Ephemeris gps_eph = Gps_Ephemeris(); std::map pseudoranges; Gnss_Synchro gnss_synchro; Gnss_Synchro gnss_synchro2; Gnss_Synchro gnss_synchro3; Gnss_Synchro gnss_synchro4; gnss_synchro.PRN = 2; gnss_synchro2.PRN = 4; gnss_synchro3.PRN = 32; gnss_synchro4.PRN = 4; std::string sys = "G"; std::string sig = "1C"; std::string sig2 = "2S"; gnss_synchro.System = *sys.c_str(); gnss_synchro2.System = *sys.c_str(); gnss_synchro3.System = *sys.c_str(); gnss_synchro4.System = *sys.c_str(); std::memcpy((void*)gnss_synchro.Signal, sig.c_str(), 3); std::memcpy((void*)gnss_synchro2.Signal, sig.c_str(), 3); std::memcpy((void*)gnss_synchro3.Signal, sig2.c_str(), 3); std::memcpy((void*)gnss_synchro4.Signal, sig2.c_str(), 3); gnss_synchro.Pseudorange_m = 20000000.0; gnss_synchro2.Pseudorange_m = 20001010.0; gnss_synchro3.Pseudorange_m = 24002020.0; gnss_synchro4.Pseudorange_m = 20003010.1; pseudoranges.insert(std::pair(1, gnss_synchro)); pseudoranges.insert(std::pair(2, gnss_synchro2)); pseudoranges.insert(std::pair(3, gnss_synchro3)); pseudoranges.insert(std::pair(4, gnss_synchro4)); unsigned short ref_id = 1234; unsigned int clock_steering_indicator = 0; unsigned int external_clock_indicator = 0; int smooth_int = 0; bool divergence_free = false; bool more_messages = false; double obs_time = 25.0; gps_eph.i_satellite_PRN = gnss_synchro.PRN; std::string MSM1 = rtcm->print_MSM_1(gps_eph, {}, {}, obs_time, pseudoranges, ref_id, clock_steering_indicator, external_clock_indicator, smooth_int, divergence_free, more_messages); EXPECT_EQ(expected_true, rtcm->check_CRC(MSM1)); std::string MSM1_bin = rtcm->binary_data_to_bin(MSM1); unsigned int Nsat = 3; unsigned int Nsig = 2; unsigned int size_header = 14; unsigned int size_crc = 24; unsigned int size_msg_length = 10; unsigned int upper_bound = 169 + Nsat * 10 + 43 * Nsig; unsigned int data_size = MSM1_bin.length() - size_header - size_msg_length - size_crc; EXPECT_EQ(expected_true, upper_bound >= data_size); EXPECT_EQ(0, MSM1_bin.substr(0, size_header).compare("11010011000000")); EXPECT_EQ(ref_id, rtcm->bin_to_uint( MSM1_bin.substr(size_header + size_msg_length + 12, 12))); EXPECT_EQ(0, MSM1_bin.substr(size_header + size_msg_length + 169, Nsat * Nsig).compare("101101")); // check cell mask double meters_to_miliseconds = GPS_C_m_s * 0.001; unsigned int rough_range_1 = static_cast(std::floor(std::round(gnss_synchro.Pseudorange_m / meters_to_miliseconds / TWO_N10)) + 0.5) & 0x3FFu; unsigned int rough_range_2 = static_cast(std::floor(std::round(gnss_synchro2.Pseudorange_m / meters_to_miliseconds / TWO_N10)) + 0.5) & 0x3FFu; unsigned int rough_range_4 = static_cast(std::floor(std::round(gnss_synchro3.Pseudorange_m / meters_to_miliseconds / TWO_N10)) + 0.5) & 0x3FFu; unsigned int read_pseudorange_1 = rtcm->bin_to_uint( MSM1_bin.substr(size_header + size_msg_length + 169 + Nsat * Nsig , 10)); unsigned int read_pseudorange_2 = rtcm->bin_to_uint( MSM1_bin.substr(size_header + size_msg_length + 169 + Nsat * Nsig + 10, 10)); unsigned int read_pseudorange_4 = rtcm->bin_to_uint( MSM1_bin.substr(size_header + size_msg_length + 169 + Nsat * Nsig + 20, 10)); EXPECT_EQ(rough_range_1, read_pseudorange_1); EXPECT_EQ(rough_range_2, read_pseudorange_2); EXPECT_EQ(rough_range_4, read_pseudorange_4); int psrng4_s = static_cast(std::round( (gnss_synchro3.Pseudorange_m - std::round(gnss_synchro3.Pseudorange_m / meters_to_miliseconds / TWO_N10) * meters_to_miliseconds * TWO_N10)/ meters_to_miliseconds / TWO_N24)); int read_psrng4_s = rtcm->bin_to_int( MSM1_bin.substr(size_header + size_msg_length + 169 + (Nsat * Nsig) + 30 + 15 * 3, 15)); EXPECT_EQ(psrng4_s, read_psrng4_s); std::map pseudoranges2; pseudoranges2.insert(std::pair(1, gnss_synchro4)); pseudoranges2.insert(std::pair(2, gnss_synchro3)); pseudoranges2.insert(std::pair(3, gnss_synchro2)); pseudoranges2.insert(std::pair(4, gnss_synchro)); std::string MSM1_2 = rtcm->print_MSM_1(gps_eph, {}, {}, obs_time, pseudoranges2, ref_id, clock_steering_indicator, external_clock_indicator, smooth_int, divergence_free, more_messages); std::string MSM1_bin2 = rtcm->binary_data_to_bin(MSM1_2); int read_psrng4_s_2 = rtcm->bin_to_int( MSM1_bin2.substr(size_header + size_msg_length + 169 + (Nsat * Nsig) + 30 + 15 * 3, 15)); EXPECT_EQ(psrng4_s, read_psrng4_s_2); } TEST(Rtcm_Test, InstantiateServer) { auto rtcm = std::make_shared(); rtcm->run_server(); std::string msg("Hello"); rtcm->send_message(msg); std::string test3 = "ff"; std::string test3_bin = rtcm->hex_to_bin(test3); EXPECT_EQ(0, test3_bin.compare("11111111")); rtcm->stop_server(); std::string test6 = "0011"; std::string test6_hex = rtcm->bin_to_hex(test6); EXPECT_EQ(0, test6_hex.compare("3")); long unsigned int expected1 = 42; EXPECT_EQ(expected1, rtcm->bin_to_uint("00101010")); rtcm->run_server(); std::string test4_bin = rtcm->hex_to_bin(test3); std::string s = rtcm->bin_to_binary_data(test4_bin); rtcm->send_message(s); rtcm->stop_server(); EXPECT_EQ(0, test4_bin.compare("11111111")); } TEST(Rtcm_Test, InstantiateServerWithoutClosing) { auto rtcm = std::make_shared(); rtcm->run_server(); std::string msg("Hello"); rtcm->send_message(msg); std::string test3 = "ff"; std::string test3_bin = rtcm->hex_to_bin(test3); EXPECT_EQ(0, test3_bin.compare("11111111")); } gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/resampler/000077500000000000000000000000001305042567700262355ustar00rootroot00000000000000direct_resampler_conditioner_cc_test.cc000066400000000000000000000065051305042567700361200ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/resampler /*! * \file direct_resampler_conditioner_cc_test.cc * \brief Executes a resampler based on some input parameters. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Luis Esteve, 2012. luis(at)epsilon-formacion.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include "gnss_sdr_valve.h" #include "direct_resampler_conditioner_cc.h" TEST(Direct_Resampler_Conditioner_Cc_Test, InstantiationAndRunTest) { double fs_in = 8000000.0; // Input sampling frequency in Hz double fs_out = 4000000.0; // sampling freuqncy of the resampled signal in Hz struct timeval tv; int nsamples = 1000000; //Number of samples to be computed gr::msg_queue::sptr queue = gr::msg_queue::make(0); gr::top_block_sptr top_block = gr::make_top_block("direct_resampler_conditioner_cc_test"); boost::shared_ptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000.0, 1.0, gr_complex(0.0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); long long int begin = 0; long long int end = 0; EXPECT_NO_THROW({ direct_resampler_conditioner_cc_sptr resampler = direct_resampler_make_conditioner_cc(fs_in, fs_out); }) << "Failure in instantiation of direct_resampler_conditioner."; direct_resampler_conditioner_cc_sptr resampler = direct_resampler_make_conditioner_cc(fs_in, fs_out); gr::blocks::null_sink::sptr sink = gr::blocks::null_sink::make(sizeof(gr_complex)); EXPECT_NO_THROW( { top_block->connect(source, 0, valve, 0); top_block->connect(valve, 0, resampler, 0); top_block->connect(resampler, 0, sink, 0); }) << "Connection failure of direct_resampler_conditioner."; EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec *1000000 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec *1000000 + tv.tv_usec; top_block->stop(); }) << "Failure running direct_resampler_conditioner."; std::cout << "Resampled " << nsamples << " samples in " << (end-begin) << " microseconds" << std::endl; } gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/sources/000077500000000000000000000000001305042567700257265ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/sources/file_signal_source_test.cc000066400000000000000000000055001305042567700331300ustar00rootroot00000000000000/*! * \file file_signal_source_test.cc * \brief This class implements a Unit Test for the class FileSignalSource. * \author Carlos Avilés, 2010. carlos.avilesr(at)googlemail.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include "file_signal_source.h" #include "in_memory_configuration.h" TEST(FileSignalSource, Instantiate) { boost::shared_ptr queue = gr::msg_queue::make(0); std::shared_ptr config = std::make_shared(); config->set_property("Test.samples", "0"); config->set_property("Test.sampling_frequency", "0"); std::string path = std::string(TEST_PATH); std::string filename = path + "signal_samples/GPS_L1_CA_ID_1_Fs_4Msps_2ms.dat"; config->set_property("Test.filename", filename); config->set_property("Test.item_type", "gr_complex"); config->set_property("Test.repeat", "false"); std::unique_ptr signal_source(new FileSignalSource(config.get(), "Test", 1, 1, queue)); EXPECT_STREQ("gr_complex", signal_source->item_type().c_str()); EXPECT_TRUE(signal_source->repeat() == false); } TEST(FileSignalSource, InstantiateFileNotExists) { boost::shared_ptr queue = gr::msg_queue::make(0); std::shared_ptr config = std::make_shared(); config->set_property("Test.samples", "0"); config->set_property("Test.sampling_frequency", "0"); config->set_property("Test.filename", "./signal_samples/i_dont_exist.dat"); config->set_property("Test.item_type", "gr_complex"); config->set_property("Test.repeat", "false"); EXPECT_THROW({auto uptr = std::make_shared(config.get(), "Test", 1, 1, queue);}, std::exception); } gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/sources/gnss_sdr_valve_test.cc000066400000000000000000000042741305042567700323220ustar00rootroot00000000000000/*! * \file gnss_sdr_valve_test.cc * \brief This file implements unit tests for the valve custom block. * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Carles Fernandez-Prades, 2012. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include "gnss_sdr_valve.h" TEST(Valve_Test, CheckEventSentAfter100Samples) { gr::msg_queue::sptr queue = gr::msg_queue::make(0); gr::top_block_sptr top_block = gr::make_top_block("gnss_sdr_valve_test"); gr::analog::sig_source_f::sptr source = gr::analog::sig_source_f::make(100, gr::analog::GR_CONST_WAVE, 100, 1, 0); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(float), 100, queue); gr::blocks::null_sink::sptr sink = gr::blocks::null_sink::make(sizeof(float)); unsigned int expected0 = 0; EXPECT_EQ(expected0, queue->count()); top_block->connect(source, 0, valve, 0); top_block->connect(valve, 0, sink, 0); top_block->run(); top_block->stop(); unsigned int expected1 = 1; EXPECT_EQ(expected1, queue->count()); } gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/sources/unpack_2bit_samples_test.cc000066400000000000000000000217721305042567700332320ustar00rootroot00000000000000/*! * \file unpack_2bit_samples_test.cc * \brief This file implements unit tests for the unpack_2bit_samples * custom block * \author Cillian O'Driscoll, 2015. cillian.odriscoll (at) gmail.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include "unpack_2bit_samples.h" std::vector< uint8_t > packData( std::vector< int8_t > const & raw_data, bool big_endian ) { std::vector< uint8_t > packed_data( raw_data.size()/4 ); int shift = ( big_endian ? 6 : 0 ); unsigned int j = 0; for( unsigned int i = 0; i < raw_data.size(); ++i ) { unsigned val = static_cast< unsigned >( (raw_data[i] - 1 )/2 & 0x03 ); packed_data[j] |= val << shift; if( big_endian ) { shift -= 2; if( shift < 0 ) { shift = 6; j++; } } else { shift += 2; if( shift > 6 ) { shift = 0; j++; } } } return packed_data; } TEST(Unpack_2bit_Samples_Test, CheckBigEndianByte) { bool big_endian_bytes = true; size_t item_size = 1; bool big_endian_items = false; std::vector< int8_t > raw_data = { -1, 3, 1, -1, -3, 1, 3, 1 }; std::vector< uint8_t > packed_data = packData( raw_data, big_endian_bytes ); std::vector< uint8_t > unpacked_data; gr::top_block_sptr top_block = gr::make_top_block("unpack_2bit_samples_test"); gr::blocks::vector_source_b::sptr source = gr::blocks::vector_source_b::make( packed_data ); boost::shared_ptr unpacker = make_unpack_2bit_samples(big_endian_bytes, item_size, big_endian_items ); gr::blocks::stream_to_vector::sptr stov = gr::blocks::stream_to_vector::make( item_size, raw_data.size() ); gr::blocks::vector_sink_b::sptr sink = gr::blocks::vector_sink_b::make( raw_data.size() ); top_block->connect(source, 0, unpacker, 0); top_block->connect(unpacker, 0, stov, 0 ); top_block->connect(stov, 0, sink, 0); top_block->run(); top_block->stop(); unpacked_data = sink->data(); EXPECT_EQ( raw_data.size(), unpacked_data.size() ); for( unsigned int i = 0; i < raw_data.size(); ++i ) { EXPECT_EQ( raw_data[i], static_cast< int8_t >( unpacked_data[i] ) ); } } TEST(Unpack_2bit_Samples_Test, CheckLittleEndianByte) { bool big_endian_bytes = false; size_t item_size = 1; bool big_endian_items = false; std::vector< int8_t > raw_data = { -1, 3, 1, -1, -3, 1, 3, 1 }; std::vector< uint8_t > packed_data = packData( raw_data, big_endian_bytes ); std::vector< uint8_t > unpacked_data; gr::top_block_sptr top_block = gr::make_top_block("unpack_2bit_samples_test"); gr::blocks::vector_source_b::sptr source = gr::blocks::vector_source_b::make( packed_data ); boost::shared_ptr unpacker = make_unpack_2bit_samples(big_endian_bytes, item_size, big_endian_items ); gr::blocks::stream_to_vector::sptr stov = gr::blocks::stream_to_vector::make( item_size, raw_data.size() ); gr::blocks::vector_sink_b::sptr sink = gr::blocks::vector_sink_b::make( raw_data.size() ); top_block->connect(source, 0, unpacker, 0); top_block->connect(unpacker, 0, stov, 0 ); top_block->connect(stov, 0, sink, 0); top_block->run(); top_block->stop(); unpacked_data = sink->data(); EXPECT_EQ( raw_data.size(), unpacked_data.size() ); for( unsigned int i = 0; i < raw_data.size(); ++i ) { EXPECT_EQ( raw_data[i], static_cast< int8_t >( unpacked_data[i] ) ); } } TEST(Unpack_2bit_Samples_Test, CheckBigEndianShortBigEndianByte) { bool big_endian_bytes = true; size_t item_size = 2; bool big_endian_items = true; std::vector< int8_t > raw_data = { -1, 3, 1, -1, -3, 1, 3, 1 }; std::vector< uint8_t > packed_data = packData( raw_data, big_endian_bytes ); // change the order of each pair of bytes: for( unsigned int ii = 0; ii < packed_data.size(); ii+=item_size ) { unsigned int kk = ii + item_size - 1; unsigned int jj = ii; while( kk > jj ) { uint8_t tmp = packed_data[jj]; packed_data[jj] = packed_data[kk]; packed_data[kk] = tmp; --kk; ++jj; } } // Now create a new big endian buffer: std::vector< int16_t > packed_data_short( reinterpret_cast< int16_t *>( &packed_data[0] ), reinterpret_cast< int16_t * >( &packed_data[0] ) + packed_data.size()/item_size); std::vector< uint8_t > unpacked_data; gr::top_block_sptr top_block = gr::make_top_block("unpack_2bit_samples_test"); gr::blocks::vector_source_s::sptr source = gr::blocks::vector_source_s::make( packed_data_short ); boost::shared_ptr unpacker = make_unpack_2bit_samples(big_endian_bytes, item_size, big_endian_items ); gr::blocks::stream_to_vector::sptr stov = gr::blocks::stream_to_vector::make( 1, raw_data.size() ); gr::blocks::vector_sink_b::sptr sink = gr::blocks::vector_sink_b::make( raw_data.size() ); top_block->connect(source, 0, unpacker, 0); top_block->connect(unpacker, 0, stov, 0 ); top_block->connect(stov, 0, sink, 0); top_block->run(); top_block->stop(); unpacked_data = sink->data(); EXPECT_EQ( raw_data.size(), unpacked_data.size() ); for( unsigned int i = 0; i < raw_data.size(); ++i ) { EXPECT_EQ( raw_data[i], static_cast< int8_t >( unpacked_data[i] ) ); } } TEST(Unpack_2bit_Samples_Test, CheckBigEndianShortLittleEndianByte) { bool big_endian_bytes = false; size_t item_size = 2; bool big_endian_items = true; std::vector< int8_t > raw_data = { -1, 3, 1, -1, -3, 1, 3, 1 }; std::vector< uint8_t > packed_data = packData( raw_data, big_endian_bytes ); // change the order of each pair of bytes: for( unsigned int ii = 0; ii < packed_data.size(); ii+=item_size ) { unsigned int kk = ii + item_size - 1; unsigned int jj = ii; while( kk > jj ) { uint8_t tmp = packed_data[jj]; packed_data[jj] = packed_data[kk]; packed_data[kk] = tmp; --kk; ++jj; } } // Now create a new big endian buffer: std::vector< int16_t > packed_data_short( reinterpret_cast< int16_t *>( &packed_data[0] ), reinterpret_cast< int16_t * >( &packed_data[0] ) + packed_data.size()/item_size); std::vector< uint8_t > unpacked_data; gr::top_block_sptr top_block = gr::make_top_block("unpack_2bit_samples_test"); gr::blocks::vector_source_s::sptr source = gr::blocks::vector_source_s::make( packed_data_short ); boost::shared_ptr unpacker = make_unpack_2bit_samples(big_endian_bytes, item_size, big_endian_items ); gr::blocks::stream_to_vector::sptr stov = gr::blocks::stream_to_vector::make( 1, raw_data.size() ); gr::blocks::vector_sink_b::sptr sink = gr::blocks::vector_sink_b::make( raw_data.size() ); top_block->connect(source, 0, unpacker, 0); top_block->connect(unpacker, 0, stov, 0 ); top_block->connect(stov, 0, sink, 0); top_block->run(); top_block->stop(); unpacked_data = sink->data(); EXPECT_EQ( raw_data.size(), unpacked_data.size() ); for( unsigned int i = 0; i < raw_data.size(); ++i ) { EXPECT_EQ( raw_data[i], static_cast< int8_t >( unpacked_data[i] ) ); } } gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/telemetry_decoder/000077500000000000000000000000001305042567700277425ustar00rootroot00000000000000gps_l1_ca_telemetry_decoder_test.cc000066400000000000000000000411321305042567700366410ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/telemetry_decoder/*! * \file gps_l1_ca_dll_pll_tracking_test.cc * \brief This class implements a tracking test for Galileo_E5a_DLL_PLL_Tracking * implementation based on some input parameters. * \author Javier Arribas, 2015. jarribas(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2012-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "GPS_L1_CA.h" #include "gnss_block_factory.h" #include "gnss_block_interface.h" #include "tracking_interface.h" #include "telemetry_decoder_interface.h" #include "in_memory_configuration.h" #include "gnss_synchro.h" #include "gps_l1_ca_telemetry_decoder.h" #include "tracking_true_obs_reader.h" #include "tracking_dump_reader.h" #include "tlm_dump_reader.h" #include "gps_l1_ca_dll_pll_tracking.h" #include "gps_l1_ca_dll_pll_c_aid_tracking.h" #include "signal_generator_flags.h" // ######## GNURADIO BLOCK MESSAGE RECEVER FOR TRACKING MESSAGES ######### class GpsL1CADllPllTelemetryDecoderTest_msg_rx; typedef boost::shared_ptr GpsL1CADllPllTelemetryDecoderTest_msg_rx_sptr; GpsL1CADllPllTelemetryDecoderTest_msg_rx_sptr GpsL1CADllPllTelemetryDecoderTest_msg_rx_make(); class GpsL1CADllPllTelemetryDecoderTest_msg_rx : public gr::block { private: friend GpsL1CADllPllTelemetryDecoderTest_msg_rx_sptr GpsL1CADllPllTelemetryDecoderTest_msg_rx_make(); void msg_handler_events(pmt::pmt_t msg); GpsL1CADllPllTelemetryDecoderTest_msg_rx(); public: int rx_message; ~GpsL1CADllPllTelemetryDecoderTest_msg_rx(); //!< Default destructor }; GpsL1CADllPllTelemetryDecoderTest_msg_rx_sptr GpsL1CADllPllTelemetryDecoderTest_msg_rx_make() { return GpsL1CADllPllTelemetryDecoderTest_msg_rx_sptr(new GpsL1CADllPllTelemetryDecoderTest_msg_rx()); } void GpsL1CADllPllTelemetryDecoderTest_msg_rx::msg_handler_events(pmt::pmt_t msg) { try { long int message = pmt::to_long(msg); rx_message = message; } catch(boost::bad_any_cast& e) { LOG(WARNING) << "msg_handler_telemetry Bad any cast!"; rx_message = 0; } } GpsL1CADllPllTelemetryDecoderTest_msg_rx::GpsL1CADllPllTelemetryDecoderTest_msg_rx() : gr::block("GpsL1CADllPllTelemetryDecoderTest_msg_rx", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)) { this->message_port_register_in(pmt::mp("events")); this->set_msg_handler(pmt::mp("events"), boost::bind(&GpsL1CADllPllTelemetryDecoderTest_msg_rx::msg_handler_events, this, _1)); rx_message = 0; } GpsL1CADllPllTelemetryDecoderTest_msg_rx::~GpsL1CADllPllTelemetryDecoderTest_msg_rx() {} // ########################################################### // ######## GNURADIO BLOCK MESSAGE RECEVER FOR TLM MESSAGES ######### class GpsL1CADllPllTelemetryDecoderTest_tlm_msg_rx; typedef boost::shared_ptr GpsL1CADllPllTelemetryDecoderTest_tlm_msg_rx_sptr; GpsL1CADllPllTelemetryDecoderTest_tlm_msg_rx_sptr GpsL1CADllPllTelemetryDecoderTest_tlm_msg_rx_make(); class GpsL1CADllPllTelemetryDecoderTest_tlm_msg_rx : public gr::block { private: friend GpsL1CADllPllTelemetryDecoderTest_tlm_msg_rx_sptr GpsL1CADllPllTelemetryDecoderTest_tlm_msg_rx_make(); void msg_handler_events(pmt::pmt_t msg); GpsL1CADllPllTelemetryDecoderTest_tlm_msg_rx(); public: int rx_message; ~GpsL1CADllPllTelemetryDecoderTest_tlm_msg_rx(); //!< Default destructor }; GpsL1CADllPllTelemetryDecoderTest_tlm_msg_rx_sptr GpsL1CADllPllTelemetryDecoderTest_tlm_msg_rx_make() { return GpsL1CADllPllTelemetryDecoderTest_tlm_msg_rx_sptr(new GpsL1CADllPllTelemetryDecoderTest_tlm_msg_rx()); } void GpsL1CADllPllTelemetryDecoderTest_tlm_msg_rx::msg_handler_events(pmt::pmt_t msg) { try { long int message = pmt::to_long(msg); rx_message = message; } catch(boost::bad_any_cast& e) { LOG(WARNING) << "msg_handler_telemetry Bad any cast!"; rx_message = 0; } } GpsL1CADllPllTelemetryDecoderTest_tlm_msg_rx::GpsL1CADllPllTelemetryDecoderTest_tlm_msg_rx() : gr::block("GpsL1CADllPllTelemetryDecoderTest_tlm_msg_rx", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)) { this->message_port_register_in(pmt::mp("events")); this->set_msg_handler(pmt::mp("events"), boost::bind(&GpsL1CADllPllTelemetryDecoderTest_tlm_msg_rx::msg_handler_events, this, _1)); rx_message = 0; } GpsL1CADllPllTelemetryDecoderTest_tlm_msg_rx::~GpsL1CADllPllTelemetryDecoderTest_tlm_msg_rx() {} // ########################################################### class GpsL1CATelemetryDecoderTest: public ::testing::Test { public: std::string generator_binary; std::string p1; std::string p2; std::string p3; std::string p4; std::string p5; const int baseband_sampling_freq = FLAGS_fs_gen_hz; std::string filename_rinex_obs = FLAGS_filename_rinex_obs; std::string filename_raw_data = FLAGS_filename_raw_data; int configure_generator(); int generate_signal(); void check_results(arma::vec true_time_s, arma::vec true_value, arma::vec meas_time_s, arma::vec meas_value); GpsL1CATelemetryDecoderTest() { factory = std::make_shared(); config = std::make_shared(); item_size = sizeof(gr_complex); gnss_synchro = Gnss_Synchro(); } ~GpsL1CATelemetryDecoderTest() {} void configure_receiver(); gr::top_block_sptr top_block; std::shared_ptr factory; std::shared_ptr config; Gnss_Synchro gnss_synchro; size_t item_size; }; int GpsL1CATelemetryDecoderTest::configure_generator() { // Configure signal generator generator_binary = FLAGS_generator_binary; p1 = std::string("-rinex_nav_file=") + FLAGS_rinex_nav_file; if(FLAGS_dynamic_position.empty()) { p2 = std::string("-static_position=") + FLAGS_static_position + std::string(",") + std::to_string(FLAGS_duration * 10); } else { p2 = std::string("-obs_pos_file=") + std::string(FLAGS_dynamic_position); } p3 = std::string("-rinex_obs_file=") + FLAGS_filename_rinex_obs; // RINEX 2.10 observation file output p4 = std::string("-sig_out_file=") + FLAGS_filename_raw_data; // Baseband signal output file. Will be stored in int8_t IQ multiplexed samples p5 = std::string("-sampling_freq=") + std::to_string(baseband_sampling_freq); //Baseband sampling frequency [MSps] return 0; } int GpsL1CATelemetryDecoderTest::generate_signal() { int child_status; char *const parmList[] = { &generator_binary[0], &generator_binary[0], &p1[0], &p2[0], &p3[0], &p4[0], &p5[0], NULL }; int pid; if ((pid = fork()) == -1) perror("fork err"); else if (pid == 0) { execv(&generator_binary[0], parmList); std::cout << "Return not expected. Must be an execv err." << std::endl; std::terminate(); } waitpid(pid, &child_status, 0); std::cout << "Signal and Observables RINEX and RAW files created." << std::endl; return 0; } void GpsL1CATelemetryDecoderTest::configure_receiver() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'G'; std::string signal = "1C"; signal.copy(gnss_synchro.Signal, 2, 0); gnss_synchro.PRN = FLAGS_test_satellite_PRN; config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(baseband_sampling_freq)); // Set Tracking config->set_property("Tracking_1C.item_type", "gr_complex"); config->set_property("Tracking_1C.if", "0"); config->set_property("Tracking_1C.dump", "true"); config->set_property("Tracking_1C.dump_filename", "./tracking_ch_"); config->set_property("Tracking_1C.pll_bw_hz", "20.0"); config->set_property("Tracking_1C.dll_bw_hz", "1.5"); config->set_property("Tracking_1C.early_late_space_chips", "0.5"); config->set_property("TelemetryDecoder_1C.dump","true"); config->set_property("TelemetryDecoder_1C.decimation_factor","1"); } void GpsL1CATelemetryDecoderTest::check_results(arma::vec true_time_s, arma::vec true_value, arma::vec meas_time_s, arma::vec meas_value) { //1. True value interpolation to match the measurement times arma::vec true_value_interp; arma::interp1(true_time_s, true_value, meas_time_s, true_value_interp); //2. RMSE arma::vec err; err = meas_value - true_value_interp; arma::vec err2 = arma::square(err); double rmse = sqrt(arma::mean(err2)); //3. Mean err and variance double error_mean = arma::mean(err); double error_var = arma::var(err); // 4. Peaks double max_error = arma::max(err); double min_error = arma::min(err); //5. report std::cout << std::setprecision(10) << "TLM TOW RMSE=" << rmse << ", mean=" << error_mean << ", stdev=" << sqrt(error_var) << " (max,min)=" << max_error << "," << min_error << " [Chips]" << std::endl; } TEST_F(GpsL1CATelemetryDecoderTest, ValidationOfResults) { // Configure the signal generator configure_generator(); // Generate signal raw signal samples and observations RINEX file generate_signal(); struct timeval tv; long long int begin = 0; long long int end = 0; configure_receiver(); //open true observables log file written by the simulator tracking_true_obs_reader true_obs_data; int test_satellite_PRN = FLAGS_test_satellite_PRN; std::cout << "Testing satellite PRN=" << test_satellite_PRN << std::endl; std::string true_obs_file = std::string("./gps_l1_ca_obs_prn"); true_obs_file.append(std::to_string(test_satellite_PRN)); true_obs_file.append(".dat"); ASSERT_NO_THROW({ if (true_obs_data.open_obs_file(true_obs_file) == false) { throw std::exception(); }; }) << "Failure opening true observables file" << std::endl; top_block = gr::make_top_block("Telemetry_Decoder test"); std::shared_ptr tracking = std::make_shared(config.get(), "Tracking_1C", 1, 1); //std::shared_ptr tracking = std::make_shared(config.get(), "Tracking_1C", 1, 1); boost::shared_ptr msg_rx = GpsL1CADllPllTelemetryDecoderTest_msg_rx_make(); // load acquisition data based on the first epoch of the true observations ASSERT_NO_THROW({ if (true_obs_data.read_binary_obs() == false) { throw std::exception(); }; })<< "Failure reading true observables file" << std::endl; //restart the epoch counter true_obs_data.restart(); std::cout << "Initial Doppler [Hz]=" << true_obs_data.doppler_l1_hz << " Initial code delay [Chips]=" << true_obs_data.prn_delay_chips << std::endl; gnss_synchro.Acq_delay_samples = (GPS_L1_CA_CODE_LENGTH_CHIPS - true_obs_data.prn_delay_chips / GPS_L1_CA_CODE_LENGTH_CHIPS) * baseband_sampling_freq * GPS_L1_CA_CODE_PERIOD; gnss_synchro.Acq_doppler_hz = true_obs_data.doppler_l1_hz; gnss_synchro.Acq_samplestamp_samples = 0; std::shared_ptr tlm(new GpsL1CaTelemetryDecoder(config.get(), "TelemetryDecoder_1C",1, 1)); tlm->set_channel(0); boost::shared_ptr tlm_msg_rx = GpsL1CADllPllTelemetryDecoderTest_tlm_msg_rx_make(); ASSERT_NO_THROW( { tracking->set_channel(gnss_synchro.Channel_ID); }) << "Failure setting channel." << std::endl; ASSERT_NO_THROW( { tracking->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro." << std::endl; ASSERT_NO_THROW( { tracking->connect(top_block); }) << "Failure connecting tracking to the top_block." << std::endl; ASSERT_NO_THROW( { std::string file = "./" + filename_raw_data; const char * file_name = file.c_str(); gr::blocks::file_source::sptr file_source = gr::blocks::file_source::make(sizeof(int8_t), file_name, false); gr::blocks::interleaved_char_to_complex::sptr gr_interleaved_char_to_complex = gr::blocks::interleaved_char_to_complex::make(); gr::blocks::null_sink::sptr sink = gr::blocks::null_sink::make(sizeof(Gnss_Synchro)); top_block->connect(file_source, 0, gr_interleaved_char_to_complex, 0); top_block->connect(gr_interleaved_char_to_complex, 0, tracking->get_left_block(), 0); top_block->connect(tracking->get_right_block(), 0, tlm->get_left_block(), 0); top_block->connect(tlm->get_right_block(), 0, sink, 0); top_block->msg_connect(tracking->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks." << std::endl; tracking->start_tracking(); EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec * 1000000 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec * 1000000 + tv.tv_usec; }) << "Failure running the top_block." << std::endl; //check results //load the true values long int nepoch = true_obs_data.num_epochs(); std::cout << "True observation epochs=" << nepoch << std::endl; arma::vec true_timestamp_s = arma::zeros(nepoch, 1); arma::vec true_acc_carrier_phase_cycles = arma::zeros(nepoch, 1); arma::vec true_Doppler_Hz = arma::zeros(nepoch, 1); arma::vec true_prn_delay_chips = arma::zeros(nepoch, 1); arma::vec true_tow_s = arma::zeros(nepoch, 1); long int epoch_counter = 0; while(true_obs_data.read_binary_obs()) { true_timestamp_s(epoch_counter) = true_obs_data.signal_timestamp_s; true_acc_carrier_phase_cycles(epoch_counter) = true_obs_data.acc_carrier_phase_cycles; true_Doppler_Hz(epoch_counter) = true_obs_data.doppler_l1_hz; true_prn_delay_chips(epoch_counter) = true_obs_data.prn_delay_chips; true_tow_s(epoch_counter) = true_obs_data.tow; epoch_counter++; } //load the measured values tlm_dump_reader tlm_dump; ASSERT_NO_THROW({ if (tlm_dump.open_obs_file(std::string("./telemetry0.dat")) == false) { throw std::exception(); }; }) << "Failure opening telemetry dump file" << std::endl; nepoch = tlm_dump.num_epochs(); std::cout << "Measured observation epochs=" << nepoch << std::endl; arma::vec tlm_timestamp_s = arma::zeros(nepoch, 1); arma::vec tlm_TOW_at_Preamble = arma::zeros(nepoch, 1); arma::vec tlm_tow_s = arma::zeros(nepoch, 1); epoch_counter = 0; while(tlm_dump.read_binary_obs()) { tlm_timestamp_s(epoch_counter) = tlm_dump.Prn_timestamp_ms / 1000.0; tlm_TOW_at_Preamble(epoch_counter) = tlm_dump.d_TOW_at_Preamble; tlm_tow_s(epoch_counter) = tlm_dump.TOW_at_current_symbol; epoch_counter++; } //Cut measurement initial transitory of the measurements arma::uvec initial_meas_point = arma::find(tlm_tow_s >= true_tow_s(0), 1, "first"); tlm_timestamp_s = tlm_timestamp_s.subvec(initial_meas_point(0), tlm_timestamp_s.size() - 1); tlm_tow_s = tlm_tow_s.subvec(initial_meas_point(0), tlm_tow_s.size() - 1); check_results(true_timestamp_s, true_tow_s, tlm_timestamp_s, tlm_tow_s); std::cout << "Test completed in " << (end - begin) << " microseconds" << std::endl; } gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/tracking/000077500000000000000000000000001305042567700260455ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/tracking/cpu_multicorrelator_test.cc000066400000000000000000000160321305042567700335130ustar00rootroot00000000000000/*! * \file fft_length_test.cc * \brief This file implements timing tests for the FFT. * \author Carles Fernandez-Prades, 2016. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2016 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include "cpu_multicorrelator.h" #include "gps_sdr_signal_processing.h" #include "GPS_L1_CA.h" DEFINE_int32(cpu_multicorrelator_iterations_test, 1000, "Number of averaged iterations in CPU multicorrelator test timing test"); DEFINE_int32(cpu_multicorrelator_max_threads_test, 12, "Number of maximum concurrent correlators in CPU multicorrelator test timing test"); void run_correlator_cpu(cpu_multicorrelator* correlator, float d_rem_carrier_phase_rad, float d_carrier_phase_step_rad, float d_code_phase_step_chips, float d_rem_code_phase_chips, int correlation_size) { for(int k = 0; k < FLAGS_cpu_multicorrelator_iterations_test; k++) { correlator->Carrier_wipeoff_multicorrelator_resampler(d_rem_carrier_phase_rad, d_carrier_phase_step_rad, d_code_phase_step_chips, d_rem_code_phase_chips, correlation_size); } } TEST(CPU_multicorrelator_test, MeasureExecutionTime) { struct timeval tv; int max_threads=FLAGS_cpu_multicorrelator_max_threads_test; std::vector thread_pool; cpu_multicorrelator* correlator_pool[max_threads]; unsigned int correlation_sizes [3] = { 2048, 4096, 8192}; double execution_times [3]; gr_complex* d_ca_code; gr_complex* in_cpu; gr_complex* d_correlator_outs; int d_n_correlator_taps=3; int d_vector_length=correlation_sizes[2]; //max correlation size to allocate all the necessary memory float* d_local_code_shift_chips; //allocate host memory // Get space for a vector with the C/A code replica sampled 1x/chip d_ca_code = static_cast(volk_gnsssdr_malloc(static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS) * sizeof(gr_complex), volk_gnsssdr_get_alignment())); in_cpu = static_cast(volk_gnsssdr_malloc(2 * d_vector_length * sizeof(gr_complex), volk_gnsssdr_get_alignment())); // correlator outputs (scalar) d_n_correlator_taps = 3; // Early, Prompt, and Late d_correlator_outs = static_cast(volk_gnsssdr_malloc(d_n_correlator_taps*sizeof(gr_complex), volk_gnsssdr_get_alignment())); for (int n = 0; n < d_n_correlator_taps; n++) { d_correlator_outs[n] = gr_complex(0,0); } d_local_code_shift_chips = static_cast(volk_gnsssdr_malloc(d_n_correlator_taps*sizeof(float), volk_gnsssdr_get_alignment())); // Set TAPs delay values [chips] float d_early_late_spc_chips=0.5; d_local_code_shift_chips[0] = - d_early_late_spc_chips; d_local_code_shift_chips[1] = 0.0; d_local_code_shift_chips[2] = d_early_late_spc_chips; //--- Perform initializations ------------------------------ //local code resampler on GPU // generate local reference (1 sample per chip) gps_l1_ca_code_gen_complex(d_ca_code, 1, 0); // generate inut signal for (int n=0;n<2*d_vector_length;n++) { in_cpu[n]=std::complex(static_cast (rand())/static_cast(RAND_MAX),static_cast (rand())/static_cast(RAND_MAX)); } for (int n=0;ninit(d_vector_length, d_n_correlator_taps); correlator_pool[n]->set_input_output_vectors(d_correlator_outs, in_cpu); correlator_pool[n]->set_local_code_and_taps(static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS), d_ca_code, d_local_code_shift_chips); } float d_rem_carrier_phase_rad=0.0; float d_carrier_phase_step_rad=0.1; float d_code_phase_step_chips=0.3; float d_rem_code_phase_chips=0.4; EXPECT_NO_THROW( for(int correlation_sizes_idx = 0; correlation_sizes_idx < 3; correlation_sizes_idx++) { for(int current_max_threads=1; current_max_threads<(max_threads+1); current_max_threads++) { std::cout<<"Running "<(end - begin) / (1000000.0 * static_cast(FLAGS_cpu_multicorrelator_iterations_test)); std::cout << "CPU Multicorrelator execution time for length=" << correlation_sizes[correlation_sizes_idx] << " : " << execution_times[correlation_sizes_idx] << " [s]" << std::endl; } } ); volk_gnsssdr_free(d_local_code_shift_chips); volk_gnsssdr_free(d_correlator_outs); volk_gnsssdr_free(d_ca_code); volk_gnsssdr_free(in_cpu); for (int n=0;nfree(); } } galileo_e1_dll_pll_veml_tracking_test.cc000066400000000000000000000203611305042567700357460ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/tracking/*! * \file galileo_e1_dll_pll_veml_tracking_test.cc * \brief This class implements a tracking test for GalileoE1DllPllVemlTracking * class based on some input parameters. * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2012-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include #include "gnss_block_factory.h" #include "gnss_block_interface.h" #include "in_memory_configuration.h" #include "gnss_sdr_valve.h" #include "gnss_synchro.h" #include "galileo_e1_dll_pll_veml_tracking.h" class GalileoE1DllPllVemlTrackingInternalTest: public ::testing::Test { protected: GalileoE1DllPllVemlTrackingInternalTest() { factory = std::make_shared(); config = std::make_shared(); item_size = sizeof(gr_complex); stop = false; message = 0; gnss_synchro = Gnss_Synchro(); } ~GalileoE1DllPllVemlTrackingInternalTest() {} void init(); gr::msg_queue::sptr queue; gr::top_block_sptr top_block; std::shared_ptr factory; std::shared_ptr config; Gnss_Synchro gnss_synchro; size_t item_size; bool stop; int message; }; void GalileoE1DllPllVemlTrackingInternalTest::init() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'E'; std::string signal = "1B"; signal.copy(gnss_synchro.Signal, 2, 0); gnss_synchro.PRN = 11; config->set_property("GNSS-SDR.internal_fs_hz", "8000000"); config->set_property("Tracking_Galileo.item_type", "gr_complex"); config->set_property("Tracking_Galileo.dump", "false"); config->set_property("Tracking_Galileo.dump_filename", "../data/veml_tracking_ch_"); config->set_property("Tracking_Galileo.implementation", "Galileo_E1_DLL_PLL_VEML_Tracking"); config->set_property("Tracking_Galileo.early_late_space_chips", "0.15"); config->set_property("Tracking_Galileo.very_early_late_space_chips", "0.6"); config->set_property("Tracking_Galileo.pll_bw_hz", "30.0"); config->set_property("Tracking_Galileo.dll_bw_hz", "2.0"); } TEST_F(GalileoE1DllPllVemlTrackingInternalTest, Instantiate) { init(); auto tracking = factory->GetBlock(config, "Tracking", "Galileo_E1_DLL_PLL_VEML_Tracking", 1, 1); EXPECT_STREQ("Galileo_E1_DLL_PLL_VEML_Tracking", tracking->implementation().c_str()); } TEST_F(GalileoE1DllPllVemlTrackingInternalTest, ConnectAndRun) { int fs_in = 8000000; int nsamples = 40000000; struct timeval tv; long long int begin = 0; long long int end = 0; init(); queue = gr::msg_queue::make(0); top_block = gr::make_top_block("Tracking test"); // Example using smart pointers and the block factory std::shared_ptr trk_ = factory->GetBlock(config, "Tracking", "Galileo_E1_DLL_PLL_VEML_Tracking", 1, 1); std::shared_ptr tracking = std::dynamic_pointer_cast(trk_); ASSERT_NO_THROW( { tracking->set_channel(gnss_synchro.Channel_ID); }) << "Failure setting channel." << std::endl; ASSERT_NO_THROW( { tracking->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro." << std::endl; ASSERT_NO_THROW( { tracking->connect(top_block); gr::analog::sig_source_c::sptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000, 1, gr_complex(0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); gr::blocks::null_sink::sptr sink = gr::blocks::null_sink::make(sizeof(Gnss_Synchro)); top_block->connect(source, 0, valve, 0); top_block->connect(valve, 0, tracking->get_left_block(), 0); top_block->connect(tracking->get_right_block(), 0, sink, 0); }) << "Failure connecting the blocks of tracking test." << std::endl; tracking->start_tracking(); EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec *1000000 + tv.tv_usec; top_block->run(); //Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec *1000000 + tv.tv_usec; }) << "Failure running the top_block." << std::endl; std::cout << "Processed " << nsamples << " samples in " << (end - begin) << " microseconds" << std::endl; } TEST_F(GalileoE1DllPllVemlTrackingInternalTest, ValidationOfResults) { struct timeval tv; long long int begin = 0; long long int end = 0; // int num_samples = 40000000; // 4 Msps // unsigned int skiphead_sps = 24000000; // 4 Msps int num_samples = 80000000; // 8 Msps unsigned int skiphead_sps = 8000000; // 8 Msps init(); queue = gr::msg_queue::make(0); top_block = gr::make_top_block("Tracking test"); // Example using smart pointers and the block factory std::shared_ptr trk_ = factory->GetBlock(config, "Tracking", "Galileo_E1_DLL_PLL_VEML_Tracking", 1, 1); std::shared_ptr tracking = std::dynamic_pointer_cast(trk_); // gnss_synchro.Acq_delay_samples = 1753; // 4 Msps // gnss_synchro.Acq_doppler_hz = -9500; // 4 Msps gnss_synchro.Acq_delay_samples = 17256; // 8 Msps gnss_synchro.Acq_doppler_hz = -8750; // 8 Msps gnss_synchro.Acq_samplestamp_samples = 0; ASSERT_NO_THROW( { tracking->set_channel(gnss_synchro.Channel_ID); }) << "Failure setting channel." << std::endl; ASSERT_NO_THROW( { tracking->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro." << std::endl; ASSERT_NO_THROW( { tracking->connect(top_block); }) << "Failure connecting tracking to the top_block." << std::endl; ASSERT_NO_THROW( { std::string path = std::string(TEST_PATH); std::string file = path + "signal_samples/GSoC_CTTC_capture_2012_07_26_4Msps_4ms.dat"; const char * file_name = file.c_str(); gr::blocks::file_source::sptr file_source = gr::blocks::file_source::make(sizeof(gr_complex),file_name,false); gr::blocks::skiphead::sptr skip_head = gr::blocks::skiphead::make(sizeof(gr_complex), skiphead_sps); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), num_samples, queue); gr::blocks::null_sink::sptr sink = gr::blocks::null_sink::make(sizeof(Gnss_Synchro)); top_block->connect(file_source, 0, skip_head, 0); top_block->connect(skip_head, 0, valve, 0); top_block->connect(valve, 0, tracking->get_left_block(), 0); top_block->connect(tracking->get_right_block(), 0, sink, 0); }) << "Failure connecting the blocks of tracking test." << std::endl; tracking->start_tracking(); EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec *1000000 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec *1000000 + tv.tv_usec; }) << "Failure running the top_block." << std::endl; std::cout << "Tracked " << num_samples << " samples in " << (end - begin) << " microseconds" << std::endl; } gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e5a_tracking_test.cc000066400000000000000000000132071305042567700334460ustar00rootroot00000000000000/*! * \file galileo_e1_dll_pll_veml_tracking_test.cc * \brief This class implements a tracking test for Galileo_E5a_DLL_PLL_Tracking * implementation based on some input parameters. * \author Marc Sales, 2014. marcsales92(at)gmail.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2012-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include "gnss_block_factory.h" #include "gnss_block_interface.h" #include "in_memory_configuration.h" #include "gnss_sdr_valve.h" #include "gnss_synchro.h" #include "galileo_e5a_dll_pll_tracking.h" class GalileoE5aTrackingTest: public ::testing::Test { protected: GalileoE5aTrackingTest() { factory = std::make_shared(); config = std::make_shared(); item_size = sizeof(gr_complex); stop = false; message = 0; gnss_synchro = Gnss_Synchro(); } ~GalileoE5aTrackingTest() {} void init(); gr::msg_queue::sptr queue; gr::top_block_sptr top_block; std::shared_ptr factory; std::shared_ptr config; Gnss_Synchro gnss_synchro; size_t item_size; bool stop; int message; }; void GalileoE5aTrackingTest::init() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'E'; std::string signal = "5Q"; signal.copy(gnss_synchro.Signal, 2, 0); gnss_synchro.PRN = 11; config->set_property("GNSS-SDR.internal_fs_hz", "32000000"); config->set_property("Tracking_Galileo.item_type", "gr_complex"); config->set_property("Tracking_Galileo.dump", "false"); config->set_property("Tracking_Galileo.dump_filename", "../data/e5a_tracking_ch_"); config->set_property("Tracking_Galileo.implementation", "Galileo_E5a_DLL_PLL_Tracking"); config->set_property("Tracking_Galileo.early_late_space_chips", "0.5"); config->set_property("Tracking_Galileo.order", "2"); config->set_property("Tracking_Galileo.pll_bw_hz_init","20.0"); config->set_property("Tracking_Galileo.pll_bw_hz", "5"); config->set_property("Tracking_Galileo.dll_bw_hz_init","2.0"); config->set_property("Tracking_Galileo.dll_bw_hz", "2"); config->set_property("Tracking_Galileo.ti_ms", "1"); } TEST_F(GalileoE5aTrackingTest, ValidationOfResults) { struct timeval tv; long long int begin = 0; long long int end = 0; int fs_in = 32000000; int nsamples = 32000000*5; init(); queue = gr::msg_queue::make(0); top_block = gr::make_top_block("Tracking test"); // Example using smart pointers and the block factory std::shared_ptr trk_ = factory->GetBlock(config, "Tracking", "Galileo_E5a_DLL_PLL_Tracking", 1, 1); std::shared_ptr tracking = std::dynamic_pointer_cast(trk_); //REAL gnss_synchro.Acq_delay_samples = 10; // 32 Msps // gnss_synchro.Acq_doppler_hz = 3500; // 32 Msps gnss_synchro.Acq_doppler_hz = 2000; // 500 Hz resolution // gnss_synchro.Acq_samplestamp_samples = 98000; gnss_synchro.Acq_samplestamp_samples = 0; ASSERT_NO_THROW( { tracking->set_channel(gnss_synchro.Channel_ID); }) << "Failure setting channel." << std::endl; ASSERT_NO_THROW( { tracking->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro." << std::endl; ASSERT_NO_THROW( { tracking->connect(top_block); }) << "Failure connecting tracking to the top_block." << std::endl; ASSERT_NO_THROW( { gr::analog::sig_source_c::sptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000, 1, gr_complex(0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); gr::blocks::null_sink::sptr sink = gr::blocks::null_sink::make(sizeof(Gnss_Synchro)); top_block->connect(source, 0, valve, 0); top_block->connect(valve, 0, tracking->get_left_block(), 0); top_block->connect(tracking->get_right_block(), 0, sink, 0); }) << "Failure connecting the blocks of tracking test." << std::endl; tracking->start_tracking(); EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec *1000000 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec *1000000 + tv.tv_usec; }) << "Failure running the top_block." << std::endl; std::cout << "Tracked " << nsamples << " samples in " << (end - begin) << " microseconds" << std::endl; } gps_l1_ca_dll_pll_tracking_test.cc000066400000000000000000000424361305042567700345610ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/tracking/*! * \file gps_l1_ca_dll_pll_tracking_test.cc * \brief This class implements a tracking test for Galileo_E5a_DLL_PLL_Tracking * implementation based on some input parameters. * \author Javier Arribas, 2017. jarribas(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2012-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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "GPS_L1_CA.h" #include "gnss_block_factory.h" #include "gnss_block_interface.h" #include "tracking_interface.h" #include "in_memory_configuration.h" #include "gnss_synchro.h" #include "gps_l1_ca_dll_pll_tracking.h" #include "tracking_true_obs_reader.h" #include "tracking_dump_reader.h" #include "signal_generator_flags.h" // ######## GNURADIO BLOCK MESSAGE RECEVER ######### class GpsL1CADllPllTrackingTest_msg_rx; typedef boost::shared_ptr GpsL1CADllPllTrackingTest_msg_rx_sptr; GpsL1CADllPllTrackingTest_msg_rx_sptr GpsL1CADllPllTrackingTest_msg_rx_make(); class GpsL1CADllPllTrackingTest_msg_rx : public gr::block { private: friend GpsL1CADllPllTrackingTest_msg_rx_sptr GpsL1CADllPllTrackingTest_msg_rx_make(); void msg_handler_events(pmt::pmt_t msg); GpsL1CADllPllTrackingTest_msg_rx(); public: int rx_message; ~GpsL1CADllPllTrackingTest_msg_rx(); //!< Default destructor }; GpsL1CADllPllTrackingTest_msg_rx_sptr GpsL1CADllPllTrackingTest_msg_rx_make() { return GpsL1CADllPllTrackingTest_msg_rx_sptr(new GpsL1CADllPllTrackingTest_msg_rx()); } void GpsL1CADllPllTrackingTest_msg_rx::msg_handler_events(pmt::pmt_t msg) { try { long int message = pmt::to_long(msg); rx_message = message; } catch(boost::bad_any_cast& e) { LOG(WARNING) << "msg_handler_telemetry Bad any cast!"; rx_message = 0; } } GpsL1CADllPllTrackingTest_msg_rx::GpsL1CADllPllTrackingTest_msg_rx() : gr::block("GpsL1CADllPllTrackingTest_msg_rx", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)) { this->message_port_register_in(pmt::mp("events")); this->set_msg_handler(pmt::mp("events"), boost::bind(&GpsL1CADllPllTrackingTest_msg_rx::msg_handler_events, this, _1)); rx_message = 0; } GpsL1CADllPllTrackingTest_msg_rx::~GpsL1CADllPllTrackingTest_msg_rx() {} // ########################################################### class GpsL1CADllPllTrackingTest: public ::testing::Test { public: std::string generator_binary; std::string p1; std::string p2; std::string p3; std::string p4; std::string p5; const int baseband_sampling_freq = FLAGS_fs_gen_hz; std::string filename_rinex_obs = FLAGS_filename_rinex_obs; std::string filename_raw_data = FLAGS_filename_raw_data; int configure_generator(); int generate_signal(); void check_results_doppler(arma::vec true_time_s, arma::vec true_value, arma::vec meas_time_s, arma::vec meas_value); void check_results_acc_carrier_phase(arma::vec true_time_s, arma::vec true_value, arma::vec meas_time_s, arma::vec meas_value); void check_results_codephase(arma::vec true_time_s, arma::vec true_value, arma::vec meas_time_s, arma::vec meas_value); GpsL1CADllPllTrackingTest() { factory = std::make_shared(); config = std::make_shared(); item_size = sizeof(gr_complex); gnss_synchro = Gnss_Synchro(); } ~GpsL1CADllPllTrackingTest() {} void configure_receiver(); gr::top_block_sptr top_block; std::shared_ptr factory; std::shared_ptr config; Gnss_Synchro gnss_synchro; size_t item_size; }; int GpsL1CADllPllTrackingTest::configure_generator() { // Configure signal generator generator_binary = FLAGS_generator_binary; p1 = std::string("-rinex_nav_file=") + FLAGS_rinex_nav_file; if(FLAGS_dynamic_position.empty()) { p2 = std::string("-static_position=") + FLAGS_static_position + std::string(",") + std::to_string(FLAGS_duration * 10); } else { p2 = std::string("-obs_pos_file=") + std::string(FLAGS_dynamic_position); } p3 = std::string("-rinex_obs_file=") + FLAGS_filename_rinex_obs; // RINEX 2.10 observation file output p4 = std::string("-sig_out_file=") + FLAGS_filename_raw_data; // Baseband signal output file. Will be stored in int8_t IQ multiplexed samples p5 = std::string("-sampling_freq=") + std::to_string(baseband_sampling_freq); //Baseband sampling frequency [MSps] return 0; } int GpsL1CADllPllTrackingTest::generate_signal() { int child_status; char *const parmList[] = { &generator_binary[0], &generator_binary[0], &p1[0], &p2[0], &p3[0], &p4[0], &p5[0], NULL }; int pid; if ((pid = fork()) == -1) perror("fork err"); else if (pid == 0) { execv(&generator_binary[0], parmList); std::cout << "Return not expected. Must be an execv err." << std::endl; std::terminate(); } waitpid(pid, &child_status, 0); std::cout << "Signal and Observables RINEX and RAW files created." << std::endl; return 0; } void GpsL1CADllPllTrackingTest::configure_receiver() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'G'; std::string signal = "1C"; signal.copy(gnss_synchro.Signal, 2, 0); gnss_synchro.PRN = FLAGS_test_satellite_PRN; config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(baseband_sampling_freq)); // Set Tracking config->set_property("Tracking_1C.implementation", "GPS_L1_CA_DLL_PLL_Tracking"); config->set_property("Tracking_1C.item_type", "gr_complex"); config->set_property("Tracking_1C.if", "0"); config->set_property("Tracking_1C.dump", "true"); config->set_property("Tracking_1C.dump_filename", "./tracking_ch_"); config->set_property("Tracking_1C.pll_bw_hz", "30.0"); config->set_property("Tracking_1C.dll_bw_hz", "2.0"); config->set_property("Tracking_1C.early_late_space_chips", "0.5"); } void GpsL1CADllPllTrackingTest::check_results_doppler(arma::vec true_time_s, arma::vec true_value, arma::vec meas_time_s, arma::vec meas_value) { //1. True value interpolation to match the measurement times arma::vec true_value_interp; arma::interp1(true_time_s, true_value, meas_time_s, true_value_interp); //2. RMSE arma::vec err; err = meas_value - true_value_interp; arma::vec err2 = arma::square(err); double rmse = sqrt(arma::mean(err2)); //3. Mean err and variance double error_mean = arma::mean(err); double error_var = arma::var(err); // 5. Peaks double max_error = arma::max(err); double min_error = arma::min(err); //5. report std::cout << std::setprecision(10) << "TRK Doppler RMSE=" << rmse << ", mean=" << error_mean << ", stdev="<< sqrt(error_var) << " (max,min)=" << max_error << "," << min_error << " [Hz]" << std::endl; } void GpsL1CADllPllTrackingTest::check_results_acc_carrier_phase(arma::vec true_time_s, arma::vec true_value, arma::vec meas_time_s, arma::vec meas_value) { //1. True value interpolation to match the measurement times arma::vec true_value_interp; arma::interp1(true_time_s, true_value, meas_time_s, true_value_interp); //2. RMSE arma::vec err; err = meas_value - true_value_interp; arma::vec err2 = arma::square(err); double rmse = sqrt(arma::mean(err2)); //3. Mean err and variance double error_mean = arma::mean(err); double error_var = arma::var(err); // 4. Peaks double max_error = arma::max(err); double min_error = arma::min(err); //5. report std::cout << std::setprecision(10) << "TRK acc carrier phase RMSE=" << rmse << ", mean=" << error_mean << ", stdev=" << sqrt(error_var) << " (max,min)=" << max_error << "," << min_error << " [Hz]" << std::endl; } void GpsL1CADllPllTrackingTest::check_results_codephase(arma::vec true_time_s, arma::vec true_value, arma::vec meas_time_s, arma::vec meas_value) { //1. True value interpolation to match the measurement times arma::vec true_value_interp; arma::interp1(true_time_s, true_value, meas_time_s, true_value_interp); //2. RMSE arma::vec err; err = meas_value - true_value_interp; arma::vec err2 = arma::square(err); double rmse = sqrt(arma::mean(err2)); //3. Mean err and variance double error_mean = arma::mean(err); double error_var = arma::var(err); // 4. Peaks double max_error = arma::max(err); double min_error = arma::min(err); //5. report std::cout << std::setprecision(10) << "TRK code phase RMSE=" << rmse << ", mean=" << error_mean << ", stdev=" << sqrt(error_var) << " (max,min)=" << max_error << "," << min_error << " [Chips]" << std::endl; } TEST_F(GpsL1CADllPllTrackingTest, ValidationOfResults) { // Configure the signal generator configure_generator(); // Generate signal raw signal samples and observations RINEX file generate_signal(); struct timeval tv; long long int begin = 0; long long int end = 0; configure_receiver(); //open true observables log file written by the simulator tracking_true_obs_reader true_obs_data; int test_satellite_PRN = FLAGS_test_satellite_PRN; std::cout << "Testing satellite PRN=" << test_satellite_PRN << std::endl; std::string true_obs_file = std::string("./gps_l1_ca_obs_prn"); true_obs_file.append(std::to_string(test_satellite_PRN)); true_obs_file.append(".dat"); ASSERT_NO_THROW({ if (true_obs_data.open_obs_file(true_obs_file) == false) { throw std::exception(); }; }) << "Failure opening true observables file" << std::endl; top_block = gr::make_top_block("Tracking test"); std::shared_ptr tracking = std::make_shared(config.get(), "Tracking_1C", 1, 1); //std::shared_ptr tracking = std::make_shared(config.get(), "Tracking_1C", 1, 1); boost::shared_ptr msg_rx = GpsL1CADllPllTrackingTest_msg_rx_make(); // load acquisition data based on the first epoch of the true observations ASSERT_NO_THROW({ if (true_obs_data.read_binary_obs() == false) { throw std::exception(); }; }) << "Failure reading true observables file" << std::endl; //restart the epoch counter true_obs_data.restart(); std::cout << "Initial Doppler [Hz]=" << true_obs_data.doppler_l1_hz << " Initial code delay [Chips]=" << true_obs_data.prn_delay_chips << std::endl; gnss_synchro.Acq_delay_samples = (GPS_L1_CA_CODE_LENGTH_CHIPS - true_obs_data.prn_delay_chips / GPS_L1_CA_CODE_LENGTH_CHIPS) * baseband_sampling_freq * GPS_L1_CA_CODE_PERIOD; gnss_synchro.Acq_doppler_hz = true_obs_data.doppler_l1_hz; gnss_synchro.Acq_samplestamp_samples = 0; ASSERT_NO_THROW( { tracking->set_channel(gnss_synchro.Channel_ID); }) << "Failure setting channel." << std::endl; ASSERT_NO_THROW( { tracking->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro." << std::endl; ASSERT_NO_THROW( { tracking->connect(top_block); }) << "Failure connecting tracking to the top_block." << std::endl; ASSERT_NO_THROW( { std::string file = "./" + filename_raw_data; const char * file_name = file.c_str(); gr::blocks::file_source::sptr file_source = gr::blocks::file_source::make(sizeof(int8_t), file_name, false); gr::blocks::interleaved_char_to_complex::sptr gr_interleaved_char_to_complex = gr::blocks::interleaved_char_to_complex::make(); gr::blocks::null_sink::sptr sink = gr::blocks::null_sink::make(sizeof(Gnss_Synchro)); top_block->connect(file_source, 0, gr_interleaved_char_to_complex, 0); top_block->connect(gr_interleaved_char_to_complex, 0, tracking->get_left_block(), 0); top_block->connect(tracking->get_right_block(), 0, sink, 0); top_block->msg_connect(tracking->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of tracking test." << std::endl; tracking->start_tracking(); EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec * 1000000 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec * 1000000 + tv.tv_usec; }) << "Failure running the top_block." << std::endl; //check results //load the true values long int nepoch = true_obs_data.num_epochs(); std::cout << "True observation epochs=" << nepoch << std::endl; arma::vec true_timestamp_s = arma::zeros(nepoch, 1); arma::vec true_acc_carrier_phase_cycles = arma::zeros(nepoch, 1); arma::vec true_Doppler_Hz = arma::zeros(nepoch, 1); arma::vec true_prn_delay_chips = arma::zeros(nepoch, 1); arma::vec true_tow_s = arma::zeros(nepoch, 1); long int epoch_counter = 0; while(true_obs_data.read_binary_obs()) { true_timestamp_s(epoch_counter) = true_obs_data.signal_timestamp_s; true_acc_carrier_phase_cycles(epoch_counter) = true_obs_data.acc_carrier_phase_cycles; true_Doppler_Hz(epoch_counter) = true_obs_data.doppler_l1_hz; true_prn_delay_chips(epoch_counter) = true_obs_data.prn_delay_chips; true_tow_s(epoch_counter) = true_obs_data.tow; epoch_counter++; } //load the measured values tracking_dump_reader trk_dump; ASSERT_NO_THROW({ if (trk_dump.open_obs_file(std::string("./tracking_ch_0.dat")) == false) { throw std::exception(); }; }) << "Failure opening tracking dump file" << std::endl; nepoch = trk_dump.num_epochs(); std::cout << "Measured observation epochs=" << nepoch << std::endl; arma::vec trk_timestamp_s = arma::zeros(nepoch, 1); arma::vec trk_acc_carrier_phase_cycles = arma::zeros(nepoch, 1); arma::vec trk_Doppler_Hz = arma::zeros(nepoch, 1); arma::vec trk_prn_delay_chips = arma::zeros(nepoch, 1); epoch_counter = 0; while(trk_dump.read_binary_obs()) { trk_timestamp_s(epoch_counter) = static_cast(trk_dump.PRN_start_sample_count) / static_cast(baseband_sampling_freq); trk_acc_carrier_phase_cycles(epoch_counter) = trk_dump.acc_carrier_phase_rad / GPS_TWO_PI; trk_Doppler_Hz(epoch_counter) = trk_dump.carrier_doppler_hz; double delay_chips = GPS_L1_CA_CODE_LENGTH_CHIPS - GPS_L1_CA_CODE_LENGTH_CHIPS * (fmod((static_cast(trk_dump.PRN_start_sample_count) + trk_dump.aux1) / static_cast(baseband_sampling_freq), 1.0e-3) /1.0e-3); trk_prn_delay_chips(epoch_counter) = delay_chips; epoch_counter++; } //Align initial measurements and cut the tracking pull-in transitory double pull_in_offset_s = 1.0; arma::uvec initial_meas_point = arma::find(trk_timestamp_s >= (true_timestamp_s(0) + pull_in_offset_s), 1, "first"); trk_timestamp_s = trk_timestamp_s.subvec(initial_meas_point(0), trk_timestamp_s.size() - 1); trk_acc_carrier_phase_cycles = trk_acc_carrier_phase_cycles.subvec(initial_meas_point(0), trk_acc_carrier_phase_cycles.size() - 1); trk_Doppler_Hz = trk_Doppler_Hz.subvec(initial_meas_point(0), trk_Doppler_Hz.size() - 1); trk_prn_delay_chips = trk_prn_delay_chips.subvec(initial_meas_point(0), trk_prn_delay_chips.size() - 1); check_results_doppler(true_timestamp_s, true_Doppler_Hz, trk_timestamp_s, trk_Doppler_Hz); check_results_codephase(true_timestamp_s, true_prn_delay_chips, trk_timestamp_s, trk_prn_delay_chips); check_results_acc_carrier_phase(true_timestamp_s, true_acc_carrier_phase_cycles, trk_timestamp_s, trk_acc_carrier_phase_cycles); std::cout << "Signal tracking completed in " << (end - begin) << " microseconds" << std::endl; } gps_l2_m_dll_pll_tracking_test.cc000066400000000000000000000163201305042567700344240ustar00rootroot00000000000000gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/tracking/*! * \file gps_l2_m_dll_pll_tracking_test.cc * \brief This class implements a tracking test for Galileo_E5a_DLL_PLL_Tracking * implementation based on some input parameters. * \author Javier Arribas, 2015. jarribas(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2012-2015 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include #include "gnss_block_factory.h" #include "gnss_block_interface.h" #include "tracking_interface.h" #include "in_memory_configuration.h" #include "gnss_sdr_valve.h" #include "gnss_synchro.h" #include "gps_l2_m_dll_pll_tracking.h" // ######## GNURADIO BLOCK MESSAGE RECEVER ######### class GpsL2MDllPllTrackingTest_msg_rx; typedef boost::shared_ptr GpsL2MDllPllTrackingTest_msg_rx_sptr; GpsL2MDllPllTrackingTest_msg_rx_sptr GpsL2MDllPllTrackingTest_msg_rx_make(); class GpsL2MDllPllTrackingTest_msg_rx : public gr::block { private: friend GpsL2MDllPllTrackingTest_msg_rx_sptr GpsL2MDllPllTrackingTest_msg_rx_make(); void msg_handler_events(pmt::pmt_t msg); GpsL2MDllPllTrackingTest_msg_rx(); public: int rx_message; ~GpsL2MDllPllTrackingTest_msg_rx(); //!< Default destructor }; GpsL2MDllPllTrackingTest_msg_rx_sptr GpsL2MDllPllTrackingTest_msg_rx_make() { return GpsL2MDllPllTrackingTest_msg_rx_sptr(new GpsL2MDllPllTrackingTest_msg_rx()); } void GpsL2MDllPllTrackingTest_msg_rx::msg_handler_events(pmt::pmt_t msg) { try { long int message = pmt::to_long(msg); rx_message = message; } catch(boost::bad_any_cast& e) { LOG(WARNING) << "msg_handler_telemetry Bad any cast!"; rx_message = 0; } } GpsL2MDllPllTrackingTest_msg_rx::GpsL2MDllPllTrackingTest_msg_rx() : gr::block("GpsL2MDllPllTrackingTest_msg_rx", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)) { this->message_port_register_in(pmt::mp("events")); this->set_msg_handler(pmt::mp("events"), boost::bind(&GpsL2MDllPllTrackingTest_msg_rx::msg_handler_events, this, _1)); rx_message = 0; } GpsL2MDllPllTrackingTest_msg_rx::~GpsL2MDllPllTrackingTest_msg_rx() {} // ########################################################### class GpsL2MDllPllTrackingTest: public ::testing::Test { protected: GpsL2MDllPllTrackingTest() { factory = std::make_shared(); config = std::make_shared(); item_size = sizeof(gr_complex); gnss_synchro = Gnss_Synchro(); } ~GpsL2MDllPllTrackingTest() {} void init(); gr::msg_queue::sptr queue; gr::top_block_sptr top_block; std::shared_ptr factory; std::shared_ptr config; Gnss_Synchro gnss_synchro; size_t item_size; }; void GpsL2MDllPllTrackingTest::init() { gnss_synchro.Channel_ID = 0; gnss_synchro.System = 'G'; std::string signal = "2S"; signal.copy(gnss_synchro.Signal, 2, 0); gnss_synchro.PRN = 7; config->set_property("GNSS-SDR.internal_fs_hz", "5000000"); config->set_property("Tracking_2S.item_type", "gr_complex"); config->set_property("Tracking_2S.dump", "false"); config->set_property("Tracking_2S.dump_filename", "../data/L2m_tracking_ch_"); config->set_property("Tracking_2S.implementation", "GPS_L2_M_DLL_PLL_Tracking"); config->set_property("Tracking_2S.early_late_space_chips", "0.5"); config->set_property("Tracking_2S.order", "2"); config->set_property("Tracking_2S.pll_bw_hz", "2"); config->set_property("Tracking_2S.dll_bw_hz", "0.5"); } TEST_F(GpsL2MDllPllTrackingTest, ValidationOfResults) { struct timeval tv; long long int begin = 0; long long int end = 0; int fs_in = 5000000; int nsamples = fs_in*9; init(); queue = gr::msg_queue::make(0); top_block = gr::make_top_block("Tracking test"); std::shared_ptr tracking = std::make_shared(config.get(), "Tracking_2S", 1, 1); boost::shared_ptr msg_rx = GpsL2MDllPllTrackingTest_msg_rx_make(); gnss_synchro.Acq_delay_samples = 1; gnss_synchro.Acq_doppler_hz = 1200; gnss_synchro.Acq_samplestamp_samples = 0; ASSERT_NO_THROW( { tracking->set_channel(gnss_synchro.Channel_ID); }) << "Failure setting channel." << std::endl; ASSERT_NO_THROW( { tracking->set_gnss_synchro(&gnss_synchro); }) << "Failure setting gnss_synchro." << std::endl; ASSERT_NO_THROW( { tracking->connect(top_block); }) << "Failure connecting tracking to the top_block." << std::endl; ASSERT_NO_THROW( { //gr::analog::sig_source_c::sptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000, 1, gr_complex(0)); std::string path = std::string(TEST_PATH); std::string file = path + "signal_samples/gps_l2c_m_prn7_5msps.dat"; const char * file_name = file.c_str(); gr::blocks::file_source::sptr file_source = gr::blocks::file_source::make(sizeof(gr_complex), file_name, false); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); gr::blocks::null_sink::sptr sink = gr::blocks::null_sink::make(sizeof(Gnss_Synchro)); top_block->connect(file_source, 0, valve, 0); top_block->connect(valve, 0, tracking->get_left_block(), 0); top_block->connect(tracking->get_right_block(), 0, sink, 0); top_block->msg_connect(tracking->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); }) << "Failure connecting the blocks of tracking test." << std::endl; tracking->start_tracking(); EXPECT_NO_THROW( { gettimeofday(&tv, NULL); begin = tv.tv_sec *1000000 + tv.tv_usec; top_block->run(); // Start threads and wait gettimeofday(&tv, NULL); end = tv.tv_sec *1000000 + tv.tv_usec; }) << "Failure running the top_block." << std::endl; // TODO: Verify tracking results std::cout << "Tracked " << nsamples << " samples in " << (end - begin) << " microseconds" << std::endl; } gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/tracking/gpu_multicorrelator_test.cc000066400000000000000000000167611305042567700335300ustar00rootroot00000000000000/*! * \file fft_length_test.cc * \brief This file implements timing tests for the FFT. * \author Carles Fernandez-Prades, 2016. cfernandez(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2016 (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 . * * ------------------------------------------------------------------------- */ #include #include #include #include #include #include #include "cuda_multicorrelator.h" #include "gps_sdr_signal_processing.h" #include "GPS_L1_CA.h" DEFINE_int32(gpu_multicorrelator_iterations_test, 1000, "Number of averaged iterations in GPU multicorrelator test timing test"); DEFINE_int32(gpu_multicorrelator_max_threads_test, 12, "Number of maximum concurrent correlators in GPU multicorrelator test timing test"); void run_correlator_gpu(cuda_multicorrelator* correlator, float d_rem_carrier_phase_rad, float d_carrier_phase_step_rad, float d_code_phase_step_chips, float d_rem_code_phase_chips, int correlation_size, int d_n_correlator_taps) { for(int k = 0; k < FLAGS_cpu_multicorrelator_iterations_test; k++) { correlator->Carrier_wipeoff_multicorrelator_resampler_cuda(d_rem_carrier_phase_rad, d_carrier_phase_step_rad, d_code_phase_step_chips, d_rem_code_phase_chips, correlation_size, d_n_correlator_taps); } } TEST(GPU_multicorrelator_test, MeasureExecutionTime) { struct timeval tv; int max_threads=FLAGS_gpu_multicorrelator_max_threads_test; std::vector thread_pool; cuda_multicorrelator* correlator_pool[max_threads]; unsigned int correlation_sizes [3] = { 2048, 4096, 8192}; double execution_times [3]; gr_complex* d_ca_code; gr_complex* in_gpu; gr_complex* d_correlator_outs; int d_n_correlator_taps=3; int d_vector_length=correlation_sizes[2]; //max correlation size to allocate all the necessary memory float* d_local_code_shift_chips; // Set GPU flags cudaSetDeviceFlags(cudaDeviceMapHost); //allocate host memory //pinned memory mode - use special function to get OS-pinned memory d_n_correlator_taps = 3; // Early, Prompt, and Late // Get space for a vector with the C/A code replica sampled 1x/chip cudaHostAlloc((void**)&d_ca_code, (static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS)* sizeof(gr_complex)), cudaHostAllocMapped | cudaHostAllocWriteCombined); // Get space for the resampled early / prompt / late local replicas cudaHostAlloc((void**)&d_local_code_shift_chips, d_n_correlator_taps * sizeof(float), cudaHostAllocMapped | cudaHostAllocWriteCombined); cudaHostAlloc((void**)&in_gpu, 2 * d_vector_length * sizeof(gr_complex), cudaHostAllocMapped | cudaHostAllocWriteCombined); // correlator outputs (scalar) cudaHostAlloc((void**)&d_correlator_outs ,sizeof(gr_complex)*d_n_correlator_taps, cudaHostAllocMapped | cudaHostAllocWriteCombined ); //--- Perform initializations ------------------------------ //local code resampler on GPU // generate local reference (1 sample per chip) gps_l1_ca_code_gen_complex(d_ca_code, 1, 0); // generate inut signal for (int n=0;n<2*d_vector_length;n++) { in_gpu[n]=std::complex(static_cast (rand())/static_cast(RAND_MAX),static_cast (rand())/static_cast(RAND_MAX)); } // Set TAPs delay values [chips] float d_early_late_spc_chips=0.5; d_local_code_shift_chips[0] = - d_early_late_spc_chips; d_local_code_shift_chips[1] = 0.0; d_local_code_shift_chips[2] = d_early_late_spc_chips; for (int n=0;ninit_cuda_integrated_resampler(d_vector_length, GPS_L1_CA_CODE_LENGTH_CHIPS, d_n_correlator_taps); correlator_pool[n]->set_input_output_vectors(d_correlator_outs, in_gpu); } float d_rem_carrier_phase_rad=0.0; float d_carrier_phase_step_rad=0.1; float d_code_phase_step_chips=0.3; float d_rem_code_phase_chips=0.4; EXPECT_NO_THROW( for(int correlation_sizes_idx = 0; correlation_sizes_idx < 3; correlation_sizes_idx++) { for(int current_max_threads=1; current_max_threads<(max_threads+1); current_max_threads++) { std::cout<<"Running "<(end - begin) / (1000000.0 * static_cast(FLAGS_gpu_multicorrelator_iterations_test)); std::cout << "GPU Multicorrelator execution time for length=" << correlation_sizes[correlation_sizes_idx] << " : " << execution_times[correlation_sizes_idx] << " [s]" << std::endl; } } ); cudaFreeHost(in_gpu); cudaFreeHost(d_correlator_outs); cudaFreeHost(d_local_code_shift_chips); cudaFreeHost(d_ca_code); for (int n=0;nfree_cuda(); } } gnss-sdr-0.0.9/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_loop_filter_test.cc000066400000000000000000000161231305042567700336160ustar00rootroot00000000000000/*! * \file tracking_loop_filter_test.cc * \brief This file implements tests for the general loop filter * \author Cillian O'Driscoll, 2015. cillian.odriscoll(at)gmail.com * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "tracking_loop_filter.h" #include TEST(TrackingLoopFilterTest, FirstOrderLoop) { int loop_order = 1; float noise_bandwidth = 5.0; float update_interval = 0.001; bool include_last_integrator = false; Tracking_loop_filter theFilter( update_interval, noise_bandwidth, loop_order, include_last_integrator ); EXPECT_EQ( theFilter.get_noise_bandwidth(), noise_bandwidth ); EXPECT_EQ( theFilter.get_update_interval(), update_interval ); EXPECT_EQ( theFilter.get_include_last_integrator(), include_last_integrator ); EXPECT_EQ( theFilter.get_order(), loop_order ); std::vector< float > sample_data = { 0.0, 0.0, 1.0, 0.0, 0.0, 0.0 }; theFilter.initialize( 0.0 ); float g1 = noise_bandwidth * 4.0; float result = 0.0; for( unsigned int i = 0; i < sample_data.size(); ++i ) { result = theFilter.apply( sample_data[i] ); EXPECT_FLOAT_EQ( result, sample_data[i]*g1 ); } } TEST(TrackingLoopFilterTest, FirstOrderLoopWithLastIntegrator) { int loop_order = 1; float noise_bandwidth = 5.0; float update_interval = 0.001; bool include_last_integrator = true; Tracking_loop_filter theFilter( update_interval, noise_bandwidth, loop_order, include_last_integrator ); EXPECT_EQ( theFilter.get_noise_bandwidth(), noise_bandwidth ); EXPECT_EQ( theFilter.get_update_interval(), update_interval ); EXPECT_EQ( theFilter.get_include_last_integrator(), include_last_integrator ); EXPECT_EQ( theFilter.get_order(), loop_order ); std::vector< float > sample_data = { 0.0, 0.0, 1.0, 0.0, 0.0, 0.0 }; std::vector< float > expected_out = { 0.0, 0.0, 0.01, 0.02, 0.02, 0.02 }; theFilter.initialize( 0.0 ); float result = 0.0; for( unsigned int i = 0; i < sample_data.size(); ++i ) { result = theFilter.apply( sample_data[i] ); EXPECT_NEAR( result, expected_out[i], 1e-4 ); } } TEST(TrackingLoopFilterTest, SecondOrderLoop) { int loop_order = 2; float noise_bandwidth = 5.0; float update_interval = 0.001; bool include_last_integrator = false; Tracking_loop_filter theFilter( update_interval, noise_bandwidth, loop_order, include_last_integrator ); EXPECT_EQ( theFilter.get_noise_bandwidth(), noise_bandwidth ); EXPECT_EQ( theFilter.get_update_interval(), update_interval ); EXPECT_EQ( theFilter.get_include_last_integrator(), include_last_integrator ); EXPECT_EQ( theFilter.get_order(), loop_order ); std::vector< float > sample_data = { 0.0, 0.0, 1.0, 0.0, 0.0, 0.0 }; std::vector< float > expected_out = { 0.0, 0.0, 13.37778, 0.0889, 0.0889, 0.0889 }; theFilter.initialize( 0.0 ); float result = 0.0; for( unsigned int i = 0; i < sample_data.size(); ++i ) { result = theFilter.apply( sample_data[i] ); EXPECT_NEAR( result, expected_out[i], 1e-4 ); } } TEST(TrackingLoopFilterTest, SecondOrderLoopWithLastIntegrator) { int loop_order = 2; float noise_bandwidth = 5.0; float update_interval = 0.001; bool include_last_integrator = true; Tracking_loop_filter theFilter( update_interval, noise_bandwidth, loop_order, include_last_integrator ); EXPECT_EQ( theFilter.get_noise_bandwidth(), noise_bandwidth ); EXPECT_EQ( theFilter.get_update_interval(), update_interval ); EXPECT_EQ( theFilter.get_include_last_integrator(), include_last_integrator ); EXPECT_EQ( theFilter.get_order(), loop_order ); std::vector< float > sample_data = { 0.0, 0.0, 1.0, 0.0, 0.0, 0.0 }; std::vector< float > expected_out = { 0.0, 0.0, 0.006689, 0.013422, 0.013511, 0.013600 }; theFilter.initialize( 0.0 ); float result = 0.0; for( unsigned int i = 0; i < sample_data.size(); ++i ) { result = theFilter.apply( sample_data[i] ); EXPECT_NEAR( result, expected_out[i], 1e-4 ); } } TEST(TrackingLoopFilterTest, ThirdOrderLoop) { int loop_order = 3; float noise_bandwidth = 5.0; float update_interval = 0.001; bool include_last_integrator = false; Tracking_loop_filter theFilter( update_interval, noise_bandwidth, loop_order, include_last_integrator ); EXPECT_EQ( theFilter.get_noise_bandwidth(), noise_bandwidth ); EXPECT_EQ( theFilter.get_update_interval(), update_interval ); EXPECT_EQ( theFilter.get_include_last_integrator(), include_last_integrator ); EXPECT_EQ( theFilter.get_order(), loop_order ); std::vector< float > sample_data = { 0.0, 0.0, 1.0, 0.0, 0.0, 0.0 }; std::vector< float > expected_out = { 0.0, 0.0, 15.31877, 0.04494, 0.04520, 0.04546}; theFilter.initialize( 0.0 ); float result = 0.0; for( unsigned int i = 0; i < sample_data.size(); ++i ) { result = theFilter.apply( sample_data[i] ); EXPECT_NEAR( result, expected_out[i], 1e-4 ); } } TEST(TrackingLoopFilterTest, ThirdOrderLoopWithLastIntegrator) { int loop_order = 3; float noise_bandwidth = 5.0; float update_interval = 0.001; bool include_last_integrator = true; Tracking_loop_filter theFilter( update_interval, noise_bandwidth, loop_order, include_last_integrator ); EXPECT_EQ( theFilter.get_noise_bandwidth(), noise_bandwidth ); EXPECT_EQ( theFilter.get_update_interval(), update_interval ); EXPECT_EQ( theFilter.get_include_last_integrator(), include_last_integrator ); EXPECT_EQ( theFilter.get_order(), loop_order ); std::vector< float > sample_data = { 0.0, 0.0, 1.0, 0.0, 0.0, 0.0 }; std::vector< float > expected_out = { 0.0, 0.0, 0.007659, 0.015341, 0.015386, 0.015432}; theFilter.initialize( 0.0 ); float result = 0.0; for( unsigned int i = 0; i < sample_data.size(); ++i ) { result = theFilter.apply( sample_data[i] ); EXPECT_NEAR( result, expected_out[i], 1e-4 ); } } gnss-sdr-0.0.9/src/utils/000077500000000000000000000000001305042567700152205ustar00rootroot00000000000000gnss-sdr-0.0.9/src/utils/CMakeLists.txt000066400000000000000000000013761305042567700177670ustar00rootroot00000000000000# Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) # # 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 . # add_subdirectory(front-end-cal) gnss-sdr-0.0.9/src/utils/front-end-cal/000077500000000000000000000000001305042567700176515ustar00rootroot00000000000000gnss-sdr-0.0.9/src/utils/front-end-cal/CMakeLists.txt000066400000000000000000000113011305042567700224050ustar00rootroot00000000000000# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) # # 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 . # if(OPENSSL_FOUND) add_definitions( -DUSE_OPENSSL_FALLBACK=1 ) endif(OPENSSL_FOUND) set(FRONT_END_CAL_SOURCES front_end_cal.cc) include_directories( ${CMAKE_SOURCE_DIR}/src/core/system_parameters ${CMAKE_SOURCE_DIR}/src/core/interfaces ${CMAKE_SOURCE_DIR}/src/core/receiver ${CMAKE_SOURCE_DIR}/src/core/libs ${CMAKE_SOURCE_DIR}/src/core/libs/supl ${CMAKE_SOURCE_DIR}/src/core/libs/supl/asn-rrlp ${CMAKE_SOURCE_DIR}/src/core/libs/supl/asn-supl ${CMAKE_SOURCE_DIR}/src/algorithms/libs ${CMAKE_SOURCE_DIR}/src/algorithms/acquisition/adapters ${CMAKE_SOURCE_DIR}/src/algorithms/acquisition/gnuradio_blocks ${GLOG_INCLUDE_DIRS} ${GFlags_INCLUDE_DIRS} ${GNURADIO_RUNTIME_INCLUDE_DIRS} ${GNURADIO_BLOCKS_INCLUDE_DIRS} ${ARMADILLO_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${VOLK_GNSSSDR_INCLUDE_DIRS} ) file(GLOB FRONT_END_CAL_HEADERS "*.h") list(SORT FRONT_END_CAL_HEADERS) add_library(front_end_cal_lib ${FRONT_END_CAL_SOURCES} ${FRONT_END_CAL_HEADERS}) source_group(Headers FILES ${FRONT_END_CAL_HEADERS}) target_link_libraries(front_end_cal_lib ${MAC_LIBRARIES} ${Boost_LIBRARIES} ${GNURADIO_RUNTIME_LIBRARIES} ${GNURADIO_BLOCKS_LIBRARIES} ${GNURADIO_FFT_LIBRARIES} ${GNURADIO_FILTER_LIBRARIES} ${GFlags_LIBS} ${GLOG_LIBRARIES} ${ARMADILLO_LIBRARIES} ${VOLK_GNSSSDR_LIBRARIES} ${ORC_LIBRARIES} ${GNSS_SDR_OPTIONAL_LIBS} rx_core_lib gnss_rx channel_fsm gnss_sp_libs ) add_dependencies(front_end_cal_lib glog-${glog_RELEASE} armadillo-${armadillo_RELEASE}) add_definitions( -DGNSS_SDR_VERSION="${VERSION}" ) add_definitions( -DGNSSSDR_INSTALL_DIR="${CMAKE_INSTALL_PREFIX}" ) add_executable(front-end-cal ${CMAKE_CURRENT_SOURCE_DIR}/main.cc) add_custom_command(TARGET front-end-cal POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $ ${CMAKE_SOURCE_DIR}/install/$) target_link_libraries(front-end-cal ${MAC_LIBRARIES} ${Boost_LIBRARIES} ${GNURADIO_RUNTIME_LIBRARIES} ${GNURADIO_BLOCKS_LIBRARIES} ${GNURADIO_FFT_LIBRARIES} ${GNURADIO_FILTER_LIBRARIES} ${GFlags_LIBS} ${GLOG_LIBRARIES} ${ARMADILLO_LIBRARIES} ${VOLK_GNSSSDR_LIBRARIES} ${ORC_LIBRARIES} ${GNSS_SDR_OPTIONAL_LIBS} rx_core_lib gnss_rx gnss_sp_libs front_end_cal_lib ) install(TARGETS front-end-cal RUNTIME DESTINATION bin COMPONENT "front-end-cal" ) find_program(GZIP gzip /bin /usr/bin /usr/local/bin /opt/local/bin /sbin ) if(NOT GZIP_NOTFOUND) execute_process(COMMAND gzip -9 -c ${CMAKE_SOURCE_DIR}/docs/manpage/front-end-cal-manpage WORKING_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_FILE "${CMAKE_BINARY_DIR}/front-end-cal.1.gz") install(FILES ${CMAKE_BINARY_DIR}/front-end-cal.1.gz DESTINATION share/man/man1) endif(NOT GZIP_NOTFOUND) gnss-sdr-0.0.9/src/utils/front-end-cal/front_end_cal.cc000066400000000000000000000441071305042567700227630ustar00rootroot00000000000000/*! * \file front_end_cal.cc * \brief Implementation of the Front-end calibration program. * \author Javier Arribas, 2013. jarribas(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 . * * ------------------------------------------------------------------------- */ #include "front_end_cal.h" #include #include #include #include #include #include #include #include #include #include #include "gps_navigation_message.h" #include "gps_ephemeris.h" #include "gps_cnav_ephemeris.h" #include "gps_almanac.h" #include "gps_iono.h" #include "gps_cnav_iono.h" #include "gps_utc_model.h" #include "gnss_sdr_supl_client.h" extern concurrent_map global_gps_ephemeris_map; extern concurrent_map global_gps_iono_map; extern concurrent_map global_gps_utc_model_map; extern concurrent_map global_gps_almanac_map; extern concurrent_map global_gps_acq_assist_map; FrontEndCal::FrontEndCal() {} FrontEndCal::~FrontEndCal() {} bool FrontEndCal::read_assistance_from_XML() { gnss_sdr_supl_client supl_client_ephemeris_; std::string eph_xml_filename = "gps_ephemeris.xml"; std::cout << "SUPL: Trying to read GPS ephemeris from XML file " << eph_xml_filename << std::endl; LOG(INFO) << "SUPL: Trying to read GPS ephemeris from XML file " << eph_xml_filename; if (supl_client_ephemeris_.load_ephemeris_xml(eph_xml_filename) == true) { std::map::iterator gps_eph_iter; for(gps_eph_iter = supl_client_ephemeris_.gps_ephemeris_map.begin(); gps_eph_iter != supl_client_ephemeris_.gps_ephemeris_map.end(); gps_eph_iter++) { std::cout << "SUPL: Read XML Ephemeris for GPS SV " << gps_eph_iter->first << std::endl; LOG(INFO) << "SUPL: Read XML Ephemeris for GPS SV " << gps_eph_iter->first; LOG(INFO) << "New Ephemeris record inserted with Toe=" << gps_eph_iter->second.d_Toe << " and GPS Week=" << gps_eph_iter->second.i_GPS_week; global_gps_ephemeris_map.write(gps_eph_iter->second.i_satellite_PRN, gps_eph_iter->second); } return true; } else { std::cout << "ERROR: SUPL client error reading XML" << std::endl; LOG(WARNING) << "ERROR: SUPL client error reading XML"; return false; } } int FrontEndCal::Get_SUPL_Assist() { //######### GNSS Assistance ################################# gnss_sdr_supl_client supl_client_acquisition_; gnss_sdr_supl_client supl_client_ephemeris_; int supl_mcc; // Current network MCC (Mobile country code), 3 digits. int supl_mns; //Current network MNC (Mobile Network code), 2 or 3 digits. int supl_lac; // Current network LAC (Location area code),16 bits, 1-65520 are valid values. int supl_ci; // Cell Identity (16 bits, 0-65535 are valid values). // GNSS Assistance configuration int error = 0; bool enable_gps_supl_assistance = configuration_->property("GNSS-SDR.SUPL_gps_enabled", false); if (enable_gps_supl_assistance == true) //SUPL SERVER TEST. Not operational yet! { LOG(INFO) << "SUPL RRLP GPS assistance enabled!"; std::string default_acq_server = "supl.nokia.com"; std::string default_eph_server = "supl.google.com"; supl_client_ephemeris_.server_name = configuration_->property("GNSS-SDR.SUPL_gps_ephemeris_server", default_acq_server); supl_client_acquisition_.server_name = configuration_->property("GNSS-SDR.SUPL_gps_acquisition_server", default_eph_server); supl_client_ephemeris_.server_port = configuration_->property("GNSS-SDR.SUPL_gps_ephemeris_port", 7275); supl_client_acquisition_.server_port = configuration_->property("GNSS-SDR.SUPL_gps_acquisition_port", 7275); supl_mcc = configuration_->property("GNSS-SDR.SUPL_MCC", 244); supl_mns = configuration_->property("GNSS-SDR.SUPL_MNS", 5); std::string default_lac = "0x59e2"; std::string default_ci = "0x31b0"; try { supl_lac = boost::lexical_cast(configuration_->property("GNSS-SDR.SUPL_LAC", default_lac)); } catch(boost::bad_lexical_cast &) { supl_lac = 0x59e2; } try { supl_ci = boost::lexical_cast(configuration_->property("GNSS-SDR.SUPL_CI", default_ci)); } catch(boost::bad_lexical_cast &) { supl_ci = 0x31b0; } bool SUPL_read_gps_assistance_xml = configuration_->property("GNSS-SDR.SUPL_read_gps_assistance_xml", false); if (SUPL_read_gps_assistance_xml == true) { // read assistance from file read_assistance_from_XML(); } else { // Request ephemeris from SUPL server supl_client_ephemeris_.request = 1; LOG(INFO) << "SUPL: Trying to read GPS ephemeris from SUPL server..."; std::cout << "SUPL: Trying to read GPS ephemeris from SUPL server..." << std::endl; error = supl_client_ephemeris_.get_assistance(supl_mcc, supl_mns, supl_lac, supl_ci); if (error == 0) { std::map::iterator gps_eph_iter; for(gps_eph_iter = supl_client_ephemeris_.gps_ephemeris_map.begin(); gps_eph_iter != supl_client_ephemeris_.gps_ephemeris_map.end(); gps_eph_iter++) { LOG(INFO) << "SUPL: Received Ephemeris for GPS SV " << gps_eph_iter->first; std::cout << "SUPL: Received Ephemeris for GPS SV " << gps_eph_iter->first << std::endl; LOG(INFO) << "New Ephemeris record inserted with Toe=" << gps_eph_iter->second.d_Toe << " and GPS Week=" << gps_eph_iter->second.i_GPS_week; global_gps_ephemeris_map.write(gps_eph_iter->second.i_satellite_PRN, gps_eph_iter->second); } //Save ephemeris to XML file std::string eph_xml_filename = configuration_->property("GNSS-SDR.SUPL_gps_ephemeris_xml", eph_default_xml_filename); if (supl_client_ephemeris_.save_ephemeris_map_xml(eph_xml_filename, supl_client_ephemeris_.gps_ephemeris_map) == true) { LOG(INFO) << "SUPL: XML Ephemeris file created."; } } else { LOG(WARNING) << "ERROR: SUPL client for Ephemeris returned " << error; std::cout << "ERROR in SUPL client. Please check your Internet connection and SUPL server configuration" << std::endl; } // Request almanac , IONO and UTC Model supl_client_ephemeris_.request = 0; LOG(INFO) << "SUPL: Try read Almanac, Iono, Utc Model, Ref Time and Ref Location from SUPL server..."; error = supl_client_ephemeris_.get_assistance(supl_mcc, supl_mns, supl_lac, supl_ci); if (error == 0) { std::map::iterator gps_alm_iter; for(gps_alm_iter = supl_client_ephemeris_.gps_almanac_map.begin(); gps_alm_iter != supl_client_ephemeris_.gps_almanac_map.end(); gps_alm_iter++) { LOG(INFO) << "SUPL: Received Almanac for GPS SV " << gps_alm_iter->first; std::cout << "SUPL: Received Almanac for GPS SV " << gps_alm_iter->first << std::endl; global_gps_almanac_map.write(gps_alm_iter->first, gps_alm_iter->second); } if (supl_client_ephemeris_.gps_iono.valid == true) { LOG(INFO) << "SUPL: Received GPS Iono"; std::cout << "SUPL: Received GPS Iono" << std::endl; global_gps_iono_map.write(0,supl_client_ephemeris_.gps_iono); } if (supl_client_ephemeris_.gps_utc.valid == true) { LOG(INFO) << "SUPL: Received GPS UTC Model"; std::cout << "SUPL: Received GPS UTC Model" << std::endl; global_gps_utc_model_map.write(0, supl_client_ephemeris_.gps_utc); } } else { LOG(WARNING) << "ERROR: SUPL client for Almanac returned " << error; std::cout << "ERROR in SUPL client. Please check your Internet connection and SUPL server configuration" << std::endl; } // Request acquisition assistance supl_client_acquisition_.request = 2; LOG(INFO) << "SUPL: Trying to read Acquisition assistance from SUPL server..."; std::cout << "SUPL: Trying to read Acquisition assistance from SUPL server..." << std::endl; error = supl_client_acquisition_.get_assistance(supl_mcc, supl_mns, supl_lac, supl_ci); if (error == 0) { std::map::iterator gps_acq_iter; for(gps_acq_iter = supl_client_acquisition_.gps_acq_map.begin(); gps_acq_iter != supl_client_acquisition_.gps_acq_map.end(); gps_acq_iter++) { LOG(INFO) << "SUPL: Received Acquisition assistance for GPS SV " << gps_acq_iter->first; std::cout << "SUPL: Received Acquisition assistance for GPS SV " << gps_acq_iter->first << std::endl; LOG(INFO) << "New acq assist record inserted"; global_gps_acq_assist_map.write(gps_acq_iter->second.i_satellite_PRN, gps_acq_iter->second); } } else { LOG(WARNING) << "ERROR: SUPL client for Acquisition assistance returned " << error; std::cout << "ERROR in SUPL client. Please check your Internet connection and SUPL server configuration" << std::endl; } } } return error; } void FrontEndCal::set_configuration(std::shared_ptr configuration) { configuration_ = configuration; } bool FrontEndCal::get_ephemeris() { bool read_ephemeris_from_xml = configuration_->property("GNSS-SDR.read_eph_from_xml", false); if (read_ephemeris_from_xml == true) { std::cout << "Trying to read ephemeris from XML file..." << std::endl; LOG(INFO) << "Trying to read ephemeris from XML file..."; if (read_assistance_from_XML() == false) { std::cout << "ERROR: Could not read Ephemeris file: Trying to get ephemeris from SUPL server..." << std::endl; LOG(INFO) << "ERROR: Could not read Ephemeris file: Trying to get ephemeris from SUPL server..."; if (Get_SUPL_Assist() == 1) { return true; } else { return false; } } else { return true; } } else { std::cout << "Trying to read ephemeris from SUPL server..." << std::endl; LOG(INFO) << "Trying to read ephemeris from SUPL server..."; if (Get_SUPL_Assist() == 0) { return true; } else { return false; } } } arma::vec FrontEndCal::lla2ecef(const arma::vec & lla) { // WGS84 flattening double f = 1.0 / 298.257223563; // WGS84 equatorial radius double R = 6378137.0; arma::vec ellipsoid = "0.0 0.0"; double phi = (lla(0) / 360.0) * GPS_TWO_PI; double lambda = (lla(1) / 360.0) * GPS_TWO_PI; ellipsoid(0) = R; ellipsoid(1) = sqrt(1.0 - (1.0 - f)*(1.0 - f)); arma::vec ecef = "0.0 0.0 0.0 0.0"; ecef = geodetic2ecef(phi, lambda, lla(3), ellipsoid); return ecef; } arma::vec FrontEndCal::geodetic2ecef(double phi, double lambda, double h, const arma::vec & ellipsoid) { double a = ellipsoid(0); double e2 = ellipsoid(1)*ellipsoid(1); double sinphi = sin(phi); double cosphi = cos(phi); double N = a / sqrt(1.0 - e2 * sinphi*sinphi); arma::vec ecef = "0.0 0.0 0.0 0.0"; ecef(0) = (N + h) * cosphi * cos(lambda); ecef(1) = (N + h) * cosphi * sin(lambda); ecef(2) = (N*(1.0 - e2) + h) * sinphi; return ecef; } double FrontEndCal::estimate_doppler_from_eph(unsigned int PRN, double TOW, double lat, double lon, double height) { int num_secs = 10; double step_secs = 0.5; // Observer position ECEF arma::vec obs_ecef = "0.0 0.0 0.0 0.0"; arma::vec lla = "0.0 0.0 0.0 0.0"; lla(0) = lat; lla(1) = lon; lla(2) = height; obs_ecef = lla2ecef(lla); // Satellite positions ECEF std::map eph_map; eph_map = global_gps_ephemeris_map.get_map_copy(); std::map::iterator eph_it; eph_it = eph_map.find(PRN); if (eph_it!=eph_map.end()) { arma::vec SV_pos_ecef = "0.0 0.0 0.0 0.0"; double obs_time_start, obs_time_stop; obs_time_start = TOW - num_secs/2; obs_time_stop = TOW + num_secs/2; int n_points = round((obs_time_stop - obs_time_start)/step_secs); arma::vec ranges = arma::zeros(n_points, 1); double obs_time = obs_time_start; for (int i=0; isecond.satellitePosition(obs_time); SV_pos_ecef(0) = eph_it->second.d_satpos_X; SV_pos_ecef(1) = eph_it->second.d_satpos_Y; SV_pos_ecef(2) = eph_it->second.d_satpos_Z; // SV distances to observer (true range) ranges(i) = arma::norm(SV_pos_ecef - obs_ecef, 2); obs_time += step_secs; } // Observer to satellite radial velocity // Numeric derivative: Positive slope means that the distance from obs to // satellite is increasing arma::vec obs_to_sat_velocity; obs_to_sat_velocity = (ranges.subvec(1, (n_points - 1)) - ranges.subvec(0, (n_points - 2)))/step_secs; // Doppler equations are formulated accounting for positive velocities if the // tx and rx are approaching to each other. So, the satellite velocity must // be redefined as: obs_to_sat_velocity = -obs_to_sat_velocity; //Doppler estimation arma::vec Doppler_Hz; Doppler_Hz = (obs_to_sat_velocity/GPS_C_m_s)*GPS_L1_FREQ_HZ; double mean_Doppler_Hz; mean_Doppler_Hz = arma::mean(Doppler_Hz); return mean_Doppler_Hz; } else { throw(1); } } void FrontEndCal::GPS_L1_front_end_model_E4000(double f_bb_true_Hz, double f_bb_meas_Hz, double fs_nominal_hz, double *estimated_fs_Hz, double *estimated_f_if_Hz, double *f_osc_err_ppm) { const double f_osc_n = 28.8e6; //PLL registers settings (according to E4000 datasheet) const double N = 109.0; const double Y = 65536.0; const double X = 26487.0; const double R = 2.0; // Obtained RF center frequency double f_rf_pll = (f_osc_n * (N + X / Y)) /R; // RF frequency error caused by fractional PLL roundings double f_bb_err_pll = GPS_L1_FREQ_HZ - f_rf_pll; // Measured F_rf error double f_rf_err = (f_bb_meas_Hz - f_bb_true_Hz) - f_bb_err_pll; double f_osc_err_hz = (f_rf_err*R)/(N+X/Y); // OJO,segun los datos gnss, la IF positiva hace disminuir la fs!! f_osc_err_hz = -f_osc_err_hz; *f_osc_err_ppm = f_osc_err_hz/(f_osc_n/1e6); double frac = fs_nominal_hz/f_osc_n; *estimated_fs_Hz = frac*(f_osc_n + f_osc_err_hz); *estimated_f_if_Hz = f_rf_err; } gnss-sdr-0.0.9/src/utils/front-end-cal/front_end_cal.h000066400000000000000000000126641305042567700226300ustar00rootroot00000000000000/*! * \file front_end_cal.h * \brief Interface of the Front-end calibration program. * \author Javier Arribas, 2013. jarribas(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_FRONT_END_CAL_H_ #define GNSS_SDR_FRONT_END_CAL_H_ #include #include "file_configuration.h" #include "concurrent_map.h" class FrontEndCal { private: std::shared_ptr configuration_; /*! * \brief LLA2ECEF Convert geodetic coordinates to Earth-centered Earth-fixed * (ECEF) coordinates. P = LLA2ECEF( LLA ) converts an M-by-3 array of geodetic coordinates * (latitude, longitude and altitude), LLA, to an M-by-3 array of ECEF * coordinates, P. LLA is in [degrees degrees meters]. P is in meters. * The default ellipsoid planet is WGS84. Original copyright (c) by Kai Borre. */ arma::vec lla2ecef(const arma::vec & lla); /*! * GEODETIC2ECEF Convert geodetic to geocentric (ECEF) coordinates * [X, Y, Z] = GEODETIC2ECEF(PHI, LAMBDA, H, ELLIPSOID) converts geodetic * point locations specified by the coordinate arrays PHI (geodetic * latitude in radians), LAMBDA (longitude in radians), and H (ellipsoidal * height) to geocentric Cartesian coordinates X, Y, and Z. The geodetic * coordinates refer to the reference ellipsoid specified by ELLIPSOID (a * row vector with the form [semimajor axis, eccentricity]). H must use * the same units as the semimajor axis; X, Y, and Z will be expressed in * these units also. * * The geocentric Cartesian coordinate system is fixed with respect to the * Earth, with its origin at the center of the ellipsoid and its X-, Y-, * and Z-axes intersecting the surface at the following points: * PHI LAMBDA * X-axis: 0 0 (Equator at the Prime Meridian) * Y-axis: 0 pi/2 (Equator at 90-degrees East * Z-axis: pi/2 0 (North Pole) * * A common synonym is Earth-Centered, Earth-Fixed coordinates, or ECEF. * * See also ECEF2GEODETIC, ECEF2LV, GEODETIC2GEOCENTRICLAT, LV2ECEF. * * Copyright 2004-2009 The MathWorks, Inc. * $Revision: 1.1.6.4 $ $Date: 2009/04/15 23:34:46 $ * Reference * --------- * Paul R. Wolf and Bon A. Dewitt, "Elements of Photogrammetry with * Applications in GIS," 3rd Ed., McGraw-Hill, 2000 (Appendix F-3). */ arma::vec geodetic2ecef(double phi, double lambda, double h, const arma::vec & ellipsoid); /*! * \brief Reads the ephemeris data from an external XML file * */ bool read_assistance_from_XML(); /*! * \brief Connects to Secure User Location Protocol (SUPL) server to obtain * the current GPS ephemeris and GPS assistance data. * */ int Get_SUPL_Assist(); const std::string eph_default_xml_filename = "./gps_ephemeris.xml"; public: /*! * \brief Sets the configuration data required by get_ephemeris function * */ void set_configuration(std::shared_ptr configuration); /*! * \brief This function connects to a Secure User Location Protocol (SUPL) server to obtain * the current GPS ephemeris and GPS assistance data. It requires the configuration parameters set by * set_configuration function. * */ bool get_ephemeris(); /*! * \brief This function estimates the GPS L1 satellite Doppler frequency [Hz] using the following data: * 1- Orbital model from the ephemeris * 2- Approximate GPS Time of Week (TOW) * 3- Approximate receiver Latitude and Longitude (WGS-84) * */ double estimate_doppler_from_eph(unsigned int PRN, double TOW, double lat, double lon, double height); /*! * \brief This function models the Elonics E4000 + RTL2832 front-end * Inputs: * f_bb_true_Hz - Ideal output frequency in baseband [Hz] * f_in_bb_meas_Hz - measured output frequency in baseband [Hz] * Outputs: * estimated_fs_Hz - Sampling frequency estimation based on the * measurements and the front-end model * estimated_f_if_bb_Hz - Equivalent bb if frequency estimation based on the * measurements and the front-end model * Front-end TUNER Elonics E4000 + RTL2832 sampler For GPS L1 1575.42 MHz * */ void GPS_L1_front_end_model_E4000(double f_bb_true_Hz,double f_bb_meas_Hz,double fs_nominal_hz, double *estimated_fs_Hz, double *estimated_f_if_Hz, double *f_osc_err_ppm ); FrontEndCal(); ~FrontEndCal(); }; #endif gnss-sdr-0.0.9/src/utils/front-end-cal/main.cc000066400000000000000000000530341305042567700211110ustar00rootroot00000000000000/*! * \file main.cc * \brief Main file of the Front-end calibration program. * \author Javier Arribas, 2013. jarribas(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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 FRONT_END_CAL_VERSION #define FRONT_END_CAL_VERSION "0.0.1" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "concurrent_map.h" #include "file_configuration.h" #include "gps_l1_ca_pcps_acquisition_fine_doppler.h" #include "gnss_signal.h" #include "gnss_synchro.h" #include "gnss_block_factory.h" #include "gps_navigation_message.h" #include "gps_ephemeris.h" #include "gps_cnav_ephemeris.h" #include "gps_almanac.h" #include "gps_iono.h" #include "gps_cnav_iono.h" #include "gps_utc_model.h" #include "galileo_ephemeris.h" #include "galileo_almanac.h" #include "galileo_iono.h" #include "galileo_utc_model.h" #include "sbas_telemetry_data.h" #include "sbas_ionospheric_correction.h" #include "sbas_satellite_correction.h" #include "sbas_ephemeris.h" #include "sbas_time.h" #include "gnss_sdr_supl_client.h" #include "front_end_cal.h" using google::LogMessage; DECLARE_string(log_dir); std::string s1_(GNSSSDR_INSTALL_DIR); std::string s2_("/share/gnss-sdr/conf/front-end-cal.conf"); std::string s3_ = s1_ + s2_; DEFINE_string(config_file, s3_, "Path to the file containing the configuration parameters"); concurrent_map global_gps_ephemeris_map; concurrent_map global_gps_iono_map; concurrent_map global_gps_utc_model_map; concurrent_map global_gps_almanac_map; concurrent_map global_gps_acq_assist_map; bool stop; concurrent_queue channel_internal_queue; GpsL1CaPcpsAcquisitionFineDoppler *acquisition; Gnss_Synchro *gnss_synchro; std::vector gnss_sync_vector; // ######## GNURADIO BLOCK MESSAGE RECEVER ######### class FrontEndCal_msg_rx; typedef boost::shared_ptr FrontEndCal_msg_rx_sptr; FrontEndCal_msg_rx_sptr FrontEndCal_msg_rx_make(); class FrontEndCal_msg_rx : public gr::block { private: friend FrontEndCal_msg_rx_sptr FrontEndCal_msg_rx_make(); void msg_handler_events(pmt::pmt_t msg); FrontEndCal_msg_rx(); public: int rx_message; ~FrontEndCal_msg_rx(); //!< Default destructor }; FrontEndCal_msg_rx_sptr FrontEndCal_msg_rx_make() { return FrontEndCal_msg_rx_sptr(new FrontEndCal_msg_rx()); } void FrontEndCal_msg_rx::msg_handler_events(pmt::pmt_t msg) { try { long int message = pmt::to_long(msg); rx_message = message; channel_internal_queue.push(rx_message); } catch(boost::bad_any_cast& e) { LOG(WARNING) << "msg_handler_telemetry Bad any cast!\n"; rx_message = 0; } } FrontEndCal_msg_rx::FrontEndCal_msg_rx() : gr::block("FrontEndCal_msg_rx", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)) { this->message_port_register_in(pmt::mp("events")); this->set_msg_handler(pmt::mp("events"), boost::bind(&FrontEndCal_msg_rx::msg_handler_events, this, _1)); rx_message = 0; } FrontEndCal_msg_rx::~FrontEndCal_msg_rx() {} // ########################################################### void wait_message() { while (!stop) { int message; channel_internal_queue.wait_and_pop(message); //std::cout<<"Acq mesage rx="<reset(); break; case 2: // negative acq //acquisition->reset(); break; case 3: stop = true; break; default: break; } } } bool front_end_capture(std::shared_ptr configuration) { gr::top_block_sptr top_block; GNSSBlockFactory block_factory; boost::shared_ptr queue; queue = gr::msg_queue::make(0); top_block = gr::make_top_block("Acquisition test"); std::shared_ptr source; try { source = block_factory.GetSignalSource(configuration, queue); } catch(const boost::exception_ptr & e) { std::cout << "Exception caught in creating source " << e << std::endl; return 0; } std::shared_ptr conditioner; try { conditioner = block_factory.GetSignalConditioner(configuration); } catch(const boost::exception_ptr & e) { std::cout << "Exception caught in creating signal conditioner " << e << std::endl; return 0; } gr::block_sptr sink; sink = gr::blocks::file_sink::make(sizeof(gr_complex), "tmp_capture.dat"); //--- Find number of samples per spreading code --- long fs_in_ = configuration->property("GNSS-SDR.internal_fs_hz", 2048000); int samples_per_code = round(fs_in_ / (GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS)); int nsamples = samples_per_code * 50; int skip_samples = fs_in_ * 5; // skip 5 seconds gr::block_sptr head = gr::blocks::head::make(sizeof(gr_complex), nsamples); gr::block_sptr skiphead = gr::blocks::skiphead::make(sizeof(gr_complex), skip_samples); try { source->connect(top_block); conditioner->connect(top_block); top_block->connect(source->get_right_block(), 0, conditioner->get_left_block(), 0); top_block->connect(conditioner->get_right_block(), 0, skiphead, 0); top_block->connect(skiphead, 0, head, 0); top_block->connect(head, 0, sink, 0); top_block->run(); } catch(const std::exception & e) { std::cout << "Failure connecting the GNU Radio blocks " << e.what() << std::endl; return false; } //delete conditioner; //delete source; return true; } static time_t utc_time(int week, long tow) { time_t t; /* Jan 5/6 midnight 1980 - beginning of GPS time as Unix time */ t = 315964801; /* soon week will wrap again, uh oh... */ /* TS 44.031: GPSTOW, range 0-604799.92, resolution 0.08 sec, 23-bit presentation */ /* The factor 0.08 was applied in the ephemeris SUPL class */ /* here the tow is in [s] */ t += (1024 + week) * 604800 + tow; return t; } int main(int argc, char** argv) { const std::string intro_help( std::string("\n RTL-SDR E4000 RF front-end center frequency and sampling rate calibration tool that uses GPS signals\n") + "Copyright (C) 2010-2017 (see AUTHORS file for a list of contributors)\n" + "This program comes with ABSOLUTELY NO WARRANTY;\n" + "See COPYING file to see a copy of the General Public License\n \n"); google::SetUsageMessage(intro_help); google::SetVersionString(FRONT_END_CAL_VERSION); google::ParseCommandLineFlags(&argc, &argv, true); std::cout << "Initializing... Please wait." << std::endl; google::InitGoogleLogging(argv[0]); if (FLAGS_log_dir.empty()) { std::cout << "Logging will be done at " << "/tmp" << std::endl << "Use front-end-cal --log_dir=/path/to/log to change that." << std::endl; } else { const boost::filesystem::path p (FLAGS_log_dir); if (!boost::filesystem::exists(p)) { std::cout << "The path " << FLAGS_log_dir << " does not exist, attempting to create it" << std::endl; boost::filesystem::create_directory(p); } std::cout << "Logging with be done at " << FLAGS_log_dir << std::endl; } // 0. Instantiate the FrontEnd Calibration class FrontEndCal front_end_cal; // 1. Load configuration parameters from config file std::shared_ptr configuration = std::make_shared(FLAGS_config_file); front_end_cal.set_configuration(configuration); // 2. Get SUPL information from server: Ephemeris record, assistance info and TOW if (front_end_cal.get_ephemeris() == true) { std::cout << "SUPL data received OK!" << std::endl; } else { std::cout << "Failure connecting to SUPL server" < Acquisition_10m) gr::top_block_sptr top_block; top_block = gr::make_top_block("Acquisition test"); // Satellite signal definition gnss_synchro = new Gnss_Synchro(); gnss_synchro->Channel_ID = 0; gnss_synchro->System = 'G'; std::string signal = "1C"; signal.copy(gnss_synchro->Signal, 2, 0); gnss_synchro->PRN = 1; long fs_in_ = configuration->property("GNSS-SDR.internal_fs_hz", 2048000); GNSSBlockFactory block_factory; acquisition = new GpsL1CaPcpsAcquisitionFineDoppler(configuration.get(), "Acquisition", 1, 1); acquisition->set_channel(1); acquisition->set_gnss_synchro(gnss_synchro); acquisition->set_threshold(configuration->property("Acquisition.threshold", 0.0)); acquisition->set_doppler_max(configuration->property("Acquisition.doppler_max", 10000)); acquisition->set_doppler_step(configuration->property("Acquisition.doppler_step", 250)); gr::block_sptr source; source = gr::blocks::file_source::make(sizeof(gr_complex), "tmp_capture.dat"); boost::shared_ptr msg_rx = FrontEndCal_msg_rx_make(); //gr_basic_block_sptr head = gr_make_head(sizeof(gr_complex), nsamples); //gr_head_sptr head_sptr = boost::dynamic_pointer_cast(head); //head_sptr->set_length(nsamples); //head_sptr->reset(); try { acquisition->connect(top_block); top_block->connect(source, 0, acquisition->get_left_block(), 0); top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx,pmt::mp("events")); } catch(const std::exception & e) { std::cout << "Failure connecting the GNU Radio blocks: " << e.what() << std::endl; } // 5. Run the flowgraph // Get visible GPS satellites (positive acquisitions with Doppler measurements) // Compute Doppler estimations //todo: Fix the front-end cal to support new channel internal message system (no more external queues) std::map doppler_measurements_map; std::map cn0_measurements_map; boost::thread ch_thread; // record startup time struct timeval tv; gettimeofday(&tv, NULL); long long int begin = tv.tv_sec * 1000000 + tv.tv_usec; bool start_msg = true; for (unsigned int PRN=1; PRN<33; PRN++) { gnss_synchro->PRN = PRN; acquisition->set_gnss_synchro(gnss_synchro); acquisition->init(); acquisition->reset(); stop = false; try { ch_thread = boost::thread(wait_message); } catch(const boost::thread_resource_error & e) { LOG(INFO) << "Exception caught (thread resource error)"; } top_block->run(); if (start_msg == true) { std::cout << "Searching for GPS Satellites in L1 band..." << std::endl; std::cout << "["; start_msg = false; } if (gnss_sync_vector.size()>0) { std::cout << " " << PRN << " "; double doppler_measurement_hz = 0; for (std::vector::iterator it = gnss_sync_vector.begin() ; it != gnss_sync_vector.end(); ++it) { doppler_measurement_hz += (*it).Acq_doppler_hz; } doppler_measurement_hz = doppler_measurement_hz/gnss_sync_vector.size(); doppler_measurements_map.insert(std::pair(PRN, doppler_measurement_hz)); } else { std::cout << " . "; } channel_internal_queue.push(3); try { ch_thread.join(); } catch(const boost::thread_resource_error & e) { LOG(INFO) << "Exception caught while joining threads."; } gnss_sync_vector.clear(); boost::dynamic_pointer_cast(source)->seek(0, 0); std::cout.flush(); } std::cout << "]" << std::endl; // report the elapsed time gettimeofday(&tv, NULL); long long int end = tv.tv_sec * 1000000 + tv.tv_usec; std::cout << "Total signal acquisition run time " << ((double)(end - begin))/1000000.0 << " [seconds]" << std::endl; //6. find TOW from SUPL assistance double current_TOW = 0; if (global_gps_ephemeris_map.size() > 0) { std::map Eph_map; Eph_map = global_gps_ephemeris_map.get_map_copy(); current_TOW = Eph_map.begin()->second.d_TOW; time_t t = utc_time(Eph_map.begin()->second.i_GPS_week, (long int)current_TOW); fprintf(stdout, "Reference Time:\n"); fprintf(stdout, " GPS Week: %d\n", Eph_map.begin()->second.i_GPS_week); fprintf(stdout, " GPS TOW: %ld %lf\n", (long int)current_TOW, (long int)current_TOW*0.08); fprintf(stdout, " ~ UTC: %s", ctime(&t)); std::cout << "Current TOW obtained from SUPL assistance = " << current_TOW << std::endl; } else { std::cout << "Unable to get Ephemeris SUPL assistance. TOW is unknown!" << std::endl; delete acquisition; delete gnss_synchro; google::ShutDownCommandLineFlags(); std::cout << "GNSS-SDR Front-end calibration program ended." << std::endl; return 0; } //Get user position from config file (or from SUPL using GSM Cell ID) double lat_deg = configuration->property("GNSS-SDR.init_latitude_deg", 41.0); double lon_deg = configuration->property("GNSS-SDR.init_longitude_deg", 2.0); double altitude_m = configuration->property("GNSS-SDR.init_altitude_m", 100); std::cout << "Reference location (defined in config file):" << std::endl; std::cout << "Latitude=" << lat_deg << " [�]" << std::endl; std::cout << "Longitude=" << lon_deg << " [�]" << std::endl; std::cout << "Altitude=" << altitude_m << " [m]" << std::endl; if (doppler_measurements_map.size() == 0) { std::cout << "Sorry, no GPS satellites detected in the front-end capture, please check the antenna setup..." << std::endl; delete acquisition; delete gnss_synchro; google::ShutDownCommandLineFlags(); std::cout << "GNSS-SDR Front-end calibration program ended." << std::endl; return 0; } std::map f_if_estimation_Hz_map; std::map f_fs_estimation_Hz_map; std::map f_ppm_estimation_Hz_map; std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(2) << "Doppler analysis results:" << std::endl; std::cout << "SV ID Measured [Hz] Predicted [Hz]" << std::endl; for (std::map::iterator it = doppler_measurements_map.begin() ; it != doppler_measurements_map.end(); ++it) { try { double doppler_estimated_hz; doppler_estimated_hz = front_end_cal.estimate_doppler_from_eph(it->first, current_TOW, lat_deg, lon_deg, altitude_m); std::cout << " " << it->first << " " << it->second << " " << doppler_estimated_hz << std::endl; // 7. Compute front-end IF and sampling frequency estimation // Compare with the measurements and compute clock drift using FE model double estimated_fs_Hz, estimated_f_if_Hz, f_osc_err_ppm; front_end_cal.GPS_L1_front_end_model_E4000(doppler_estimated_hz, it->second,fs_in_, &estimated_fs_Hz, &estimated_f_if_Hz, &f_osc_err_ppm ); f_if_estimation_Hz_map.insert(std::pair(it->first,estimated_f_if_Hz)); f_fs_estimation_Hz_map.insert(std::pair(it->first,estimated_fs_Hz)); f_ppm_estimation_Hz_map.insert(std::pair(it->first,f_osc_err_ppm)); } catch(const std::logic_error & e) { std::cout << "Logic error caught: " << e.what() << std::endl; } catch(const boost::lock_error & e) { std::cout << "Exception caught while reading ephemeris" << std::endl; } catch(int ex) { std::cout << " " << it->first << " " << it->second << " (Eph not found)" << std::endl; } } // FINAL FE estimations double mean_f_if_Hz = 0; double mean_fs_Hz = 0; double mean_osc_err_ppm = 0; int n_elements = f_if_estimation_Hz_map.size(); for (std::map::iterator it = f_if_estimation_Hz_map.begin() ; it != f_if_estimation_Hz_map.end(); ++it) { mean_f_if_Hz += (*it).second; mean_fs_Hz += f_fs_estimation_Hz_map.find((*it).first)->second; mean_osc_err_ppm += f_ppm_estimation_Hz_map.find((*it).first)->second; } mean_f_if_Hz /= n_elements; mean_fs_Hz /= n_elements; mean_osc_err_ppm /= n_elements; std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(2) << "Parameters estimation for Elonics E4000 Front-End:" << std::endl; std::cout << "Sampling frequency =" << mean_fs_Hz << " [Hz]" << std::endl; std::cout << "IF bias present in baseband=" << mean_f_if_Hz << " [Hz]" << std::endl; std::cout << "Reference oscillator error =" << mean_osc_err_ppm << " [ppm]" << std::endl; std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(2) << "Corrected Doppler vs. Predicted" << std::endl; std::cout << "SV ID Corrected [Hz] Predicted [Hz]" << std::endl; for (std::map::iterator it = doppler_measurements_map.begin() ; it != doppler_measurements_map.end(); ++it) { try { double doppler_estimated_hz; doppler_estimated_hz = front_end_cal.estimate_doppler_from_eph(it->first, current_TOW, lat_deg, lon_deg, altitude_m); std::cout << " " << it->first << " " << it->second - mean_f_if_Hz << " " << doppler_estimated_hz << std::endl; } catch(const std::logic_error & e) { std::cout << "Logic error caught: " << e.what() << std::endl; } catch(const boost::lock_error & e) { std::cout << "Exception caught while reading ephemeris" << std::endl; } catch(int ex) { std::cout << " " << it->first << " " << it->second - mean_f_if_Hz << " (Eph not found)" << std::endl; } } // 8. Generate GNSS-SDR config file. delete acquisition; delete gnss_synchro; google::ShutDownCommandLineFlags(); std::cout << "GNSS-SDR Front-end calibration program ended." << std::endl; } gnss-sdr-0.0.9/src/utils/gnuplot/000077500000000000000000000000001305042567700167105ustar00rootroot00000000000000gnss-sdr-0.0.9/src/utils/gnuplot/4_GPS_3_GAL.plt000066400000000000000000000021601305042567700212110ustar00rootroot00000000000000#set terminal pdf color font "Bold,14" #set output "IFEN_accuracy.pdf" set terminal jpeg font "Helvetica, 14" set output "4_GPS_3_GAL_accuracy_precision.jpeg" set grid set xrange [-10:10] set yrange [-5:15] set ylabel "North [m]" set xlabel "East [m]" set key Left left set title "IFEN simulated data, 4 GPS, 8 Gal - Accuracy and Precision" #file1="8_GPS_GNSS_SDR_solutions.txt" #file2="8_GAL_GNSS_SDR_solutions.txt" file3="4_GPS_3_GAL_GNSS_SDR_solutions.txt" #values to copy from statistic file DRMS= 3.077806456 DUE_DRMS= 6.155612912 CEP= 2.565164055 #difference with respect to the reference position #values to copy from statistic file delta_E= -1.812 # combined delta_N= 3.596 # combined set parametric #dummy variable is t for curves, u/v for surfaces set size square set angle degree set trange [0:360] #radius_6_GPS=6 plot file3 u 9:10 with points pointsize 0.3 lc rgb "green" notitle,\ DRMS*sin(t)+delta_E,DRMS*cos(t)+delta_N lw 3 lc rgb "black" title "DRMS",\ DUE_DRMS*sin(t)+delta_E,DUE_DRMS*cos(t)+delta_N lw 2 lc rgb "gray" title "2DRMS",\ CEP*sin(t)+delta_E,CEP*cos(t)+delta_N lw 1 lc rgb "black" title "CEP" gnss-sdr-0.0.9/src/utils/gnuplot/4_GPS_3_GAL_GNSS_SDR_solutions.txt000066400000000000000000011321261305042567700247210ustar00rootroot00000000000000 time X [m] Y [m] Z [m] Long [deg] Lat [deg] h [m] E(Acc) [m] N(Acc) [m] Up(Acc) [m] E(Pre) [m] N(Pre) [m] Up(Pre) [m] Tot Sat Gal GPS GDOP 2013-Sep-20 09:11:16 4171693.97233 872117.53398 4730015.03429 11.80796 48.17154 533.09677 -3.02276 4.40094 8.50611 -1.20980 0.80488 -0.48942 7 3 4 2.38 2013-Sep-20 09:11:16 4171693.33830 872116.34933 4730014.33700 11.80795 48.17154 532.00164 -4.05260 4.57900 7.41098 -2.23964 0.98294 -1.58455 7 3 4 2.38 2013-Sep-20 09:11:16 4171693.05315 872118.15688 4730014.15668 11.80798 48.17154 531.92781 -2.22494 4.39110 7.33715 -0.41198 0.79504 -1.65838 7 3 4 2.38 2013-Sep-20 09:11:16 4171692.12670 872118.20356 4730011.97295 11.80798 48.17153 529.70220 -1.98967 3.60338 5.11154 -0.17671 0.00732 -3.88399 7 3 4 2.38 2013-Sep-20 09:11:16 4171696.84323 872121.85875 4730020.07446 11.80801 48.17154 539.31673 0.62302 5.00884 14.72607 2.43598 1.41277 5.73054 7 3 4 2.38 2013-Sep-20 09:11:16 4171693.35432 872119.69457 4730016.43049 11.80800 48.17155 534.02857 -0.78142 5.45339 9.43792 1.03154 1.85733 0.44238 7 3 4 2.38 2013-Sep-20 09:11:16 4171693.12694 872119.79577 4730015.98216 11.80800 48.17155 533.55988 -0.63583 5.30481 8.96922 1.17713 1.70875 -0.02631 7 3 4 2.38 2013-Sep-20 09:11:16 4171696.96879 872121.82141 4730019.17596 11.80801 48.17154 538.72409 0.56077 4.32373 14.13343 2.37373 0.72767 5.13790 7 3 4 2.38 2013-Sep-20 09:11:16 4171694.15949 872120.93965 4730016.49439 11.80801 48.17154 534.77171 0.27255 4.71888 10.18105 2.08550 1.12282 1.18552 7 3 4 2.38 2013-Sep-20 09:11:16 4171693.75614 872120.79377 4730017.69730 11.80801 48.17155 535.38484 0.21229 5.83754 10.79418 2.02525 2.24148 1.79865 7 3 4 2.38 2013-Sep-20 09:11:16 4171695.61533 872122.42037 4730020.91833 11.80802 48.17156 539.22062 1.42402 6.38158 14.62996 3.23698 2.78552 5.63443 7 3 4 2.38 2013-Sep-20 09:11:16 4171694.88778 872121.15270 4730019.60309 11.80801 48.17155 537.59264 0.33206 6.22839 13.00198 2.14502 2.63233 4.00645 7 3 4 2.38 2013-Sep-20 09:11:16 4171693.43914 872118.88386 4730017.86310 11.80798 48.17156 535.04081 -1.59233 6.47055 10.45015 0.22063 2.87448 1.45462 7 3 4 2.38 2013-Sep-20 09:11:16 4171692.22580 872118.12648 4730014.50631 11.80798 48.17154 531.64410 -2.08540 5.23236 7.05344 -0.27244 1.63630 -1.94209 7 3 4 2.38 2013-Sep-20 09:11:16 4171694.15704 872116.07742 4730015.59062 11.80795 48.17154 533.43313 -4.48630 4.85933 8.84247 -2.67334 1.26327 -0.15306 7 3 4 2.38 2013-Sep-20 09:11:16 4171693.05163 872116.15088 4730014.39550 11.80795 48.17154 531.83101 -4.18818 4.85737 7.24035 -2.37522 1.26131 -1.75518 7 3 4 2.38 2013-Sep-20 09:11:16 4171691.44820 872115.16638 4730012.34165 11.80794 48.17154 529.11954 -4.82374 4.80727 4.52888 -3.01078 1.21121 -4.46665 7 3 4 2.38 2013-Sep-20 09:11:16 4171685.37039 872113.72974 4730008.72245 11.80794 48.17156 522.25911 -4.98626 7.04568 -2.33155 -3.17330 3.44962 -11.32708 7 3 4 2.38 2013-Sep-20 09:11:16 4171690.06034 872116.43183 4730013.82510 11.80796 48.17156 529.49163 -3.30106 6.61590 4.90098 -1.48811 3.01984 -4.09455 7 3 4 2.38 2013-Sep-20 09:11:16 4171691.23714 872116.64891 4730014.88922 11.80796 48.17156 531.08239 -3.32939 6.43413 6.49173 -1.51643 2.83807 -2.50380 7 3 4 2.38 2013-Sep-20 09:11:16 4171693.21171 872117.89698 4730015.57287 11.80797 48.17154 533.05111 -2.51180 5.25955 8.46046 -0.69884 1.66349 -0.53507 7 3 4 2.38 2013-Sep-20 09:11:16 4171690.94846 872116.12466 4730012.76005 11.80795 48.17155 529.23586 -3.78347 5.30468 4.64520 -1.97051 1.70861 -4.35033 7 3 4 2.38 2013-Sep-20 09:11:16 4171691.01303 872116.67548 4730012.29188 11.80796 48.17154 529.00432 -3.25752 4.86136 4.41366 -1.44456 1.26530 -4.58187 7 3 4 2.38 2013-Sep-20 09:11:17 4171686.92529 872115.59058 4730009.79479 11.80796 48.17155 524.32713 -3.48298 6.34298 -0.26352 -1.67003 2.74693 -9.25905 7 3 4 2.38 2013-Sep-20 09:11:17 4171689.09965 872117.40230 4730013.21592 11.80798 48.17156 528.54302 -2.15454 6.76235 3.95236 -0.34158 3.16630 -5.04317 7 3 4 2.38 2013-Sep-20 09:11:17 4171693.82864 872118.34509 4730017.17592 11.80798 48.17155 534.70949 -2.19941 5.81033 10.11883 -0.38645 2.21427 1.12330 7 3 4 2.38 2013-Sep-20 09:11:17 4171691.85980 872118.16204 4730017.17833 11.80798 48.17156 533.40107 -1.97569 7.27587 8.81041 -0.16274 3.67981 -0.18512 7 3 4 2.38 2013-Sep-20 09:11:17 4171691.77791 872117.74707 4730016.15426 11.80797 48.17156 532.52790 -2.36513 6.71592 7.93724 -0.55217 3.11986 -1.05829 7 3 4 2.38 2013-Sep-20 09:11:17 4171690.71021 872117.27718 4730014.77869 11.80797 48.17156 530.74179 -2.60659 6.64895 6.15114 -0.79363 3.05288 -2.84440 7 3 4 2.38 2013-Sep-20 09:11:17 4171689.81704 872118.53772 4730015.06359 11.80799 48.17156 530.54306 -1.18995 7.29820 5.95240 0.62301 3.70214 -3.04313 7 3 4 2.38 2013-Sep-20 09:11:17 4171691.55376 872116.79531 4730016.19778 11.80796 48.17156 532.28412 -3.25088 7.05356 7.69347 -1.43793 3.45749 -1.30207 7 3 4 2.38 2013-Sep-20 09:11:17 4171693.82776 872118.45535 4730018.91249 11.80798 48.17156 536.01796 -2.09131 6.95229 11.42730 -0.27835 3.35622 2.43177 7 3 4 2.38 2013-Sep-20 09:11:17 4171694.19655 872118.91481 4730019.87640 11.80798 48.17156 537.03965 -1.71703 7.25607 12.44900 0.09593 3.66001 3.45347 7 3 4 2.38 2013-Sep-20 09:11:17 4171691.86539 872117.99083 4730016.02995 11.80798 48.17156 532.52565 -2.14443 6.53204 7.93499 -0.33147 2.93598 -1.06054 7 3 4 2.38 2013-Sep-20 09:11:17 4171693.15533 872117.98759 4730017.59780 11.80797 48.17156 534.53554 -2.41156 6.63729 9.94488 -0.59860 3.04122 0.94935 7 3 4 2.38 2013-Sep-20 09:11:17 4171692.18121 872115.90348 4730016.83466 11.80795 48.17156 533.04657 -4.25223 7.15664 8.45591 -2.43927 3.56057 -0.53962 7 3 4 2.38 2013-Sep-20 09:11:17 4171688.42657 872114.52355 4730012.03638 11.80794 48.17156 526.83185 -4.83464 6.90560 2.24119 -3.02169 3.30954 -6.75434 7 3 4 2.38 2013-Sep-20 09:11:17 4171686.83368 872114.31800 4730010.30785 11.80794 48.17156 524.47597 -4.70988 6.94600 -0.11468 -2.89693 3.34994 -9.11022 7 3 4 2.38 2013-Sep-20 09:11:17 4171689.01630 872114.65818 4730011.81674 11.80794 48.17155 527.07153 -4.82353 6.30846 2.48087 -3.01057 2.71240 -6.51466 7 3 4 2.38 2013-Sep-20 09:11:17 4171689.59940 872113.40135 4730012.50944 11.80792 48.17156 527.79681 -6.17309 6.53677 3.20615 -4.36014 2.94071 -5.78938 7 3 4 2.38 2013-Sep-20 09:11:17 4171691.49667 872115.40807 4730015.71094 11.80794 48.17156 531.69477 -4.59708 6.98205 7.10411 -2.78412 3.38598 -1.89142 7 3 4 2.38 2013-Sep-20 09:11:17 4171690.13679 872116.03487 4730014.42512 11.80796 48.17156 529.93447 -3.70527 7.02083 5.34381 -1.89231 3.42477 -3.65172 7 3 4 2.38 2013-Sep-20 09:11:17 4171688.48177 872115.80343 4730011.69753 11.80796 48.17156 526.79005 -3.59313 6.44420 2.19940 -1.78018 2.84814 -6.79613 7 3 4 2.38 2013-Sep-20 09:11:17 4171691.34954 872115.59222 4730014.29031 11.80795 48.17155 530.56528 -4.38672 6.11386 5.97463 -2.57377 2.51780 -3.02091 7 3 4 2.38 2013-Sep-20 09:11:17 4171692.31645 872117.07132 4730015.85773 11.80796 48.17155 532.56628 -3.13678 6.22840 7.97562 -1.32382 2.63234 -1.01991 7 3 4 2.38 2013-Sep-20 09:11:17 4171693.22291 872119.00896 4730017.72048 11.80799 48.17156 534.81045 -1.42563 6.51407 10.21980 0.38733 2.91801 1.22427 7 3 4 2.38 2013-Sep-20 09:11:17 4171692.72321 872118.13057 4730016.70730 11.80798 48.17155 533.60942 -2.18318 6.33679 9.01876 -0.37022 2.74073 0.02323 7 3 4 2.38 2013-Sep-20 09:11:17 4171693.24503 872117.69714 4730017.55960 11.80797 48.17156 534.52598 -2.71422 6.59068 9.93533 -0.90126 2.99461 0.93980 7 3 4 2.38 2013-Sep-20 09:11:18 4171691.08816 872116.06995 4730015.06700 11.80795 48.17156 531.03859 -3.86561 6.74964 6.44794 -2.05265 3.15358 -2.54760 7 3 4 2.38 2013-Sep-20 09:11:18 4171690.44418 872115.43965 4730013.68149 11.80795 48.17156 529.49979 -4.35079 6.39145 4.90913 -2.53783 2.79539 -4.08640 7 3 4 2.38 2013-Sep-20 09:11:18 4171698.43425 872119.48630 4730014.15842 11.80798 48.17150 535.62326 -2.02481 0.26471 11.03261 -0.21185 -3.33135 2.03707 7 3 4 2.38 2013-Sep-20 09:11:18 4171699.68595 872120.78596 4730016.26269 11.80799 48.17150 538.18571 -1.00878 0.55692 13.59506 0.80418 -3.03914 4.59952 7 3 4 2.38 2013-Sep-20 09:11:18 4171697.25383 872120.30384 4730014.30052 11.80799 48.17151 535.07014 -0.98301 1.09579 10.47949 0.82995 -2.50027 1.48396 7 3 4 2.38 2013-Sep-20 09:11:18 4171693.89224 872119.29061 4730011.05323 11.80799 48.17151 530.31775 -1.28691 1.53652 5.72710 0.52605 -2.05954 -3.26844 7 3 4 2.38 2013-Sep-20 09:11:18 4171693.99654 872119.23313 4730012.34424 11.80799 48.17152 531.33999 -1.36451 2.33020 6.74933 0.44845 -1.26586 -2.24620 7 3 4 2.38 2013-Sep-20 09:11:18 4171695.13076 872120.86904 4730013.19185 11.80801 48.17151 532.93524 0.00468 1.81875 8.34458 1.81764 -1.77731 -0.65095 7 3 4 2.38 2013-Sep-20 09:11:18 4171694.40997 872119.59890 4730012.76392 11.80799 48.17152 531.97250 -1.09109 2.25276 7.38185 0.72187 -1.34330 -1.61369 7 3 4 2.38 2013-Sep-20 09:11:18 4171691.49595 872119.36997 4730010.96923 11.80800 48.17153 528.70172 -0.71887 3.21620 4.11107 1.09409 -0.37986 -4.88447 7 3 4 2.38 2013-Sep-20 09:11:18 4171694.91929 872120.89919 4730015.36048 11.80801 48.17153 534.41725 0.07747 3.41466 9.82660 1.89042 -0.18140 0.83106 7 3 4 2.38 2013-Sep-20 09:11:18 4171696.49958 872120.85127 4730016.56994 11.80800 48.17153 536.34353 -0.29282 3.07593 11.75288 1.52014 -0.52013 2.75734 7 3 4 2.38 2013-Sep-20 09:11:18 4171696.90910 872121.40991 4730017.29374 11.80801 48.17153 537.22644 0.17019 3.17476 12.63578 1.98315 -0.42131 3.64025 7 3 4 2.38 2013-Sep-20 09:11:18 4171697.26759 872120.99996 4730017.00067 11.80800 48.17152 537.18613 -0.30445 2.78034 12.59547 1.50851 -0.81572 3.59994 7 3 4 2.38 2013-Sep-20 09:11:18 4171698.17413 872122.27525 4730017.12289 11.80802 48.17152 538.04303 0.75835 2.00619 13.45237 2.57131 -1.58987 4.45684 7 3 4 2.38 2013-Sep-20 09:11:18 4171696.15179 872121.89065 4730015.37314 11.80802 48.17152 535.36656 0.79573 2.37297 10.77590 2.60869 -1.22309 1.78037 7 3 4 2.38 2013-Sep-20 09:11:18 4171695.18910 872122.07684 4730014.71611 11.80802 48.17152 534.27394 1.17498 2.60857 9.68329 2.98794 -0.98750 0.68775 7 3 4 2.38 2013-Sep-20 09:11:18 4171696.78909 872120.50855 4730013.65031 11.80800 48.17151 534.31021 -0.68753 0.96992 9.71955 1.12543 -2.62614 0.72402 7 3 4 2.38 2013-Sep-20 09:11:18 4171696.91691 872120.01392 4730013.44362 11.80799 48.17151 534.17213 -1.19785 0.81427 9.58148 0.61511 -2.78179 0.58594 7 3 4 2.38 2013-Sep-20 09:11:18 4171696.73519 872120.20544 4730013.29070 11.80799 48.17151 533.96569 -0.97320 0.81562 9.37504 0.83976 -2.78044 0.37950 7 3 4 2.38 2013-Sep-20 09:11:18 4171695.42505 872121.01961 4730012.32164 11.80801 48.17151 532.49947 0.09184 1.00080 7.90881 1.90480 -2.59526 -1.08672 7 3 4 2.38 2013-Sep-20 09:11:18 4171695.87389 872120.48848 4730014.33209 11.80800 48.17152 534.21805 -0.51990 2.09519 9.62740 1.29306 -1.50088 0.63186 7 3 4 2.38 2013-Sep-20 09:11:18 4171695.90048 872119.75316 4730013.94614 11.80799 48.17152 533.84748 -1.24511 1.93053 9.25682 0.56785 -1.66553 0.26129 7 3 4 2.38 2013-Sep-20 09:11:18 4171696.74939 872120.68241 4730014.13398 11.80800 48.17151 534.66842 -0.50923 1.29492 10.07776 1.30373 -2.30114 1.08223 7 3 4 2.38 2013-Sep-20 09:11:18 4171690.28984 872120.16318 4730010.86429 11.80801 48.17153 527.94444 0.30436 3.90497 3.35378 2.11732 0.30891 -5.64175 7 3 4 2.38 2013-Sep-20 09:11:19 4171689.17640 872120.49096 4730009.94144 11.80802 48.17153 526.57467 0.85305 4.05166 1.98401 2.66601 0.45560 -7.01152 7 3 4 2.38 2013-Sep-20 09:11:19 4171695.08288 872120.24787 4730014.08012 11.80800 48.17152 533.48111 -0.59355 2.54078 8.89045 1.21941 -1.05528 -0.10508 7 3 4 2.38 2013-Sep-20 09:11:19 4171697.78397 872121.75338 4730016.49995 11.80801 48.17152 537.25293 0.32736 1.95490 12.66228 2.14032 -1.64116 3.66674 7 3 4 2.38 2013-Sep-20 09:11:19 4171696.86836 872122.35693 4730016.35705 11.80802 48.17152 536.63112 1.10551 2.43539 12.04046 2.91847 -1.16067 3.04493 7 3 4 2.38 2013-Sep-20 09:11:19 4171697.83682 872122.88929 4730018.34490 11.80802 48.17152 538.81720 1.42842 2.97356 14.22655 3.24138 -0.62251 5.23101 7 3 4 2.38 2013-Sep-20 09:11:19 4171694.71701 872121.43601 4730015.63471 11.80801 48.17153 534.56280 0.64432 3.66323 9.97215 2.45728 0.06717 0.97662 7 3 4 2.38 2013-Sep-20 09:11:19 4171691.80256 872117.66279 4730011.39013 11.80797 48.17153 528.98252 -2.45267 3.53357 4.39187 -0.63971 -0.06249 -4.60366 7 3 4 2.38 2013-Sep-20 09:11:19 4171690.41152 872117.25164 4730010.27956 11.80797 48.17153 527.19082 -2.57046 3.87022 2.60016 -0.75750 0.27416 -6.39537 7 3 4 2.38 2013-Sep-20 09:11:19 4171692.07568 872117.33262 4730011.41932 11.80797 48.17153 529.13751 -2.83174 3.40418 4.54685 -1.01878 -0.19188 -4.44868 7 3 4 2.38 2013-Sep-20 09:11:19 4171691.61815 872117.65543 4730010.80166 11.80797 48.17153 528.42265 -2.42214 3.27675 3.83199 -0.60918 -0.31931 -5.16354 7 3 4 2.38 2013-Sep-20 09:11:19 4171695.46147 872118.75829 4730013.87402 11.80798 48.17152 533.37139 -2.12908 2.35433 8.78073 -0.31612 -1.24173 -0.21480 7 3 4 2.38 2013-Sep-20 09:11:19 4171696.08218 872120.66208 4730014.38537 11.80800 48.17152 534.41743 -0.39260 1.95233 9.82677 1.42036 -1.64374 0.83124 7 3 4 2.38 2013-Sep-20 09:11:19 4171691.21510 872119.56773 4730011.98245 11.80800 48.17153 529.30036 -0.46783 4.06661 4.70971 1.34513 0.47055 -4.28582 7 3 4 2.38 2013-Sep-20 09:11:19 4171693.34029 872120.71321 4730015.51992 11.80801 48.17154 533.47992 0.21853 4.70103 8.88926 2.03149 1.10497 -0.10627 7 3 4 2.38 2013-Sep-20 09:11:19 4171695.08296 872120.74421 4730017.59124 11.80800 48.17154 536.16518 -0.10773 4.80661 11.57453 1.70523 1.21055 2.57900 7 3 4 2.38 2013-Sep-20 09:11:19 4171696.95736 872120.77579 4730018.50428 11.80800 48.17153 538.07343 -0.46038 4.04356 13.48277 1.35258 0.44750 4.48724 7 3 4 2.38 2013-Sep-20 09:11:19 4171696.21489 872120.63733 4730016.75060 11.80800 48.17153 536.26311 -0.44398 3.43668 11.67245 1.36898 -0.15938 2.67692 7 3 4 2.38 2013-Sep-20 09:11:19 4171696.08334 872121.02813 4730015.74784 11.80801 48.17152 535.48337 -0.03454 2.80430 10.89271 1.77843 -0.79177 1.89718 7 3 4 2.38 2013-Sep-20 09:11:19 4171699.46538 872122.79974 4730018.14445 11.80802 48.17151 539.71873 1.00751 1.66569 15.12807 2.82047 -1.93037 6.13254 7 3 4 2.38 2013-Sep-20 09:11:19 4171697.17088 872121.27785 4730016.31399 11.80801 48.17152 536.64924 -0.01264 2.35056 12.05859 1.80032 -1.24550 3.06306 7 3 4 2.38 2013-Sep-20 09:11:19 4171695.44672 872120.32287 4730016.13813 11.80800 48.17153 535.26237 -0.59460 3.63646 10.67171 1.21836 0.04040 1.67618 7 3 4 2.38 2013-Sep-20 09:11:19 4171693.00983 872119.13721 4730014.84526 11.80799 48.17154 532.54640 -1.25649 4.73244 7.95575 0.55647 1.13638 -1.03979 7 3 4 2.38 2013-Sep-20 09:11:19 4171692.70593 872118.50845 4730013.09221 11.80798 48.17153 530.95594 -1.80977 3.88085 6.36528 0.00319 0.28479 -2.63025 7 3 4 2.38 2013-Sep-20 09:11:19 4171695.84252 872119.33060 4730015.73359 11.80798 48.17153 535.08389 -1.64686 3.22929 10.49323 0.16610 -0.36678 1.49770 7 3 4 2.38 2013-Sep-20 09:11:19 4171696.51959 872119.93155 4730015.12635 11.80799 48.17152 535.15540 -1.19717 2.23884 10.56474 0.61579 -1.35723 1.56921 7 3 4 2.38 2013-Sep-20 09:11:20 4171692.85378 872119.16464 4730012.29481 11.80799 48.17153 530.54783 -1.19771 3.14118 5.95717 0.61525 -0.45488 -3.03836 7 3 4 2.38 2013-Sep-20 09:11:20 4171690.07850 872117.72466 4730010.22010 11.80798 48.17153 526.99367 -2.03931 4.00134 2.40302 -0.22635 0.40528 -6.59252 7 3 4 2.38 2013-Sep-20 09:11:20 4171692.98867 872118.92389 4730013.65917 11.80799 48.17153 531.61967 -1.46097 3.98939 7.02901 0.35199 0.39333 -1.96652 7 3 4 2.38 2013-Sep-20 09:11:20 4171694.02280 872118.47920 4730015.30830 11.80798 48.17154 533.46290 -2.10787 4.40274 8.87224 -0.29491 0.80667 -0.12329 7 3 4 2.38 2013-Sep-20 09:11:20 4171694.02652 872119.35278 4730016.01707 11.80799 48.17154 534.11268 -1.25353 4.73951 9.52202 0.55943 1.14345 0.52649 7 3 4 2.38 2013-Sep-20 09:11:20 4171693.98481 872119.32145 4730016.08920 11.80799 48.17154 534.13492 -1.27567 4.82281 9.54427 0.53729 1.22674 0.54873 7 3 4 2.38 2013-Sep-20 09:11:20 4171694.41452 872119.07699 4730014.83638 11.80798 48.17153 533.44854 -1.60288 3.71115 8.85788 0.21008 0.11509 -0.13765 7 3 4 2.38 2013-Sep-20 09:11:20 4171695.54442 872118.07932 4730016.21266 11.80797 48.17153 535.07550 -2.81066 3.95700 10.48485 -0.99770 0.36093 1.48931 7 3 4 2.38 2013-Sep-20 09:11:20 4171692.77379 872115.55724 4730014.29761 11.80794 48.17154 531.49568 -4.71240 5.08525 6.90502 -2.89945 1.48919 -2.09051 7 3 4 2.38 2013-Sep-20 09:11:20 4171691.63001 872116.29920 4730015.24560 11.80796 48.17156 531.55668 -3.75209 6.43858 6.96602 -1.93914 2.84252 -2.02951 7 3 4 2.38 2013-Sep-20 09:11:20 4171692.43177 872117.84749 4730015.60467 11.80797 48.17155 532.55892 -2.40063 5.85717 7.96826 -0.58767 2.26111 -1.02727 7 3 4 2.38 2013-Sep-20 09:11:20 4171690.93293 872117.88614 4730015.00514 11.80798 48.17156 531.13903 -2.05609 6.54467 6.54837 -0.24314 2.94861 -2.44716 7 3 4 2.38 2013-Sep-20 09:11:20 4171690.12255 872117.31940 4730013.31246 11.80797 48.17155 529.27138 -2.44500 6.09331 4.68072 -0.63204 2.49725 -4.31481 7 3 4 2.38 2013-Sep-20 09:11:20 4171690.57084 872117.32037 4730013.29541 11.80797 48.17155 529.55145 -2.53579 5.75482 4.96079 -0.72283 2.15876 -4.03474 7 3 4 2.38 2013-Sep-20 09:11:20 4171690.32708 872117.65406 4730012.80684 11.80798 48.17155 529.07380 -2.15928 5.55590 4.48315 -0.34632 1.95984 -4.51239 7 3 4 2.38 2013-Sep-20 09:11:20 4171690.74432 872118.59802 4730013.31712 11.80799 48.17155 529.85524 -1.32068 5.44794 5.26458 0.49228 1.85188 -3.73095 7 3 4 2.38 2013-Sep-20 09:11:20 4171695.46123 872119.99967 4730019.08700 11.80799 48.17155 537.42506 -0.91393 5.64177 12.83440 0.89903 2.04570 3.83887 7 3 4 2.38 2013-Sep-20 09:11:20 4171697.78958 872121.40278 4730020.58578 11.80801 48.17154 540.25328 -0.01696 4.72912 15.66262 1.79600 1.13305 6.66709 7 3 4 2.38 2013-Sep-20 09:11:20 4171697.65886 872120.73541 4730021.23065 11.80800 48.17155 540.55739 -0.64346 5.35629 15.96673 1.16950 1.76022 6.97120 7 3 4 2.38 2013-Sep-20 09:11:20 4171694.20680 872119.75356 4730016.29950 11.80799 48.17154 534.49551 -0.89813 4.73525 9.90485 0.91483 1.13919 0.90932 7 3 4 2.38 2013-Sep-20 09:11:20 4171693.00595 872120.15279 4730016.85468 11.80800 48.17155 534.17978 -0.26161 5.92050 9.58912 1.55135 2.32444 0.59359 7 3 4 2.38 2013-Sep-20 09:11:20 4171695.73142 872121.45594 4730019.20489 11.80801 48.17155 537.88803 0.45624 5.30127 13.29737 2.26920 1.70521 4.30184 7 3 4 2.38 2013-Sep-20 09:11:20 4171693.12915 872119.60495 4730015.58147 11.80799 48.17154 533.23671 -0.82307 5.06507 8.64605 0.98989 1.46901 -0.34948 7 3 4 2.38 2013-Sep-20 09:11:20 4171688.46031 872118.71115 4730011.75505 11.80800 48.17155 527.21572 -0.74256 6.05485 2.62506 1.07040 2.45879 -6.37047 7 3 4 2.38 2013-Sep-20 09:11:20 4171691.32987 872118.55563 4730014.88759 11.80799 48.17155 531.40192 -1.48199 6.07467 6.81126 0.33097 2.47861 -2.18427 7 3 4 2.38 2013-Sep-20 09:11:21 4171689.56331 872118.20704 4730013.19481 11.80799 48.17155 528.93978 -1.46171 6.28739 4.34912 0.35125 2.69133 -4.64641 7 3 4 2.38 2013-Sep-20 09:11:21 4171685.92672 872117.71725 4730010.60163 11.80799 48.17156 524.56671 -1.19697 7.28512 -0.02395 0.61598 3.68906 -9.01948 7 3 4 2.38 2013-Sep-20 09:11:21 4171689.55584 872117.74212 4730015.45929 11.80798 48.17157 530.55883 -1.91527 7.87392 5.96817 -0.10231 4.27786 -3.02736 7 3 4 2.38 2013-Sep-20 09:11:21 4171691.81410 872118.12623 4730017.71418 11.80798 48.17157 533.76564 -2.00139 7.67202 9.17498 -0.18843 4.07596 0.17945 7 3 4 2.38 2013-Sep-20 09:11:21 4171689.64397 872116.59344 4730014.84388 11.80796 48.17157 530.00103 -3.05767 7.57438 5.41037 -1.24471 3.97832 -3.58516 7 3 4 2.38 2013-Sep-20 09:11:21 4171691.95807 872115.89947 4730014.75436 11.80795 48.17155 531.35024 -4.21050 5.93264 6.75958 -2.39754 2.33658 -2.23595 7 3 4 2.38 2013-Sep-20 09:11:21 4171694.41446 872116.84871 4730015.87431 11.80795 48.17154 533.91781 -3.78400 4.74316 9.32715 -1.97104 1.14710 0.33162 7 3 4 2.38 2013-Sep-20 09:11:21 4171692.43479 872115.10007 4730014.47253 11.80794 48.17155 531.34234 -5.09053 5.51887 6.75168 -3.27757 1.92281 -2.24385 7 3 4 2.38 2013-Sep-20 09:11:21 4171689.58404 872113.24592 4730011.76733 11.80792 48.17155 527.21260 -6.32209 6.07676 2.62194 -4.50913 2.48070 -6.37360 7 3 4 2.38 2013-Sep-20 09:11:21 4171687.85016 872113.63447 4730009.92018 11.80793 48.17155 524.75737 -5.58695 6.05030 0.16671 -3.77399 2.45424 -8.82882 7 3 4 2.38 2013-Sep-20 09:11:21 4171691.22319 872115.50950 4730013.20333 11.80795 48.17155 529.66156 -4.44183 5.49372 5.07090 -2.62888 1.89766 -3.92463 7 3 4 2.38 2013-Sep-20 09:11:21 4171693.69204 872115.61457 4730015.27022 11.80794 48.17154 532.82767 -4.84420 5.05539 8.23701 -3.03124 1.45933 -0.75852 7 3 4 2.38 2013-Sep-20 09:11:21 4171693.07652 872115.21531 4730014.89055 11.80794 48.17155 532.08847 -5.10905 5.31202 7.49781 -3.29610 1.71595 -1.49772 7 3 4 2.38 2013-Sep-20 09:11:21 4171695.51663 872117.05085 4730017.93873 11.80795 48.17155 536.20318 -3.81168 5.28522 11.61252 -1.99872 1.68915 2.61699 7 3 4 2.38 2013-Sep-20 09:11:21 4171696.10233 872118.79374 4730020.28856 11.80798 48.17155 538.57433 -2.22552 6.15937 13.98367 -0.41256 2.56330 4.98814 7 3 4 2.38 2013-Sep-20 09:11:21 4171693.70936 872116.51201 4730016.36786 11.80795 48.17155 533.77935 -3.96929 5.63794 9.18869 -2.15633 2.04187 0.19316 7 3 4 2.38 2013-Sep-20 09:11:21 4171695.52706 872116.89264 4730019.52815 11.80795 48.17155 537.37275 -3.96867 6.36172 12.78209 -2.15571 2.76566 3.78656 7 3 4 2.38 2013-Sep-20 09:11:21 4171694.44896 872118.09480 4730017.13388 11.80797 48.17155 535.04895 -2.57134 5.36801 10.45830 -0.75838 1.77195 1.46276 7 3 4 2.38 2013-Sep-20 09:11:21 4171691.96117 872116.26242 4730014.94807 11.80795 48.17155 531.54614 -3.85586 6.00422 6.95548 -2.04291 2.40816 -2.04005 7 3 4 2.38 2013-Sep-20 09:11:21 4171692.04492 872115.02243 4730015.45873 11.80794 48.17156 531.81210 -5.08675 6.47277 7.22144 -3.27379 2.87671 -1.77409 7 3 4 2.38 2013-Sep-20 09:11:21 4171690.01681 872114.32817 4730014.17249 11.80793 48.17156 529.43499 -5.35130 7.20009 4.84433 -3.53835 3.60403 -4.15120 7 3 4 2.38 2013-Sep-20 09:11:21 4171690.92253 872114.53345 4730015.36082 11.80793 48.17156 530.93973 -5.33570 7.30068 6.34907 -3.52275 3.70462 -2.64646 7 3 4 2.38 2013-Sep-20 09:11:21 4171688.97339 872114.44988 4730013.49620 11.80794 48.17157 528.26653 -5.01865 7.49156 3.67587 -3.20569 3.89550 -5.31966 7 3 4 2.38 2013-Sep-20 09:11:21 4171690.74024 872115.51489 4730015.40365 11.80795 48.17156 530.98658 -4.33773 7.31256 6.39592 -2.52477 3.71649 -2.59961 7 3 4 2.38 2013-Sep-20 09:11:21 4171688.97210 872115.14013 4730013.87611 11.80795 48.17157 528.64297 -4.34274 7.64062 4.05231 -2.52978 4.04456 -4.94322 7 3 4 2.38 2013-Sep-20 09:11:22 4171688.32594 872114.70694 4730017.04771 11.80794 48.17159 530.52536 -4.63454 10.29311 5.93469 -2.82158 6.69705 -3.06084 7 3 4 2.38 2013-Sep-20 09:11:22 4171686.97520 872114.42977 4730012.67178 11.80794 48.17157 526.34508 -4.62944 8.40225 1.75442 -2.81648 4.80619 -7.24111 7 3 4 2.38 2013-Sep-20 09:11:22 4171693.30293 872116.44529 4730018.38098 11.80795 48.17156 535.00500 -3.95143 7.28711 10.41434 -2.13847 3.69105 1.41881 7 3 4 2.38 2013-Sep-20 09:11:22 4171692.15763 872116.48477 4730017.47188 11.80796 48.17157 533.58533 -3.67842 7.51016 8.99467 -1.86546 3.91410 -0.00086 7 3 4 2.38 2013-Sep-20 09:11:22 4171689.71754 872114.78005 4730014.66291 11.80794 48.17157 529.66673 -4.84774 7.67653 5.07607 -3.03478 4.08047 -3.91946 7 3 4 2.38 2013-Sep-20 09:11:22 4171688.12062 872115.53051 4730014.92965 11.80795 48.17158 528.92545 -3.78638 8.90475 4.33479 -1.97343 5.30869 -4.66074 7 3 4 2.38 2013-Sep-20 09:11:22 4171692.01243 872116.52714 4730016.72361 11.80796 48.17156 532.93876 -3.60724 7.11059 8.34810 -1.79428 3.51452 -0.64743 7 3 4 2.38 2013-Sep-20 09:11:22 4171688.32605 872114.48080 4730011.21123 11.80794 48.17156 526.14554 -4.85592 6.43514 1.55488 -3.04296 2.83908 -7.44065 7 3 4 2.38 2013-Sep-20 09:11:22 4171693.82006 872115.87957 4730015.88761 11.80794 48.17155 533.40745 -4.61100 5.33335 8.81679 -2.79804 1.73729 -0.17874 7 3 4 2.38 2013-Sep-20 09:11:22 4171693.99055 872115.07751 4730018.31302 11.80793 48.17156 535.21657 -5.43097 6.94882 10.62591 -3.61801 3.35275 1.63038 7 3 4 2.38 2013-Sep-20 09:11:22 4171690.26858 872114.65413 4730016.10207 11.80794 48.17157 531.08165 -5.08376 8.25360 6.49099 -3.27080 4.65754 -2.50454 7 3 4 2.38 2013-Sep-20 09:11:22 4171692.16940 872116.63112 4730016.93195 11.80796 48.17156 533.21066 -3.53757 7.11918 8.62000 -1.72461 3.52312 -0.37553 7 3 4 2.38 2013-Sep-20 09:11:22 4171691.79160 872116.37251 4730016.01418 11.80796 48.17156 532.24487 -3.71340 6.82211 7.65421 -1.90044 3.22605 -1.34132 7 3 4 2.38 2013-Sep-20 09:11:22 4171689.71748 872115.07017 4730014.27800 11.80794 48.17156 529.41947 -4.56375 7.37564 4.82881 -2.75079 3.77958 -4.16672 7 3 4 2.38 2013-Sep-20 09:11:22 4171691.78194 872116.39084 4730017.56959 11.80796 48.17157 533.40007 -3.69348 7.86367 8.80941 -1.88053 4.26761 -0.18612 7 3 4 2.38 2013-Sep-20 09:11:22 4171691.89938 872114.84708 4730015.13309 11.80794 48.17156 531.45052 -5.22861 6.38850 6.85986 -3.41565 2.79244 -2.13567 7 3 4 2.38 2013-Sep-20 09:11:22 4171689.87221 872113.72188 4730013.12886 11.80793 48.17156 528.48020 -5.91517 6.70201 3.88954 -4.10221 3.10595 -5.10599 7 3 4 2.38 2013-Sep-20 09:11:22 4171689.10012 872113.31458 4730014.50949 11.80792 48.17157 528.94937 -6.15586 8.24800 4.35871 -4.34290 4.65194 -4.63682 7 3 4 2.38 2013-Sep-20 09:11:22 4171687.89357 872112.65870 4730013.17745 11.80792 48.17157 527.07968 -6.55096 8.33970 2.48902 -4.73800 4.74364 -6.50651 7 3 4 2.38 2013-Sep-20 09:11:22 4171690.62468 872115.64810 4730016.32879 11.80795 48.17157 531.61869 -4.18369 7.99351 7.02803 -2.37073 4.39745 -1.96750 7 3 4 2.38 2013-Sep-20 09:11:22 4171689.75297 872115.64942 4730014.07272 11.80795 48.17156 529.36873 -4.00402 7.12453 4.77807 -2.19106 3.52847 -4.21746 7 3 4 2.38 2013-Sep-20 09:11:22 4171693.28810 872116.93910 4730017.31292 11.80796 48.17156 534.26684 -3.46504 6.51033 9.67619 -1.65208 2.91427 0.68065 7 3 4 2.38 2013-Sep-20 09:11:22 4171695.98563 872118.16653 4730021.78172 11.80797 48.17156 539.52518 -2.81558 7.33592 14.93452 -1.00262 3.73985 5.93899 7 3 4 2.38 2013-Sep-20 09:11:22 4171697.11783 872120.37174 4730022.28911 11.80799 48.17156 540.94329 -0.88873 6.51224 16.35263 0.92423 2.91618 7.35710 7 3 4 2.38 2013-Sep-20 09:11:22 4171695.48569 872119.38854 4730020.67335 11.80799 48.17156 538.53969 -1.51712 6.77505 13.94903 0.29584 3.17899 4.95350 7 3 4 2.38 2013-Sep-20 09:11:23 4171695.47061 872118.34524 4730020.12538 11.80797 48.17156 537.97915 -2.53527 6.57970 13.38849 -0.72231 2.98364 4.39296 7 3 4 2.38 2013-Sep-20 09:11:23 4171692.81562 872117.25637 4730018.29186 11.80796 48.17156 534.73117 -3.05779 7.45944 10.14051 -1.24483 3.86337 1.14498 7 3 4 2.38 2013-Sep-20 09:11:23 4171692.16092 872114.76973 4730016.10991 11.80793 48.17156 532.33857 -5.35784 6.86097 7.74791 -3.54488 3.26491 -1.24762 7 3 4 2.38 2013-Sep-20 09:11:23 4171692.87697 872114.47291 4730017.48267 11.80793 48.17156 533.78839 -5.79490 7.29946 9.19773 -3.98195 3.70340 0.20220 7 3 4 2.38 2013-Sep-20 09:11:23 4171692.86069 872116.07764 4730017.23552 11.80795 48.17156 533.81260 -4.22081 6.90182 9.22194 -2.40785 3.30575 0.22641 7 3 4 2.38 2013-Sep-20 09:11:23 4171693.87686 872118.40258 4730018.95306 11.80798 48.17156 536.07304 -2.15301 6.95157 11.48238 -0.34005 3.35551 2.48685 7 3 4 2.38 2013-Sep-20 09:11:23 4171694.98367 872119.17613 4730019.43245 11.80798 48.17155 537.25834 -1.62231 6.34605 12.66768 0.19065 2.74998 3.67215 7 3 4 2.38 2013-Sep-20 09:11:23 4171695.21549 872119.60786 4730019.65619 11.80799 48.17155 537.63531 -1.24716 6.26035 13.04465 0.56580 2.66428 4.04912 7 3 4 2.38 2013-Sep-20 09:11:23 4171695.99088 872119.06174 4730019.64147 11.80798 48.17155 538.05598 -1.94039 5.76825 13.46532 -0.12743 2.17219 4.46979 7 3 4 2.38 2013-Sep-20 09:11:23 4171692.45117 872118.44593 4730017.51592 11.80798 48.17156 534.07741 -1.81883 7.02639 9.48675 -0.00587 3.43033 0.49122 7 3 4 2.38 2013-Sep-20 09:11:23 4171687.29885 872117.29525 4730012.83925 11.80798 48.17157 527.07219 -1.89082 7.84095 2.48153 -0.07787 4.24489 -6.51400 7 3 4 2.38 2013-Sep-20 09:11:23 4171683.14258 872114.63254 4730008.28239 11.80796 48.17157 520.60012 -3.64668 8.23945 -3.99054 -1.83372 4.64339 -12.98607 7 3 4 2.38 2013-Sep-20 09:11:23 4171686.28035 872115.76735 4730009.89013 11.80796 48.17156 524.00129 -3.17797 6.85001 -0.58937 -1.36501 3.25395 -9.58490 7 3 4 2.38 2013-Sep-20 09:11:23 4171687.67267 872117.00778 4730014.37423 11.80798 48.17158 528.42077 -2.24871 8.63580 3.83011 -0.43575 5.03974 -5.16542 7 3 4 2.38 2013-Sep-20 09:11:23 4171687.19397 872117.35970 4730014.17360 11.80798 48.17158 528.00680 -1.80628 8.79749 3.41614 0.00668 5.20143 -5.57939 7 3 4 2.38 2013-Sep-20 09:11:23 4171688.80661 872116.60744 4730014.62659 11.80797 48.17157 529.29440 -2.87262 8.03808 4.70374 -1.05966 4.44202 -4.29179 7 3 4 2.38 2013-Sep-20 09:11:23 4171688.60392 872118.37171 4730014.15304 11.80799 48.17157 529.04999 -1.10420 7.60108 4.45934 0.70876 4.00502 -4.53620 7 3 4 2.38 2013-Sep-20 09:11:23 4171688.03548 872117.48240 4730014.82352 11.80798 48.17158 529.05717 -1.85837 8.59844 4.46651 -0.04542 5.00238 -4.52902 7 3 4 2.38 2013-Sep-20 09:11:23 4171691.45022 872117.54123 4730019.00948 11.80797 48.17158 534.41345 -2.49956 8.89047 9.82279 -0.68660 5.29441 0.82726 7 3 4 2.38 2013-Sep-20 09:11:23 4171688.58405 872116.29982 4730014.90400 11.80796 48.17157 529.31385 -3.12818 8.43232 4.72319 -1.31523 4.83626 -4.27234 7 3 4 2.38 2013-Sep-20 09:11:23 4171692.02985 872117.87410 4730018.06185 11.80797 48.17157 534.13113 -2.29234 7.78497 9.54047 -0.47938 4.18890 0.54494 7 3 4 2.38 2013-Sep-20 09:11:23 4171690.47194 872116.45149 4730016.02004 11.80796 48.17157 531.39856 -3.36604 7.77650 6.80790 -1.55309 4.18044 -2.18763 7 3 4 2.38 2013-Sep-20 09:11:23 4171692.92686 872118.76633 4730018.34805 11.80798 48.17156 535.05172 -1.60255 7.18553 10.46106 0.21041 3.58947 1.46553 7 3 4 2.38 2013-Sep-20 09:11:23 4171694.75491 872120.57368 4730019.23097 11.80800 48.17155 537.14960 -0.20752 6.16543 12.55894 1.60544 2.56937 3.56341 7 3 4 2.38 2013-Sep-20 09:11:23 4171692.01646 872118.24976 4730016.57278 11.80798 48.17156 533.06409 -1.92189 6.74439 8.47343 -0.10893 3.14832 -0.52210 7 3 4 2.38 2013-Sep-20 09:11:24 4171691.01468 872116.28329 4730014.34412 11.80796 48.17155 530.48109 -3.64175 6.28861 5.89043 -1.82879 2.69255 -3.10510 7 3 4 2.38 2013-Sep-20 09:11:24 4171689.06716 872114.68632 4730012.29307 11.80794 48.17156 527.46351 -4.80640 6.58474 2.87285 -2.99344 2.98868 -6.12268 7 3 4 2.38 2013-Sep-20 09:11:24 4171694.73608 872119.44056 4730010.88709 11.80799 48.17150 530.76527 -1.31281 0.78738 6.17462 0.50015 -2.80868 -2.82092 7 3 4 2.38 2013-Sep-20 09:11:24 4171693.72087 872119.68492 4730011.32274 11.80799 48.17151 530.46052 -0.86588 1.78113 5.86987 0.94708 -1.81493 -3.12567 7 3 4 2.38 2013-Sep-20 09:11:24 4171693.94370 872118.06655 4730011.54638 11.80797 48.17152 530.55176 -2.49560 2.01452 5.96111 -0.68264 -1.58154 -3.03442 7 3 4 2.38 2013-Sep-20 09:11:24 4171692.12249 872117.40179 4730009.68968 11.80797 48.17152 527.88867 -2.77361 2.20599 3.29802 -0.96065 -1.39007 -5.69752 7 3 4 2.38 2013-Sep-20 09:11:24 4171693.86774 872119.69170 4730012.79420 11.80799 48.17152 531.65378 -0.88929 2.65430 7.06312 0.92367 -0.94177 -1.93241 7 3 4 2.38 2013-Sep-20 09:11:24 4171693.32531 872117.33516 4730012.51212 11.80796 48.17153 530.76789 -3.08496 3.22113 6.17724 -1.27201 -0.37493 -2.81830 7 3 4 2.38 2013-Sep-20 09:11:24 4171692.47192 872117.94517 4730010.57339 11.80797 48.17152 528.84942 -2.31323 2.45762 4.25877 -0.50027 -1.13844 -4.73676 7 3 4 2.38 2013-Sep-20 09:11:24 4171695.01986 872119.00377 4730014.00965 11.80798 48.17152 533.21767 -1.79843 2.72945 8.62701 0.01453 -0.86661 -0.36852 7 3 4 2.38 2013-Sep-20 09:11:24 4171694.88813 872120.33154 4730015.53964 11.80800 48.17153 534.45295 -0.47180 3.64342 9.86229 1.34116 0.04736 0.86676 7 3 4 2.38 2013-Sep-20 09:11:24 4171695.65854 872119.35883 4730015.62841 11.80798 48.17153 534.88926 -1.58158 3.28902 10.29861 0.23138 -0.30704 1.30307 7 3 4 2.38 2013-Sep-20 09:11:24 4171692.29963 872117.57776 4730012.46967 11.80797 48.17153 530.09982 -2.63762 3.90394 5.50916 -0.82466 0.30788 -3.48637 7 3 4 2.38 2013-Sep-20 09:11:24 4171692.03831 872116.55714 4730014.60814 11.80796 48.17155 531.38342 -3.58316 5.67631 6.79276 -1.77020 2.08025 -2.20277 7 3 4 2.38 2013-Sep-20 09:11:24 4171692.67337 872117.02064 4730013.77478 11.80796 48.17154 531.24026 -3.25943 4.58668 6.64960 -1.44647 0.99062 -2.34593 7 3 4 2.38 2013-Sep-20 09:11:24 4171695.89232 872118.66842 4730018.17083 11.80797 48.17154 536.84212 -2.30521 4.91933 12.25146 -0.49225 1.32327 3.25593 7 3 4 2.38 2013-Sep-20 09:11:24 4171693.74490 872118.23743 4730015.79962 11.80797 48.17154 533.61459 -2.28765 4.96996 9.02394 -0.47470 1.37390 0.02841 7 3 4 2.38 2013-Sep-20 09:11:24 4171694.70598 872117.25327 4730014.62039 11.80796 48.17153 533.22897 -3.44766 3.63261 8.63832 -1.63470 0.03655 -0.35722 7 3 4 2.38 2013-Sep-20 09:11:24 4171692.92441 872118.47677 4730011.63261 11.80798 48.17152 530.00662 -1.88548 2.75292 5.41597 -0.07253 -0.84314 -3.57956 7 3 4 2.38 2013-Sep-20 09:11:24 4171691.52667 872118.87196 4730011.44362 11.80799 48.17153 529.00730 -1.21263 3.58611 4.41665 0.60032 -0.00995 -4.57889 7 3 4 2.38 2013-Sep-20 09:11:24 4171694.25462 872121.51872 4730015.11176 11.80802 48.17153 533.88257 0.81989 3.63911 9.29192 2.63285 0.04305 0.29638 7 3 4 2.38 2013-Sep-20 09:11:24 4171696.05999 872118.78231 4730016.87878 11.80798 48.17153 536.00435 -2.22805 3.91800 11.41370 -0.41509 0.32194 2.41816 7 3 4 2.38 2013-Sep-20 09:11:24 4171691.43406 872115.78258 4730012.57313 11.80795 48.17154 529.36688 -4.21768 4.87799 4.77623 -2.40472 1.28193 -4.21931 7 3 4 2.38 2013-Sep-20 09:11:24 4171689.02374 872114.43196 4730010.05337 11.80794 48.17154 525.73154 -5.04649 5.16153 1.14088 -3.23353 1.56547 -7.85465 7 3 4 2.38 2013-Sep-20 09:11:24 4171689.82579 872114.00495 4730009.74249 11.80793 48.17154 525.96520 -5.62860 4.43432 1.37454 -3.81564 0.83826 -7.62099 7 3 4 2.38 2013-Sep-20 09:11:25 4171692.94276 872114.53020 4730013.00038 11.80793 48.17154 530.49920 -5.75229 4.25348 5.90855 -3.93933 0.65742 -3.08698 7 3 4 2.38 2013-Sep-20 09:11:25 4171696.43597 872116.98179 4730015.20824 11.80795 48.17152 534.75928 -4.06741 2.80422 10.16862 -2.25445 -0.79184 1.17309 7 3 4 2.38 2013-Sep-20 09:11:25 4171697.42899 872118.36885 4730017.32999 11.80797 48.17153 537.17781 -2.91290 3.28345 12.58716 -1.09994 -0.31262 3.59163 7 3 4 2.38 2013-Sep-20 09:11:25 4171697.33026 872116.57227 4730016.99697 11.80794 48.17153 536.62004 -4.65126 3.40731 12.02938 -2.83830 -0.18876 3.03385 7 3 4 2.38 2013-Sep-20 09:11:25 4171696.09689 872117.06043 4730016.70701 11.80795 48.17153 535.66546 -3.92104 4.03909 11.07481 -2.10808 0.44302 2.07928 7 3 4 2.38 2013-Sep-20 09:11:25 4171696.46879 872118.51743 4730018.06942 11.80797 48.17154 537.12226 -2.57098 4.45426 12.53161 -0.75802 0.85820 3.53608 7 3 4 2.38 2013-Sep-20 09:11:25 4171693.42590 872118.06426 4730015.15919 11.80797 48.17154 532.90551 -2.39188 4.80193 8.31486 -0.57892 1.20587 -0.68067 7 3 4 2.38 2013-Sep-20 09:11:25 4171690.58025 872116.64729 4730012.69413 11.80796 48.17155 529.01769 -3.19656 5.44958 4.42704 -1.38360 1.85352 -4.56850 7 3 4 2.38 2013-Sep-20 09:11:25 4171691.12781 872116.15449 4730011.72512 11.80795 48.17154 528.58583 -3.79098 4.47912 3.99518 -1.97802 0.88306 -5.00036 7 3 4 2.38 2013-Sep-20 09:11:25 4171691.82827 872116.67823 4730011.86627 11.80796 48.17153 529.21974 -3.42165 3.98249 4.62908 -1.60869 0.38643 -4.36645 7 3 4 2.38 2013-Sep-20 09:11:25 4171693.99266 872119.22471 4730014.41203 11.80799 48.17153 532.87711 -1.37197 3.71332 8.28645 0.44099 0.11726 -0.70908 7 3 4 2.38 2013-Sep-20 09:11:25 4171692.83202 872118.52777 4730016.42282 11.80798 48.17155 533.52267 -1.81665 6.00714 8.93202 -0.00369 2.41108 -0.06352 7 3 4 2.38 2013-Sep-20 09:11:25 4171698.55650 872121.22407 4730021.03271 11.80800 48.17154 541.06256 -0.34883 4.49505 16.47190 1.46413 0.89899 7.47637 7 3 4 2.38 2013-Sep-20 09:11:25 4171695.04048 872119.56744 4730016.57388 11.80799 48.17154 535.21878 -1.25090 4.33855 10.62813 0.56206 0.74249 1.63259 7 3 4 2.38 2013-Sep-20 09:11:25 4171695.90497 872120.45805 4730017.43063 11.80800 48.17153 536.54305 -0.55605 4.14358 11.95240 1.25691 0.54751 2.95686 7 3 4 2.38 2013-Sep-20 09:11:25 4171696.09424 872119.26173 4730016.89450 11.80798 48.17153 536.10385 -1.76578 3.83040 11.51320 0.04718 0.23433 2.51766 7 3 4 2.38 2013-Sep-20 09:11:25 4171692.61374 872118.10090 4730013.36178 11.80798 48.17154 531.04101 -2.18982 4.19002 6.45035 -0.37686 0.59396 -2.54518 7 3 4 2.38 2013-Sep-20 09:11:25 4171694.36270 872118.03702 4730015.73834 11.80797 48.17154 533.94487 -2.61025 4.50905 9.35422 -0.79729 0.91298 0.35868 7 3 4 2.38 2013-Sep-20 09:11:25 4171697.04059 872118.20076 4730017.98789 11.80797 48.17153 537.39156 -2.99795 4.03113 12.80091 -1.18499 0.43506 3.80537 7 3 4 2.38 2013-Sep-20 09:11:25 4171696.55999 872119.84549 4730019.06078 11.80799 48.17154 538.10175 -1.28968 4.84638 13.51109 0.52328 1.25032 4.51556 7 3 4 2.38 2013-Sep-20 09:11:25 4171695.29187 872119.57062 4730017.30793 11.80799 48.17154 535.93029 -1.29924 4.64425 11.33963 0.51372 1.04819 2.34410 7 3 4 2.38 2013-Sep-20 09:11:25 4171693.87880 872117.74562 4730015.08127 11.80797 48.17154 533.09961 -2.79646 4.46822 8.50896 -0.98350 0.87216 -0.48657 7 3 4 2.38 2013-Sep-20 09:11:25 4171695.65525 872119.19908 4730016.35068 11.80798 48.17153 535.40351 -1.73728 3.79747 10.81285 0.07568 0.20140 1.81732 7 3 4 2.38 2013-Sep-20 09:11:25 4171699.08051 872120.38503 4730018.46706 11.80799 48.17152 539.37834 -1.27734 2.52976 14.78769 0.53562 -1.06631 5.79215 7 3 4 2.38 2013-Sep-20 09:11:25 4171698.36821 872119.86609 4730016.97570 11.80798 48.17152 537.73126 -1.63954 2.13383 13.14061 0.17342 -1.46224 4.14507 7 3 4 2.38 2013-Sep-20 09:11:26 4171695.45471 872119.69750 4730014.47563 11.80799 48.17152 533.94343 -1.20836 2.61727 9.35278 0.60460 -0.97879 0.35725 7 3 4 2.38 2013-Sep-20 09:11:26 4171691.42837 872117.31443 4730011.78606 11.80797 48.17153 528.98574 -2.71708 4.12367 4.39509 -0.90412 0.52761 -4.60044 7 3 4 2.38 2013-Sep-20 09:11:26 4171696.71907 872121.11664 4730009.75732 11.80800 48.17148 531.44664 -0.07799 -1.66798 6.85599 1.73497 -5.26404 -2.13955 7 3 4 2.38 2013-Sep-20 09:11:26 4171696.53243 872121.77257 4730011.51404 11.80801 48.17149 532.72333 0.60225 -0.46030 8.13268 2.41521 -4.05636 -0.86286 7 3 4 2.38 2013-Sep-20 09:11:26 4171697.99796 872122.74733 4730013.99782 11.80802 48.17150 535.66382 1.25649 -0.02142 11.07316 3.06945 -3.61748 2.07763 7 3 4 2.38 2013-Sep-20 09:11:26 4171696.37638 872121.71039 4730011.34412 11.80801 48.17149 532.48636 0.57332 -0.45033 7.89571 2.38628 -4.04639 -1.09983 7 3 4 2.38 2013-Sep-20 09:11:26 4171698.35090 872122.14956 4730013.71091 11.80801 48.17149 535.59885 0.59915 -0.37904 11.00820 2.41211 -3.97510 2.01266 7 3 4 2.38 2013-Sep-20 09:11:26 4171703.46376 872123.87039 4730019.69749 11.80802 48.17149 543.63218 1.23731 -0.37817 19.04153 3.05027 -3.97423 10.04599 7 3 4 2.38 2013-Sep-20 09:11:26 4171700.56430 872122.35069 4730016.45134 11.80801 48.17150 539.11320 0.34309 -0.19650 14.52254 2.15606 -3.79257 5.52701 7 3 4 2.38 2013-Sep-20 09:11:26 4171698.23291 872121.53889 4730013.56136 11.80801 48.17149 535.32705 0.02555 -0.29960 10.73639 1.83851 -3.89566 1.74086 7 3 4 2.38 2013-Sep-20 09:11:26 4171697.16465 872121.43782 4730013.15708 11.80801 48.17150 534.31466 0.14522 0.22536 9.72400 1.95818 -3.37070 0.72847 7 3 4 2.38 2013-Sep-20 09:11:26 4171698.34796 872120.87849 4730014.23452 11.80800 48.17150 535.81363 -0.64442 0.16612 11.22297 1.16854 -3.42995 2.22744 7 3 4 2.38 2013-Sep-20 09:11:26 4171695.76204 872118.60876 4730013.18849 11.80797 48.17151 533.03637 -2.33696 1.70071 8.44571 -0.52400 -1.89535 -0.54982 7 3 4 2.38 2013-Sep-20 09:11:26 4171699.44609 872120.90827 4730017.97351 11.80799 48.17151 539.32063 -0.83998 1.85417 14.72997 0.97298 -1.74189 5.73444 7 3 4 2.38 2013-Sep-20 09:11:26 4171698.64752 872119.43110 4730014.89668 11.80798 48.17150 536.30506 -2.12248 0.60993 11.71440 -0.30952 -2.98614 2.71887 7 3 4 2.38 2013-Sep-20 09:11:26 4171697.55984 872120.17978 4730014.86997 11.80799 48.17151 535.67731 -1.16707 1.27128 11.08665 0.64589 -2.32479 2.09112 7 3 4 2.38 2013-Sep-20 09:11:26 4171697.01947 872118.31837 4730015.09299 11.80797 48.17152 535.23671 -2.87851 2.09797 10.64606 -1.06555 -1.49809 1.65052 7 3 4 2.38 2013-Sep-20 09:11:26 4171696.65306 872117.98772 4730014.86804 11.80796 48.17152 534.78477 -3.12718 2.26563 10.19412 -1.31422 -1.33044 1.19859 7 3 4 2.38 2013-Sep-20 09:11:26 4171697.36222 872119.83651 4730014.54769 11.80799 48.17151 535.26130 -1.46263 1.25283 10.67065 0.35033 -2.34323 1.67512 7 3 4 2.38 2013-Sep-20 09:11:26 4171696.52404 872118.30901 4730013.17213 11.80797 48.17151 533.48070 -2.78630 1.17972 8.89004 -0.97334 -2.41634 -0.10549 7 3 4 2.38 2013-Sep-20 09:11:26 4171698.86385 872121.33989 4730017.74518 11.80800 48.17152 538.82931 -0.29835 2.06076 14.23865 1.51461 -1.53531 5.24312 7 3 4 2.38 2013-Sep-20 09:11:26 4171696.58909 872119.79233 4730014.38210 11.80799 48.17151 534.62719 -1.34768 1.71304 10.03654 0.46528 -1.88303 1.04100 7 3 4 2.38 2013-Sep-20 09:11:26 4171700.46335 872121.06357 4730017.83751 11.80799 48.17151 539.90455 -0.89613 0.99783 15.31389 0.91683 -2.59824 6.31836 7 3 4 2.38 2013-Sep-20 09:11:26 4171700.66830 872121.68466 4730017.35859 11.80800 48.17150 539.76623 -0.33013 0.43424 15.17557 1.48283 -3.16182 6.18004 7 3 4 2.38 2013-Sep-20 09:11:26 4171700.85203 872122.99020 4730019.80879 11.80802 48.17151 541.89009 0.91019 1.73522 17.29943 2.72315 -1.86085 8.30390 7 3 4 2.38 2013-Sep-20 09:11:27 4171698.23027 872122.52875 4730017.15334 11.80802 48.17152 538.13696 0.99500 1.94689 13.54630 2.80797 -1.64917 4.55077 7 3 4 2.38 2013-Sep-20 09:11:27 4171696.75157 872120.64933 4730014.79814 11.80800 48.17151 535.16023 -0.54206 1.74131 10.56957 1.27090 -1.85475 1.57404 7 3 4 2.38 2013-Sep-20 09:11:27 4171696.76416 872119.87706 4730013.78979 11.80799 48.17151 534.31169 -1.30056 1.17741 9.72103 0.51240 -2.41865 0.72550 7 3 4 2.38 2013-Sep-20 09:11:27 4171698.92258 872120.43430 4730016.84209 11.80799 48.17151 538.07113 -1.19680 1.55373 13.48048 0.61616 -2.04234 4.48494 7 3 4 2.38 2013-Sep-20 09:11:27 4171699.32516 872119.95899 4730019.37041 11.80798 48.17152 540.15303 -1.74442 3.01872 15.56238 0.06854 -0.57735 6.56684 7 3 4 2.38 2013-Sep-20 09:11:27 4171696.62232 872119.48749 4730015.38510 11.80798 48.17152 535.35466 -1.65286 2.40418 10.76401 0.16010 -1.19188 1.76847 7 3 4 2.38 2013-Sep-20 09:11:27 4171695.82406 872119.99204 4730012.96060 11.80799 48.17151 533.09582 -0.99563 1.29258 8.50517 0.81733 -2.30348 -0.49037 7 3 4 2.38 2013-Sep-20 09:11:27 4171697.16384 872120.84539 4730013.40883 11.80800 48.17150 534.42087 -0.43451 0.48418 9.83022 1.37845 -3.11188 0.83468 7 3 4 2.38 2013-Sep-20 09:11:27 4171694.88333 872120.47935 4730010.82835 11.80800 48.17150 530.95939 -0.32614 0.48241 6.36873 1.48682 -3.11365 -2.62680 7 3 4 2.38 2013-Sep-20 09:11:27 4171697.97785 872121.99028 4730014.31845 11.80801 48.17150 535.78629 0.51958 0.32252 11.19563 2.33254 -3.27354 2.20010 7 3 4 2.38 2013-Sep-20 09:11:27 4171698.45984 872122.18730 4730016.08542 11.80801 48.17151 537.44446 0.61380 1.11932 12.85381 2.42676 -2.47674 3.85827 7 3 4 2.38 2013-Sep-20 09:11:27 4171701.78809 872123.72444 4730018.20614 11.80802 48.17150 541.40713 1.43735 -0.12830 16.81648 3.25031 -3.72436 7.82094 7 3 4 2.38 2013-Sep-20 09:11:27 4171696.37122 872121.62406 4730011.62400 11.80801 48.17150 532.67977 0.48988 -0.24675 8.08911 2.30284 -3.84281 -0.90642 7 3 4 2.38 2013-Sep-20 09:11:27 4171695.20851 872120.51676 4730010.85522 11.80800 48.17150 531.19679 -0.35606 0.25745 6.60614 1.45690 -3.33861 -2.38940 7 3 4 2.38 2013-Sep-20 09:11:27 4171697.02880 872121.39072 4730013.54692 11.80801 48.17150 534.51004 0.12691 0.59162 9.91939 1.93988 -3.00445 0.92385 7 3 4 2.38 2013-Sep-20 09:11:27 4171698.35699 872122.09135 4730015.74924 11.80801 48.17151 537.11373 0.54092 0.98476 12.52307 2.35388 -2.61130 3.52754 7 3 4 2.38 2013-Sep-20 09:11:27 4171696.79047 872123.00365 4730015.42316 11.80803 48.17151 535.97264 1.75448 1.77078 11.38198 3.56744 -1.82529 2.38645 7 3 4 2.38 2013-Sep-20 09:11:27 4171695.26064 872122.85392 4730013.27502 11.80803 48.17151 533.35288 1.92098 1.47683 8.76223 3.73394 -2.11923 -0.23331 7 3 4 2.38 2013-Sep-20 09:11:27 4171698.51176 872122.27968 4730016.83279 11.80801 48.17151 538.04786 0.69360 1.56578 13.45721 2.50656 -2.03028 4.46167 7 3 4 2.38 2013-Sep-20 09:11:27 4171697.06947 872120.76356 4730013.38628 11.80800 48.17150 534.33130 -0.49530 0.55045 9.74065 1.31766 -3.04561 0.74511 7 3 4 2.38 2013-Sep-20 09:11:27 4171699.70373 872120.05775 4730016.30475 11.80798 48.17150 538.12928 -1.72522 0.68304 13.53862 0.08774 -2.91303 4.54309 7 3 4 2.38 2013-Sep-20 09:11:27 4171696.10559 872119.77345 4730013.66015 11.80799 48.17151 533.77103 -1.26721 1.58710 9.18038 0.54575 -2.00896 0.18485 7 3 4 2.38 2013-Sep-20 09:11:27 4171699.19207 872119.76258 4730016.24054 11.80798 48.17151 537.70715 -1.90945 1.05842 13.11649 -0.09649 -2.53764 4.12096 7 3 4 2.38 2013-Sep-20 09:11:27 4171694.38017 872117.19225 4730010.17298 11.80796 48.17151 529.69399 -3.44071 0.91355 5.10334 -1.62775 -2.68251 -3.89220 7 3 4 2.38 2013-Sep-20 09:11:27 4171694.22234 872117.85273 4730011.09932 11.80797 48.17151 530.37136 -2.76191 1.54574 5.78070 -0.94896 -2.05032 -3.21483 7 3 4 2.38 2013-Sep-20 09:11:28 4171695.11148 872119.04029 4730014.07009 11.80798 48.17152 533.32750 -1.78143 2.69736 8.73684 0.03153 -0.89870 -0.25869 7 3 4 2.38 2013-Sep-20 09:11:28 4171698.15677 872119.96893 4730018.03728 11.80799 48.17152 538.39830 -1.49561 2.98033 13.80764 0.31735 -0.61574 4.81211 7 3 4 2.38 2013-Sep-20 09:11:28 4171692.57672 872118.00723 4730011.52180 11.80798 48.17152 529.63301 -2.27394 3.00422 5.04235 -0.46098 -0.59184 -3.95318 7 3 4 2.38 2013-Sep-20 09:11:28 4171695.70734 872120.86786 4730014.12594 11.80800 48.17152 534.00749 -0.11447 2.02133 9.41684 1.69849 -1.57473 0.42130 7 3 4 2.38 2013-Sep-20 09:11:28 4171697.26853 872120.68400 4730015.72391 11.80800 48.17152 536.19225 -0.61391 1.97637 11.60160 1.19905 -1.61969 2.60607 7 3 4 2.38 2013-Sep-20 09:11:28 4171694.52444 872120.43586 4730012.73190 11.80800 48.17152 532.13760 -0.29526 2.02030 7.54694 1.51769 -1.57576 -1.44859 7 3 4 2.38 2013-Sep-20 09:11:28 4171692.39192 872118.57243 4730011.27480 11.80798 48.17152 529.40545 -1.68288 2.88810 4.81480 0.13008 -0.70796 -4.18073 7 3 4 2.38 2013-Sep-20 09:11:28 4171692.78390 872117.78744 4730010.16343 11.80797 48.17152 528.72607 -2.53147 1.98071 4.13542 -0.71851 -1.61535 -4.86012 7 3 4 2.38 2013-Sep-20 09:11:28 4171691.87487 872117.15786 4730009.97550 11.80797 48.17152 527.90672 -2.96171 2.61440 3.31606 -1.14875 -0.98165 -5.67947 7 3 4 2.38 2013-Sep-20 09:11:28 4171699.73964 872121.31398 4730017.51368 11.80800 48.17151 539.22498 -0.50293 1.27154 14.63432 1.31003 -2.32453 5.63879 7 3 4 2.38 2013-Sep-20 09:11:28 4171696.61637 872120.95475 4730015.62866 11.80800 48.17152 535.73250 -0.21543 2.34723 11.14185 1.59753 -1.24883 2.14631 7 3 4 2.38 2013-Sep-20 09:11:28 4171699.45129 872122.06901 4730018.32541 11.80801 48.17151 539.74464 0.29513 1.90808 15.15399 2.10809 -1.68799 6.15845 7 3 4 2.38 2013-Sep-20 09:11:28 4171697.16364 872119.64857 4730015.64253 11.80798 48.17152 535.92184 -1.60596 2.15647 11.33118 0.20700 -1.43959 2.33565 7 3 4 2.38 2013-Sep-20 09:11:28 4171693.87384 872118.79801 4730011.97069 11.80798 48.17152 530.92216 -1.76532 2.23691 6.33150 0.04764 -1.35915 -2.66403 7 3 4 2.38 2013-Sep-20 09:11:28 4171690.82398 872118.69498 4730010.21216 11.80799 48.17153 527.60682 -1.24207 3.30434 3.01617 0.57089 -0.29171 -5.97937 7 3 4 2.38 2013-Sep-20 09:11:28 4171691.81943 872118.46771 4730010.90035 11.80798 48.17153 528.73842 -1.66823 3.07190 4.14777 0.14473 -0.52416 -4.84776 7 3 4 2.38 2013-Sep-20 09:11:28 4171695.31081 872120.55540 4730015.15712 11.80800 48.17153 534.47438 -0.33917 3.04589 9.88373 1.47379 -0.55017 0.88819 7 3 4 2.38 2013-Sep-20 09:11:28 4171696.57652 872120.27903 4730016.16587 11.80799 48.17152 536.01457 -0.86870 2.83759 11.42392 0.94426 -0.75847 2.42838 7 3 4 2.38 2013-Sep-20 09:11:28 4171698.61181 872122.98260 4730016.69875 11.80802 48.17151 538.10922 1.36117 1.29624 13.51857 3.17413 -2.29982 4.52303 7 3 4 2.38 2013-Sep-20 09:11:28 4171695.15391 872121.11126 4730014.38076 11.80801 48.17152 533.86931 0.23703 2.55782 9.27866 2.04999 -1.03825 0.28312 7 3 4 2.38 2013-Sep-20 09:11:28 4171694.64640 872120.83946 4730012.58297 11.80801 48.17151 532.16131 0.07484 1.77048 7.57066 1.88780 -1.82558 -1.42488 7 3 4 2.38 2013-Sep-20 09:11:28 4171691.63031 872119.31195 4730011.21968 11.80799 48.17153 528.96813 -0.80316 3.29407 4.37747 1.00980 -0.30198 -4.61806 7 3 4 2.38 2013-Sep-20 09:11:28 4171689.25703 872118.79877 4730009.74856 11.80799 48.17153 526.25265 -0.81983 4.12224 1.66199 0.99313 0.52619 -7.33354 7 3 4 2.38 2013-Sep-20 09:11:28 4171689.90162 872120.13573 4730011.28216 11.80801 48.17154 527.99864 0.35694 4.47099 3.40798 2.16989 0.87493 -5.58755 7 3 4 2.38 2013-Sep-20 09:11:28 4171691.77881 872120.72587 4730012.57524 11.80801 48.17153 530.26812 0.55045 3.87419 5.67746 2.36341 0.27813 -3.31807 7 3 4 2.38 2013-Sep-20 09:11:29 4171692.45743 872120.72748 4730014.45920 11.80801 48.17154 532.11516 0.41316 4.63540 7.52450 2.22612 1.03934 -1.47103 7 3 4 2.38 2013-Sep-20 09:11:29 4171692.88042 872119.50118 4730013.40565 11.80799 48.17153 531.43888 -0.87374 3.81125 6.84823 0.93922 0.21519 -2.14731 7 3 4 2.38 2013-Sep-20 09:11:29 4171693.25078 872118.94429 4730013.69045 11.80799 48.17153 531.81687 -1.49464 3.81597 7.22621 0.31832 0.21990 -1.76932 7 3 4 2.38 2013-Sep-20 09:11:29 4171689.33849 872117.64902 4730011.45198 11.80798 48.17155 527.41821 -1.96192 5.37416 2.82756 -0.14896 1.77810 -6.16797 7 3 4 2.38 2013-Sep-20 09:11:29 4171691.67619 872118.95441 4730014.83285 11.80799 48.17155 531.64162 -1.16252 5.72476 7.05096 0.65043 2.12870 -1.94457 7 3 4 2.38 2013-Sep-20 09:11:29 4171690.74721 872117.78260 4730015.28347 11.80798 48.17156 531.21106 -2.11943 6.88154 6.62040 -0.30648 3.28548 -2.37513 7 3 4 2.38 2013-Sep-20 09:11:29 4171693.06028 872118.23964 4730018.20147 11.80798 48.17156 534.95771 -2.14540 7.07077 10.36705 -0.33244 3.47471 1.37152 7 3 4 2.38 2013-Sep-20 09:11:29 4171695.36513 872118.22820 4730018.55966 11.80797 48.17155 536.72763 -2.62825 5.63029 12.13698 -0.81529 2.03422 3.14145 7 3 4 2.38 2013-Sep-20 09:11:29 4171694.87433 872119.42778 4730018.09010 11.80799 48.17155 536.22106 -1.35362 5.49221 11.63041 0.45934 1.89615 2.63488 7 3 4 2.38 2013-Sep-20 09:11:29 4171698.50407 872122.34864 4730022.07376 11.80802 48.17154 541.95753 0.76268 5.05610 17.36688 2.57564 1.46003 8.37135 7 3 4 2.38 2013-Sep-20 09:11:29 4171699.62995 872122.88747 4730024.16930 11.80802 48.17155 544.32751 1.05971 5.55027 19.73685 2.87267 1.95421 10.74132 7 3 4 2.38 2013-Sep-20 09:11:29 4171696.84794 872121.87700 4730020.45151 11.80801 48.17154 539.60325 0.63992 5.25408 15.01260 2.45288 1.65801 6.01707 7 3 4 2.38 2013-Sep-20 09:11:29 4171699.64875 872122.48073 4730022.82808 11.80801 48.17154 543.28487 0.65774 4.70412 18.69421 2.47070 1.10805 9.69868 7 3 4 2.38 2013-Sep-20 09:11:29 4171695.56689 872120.80957 4730017.99886 11.80800 48.17154 536.79375 -0.14278 4.71553 12.20309 1.67018 1.11946 3.20756 7 3 4 2.38 2013-Sep-20 09:11:29 4171694.09739 872120.41500 4730016.23289 11.80800 48.17154 534.46472 -0.22830 4.66978 9.87407 1.58466 1.07371 0.87853 7 3 4 2.38 2013-Sep-20 09:11:29 4171689.51731 872117.48823 4730013.34802 11.80798 48.17156 528.92582 -2.15590 6.53273 4.33516 -0.34294 2.93667 -4.66037 7 3 4 2.38 2013-Sep-20 09:11:29 4171692.20834 872119.52321 4730015.80457 11.80800 48.17155 532.79070 -0.71465 5.89794 8.20004 1.09831 2.30188 -0.79549 7 3 4 2.38 2013-Sep-20 09:11:29 4171690.26954 872116.58989 4730011.80842 11.80796 48.17154 528.14705 -3.18916 5.09428 3.55640 -1.37621 1.49822 -5.43914 7 3 4 2.38 2013-Sep-20 09:11:29 4171692.63805 872117.70373 4730014.79942 11.80797 48.17154 532.07393 -2.58356 5.19162 7.48327 -0.77060 1.59555 -1.51226 7 3 4 2.38 2013-Sep-20 09:11:29 4171695.05242 872117.86474 4730016.05879 11.80797 48.17154 534.61039 -2.92001 4.24596 10.01973 -1.10706 0.64990 1.02420 7 3 4 2.38 2013-Sep-20 09:11:29 4171696.28618 872119.29977 4730017.75940 11.80798 48.17154 536.87882 -1.76782 4.26141 12.28816 0.04514 0.66534 3.29263 7 3 4 2.38 2013-Sep-20 09:11:29 4171696.24372 872119.42877 4730018.64861 11.80798 48.17154 537.53129 -1.63286 4.86573 12.94064 0.18010 1.26966 3.94510 7 3 4 2.38 2013-Sep-20 09:11:29 4171694.47531 872120.14495 4730017.91560 11.80800 48.17155 535.92844 -0.56997 5.55751 11.33778 1.24299 1.96145 2.34225 7 3 4 2.38 2013-Sep-20 09:11:29 4171692.02413 872118.75371 4730015.57320 11.80799 48.17155 532.39304 -1.43017 5.99533 7.80238 0.38279 2.39927 -1.19315 7 3 4 2.38 2013-Sep-20 09:11:29 4171692.68112 872118.02196 4730015.16433 11.80797 48.17155 532.41738 -2.28088 5.35504 7.82672 -0.46792 1.75898 -1.16881 7 3 4 2.38 2013-Sep-20 09:11:30 4171698.26892 872120.32798 4730019.17740 11.80799 48.17153 539.37006 -1.16711 3.60414 14.77941 0.64585 0.00807 5.78387 7 3 4 2.38 2013-Sep-20 09:11:30 4171693.83005 872119.05864 4730014.08610 11.80799 48.17153 532.50543 -1.50125 3.63988 7.91478 0.31171 0.04382 -1.08076 7 3 4 2.38 2013-Sep-20 09:11:30 4171698.20908 872122.93997 4730015.33242 11.80802 48.17150 536.82239 1.40186 0.68527 12.23174 3.21482 -2.91079 3.23620 7 3 4 2.38 2013-Sep-20 09:11:30 4171695.97666 872120.12333 4730013.88632 11.80799 48.17151 533.90315 -0.89835 1.77862 9.31250 0.91461 -1.81744 0.31696 7 3 4 2.38 2013-Sep-20 09:11:30 4171696.92966 872121.12356 4730013.16645 11.80800 48.17150 534.12535 -0.11430 0.45093 9.53470 1.69866 -3.14513 0.53916 7 3 4 2.38 2013-Sep-20 09:11:30 4171697.32508 872121.12276 4730014.01853 11.80800 48.17150 535.01829 -0.19600 0.73090 10.42764 1.61696 -2.86517 1.43211 7 3 4 2.38 2013-Sep-20 09:11:30 4171696.65321 872122.10532 4730013.16538 11.80802 48.17150 534.07807 0.90325 0.50214 9.48742 2.71621 -3.09392 0.49188 7 3 4 2.38 2013-Sep-20 09:11:30 4171698.16121 872123.04957 4730013.98422 11.80803 48.17150 535.80150 1.51893 -0.19564 11.21084 3.33190 -3.79170 2.21531 7 3 4 2.38 2013-Sep-20 09:11:30 4171699.64704 872122.89464 4730015.46791 11.80802 48.17150 537.85585 1.06324 -0.26627 13.26520 2.87620 -3.86233 4.26966 7 3 4 2.38 2013-Sep-20 09:11:30 4171700.85327 872122.27936 4730017.03292 11.80801 48.17150 539.72546 0.21413 -0.00854 15.13481 2.02710 -3.60461 6.13927 7 3 4 2.38 2013-Sep-20 09:11:30 4171696.34753 872120.12522 4730014.30993 11.80799 48.17151 534.46116 -0.97240 1.79033 9.87050 0.84056 -1.80573 0.87497 7 3 4 2.38 2013-Sep-20 09:11:30 4171700.59557 872122.80469 4730018.34648 11.80802 48.17151 540.60772 0.78109 0.97533 16.01707 2.59405 -2.62073 7.02153 7 3 4 2.38 2013-Sep-20 09:11:30 4171698.96544 872121.46834 4730015.70480 11.80800 48.17150 537.39278 -0.19341 0.60633 12.80212 1.61955 -2.98973 3.80659 7 3 4 2.38 2013-Sep-20 09:11:30 4171692.62677 872118.77648 4730009.87217 11.80799 48.17151 528.54145 -1.53120 1.75027 3.95080 0.28176 -1.84579 -5.04474 7 3 4 2.38 2013-Sep-20 09:11:30 4171693.56977 872118.49947 4730009.84089 11.80798 48.17151 529.09592 -1.99532 1.08384 4.50526 -0.18236 -2.51222 -4.49027 7 3 4 2.38 2013-Sep-20 09:11:30 4171696.54106 872121.05589 4730014.78581 11.80800 48.17151 535.06910 -0.10102 1.82464 10.47844 1.71194 -1.77142 1.48291 7 3 4 2.38 2013-Sep-20 09:11:30 4171699.28641 872121.68572 4730017.28730 11.80801 48.17151 538.81116 -0.04631 1.39445 14.22051 1.76665 -2.20161 5.22497 7 3 4 2.38 2013-Sep-20 09:11:30 4171697.35350 872120.28275 4730015.59475 11.80799 48.17151 536.09672 -1.02406 1.88944 11.50606 0.78890 -1.70663 2.51053 7 3 4 2.38 2013-Sep-20 09:11:30 4171697.41420 872120.14113 4730014.05201 11.80799 48.17151 534.96746 -1.17510 0.83790 10.37680 0.63786 -2.75817 1.38127 7 3 4 2.38 2013-Sep-20 09:11:30 4171698.63958 872121.94094 4730017.48684 11.80801 48.17152 538.57243 0.33587 1.96040 13.98178 2.14883 -1.63566 4.98624 7 3 4 2.38 2013-Sep-20 09:11:30 4171694.74321 872121.15456 4730014.74022 11.80801 48.17153 533.87498 0.36346 3.09049 9.28432 2.17642 -0.50557 0.28879 7 3 4 2.38 2013-Sep-20 09:11:30 4171697.29040 872123.02076 4730016.70891 11.80803 48.17152 537.25940 1.66893 2.26100 12.66875 3.48189 -1.33506 3.67321 7 3 4 2.38 2013-Sep-20 09:11:30 4171694.96024 872122.44852 4730013.85495 11.80803 48.17152 533.53358 1.58563 2.14450 8.94293 3.39859 -1.45156 -0.05261 7 3 4 2.38 2013-Sep-20 09:11:30 4171693.89942 872122.01331 4730011.53162 11.80802 48.17151 531.05048 1.37670 1.43517 6.45982 3.18966 -2.16089 -2.53571 7 3 4 2.38 2013-Sep-20 09:11:30 4171698.12185 872124.00491 4730015.22298 11.80804 48.17150 536.82924 2.46211 0.51352 12.23859 4.27507 -3.08254 3.24305 7 3 4 2.38 2013-Sep-20 09:11:31 4171701.76915 872124.39407 4730017.25623 11.80803 48.17149 540.77833 2.09668 -0.85009 16.18767 3.90964 -4.44615 7.19214 7 3 4 2.38 2013-Sep-20 09:11:31 4171701.62926 872123.10073 4730015.49390 11.80802 48.17148 539.19732 0.85934 -1.72614 14.60667 2.67230 -5.32221 5.61113 7 3 4 2.38 2013-Sep-20 09:11:31 4171696.83396 872120.51495 4730012.08727 11.80800 48.17150 533.17567 -0.69045 -0.10618 8.58502 1.12251 -3.70224 -0.41052 7 3 4 2.38 2013-Sep-20 09:11:31 4171697.41331 872121.31794 4730013.75052 11.80801 48.17150 534.90282 -0.02301 0.45804 10.31216 1.78996 -3.13802 1.31663 7 3 4 2.38 2013-Sep-20 09:11:31 4171696.98600 872120.95555 4730013.18712 11.80800 48.17150 534.15461 -0.29029 0.44923 9.56395 1.52267 -3.14683 0.56842 7 3 4 2.38 2013-Sep-20 09:11:31 4171694.04482 872120.43889 4730011.38615 11.80800 48.17151 530.82213 -0.19415 1.47217 6.23148 1.61881 -2.12389 -2.76405 7 3 4 2.38 2013-Sep-20 09:11:31 4171698.00385 872123.47444 4730014.18133 11.80803 48.17150 535.90363 1.96702 -0.01420 11.31297 3.77998 -3.61026 2.31744 7 3 4 2.38 2013-Sep-20 09:11:31 4171696.78061 872121.42378 4730014.12273 11.80801 48.17151 534.78159 0.21006 1.15161 10.19094 2.02302 -2.44446 1.19540 7 3 4 2.38 2013-Sep-20 09:11:31 4171695.68997 872120.95522 4730012.45193 11.80801 48.17151 532.76070 -0.02540 0.90428 8.17005 1.78756 -2.69178 -0.82549 7 3 4 2.38 2013-Sep-20 09:11:31 4171696.79229 872123.24570 4730012.80506 11.80803 48.17150 534.05600 1.99103 -0.01348 9.46534 3.80400 -3.60954 0.46981 7 3 4 2.38 2013-Sep-20 09:11:31 4171696.84384 872123.37869 4730012.15739 11.80803 48.17149 533.62519 2.11066 -0.50329 9.03454 3.92362 -4.09935 0.03900 7 3 4 2.38 2013-Sep-20 09:11:31 4171700.89634 872123.35249 4730017.20702 11.80802 48.17150 540.02976 1.25575 -0.08748 15.43911 3.06871 -3.68354 6.44357 7 3 4 2.38 2013-Sep-20 09:11:31 4171697.98251 872119.90541 4730014.38778 11.80799 48.17150 535.55647 -1.52212 0.68326 10.96581 0.29084 -2.91281 1.97028 7 3 4 2.38 2013-Sep-20 09:11:31 4171697.69756 872121.97965 4730014.15532 11.80801 48.17150 535.48031 0.56653 0.41978 10.88966 2.37949 -3.17628 1.89412 7 3 4 2.38 2013-Sep-20 09:11:31 4171700.52680 872122.92218 4730016.59934 11.80802 48.17150 539.27699 0.91016 -0.15759 14.68633 2.72312 -3.75365 5.69080 7 3 4 2.38 2013-Sep-20 09:11:31 4171698.39552 872121.11229 4730014.63178 11.80800 48.17150 536.17260 -0.42530 0.36071 11.58194 1.38766 -3.23535 2.58641 7 3 4 2.38 2013-Sep-20 09:11:31 4171699.86931 872122.24930 4730015.30119 11.80801 48.17149 537.78865 0.38606 -0.44118 13.19799 2.19902 -4.03724 4.20246 7 3 4 2.38 2013-Sep-20 09:11:31 4171698.03849 872122.27009 4730013.20913 11.80802 48.17149 535.03745 0.78106 -0.50419 10.44680 2.59402 -4.10025 1.45126 7 3 4 2.38 2013-Sep-20 09:11:31 4171699.01237 872121.03175 4730015.15030 11.80800 48.17150 536.95066 -0.63036 0.26888 12.36000 1.18260 -3.32718 3.36447 7 3 4 2.38 2013-Sep-20 09:11:31 4171700.38797 872122.29167 4730016.49317 11.80801 48.17150 539.02120 0.32141 -0.03100 14.43055 2.13437 -3.62706 5.43501 7 3 4 2.38 2013-Sep-20 09:11:31 4171699.84155 872123.17397 4730018.40310 11.80802 48.17151 540.20808 1.29684 1.50675 15.61743 3.10981 -2.08931 6.62190 7 3 4 2.38 2013-Sep-20 09:11:31 4171696.45219 872121.13268 4730015.80448 11.80801 48.17152 535.78062 -0.00767 2.55710 11.18997 1.80529 -1.03896 2.19443 7 3 4 2.38 2013-Sep-20 09:11:31 4171697.41566 872121.08123 4730017.47779 11.80800 48.17152 537.64941 -0.25519 2.97815 13.05875 1.55777 -0.61792 4.06322 7 3 4 2.38 2013-Sep-20 09:11:31 4171698.47013 872122.57172 4730018.46835 11.80802 48.17152 539.27927 0.98798 2.64238 14.68861 2.80094 -0.95369 5.69308 7 3 4 2.38 2013-Sep-20 09:11:31 4171699.76482 872122.20683 4730018.91852 11.80801 48.17152 540.41008 0.36587 2.05393 15.81942 2.17883 -1.54214 6.82389 7 3 4 2.38 2013-Sep-20 09:11:32 4171699.67571 872122.06987 4730017.84856 11.80801 48.17151 539.53594 0.25005 1.42624 14.94529 2.06301 -2.16982 5.94975 7 3 4 2.38 2013-Sep-20 09:11:32 4171700.17402 872121.07050 4730017.18905 11.80799 48.17150 539.23342 -0.83014 0.77534 14.64277 0.98282 -2.82072 5.64723 7 3 4 2.38 2013-Sep-20 09:11:32 4171699.94684 872120.69430 4730017.57383 11.80799 48.17151 539.32050 -1.15189 1.25502 14.72985 0.66107 -2.34105 5.73431 7 3 4 2.38 2013-Sep-20 09:11:32 4171695.86171 872120.08078 4730012.05899 11.80799 48.17150 532.46068 -0.91648 0.65030 7.87002 0.89648 -2.94576 -1.12551 7 3 4 2.38 2013-Sep-20 09:11:32 4171692.74376 872119.90583 4730009.63812 11.80800 48.17151 528.59753 -0.44970 1.33665 4.00688 1.36326 -2.25941 -4.98866 7 3 4 2.38 2013-Sep-20 09:11:32 4171693.11802 872121.32357 4730009.95869 11.80802 48.17151 529.27420 0.86146 1.06128 4.68355 2.67442 -2.53478 -4.31199 7 3 4 2.38 2013-Sep-20 09:11:32 4171694.62019 872121.63663 4730011.20999 11.80802 48.17150 531.22992 0.86051 0.75239 6.63927 2.67347 -2.84367 -2.35627 7 3 4 2.38 2013-Sep-20 09:11:32 4171693.08701 872120.82783 4730010.58198 11.80801 48.17151 529.65074 0.38255 1.57516 5.06009 2.19551 -2.02090 -3.93544 7 3 4 2.38 2013-Sep-20 09:11:32 4171693.56567 872120.52789 4730013.26995 11.80801 48.17153 531.92520 -0.00899 3.06439 7.33454 1.80397 -0.53167 -1.66099 7 3 4 2.38 2013-Sep-20 09:11:32 4171695.48776 872121.01770 4730013.87497 11.80801 48.17152 533.69760 0.07713 1.99127 9.10694 1.89009 -1.60479 0.11141 7 3 4 2.38 2013-Sep-20 09:11:32 4171696.54161 872120.89515 4730015.08405 11.80800 48.17152 535.26976 -0.25847 2.04764 10.67910 1.55449 -1.54842 1.68357 7 3 4 2.38 2013-Sep-20 09:11:32 4171698.14005 872121.86835 4730014.99570 11.80801 48.17150 536.38018 0.36704 0.67446 11.78952 2.18000 -2.92160 2.79399 7 3 4 2.38 2013-Sep-20 09:11:32 4171696.95949 872121.14289 4730014.46102 11.80800 48.17151 535.11211 -0.10149 1.28957 10.52145 1.71147 -2.30649 1.52592 7 3 4 2.38 2013-Sep-20 09:11:32 4171696.00914 872119.82210 4730013.46721 11.80799 48.17151 533.57095 -1.19985 1.52136 8.98029 0.61311 -2.07470 -0.01524 7 3 4 2.38 2013-Sep-20 09:11:32 4171701.40291 872121.95208 4730017.87108 11.80800 48.17150 540.66415 -0.21869 0.19944 16.07349 1.59427 -3.39662 7.07796 7 3 4 2.38 2013-Sep-20 09:11:32 4171695.65275 872121.52404 4730015.60274 11.80801 48.17152 535.16185 0.53900 2.94598 10.57119 2.35196 -0.65009 1.57566 7 3 4 2.38 2013-Sep-20 09:11:32 4171697.42165 872120.31319 4730016.56531 11.80799 48.17152 536.86857 -1.00820 2.48235 12.27791 0.80476 -1.11371 3.28238 7 3 4 2.38 2013-Sep-20 09:11:32 4171698.96464 872121.97876 4730017.99457 11.80801 48.17152 539.16812 0.30637 2.05615 14.57747 2.11933 -1.53992 5.58194 7 3 4 2.38 2013-Sep-20 09:11:32 4171695.54423 872120.87815 4730017.16218 11.80800 48.17154 536.16486 -0.07102 4.16361 11.57421 1.74194 0.56755 2.57867 7 3 4 2.38 2013-Sep-20 09:11:32 4171690.17505 872117.83562 4730010.78609 11.80798 48.17154 527.49359 -1.95045 4.29145 2.90293 -0.13749 0.69540 -6.09260 7 3 4 2.38 2013-Sep-20 09:11:32 4171692.12620 872119.79749 4730013.83103 11.80800 48.17154 531.30394 -0.42937 4.59987 6.71328 1.38359 1.00380 -2.28225 7 3 4 2.38 2013-Sep-20 09:11:32 4171691.00390 872118.66875 4730012.66655 11.80799 48.17154 529.54957 -1.30456 4.81397 4.95891 0.50839 1.21791 -4.03662 7 3 4 2.38 2013-Sep-20 09:11:32 4171695.61142 872119.94615 4730017.12012 11.80799 48.17154 536.05020 -0.99704 4.22866 11.45954 0.81592 0.63260 2.46401 7 3 4 2.38 2013-Sep-20 09:11:32 4171697.07143 872119.70939 4730017.66332 11.80799 48.17153 537.37573 -1.52756 3.56213 12.78507 0.28540 -0.03393 3.78954 7 3 4 2.38 2013-Sep-20 09:11:32 4171695.53907 872118.93159 4730014.25243 11.80798 48.17152 533.72766 -1.97533 2.52366 9.13700 -0.16237 -1.07240 0.14147 7 3 4 2.38 2013-Sep-20 09:11:33 4171693.38314 872116.17409 4730011.24903 11.80795 48.17152 529.70601 -4.23330 2.51364 5.11535 -2.42034 -1.08242 -3.88018 7 3 4 2.38 2013-Sep-20 09:11:33 4171694.17525 872118.25789 4730014.26288 11.80797 48.17153 532.75322 -2.35569 3.62810 8.16256 -0.54273 0.03204 -0.83297 7 3 4 2.38 2013-Sep-20 09:11:33 4171696.14932 872119.23864 4730016.09468 11.80798 48.17153 535.54067 -1.79966 3.26034 10.95002 0.01330 -0.33572 1.95448 7 3 4 2.38 2013-Sep-20 09:11:33 4171695.66794 872118.17743 4730016.54258 11.80797 48.17153 535.41536 -2.73990 4.07197 10.82470 -0.92694 0.47591 1.82917 7 3 4 2.38 2013-Sep-20 09:11:33 4171692.65960 872117.00697 4730014.22706 11.80796 48.17154 531.56642 -3.26999 4.90043 6.97576 -1.45703 1.30437 -2.01977 7 3 4 2.38 2013-Sep-20 09:11:33 4171694.86981 872118.65044 4730015.24167 11.80798 48.17153 533.98953 -2.11358 3.71441 9.39888 -0.30062 0.11834 0.40335 7 3 4 2.38 2013-Sep-20 09:11:33 4171696.18617 872118.65764 4730015.63173 11.80797 48.17152 535.14048 -2.37590 3.01331 10.54982 -0.56294 -0.58275 1.55429 7 3 4 2.38 2013-Sep-20 09:11:33 4171694.95458 872117.40193 4730013.79240 11.80796 48.17152 532.79457 -3.35301 2.87643 8.20391 -1.54005 -0.71963 -0.79162 7 3 4 2.38 2013-Sep-20 09:11:33 4171695.80329 872119.19935 4730016.04300 11.80798 48.17153 535.27092 -1.76730 3.48426 10.68026 0.04566 -0.11181 1.68473 7 3 4 2.38 2013-Sep-20 09:11:33 4171697.16613 872119.18397 4730018.03988 11.80798 48.17153 537.64643 -2.06124 3.82431 13.05578 -0.24828 0.22824 4.06025 7 3 4 2.38 2013-Sep-20 09:11:33 4171695.34082 872118.39122 4730017.32410 11.80797 48.17154 535.81334 -2.46370 4.79916 11.22268 -0.65074 1.20310 2.22715 7 3 4 2.38 2013-Sep-20 09:11:33 4171697.92042 872119.02717 4730019.71352 11.80797 48.17154 539.36453 -2.36908 4.41421 14.77388 -0.55612 0.81814 5.77835 7 3 4 2.38 2013-Sep-20 09:11:33 4171696.31809 872117.99340 4730017.19117 11.80796 48.17153 536.29795 -3.05308 4.05837 11.70730 -1.24012 0.46231 2.71176 7 3 4 2.38 2013-Sep-20 09:11:33 4171694.49039 872117.01224 4730014.71444 11.80796 48.17153 533.12542 -3.63947 3.88932 8.53477 -1.82651 0.29326 -0.46076 7 3 4 2.38 2013-Sep-20 09:11:33 4171692.15456 872116.40968 4730011.34855 11.80796 48.17153 529.01031 -3.75129 3.44018 4.41966 -1.93833 -0.15588 -4.57588 7 3 4 2.38 2013-Sep-20 09:11:33 4171693.74161 872117.77649 4730014.38891 11.80797 48.17153 532.49836 -2.73817 4.10184 7.90770 -0.92521 0.50578 -1.08783 7 3 4 2.38 2013-Sep-20 09:11:33 4171691.32930 872116.91961 4730011.11749 11.80796 48.17153 528.36901 -3.08327 3.81026 3.77835 -1.27031 0.21420 -5.21718 7 3 4 2.38 2013-Sep-20 09:11:33 4171689.40517 872115.46055 4730007.98031 11.80795 48.17153 524.57618 -4.11772 3.34396 -0.01447 -2.30476 -0.25210 -9.01001 7 3 4 2.38 2013-Sep-20 09:11:33 4171691.52175 872117.27570 4730011.72622 11.80797 48.17153 528.99682 -2.77411 4.02156 4.40617 -0.96115 0.42550 -4.58937 7 3 4 2.38 2013-Sep-20 09:11:33 4171694.24856 872118.10446 4730013.56436 11.80797 48.17153 532.25964 -2.52088 3.13217 7.66899 -0.70792 -0.46389 -1.32655 7 3 4 2.38 2013-Sep-20 09:11:33 4171695.03155 872118.08511 4730015.18106 11.80797 48.17153 533.97281 -2.70004 3.64222 9.38215 -0.88708 0.04616 0.38662 7 3 4 2.38 2013-Sep-20 09:11:33 4171694.44460 872119.92811 4730015.27935 11.80800 48.17153 533.91440 -0.77593 3.85485 9.32375 1.03703 0.25879 0.32821 7 3 4 2.38 2013-Sep-20 09:11:33 4171692.51924 872117.20533 4730012.79137 11.80796 48.17153 530.43206 -3.04711 4.01510 5.84141 -1.23415 0.41904 -3.15413 7 3 4 2.38 2013-Sep-20 09:11:33 4171694.14532 872118.05045 4730014.36843 11.80797 48.17153 532.78402 -2.55262 3.75195 8.19337 -0.73966 0.15589 -0.80217 7 3 4 2.38 2013-Sep-20 09:11:33 4171694.60358 872119.09435 4730015.78673 11.80798 48.17154 534.28247 -1.62459 4.20440 9.69182 0.18837 0.60834 0.69629 7 3 4 2.38 2013-Sep-20 09:11:34 4171697.71712 872118.76036 4730018.49023 11.80797 48.17153 538.28388 -2.58864 3.78735 13.69322 -0.77567 0.19129 4.69769 7 3 4 2.38 2013-Sep-20 09:11:34 4171698.50526 872120.06490 4730020.36119 11.80799 48.17154 540.37053 -1.47298 4.26134 15.77987 0.33998 0.66527 6.78434 7 3 4 2.38 2013-Sep-20 09:11:34 4171700.01562 872119.60757 4730020.38900 11.80798 48.17153 541.31480 -2.22970 3.24800 16.72414 -0.41674 -0.34807 7.72861 7 3 4 2.38 2013-Sep-20 09:11:34 4171703.02134 872119.88652 4730021.20011 11.80797 48.17151 543.91936 -2.57172 1.55410 19.32871 -0.75876 -2.04197 10.33317 7 3 4 2.38 2013-Sep-20 09:11:34 4171700.68918 872119.11903 4730020.19398 11.80797 48.17152 541.54250 -2.84574 2.70115 16.95185 -1.03278 -0.89491 7.95631 7 3 4 2.38 2013-Sep-20 09:11:34 4171695.91369 872118.29525 4730016.78767 11.80797 48.17153 535.77449 -2.67486 4.03822 11.18383 -0.86190 0.44215 2.18830 7 3 4 2.38 2013-Sep-20 09:11:34 4171692.19223 872116.24494 4730011.91046 11.80795 48.17153 529.43112 -3.92026 3.81256 4.84047 -2.10730 0.21650 -4.15507 7 3 4 2.38 2013-Sep-20 09:11:34 4171692.60351 872115.67836 4730012.42184 11.80794 48.17153 530.00333 -4.55901 3.94003 5.41268 -2.74605 0.34397 -3.58286 7 3 4 2.38 2013-Sep-20 09:11:34 4171692.30553 872116.47974 4730011.77706 11.80796 48.17153 529.43772 -3.71361 3.60516 4.84707 -1.90065 0.00910 -4.14847 7 3 4 2.38 2013-Sep-20 09:11:34 4171692.75250 872116.39083 4730014.49148 11.80795 48.17154 531.74001 -3.89211 5.10296 7.14935 -2.07915 1.50690 -1.84618 7 3 4 2.38 2013-Sep-20 09:11:34 4171693.38938 872117.92347 4730014.57571 11.80797 48.17154 532.42768 -2.52222 4.46091 7.83702 -0.70926 0.86485 -1.15851 7 3 4 2.38 2013-Sep-20 09:11:34 4171693.41935 872118.32627 4730013.77584 11.80798 48.17153 531.90619 -2.13408 3.84420 7.31554 -0.32112 0.24814 -1.67999 7 3 4 2.38 2013-Sep-20 09:11:34 4171693.32380 872117.47642 4730014.12891 11.80797 48.17154 531.99093 -2.94639 4.27895 7.40027 -1.13343 0.68288 -1.59526 7 3 4 2.38 2013-Sep-20 09:11:34 4171692.65694 872118.51198 4730013.90922 11.80798 48.17154 531.53323 -1.79628 4.46092 6.94258 0.01668 0.86486 -2.05296 7 3 4 2.38 2013-Sep-20 09:11:34 4171691.90780 872118.74806 4730013.12016 11.80799 48.17154 530.48846 -1.41189 4.44509 5.89780 0.40106 0.84903 -3.09773 7 3 4 2.38 2013-Sep-20 09:11:34 4171691.70153 872117.98405 4730014.60682 11.80798 48.17155 531.35731 -2.11753 5.70350 6.76666 -0.30458 2.10744 -2.22888 7 3 4 2.38 2013-Sep-20 09:11:34 4171694.24309 872119.02442 4730017.39279 11.80798 48.17155 535.23435 -1.61927 5.54908 10.64369 0.19369 1.95302 1.64816 7 3 4 2.38 2013-Sep-20 09:11:34 4171693.32101 872117.94897 4730015.87242 11.80797 48.17155 533.35276 -2.48327 5.37167 8.76210 -0.67031 1.77561 -0.23343 7 3 4 2.38 2013-Sep-20 09:11:34 4171696.72265 872120.43472 4730018.33754 11.80800 48.17154 537.74942 -0.74620 4.15556 13.15877 1.06676 0.55950 4.16324 7 3 4 2.38 2013-Sep-20 09:11:34 4171695.24415 872118.29192 4730016.16456 11.80797 48.17153 534.87266 -2.54111 4.11152 10.28200 -0.72815 0.51546 1.28647 7 3 4 2.38 2013-Sep-20 09:11:34 4171697.46090 872121.11818 4730018.27307 11.80800 48.17153 538.27658 -0.22828 3.46990 13.68593 1.58469 -0.12617 4.69039 7 3 4 2.38 2013-Sep-20 09:11:34 4171698.36143 872121.15813 4730019.08653 11.80800 48.17153 539.47604 -0.37345 3.34948 14.88538 1.43951 -0.24659 5.88985 7 3 4 2.38 2013-Sep-20 09:11:34 4171698.97376 872121.73982 4730018.37301 11.80801 48.17152 539.42346 0.07062 2.33831 14.83281 1.88358 -1.25775 5.83728 7 3 4 2.38 2013-Sep-20 09:11:34 4171695.05377 872118.90064 4730014.60167 11.80798 48.17153 533.66687 -1.90632 3.11526 9.07622 -0.09336 -0.48080 0.08068 7 3 4 2.38 2013-Sep-20 09:11:34 4171693.98799 872119.37912 4730015.20478 11.80799 48.17154 533.48585 -1.21987 4.22187 8.89519 0.59309 0.62581 -0.10034 7 3 4 2.38 2013-Sep-20 09:11:35 4171691.59768 872118.10163 4730013.07446 11.80798 48.17154 530.16374 -1.98119 4.73938 5.57308 -0.16823 1.14332 -3.42245 7 3 4 2.38 2013-Sep-20 09:11:35 4171692.69617 872117.92132 4730012.70509 11.80797 48.17153 530.58098 -2.38247 3.71933 5.99033 -0.56951 0.12327 -3.00521 7 3 4 2.38 2013-Sep-20 09:11:35 4171688.53303 872116.05191 4730008.85767 11.80796 48.17154 524.74133 -3.36041 4.47502 0.15067 -1.54745 0.87896 -8.84486 7 3 4 2.38 2013-Sep-20 09:11:35 4171691.67697 872117.48426 4730012.70439 11.80797 48.17154 529.85549 -2.60172 4.52888 5.26483 -0.78876 0.93282 -3.73070 7 3 4 2.38 2013-Sep-20 09:11:35 4171692.43862 872117.97018 4730014.46605 11.80797 48.17154 531.73169 -2.28194 5.07412 7.14103 -0.46898 1.47806 -1.85450 7 3 4 2.38 2013-Sep-20 09:11:35 4171694.64348 872118.29297 4730016.79061 11.80797 48.17154 534.94719 -2.41717 4.96698 10.35653 -0.60421 1.37092 1.36100 7 3 4 2.38 2013-Sep-20 09:11:35 4171692.44947 872117.08023 4730013.09106 11.80796 48.17154 530.59275 -3.15528 4.28492 6.00210 -1.34232 0.68886 -2.99343 7 3 4 2.38 2013-Sep-20 09:11:35 4171692.69437 872116.96410 4730013.10921 11.80796 48.17153 530.75030 -3.31907 4.13611 6.15964 -1.50611 0.54005 -2.83589 7 3 4 2.38 2013-Sep-20 09:11:35 4171692.00709 872116.98460 4730014.64964 11.80796 48.17155 531.45229 -3.15836 5.66159 6.86163 -1.34540 2.06552 -2.13390 7 3 4 2.38 2013-Sep-20 09:11:35 4171693.38478 872118.56309 4730016.72597 11.80798 48.17155 534.11422 -1.89519 5.80075 9.52356 -0.08223 2.20469 0.52803 7 3 4 2.38 2013-Sep-20 09:11:35 4171691.92834 872116.68487 4730015.17580 11.80796 48.17155 531.75205 -3.43563 6.11562 7.16139 -1.62268 2.51956 -1.83414 7 3 4 2.38 2013-Sep-20 09:11:35 4171692.17088 872116.15307 4730016.47838 11.80795 48.17156 532.80841 -4.00581 6.88851 8.21775 -2.19285 3.29245 -0.77778 7 3 4 2.38 2013-Sep-20 09:11:35 4171691.32198 872116.78377 4730013.64684 11.80796 48.17155 530.23042 -3.21475 5.52314 5.63976 -1.40179 1.92708 -3.35577 7 3 4 2.38 2013-Sep-20 09:11:35 4171692.39347 872118.10994 4730015.52382 11.80798 48.17155 532.50948 -2.13590 5.79117 7.91883 -0.32294 2.19511 -1.07670 7 3 4 2.38 2013-Sep-20 09:11:35 4171692.04443 872118.25264 4730015.06071 11.80798 48.17155 531.95602 -1.92479 5.71514 7.36537 -0.11183 2.11908 -1.63016 7 3 4 2.38 2013-Sep-20 09:11:35 4171694.27706 872119.00306 4730015.56449 11.80798 48.17154 533.89126 -1.64712 4.30827 9.30060 0.16584 0.71220 0.30507 7 3 4 2.38 2013-Sep-20 09:11:35 4171693.83391 872118.08116 4730015.68319 11.80797 48.17154 533.56462 -2.45884 4.85122 8.97396 -0.64588 1.25516 -0.02157 7 3 4 2.38 2013-Sep-20 09:11:35 4171692.03784 872117.65284 4730014.08187 11.80797 48.17154 531.14049 -2.51055 5.15861 6.54983 -0.69760 1.56255 -2.44570 7 3 4 2.38 2013-Sep-20 09:11:35 4171689.29288 872116.72334 4730011.77685 11.80797 48.17155 527.50418 -2.85867 5.76523 2.91352 -1.04571 2.16917 -6.08201 7 3 4 2.38 2013-Sep-20 09:11:35 4171689.57005 872117.26138 4730012.39955 11.80797 48.17155 528.22254 -2.38874 5.89631 3.63189 -0.57578 2.30026 -5.36364 7 3 4 2.38 2013-Sep-20 09:11:35 4171690.50515 872117.27741 4730012.22343 11.80797 48.17154 528.70393 -2.56440 5.09437 4.11327 -0.75144 1.49831 -4.88226 7 3 4 2.38 2013-Sep-20 09:11:35 4171692.20620 872117.64868 4730014.79210 11.80797 48.17155 531.77905 -2.54908 5.51011 7.18840 -0.73612 1.91405 -1.80714 7 3 4 2.38 2013-Sep-20 09:11:35 4171691.46176 872116.40297 4730014.09906 11.80796 48.17155 530.60667 -3.61609 5.78084 6.01602 -1.80313 2.18478 -2.97952 7 3 4 2.38 2013-Sep-20 09:11:35 4171688.67955 872114.80607 4730010.46651 11.80794 48.17155 525.86577 -4.60986 5.63106 1.27511 -2.79690 2.03500 -7.72042 7 3 4 2.38 2013-Sep-20 09:11:35 4171685.65827 872113.70093 4730005.62804 11.80794 48.17154 520.13733 -5.07336 4.77643 -4.45333 -3.26041 1.18037 -13.44886 7 3 4 2.38 2013-Sep-20 09:11:36 4171687.42392 872115.84245 4730007.08054 11.80796 48.17153 522.66450 -3.33847 4.13074 -1.92616 -1.52552 0.53468 -10.92169 7 3 4 2.38 2013-Sep-20 09:11:36 4171691.85291 872116.53905 4730011.65024 11.80796 48.17153 529.05585 -3.56293 3.84167 4.46519 -1.74998 0.24561 -4.53034 7 3 4 2.38 2013-Sep-20 09:11:36 4171702.17441 872123.29327 4730015.12890 11.80802 48.17148 539.30748 0.93624 -2.39654 14.71683 2.74920 -5.99261 5.72129 7 3 4 2.38 2013-Sep-20 09:11:36 4171700.34949 872123.48151 4730013.28926 11.80803 48.17148 536.77109 1.49394 -2.32106 12.18044 3.30690 -5.91712 3.18490 7 3 4 2.38 2013-Sep-20 09:11:36 4171698.36269 872122.64152 4730011.34768 11.80802 48.17148 533.91274 1.07829 -2.03869 9.32208 2.89125 -5.63476 0.32654 7 3 4 2.38 2013-Sep-20 09:11:36 4171696.60207 872121.53814 4730010.82027 11.80801 48.17149 532.21984 0.35854 -0.93803 7.62919 2.17150 -4.53409 -1.36635 7 3 4 2.38 2013-Sep-20 09:11:36 4171697.57430 872122.02479 4730010.79413 11.80801 48.17148 532.90144 0.63594 -1.73879 8.31078 2.44890 -5.33485 -0.68475 7 3 4 2.38 2013-Sep-20 09:11:36 4171696.69283 872121.57935 4730009.73856 11.80801 48.17148 531.47868 0.38030 -1.73190 6.88803 2.19326 -5.32796 -2.10751 7 3 4 2.38 2013-Sep-20 09:11:36 4171703.24765 872124.67207 4730015.28909 11.80803 48.17147 540.31562 2.06625 -3.28275 15.72496 3.87921 -6.87882 6.72943 7 3 4 2.38 2013-Sep-20 09:11:36 4171698.26339 872123.31328 4730011.79445 11.80803 48.17148 534.27249 1.75615 -1.77075 9.68184 3.56911 -5.36681 0.68630 7 3 4 2.38 2013-Sep-20 09:11:36 4171700.81223 872123.77116 4730015.44258 11.80803 48.17149 538.71723 1.68277 -1.26668 14.12657 3.49573 -4.86274 5.13103 7 3 4 2.38 2013-Sep-20 09:11:36 4171699.70693 872123.18767 4730014.44119 11.80802 48.17149 537.16989 1.33781 -1.03936 12.57923 3.15077 -4.63542 3.58370 7 3 4 2.38 2013-Sep-20 09:11:36 4171700.16685 872123.40235 4730013.89245 11.80803 48.17148 537.09052 1.45383 -1.77351 12.49987 3.26679 -5.36957 3.50433 7 3 4 2.38 2013-Sep-20 09:11:36 4171701.92191 872123.96064 4730015.45634 11.80803 48.17148 539.47772 1.64116 -2.09577 14.88707 3.45413 -5.69183 5.89153 7 3 4 2.38 2013-Sep-20 09:11:36 4171703.21904 872122.72662 4730016.09006 11.80801 48.17148 540.62828 0.16782 -2.43107 16.03763 1.98078 -6.02713 7.04209 7 3 4 2.38 2013-Sep-20 09:11:36 4171699.46488 872120.20662 4730011.84254 11.80799 48.17148 534.66868 -1.53063 -2.14131 10.07803 0.28233 -5.73737 1.08249 7 3 4 2.38 2013-Sep-20 09:11:36 4171700.06437 872120.75578 4730013.49475 11.80799 48.17148 536.36610 -1.11577 -1.56043 11.77544 0.69720 -5.15650 2.77991 7 3 4 2.38 2013-Sep-20 09:11:36 4171698.39779 872122.36705 4730012.19598 11.80802 48.17148 534.53029 0.80245 -1.45671 9.93964 2.61541 -5.05277 0.94410 7 3 4 2.38 2013-Sep-20 09:11:36 4171698.10795 872122.13058 4730011.03036 11.80801 48.17148 533.44027 0.63029 -1.98661 8.84961 2.44325 -5.58267 -0.14593 7 3 4 2.38 2013-Sep-20 09:11:36 4171700.57115 872121.69513 4730012.42067 11.80800 48.17147 536.02477 -0.29999 -2.78961 11.43412 1.51297 -6.38568 2.43858 7 3 4 2.38 2013-Sep-20 09:11:36 4171700.93226 872123.28020 4730013.87904 11.80802 48.17148 537.56352 1.17763 -2.32209 12.97286 2.99059 -5.91815 3.97733 7 3 4 2.38 2013-Sep-20 09:11:36 4171700.75112 872123.91081 4730014.83915 11.80803 48.17148 538.24674 1.83197 -1.64583 13.65609 3.64493 -5.24190 4.66055 7 3 4 2.38 2013-Sep-20 09:11:36 4171699.17370 872122.97452 4730014.21297 11.80802 48.17149 536.62265 1.23828 -0.77014 12.03199 3.05124 -4.36620 3.03646 7 3 4 2.38 2013-Sep-20 09:11:36 4171697.49318 872121.43767 4730013.31685 11.80801 48.17150 534.64815 0.07784 0.09232 10.05750 1.89081 -3.50374 1.06196 7 3 4 2.38 2013-Sep-20 09:11:36 4171698.70603 872122.24915 4730016.39227 11.80801 48.17151 537.84226 0.62396 1.13496 13.25161 2.43692 -2.46110 4.25607 7 3 4 2.38 2013-Sep-20 09:11:37 4171699.64980 872124.38108 4730017.70586 11.80804 48.17151 539.72811 2.51766 0.99756 15.13745 4.33062 -2.59851 6.14192 7 3 4 2.38 2013-Sep-20 09:11:37 4171701.49619 872124.71381 4730018.21005 11.80804 48.17150 541.35452 2.46551 -0.06365 16.76386 4.27847 -3.65971 7.76833 7 3 4 2.38 2013-Sep-20 09:11:37 4171698.10948 872121.94558 4730013.16343 11.80801 48.17149 535.00546 0.44889 -0.53696 10.41481 2.26185 -4.13303 1.41927 7 3 4 2.38 2013-Sep-20 09:11:37 4171700.34254 872122.31617 4730013.71245 11.80801 48.17148 536.92285 0.35468 -1.85607 12.33220 2.16765 -5.45213 3.33666 7 3 4 2.38 2013-Sep-20 09:11:37 4171697.29126 872120.77181 4730009.92721 11.80800 48.17148 531.89969 -0.53261 -1.91944 7.30904 1.28036 -5.51550 -1.68650 7 3 4 2.38 2013-Sep-20 09:11:37 4171696.36468 872121.95418 4730012.70064 11.80802 48.17150 533.52280 0.81436 0.42570 8.93214 2.62732 -3.17036 -0.06339 7 3 4 2.38 2013-Sep-20 09:11:37 4171693.52071 872120.35141 4730010.85368 11.80800 48.17151 530.07130 -0.17253 1.51267 5.48065 1.64043 -2.08338 -3.51489 7 3 4 2.38 2013-Sep-20 09:11:37 4171694.21808 872119.87618 4730012.26684 11.80800 48.17152 531.51469 -0.78041 2.01894 6.92404 1.03255 -1.57712 -2.07149 7 3 4 2.38 2013-Sep-20 09:11:37 4171699.64725 872121.47435 4730016.27362 11.80800 48.17150 538.26253 -0.32705 0.48747 13.67188 1.48592 -3.10859 4.67634 7 3 4 2.38 2013-Sep-20 09:11:37 4171698.45869 872121.37156 4730013.69074 11.80800 48.17149 535.54801 -0.18444 -0.35247 10.95735 1.62852 -3.94854 1.96182 7 3 4 2.38 2013-Sep-20 09:11:37 4171701.44532 872124.96146 4730017.51253 11.80804 48.17149 540.83535 2.71833 -0.52948 16.24470 4.53129 -4.12554 7.24916 7 3 4 2.38 2013-Sep-20 09:11:37 4171702.43442 872123.59979 4730019.67027 11.80802 48.17150 542.90302 1.18308 0.39572 18.31237 2.99604 -3.20034 9.31683 7 3 4 2.38 2013-Sep-20 09:11:37 4171702.96263 872122.89897 4730018.84735 11.80801 48.17149 542.53900 0.38899 -0.43148 17.94835 2.20195 -4.02755 8.95281 7 3 4 2.38 2013-Sep-20 09:11:37 4171698.45328 872122.05874 4730015.58370 11.80801 48.17150 537.04878 0.48930 0.80911 12.45813 2.30226 -2.78696 3.46259 7 3 4 2.38 2013-Sep-20 09:11:37 4171694.86074 872120.85417 4730011.98381 11.80801 48.17151 531.85678 0.04538 1.21232 7.26613 1.85834 -2.38374 -1.72940 7 3 4 2.38 2013-Sep-20 09:11:37 4171698.16079 872123.11351 4730014.34445 11.80803 48.17150 536.07837 1.58161 0.03515 11.48772 3.39457 -3.56091 2.49218 7 3 4 2.38 2013-Sep-20 09:11:37 4171697.67216 872122.75126 4730012.57389 11.80802 48.17149 534.39064 1.32701 -0.73402 9.79999 3.13997 -4.33008 0.80445 7 3 4 2.38 2013-Sep-20 09:11:37 4171694.36918 872121.78246 4730010.44551 11.80802 48.17150 530.51632 1.05461 0.40340 5.92567 2.86757 -3.19266 -3.06987 7 3 4 2.38 2013-Sep-20 09:11:37 4171697.53091 872123.01992 4730013.18609 11.80803 48.17150 534.79128 1.61889 -0.26367 10.20062 3.43185 -3.85973 1.20509 7 3 4 2.38 2013-Sep-20 09:11:37 4171692.58084 872120.04686 4730007.38116 11.80800 48.17150 526.82867 -0.27831 -0.07120 2.23801 1.53465 -3.66726 -6.75752 7 3 4 2.38 2013-Sep-20 09:11:37 4171697.22903 872123.06997 4730013.30691 11.80803 48.17150 534.69107 1.72966 0.02946 10.10042 3.54262 -3.56661 1.10488 7 3 4 2.38 2013-Sep-20 09:11:37 4171702.00159 872124.81621 4730018.74878 11.80804 48.17150 542.09984 2.46232 -0.08861 17.50919 4.27528 -3.68467 8.51365 7 3 4 2.38 2013-Sep-20 09:11:37 4171699.03849 872122.26550 4730014.44172 11.80801 48.17149 536.60808 0.57194 -0.41085 12.01742 2.38490 -4.00691 3.02189 7 3 4 2.38 2013-Sep-20 09:11:37 4171698.33644 872122.90021 4730015.37846 11.80802 48.17150 536.93441 1.33687 0.62915 12.34376 3.14983 -2.96691 3.34822 7 3 4 2.38 2013-Sep-20 09:11:37 4171696.92941 872120.61157 4730013.48427 11.80800 48.17150 534.29215 -0.61541 0.74113 9.70149 1.19755 -2.85493 0.70596 7 3 4 2.38 2013-Sep-20 09:11:38 4171694.83003 872120.11307 4730012.00876 11.80800 48.17151 531.75419 -0.67375 1.36436 7.16353 1.13921 -2.23170 -1.83200 7 3 4 2.38 2013-Sep-20 09:11:38 4171694.29561 872119.66756 4730012.90690 11.80799 48.17152 532.01377 -1.00048 2.42105 7.42311 0.81248 -1.17501 -1.57242 7 3 4 2.38 2013-Sep-20 09:11:38 4171695.78459 872120.74693 4730014.06901 11.80800 48.17152 533.99900 -0.24865 1.94546 9.40834 1.56431 -1.65060 0.41281 7 3 4 2.38 2013-Sep-20 09:11:38 4171695.17829 872121.34806 4730014.52255 11.80801 48.17152 534.02320 0.46383 2.59849 9.43255 2.27679 -0.99757 0.43701 7 3 4 2.38 2013-Sep-20 09:11:38 4171695.80358 872122.35036 4730013.77441 11.80802 48.17151 534.01070 1.31697 1.49064 9.42004 3.12993 -2.10542 0.42451 7 3 4 2.38 2013-Sep-20 09:11:38 4171699.41036 872121.69219 4730014.61764 11.80800 48.17149 536.90368 -0.06534 -0.47734 12.31303 1.74763 -4.07340 3.31749 7 3 4 2.38 2013-Sep-20 09:11:38 4171700.28814 872122.43242 4730014.60054 11.80801 48.17149 537.56496 0.47960 -1.24185 12.97430 2.29256 -4.83791 3.97877 7 3 4 2.38 2013-Sep-20 09:11:38 4171699.79749 872122.58613 4730014.21584 11.80802 48.17149 536.97899 0.73046 -1.16398 12.38834 2.54343 -4.76004 3.39280 7 3 4 2.38 2013-Sep-20 09:11:38 4171699.66989 872122.71737 4730015.47941 11.80802 48.17150 537.85515 0.88504 -0.24824 13.26449 2.69800 -3.84431 4.26896 7 3 4 2.38 2013-Sep-20 09:11:38 4171697.21377 872123.15776 4730014.82130 11.80803 48.17151 535.82153 1.81871 1.03715 11.23087 3.63167 -2.55892 2.23534 7 3 4 2.38 2013-Sep-20 09:11:38 4171699.69550 872122.49414 4730015.72594 11.80801 48.17150 538.02510 0.66129 -0.06847 13.43445 2.47426 -3.66453 4.43891 7 3 4 2.38 2013-Sep-20 09:11:38 4171697.25407 872120.78000 4730013.58386 11.80800 48.17150 534.60127 -0.51698 0.54507 10.01062 1.29598 -3.05099 1.01508 7 3 4 2.38 2013-Sep-20 09:11:38 4171698.16324 872120.67313 4730016.30488 11.80799 48.17151 537.20774 -0.80763 1.71289 12.61709 1.00533 -1.88317 3.62155 7 3 4 2.38 2013-Sep-20 09:11:38 4171697.97309 872120.26700 4730015.56609 11.80799 48.17151 536.47768 -1.16626 1.42081 11.88703 0.64670 -2.17525 2.89149 7 3 4 2.38 2013-Sep-20 09:11:38 4171698.82470 872120.58311 4730015.21194 11.80799 48.17150 536.81285 -1.03111 0.51528 12.22219 0.78185 -3.08078 3.22666 7 3 4 2.38 2013-Sep-20 09:11:38 4171694.43013 872119.04176 4730011.61351 11.80798 48.17151 531.05241 -1.64056 1.55579 6.46176 0.17240 -2.04027 -2.53378 7 3 4 2.38 2013-Sep-20 09:11:38 4171695.84638 872119.56749 4730012.40505 11.80799 48.17151 532.63849 -1.41578 0.97053 8.04783 0.39718 -2.62553 -0.94770 7 3 4 2.38 2013-Sep-20 09:11:38 4171697.41641 872119.98976 4730016.13799 11.80799 48.17152 536.50260 -1.32372 2.25051 11.91194 0.48924 -1.34555 2.91641 7 3 4 2.38 2013-Sep-20 09:11:38 4171699.76849 872120.99660 4730019.67286 11.80799 48.17152 540.80940 -0.81950 2.73886 16.21875 0.99346 -0.85720 7.22322 7 3 4 2.38 2013-Sep-20 09:11:38 4171694.59151 872118.85066 4730013.62077 11.80798 48.17152 532.62738 -1.86064 2.80588 8.03673 -0.04768 -0.79018 -0.95880 7 3 4 2.38 2013-Sep-20 09:11:38 4171694.13454 872119.45492 4730012.78140 11.80799 48.17152 531.78609 -1.17566 2.48726 7.19543 0.63730 -1.10880 -1.80010 7 3 4 2.38 2013-Sep-20 09:11:38 4171696.24993 872121.46734 4730014.67759 11.80801 48.17151 534.85456 0.36130 1.90207 10.26391 2.17426 -1.69400 1.26837 7 3 4 2.38 2013-Sep-20 09:11:38 4171699.76420 872121.32297 4730017.51433 11.80800 48.17151 539.24273 -0.49915 1.25269 14.65208 1.31381 -2.34337 5.65654 7 3 4 2.38 2013-Sep-20 09:11:38 4171698.01040 872122.58019 4730017.73545 11.80802 48.17152 538.43420 1.09035 2.48763 13.84354 2.90331 -1.10843 4.84801 7 3 4 2.38 2013-Sep-20 09:11:38 4171697.67112 872121.11745 4730014.13566 11.80800 48.17150 535.33073 -0.27201 0.55742 10.74008 1.54095 -3.03864 1.74454 7 3 4 2.38 2013-Sep-20 09:11:39 4171693.79715 872119.40079 4730011.39850 11.80799 48.17151 530.52799 -1.15961 1.81934 5.93734 0.65335 -1.77672 -3.05820 7 3 4 2.38 2013-Sep-20 09:11:39 4171692.08147 872118.93678 4730010.56863 11.80799 48.17152 528.72632 -1.26271 2.58803 4.13566 0.55024 -1.00803 -4.85987 7 3 4 2.38 2013-Sep-20 09:11:39 4171690.16639 872119.31617 4730010.17264 11.80800 48.17153 527.23288 -0.49946 3.66290 2.64223 1.31350 0.06685 -6.35331 7 3 4 2.38 2013-Sep-20 09:11:39 4171692.21881 872119.84399 4730011.10044 11.80800 48.17152 529.33606 -0.40281 2.70419 4.74540 1.41015 -0.89187 -4.25013 7 3 4 2.38 2013-Sep-20 09:11:39 4171691.87990 872117.85327 4730010.63123 11.80797 48.17152 528.49351 -2.28204 2.94201 3.90285 -0.46909 -0.65405 -5.09268 7 3 4 2.38 2013-Sep-20 09:11:39 4171696.55132 872119.18229 4730014.96199 11.80798 48.17152 534.95139 -1.93707 2.22034 10.36073 -0.12411 -1.37572 1.36520 7 3 4 2.38 2013-Sep-20 09:11:39 4171695.05237 872118.76362 4730013.87209 11.80798 48.17152 533.10361 -2.04015 2.65062 8.51296 -0.22719 -0.94545 -0.48258 7 3 4 2.38 2013-Sep-20 09:11:39 4171695.87467 872119.95571 4730014.95823 11.80799 48.17152 534.61243 -1.04156 2.59343 10.02177 0.77140 -1.00263 1.02624 7 3 4 2.38 2013-Sep-20 09:11:39 4171694.16429 872117.99137 4730012.43457 11.80797 48.17152 531.34734 -2.61433 2.45743 6.75668 -0.80137 -1.13863 -2.23885 7 3 4 2.38 2013-Sep-20 09:11:39 4171695.76512 872119.78539 4730014.68413 11.80799 48.17152 534.31342 -1.18585 2.51651 9.72277 0.62711 -1.07955 0.72724 7 3 4 2.38 2013-Sep-20 09:11:39 4171696.20366 872119.20794 4730013.69935 11.80798 48.17151 533.78709 -1.84083 1.62794 9.19644 -0.02787 -1.96813 0.20090 7 3 4 2.38 2013-Sep-20 09:11:39 4171698.78340 872120.28432 4730018.09366 11.80799 48.17152 538.89241 -1.31512 2.51279 14.30176 0.49784 -1.08328 5.30622 7 3 4 2.38 2013-Sep-20 09:11:39 4171693.86027 872118.25440 4730012.53331 11.80797 48.17152 531.25835 -2.29466 2.70491 6.66769 -0.48170 -0.89115 -2.32784 7 3 4 2.38 2013-Sep-20 09:11:39 4171694.06245 872118.48650 4730013.59975 11.80798 48.17153 532.21666 -2.10883 3.23327 7.62600 -0.29587 -0.36279 -1.36953 7 3 4 2.38 2013-Sep-20 09:11:39 4171695.31115 872119.04283 4730015.42568 11.80798 48.17153 534.46830 -1.81980 3.45539 9.87764 -0.00684 -0.14067 0.88211 7 3 4 2.38 2013-Sep-20 09:11:39 4171693.04180 872118.02664 4730012.21014 11.80797 48.17153 530.45217 -2.35010 3.12109 5.86151 -0.53714 -0.47497 -3.13402 7 3 4 2.38 2013-Sep-20 09:11:39 4171692.17508 872118.54262 4730012.68151 11.80798 48.17153 530.30803 -1.66769 3.98894 5.71738 0.14527 0.39288 -3.27816 7 3 4 2.38 2013-Sep-20 09:11:39 4171694.61132 872119.91889 4730015.43289 11.80799 48.17153 534.13639 -0.81908 3.83706 9.54573 0.99388 0.24100 0.55020 7 3 4 2.38 2013-Sep-20 09:11:39 4171696.15203 872119.93442 4730016.20250 11.80799 48.17153 535.71774 -1.11915 3.22418 11.12709 0.69381 -0.37188 2.13155 7 3 4 2.38 2013-Sep-20 09:11:39 4171695.44371 872117.84380 4730014.88587 11.80797 48.17153 533.98897 -3.02059 3.18153 9.39831 -1.20763 -0.41453 0.40278 7 3 4 2.38 2013-Sep-20 09:11:39 4171696.30208 872118.95604 4730014.86039 11.80798 48.17152 534.68210 -2.10753 2.36886 10.09145 -0.29457 -1.22720 1.09592 7 3 4 2.38 2013-Sep-20 09:11:39 4171698.60622 872120.97748 4730017.56997 11.80800 48.17152 538.48111 -0.60038 2.18708 13.89046 1.21259 -1.40898 4.89493 7 3 4 2.38 2013-Sep-20 09:11:39 4171697.45801 872118.92845 4730016.51467 11.80797 48.17152 536.66559 -2.37108 2.63321 12.07494 -0.55812 -0.96286 3.07941 7 3 4 2.38 2013-Sep-20 09:11:39 4171695.72625 872119.64693 4730013.85104 11.80799 48.17152 533.64838 -1.31343 2.01038 9.05773 0.49953 -1.58568 0.06219 7 3 4 2.38 2013-Sep-20 09:11:39 4171696.32005 872120.51919 4730013.86689 11.80800 48.17151 534.16686 -0.58114 1.45484 9.57620 1.23182 -2.14122 0.58067 7 3 4 2.38 2013-Sep-20 09:11:40 4171695.33687 872118.75088 4730013.43363 11.80798 48.17152 532.96088 -2.11084 2.15264 8.37023 -0.29788 -1.44342 -0.62531 7 3 4 2.38 2013-Sep-20 09:11:40 4171694.68260 872118.20552 4730014.53494 11.80797 48.17153 533.27999 -2.51078 3.44747 8.68934 -0.69782 -0.14859 -0.30620 7 3 4 2.38 2013-Sep-20 09:11:40 4171694.06620 872117.71535 4730014.07924 11.80797 48.17153 532.47115 -2.86444 3.66789 7.88050 -1.05148 0.07183 -1.11503 7 3 4 2.38 2013-Sep-20 09:11:40 4171694.39674 872117.51677 4730014.24135 11.80796 48.17153 532.78062 -3.12645 3.56520 8.18997 -1.31350 -0.03086 -0.80557 7 3 4 2.38 2013-Sep-20 09:11:40 4171694.80846 872118.27311 4730015.16754 11.80797 48.17153 533.84276 -2.47036 3.76725 9.25210 -0.65740 0.17119 0.25657 7 3 4 2.38 2013-Sep-20 09:11:40 4171693.79398 872118.40667 4730015.70730 11.80798 48.17154 533.60094 -2.13204 4.84680 9.01028 -0.31908 1.25073 0.01475 7 3 4 2.38 2013-Sep-20 09:11:40 4171691.52330 872117.94043 4730013.40438 11.80798 48.17154 530.33902 -2.12376 5.03824 5.74836 -0.31080 1.44218 -3.24717 7 3 4 2.38 2013-Sep-20 09:11:40 4171687.46651 872116.76168 4730010.21652 11.80797 48.17155 525.15451 -2.44741 6.05091 0.56385 -0.63445 2.45486 -8.43168 7 3 4 2.38 2013-Sep-20 09:11:40 4171688.87934 872117.39717 4730010.33489 11.80798 48.17154 526.25172 -2.11448 5.00247 1.66106 -0.30152 1.40641 -7.33447 7 3 4 2.38 2013-Sep-20 09:11:40 4171691.57456 872117.85122 4730012.30358 11.80798 48.17154 529.54006 -2.22157 4.28033 4.94940 -0.40861 0.68427 -4.04613 7 3 4 2.38 2013-Sep-20 09:11:40 4171692.99793 872119.69936 4730013.52572 11.80800 48.17153 531.63210 -0.70381 3.77540 7.04145 1.10915 0.17934 -1.95409 7 3 4 2.38 2013-Sep-20 09:11:40 4171695.73595 872119.86307 4730015.18328 11.80799 48.17152 534.67692 -1.10385 2.85882 10.08627 0.70911 -0.73724 1.09073 7 3 4 2.38 2013-Sep-20 09:11:40 4171697.73933 872120.51530 4730018.24373 11.80799 48.17153 538.35420 -0.87538 3.33917 13.76355 0.93758 -0.25689 4.76801 7 3 4 2.38 2013-Sep-20 09:11:40 4171698.66937 872121.08516 4730017.61373 11.80800 48.17152 538.56965 -0.50790 2.15379 13.97899 1.30507 -1.44228 4.98346 7 3 4 2.38 2013-Sep-20 09:11:40 4171699.90232 872120.94129 4730018.61923 11.80799 48.17152 540.10411 -0.90102 1.94701 15.51346 0.91194 -1.64906 6.51792 7 3 4 2.38 2013-Sep-20 09:11:40 4171695.14191 872119.32307 4730013.24628 11.80799 48.17152 532.77210 -1.51086 2.08265 8.18145 0.30210 -1.51341 -0.81409 7 3 4 2.38 2013-Sep-20 09:11:40 4171693.83963 872117.89918 4730011.28914 11.80797 48.17152 530.26931 -2.63813 1.94439 5.67866 -0.82517 -1.65167 -3.31688 7 3 4 2.38 2013-Sep-20 09:11:40 4171693.45120 872117.75738 4730012.00099 11.80797 48.17152 530.52683 -2.69744 2.72405 5.93617 -0.88449 -0.87201 -3.05936 7 3 4 2.38 2013-Sep-20 09:11:40 4171696.17673 872119.11094 4730016.47948 11.80798 48.17153 535.82787 -1.93026 3.51645 11.23721 -0.11730 -0.07961 2.24168 7 3 4 2.38 2013-Sep-20 09:11:40 4171694.28757 872118.42380 4730013.85877 11.80798 48.17153 532.54806 -2.21628 3.25137 7.95741 -0.40332 -0.34469 -1.03812 7 3 4 2.38 2013-Sep-20 09:11:40 4171694.33180 872119.00660 4730017.03950 11.80798 48.17154 535.02657 -1.65486 5.25149 10.43592 0.15810 1.65543 1.44039 7 3 4 2.38 2013-Sep-20 09:11:40 4171696.78354 872119.58199 4730017.33727 11.80798 48.17153 536.92745 -1.59335 3.57409 12.33679 0.21961 -0.02197 3.34126 7 3 4 2.38 2013-Sep-20 09:11:40 4171695.68705 872119.92995 4730014.88622 11.80799 48.17152 534.43277 -1.02838 2.68618 9.84212 0.78458 -0.90989 0.84658 7 3 4 2.38 2013-Sep-20 09:11:40 4171694.22509 872117.83827 4730013.24941 11.80797 48.17152 531.97331 -2.77663 2.97985 7.38266 -0.96367 -0.61622 -1.61287 7 3 4 2.38 2013-Sep-20 09:11:40 4171689.96012 872116.83412 4730008.65859 11.80797 48.17153 525.63132 -2.88678 3.18209 1.04066 -1.07382 -0.41396 -7.95487 7 3 4 2.38 2013-Sep-20 09:11:41 4171691.38027 872116.65118 4730010.70121 11.80796 48.17153 528.05545 -3.35645 3.53639 3.46480 -1.54350 -0.05967 -5.53073 7 3 4 2.38 2013-Sep-20 09:11:41 4171694.48496 872118.35256 4730014.77576 11.80797 48.17153 533.35049 -2.32640 3.72981 8.75983 -0.51344 0.13375 -0.23570 7 3 4 2.38 2013-Sep-20 09:11:41 4171695.15594 872119.22320 4730014.74376 11.80798 48.17153 533.88346 -1.61149 3.08631 9.29281 0.20147 -0.50975 0.29728 7 3 4 2.38 2013-Sep-20 09:11:41 4171694.36281 872118.11227 4730012.24363 11.80797 48.17152 531.35115 -2.53661 2.16685 6.76050 -0.72365 -1.42921 -2.23504 7 3 4 2.38 2013-Sep-20 09:11:41 4171697.55286 872117.95070 4730015.08511 11.80796 48.17151 535.52886 -3.34756 1.75974 10.93820 -1.53459 -1.83632 1.94267 7 3 4 2.38 2013-Sep-20 09:11:41 4171695.39658 872118.61666 4730013.68242 11.80798 48.17152 533.16693 -2.25444 2.29548 8.57627 -0.44148 -1.30059 -0.41926 7 3 4 2.38 2013-Sep-20 09:11:41 4171696.61744 872118.19582 4730016.00506 11.80797 48.17152 535.63716 -2.91620 3.01815 11.04651 -1.10324 -0.57791 2.05097 7 3 4 2.38 2013-Sep-20 09:11:41 4171697.99483 872117.76112 4730017.54330 11.80796 48.17153 537.62320 -3.62356 3.10565 13.03255 -1.81060 -0.49041 4.03701 7 3 4 2.38 2013-Sep-20 09:11:41 4171697.22129 872118.55258 4730015.78005 11.80797 48.17152 535.91237 -2.69055 2.37326 11.32171 -0.87759 -1.22280 2.32618 7 3 4 2.38 2013-Sep-20 09:11:41 4171695.01079 872117.79503 4730017.05893 11.80797 48.17154 535.31895 -2.97973 4.95395 10.72829 -1.16677 1.35788 1.73276 7 3 4 2.38 2013-Sep-20 09:11:41 4171695.93041 872119.29437 4730016.21431 11.80798 48.17153 535.49452 -1.70031 3.49130 10.90386 0.11265 -0.10476 1.90833 7 3 4 2.38 2013-Sep-20 09:11:41 4171695.56906 872119.77451 4730017.03642 11.80799 48.17154 535.93675 -1.15638 4.22991 11.34609 0.65658 0.63385 2.35056 7 3 4 2.38 2013-Sep-20 09:11:41 4171693.12963 872118.09894 4730014.50123 11.80797 48.17154 532.22656 -2.29731 4.57394 7.63590 -0.48435 0.97788 -1.35963 7 3 4 2.38 2013-Sep-20 09:11:41 4171696.52198 872120.82464 4730016.38005 11.80800 48.17152 536.21302 -0.32347 2.93702 11.62237 1.48949 -0.65904 2.62684 7 3 4 2.38 2013-Sep-20 09:11:41 4171691.34314 872119.34149 4730010.42458 11.80800 48.17152 528.19223 -0.71548 2.96876 3.60158 1.09748 -0.62729 -5.39395 7 3 4 2.38 2013-Sep-20 09:11:41 4171690.38503 872117.03700 4730009.77749 11.80797 48.17153 526.77012 -2.77514 3.58744 2.17947 -0.96218 -0.00862 -6.81607 7 3 4 2.38 2013-Sep-20 09:11:41 4171689.38901 872116.05489 4730009.12805 11.80796 48.17153 525.50198 -3.53265 4.03055 0.91132 -1.71970 0.43450 -8.08421 7 3 4 2.38 2013-Sep-20 09:11:41 4171692.10762 872115.88953 4730012.13024 11.80795 48.17153 529.49116 -4.25083 4.07504 4.90050 -2.43787 0.47898 -4.09503 7 3 4 2.38 2013-Sep-20 09:11:41 4171693.73028 872116.71035 4730012.32584 11.80795 48.17152 530.80818 -3.77943 2.89680 6.21752 -1.96647 -0.69926 -2.77801 7 3 4 2.38 2013-Sep-20 09:11:41 4171695.88788 872117.94738 4730015.89837 11.80797 48.17153 535.04751 -3.01009 3.51701 10.45686 -1.19713 -0.07906 1.46132 7 3 4 2.38 2013-Sep-20 09:11:41 4171696.59137 872116.51166 4730015.39974 11.80794 48.17152 534.93926 -4.55938 2.89029 10.34860 -2.74642 -0.70578 1.35307 7 3 4 2.38 2013-Sep-20 09:11:41 4171694.75802 872117.46824 4730015.97118 11.80796 48.17154 534.29881 -3.24789 4.46272 9.70816 -1.43493 0.86665 0.71262 7 3 4 2.38 2013-Sep-20 09:11:41 4171695.06116 872118.25049 4730016.81629 11.80797 48.17154 535.23318 -2.54422 4.68594 10.64252 -0.73126 1.08988 1.64699 7 3 4 2.38 2013-Sep-20 09:11:41 4171695.29744 872117.66510 4730016.27334 11.80796 48.17154 534.90296 -3.16558 4.24077 10.31230 -1.35262 0.64471 1.31677 7 3 4 2.38 2013-Sep-20 09:11:41 4171692.03997 872115.19745 4730012.67715 11.80794 48.17154 529.76008 -4.91442 4.59465 5.16942 -3.10146 0.99859 -3.82611 7 3 4 2.38 2013-Sep-20 09:11:42 4171691.69622 872114.23758 4730012.73861 11.80793 48.17154 529.45048 -5.78363 5.03273 4.85982 -3.97067 1.43667 -4.13571 7 3 4 2.38 2013-Sep-20 09:11:42 4171695.00838 872115.54893 4730015.26337 11.80794 48.17153 533.67290 -5.17781 4.10073 9.08224 -3.36485 0.50467 0.08671 7 3 4 2.38 2013-Sep-20 09:11:42 4171699.50719 872122.00144 4730017.06109 11.80801 48.17151 538.82981 0.21755 1.03442 14.23916 2.03051 -2.56164 5.24362 7 3 4 2.38 2013-Sep-20 09:11:42 4171700.05510 872123.05700 4730014.20350 11.80802 48.17148 537.20222 1.13865 -1.43190 12.61157 2.95161 -5.02796 3.61603 7 3 4 2.38 2013-Sep-20 09:11:42 4171702.86397 872123.27704 4730016.61287 11.80802 48.17148 540.86118 0.77925 -1.90735 16.27053 2.59221 -5.50342 7.27499 7 3 4 2.38 2013-Sep-20 09:11:42 4171702.46330 872123.85432 4730016.19581 11.80802 48.17148 540.36764 1.42631 -1.98128 15.77699 3.23927 -5.57735 6.78145 7 3 4 2.38 2013-Sep-20 09:11:42 4171702.92321 872124.25454 4730017.67412 11.80803 48.17149 541.82404 1.72394 -1.39186 17.23339 3.53691 -4.98793 8.23785 7 3 4 2.38 2013-Sep-20 09:11:42 4171698.55279 872121.74361 4730012.80693 11.80801 48.17149 535.00164 0.16048 -1.06726 10.41099 1.97344 -4.66332 1.41545 7 3 4 2.38 2013-Sep-20 09:11:42 4171698.56858 872122.85636 4730014.22743 11.80802 48.17149 536.22229 1.24645 -0.30111 11.63163 3.05941 -3.89718 2.63610 7 3 4 2.38 2013-Sep-20 09:11:42 4171698.63660 872122.01350 4730013.73672 11.80801 48.17149 535.78601 0.40750 -0.54946 11.19536 2.22047 -4.14552 2.19982 7 3 4 2.38 2013-Sep-20 09:11:42 4171695.47402 872120.96570 4730010.91597 11.80801 48.17150 531.47665 0.02905 0.03585 6.88600 1.84201 -3.56021 -2.10954 7 3 4 2.38 2013-Sep-20 09:11:42 4171699.36836 872123.58556 4730014.99974 11.80803 48.17149 537.41937 1.79656 -0.48059 12.82872 3.60952 -4.07665 3.83318 7 3 4 2.38 2013-Sep-20 09:11:42 4171697.58076 872122.67576 4730013.87027 11.80802 48.17150 535.28666 1.27181 0.20873 10.69601 3.08478 -3.38733 1.70047 7 3 4 2.38 2013-Sep-20 09:11:42 4171696.03990 872120.80185 4730012.23244 11.80800 48.17150 532.80465 -0.24713 0.52606 8.21399 1.56583 -3.07000 -0.78154 7 3 4 2.38 2013-Sep-20 09:11:42 4171694.05788 872120.73886 4730009.97158 11.80801 48.17150 529.81754 0.09680 0.47353 5.22689 1.90976 -3.12253 -3.76865 7 3 4 2.38 2013-Sep-20 09:11:42 4171698.53561 872123.88715 4730014.99414 11.80804 48.17150 536.91274 2.26217 0.07708 12.32209 4.07513 -3.51898 3.32655 7 3 4 2.38 2013-Sep-20 09:11:42 4171695.42063 872120.97375 4730009.95379 11.80801 48.17149 530.72593 0.04785 -0.56811 6.13528 1.86081 -4.16417 -2.86026 7 3 4 2.38 2013-Sep-20 09:11:42 4171698.07027 872120.71496 4730013.70568 11.80800 48.17150 535.21598 -0.74767 0.04091 10.62532 1.06529 -3.55515 1.62979 7 3 4 2.38 2013-Sep-20 09:11:42 4171701.26008 872121.99655 4730019.84528 11.80800 48.17151 542.04805 -0.14594 1.61344 17.45739 1.66703 -1.98263 8.46186 7 3 4 2.38 2013-Sep-20 09:11:42 4171699.49519 872120.46778 4730015.50319 11.80799 48.17150 537.45182 -1.28120 0.23806 12.86117 0.53177 -3.35801 3.86564 7 3 4 2.38 2013-Sep-20 09:11:42 4171697.62291 872119.52208 4730012.74119 11.80798 48.17150 534.04247 -1.82376 -0.09413 9.45181 -0.01080 -3.69019 0.45628 7 3 4 2.38 2013-Sep-20 09:11:42 4171694.62236 872117.78011 4730012.59924 11.80797 48.17152 531.74024 -2.91485 2.26535 7.14958 -1.10190 -1.33071 -1.84595 7 3 4 2.38 2013-Sep-20 09:11:42 4171693.65536 872120.88448 4730012.01297 11.80801 48.17152 531.09578 0.32171 2.10632 6.50513 2.13467 -1.48974 -2.49041 7 3 4 2.38 2013-Sep-20 09:11:42 4171698.21532 872121.54179 4730013.42874 11.80801 48.17149 535.21714 0.03199 -0.37566 10.62649 1.84495 -3.97172 1.63095 7 3 4 2.38 2013-Sep-20 09:11:42 4171697.70221 872121.88561 4730014.48438 11.80801 48.17150 535.71571 0.47353 0.65018 11.12506 2.28649 -2.94588 2.12952 7 3 4 2.38 2013-Sep-20 09:11:43 4171698.97632 872123.21397 4730017.21291 11.80803 48.17151 538.76187 1.51305 1.33799 14.17122 3.32602 -2.25808 5.17568 7 3 4 2.38 2013-Sep-20 09:11:43 4171696.85572 872122.71205 4730013.22186 11.80803 48.17150 534.33515 1.45570 0.29960 9.74450 3.26866 -3.29646 0.74896 7 3 4 2.38 2013-Sep-20 09:11:43 4171696.42934 872121.11511 4730013.79256 11.80801 48.17151 534.26414 -0.02019 1.23469 9.67348 1.79277 -2.36137 0.67795 7 3 4 2.38 2013-Sep-20 09:11:43 4171698.56946 872121.85359 4730017.01072 11.80801 48.17151 538.15996 0.26472 1.70734 13.56931 2.07768 -1.88873 4.57377 7 3 4 2.38 2013-Sep-20 09:11:43 4171696.55399 872121.21738 4730013.93058 11.80801 48.17151 534.46232 0.05440 1.22023 9.87166 1.86736 -2.37584 0.87613 7 3 4 2.38 2013-Sep-20 09:11:43 4171696.31907 872121.98156 4730013.79148 11.80802 48.17151 534.30960 0.85049 1.18228 9.71894 2.66345 -2.41378 0.72341 7 3 4 2.38 2013-Sep-20 09:11:43 4171696.80005 872123.09704 4730014.63144 11.80803 48.17151 535.40169 1.84394 1.22155 10.81104 3.65690 -2.37451 1.81550 7 3 4 2.38 2013-Sep-20 09:11:43 4171693.03799 872122.24869 4730010.30908 11.80803 48.17151 529.60930 1.78338 1.21226 5.01864 3.59634 -2.38380 -3.97689 7 3 4 2.38 2013-Sep-20 09:11:43 4171693.81796 872120.83701 4730010.44067 11.80801 48.17151 530.02385 0.24197 0.94639 5.43320 2.05493 -2.64967 -3.56233 7 3 4 2.38 2013-Sep-20 09:11:43 4171694.21596 872120.72049 4730010.56374 11.80801 48.17150 530.35948 0.04647 0.75594 5.76882 1.85943 -2.84012 -3.22671 7 3 4 2.38 2013-Sep-20 09:11:43 4171692.16679 872119.68621 4730009.92033 11.80800 48.17152 528.40121 -0.54660 1.97917 3.81056 1.26636 -1.61689 -5.18498 7 3 4 2.38 2013-Sep-20 09:11:43 4171692.27281 872120.21499 4730009.08908 11.80800 48.17151 527.92318 -0.05070 1.26685 3.33253 1.76226 -2.32921 -5.66301 7 3 4 2.38 2013-Sep-20 09:11:43 4171695.36635 872121.38607 4730012.84612 11.80801 48.17151 532.90197 0.46255 1.33751 8.31132 2.27551 -2.25855 -0.68422 7 3 4 2.38 2013-Sep-20 09:11:43 4171696.26085 872123.52719 4730014.68452 11.80804 48.17151 535.14796 2.37532 1.58464 10.55731 4.18828 -2.01142 1.56177 7 3 4 2.38 2013-Sep-20 09:11:43 4171697.76869 872122.52374 4730015.07427 11.80802 48.17151 536.28575 1.08456 0.89779 11.69510 2.89752 -2.69828 2.69956 7 3 4 2.38 2013-Sep-20 09:11:43 4171700.38135 872122.61149 4730017.36812 11.80801 48.17150 539.71249 0.63581 0.50857 15.12184 2.44878 -3.08749 6.12630 7 3 4 2.38 2013-Sep-20 09:11:43 4171698.41908 872121.91985 4730015.78451 11.80801 48.17151 537.15713 0.36035 0.98915 12.56648 2.17331 -2.60691 3.57094 7 3 4 2.38 2013-Sep-20 09:11:43 4171697.57350 872121.72657 4730015.50262 11.80801 48.17151 536.36872 0.34419 1.44738 11.77806 2.15715 -2.14869 2.78253 7 3 4 2.38 2013-Sep-20 09:11:43 4171697.19139 872121.37009 4730014.50789 11.80801 48.17151 535.32942 0.07345 1.11704 10.73876 1.88641 -2.47902 1.74323 7 3 4 2.38 2013-Sep-20 09:11:43 4171696.55256 872120.62970 4730012.92228 11.80800 48.17150 533.62984 -0.52055 0.63844 9.03919 1.29241 -2.95762 0.04366 7 3 4 2.38 2013-Sep-20 09:11:43 4171696.00737 872121.68610 4730013.47920 11.80801 48.17151 533.83310 0.62506 1.24642 9.24245 2.43802 -2.34964 0.24691 7 3 4 2.38 2013-Sep-20 09:11:43 4171698.02769 872122.71453 4730016.32578 11.80802 48.17151 537.41342 1.21831 1.51442 12.82276 3.03127 -2.08164 3.82723 7 3 4 2.38 2013-Sep-20 09:11:43 4171695.51216 872121.87054 4730013.65028 11.80802 48.17151 533.66248 0.90693 1.69358 9.07183 2.71989 -1.90248 0.07630 7 3 4 2.38 2013-Sep-20 09:11:43 4171694.11996 872121.87562 4730013.28058 11.80802 48.17152 532.47889 1.19679 2.46169 7.88823 3.00975 -1.13437 -1.10730 7 3 4 2.38 2013-Sep-20 09:11:43 4171696.32565 872122.41884 4730016.65483 11.80802 48.17152 536.50717 1.27716 3.02038 11.91652 3.09012 -0.57568 2.92098 7 3 4 2.38 2013-Sep-20 09:11:44 4171701.72617 872123.74264 4730020.76439 11.80803 48.17151 543.27546 1.46783 1.62019 18.68481 3.28079 -1.97587 9.68927 7 3 4 2.38 2013-Sep-20 09:11:44 4171699.69382 872123.25741 4730017.85349 11.80802 48.17151 539.71350 1.40876 1.23524 15.12284 3.22172 -2.36082 6.12731 7 3 4 2.38 2013-Sep-20 09:11:44 4171699.96868 872123.80145 4730018.80916 11.80803 48.17151 540.67928 1.88503 1.58915 16.08862 3.69800 -2.00692 7.09309 7 3 4 2.38 2013-Sep-20 09:11:44 4171698.46443 872122.88125 4730017.60887 11.80802 48.17152 538.67736 1.29212 2.02615 14.08670 3.10509 -1.56992 5.09117 7 3 4 2.38 2013-Sep-20 09:11:44 4171699.82504 872121.57159 4730018.33994 11.80800 48.17151 539.93157 -0.26825 1.72100 15.34092 1.54471 -1.87506 6.34538 7 3 4 2.38 2013-Sep-20 09:11:44 4171700.84983 872122.18664 4730018.04104 11.80801 48.17150 540.46176 0.12408 0.68043 15.87110 1.93704 -2.91564 6.87557 7 3 4 2.38 2013-Sep-20 09:11:44 4171700.02603 872122.20930 4730017.32739 11.80801 48.17150 539.39531 0.31484 0.80189 14.80465 2.12780 -2.79417 5.80912 7 3 4 2.38 2013-Sep-20 09:11:44 4171700.88321 872123.24985 4730018.35492 11.80802 48.17150 540.86252 1.15796 0.70329 16.27187 2.97093 -2.89277 7.27633 7 3 4 2.38 2013-Sep-20 09:11:44 4171699.83229 872121.74728 4730019.16219 11.80800 48.17152 540.57298 -0.09775 2.23729 15.98232 1.71521 -1.35877 6.98679 7 3 4 2.38 2013-Sep-20 09:11:44 4171700.22968 872121.74100 4730019.46993 11.80800 48.17152 541.06084 -0.18523 2.15363 16.47019 1.62774 -1.44243 7.47465 7 3 4 2.38 2013-Sep-20 09:11:44 4171697.28353 872121.38206 4730016.80158 11.80801 48.17152 537.10033 0.06631 2.57768 12.50967 1.87927 -1.01838 3.51414 7 3 4 2.38 2013-Sep-20 09:11:44 4171696.66765 872122.03823 4730016.49416 11.80802 48.17152 536.55877 0.83462 2.72182 11.96811 2.64758 -0.87424 2.97258 7 3 4 2.38 2013-Sep-20 09:11:44 4171693.19642 872120.51544 4730014.10717 11.80801 48.17153 532.30631 0.05439 3.89396 7.71565 1.86734 0.29790 -1.27988 7 3 4 2.38 2013-Sep-20 09:11:44 4171692.61581 872119.70169 4730012.42552 11.80800 48.17153 530.56317 -0.62333 3.32002 5.97252 1.18963 -0.27604 -3.02302 7 3 4 2.38 2013-Sep-20 09:11:44 4171697.69682 872121.49580 4730017.11493 11.80801 48.17152 537.61914 0.09307 2.46787 13.02848 1.90603 -1.12819 4.03295 7 3 4 2.38 2013-Sep-20 09:11:44 4171698.44362 872120.94650 4730015.41258 11.80800 48.17151 536.76318 -0.59743 0.87163 12.17253 1.21553 -2.72444 3.17700 7 3 4 2.38 2013-Sep-20 09:11:44 4171697.33366 872119.76933 4730013.73028 11.80799 48.17150 534.62440 -1.52255 0.73877 10.03375 0.29041 -2.85729 1.03821 7 3 4 2.38 2013-Sep-20 09:11:44 4171694.84682 872118.06826 4730012.21083 11.80797 48.17151 531.63666 -2.67873 1.79867 7.04600 -0.86578 -1.79739 -1.94953 7 3 4 2.38 2013-Sep-20 09:11:44 4171698.92932 872121.20174 4730017.61631 11.80800 48.17152 538.75717 -0.44698 1.94812 14.16651 1.36598 -1.64794 5.17098 7 3 4 2.38 2013-Sep-20 09:11:44 4171697.31480 872120.42952 4730013.96343 11.80799 48.17150 534.87592 -0.87247 0.80734 10.28527 0.94049 -2.78872 1.28973 7 3 4 2.38 2013-Sep-20 09:11:44 4171695.54700 872119.09827 4730011.73559 11.80798 48.17151 531.88018 -1.81379 0.81398 7.28952 -0.00083 -2.78208 -1.70601 7 3 4 2.38 2013-Sep-20 09:11:44 4171695.92415 872119.30021 4730011.71264 11.80798 48.17150 532.13684 -1.69331 0.49279 7.54618 0.11965 -3.10327 -1.44935 7 3 4 2.38 2013-Sep-20 09:11:44 4171696.75421 872120.61532 4730012.83664 11.80800 48.17150 533.69571 -0.57588 0.43644 9.10506 1.23708 -3.15962 0.10952 7 3 4 2.38 2013-Sep-20 09:11:44 4171697.18058 872119.80199 4730015.06296 11.80799 48.17151 535.52198 -1.45926 1.73421 10.93132 0.35370 -1.86185 1.93579 7 3 4 2.38 2013-Sep-20 09:11:44 4171695.47432 872118.56029 4730015.20119 11.80797 48.17153 534.34169 -2.32552 3.26025 9.75103 -0.51256 -0.33582 0.75550 7 3 4 2.38 2013-Sep-20 09:11:45 4171696.92106 872118.97485 4730014.38560 11.80798 48.17151 534.73494 -2.21579 1.59789 10.14429 -0.40283 -1.99818 1.14876 7 3 4 2.38 2013-Sep-20 09:11:45 4171700.65103 872119.72245 4730018.41479 11.80798 48.17151 540.27419 -2.24728 1.45042 15.68353 -0.43432 -2.14564 6.68800 7 3 4 2.38 2013-Sep-20 09:11:45 4171699.00412 872118.91495 4730015.80963 11.80797 48.17151 537.14768 -2.70068 1.03738 12.55703 -0.88772 -2.55868 3.56149 7 3 4 2.38 2013-Sep-20 09:11:45 4171695.14395 872117.65192 4730012.45209 11.80796 48.17151 531.95358 -3.14707 1.80633 7.36292 -1.33411 -1.78973 -1.63261 7 3 4 2.38 2013-Sep-20 09:11:45 4171695.72429 872117.61892 4730013.84708 11.80796 48.17152 533.36738 -3.29812 2.31840 8.77673 -1.48516 -1.27766 -0.21880 7 3 4 2.38 2013-Sep-20 09:11:45 4171692.99613 872116.43126 4730011.66933 11.80795 48.17152 529.80166 -3.90238 3.03700 5.21100 -2.08942 -0.55906 -3.78453 7 3 4 2.38 2013-Sep-20 09:11:45 4171693.67503 872117.79312 4730014.50836 11.80797 48.17154 532.54617 -2.70826 4.22753 7.95551 -0.89530 0.63147 -1.04002 7 3 4 2.38 2013-Sep-20 09:11:45 4171692.48662 872117.98010 4730012.96774 11.80797 48.17153 530.64792 -2.28205 4.03837 6.05726 -0.46909 0.44231 -2.93827 7 3 4 2.38 2013-Sep-20 09:11:45 4171692.44667 872118.05416 4730014.36462 11.80798 48.17154 531.67283 -2.20138 4.98780 7.08218 -0.38843 1.39174 -1.91336 7 3 4 2.38 2013-Sep-20 09:11:45 4171695.24201 872118.44845 4730017.21097 11.80797 48.17154 535.67235 -2.38746 4.78706 11.08169 -0.57450 1.19100 2.08616 7 3 4 2.38 2013-Sep-20 09:11:45 4171696.04418 872118.28056 4730016.91440 11.80797 48.17153 535.95210 -2.71594 4.02979 11.36144 -0.90298 0.43373 2.36591 7 3 4 2.38 2013-Sep-20 09:11:45 4171694.47708 872119.30626 4730017.63950 11.80799 48.17155 535.60940 -1.39127 5.49997 11.01874 0.42169 1.90391 2.02321 7 3 4 2.38 2013-Sep-20 09:11:45 4171696.35878 872116.78607 4730016.71307 11.80795 48.17153 535.80350 -4.24319 3.89395 11.21284 -2.43023 0.29789 2.21731 7 3 4 2.38 2013-Sep-20 09:11:45 4171693.48997 872116.69908 4730015.98826 11.80796 48.17155 533.37880 -3.74129 5.51627 8.78814 -1.92833 1.92021 -0.20739 7 3 4 2.38 2013-Sep-20 09:11:45 4171693.77693 872115.78824 4730015.74331 11.80794 48.17155 533.25930 -4.69157 5.28251 8.66865 -2.87861 1.68644 -0.32688 7 3 4 2.38 2013-Sep-20 09:11:45 4171695.04067 872115.25115 4730016.09580 11.80793 48.17154 534.27362 -5.47590 4.67773 9.68296 -3.66294 1.08167 0.68743 7 3 4 2.38 2013-Sep-20 09:11:45 4171695.11661 872115.64506 4730016.33873 11.80794 48.17154 534.55797 -5.10586 4.72429 9.96731 -3.29290 1.12823 0.97178 7 3 4 2.38 2013-Sep-20 09:11:45 4171693.90853 872116.71688 4730015.53304 11.80795 48.17154 533.31527 -3.80951 4.90469 8.72461 -1.99655 1.30862 -0.27092 7 3 4 2.38 2013-Sep-20 09:11:45 4171689.58510 872114.57640 4730009.33773 11.80794 48.17154 525.58446 -5.01998 4.25280 0.99380 -3.20702 0.65674 -8.00173 7 3 4 2.38 2013-Sep-20 09:11:45 4171693.83445 872116.27714 4730013.86054 11.80795 48.17153 531.96063 -4.22478 3.91037 7.36998 -2.41182 0.31431 -1.62555 7 3 4 2.38 2013-Sep-20 09:11:45 4171693.08298 872116.17766 4730014.45916 11.80795 48.17154 531.90257 -4.16838 4.87286 7.31191 -2.35543 1.27680 -1.68362 7 3 4 2.38 2013-Sep-20 09:11:45 4171699.66080 872119.51994 4730019.51757 11.80798 48.17152 540.42188 -2.24287 2.93900 15.83122 -0.42991 -0.65707 6.83569 7 3 4 2.38 2013-Sep-20 09:11:45 4171694.41608 872117.01813 4730015.70995 11.80796 48.17154 533.81952 -3.61850 4.60654 9.22886 -1.80554 1.01048 0.23333 7 3 4 2.38 2013-Sep-20 09:11:45 4171693.77605 872114.30763 4730015.24612 11.80792 48.17154 532.68620 -6.14067 5.17733 8.09554 -4.32771 1.58127 -0.89999 7 3 4 2.38 2013-Sep-20 09:11:45 4171697.20011 872117.04643 4730020.44194 11.80795 48.17155 539.16679 -4.16050 5.72740 14.57613 -2.34754 2.13133 5.58060 7 3 4 2.38 2013-Sep-20 09:11:46 4171697.12070 872116.79851 4730020.87803 11.80795 48.17155 539.40607 -4.38692 6.11395 14.81541 -2.57396 2.51788 5.81988 7 3 4 2.38 2013-Sep-20 09:11:46 4171694.73166 872116.52792 4730018.25628 11.80795 48.17155 535.85601 -4.16292 6.14927 11.26535 -2.34996 2.55320 2.26982 7 3 4 2.38 2013-Sep-20 09:11:46 4171690.49338 872113.93585 4730014.10998 11.80793 48.17156 529.64597 -5.83284 6.87063 5.05531 -4.01988 3.27457 -3.94022 7 3 4 2.38 2013-Sep-20 09:11:46 4171690.57820 872114.69383 4730015.26692 11.80794 48.17156 530.66687 -5.10826 7.46475 6.07621 -3.29530 3.86869 -2.91932 7 3 4 2.38 2013-Sep-20 09:11:46 4171690.23836 872115.37738 4730013.71589 11.80795 48.17156 529.38257 -4.36963 6.57401 4.79191 -2.55667 2.97795 -4.20362 7 3 4 2.38 2013-Sep-20 09:11:46 4171692.10423 872115.81241 4730015.94300 11.80795 48.17156 532.31948 -4.32562 6.63202 7.72882 -2.51266 3.03596 -1.26671 7 3 4 2.38 2013-Sep-20 09:11:46 4171695.46646 872116.88487 4730018.42845 11.80795 48.17155 536.51269 -3.96388 5.67372 11.92203 -2.15092 2.07765 2.92650 7 3 4 2.38 2013-Sep-20 09:11:46 4171697.54324 872117.66769 4730020.00643 11.80796 48.17154 539.15105 -3.62260 5.09196 14.56039 -1.80964 1.49589 5.56486 7 3 4 2.38 2013-Sep-20 09:11:46 4171695.03344 872117.76110 4730017.28683 11.80797 48.17154 535.49892 -3.01758 5.09458 10.90826 -1.20462 1.49852 1.91273 7 3 4 2.38 2013-Sep-20 09:11:46 4171689.54412 872116.02111 4730011.78724 11.80796 48.17155 527.58010 -3.59746 5.69599 2.98944 -1.78450 2.09993 -6.00609 7 3 4 2.38 2013-Sep-20 09:11:46 4171689.48613 872115.32541 4730010.69518 11.80795 48.17154 526.63356 -4.26656 5.11606 2.04291 -2.45361 1.52000 -6.95263 7 3 4 2.38 2013-Sep-20 09:11:46 4171693.23548 872117.08600 4730014.57851 11.80796 48.17154 532.21501 -3.31048 4.70273 7.62435 -1.49752 1.10667 -1.37118 7 3 4 2.38 2013-Sep-20 09:11:46 4171691.70133 872117.74483 4730013.08448 11.80797 48.17154 530.19018 -2.35165 4.72487 5.59952 -0.53869 1.12881 -3.39601 7 3 4 2.38 2013-Sep-20 09:11:46 4171691.47294 872118.64957 4730012.90322 11.80799 48.17154 530.02949 -1.41931 4.63262 5.43883 0.39364 1.03656 -3.55670 7 3 4 2.38 2013-Sep-20 09:11:46 4171695.69404 872119.79656 4730016.92255 11.80799 48.17153 535.93649 -1.16038 4.05945 11.34583 0.65258 0.46339 2.35030 7 3 4 2.38 2013-Sep-20 09:11:46 4171693.37434 872119.48021 4730016.03558 11.80799 48.17154 533.71813 -0.99534 5.20810 9.12747 0.81762 1.61204 0.13194 7 3 4 2.38 2013-Sep-20 09:11:46 4171689.11622 872116.91119 4730012.31483 11.80797 48.17155 527.81537 -2.63865 6.22423 3.22472 -0.82569 2.62817 -5.77082 7 3 4 2.38 2013-Sep-20 09:11:46 4171691.05673 872116.23852 4730012.20286 11.80796 48.17154 528.90688 -3.69418 4.83675 4.31623 -1.88122 1.24069 -4.67930 7 3 4 2.38 2013-Sep-20 09:11:46 4171687.08951 872113.62082 4730006.48254 11.80793 48.17154 521.69741 -5.44466 4.31460 -2.89324 -3.63170 0.71854 -11.88878 7 3 4 2.38 2013-Sep-20 09:11:46 4171690.26826 872114.92558 4730010.28529 11.80794 48.17154 526.78414 -4.81799 4.33322 2.19348 -3.00503 0.73716 -6.80205 7 3 4 2.38 2013-Sep-20 09:11:46 4171693.27401 872116.30711 4730014.21569 11.80795 48.17154 531.86351 -4.08076 4.55143 7.27285 -2.26781 0.95537 -1.72268 7 3 4 2.38 2013-Sep-20 09:11:46 4171692.45740 872117.10685 4730011.34158 11.80796 48.17153 529.29794 -3.13085 3.10835 4.70729 -1.31789 -0.48771 -4.28824 7 3 4 2.38 2013-Sep-20 09:11:46 4171696.82856 872118.37766 4730015.96814 11.80797 48.17152 535.77228 -2.78141 2.81182 11.18163 -0.96845 -0.78424 2.18610 7 3 4 2.38 2013-Sep-20 09:11:46 4171695.06796 872117.24465 4730014.73665 11.80796 48.17153 533.55072 -3.53016 3.44744 8.96007 -1.71720 -0.14863 -0.03546 7 3 4 2.38 2013-Sep-20 09:11:46 4171693.40375 872117.89376 4730013.65089 11.80797 48.17153 531.74387 -2.55424 3.83820 7.15322 -0.74128 0.24214 -1.84231 7 3 4 2.38 2013-Sep-20 09:11:47 4171690.98939 872116.75487 4730013.46748 11.80796 48.17155 529.87572 -3.17497 5.65052 5.28506 -1.36201 2.05445 -3.71047 7 3 4 2.38 2013-Sep-20 09:11:47 4171693.70057 872118.08841 4730015.47165 11.80797 48.17154 533.32093 -2.42445 4.80629 8.73028 -0.61149 1.21023 -0.26526 7 3 4 2.38 2013-Sep-20 09:11:47 4171694.65632 872118.68334 4730016.61781 11.80798 48.17154 534.88008 -2.03768 4.78286 10.28942 -0.22472 1.18679 1.29389 7 3 4 2.38 2013-Sep-20 09:11:47 4171695.13273 872119.09675 4730017.61723 11.80798 48.17154 535.99221 -1.73051 5.03885 11.40156 0.08245 1.44279 2.40602 7 3 4 2.38 2013-Sep-20 09:11:47 4171695.76351 872119.75086 4730017.44981 11.80799 48.17154 536.36849 -1.21932 4.36739 11.77784 0.59364 0.77132 2.78231 7 3 4 2.38 2013-Sep-20 09:11:47 4171688.74263 872115.93827 4730010.16230 11.80796 48.17154 525.83478 -3.51453 5.20953 1.24412 -1.70158 1.61347 -7.75141 7 3 4 2.38 2013-Sep-20 09:11:47 4171692.87624 872116.89737 4730013.33047 11.80796 48.17154 531.02479 -3.42160 4.16119 6.43414 -1.60864 0.56513 -2.56140 7 3 4 2.38 2013-Sep-20 09:11:47 4171694.70101 872116.03797 4730013.68317 11.80794 48.17153 532.36151 -4.63622 3.19651 7.77086 -2.82326 -0.39955 -1.22467 7 3 4 2.38 2013-Sep-20 09:11:47 4171693.80431 872117.50124 4730014.65832 11.80797 48.17154 532.70248 -3.02043 4.27775 8.11182 -1.20747 0.68169 -0.88371 7 3 4 2.38 2013-Sep-20 09:11:47 4171695.18654 872118.38732 4730016.21216 11.80797 48.17154 534.88354 -2.43594 4.17073 10.29289 -0.62298 0.57466 1.29735 7 3 4 2.38 2013-Sep-20 09:11:47 4171693.64297 872117.00661 4730016.10385 11.80796 48.17155 533.60678 -3.47157 5.43488 9.01612 -1.65861 1.83882 0.02059 7 3 4 2.38 2013-Sep-20 09:11:47 4171697.91174 872119.55583 4730020.38997 11.80798 48.17154 539.93507 -1.84982 4.79106 15.34441 -0.03686 1.19499 6.34888 7 3 4 2.38 2013-Sep-20 09:11:47 4171695.89818 872117.83302 4730017.46794 11.80796 48.17154 536.20819 -3.12414 4.57369 11.61753 -1.31118 0.97762 2.62200 7 3 4 2.38 2013-Sep-20 09:11:47 4171692.66435 872117.87699 4730015.50583 11.80797 48.17155 532.64111 -2.41935 5.61712 8.05046 -0.60639 2.02106 -0.94508 7 3 4 2.38 2013-Sep-20 09:11:47 4171690.61610 872116.25976 4730012.31716 11.80796 48.17154 528.70731 -3.58322 5.23113 4.11665 -1.77027 1.63507 -4.87888 7 3 4 2.38 2013-Sep-20 09:11:47 4171691.78895 872116.15843 4730015.51246 11.80795 48.17156 531.84007 -3.92240 6.52208 7.24941 -2.10945 2.92602 -1.74612 7 3 4 2.38 2013-Sep-20 09:11:47 4171689.92838 872115.73951 4730011.57532 11.80795 48.17155 527.63460 -3.95173 5.31733 3.04394 -2.13877 1.72127 -5.95159 7 3 4 2.38 2013-Sep-20 09:11:47 4171689.76279 872114.81080 4730012.01678 11.80794 48.17155 527.72872 -4.82690 5.87412 3.13806 -3.01395 2.27806 -5.85747 7 3 4 2.38 2013-Sep-20 09:11:47 4171693.97631 872117.04790 4730016.44802 11.80796 48.17155 534.08648 -3.49937 5.41498 9.49582 -1.68641 1.81892 0.50029 7 3 4 2.38 2013-Sep-20 09:11:47 4171693.08580 872117.06716 4730016.84567 11.80796 48.17155 533.80409 -3.29828 6.32675 9.21343 -1.48533 2.73069 0.21790 7 3 4 2.38 2013-Sep-20 09:11:47 4171694.63630 872118.22336 4730017.54640 11.80797 48.17155 535.49617 -2.48384 5.48688 10.90551 -0.67088 1.89082 1.90998 7 3 4 2.38 2013-Sep-20 09:11:47 4171694.59244 872117.66422 4730017.34097 11.80796 48.17155 535.23817 -3.02217 5.46712 10.64751 -1.20921 1.87106 1.65198 7 3 4 2.38 2013-Sep-20 09:11:47 4171692.89093 872116.27044 4730016.17331 11.80795 48.17155 533.06715 -4.03827 6.14197 8.47649 -2.22531 2.54591 -0.51904 7 3 4 2.38 2013-Sep-20 09:11:47 4171689.08251 872116.36285 4730013.17182 11.80796 48.17156 528.35712 -3.16849 6.90395 3.76646 -1.35553 3.30789 -5.22907 7 3 4 2.38 2013-Sep-20 09:11:47 4171689.00221 872116.96672 4730012.74135 11.80797 48.17156 528.06635 -2.56096 6.58336 3.47569 -0.74800 2.98730 -5.51984 7 3 4 2.38 2013-Sep-20 09:11:48 4171690.27934 872118.28668 4730014.53656 11.80799 48.17156 530.41787 -1.53028 6.64781 5.82721 0.28267 3.05175 -3.16832 7 3 4 2.38 2013-Sep-20 09:11:48 4171689.61503 872117.12584 4730012.29829 11.80797 48.17155 528.15796 -2.53062 5.81664 3.56730 -0.71766 2.22058 -5.42823 7 3 4 2.38 2013-Sep-20 09:11:48 4171697.69484 872121.83809 4730013.51198 11.80801 48.17150 534.97984 0.42852 0.01431 10.38918 2.24148 -3.58175 1.39365 7 3 4 2.38 2013-Sep-20 09:11:48 4171699.41323 872123.69735 4730016.94187 11.80803 48.17150 538.91109 1.89680 0.76485 14.32043 3.70976 -2.83121 5.32490 7 3 4 2.38 2013-Sep-20 09:11:48 4171697.23671 872121.16590 4730014.83677 11.80800 48.17151 535.57620 -0.13569 1.33446 10.98554 1.67727 -2.26160 1.99001 7 3 4 2.38 2013-Sep-20 09:11:48 4171696.11857 872121.32280 4730013.75751 11.80801 48.17151 534.06349 0.24669 1.40631 9.47284 2.05965 -2.18975 0.47730 7 3 4 2.38 2013-Sep-20 09:11:48 4171693.93048 872120.74206 4730009.50335 11.80801 48.17150 529.38591 0.12600 0.25369 4.79526 1.93896 -3.34237 -4.20028 7 3 4 2.38 2013-Sep-20 09:11:48 4171691.22392 872118.98947 4730008.27636 11.80799 48.17151 526.46563 -1.03566 1.67674 1.87498 0.77730 -1.91931 -7.12055 7 3 4 2.38 2013-Sep-20 09:11:48 4171692.62390 872118.99280 4730010.34910 11.80799 48.17152 528.92448 -1.31888 2.03744 4.33382 0.49408 -1.55862 -4.66171 7 3 4 2.38 2013-Sep-20 09:11:48 4171695.67185 872120.23092 4730011.82413 11.80800 48.17150 532.18222 -0.73067 0.60925 7.59157 1.08229 -2.98681 -1.40397 7 3 4 2.38 2013-Sep-20 09:11:48 4171697.26857 872121.23280 4730013.48790 11.80800 48.17150 534.60103 -0.07672 0.40145 10.01037 1.73624 -3.19461 1.01484 7 3 4 2.38 2013-Sep-20 09:11:48 4171696.38356 872119.30156 4730013.56797 11.80798 48.17151 533.81941 -1.78600 1.39483 9.22876 0.02696 -2.20123 0.23322 7 3 4 2.38 2013-Sep-20 09:11:48 4171696.99760 872119.95043 4730012.74478 11.80799 48.17150 533.69540 -1.27651 0.29904 9.10474 0.53645 -3.29702 0.10921 7 3 4 2.38 2013-Sep-20 09:11:48 4171699.47353 872121.03693 4730016.38304 11.80800 48.17150 538.17097 -0.71966 0.75385 13.58031 1.09330 -2.84222 4.58478 7 3 4 2.38 2013-Sep-20 09:11:48 4171700.83789 872121.89492 4730016.81861 11.80800 48.17150 539.50327 -0.15902 -0.08163 14.91261 1.65394 -3.67769 5.91708 7 3 4 2.38 2013-Sep-20 09:11:48 4171700.21047 872121.18047 4730016.26686 11.80800 48.17150 538.58505 -0.72996 0.11698 13.99440 1.08300 -3.47909 4.99886 7 3 4 2.38 2013-Sep-20 09:11:48 4171698.07341 872122.61021 4730017.05131 11.80802 48.17152 537.96965 1.10684 1.98084 13.37900 2.91980 -1.61522 4.38346 7 3 4 2.38 2013-Sep-20 09:11:48 4171695.61837 872120.94942 4730015.36464 11.80801 48.17152 534.88356 -0.01643 2.89988 10.29290 1.79653 -0.69618 1.29737 7 3 4 2.38 2013-Sep-20 09:11:48 4171696.03979 872122.28542 4730016.25204 11.80802 48.17152 536.00223 1.20507 2.98060 11.41157 3.01803 -0.61547 2.41604 7 3 4 2.38 2013-Sep-20 09:11:48 4171698.28626 872123.80253 4730016.93000 11.80804 48.17151 538.18092 2.23037 1.56288 13.59026 4.04333 -2.03318 4.59473 7 3 4 2.38 2013-Sep-20 09:11:48 4171698.84194 872122.23112 4730016.23664 11.80801 48.17151 537.81256 0.57850 0.93479 13.22190 2.39146 -2.66127 4.22637 7 3 4 2.38 2013-Sep-20 09:11:48 4171697.44208 872121.25846 4730015.52416 11.80800 48.17151 536.23510 -0.08712 1.62898 11.64445 1.72584 -1.96709 2.64891 7 3 4 2.38 2013-Sep-20 09:11:48 4171693.20144 872117.82225 4730012.34069 11.80797 48.17153 530.62577 -2.58284 3.12288 6.03511 -0.76989 -0.47318 -2.96042 7 3 4 2.38 2013-Sep-20 09:11:48 4171694.69339 872117.78625 4730012.08336 11.80797 48.17151 531.40304 -2.92337 1.86857 6.81238 -1.11041 -1.72749 -2.18315 7 3 4 2.38 2013-Sep-20 09:11:48 4171692.48650 872117.23476 4730009.59715 11.80797 48.17151 528.03455 -3.01159 1.90425 3.44390 -1.19863 -1.69181 -5.55163 7 3 4 2.38 2013-Sep-20 09:11:49 4171694.63009 872117.83856 4730013.18767 11.80797 48.17152 532.19173 -2.85922 2.64323 7.60107 -1.04626 -0.95283 -1.39446 7 3 4 2.38 2013-Sep-20 09:11:49 4171695.74003 872117.84020 4730015.05488 11.80796 48.17153 534.30784 -3.08475 3.07867 9.71719 -1.27179 -0.51740 0.72165 7 3 4 2.38 2013-Sep-20 09:11:49 4171696.17236 872118.73918 4730015.00220 11.80797 48.17152 534.67350 -2.29326 2.59113 10.08284 -0.48030 -1.00494 1.08731 7 3 4 2.38 2013-Sep-20 09:11:49 4171695.14836 872118.29528 4730015.81412 11.80797 48.17153 534.54946 -2.51822 3.94717 9.95880 -0.70526 0.35110 0.96327 7 3 4 2.38 2013-Sep-20 09:11:49 4171697.09466 872120.86564 4730017.06207 11.80800 48.17152 537.10067 -0.40054 2.96791 12.51001 1.41243 -0.62815 3.51448 7 3 4 2.38 2013-Sep-20 09:11:49 4171694.39566 872119.69092 4730013.92643 11.80799 48.17152 532.84197 -0.99809 3.02444 8.25131 0.81487 -0.57162 -0.74422 7 3 4 2.38 2013-Sep-20 09:11:49 4171695.22683 872120.00869 4730014.99482 11.80799 48.17153 534.22401 -0.85713 3.08227 9.63336 0.95583 -0.51379 0.63783 7 3 4 2.38 2013-Sep-20 09:11:49 4171698.17039 872119.79034 4730016.98170 11.80798 48.17152 537.59625 -1.67321 2.29366 13.00560 0.13975 -1.30240 4.01006 7 3 4 2.38 2013-Sep-20 09:11:49 4171700.00517 872121.16161 4730019.98118 11.80800 48.17152 541.21617 -0.70641 2.74668 16.62552 1.10655 -0.84938 7.62998 7 3 4 2.38 2013-Sep-20 09:11:49 4171696.70779 872119.77758 4730015.76720 11.80799 48.17152 535.73477 -1.38640 2.55244 11.14411 0.42656 -1.04362 2.14858 7 3 4 2.38 2013-Sep-20 09:11:49 4171696.66262 872119.97368 4730016.26361 11.80799 48.17152 536.10194 -1.18520 2.88654 11.51129 0.62776 -0.70952 2.51575 7 3 4 2.38 2013-Sep-20 09:11:49 4171694.37549 872117.67545 4730012.91449 11.80797 48.17152 531.79970 -2.96678 2.67161 7.20905 -1.15382 -0.92445 -1.78648 7 3 4 2.38 2013-Sep-20 09:11:49 4171692.78864 872120.42133 4730012.62848 11.80801 48.17153 530.92544 0.04571 3.21959 6.33478 1.85867 -0.37647 -2.66075 7 3 4 2.38 2013-Sep-20 09:11:49 4171691.67008 872119.95033 4730012.44513 11.80800 48.17153 529.99435 -0.18642 3.98498 5.40370 1.62654 0.38893 -3.59184 7 3 4 2.38 2013-Sep-20 09:11:49 4171693.85862 872119.59939 4730014.13942 11.80799 48.17153 532.63761 -0.97779 3.57215 8.04695 0.83517 -0.02391 -0.94858 7 3 4 2.38 2013-Sep-20 09:11:49 4171693.43125 872119.70259 4730014.30431 11.80800 48.17153 532.49557 -0.78931 3.97809 7.90492 1.02365 0.38203 -1.09061 7 3 4 2.38 2013-Sep-20 09:11:49 4171692.15580 872118.33429 4730011.81589 11.80798 48.17153 529.62201 -1.86766 3.45748 5.03135 -0.05470 -0.13858 -3.96418 7 3 4 2.38 2013-Sep-20 09:11:49 4171693.77406 872119.05065 4730014.29676 11.80799 48.17153 532.62477 -1.49761 3.82243 8.03411 0.31535 0.22637 -0.96142 7 3 4 2.38 2013-Sep-20 09:11:49 4171693.03195 872117.05363 4730012.14337 11.80796 48.17153 530.26319 -3.30051 3.23211 5.67254 -1.48755 -0.36395 -3.32300 7 3 4 2.38 2013-Sep-20 09:11:49 4171697.31607 872120.67877 4730017.74234 11.80800 48.17153 537.72659 -0.62876 3.28858 13.13594 1.18420 -0.30748 4.14040 7 3 4 2.38 2013-Sep-20 09:11:49 4171694.36044 872119.19236 4730013.68970 11.80799 48.17152 532.57454 -1.47889 2.96828 7.98388 0.33407 -0.62778 -1.01165 7 3 4 2.38 2013-Sep-20 09:11:49 4171692.59801 872115.73907 4730012.36764 11.80795 48.17153 529.96764 -4.49845 3.89863 5.37699 -2.68550 0.30257 -3.61855 7 3 4 2.38 2013-Sep-20 09:11:49 4171689.94758 872115.41950 4730009.77543 11.80795 48.17154 526.26228 -4.26890 4.15177 1.67163 -2.45594 0.55571 -7.32391 7 3 4 2.38 2013-Sep-20 09:11:49 4171693.74943 872117.74347 4730013.76650 11.80797 48.17153 532.03517 -2.77209 3.68609 7.44451 -0.95913 0.09002 -1.55102 7 3 4 2.38 2013-Sep-20 09:11:49 4171693.95887 872116.76591 4730014.97435 11.80795 48.17154 532.93851 -3.77182 4.48790 8.34785 -1.95886 0.89184 -0.64768 7 3 4 2.38 2013-Sep-20 09:11:50 4171697.75983 872117.97296 4730016.75180 11.80796 48.17152 536.90892 -3.36812 2.71690 12.31827 -1.55516 -0.87916 3.32274 7 3 4 2.38 2013-Sep-20 09:11:50 4171700.12216 872119.45928 4730020.01987 11.80797 48.17152 541.08905 -2.39666 2.94673 16.49840 -0.58370 -0.64933 7.50286 7 3 4 2.38 2013-Sep-20 09:11:50 4171696.75390 872120.02024 4730016.38795 11.80799 48.17152 536.26053 -1.15831 2.89578 11.66987 0.65465 -0.70028 2.67434 7 3 4 2.38 2013-Sep-20 09:11:50 4171696.62038 872120.59208 4730017.36975 11.80800 48.17153 536.98299 -0.57125 3.56074 12.39234 1.24171 -0.03532 3.39681 7 3 4 2.38 2013-Sep-20 09:11:50 4171696.76241 872119.51678 4730017.25801 11.80798 48.17153 536.84570 -1.65286 3.54659 12.25505 0.16010 -0.04947 3.25951 7 3 4 2.38 2013-Sep-20 09:11:50 4171695.56478 872119.08565 4730016.07613 11.80798 48.17153 535.12439 -1.82979 3.69765 10.53373 -0.01683 0.10159 1.53820 7 3 4 2.38 2013-Sep-20 09:11:50 4171698.53396 872119.98790 4730018.83850 11.80798 48.17153 539.24414 -1.55422 3.23665 14.65348 0.25874 -0.35941 5.65795 7 3 4 2.38 2013-Sep-20 09:11:50 4171695.87045 872116.53449 4730013.98515 11.80795 48.17152 533.41769 -4.38952 2.46923 8.82703 -2.57656 -1.12683 -0.16850 7 3 4 2.38 2013-Sep-20 09:11:50 4171697.97419 872117.72189 4730017.39427 11.80796 48.17152 537.49332 -3.65773 3.02731 12.90267 -1.84477 -0.56876 3.90713 7 3 4 2.38 2013-Sep-20 09:11:50 4171695.07700 872116.24279 4730014.04631 11.80794 48.17153 532.90550 -4.51267 3.13321 8.31484 -2.69972 -0.46285 -0.68069 7 3 4 2.38 2013-Sep-20 09:11:50 4171690.26871 872114.89262 4730008.97535 11.80794 48.17153 525.80384 -4.85034 3.46430 1.21318 -3.03738 -0.13176 -7.78235 7 3 4 2.38 2013-Sep-20 09:11:50 4171692.75955 872114.89066 4730013.60601 11.80793 48.17154 530.88007 -5.36197 4.73605 6.28942 -3.54901 1.13999 -2.70612 7 3 4 2.38 2013-Sep-20 09:11:50 4171691.95948 872114.55133 4730013.66356 11.80793 48.17155 530.35437 -5.53039 5.40972 5.76372 -3.71744 1.81366 -3.23182 7 3 4 2.38 2013-Sep-20 09:11:50 4171695.09852 872116.36994 4730016.05607 11.80795 48.17154 534.43446 -4.39263 4.43844 9.84380 -2.57967 0.84238 0.84827 7 3 4 2.38 2013-Sep-20 09:11:50 4171695.34463 872117.88389 4730016.13615 11.80797 48.17153 534.86140 -2.96107 4.08150 10.27074 -1.14811 0.48543 1.27521 7 3 4 2.38 2013-Sep-20 09:11:50 4171697.40948 872116.71951 4730016.92576 11.80794 48.17153 536.63879 -4.52335 3.27958 12.04813 -2.71039 -0.31648 3.05260 7 3 4 2.38 2013-Sep-20 09:11:50 4171694.45550 872115.82908 4730014.01599 11.80794 48.17153 532.42074 -4.79045 3.62939 7.83009 -2.97749 0.03332 -1.16545 7 3 4 2.38 2013-Sep-20 09:11:50 4171692.99165 872115.24509 4730014.73675 11.80794 48.17155 531.92252 -5.06254 5.26681 7.33186 -3.24958 1.67075 -1.66367 7 3 4 2.38 2013-Sep-20 09:11:50 4171691.74799 872114.79843 4730012.34905 11.80794 48.17154 529.27054 -5.24525 4.64965 4.67988 -3.43229 1.05359 -4.31565 7 3 4 2.38 2013-Sep-20 09:11:50 4171693.02877 872116.02999 4730016.51231 11.80795 48.17155 533.37692 -4.30184 6.30418 8.78626 -2.48888 2.70812 -0.20927 7 3 4 2.38 2013-Sep-20 09:11:50 4171694.68827 872114.31880 4730015.55856 11.80792 48.17154 533.51602 -6.31641 4.71864 8.92536 -4.50345 1.12257 -0.07017 7 3 4 2.38 2013-Sep-20 09:11:50 4171693.77761 872115.95720 4730015.67837 11.80794 48.17154 533.23442 -4.52632 5.21293 8.64376 -2.71336 1.61687 -0.35177 7 3 4 2.38 2013-Sep-20 09:11:50 4171694.19630 872116.39989 4730015.12616 11.80795 48.17154 533.15667 -4.17868 4.47178 8.56601 -2.36572 0.87572 -0.42952 7 3 4 2.38 2013-Sep-20 09:11:50 4171696.24240 872117.91645 4730019.78765 11.80796 48.17155 538.17280 -3.11291 5.85692 13.58214 -1.29995 2.26085 4.58661 7 3 4 2.38 2013-Sep-20 09:11:50 4171694.55237 872117.87145 4730016.31592 11.80797 48.17154 534.47647 -2.81112 4.78114 9.88582 -0.99816 1.18508 0.89029 7 3 4 2.38 2013-Sep-20 09:11:51 4171698.37532 872118.47241 4730019.27226 11.80797 48.17153 539.25698 -3.00518 3.87273 14.66632 -1.19222 0.27666 5.67079 7 3 4 2.38 2013-Sep-20 09:11:51 4171695.64513 872116.77343 4730017.51389 11.80795 48.17154 535.93263 -4.10953 4.95047 11.34198 -2.29657 1.35441 2.34645 7 3 4 2.38 2013-Sep-20 09:11:51 4171697.24627 872118.24946 4730017.71783 11.80797 48.17153 537.33124 -2.99237 3.69357 12.74059 -1.17941 0.09751 3.74506 7 3 4 2.38 2013-Sep-20 09:11:51 4171694.97997 872117.37612 4730016.79286 11.80796 48.17154 535.04340 -3.38347 4.86285 10.45274 -1.57051 1.26679 1.45721 7 3 4 2.38 2013-Sep-20 09:11:51 4171697.09886 872117.20407 4730018.29927 11.80795 48.17154 537.52560 -3.98547 4.34826 12.93495 -2.17251 0.75219 3.93941 7 3 4 2.38 2013-Sep-20 09:11:51 4171696.40555 872118.35142 4730018.90254 11.80797 48.17154 537.67912 -2.72053 5.08132 13.08847 -0.90757 1.48525 4.09293 7 3 4 2.38 2013-Sep-20 09:11:51 4171696.82261 872116.98598 4730016.79506 11.80795 48.17153 536.19465 -4.14242 3.57984 11.60400 -2.32946 -0.01623 2.60847 7 3 4 2.38 2013-Sep-20 09:11:51 4171695.04422 872116.60407 4730017.14060 11.80795 48.17154 535.23910 -4.15233 5.16563 10.64844 -2.33937 1.56957 1.65291 7 3 4 2.38 2013-Sep-20 09:11:51 4171696.83739 872117.80959 4730018.86994 11.80796 48.17154 537.86279 -3.33927 4.82721 13.27213 -1.52631 1.23115 4.27660 7 3 4 2.38 2013-Sep-20 09:11:51 4171696.88781 872118.11252 4730019.84086 11.80796 48.17155 538.66052 -3.05306 5.39176 14.06986 -1.24010 1.79569 5.07433 7 3 4 2.38 2013-Sep-20 09:11:51 4171698.31688 872119.10025 4730020.39935 11.80797 48.17154 540.14435 -2.37867 4.57128 15.55370 -0.56571 0.97521 6.55816 7 3 4 2.38 2013-Sep-20 09:11:51 4171695.78621 872118.04903 4730016.47168 11.80797 48.17153 535.42222 -2.88978 3.95801 10.83156 -1.07682 0.36194 1.83603 7 3 4 2.38 2013-Sep-20 09:11:51 4171692.38286 872118.07919 4730014.09759 11.80798 48.17154 531.43561 -2.16383 4.85244 6.84496 -0.35087 1.25638 -2.15058 7 3 4 2.38 2013-Sep-20 09:11:51 4171692.35887 872118.42735 4730013.38822 11.80798 48.17154 530.93888 -1.81813 4.34377 6.34822 -0.00517 0.74771 -2.64731 7 3 4 2.38 2013-Sep-20 09:11:51 4171692.60829 872118.53458 4730015.06669 11.80798 48.17155 532.36704 -1.76420 5.26488 7.77639 0.04875 1.66881 -1.21914 7 3 4 2.38 2013-Sep-20 09:11:51 4171693.86023 872119.67146 4730015.99694 11.80799 48.17154 534.03262 -0.90757 4.79877 9.44196 0.90539 1.20271 0.44643 7 3 4 2.38 2013-Sep-20 09:11:51 4171693.24262 872118.83673 4730016.25767 11.80798 48.17155 533.70981 -1.59826 5.55040 9.11915 0.21470 1.95434 0.12362 7 3 4 2.38 2013-Sep-20 09:11:51 4171689.72170 872117.48003 4730010.70157 11.80798 48.17154 527.08614 -2.20574 4.61997 2.49548 -0.39279 1.02391 -6.50005 7 3 4 2.38 2013-Sep-20 09:11:51 4171692.52581 872118.33884 4730014.59485 11.80798 48.17154 531.93489 -1.93892 5.04021 7.34423 -0.12596 1.44415 -1.65130 7 3 4 2.38 2013-Sep-20 09:11:51 4171693.43458 872119.60432 4730017.75909 11.80799 48.17155 535.05865 -0.88619 6.29465 10.46799 0.92677 2.69859 1.47246 7 3 4 2.38 2013-Sep-20 09:11:51 4171690.49018 872116.37434 4730013.42103 11.80796 48.17155 529.46330 -3.44530 6.04167 4.87264 -1.63234 2.44561 -4.12289 7 3 4 2.38 2013-Sep-20 09:11:51 4171689.25240 872116.47891 4730013.04403 11.80796 48.17156 528.38864 -3.08965 6.67711 3.79798 -1.27669 3.08106 -5.19755 7 3 4 2.38 2013-Sep-20 09:11:51 4171690.69340 872117.89639 4730013.86928 11.80798 48.17155 530.13768 -1.99704 5.96031 5.54703 -0.18408 2.36425 -3.44850 7 3 4 2.38 2013-Sep-20 09:11:51 4171687.90866 872116.38325 4730011.14049 11.80797 48.17156 526.07998 -2.90831 6.40231 1.48933 -1.09536 2.80625 -7.50620 7 3 4 2.38 2013-Sep-20 09:11:51 4171689.50675 872118.23332 4730012.14242 11.80799 48.17155 528.12227 -1.42441 5.62280 3.53161 0.38855 2.02674 -5.46392 7 3 4 2.38 2013-Sep-20 09:11:52 4171690.09269 872116.77902 4730012.74738 11.80797 48.17155 528.75707 -2.96784 5.82063 4.16642 -1.15488 2.22457 -4.82912 7 3 4 2.38 2013-Sep-20 09:11:52 4171692.00020 872117.10328 4730016.50027 11.80796 48.17156 532.84299 -3.04078 6.88271 8.25233 -1.22782 3.28664 -0.74320 7 3 4 2.38 2013-Sep-20 09:11:52 4171689.01089 872115.62661 4730011.29080 11.80795 48.17155 526.80825 -3.87450 5.81399 2.21759 -2.06154 2.21794 -6.77794 7 3 4 2.38 2013-Sep-20 09:11:52 4171687.99712 872116.24031 4730010.84236 11.80796 48.17155 525.89607 -3.06633 6.16077 1.30542 -1.25337 2.56471 -7.69011 7 3 4 2.38 2013-Sep-20 09:11:52 4171686.24000 872115.26520 4730009.72699 11.80796 48.17156 523.78486 -3.66124 6.84721 -0.80580 -1.84828 3.25115 -9.80133 7 3 4 2.38 2013-Sep-20 09:11:52 4171692.85561 872117.24077 4730015.10000 11.80796 48.17155 532.37674 -3.08124 5.30399 7.78609 -1.26828 1.70792 -1.20945 7 3 4 2.38 2013-Sep-20 09:11:52 4171693.22025 872118.15040 4730017.42974 11.80798 48.17156 534.47490 -2.26548 6.45304 9.88424 -0.45253 2.85697 0.88871 7 3 4 2.38 2013-Sep-20 09:11:52 4171693.55565 872117.16666 4730015.95114 11.80796 48.17155 533.45783 -3.29704 5.37232 8.86718 -1.48408 1.77626 -0.12835 7 3 4 2.38 2013-Sep-20 09:11:52 4171690.96482 872116.76181 4730016.21891 11.80796 48.17157 531.91084 -3.16315 7.50231 7.32018 -1.35020 3.90625 -1.67535 7 3 4 2.38 2013-Sep-20 09:11:52 4171691.23538 872117.56932 4730016.96099 11.80797 48.17157 532.75062 -2.42810 7.67674 8.15996 -0.61514 4.08068 -0.83557 7 3 4 2.38 2013-Sep-20 09:11:52 4171690.59725 872115.76944 4730017.40408 11.80795 48.17158 532.41859 -4.05930 8.71213 7.82793 -2.24634 5.11607 -1.16760 7 3 4 2.38 2013-Sep-20 09:11:52 4171690.85914 872115.78250 4730015.10104 11.80795 48.17156 530.87523 -4.10012 6.98321 6.28457 -2.28716 3.38715 -2.71096 7 3 4 2.38 2013-Sep-20 09:11:52 4171687.57249 872115.36900 4730011.85321 11.80795 48.17156 526.25320 -3.83231 7.27748 1.66254 -2.01936 3.68142 -7.33299 7 3 4 2.38 2013-Sep-20 09:11:52 4171689.60871 872116.13960 4730012.73699 11.80796 48.17155 528.34614 -3.49469 6.26420 3.75548 -1.68173 2.66815 -5.24005 7 3 4 2.38 2013-Sep-20 09:11:52 4171687.40524 872116.51402 4730012.25067 11.80797 48.17157 526.59645 -2.67729 7.48994 2.00579 -0.86433 3.89388 -6.98974 7 3 4 2.38 2013-Sep-20 09:11:52 4171689.07301 872115.14207 4730012.66794 11.80795 48.17156 527.80886 -4.36149 6.76098 3.21820 -2.54854 3.16492 -5.77733 7 3 4 2.38 2013-Sep-20 09:11:52 4171688.24740 872115.72461 4730013.02406 11.80796 48.17157 527.61476 -3.62233 7.51183 3.02410 -1.80937 3.91577 -5.97143 7 3 4 2.38 2013-Sep-20 09:11:52 4171689.64800 872115.67283 4730012.14075 11.80795 48.17155 527.86380 -3.95963 5.90909 3.27314 -2.14667 2.31303 -5.72239 7 3 4 2.38 2013-Sep-20 09:11:52 4171691.27013 872116.01790 4730015.52910 11.80795 48.17156 531.49462 -3.95380 6.93302 6.90396 -2.14084 3.33696 -2.09157 7 3 4 2.38 2013-Sep-20 09:11:52 4171692.17933 872116.72878 4730015.28157 11.80796 48.17155 532.00070 -3.44402 5.99640 7.41004 -1.63106 2.40034 -1.58549 7 3 4 2.38 2013-Sep-20 09:11:52 4171696.95168 872118.42600 4730019.89214 11.80797 48.17155 538.78320 -2.75929 5.33158 14.19254 -0.94633 1.73551 5.19701 7 3 4 2.38 2013-Sep-20 09:11:52 4171695.79975 872118.53080 4730018.78050 11.80797 48.17155 537.21720 -2.42099 5.41443 12.62654 -0.60803 1.81837 3.63101 7 3 4 2.38 2013-Sep-20 09:11:52 4171693.44918 872117.45165 4730015.12135 11.80797 48.17154 532.80890 -2.99629 4.85313 8.21825 -1.18333 1.25707 -0.77729 7 3 4 2.38 2013-Sep-20 09:11:52 4171696.91616 872119.35273 4730018.88611 11.80798 48.17154 538.13685 -1.84490 4.54525 13.54619 -0.03194 0.94919 4.55066 7 3 4 2.38 2013-Sep-20 09:11:52 4171697.77986 872120.40746 4730020.41721 11.80799 48.17154 539.98549 -0.98923 4.77555 15.39484 0.82373 1.17948 6.39931 7 3 4 2.38 2013-Sep-20 09:11:53 4171694.80653 872117.67543 4730020.27882 11.80796 48.17156 537.56857 -3.05501 7.26852 12.97791 -1.24205 3.67246 3.98238 7 3 4 2.38 2013-Sep-20 09:11:53 4171694.05497 872116.07051 4730019.09673 11.80795 48.17156 535.97811 -4.47217 7.27307 11.38745 -2.65921 3.67700 2.39192 7 3 4 2.38 2013-Sep-20 09:11:53 4171693.48086 872116.46808 4730017.50238 11.80795 48.17156 534.46957 -3.96553 6.56792 9.87891 -2.15258 2.97185 0.88338 7 3 4 2.38 2013-Sep-20 09:11:53 4171693.55370 872117.95188 4730017.84278 11.80797 48.17156 534.97327 -2.52803 6.51555 10.38261 -0.71507 2.91949 1.38708 7 3 4 2.38 2013-Sep-20 09:11:53 4171694.24129 872118.36007 4730017.03530 11.80798 48.17155 534.87613 -2.26918 5.41328 10.28547 -0.45623 1.81722 1.28994 7 3 4 2.38 2013-Sep-20 09:11:53 4171689.65452 872114.76628 4730013.47883 11.80794 48.17156 528.74141 -4.84832 6.93493 4.15075 -3.03536 3.33887 -4.84478 7 3 4 2.38 2013-Sep-20 09:11:53 4171687.60106 872114.30672 4730012.83696 11.80794 48.17157 526.85992 -4.87795 8.07469 2.26926 -3.06499 4.47863 -6.72627 7 3 4 2.38 2013-Sep-20 09:11:53 4171687.25192 872114.90764 4730011.57511 11.80795 48.17156 525.77375 -4.21830 7.39617 1.18309 -2.40535 3.80011 -7.81244 7 3 4 2.38 2013-Sep-20 09:11:53 4171687.71972 872114.85189 4730011.84202 11.80795 48.17156 526.27041 -4.36860 7.24148 1.67975 -2.55564 3.64542 -7.31578 7 3 4 2.38 2013-Sep-20 09:11:53 4171688.12430 872115.33868 4730012.68062 11.80795 48.17156 527.22582 -3.97491 7.43143 2.63516 -2.16195 3.83537 -6.36037 7 3 4 2.38 2013-Sep-20 09:11:53 4171689.03967 872115.23753 4730013.41406 11.80795 48.17156 528.35608 -4.26123 7.26834 3.76542 -2.44827 3.67228 -5.23011 7 3 4 2.38 2013-Sep-20 09:11:53 4171690.64438 872115.56369 4730013.94193 11.80795 48.17156 529.84147 -4.27035 6.40021 5.25081 -2.45739 2.80414 -3.74472 7 3 4 2.38 2013-Sep-20 09:11:53 4171692.71611 872114.69113 4730015.46940 11.80793 48.17155 532.21299 -5.54839 6.04085 7.62233 -3.73543 2.44479 -1.37320 7 3 4 2.38 2013-Sep-20 09:11:53 4171691.22275 872114.73262 4730015.42079 11.80794 48.17156 531.20758 -5.20218 7.09134 6.61692 -3.38922 3.49527 -2.37861 7 3 4 2.38 2013-Sep-20 09:11:53 4171690.08443 872114.56734 4730014.62927 11.80794 48.17156 529.85215 -5.13103 7.41893 5.26148 -3.31807 3.82287 -3.73404 7 3 4 2.38 2013-Sep-20 09:11:53 4171690.84764 872115.02594 4730017.08521 11.80794 48.17157 532.24297 -4.83832 8.43021 7.65231 -3.02536 4.83415 -1.34322 7 3 4 2.38 2013-Sep-20 09:11:53 4171692.57768 872115.43641 4730018.09924 11.80794 48.17157 534.18394 -4.79055 7.78203 9.59328 -2.97759 4.18597 0.59775 7 3 4 2.38 2013-Sep-20 09:11:53 4171686.42411 872112.06870 4730011.60333 11.80791 48.17157 524.86696 -6.82777 8.45167 0.27630 -5.01482 4.85561 -8.71923 7 3 4 2.38 2013-Sep-20 09:11:53 4171686.46206 872112.35102 4730012.68539 11.80792 48.17158 525.73656 -6.55919 9.10257 1.14590 -4.74624 5.50651 -7.84963 7 3 4 2.38 2013-Sep-20 09:11:53 4171688.75169 872112.40442 4730015.91620 11.80791 48.17158 529.64592 -6.97546 9.57906 5.05525 -5.16250 5.98300 -3.94027 7 3 4 2.38 2013-Sep-20 09:11:53 4171689.42812 872114.48165 4730016.45616 11.80794 48.17158 530.77331 -5.08060 9.12905 6.18265 -3.26764 5.53299 -2.81288 7 3 4 2.38 2013-Sep-20 09:11:53 4171688.31794 872114.85852 4730015.25997 11.80795 48.17158 529.20869 -4.48453 9.08359 4.61803 -2.67157 5.48753 -4.37750 7 3 4 2.38 2013-Sep-20 09:11:53 4171686.67064 872113.32616 4730013.89299 11.80793 48.17158 526.90563 -5.64737 9.60710 2.31497 -3.83441 6.01104 -6.68056 7 3 4 2.38 2013-Sep-20 09:11:53 4171687.62632 872113.30638 4730013.45230 11.80793 48.17158 527.19841 -5.86230 8.61916 2.60775 -4.04934 5.02311 -6.38778 7 3 4 2.38 2013-Sep-20 09:11:53 4171687.54589 872111.64922 4730012.96994 11.80791 48.17158 526.56033 -7.46793 8.60882 1.96967 -5.65498 5.01277 -7.02586 7 3 4 2.38 2013-Sep-20 09:11:54 4171691.51168 872114.32802 4730017.48494 11.80793 48.17157 532.87906 -5.65734 8.31888 8.28840 -3.84439 4.72282 -0.70713 7 3 4 2.38 2013-Sep-20 09:11:54 4171691.82504 872114.51984 4730017.95495 11.80793 48.17157 533.46002 -5.53371 8.37453 8.86936 -3.72075 4.77846 -0.12617 7 3 4 2.38 2013-Sep-20 09:11:54 4171695.55088 872118.26611 4730015.58240 11.80797 48.17153 534.63557 -2.62914 3.50349 10.04492 -0.81618 -0.09258 1.04939 7 3 4 2.38 2013-Sep-20 09:11:54 4171696.67499 872119.86523 4730017.70657 11.80799 48.17153 537.17043 -1.29390 3.85636 12.57977 0.51906 0.26030 3.58424 7 3 4 2.38 2013-Sep-20 09:11:54 4171696.06520 872118.54670 4730018.58839 11.80797 48.17154 537.24951 -2.45974 5.09027 12.65885 -0.64678 1.49421 3.66332 7 3 4 2.38 2013-Sep-20 09:11:54 4171697.44169 872118.51567 4730016.78197 11.80797 48.17152 536.79779 -2.77179 2.88632 12.20713 -0.95883 -0.70975 3.21160 7 3 4 2.38 2013-Sep-20 09:11:54 4171696.18880 872118.12150 4730016.40404 11.80797 48.17153 535.64451 -2.90123 3.60821 11.05385 -1.08827 0.01214 2.05832 7 3 4 2.38 2013-Sep-20 09:11:54 4171696.77683 872119.67325 4730018.08203 11.80799 48.17153 537.49048 -1.50265 4.06176 12.89982 0.31031 0.46570 3.90429 7 3 4 2.38 2013-Sep-20 09:11:54 4171699.02001 872120.06924 4730019.85566 11.80798 48.17153 540.33046 -1.57407 3.54810 15.73981 0.23889 -0.04797 6.74427 7 3 4 2.38 2013-Sep-20 09:11:54 4171698.82588 872120.41467 4730019.60166 11.80799 48.17153 540.06160 -1.19622 3.46762 15.47095 0.61674 -0.12844 6.47541 7 3 4 2.38 2013-Sep-20 09:11:54 4171697.29935 872120.15303 4730017.94527 11.80799 48.17153 537.79515 -1.13995 3.51628 13.20449 0.67301 -0.07978 4.20896 7 3 4 2.38 2013-Sep-20 09:11:54 4171694.66465 872117.64772 4730013.33391 11.80796 48.17152 532.29721 -3.05310 2.74465 7.70656 -1.24014 -0.85141 -1.28898 7 3 4 2.38 2013-Sep-20 09:11:54 4171692.11116 872116.62846 4730011.91759 11.80796 48.17153 529.43585 -3.52826 3.81797 4.84519 -1.71530 0.22191 -4.15034 7 3 4 2.38 2013-Sep-20 09:11:54 4171693.99142 872117.41529 4730014.03835 11.80796 48.17153 532.35092 -3.14284 3.74092 7.76027 -1.32988 0.14486 -1.23527 7 3 4 2.38 2013-Sep-20 09:11:54 4171691.72624 872116.29942 4730011.10037 11.80795 48.17153 528.53073 -3.77157 3.60389 3.94008 -1.95861 0.00783 -5.05545 7 3 4 2.38 2013-Sep-20 09:11:54 4171695.11009 872118.59125 4730018.09022 11.80798 48.17155 536.26089 -2.22069 5.44788 11.67024 -0.40773 1.85182 2.67471 7 3 4 2.38 2013-Sep-20 09:11:54 4171694.25695 872117.25575 4730016.38096 11.80796 48.17154 534.24807 -3.35334 5.13387 9.65741 -1.54038 1.53781 0.66188 7 3 4 2.38 2013-Sep-20 09:11:54 4171693.02937 872116.83171 4730014.57371 11.80796 48.17154 532.04218 -3.51721 4.88864 7.45152 -1.70425 1.29257 -1.54401 7 3 4 2.38 2013-Sep-20 09:11:54 4171691.02841 872116.92619 4730010.81756 11.80797 48.17153 527.95000 -3.01526 3.82869 3.35934 -1.20231 0.23263 -5.63619 7 3 4 2.38 2013-Sep-20 09:11:54 4171692.96774 872117.52886 4730011.19043 11.80797 48.17152 529.57606 -2.82219 2.57096 4.98540 -1.00924 -1.02510 -4.01013 7 3 4 2.38 2013-Sep-20 09:11:54 4171693.60390 872117.65830 4730013.73263 11.80797 48.17153 531.90331 -2.82567 3.78262 7.31265 -1.01271 0.18656 -1.68288 7 3 4 2.38 2013-Sep-20 09:11:54 4171696.10904 872118.55041 4730016.02482 11.80797 48.17153 535.36840 -2.46507 3.34808 10.77775 -0.65211 -0.24798 1.78222 7 3 4 2.38 2013-Sep-20 09:11:54 4171693.62821 872117.58298 4730016.42395 11.80797 48.17155 533.91432 -2.90438 5.57123 9.32367 -1.09142 1.97517 0.32814 7 3 4 2.38 2013-Sep-20 09:11:54 4171696.74863 872117.80728 4730016.31728 11.80796 48.17153 535.90243 -3.32336 3.18993 11.31177 -1.51040 -0.40613 2.31624 7 3 4 2.38 2013-Sep-20 09:11:54 4171696.73840 872119.19594 4730018.25690 11.80798 48.17154 537.53056 -1.96199 4.27919 12.93990 -0.14903 0.68313 3.94437 7 3 4 2.38 2013-Sep-20 09:11:55 4171693.85869 872119.28301 4730015.82901 11.80799 48.17154 533.85347 -1.28748 4.74714 9.26281 0.52547 1.15108 0.26728 7 3 4 2.38 2013-Sep-20 09:11:55 4171692.22913 872118.76933 4730014.20304 11.80799 48.17154 531.50802 -1.45683 4.92966 6.91736 0.35613 1.33360 -2.07817 7 3 4 2.38 2013-Sep-20 09:11:55 4171693.70261 872119.31345 4730015.79369 11.80799 48.17154 533.72941 -1.22575 4.83278 9.13876 0.58720 1.23672 0.14322 7 3 4 2.38 2013-Sep-20 09:11:55 4171693.19882 872119.82288 4730014.85422 11.80800 48.17154 532.77002 -0.62401 4.49602 8.17937 1.18895 0.89996 -0.81616 7 3 4 2.38 2013-Sep-20 09:11:55 4171692.32530 872118.05042 4730012.73710 11.80798 48.17153 530.38036 -2.18021 3.99150 5.78970 -0.36725 0.39544 -3.20583 7 3 4 2.38 2013-Sep-20 09:11:55 4171696.58322 872119.06658 4730017.54688 11.80798 48.17153 536.88253 -2.05686 3.93858 12.29188 -0.24390 0.34252 3.29635 7 3 4 2.38 2013-Sep-20 09:11:55 4171694.54147 872118.56212 4730014.96255 11.80798 48.17153 533.55516 -2.13284 3.78121 8.96450 -0.31988 0.18515 -0.03103 7 3 4 2.38 2013-Sep-20 09:11:55 4171693.85205 872117.08864 4730013.83536 11.80796 48.17153 532.06411 -3.43407 3.75701 7.47345 -1.62111 0.16094 -1.52208 7 3 4 2.38 2013-Sep-20 09:11:55 4171694.94468 872116.72352 4730015.78012 11.80795 48.17154 534.17666 -4.01505 4.31271 9.58601 -2.20209 0.71665 0.59048 7 3 4 2.38 2013-Sep-20 09:11:55 4171695.16755 872118.14930 4730016.69910 11.80797 48.17154 535.20150 -2.66504 4.54562 10.61084 -0.85208 0.94955 1.61531 7 3 4 2.38 2013-Sep-20 09:11:55 4171693.61509 872117.19836 4730016.43394 11.80796 48.17155 533.86071 -3.27818 5.64611 9.27006 -1.46522 2.05005 0.27452 7 3 4 2.38 2013-Sep-20 09:11:55 4171693.09688 872117.15469 4730014.25086 11.80796 48.17154 531.88976 -3.21488 4.57484 7.29910 -1.40192 0.97878 -1.69643 7 3 4 2.38 2013-Sep-20 09:11:55 4171693.16336 872118.85560 4730015.04595 11.80798 48.17154 532.75774 -1.56356 4.79724 8.16708 0.24939 1.20117 -0.82845 7 3 4 2.38 2013-Sep-20 09:11:55 4171691.17820 872116.93284 4730013.18172 11.80796 48.17155 529.81033 -3.03940 5.29509 5.21967 -1.22644 1.69903 -3.77586 7 3 4 2.38 2013-Sep-20 09:11:55 4171696.49781 872119.37470 4730018.74999 11.80798 48.17154 537.76532 -1.73779 4.75625 13.17466 0.07517 1.16019 4.17913 7 3 4 2.38 2013-Sep-20 09:11:55 4171694.73266 872118.56638 4730016.69162 11.80798 48.17154 534.96896 -2.16780 4.79423 10.37830 -0.35484 1.19817 1.38277 7 3 4 2.38 2013-Sep-20 09:11:55 4171691.58568 872117.19325 4730013.85910 11.80797 48.17155 530.61661 -2.86789 5.40993 6.02595 -1.05493 1.81387 -2.96958 7 3 4 2.38 2013-Sep-20 09:11:55 4171691.02426 872116.64629 4730013.51827 11.80796 48.17155 529.92150 -3.28839 5.67551 5.33085 -1.47543 2.07945 -3.66469 7 3 4 2.38 2013-Sep-20 09:11:55 4171691.44401 872116.22770 4730013.94906 11.80795 48.17155 530.45940 -3.78401 5.72048 5.86874 -1.97106 2.12442 -3.12679 7 3 4 2.38 2013-Sep-20 09:11:55 4171690.78676 872117.59316 4730015.54571 11.80797 48.17156 531.40642 -2.31296 7.05647 6.81577 -0.50000 3.46041 -2.17977 7 3 4 2.38 2013-Sep-20 09:11:55 4171688.22556 872116.06109 4730011.55007 11.80796 48.17156 526.54808 -3.28850 6.49345 1.95743 -1.47554 2.89739 -7.03811 7 3 4 2.38 2013-Sep-20 09:11:55 4171689.65593 872115.23434 4730014.26024 11.80795 48.17156 529.38846 -4.39046 7.38365 4.79780 -2.57750 3.78759 -4.19773 7 3 4 2.38 2013-Sep-20 09:11:55 4171689.83049 872114.17239 4730013.38866 11.80793 48.17156 528.70804 -5.46566 6.83700 4.11738 -3.65270 3.24094 -4.87815 7 3 4 2.38 2013-Sep-20 09:11:55 4171691.12185 872113.74860 4730014.77388 11.80792 48.17156 530.52538 -6.14473 6.88354 5.93472 -4.33177 3.28748 -3.06081 7 3 4 2.38 2013-Sep-20 09:11:55 4171694.18539 872116.30189 4730019.20345 11.80795 48.17156 536.17434 -4.27238 7.21383 11.58368 -2.45942 3.61777 2.58815 7 3 4 2.38 2013-Sep-20 09:11:56 4171699.19494 872117.78896 4730022.47860 11.80795 48.17155 542.08794 -3.84189 5.51745 17.49728 -2.02893 1.92138 8.50175 7 3 4 2.38 2013-Sep-20 09:11:56 4171696.77203 872117.52171 4730019.27596 11.80796 48.17154 538.08338 -3.60768 5.18956 13.49272 -1.79472 1.59350 4.49719 7 3 4 2.38 gnss-sdr-0.0.9/src/utils/gnuplot/4_GPS_3_GAL_accuracy_precision.jpeg000066400000000000000000001354171305042567700253000ustar00rootroot00000000000000ÿØÿàJFIF``ÿþ;CREATOR: gd-jpeg v1.0 (using IJG JPEG v80), quality = 90 ÿÛC     ÿÛC   ÿÀà€"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ýS¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿:¼ñ;ÆP~Ç?µ&¯Œ5ûm_Iø±{¦iÚ”:¤ésah5{ÄJtQ„wPŠB€Äc×Ó>ý˜¼?¢x“JÔ­¾+üNÕ'²ºŠé,¯¼yyso9ƒì–&r$C· ‡‚ ƒ@ùE|3ð#á±øá®|gÕ¼Sñcâ>›q¦|I×´{+=+Æ×–VðZC2˜£H–L*®òJÙý²ôOü?ø ð§Â~"x—MÕµOéš,&¼Ö§º½qt÷O>íÓF®Ëò1#lj¸ÀömñǯÚ3^ñŸüÏâŠlnï¼ñÃæ #\ƒMº{k­/SŠöÞ;„Iƒ*°mÊAæ9'&¾Í×õí?ÂÚ¥­j×Ic¥éÖÒ^]ÝI°Ã—w8ìøPú+çßþÚ^ñ~»á[9|%ãi^+™môkš/ÙôíJGBñ,n$g_1AdÞ‹¸t®[á·íGà?…ß²ïï\j=ñ/†üAâ t MKÄž]þ³çÉ{t›îJ?Í4R*ù{ÜF±€¤ñ@UÑ_:ÅûnxiüY}àù<ñÁ]ÛøZM~Û{lÛ¿Ò""Sˆm ´’& ÷¸­þÙÞø‰®x GÓ,uèu?j¶“­íšC&™w§Cç\Ãx¦L£ òHÎ:нQ^ û@|u±Ñíþ'|:ÓŽ«aã†Ú‡‹àÕ-¶Ç 14 ²Uq"̲&á… Ù⹇ߵ†•à„|=©Xø«âÄoøLÖŸLЭ~Ý4FÒ?2îy%‘ pYŸ,Ùëšú¢ŠøÏâçíÉu?†þk?4Mý¥ñ/ ø‡K¹Ó­ã½·xÑŒúcÇ4ªæMÈP©ÚoºD8 î??iMá§Œ-¼#o ø—Æþ-–ÈêRhžÓÅÝŵ¦í‚iK:")`@·1ÅzÝàW¿¶Ïááo ꚇ£éßPÞøS_Ž[O²j#S9‘­Ë̆"Ä©»(Àì>¼¢¼‹â‡í3á߆ž7²ð\'ˆümã›OíÐü)§‹»‹k]ÛDótHж@Ëdžƒ‘Ÿø5ûXèßð²¿jOø—ÄåÃß>äéúÔw úT†ÌÅqZ¶LR5Ê•eP7?99Í}«E|ûá¯Û3Bñˆ´ýãÀ>=ðö·¬i·Z–e­é1[6º°CçI «yå|ݘ;ehñ‘’3\ìÿûjªþÆÞø§ñb=I5]Býô˜~ǧÆÒëwM4‚³†9ÈRŸ8Cº21†`¯¨¯ øWûLhüy©x& x£Á^.²Ó×VþÇñVž–ÒÏfdòþÑŽI9 ~l‚qŽ=~€ +äOø(íKâ‚¿µ7á£!ñ¥”Z¶¥©4I,z%ƒ\$)#+«#K4²4`rVƾ» Šù3OoþÖÿ~"ZCã­ÀŸ ü «7†â¶ðȳ¿Õµ(‘ZêI®v—Hã2**&7g$‚9î>|5øŸð‹âìº_ü%Ú—þj{J³ø¢ñ'Õt‹ånfÚx]½’§õ,ïtWçÇìÇð¢çâWìsáÿ‰Þ'øéñCA×®l/nî5yñt¬ž5ñ–‹k²æÚ$þÌC*7.œ#FÐ~\(ôŠù›à§†õ?ˆÚ.·ðÓã¿>^Z\E¯YëÞ!ÌöwC[Kk0 à–ܯ¸r8ÛôÍWÊ?~%øûÅ´'| ¤üHÓþèžÐm5X/o´»{©5–˜Hd›uÁÚ-á(öÛ˜å‡zÇì¯ñK[ø×û>x'ÆÞ#ÓHÖõ{3-ͼq²#2Èñ‰Q[’(9ù\rzЫQ_.øó\ñíûHkß ü7âíOÀ~ ð^›g{âmS@dS½»» öÖ±LÊÞLb4.Σqû½F¶ðsâoÁ¿Š¾¹ðŸŽµÿ|;ÔKhþ5ÕíÍËû««K‡C†á£$‚ Ç8Úôeó¿ðPo‡ƒO¸×áðÿŒîþÛßÿgMãÈ4`tXäóEŒ†A/—½‚+Sà·Šu­WöÅý¤t[Ý^þóGÒ`ðÁÓôéî]íì̶S´¦ÉÛöU-´ ÄsŠú&Š( Šüøñ—ÇOÛ~ÕW­¼K¨ÇðoÃ^2³øky£%Ó­Œ­$-Õì±ça0ÝM ‡Á8P3Æ+믋Ÿô„:¦‡¢ÜiÚ׉üS­ù­§xwÃvj¾ž8À2K´²¢F¹ge+ñ§†,~Ã?—up²2<»q6JînFöò/Á@¾x»ÀºŸWMñF•á *Ê{­K[¿ÒÀµ³–;‘n¶nñ»†¸²:F›¾I±Rq@LQ^ðûöºð÷Ž|yáÿßxGÆ~ Õ|Gk5Þ†Þ)Ò–Ú-M"ŒI …’Gù–3¸«… väVv¹ûoøE½Ö¦]ÅšŸ„´;æÓµ_iÚ9›F²™$¥Ý½•áž4eë@BÑ^?iûRx6ãà÷~#Êš…¦á ›û-RÒxâûRÏhåZ4 !F2|†?Ÿ %L‘ž=OEÔŽ±£Ø_µ¥Îž×PG9´¼UY ,¡¶Hs‚# àš»E|Å/üáàÓî5ø|?ã;¿‡ö÷ÿÙÓxò 9<Ác!Kåï`»ÄdgŠé¼Sû_xwÿ¼eà+xËÅ^)ð¬Vw–^Ób¸2Ãq ”K3(Úƒj°}¬ZEœ{½àw_¶·Ã·ð?¼E¢G­ø¶ãÆË+èZƒ§õ;¡ +>b,ª‚&R®ÎÁAšóÿ…®¾+þÞZ¾•fþ'Ðô};áÊß kñËiöMDjg25¹cÃ$X•7eÝ€×”WÌ·mÞ¬tƒ:6—âMwÃxƒâV•£_Ýx{R–ÂæKY¡ºGæÄÁ°p§2ªqÀ®GÆÞÕfŸ­ü)ñ3Æž)oøƒûT🊵Ù5q5‹C#Éy—/QIe8ù€~Ûžø»áûßéÚgˆô¯ iº}Þ¡©ëú¶ž±XiÆÞRo,Ë#1P%›ÿvÊIRBÕß~Ø^ñ·Š|=¢ÜxwÅÞO+êž%Ò ¥ž®Bo ›Ø†d•dXt"€=ÚŠùë\ý·ü ¢ÞëS.‹âÍOÂZóiÚ¯4íÍ£YLŒ@ÒîÞÊŒpÏ2Œuªß>,ñ'Ã_ø’ÙZèÞ+Ð4›i.&ymæŽ[=E"K3  |¸è„‘öÿôù5oø’Æ-ÛÄ2Üé·0¦‘{'—ñh˜$l¨ùÚNߢ€>ø/gã øûáž•ðËÃ|£%ÚEâÏ øâ7¸ðæ™`±·›•ÍÆ\²¾Ñ”ä0ä…/Á |a°ø—sðÿŦ…áÿŒ>7¼»µÓt¹%½’ËQ¶Ž {È Ày¡$1ß Ækô’Šø'ÆqxÏâÏÇŸ‹Þ*‡áÏŠ´mÿàþ‡£I©irG-ôæâVX¶JLÌï¶ýáP¬Tn4'âG…|5ð BÕôψúgë‡t„Әꋭ¤P¡¶¼ÂíâXÁ.ÏŸ!ˆÁÇÞPåÆà/ø7Æþxò¡ü´ñܶ²YOª]6%³ •gVÝÊ¥1&Çv$ç5ì_|ãO†_µÄ/>&ÅáOéº`³Ô>i–Zœ°Ík‰í®ažÚyw« UùÎâƒîZ(ó»á‡ÂÏþÏÿtŽ-àxIñëúÞ•vöº†¿`×3Ã,WÆÖÖQL¾F^Ã4{Û,Äí£ðŽãÅ>;ý½µß^ü=ñ„|)sðò=:Â÷Z°hå“Q |ÜdE)ùȉŽÿ-QŠ€ÀWØPÊzûx‡öý¬|oãéüâ/x?ÇZ>›n·Þ±:…Ηuf$C )Þ"‘\>õnäy_‡£øÐ—Ÿµ÷|'ðÿVð§‹µÿì+¯ ÚjVjZxÒܬìÅ$ë ,Ñ‚Ûe;$b¿@( Ïk Y¸ý¦>øòËÂ_5½GºÔ¬µsÆÖÓ¼ðËwdÐE¶È ‰]³$ÉG‚>fÙÄ¿  øµðûöð†ô ø»ÃÞ$ðÿˆ†›â{{]$kŦ¹e¸ŸNŽe+;– ®¡‡ßÇ*qú E|-ðOÃú®‘ûoi¾1ÁÿG…5¯Ï Çâ¥ÅÌïx·‘Ü2»1²ˆ¤lª®±ùÂ|ù?]|%ø—eñÀ:wŠì4½[D‚ñçˆéºí°¶½¶’ä‚Hæˆ3l`ñ0+œŽø9×ÖO…|+¥ø'Ãöz.lmtëE"8ÚW•É,Y™är]Ý™™™Ø–bÄ’I&€>ý«fŠš/ìïñ¤é)³ñí׋uµ;Ý6ËÁ×kWßéPù0$ÉxãdªªªÁ€‘·±jû›Â6zîŸáÛKê¶ZÞ¶›þѧX5ŒåÉ]°´²”•26H'ŒàlQ@"hrø»öAø¯ñ'€¼Gãφ~8×eñEž£á?·Þé—󪋨g¶ ÆÌŠÊèòIÛçøX÷ß¶Àïøà$¿ >iÒk6÷W£Gc}q,ºlÁeº† L†8Ì¥YžFFW? TPÅß°Ïì‰àý˜|sñàþˆž6Xîøø“ÃÑ‹ðâîmžjÍüìÙæÜqŠö_ÚľÏàsÁž—ÅÞ ±¸žÛÅ^Òíb’úæÎH‚Å%²¾7œdƤ @HöÊ(⯆^·ñ¯íoáOˆ~kß |9¦iz„^(¼Ö4ìQ®<È‹mÚg.cpÒ™ ò’Bçêo‡ì¾#É⨭t½[I›Ãšåƃu¯l ye‰cq4@1Ý ‰,nŽq¹XFzúÉð÷…t¿ .¢4ËcÔ/eÔnåy^iä9w,äžT.pªªª¨ãŸþ†/Ú/ÇšÏÅO„ž!øÉàÝWD³¶ðzèúWö¬ZK,l·°y`æÚYeØâ|ÆÜW¿þÉ^ñ§‚ÿgh¿î%¹ñ}†ËÓq0šXÁ‘ÌQ<ƒ;š8ŒhNNJOZõÚ(å_é^0ý?ioüSÑ<«xÿÀÞ;ÓìmõûƳêzuíš ž;rÀÍDÛHO˜žÀ7‹üZð1øµñCáWŒ~~Ï:„-l~#iLj¼O«xy4ýZóuà2‘ ƒ1„if–M SÎÑ*(òããG…¾,übýœüs x«ÂŸüAña®d’].ͧ†-bŽô:Uˆ¤w‹äª…SçH\îÀÆáõgìçc«jµ7íã Ÿëš&‡â; O¦Í¬é²Ù™öXÎ%@$Q—™UÔd£únŠã¾!ü,Òþ%ÿgÿij¾%Ó>ÅæyðxŠûIß¿n|ϲÍ™ƒó·-Œn9—âÏŠõ|2ñN¿£éšþ±§i³ÜXéz}³ÜOupùQ¬h 6çÚ8Ojë( †4/Ø[Ö?d | ªüHñl:¶µ¦6§ ºéßaþ׋’$f³3•[¹>po—‚£/ƒµÏˆ:'Ž>üxñ7ÃÏjËyðýüâM*ËK‘õm.þ;±)º6l¯Ír€¥O ŒýÍE|Kã9~"ø·â/ÃÏŽƒáF¥m øGÄ:”ká¨-•uûÍ6êÅ-¿´%·-Ì©"¶Ø³¿awþÐëãïÚ¯àÆ}3ÿ µ Æm.Æ ¼Adlu^x®VyÔBçrDª€ p ;WÚtPÄŸ~ ø£ãö½ð h? |w¥éšGÄ]#VÖnµÍ[Sc±fØAfCÈ^`<µÂ ĸ¤ø#Ὴ ¿àšFÇÁÞ½Ò¾)Àºœ¶Úf£cå]+6«9/äÌdû9ßa†;8 Œý¹E~{XhºÍÇí1ðÇ–^øÉ­èº=Ö¥e¬kž6¶ç†[»&‚-¶@Jí™&H’<ó6Î:ƒ¾!ñïìáð6çà»| ñ‹|e¦^_Úé7ɧùÚ¯ÅÜ“Es=Þí‘&&ýâ¾å#8qQ@øÿáÖ½?ís„³‰¼ñçJñö¸-x¶„éªÉwCÎÙç‡MÉ>§×½+‚ð¯ÁÍ/Ã?üC㩵=W]ñ&¯³[VhÝl,į*Ú[*"ˆ;“Îç8]ÌØ®ö€?.>4x[âÏÆ/ÙÏÇ:м)ñ_ÄæI%ÒàŒÚxbÖ(ïC¡µXŠGx¾J¨U>t…Îì nUþΚn©¨þÕ?ügsá½oEѼC§øV]2ãYÓe³i‚ØÍçF<Å(|QñÂ/[isx`éZ‹höúÔòo7RË|XØ"˨ïŒç>ëû:øwÆ^OÙë7‹âžæ k·ku¨µ³Gûè®eDT“dƒà³0'$`{þß‹¿è»|@ÿÀòªøS~.ÿ¢íñÿ|=ÿʪõZ(çÿü:ø•¬øÇvš·ÆOˆ6Nµ–‘?öVƒÛ-Ng;K¹´¢$ÅÄ÷1îL/î¶ãr±=_ü)¿Ñvøÿ€>ÿåUz­å_ð¦ü]ÿEÛâþø{ÿ•T›ñwýoˆøáïþUWªÑ@Uÿ oÅßô]¾ à‡¿ùUGü)¿Ñvøÿ€>ÿåUz­å_ð¦ü]ÿEÛâþø{ÿ•T›ñwýoˆøáïþUWªÑ@Uÿ oÅßô]¾ à‡¿ùUGü)¿Ñvøÿ€>ÿåUz­å_ð¦ü]ÿEÛâþø{ÿ•UÈ|ðÄ_ü$ðGˆµÿ>=Óuí_C±Ô5 (ôÍ%·¸–Ý$–0¥–P®Ì6±$c“_BU=Y4‹{$Ó\Ak(ÙYmÎÑû°W‚§qÅy·ü)¿Ñvøÿ€>ÿåUð¦ü]ÿEÛâþø{ÿ•Uê´P•›ñwýoˆøáïþUQÿ oÅßô]¾ à‡¿ùU^«EyWü)¿Ñvøÿ€>ÿåUð¦ü]ÿEÛâþø{ÿ•Uê´P•›ñwýoˆøáïþUQÿ oÅßô]¾ à‡¿ùU^«EyWü)¿Ñvøÿ€>ÿåUr¼ñÂ>²¾Ñ>4øöþò]sGÓäŠM3@-½Î¥mms&K†i\7E(  ƒô%SÕUšÕY& |øO•#( <ÕÌœñ”8îJ sŠóoøS~.ÿ¢íñÿ|=ÿʪ?áMø»þ‹·Äüð÷ÿ*«Õh *ÿ…7âïú.ß?ðÃßüª£þß‹¿è»|@ÿÀòª½VŠò¯øS~.ÿ¢íñÿ|=ÿʪ?áMø»þ‹·Äüð÷ÿ*«Õh *ÿ…7âïú.ß?ðÃßüª£þß‹¿è»|@ÿÀòª½VŠò¯øS~.ÿ¢íñÿ|=ÿʪ?áMø»þ‹·Äüð÷ÿ*«Õh Ð-¼Wào¾ðÝÿÄ_xÏEÖ<3¬êÛk¶šd~Lö·Z\q4éᅧ¥Î§ñ'^ÖleÑ<wsouk4Ê"xæÚ†ØH;±‚pkî (óËâ×Áoˆ-ý”¾?ø¿Yð~ ž7ø™¯éðøJÊ{yk§ÚÞYÇo‹bÒcyuÆJý¬eÏ xà¶¥âÿƒ_ ,´o‰ž¼±Ôt{éb+òVê!:*À»¤ L AäWÑÞ5øßðë᮫™âÿx_º”°‹˜ìõ½fÚÎgˆ³($ޤ©dq»Ê‘ØÖß„ümáßi#TðÆ½¦xL,P^é7‘ÝBXuãb3Èã4ñ¯Œ¾øŸÇŸ¿k]CNÑ5K;›ý?ÂzÇ„õ › aK­BÂÚ[ˆÄ,Ê72Ì‘£ÊïÃN+ Sð¼sà‡_5/ë–^)ñ_ÆýÄúž“-„­w¤ivò5µ¸¹P¹#‚Ý™€ æ’qšú¾Ú«à¥ÔÉ?<,®vª'‰¬™˜ú%æ»/üBð¯€ôh5x—Gðî“q"C þ­¬HÀ²¢É#,B’9 Jðо;ñw‚~+øOñÏÃmWâÁÝjÒÕôeðöƒ«&›rŠVæ«p7ºÈpêä>èïŠ_±7Ã+ÿkõë?ê>ø“Uµ¸ð߃µ0"šÍcƒeÍÁ€3òDyÇb¾Ô5 ]"Âæúúæ++Xšyîn$Çj gv8  I<+ÇâW„u?¯‹¬üU¢]øQ•˜k°j0½‰ åùá¶`:²žx Ž¢€:Jøþ©ðCþ†Ÿˆø1±ÿä:ûsÁ¿ü%ñÚ{ ø£Eñ=¼,²èÚ„7i=Ù€<µÑÐÀðåO‚ô4ü@ÿÁÿ!ÑÿTø!ÿCOÄüØÿò}ÿE|ÿTø!ÿCOÄüØÿòðåO‚ô4ü@ÿÁÿ!×ßôPÀðåO‚ô4ü@ÿÁÿ!×Óÿ²ÿì¿á_Ù3À‡„¡ íÌï%¼ãlr`Ç$cx\«+m!€ß uÿ„ž<ý¦4GNð߈¾ |UÒô»¸n<+©èñéÛ–rÉ¢²\¬L¡Ð£ƒÔBñô¯ü-? ÿÐSÿ%åÿâkÈ|'ð_â_>7xKâGÅ›ÿ [Kàë;Ø4= q"®Ñcžyçœ+Ý®ÕWœçŽ~Š OþŸ…ÿè)ÿ’òÿñ4ÂÓð¿ý?ò^_þ&ºÊ(“ÿ…§áú 伿üMð´ü/ÿAOü——ÿ‰®²Šäÿáiø_þ‚Ÿù//ÿ]•ªÚëv^ÙKç[K´®pH<PjÝQEQEV‡£‚-LK[Y¬mVÖ!­À"HS`ÚŽ $0$ò+B©èÌϤX³Þ¦¤æË^ƪ«pvÞ¼Ýxãž(åQ@Q@Q@Q@gë‘Á%”bæÖkÈÅÕ¹À `âd(ç|ªÁY½”ç=+B©ê¬Ëj…/SO>|#Í‘T†jæ>xËwÆ9Å\¢Š(¢Š(¢Š(¢Š(¢Š(ʼGÿ'OðóþÄÏÿév…^«^Uâ?ù:‡Ÿö&x—ÿK´*õZ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ʼGÿ'OðóþÄÏÿév…^«^Uâ?ù:‡Ÿö&x—ÿK´*õZð¿þמмg¬ø[ÃÞñ—Ä}_Cu‹W_hÿl‡O”ŒùRÊΉæc’ŠY‡#WºWËðM–ÿeÛ#søJ·uøI7cÎþÒûtÞg›ß~Ï+¯;vÐc¬~ØþÒÿgÝgâü «êšu†¡¥ÛYˆõ;[¶¹ŠÝ­ä‚fdˆó&åf/# Œ¯‡iÝO_ñ™¥Éð7⮑íÔVͨj:]Š[Z‡p¦YYo‚.w1 Hà•á_·ˆ<©~ÌŸ´Fà»Hb×´íoC#–vŠ)ïÞúÅgÆÂ W$`Í}#¢ë_%Ö,SVðoÃû])§nç²ñeôÓÇá½£´ÄWp¹!K¨'°ê9oþØ'Å?ø Høeñ ƺ·…M¢êw>Óí&¶ŒÜÛ¬ñÒ]FÇ(ØåG*ÝF î¾ üvðßÇ]T»ÐâÔ´Ûý"õ´íWEÖí ¥þŸp>\ÑqA89>ë^>Òm_Ú„x+Âz‰’Iü5ö¦Ö|A.–a#J]›Z\y™Ëg;q×<{'ìóðsľñ?ÄxÖïLøëR·»º°ÐÞI,¬`·€AI$Š#ì»”\“ÀäÛ(¢Š(¢¼ÓVø±â;U½´·ø1ãRÞ ž(ï­/4%†åUˆ “SG ÀdEl• z]å_ð¹<]ÿD'âþx{ÿ–´ÂäñwýŸˆøáïþZЪÑ^Uÿ “ÅßôB~ àw‡¿ùkGü.OÑ øÿÞÿå­z­å_ð¹<]ÿD'âþx{ÿ–µßø[Y¼ñ…k¡j»›vý/T’Ýî Ãͼ²Äwm‘¸aœ€­EPEPTôedÒ,Uì“Mqa¬£ee·;GîÁ^^œqÇr³ü=$ècÚÝM}jÖ±®® 2L›×r@%ˆÁ9“@QEQEQEQEOUVkT dšóá>TŒ (óW2sÆP|ã¹(1Î*ågë’A”fæêk8ÍÕ¸@Hbæd‡ü¬ÅU½˜çhBŠ( Š( Š( Š( Š( *ñü?ÃÏû%øë àÁú5冓¤ÉªAusyvPO;49EˆGUî$äÈ ¤«Ê¼Gÿ'OðóþÄÏÿév…^«^ñgáï…~%~Ò_ ôÏøgGñV›„¼Isž·aä)(¼ÐÔHE`+¸ÝŒáˆîhÝh¬M3ÁÑ|>ºŸ ivªªé–ÖqÇl… J¡p¨q´z ÓþεþÐûwÙ¡ûw•ä}§Ëg—œìÝ×nyÇLЊ+>?iQZZÚ¦™f–¶’‰íáX$2Ht\a[$œŽy5#hÚ{½ëµ³=ò„ºc æáBíN>`#<PÊ*šèÚz=“­²½Š”µa æÝJí">>P@ UkÝE·ÒïÖîÊÂ=:Vk«Á4H!vášI20OÊ céžÔ›I]‰µw±«Eeh·:?ˆ¢¶ñ›ökÏ´ÁåÅ íììÝÀÎTô ä*Xü=¥EikjšešZÚJ'·…`@È !Ñq…l’r9äÔÂq©8;§ªkf‰„áV ¥6œZºkTÓÙ§ØÐ¢°|K.á­\Öo4åš·-| µIrŠ¥B¸æ>nÎH5vÓNÓn"Ón¢°…>Íú’ÛË{dej«Ñü¸p#ŠJ¤Ý+ûÉ^Ýlï¯àÈU©ºŽŠ’æI;u³ºOÒé„_hêË£ Óy»aVˆ2Ú)0ŽnO™É0i<9©m¡XÅ­]Ayª¤J.g·b;÷ \ õ ¹Ú!‡D²º‹U³¹Ñ,㱚ëÌdhÑÒð•F2ºãïoÈù²vqZÙÖ¿Únû4?nò¼´ùcÌòó›ºíÏ8éš4æª]Ý+níÓ¦×Ó}÷I:Š­ÝÒj×vÖÏm¯¦}û–(¬øü=¥EikjšešZÚJ'·…`@È !Ñq…l’r9äÖ.­â/é77«y-‡Ÿ| 7‚8D­(Q·l»A'‘†í‘ëZUÁiSGmq¦øVþüX«Ç§ÜC§-6b6êŠ@àtǤ¸Y¼²¹±Àºm¼W³ gûTð˹`ZI@.x=rç úŠâÿ³¼]ý¡öï³xgíÞW‘öŸ.o3ËÎvnë·<ã¦jü=âH­-mSLðšZÚJ'·…`$2Ht\a[$œŽy4ÝÑ\(ÿ„‚Ú]En¼!¦jRÞ€—76“¤Ir0ÂπX|Üc€1ÕƒÅV–1ÛK}àÛûYôÅt‰á²I#µ@6Ÿ.N] dŒ zŠïjžŒÌúE‹=êjN`Œµìjª·hýà À ׎9⹋_xU†îÅ_Mû=Ë››ˆnm„QLù»oP¬Ù yÉã=«sA²³–ËNÔ—L´±¼kâŽa¼•‘F Ó)ÆEkÑYñø{JŠÒÖÕ4Ë4µ´”Oo À!C¢ã Ù$äsÉ©FÓÝï]¬m™ï”%ÓW7 hqó 9àâ€.QT×FÓÑìlm•ìT¥«W6êWiñò‚àb£“ÃÚT¶—V¯¦Y½­Ü¦{ˆZ)4„‚]×fÈ'žhQUÿ³­´>Ýöh~ÝåyiòÇ™åç;7uÛžqÓ5^?iQZZÚ¦™f–¶’‰íáX$2Ht\a[$œŽy4¡ESmOw½v±¶g¾P—La\Ü(] IÇÌ$`烊FÓÑìlm•ìT¥«W6êWiñò‚àb€.U=U™mP¥êiçÏ„y²*ÃÍ\ÇÏqòà¸Ç8¨äðö•-¥Õ«é–okw)žâ M! —uƲÉçQêºm»L—ɤ[jû¡‡Ì‘PH±yÊÄï#8CûÀ½Ê sƒ@”V|~Ò¢´µµM2Í-m%Û° Hdè¸Â¶I9òjFÑ´÷{×kf{å tÆÍÂ…Úœ|ÀFx8  ”U5Ñ´ô{'[e{)jÂͺ•ÚD|| €8¨äðö•-¥Õ«é–okw)žâ M! —uƲÉç@Uìë_í·}š·y^GÚ|±æyyÎÍÝvçœtÍWÃÚTV–¶©¦Y¥­¤¢{xV €’VÉ'#žMhQTÛFÓÝï]¬m™ï”%ÓW7 hqó 9àâ…Ñ´ô{'[e{)jÂͺ•ÚD|| €8  ”V|žÒ¥´ºµ}2Íínå3ÜBÐ!I¤$î¸Ã6@9<ð*Çöu¯ö‡Û¾ÍÛ¼¯#í>Xó<¼çfî»sÎ:f€<ËÄòtÿ?ìLñ/þ—hUêµóþ‘ðŸÀÿ ÿjÂàßøKíÞ ñÚÿ°´¸,¾Ñ²ûCÙæyH»¶ï|g8ÜØêkè (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ʼGÿ'OðóþÄÏÿév…^«^Uâ?ù:‡Ÿö&x—ÿK´*õZ(¢€ (¢€ (¨­®a½¶ŠâÞTž PI±0eu#!G9¥u{ êöêRÔu/—WRA¦iV1H]© UQø sÀ¥]¶¹†öÚ+‹yRx%A$rÄÁ•ÔŒ†pAæ‹›hom¥·¸‰'‚T1ɪ]HÁRÆ*ZÍ)©ôå²²¶·×ÎÖµ¬­ßSƤjY[’ÊÊÚß[ë{ZÖ²·}BŠÍƒÄz]λu¢Å}š­´K<ÖŠÿ:#t$~Yôܤãr懈¼ig È¶±G&¥ª>BXZ òd.ï˜Tc³ƒ 8T…DÜvmiÝn½WRéÕ§U7NIÙµ£¾«F½SÑ®…}Æžº²Õµ[]unìVñ¢’Y˜ã•"@c‹ n.á·!‹1æ±ÓâÄzþ§q¥øfÃûSPŠ7‘„Ó$AT ûIÉRXpvžG¯<=à{›Ë¦Ôaß#2ãË3düÙÆK1Æ;E¶….^ábA<ˆ±¼¡FæU,UIê@,ÄÛ­g[–Í_íhíò×M{¶cˆä‚›7Ú²vÛ[+é­·oCjþ$”·‰5E6¸Ó´ÝÉ ´üì~fSÁäut®‡GðΕ (}Œ6̯˜«™'$?1õ=‡¥e]k×>&±ñ.áÙ_OÖ´ç6©s¨Y¸„JP0+‘†n¼ã†ÚÊWGl³%´Kpé,á‘âBŠÍŽHRI=²qêiR¯Òjž«¾–½Úk{Ý5®–óL1j’¼WÚÒ×M¦–·ºk]-æKE“¬Ûk3êCé—¶¶¶q\¿Žx 4[ „0Úwcô9”}jMÂ<Ê-í¢·Wn­m»ò5«QÓ2‹–«Ekêí}ZV[½vFµ› øKñE›Ýé7ÐjÉ+ÀÒÀû€u8#ùê# ‚kxCRÕ5}]ê¶öPI$²4O¹óâ’ ÇÊpØܸ_™»fyÛœã<â€93ã]W@*s’仂ÛCq©ð¯AÔ4¿ý£]Òà±×¦–S4‚a<®¥ò7¿c€8ƒ€Ü@ë´ý>ÛJ²†ÒÒ‚Þ%Ú‘¯@?©îIäš±Wìeí•U6£krék·{½/·ÓS_«Ïë ²¨ÔR·'»Ëvîäôæ¿Í-ôÔàôíBÿÅ…õ ?ö$?Ú“&¢u>B×f8„AãMêB‚ˆ1ò¡Î ²¿UáÈ5Km Æ-jê ÍU"Qs=¼{ß¹úàg¨UÎÑÊø–ïGðψàñ.«©^Ý\­Òé6–V[Ýb3¤GËhíò´¼ŒÊ0ÅbÇg}"yBÜÝýŽkÐÃ"•ß¿k7ÈXfÁî’A×Ý«QÕêF×JNÎéYò7h¶Ó²õwÔó0k–½WZ§5XÙ4¤ìÓQ³änÐmÅÙkÕßÞ,ÖO†¼Kkâ½>[Ë8®¢Š;‰mŠÝÛ¼-º7*H ÆGáÈ8`À.›}¡xfÚÉï_[Ô-­ö}ªõ¼³;ÆæPHÀÎ㓸äœÖñeχ¼%¦j>&±x5 Þ.-´ÈÞèG,Œ}ÐN2yëÏÊ¥É]Ýĺn3«îG•¹]h¶ÞIÙ5®šßu±Õ<[¤áR³öqPr’jé|;Í>TÖºkͺØÒÑ­µ˜5 ]õ;Û[«9nXG6†-€rXî;³úœá‚&µføA·ñF…}¤Ý¼ñÛ^DÐÈöò˜ÜèGò9¡ mô«8QæòáO.{‰‹I€»Y‰ rI$÷&·¦¥I¸ý…­ÛmݶÚע鯕´:iFT‡ØJüÎM»¶ÛZôZYßm,’¦Ú5œÖ†Öi?™æÀc$ÞI}ËŒŘœõÉÏZEÑl|;¥[iºm²YØÛ&È¡¢æI9$žI$œ“\¾­ñ æð­®è|÷WvÒ½¬6·ñ5¹’e—Êá[¹<(ù˜üœ>@ë4Ùî.´ëY®í~Åw$Hó[y‚O%È“pá°r2:â°£_ ZªöJíE4ÒÓ–Oe+[xí~‰Øæ¡‰Áâ+¯b¯%Ô’Ó’MÙ)ZÚ¸ü7¾‰Ø³EW¢z¡YþŽ´ 1-mf±µ[X„V·‰!Mƒj8$À`“È­ §£3>‘bÏzš“˜#-{ª­ÁÚ?xðuãŽx  ”QETÔô›=jÑ­¯­£º€ÿ ‹œzƒ‚yŠã–mGá»À——jž8ˆLS÷¶_1Û»²àŸl8 ÞQ@ôýBÛU²†îÒežÞUÜ’/B?¡ìAä±\6¡§Üü?½›UÒ¡iô)[}öXOyb‡¨élìtýBÛU²†îÒežÞUÜ’/B?¡ìAä±EPYúäpIe¹µšò1unDpX8™ 9Á*°Voe9ÏJЪz«2Ú¡KÔÓÏŸódU!‡š¹ž2ãäÁqŽq@(¢Š(¢Š(¢Š(¢Š(¢Šò¯ÿÉÓü<ÿ±3Ä¿ú]¡Wª×•xþNŸáçý‰ž%ÿÒí ½V€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ +ä½gá÷íÓx»Äº÷í#ÃÇ­ß›  i6öšoÚ\Z3\É´óïüÀœMrúañÖµ©Ziúíñá«ûû¹R {[ox~If‘ˆTDE–bH’M}¹EygìÿáÑüO¦üNñgü&÷ÐëMý‘® [¸°6¶ÄfqµœÜ¯Í– ЭzQEQEå^#ÿ“§øyÿbg‰ô»B¯U¯*ñü?ÃÏû[=?Äñ[?Ÿ€#L>dÀ\J 6AŽ×zšð1ØùP‡,&œ¥5¬×DÜSÚï[KHó4¬|Æc™Ë XM9N¢„Uœz&â›Ñɤқ´šM«žð޳©Æ·þ=°Òî5{[¨î¬žtßýž4ggS†b@c£Ê’¢=¼wÄߌÚ6™â‹6ÿÃI&·¡¼“i×wì5—ÊF°™8mÌ@õX‰*Ihº=cQñ…o.áðïÚ¼qqszÑL5Ž%ÓØZ#"üªƒ ¹\‘…ãf¹cÄ í/<yt;#®jËŸc¦Ü†¸¹òÙÌ9A œpsæcné|ªùìs©L>R§RÊU!Î¥o…9Ù§&ùmfÜtŠWI+™:°ÀTÂ`å*5iûÓ•hs©Ù{©Ô³‹›|œ¼­¸é®’ZÚ÷Å)Y¢Ýj¿ 5«›ÍySKÓFš–ƒRº’V‚!¹¾ÉVÉ+ù®‹¸8 ßzI÷¾ évúö…wâåÔuC­ëq/gD•2»âF܃юå*«ÝߘUÄãa 麞óåo•Â)$ôÓŸ™Úד洙Ӗf•±yŒ)âu}é(7ÈéÅ%í§´ævå¼TSæ´ß+.ø~›‹~2º¸Ö­u[–²… Ñ­%qÎT êpào’U²Ãîo4§¡jR$:uÓËwýŸÄì×yQä_. ½~`GŒW¥—Q¡ˆ¡ínÜ/6âïfäùµæÒVN×MÁî¶Lõò¬>…öÜÍÓæ©'~Væù½ç+©ÙJ×MÓoU²fÄ6ÐSC·>"ÓU±7¶êÇh×e2FÚ œdàÿx¸bÁ[KMñf¬j·ºe–§ks¨Y9K‹XåD#nï—©°ŽÊžAÌ<=®k~ø·ÿíöºúî“m¡$·×WwQ/Ùvsç8Ú œ –f+"»;`éáÓt¿J¾%ñÆŠºÙ»’ÞZ+o³’°XÐ䜰Eqûˆ@wi¡˜Î½IW§ËS™%Ê¡¿¾ž¿»£Ž’W[“†ÍªbkOJ‚Œ¹jó¤¹T/}Ió|^îŽ>ìÕÖäºÎ­¢k¿´Ü.®š¶˜‡T†H±Û6T¦ƒ†n¸Ûœ¦ï™‘»š(¯¢¡BT¥RSi¹;è­¥’IêîÒ[éè}V*2«9´Üå{¨ÛK$“Õݤ­}/ÙSÑ•“H±W²M5ò•–Üí»x!zqÇUÊÏðôK iku5õ«ZÄbº¸$É2l]É–#äMuæ…Q@Q@pp³|7Ö­ìÞ|øfýØDÓÿB—®ÝØÆÖ=2}Of-ÞUM[LƒZÓnlnWt¡Fà=È# òb[¢¹ê76RÏá­KwÛl6ò¶¬ö£ Ž$dtü‡$5uÔU=UY­P%’jÏ„ùR2€£Í\ÉÏAóŽä Ç8«•Ÿ®IvQ››©¬ã7VàI!‹™"ò³Vöcœu  (¢€ (¢€ (¢€ (¢€ (¢€<«Äòtÿ?ìLñ/þ—hUêµå^#ÿ“§øyÿbg‰ô»B¯U Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ˜?à Ï Z|'ðŽ¡â=.OiÖ1Óg>†žM}šŸcHÔíµÚP­ò±€)À5Äü>ñŸÁ‹¿øj/ö;ñ‡…õIu+dµÖ®¾ÛÙǧLeP—8‰cl9}Фö¯cý¢¼-âŒþ Ñ[á&µáñ7‡¼Oâê:ԲϔÖÂh¦Eò7bpìbdp@V”iþ‡ö´_èÿð’]| ¸´¿²íõavm·;É.û›7mÜ6îÆx ¢¨ªVÖŸªÏ•õµäÚ|ÿe¼ŽÞev¶›ËI<¹?#ì’7Úpvºž„UÚ(¢Š(¢Š+ʼGÿ'OðóþÄÏÿév…^«^Uâ?ù:‡Ÿö&x—ÿK´*õZ(¢€ (¢€ âmÓþïKrË»Lг [—‡¹?xò¿Ã^ ¡kcÆÚôžÐ%šÝYï¦aojˆ»™¥nHäàõÆ;Ô¾ðô~Ð-l)•WtοÇ!åŽp2; ó€(f²|Km¬Ýiñ&…{kax."g’î*˜ƒƒ"€rW?^FTë­Y6ÖÚÊøšöyïm_B{xÖÚÑ "d”ÞÌû°AíéÂí%ù«®hû;?{K§f´zÞ鯖·±É‰\ðT­+OKÅÙÇG­îšÚÚkv´$Òü9¥è·šÝ…Œ—:Œ¢{©bL_ÉýOÕ˜õbL~%ñ-¯…4ø¯/"º–)."¶ inó6é($('?eŠƒ£r³=´«néååBê­Ž PA#=²3ê+ÀíâøG¡O%¨Õ¢w‰å´}Ë:©ÂÊFRÀgÔ.v®3ýÛú½ò¶›O–ñNýlÖ­»ô¾ºœóýËú¦ŽJMIFðNê÷I­[wé}u¹ÃÞx«Äxךg‰dÿ„tÝêr[6xÞÞæ4c‚S'ÌY·g wƇ9…?hO\xWIÐ.ẞÕPó­mCÌJÆÅBÌÙH·äÊíÃ*º7e6­áí']Þˆì5 ÝD-³^ ›³"ï‡$ñå‘á»+Õ¾gøÏÃòëQXÎ5{Ý6ßO”ÝË•ºNgÚ¤¯ÈÈùem¬ +r8]Á| V¼°˜ª«¹M¸ÙÝsFÊûÑ]¾ÍÓë׿1¹~&XfŽ%Îrq³ºæ…”7´ º9iËtþ×^?â/‰üCgâm6Åîí¾Å.¥u¡É§ùÒLÑe_4@êÅHÚß!PxZ4o øëûlèеC©]§…´ÉbšÚÓP–ë7WS«B®-–$”?—æå¶ò2°t;sæ´¯ü+Eý—4«];B×uüA¿Ñmš-VRÓK?yf¼ØU÷ȹ#V,ʼ…^>Sð3þ Óã¯^!Ð>'þÑÅ߈®/îg{ÿÝÞ=µÍ„“s™ƒo¹ç–O±Ä¨SÍ% H±ðË‹ÅÂX…^p…F¯£)Y¤’ƒ¼¬ž²mh·²÷6XLv:œ±KR:Í^)Fri¤’„¯+'¬Û¢¯{+H“Zÿ‚”øÏã?Š“Cý›>x‹VñÆ­¥ÛÚÞêšé?bÁxšTµˆýž0’M}¦f©,ŵtÏø'ïíOñÎ=cÇ¿´6¯¡êºýÈ“TÒlu ›˜lá L¡•&Ф¯2a$!69V%>µÇ_fïë~“«Ùi2],P/‚<5¦«y2®ã½ ·÷HÌXm‘3o|ƒ³'Çþ5ñ妱¬Ûeü+»½´„´zýñÖu7·Ž\„ öX¤mä+‰T‘! £ÌsêOBŽRŸ,cK›Þ‹Òò÷µM7;jŸ¼Õî®{U1˜l>rŸ,!KóÁû·—½ªiº‰k“÷¤¯usä?…ðH/ø·íjþ<×$»Òµ³Õ#¶ŽÚÖ\+ÉÊE‰ÂåDj v¼Ò2Öø¯ÿ¡ø?àYí-´ÝoÇ7Iiuy=Åî£jD‘§È7 iêUx2+­æðn»¤i𖵤|rñæº.®-o.a²¶ðär[Ã,1(ša.š6-7d„Æà <•fûáŽCÀÚ¸“â÷ŠNº^hà°šÛÃóÛ\C¿_:JòÑäH[fJ¯3•g„©B•y:¶rçQrVRvKì§$­d÷½–Çž!àjá¨âe*ösçŒ\Õ””~ÂrJÜ©ïÍdšVùcBÿ‚^|@ð>…«Úü(ý¨uï Ú\+ê–^°’âvyˆ ×÷(0PÜ­¸Ü#Ü#à ä<+ûm~ÓŸ²^•©Y|Sð1ø¿à­ 5¼>0²„i¶T¶„ɨÅˆÊÆ2Án#[‡7»6C}×£|2øŸàkÁ®Øx›Bñιqi7é⋲¸”d¬wÖQ*F™ãæ³v!cË|‚¢Ñ~>Gá߈ɠøßK»øum©BŒ­Š-”—f_ÞmÔb‘íØÊòªå$rÊ #ñ'¼«W§ìÝT¬Ý·×ání[´’RÕ«i©ôˉ¥ìd­&Ó¶úü-Ý®^ÒIKÞi-.Îökÿ‚„| ý¨uÓáï ꆉâ–óZßBñ ²ÛÜ]G«4‘2<‘? Ç`3HÛ6®êú"Úæ[M2ÑõYm¡º+s4lV#3av¡np\áAääµñí‡ûxoãWÄÍĵFøcñF8.5Hµ 3KhìïîcÊ“O<;Z:@MÈÞàcr³y@ù/ìûûfx£áW‹<;ðö·ðÔ=¼Vvm£x“UŒNI·kÙ´rDW™×'Y÷fg£Û:‘š¡g(»jô½“Ö×¶ë¥üŽ¿¬:°¨°Ös‹jÍé{'«WkFº_ÈýC¨®nÒÚYÜ;$H]„Q´Œ@8U±ö“Ú¥¢ºí¡Øïm73|9¯[ø£B±Õ­xí¯"Y£KˆŒnõùŒƒÔ'JŠ*)©(%7wm]­wé­½.E%8ÓŠ¨ï++»Zï«¶¶ô»°QE¡¡Ç|A²–Ëì>$²‹}æ”û¤U2ÀxuÎÒxóÑAsÖº»K¨¯­!¹·Á2,‘¶Ê‘pyèióCÄO¨²DêUÑÆUà‚;Šã¼òh:†£áyËhÆâÉØ}ûv9ë´CO«8Zí*½÷Ú¼•û“çy±îóó·ËÞ¾f1ü[7c¶qž3V+?\Ž ,£6³^F.­ÈŽK!G8#åV Íì§9é@QEQEQEQEQEyWˆÿäéþØ™â_ý.ЫÕkʼGÿ'OðóþÄÏÿév…^«@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@5x³þ Ãû;xçÅZω5¿‡ŸmÖµ‹Ùµ ëŸí½F?:y\É#íK€«–bp ž•ÿ¸ý˜¿è™åTÿ䚥ûd~О >Ó¼1¤|oѼ8ñ=¶Ÿâ™ôZ¦µ§Ø†‘.HÈ’,¢%l)d]äŒ+ Àøyá‚ðøãÃW:Oí‡ãjI¨ÛIi¡ÝüU‚î=BQ*”·{|æU‘°†>¬¯zú[à§ÀO~ÎÞºðßÃÝ þýêõõ ­¾Ù=ÎéÙ#ŸtÎì2±F0>^™'>EQEËüLø›á¯ƒ¾ Ô<[âíKû'Ãö%¸»òÎTÉ*ÅĬìKÈ‹…S×Ò¸ÿ…_µ/Ão~#ŸBð†³¨jpÚµãÅu¡jJ"VU'̸‚4'.¿(9ç8À8Ëý¬~ø‡â<; økPÐì5â}/PuñÎO´âàÆi´iò¹üídè¾ øãÿ…þüCoø‚ßźuíî®xrÆ{†[@47òÏ?ÊR@VEqÈÁ^r>‚¯*ñü?ÃÏûý¤¾ÝéžÖW™ö¼§—»8ÙÛ÷cŸ»ŒwÏbŠÏS¹{KYŽ“x’M(íÙáßäîD›JðÊXò8ê}2½ê>å…º†ƒE‹’W;cùò<|ûFO\s@¾´Ã^ø‡¤i•àÓbmBtž_ F âSµ¹ìÇñí+‚ð§6«­kZ¯Ù%hïîü‚c1¶XPm.|ø°`>Mà œàŠëdÔîRÒêa¤Þ<ÊcKuxwιz&м“ó<:¡EWûLŸÚgû$ÞO•æ}¯)åîÎ6cvýØçîãóÅ`øŠO_Ñ,ÐêÚËÞÂÒý˜Û4ÑF²e·îr¥_á,yVçRR„£fº+k÷ÙÖœ©Ó”á&–‰Y7å«KïgMXšŠíüG£Ýj—®°K4gš²"ñNµwgý‡á¹vißÚßk–Ûí×R:¶ÿ/ÒŠø8Çß‘[wîý_[ÿ„ŸÃ“èºg…t[+ GŠY&œ™aؘ‰UY—wAŒ±Üxfˆ|õåžø«©øÇÄ—ÓØøvëPÓt{{«†ÓôƒZ]LgÃ#,±«‡Ê–Ü3!eܨ¹u=m´úW†üQ«ø£VÓuÝhg‘ˆ¿ÔãhÞ)"·Ì#ÈŒ±®ÔßËÆª‘{ù]z)J­ /~Kš¤cìô»”Ÿ3Œ£Êµ›MÙÞWiŸO“bpõ¨Ê¶i{I®j±‡±ÑJS“RqœyN6n2vw“rL¹ðËí4{k?Úš_‰,"ºÒdq˜#fÜJ!l¡`T•Û½X;lç‹áðýµÃùå‹ÄšìñÛÚÍÿ `Ô ”•”nØUþPW œîÆepÈÝ^«ª§‹ôiz6¡5½Üv¨Ñ^éÓÛÉ!ócÞ†1æer:òòU‡Þ´ý:ÿ\Õ¬ÛÄÞŽq§Ü 4½Eæ†IbÄ+—Fб‰êšU´Éý¡ö²Mäù^gÚòž^ìãf7oÝŽ~î1ßåšR€£‚TžÛTîcžà}GP×Ó+Þ¨ÓîX[¨hØ4X¹%s¶?Ÿ ƒÇÏ´dõÇ5ÏxøM©ø>æesšÙ®$˜ˆ¶1&Éü’JíÊnóÓ’ÖÕ=U™mP¥êiçÏ„y²*ÃÍ\ÇÏqòà¸Ç8¬½ Ä×:¿…âÕ—q,åT}ž‡32.й-ò°ÚAàÜÕg™¦KdÑßPt2ù²räòÛ· ýàùpvv(RŠÏS¹{KYŽ“x’M(íÙáßäîD›JðÊXò8ê}2½ê>å…º†ƒE‹’W;cùò<|ûFO\s@(ªk}3=’>åE–‘‹E‹b;dùòI<|›†G\sQɩܥ¥ÔÃI¼y!”Æ–êðïrô&M¡y'æ*xÏöI¼Ÿ+Ìû^SËÝœlÆíû±ÏÝÆ;犯§rö–³&ñ$šQ۳þÉ܉6•à”±äqÔ *›_L¯z£O¹an¡£`Ñbä•ÎØþ|‚>Ñ“×зÓ3Ù)ÓîT\)i´X¶!s¶OŸ$“ÇɸduÇ4rŠÏ“S¹KK©†“xòC)-Õáß:ä èL›BòOÌTðxè ´Éý¡ö²Mäù^gÚòž^ìãf7oÝŽ~î1ß1ý£¬u¿ |QÓáð·ìƒáOˆºn«ª¯ÚüIrºh“Py šYA»íßÍPMÄùFÁ_½*…4/Ýxã‚Óö.ðGÃøcÖ-&¼ñ-Ö¥£Ýµ…²JY!ŽØ,žpP|¶í}¤‚z‡í»á]kÄtýK@×|%áMCÃZÝ®¼ž!ñŒÓEm¦V@³Fcà˽ÑȬŒ®êT’µâÿ³çícñOã/Ä=#ÃÖ>xŽ(îcmFÏK·Ö Ô§´VàÛ,ÅQä† €T1šû®Š( Š( #âïÁï|kðÄ/ˆVî!iy£a¨i·-myaw|»ˆ%^Q×,3ÈÃA¹¿†Ÿ³fƒðóÆ“xÂó^ñ/ŽC$ÒÖDhØ«° 0pdbЂö5ÔÖw‡me±ðþ™m:ìžX£‘r dqÔV“m£]AâkÝMõ{©¬ç·ŽôÇTòae,K©99ýrHØZŠÎtã7.ŽëVº5Ó}özÔ¥Ž.W÷]Ö­kfµ¶êÍèîŠZÖµcáÝ*çRÔ®RÎÆÙ7Ë42IÀrIdšàu]+ÇWZ¬ºæâ+]GOÖ;:ßd0­´¾^g2;¨ Â?ˆd v"ðì¾ ŸMÿ‰”ö¶vò³]Y$hñ_FÈÊb2œ¯ÍÓ¦ ãvÖZWZjø"Çĺޙg¨k7×no^À\³—pBÆáF<qÀ* ñ1Ôªâ$ý¥ãN:Þ2jZ&î”o̯d¢ãº¾º#ç³*5±Rj¯4)C^hÉ©iù’ùÒvJŽë›]ð?ü‹ÇW¿¿g­C¶ڼ·÷ÚΠ4Ø/fÖ Ý–žÙŸRo²²$&'HÎc7ª|Ö.É^Ýû!þÎý™¾i ñré°xÏYÒäÕ¼H/g†8’TÝæº U#ß(²™@Ê’¿:~ݶÒx÷öãý›ü}§j^%y5¸uÛ­öÖ«hôË›‹T–DpEÓï  †ŒF·12šûö´ñZGðòo hímsâ\`JEZÙÉo-Ýð$Ñ—²²¹*ApB¹ Æ8\>ýÄ£ví4¤ùUô²Ýò-/woŠîç4pX\^׳QÛ´â¤Übš²KVýš|·¼­¤®îr!Ó5ÿÙïÆÞ!ŸGºÑtÿLú¼WöñÜî´1Æ,‘#9!¢·Ž“v1/!hä2y}¿‹|=coð¯RÓu]7HÓ,m-|9wxvÏ)tFÁ˜¥w±;@;‹©D,ý„W„5î]:ÿLÔ5»k}-4ËBóÙÙyQ³ˆÂ òÐ/*3£ÍjËøñ5ô¿Yø[K±²¼Ö&Ä˯º(ö;Áå1Y„±ÇÎáóPrY£ðñ”pÑÃΦ*i;{+(ß⻄\lšÒQj))'yJÇÎf|$pµ*ãjE>_b¢£}$äá“JÒ‹PII8¦å+XÉøEáïxfÓS½ðݯ†fÓl¦µ¶¼Yü öà´Kî(Vc—$•2HK=p^.ñG‡µmßÃr\] éVF}:)Ÿý'Se_ÝÍÈ&BŒ¿(Ê* ¤5¼s#xKâ¶”Úοu¥Émq°/N_.ÂÍ*9Rè…Jm²`»`»IÚðÿÄñ3O´ðô~ÓüG:\IÏ}vYZ³ü±Å†vä£ãa ¢0@—Ëf? Ë»7Ì‘ãtá©PÃÒ†+ØÆp‹’“s¦ï+ÝMê¢ä”[i­W#zŸõá(á°´iã}„'NJMÔ¦ï+Þ3–±‹”TdÚkTàÞ±n:ß <iâ½;ÅºŽ¥ä$Þ'Š9š]:ü<±Ç(- \(h×Îó«ÄQƒ,ýî¿Âý;BðíÍö©¬ ˹-l¦’ÜËä&Ò6d^Uq“î@TRÏ­¼'¨øoâUÏü"zÅ©ö„d³»¹ÓÚáPƱªí•DCà ¿»\¢ùXòéãø‹â}CQñ®•¤éz„z¶öײ%•ó™Ýa‹Í`»sµI, ‘‰×è²Ê”p4ÔjSq­(ó%Î¥«¨ôƒëU×»u«ëõy5\>[F1«I¼%8s¥Î¦®êËH5ñGÞ\ËÝæZ·{äÍgâŒ7×mö þ³Ñ5'KÈ,"—̸dtx&` ‡ ã‚©!R7ÆñêvÐ.ÿá+³Ôô5±òÞf5ŒkRÊ›cŽbàƒ#¾U€8\»ä™cìµO‰òxGNÔ4“jºÔGû"ÇVcng—nBB±(êÕ¿gs þ—§¦©.Ÿqw#¬n°°xZî,³¬{¹%' }áå’pTãÕ§Ã×EN»•i$ùï$·N'˦­/{ÚÒ±íÓËp¸˜ÕT±2–"Q‹öœÒJ×NžŠ\º{­¥kó^ÖŸ‘| ±Öµ-+Åþñ”º~µ£øq†ßL¼ˆÝ=Å«D%€Í$Ÿñð­gqN쿼t“*„8o¿àœ÷~Í_¶ÆÏÙÓSžâ 6I›RÐTÕcfu„î‹dH6<÷SÃ3”ÚÁmpÉò‘×ºÛØüý¡çÖ£kç°ñg†uCWŒ–¸/q§Ïb¶«?tùwׄ‚qµ%R·å/ÛG@‡ðP¿Ùƒâ‡†®bÓ/üa¨Ûèw±.š±Ë"-Ä6óK)q–y-u#æ@ñ¬ †È]ŸO‡j£'ïêÚnîÍ»?M4VIl}–Qƒt%/Y4åÌìäìý´I$¶¶‡é%Q]§ QEQEr? åð†Û[É=¤²Ã¸øðŽy4KW›Yñ…Ê_1÷£þídñÏÈKÄ® `ò¯“¿imsKÐÿà®ßfÖïḴŸÃ©§ÛÂÁÓȺ¸]F XKĬèÍq,L$ÆSÍVà(5ôTkZ<ÿ ›Ä-åÙøKǶ“§‘(û0ºÒ/,!_5Î$Ýun¸^~T˜Ú!^*T奇ÄSSŒÓµÒj2Ißuö¢ÚѽÖmŸ3)f4p¸ª*¤*)r¶“Q’Nû¯·Ö’nÊÜ©6Ï^Õü@—^ÄZj–‡%¸2i1[-¨ºHUã1‘*±ŒgŒà|ÅPžz–£áÿ‰¼+âg¾Ô4ÛmRâ4¿Ò5§ŽèéþqƒiÐÓmr7ç9-zÆŸ¤iZ:xkÅšçößöåÜÑÀš¦Åyw1uv¿.Œ1P»rˆ0[Vðõþ•âsÁ>µÖµ1"²FK]°ÏåmdòˆqÂa•yF¾g†ug •*(ÔŠO–þòœW4¹a½b¢œT¬Ón׳™aiÓ­V¬cV K–ïš3‚擌 äõ„`œ#>V›væåoÌ>(êÚî«ñT[ ^êþþÅå´·Ðí-ä·™!1Æé,jÊÂR%!‰_œù+"mP­/uâ}çx©ZËDñ§ÙE •Ý´!¦Ýî-ã Šw½°ÈûfÒAC}ñ3âv¡â9uM¤ÿ`ˆâ´´¹Ô—ΦhÚxÈñ.ÖÇ%]`få|{ß'Ð^OÅkvöZ¢(©ÆWmË•¤ù–‰ØúšÒœ¤ðRçu¡RJ—,TeyGÚÙÊ1œevå.Wùã¢v=_ÃZí·‹4] R¹³K;Ë»qoi;¤’F ….„vÛ(†$…$­gøsá÷… Ò4I-|;’Z¿ÛíbºŒùöòºò_q'xàIÁDÇÜ\r^³ð>ãíjÊÛPK«íÝ¥„Ï,:e¾ËJ%[–,r<Æä»LÍð›Æ·ðXÓu Û.HuÛ9žþ;׸¸eÈ_¿’¸ÝœîU‘Õ_è¨æ4'ì㌽ëËIYÖíÚ6Ú¾­%hõÑ}^6ÃTöQÌãNR÷Ó–“³§È¤åËXÞJú¸¥h¯ŠÉs?-µ‡>E¦èÓêº;øÒS ƒPy¯f{#Wiã;ø¤#à°\ƬÌÌÌÉóïü‹@þÏøYðÃ↥¨iž$ðŸ=”þW•öˆs(`7¬¨ö”ea·-Á8+öÅOøš|]ø-¥Ûü÷–zÖ¡¯ÌŸÝ³‡I»³‘ÿ µ+Eÿ¶ŸŸÇðX‹[Åöß>XK¦YAâÿK!¿Ô™ã[{ˆ„6гÈ2,j³Œ~E#!¾Ÿ‡XH¸Æ^âÙihêÞ–KMR×¢]o±Âác‹„fýšZ'd¢®Þ–KK4µ½”W[·ú3EEos Üeà•&@íhØ0 ¬U—#¸`Aˆ"¥®ÄÓWG š’ºØ(¢Šc (¢€9?ÈùâÿûsÿÑF·5Èà’Ê1sk5äbê܈à°q2s‚>U`¬ÞÊsž•ƒàT7:§Šu dgžMIíNp$C €\6?ïž‹Uf[T)zšyóálФ0óW1óÆ\|ƒ¸.1Î(åQ@Q@Q@Q@Q@Uâ?ù:‡Ÿö&x—ÿK´*õZò¯ÿÉÓü<ÿ±3Ä¿ú]¡WªÐEPEPEPEPEPEPEPEPEPEPEPEPEPÂßÿe¯Ú+âÆÍOźžµðÇÆÞ´¿–_ xoÆQ’ËL‡{y.ÖÐã’}…C<žg9ÁëÞ·ý¬bñ&Œ¾!¸ø/ÿÚÝÂ5Òmµeºû.ñæˆ7¾Á&ÍÛw ¹Æx¯¢è Š( Š( Š( ¼«Äòtÿ?ìLñ/þ—hUêµå^#ÿ“§øyÿbg‰ô»B U¢Š(¬OÚÅyá b9—z Y$$|Ê7)ãЀknŠÉðßÛ¼1¤ÎfûC½¬{ä߸— dúäû浫‘ø`dƒÃ’éÒª‰tÛ¹­Ѳ®Cn$p0>l~…uÔQEQEùÓÿˆðF¡ÿ ·Áÿ´k}WL×<âuH5-&M«7FÆöGEߥŭ¬(å—ÉtÇÓž(üUý›õ?hzýØÖltÿxzÃXEöImÄ…¤³!A–ƒòÊ~ñÜÏ¿û@ü$²øûðKâ€e¼¼Õí^PžX­í/Ö¥´;£„i*ÛÊB†–6J×ÇðK¯èÿ¾^üñÅ„úo‰¾jW3&4g,öÓË)“ÍˆÉæ4°ÜÉ*¹žX{uÎ]Ãqâ£QÞŒT§““Š»Ó['¥›èüµÔóñ°ªéª˜x©Tœœcw¦­'¢M¿…ùk©÷„o>(ø.mfÛ^ƒû+]·‹Qðæ¡ej{;y­Ô£ä“ó‘†Tƒ†bw—7|BÔ<#톣áØ/|?¨Zìõ–qÐWeÄêTáÄd)ì¬À±Ê­/ }šïà îâ}P‡G³²ŽO´[BŠ×(ʳ«Ä±“Ê3 ³pvîr˜©ÑøÏÅþ!ð¿†uIµ3A¹„ÞÛÙ[¤×žTwðÈK•pB“—á› 7¸GºJ^ {«¿_]ø…5K=KÄúx{]=tK h”G‘[jÈZBA+Ôùm7—_]J¦i+Õr狇,áeÏ™ZNÞòsK•/y§¿-ÏÏñ•\æ|Õ¥/iJJ0Nei;.têF*^óOâä»yß¼gá¿øðÝŒúck:­Í­‚ß3\D.˜'ÎhÉ1©%ÚpøçæÈdð—§ñV•­jÿ,ÒݧHຶ™b†66Û€»2 §—;°Fã“"§9“®øj{O k:®¯ ÙÙ\ÞØx~ÖÞK§šHgÊÈ×  måŽ8*Û<•iOÄ‹Ùþ:Ûi:±½ðΜºyŽÖÂí£Û{;²X®åç¸sóG€AvCÃ…­IÆ…<Á4 ãMC—–Ó›’ølµåM©4ÚqÕ_ÎÁb(¸á¨æ‰¥JŸ'->yÆÒs_ —½Ê›Œš“N êø¾0ø™á›­wE6¿<ºU„PÅ>…l°CeuØB¤ÊU~D*òöÊéµàKWñ‰×]×4-íì®ï´Ø5ûˆžÎãi•$HœwfxÀ'pùÔÁ„¾}¦ü.¶ñDóÚÜøGP´ºº½¹„júxH­­Ižq–‡ÎuÄFßfÕ`6ÈG,"y=§âžð·€mÛÄÖw^ ÓlÝG›Ú&y€²; žw3qSÛI—}{êæÆ¡N6½åÖªüÉÙE(ü)¯åi·u”ÿibÝ|×(Ó¥ NÞòƒ”lÒ’š“ŠŠŒu‚kùnWá¼5à‹‹ GÅÚþák/J±LtíKV¸ýÁe‘„@ìŠ2«ÜíÜv™cm«Ô|,øá¥ðW‡4Óâ;Y¯cÓw:\H±¼b%b°Â…3ŒòU e€f¨¼cñ*ïO×|24 ¸5Hõ«BÖúLV…î$ß´¥É%Ólj»Ž®v°'¼<¿—û?ü¼ÖcÔtûßk„Ûø|»²C-ÝÊ(·D€Ÿ"Í3b‰ÝÁXr=\V¨åöpŠ—´›IE_–wJ0¼“¶±æI+»%o.‚ÁcÕ ®ÎRö³’J+™ÆwЧ(ÂòNÚÇ™F1mò¥Ì߆×Ö6Ÿ¼}â/Ûj1Ñb³Ñtduºó¤·»–âòòð)•¾@!¾°gB™1µ¤&üTñ=í=ÿeøWá˜Äqh^‰n.`‘|¨á¾¶_ –3¸$r2ØÅ#2£¶Ð‡ikìo‹zõ§ìwû(^jÚ,ö°Zø>ÆÿLØêSJ» fÝO ß3ù¦vb 2/ÊðJÙþóÅÖ¾"ý£|o<÷>+ñ^¯s.s ˆ<ØÄ²É™ap»f¹,¦3û'ŽR§ê¨ÓÄPjíËÅZÉF÷ÕÅÝÉY^éߥž÷ûjqXi*t’åŒ`¹l”/}\nJÉ;ÆIï=ïú) øsKð½›Úi60iöÏ+ÎÑ@›Av9'ùè4«“Ô<]~þ6µÐ47í>NÉõ;‹¡$I¯´ÄÛJ»nQߟº3‰.²»pÕ(IJeË¢²Ó¢é¦ÎÛ=ül<ã*XUhÓ|º+$ÖétÓgmšh(¢Šì=¢ŠÆñŽ 4¿ ê·&f–ÝÕ$LîWaµ0G î#žÔ•ðÞQue­]ÆÛÝj·C#)Q"¸ažÜõº-UY­P%’jÏ„ùR2€£Í\ÉÏAóŽä Ç8ª^ÓÆ—á]*ØBÐ2Û£AäÄñÚ¬ë’A”fæêk8ÍÕ¸@Hbæd‡ü¬ÅU½˜çhBŠ( Š( Š( Š( Š( *ñü?ÃÏûO”*˜ˆÝºžò›R©¥Ó|¾ç-œcÌä’qNQõÔî4i~"ðêkpOäYyBi~Õû¦·þð»òÙèT†©ó=Ö<5¬x×ÄÒèIã*Žth#GhbÞ¦I>lgÌöípq]¯xÛÁê®—/}©ÞË{sy4h’9f%Tí`}²Ì@PØ©¢ŸéçÅ"¹{¹ôK{¨ ƒDŠH [FpQ<€Årªª2p cqo,H D±•0j˜Å^/´šš÷ÛNÊï–Í6­Ì·f*Y…liã!óB\í¤ãš÷Û‹´o.K4Ú·:JïÊÖ«ðþGTøm%ÔÞ{ß²\éz¼²I òÜ*ˆÒ=”:2(,rA*ÄI劻¤øBïÄv¾?ÔµÑâ}WS±»–}3Î0Îcò¦ »”ùM•¹fÙ ò«,»=CÇ^økñCÄZæ‡qwua&™=þµi ò­à˜|ûžI|¢ ;·+g(gÚ”~,~кÿŒ|>Ÿð§ín5‹dnî¼Mm>Ÿ`UÐåæÛå] ]ÙŽÖG,q½¢‹s·Áað”'Jµj³r%ì๩§i.h}•º“Nü­;­­ù–†©B½zÕ%(aÜ—³‚礤¹á¯"ÝIÆWPi¦¶k›ø¥¦èÿ Ö wWÔuý{Åv’YÌö7,mæÔ¦’LÇom(-™V8d ‰vª¤’ùŠ–òºgÃ]F÷Ã>×òøð§Â·¿ ´¦êšóXÚÅmeœš´™°ŠÒLÁm•l«· ß6u–ã€ýŒgßþÉ -ô¯iÖVÿtû#©ø‡ÄqÛJc‘§‘‚D“6Cyh% €OšPny…{ŸÅoZx§ÀŸmÒ…ì—6;õM4hSóg`Yd¯–mû—ç?6Ó–!¾¯ÉŠ”±1Q«q—îï«nÊí[F­8¤âüšw·Ûæ^Ï)báV(Íû+»É»'&­xÉrÎ)8Ëɦݷ®ßë>.ÒídÓ¹¸ÂÕ‹^ÄéºV’ eŸsp–lõ߇^Ð5†:M„±Ï­h¯/ÛìâÕí•d.ŠTœdå¹¹±”`µÑ„ÌkâegfçOšÏݳNÉÛYrÊï[Ëemάm‰ÆJŸ²´J\ö—¹ÊÓI>[J\³»ÖòøU´•ÏA·¹†î2ðJ“ vŒ´lV*Ë‘Ü0 ŽÄRÖnƒáÍ/Âöoi¤ØÁ§Û<¯;EmØäŸä  Ò¯¤¦æà½ªJ]mª¿–‹ò>¶‹¨éÅÖIJÚÙÝ_É´¾A\wÄ©öÃOС8ŸUºHŽ#g+Îã|§i9ퟨìk‰ð¢¯‰¼Y«ø‚FŽX­\éöAJ¸U^YÁÇñnÈ ôv1ZµW¾ûW’¿cò|ï6=Þ~vù{×ÌÆ?‹fìvÎ3ÆjÅgë‘Á%”bæÖkÈÅÕ¹À `âd(ç|ªÁY½”ç=(BŠ( Š( Š( Š( Š( *ñü?ÃÏûjBâ…!µ+ÂMÏ$‘NÆVfBS :(§ %JœçÊ)¸ìû]YÛäe:ªN'åÙõWVvõGÑÞ"ý“ü¬è÷~ŸªxÃÃq¾ß%4¯_›[m¬즖K=¹u eç ‚9Ë/‡Ö—>ž|HøæZ]¶—l5Ÿ1¡“8‰¤þÈû#K¹J¹óYŽÒ[qM²5/ø'çÅm U²KßÛgÆÖz†¨âÖÜÈ—«$åw2¦´²@,qž2à\Zoø%oÅ+»›Å¸ý«¼S,—;Ù]3M6_,êoðH Ãd“½øÅæW…IÕs¸ó¤âïéxÞË™Z÷µ×Å×CÇÅS©R³©ƒ”=¢N2¾½9¡ÌÒæV½Ò¼~'¾‡¦ÝÙüøwáÖÔ¼{ðçE¼¸† måñÇŒQ\ß_¦õ1%î ævr±¹Iæå¬+‚“|Bÿ‚ªøGàÔÚƒïeø‰qi}{kq¥óz·«mÛägEá°ÿÚ/hI4“J/šÉÙŸ?W0ÆñejTéBt©7+''Nî)I]«ó>hJ.)IFæiK–F>Õ.<¨x·V½Û§ê±‹ç[O3U}=£."ÄÁ~û |ª» ˜<…ôûOÅ¥ø¥tkÙ¬¬t£¥%匷·Ž/$UÌ2¤ 2áFNó»åc–ùÄ|Ÿ„õ/M¦jßðˆi]†…evº^•§jM „Mtä…fÎNå?6C.•Žâ}Sf—ãý'Ã×ÚSE%œÚ¤sywùXP@!ž^8Û–@@]‰æw`?Ù¡ a¯$¯'8ɧ$ï=Ô%w$ùU¾'¿)ée—ÂBœð1Ÿ4”o)FR„šrR¼õjmÍ>Uˤå¿)Ø\ǤüJðl±Áxóé:­¹Asg)ŠžPAÈ*ñV‘RxC^²ñŽ%°KÔ··–K?ø˜E"JLLP’dù›§RIÎCaƒxC\ÓõíI¥ÚÏggm,–iÖ­o³Êb˜T a~^1Ó¡Q·_oB>ÕÃEÞ6m-ú«;è“oMwßCôl4}»§ŒŒ£.h%&—ÅÕYßD›–Žûï¡“m£]AâkÝMõ{©¬ç·ŽôÇTòae,K©99ýrHØZ²tmëLÔ5{‹^ëQŠöàM ¼êm`]‰€23ùq»s6µtaãËî¸Ý·fïÕù½ét½¬¶:°±åƒ÷\näìÝ÷o]Ý“Ý$ôNÖ[>6פðþ,ÖêÏ}3 {TEÜÍ+p00rG'®1Þ¬xSDÿ„sÃÖ:q}ï |휂ä–lp8É8ã¦+œÓˆñÇŒ´ö«èú;<IJ0–ãÎ0ÊÒz…#¸ÍtaTõVeµB—©§Ÿ>æÈªC5s´ÐW…|Y²ñUÿí%ðÞ?k:>‡© x‘¤¸Öô‰u(Z/¶hyAw6ä6â‡vòm9{­yWˆÿäéþØ™â_ý.ШºÓ-ì1‚uÃll0 ‚> €}8ç5ÏøSZ»²Õ.<7¬Ü,×ÖêÖéV»ˆ‚sÏV\sÉÎ]¤‰¢Ô Þ•¹¶ê¨6ìLM·“!ó?x3ƒ³Ž2zбjì‹\ÛE"è vVÛÁŒùŸ»ÉÁßÇjåÏØ%ìâ¶ÕášûíÃojí ò¡"-ž`ÝòÄ«ºBp9±²ëûCØ|¬y>Ió<Ìýíû±·mÛœó»µßjó®þÑäù>hû7•Þ^ÅÎüÿýý8ÆÞù«Ÿ¨´µW¼³k¥”‰ÑÂINUÍ%ù‹0àü¼àHÑjïJÜÛuÔv&&ÛÉùŸ¼ÁÀÙÇ=jåMbÔÙ¹¶(ŠEÐì ­·ƒó?v3“ƒ¿Ž2:ÔrAª›K¥KË5ºiI·‘­¤qäa]|Ð]±Ÿ˜2ŽGËÆ…J[9gÔášSm%¬+º(ÞÜ™c›•Þ²nÀ—só›ámK_×4Hf¿µ]ú+Ù"ž;›^&…$` *ÌÛ .ߘ³ ‚@e*Ǧ¢²p|êJVZÝi®Öo®–üuè`é¿h§Ykue«ÒÍ»_Kt}uÙÉcuúœÉgÚpð•µ!–@KJCþ÷î ØB¨<ç7> ¾¸øã§jÚ–™«eýž’&¢"“e¬ñ Ó•L³‡+s£"I+Õè®<^–1SUÁ%%¢ÝwMy¿4õZœ8춆aqª¾ ©­WWÝ4Ö·~iêÑ庾â /‰iy…t›³tÞMŸ‰-­ó-¢²ÿhˆÈ¥ÈX‡ ¸ ’þ]swâßxFÔl<_£ÝŪ*}¢ûXBŽÓÜÄr¤Œ78x2T*Gé_|þ2ÒPZÜý›S´ó$´33vv‰c¤1ƒÔ‚K£ðÞÑüEៀ·–CMºþÞ±yÚÚÖæÚʺÌYZ$ 7Ãz–,w Êv+|†; Zž"´"¦“ŒçÅÚÏÝÓ–*7z4œ›v²¾º|eƒÄRÅâ)Æ5p©R5 íi{—– nÍ'7)ZËšÏN§Jñn³yg&±%î/…!´KÓ¬ÛC+4ê¥ÌÈ ÞZ6UP9f*W£+Ž'Õ´ïY·ˆaÓþÙ(mÕ¡óm!Ú»ƒeùc†I`FB¤ž%ðd7r]ë5®Ÿeâ߳ɮ©qn£2…Ëc©Ú¡CÛA<YZïŸ¯Å®é¶æÖÊãJkG7·Ë#Fâq·hHŽï”üÜ=òÃhzT0µisC)Í·ñ'+5'%ªOÝjúÙr¤¢ÓV²ö0Ø*Ôy©ãå:»sFS´”œ–±OÝk™¹Y(Å(É4Õ–Wƒµ/^ëúå®±b–šFžëmeq*†žû™‹) ‚0p¨/· £ ­â]Rþù ð´0Ýk-ôö¶Åc‚Üçsgm§iŽyÆ -lx«Å_ØžM•”?nÖ®ø¶´_ý ý`úg ‡øSÃrhQ\\^\µî­zÂK»‚~RFpª;*äÇä0¿B”¨ÓP”Üžº»_VßD¶Ûä}>Œ°ô•9Ôsi½]¯«m-Z-›-u'Òô{ÂK+Ií’Ú8V;0mŽèØ/ÌÒàI–ù¾Pùç5mbÔÙ¹¶(ŠEÐì ­·ƒó?v3“ƒ¿Ž2:ÕÊ+ ê3äƒU6—J—–ktÒ“o#Z9HãȺù »c?0e—ŒúæøÞ9.u±éÆ[t l&3›„Ø ˆØÄª2ìèÇ,lU{ïµy+ö?'ÎócÝçço—½|Ìcø¶nÇlãbÌ8?/84Z{Ò·6Á@µ݉‰¶òd>gïpp6qÆOZ¹ESXµöE®mŠ"‘t»+màÆ|ÏÝŒäàï㌎µj¦ÒéRòÍnšRmäkG)yW_4lgæ £‘òñƒ¡EWÙuý¡¿Î‡ì>V<Ÿ$ùžf~öýØÛŽ6íÎyÝګǪ--Uï,ÚéeâE´p’G“•EóIFÆ>bÌ8?/8P6‹P/zVæØ#¨ Û±16ÞL‡ÌýàÎÎ8ÉëBŨ²-slQ‹ -Ø[o3æ~ìg'du«”P|j¦ÒéRòÍnšRmäkG)yW_4lgæ £‘òñƒce×ö†ÿ:°ùXò|“æy™ûÛ÷cn8Û·9çwj±E|ÿ¤i¾8ÓÿjÂeâëÛüâ/²ah3éžV/´=þg›{sæg)ŒlÛµ³»pÛôyWˆÿäéþØ™â_ý.ЫÕh¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯*ñü?ÃÏû³ñ-¼)sæE,$†æÙ,Lå[·OåÜ5¨ ;Aׯ4J?ø‚O2WâÇR<-ÒöV=œp9ëîH-ØÖv½ Ùø“M’Æú?2'ä0á‘»2žÄõŽA"¹v¾×<ÍöÑ6½ †v[”îàÜ<Ìà0Ïã‘ÂÐS¦G^êÆY­äk¥3I(!g& 2y]¡WŒrîN…dø{T‡Z†êö×Q]BÒY¿r=†AŒ÷'pgÉáÇ`+Z€ (¢€ (¢€ (¢€ +'Yñ-®…¨iw]<ºÁ¶… ·yX!l¹ 0¿ÌýÕbºÕœjBr”bîã£òÒÿ“1…ju%(BI¸»5Ù´ž¿&˜W³=ýµ¯‡<*³h7Ö6¶7%um>WŽ;V80î$~ð*y9Ã(`Áš>Þææ+in.%H ‰ ’K+TP2X“Àsš§§ÃößÛE5÷öjª÷ÖÍåyù@ ˆPü»º‚§Œðk E9V³„­ßtíg³M8»õ×mŒ1T§ˆ‡²„ù{îškFšqwÕK]¶Tñ—¢ÞiÖ—÷ÐZ\ê2˜-b•ðe|gôVQÕ€8¿|?¥êþ¸»¿ðçü$ÓØE,–öqñ+B¬²È9ã'* ‚Ê´\h7~ð¶§ør ^m:Xc‹ûZäîŽ<ì’@ûN#8à €#kzæ½{¡ëvlÜO=6€ü5\±çC‹—E$œ¼Úq—,•ïd’³hó+¹b¨ÔÃc!ñ(«(9¤åæÓŒùd›o•$¬ä64‡NµH­?³ãX‘VÓ <€Âa Q·§ÊHナâ|a}©Éã; mU¸kñk$SiáPÚÄ©ÊJ“¸Àÿw¬¹¾$½›Ç·Zeî™ö½'OÑîMá×'œÁP²+Ÿ,$\ÉéʶÕfÏWðúËIð_i7cSŽüyòj$åÏ##iäƒÎk®Ñœ½…K+YÆÒÕ¥mZVÑ=-ª}w±ÝhÔŸÕªÙrÙÅ)YµjÒµ’–jž—ÞÅ xBÛí-ÃO6¡©Nª&½ºmÒ0 Eã§'¦IÀÆõWqéQ@gë‘Á%”bæÖkÈÅÕ¹À `âd(ç|ªÁY½”ç=+B©ê¬Ëj…/SO>|#Í‘T†jæ>xËwÆ9Å\¢Š(¢Š(¢Š(¢Š(¢Š(ʼGÿ'OðóþÄÏÿév…^«^Uâ?ù:‡Ÿö&x—ÿK´*õZ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ʼGÿ'OðóþÄÏÿév…^«^Uâ?ù:‡Ÿö&x—ÿK´*õZ(¢€ (¢€ (¢€ (¢€ (¢€8ëß íZûP±i¼=¨,ÀGwm tºR±±g¦7n]¼d®ãœÔKâ½wÃ(ÑøƒH’ö(зö†”»Õ‚ªäºœmþ"IÚ8à`fºm2H÷VÝMq"Ý(š9I+ù1‰‘Âí*Üg—op4(;Fñâs6wҼᗒå<Œàã#šÑ®oXø¢ëèÛµöàâîÍÌR+Ý»Ž gøˆ'ôªQè^+Ñœ.­Ûêvß8jÈÛÈù×,ç¨äíÓÇEãnÃÊ][·ƒr¬Ó™nrãùGÝ'«Ç“Oôx%hµ¯´yB†T¾µeg# .î8ïç@uEqs ¤aç•!Bëi(,ÌW'¹bɹøZ~ÿ §þKËÿÄÖv½ãø¢Í-5i`Ô-’TbžÖVÔä»õÔA çQÍAû$œº_E=äcYÔTäè¤åm.ì¯æÒnß#½¬ßϪ[hWÒè¶°^j©h.$ØŽý?Ó#= .w 9~*xwh×3_NÌ-ííßÌ’ ¸ž}h>6Ôï%Xôß êR¶ÒÎo±j qŒÈ'žœ;ó‚¤\àâ›W[­×šßRªÁÔ§()8Ý5uºóWººétÍÍGG·ñ.…&Ÿ­YA<7Q¹¶]3Á![ x<†Âž5É|BÒçÕ>¦š·vžAÄlw"À2A¡ˆPT` àȼ±ø×WØ^m?@˜ˆ×Ïœ)ÎQ³Ç Ã¥cøW@±Õuï2îÇR×-†Ÿosm­êr·œH•HÉÜ89ÃG9Ûò—âÅP¡V•eüEÈÚNíYéu²ß²¿©çc0ØZÔÝBoÚ®FÒ|ÍY»9E]-ßD›ó2®ôsãKOûËP{=BÊ=:{ýOP¸X(Ì€l]Û˜“Œ±'«Q½ËlxwÃZ2ø¢ãIÔ¤ÔuýfÂÒ)ZçRŠF·òܸP¬Ù zçqlJò®ÐnZd¶•­Ñ%œ!1¤®QY±À, g¾= sš*ø¶òçD¼ÔßOÓàûGM…VûA+´¤™Àg#9“!×)S†¬V›zÚ=/­ÝÕµ—7Wd완éSÁÖ‚ÂÒ³“÷š†ño[Êé/z\Û·e+Eœ¦ƒuy©é±xwQñ.¯ ø’}J{ØôÛ¹m£¹'h ì*;¯´4+´úuµ´6VÑ[ÛÄAãŠ% ¨ `(€ã“¤iº¤zƧwªÜY]Æe+¦˜m¶Ko*oFbNrÈ ÇR¹ÎTÛ¥—a¥B©v׺›ÞÑÓ]Z»wwVºµÕв¬$°ÔïU·%î§/‹–:+ûÒWnîê×N7WAEW®{¡EPTõUfµ@–I¨>åHÊ5s'hû7•Þ^ÅÎüÿýý8ÆÞù«Ÿ¦G^êÆY­äk¥3I(!g& 2y]¡WŒrîN…QEQEQEQEdÛ[k+âkÙç½µ} íã[kD€‰’P[{3îÁc·§ ´—½§ý«û>ÛíÞOÛ¼¥óþÏŸ/ÌÀݳ<íÎqžqV+?ÃÑÁ¦%­¬Ö6«kŠÖà$)°mG’ ’y:jši6îÛÕ·»¿^–ÉÒ¤©&“ní½[{»õÙ.‹d´F…QZVMÍβ¾&²‚ +WОÞF¹»yÈ™%v*¦ÜF{úò»@|êTTÒm7v–‰½ÝºtîöHÆ­UI&Ówih›ÝÛ¦Éu{%«5¨¢ŠÐØ(¢Š*½÷Ú¼•û“çy±îóó·ËÞ¾f1ü[7c¶qž3V+?\Ž ,£6³^F.­ÈŽK!G8#åV Íì§9é@QEQEQEQEQEyWˆÿäéþØ™â_ý.ЫÕkʼGÿ'OðóþÄÏÿév…^«@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@yWˆÿäéþØ™â_ý.ЫÕkʼGÿ'OðóþÄÏÿév…@«EPEPEPEPEP;fºÔ^¥Ð€±*¨6ÃÊOݶ9$œ¿<âAØ ¹TìU–ëP-d– Î ʬ¤Ü)?xØärœóˆÇb*åQEQEQEQEOFf}"Åžõ5'0FZö5U[ƒ´~ðàëÇñW*žŒ¬šEн’i® Œ5”l¬¶çhýØ+Á ÓŽ8â€.QEQEQEQEU=U™mP¥êiçÏ„y²*ÃÍ\ÇÏqòà¸Ç8«•OUVkT dšóá>TŒ (óW2sÆP|ã¹(1Î(åQ@Q@Q@Q@Q@Uâ?ù:‡Ÿö&x—ÿK´*õZò¯ÿÉÓü<ÿ±3Ä¿ú]¡WªÐEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP—~Ô_o~þο|]¥Ü =[JÑ.f±¸(®"¹(VÚÀ«bFC‚8Á¼¯ö{ÔµÿøÏNyjÝ3ât–14š¯„ôí;E˜ÆT†{eóQRF#)ƒÔŠì¼wð<ðÆ1xkÃú—Å‹»ØíÞO xãÄwzµ½òE.æŽ?¶É*ÆÛK0Ì‘†èò¿}»öƒø½ðbãÂ? |SàðV²5MOÄ>"ц’-¬V ôørs0•Tˆò€.sŽ€cוxþNŸáçý‰ž%ÿÒí ½V¸¯|ð×Ä­WIÔõ‘¬A©iPÜ[Z^hšõþ“2E;BÓF^Òx‹«5¼'k3#ÚÑ^Uÿ Óáú ü@ÿÃâþN£þ§Â?ôøÿ‡Ä?ü@«EyWü3O„è/ñÿ?ˆù:øfŸÿÐ_âþÿòuz­å_ðÍ>ÿ ¿Äü8þ!ÿäê?áš|#ÿAˆøqüCÿÉÔê´W•Ã4øGþ‚ÿ?ðãø‡ÿ“¨ÿ†iðýþ áÇñÿ'PªÑ^Uÿ Óáú ü@ÿÃâþN£þ§Â?ôøÿ‡Ä?ü@o„ÿ ¿Äü8þ!ÿäêõZ+Ê¿áš|#ÿAˆøqüCÿÉÔÃ4øGþ‚ÿ?ðãø‡ÿ“¨Õh¯*ÿ†iðýþ áÇñÿ'Qÿ Óáú ü@ÿÃâþN U®_ágЬ|uðÇÂ$Ó óiºÎg¨ÚL©º1K HžvÒG™µ†ì3œ\—ü3O„è/ñÿ?ˆù:ªi?²Ÿ€ô *ËLÓ.üq§i¶P¥µ­§Ä/E "…HÑøUPP(Ø(¯*ÿ†iðýþ áÇñÿ'Qÿ Óáú ü@ÿÃâþN U¢¼«þ§Â?ôøÿ‡Ä?üGü3O„è/ñÿ?ˆù:€=VŠò¯øfŸÿÐ_âþÿòuðÍ>ÿ ¿Äü8þ!ÿäêõZ+Ê¿áš|#ÿAˆøqüCÿÉÔÃ4øGþ‚ÿ?ðãø‡ÿ“¨Õk—øâ«x~ÒÿP7Ëo6±¥iÊtò¾g›u¨[ÛEÄ/Ì™<Îû7à€y/øfŸÿÐ_âþÿòuTÔÿe?ëVÉo¨]øâþÝ&†åb¹ø…â eŠE–)kâ$ˆŽ­ÕYTŒ {å_ðÍ>ÿ ¿Äü8þ!ÿäê?áš|#ÿAˆøqüCÿÉÔê´W•Ã4øGþ‚ÿ?ðãø‡ÿ“¨ÿ†iðýþ áÇñÿ'PªÑ^Uÿ Óáú ü@ÿÃâþN£þ§Â?ôøÿ‡Ä?ü@«EyWü3O„è/ñÿ?ˆù:øfŸÿÐ_âþÿòuz­å_ðÍ>ÿ ¿Äü8þ!ÿäê?áš|#ÿAˆøqüCÿÉÔxþNŸáçý‰ž%ÿÒí ½V¼ÿÁßü)ào'‰,ĺÔvSiñ\ë¾'Ôõo& ^)%HÖîâUMÍo %@'Ë^q^@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@UM[V±Ð4«ÝOS½·Ó´Û(^æêòîUŠ"E,ò;±UTXš·EpƒÅÖ|©Íð¿â‹,þhµÄ:;A¬Ai2”wBªû ìaò“ÆõltÏÃ~ñï‹þ~Äßµ.±‰nuOiŸõ}(x‰ãÍ$Ïqggö«Äm‡Üð˜à ý¢¾)ñ¯Á½ öEøð]ð —Ú|úï‰àðˆÄ—³L5Èîmå"{•w`Ò¬ï1‚Þ€ ûZ€ (¢€ (¢€ (¢€ (®SþÇÿá;ÿ„'þ/ÿÂgÿBçö¤Ú?ê¼ïø÷ßæªýçÝû¿7Nh«¢¿2¼%ðïáuŸ„½¢Š(¢Š(¢Š(¢Š(¢Šøßö´ð¿ÄÿÚKáöŸâ?„þ ø£á#ÃZ•гÒáD·ût÷È‚Iæš”ˆàvÁ“w# s@dQ^û$Mð²Ó¾$ÐþxRçÀO¥êÍ»áB Ý•éeS$ŠCF±•tvF‚pkÝ袊(¢Š(¢Š(¢Šä>)xgÅ>.ð»iÞñ‰ð.¨ò‚Ú²é‘߸k«„(l•;Žq·æ€:ú+ókÀ>(Öçÿ‚s~ÏÞ´Öo´Ù¾ xÆÛÖ©i3%ж¹ÔîÞ଀åYÖ6Rs“¼ŽõíO€´oÙöÅøká¯E>‹áhz´Z†€—2Íj.¬–)£ºUvm²‘°ûîIÍ}{EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPMtYQ‘Ô:0Ã+ ‚= :ŠŠÞÖD)1„ä¬jg׊ù£Ãß²%Î¥ðsã¿€<]¨Yý—â‹u­zÎçMg”ÚCu"IlÎS÷±¼jÅA+ÀŽkéÊ(æ}àoÅoøëáÆ¥ñg\ðµÎà)›Pµ‡Ã«rfÕõ †+›4(‹`g}‰»,zãôÅPEPEPEPUßO¶yÌþDbàŒyÁ@~˜ûÝzUŠ(åOüý üWðóYø[©øçÂ:Ÿ„uh§Ó®|aympuÖÓå$25ºMå±ÌÞ9Ûžké xrËÁþÒ49Y4ý*Îes–DÜáEjQ@Q@Q@Q@Q@YûH|Ÿãø´­7TMÄšN§i®èz¤±RÖþÖQ$LèܧæSè‘’+”ð/Á¿øƒã†Ÿñ;â÷‡M¤èz7…ÍÄ–ð´î¦âêI&Ub쨨.÷$f½úŠ(¢Š(¢Š(¢Š(¢Š+Ⱦ(xcâä>;³ñ/ÃhWO67¾ñPš;&9tº†h%ÁØÊU”¨5ë´PŽ~Ï¿µ¯‡:§Ž|]ã ZÇWñ×õoµWÒah¬­’D6öð‡%ÙQùÛ‰è;ûPEPEPEPEPÉ^ý¼A§þÅþøW¯iº|!}µ¥ëv"K‹;}Bé.`|2ÆÌ…_ceA˜Œàg·ð/Á¿øƒã†Ÿñ;â÷‡M¤èz7…ÍÄ–ð´î¦âêI&Ub쨨.÷$f½úŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯*ý¬äÖ>2Ø™¬ÿé ÕòÁÏþ×|/‰n>É¡X¶¦/5ˆÒqtmÐÍæ)”a÷îÈÇ4ú)ExoÄŽþ>Òþ"êÞð/Á½WÆH´ŽêóZÔõÑ´éÔ2Åm<‘¸À?60‚ ÇEûuiþ$øwð—Yðƒ®õß|K–ò A¼Ôa°Ž7³,·^mËîP”…Ú¤¾Fx ¨è¯‰j¯Ú'â·ì¥ñRƒÀº·Ãè:¾—gstÚ¦aó]C‰ìnÒ-·!‰X]@B‚W$åv7ÙšÅýÞ‹§ÏªÙçj’ÛÆ÷vv÷â8&* Æ’•C"«dÚ¹;Fq@¨¯Î¯Øëã ìÇÿþø3¯Øx9üCwã/¾‘yo§Î°\K<÷×P¬ã*D²,vÑF” µFõ5îÐþÖ~=?/¾MðVá> ®™¹eiˆà}>]<ÈÑ´ó]y`ÄVEìXä%|Ôôýùéû_øóÃß´ïìñÆ:Ç‚—Dñ‡‚uI4I-/¤K™t›øï­¢¹XfPVQ¸‘‘Ž+ô.€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€<ÿö…ð¶©ãŸ€_ü7¢Zý·ZÖ<3©éö6ÞbÇçO-¬‘Æ›œ…\³– ò@¯øYñ#ãwÃï†ðµÇìÝ­ÝÏ¡èözd—ø³FU•¡#,¸È®úªŠøÇÇ þ#øÛã>§âOü)¼5­èúhÑ´ WÅC§xbäB~× å°fŽã2¶L±¤Ü&×àÙëâg…fO|=ñ?Á xúÃþ©©¡__Û,×ÐO<³ÛÞé·öÛ”i™Y$ÚìÜæ¾þ¢€>Õeß‹:ßì©ñ£ÂvÚ<úRëúž›yá/ê~#”šT×6òͼ‘Š4Ä쩼ªð7rM}Ý ß]êzy§I£ßÜ[G-Æ4©+ÚÈÊ D΄£$©*Jœd*ýù¿û4|4ñ'Ä¿Ø/öV_ é¿ÚM üG·×µçÅ‘co«ß¥ùÙwm >UËÀ×ÕQü4ñ"þÜ׎›ÿƒü8AŸ7ÃSyÌ^^ï3ý[Ý·o8Îx®ÿàÿÁ|ðrøWÀÚlú?‡Òy.c±—P¹¼Xñ¿ažGdRFíŠBîfle˜žÞ€?;h†ž$øiû ~Õ‹âM7û5µïßëÚpóâ—ϱ¸Ô­ 2üŒÛw?+a‡p+ôJ¸Œ_|ñóB‹DñÆŸ{«iI66ú½å”3d©Ä«o,bP )÷##»ú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÙgnss-sdr-0.0.9/src/utils/gnuplot/8_GALILEO_accuracy_precision.jpeg000066400000000000000000001500301305042567700250060ustar00rootroot00000000000000ÿØÿàJFIF``ÿþ;CREATOR: gd-jpeg v1.0 (using IJG JPEG v80), quality = 90 ÿÛC     ÿÛC   ÿÀà€"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ýS¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠùÛöÆñNµá‹¯€ãFÕïô‘©|RÑ´ûácrðýªÕâº/»Hß\£eNÑ‘Å}E|W¦ø2_Œ¿µïí ¥kÿh‚nBqÍO¬~Ýþ Ò“ÇrÅáê–žÕî´]éÚLrÃcämÝrÏça9lc2E$é:+À4ÛSÁ:ωü#§¦‹â»M Å×BÇ@ñeî’aÒµÙIHãva(߃°´j­Œ‚G5ÒxGö˜ðÇŒÿg+ÿ6V¼^³Óõ-JKKˆb¦;'&…7nûFü®Jó€[¢¾KÓ~:®§û\é:üºî§¥ü9ºø&Þ/“N½–ÞÜøŸí2@¬Éæ¬,T°ÉÆ@$WOáOÛŸÁž)Ôü"¯á_h~ñuôznƒâ_Géš…Ä„ˆQHΦM§fôPzôÍ}E|¿û.~Óú¯|-ñ£Ä?-/<5¤x7Åz¥²^êÛÃ¥„$‘lþLŽZhO˜pA2&Ç“œtþ ý²Š¢³<1âM;Æ>Òuýåo4VÒ+ë;• a•ÆàFUçÖ¼“ö½ø¯â?„? ìµ =­†¡ªk–#ë—ðyÖº,73{é“ Œx…ÜËœŽ·Q_4üøã{Ú/Äß [åãw#oݯJñoÆ-Á¿<à Û[ùu&¢ú|ðF†Þ!eK/œÅÃ.VE µ[$ã­wtWÌþÿ‚|6ñwu?®›â+ÂU”÷Z–·¥kg,w"ÝlÝãw q!dt7|’!b¤âºO‡ßµ×‡¼sãÏøFûÂ>3ðN«â;Y®ô6ñN”¶ÑjibI,’?̱Å\)·"€=ÒŠùë\ý·ü ¢ÞëS.‹âÍOÂZóiÚ¯4íÍ£YLŒ@ÒîÞÊŒpÏ2Œu®–Óö¤ðmÇÁïüG•5 MÂ7öZ¥¤ñÅö¥žÑÊ´hBŒdù >J™#<{KEÔŽ±£Ø_µ¥Îž×PG9´¼UY ,¡¶Hs‚# àšù¾_ø(7ÃÁ§ÜkðøÆwíïÿ³¦ñä0:,ry‚"ÆC —ËÞÁwˆÈÏôíá)ý¯¼;á߉^2ð„Ö-"„Î"ºýµ¾¿ü â-=oÅ·6Y_BÐ48Ï©ÝIYóeT2•vv 8$ оQ_!ü(øõuñ_öòÕô«7ñ>‡£éßPÞøS_Ž[O²j#S9‘­Ë̆"Ä©»(Àì:Û¶ïV:?ÁKñ&»áˆ¼Añ+Jѯî¼=©Kas%¬ÐÝ #ób`Ø8SŽ™U8àPÓ”Wƾ6ðþ«û3ülø5oáO‰ž4ñKx·ÄØÚ§„üU®É«‰¬ZKÈĹx¼‚ŠK)ÇÌã ú?ÂÛsÀ|?{â;Lñ•á7O»Ô5=VÓÖ+ 8ÛÊQíå™d`f*¡îÙI*HZúŠðŸ~Ø^ñ·Š|=¢ÜxwÅÞO+êž%Ò ¥ž®Bo ›Ø†d•dXt"¨kŸ¶ÿt[ÝjeÑ|Y©øKC¾m;Uñ¦£™´k)‘‚H]ÛÙQŽãFQŽ´ô-óƒ?i/|>ð·ÄßI­xÛÄq'Ä{¿EcªÔ.gÕ!Ûc¥Gôb1##2ŠÚ—öžðß<#ñ/FÔ´|=Öô/ \ê×–öic«-‰Š@n¬dxË‚¬·ü®q@BÑ_=i¿´×„¾ü/øGigŒüw¬ø§Ã¶—º6•ºßë÷¶«m››³½c†S$ŒàfÁ<á5۟ᾕà=?ÅWpkÖÐKâˆ|!¦Í§ùwúEüŽ. f*ªî&=ä‚6†9èj+ȾþÒÚÄψ:¯¤ð÷‰¼âÛ =ua¥xžÁm¥¹²i<±qÉÞBœÀœqë´QEQEQEQEQEQEQEQEQEQEWÎß¶7…µ¯Ý|:6‘« 7â–¨_g›ì¶©ÐyåÚÈÔ²åÛ 7 žkèš(äŸ~Ï^ñÏíwûFk>i¾ Òî¦ð÷ö&£â];˜&UÓOöi&Œ«êªû@<Š­ûmü+Ò4o†ŸtŸ ü3}kÁÚÄ];RÔü/á_}®%±X¯áœ1•(ÅðÙ\&-Ï×ôPÉ¿ <[ðgJñî…/†?fŸxC]–émmµÈþ>œ,Ìߺg{‘ ùIµØ;d¥³Æj‚¿¿á`øö–ðoôMGKÓ øm |añÅŸÙ—]ñþ‘¯ß.“¬ø¸KRÓÕ.ítÉ4ÿ.ŵ/$ypÏ'+ƒŒœ[5¿á?‡Þ&¶ýž?m:_ êÑj^ ñ/‹§Ò-ÂQ6¥ÚtiÛ¦Ü̲0*… rM}«E|mñ À^$»øûiö¾Õf½Ð|Yá;VÖM:l%Ižt ˜–6!X¸Iâ¼×Á÷¾;øwû ø×àKü&ñµ÷Žít¿éË-¾’ï¦ÜÅs-Ô¾t7Cä“÷sácLÈî…ù³_¢tPÃ>ðGÄ-⿃õ}Â÷ñjv³¬zM¤Ú•”‘Z&²³ÂÑÙÌ쬛—-ÀHÀ5å¾)Ò|uâÏ üñ©á)ño…|a¢k¾+}nÎHí-2fåll"Ú“üÄìx¢r¨9q»ôâŠüþ¼qñöuý­~Ùø{VÑ|K­xëR×´‰5;V¶¶ÔígºŠâî9u·tlÈ»¶æ¨ëŸ|KûKZx_ÁwÑ|sSop—×RøÊÏJÒt½h¡‘UÄÑiê÷D3lÂÃr¹%ÓúE|âÏ鿱&±ðBO‚^1—Çšg„gðë›}4K¤Î±[4fê¥%efEÞ± 24¥T/9¯cñ—Á|Tÿ‚zÙü9³†M3Å^ ÓmRÒô.¡‚ò$ ‚„´~[nÆ2sÐ×ÓtPç÷í_ñÆÿ¿e‹¯èßA±òx®¿âöŸñ+Ç÷_ü-â­↯©ÞK¨YøCIðÏú†æÓÚßÒÏuŒHù,ÒÇ4‡w³¶¾þ¢€>výœ¾&|$ýŸ< ­xSÅ:Nµ«h+¢–¿ÒšÞ+½:Å|ØîL…Y ‚)Z,)ó6a€3Vm¯x§Æ´Û_é·Þ Óm¼AayâOé’ìºÖtdsö»HþeÜ\%7 áJ÷Áö­Cº^«â #Z»¶3j:JÌ,¤i_d&U #y`ì.Uv‡ ²†p¤`u¨äoÙƒÁó[þÑ/ñ7‚~jÿ ¾\øzÚÊM UÓ?²–ÿYY˸lºÆ FϵC’>ö ¯Iý¯>xƒâçÃ=-ü%¸ñ¯„õë/hPÞ>È..íX‘ ¶F£È¹$ ‘’M{…ñ玾%Y|{Ò¬´¯~Êþ(×üyg‘XÚxÇÃж“aq Q#BBcòrˆKG–`ƒ œ ñ/~ø±ð§á—Â?ø«Eø¢øÏJÖc¿‡Àch¾­ý³tcK‚Ά٭Ù]6.í¼×é…ù‡àφ>5Ò´Ë_IðçÆšdðþÑ:W‹Âê6³ß”Ò¥ò^"Êcò›Î“Ì`¥fù³]WíCð·Æ~ ÿ†ØþËðŽ»©ÂAcàÔÑþɦÍ/ö“Aþ¼[íSçÿfv÷Å~‰Q@ |QðW>~Ö?¼pdø›…gÙfÌÆÁùÛ–Æ7ö4P'ñgÅz¾x§_Ñô‹ÍXÓ´Ùî,t½>Ùî'º¸|¨Ö4›sí'µ|‰¡~ÀzÞ±û KàmWâG‹aÕµ­1µ;ý×Nûö¼„\‘#5™œªÜíÉóƒ|¼îz(áŸkŸtO|'øñâo‡ž,Õ–óáûø;ÄšU–—#êÚ]üwbStlØ ^9š6å;JžA¹ã9~"ø·â/ÃÏŽƒáF¥m øGÄ:”ká¨-•uûÍ6êÅ-¿´%·-Ì©"¶Ø³¿awmQ@ üÖþ ün‡Cñ–…ðƒ\µðÏ‚ÎwÆaŽÎ#<•†‹¬Ü~Ó|yeá/ŒšÞ‹£ÝjVZƹãkiÞxe»²h"ÛdD®Ù’d‰#Á3lãô&Šøwàïˆ|{û8| ¹ø.ß:›SÕußjð‹5¹ÕfÖÂÌJò­¥²¢ Hƒ¹<îs…ÜÍŠïkòããG…¾,übýœüs x«ÂŸüAña®d’].ͧ†-bŽô:Uˆ¤w‹äª…SçH\îÀÆáúE|Çû:iº¦£ûTüñφõ½FñŸáYtËgM–ͦ c7ó|ñ±Uu(Ø ƒ_:þÍ~ñçÀ-à¿ÄÍKá߉µ«=_ðη¡ÙiÎum+ÎÖ§º‚émlŽ®¸hÎÆFI¨ þÜx§Ç·¶»ãë߇¾!ð….~G§X^ëV \²j!›Œˆ¥?91ßåª1P ê?n?‡7ôÿ‚šHðÔþ)Òcø™¤ÜkqÙ5Ô)b!ºY¤B°à37Ê7O5ôÅÁxàÃ_…úœš—„<ᯠê2!‰¯4­* yŠ«½T6Å|‹à_ÙóÆž2ÿ‚V_|6µÑ®ô_¦¡*隤-g<ŽºÄ³¤n²*e‰T¶N@9¯½è „<1 x‡âÿŒþiºÇ+¤Ð5»=zò?Ùé:N—¥Kj”‰¢ÓÕ®²ß»ÂÀ2Èĺb®üñg·?Ûáˆü[ã-2òþ×I¾M?ÎÐuxî.äš+™î÷l‰17ïðß)ÉÀûŠŠüüÒþë0ü%øÅŠþë.·—ã=æ´,4³>ŸŸ•n©¥ýו‘òÂ07Ü[>¶ø®ø?ã®gÄ}_áœÞ»ƒE‡â=†ÝnMYá™Zq´O,E æK<“÷Uð·|7âïºÿÀ_‰·¾ñˆtxþØx+YÓtm=§Ôôk¤\{N$ •hØ(%J|Àp#â_…:ñ·‹aø“qàmoJ´ñoÆŸ êèY´—vZ]ŒMÞÝÅï ?,ÛþèÆãÈ'ô^ŠùÚ_ k'þ mâA¤_Ÿ…²éçWû3ý]Z9v6y›m™Ý´g¯¢h¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ +â{ŸÛCâL ï>8§‡<,~ZëgNm)¦¸þßkQ}ö#p>H“Ìù¼‚¿wùæ¾Ø Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( É©¢Ó¤ð3³¦±ÿ jþ9‰ð_Ù®?³Zì_íö ¿e6ßdýçÚ¶îÏÏæf¿Yh¢€<ÿö…ñN©ào€_üI¢]}‹ZÑü3©ê7>ZÉäϬ’Fû\l2ƒ†r¬¯øS~.ÿ¢íñÿ|=ÿʪ?kù5ŒŸö&k?úC5z­yWü)¿Ñvøÿ€>ÿåUð¦ü]ÿEÛâþø{ÿ•UåµUŽ©âÿÚköyð<>.ñO…´-z/>¢¾Ö§Ó$¹6ö¶ÒC½¢a»kgÎ76:š©ªi¾$ý“~3ü3Kox§Æñ@ñ>»s©]ë²éþ!ñŒõ-GNÒÿµî¢žðoÞÌÑÄŠ€ÛAÆ\ÿ›ñwýoˆøáïþUQÿ oÅßô]¾ à‡¿ùU^3ðÇE§‰¼!â_ßï¾#hë}x£CñG‰ÿµRM9Ô‡–5*Ò[Ü#l*¿»Sœ×tå_ð¦ü]ÿEÛâþø{ÿ•UÊxËá×Ä­Ä~´Ò~2|@¾°Õµ©,µyÿ²´>Çj4ëÉÖ]Ë¥n ¶så{·™HúŠò¯øS~.ÿ¢íñÿ|=ÿʪ?áMø»þ‹·Äüð÷ÿ*«Õh *ÿ…7âïú.ß?ðÃßüª£þß‹¿è»|@ÿÀòª½VŠò¯øS~.ÿ¢íñÿ|=ÿʪå>ü:ø•â¿…ž ÖüOñ“ââMKE²½Õ4ïì­²ÝI<ÑyriEÓk³.Ö%†0NE}EyWü)¿Ñvøÿ€>ÿåUð¦ü]ÿEÛâþø{ÿ•Uê´P•›ñwýoˆøáïþUQÿ oÅßô]¾ à‡¿ùU^«E|÷¦x â-ßÅ¿øvo>=AÓô=/P´½f€[‹‹B9ã.t½¬-mˆPi$ËŽ¿þß‹¿è»|@ÿÀòª½&%a«Ü±²HÐÁ¡—t§t™ŒŽ¸NϽ8èjåyWü)¿Ñvøÿ€>ÿåUð¦ü]ÿEÛâþø{ÿ•Uê´P•›ñwýoˆøáïþUW!ã|EЄªwÊÍu§•²K '%¥fPm‡”ÿ¼\òI8N9ć°4æßð¦ü]ÿEÛâþø{ÿ•T›ñwýoˆøáïþUWªÑ@Uÿ oÅßô]¾ à‡¿ùUGü)¿Ñvøÿ€>ÿåUz­å_ð¦ü]ÿEÛâþø{ÿ•UÈ|ðÄ_ü$ðGˆµÿ>=Óuí_C±Ô5 (ôÍ%·¸–Ý$–0¥–P®Ì6±$c“_BU=Y4‹{$Ó\Ak(ÙYmÎÑû°W‚§qÅy·ü)¿Ñvøÿ€>ÿåUð¦ü]ÿEÛâþø{ÿ•Uê´P•›ñwýoˆøáïþUQÿ oÅßô]¾ à‡¿ùU^«E|÷¦x â-ßÅ¿øvo>=AÓô=/P´½f€[‹‹B9ã.t½¬-mˆPi$ËŽ¿þß‹¿è»|@ÿÀòª½&%a«Ü±²HÐÁ¡—t§t™ŒŽ¸NϽ8èjåyWü)¿Ñvøÿ€>ÿåUð¦ü]ÿEÛâþø{ÿ•Uê´P•›ñwýoˆøáïþUW)ñ#þ6ø_¤èšõ¿Æ/kñSh|Úv©c¢}žâ ½^ÒÒdsƒ1Nø(êAÁÏôyWí-ÿ$ëHÿ±ÏÂúéÔê´QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEyWícÿ&±ñ“þÄÍgÿHf¯U¯*ý¬äÖ>2Ø™¬ÿé Õê´òŸíU}ªxCöšýž|q„|Sâ A‹Ä‰¨·…ôYõ9-Å­´pïX”íÜÙÆq­Ž†ªêz—‰?k/Œÿ ÚÛÀ^)ðgÃÏj§Ä·ÚŸ‹ôÓ¦Ï|‘º}Ì©oá¸çg‚d‘”î¶Y‡™’¨ŠûgÂ?>|@ÕWKð¿ÄO x“S`XYéݵÔÄ’vFäà}*_üoøuð×U‹Lñ¼/á]JXEÌvzÞ³mg3ÄY”HGRT²8ÝŒeHìhæ|-ñe·íXÞ ¼Ð/âø]á]{Sñþ—«KnÂÆââúÖ+HÛwÃ=Ö¥&ÐxgüÒ>1|.ýƒ~Ÿønî/èzåÝî­á]RÐ[ÞjiÕnÞktYÀòäxÝàÜîý}à߈>ø‹§>¡á?é'°ü·ºÑ¯â»‰[ÚZ6`;S¼ãÏ üCÓ&Ô|+â-'ÄÚ|3µ´—z=ôWq$ªhÙãbÊJ“‘¸zÐÆZ¿†í>8üuøUâO‡|SðËÄ:'ˆ#ÔüEâÝoB¶œˆþu›s›§˜²§€ù€&¾ê¬+oøf÷Æ~·ñ“?Š­-ÅÝ·ôM} n%xoTýâ|Äcç^y–~2øx«þƒãŸ ÿÂIæy_ØßÚöÿlßœmòwï϶(Ä?jø'§Ã¯ÚÏÇú‹ü_­x£NÔ¬´Èô¨âÑ.­¢„Ä’Ë(b$·îÝ3Œä ÇR|ƒþ©ðCþ†Ÿˆø1±ÿä:ûþŠøþ©ðCþ†Ÿˆø1±ÿä:?áÊŸ?èiøÿƒþC¯¿è €?áÊŸ?èiøÿƒþC£þ©ðCþ†Ÿˆø1±ÿä:ûþŠøÿà'üÿágìíñcBø…á½ÆºÖçýž RòÖKvó`’Þ©lŒp²±aÈGì ( Š( Š(  ø$€ë÷ˆ·S=е€½«寅åÚê1ÌCƒÏH×§Ъéö¯í ·ù?aò“ÊÛŸ3ÌËïÝÛn<¼cœîÏj±@Q@gêr@—ºHšêkyé„1ÄHYßÉ””|Whfç¢û¡Uî~ÕçZ}ŸÉò|ÓöŸ7;¼½˜þ-û:ñÝñ@(¢Š(¢Š+?ÃÒA.¦=­Ô×Ö­kŠêà“$ɰmw$XŒ95¡UôÿµgÛ}»Éûw”¾Ùóåù˜¶g¹Î3Î(ÅQ@Q@ðI×ïn¦{¡k{V'Ë ËµÔc˜‡ž‘¯N3¡UÓí_Úoò~Ãå'•·>g™—ß»¶ÜyxÇ9ÝžÕb€ (¢€ ò¯Ú[þIÖ‘ÿcŸ„ÿõ!Ó«ÕkÊ¿ioù'ZGýŽ~ÿÔ‡N U¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(È"Ñ[ÀÐë&RæÛíöBå |âÕ¥æ0xÆïzúkö…ø/ñkâŸÆÏx—CÒ<­ø7Öm—‡|w}r¶¤e$êM´R£â0‰˜r¤Èv) ÔŸ¾|sý gxÅQü<ÑõýF]5ôyt[ûç´Ä7±\Mö†’ßrü°€»²IÎ:ЯÛ?àG‚öuñ¯‰t¿é^ñO…tÙ¼A£kº]œV×vwVªgB’"ƒ†)´¯C»¦pG‘OñÂú‡í™á/xÿCŸT‡Yø'¦Ýý–Û×ZÁŠâ]FI òmá™Xn œg$ê~?øMûA~Ðx+Çš—€<àMEÐkOá+‹ëÍJòÙX3[FÓÅD²ck?Ì@'‚2}¦|ÔtÚÉ~$ÚI§[øN/Cá(,#w1Ïû\fÁŒ…~r1·Ð‘þÎïáo~ÚŸ|OðïOO ø^ÓÂVzN­¤Í§¾“q{©––;£c"$ª‹îį†,Bç kË?à–÷ð­ôÛ2êo+Hñþ‘¨xŠÚI›j-öŸªÜÚ]¨Ï6íbßHÏ¥}fß5ÛÛ~*Û\iÇ×> ¼´y]nÅÂ^›ˆåU•eÚÅ\ÆÅx4¿±ÄOÙ;áÿ€ôoèZGÄo _jßñ8IgkO±j/z—1£yAËy7hÃ(’%ç5y‡ìû¤ë?kÏxÆÆúM+_øð¿ZÖ´ÛÉK³†MZ+]5½~[x-ŸSW,´ÿ|-ýž`øYñ÷à>§àkh¬FuñFÓ ÕlŒäm‰¼„4°ÌÏûÁ½#寥ïeSsñÀkÏkgðø|,—áÚÙÛÎék”`É„ÚB¤ݸ6>\s\[|ý¢ßáÏÁÉü_àïK¦7‡ÇŠî­oYþÎd1ÖßêZaÚÌì Éæ€>‰ÐüYáïxWú|Þ#›XEÓ-Œ¥Æé侈 U¸gEÚÌûw1’sŒµÿ OÂÿôÿÉyøšÑðG„¬¼à½Ãg˜tÝO·Óm|Ó—ò¡cMǹڣ5·@Ÿü-? ÿÐSÿ%åÿâhÿ…§áú 伿üMu”P'ÿ OÂÿôÿÉyøš?áiø_þ‚Ÿù//ÿ]e‰¢xÓFñÛÛiןhÈWÊu‚rÀ¤VÝÁh¿|=®\|A#ÔlÀ÷-mªÜêÖocnJÛ¬ìñM6ÈÙ7,X6¹ýÜ‘Èý°õ«FR¥ÔlÝ–×i/½´—˜›Ks½¢¼ â¿ÇëK¿ƒ^ ñ·‚ü}áï èþ Õ4åÄ^ …n-/:‰mÈË)E`Ø"˜;Aƒ<^Û&§r–—S &ñä†S[«Ã¾uÈЙ6…䟘©àñÐŒF¶”jÕV¼¥5$Ó…®Ò]vMµÕ-/*JNÈТ«ý¦Oí³ý’o'Êó>×”ò÷g1»~ìs÷qŽùâ«Ç©Ü½¥¬ÇI¼I&”FöìðïrF÷"M¥xå,yuÏ, ޝÞ:ÚÌ—FÖ÷L—"—j)Î7).O$^¼cB±ÓP¹Þ®›&–;kX^+Eòs#4–C¿wÍ€Ÿ¼3Á9$\[é™ì”é÷*.´ŒZ,[¹Û'Ï’IãäÜ2:ãš¹Egɩܥ¥ÔÃI¼y!”Æ–êðïrô&M¡y'æ*xIþÒý̇ɋ. ° 1,îáÉU5¾™žÉNŸr¢áKHŢű ²|ù$ž>MÃ#®9¨äÔîRÒêa¤Þ<ÊcKuxwιz&м“ó<:¡EWûLŸÚgû$ÞO•æ}¯)åîÎ6cvýØçîãóÅWS¹{KYŽ“x’M(íÙáßäîD›JðÊXò8ê…gøz8"Ð4ĵµšÆÕmbZÜ$…6 ¨à’C€rO"¤ké•ïTi÷,-Ô4l,\’¹ÛÏAãçÚ2zãš§¢j2iz'˜“j-sj5úy!lsr>bxò÷|`ÐÅŸ&§r–—S &ñä†S[«Ã¾uÈЙ6…䟘©àñÐi“ûCìÿd›Éò¼Ïµå<½ÙÆÌnß»ýÜc¾x  V|zËÚZÌt›Ä’iDonÏø$or$ÚW€~RÇ‘ÇP$ké•ïTi÷,-Ô4l,\’¹ÛÏAãçÚ2z㚎àýã­¬Étm`tÀùr yv¢œãr’äñÒEëÆ4+ B嵸ФÍö±»Ú~ç6-ûúBqß ¡€1y&¬I©Ü¥¥ÔÃI¼y!”Æ–êðïrô&M¡y'æ*xÏöI¼Ÿ+Ìû^SËÝœlÆíû±ÏÝÆ;犯§rö–³&ñ$šQ۳þÉ܉6•à”±äqÔ ò¯Ú[þIÖ‘ÿcŸ„ÿõ!Ó«ÒZúe{Õ}Ë u ‹$®vÇóäxùöŒž¸æ¼öŽñ¾³>›¡èðÿÄvúkøÇÂLÞ#’ãM6N¹§I´¢ÞŒ†ýב¿J|ôô%Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@=kÿ±üA¬Äúï‹ì|%­ß¾§ªx*ÇYh´kÉÝÃÈZ »Õ]ÆæD‘T’x¯ -ma±¶†ÚÚ$··…qÅ…DP0ÀqŠ–Šò¯ÚÇþMcã'ý‰šÏþÍ^«^UûXÿɬ|dÿ±3YÿÒ«ÕhÏ~1ütð·Àí/L¸ñ —·7úµÈ²Ò´m"Ñîõ F|g˂刓À##<Ïÿڣþ9ñÝ·‚õ? ø³áÿŠ/ ’çNÓ¼c¥}ŒêQÆ3!·uwG(fMÁ€ç‰š?øy?‚Ƶ±¸½ÿ„ÎÆßí·/Ú¼¼ÿËO³Î?‡5ëŸ|AàÅWÅÖ±\ë÷ÚßÙ<2~ÌÓMãBûÝ Œ¢ˆÃcÆÏZó‹oÛZÏZ×¼U¦øwáÄïÅá½nóÃ÷ºŽ¦YIl×VÒl”#5â±ʃ†¥t>=ýªtï†ß <âÝoÀ^5‚ëÅ:Ü~±ðÂÙ[Yn¤óü±$fàF‹rF$'œrqâ?²†§ñNÎÿãÂx/Ã~Õô“ñcÄeç×¼Cua8—ÎMÊ#ŠÆu+¸mà’O;¶ÿŒGƒ¿g‹½KDÑGŒ—âÆÃJ²Õ¥{”G{å'ÚžÙ\+(MÍäü¤¶`éÞý®´=kǺƒüGàŸü8ÕµÖ’=%ü_¥Ç½ü¨»šæ†iSÌÛ’Šç ä€}Ú¾nñ?ÂÿŠ?þ!|9¾ñ¾•áø[ÁšÚxìú6µ>«{yn¦÷µ·X¢cûŰké(¢Š(®SÇ^2Õü%öì¯xƒÆ¿hßæaO§Eöm»qæ}²îß;·lÝ÷;~\ò¿ð¹<]ÿD'âþx{ÿ–´ê´W•ÂäñwýŸˆøáïþZÑÿ “ÅßôB~ àw‡¿ùk@«EyWü.OÑ øÿÞÿå­ð¹<]ÿD'âþx{ÿ–´êµâÿü+ªxÞãÂ:Ç‚`ƒÄ>+ðWŠ-g}9¼K>›o ɬâåa ½…½ÂÈ€`ŽH£½½Çgà¯ë¾*Õe´Ôþø£ÁÖé •oµ»*Hd`Ê`Z^ÎûˆbrP.åÀ9¯ü*¿ÙÇûwÅÚ‡ö¿á+ÕàþÒÕ%ÛÛ¯dÄqî?÷ÜŒ*æy[•ϳ•U•B¹UÚ1I¾fôqvjVqm{·om¦u՞ƟÃÏ|<ø£à¸ƒn4?xWJ»[aÓ’7´µžÎE1¢ WËhâxÈÀ‰Ð•(ǹ¬ÇðÞý‹}¤Áoýeyöƒ2é®Öo¾vwšE’"®’3ÈîdRsÎîkÀþÐ~ü.Òôu)áð熴áÔ5Ëã#GJKI,Î@UP ãj"Œ*¢(QÏ[ØVçt\®åîÅûͧ{·%ozé+(ë}ôºÜëè®[Vñíµ¶ ún—k6µª#mx-†3•{ã >n¼€F*’øS]ñ24ž Õ䲊D+ýŸ¥6ÅPʹÇ;¿ˆwx88¯8²ý÷4MW»7SÚCˆâˆÜÅ ’WpÒæ&D€N¹S>Ðv–ê:Œü¿«z'…ô _¸[/aµ„˜™wyHÏ6×V#;˜ïSóG ôÔÈSÆWòª[è–:Zª’Ò_]yÊÇŒåò^£NîÿŠçþ¥ïü]eÈSÆV²\h–:¢²‚²XÝy*§œƒærONƒ^Õ'ø‹ké²jºöœ‚\µÍõ± nþSóÁ,Ç•è¿+1ö=Ígêr@—ºHšêkyé„1ÄHYßÉ””|Whfç¢ûSLñ¶…¬mº¥»;?–±ÈÞ[³q€°OQÐVÝdê¾Ñõ¿4Þé¶óI.7˰,‡ÇÎ0Ý€ëÓŠç×Þ$ðº2èZ”z•’¡Ùeªä²aTŽ1è@ªŒþ4ÛQ\Îã˜/oŽ©ZÉ¢jƒ¥½Ó ²åŠ-øÈ¹ÏÁ5ÓPTôedÒ,Uì“Mqa¬£ee·;GîÁ^^œqÇr³ü=$ècÚÝM}jÖ±®® 2L›×r@%ˆÁ9“@QEQES‰Xj÷,l’40DèeÝ)Ý&c#®‚3ÇïN:¹YðI×ïn¦{¡k{V'Ë ËµÔc˜‡ž‘¯N3¡@Q@yWí-ÿ$ëHÿ±ÏÂúéÕêµå_´·ü“­#þÇ? ÿêC§PªÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEå_µüšÇÆOû5Ÿý!š½V¼«ö±ÿ“XøÉÿbf³ÿ¤3WªÐügøá_Žº^™mâ(ïmoô›‘{¥kZEÛZjløÁ’ “•$`È8Žoáïì¯áÏxæÓÆz§ˆüWñÅIm¦ê^1Õ~ØÚtr H-ÑQ#BãŸib3ÉÏ´Q@8[~Å6z.½â­Kÿ¾'xR/kwž ½Ó´mNÊ;eº¹“|¥¬Ù€èXœ(É=k£ÙgNÕ4? éÞ"ñ׌ü[/†|[mã C[½¶’çí0DcŽÝÙ-ÕM¿ÌÌT(mÌ~p8¯l¢€ +?LŽ½ÕŒ6³[È×Jf’PBÎþL@:dò»B¯åÜ (¢Š(¢³õ8à{Ý$Ík5Ä‹tÆ"¬äÊ ¾ ´²óž]}ˆÐ¢Š(¢Š(ªºŽ—g«Û¤Ö^À“Ep±\F²*Ë‹$NnGDu=C(# µ^%eâ/\|eÒáÓþ%Ýè­áO nÔ¾W/"iÃ+IæFAPÅ×̃5™…Ïn*îr‹·$\›³v¶ß v»²MÙ&ÕÚ&NDzê…¶•e5ÝÜ˼K¹än€SØÉ5çzÿ‡føÝ£K¦kze¼ »Ti,ïíã¹7áe„£‚ ŠÃ ààæžŸ§Üü@½‡UÕah4(›}Ž'YieÇ él—îk–•9)ÁÙ­S[¦VçŸøÏÁÞ*±ð]Ž—ðÓXÒ¼9ªE¨ÚKqw¬Ø5âMl³)¹Rªèw²3ÜeÄYe‹GÆß ´ø‹ÁÚÖ£uªÁwá]Eµ;$Óõ)­¢–V…â"dFEćƒÎ7!>\’¤}xwímðÅ_üd|%«ßG©èWcW‹Ã¶úÓàÖç„o·Šk”XöL±È»$@ÅpZ&1ÜAíeu\E3¬¨«ÉsÙ])«4Ú³i­3I]ÝÅ6̦¬›µüiOµhM¿Éû”žVÜùžf_~îÛqåãçv{UŠÅÑ|Ù/L÷úh²Ö¤°µûcÛÊÓZî̧ʊVT/±ŒŸ1D$:p6«Ãk•´ÍBŠ(¤Uî~ÕçZ}ŸÉò|ÓöŸ7;¼½˜þ-û:ñÝñV+?S޽ÒLÖ³\H·La’ JÀþL »àð»K/9åר€ (¢€35ÿiþ%²kkûum!%y‘ŽU»±Ç9ÌÉs­x]÷RÝx‡A*ÄÈ5Í©›,só.:± n抯§êÚ­”7v“,öò®ä‘zýb ѧý«û>ÛíÞOÛ¼¥óþÏŸ/ÌÀݳ<íÎqžq\v¡§Üü?½›UÒ¡iô)[}öXOyb‡¨élé|-5ŒÞÒÛMC€¶`‰›sF¡@NO+ŒO ó@”QEQEWOµhM¿Éû”žVÜùžf_~îÛqåãçv{UŠÏ‚8¿xëk2]XÝ0>\ˆ]¨§8ܤ¹Ñþ&h~×õ;9š6Õ烈2Ø£) †5+09 ò„#÷m_o×Ä?¿aÏè¾øMῇþ;ñ®³£øÆúV£5¥ìÚ: 2Õ%‘ç¿F6q´³¡rÿ9—{9,’ûKG°—JÒ,l¦¿¹Õ&¶!{ëÍž}Ë*€d“ËUMìFNÕUÉ8q@mûXÿɬ|dÿ±3YÿÒ«ÕkÊ¿kù5ŒŸö&k?úC5t^ ø-ð÷áÅÜ·^ð'†|/u.<É´]ÞÍ߀ËFŠN°ÿS@Ÿ'‡´©m.­_L³{[¹L÷´Ri »®0ÍO< ±ýký¡öï³Cöï+ÈûO–<Ï/9Ù»®ÜóŽ™  V|~Ò¢´µµM2Í-m%Û° Hdè¸Â¶I9òjFÑ´÷{×kf{å tÆÍÂ…Úœ|ÀFx8 Å™®µ×©tà,Jª °ò“÷mŽI'/Ï8v®V>Ÿ¢YGzòbYÙµœ»,çHÓqC j]p2œ/‘ŽØbOiRÚ]Z¾™fö·r™î!h¤Ò w\a› žx¡EWþεþÐûwÙ¡ûw•ä}§Ëg—œìÝ×nyÇLÕxü=¥EikjšešZÚJ'·…`@È !Ñq…l’r9äÐ…S¾f[­<-êZƒ9 *“r<§ýÚçAÃñÎ#=‰¡´m=ÞõÚÆÙžùB]1…sp¡v'0‘ƒž*¼úm½½ÖŽ`Ò-¥ÌÐÇ(TSc‰¹Œ€J¢m\pÞ‚€5(¬ù<=¥Kiujúe›ÚÝÊg¸… B“HH%Ýq†l€ryàUìë_í·}š·y^GÚ|±æyyÎÍÝvçœtÍX¢³ãðö•¥­ªi–iki(žÞC $‡EƲIÈç“R6§»Þ»XÛ3ß(K¦0®n.Ð$ãæ0sÁÅ\¯ðŒÑ|]šßPûݾž-b‚ÿP»°[;½PÃ$† zF|Ç™bl4~sHÜàu4¥Þƒ¢iP[[ê’ŠÞt‰7ØÛíÄ ¦T`c Àrkxºu¿„íô뢞4–îÊà$àË…'yƂ݌|£¢• ãÕÛîí÷Ùü„tTWãoÞx[Æ>M;À—þ%}rñ´ËÝkOòiÂ'”I3;1—QÀãï`™ QKÓÇáí*+K[TÓ,ÒÖÒQ=¼+†@I‹Œ+d“‘Ï&®tgNœ­i+­SÙµªNëT÷µ÷ؾ†…s?>%øWáV‹¯âý~Çúd÷pØÇu(y[j 'ñbz*«»¨Ì6›FÓÝï]¬m™ï”%ÓW7 hqó 9àâ¾røû¬Úüñ„+½Ò|Sñ?ûbÞßLð·Ã½+B†êÎÂþÑeºÇ(ˆ˜ òѲ¤È6;…™aAoée˜â£CV÷åNÎVÝ&ÓŒZåyZ)'vEIrFçSâ½oâÇ7W ?cÕ5‹Oèþ³¶¶Ô4+ öÂ÷RµÓ²HÈþc êèZ=Ìc…Ü[vÿ ÿ…}ðÖ Tñm÷5? Ú-¶­ª¼_i¿šT…e!á€4†CÆÊ˜yYZ2LŒÛÛãïþÒŸ¾$|ñ¾|<ðLþ½ÕÒÛûfâò)o-­š^kÛY#Žh'2I&sjwlšn™íûSü ýü{ñb÷Æž+ð—Š¢wˆ®c3Zà ¬EÕ.#ói*M£}É%Š·ˆüSûfx®ÛÅþ>±øo¢è—><Ñ×E¸“HÖ?ÒÙmRwšk 5oDqÜFñLј¦‘Jffð*S£Z¦ç8S÷¥¸¹(¹JÚ=.¹#Ì䣫‹J=µM«½þ¿Sõ3áwÅ#âç‡nµ­×U´´·ÔnôÇMcMšÆS-¼Í’¨%ISÏPrŽDt^Žù™n´ð·©j ä4LªMÈòŸ÷kžAÇ8Œö&¿,“öÕø÷ámgÁ~2ñ7ìéñ tÿøfâËT…íZÇMº”Ç›¨>t³ö`NÅUðƒhVDó–m{¯Úsà?í}⟆úì_uO7ÓõþÕ±ÔYOžÜÄ·7'Ì“ý ·Íq,³i6,®Âà1µ[ÙÓ’“½¥>KsZ2´bÞÊòŒ]“ÛF>i(ív~¡Q^EÆ»ü.ñGÄx#]ñ&­£í:-&m1¬5×µ™‘£ÎPÆ2ê[ Æ<³2´#ºt;/ hóêZUŸ‡mD¶ï † -ÓìwRº¬qüŒÑ‰¼ÙB-›s¶¶áž ØFJ°³æq¶œÜÊ×\»õZÚÏ£-I=ŽŽŠò}_ã÷Á½üTú‹ü5jö¥¿‡õÆšXÁ[¹WlPÍÇÌ2Ç*‚)ÃòeÙèVQhw·~]¢ióÜèöMg°v‰ÊÀæ"bx›oWCŒQ[‰ÃÅJµ)E=®šìúùJ/æ» R‹Ù—$Õ,âÔ ÓžîÔ.!’âF‘D²E"Èê™ÉU2Ä€d@~ðω| Ö|qá~#Ûiv·—W cq¤^›Ë_,J …Wh’0ÁXˆÉ’8ü7ã$ßþ5þ×V~ðÇ‹ü=¢x²Okš=Ö¡§xkíZž¤|™†ÛÂ|¿0"Üdž —q‡IgF‹§ð¦™ûEÎo<«øº†¡e Ë øƒ«X‹[iYçßceVŽ7ì:ÊF#.­µÄHo¾Æ§º8*nu! •#TS§(ÆóIÁ´£(ËM¯&íÊ­©Î«^OMšj}…Epž¶´‰&ð¾¡ig%Ƈp%µÔê“*‚pãq%‡#xÉÉ5×¶§»Þ»XÛ3ß(K¦0®n.Ð$ãæ0sÁÅ|Ô\¢©®§£Ù:ØÛ+Ø©KV®mÔ®Ò#ãå01ÀÅG'‡´©m.­_L³{[¹L÷´Ri »®0ÍO< ’&c«Ü©½IAAWtGt™ž¸~Ϻ8êjåg¥ª6¿5Ëi°¬‹j‘¦¥ò™rÑtÜv£uÁ/ìhÃÚTV–¶©¦Y¥­¤¢{xV €’VÉ'#žMhQTÛFÓÝï]¬m™ï”%ÓW7 hqó 9àâ…Ñ´ô{'[e{)jÂͺ•ÚD|| €8  •å_´·ü“­#þÇ? ÿêC§W¢Éáí*[K«WÓ,ÞÖîS=Ä-šBA.ëŒ3d“ϼ?ö–øOà²é6ÿ„7Ãÿð™ÿÂgá?ø¨ÿ²àþÑÿæü|ló?Õ~ïï}ß—§ôQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@UûXÿɬ|dÿ±3YÿÒ«ÕkÊ¿kù5ŒŸö&k?úC5z­QEQEgé’@÷º°†êk‰éDÑÊIXɈ„LŽiVã<»{¡Uí¾Õç]ý£Éò|Ñöo+;¼½‹ùþ-ûúq½óV(¢Š(¬ýNH÷I]Mo#]0†8‰ ;ù2’Êí Üã”_`t*½ÏÚ¼ëO³ù>Oš~Óæçw—±±³Å¿g^1»¾(ÅQ@W-ñ.þK/ÝE7Ú¯m!DMí!s†P0y+»úsŠáuÍ7Æþ4MC]ðµ¦h‹êvpAy­YKyéñL¦éR0É1FG~DÌ&OSðôK iku5õ«ZÄbº¸$É2l]É–#äMK¤éhºmµ²í‚¼O©8džIîI§éÿjþ϶ûw“öï)|ÿ³çËó07lÏ;sœgœVòªåJ4šV‹nöWÖÛ½ÚVÒû]Ûq[[–+ÌüCyàOÚ;Ã_þÛø›í¿eÝ¢kÑèwæ»3·rÿÀ”‚6),Nl¨4þ3øÿßüyâ]jÇD¶¿Æ—k-þ©&š’ÜÎ E¹ˆ É$™«ÉÀŒ‘ä?²7ÁOþÏ“âýŸÅ¾&òZÓKÖ®#¿‡O½NHÄ(ËåIsˆí7–M©8؈Úy~‡ƒ…< LÊU*FQT¿¼Ó¼¤¬›|‰]è’n:ÞÑxÊW’…®ºÿ^g¡x§âTZF›â|5½Ò¼MñSÃzwv¾Ö5iVR»biærÏ#`);Ü12EæI™e¯–þü<ø›û8xª/‰ž-Ôô/†þµÒ ½ñƳâ[íyîK‹û‰í`‰ˆ 'ŸvŠ£2¸vŒÇ5ÓÍt³ý7à=?⦃â_[ø›Mð®¿çøu¡ñ_Œ¬­.ä½…Á¶†8v|ñ:sœª±’g o…ŠoÊÚÃâÖ©ûeþØZ¾Üx¼-©ÏiáíB='Q7ÐëBÒyíqÁç­¹2òD†EÓ³Fd¯½„ÆON¾YƒQ¨ëFüßÄrkGz1„U§R.prг–÷YJ*MNZ[åývÐæþjŸ?l/xïá×Áíß |ã-@_j–ŽV‘ù`ÜZÚµË#˸i¤HmÕs›†¬(Â.ÓFý˜>x3ᯈ´]cÄͯüRÕ5;ë/Z_xsT²Ôu a iäÏgæ”$»È†C·l‘5ßeŤ_\ß|ø}ñ7áîû5xjMÇZÏ€íšÂïÅŸc{oøEîZ77-V8å•ä’–¦LÊñLÓ¼o!>QñÓVøeûx‡ ´ÝeüUñÿƒ.´?„zã|5µ´¿‚ãYÔ£¶½Óu›Ûc§‘vÓÜEÏ–Ó¤è#E_Ëa$Ô!_Ò±Y‡pêºÓŠj¢¼evvr»æä”g(K–4µi9;ÆòoŽ5eZiYtþ½/Ôûgþ¯‹~ãXð.ãK(¾Cyá \[_\·g¢8a_Po¤#¶ìà|=âσ²÷í©x DѾø£Á>)ñV³}§O£Å¡jzRÁ%Ü×2µ¬îÐܢȒ£4) ‰Ž8mÛê‚¿í¾-þÓ¦ðÇŠµ_ø&ÃCÓ ˆCuc.‘ع»ŽC¡óÃ7”J³œ ‹DlÉùcö˜‚¿¿kŸ†<¹ñ–£âo Ý?ö|ÖÝÿÚ5 ;è⊠yz€ÆàJñ@¢ó3ÞBÏøÎUÃU'Š«€ÄÆNJš”g$¦éJQ„ã8Ë[¦Ý—+M5'oFu’Šœ{Û§}Ñã¾"üfÿ‚^êÒxU¿ø/â=~KVšýU.‘ 2Æe·Ž;‰!·žE &É ,ën<¹J/œ=¿ã÷ÅŸþØš÷ƒ!ñ¼cã#rmnµHmmæˆéëq”Ú…!*Ë‚Û>[ÙëúGüð®ãÅþ(±Òô¯ ¾±3jÚþ«…ehãù¦™Îª€îz.ç•ÏÌîÍù ñ/Fø¿ûIhÞ:¿…Zœ•%Kh¡1ìü4ø§|*ðá "{ë3E´K;yµ+¦¸‘FgoÑTQ…EUUQ½§ý«û>ÛíÞOÛ¼¥óþÏŸ/ÌÀݳ<íÎqžq_bñóúÄþ«6©®hÅ^ZBW\©9I¤ÓÕ]ï¹èF Þò×õ9?“ kú/ˆÂ·ÙâcizÈÏþ©þé 6«}ÎÑéŽÒªjÚdÖ›scr»  7‘èFA{+á¥ü—¾µŠvoµY³ZLŽ›2‡ ¤`roõç5ãMQ@ðI×ïn¦{¡k{V'Ë ËµÔc˜‡ž‘¯N3¡UÓí_Úoò~Ãå'•·>g™—ß»¶ÜyxÇ9ÝžÕb€ (¢€ ò¯Ú[þIÖ‘ÿcŸ„ÿõ!Ó«ÕkÊ¿ioù'ZGýŽ~ÿÔ‡N U¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¾T»ý¶uùü)­üCÐþêZç "âá&ñDzÌÝÏoo#Gqu‹.^$d~LŠÄ)8ãéÍ\²ñ6‡§kdâëNÔ-£»¶AH¤PÈÃ<ò¤óŸÚÇþMcã'ý‰šÏþÍ^«^UûXÿɬ|dÿ±3YÿÒ«Õh¢Š(¢Š(?LŽ½ÕŒ6³[È×Jf’PBÎþL@:dò»B¯åÜ á¿¢\k-~KÛÓm6“göMÃÊUFóɵþnx‰´+™¡îëyÒtá ¶Ÿ2¾6¬ÚÕnž—×ug³wÐ(¢ŠÀaYúœp=î’fµšâEºc ‘Vòeß…ÚYyÏ.¾ÄhU;æeºÓÂÞ¥¨3Ñ2©7#ÊÝ®y?â3Øš¹EP\Œ„—Þ#ðžœc‰îÞ휮[0®à=Hü½0zêä^äø¯:+´z>ä,2TùÄdz>„Ð]YþŽ´ 1-mf±µ[X„V·‰!Mƒj8$À`“È­ §£3>‘bÏzš“˜#-{ª­ÁÚ?xðuãŽx j:]ž¯n_ZA{MÂÅqÈ«,R,‘8¹Ôõ  Œ+åoÚ/NÕ>+üvÑ>³ü?Ðõk(m5ÿ jºµÄ÷»¨•“RX¡‰¢h[ʉfÜI‰Íaê¾>ø'âßøÃRÖ4¿Œ^*ð­…×ö_•£é°Y´ÿe¸ifÚd‰›÷Êvžy9ùñl<;Âú~4xËâýÿŒá>øk໹µ¯ êÚg‰"¶“NºKf‡PÓB÷a 2n–T‰£[w/*\Ý1ý‡¨Rº˜è×O’ «)^5$¢£Ì£äï.f¥N5¾‡%VåhÛwø~ðlywŒücáÙ“öZŠ‹¾ k>'ðäÚÏ€<ž*[‹‚I®Y#ClИå[h­šPf]®ÐyN#x †×ãoüÿ…+à…¾7Ñõ‹}wân£ym¨x2Ö!u{ig|ÒšámæIZBë4SB÷–[|™ J};þ 5ñ«ÂüIû7ëĆ™£êz_ö–µ¦éZ°¼»·´–ñbB¸6‹(û=ÈWÝæ±P·Ãå"Ÿ­>$þÕÿæøã¢|V²ž?ø^´Ï¢X™/ÖMFk4³+¿gÉFù$22¤/v"8šaöp8¼Ú–{S =Jµ=%Ë%Î÷„œW+^ôµJ:»Úɧœ£MÒQºKGò<ÃàOÛþ|øç©|Ô´»½WÚ”:Å®¥£MmªA«[Ïp—ײ‹™F#XRy¡‰ yhbYbg±ðLµøû,|@ñ‡ÃÝ#ÀÚOÄK¿µj—­¡Ï¥é¿bÚ¦ÂÞõåE†HZMŸhF¡û<2ˆ­¯+›øñ;âGÃ}7ö‰~ƒIøñâcE¾ŠÂY¡CluIÛËsm<ÃbÄ÷ѨÎò’]³.Õ||9¡é“Ëâ]CÚoŠ,mm¯üËÔæ[[ AÄ‘#´ˆ¥c’Xa*gTTo-¤1fOÛr¾–7딕UJ”f§¤Üãp“U9l§ kMÝJMɽQæN·/+¶ééµµ{y÷>©½ŸÄ±­Ì~¹ð—…| qâ«FÒu]K‰³ÿkE–Îh2ÆÞ1ut·s(GÝæÄ.a…}ÍSà¯Ä„ZïˆgøcûBéZõç†t=ÿLÐ|1wö[NÝçˆZÆÖJßf‘Y®f” yÞw¸Œ´l÷À·šx—à/ÃO =–¡á¿‰ŸüE¥éút6Þ"oë„&± Ìh[,áŽæâÖU}‘ËJ¾_ÚXÈŒ±¸ô¹>%/Œ¾|W‡ã÷ˆçñ¬úô6wZOˆ<¤[jM¥\XË/ž©ªK|‰å¬ªŒ¯rèÊ/à–ïÒ®êJ4q{MÉÆ5T©;Ô|ðIòTS›å§ÏÍV-G•Åj­ Ú§§mvÓÊË"·ÂÏê?ÿhßéÿ ð×Ä=W@ð£¨éú•׊G†ïô›ÝJîÎůC›°E†I/l*°Käü“ùYA5ý_|9×>~ÆþÕt__iºçŽõqâ9-­¤µÒ#K{;wšÒL"½¸‘$‘l&1×ËS$I8Ôç^Œ•D¡QÓ5R”—7,dÛ”ùT¬¹dåNMËìÊ¢Uf‰=6½ìÿO×ðÐôÝ{áŇ:×ÅïxCà$ž%ƒÄ6‘uû·¿Ö.™®í5¹2,@–¹Že1ÇÇd‘äkÈóoxGIñßÁ_‰žÐ5ßjšªëè¡o'Û<9ròÉ|-¦µó¾Íjእä—!"óÛHB‰Òpeý ý¿h/üSâÝKÆÞ0þÈÓ© pl´Ÿ èW2„ ÅcbBîeˆÀ,=kê_…‰âhþøA•û[ø~ûÃö¾7ð·ÂŸ2O-“ÛAmµâVYv¡`¶VÒ0l|­#¯?(zûSÃVz^ŸáÝ*×D.‹¤QX‹V PöH+´ ôÅyçü2wÁú#ÿð—±ÿãUéšf™g¢é¶š~Ÿi……¤I½­´b8¡@TDE*€ (Ìÿkù5ŒŸö&k?úC5t^ Ò¾!XÝÊÞ-ñG†u»S.=Ãws¯ œ´—÷òWøF0zäÎþÖ?òk?ìLÖô†jõZÏ’ TÚ]*^Y­ÓJM¼hå## ëæ‚íŒüÁ”r>^0llºþÐßçCö+O’|Ï3?{~ìmÇvç<îíV(  øàÕE¥ª½å›], ÜH¶ŽHòr¨¾i(ØÇÌY‡åçF‹P/zVæØ#¨ Û±16ÞL‡ÌýàÎÎ8ÉëW(  }> Io\¼vvщÒdH>kã䯫‡ýÞÃï$F9±$©´ºT¼³[¦”›yÑÊGF×ÍÛùƒ(ä|¼`šd=î¬!ºšâEºQ4r’Vòb!#…ÚU¸Ï.ÞàhP}—_Úüè~ÃåcÉòO™ægïoݸãnÜçݪ¼pj¢ÒÕ^òÍ®–Pn$[G $y9T_4”lcæ,Ãòó¡EShµ÷¥nm‚:j »mäÈ|ÏÞ ààl㌞µNò HÞè'˳»Ž9[í’6´gÉp%‹.v|ß)1ćž ;Ÿ©É^é"k©­äk¦Ç!g&RQð9]¡›œr‹ì$©´ºT¼³[¦”›yÑÊGF×ÍÛùƒ(ä|¼`ØÙuý¡¿Î‡ì>V<Ÿ$ùžf~öýØÛŽ6íÎyÝÚ¬Q@ñÁª‹KU{Ë6ºYA¸‘m$‘äåQ|ÒQ±˜³ËÎ%¯'Å„6WÖVè4¶fÙ¼¤Å–  ‰W %(å¹&ÐH‘{ÚäoØüQÓä’6ò¯´×µ‰×ÞŽdló6ãñ#ß ;j€è–-@=‘k›bˆ¤]nÀÊÛx1Ÿ3÷c98;øã#­géVÚºøv8ña¥ÞC ²Ú—ŠÍ0¿¹`²åFWr•‚ƒ¹Yþ’ t 1ín¦¾µkXŒWW™&Mƒk¹ Ä`œÉ¤uMAtD»Õ5FÊÃA³µyîeºX€&Yåy™Â¬j€ç+Æ -Ž+Ë5?‰¾²ý›¯ü}¥êj~ {;­VîëÂ:}ÄrÝC#È÷†U’Þ໹yYÁŠO1ä)µŠ÷ÿüW¨øÀÿˆ4 ßx¿SÓ­âßCÓYV{ÇQÂ)oÌí Øb;mFáþ#ZXê¾ð_€/>_kžñNÍ#SÒíþ˶[s"yÁ%Ú¾[FЦÂó™ /ÐeØzsös¬Ÿ+š½§îÁsOFÓæ³\²m&ïve6ÕíÛþü§ø­ûA¨~Ýþ ø_¢k¾ ›Lñ†âÔt»ï(ŽìÁ…ÃG<È}“Èdð€Gâ52aø[E¸ð¯í á¿øƒNðŽ´³øBÓP³»²Ôn1{V*Åîf‘à{¥u %Ð:[yR)ãöø)&µ¡|3ý±þjøƒoà[û <3© OÞÞÓݤÏQáµôÛbŒ,‘¬(ÊG™‡ìáà¿þÉÿµ>£uñr(üQý™áøH—£_êlt¸Ù/š?õ­ö(ÓÈYG•£“Ìa ?kO ýº~!èß~'hÚ¦ðûÅ^ ø‰Ëâ½VÓ’"¾L"u™B6M™wK*§îb„íP¦¾Æðíƒâý'ÿ³–‹áß-üE¡îÕôí&™ªF!™- ÚÙ;¤Q¬/¿,3¢ÚåÕm¡ˆºýža.$Ãåø\R©Í*²œÜ$Ô}›W­í§F2Œœ9þ(4–ÜÑæ‡±s”mµ•ûôÛó>ný¤?c¿ˆ:ƒë?ñÝß>#x‚Ëúe‹_Šþe(×òÝÒÌ俟$·§t[™F"DnëöÂýž5Ùïà—ƒŸlg»q‹ÉÎ<ã¶9pò©2îPC.ÿíCáOÉû7ÛþÑ~ÕO‹üQ4¦›¡ø£]]COÓîïÐyénóV-ÑÄò²(š&¿ªþÉ>&ê¾4¹ñ?ǯÿÂU«øNÒÏEÑt”Õ’æ;71Á{#^EÛ%Â1³!åff’/ϲÚjójq"Ž]…̱Xˆû<,æ'œ§Æ SjS“äs÷ª9§ï¶®¬ªIÎPŠÖ]|·×mûXð¯ÚàoíñÆòøÁˆðbåm<¦A§ë1ÝhÖÖö[¤Ii¡x泓̒EiUÔÛ‰%Ê 8/|ðÍÏÆ GÀ¾*ø¯àoG§ëzež—áû+Û±áÑ¥ÙÇsö“t¾qû5Æç—÷Ov³‰îòÃí ;}+ñ/áô¾}/Ç? ~=x;àïÂWÔbIƒFµŽm>úþö墿’à‰–W1n8–›m’˜ù¯ü1€õYt‹]NÄèÿ ´ÝKHÖŒ4 ôhuqí^ö;©¯àòäk59˜b´nôºY[l³?§K S©S„Z^ÎŒ•NuËyUsRƒªÚ¥ ZNòœ— x£[øáðwÂ:[júWÂÿ è÷óZÍ¢ý¦ÚÞÙÒµ·†âê=J9Ì‹áYT9Þày‰$þG¸üø]gð·Â^ÒtøL0X趺c¶ æïQavD’ïv42Ê5@‰½¼°‰„®—i-†›ik=ìú”ðB‘É{t±¬· #ˆÕ3“±UrN ‡ÃÒA.¦=­Ô×Ö­kŠêà“$ɰmw$XŒ95ò8ì猡O 9ûV²½¤ù§.g}äÜÞ¯W¥ÍãN1nKvyU·ÅŸ|Gø'¯x᎛¥âÍ>êúÂÞÃÅ]ΓäöÓÙó±¨Í8Q¥ËfÕÛr³·ºÞ‰¥m=Ôõe¤Öìè–-@=‘k›bˆ¤]nÀÊÛx1Ÿ3÷c98;øã#­G$©´ºT¼³[¦”›yÑÊGF×ÍÛùƒ(ä|¼`èQ\EqEzˤ]ÿÂCáÿøC?á3ðŸüJ?°gþÑÿæœ?ã÷í¾_úß›þ=¾ïË×篠+Ê¿ioù'ZGýŽ~ÿÔ‡N U¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ˆÿj­KÀ~ý­¼3yã†Z—Æ—¼ð{Û§†´ŸÿmO¤ª^3 ϳ8òÊÊ]£-Ëä ×Ú:¶­c iWºž§{o§i¶P½ÍÕåÜ«0DŠYäwbª¨$± 5ó߯/‡ßu:WăºÃËkðòiwâ…½–KáçÉ*Ü|¾Z …J¶d—q`T ÿ³?‰>ë;¿‡Á¿³§ˆ¾jk¦Èòkz¿€bÐbž6 mÄè2ÌÌQü¾„DOð×Òõã?áAâ;¹>,Ü|4o ­“˜OƒâÔ#º;Óispå<­žnqÎvvÍzΓ«XëúU–§¦^Ûê:mì)skyi*Ë ñ:†IÔÊÊA E[¢Š(¢Š(Ê¿kù5ŒŸö&k?úC5z­yWícÿ&±ñ“þÄÍgÿHf¯U Š( Š(  ößjó®þÑäù>hû7•Þ^ÅÎüÿýý8ÆÞù«Ÿ¦G^êÆY­äk¥3I(!g& 2y]¡WŒrîN…QE^çí^u§ÙüŸ'Í?iós»ËØØÙâß³¯Ýßb³õ8à{Ý$Ík5Ä‹tÆ"¬äÊ ¾ ´²óž]}ˆÐ¢Š(®;Çìº}ÿ†u_?ìï °3±P‚)‘Ç ×¶OáØ×7ñÆMCÁZ´Q•VX„¤±ãÁÏã…8÷ ’«éÿjþ϶ûw“öï)|ÿ³çËó07lÏ;sœgœT:&©·¤YßÇ´-ÄK!U}ÁI®}AÈ>â›áèà‹@ÓÖÖkUµˆEkp’Ø6£‚I É<ŠÐ¢Šä>|QÒ>.xvëZÑmu[KK}FïLtÖ4Ù¬e2ÛÌÑ9 *‚T•<õ(ádGEÞ4*Δ«F-Æ-&ú&ïkúÙÛÐWW±ùÓÿ ý‹<ð§önñï‹l¼@$Õ®|]o®Ø j'Ô$«E=Œw¯‹™²e’äïy>[Uù7‰&~ëÁú¿üàV¹ñ~Áuão x~×N}KA¼Ý­ë6ò'Ú¾Ñgäű³Û"y'ä[„MË…ŠÛìÚ‡âGÄ߃ÿÙcXÖ¼+7†üQñIµÓ5mCFF´ðöžž\ÇíB[•/'›pà|¢)œK < Äþhÿ°wíw©xSSÕê8Ö@ÎÒÌmn rK¹MÌbáñ&öò¸~!|!?³·Ä? xóH¾_Ú`kÆ±áØ¦gño›k |,ø‘û\_ÙèÞgÄIí,l¼7ögðÝÄÚkÊ©-Ä 5Äww[uÜlÚßjf™‘#NŸâ}ä’è¾ð§Ã¿AcðŠÏJÔ|'§x§\Ò[[·Öî’>_?PFa–j¼,$Úȯose‚•~<ÞiÿðP۫žðWˆ¡ñ-…ÞŸmks©´wšE¬íonóÝ‹q9»x‚Hù!UÜå$ù¦›â1ÙÅz˜N¤ùÔ¹ÚrŒœªIM/y´¹b£½*JÞÍ­ß1ÕiIÙvù^O£à¿î,>ü@øÞ“ÿ ˆ®‘¥Ï5´wo`)wi<¹V@²Ë,e­É‰™m¢|ñ°û“ÃÞ<ÿ…eᯇžø¯ã=OˆöÝ9&·O²Ç©^ªnaþê—Â+HèFeŽ*ã¿dÿ‚^ý™¾¤×ÞÒ¼«Ý@Ú§‰us±Pͱ®¥äCd…Rαù’V/4žÕÿm~ÿþ\uÝïý‰d°¹h?† bcŸû¯Ï瘯cF½Z-º´ÓmÎÑærI«©ûþ㜮õ|ÊÏFÕº£v“Ù˜zŸµ{Š:…¡ðv«{¢êuÍíÇŠaxE•”±4a ‘K‡ÜáÏAŸ»´:‰šGöyø½«üd·ñ~£pþ½Ð4ía´Í+Sðƨ÷‹v"‰æEdSïK9ù•ÁPшçŸ×kǾ~Î^øA¨Ýø‡Ã“xš9uk!Xkš¼÷ o]\]ìòˆ¯të–ÜF Îùgyb\¾X*Ñ«ZÖŠƒWi¾fäÝåî»rÇK«_Ý»¸ÚŸ2³Ðìµ?ê÷ßt?ÃãVËEÓôë›+ B›+ÙehÊO#/¹‡?wiE3,ËáIEߌ¼]sf€Ëo© ^4*ê îó¢º oTDÒ//äÚVÞ&+>ÐÄ>¤àsXÿ ôÏì¿i¨V1$Éö†hÇÞÞw)>èz5Ïí4¾ øzži­çð'Œ­¬ÍÆ©ö‚$[«ˆÙ¶(„ÄQ_‰|©Ð?á׳ý/ü¯êŸü“_JxOÂÚ_¼+£xoDµû‹£ÙC§ØÛy'“H#79,ØU,I8ä“_?~Ìþøk£øîþoþÑ~"ø»©¶›"I¢jþ>‹^Š|؉¸!ʲ°Dó:)Å_KÐEP‘k_µ·ÂxòOê>9°¶×¢º[Ç)·‚å¾ì2Ü„0Ç!MNå-.¦MãÉ ¦4·W‡|ë7¡2m É?1SÁã 6>Ó'ö‡ÙþÉ7“åyŸkÊy{³˜Ý¿v9û¸Ç|ñ@(¬øõ;—´µ˜é7‰$ÒˆÞÝžð.HÞäI´¯ü¥#Ž H×Ó+Þ¨ÓîX[¨hØ4X¹%s¶?Ÿ ƒÇÏ´dõÇ4X³5Ö õ.€œ‰UA¶R~í±É$åùçÀUÊÇÓï.~Úá´¬Öæ]ïp$„ô†3ºP;³˜†ÝÿêÈR X“S¹KK©†“xòC)-Õáß:ä èL›BòOÌTðxè…_í2h}Ÿì“y>W™ö¼§—»8ÙÛ÷cŸ»ŒwÏ^=Nåí-f:MâI4¢7·g‡| ’7¹m+À?)cÈã¨Nù™n´ð·©j ä4LªMÈòŸ÷kžAÇ8Œö&†¾™^õFŸrÂÝCFÁ¢ÅÉ+±üù>}£'®9ªóÏ4÷Z9:;ÈšY%™âÍò›“ó\–Ùòda›æÇÞÔ¢³äÔîRÒêa¤Þ<ÊcKuxwιz&м“ó<:cí2h}Ÿì“y>W™ö¼§—»8ÙÛ÷cŸ»ŒwÏbŠÏS¹{KYŽ“x’M(íÙáßäîD›JðÊXò8ê}2½ê>å…º†ƒE‹’W;cùò<|ûFO\s@¿‰Ðµ}cÃr+"Ã)»³”Û¹.GE8Ï<³7¡5ÔhÌϤX³Þ¦¤æË^ƪ«pvÞ¼Ýxãž+‘øotmtÝrÇLž=NÈ}¥å-òcQ¹â”‰ äýÍýp'_Úû_xJÞú×CšDDŠÂÖHT?vw… ¼Œ6ÃòŸ” §ñÇÒü+ø]â¯ãOâдéµ§[Í-*Æ¥›.äU³¹¶©Ú®ØFÌøñ¿Aý¡¾YøÓÃvz­Ž—u4°,ZÅ™·—tnUˆÁd‘r>ôlËœ©!•Õu>%ë.Òü¯¿ô }oÅéï>™¥t°YÏp8X™ƒoݘL±äºù¯Ã_üi´ñŽ›£k? ¼3áo‡‰lâþÅ×il!Ž Am±6F­ór»UP…_º¾R¯¤Ãahb2Ê–*¬dÚ“«¾Uxû6ï&ÛN-jß2ÖÖ1rjk·§êt´¿‰¿‹~#Añ:Ó×¾Mr Eg™"ÛÄDyC7#¤. ùÄë9\F!­_ŽŸü!ûEü8Ô|ã];íÚUÖ$Šhˆ[‹)À!. rÉWqÁÁV ŒÊox[âφüo®øÇFðýôZÎ¥áK•²Ô­í'…Ù'h÷ù`oÈ å m«½$LîÂôË}3=’>åE–‘‹E‹b;dùòI<|›†G\s^f>¥YÖýí5MÚ>êN+áŠNϬ’Ro«wê\RKGsñ—ÓxÃþ Oñ3Çz7ŒþØ|Tð7ˆ¬âÓ­õçO"íåiJÅæ´r¬~jG8šÍÁ,Ð+d@ÒZýŽ<à‰¾/Ò/x&x7Ãþ%øâkد–ÃÀ~%¸Šò-FîXÁmi,óCs •`šF3£`e4Rÿc“f¸¬6³oš3jœ¥Ì¹à¹Z"”šiÇ™KÜÒ1·ðŒzޤaФñxBm ]ÜX[ܸ·I%ˆJ̲KÞ\ è®[Í]Ësö³¿Æ¯ÛÓÆlÔ<)¤Oâû+ M:ÊAâU¶‚-v\ÂÊÓK–I`|I(f‘â¹FfÝäH¿i…ϳ<›.«IÓv‚„Tå 'yA·IE¥6£5VíY'¢g<©B¤Ó¾ÿŸô»íá­ã'ÅoÛYñçƒîümaeá;ém5? üE¹‹G³·ÅþÏ´šÕo¢ž'Ù®D |±nþcÈé=´…Ûügø?ãûO‹í~[$‚ãÃqw¿‡¼GmÝy¶pC4—7ÊL‘)rf_š'Ž˜¼ñÞ,ðP¾£jú„¼§é³C{¢Y]i—6W“›f&Öæ'–ížI¡º\E9`Ää!Ã×βgìc¯ñ€Œ^ñ=LJtϬø‚×Zh0Ù‚òÇ †yXŠÇ¼öç1Íˬ %ùXœfg£IJXXÓåæTÒ„`ù–‹“Ús="¥ ]J×ms=ÚŒ+ûëþ_yë¾1ý¡~/þÛðÞ|ý´¸âøo¤ØYiZÇ‹_γk«aû‡y$žY$‚Ö^¢ß2ÝI/¸¸ibDxà?Á/ÙÆŸ¾Zø*ˆ_õ}FmZOJ-’úÙá·“uôŠï•H>T•D’)’â dú[ö|ÒþhŸ4H¾hºu—€¯mVòÖûG ‡ °“1'Î{ŒDªí*—Êí¼_$ø÷ÿ_öñÑbÒ<[­iºuÜëz êzp½³‚ÒI,àÔ¬nL\k ¤ A#|ßeùÒâàÊ8xs±Y†'ë•=”©Óªß3œ_7+Ÿ"rÑ»Íiî©_K¢«K– •^íaüxøWáŒ/4?GªÜxz ¢Ô®­tyn[•·q)ˆÇ^ep¥|°¬ÄP 6\ÏÙ×@øn|~ø:éþ2† NhKþÏ•Àˆ$a¢À ª*#ýÛy·š]ûoøÊÓÁ~ñ½«ÛÜÚèúŒº…ÅØ âHc‰¤ÆªÅ‰P§†'¦zÕ‡_l¾(x/Ã)Ñ´ÝR=#_´‘5ý¸¶’Ý åD±»9è­ua†V(ÊÇÂŽ'²¹QN~Ç}§ìîÕÜ\mg'Ë^úríÔÖÑç¾—üNº©èÌϤX³Þ¦¤æË^ƪ«pvÞ¼Ýxãž*95;”´º˜i7$2˜ÒÝ^ó®@Þ„É´/$üÅOŽ€ÐMlhz,R^i/¥Û[Ø$αI †³.à…<`ö¯ÔÊñÉ:øn5gY¥w€3ª‹t'†ÀèÇ8ç†Uõ»Jâ|eqmdºíÕŒ—º¦³0y™·¹^]þà.[FÞ:¦¾™^õFŸrÂÝCFÁ¢ÅÉ+±üù>}£'®9  ”U5¾™žÉNŸr¢áKHŢű ²|ù$ž>MÃ#®9¨äÔîRÒêa¤Þ<ÊcKuxwιz&м“ó<:$LÇW¹Sz’ ‚",‚®èŽé3!=püž?tqÔÕÊÏG‘uù—û3l/j‡ûIY>vÿ¹aÿ(mÀ຤zËÚZÌt›Ä’iDonÏø$or$ÚW€~RÇ‘ÇP4(ªm}2½ê>å…º†ƒE‹’W;cùò<|ûFO\sBßLÏd§O¹Qp¥¤bÑbØ…ÎÙ>|’O&á‘×ÐÊò¯Ú[þIÖ‘ÿcŸ„ÿõ!Ó«ÑdÔîRÒêa¤Þ<ÊcKuxwιz&м“ó<:áÿ´·Œµ²éü ž þÊÿ„ÏÂñTùúwöwü‡4çûŸkûWÞýßú½ÏÜùèè (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€+jzežµ¦Ýéú…¤öq<·1‰"š6]ÊA ‚0A¯‚¦ÿ„Î?‰Z®ìàû­.ÞˆºÑ¢gfšd2}¥“Ê`ʉû<Èñ¹‰&>þ¯‹¿lí_Åþ1xwâ·‡üsðËÀVãD:ÒxÌÞÉwª/žó4oŠ2Ñ:´j$VgËm`oû8hþ0‡âmõæ¥û7øOà‡ÓGx~ß§Ýi÷ZíËMXÃÚ`,!Ë+¯,# ðE}5_1þÈ>!|s¾Ôµ]gÆ ¼Wá+kc<šŠ_Áv] ~r]7ÉA7U¸à5}9@Q@>뿱5ýSYêÞ(µð®·©gUð]®«³F¾º.²;ÉÍà;¨fEuBz¯JúT"…P@À ¥¢€<«ö±ÿ“XøÉÿbf³ÿ¤3Wª×•~Ö?òk?ìLÖô†jõZ(¢Š(¢ŠÏÓ$ïua Ô×-Ò‰£”’°?“™.Ò­Æyv÷B«Û}«Î»ûG“äù£ìÞVwy{;óü[÷ôã{æ¬PEPYúœ%î’&ºšÞFºa qwòe%•Ú¹Ç(¾ÀèU{ŸµyÖŸgò|Ÿ4ý§ÍÎï/ccf?‹~μcw|PŠ(¢€ (¢€ ó¯ ^/ƒî,m{›ï êËé—²rQÝAÚà*•ÞN@ÀÓïèµ{ ¯‰<;޹2\ÏÞK¸(ß"Œ–Þì¢!¹‡¯Fšš ”_*³Ÿ¼Ü­Ë%9R—3~òvQ^ò–¯&›ßð'ø;Åþ“ƺ?Šmï<76• ×Ï?—g²´ù™‹€#`RU1<œ8Rµ“ã¯øU~%ø³àox¯ûÿ⇮ørÆûk]Űlycþú z›s"‚mËGçÿµŸÀ?ü@øW ^xOVñ‰à¨¢ÔtøJóì&ýâGF´x¿Õù>_–ľz(”CËì@Óü!â1ãÿkT†|¦øvãO¸ðÝÆ“Ô­$Û´pC<2â(¬‘“îq‰wFöùÒ¡¥Ic(W”öªÍ¨¸Ú>âæÜ¹“´½ÈEÝÅIj6äß+]¿¯é³ý¤< ð·Åž"ðÆã?j³x—ÅðÝøGMñƒe;]XÅ,/,®"R#\Fãç 6IpL tkÁZ%÷¿hßüAÔ|C¡Ãð“Wð–e¡kž(º¹’óìðÉ9cçÎÑ>Øc»™åÁýÛ,ŠÅžñ›èÝSK³ÖôÛ½;Q´‚ÿO¼…íîm.£Y"ž'R®ŽŒe`H ŒH5ãþéÞð_Ãë_‡_ |+®ßø/Wµ}ËZ¸khôØ@·3¤žM¬d%÷1Dø–X‘¯-ÍcS²úµ$”¢áiI8%'Íx¹J*ÆwæVæ–öDÎ|éyÿ]úž{ðŸáDºÆÿø™­ðŸÅ0ßkz–‰¥ø~3q{#E¤èñ‰&d‘%p yñºÉ×’æáÛAý«õOx6ËÅÚ/ ¼Aac£Z̶ֳjö×0%ÖÇ“ýLjò891¶Ø[ÍUóŒ·ðÛÄWW×þ&ðïü wÞ Ñ<1w—¤Í0-5 e‚6Y-’&;#\í Œ´d8–(»ŸµyÖŸgò|Ÿ4ý§ÍÎï/ccf?‹~μcw|Vy†k µŸ×¨*’Š‚ƒrJÔÖ©KÙr©ÍŨ¹7t•­u¡ v^ë¶ÿÌn—¥Ùèšm¦§ZAa§Ù–öÖ–±¬qA(TDE*¨ òŽÿ õMC]Ñ>$øcÆ0x;Ä~„Áqy®O<š@ÒÚx¥½2Û‰£w— ù›€Ãt‚{h¢¾oŽ­‚Ä,E7®·½šié$ÓM4ÓiÝ3iEIYœ7üPŸ´ŸÂoùqñ—Õ.ìbþԺ״[¸Eß“ ¢Ø ‡îâ9 ½â+Oøáæ‘oà/èšçˆ…å’_Ûê7ïinbi]̲fbq ó¢Ã'‡*uVÐRŒšræ²z¥¬›ååVÑ«nÝÞ†·Ó˜ôŠ(¢¼²ÂŠ(  ø$€ë÷ˆ·S=е€½«寅åÚê1ÌCƒÏH×§Ъéö¯í ·ù?aò“ÊÛŸ3ÌËïÝÛn<¼cœîÏj±@Q@yWí-ÿ$ëHÿ±ÏÂúéÕêµå_´·ü“­#þÇ? ÿêC§PªÑEQEQEQEQEQEQEQEQEQEQEQEQEQEWË¿-uŸ†ß´‡‡þ,·Ãm_↣ðÛèFÛGy¨è×_i3}¢+w*\JŒ™G”3ÁÃ}â?QÕü3«Øèú±Ðu{«9 ³ÕVÝ. ”ì„G8‰þY61 ±¸m¸<ø÷âÖ“ñgà~€š·Œ?l™4Èç*ÒÑ~érÝ^ËÆ"·y\’¼às@§À{mgâOíâ‹ ðÛWøaá©<6š‘â+hìõfëí"_´Kn…Š‘J+9Ü|ÓØa~¢¯“ÿc‹ÚCSñ.¯âO‹~,¹»ð5Å›C¢èzÖ‹c§ê­!’6[«ˆí“÷E‘|£#Ÿæ¨¯¬(¢Š(¢Š(Ê¿kù5ŒŸö&k?úC5z­yWícÿ&±ñ“þÄÍgÿHf¯U Š( Š(  ý28÷V0ÚÍo#])šIA ;ù1é“Êí ¼c”ort*‹3]j¯Rè ÀX•Taå'îÛ’N_žq ì\ Š( ³õ8à{Ý$Ík5Ä‹tÆ"¬äÊ ¾ ´²óž]}ˆÐªwÌËu§…½KPg!¢eRnG”ÿ»\ò8~9Äg±4rŠ( Š( ³ü=hbZÚÍcj¶±­nB›ÔpI!€À9'‘ZOFf}"Åžõ5'0FZö5U[ƒ´~ðàëÇñ@j}¶«e5¥Ü+=¼«µãn„CÜÈ5ŬšïÃÛvF‡ûsÃÐd¬ªØ¹·‹+÷‡F 7cœ•¼¢€*išµžµh·671Ý@Š6ÎÁAÁE[®FÿÁw:v Ú†.aÒ§uUšÍãÿFœ1>éÆy<ñŒ’a‡âšPH¼I¤Ýiî×(žm±;7pÃ<ž~Q»Ï\tG×ïmfK£k{¦Ë‘˵ç”—'Ž’/^1¡Yzf§o©êWoi«Û_@°Ä>ËnÈæÌ™rÀ“óŒË8êkR€<÷Ç^ –ëŰø³Rñþ«áÿéºý¦©¢Cs”« V7r\€²ÂÑ"1óÕ“ Qãhš¯ÀûÏxcà†.<%âoí?‡únÛ]Õ/̘¶‰N÷šY1åìÚÁ„l(0Ó+†ømâ+«ëÿxwþ;ïèž»‹KÒf˜@–š…²Á,–É‘®v…ÆÚ2K^äq1)Q“|´Ü]“ŒW*r_ ¯)ÞzKV“wVJÙY)_¹óßìÑ㟅´ßÆû¿‹Ú=þ¹¤|@ƒH—Oÿ„bó]Y#:h¹xâº6ñ»mݰoˆHäeÆLÜKõn§{¤™­f¸‘n˜Ã$@•ü™AwÁáv–^s˯±´M/ÃZ&¥&£ÚiV…žinö–1ŰX£L¶ˆQ@+ ‘p#Ú”/ñVó2ÝiáoRÔÈh™T›‘å?î×<‚ŽqìMVwާÅsÐŒ£N)F”¹œb¶ŠvZ+éåÔ)ÅÂ6{—(ª—ú½Ž—³í·¶ö~fvyòªnÇ\dóÔ~uËMñMT<^Ònµyw[—O*Ø›¹cŽG)۞Ǧ|R·ÄïŠ? õ_Â<-©ëšn·©› ÝNÅâi)仉¥V`Ì LaF0’þ\róZÅ /xãIð%γcá»ÍnÒKû]2ký£iì‹ÑCBžYRV]ë˜í´Ï.¤š¿ˆ.ÿ´5vx`B~Ímœcb‘œ€'õ#uRÕü{áÍ?ã'‡<%s¥_Mâ­CH½»²ÔãÒd’-’H<øšè.Ø÷°„•Î3AʳÀ$õ0ñ†&ÔÕÜa6Ü[»i9)J÷VеÒJéowrÖ·-øÃÇ~ ø+á‹+Ïk:…´Fº‡O‚kÙDq™¥m¨¹=OÞfcª»± ¬Ã:Çá^ƒ¨øËÂ>;ûoNÔ4]].ËM}BxíÒ ¼¦+5¾ý­"ùj9ÎHRÛÚ(Z:^(ñ>£ã;ÿ§‚´ï øë²êð¿ˆ.îu5ìø yk<*ˆêònkYç?4$²yðúŒÌúE‹=êjN`Œµìjª·hýà À ׎9â®JxP”I©){Ëá~íœV±m^ê[ÅÅ¡|MßbåQ^A QEŸp ~ñÖÖdº6°º`|¹<»QNq¹Irxé"õãN&c«Ü©½IAAWtGt™ž¸~Ϻ8êjåQEå_´·ü“­#þÇ? ÿêC§Wª×•~ÒßòN´ûü'ÿ©@«EPEPEPEPEPEPEPEPEPEPEPEPEPEP/`×n¼¯Cá{›[/Éa:iw7ÊZÞ+³^@%í$xƒ_ü7ý—¿iÿ‡Þ.¼ñÞ¥ðwÆÞ:º,Å^+]^îú(Îq;JGoÉaD89¯¾( ø:Ÿ´øšèüVŸá´žûyÁÐê wö­é·y¸bž^Ï78ù·líšö*( Š+Žñ'Á¿xÇÆ_‹5ßèšÇ‰ô¯+ìÅí„rÝZùRcòä`Yv»3  $PÏþøšH¾'|Bø¥ñƒÄŸ tm:òtðÌ>ׄq¯“<Ñ‹‰å“y1É»<*ŽF=öUñ—‹>!~ÎÞñŽ-M§Šµ.9ïU¢òŒ‡$$¥™#¿t¯›µ |ZÖ¾8xŸÅ¾9ýŸ5Šö¼Ñø>üU¥E¦i¶BÃ4vrM´I1¥•Fݵö?€uÍoÄžÓõ/xjok3«›{ÈnÞØ‡` Ë (ÙP­òž7c¨4Å~Ö?òk?ìLÖô†jõZò¯ÚÇþMcã'ý‰šÏþÍ]ƒ> |=øqw-ׄ¼ ០ÝK2mG·³wÀ`2Ñ¢“€ì?àGÔÐgEgÉáí*[K«WÓ,ÞÖîS=Ä-šBA.ëŒ3d“ϬgZÿh}»ìÐý»Êò>Óå3ËÎvnë·<ã¦hÅŸ‡´¨­-mSL³K[IDöð¬$:.0­’NG<š‘´m=ÞõÚÆÙžùB]1…sp¡v'0‘ƒž(±V[­@µ’Zƒ8+*²“r<¤ýãcAÊsÎ#ˆ«•‡¥iZGö…ËAM>Ÿ8Š5’1‹mâ\ ˆcØH^2Çè.Iáí*[K«WÓ,ÞÖîS=Ä-šBA.ëŒ3d“Ï€4(ªÿÙÖ¿Únû4?nò¼´ùcÌòó›ºíÏ8隯‡´¨­-mSL³K[IDöð¬$:.0­’NG<šÐªwÊÍu§•²K '%¥fPm‡”ÿ¼\òI8N9ć°46§»Þ»XÛ3ß(K¦0®n.Ð$ãæ0sÁÅgê:V‘¡áÆ’4µžÒw‹OXcmä1ò§–à`f5ô€nQYòx{J–ÒêÕôË7µ»”Ïq @…&Kºã ÙäóÀ«ÙÖ¿Únû4?nò¼´ùcÌòó›ºíÏ8éš±EgÇáí*+K[TÓ,ÒÖÒQ=¼+†@I‹Œ+d“‘Ï&¤mOw½v±¶g¾P—La\Ü(] IÇÌ$`烊¹TôedÒ,Uì“Mqa¬£ee·;GîÁ^^œqÇ.§£Ù:ØÛ+Ø©KV®mÔ®Ò#ãå01ÀÅeèZ‡uá[x ·‡QÓ/bŽáÞêcxJ©J ÎØV,Ã9 ‚Нýký¡öï³Cöï+ÈûO–<Ï/9Ù»®Ü󎙪ñø{JŠÒÖÕ4Ë4µ´”Oo À!C¢ã Ù$äsÉ  dÐÇqÅ*,‘:•tq•`x Žâ«6§»Þ»XÛ3ß(K¦0®n.Ð$ãæ0sÁÅ £ièöN¶6Êö*RÕ„+›u+´ˆøùA p1@ÕïÃRÔ¯MmbhPÇwo1@\ï 0p¥B¡É%úpiçÁ:œ«&›â­J&ÚUÅö.”Ž1€ØñדÏnsy4-mSW²6ðÍö˜¡¸»ÓÞ6ìKÊVb»p]Ù[s“å&qìë_í·}š·y^GÚ|±æyyÎÍÝvçœtÍs1[øâÕLBëE½Uc¶{„‘$q“‚ʃh8ì?3ÖÿÏýKßù·#ðö•¥­ªi–iki(žÞC $‡EƲIÈç“R6§»Þ»XÛ3ß(K¦0®n.Ð$ãæ0sÁÅy½¯ÂËë_êž3µÒ¼-¥x³Vµ‚Âû_³·‘®ä·²«ó ¤ãh= â q{v¯|ªÞßØË¨k·úY°%³d´£Ë“2mÜI!8ÁÞH®¹tm=ÉÖÆÙ^ÅJZ°…sn¥v‘( Ž+/Vд6k;K›xb†öù¥kD…|«ÙÌR1ó—i —ËhskRµJÍ:’ri$®ïd•’ôKDº!$–Ä:gÃé{Ji±ÜHa{¢eÝÓ’­òƒÇPzèá†;x’(‘c‰*" *Àvöu¯ö‡Û¾ÍÛ¼¯#í>Xó<¼çfî»sÎ:f«Çáí*+K[TÓ,ÒÖÒQ=¼+†@I‹Œ+d“‘Ï&²ñGáv‘ñsöº.µuªÚZ[ê6šš>©Mc)–Þe•x˜¤¨ã¨8t+"#®ç‰ôÏäù>iûO›Þ^ÆÆÌýxÆîø«Ÿ©ÇÞé&kY®$[¦0É%`&P]ðx]¥—œòëì@…Q@Q@WÓþÕýŸmöï'íÞRùÿgÏ—æ`nÙžvç8Ï8«Ÿáèà‹@ÓÖÖkUµˆEkp’Ø6£‚I É<ŠÐ¢Š(¢Š(º}«ûBmþOØ|¤ò¶çÌó2û÷vÛ/ç;³Ú¬V|À5ûÇ[Y’èÚÀéòä@òíE9Æå%É㤋׌hPEPUî~ÕçZ}ŸÉò|ÓöŸ7;¼½˜þ-û:ñÝñV+?S޽ÒLÖ³\H·La’ JÀþL »àð»K/9åר€ (¢€ (¢€ ¯§ý«û>ÛíÞOÛ¼¥óþÏŸ/ÌÀݳ<íÎqžqV+?ÃÑÁ¦%­¬Ö6«kŠÖà$)°mG’ ’y¡EPEPtûWö„ÛüŸ°ùIåmÏ™æe÷îí·^1ÎwgµX¬ø#€k÷޶³%ѵ€=ÓåÈåÚŠsÊK“ÇI¯РŠ( ¼«ö–ÿ’u¤Øçá?ýHtêõZò¯Ú[þIÖ‘ÿcŸ„ÿõ!Ó¨Õh¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ ý®¿jÍöLøh|K¨iï¯ê÷2yZv‡þKÝG˜ìû_˂ϴ€Y« ÷*ò¯ÚÇþMcã'ý‰šÏþÍ^«^UûXÿɬ|dÿ±3YÿÒ«Õh¢Š(¢Š(‹3]j¯Rè ÀX•Taå'îÛ’N_žq ì\ªv*Ëu¨²KPgeVRnG”Ÿ¼lr9NyÄc±r€ (¢€ §|Ì·Zx[Ôµr&U&äyOûµÏ ƒ‡ãœF{W*ò³]iål’è ÉiY”aå?ï<’NŽq!ì \¢Š(¢Š(ªz33é,÷©©9‚2×±ªªÜ£÷€/7^8犹TôedÒ,Uì“Mqa¬£ee·;GîÁ^^œqÇrŠ( Š(  q3^åMêH‚ˆ² »¢;¤Ì„õÃðxýÑÇSW*œJÃW¹cd‘¡‚ /C.éNé3pœž?zqÐÕÊ(¢Š*ó2ÝiáoRÔÈh™T›‘å?î×<‚ŽqìM\ªwÊÍu§•²K '%¥fPm‡”ÿ¼\òI8N9ć°4rŠ( Š( ©èÌϤX³Þ¦¤æË^ƪ«pvÞ¼Ýxãž*åSÑ•“H±W²M5ò•–Üí»x!zqÇPÊ(¢€ (¢€)ÄÌu{•7©"""È*îˆî“2×Àã÷GM\ªq+ ^å’F†€½ »¥;¤ÌduÂpFxýéÇCW(¢Š(¯*ý¥¿äiö9øOÿR:½V¼«ö–ÿ’u¤Øçá?ýHtêõZ(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ã¼Iañisè熬|*žWö…Ž¥£\\ßM‰ —ɸK¸Ò<Ç´.èŸkNàvŽÆŠüËý´,¼7ÁŽþ,ñçà nßQÔ„N•¬KL—NÑôhµÑVìÎ^wQ$Œ"ÉfE ,`×èç„u«ÿøvÓPÕ4 ß ßM¿ÌÒu­åž 9Q¹­ä’3¸Ãkžg Iâo h¾5Ðî´_éöt\iÚ²\ÛÌãpU°ÊÈêíZ”å_µüšÇÆOû5Ÿý!šº/i_¬nåoø£Ã:ݩǗ‹á»9׆ÎZKû€y+ü#=rçkù5ŒŸö&k?úC5z­gɪm.•/,Öé¥&ÞF´r‘Ç‘…uóAvÆ~`Ê9/66]hoó¡û•'É>g™Ÿ½¿v6ã»sžwv«P|pj¢ÒÕ^òÍ®–Pn$[G $y9T_4”lcæ,Ãòó#E¨½+slÔ Pmؘ›o&Cæ~ðggdõ«”P”.P¹êirbœ.¡>_³Å…ƒ/ˆÓ\ƒæd¹äÕÉ ÕM¥Ò¥åšÝ4¤ÛÈÖŽR8ò0®¾h.ØÏÌG#åãŷڼ뿴y>Oš>Íågw—±s¿?Å¿N1·¾jÅWÙuý¡¿Î‡ì>V<Ÿ$ùžf~öýØÛŽ6íÎyÝګǪ--Uï,ÚéeâE´p’G“•EóIFÆ>bÌ8?/8P6‹P/zVæØ#¨ Û±16ÞL‡ÌýàÎÎ8ÉëYúˆ¸MCÂ}M >{¬‘Cy/ÙäùGÎB ß »”^r9ܪ÷?jó­>Ïäù>iûO›Þ^ÆÆÌýxÆîø  òAª›K¥KË5ºiI·‘­¤qäa]|Ð]±Ÿ˜2ŽGËÆ —_Úüè~ÃåcÉòO™ægïoݸãnÜçݪÅŸ¨´µW¼³k¥”‰ÑÂINUÍ%ù‹0àü¼àHÑjïJÜÛuÔv&&ÛÉùŸ¼ÁÀÙÇ=jåMbÔÙ¹¶(ŠEÐì ­·ƒó?v3“ƒ¿Ž2:Ö^„—³xVÜÙjðÞy‘FöW×V®Å *¥LªdÜ®Il¦IÎÑŒ‚«éÿjþ϶ûw“öï)|ÿ³çËó07lÏ;sœgœP²ëûCØ|¬y>Ió<Ìýíû±·mÛœó»µWŽ TZZ«ÞYµÒÊ Ä‹há$'*‹æ’Œ|Řp~^p4(  m ^ô­Í°GP-A·bbm¼™™ûÁœ œq“Ö…‹PdZæØ¢)@[°2¶Þ gÌýØÎNþ8ÈëW( }õµM^(µxN¦b…â…í\ÛÛÀ^]„§˜7;b@Ìs±>QŽv6]hoó¡û•'É>g™Ÿ½¿v6ã»sžwv¡>Õý¡6ÿ'ì>Ry[sæy™}û»mÇ—ŒsÙíV(>85Qij¯yf×K(7-£„’<œª/šJ61óaÁùyÀ‘¢Ô Þ•¹¶ê¨6ìLM·“!ó?x3ƒ³Ž2zÕÊ(šÅ¨²-slQ‹ -Ø[o3æ~ìg'du¬½Y/U¬Ñõxmo¥¾o°ìµs*CåL‚OŸ$lîA¹P㌂«Üý«Î´û?“äù§í>nwy{1ü[öuã»â€ —_Úüè~ÃåcÉòO™ægïoݸãnÜçݪ¼pj¢ÒÕ^òÍ®–Pn$[G $y9T_4”lcæ,Ãòó¡EShµ÷¥nm‚:j »mäÈ|ÏÞ ààl㌞´,Z€{"×6ÅHºÝ•¶ðc>gîÆrpwñÆGZ¹Egɪm.•/,Öé¥&ÞF´r‘Ç‘…uóAvÆ~`Ê9/5ü=¾]?Lš×PûvÖ1yR\FÆæc€VW°ÎWÉÎ{VÅWÓþÕýŸmöï'íÞRùÿgÏ—æ`nÙžvç8Ï8  ñÁª‹KU{Ë6ºYA¸‘m$‘äåQ|ÒQ±˜³ËΠ^ô­Í°GP-A·bbm¼™™ûÁœ œq“Ö®Q@Ö-@=‘k›bˆ¤]nÀÊÛx1Ÿ3÷c98;øã#­G$©´ºT¼³[¦”›yÑÊGF×ÍÛùƒ(ä|¼`èQ@ðo>/¼Û¨oŒXÁ¿OhÛ÷dÉ.ÙU÷mù°êFÜþíNGØŽ TZZ«ÞYµÒÊ Ä‹há$'*‹æ’Œ|Řp~^p,'Ú¿´&ßäý‡ÊO+n|Ï3/¿wm¸òñŽs»=ªÅShµ÷¥nm‚:j »mäÈ|ÏÞ ààl㌞´,Z€{"×6ÅHºÝ•¶ðc>gîÆrpwñÆGZ¹Egɪm.•/,Öé¥&ÞF´r‘Ç‘…uóAvÆ~`Ê9/>ûKi¾8û.‘wÿ ‡ÿá ÿ„ÏÂñ(þÁŸûGþCšpÿß¶ùë~oøöû¿/_ž¾€¯*ý¥¿äiö9øOÿR:€=VŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( *ý¬äÖ>2Ø™¬ÿé Õêµå_µüšÇÆOû5Ÿý!š½V€ (¢€ (¢€3ôÈàKÝXÃk5¼t¦i%,ïäĦO+´*ñŽQ½ÉЪv,Íu¨½K 'bUPm‡”Ÿ»lrI9~yă°r€ (¢€ ÏÔãït“5¬×-Ódˆ°?“(.ø<.ÒËÎyuö#B©ß3-Öžõ-Aœ†‰•I¹SþísÈ áøçžÄÐÊ(¢€ (¢€ ÏðôpE i‰kk5ªÚÄ"µ¸I lQÁ$†äžEhU=™ô‹{ÔÔœÁkØÕUnÑûÀ€¯sÅ\¢Š(¢Š(>àýã­¬Étm`tÀùr yv¢œãr’äñÒEëÆ4*œLÇW¹Sz’ ‚",‚®èŽé3!=püž?tqÔÕÊ(¢Š+?S޽ÒLÖ³\H·La’ JÀþL »àð»K/9åר §|Ì·Zx[Ôµr&U&äyOûµÏ ƒ‡ãœF{@(¢Š(¢Š+?ÃÑÁ¦%­¬Ö6«kŠÖà$)°mG’ ’y¡TôfgÒ,YïSRse¯cUU¸;Gï^n¼qÏrŠ( Š(  ø#€k÷޶³%ѵ€=ÓåÈåÚŠsÊK“ÇI¯Ъq3^åMêH‚ˆ² »¢;¤Ì„õÃðxýÑÇSW(¢Š(¯*ý¥¿äiö9øOÿR:½V¼«ö–ÿ’u¤Øçá?ýHtêõZ(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (®;ÄŸ|?áOi~¿[mWRò¾ÎÖ^Ô.íG™!|˨`xbù”çÌuÚ0Í… пüOðo/¬l¼KâÝÃ×—Ç–ú®¥ ¬—8ýÚÈÀ·,èž=»–ÛL±ñ5´‘ãsk^Õ4´9 x{«xÕ¾éèN8ï €vtV|šå´v—W&;ô¦U²˜¹`@Ê Mμ™ANx5cíÑÿh}lÞw•çnòËÛœcÌÆÍÙþçãbŠÏ\¶’ÒÖäGx#¹”BŠÖS It)¹ƒó0¡Ï"¤mV{Ô)s›5&-e!]ß»;q!À蛈MrÚ;K«“áŽÚS ªÙL\° e&ç^GÌ Ž§<±öèÿ´>Ƕo;Êó·yåíÎ1æcfìÿsŽqбEgÇ®[Iikr#¼ÜÊ!Ek)ƒ†$ŒºÜ‹Áù˜Ðç‘R6« ½ê¹Íš‡“²À®ïݸàtMÄ:ñ@*žŒ¬šEн’i® Œ5”l¬¶çhýØ+Á ÓŽ8â…Õag²@—9¼RñæÖPÝû÷œ´“Ç^+/Bñž|+oym6¥cQÆ·YÎ÷ª›v“p –U ò{tU·Gý¡ö=³yÞW»È/nq37gøsœsŒUxõËi--nDw‚;™D(­e0pÄ‘—B›‘x?3:ò(BŠ¦Ú¬*÷¨Rç6jLZÊC»¿vvâCÑ7xëÅ ªÂÏd.sx¥ãͬ ( »÷‡n#8=i'޼P°ÕîXÙ$h`ˆ Ð˺SºLÆG\'gÞœt5r¹ôñžš¦¯0›Ry­b†9í>Ç;å $h/¸î“p"1Øf¶>Ýö‡ØöÍçy^vï!ü½¹Æ<ÌlÝŸáÎqÎ1@(¬øõËi--nDw‚;™D(­e0pÄ‘—B›‘x?3:ò*FÕaW½B—9³PòbÖRÝû³·‰¸ƒÇ^(åS¾Vk­<­’]9-+2ƒl<§ýâç’IÂqÎ$=¡uXYì%Îo¼yµ”w~ðíÄg£í$ñ׊ËÕ¼A§ÀÖsÏ6¥“|Ð$0ÙÎMÄ‚)2»"mÜá”mÊž( ¢«ýº?í±í›Îò¼íÞCù{sŒy˜Ù»?Üãœb«Ç®[Iikr#¼ÜÊ!Ek)ƒ†$ŒºÜ‹Áù˜Ðç‘@U6ÕaW½B—9³PòbÖRÝû³·‰¸ƒÇ^(]V{$ s›Å/me@]ß¼;qÁèûIzñ?ìÁ∼Wã-GáçÅKχÚGŒ§ûfµ¥G£Áz>ÔÑ,RÜÚÈì¦ $DMć†àÆ=oágÃ]àïÿø+ÑI‹¢Z-¥¸™÷ÈÀr]ÎY˜–$2Çt®ªŠò¯ÚÇþMcã'ý‰šÏþÍ^«^UûXÿɬ|dÿ±3YÿÒ«Õh¢Š(¢Š(½·Ú¼ë¿´y>Oš>Íågw—±s¿?Å¿N1·¾jÅgé‘À—º±†ÖkyéLÒJYßɈLžWhUã£{“¡@Q@W¹ûWiö'ÉóOÚ|Üîòö66cø·ìëÆ7wÅX¬ýN8÷I3ZÍq"Ý1†H+ù2‚ïƒÂí,¼ç—_b4(¢Š(¢Š*¾Ÿö¯ìûo·y?nò—Ïû>|¿3vÌó·9ÆyÅX¬ÿGZ˜–¶³XÚ­¬B+[€D¦ÁµH`0IäP…Q@Q@Óí_Úoò~Ãå'•·>g™—ß»¶ÜyxÇ9ÝžÕb³àޝÞ:ÚÌ—FÖ÷L—"—j)Î7).O$^¼cB€ (¢€ ¯sö¯:ÓìþO“柴ù¹ÝåìllÇñoÙ׌nYúœp=î’fµšâEºc ‘Vòeß…ÚYyÏ.¾ÄhQEQEU}?í_Ùößnò~Ýå/Ÿö|ù~fí™çnsŒóбYþŽ´ 1-mf±µ[X„V·‰!Mƒj8$À`“È  (¢€ (¢€+§Ú¿´&ßäý‡ÊO+n|Ï3/¿wm¸òñŽs»=ªÅgÁ_¼uµ™.¬î˜.D.ÔSœnR\ž:H½xÆ…QEå_´·ü“­#þÇ? ÿêC§Wª×•~ÒßòN´ûü'ÿ©@«EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP•~Ö?òk?ìLÖô†jõZò¯ÚÇþMcã'ý‰šÏþÍ^«@Q@Q@ìYšëP z—@NĪ Û)?vØä’rüó‰`*åS±V[­@µ’Zƒ8+*²“r<¤ýãcAÊsÎ#ˆ«”QEU;æeºÓÂÞ¥¨3Ñ2©7#ÊÝ®y?â3Øš¹TëO+d—@NKJÌ Û)ÿx¹ä’pœs‰`håQ@Q@SÑ™ŸH±g½MIÌ–½UVàí¼xºñÇø^ÇÄ׋¨ø’×KµƒS¼S‘=Ò¢iÿiÃÆ€8ÏÚÇþMcã'ý‰šÏþÍ^«Y>,ð¶—㟠ë>Öí~Û¢ëSi÷ÖÞcGçA*äMÈC.UˆÊFx ×ÿ Óáú ü@ÿÃâþN U¢¼«þ§Â?ôøÿ‡Ä?üGü3O„è/ñÿ?ˆù:€=VŠò¯øfŸÿÐ_âþÿòuðÍ>ÿ ¿Äü8þ!ÿäêë|!â«øƒÆö†øÜhZÄzuà»+å‰[O³¹F >_—ssƒ¿Ìã'¨¯²ý”ü§\ßÜZ]øâÖâþasy,?¼@s("HEö]„qF›ŽNØÐtP¿øfŸÿÐ_âþÿòuz­å_ðÍ>ÿ ¿Äü8þ!ÿäê?áš|#ÿAˆøqüCÿÉÔêµËø¿ÅV>ñ‚,.Íð¸×u‰4ë1hWË2®Ÿyr|ü|¿.ÚLc'—Æ2G%ÿ Óáú ü@ÿÃâþNª—¿²Ÿ€õ› ‹»¿]\XLnlå›âˆ­¥1¼FHɾÊ1ŽYpÁÛ#ŽŒAö +Ê¿áš|#ÿAˆøqüCÿÉÔÃ4øGþ‚ÿ?ðãø‡ÿ“¨Õh¯*ÿ†iðýþ áÇñÿ'Qÿ Óáú ü@ÿÃâþN U®_ágЬ|uðÇÂ$Ó óiºÎg¨ÚL©º1K HžvÒG™µ†ì3œ\—ü3O„è/ñÿ?ˆù:ªi?²Ÿ€ô *ËLÓ.üq§i¶P¥µ­§Ä/E "…HÑøUPP(Ø(¯*ÿ†iðýþ áÇñÿ'Qÿ Óáú ü@ÿÃâþN U¢¼«þ§Â?ôøÿ‡Ä?üGü3O„è/ñÿ?ˆù:€:Ý?ÅV7Ÿµÿ Æo¿´´ýMÔgû(ŠâkèãòùÏ™ºÒ]ùcÊÁ<㨯öSð:­Æ§ߎR¹†+iïâˆÒÅHÑÆÏöì²£M)U'ÈäcqÍ¿øfŸÿÐ_âþÿòuz­å_ðÍ>ÿ ¿Äü8þ!ÿäê?áš|#ÿAˆøqüCÿÉÔêµËø¿ÅV>ñ‚,.Íð¸×u‰4ë1hWË2®Ÿyr|ü|¿.ÚLc'—Æ2G%ÿ Óáú ü@ÿÃâþNª—¿²Ÿ€õ› ‹»¿]\XLnlå›âˆ­¥1¼FHɾÊ1ŽYpÁÛ#ŽŒAö +Ê¿áš|#ÿAˆøqüCÿÉÔÃ4øGþ‚ÿ?ðãø‡ÿ“¨Õh¯*ÿ†iðýþ áÇñÿ'Qÿ Óáú ü@ÿÃâþN U®_ágЬ|uðÇÂ$Ó óiºÎg¨ÚL©º1K HžvÒG™µ†ì3œ\—ü3O„è/ñÿ?ˆù:ªi?²Ÿ€ô *ËLÓ.üq§i¶P¥µ­§Ä/E "…HÑøUPP(Ø(¯*ÿ†iðýþ áÇñÿ'Qÿ Óáú ü@ÿÃâþN U¢¼«þ§Â?ôøÿ‡Ä?üGü3O„è/ñÿ?ˆù:€:Ý?ÅV7Ÿµÿ Æo¿´´ýMÔgû(ŠâkèãòùÏ™ºÒ]ùcÊÁ<㨯öSð:­Æ§ߎR¹†+iïâˆÒÅHÑÆÏöì²£M)U'ÈäcqÍ¿øfŸÿÐ_âþÿòuz­å_ðÍ>ÿ ¿Äü8þ!ÿäê?áš|#ÿAˆøqüCÿÉÔêµå_´·ü“­#þÇ? ÿêC§Qÿ Óáú ü@ÿÃâþN¡?foý²ÂââãÆŸØomµmõOëw¶þ}¼É<.ðÍxñ¾ÉcGÔŒ¨â€=VŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š*¦­«XèUî§©ÞÛéÚm”/suyw*Å "–yØ€ªª ,HM[¢¾Ný²~'hž;ýšäÖüã/[ð…·ˆôûÉá­n&šöÀJ†êÂÞhŸþ>Ó¢Š(¢Šå?álxþ¿øBá2ðÿü&ô.jAý£þ«Îÿ}þgú¯Þ}ß»ótæ€:º+òÛÀúׂ¾0|Õ~1øÿDøŠž%Ôu[»Ù>'h±;AáHÒí–Þ+`f`Š$Mæ8d_™ÃTãô÷G»ŠÿH±¹†ñ5f$Kȱ²u*cŒ09ãŽhåQ@Ïø×â…~éQj~/ñ6á]6Y…´wšÝüVp¼¥Y„aäeŠ£¹ÎžÆ¼¿ã?Åk½zÛÃ~øe«[Ýx³Çßj´Öìd[ˆt­ €fÕw)*ÃkªÃÎGLd p¢¾`ÿ‚h+'ìUàyd™Äú¸2JÛÏö­ç,{“Ü×ÓôQEQ^7ãoé¿´oÂxwàïÅ/?ˆ¥¶ŽÕµSŠøé¢VÁvò²3F“<à ü¼|äÿüð÷ö—øaáŸÙñ.G‹t­PÿÂw>›}=Õªé>S‰—Rvf®ö” ó†à|´÷Q@Q@ù· |7µø©ûxÃöÔ5-N?‹óE¬x£Nñ$wó$Ú`³¸›Èµ…CìXDvÁ {pwœç|0ñD¾7øká/\(Iõ}"ÓP‘Uv€ÒÂ’nZ€:j(¢€ (¯–¾<|ø}?Ž,ÑÿjÚN/ê««øªh΢Š(¢Š(¢¿-¼­x+ãÁýWãôOˆ©â]GU»½“âv‹´.Ùmâ¶`æ¢DÞc†Eùœ1%N?Ot{¸¯ô‹˜oQ†hD¼‹'R ‰8Þ8æ€.QEQE|cû^®…uûHü8±ø‘g¨ø»á­Ö‡~ 𞆓Þ\Q]X]ÍeoûÙ¡XC p¬¨ç»²@>΢¾hÿ‚~Ý]ß| ÔnF¡-߆eñ&¤Þ´»¼ûMÞ›¤‰@·´¸bÌË,d>cf,€ªžFÒôQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQES]TduŒ0Êà CN¢€<{öøuñƒÁ:·‡/ìôxkÄ^(Ñæ»·2Yµå«‰pŠA1°fRTäpFqƒ‡ð›àÏŽ‡ÇMgâçÄ»ï'ˆfðü^°Ò|-罤‹pnI%™U䑤#h £ç5ï´PEPP}†Ûí?hû<_hÿž»þ˜ë×§=ñõ×ì·ñsEøgâO‚þñ/„,þk_C¥{orúΛ§ÞJòOj‘ÝJÃÍ•VFu8##8ÇÕžðÝŸƒ|/£èpuÓô«8lm„‡,"‰&Os…«EQEEqk Úžæ@rE 3ëÍy‹ÿfo‡þ6ñ•ÇŠõ -f×_¸´ŠÆkÍÄšž™æAcl¶·© ]±Çs^§Exì[û7\þÌßl|9«^ ß´“µü¶º­Ý݉êâH|ˆç!a>\ÊË7°%·½òŠ(¢Š(ËhŸøÃÆ_üUáφ7úw†¼[ªÂ–ÐjWR½´pÆd_8ù‘Fî¬bóX)!˜1šó_‚~øçð¦ÃVžø9áßÛO¼‡@Ô53uääy²'™n““ºFùÞ=ëéÊ(¢Š(¢Š(ã»ÏÙ7⎙ðãÅ|9â Ù|#×oîž;ùã¸:Æ™§ÝNf¸³Š0 RròªÈÎ8s•'úßDÑí<;£XiZ|B xímâ;#E «Ï UÚ(¢Š(¯’~"üø×ª~ÒÚ·Äm#Oøiâ­.ÚÞÚ×ÂöÞ0¿¿hª±ƒq$qEnѬ²ÊX™-µPE}mEqß åø/†åo‰6Þµ×þÒÂ4ð­ÅÄÖ¾FÕÚKNˆÛ÷oÈÆ1·žµØÑEQEpß> øGã$z2øªÊòéôk£{§ÍaªÝéó[LP¡u’ÚXß;Y‡^„בüý`øQûG|FøöëÙô}V=1t($ñ.§wqŠÖXn¾Ú³HVpL€Çæ4»;|³_JÑ@Q@Q@]~Ë4_†~$ø/áoøBÏá6±5ô0êW¶÷/¬éº}ä¯$ö©ýÔ¬<ÙUdgS‚23Œ}YáO Ùø7Âú>§]?J³†ÆØHrÂ("d÷8QZ´PEP^ñgàÇŽOÇ-âçÃKÿ·ˆ Ð%ðÅþ“âŸ=-.-qp°†xäYÏÊÁ”ãŒsï”P‘~Ìßu‚ž ×a×u[m_Äþ&ñ÷‰õ™ôøZ+D»ºe/İB(¹$qœ]¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÌÿƒÞý—5üsŸã4Þ Åƒâ‡ˆV!â-E-î>Ëö³ Χfã&:澨_‰ÞøGð×À:/Ào‡ò|Cе»›«}? \Ñíef¸–âû¯šÒuÉfÈÅ}E|½íÇká¿|_¿ñ÷‚¯<-â†?a:¾e¨E¨¤Âô¢gP€ï$¹Wfr{Óø?ã·Äíg[M']ø'q¡Í©iWú6£i¯Ç¨é“MK{»˜aÅ¡|¨WÛ <íÝŒP½Q_6Á;¼yâÿ‰_²gƒõÿNú†«p÷K§=ë\Ï} Ü8Ë”_-ƒof_å[w͵|ÛÁ¦Ÿà?ÛöØø‡&‘§ªø_AЮ Ëùr4#HiådÃlYÖœQN(íÊ+äGý»|C¦xWá§‹5o‚ú´ññ´²Ò'²Ömç¼}Bâ$0}•—#+*JιQ½‘3¶»? üT|}⟂>A¡_bîÿgË©GªÙj6 ?–°6²Ê€m ò¤ƒ€2ôEóü>$‡ö)ðh¡'Õ•Ttj·˜ôýQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|kðxühø ­|XÓáø©ø³NñµŸØjv~%Ò­ÒKk™‹ä–pêJ l0nÁƒWþ3é~5XxVºø_«éº‘¬]¯ˆ>ÇâÛ[kfÝ­[\ «y„f8åi …äRÛFF¯®è ƒ¼û=üPðGˆþ<É¡|&ðw‡ôÏé\ÚF“wuî‘ –Ò[+ȆÖy'IŒŠ¦0äåÛ©é¿g¿¾3ð¿Ç+Äz?ÉþøßMº‹ZðàñBjvºÅÔ›|“ ´NÑÀ"!›ÈH m9û.Šùûöøyâï„?³_‡¼ ãmûZðõÅÝ )y Ìw‘4ï2\FѱڧÍ+µðÀ¡ÈŒùáÝGÆ´íñ éÿkÕµOè66vûÕ<Ù¥Ðî5ÜÄ(Ë0$žH¯¸+ˆÐ¾ øCÃ_üKñLÓgµñ‰ †ÛV¼]BäÅv¢$[­Ì†ȱ¨0ùùÛ â_~8Ô>~ɾ·Ñ<ÍcÀÞ ð½÷ˆm¾×û6–2ErÛ‹í“c°Œ±låA× GðÓÄ‹ûs\|B:oüRðâ=j>|\ß Mç1y{¼Ïõlvݼã9â½Ú²|Uá‹ø~óFÔšñlnÔ,¦Âú{)À mšI9V óÇüSþL·À_õñ«ÿéÚò¾®[á‡Ã üð>›àÿé§Iðîœe6Öfâ[‚†I^Y?y+3¶^GnXõÀ㺚(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÙgnss-sdr-0.0.9/src/utils/gnuplot/8_GAL_GNSS_SDR_solutions.txt000066400000000000000000011321261305042567700237720ustar00rootroot00000000000000 time X [m] Y [m] Z [m] Long [deg] Lat [deg] h [m] E(Acc) [m] N(Acc) [m] Up(Acc) [m] E(Pre) [m] N(Pre) [m] Up(Pre) [m] Tot Sat Gal GPS GDOP 2013-Sep-20 09:11:06 4171690.09174 872117.69124 4730009.42695 11.80798 48.17153 526.40674 -2.07473 3.46782 1.81609 -3.26635 1.54475 -11.95848 8 8 0 1.77 2013-Sep-20 09:11:06 4171695.90195 872122.87945 4730017.22237 11.80803 48.17153 536.71635 1.81473 3.63768 12.12569 0.62312 1.71460 -1.64887 8 8 0 1.77 2013-Sep-20 09:11:06 4171695.87749 872123.03123 4730016.66439 11.80803 48.17153 536.30532 1.96830 3.26026 11.71466 0.77668 1.33718 -2.05990 8 8 0 1.77 2013-Sep-20 09:11:06 4171695.91773 872123.24279 4730016.35685 11.80803 48.17152 536.13130 2.16715 2.99355 11.54064 0.97554 1.07047 -2.23392 8 8 0 1.77 2013-Sep-20 09:11:06 4171695.80487 872123.64854 4730016.04804 11.80804 48.17152 535.88289 2.58741 2.80805 11.29223 1.39580 0.88497 -2.48233 8 8 0 1.77 2013-Sep-20 09:11:06 4171696.04572 872123.57449 4730016.18529 11.80804 48.17152 536.13228 2.46564 2.73520 11.54162 1.27403 0.81213 -2.23294 8 8 0 1.77 2013-Sep-20 09:11:06 4171696.85509 872123.52515 4730015.79008 11.80804 48.17151 536.35940 2.25173 1.88882 11.76875 1.06011 -0.03425 -2.00582 8 8 0 1.77 2013-Sep-20 09:11:06 4171696.91214 872123.33123 4730015.96118 11.80803 48.17152 536.49768 2.05024 1.99089 11.90702 0.85862 0.06781 -1.86754 8 8 0 1.77 2013-Sep-20 09:11:06 4171696.23707 872123.07517 4730016.02781 11.80803 48.17152 536.07170 1.93773 2.56675 11.48104 0.74612 0.64368 -2.29352 8 8 0 1.77 2013-Sep-20 09:11:06 4171696.58685 872123.30575 4730016.13060 11.80803 48.17152 536.40809 2.09185 2.34502 11.81744 0.90024 0.42194 -1.95712 8 8 0 1.77 2013-Sep-20 09:11:06 4171696.87751 872123.33042 4730016.34070 11.80803 48.17152 536.75776 2.05653 2.26937 12.16711 0.86491 0.34630 -1.60746 8 8 0 1.77 2013-Sep-20 09:11:06 4171696.53195 872123.66688 4730015.87975 11.80804 48.17152 536.23462 2.45658 2.16271 11.64396 1.26497 0.23963 -2.13060 8 8 0 1.77 2013-Sep-20 09:11:06 4171696.57287 872123.68392 4730016.09343 11.80804 48.17152 536.42288 2.46489 2.27277 11.83222 1.27327 0.34969 -1.94234 8 8 0 1.77 2013-Sep-20 09:11:06 4171697.02839 872123.70216 4730016.50696 11.80804 48.17152 537.03087 2.38953 2.21352 12.44021 1.19791 0.29045 -1.33435 8 8 0 1.77 2013-Sep-20 09:11:06 4171697.69570 872123.58690 4730016.57371 11.80803 48.17151 537.50049 2.14015 1.78890 12.90984 0.94853 -0.13418 -0.86472 8 8 0 1.77 2013-Sep-20 09:11:06 4171698.06350 872123.88883 4730016.53937 11.80804 48.17151 537.75620 2.36043 1.45168 13.16555 1.16882 -0.47139 -0.60902 8 8 0 1.77 2013-Sep-20 09:11:06 4171698.67387 872123.60070 4730016.87180 11.80803 48.17151 538.36303 1.95350 1.27213 13.77238 0.76188 -0.65094 -0.00219 8 8 0 1.77 2013-Sep-20 09:11:06 4171698.33898 872123.79140 4730016.61963 11.80804 48.17151 537.98254 2.20869 1.31914 13.39188 1.01707 -0.60393 -0.38268 8 8 0 1.77 2013-Sep-20 09:11:06 4171698.10171 872124.16670 4730016.64385 11.80804 48.17151 537.89692 2.62460 1.45112 13.30627 1.43298 -0.47195 -0.46830 8 8 0 1.77 2013-Sep-20 09:11:06 4171699.18887 872124.09479 4730017.20895 11.80804 48.17151 539.01787 2.33174 1.04601 14.42722 1.14013 -0.87707 0.65266 8 8 0 1.77 2013-Sep-20 09:11:06 4171699.46096 872124.18783 4730017.06175 11.80804 48.17150 539.09851 2.36714 0.73520 14.50785 1.17552 -1.18787 0.73329 8 8 0 1.77 2013-Sep-20 09:11:06 4171698.71337 872124.28852 4730016.47044 11.80804 48.17151 538.18362 2.61867 0.87078 13.59296 1.42705 -1.05230 -0.18160 8 8 0 1.77 2013-Sep-20 09:11:06 4171698.84586 872124.44077 4730016.25661 11.80804 48.17150 538.13154 2.74060 0.60832 13.54089 1.54898 -1.31475 -0.23367 8 8 0 1.77 2013-Sep-20 09:11:06 4171699.23296 872124.29130 4730016.74645 11.80804 48.17150 538.72885 2.51508 0.67544 14.13819 1.32346 -1.24763 0.36363 8 8 0 1.77 2013-Sep-20 09:11:07 4171699.85309 872124.00482 4730016.76314 11.80803 48.17150 539.10700 2.10775 0.27795 14.51634 0.91614 -1.64512 0.74178 8 8 0 1.77 2013-Sep-20 09:11:07 4171700.44920 872124.15646 4730016.95920 11.80803 48.17150 539.66292 2.13420 -0.04921 15.07227 0.94259 -1.97229 1.29770 8 8 0 1.77 2013-Sep-20 09:11:07 4171700.84145 872124.12219 4730016.95783 11.80803 48.17149 539.91328 2.02039 -0.33099 15.32263 0.82877 -2.25407 1.54807 8 8 0 1.77 2013-Sep-20 09:11:07 4171702.64676 872123.97936 4730018.00266 11.80803 48.17149 541.85083 1.51116 -0.92916 17.26017 0.31954 -2.85224 3.48561 8 8 0 1.77 2013-Sep-20 09:11:07 4171702.80212 872124.05742 4730018.23628 11.80803 48.17149 542.13698 1.55577 -0.89858 17.54633 0.36415 -2.82166 3.77176 8 8 0 1.77 2013-Sep-20 09:11:07 4171703.15548 872123.78902 4730019.14642 11.80802 48.17149 543.00921 1.22074 -0.50841 18.41855 0.02912 -2.43149 4.64399 8 8 0 1.77 2013-Sep-20 09:11:07 4171703.66010 872123.52228 4730019.83110 11.80802 48.17149 543.81240 0.85639 -0.37918 19.22175 -0.33523 -2.30225 5.44719 8 8 0 1.77 2013-Sep-20 09:11:07 4171704.12674 872123.19999 4730020.13818 11.80801 48.17149 544.30186 0.44543 -0.46560 19.71120 -0.74619 -2.38868 5.93664 8 8 0 1.77 2013-Sep-20 09:11:07 4171704.39919 872123.03315 4730020.38764 11.80801 48.17149 544.64283 0.22637 -0.47251 20.05217 -0.96525 -2.39559 6.27761 8 8 0 1.77 2013-Sep-20 09:11:07 4171704.36739 872123.08830 4730021.07685 11.80801 48.17150 545.14315 0.28685 0.00191 20.55250 -0.90477 -1.92117 6.77793 8 8 0 1.77 2013-Sep-20 09:11:07 4171704.35253 872123.27179 4730020.94373 11.80801 48.17150 545.05931 0.46950 -0.10401 20.46865 -0.72212 -2.02709 6.69409 8 8 0 1.77 2013-Sep-20 09:11:07 4171705.28703 872123.16709 4730021.26569 11.80801 48.17149 545.89495 0.17579 -0.55493 21.30429 -1.01583 -2.47801 7.52973 8 8 0 1.77 2013-Sep-20 09:11:07 4171704.61945 872123.31400 4730020.46477 11.80801 48.17149 544.88241 0.45619 -0.62455 20.29176 -0.73542 -2.54763 6.51719 8 8 0 1.77 2013-Sep-20 09:11:07 4171705.22865 872123.19679 4730020.98194 11.80801 48.17149 545.64946 0.21681 -0.70612 21.05881 -0.97481 -2.62920 7.28424 8 8 0 1.77 2013-Sep-20 09:11:07 4171705.29153 872123.10987 4730021.28873 11.80801 48.17149 545.90725 0.11886 -0.53412 21.31659 -1.07276 -2.45720 7.54203 8 8 0 1.77 2013-Sep-20 09:11:07 4171705.32056 872122.86269 4730021.39416 11.80800 48.17149 545.97103 -0.12903 -0.44730 21.38038 -1.32065 -2.37038 7.60581 8 8 0 1.77 2013-Sep-20 09:11:07 4171705.21878 872122.83842 4730021.27904 11.80800 48.17149 545.81550 -0.13196 -0.44614 21.22484 -1.32357 -2.36922 7.45028 8 8 0 1.77 2013-Sep-20 09:11:07 4171705.29993 872122.69109 4730021.34134 11.80800 48.17149 545.89478 -0.29278 -0.44130 21.30413 -1.48439 -2.36438 7.52956 8 8 0 1.77 2013-Sep-20 09:11:07 4171705.12943 872122.44827 4730021.42910 11.80800 48.17150 545.81573 -0.49556 -0.22140 21.22508 -1.68718 -2.14448 7.45052 8 8 0 1.77 2013-Sep-20 09:11:07 4171705.27132 872122.20763 4730021.06649 11.80800 48.17149 545.60532 -0.76015 -0.53002 21.01467 -1.95177 -2.45310 7.24010 8 8 0 1.77 2013-Sep-20 09:11:07 4171704.46387 872122.19636 4730020.56629 11.80800 48.17150 544.70397 -0.60595 -0.27295 20.11331 -1.79757 -2.19603 6.33875 8 8 0 1.77 2013-Sep-20 09:11:07 4171704.09102 872122.00552 4730019.84640 11.80800 48.17149 543.89811 -0.71645 -0.45200 19.30745 -1.90807 -2.37508 5.53289 8 8 0 1.77 2013-Sep-20 09:11:07 4171704.03068 872122.16931 4730020.09435 11.80800 48.17150 544.06583 -0.54379 -0.26761 19.47518 -1.73541 -2.19068 5.70061 8 8 0 1.77 2013-Sep-20 09:11:07 4171704.54052 872121.95102 4730019.91054 11.80799 48.17149 544.23189 -0.86179 -0.72877 19.64124 -2.05341 -2.65185 5.86667 8 8 0 1.77 2013-Sep-20 09:11:07 4171704.52586 872121.68599 4730020.07563 11.80799 48.17149 544.30918 -1.11820 -0.56757 19.71852 -2.30982 -2.49064 5.94396 8 8 0 1.77 2013-Sep-20 09:11:08 4171703.46781 872121.59008 4730019.42381 11.80799 48.17150 543.11970 -0.99558 -0.21592 18.52905 -2.18720 -2.13900 4.75448 8 8 0 1.77 2013-Sep-20 09:11:08 4171703.56751 872121.39341 4730019.33126 11.80799 48.17149 543.08898 -1.20849 -0.32038 18.49832 -2.40010 -2.24346 4.72376 8 8 0 1.77 2013-Sep-20 09:11:08 4171703.78695 872121.17941 4730019.32935 11.80799 48.17149 543.20160 -1.46286 -0.44908 18.61094 -2.65448 -2.37215 4.83638 8 8 0 1.77 2013-Sep-20 09:11:08 4171702.38976 872121.19839 4730018.61087 11.80799 48.17150 541.75675 -1.15838 0.08795 17.16609 -2.34999 -1.83513 3.39153 8 8 0 1.77 2013-Sep-20 09:11:08 4171701.44190 872120.89196 4730017.97117 11.80799 48.17150 540.61951 -1.26436 0.39941 16.02885 -2.45597 -1.52367 2.25429 8 8 0 1.77 2013-Sep-20 09:11:08 4171701.17321 872120.84805 4730017.55023 11.80799 48.17150 540.12445 -1.25236 0.32134 15.53380 -2.44397 -1.60173 1.75923 8 8 0 1.77 2013-Sep-20 09:11:08 4171700.64844 872120.79280 4730016.99803 11.80799 48.17150 539.36288 -1.19905 0.34426 14.77222 -2.39066 -1.57882 0.99766 8 8 0 1.77 2013-Sep-20 09:11:08 4171700.72657 872120.72234 4730016.68361 11.80799 48.17150 539.16998 -1.28400 0.08833 14.57933 -2.47562 -1.83475 0.80476 8 8 0 1.77 2013-Sep-20 09:11:08 4171700.51847 872120.71210 4730016.79140 11.80799 48.17150 539.11306 -1.25145 0.31356 14.52240 -2.44306 -1.60951 0.74784 8 8 0 1.77 2013-Sep-20 09:11:08 4171699.59564 872120.58738 4730016.39961 11.80799 48.17150 538.20168 -1.18468 0.74438 13.61102 -2.37630 -1.17869 -0.16354 8 8 0 1.77 2013-Sep-20 09:11:08 4171699.69147 872120.74568 4730015.50668 11.80799 48.17150 537.62047 -1.04934 0.05485 13.02982 -2.24096 -1.86823 -0.74475 8 8 0 1.77 2013-Sep-20 09:11:08 4171699.67028 872120.96928 4730015.08224 11.80799 48.17150 537.32089 -0.82614 -0.24684 12.73023 -2.01776 -2.16992 -1.04433 8 8 0 1.77 2013-Sep-20 09:11:08 4171699.13180 872120.92148 4730014.75810 11.80800 48.17150 536.72132 -0.76274 -0.06298 12.13066 -1.95436 -1.98605 -1.64390 8 8 0 1.77 2013-Sep-20 09:11:08 4171698.54056 872120.79994 4730014.87738 11.80800 48.17150 536.40766 -0.76072 0.46634 11.81700 -1.95233 -1.45674 -1.95756 8 8 0 1.77 2013-Sep-20 09:11:08 4171698.50011 872120.78189 4730014.88532 11.80800 48.17150 536.38471 -0.77011 0.50389 11.79405 -1.96173 -1.41919 -1.98051 8 8 0 1.77 2013-Sep-20 09:11:08 4171698.01279 872120.82226 4730014.73284 11.80800 48.17150 535.95848 -0.63087 0.75149 11.36783 -1.82249 -1.17158 -2.40674 8 8 0 1.77 2013-Sep-20 09:11:08 4171697.64538 872120.79023 4730014.75466 11.80800 48.17151 535.73052 -0.58704 1.03890 11.13987 -1.77865 -0.88417 -2.63470 8 8 0 1.77 2013-Sep-20 09:11:08 4171697.90082 872120.86625 4730014.52607 11.80800 48.17150 535.73732 -0.56490 0.68855 11.14666 -1.75652 -1.23452 -2.62790 8 8 0 1.77 2013-Sep-20 09:11:08 4171696.84326 872120.98850 4730014.35915 11.80800 48.17151 534.93926 -0.22883 1.32995 10.34860 -1.42044 -0.59312 -3.42596 8 8 0 1.77 2013-Sep-20 09:11:08 4171695.60891 872120.90577 4730014.10071 11.80800 48.17152 533.92962 -0.05722 2.07051 9.33896 -1.24884 0.14744 -4.43560 8 8 0 1.77 2013-Sep-20 09:11:08 4171695.08337 872120.85036 4730013.77167 11.80801 48.17152 533.33381 -0.00391 2.24285 8.74315 -1.19553 0.31977 -5.03141 8 8 0 1.77 2013-Sep-20 09:11:08 4171694.09677 872120.84585 4730013.32604 11.80801 48.17152 532.35709 0.19357 2.66594 7.76644 -0.99805 0.74287 -6.00813 8 8 0 1.77 2013-Sep-20 09:11:08 4171694.13998 872120.97457 4730013.49489 11.80801 48.17152 532.52867 0.31072 2.72741 7.93802 -0.88090 0.80433 -5.83655 8 8 0 1.77 2013-Sep-20 09:11:08 4171693.90878 872120.92639 4730013.89902 11.80801 48.17153 532.67231 0.31087 3.17290 8.08166 -0.88075 1.24983 -5.69290 8 8 0 1.77 2013-Sep-20 09:11:08 4171693.35721 872120.96302 4730013.44275 11.80801 48.17153 531.97727 0.45959 3.26532 7.38661 -0.73202 1.34225 -6.38795 8 8 0 1.77 2013-Sep-20 09:11:09 4171693.26965 872120.98206 4730013.41088 11.80801 48.17153 531.89896 0.49615 3.30504 7.30831 -0.69546 1.38196 -6.46625 8 8 0 1.77 2013-Sep-20 09:11:09 4171693.42279 872120.46546 4730013.89642 11.80801 48.17153 532.29022 -0.04085 3.59593 7.69957 -1.23247 1.67285 -6.07499 8 8 0 1.77 2013-Sep-20 09:11:09 4171693.28081 872120.22254 4730013.87537 11.80800 48.17153 532.14870 -0.24958 3.72248 7.55805 -1.44119 1.79940 -6.21652 8 8 0 1.77 2013-Sep-20 09:11:09 4171693.05769 872120.19556 4730014.09385 11.80800 48.17153 532.16217 -0.23033 4.03504 7.57151 -1.42195 2.11197 -6.20305 8 8 0 1.77 2013-Sep-20 09:11:09 4171693.16991 872120.29757 4730014.99737 11.80800 48.17154 532.92260 -0.15345 4.54019 8.33194 -1.34506 2.61712 -5.44262 8 8 0 1.77 2013-Sep-20 09:11:09 4171693.51563 872120.33168 4730015.60656 11.80800 48.17154 533.60687 -0.19080 4.68910 9.01622 -1.38242 2.76602 -4.75834 8 8 0 1.77 2013-Sep-20 09:11:09 4171693.82702 872120.32165 4730015.89222 11.80800 48.17154 534.02164 -0.26435 4.65402 9.43098 -1.45596 2.73095 -4.34358 8 8 0 1.77 2013-Sep-20 09:11:09 4171693.23686 872120.22858 4730015.86014 11.80800 48.17154 533.59978 -0.23468 5.07726 9.00913 -1.42629 3.15419 -4.76544 8 8 0 1.77 2013-Sep-20 09:11:09 4171693.91039 872119.99872 4730016.40519 11.80800 48.17154 534.41423 -0.59750 4.98456 9.82357 -1.78911 3.06148 -3.95099 8 8 0 1.77 2013-Sep-20 09:11:09 4171694.67842 872119.82583 4730017.41799 11.80799 48.17154 535.64668 -0.92389 5.12616 11.05602 -2.11551 3.20309 -2.71854 8 8 0 1.77 2013-Sep-20 09:11:09 4171695.38824 872119.66040 4730018.64519 11.80799 48.17155 537.00190 -1.23108 5.45209 12.41124 -2.42269 3.52902 -1.36332 8 8 0 1.77 2013-Sep-20 09:11:09 4171696.14748 872119.48348 4730019.58292 11.80798 48.17155 538.17213 -1.55962 5.55068 13.58147 -2.75124 3.62760 -0.19309 8 8 0 1.77 2013-Sep-20 09:11:09 4171696.35202 872119.75902 4730020.40644 11.80799 48.17155 538.95689 -1.33176 5.90868 14.36624 -2.52338 3.98561 0.59167 8 8 0 1.77 2013-Sep-20 09:11:09 4171696.88313 872119.57599 4730020.96384 11.80798 48.17155 539.69397 -1.61960 5.92094 15.10331 -2.81122 3.99786 1.32875 8 8 0 1.77 2013-Sep-20 09:11:09 4171696.74152 872119.83100 4730021.09193 11.80799 48.17155 539.73177 -1.34102 6.07077 15.14111 -2.53263 4.14769 1.36655 8 8 0 1.77 2013-Sep-20 09:11:09 4171697.49636 872119.43551 4730021.60929 11.80798 48.17155 540.55606 -1.88260 5.92553 15.96540 -3.07421 4.00246 2.19084 8 8 0 1.77 2013-Sep-20 09:11:09 4171698.55101 872119.63121 4730022.17056 11.80798 48.17155 541.68946 -1.90686 5.50077 17.09880 -3.09848 3.57770 3.32424 8 8 0 1.77 2013-Sep-20 09:11:09 4171698.65235 872119.79319 4730022.74501 11.80798 48.17155 542.20576 -1.76904 5.78526 17.61510 -2.96066 3.86219 3.84054 8 8 0 1.77 2013-Sep-20 09:11:09 4171699.15523 872119.98931 4730023.14050 11.80798 48.17155 542.85551 -1.67998 5.65232 18.26485 -2.87160 3.72925 4.49029 8 8 0 1.77 2013-Sep-20 09:11:09 4171699.69836 872120.06239 4730022.99798 11.80798 48.17154 543.11383 -1.71959 5.14999 18.52317 -2.91121 3.22692 4.74861 8 8 0 1.77 2013-Sep-20 09:11:09 4171700.43395 872120.14453 4730023.06653 11.80798 48.17154 543.65630 -1.78971 4.64665 19.06565 -2.98132 2.72358 5.29108 8 8 0 1.77 2013-Sep-20 09:11:09 4171700.99916 872120.20326 4730023.33523 11.80798 48.17154 544.23351 -1.84789 4.40465 19.64285 -3.03950 2.48157 5.86829 8 8 0 1.77 2013-Sep-20 09:11:09 4171701.38000 872120.19520 4730023.24155 11.80798 48.17153 544.41120 -1.93370 4.06563 19.82055 -3.12532 2.14255 6.04598 8 8 0 1.77 2013-Sep-20 09:11:09 4171701.05789 872120.68972 4730022.56067 11.80799 48.17153 543.76107 -1.38374 3.77108 19.17041 -2.57536 1.84800 5.39585 8 8 0 1.77 2013-Sep-20 09:11:09 4171701.46908 872120.91525 4730022.18295 11.80799 48.17153 543.77882 -1.24712 3.18488 19.18816 -2.43874 1.26180 5.41360 8 8 0 1.77 2013-Sep-20 09:11:10 4171701.58023 872120.93919 4730022.09128 11.80799 48.17153 543.78632 -1.24643 3.03902 19.19567 -2.43805 1.11595 5.42111 8 8 0 1.77 2013-Sep-20 09:11:10 4171701.80771 872120.92451 4730022.17428 11.80799 48.17152 543.99467 -1.30735 2.93070 19.40402 -2.49897 1.00762 5.62945 8 8 0 1.77 2013-Sep-20 09:11:10 4171702.10623 872120.94227 4730021.68139 11.80799 48.17152 543.82469 -1.35106 2.38154 19.23404 -2.54268 0.45847 5.45947 8 8 0 1.77 2013-Sep-20 09:11:10 4171701.70547 872121.06963 4730021.31991 11.80799 48.17152 543.31111 -1.14438 2.41336 18.72045 -2.33600 0.49028 4.94589 8 8 0 1.77 2013-Sep-20 09:11:10 4171701.29361 872121.27502 4730020.42354 11.80799 48.17152 542.40235 -0.85906 2.08465 17.81169 -2.05068 0.16157 4.03713 8 8 0 1.77 2013-Sep-20 09:11:10 4171702.15788 872121.29444 4730020.53918 11.80799 48.17151 543.05535 -1.01690 1.52843 18.46470 -2.20852 -0.39465 4.69013 8 8 0 1.77 2013-Sep-20 09:11:10 4171701.31166 872121.48948 4730019.49044 11.80800 48.17151 541.74810 -0.65283 1.41649 17.15744 -1.84445 -0.50658 3.38288 8 8 0 1.77 2013-Sep-20 09:11:10 4171700.67722 872121.69934 4730018.88083 11.80800 48.17151 540.90834 -0.31758 1.44069 16.31769 -1.50920 -0.48239 2.54312 8 8 0 1.77 2013-Sep-20 09:11:10 4171700.47169 872121.57520 4730019.02829 11.80800 48.17151 540.86711 -0.39704 1.70787 16.27645 -1.58866 -0.21521 2.50189 8 8 0 1.77 2013-Sep-20 09:11:10 4171700.26985 872121.78261 4730018.47553 11.80800 48.17151 540.35177 -0.15272 1.45482 15.76112 -1.34433 -0.46826 1.98656 8 8 0 1.77 2013-Sep-20 09:11:10 4171699.73759 872122.01538 4730018.01140 11.80801 48.17151 539.69024 0.18405 1.49802 15.09959 -1.00757 -0.42506 1.32502 8 8 0 1.77 2013-Sep-20 09:11:10 4171700.16240 872121.76984 4730017.92161 11.80800 48.17151 539.86713 -0.14323 1.16572 15.27648 -1.33484 -0.75735 1.50191 8 8 0 1.77 2013-Sep-20 09:11:10 4171699.29143 872121.89182 4730017.54829 11.80801 48.17151 539.03704 0.15440 1.53343 14.44639 -1.03722 -0.38965 0.67183 8 8 0 1.77 2013-Sep-20 09:11:10 4171698.64043 872122.24875 4730016.64809 11.80801 48.17151 537.99001 0.63700 1.35347 13.39936 -0.55462 -0.56960 -0.37521 8 8 0 1.77 2013-Sep-20 09:11:10 4171698.18542 872122.54080 4730015.68603 11.80802 48.17151 537.01597 1.01597 0.99921 12.42531 -0.17564 -0.92386 -1.34925 8 8 0 1.77 2013-Sep-20 09:11:10 4171698.10300 872123.04312 4730016.01069 11.80803 48.17151 537.27263 1.52453 1.19926 12.68198 0.33292 -0.72382 -1.09259 8 8 0 1.77 2013-Sep-20 09:11:10 4171698.38702 872122.90404 4730016.09107 11.80802 48.17151 537.49895 1.33027 1.06691 12.90830 0.13866 -0.85616 -0.86627 8 8 0 1.77 2013-Sep-20 09:11:10 4171698.97352 872122.98792 4730016.08821 11.80802 48.17150 537.89112 1.29236 0.62443 13.30047 0.10075 -1.29864 -0.47409 8 8 0 1.77 2013-Sep-20 09:11:10 4171699.03122 872123.03134 4730016.27658 11.80802 48.17150 538.07508 1.32306 0.70135 13.48443 0.13144 -1.22173 -0.29014 8 8 0 1.77 2013-Sep-20 09:11:10 4171698.24631 872123.17208 4730015.22339 11.80803 48.17150 536.79713 1.62143 0.55001 12.20648 0.42982 -1.37307 -1.56809 8 8 0 1.77 2013-Sep-20 09:11:10 4171698.34021 872123.15179 4730015.39629 11.80803 48.17150 536.98449 1.58236 0.59992 12.39384 0.39074 -1.32315 -1.38073 8 8 0 1.77 2013-Sep-20 09:11:10 4171697.25542 872123.30277 4730015.09553 11.80803 48.17151 536.07285 1.95213 1.16755 11.48219 0.76052 -0.75553 -2.29237 8 8 0 1.77 2013-Sep-20 09:11:10 4171696.98971 872123.22913 4730014.99540 11.80803 48.17151 535.81474 1.93442 1.30580 11.22408 0.74281 -0.61728 -2.55048 8 8 0 1.77 2013-Sep-20 09:11:10 4171697.24527 872123.46579 4730014.80902 11.80803 48.17151 535.87498 2.11377 0.95902 11.28432 0.92216 -0.96406 -2.49024 8 8 0 1.77 2013-Sep-20 09:11:10 4171697.63081 872123.46298 4730014.65850 11.80803 48.17150 536.01411 2.03214 0.57786 11.42346 0.84052 -1.34521 -2.35111 8 8 0 1.77 2013-Sep-20 09:11:11 4171697.58770 872123.52009 4730014.77275 11.80803 48.17150 536.07890 2.09685 0.67678 11.48824 0.90524 -1.24629 -2.28632 8 8 0 1.77 2013-Sep-20 09:11:11 4171697.37301 872123.46831 4730014.35261 11.80803 48.17150 535.61862 2.09010 0.56108 11.02797 0.89849 -1.36199 -2.74660 8 8 0 1.77 2013-Sep-20 09:11:11 4171697.62418 872123.51841 4730014.53636 11.80803 48.17150 535.92634 2.08774 0.49279 11.33569 0.89612 -1.43029 -2.43888 8 8 0 1.77 2013-Sep-20 09:11:11 4171698.05794 872123.35000 4730014.81075 11.80803 48.17150 536.39097 1.83414 0.38508 11.80032 0.64252 -1.53800 -1.97425 8 8 0 1.77 2013-Sep-20 09:11:11 4171697.76922 872123.72142 4730014.69968 11.80804 48.17150 536.17041 2.25678 0.46496 11.57976 1.06516 -1.45812 -2.19480 8 8 0 1.77 2013-Sep-20 09:11:11 4171697.49693 872124.08241 4730014.27280 11.80804 48.17150 535.72385 2.66585 0.32383 11.13320 1.47423 -1.59924 -2.64137 8 8 0 1.77 2013-Sep-20 09:11:11 4171697.43463 872124.09685 4730013.67977 11.80804 48.17150 535.24326 2.69273 -0.02843 10.65260 1.50111 -1.95150 -3.12196 8 8 0 1.77 2013-Sep-20 09:11:11 4171697.89277 872124.38960 4730013.65462 11.80804 48.17149 535.56354 2.88553 -0.42399 10.97289 1.69392 -2.34707 -2.80168 8 8 0 1.77 2013-Sep-20 09:11:11 4171696.87298 872124.47881 4730012.99203 11.80805 48.17150 534.41628 3.18155 -0.13567 9.82563 1.98993 -2.05874 -3.94894 8 8 0 1.77 2013-Sep-20 09:11:11 4171697.14707 872124.58215 4730013.49125 11.80805 48.17150 534.98130 3.22661 -0.01841 10.39064 2.03499 -1.94149 -3.38392 8 8 0 1.77 2013-Sep-20 09:11:11 4171697.36153 872124.61276 4730012.93030 11.80805 48.17149 534.70748 3.21268 -0.55359 10.11682 2.02107 -2.47667 -3.65774 8 8 0 1.77 2013-Sep-20 09:11:11 4171697.74458 872124.69070 4730013.17259 11.80805 48.17149 535.14871 3.21059 -0.68328 10.55805 2.01897 -2.60636 -3.21651 8 8 0 1.77 2013-Sep-20 09:11:11 4171697.43006 872124.96244 4730013.10714 11.80805 48.17149 534.93171 3.54094 -0.53897 10.34105 2.34933 -2.46204 -3.43351 8 8 0 1.77 2013-Sep-20 09:11:11 4171697.89405 872125.08445 4730013.57194 11.80805 48.17149 535.59759 3.56543 -0.58602 11.00694 2.37381 -2.50910 -2.76763 8 8 0 1.77 2013-Sep-20 09:11:11 4171697.76316 872125.18967 4730013.17045 11.80806 48.17149 535.22734 3.69520 -0.77434 10.63668 2.50358 -2.69742 -3.13788 8 8 0 1.77 2013-Sep-20 09:11:11 4171698.11365 872125.17006 4730013.59261 11.80805 48.17149 535.76803 3.60429 -0.74546 11.17738 2.41267 -2.66853 -2.59719 8 8 0 1.77 2013-Sep-20 09:11:11 4171697.03236 872125.23536 4730013.06559 11.80806 48.17149 534.67837 3.88947 -0.31822 10.08772 2.69785 -2.24129 -3.68685 8 8 0 1.77 2013-Sep-20 09:11:11 4171696.70714 872125.55944 4730012.24128 11.80806 48.17149 533.89608 4.27324 -0.68016 9.30542 3.08162 -2.60324 -4.46914 8 8 0 1.77 2013-Sep-20 09:11:11 4171697.00094 872125.50340 4730012.20750 11.80806 48.17149 534.05504 4.15827 -0.90844 9.46439 2.96665 -2.83151 -4.31018 8 8 0 1.77 2013-Sep-20 09:11:11 4171697.67318 872125.34472 4730012.12995 11.80806 48.17148 534.41444 3.86539 -1.42628 9.82378 2.67377 -3.34935 -3.95078 8 8 0 1.77 2013-Sep-20 09:11:11 4171697.01248 872125.23489 4730011.74546 11.80806 48.17149 533.68165 3.89307 -1.18404 9.09100 2.70146 -3.10712 -4.68357 8 8 0 1.77 2013-Sep-20 09:11:11 4171697.11120 872124.97548 4730011.18131 11.80805 48.17148 533.29032 3.61895 -1.59272 8.69966 2.42734 -3.51580 -5.07490 8 8 0 1.77 2013-Sep-20 09:11:11 4171697.03702 872124.95784 4730010.96111 11.80805 48.17148 533.07541 3.61687 -1.68279 8.48475 2.42525 -3.60586 -5.28981 8 8 0 1.77 2013-Sep-20 09:11:11 4171696.45357 872124.92561 4730010.43556 11.80806 48.17148 532.29853 3.70472 -1.60280 7.70787 2.51310 -3.52588 -6.06669 8 8 0 1.77 2013-Sep-20 09:11:11 4171696.91253 872124.74980 4730011.04404 11.80805 48.17148 533.02755 3.43871 -1.50496 8.43689 2.24709 -3.42803 -5.33767 8 8 0 1.77 2013-Sep-20 09:11:12 4171697.48545 872124.56586 4730011.42133 11.80805 48.17148 533.65757 3.14142 -1.64317 9.06692 1.94980 -3.56624 -4.70765 8 8 0 1.77 2013-Sep-20 09:11:12 4171696.54723 872124.67524 4730011.11138 11.80805 48.17149 532.82908 3.44048 -1.18224 8.23842 2.24886 -3.10531 -5.53614 8 8 0 1.77 2013-Sep-20 09:11:12 4171696.43289 872124.31922 4730011.00900 11.80805 48.17149 532.62957 3.11539 -1.11283 8.03891 1.92377 -3.03590 -5.73565 8 8 0 1.77 2013-Sep-20 09:11:12 4171696.02901 872124.19992 4730011.12240 11.80805 48.17149 532.43413 3.08126 -0.72443 7.84348 1.88964 -2.64751 -5.93109 8 8 0 1.77 2013-Sep-20 09:11:12 4171695.93339 872124.10071 4730011.09896 11.80805 48.17149 532.34072 3.00372 -0.65519 7.75006 1.81210 -2.57827 -6.02450 8 8 0 1.77 2013-Sep-20 09:11:12 4171695.67926 872123.79863 4730011.38134 11.80804 48.17150 532.34401 2.76003 -0.23545 7.75335 1.56841 -2.15853 -6.02121 8 8 0 1.77 2013-Sep-20 09:11:12 4171695.41879 872123.66780 4730011.16299 11.80804 48.17150 531.99342 2.68527 -0.17115 7.40276 1.49365 -2.09422 -6.37180 8 8 0 1.77 2013-Sep-20 09:11:12 4171695.30856 872123.72314 4730011.51216 11.80804 48.17150 532.18919 2.76199 0.13368 7.59854 1.57038 -1.78939 -6.17603 8 8 0 1.77 2013-Sep-20 09:11:12 4171695.28496 872123.58033 4730011.37221 11.80804 48.17150 532.05001 2.62703 0.07933 7.45936 1.43542 -1.84374 -6.31521 8 8 0 1.77 2013-Sep-20 09:11:12 4171695.59007 872123.70800 4730011.84700 11.80804 48.17150 532.62040 2.68957 0.15397 8.02975 1.49796 -1.76911 -5.74482 8 8 0 1.77 2013-Sep-20 09:11:12 4171695.85486 872123.86528 4730012.08200 11.80804 48.17150 532.98983 2.78934 0.09357 8.39917 1.59772 -1.82950 -5.37539 8 8 0 1.77 2013-Sep-20 09:11:12 4171696.37295 872123.74779 4730012.72629 11.80804 48.17150 533.79208 2.56831 0.16329 9.20143 1.37670 -1.75979 -4.57314 8 8 0 1.77 2013-Sep-20 09:11:12 4171696.98598 872123.76908 4730014.43584 11.80804 48.17151 535.46903 2.46371 0.85301 10.87838 1.27209 -1.07006 -2.89619 8 8 0 1.77 2013-Sep-20 09:11:12 4171696.63440 872124.14644 4730014.26565 11.80804 48.17151 535.16421 2.90503 0.93841 10.57355 1.71341 -0.98466 -3.20101 8 8 0 1.77 2013-Sep-20 09:11:12 4171695.57511 872123.89087 4730013.64608 11.80804 48.17151 533.97616 2.87163 1.33681 9.38551 1.68001 -0.58627 -4.38906 8 8 0 1.77 2013-Sep-20 09:11:12 4171695.74185 872123.78821 4730014.52518 11.80804 48.17151 534.72606 2.73702 1.81711 10.13540 1.54540 -0.10596 -3.63916 8 8 0 1.77 2013-Sep-20 09:11:12 4171695.89201 872124.11853 4730015.45391 11.80805 48.17152 535.56120 3.02963 2.27660 10.97054 1.83801 0.35352 -2.80402 8 8 0 1.77 2013-Sep-20 09:11:12 4171695.93631 872124.20820 4730015.76936 11.80805 48.17152 535.83741 3.10834 2.44099 11.24676 1.91672 0.51791 -2.52780 8 8 0 1.77 2013-Sep-20 09:11:12 4171696.33357 872124.18666 4730016.35551 11.80805 48.17152 536.53057 3.00595 2.54543 11.93991 1.81434 0.62235 -1.83465 8 8 0 1.77 2013-Sep-20 09:11:12 4171697.09059 872124.12562 4730017.11472 11.80804 48.17152 537.58213 2.79129 2.50891 12.99147 1.59968 0.58583 -0.78309 8 8 0 1.77 2013-Sep-20 09:11:12 4171698.16713 872123.87417 4730017.85965 11.80804 48.17152 538.80565 2.32488 2.25884 14.21499 1.13326 0.33576 0.44043 8 8 0 1.77 2013-Sep-20 09:11:12 4171698.28094 872123.56217 4730018.14339 11.80803 48.17152 539.04879 1.99619 2.41263 14.45814 0.80457 0.48956 0.68358 8 8 0 1.77 2013-Sep-20 09:11:12 4171697.80614 872123.80347 4730017.99993 11.80804 48.17152 538.66488 2.32954 2.62646 14.07423 1.13793 0.70339 0.29966 8 8 0 1.77 2013-Sep-20 09:11:12 4171697.94351 872123.90236 4730018.20429 11.80804 48.17152 538.92033 2.39823 2.64748 14.32968 1.20661 0.72441 0.55511 8 8 0 1.77 2013-Sep-20 09:11:12 4171697.61721 872123.47607 4730018.19930 11.80803 48.17152 538.64543 2.04773 2.94715 14.05477 0.85611 1.02408 0.28021 8 8 0 1.77 2013-Sep-20 09:11:13 4171697.82659 872123.35474 4730019.40804 11.80803 48.17153 539.66624 1.88612 3.61905 15.07558 0.69450 1.69597 1.30102 8 8 0 1.77 2013-Sep-20 09:11:13 4171697.62176 872123.44606 4730019.62303 11.80803 48.17153 539.70519 2.01742 3.89790 15.11454 0.82581 1.97482 1.33997 8 8 0 1.77 2013-Sep-20 09:11:13 4171698.87431 872122.93110 4730020.42684 11.80802 48.17153 541.05152 1.25705 3.59891 16.46086 0.06543 1.67583 2.68630 8 8 0 1.77 2013-Sep-20 09:11:13 4171699.44533 872122.87079 4730020.60214 11.80802 48.17153 541.54667 1.08116 3.30852 16.95601 -0.11045 1.38544 3.18145 8 8 0 1.77 2013-Sep-20 09:11:13 4171699.59584 872123.03366 4730020.57068 11.80802 48.17153 541.64370 1.20979 3.15293 17.05304 0.01817 1.22985 3.27848 8 8 0 1.77 2013-Sep-20 09:11:13 4171699.73775 872123.35389 4730020.38648 11.80803 48.17152 541.64279 1.49420 2.87775 17.05213 0.30259 0.95467 3.27757 8 8 0 1.77 2013-Sep-20 09:11:13 4171699.64311 872123.35640 4730020.46653 11.80803 48.17152 541.64100 1.51603 2.99977 17.05034 0.32441 1.07670 3.27578 8 8 0 1.77 2013-Sep-20 09:11:13 4171699.21712 872123.75488 4730020.29000 11.80803 48.17153 541.28576 1.99324 3.13200 16.69510 0.80162 1.20892 2.92054 8 8 0 1.77 2013-Sep-20 09:11:13 4171700.25337 872123.79198 4730020.93678 11.80803 48.17152 542.44922 1.81751 2.80187 17.85856 0.62589 0.87879 4.08400 8 8 0 1.77 2013-Sep-20 09:11:13 4171700.02449 872123.86560 4730020.94229 11.80803 48.17152 542.31395 1.93640 2.96125 17.72330 0.74479 1.03818 3.94874 8 8 0 1.77 2013-Sep-20 09:11:13 4171699.96229 872124.35053 4730020.88645 11.80804 48.17152 542.29792 2.42380 2.89543 17.70727 1.23218 0.97236 3.93271 8 8 0 1.77 2013-Sep-20 09:11:13 4171699.94223 872124.13060 4730020.96577 11.80804 48.17152 542.31392 2.21263 2.99650 17.72326 1.02101 1.07342 3.94870 8 8 0 1.77 2013-Sep-20 09:11:13 4171699.95551 872124.62050 4730021.65044 11.80804 48.17153 542.89963 2.68944 3.36872 18.30897 1.49783 1.44564 4.53441 8 8 0 1.77 2013-Sep-20 09:11:13 4171700.47702 872124.58482 4730021.68841 11.80804 48.17152 543.26349 2.54781 3.01911 18.67283 1.35619 1.09603 4.89827 8 8 0 1.77 2013-Sep-20 09:11:13 4171700.28095 872124.73247 4730021.54846 11.80804 48.17153 543.05136 2.73245 3.04627 18.46070 1.54083 1.12319 4.68614 8 8 0 1.77 2013-Sep-20 09:11:13 4171700.07464 872125.24764 4730021.22221 11.80805 48.17152 542.74389 3.27894 2.90062 18.15324 2.08732 0.97754 4.37867 8 8 0 1.77 2013-Sep-20 09:11:13 4171699.91011 872125.33933 4730021.13579 11.80805 48.17152 542.58460 3.40235 2.94901 17.99394 2.21074 1.02593 4.21938 8 8 0 1.77 2013-Sep-20 09:11:13 4171700.21068 872125.31471 4730021.20773 11.80805 48.17152 542.83105 3.31675 2.78151 18.24040 2.12514 0.85843 4.46583 8 8 0 1.77 2013-Sep-20 09:11:13 4171699.77136 872125.25646 4730021.13332 11.80805 48.17153 542.48087 3.34963 3.06120 17.89022 2.15802 1.13812 4.11566 8 8 0 1.77 2013-Sep-20 09:11:13 4171699.25129 872124.96823 4730020.66025 11.80805 48.17153 541.74954 3.17392 3.16899 17.15888 1.98230 1.24591 3.38432 8 8 0 1.77 2013-Sep-20 09:11:13 4171699.53066 872124.82540 4730021.16397 11.80805 48.17153 542.28776 2.97695 3.32293 17.69710 1.78533 1.39985 3.92254 8 8 0 1.77 2013-Sep-20 09:11:13 4171699.40051 872124.60406 4730020.82907 11.80804 48.17153 541.92305 2.78693 3.22826 17.33239 1.59531 1.30519 3.55783 8 8 0 1.77 2013-Sep-20 09:11:13 4171699.47454 872124.44292 4730020.92136 11.80804 48.17153 542.01815 2.61405 3.26039 17.42749 1.42243 1.33731 3.65293 8 8 0 1.77 2013-Sep-20 09:11:13 4171699.49669 872124.20162 4730020.61892 11.80804 48.17153 541.77431 2.37332 3.07932 17.18366 1.18170 1.15625 3.40910 8 8 0 1.77 2013-Sep-20 09:11:13 4171699.25102 872124.01342 4730020.01884 11.80804 48.17152 541.14111 2.23937 2.88701 16.55046 1.04776 0.96394 2.77589 8 8 0 1.77 2013-Sep-20 09:11:14 4171698.91414 872124.18026 4730020.25250 11.80804 48.17153 541.11808 2.47162 3.26311 16.52742 1.28000 1.34004 2.75286 8 8 0 1.77 2013-Sep-20 09:11:14 4171698.94558 872124.04481 4730020.46691 11.80804 48.17153 541.27989 2.33261 3.40383 16.68923 1.14099 1.48076 2.91467 8 8 0 1.77 2013-Sep-20 09:11:14 4171699.48767 872123.97380 4730021.01330 11.80803 48.17153 542.03121 2.15217 3.38366 17.44055 0.96055 1.46058 3.66599 8 8 0 1.77 2013-Sep-20 09:11:14 4171699.71391 872124.02221 4730021.77278 11.80803 48.17153 542.75143 2.15326 3.71776 18.16078 0.96164 1.79468 4.38621 8 8 0 1.77 2013-Sep-20 09:11:14 4171699.66049 872123.79173 4730020.83737 11.80803 48.17153 541.98809 1.93859 3.16804 17.39743 0.74697 1.24496 3.62287 8 8 0 1.77 2013-Sep-20 09:11:14 4171699.78546 872123.84826 4730021.08573 11.80803 48.17153 542.26244 1.96835 3.23390 17.67178 0.77673 1.31082 3.89722 8 8 0 1.77 2013-Sep-20 09:11:14 4171699.12684 872123.52202 4730020.45431 11.80803 48.17153 541.31748 1.78378 3.34294 16.72683 0.59217 1.41986 2.95226 8 8 0 1.77 2013-Sep-20 09:11:14 4171699.18592 872123.65229 4730020.31277 11.80803 48.17153 541.26836 1.89921 3.18559 16.67770 0.70759 1.26251 2.90314 8 8 0 1.77 2013-Sep-20 09:11:14 4171698.46715 872123.57610 4730019.81331 11.80803 48.17153 540.41658 1.97172 3.38836 15.82592 0.78010 1.46529 2.05136 8 8 0 1.77 2013-Sep-20 09:11:14 4171698.03759 872123.49818 4730018.52927 11.80803 48.17152 539.16874 1.98334 2.85722 14.57809 0.79173 0.93415 0.80353 8 8 0 1.77 2013-Sep-20 09:11:14 4171697.72851 872123.34570 4730018.02089 11.80803 48.17152 538.56735 1.89734 2.76687 13.97669 0.70572 0.84379 0.20213 8 8 0 1.77 2013-Sep-20 09:11:14 4171697.60037 872123.14062 4730017.86697 11.80803 48.17152 538.34102 1.72282 2.78896 13.75037 0.53121 0.86588 -0.02420 8 8 0 1.77 2013-Sep-20 09:11:14 4171696.84702 872122.94029 4730016.92208 11.80803 48.17152 537.11782 1.68089 2.73883 12.52717 0.48927 0.81575 -1.24740 8 8 0 1.77 2013-Sep-20 09:11:14 4171696.87150 872123.04146 4730016.81693 11.80803 48.17152 537.06926 1.77491 2.63542 12.47860 0.58329 0.71234 -1.29596 8 8 0 1.77 2013-Sep-20 09:11:14 4171697.51058 872122.74303 4730016.72694 11.80802 48.17152 537.37867 1.35202 2.15478 12.78801 0.16040 0.23170 -0.98655 8 8 0 1.77 2013-Sep-20 09:11:14 4171697.26988 872122.55436 4730016.04608 11.80802 48.17151 536.68845 1.21659 1.90504 12.09779 0.02498 -0.01804 -1.67677 8 8 0 1.77 2013-Sep-20 09:11:14 4171697.45279 872122.67920 4730016.10089 11.80802 48.17151 536.86573 1.30137 1.78915 12.27507 0.10975 -0.13393 -1.49949 8 8 0 1.77 2013-Sep-20 09:11:14 4171698.38837 872122.65631 4730016.78045 11.80802 48.17151 537.97971 1.08751 1.56345 13.38906 -0.10411 -0.35963 -0.38551 8 8 0 1.77 2013-Sep-20 09:11:14 4171698.62159 872122.57993 4730016.27659 11.80802 48.17151 537.74609 0.96503 1.06897 13.15543 -0.22659 -0.85411 -0.61913 8 8 0 1.77 2013-Sep-20 09:11:14 4171698.47894 872122.27335 4730015.74495 11.80801 48.17151 537.21498 0.69412 0.86520 12.62432 -0.49749 -1.05788 -1.15024 8 8 0 1.77 2013-Sep-20 09:11:14 4171699.10468 872122.29384 4730016.13299 11.80801 48.17150 537.91540 0.58613 0.66447 13.32474 -0.60549 -1.25861 -0.44982 8 8 0 1.77 2013-Sep-20 09:11:14 4171698.96387 872122.26785 4730016.47982 11.80801 48.17151 538.07837 0.58950 1.00243 13.48771 -0.60211 -0.92064 -0.28685 8 8 0 1.77 2013-Sep-20 09:11:14 4171698.90590 872122.05418 4730016.57869 11.80801 48.17151 538.08504 0.39222 1.14323 13.49438 -0.79939 -0.77985 -0.28018 8 8 0 1.77 2013-Sep-20 09:11:14 4171699.10318 872121.94893 4730016.31025 11.80801 48.17151 537.99943 0.24882 0.83636 13.40878 -0.94279 -1.08671 -0.36579 8 8 0 1.77 2013-Sep-20 09:11:14 4171698.64134 872122.04454 4730015.84442 11.80801 48.17151 537.36388 0.43692 0.84798 12.77323 -0.75469 -1.07509 -1.00133 8 8 0 1.77 2013-Sep-20 09:11:15 4171698.08289 872121.82727 4730015.71550 11.80801 48.17151 536.87361 0.33853 1.20246 12.28296 -0.85309 -0.72062 -1.49160 8 8 0 1.77 2013-Sep-20 09:11:15 4171697.99540 872121.67586 4730015.42812 11.80801 48.17151 536.58170 0.20823 1.09770 11.99104 -0.98339 -0.82537 -1.78352 8 8 0 1.77 2013-Sep-20 09:11:15 4171697.96687 872121.49693 4730015.25202 11.80801 48.17151 536.40744 0.03891 1.02836 11.81678 -1.15270 -0.89472 -1.95778 8 8 0 1.77 2013-Sep-20 09:11:15 4171698.49630 872121.24046 4730015.59721 11.80800 48.17151 536.97526 -0.32046 0.91152 12.38461 -1.51208 -1.01156 -1.38996 8 8 0 1.77 2013-Sep-20 09:11:15 4171698.77450 872121.25695 4730015.85827 11.80800 48.17151 537.35364 -0.36125 0.88019 12.76299 -1.55287 -1.04289 -1.01157 8 8 0 1.77 2013-Sep-20 09:11:15 4171699.38934 872120.96868 4730016.41940 11.80800 48.17151 538.13379 -0.76924 0.84992 13.54313 -1.96086 -1.07316 -0.23143 8 8 0 1.77 2013-Sep-20 09:11:15 4171699.05633 872121.06619 4730016.09198 11.80800 48.17151 537.68573 -0.60564 0.85957 13.09508 -1.79726 -1.06350 -0.67949 8 8 0 1.77 2013-Sep-20 09:11:15 4171698.63755 872121.10071 4730016.74233 11.80800 48.17151 537.90168 -0.48616 1.59348 13.31102 -1.67778 -0.32959 -0.46354 8 8 0 1.77 2013-Sep-20 09:11:15 4171698.89157 872121.33224 4730016.92079 11.80800 48.17151 538.23207 -0.31151 1.49192 13.64142 -1.50313 -0.43116 -0.13315 8 8 0 1.77 2013-Sep-20 09:11:15 4171699.08367 872121.74411 4730017.22679 11.80801 48.17151 538.64170 0.05233 1.49307 14.05104 -1.13928 -0.43000 0.27648 8 8 0 1.77 2013-Sep-20 09:11:15 4171698.79269 872121.52569 4730017.46809 11.80800 48.17151 538.60174 -0.10192 1.89953 14.01109 -1.29353 -0.02355 0.23652 8 8 0 1.77 2013-Sep-20 09:11:15 4171698.52361 872121.65880 4730017.45044 11.80801 48.17152 538.43111 0.08343 2.06373 13.84045 -1.10818 0.14065 0.06589 8 8 0 1.77 2013-Sep-20 09:11:15 4171699.44786 872121.63614 4730018.24048 11.80800 48.17151 539.62005 -0.12788 1.91993 15.02939 -1.31950 -0.00314 1.25483 8 8 0 1.77 2013-Sep-20 09:11:15 4171698.45350 872121.91485 4730017.62102 11.80801 48.17152 538.54739 0.34842 2.18958 13.95673 -0.84320 0.26650 0.18217 8 8 0 1.77 2013-Sep-20 09:11:15 4171698.39682 872121.99148 4730017.57517 11.80801 48.17152 538.48668 0.43502 2.18866 13.89603 -0.75660 0.26559 0.12146 8 8 0 1.77 2013-Sep-20 09:11:15 4171698.42624 872121.98868 4730017.76592 11.80801 48.17152 538.64764 0.42626 2.29484 14.05698 -0.76536 0.37176 0.28242 8 8 0 1.77 2013-Sep-20 09:11:15 4171698.30969 872122.48771 4730017.39076 11.80802 48.17152 538.36011 0.93857 2.05356 13.76946 -0.25304 0.13048 -0.00511 8 8 0 1.77 2013-Sep-20 09:11:15 4171698.20917 872122.47823 4730016.57935 11.80802 48.17151 537.68858 0.94987 1.58719 13.09792 -0.24174 -0.33588 -0.67664 8 8 0 1.77 2013-Sep-20 09:11:15 4171697.79002 872122.42314 4730016.23356 11.80802 48.17151 537.14978 0.98172 1.67070 12.55913 -0.20990 -0.25237 -1.21544 8 8 0 1.77 2013-Sep-20 09:11:15 4171697.66796 872122.72080 4730016.34959 11.80802 48.17151 537.19719 1.29805 1.79172 12.60653 0.10644 -0.13135 -1.16803 8 8 0 1.77 2013-Sep-20 09:11:15 4171697.40522 872123.39023 4730016.18432 11.80803 48.17151 536.99388 2.00708 1.77107 12.40322 0.81547 -0.15201 -1.37134 8 8 0 1.77 2013-Sep-20 09:11:15 4171697.07807 872123.45260 4730015.62570 11.80803 48.17151 536.37257 2.13508 1.62762 11.78192 0.94347 -0.29545 -1.99264 8 8 0 1.77 2013-Sep-20 09:11:15 4171696.71097 872123.70059 4730014.69900 11.80804 48.17151 535.47625 2.45295 1.23955 10.88560 1.26133 -0.68353 -2.88897 8 8 0 1.77 2013-Sep-20 09:11:15 4171696.56606 872123.80873 4730014.77274 11.80804 48.17151 535.45136 2.58845 1.37793 10.86071 1.39683 -0.54515 -2.91385 8 8 0 1.77 2013-Sep-20 09:11:15 4171696.23405 872123.72735 4730014.17300 11.80804 48.17151 534.77663 2.57673 1.23253 10.18597 1.38511 -0.69055 -3.58859 8 8 0 1.77 2013-Sep-20 09:11:16 4171695.76749 872123.87198 4730014.16296 11.80804 48.17151 534.48432 2.81377 1.54408 9.89367 1.62215 -0.37900 -3.88090 8 8 0 1.77 2013-Sep-20 09:11:16 4171696.02416 872123.73185 4730014.57571 11.80804 48.17151 534.94030 2.62409 1.65350 10.34965 1.43247 -0.26958 -3.42491 8 8 0 1.77 2013-Sep-20 09:11:16 4171696.60945 872124.01511 4730014.61794 11.80804 48.17151 535.39250 2.78158 1.21157 10.80185 1.58996 -0.71150 -2.97272 8 8 0 1.77 2013-Sep-20 09:11:16 4171697.07045 872123.98186 4730014.75445 11.80804 48.17151 535.79062 2.65470 0.97145 11.19997 1.46309 -0.95163 -2.57460 8 8 0 1.77 2013-Sep-20 09:11:16 4171696.87884 872124.23799 4730014.68182 11.80805 48.17151 535.64637 2.94462 1.02370 11.05572 1.75300 -0.89937 -2.71885 8 8 0 1.77 2013-Sep-20 09:11:16 4171697.17294 872124.09537 4730014.96779 11.80804 48.17151 536.03199 2.74483 1.02166 11.44133 1.55322 -0.90141 -2.33323 8 8 0 1.77 2013-Sep-20 09:11:16 4171696.89121 872124.15618 4730014.37905 11.80804 48.17151 535.41768 2.86201 0.82524 10.82702 1.67040 -1.09784 -2.94754 8 8 0 1.77 2013-Sep-20 09:11:16 4171697.35878 872123.86389 4730015.25049 11.80804 48.17151 536.33236 2.48022 1.10994 11.74170 1.28861 -0.81314 -2.03286 8 8 0 1.77 2013-Sep-20 09:11:16 4171697.65807 872123.73390 4730015.20797 11.80804 48.17151 536.47831 2.29174 0.88311 11.88766 1.10013 -1.03997 -1.88691 8 8 0 1.77 2013-Sep-20 09:11:16 4171698.26866 872123.51200 4730015.81205 11.80803 48.17151 537.29675 1.94959 0.87445 12.70609 0.75798 -1.04862 -1.06847 8 8 0 1.77 2013-Sep-20 09:11:16 4171697.98163 872123.30488 4730016.09369 11.80803 48.17151 537.29097 1.80558 1.30322 12.70032 0.61397 -0.61986 -1.07424 8 8 0 1.77 2013-Sep-20 09:11:16 4171697.03311 872123.38044 4730016.50152 11.80803 48.17152 536.98599 2.07364 2.25551 12.39534 0.88203 0.33243 -1.37922 8 8 0 1.77 2013-Sep-20 09:11:16 4171696.89834 872123.51321 4730017.03412 11.80804 48.17152 537.31300 2.23119 2.68875 12.72235 1.03957 0.76568 -1.05221 8 8 0 1.77 2013-Sep-20 09:11:16 4171696.71739 872123.30362 4730016.89129 11.80803 48.17152 537.05984 2.06306 2.75744 12.46919 0.87145 0.83437 -1.30538 8 8 0 1.77 2013-Sep-20 09:11:16 4171696.76905 872123.05492 4730017.10611 11.80803 48.17152 537.21970 1.80905 2.90095 12.62905 0.61743 0.97787 -1.14552 8 8 0 1.77 2013-Sep-20 09:11:16 4171697.67359 872122.75588 4730017.65716 11.80802 48.17152 538.17997 1.33124 2.65429 13.58932 0.13962 0.73122 -0.18525 8 8 0 1.77 2013-Sep-20 09:11:16 4171697.08714 872122.79009 4730017.15099 11.80803 48.17152 537.42464 1.48473 2.73925 12.83399 0.29312 0.81617 -0.94057 8 8 0 1.77 2013-Sep-20 09:11:16 4171697.52809 872122.85648 4730017.25585 11.80803 48.17152 537.79969 1.45949 2.47744 13.20903 0.26787 0.55436 -0.56553 8 8 0 1.77 2013-Sep-20 09:11:16 4171697.67236 872122.69889 4730017.77907 11.80802 48.17152 538.26224 1.27571 2.74518 13.67158 0.08409 0.82211 -0.10298 8 8 0 1.77 2013-Sep-20 09:11:16 4171698.07733 872122.47063 4730018.44767 11.80802 48.17152 538.99365 0.96941 2.93050 14.40300 -0.22220 1.00742 0.62843 8 8 0 1.77 2013-Sep-20 09:11:16 4171698.77564 872122.35047 4730018.48478 11.80802 48.17152 539.46075 0.70889 2.46424 14.87009 -0.48272 0.54117 1.09553 8 8 0 1.77 2013-Sep-20 09:11:16 4171698.93202 872122.39536 4730018.96685 11.80802 48.17152 539.92818 0.72083 2.66483 15.33753 -0.47078 0.74175 1.56296 8 8 0 1.77 2013-Sep-20 09:11:16 4171699.04167 872122.35148 4730018.76417 11.80801 48.17152 539.84274 0.65544 2.45638 15.25208 -0.53618 0.53331 1.47752 8 8 0 1.77 2013-Sep-20 09:11:16 4171699.40684 872122.21730 4730019.11357 11.80801 48.17152 540.32316 0.44938 2.44351 15.73251 -0.74224 0.52044 1.95794 8 8 0 1.77 2013-Sep-20 09:11:16 4171699.73210 872122.37134 4730019.90582 11.80801 48.17152 541.14684 0.53360 2.71113 16.55619 -0.65802 0.78806 2.78163 8 8 0 1.77 2013-Sep-20 09:11:17 4171700.25783 872122.75230 4730020.46281 11.80802 48.17152 541.95707 0.79891 2.64105 17.36641 -0.39270 0.71798 3.59185 8 8 0 1.77 2013-Sep-20 09:11:17 4171700.30094 872123.07921 4730020.17611 11.80802 48.17152 541.81619 1.11009 2.36855 17.22553 -0.08153 0.44548 3.45097 8 8 0 1.77 2013-Sep-20 09:11:17 4171700.35673 872123.27467 4730019.86431 11.80802 48.17152 541.64694 1.29000 2.09012 17.05629 0.09838 0.16705 3.28173 8 8 0 1.77 2013-Sep-20 09:11:17 4171700.64590 872123.00329 4730020.80627 11.80802 48.17152 542.50058 0.96518 2.54878 17.90993 -0.22644 0.62571 4.13536 8 8 0 1.77 2013-Sep-20 09:11:17 4171700.78272 872122.85819 4730020.82988 11.80802 48.17152 542.58769 0.79516 2.48686 17.99703 -0.39646 0.56378 4.22247 8 8 0 1.77 2013-Sep-20 09:11:17 4171701.25994 872122.80094 4730021.24616 11.80801 48.17152 543.20158 0.64147 2.42514 18.61093 -0.55015 0.50206 4.83636 8 8 0 1.77 2013-Sep-20 09:11:17 4171701.62909 872122.50823 4730021.47266 11.80801 48.17152 543.57139 0.27941 2.35158 18.98074 -0.91221 0.42850 5.20618 8 8 0 1.77 2013-Sep-20 09:11:17 4171701.71174 872122.49782 4730021.63640 11.80801 48.17152 543.74594 0.25231 2.40208 19.15528 -0.93931 0.47900 5.38072 8 8 0 1.77 2013-Sep-20 09:11:17 4171701.59630 872122.19521 4730021.49558 11.80801 48.17152 543.52435 -0.02028 2.43851 18.93369 -1.21189 0.51543 5.15913 8 8 0 1.77 2013-Sep-20 09:11:17 4171701.10367 872122.06529 4730021.15545 11.80800 48.17152 542.93158 -0.04665 2.59080 18.34093 -1.23826 0.66772 4.56636 8 8 0 1.77 2013-Sep-20 09:11:17 4171701.63756 872121.95665 4730021.86297 11.80800 48.17152 543.79248 -0.26223 2.68980 19.20182 -1.45385 0.76673 5.42726 8 8 0 1.77 2013-Sep-20 09:11:17 4171701.48390 872121.87848 4730021.77785 11.80800 48.17152 543.61808 -0.30731 2.75703 19.02742 -1.49893 0.83395 5.25286 8 8 0 1.77 2013-Sep-20 09:11:17 4171700.98971 872121.83147 4730021.39755 11.80800 48.17152 543.00568 -0.25220 2.87102 18.41502 -1.44382 0.94795 4.64046 8 8 0 1.77 2013-Sep-20 09:11:17 4171701.19113 872121.70623 4730021.67298 11.80800 48.17152 543.32531 -0.41600 2.92690 18.73465 -1.60762 1.00382 4.96009 8 8 0 1.77 2013-Sep-20 09:11:17 4171700.60881 872121.66760 4730021.76511 11.80800 48.17153 543.00855 -0.33466 3.41896 18.41790 -1.52627 1.49588 4.64334 8 8 0 1.77 2013-Sep-20 09:11:17 4171699.71756 872121.37757 4730020.94067 11.80800 48.17153 541.77285 -0.43616 3.56342 17.18220 -1.62778 1.64034 3.40763 8 8 0 1.77 2013-Sep-20 09:11:17 4171698.26359 872121.47589 4730020.37559 11.80801 48.17154 540.41606 -0.04240 4.23206 15.82541 -1.23401 2.30898 2.05085 8 8 0 1.77 2013-Sep-20 09:11:17 4171698.54233 872121.69538 4730020.06529 11.80801 48.17153 540.39675 0.11541 3.78835 15.80610 -1.07620 1.86527 2.03154 8 8 0 1.77 2013-Sep-20 09:11:17 4171698.96231 872121.86345 4730019.68954 11.80801 48.17153 540.41386 0.19399 3.20581 15.82321 -0.99763 1.28273 2.04865 8 8 0 1.77 2013-Sep-20 09:11:17 4171699.68697 872122.10618 4730019.81008 11.80801 48.17152 541.00986 0.28328 2.72064 16.41921 -0.90834 0.79756 2.64465 8 8 0 1.77 2013-Sep-20 09:11:17 4171699.05737 872122.54860 4730019.02664 11.80802 48.17152 540.07547 0.84518 2.58992 15.48481 -0.34643 0.66684 1.71025 8 8 0 1.77 2013-Sep-20 09:11:17 4171698.57757 872122.69473 4730018.73724 11.80802 48.17152 539.56656 1.08640 2.72458 14.97590 -0.10522 0.80151 1.20134 8 8 0 1.77 2013-Sep-20 09:11:17 4171698.39753 872123.19964 4730017.91848 11.80803 48.17152 538.90784 1.61747 2.23288 14.31718 0.42586 0.30980 0.54262 8 8 0 1.77 2013-Sep-20 09:11:17 4171698.07742 872123.38382 4730017.83518 11.80803 48.17152 538.66194 1.86325 2.38272 14.07128 0.67164 0.45965 0.29672 8 8 0 1.77 2013-Sep-20 09:11:17 4171698.59805 872123.36775 4730018.14870 11.80803 48.17152 539.23322 1.74099 2.21452 14.64257 0.54937 0.29145 0.86800 8 8 0 1.77 2013-Sep-20 09:11:18 4171699.01191 872123.35087 4730018.56290 11.80803 48.17152 539.80973 1.63978 2.19147 15.21907 0.44816 0.26839 1.44451 8 8 0 1.77 2013-Sep-20 09:11:18 4171698.97188 872123.26281 4730018.28279 11.80803 48.17152 539.56285 1.56177 2.04728 14.97220 0.37016 0.12421 1.19763 8 8 0 1.77 2013-Sep-20 09:11:18 4171698.71650 872123.36825 4730017.93564 11.80803 48.17152 539.15186 1.71724 1.98596 14.56120 0.52563 0.06289 0.78664 8 8 0 1.77 2013-Sep-20 09:11:18 4171698.65601 872123.28131 4730018.10186 11.80803 48.17152 539.22436 1.64452 2.15419 14.63371 0.45290 0.23112 0.85915 8 8 0 1.77 2013-Sep-20 09:11:18 4171698.48721 872123.23660 4730017.66980 11.80803 48.17152 538.78612 1.63530 1.99599 14.19547 0.44368 0.07291 0.42091 8 8 0 1.77 2013-Sep-20 09:11:18 4171697.89940 872123.48445 4730017.12269 11.80803 48.17152 538.02855 1.99818 2.02206 13.43790 0.80657 0.09899 -0.33667 8 8 0 1.77 2013-Sep-20 09:11:18 4171697.78241 872123.34420 4730016.62738 11.80803 48.17151 537.56397 1.88485 1.79845 12.97331 0.69323 -0.12463 -0.80125 8 8 0 1.77 2013-Sep-20 09:11:18 4171697.27070 872123.21238 4730016.31093 11.80803 48.17152 536.97613 1.86052 1.98074 12.38548 0.66891 0.05767 -1.38908 8 8 0 1.77 2013-Sep-20 09:11:18 4171697.04476 872123.45873 4730015.62691 11.80803 48.17151 536.35257 2.14789 1.65179 11.76191 0.95628 -0.27129 -2.01265 8 8 0 1.77 2013-Sep-20 09:11:18 4171696.81462 872123.53696 4730015.41589 11.80804 48.17151 536.05578 2.27156 1.66699 11.46512 1.07995 -0.25608 -2.30944 8 8 0 1.77 2013-Sep-20 09:11:18 4171696.73928 872123.68661 4730015.23713 11.80804 48.17151 535.89381 2.43347 1.57991 11.30315 1.24185 -0.34316 -2.47141 8 8 0 1.77 2013-Sep-20 09:11:18 4171696.86044 872123.69440 4730015.14403 11.80804 48.17151 535.90459 2.41629 1.42827 11.31394 1.22468 -0.49481 -2.46063 8 8 0 1.77 2013-Sep-20 09:11:18 4171696.12220 872123.86922 4730014.99001 11.80804 48.17151 535.33177 2.73849 1.83735 10.74111 1.54688 -0.08573 -3.03345 8 8 0 1.77 2013-Sep-20 09:11:18 4171695.43422 872124.19819 4730014.59030 11.80805 48.17152 534.62971 3.20127 2.02241 10.03906 2.00966 0.09933 -3.73551 8 8 0 1.77 2013-Sep-20 09:11:18 4171695.57757 872124.52787 4730014.86230 11.80805 48.17152 534.97097 3.49464 2.04898 10.38031 2.30303 0.12591 -3.39425 8 8 0 1.77 2013-Sep-20 09:11:18 4171694.92657 872124.73326 4730014.20356 11.80806 48.17152 534.08317 3.82891 2.05317 9.49251 2.63730 0.13010 -4.28205 8 8 0 1.77 2013-Sep-20 09:11:18 4171695.32272 872124.78485 4730014.57097 11.80806 48.17152 534.62258 3.79835 2.00139 10.03193 2.60673 0.07831 -3.74264 8 8 0 1.77 2013-Sep-20 09:11:18 4171695.05832 872124.92389 4730014.45829 11.80806 48.17152 534.38500 3.98855 2.09789 9.79435 2.79693 0.17482 -3.98022 8 8 0 1.77 2013-Sep-20 09:11:18 4171694.64429 872124.85934 4730014.41449 11.80806 48.17152 534.07328 4.01008 2.38051 9.48263 2.81847 0.45743 -4.29194 8 8 0 1.77 2013-Sep-20 09:11:18 4171694.60342 872124.97553 4730014.06059 11.80806 48.17152 533.79875 4.13218 2.15658 9.20809 2.94056 0.23351 -4.56647 8 8 0 1.77 2013-Sep-20 09:11:18 4171695.56341 872124.83096 4730014.66618 11.80806 48.17151 534.85695 3.79422 1.88230 10.26629 2.60260 -0.04077 -3.50827 8 8 0 1.77 2013-Sep-20 09:11:18 4171696.13787 872124.72235 4730014.93275 11.80805 48.17151 535.41575 3.57036 1.65764 10.82510 2.37874 -0.26544 -2.94947 8 8 0 1.77 2013-Sep-20 09:11:18 4171695.76128 872124.58792 4730014.67370 11.80805 48.17151 534.95855 3.51584 1.78006 10.36789 2.32422 -0.14302 -3.40667 8 8 0 1.77 2013-Sep-20 09:11:18 4171695.60814 872124.58599 4730014.91591 11.80805 48.17152 535.03880 3.54529 2.05357 10.44814 2.35367 0.13050 -3.32642 8 8 0 1.77 2013-Sep-20 09:11:18 4171695.36035 872124.32980 4730014.99277 11.80805 48.17152 534.89935 3.34522 2.32463 10.30870 2.15360 0.40155 -3.46587 8 8 0 1.77 2013-Sep-20 09:11:19 4171695.33369 872124.19849 4730014.79623 11.80805 48.17152 534.71758 3.22214 2.23302 10.12692 2.03053 0.30994 -3.64764 8 8 0 1.77 2013-Sep-20 09:11:19 4171696.14726 872124.20623 4730015.45887 11.80805 48.17152 535.74348 3.06323 2.08036 11.15283 1.87162 0.15728 -2.62173 8 8 0 1.77 2013-Sep-20 09:11:19 4171696.53708 872123.99906 4730015.14245 11.80804 48.17151 535.73390 2.78068 1.61661 11.14325 1.58906 -0.30647 -2.63131 8 8 0 1.77 2013-Sep-20 09:11:19 4171696.21012 872123.84261 4730015.34223 11.80804 48.17152 535.64799 2.69445 2.01217 11.05733 1.50283 0.08910 -2.71723 8 8 0 1.77 2013-Sep-20 09:11:19 4171696.94605 872123.86905 4730016.27008 11.80804 48.17152 536.82338 2.56973 2.09015 12.23273 1.37811 0.16708 -1.54184 8 8 0 1.77 2013-Sep-20 09:11:19 4171696.97450 872123.66022 4730016.09887 11.80804 48.17152 536.68588 2.35950 1.98706 12.09522 1.16788 0.06399 -1.67934 8 8 0 1.77 2013-Sep-20 09:11:19 4171697.29007 872123.59244 4730016.21878 11.80804 48.17151 536.97198 2.22858 1.84720 12.38132 1.03696 -0.07588 -1.39324 8 8 0 1.77 2013-Sep-20 09:11:19 4171697.07984 872123.65501 4730015.82226 11.80804 48.17151 536.54781 2.33284 1.72656 11.95716 1.14123 -0.19652 -1.81741 8 8 0 1.77 2013-Sep-20 09:11:19 4171697.15030 872123.32240 4730016.46139 11.80803 48.17152 537.02467 1.99286 2.15212 12.43401 0.80124 0.22904 -1.34055 8 8 0 1.77 2013-Sep-20 09:11:19 4171697.19098 872123.03451 4730016.30652 11.80803 48.17152 536.89653 1.70273 2.06307 12.30588 0.51111 0.13999 -1.46869 8 8 0 1.77 2013-Sep-20 09:11:19 4171697.51756 872122.69345 4730016.31784 11.80802 48.17151 537.07161 1.30207 1.88442 12.48096 0.11045 -0.03865 -1.29361 8 8 0 1.77 2013-Sep-20 09:11:19 4171696.70450 872122.76573 4730016.13499 11.80803 48.17152 536.41448 1.53919 2.34448 11.82382 0.34757 0.42141 -1.95074 8 8 0 1.77 2013-Sep-20 09:11:19 4171696.87494 872122.64814 4730016.40702 11.80802 48.17152 536.71238 1.38921 2.41951 12.12173 0.19759 0.49644 -1.65283 8 8 0 1.77 2013-Sep-20 09:11:19 4171697.31212 872122.47654 4730017.33342 11.80802 48.17152 537.66466 1.13178 2.74462 13.07400 -0.05983 0.82155 -0.70056 8 8 0 1.77 2013-Sep-20 09:11:19 4171697.29013 872122.52262 4730017.32786 11.80802 48.17152 537.65245 1.18138 2.74993 13.06179 -0.01023 0.82686 -0.71277 8 8 0 1.77 2013-Sep-20 09:11:19 4171697.10639 872122.33574 4730017.40037 11.80802 48.17152 537.56103 1.03606 2.96080 12.97037 -0.15555 1.03773 -0.80419 8 8 0 1.77 2013-Sep-20 09:11:19 4171697.30020 872122.29259 4730017.58092 11.80802 48.17152 537.81619 0.95416 2.94643 13.22554 -0.23746 1.02335 -0.54903 8 8 0 1.77 2013-Sep-20 09:11:19 4171697.20801 872122.53025 4730017.62047 11.80802 48.17152 537.81792 1.20566 3.00380 13.22726 0.01404 1.08073 -0.54730 8 8 0 1.77 2013-Sep-20 09:11:19 4171698.01302 872122.35572 4730018.02466 11.80802 48.17152 538.62078 0.87009 2.71282 14.03013 -0.32153 0.78975 0.25556 8 8 0 1.77 2013-Sep-20 09:11:19 4171697.90360 872122.47092 4730017.42859 11.80802 48.17152 538.12092 1.00524 2.37754 13.53026 -0.18637 0.45447 -0.24430 8 8 0 1.77 2013-Sep-20 09:11:19 4171698.30651 872122.71175 4730018.19742 11.80802 48.17152 538.98969 1.15852 2.55969 14.39904 -0.03309 0.63661 0.62447 8 8 0 1.77 2013-Sep-20 09:11:19 4171698.75000 872122.58293 4730018.09188 11.80802 48.17152 539.18297 0.94168 2.18547 14.59231 -0.24993 0.26239 0.81775 8 8 0 1.77 2013-Sep-20 09:11:19 4171698.96093 872122.61433 4730018.01857 11.80802 48.17152 539.27032 0.92925 1.97795 14.67967 -0.26237 0.05488 0.90510 8 8 0 1.77 2013-Sep-20 09:11:19 4171699.16651 872122.51885 4730018.41188 11.80802 48.17152 539.68457 0.79373 2.10485 15.09391 -0.39789 0.18178 1.31935 8 8 0 1.77 2013-Sep-20 09:11:19 4171699.27467 872122.63642 4730018.51296 11.80802 48.17152 539.84654 0.88668 2.07545 15.25589 -0.30494 0.15238 1.48132 8 8 0 1.77 2013-Sep-20 09:11:20 4171699.27310 872122.82630 4730018.51648 11.80802 48.17152 539.87405 1.07286 2.04999 15.28339 -0.11875 0.12691 1.50883 8 8 0 1.77 2013-Sep-20 09:11:20 4171699.52307 872122.59839 4730018.68419 11.80802 48.17152 540.13109 0.79862 2.01427 15.54043 -0.39300 0.09119 1.76587 8 8 0 1.77 2013-Sep-20 09:11:20 4171699.39555 872122.52276 4730018.53608 11.80802 48.17152 539.92716 0.75068 2.02003 15.33651 -0.44094 0.09696 1.56194 8 8 0 1.77 2013-Sep-20 09:11:20 4171699.66411 872122.59066 4730019.46820 11.80802 48.17152 540.80631 0.76220 2.43544 16.21566 -0.42942 0.51236 2.44109 8 8 0 1.77 2013-Sep-20 09:11:20 4171699.08064 872122.48064 4730019.46887 11.80802 48.17152 540.41091 0.77390 2.87823 15.82025 -0.41772 0.95515 2.04569 8 8 0 1.77 2013-Sep-20 09:11:20 4171699.20437 872122.70883 4730019.42476 11.80802 48.17152 540.48995 0.97194 2.72377 15.89929 -0.21968 0.80069 2.12473 8 8 0 1.77 2013-Sep-20 09:11:20 4171699.66187 872122.30732 4730020.19524 11.80801 48.17152 541.30792 0.48531 2.96514 16.71727 -0.70631 1.04206 2.94271 8 8 0 1.77 2013-Sep-20 09:11:20 4171698.79254 872122.23258 4730019.96085 11.80801 48.17153 540.55558 0.59004 3.45428 15.96493 -0.60158 1.53121 2.19036 8 8 0 1.77 2013-Sep-20 09:11:20 4171698.76187 872122.62245 4730019.44329 11.80802 48.17153 540.20311 0.97793 3.07205 15.61246 -0.21368 1.14897 1.83789 8 8 0 1.77 2013-Sep-20 09:11:20 4171698.06897 872122.92318 4730018.43003 11.80802 48.17152 539.03681 1.41410 2.85583 14.44616 0.22248 0.93275 0.67159 8 8 0 1.77 2013-Sep-20 09:11:20 4171697.94739 872122.73810 4730018.12768 11.80802 48.17152 538.70689 1.25781 2.77109 14.11624 0.06619 0.84801 0.34167 8 8 0 1.77 2013-Sep-20 09:11:20 4171697.60251 872122.55050 4730017.81273 11.80802 48.17152 538.22147 1.14475 2.84120 13.63081 -0.04687 0.91812 -0.14375 8 8 0 1.77 2013-Sep-20 09:11:20 4171697.59018 872122.39367 4730017.83808 11.80802 48.17152 538.21091 0.99377 2.89102 13.62025 -0.19785 0.96794 -0.15431 8 8 0 1.77 2013-Sep-20 09:11:20 4171696.56053 872122.37574 4730017.29676 11.80802 48.17153 537.13296 1.18691 3.28374 12.54230 -0.00471 1.36067 -1.23226 8 8 0 1.77 2013-Sep-20 09:11:20 4171696.92326 872122.08773 4730017.79658 11.80802 48.17153 537.70287 0.83077 3.39643 13.11222 -0.36085 1.47335 -0.66235 8 8 0 1.77 2013-Sep-20 09:11:20 4171697.09465 872122.07369 4730017.42650 11.80802 48.17152 537.53707 0.78195 3.02675 12.94642 -0.40966 1.10367 -0.82815 8 8 0 1.77 2013-Sep-20 09:11:20 4171697.31264 872122.04105 4730017.32319 11.80802 48.17152 537.59794 0.70540 2.80383 13.00728 -0.48622 0.88076 -0.76728 8 8 0 1.77 2013-Sep-20 09:11:20 4171696.76097 872122.21946 4730016.73529 11.80802 48.17152 536.82410 0.99293 2.78693 12.23344 -0.19869 0.86386 -1.54112 8 8 0 1.77 2013-Sep-20 09:11:20 4171696.84017 872121.85219 4730016.96757 11.80801 48.17152 536.99876 0.61722 2.94008 12.40810 -0.57440 1.01700 -1.36646 8 8 0 1.77 2013-Sep-20 09:11:20 4171696.89973 872121.78744 4730017.09349 11.80801 48.17152 537.12263 0.54165 2.99048 12.53197 -0.64997 1.06741 -1.24259 8 8 0 1.77 2013-Sep-20 09:11:20 4171696.25761 872122.04883 4730016.56199 11.80802 48.17153 536.34309 0.92890 3.06451 11.75244 -0.26271 1.14144 -2.02213 8 8 0 1.77 2013-Sep-20 09:11:20 4171696.65603 872122.07354 4730017.12168 11.80802 48.17153 537.02359 0.87156 3.14341 12.43294 -0.32005 1.22033 -1.34162 8 8 0 1.77 2013-Sep-20 09:11:20 4171696.16724 872122.19517 4730016.77955 11.80802 48.17153 536.46617 1.09064 3.25320 11.87552 -0.10097 1.33013 -1.89905 8 8 0 1.77 2013-Sep-20 09:11:20 4171696.12766 872122.35818 4730017.13923 11.80802 48.17153 536.73060 1.25830 3.49708 12.13994 0.06669 1.57401 -1.63462 8 8 0 1.77 2013-Sep-20 09:11:20 4171696.51123 872122.29424 4730017.32557 11.80802 48.17153 537.11111 1.11723 3.35135 12.52046 -0.07438 1.42827 -1.25411 8 8 0 1.77 2013-Sep-20 09:11:21 4171697.04976 872122.26342 4730017.57212 11.80802 48.17153 537.64217 0.97686 3.12768 13.05152 -0.21476 1.20461 -0.72305 8 8 0 1.77 2013-Sep-20 09:11:21 4171697.23816 872122.07833 4730017.34295 11.80802 48.17152 537.56913 0.75713 2.86565 12.97847 -0.43449 0.94258 -0.79609 8 8 0 1.77 2013-Sep-20 09:11:21 4171697.53900 872122.18451 4730016.85821 11.80802 48.17152 537.41881 0.79951 2.30676 12.82815 -0.39211 0.38369 -0.94641 8 8 0 1.77 2013-Sep-20 09:11:21 4171697.65847 872122.30906 4730016.48693 11.80802 48.17152 537.23714 0.89697 1.95302 12.64648 -0.29465 0.02994 -1.12808 8 8 0 1.77 2013-Sep-20 09:11:21 4171697.52556 872122.12433 4730017.09298 11.80802 48.17152 537.57676 0.74335 2.48230 12.98610 -0.44827 0.55923 -0.78846 8 8 0 1.77 2013-Sep-20 09:11:21 4171698.01397 872121.97372 4730017.35973 11.80801 48.17152 538.07380 0.49598 2.32693 13.48314 -0.69564 0.40385 -0.29142 8 8 0 1.77 2013-Sep-20 09:11:21 4171698.80231 872122.14655 4730018.06228 11.80801 48.17152 539.13551 0.50383 2.19412 14.54485 -0.68779 0.27104 0.77029 8 8 0 1.77 2013-Sep-20 09:11:21 4171698.71250 872122.29870 4730017.98215 11.80801 48.17152 539.03794 0.67114 2.18298 14.44728 -0.52047 0.25991 0.67272 8 8 0 1.77 2013-Sep-20 09:11:21 4171699.10729 872122.07044 4730018.73306 11.80801 48.17152 539.82404 0.36692 2.43062 15.23338 -0.82469 0.50755 1.45882 8 8 0 1.77 2013-Sep-20 09:11:21 4171698.28009 872122.26908 4730018.27515 11.80802 48.17152 538.96995 0.73064 2.69829 14.37930 -0.46098 0.77522 0.60473 8 8 0 1.77 2013-Sep-20 09:11:21 4171699.19818 872122.29725 4730019.24244 11.80801 48.17152 540.29389 0.57034 2.66945 15.70323 -0.62128 0.74638 1.92867 8 8 0 1.77 2013-Sep-20 09:11:21 4171700.69256 872121.82900 4730020.69249 11.80800 48.17152 542.28600 -0.19381 2.61793 17.69534 -1.38543 0.69485 3.92078 8 8 0 1.77 2013-Sep-20 09:11:21 4171700.84964 872121.86280 4730021.03791 11.80800 48.17152 542.65054 -0.19286 2.72857 18.05989 -1.38448 0.80549 4.28532 8 8 0 1.77 2013-Sep-20 09:11:21 4171701.16657 872122.08856 4730021.73122 11.80801 48.17152 543.40486 -0.03674 2.92535 18.81420 -1.22835 1.00228 5.03964 8 8 0 1.77 2013-Sep-20 09:11:21 4171701.22798 872122.45284 4730021.79066 11.80801 48.17152 543.53895 0.30726 2.86466 18.94829 -0.88435 0.94158 5.17373 8 8 0 1.77 2013-Sep-20 09:11:21 4171700.68390 872122.55199 4730021.56941 11.80801 48.17153 543.03244 0.51566 3.09883 18.44179 -0.67596 1.17575 4.66722 8 8 0 1.77 2013-Sep-20 09:11:21 4171701.10633 872122.77780 4730021.66301 11.80801 48.17152 543.40876 0.65025 2.81871 18.81811 -0.54137 0.89563 5.04354 8 8 0 1.77 2013-Sep-20 09:11:21 4171701.53388 872122.88169 4730022.32459 11.80801 48.17152 544.19502 0.66444 2.93223 19.60436 -0.52717 1.00915 5.82980 8 8 0 1.77 2013-Sep-20 09:11:21 4171701.08281 872122.95332 4730022.42754 11.80802 48.17153 543.98705 0.82687 3.31896 19.39639 -0.36475 1.39588 5.62183 8 8 0 1.77 2013-Sep-20 09:11:21 4171701.69585 872123.01475 4730022.72729 11.80802 48.17153 544.61897 0.76155 3.06236 20.02832 -0.43007 1.13929 6.25376 8 8 0 1.77 2013-Sep-20 09:11:21 4171702.00964 872123.02682 4730023.12507 11.80802 48.17153 545.12187 0.70915 3.09693 20.53121 -0.48247 1.17385 6.75665 8 8 0 1.77 2013-Sep-20 09:11:21 4171701.62224 872123.11548 4730023.00444 11.80802 48.17153 544.79118 0.87521 3.28552 20.20053 -0.31641 1.36245 6.42596 8 8 0 1.77 2013-Sep-20 09:11:21 4171702.21595 872122.67510 4730023.60782 11.80801 48.17153 545.56826 0.32266 3.32203 20.97761 -0.86896 1.39895 7.20305 8 8 0 1.77 2013-Sep-20 09:11:21 4171701.83706 872122.66981 4730023.60130 11.80801 48.17153 545.31534 0.39501 3.59485 20.72469 -0.79661 1.67177 6.95013 8 8 0 1.77 2013-Sep-20 09:11:21 4171702.58636 872122.56318 4730024.14919 11.80801 48.17153 546.19819 0.13731 3.42997 21.60753 -1.05431 1.50690 7.83297 8 8 0 1.77 2013-Sep-20 09:11:22 4171701.95182 872122.43491 4730023.93596 11.80801 48.17153 545.60757 0.14160 3.77015 21.01692 -1.05002 1.84707 7.24235 8 8 0 1.77 2013-Sep-20 09:11:22 4171702.41310 872122.48657 4730023.94704 11.80801 48.17153 545.92400 0.09777 3.43321 21.33334 -1.09385 1.51013 7.55878 8 8 0 1.77 2013-Sep-20 09:11:22 4171702.44279 872122.27459 4730023.48950 11.80800 48.17153 545.57352 -0.11580 3.13874 20.98286 -1.30742 1.21567 7.20830 8 8 0 1.77 2013-Sep-20 09:11:22 4171702.64826 872122.07543 4730023.73818 11.80800 48.17153 545.86577 -0.35279 3.18509 21.27512 -1.54441 1.26201 7.50056 8 8 0 1.77 2013-Sep-20 09:11:22 4171702.62559 872122.13798 4730023.36697 11.80800 48.17152 545.58290 -0.28693 2.94453 20.99224 -1.47855 1.02145 7.21768 8 8 0 1.77 2013-Sep-20 09:11:22 4171702.27410 872122.14048 4730023.04507 11.80800 48.17152 545.11393 -0.21255 2.98584 20.52327 -1.40417 1.06277 6.74871 8 8 0 1.77 2013-Sep-20 09:11:22 4171702.33847 872122.02619 4730022.91413 11.80800 48.17152 545.04279 -0.33759 2.86899 20.45213 -1.52921 0.94592 6.67757 8 8 0 1.77 2013-Sep-20 09:11:22 4171702.47646 872122.03247 4730022.58428 11.80800 48.17152 544.88794 -0.35969 2.54741 20.29728 -1.55130 0.62433 6.52272 8 8 0 1.77 2013-Sep-20 09:11:22 4171702.70174 872121.61386 4730022.82344 11.80799 48.17152 545.15608 -0.81554 2.60642 20.56542 -2.00716 0.68335 6.79086 8 8 0 1.77 2013-Sep-20 09:11:22 4171702.77318 872121.79219 4730022.32239 11.80800 48.17152 544.85370 -0.65560 2.19297 20.26304 -1.84722 0.26990 6.48848 8 8 0 1.77 2013-Sep-20 09:11:22 4171702.31283 872121.63760 4730021.65430 11.80800 48.17152 544.03427 -0.71272 2.10676 19.44361 -1.90433 0.18368 5.66905 8 8 0 1.77 2013-Sep-20 09:11:22 4171701.63536 872121.75914 4730020.71023 11.80800 48.17152 542.90513 -0.45511 1.95275 18.31448 -1.64673 0.02968 4.53992 8 8 0 1.77 2013-Sep-20 09:11:22 4171701.14263 872121.72429 4730020.32085 11.80800 48.17152 542.28858 -0.38840 2.05778 17.69792 -1.58002 0.13470 3.92336 8 8 0 1.77 2013-Sep-20 09:11:22 4171701.04761 872121.94644 4730019.95171 11.80800 48.17151 541.98181 -0.15151 1.84703 17.39116 -1.34313 -0.07605 3.61659 8 8 0 1.77 2013-Sep-20 09:11:22 4171700.80880 872121.67336 4730019.72100 11.80800 48.17151 541.61674 -0.36994 1.90899 17.02608 -1.56156 -0.01409 3.25152 8 8 0 1.77 2013-Sep-20 09:11:22 4171700.89026 872121.57862 4730019.80591 11.80800 48.17151 541.72026 -0.47934 1.92064 17.12960 -1.67096 -0.00243 3.35504 8 8 0 1.77 2013-Sep-20 09:11:22 4171700.47474 872121.47160 4730019.61736 11.80800 48.17152 541.29391 -0.49907 2.11429 16.70325 -1.69069 0.19121 2.92869 8 8 0 1.77 2013-Sep-20 09:11:22 4171700.55331 872121.65886 4730018.80111 11.80800 48.17151 540.76253 -0.33185 1.48407 16.17188 -1.52347 -0.43901 2.39731 8 8 0 1.77 2013-Sep-20 09:11:22 4171700.61488 872121.44608 4730018.76201 11.80800 48.17151 540.74454 -0.55273 1.44553 16.15389 -1.74434 -0.47754 2.37933 8 8 0 1.77 2013-Sep-20 09:11:22 4171700.49863 872121.68465 4730018.66708 11.80800 48.17151 540.63048 -0.29541 1.43063 16.03982 -1.48703 -0.49244 2.26526 8 8 0 1.77 2013-Sep-20 09:11:22 4171700.72713 872121.53659 4730019.24872 11.80800 48.17151 541.19285 -0.48710 1.67445 16.60219 -1.67872 -0.24863 2.82763 8 8 0 1.77 2013-Sep-20 09:11:22 4171700.89901 872121.26161 4730018.92592 11.80799 48.17151 541.02698 -0.79143 1.37573 16.43632 -1.98305 -0.54734 2.66176 8 8 0 1.77 2013-Sep-20 09:11:22 4171700.38213 872121.58721 4730018.76743 11.80800 48.17151 540.61591 -0.36695 1.59738 16.02525 -1.55857 -0.32569 2.25069 8 8 0 1.77 2013-Sep-20 09:11:22 4171700.48126 872122.01041 4730018.68470 11.80801 48.17151 540.67673 0.02700 1.40538 16.08607 -1.16462 -0.51770 2.31151 8 8 0 1.77 2013-Sep-20 09:11:22 4171700.42981 872122.09768 4730018.93777 11.80801 48.17151 540.84362 0.12296 1.59838 16.25297 -1.06866 -0.32470 2.47840 8 8 0 1.77 2013-Sep-20 09:11:23 4171700.25674 872122.04299 4730018.60865 11.80801 48.17151 540.47794 0.10484 1.51346 15.88729 -1.08678 -0.40962 2.11272 8 8 0 1.77 2013-Sep-20 09:11:23 4171699.16549 872122.38864 4730018.10177 11.80801 48.17151 539.43505 0.66648 1.91864 14.84440 -0.52513 -0.00443 1.06983 8 8 0 1.77 2013-Sep-20 09:11:23 4171698.90923 872122.50577 4730017.52694 11.80802 48.17151 538.85542 0.83357 1.70434 14.26477 -0.35805 -0.21874 0.49021 8 8 0 1.77 2013-Sep-20 09:11:23 4171698.87469 872122.60967 4730017.19972 11.80802 48.17151 538.60323 0.94234 1.49546 14.01257 -0.24928 -0.42762 0.23801 8 8 0 1.77 2013-Sep-20 09:11:23 4171698.74918 872123.04708 4730016.52811 11.80802 48.17151 538.08054 1.39618 1.07241 13.48989 0.20456 -0.85066 -0.28468 8 8 0 1.77 2013-Sep-20 09:11:23 4171698.16746 872123.30345 4730016.20370 11.80803 48.17151 537.49406 1.76616 1.24126 12.90341 0.57454 -0.68181 -0.87116 8 8 0 1.77 2013-Sep-20 09:11:23 4171697.47430 872123.78172 4730015.50247 11.80804 48.17151 536.58432 2.37615 1.20625 11.99367 1.18453 -0.71682 -1.78090 8 8 0 1.77 2013-Sep-20 09:11:23 4171696.86109 872123.68251 4730014.85597 11.80804 48.17151 535.68875 2.40452 1.23749 11.09810 1.21291 -0.68558 -2.67647 8 8 0 1.77 2013-Sep-20 09:11:23 4171696.35236 872123.75839 4730015.45932 11.80804 48.17152 535.81660 2.58291 1.99936 11.22594 1.39129 0.07628 -2.54862 8 8 0 1.77 2013-Sep-20 09:11:23 4171695.94794 872124.22422 4730015.25092 11.80805 48.17152 535.46088 3.12163 2.08432 10.87022 1.93001 0.16124 -2.90434 8 8 0 1.77 2013-Sep-20 09:11:23 4171695.41651 872124.31269 4730015.18146 11.80805 48.17152 535.07428 3.31698 2.41211 10.48362 2.12537 0.48904 -3.29094 8 8 0 1.77 2013-Sep-20 09:11:23 4171695.64186 872124.48128 4730015.07744 11.80805 48.17152 535.16689 3.43589 2.15267 10.57623 2.24427 0.22960 -3.19833 8 8 0 1.77 2013-Sep-20 09:11:23 4171695.99033 872124.18767 4730015.78382 11.80805 48.17152 535.88065 3.07719 2.41436 11.28999 1.88557 0.49129 -2.48457 8 8 0 1.77 2013-Sep-20 09:11:23 4171695.50380 872124.63646 4730014.95546 11.80805 48.17152 535.00705 3.61603 2.14836 10.41639 2.42442 0.22528 -3.35817 8 8 0 1.77 2013-Sep-20 09:11:23 4171694.98197 872124.64948 4730014.60006 11.80806 48.17152 534.40335 3.73556 2.28997 9.81270 2.54395 0.36689 -3.96187 8 8 0 1.77 2013-Sep-20 09:11:23 4171694.31828 872124.71684 4730014.54467 11.80806 48.17152 533.93802 3.93731 2.72684 9.34736 2.74570 0.80376 -4.42720 8 8 0 1.77 2013-Sep-20 09:11:23 4171693.73938 872124.89906 4730014.04188 11.80806 48.17152 533.21034 4.23413 2.78598 8.61968 3.04252 0.86290 -5.15488 8 8 0 1.77 2013-Sep-20 09:11:23 4171693.33447 872124.85972 4730013.39787 11.80806 48.17152 532.46076 4.27848 2.65781 7.87011 3.08687 0.73474 -5.90445 8 8 0 1.77 2013-Sep-20 09:11:23 4171693.33025 872124.94481 4730013.19497 11.80806 48.17152 532.31843 4.36264 2.51260 7.72778 3.17102 0.58953 -6.04679 8 8 0 1.77 2013-Sep-20 09:11:23 4171693.53122 872124.97490 4730013.15073 11.80806 48.17152 532.42077 4.35096 2.33193 7.83011 3.15935 0.40885 -5.94445 8 8 0 1.77 2013-Sep-20 09:11:23 4171694.08680 872125.12819 4730013.06252 11.80806 48.17151 532.73863 4.38732 1.84449 8.14798 3.19571 -0.07858 -5.62659 8 8 0 1.77 2013-Sep-20 09:11:23 4171693.49335 872125.31109 4730012.56778 11.80807 48.17151 532.00754 4.68779 1.91951 7.41688 3.49618 -0.00356 -6.35768 8 8 0 1.77 2013-Sep-20 09:11:23 4171694.23364 872125.33371 4730012.45002 11.80807 48.17151 532.40613 4.55845 1.29758 7.81548 3.36683 -0.62549 -5.95909 8 8 0 1.77 2013-Sep-20 09:11:23 4171694.78063 872124.95911 4730012.82499 11.80806 48.17151 532.99149 4.07984 1.20581 8.40084 2.88822 -0.71727 -5.37373 8 8 0 1.77 2013-Sep-20 09:11:23 4171694.84330 872125.01134 4730012.54997 11.80806 48.17151 532.83460 4.11814 0.96872 8.24395 2.92652 -0.95436 -5.53062 8 8 0 1.77 2013-Sep-20 09:11:24 4171694.78080 872124.89122 4730012.57800 11.80806 48.17151 532.79829 4.01336 1.05132 8.20763 2.82174 -0.87176 -5.56693 8 8 0 1.77 2013-Sep-20 09:11:24 4171694.55134 872124.87342 4730012.17800 11.80806 48.17151 532.34801 4.04288 0.95463 7.75736 2.85127 -0.96845 -6.01721 8 8 0 1.77 2013-Sep-20 09:11:24 4171694.40329 872124.59192 4730012.24326 11.80806 48.17151 532.26158 3.79764 1.14906 7.67092 2.60602 -0.77401 -6.10364 8 8 0 1.77 2013-Sep-20 09:11:24 4171694.72814 872124.31088 4730012.39862 11.80805 48.17151 532.55105 3.45607 1.05859 7.96039 2.26445 -0.86449 -5.81417 8 8 0 1.77 2013-Sep-20 09:11:24 4171695.27170 872124.30449 4730012.36729 11.80805 48.17150 532.88166 3.33858 0.64221 8.29101 2.14697 -1.28087 -5.48356 8 8 0 1.77 2013-Sep-20 09:11:24 4171695.59018 872124.22692 4730012.68059 11.80805 48.17150 533.31243 3.19748 0.63069 8.72178 2.00587 -1.29239 -5.05279 8 8 0 1.77 2013-Sep-20 09:11:24 4171695.61785 872124.16338 4730012.64843 11.80805 48.17150 533.29786 3.12963 0.59875 8.70721 1.93801 -1.32433 -5.06736 8 8 0 1.77 2013-Sep-20 09:11:24 4171695.56272 872124.27940 4730012.24025 11.80805 48.17150 532.97356 3.25447 0.34905 8.38290 2.06285 -1.57403 -5.39166 8 8 0 1.77 2013-Sep-20 09:11:24 4171695.98208 872123.84131 4730012.65562 11.80804 48.17150 533.49703 2.73984 0.38699 8.90638 1.54823 -1.53608 -4.86819 8 8 0 1.77 2013-Sep-20 09:11:24 4171696.40650 872123.93324 4730012.83200 11.80804 48.17150 533.91807 2.74298 0.18104 9.32741 1.55136 -1.74204 -4.44715 8 8 0 1.77 2013-Sep-20 09:11:24 4171697.01401 872123.56027 4730013.64619 11.80804 48.17150 534.87043 2.25358 0.33779 10.27978 1.06197 -1.58528 -3.49479 8 8 0 1.77 2013-Sep-20 09:11:24 4171697.78434 872123.37628 4730014.04490 11.80803 48.17150 535.64528 1.91585 0.06988 11.05463 0.72423 -1.85319 -2.71994 8 8 0 1.77 2013-Sep-20 09:11:24 4171698.57004 872123.35096 4730014.80813 11.80803 48.17150 536.72344 1.73029 0.00967 12.13279 0.53867 -1.91340 -1.64177 8 8 0 1.77 2013-Sep-20 09:11:24 4171698.63797 872123.40502 4730015.23920 11.80803 48.17150 537.09637 1.76930 0.23936 12.50572 0.57769 -1.68371 -1.26885 8 8 0 1.77 2013-Sep-20 09:11:24 4171699.46071 872123.29389 4730016.27388 11.80803 48.17150 538.38927 1.49216 0.34626 13.79862 0.30055 -1.57682 0.02406 8 8 0 1.77 2013-Sep-20 09:11:24 4171699.00394 872123.28348 4730016.64307 11.80803 48.17151 538.36477 1.57544 0.92722 13.77412 0.38382 -0.99585 -0.00045 8 8 0 1.77 2013-Sep-20 09:11:24 4171699.14968 872123.07268 4730017.00955 11.80802 48.17151 538.70422 1.33928 1.09747 14.11357 0.14767 -0.82561 0.33900 8 8 0 1.77 2013-Sep-20 09:11:24 4171698.67452 872123.06323 4730016.30640 11.80802 48.17151 537.86881 1.42726 0.97654 13.27815 0.23564 -0.94653 -0.49641 8 8 0 1.77 2013-Sep-20 09:11:24 4171697.86922 872123.34143 4730016.19643 11.80803 48.17151 537.29913 1.86437 1.44815 12.70848 0.67275 -0.47492 -1.06608 8 8 0 1.77 2013-Sep-20 09:11:24 4171697.95299 872123.63161 4730016.52621 11.80803 48.17151 537.63916 2.13127 1.56274 13.04850 0.93965 -0.36034 -0.72606 8 8 0 1.77 2013-Sep-20 09:11:24 4171698.30013 872123.37775 4730017.15193 11.80803 48.17151 538.29737 1.81174 1.76555 13.70672 0.62013 -0.15753 -0.06785 8 8 0 1.77 2013-Sep-20 09:11:24 4171698.61127 872123.27377 4730017.20090 11.80803 48.17151 538.52278 1.64629 1.58712 13.93213 0.45467 -0.33595 0.15756 8 8 0 1.77 2013-Sep-20 09:11:24 4171698.70536 872123.09196 4730017.81255 11.80803 48.17152 539.01516 1.44907 1.95413 14.42450 0.25746 0.03106 0.64994 8 8 0 1.77 2013-Sep-20 09:11:24 4171699.32078 872123.10792 4730018.75535 11.80802 48.17152 540.12159 1.33877 2.13158 15.53094 0.14715 0.20850 1.75638 8 8 0 1.77 2013-Sep-20 09:11:24 4171700.44214 872122.69263 4730019.56567 11.80802 48.17151 541.40074 0.70279 1.91741 16.81009 -0.48882 -0.00567 3.03552 8 8 0 1.77 2013-Sep-20 09:11:25 4171700.87047 872122.61229 4730020.08077 11.80801 48.17152 542.05321 0.53650 1.96078 17.46256 -0.65512 0.03770 3.68800 8 8 0 1.77 2013-Sep-20 09:11:25 4171702.04694 872122.35947 4730020.86237 11.80801 48.17151 543.36910 0.04828 1.66248 18.77845 -1.14333 -0.26060 5.00388 8 8 0 1.77 2013-Sep-20 09:11:25 4171702.17856 872122.18386 4730020.40536 11.80800 48.17151 543.09052 -0.15054 1.28848 18.49986 -1.34216 -0.63460 4.72530 8 8 0 1.77 2013-Sep-20 09:11:25 4171702.82370 872122.51184 4730020.74153 11.80801 48.17151 543.80692 0.03848 0.99212 19.21626 -1.15313 -0.93096 5.44170 8 8 0 1.77 2013-Sep-20 09:11:25 4171703.32821 872122.39124 4730021.23514 11.80800 48.17151 544.48761 -0.18281 0.97171 19.89695 -1.37442 -0.95137 6.12239 8 8 0 1.77 2013-Sep-20 09:11:25 4171702.96839 872122.67505 4730020.93220 11.80801 48.17151 544.06572 0.16863 0.98885 19.47506 -1.02299 -0.93423 5.70050 8 8 0 1.77 2013-Sep-20 09:11:25 4171703.49831 872122.59217 4730021.58466 11.80801 48.17151 544.88651 -0.02094 1.05010 20.29586 -1.21255 -0.87298 6.52129 8 8 0 1.77 2013-Sep-20 09:11:25 4171703.58810 872122.25336 4730021.80658 11.80800 48.17151 545.06425 -0.37094 1.18428 20.47359 -1.56256 -0.73880 6.69903 8 8 0 1.77 2013-Sep-20 09:11:25 4171703.50841 872122.21588 4730022.54002 11.80800 48.17151 545.55364 -0.39132 1.73725 20.96298 -1.58294 -0.18583 7.18842 8 8 0 1.77 2013-Sep-20 09:11:25 4171703.34375 872122.34164 4730022.80422 11.80800 48.17152 545.66017 -0.23453 2.01437 21.06951 -1.42615 0.09129 7.29495 8 8 0 1.77 2013-Sep-20 09:11:25 4171702.78201 872122.25393 4730023.00194 11.80800 48.17152 545.42884 -0.20544 2.56932 20.83819 -1.39705 0.64624 7.06362 8 8 0 1.77 2013-Sep-20 09:11:25 4171702.77401 872122.25906 4730022.45941 11.80800 48.17152 545.02005 -0.19878 2.21256 20.42939 -1.39040 0.28948 6.65483 8 8 0 1.77 2013-Sep-20 09:11:25 4171702.61148 872122.29617 4730022.39868 11.80800 48.17152 544.87376 -0.12919 2.28494 20.28310 -1.32081 0.36187 6.50854 8 8 0 1.77 2013-Sep-20 09:11:25 4171702.43756 872122.22809 4730021.98278 11.80800 48.17152 544.44103 -0.16024 2.14481 19.85037 -1.35186 0.22173 6.07581 8 8 0 1.77 2013-Sep-20 09:11:25 4171702.41514 872122.17541 4730021.44668 11.80800 48.17151 544.01974 -0.20722 1.81167 19.42908 -1.39884 -0.11141 5.65452 8 8 0 1.77 2013-Sep-20 09:11:25 4171702.02984 872122.18943 4730021.14974 11.80800 48.17151 543.54887 -0.11466 1.89253 18.95821 -1.30628 -0.03055 5.18365 8 8 0 1.77 2013-Sep-20 09:11:25 4171702.26815 872121.97079 4730021.35574 11.80800 48.17151 543.82809 -0.37744 1.88943 19.23744 -1.56905 -0.03364 5.46288 8 8 0 1.77 2013-Sep-20 09:11:25 4171702.70269 872122.03374 4730021.52410 11.80800 48.17151 544.24580 -0.40474 1.67517 19.65515 -1.59636 -0.24791 5.88058 8 8 0 1.77 2013-Sep-20 09:11:25 4171702.39376 872122.50537 4730020.78404 11.80801 48.17151 543.55705 0.12013 1.33504 18.96639 -1.07149 -0.58804 5.19183 8 8 0 1.77 2013-Sep-20 09:11:25 4171702.54888 872122.53675 4730020.89914 11.80801 48.17151 543.74835 0.11911 1.29387 19.15770 -1.07251 -0.62921 5.38314 8 8 0 1.77 2013-Sep-20 09:11:25 4171702.35316 872122.91499 4730020.73096 11.80801 48.17151 543.54689 0.52940 1.26679 18.95624 -0.66222 -0.65628 5.18167 8 8 0 1.77 2013-Sep-20 09:11:25 4171701.88670 872123.24296 4730020.01185 11.80802 48.17151 542.75131 0.94587 1.07742 18.16065 -0.24575 -0.84565 4.38609 8 8 0 1.77 2013-Sep-20 09:11:25 4171701.13527 872123.05459 4730019.83813 11.80802 48.17151 542.10563 0.91526 1.53837 17.51498 -0.27636 -0.38470 3.74042 8 8 0 1.77 2013-Sep-20 09:11:25 4171700.10440 872123.37547 4730018.53072 11.80802 48.17151 540.50227 1.44030 1.36942 15.91161 0.24868 -0.55365 2.13705 8 8 0 1.77 2013-Sep-20 09:11:25 4171700.31801 872123.36362 4730018.74722 11.80802 48.17151 540.80142 1.38499 1.35981 16.21076 0.19337 -0.56327 2.43620 8 8 0 1.77 2013-Sep-20 09:11:26 4171699.92813 872123.31133 4730018.90982 11.80802 48.17151 540.66093 1.41359 1.76059 16.07028 0.22197 -0.16249 2.29572 8 8 0 1.77 2013-Sep-20 09:11:26 4171686.25644 872113.04668 4730002.40583 11.80793 48.17152 518.03750 -5.83618 2.29100 -6.55316 -7.02779 0.36793 -20.32772 8 8 0 1.77 2013-Sep-20 09:11:26 4171699.56855 872122.88902 4730018.11974 11.80802 48.17151 539.77984 1.07379 1.56035 15.18919 -0.11783 -0.36273 1.41462 8 8 0 1.77 2013-Sep-20 09:11:26 4171698.95488 872122.83635 4730017.57470 11.80802 48.17151 538.96593 1.14782 1.65249 14.37527 -0.04380 -0.27059 0.60071 8 8 0 1.77 2013-Sep-20 09:11:26 4171698.52139 872122.91328 4730017.74223 11.80802 48.17152 538.81828 1.31183 2.06866 14.22762 0.12021 0.14558 0.45306 8 8 0 1.77 2013-Sep-20 09:11:26 4171698.33324 872122.83087 4730017.73504 11.80802 48.17152 538.67886 1.26966 2.21366 14.08820 0.07805 0.29058 0.31364 8 8 0 1.77 2013-Sep-20 09:11:26 4171698.57027 872122.78294 4730017.69385 11.80802 48.17152 538.79635 1.17424 2.02062 14.20570 -0.01738 0.09754 0.43113 8 8 0 1.77 2013-Sep-20 09:11:26 4171697.87094 872122.80878 4730017.20228 11.80802 48.17152 537.97707 1.34264 2.19892 13.38641 0.15102 0.27584 -0.38815 8 8 0 1.77 2013-Sep-20 09:11:26 4171697.41115 872122.56544 4730016.69303 11.80802 48.17152 537.26425 1.19853 2.23177 12.67360 0.00692 0.30870 -1.10097 8 8 0 1.77 2013-Sep-20 09:11:26 4171696.96020 872122.58784 4730016.48740 11.80802 48.17152 536.81971 1.31274 2.42013 12.22905 0.12113 0.49705 -1.54551 8 8 0 1.77 2013-Sep-20 09:11:26 4171696.33252 872122.42855 4730015.88985 11.80802 48.17152 535.94297 1.28526 2.50372 11.35232 0.09364 0.58065 -2.42225 8 8 0 1.77 2013-Sep-20 09:11:26 4171695.66835 872122.30662 4730015.53695 11.80802 48.17152 535.22980 1.30183 2.77139 10.63914 0.11021 0.84832 -3.13542 8 8 0 1.77 2013-Sep-20 09:11:26 4171695.62194 872121.98928 4730016.07159 11.80802 48.17153 535.55458 1.00070 3.21019 10.96393 -0.19092 1.28711 -2.81064 8 8 0 1.77 2013-Sep-20 09:11:26 4171696.08143 872121.75290 4730016.38898 11.80801 48.17153 536.05877 0.67529 3.12275 11.46812 -0.51632 1.19968 -2.30645 8 8 0 1.77 2013-Sep-20 09:11:26 4171695.52989 872121.73778 4730016.13000 11.80802 48.17153 535.50369 0.77335 3.35463 10.91303 -0.41826 1.43155 -2.86153 8 8 0 1.77 2013-Sep-20 09:11:26 4171695.65018 872121.48345 4730016.54054 11.80801 48.17153 535.85342 0.49980 3.57946 11.26276 -0.69182 1.65638 -2.51180 8 8 0 1.77 2013-Sep-20 09:11:26 4171695.38313 872121.29255 4730016.04228 11.80801 48.17153 535.28177 0.36758 3.47105 10.69111 -0.82403 1.54798 -3.08345 8 8 0 1.77 2013-Sep-20 09:11:26 4171695.83768 872121.01103 4730015.58530 11.80801 48.17152 535.19955 -0.00100 2.87769 10.60890 -1.19262 0.95461 -3.16567 8 8 0 1.77 2013-Sep-20 09:11:26 4171695.82594 872120.89886 4730015.42913 11.80800 48.17152 535.06021 -0.10840 2.79920 10.46956 -1.30001 0.87613 -3.30500 8 8 0 1.77 2013-Sep-20 09:11:26 4171695.59724 872120.81960 4730015.20978 11.80800 48.17152 534.73666 -0.13918 2.83181 10.14600 -1.33079 0.90874 -3.62856 8 8 0 1.77 2013-Sep-20 09:11:26 4171695.12172 872120.87485 4730014.56353 11.80801 48.17152 533.95223 0.01221 2.73923 9.36158 -1.17941 0.81616 -4.41299 8 8 0 1.77 2013-Sep-20 09:11:26 4171695.14789 872120.86452 4730013.94300 11.80801 48.17152 533.50552 -0.00326 2.30789 8.91486 -1.19487 0.38481 -4.85970 8 8 0 1.77 2013-Sep-20 09:11:26 4171695.18999 872120.81862 4730014.02310 11.80800 48.17152 533.58642 -0.05680 2.33760 8.99577 -1.24841 0.41453 -4.77879 8 8 0 1.77 2013-Sep-20 09:11:26 4171694.99597 872120.81405 4730014.03766 11.80801 48.17152 533.47000 -0.02157 2.48952 8.87934 -1.21318 0.56645 -4.89522 8 8 0 1.77 2013-Sep-20 09:11:26 4171694.89505 872121.09917 4730013.41178 11.80801 48.17152 532.97666 0.27817 2.10225 8.38600 -0.91345 0.17918 -5.38856 8 8 0 1.77 2013-Sep-20 09:11:27 4171694.66456 872121.03217 4730013.18248 11.80801 48.17152 532.64619 0.25975 2.12766 8.05553 -0.93186 0.20458 -5.71903 8 8 0 1.77 2013-Sep-20 09:11:27 4171695.13153 872121.16667 4730013.53852 11.80801 48.17152 533.23468 0.29585 2.00400 8.64403 -0.89577 0.08093 -5.13054 8 8 0 1.77 2013-Sep-20 09:11:27 4171695.21893 872121.08356 4730013.02197 11.80801 48.17151 532.89549 0.19662 1.60844 8.30483 -0.99500 -0.31464 -5.46973 8 8 0 1.77 2013-Sep-20 09:11:27 4171695.34719 872121.08913 4730013.23862 11.80801 48.17151 533.14141 0.17582 1.65852 8.55076 -1.01579 -0.26456 -5.22381 8 8 0 1.77 2013-Sep-20 09:11:27 4171695.78405 872121.08917 4730013.08218 11.80801 48.17151 533.31002 0.08647 1.23555 8.71936 -1.10515 -0.68753 -5.05520 8 8 0 1.77 2013-Sep-20 09:11:27 4171696.51473 872121.19700 4730012.97371 11.80801 48.17150 533.72090 0.04249 0.61383 9.13024 -1.14913 -1.30925 -4.64432 8 8 0 1.77 2013-Sep-20 09:11:27 4171696.41898 872121.58683 4730013.01542 11.80801 48.17150 533.74267 0.44366 0.65204 9.15201 -0.74796 -1.27104 -4.62255 8 8 0 1.77 2013-Sep-20 09:11:27 4171696.78157 872121.55351 4730013.08254 11.80801 48.17150 534.02483 0.33685 0.43742 9.43418 -0.85476 -1.48566 -4.34039 8 8 0 1.77 2013-Sep-20 09:11:27 4171696.94521 872121.43326 4730013.19378 11.80801 48.17150 534.19814 0.18566 0.41058 9.60748 -1.00596 -1.51249 -4.16708 8 8 0 1.77 2013-Sep-20 09:11:27 4171696.34722 872121.53376 4730013.01959 11.80801 48.17150 533.69169 0.40640 0.71525 9.10104 -0.78522 -1.20782 -4.67353 8 8 0 1.77 2013-Sep-20 09:11:27 4171695.80649 872121.63805 4730013.15818 11.80801 48.17151 533.45621 0.61913 1.18618 8.86555 -0.57248 -0.73690 -4.90901 8 8 0 1.77 2013-Sep-20 09:11:27 4171696.26694 872121.68348 4730013.63981 11.80801 48.17151 534.12187 0.56938 1.16460 9.53121 -0.62224 -0.75847 -4.24335 8 8 0 1.77 2013-Sep-20 09:11:27 4171696.86514 872121.65469 4730014.17177 11.80801 48.17151 534.90483 0.41878 1.08745 10.31418 -0.77283 -0.83562 -3.46039 8 8 0 1.77 2013-Sep-20 09:11:27 4171696.64572 872121.63862 4730014.60878 11.80801 48.17151 535.08503 0.44796 1.54138 10.49438 -0.74366 -0.38169 -3.28019 8 8 0 1.77 2013-Sep-20 09:11:27 4171697.26958 872121.42909 4730014.98613 11.80801 48.17151 535.74487 0.11520 1.36996 11.15422 -1.07641 -0.55312 -2.62034 8 8 0 1.77 2013-Sep-20 09:11:27 4171697.71455 872121.25431 4730015.45913 11.80800 48.17151 536.36394 -0.14694 1.38750 11.77329 -1.33855 -0.53558 -2.00127 8 8 0 1.77 2013-Sep-20 09:11:27 4171697.93379 872121.15119 4730015.58951 11.80800 48.17151 536.59014 -0.29274 1.33027 11.99948 -1.48436 -0.59281 -1.77508 8 8 0 1.77 2013-Sep-20 09:11:27 4171697.93831 872121.03476 4730015.93374 11.80800 48.17151 536.83370 -0.40763 1.57429 12.24304 -1.59924 -0.34878 -1.53152 8 8 0 1.77 2013-Sep-20 09:11:27 4171698.05693 872120.81900 4730016.72257 11.80800 48.17152 537.46948 -0.64309 2.04674 12.87883 -1.83471 0.12367 -0.89573 8 8 0 1.77 2013-Sep-20 09:11:27 4171698.85061 872120.85197 4730017.58196 11.80800 48.17152 538.63247 -0.77324 2.03596 14.04181 -1.96486 0.11288 0.26725 8 8 0 1.77 2013-Sep-20 09:11:27 4171699.06065 872120.99495 4730018.08383 11.80800 48.17152 539.16305 -0.67627 2.19566 14.57240 -1.86788 0.27258 0.79783 8 8 0 1.77 2013-Sep-20 09:11:27 4171700.12481 872120.98896 4730018.58090 11.80799 48.17151 540.22729 -0.89989 1.75190 15.63664 -2.09151 -0.17118 1.86207 8 8 0 1.77 2013-Sep-20 09:11:27 4171700.76326 872121.27936 4730019.54425 11.80800 48.17151 541.40154 -0.74628 1.88441 16.81088 -1.93790 -0.03866 3.03632 8 8 0 1.77 2013-Sep-20 09:11:27 4171700.78941 872121.59183 4730019.72916 11.80800 48.17152 541.59903 -0.44578 1.94100 17.00838 -1.63740 0.01793 3.23381 8 8 0 1.77 2013-Sep-20 09:11:27 4171701.07459 872121.92558 4730020.12946 11.80800 48.17152 542.12903 -0.17744 1.94908 17.53837 -1.36906 0.02600 3.76381 8 8 0 1.77 2013-Sep-20 09:11:28 4171700.52982 872122.32645 4730019.99796 11.80801 48.17152 541.73013 0.32642 2.19759 17.13947 -0.86520 0.27452 3.36491 8 8 0 1.77 2013-Sep-20 09:11:28 4171700.65498 872122.59203 4730020.40760 11.80801 48.17152 542.15331 0.56077 2.33899 17.56266 -0.63085 0.41592 3.78810 8 8 0 1.77 2013-Sep-20 09:11:28 4171701.02892 872122.65950 4730020.58537 11.80801 48.17152 542.53909 0.55029 2.17452 17.94844 -0.64133 0.25145 4.17387 8 8 0 1.77 2013-Sep-20 09:11:28 4171701.34994 872123.10874 4730021.06532 11.80802 48.17152 543.16759 0.92433 2.19196 18.57693 -0.26729 0.26888 4.80237 8 8 0 1.77 2013-Sep-20 09:11:28 4171701.41566 872123.29479 4730021.36912 11.80802 48.17152 543.46225 1.09300 2.31826 18.87160 -0.09862 0.39518 5.09704 8 8 0 1.77 2013-Sep-20 09:11:28 4171700.99465 872123.57060 4730021.46935 11.80803 48.17152 543.29975 1.44912 2.65012 18.70909 0.25751 0.72704 4.93453 8 8 0 1.77 2013-Sep-20 09:11:28 4171701.32391 872123.59479 4730022.26359 11.80802 48.17152 544.10981 1.40542 2.93596 19.51915 0.21380 1.01288 5.74459 8 8 0 1.77 2013-Sep-20 09:11:28 4171701.51905 872123.74322 4730021.91649 11.80803 48.17152 543.99881 1.51078 2.53952 19.40816 0.31916 0.61644 5.63360 8 8 0 1.77 2013-Sep-20 09:11:28 4171701.22378 872124.03588 4730021.56745 11.80803 48.17152 543.58592 1.85767 2.47748 18.99526 0.66605 0.55440 5.22070 8 8 0 1.77 2013-Sep-20 09:11:28 4171701.17356 872124.18506 4730021.49768 11.80803 48.17152 543.52150 2.01397 2.44483 18.93085 0.82236 0.52176 5.15629 8 8 0 1.77 2013-Sep-20 09:11:28 4171700.87815 872124.61377 4730021.22935 11.80804 48.17152 543.18723 2.49405 2.41597 18.59657 1.30244 0.49290 4.82201 8 8 0 1.77 2013-Sep-20 09:11:28 4171700.53020 872124.46603 4730021.13499 11.80804 48.17152 542.86961 2.42065 2.62936 18.27895 1.22903 0.70628 4.50439 8 8 0 1.77 2013-Sep-20 09:11:28 4171700.38751 872124.54003 4730021.76693 11.80804 48.17153 543.25745 2.52228 3.14359 18.66680 1.33066 1.22052 4.89224 8 8 0 1.77 2013-Sep-20 09:11:28 4171700.48210 872124.29544 4730021.57373 11.80804 48.17152 543.14186 2.26351 2.98304 18.55120 1.07189 1.05997 4.77664 8 8 0 1.77 2013-Sep-20 09:11:28 4171700.38441 872124.59308 4730020.93156 11.80804 48.17152 542.64020 2.57484 2.58065 18.04954 1.38322 0.65757 4.27498 8 8 0 1.77 2013-Sep-20 09:11:28 4171699.43415 872124.94705 4730020.89155 11.80805 48.17153 542.03837 3.11577 3.19309 17.44771 1.92416 1.27001 3.67315 8 8 0 1.77 2013-Sep-20 09:11:28 4171698.99007 872124.84567 4730020.49424 11.80805 48.17153 541.43860 3.10742 3.26748 16.84794 1.91580 1.34441 3.07338 8 8 0 1.77 2013-Sep-20 09:11:28 4171698.59860 872124.96994 4730019.99661 11.80805 48.17153 540.82920 3.30916 3.20220 16.23854 2.11754 1.27912 2.46398 8 8 0 1.77 2013-Sep-20 09:11:28 4171697.72330 872125.14159 4730019.33605 11.80805 48.17153 539.78902 3.65630 3.37392 15.19836 2.46468 1.45084 1.42380 8 8 0 1.77 2013-Sep-20 09:11:28 4171697.44527 872125.13166 4730019.44510 11.80806 48.17153 539.68743 3.70347 3.65094 15.09677 2.51186 1.72787 1.32221 8 8 0 1.77 2013-Sep-20 09:11:28 4171697.46512 872125.25487 4730019.99327 11.80806 48.17153 540.12566 3.82001 3.98325 15.53501 2.62839 2.06017 1.76045 8 8 0 1.77 2013-Sep-20 09:11:28 4171697.81560 872125.36560 4730019.87160 11.80806 48.17153 540.27890 3.85668 3.62960 15.68824 2.66506 1.70652 1.91368 8 8 0 1.77 2013-Sep-20 09:11:28 4171696.76963 872125.46839 4730018.63366 11.80806 48.17153 538.68769 4.17133 3.55124 14.09703 2.97971 1.62816 0.32247 8 8 0 1.77 2013-Sep-20 09:11:28 4171696.98464 872125.66989 4730019.32905 11.80806 48.17153 539.37372 4.32457 3.82746 14.78306 3.13295 1.90438 1.00850 8 8 0 1.77 2013-Sep-20 09:11:28 4171697.18226 872125.51418 4730019.42882 11.80806 48.17153 539.55581 4.13171 3.77359 14.96515 2.94010 1.85051 1.19059 8 8 0 1.77 2013-Sep-20 09:11:29 4171696.78888 872125.47161 4730019.05047 11.80806 48.17153 539.01128 4.17055 3.81468 14.42062 2.97893 1.89160 0.64606 8 8 0 1.77 2013-Sep-20 09:11:29 4171696.21747 872125.23603 4730018.43986 11.80806 48.17153 538.15112 4.05688 3.86016 13.56046 2.86526 1.93709 -0.21410 8 8 0 1.77 2013-Sep-20 09:11:29 4171696.76275 872125.09584 4730018.79972 11.80806 48.17153 538.75610 3.80807 3.72381 14.16544 2.61646 1.80074 0.39088 8 8 0 1.77 2013-Sep-20 09:11:29 4171696.28458 872125.11895 4730018.54831 11.80806 48.17153 538.25977 3.92854 3.90139 13.66911 2.73693 1.97832 -0.10545 8 8 0 1.77 2013-Sep-20 09:11:29 4171695.51510 872125.05115 4730018.12311 11.80806 48.17154 537.43137 4.01964 4.18940 12.84071 2.82802 2.26632 -0.93385 8 8 0 1.77 2013-Sep-20 09:11:29 4171695.70442 872124.86531 4730017.79648 11.80806 48.17153 537.28621 3.79899 3.86183 12.69555 2.60738 1.93875 -1.07901 8 8 0 1.77 2013-Sep-20 09:11:29 4171697.02534 872124.68272 4730018.82343 11.80805 48.17153 538.88880 3.34996 3.61109 14.29814 2.15834 1.68802 0.52358 8 8 0 1.77 2013-Sep-20 09:11:29 4171697.56713 872124.37971 4730019.39175 11.80805 48.17153 539.62460 2.94249 3.64114 15.03394 1.75087 1.71807 1.25938 8 8 0 1.77 2013-Sep-20 09:11:29 4171698.12832 872123.99445 4730020.12268 11.80804 48.17153 540.48301 2.45055 3.77803 15.89236 1.25893 1.85495 2.11779 8 8 0 1.77 2013-Sep-20 09:11:29 4171698.23677 872123.78912 4730019.90767 11.80804 48.17153 540.36557 2.22737 3.58684 15.77492 1.03576 1.66376 2.00036 8 8 0 1.77 2013-Sep-20 09:11:29 4171698.12558 872123.42339 4730019.83102 11.80803 48.17153 540.18596 1.89214 3.67259 15.59531 0.70052 1.74952 1.82074 8 8 0 1.77 2013-Sep-20 09:11:29 4171697.66725 872123.35494 4730019.71138 11.80803 48.17153 539.78828 1.91892 3.93753 15.19763 0.72731 2.01446 1.42306 8 8 0 1.77 2013-Sep-20 09:11:29 4171697.75030 872123.45811 4730019.76202 11.80803 48.17153 539.89431 2.00291 3.89500 15.30365 0.81129 1.97192 1.52909 8 8 0 1.77 2013-Sep-20 09:11:29 4171697.37489 872123.34486 4730019.00344 11.80803 48.17153 539.06854 1.96888 3.68019 14.47789 0.77727 1.75711 0.70332 8 8 0 1.77 2013-Sep-20 09:11:29 4171697.56450 872122.96377 4730019.47053 11.80803 48.17153 539.48836 1.55705 3.91150 14.89771 0.36543 1.98843 1.12314 8 8 0 1.77 2013-Sep-20 09:11:29 4171697.72707 872122.88434 4730019.91797 11.80803 48.17153 539.91705 1.44604 4.10344 15.32639 0.25443 2.18036 1.55183 8 8 0 1.77 2013-Sep-20 09:11:29 4171698.24957 872122.89020 4730020.15076 11.80802 48.17153 540.43239 1.34485 3.87669 15.84174 0.15324 1.95362 2.06718 8 8 0 1.77 2013-Sep-20 09:11:29 4171698.09813 872122.65932 4730020.01098 11.80802 48.17153 540.19787 1.14985 3.92914 15.60721 -0.04177 2.00606 1.83265 8 8 0 1.77 2013-Sep-20 09:11:29 4171698.08833 872122.36723 4730019.75361 11.80802 48.17153 539.95984 0.86594 3.80918 15.36918 -0.32567 1.88611 1.59462 8 8 0 1.77 2013-Sep-20 09:11:29 4171698.52223 872122.17729 4730019.92730 11.80801 48.17153 540.34658 0.59124 3.63750 15.75593 -0.60038 1.71442 1.98136 8 8 0 1.77 2013-Sep-20 09:11:29 4171697.58285 872122.02297 4730019.52427 11.80801 48.17153 539.41199 0.63241 4.07741 14.82133 -0.55920 2.15434 1.04677 8 8 0 1.77 2013-Sep-20 09:11:29 4171697.63924 872121.73716 4730019.17442 11.80801 48.17153 539.14910 0.34110 3.84655 14.55844 -0.85051 1.92347 0.78388 8 8 0 1.77 2013-Sep-20 09:11:29 4171697.53461 872121.25933 4730018.70900 11.80800 48.17153 538.66879 -0.10520 3.68533 14.07814 -1.29681 1.76225 0.30357 8 8 0 1.77 2013-Sep-20 09:11:29 4171697.81185 872121.15231 4730018.70755 11.80800 48.17153 538.83408 -0.26668 3.49847 14.24343 -1.45830 1.57539 0.46886 8 8 0 1.77 2013-Sep-20 09:11:29 4171697.67496 872120.88634 4730018.42482 11.80800 48.17153 538.49775 -0.49902 3.45032 13.90709 -1.69064 1.52724 0.13253 8 8 0 1.77 2013-Sep-20 09:11:30 4171697.95798 872120.75057 4730018.08811 11.80800 48.17153 538.41308 -0.68983 3.04004 13.82242 -1.88145 1.11697 0.04786 8 8 0 1.77 2013-Sep-20 09:11:30 4171698.55581 872120.51012 4730017.92941 11.80799 48.17152 538.65226 -1.04753 2.53482 14.06161 -2.23915 0.61175 0.28704 8 8 0 1.77 2013-Sep-20 09:11:30 4171698.69187 872120.08389 4730017.76410 11.80799 48.17152 538.55974 -1.49258 2.39033 13.96908 -2.68420 0.46726 0.19452 8 8 0 1.77 2013-Sep-20 09:11:30 4171697.87169 872120.29824 4730017.38550 11.80799 48.17152 537.77148 -1.11493 2.70337 13.18082 -2.30654 0.78030 -0.59374 8 8 0 1.77 2013-Sep-20 09:11:30 4171697.64076 872120.39637 4730017.21192 11.80799 48.17152 537.50477 -0.97163 2.74108 12.91412 -2.16324 0.81801 -0.86045 8 8 0 1.77 2013-Sep-20 09:11:30 4171697.03278 872120.41985 4730016.60230 11.80799 48.17152 536.65684 -0.82423 2.77439 12.06618 -2.01585 0.85131 -1.70838 8 8 0 1.77 2013-Sep-20 09:11:30 4171696.94921 872120.34663 4730016.54590 11.80799 48.17152 536.55027 -0.87880 2.80890 11.95961 -2.07041 0.88583 -1.81495 8 8 0 1.77 2013-Sep-20 09:11:30 4171697.46511 872120.31730 4730016.54024 11.80799 48.17152 536.87882 -1.01307 2.43331 12.28817 -2.20469 0.51023 -1.48640 8 8 0 1.77 2013-Sep-20 09:11:30 4171696.87515 872120.54066 4730015.97554 11.80800 48.17152 536.10340 -0.67371 2.45295 11.51274 -1.86533 0.52988 -2.26182 8 8 0 1.77 2013-Sep-20 09:11:30 4171697.25109 872120.60664 4730016.19866 11.80800 48.17152 536.52407 -0.68606 2.31749 11.93341 -1.87768 0.39442 -1.84115 8 8 0 1.77 2013-Sep-20 09:11:30 4171697.34559 872120.99690 4730015.52703 11.80800 48.17151 536.13855 -0.32339 1.74114 11.54790 -1.51501 -0.18193 -2.22667 8 8 0 1.77 2013-Sep-20 09:11:30 4171697.94952 872121.11802 4730015.65610 11.80800 48.17151 536.64550 -0.32842 1.36827 12.05485 -1.52004 -0.55481 -1.71972 8 8 0 1.77 2013-Sep-20 09:11:30 4171697.68473 872121.41412 4730015.38473 11.80801 48.17151 536.31085 0.01560 1.33527 11.72020 -1.17602 -0.58781 -2.05437 8 8 0 1.77 2013-Sep-20 09:11:30 4171697.64638 872121.41032 4730014.74579 11.80801 48.17151 535.80919 0.01973 0.93771 11.21854 -1.17189 -0.98537 -2.55603 8 8 0 1.77 2013-Sep-20 09:11:30 4171697.52681 872121.37284 4730014.26884 11.80801 48.17150 535.37063 0.00750 0.71256 10.77998 -1.18412 -1.21052 -2.99459 8 8 0 1.77 2013-Sep-20 09:11:30 4171697.39677 872121.46519 4730014.27092 11.80801 48.17150 535.29989 0.12451 0.79471 10.70923 -1.06711 -1.12837 -3.06533 8 8 0 1.77 2013-Sep-20 09:11:30 4171696.91048 872121.42730 4730014.21534 11.80801 48.17151 534.93586 0.18693 1.11811 10.34521 -1.00469 -0.80497 -3.42936 8 8 0 1.77 2013-Sep-20 09:11:30 4171697.34401 872121.38274 4730014.32130 11.80801 48.17151 535.29174 0.05460 0.87936 10.70108 -1.13701 -1.04371 -3.07348 8 8 0 1.77 2013-Sep-20 09:11:30 4171697.62437 872121.42704 4730014.61503 11.80801 48.17151 535.69967 0.04060 0.86401 11.10902 -1.15102 -1.05907 -2.66555 8 8 0 1.77 2013-Sep-20 09:11:30 4171697.43824 872121.28637 4730014.15853 11.80800 48.17150 535.21881 -0.05902 0.71677 10.62815 -1.25063 -1.20630 -3.14641 8 8 0 1.77 2013-Sep-20 09:11:30 4171697.18703 872121.33246 4730013.94351 11.80801 48.17150 534.90090 0.03751 0.74958 10.31024 -1.15411 -1.17350 -3.46432 8 8 0 1.77 2013-Sep-20 09:11:30 4171697.04976 872121.55004 4730013.39163 11.80801 48.17150 534.42975 0.27858 0.44847 9.83909 -0.91304 -1.47461 -3.93547 8 8 0 1.77 2013-Sep-20 09:11:30 4171696.25762 872121.59170 4730012.69762 11.80801 48.17150 533.40119 0.48145 0.55705 8.81054 -0.71016 -1.36602 -4.96403 8 8 0 1.77 2013-Sep-20 09:11:30 4171696.09445 872121.84912 4730012.59140 11.80802 48.17150 533.25066 0.76682 0.56597 8.66000 -0.42480 -1.35710 -5.11456 8 8 0 1.77 2013-Sep-20 09:11:30 4171696.35468 872122.09316 4730012.61714 11.80802 48.17150 533.47301 0.95244 0.35612 8.88236 -0.23918 -1.56696 -4.89220 8 8 0 1.77 2013-Sep-20 09:11:31 4171695.57440 872122.03615 4730011.71188 11.80802 48.17150 532.28133 1.05630 0.33020 7.69067 -0.13531 -1.59287 -6.08389 8 8 0 1.77 2013-Sep-20 09:11:31 4171695.30311 872122.12372 4730011.76943 11.80802 48.17150 532.15907 1.19754 0.55311 7.56841 0.00592 -1.36997 -6.20615 8 8 0 1.77 2013-Sep-20 09:11:31 4171695.80571 872122.02064 4730012.13599 11.80802 48.17150 532.74624 0.99379 0.44670 8.15558 -0.19783 -1.47637 -5.61898 8 8 0 1.77 2013-Sep-20 09:11:31 4171695.80804 872122.12795 4730012.24496 11.80802 48.17150 532.84360 1.09835 0.50131 8.25294 -0.09326 -1.42176 -5.52162 8 8 0 1.77 2013-Sep-20 09:11:31 4171695.58737 872122.15744 4730012.18541 11.80802 48.17150 532.65920 1.17238 0.61806 8.06854 -0.01924 -1.30501 -5.70602 8 8 0 1.77 2013-Sep-20 09:11:31 4171696.08043 872122.35230 4730012.01069 11.80802 48.17150 532.87746 1.26221 0.11219 8.28681 0.07060 -1.81089 -5.48776 8 8 0 1.77 2013-Sep-20 09:11:31 4171696.60004 872122.11846 4730012.39081 11.80802 48.17150 533.46799 0.92699 0.02236 8.87733 -0.26463 -1.90071 -4.89723 8 8 0 1.77 2013-Sep-20 09:11:31 4171697.05806 872122.17982 4730012.93349 11.80802 48.17150 534.17973 0.89332 0.04085 9.58908 -0.29829 -1.88222 -4.18549 8 8 0 1.77 2013-Sep-20 09:11:31 4171696.98371 872122.24762 4730012.53119 11.80802 48.17150 533.84068 0.97491 -0.18355 9.25002 -0.21671 -2.10662 -4.52454 8 8 0 1.77 2013-Sep-20 09:11:31 4171697.39306 872122.65016 4730012.35033 11.80802 48.17149 534.02806 1.28516 -0.66412 9.43741 0.09355 -2.58719 -4.33715 8 8 0 1.77 2013-Sep-20 09:11:31 4171697.07385 872122.65968 4730012.33553 11.80802 48.17149 533.80995 1.35980 -0.44261 9.21930 0.16819 -2.36569 -4.55526 8 8 0 1.77 2013-Sep-20 09:11:31 4171696.89636 872122.75231 4730012.64118 11.80803 48.17150 533.93449 1.48680 -0.12344 9.34383 0.29518 -2.04652 -4.43073 8 8 0 1.77 2013-Sep-20 09:11:31 4171696.90097 872122.83998 4730012.49885 11.80803 48.17150 533.84341 1.57167 -0.23510 9.25275 0.38005 -2.15817 -4.52181 8 8 0 1.77 2013-Sep-20 09:11:31 4171696.56988 872122.77570 4730012.12547 11.80803 48.17150 533.34028 1.57650 -0.23282 8.74962 0.38488 -2.15589 -5.02494 8 8 0 1.77 2013-Sep-20 09:11:31 4171696.90638 872123.16968 4730012.90867 11.80803 48.17150 534.19731 1.89328 -0.01601 9.60665 0.70167 -1.93908 -4.16791 8 8 0 1.77 2013-Sep-20 09:11:31 4171696.93262 872123.23397 4730013.37515 11.80803 48.17150 534.57081 1.95084 0.26615 9.98015 0.75922 -1.65692 -3.79441 8 8 0 1.77 2013-Sep-20 09:11:31 4171696.44547 872123.11676 4730013.84584 11.80803 48.17151 534.58753 1.93580 0.95325 9.99688 0.74418 -0.96983 -3.77768 8 8 0 1.77 2013-Sep-20 09:11:31 4171696.91712 872123.00276 4730014.14716 11.80803 48.17151 535.10440 1.72770 0.82757 10.51374 0.53608 -1.09551 -3.26082 8 8 0 1.77 2013-Sep-20 09:11:31 4171696.90946 872122.96311 4730014.27723 11.80803 48.17151 535.19091 1.69045 0.92595 10.60025 0.49884 -0.99713 -3.17431 8 8 0 1.77 2013-Sep-20 09:11:31 4171696.85995 872123.14457 4730014.79767 11.80803 48.17151 535.57116 1.87821 1.28147 10.98050 0.68659 -0.64161 -2.79406 8 8 0 1.77 2013-Sep-20 09:11:31 4171697.06111 872122.99213 4730014.87195 11.80803 48.17151 535.73701 1.68782 1.20753 11.14636 0.49620 -0.71555 -2.62821 8 8 0 1.77 2013-Sep-20 09:11:31 4171696.82169 872122.98291 4730014.50520 11.80803 48.17151 535.30618 1.72779 1.13897 10.71552 0.53618 -0.78410 -3.05904 8 8 0 1.77 2013-Sep-20 09:11:31 4171696.27066 872123.20205 4730014.31034 11.80803 48.17151 534.83118 2.05506 1.37752 10.24053 0.86344 -0.54555 -3.53403 8 8 0 1.77 2013-Sep-20 09:11:31 4171696.66869 872123.31062 4730014.51046 11.80803 48.17151 535.25494 2.07988 1.20411 10.66429 0.88827 -0.71896 -3.11027 8 8 0 1.77 2013-Sep-20 09:11:31 4171696.89869 872123.13147 4730014.82167 11.80803 48.17151 535.61254 1.85745 1.27122 11.02188 0.66583 -0.65186 -2.75268 8 8 0 1.77 2013-Sep-20 09:11:32 4171696.32813 872123.31435 4730014.33550 11.80803 48.17151 534.90277 2.15322 1.33526 10.31211 0.96160 -0.58782 -3.46245 8 8 0 1.77 2013-Sep-20 09:11:32 4171696.18633 872123.20310 4730014.74184 11.80803 48.17151 535.09780 2.07334 1.72663 10.50715 0.88173 -0.19644 -3.26742 8 8 0 1.77 2013-Sep-20 09:11:32 4171696.27298 872123.10448 4730014.63518 11.80803 48.17151 535.06143 1.95908 1.60734 10.47078 0.76746 -0.31573 -3.30379 8 8 0 1.77 2013-Sep-20 09:11:32 4171696.10210 872123.03634 4730014.64304 11.80803 48.17151 534.94644 1.92734 1.74760 10.35579 0.73573 -0.17547 -3.41877 8 8 0 1.77 2013-Sep-20 09:11:32 4171696.45372 872123.10537 4730014.93485 11.80803 48.17151 535.40283 1.92296 1.67523 10.81218 0.73135 -0.24785 -2.96238 8 8 0 1.77 2013-Sep-20 09:11:32 4171695.86908 872123.18824 4730014.32371 11.80803 48.17151 534.57711 2.12371 1.68144 9.98646 0.93209 -0.24163 -3.78811 8 8 0 1.77 2013-Sep-20 09:11:32 4171696.20607 872123.06401 4730014.80380 11.80803 48.17151 535.13787 1.93315 1.77477 10.54722 0.74153 -0.14831 -3.22735 8 8 0 1.77 2013-Sep-20 09:11:32 4171696.15347 872123.13235 4730015.53661 11.80803 48.17152 535.65892 2.01081 2.29142 11.06826 0.81920 0.36835 -2.70630 8 8 0 1.77 2013-Sep-20 09:11:32 4171696.10099 872122.91880 4730015.59920 11.80803 48.17152 535.64215 1.81252 2.40401 11.05150 0.62090 0.48093 -2.72306 8 8 0 1.77 2013-Sep-20 09:11:32 4171696.24578 872122.51715 4730016.02501 11.80802 48.17152 535.99915 1.38974 2.64362 11.40849 0.19812 0.72055 -2.36607 8 8 0 1.77 2013-Sep-20 09:11:32 4171696.72054 872122.33254 4730017.07891 11.80802 48.17152 537.06919 1.11189 3.02834 12.47853 -0.07973 1.10526 -1.29603 8 8 0 1.77 2013-Sep-20 09:11:32 4171697.13285 872122.48619 4730018.29592 11.80802 48.17153 538.26615 1.17791 3.51581 13.67550 -0.01371 1.59273 -0.09907 8 8 0 1.77 2013-Sep-20 09:11:32 4171697.43301 872122.61570 4730018.73323 11.80802 48.17153 538.80562 1.24326 3.56877 14.21497 0.05164 1.64570 0.44040 8 8 0 1.77 2013-Sep-20 09:11:32 4171697.83279 872122.26746 4730019.24052 11.80802 48.17153 539.39708 0.82058 3.66860 14.80642 -0.37104 1.74552 1.03186 8 8 0 1.77 2013-Sep-20 09:11:32 4171698.11794 872122.37574 4730020.06919 11.80802 48.17153 540.21547 0.86822 3.99675 15.62482 -0.32340 2.07367 1.85026 8 8 0 1.77 2013-Sep-20 09:11:32 4171698.54136 872122.49566 4730021.03681 11.80802 48.17154 541.22926 0.89895 4.31494 16.63861 -0.29266 2.39186 2.86404 8 8 0 1.77 2013-Sep-20 09:11:32 4171699.86273 872122.11376 4730022.35947 11.80801 48.17154 543.02530 0.25474 4.29148 18.43464 -0.93688 2.36841 4.66008 8 8 0 1.77 2013-Sep-20 09:11:32 4171699.80268 872122.20783 4730021.88027 11.80801 48.17153 542.64186 0.35911 4.00136 18.05121 -0.83251 2.07828 4.27664 8 8 0 1.77 2013-Sep-20 09:11:32 4171700.62569 872122.20454 4730022.52266 11.80801 48.17153 543.65734 0.18747 3.82999 19.06668 -1.00415 1.90691 5.29212 8 8 0 1.77 2013-Sep-20 09:11:32 4171701.64625 872122.16838 4730023.30237 11.80800 48.17153 544.89961 -0.05677 3.61112 20.30895 -1.24838 1.68804 6.53439 8 8 0 1.77 2013-Sep-20 09:11:32 4171700.59443 872122.18177 4730022.93324 11.80801 48.17153 543.93976 0.17158 4.13008 19.34910 -1.02004 2.20700 5.57454 8 8 0 1.77 2013-Sep-20 09:11:32 4171700.74012 872122.23819 4730022.31783 11.80801 48.17153 543.58400 0.19700 3.60479 18.99334 -0.99462 1.68171 5.21878 8 8 0 1.77 2013-Sep-20 09:11:32 4171700.60245 872122.27861 4730021.57296 11.80801 48.17153 542.94461 0.26473 3.20228 18.35395 -0.92688 1.27921 4.57939 8 8 0 1.77 2013-Sep-20 09:11:32 4171700.09069 872122.54839 4730020.67258 11.80801 48.17152 541.97645 0.63353 2.93395 17.38579 -0.55809 1.01087 3.61123 8 8 0 1.77 2013-Sep-20 09:11:32 4171700.17827 872122.49543 4730021.07262 11.80801 48.17153 542.32447 0.56377 3.14493 17.73382 -0.62785 1.22186 3.95925 8 8 0 1.77 2013-Sep-20 09:11:33 4171700.52122 872122.39584 4730021.11704 11.80801 48.17152 542.56786 0.39610 2.93960 17.97721 -0.79551 1.01652 4.20264 8 8 0 1.77 2013-Sep-20 09:11:33 4171700.50160 872122.53942 4730021.07448 11.80801 48.17152 542.54293 0.54066 2.90364 17.95227 -0.65095 0.98056 4.17771 8 8 0 1.77 2013-Sep-20 09:11:33 4171699.96097 872122.36479 4730020.57774 11.80801 48.17152 541.79604 0.48036 2.99331 17.20539 -0.71126 1.07023 3.43082 8 8 0 1.77 2013-Sep-20 09:11:33 4171699.87708 872122.52914 4730020.89270 11.80801 48.17153 541.99839 0.65840 3.23948 17.40774 -0.53322 1.31640 3.63318 8 8 0 1.77 2013-Sep-20 09:11:33 4171700.39593 872122.36514 4730020.89595 11.80801 48.17152 542.31713 0.39169 2.88823 17.72648 -0.79993 0.96515 3.95192 8 8 0 1.77 2013-Sep-20 09:11:33 4171700.84997 872122.28805 4730021.13728 11.80801 48.17152 542.78284 0.22332 2.72975 18.19218 -0.96829 0.80668 4.41762 8 8 0 1.77 2013-Sep-20 09:11:33 4171700.80172 872122.66262 4730021.11873 11.80801 48.17152 542.78863 0.59983 2.69546 18.19798 -0.59178 0.77238 4.42341 8 8 0 1.77 2013-Sep-20 09:11:33 4171701.20726 872122.54494 4730020.99090 11.80801 48.17152 542.94205 0.40166 2.33236 18.35139 -0.78996 0.40929 4.57683 8 8 0 1.77 2013-Sep-20 09:11:33 4171701.79912 872122.61896 4730021.71637 11.80801 48.17152 543.87909 0.35300 2.37321 19.28844 -0.83862 0.45013 5.51387 8 8 0 1.77 2013-Sep-20 09:11:33 4171701.92734 872122.66132 4730021.76378 11.80801 48.17152 544.00391 0.36823 2.30484 19.41325 -0.82339 0.38176 5.63869 8 8 0 1.77 2013-Sep-20 09:11:33 4171701.71728 872122.99727 4730021.38595 11.80802 48.17152 543.63109 0.74005 2.15486 19.04043 -0.45157 0.23178 5.26587 8 8 0 1.77 2013-Sep-20 09:11:33 4171701.13521 872123.10929 4730020.58580 11.80802 48.17152 542.67018 0.96881 2.02870 18.07952 -0.22281 0.10562 4.30496 8 8 0 1.77 2013-Sep-20 09:11:33 4171701.32333 872123.10249 4730020.89961 11.80802 48.17152 543.02589 0.92366 2.10181 18.43523 -0.26796 0.17873 4.66067 8 8 0 1.77 2013-Sep-20 09:11:33 4171702.64359 872122.60096 4730021.57231 11.80801 48.17151 544.32055 0.16257 1.66394 19.72990 -1.02904 -0.25914 5.95534 8 8 0 1.77 2013-Sep-20 09:11:33 4171703.18094 872122.57524 4730021.77828 11.80801 48.17151 544.82130 0.02744 1.41329 20.23065 -1.16418 -0.50979 6.45608 8 8 0 1.77 2013-Sep-20 09:11:33 4171702.50049 872122.75788 4730020.47607 11.80801 48.17151 543.43170 0.34545 1.01330 18.84105 -0.84616 -0.90978 5.06648 8 8 0 1.77 2013-Sep-20 09:11:33 4171701.93086 872122.77874 4730020.11851 11.80801 48.17151 542.79626 0.48244 1.18713 18.20561 -0.70918 -0.73594 4.43104 8 8 0 1.77 2013-Sep-20 09:11:33 4171702.33724 872122.68858 4730020.69325 11.80801 48.17151 543.47750 0.31103 1.28778 18.88685 -0.88059 -0.63530 5.11229 8 8 0 1.77 2013-Sep-20 09:11:33 4171702.47075 872122.84113 4730019.74234 11.80801 48.17150 542.87691 0.43303 0.53297 18.28625 -0.75859 -1.39010 4.51169 8 8 0 1.77 2013-Sep-20 09:11:33 4171702.13286 872123.00777 4730018.89500 11.80801 48.17150 542.04769 0.66528 0.18891 17.45704 -0.52633 -1.73416 3.68247 8 8 0 1.77 2013-Sep-20 09:11:33 4171702.76657 872123.10940 4730019.35636 11.80801 48.17150 542.81902 0.63509 0.01889 18.22837 -0.55653 -1.90419 4.45380 8 8 0 1.77 2013-Sep-20 09:11:33 4171702.42018 872123.04641 4730019.25701 11.80801 48.17150 542.51027 0.64431 0.21489 17.91962 -0.54731 -1.70819 4.14505 8 8 0 1.77 2013-Sep-20 09:11:33 4171701.84028 872123.36614 4730018.86866 11.80802 48.17150 541.88597 1.07595 0.33011 17.29532 -0.11567 -1.59297 3.52075 8 8 0 1.77 2013-Sep-20 09:11:33 4171701.14808 872123.15131 4730018.74197 11.80802 48.17150 541.31039 1.00731 0.78325 16.71974 -0.18431 -1.13982 2.94517 8 8 0 1.77 2013-Sep-20 09:11:33 4171700.53555 872123.31218 4730017.57763 11.80802 48.17150 540.06489 1.29012 0.42898 15.47424 0.09850 -1.49410 1.69967 8 8 0 1.77 2013-Sep-20 09:11:34 4171700.42117 872123.25576 4730017.54686 11.80802 48.17150 539.95960 1.25829 0.50049 15.36895 0.06668 -1.42258 1.59438 8 8 0 1.77 2013-Sep-20 09:11:34 4171700.20457 872123.16736 4730017.03642 11.80802 48.17150 539.42579 1.21609 0.33154 14.83514 0.02448 -1.59154 1.06057 8 8 0 1.77 2013-Sep-20 09:11:34 4171699.48898 872123.38902 4730016.53228 11.80803 48.17150 538.61325 1.57949 0.48346 14.02260 0.38788 -1.43962 0.24803 8 8 0 1.77 2013-Sep-20 09:11:34 4171699.10423 872123.31378 4730016.40570 11.80803 48.17150 538.25750 1.58458 0.69115 13.66685 0.39297 -1.23193 -0.10772 8 8 0 1.77 2013-Sep-20 09:11:34 4171698.53020 872123.35368 4730015.91311 11.80803 48.17150 537.52118 1.74110 0.77523 12.93052 0.54948 -1.14785 -0.84404 8 8 0 1.77 2013-Sep-20 09:11:34 4171698.50153 872123.20864 4730015.82793 11.80803 48.17150 537.41920 1.60500 0.76146 12.82854 0.41338 -1.16162 -0.94602 8 8 0 1.77 2013-Sep-20 09:11:34 4171698.36186 872122.83570 4730016.44436 11.80802 48.17151 537.73645 1.26853 1.33130 13.14580 0.07692 -0.59178 -0.62876 8 8 0 1.77 2013-Sep-20 09:11:34 4171697.86285 872123.10170 4730016.43915 11.80803 48.17151 537.44312 1.63102 1.65122 12.85246 0.43940 -0.27185 -0.92210 8 8 0 1.77 2013-Sep-20 09:11:34 4171697.51138 872123.13143 4730016.77232 11.80803 48.17152 537.46601 1.73204 2.12524 12.87535 0.54042 0.20216 -0.89921 8 8 0 1.77 2013-Sep-20 09:11:34 4171696.91445 872123.48157 4730016.67884 11.80804 48.17152 537.05446 2.19692 2.44489 12.46381 1.00530 0.52182 -1.31076 8 8 0 1.77 2013-Sep-20 09:11:34 4171697.26836 872123.33992 4730016.78699 11.80803 48.17152 537.34675 1.98584 2.28048 12.75610 0.79423 0.35741 -1.01847 8 8 0 1.77 2013-Sep-20 09:11:34 4171697.49048 872123.06464 4730017.13771 11.80803 48.17152 537.71552 1.67093 2.39435 13.12486 0.47932 0.47127 -0.64970 8 8 0 1.77 2013-Sep-20 09:11:34 4171697.48935 872122.81882 4730017.21277 11.80802 48.17152 537.73716 1.43055 2.48271 13.14650 0.23894 0.55963 -0.62806 8 8 0 1.77 2013-Sep-20 09:11:34 4171697.29650 872122.92735 4730017.19523 11.80803 48.17152 537.61301 1.57625 2.59512 13.02235 0.38463 0.67205 -0.75221 8 8 0 1.77 2013-Sep-20 09:11:34 4171696.80407 872122.82700 4730016.90491 11.80803 48.17152 537.06153 1.57879 2.77598 12.47088 0.38718 0.85290 -1.30368 8 8 0 1.77 2013-Sep-20 09:11:34 4171696.78524 872122.99113 4730016.45835 11.80803 48.17152 536.73889 1.74330 2.46688 12.14823 0.55168 0.54380 -1.62633 8 8 0 1.77 2013-Sep-20 09:11:34 4171697.30776 872123.19322 4730017.55162 11.80803 48.17152 537.92221 1.83418 2.78404 13.33155 0.64257 0.86097 -0.44301 8 8 0 1.77 2013-Sep-20 09:11:34 4171697.26132 872123.54045 4730017.62032 11.80803 48.17152 537.99047 2.18358 2.81079 13.39981 0.99196 0.88772 -0.37475 8 8 0 1.77 2013-Sep-20 09:11:34 4171696.82780 872124.11133 4730017.34288 11.80804 48.17152 537.57865 2.83109 2.85492 12.98799 1.63947 0.93184 -0.78657 8 8 0 1.77 2013-Sep-20 09:11:34 4171697.46836 872124.32511 4730018.39105 11.80804 48.17153 538.80701 2.90926 3.05414 14.21635 1.71765 1.13106 0.44179 8 8 0 1.77 2013-Sep-20 09:11:34 4171697.55276 872124.50549 4730018.71691 11.80805 48.17153 539.12953 3.06855 3.18239 14.53887 1.87694 1.25931 0.76431 8 8 0 1.77 2013-Sep-20 09:11:34 4171697.55168 872124.51393 4730018.39441 11.80805 48.17152 538.88967 3.07703 2.96681 14.29902 1.88542 1.04373 0.52445 8 8 0 1.77 2013-Sep-20 09:11:34 4171697.36481 872124.89308 4730018.29105 11.80805 48.17152 538.74240 3.48640 2.97637 14.15175 2.29478 1.05329 0.37719 8 8 0 1.77 2013-Sep-20 09:11:34 4171697.26694 872125.02011 4730018.57381 11.80805 48.17153 538.90656 3.63077 3.21696 14.31590 2.43915 1.29388 0.54134 8 8 0 1.77 2013-Sep-20 09:11:34 4171697.67706 872125.05021 4730019.04317 11.80805 48.17153 539.52812 3.57632 3.22625 14.93747 2.38470 1.30317 1.16291 8 8 0 1.77 2013-Sep-20 09:11:35 4171698.65767 872124.80853 4730019.75907 11.80805 48.17152 540.66873 3.13908 3.02531 16.07807 1.94747 1.10223 2.30351 8 8 0 1.77 2013-Sep-20 09:11:35 4171698.51682 872124.76603 4730019.92156 11.80805 48.17153 540.69206 3.12630 3.24288 16.10141 1.93468 1.31981 2.32684 8 8 0 1.77 2013-Sep-20 09:11:35 4171697.78674 872124.63825 4730019.06154 11.80805 48.17153 539.55719 3.15063 3.22132 14.96653 1.95901 1.29824 1.19197 8 8 0 1.77 2013-Sep-20 09:11:35 4171698.29502 872124.37519 4730019.82941 11.80804 48.17153 540.42526 2.78912 3.40280 15.83461 1.59751 1.47972 2.06004 8 8 0 1.77 2013-Sep-20 09:11:35 4171698.28081 872124.54475 4730020.08474 11.80805 48.17153 540.62939 2.95800 3.55760 16.03873 1.76638 1.63452 2.26417 8 8 0 1.77 2013-Sep-20 09:11:35 4171698.43010 872124.68264 4730019.54760 11.80805 48.17153 540.34542 3.06242 3.06946 15.75476 1.87080 1.14638 1.98020 8 8 0 1.77 2013-Sep-20 09:11:35 4171698.61533 872124.57665 4730018.99425 11.80804 48.17152 540.03954 2.92077 2.58148 15.44889 1.72915 0.65841 1.67433 8 8 0 1.77 2013-Sep-20 09:11:35 4171697.52985 872124.81035 4730017.96036 11.80805 48.17152 538.59245 3.37165 2.64807 14.00179 2.18004 0.72499 0.22723 8 8 0 1.77 2013-Sep-20 09:11:35 4171697.44892 872124.28273 4730018.19984 11.80804 48.17152 538.64606 2.87175 2.94726 14.05540 1.68014 1.02419 0.28084 8 8 0 1.77 2013-Sep-20 09:11:35 4171696.84425 872124.24928 4730018.11610 11.80805 48.17153 538.18437 2.96275 3.33755 13.59371 1.77114 1.41447 -0.18085 8 8 0 1.77 2013-Sep-20 09:11:35 4171696.05476 872124.25250 4730017.70527 11.80805 48.17153 537.36331 3.12746 3.63891 12.77265 1.93584 1.71583 -1.00191 8 8 0 1.77 2013-Sep-20 09:11:35 4171696.41720 872123.98307 4730017.99384 11.80804 48.17153 537.77816 2.78956 3.60808 13.18751 1.59794 1.68501 -0.58706 8 8 0 1.77 2013-Sep-20 09:11:35 4171696.64325 872124.03123 4730018.07510 11.80804 48.17153 537.99286 2.79044 3.49006 13.40220 1.59882 1.56698 -0.37236 8 8 0 1.77 2013-Sep-20 09:11:35 4171696.50813 872123.77058 4730017.61193 11.80804 48.17153 537.52395 2.56296 3.31946 12.93330 1.37135 1.39639 -0.84127 8 8 0 1.77 2013-Sep-20 09:11:35 4171696.75877 872123.80649 4730017.11835 11.80804 48.17152 537.32468 2.54682 2.80200 12.73402 1.35521 0.87893 -1.04054 8 8 0 1.77 2013-Sep-20 09:11:35 4171696.93473 872123.61640 4730017.06774 11.80804 48.17152 537.37588 2.32474 2.66890 12.78523 1.13313 0.74583 -0.98933 8 8 0 1.77 2013-Sep-20 09:11:35 4171697.01026 872123.53990 4730016.75921 11.80804 48.17152 537.18485 2.23441 2.41972 12.59420 1.04280 0.49664 -1.18037 8 8 0 1.77 2013-Sep-20 09:11:35 4171696.75450 872123.48011 4730017.12431 11.80804 48.17152 537.28179 2.22822 2.85887 12.69113 1.03660 0.93579 -1.08343 8 8 0 1.77 2013-Sep-20 09:11:35 4171696.56156 872123.46089 4730017.25945 11.80804 48.17153 537.25391 2.24889 3.09265 12.66326 1.05728 1.16957 -1.11130 8 8 0 1.77 2013-Sep-20 09:11:35 4171696.60040 872123.20806 4730017.40097 11.80803 48.17153 537.35022 1.99347 3.19725 12.75956 0.80185 1.27418 -1.01500 8 8 0 1.77 2013-Sep-20 09:11:35 4171697.69286 872123.10255 4730017.47997 11.80803 48.17152 538.10783 1.66663 2.46920 13.51717 0.47501 0.54613 -0.25739 8 8 0 1.77 2013-Sep-20 09:11:35 4171698.61452 872123.20546 4730017.82572 11.80803 48.17152 538.98116 1.57876 2.01186 14.39051 0.38714 0.08878 0.61594 8 8 0 1.77 2013-Sep-20 09:11:35 4171698.81027 872122.96455 4730017.84947 11.80802 48.17151 539.09376 1.30289 1.92165 14.50311 0.11127 -0.00142 0.72854 8 8 0 1.77 2013-Sep-20 09:11:35 4171698.94150 872122.88799 4730017.67845 11.80802 48.17151 539.04155 1.20110 1.72356 14.45089 0.00949 -0.19951 0.67633 8 8 0 1.77 2013-Sep-20 09:11:35 4171698.78644 872122.53563 4730017.48346 11.80802 48.17151 538.74695 0.88792 1.76035 14.15629 -0.30369 -0.16273 0.38173 8 8 0 1.77 2013-Sep-20 09:11:36 4171698.71258 872122.54555 4730017.47869 11.80802 48.17151 538.69653 0.91275 1.80952 14.10587 -0.27887 -0.11355 0.33131 8 8 0 1.77 2013-Sep-20 09:11:36 4171692.08780 872117.62066 4730009.36614 11.80797 48.17152 527.65481 -2.55228 1.98215 3.06416 -3.74389 0.05907 -10.71041 8 8 0 1.77 2013-Sep-20 09:11:36 4171699.42295 872122.68150 4730017.67368 11.80802 48.17151 539.32410 0.90046 1.40071 14.73344 -0.29116 -0.52237 0.95888 8 8 0 1.77 2013-Sep-20 09:11:36 4171699.34739 872122.74404 4730017.51190 11.80802 48.17151 539.16276 0.97714 1.33839 14.57211 -0.21448 -0.58469 0.79754 8 8 0 1.77 2013-Sep-20 09:11:36 4171699.57788 872122.43968 4730017.96182 11.80801 48.17151 539.60694 0.63205 1.51674 15.01629 -0.55957 -0.40634 1.24173 8 8 0 1.77 2013-Sep-20 09:11:36 4171699.82119 872122.31826 4730018.04019 11.80801 48.17151 539.80760 0.46341 1.41005 15.21694 -0.72820 -0.51302 1.44238 8 8 0 1.77 2013-Sep-20 09:11:36 4171699.93691 872122.20019 4730019.23629 11.80801 48.17152 540.75829 0.32416 2.14134 16.16764 -0.86746 0.21826 2.39307 8 8 0 1.77 2013-Sep-20 09:11:36 4171700.21565 872122.29495 4730019.22303 11.80801 48.17151 540.94331 0.35987 1.91474 16.35265 -0.83175 -0.00833 2.57809 8 8 0 1.77 2013-Sep-20 09:11:36 4171699.68289 872122.42175 4730019.28578 11.80801 48.17152 540.65959 0.59301 2.32583 16.06893 -0.59860 0.40276 2.29437 8 8 0 1.77 2013-Sep-20 09:11:36 4171699.17586 872122.30296 4730018.98768 11.80801 48.17152 540.09026 0.58049 2.51496 15.49961 -0.61113 0.59189 1.72504 8 8 0 1.77 2013-Sep-20 09:11:36 4171699.55863 872122.33378 4730019.24155 11.80801 48.17152 540.53350 0.53234 2.40038 15.94285 -0.65928 0.47731 2.16828 8 8 0 1.77 2013-Sep-20 09:11:36 4171699.30149 872122.11525 4730018.45649 11.80801 48.17152 539.75084 0.37105 2.09770 15.16018 -0.82057 0.17462 1.38562 8 8 0 1.77 2013-Sep-20 09:11:36 4171699.50347 872121.95051 4730018.67473 11.80801 48.17152 540.02283 0.16846 2.12105 15.43217 -1.02315 0.19797 1.65761 8 8 0 1.77 2013-Sep-20 09:11:36 4171699.93110 872122.07347 4730018.97306 11.80801 48.17152 540.54106 0.20131 1.98935 15.95041 -0.99031 0.06627 2.17584 8 8 0 1.77 2013-Sep-20 09:11:36 4171699.81615 872122.02527 4730018.75454 11.80801 48.17152 540.29662 0.17765 1.93481 15.70597 -1.01396 0.01173 1.93141 8 8 0 1.77 2013-Sep-20 09:11:36 4171700.26621 872121.83560 4730018.56130 11.80800 48.17151 540.42053 -0.10010 1.50659 15.82988 -1.29172 -0.41648 2.05531 8 8 0 1.77 2013-Sep-20 09:11:36 4171699.54501 872122.00064 4730018.16401 11.80801 48.17151 539.67623 0.20902 1.74250 15.08557 -0.98259 -0.18058 1.31101 8 8 0 1.77 2013-Sep-20 09:11:36 4171699.70760 872122.10430 4730018.18608 11.80801 48.17151 539.81296 0.27722 1.62283 15.22230 -0.91439 -0.30025 1.44774 8 8 0 1.77 2013-Sep-20 09:11:36 4171700.17929 872121.62729 4730018.70168 11.80800 48.17151 540.43997 -0.28622 1.69537 15.84931 -1.47783 -0.22770 2.07475 8 8 0 1.77 2013-Sep-20 09:11:36 4171699.92479 872121.77983 4730017.85113 11.80800 48.17151 539.66087 -0.08482 1.29051 15.07022 -1.27644 -0.63256 1.29565 8 8 0 1.77 2013-Sep-20 09:11:36 4171699.19856 872121.68303 4730017.00367 11.80801 48.17151 538.54211 -0.03096 1.26979 13.95145 -1.22258 -0.65329 0.17689 8 8 0 1.77 2013-Sep-20 09:11:36 4171699.05166 872121.68371 4730017.12761 11.80801 48.17151 538.53865 -0.00024 1.45949 13.94800 -1.19186 -0.46359 0.17343 8 8 0 1.77 2013-Sep-20 09:11:36 4171698.83178 872121.65585 4730017.32318 11.80801 48.17151 538.53704 0.01749 1.75454 13.94639 -1.17413 -0.16854 0.17183 8 8 0 1.77 2013-Sep-20 09:11:36 4171697.67544 872121.59601 4730016.92800 11.80801 48.17152 537.47957 0.19554 2.34352 12.88891 -0.99608 0.42044 -0.88565 8 8 0 1.77 2013-Sep-20 09:11:36 4171696.75381 872121.63033 4730015.94438 11.80801 48.17152 536.14968 0.41772 2.35452 11.55902 -0.77389 0.43145 -2.21554 8 8 0 1.77 2013-Sep-20 09:11:37 4171696.68678 872121.53815 4730015.90502 11.80801 48.17152 536.06401 0.34121 2.39122 11.47336 -0.85041 0.46814 -2.30121 8 8 0 1.77 2013-Sep-20 09:11:37 4171696.78946 872121.23712 4730015.64127 11.80801 48.17152 535.89343 0.02555 2.18634 11.30278 -1.16607 0.26326 -2.47179 8 8 0 1.77 2013-Sep-20 09:11:37 4171696.27050 872121.29362 4730015.79515 11.80801 48.17152 535.67703 0.18705 2.65885 11.08638 -1.00457 0.73578 -2.68819 8 8 0 1.77 2013-Sep-20 09:11:37 4171696.15309 872121.44701 4730015.43961 11.80801 48.17152 535.35639 0.36122 2.48399 10.76574 -0.83040 0.56092 -3.00883 8 8 0 1.77 2013-Sep-20 09:11:37 4171696.02501 872121.40946 4730015.47945 11.80801 48.17152 535.29734 0.35067 2.60971 10.70669 -0.84095 0.68664 -3.06788 8 8 0 1.77 2013-Sep-20 09:11:37 4171696.34332 872121.48162 4730015.55857 11.80801 48.17152 535.57393 0.35616 2.41930 10.98328 -0.83545 0.49622 -2.79128 8 8 0 1.77 2013-Sep-20 09:11:37 4171697.09687 872121.37504 4730015.67203 11.80801 48.17152 536.13585 0.09764 1.96160 11.54519 -1.09397 0.03852 -2.22937 8 8 0 1.77 2013-Sep-20 09:11:37 4171697.42386 872121.49349 4730015.68264 11.80801 48.17151 536.37337 0.14667 1.71211 11.78272 -1.04495 -0.21096 -1.99185 8 8 0 1.77 2013-Sep-20 09:11:37 4171697.25907 872121.47626 4730015.53919 11.80801 48.17151 536.15656 0.16353 1.73926 11.56590 -1.02809 -0.18381 -2.20866 8 8 0 1.77 2013-Sep-20 09:11:37 4171697.41257 872121.73226 4730016.38176 11.80801 48.17152 536.91953 0.38269 2.15019 12.32888 -0.80892 0.22711 -1.44569 8 8 0 1.77 2013-Sep-20 09:11:37 4171696.66260 872121.97635 4730016.02795 11.80802 48.17152 536.19963 0.77509 2.42402 11.60897 -0.41653 0.50094 -2.16559 8 8 0 1.77 2013-Sep-20 09:11:37 4171696.52940 872122.07884 4730015.80709 11.80802 48.17152 535.96209 0.90267 2.35825 11.37144 -0.28895 0.43518 -2.40313 8 8 0 1.77 2013-Sep-20 09:11:37 4171696.42724 872122.07034 4730015.85008 11.80802 48.17152 535.92628 0.91525 2.46273 11.33562 -0.27636 0.53966 -2.43894 8 8 0 1.77 2013-Sep-20 09:11:37 4171696.03158 872122.19825 4730015.86903 11.80802 48.17152 535.69957 1.12142 2.74445 11.10891 -0.07020 0.82137 -2.66565 8 8 0 1.77 2013-Sep-20 09:11:37 4171696.52098 872122.29289 4730015.90855 11.80802 48.17152 536.06141 1.11391 2.39942 11.47075 -0.07770 0.47635 -2.30381 8 8 0 1.77 2013-Sep-20 09:11:37 4171695.43143 872122.56906 4730014.70352 11.80803 48.17152 534.48993 1.60719 2.34836 9.89927 0.41558 0.42529 -3.87529 8 8 0 1.77 2013-Sep-20 09:11:37 4171694.98794 872122.92920 4730013.97303 11.80803 48.17152 533.70525 2.05046 2.12975 9.11460 0.85885 0.20668 -4.65997 8 8 0 1.77 2013-Sep-20 09:11:37 4171694.79285 872122.92647 4730013.76788 11.80803 48.17152 533.42466 2.08771 2.13565 8.83401 0.89609 0.21257 -4.94056 8 8 0 1.77 2013-Sep-20 09:11:37 4171694.28728 872122.93402 4730013.96065 11.80804 48.17152 533.23931 2.19856 2.63181 8.64865 1.00694 0.70873 -5.12591 8 8 0 1.77 2013-Sep-20 09:11:37 4171694.60212 872123.07678 4730014.43498 11.80804 48.17152 533.81775 2.27387 2.69673 9.22710 1.08225 0.77366 -4.54747 8 8 0 1.77 2013-Sep-20 09:11:37 4171694.59957 872123.41621 4730014.86278 11.80804 48.17152 534.18118 2.60664 2.93214 9.59052 1.41502 1.00907 -4.18404 8 8 0 1.77 2013-Sep-20 09:11:37 4171694.71925 872123.65836 4730015.04824 11.80804 48.17152 534.43054 2.81918 2.93161 9.83989 1.62756 1.00853 -3.93467 8 8 0 1.77 2013-Sep-20 09:11:37 4171694.40657 872123.74338 4730014.91773 11.80805 48.17153 534.14079 2.96638 3.05967 9.55014 1.77477 1.13659 -4.22443 8 8 0 1.77 2013-Sep-20 09:11:37 4171693.82276 872123.87665 4730014.40044 11.80805 48.17153 533.39241 3.21631 3.12018 8.80176 2.02469 1.19711 -4.97281 8 8 0 1.77 2013-Sep-20 09:11:37 4171694.43490 872123.87789 4730014.61609 11.80805 48.17152 533.95287 3.09225 2.81734 9.36222 1.90063 0.89426 -4.41234 8 8 0 1.77 2013-Sep-20 09:11:38 4171694.56204 872123.70075 4730015.20182 11.80804 48.17153 534.44815 2.89285 3.14223 9.85749 1.70123 1.21916 -3.91707 8 8 0 1.77 2013-Sep-20 09:11:38 4171694.88830 872123.56695 4730015.54855 11.80804 48.17153 534.90123 2.69511 3.15590 10.31057 1.50350 1.23283 -3.46399 8 8 0 1.77 2013-Sep-20 09:11:38 4171694.40509 872123.47126 4730015.61395 11.80804 48.17153 534.62147 2.70033 3.56655 10.03081 1.50871 1.64348 -3.74375 8 8 0 1.77 2013-Sep-20 09:11:38 4171694.81287 872123.60448 4730015.55851 11.80804 48.17153 534.86454 2.74728 3.21184 10.27389 1.55567 1.28876 -3.50068 8 8 0 1.77 2013-Sep-20 09:11:38 4171695.06552 872123.69697 4730015.22353 11.80804 48.17152 534.79248 2.78612 2.79006 10.20182 1.59450 0.86699 -3.57274 8 8 0 1.77 2013-Sep-20 09:11:38 4171695.13714 872123.96936 4730015.17086 11.80805 48.17152 534.83716 3.03809 2.66117 10.24650 1.84647 0.73809 -3.52806 8 8 0 1.77 2013-Sep-20 09:11:38 4171695.53773 872123.96143 4730015.20964 11.80805 48.17152 535.12647 2.94835 2.39605 10.53582 1.75673 0.47298 -3.23874 8 8 0 1.77 2013-Sep-20 09:11:38 4171695.58338 872124.17985 4730015.02429 11.80805 48.17152 535.04797 3.15280 2.20584 10.45731 1.96118 0.28277 -3.31725 8 8 0 1.77 2013-Sep-20 09:11:38 4171696.24390 872124.05151 4730015.98736 11.80804 48.17152 536.17926 2.89202 2.38592 11.58861 1.70040 0.46284 -2.18596 8 8 0 1.77 2013-Sep-20 09:11:38 4171696.13432 872124.13431 4730016.24343 11.80805 48.17152 536.30983 2.99549 2.62399 11.71918 1.80387 0.70091 -2.05539 8 8 0 1.77 2013-Sep-20 09:11:38 4171696.63458 872124.14825 4730016.13636 11.80804 48.17152 536.55853 2.90676 2.18558 11.96787 1.71515 0.26251 -1.80669 8 8 0 1.77 2013-Sep-20 09:11:38 4171696.17818 872123.87674 4730016.26463 11.80804 48.17152 536.31912 2.73439 2.64542 11.72846 1.54278 0.72234 -2.04610 8 8 0 1.77 2013-Sep-20 09:11:38 4171696.47039 872123.99945 4730016.03400 11.80804 48.17152 536.35476 2.79471 2.25976 11.76410 1.60309 0.33669 -2.01046 8 8 0 1.77 2013-Sep-20 09:11:38 4171696.72307 872123.89857 4730016.65270 11.80804 48.17152 536.96696 2.64425 2.50346 12.37630 1.45264 0.58038 -1.39826 8 8 0 1.77 2013-Sep-20 09:11:38 4171696.48511 872124.07841 4730016.49433 11.80804 48.17152 536.71816 2.86898 2.54399 12.12750 1.67737 0.62091 -1.64706 8 8 0 1.77 2013-Sep-20 09:11:38 4171696.77053 872123.91100 4730017.14859 11.80804 48.17152 537.36915 2.64671 2.79766 12.77849 1.45509 0.87458 -0.99607 8 8 0 1.77 2013-Sep-20 09:11:38 4171697.76226 872124.02423 4730017.93984 11.80804 48.17152 538.62159 2.55460 2.58474 14.03094 1.36299 0.66166 0.25637 8 8 0 1.77 2013-Sep-20 09:11:38 4171697.80503 872124.02244 4730018.57734 11.80804 48.17152 539.12429 2.54410 2.97897 14.53363 1.35249 1.05589 0.75907 8 8 0 1.77 2013-Sep-20 09:11:38 4171698.31009 872123.51650 4730019.21589 11.80803 48.17153 539.86076 1.94552 3.11359 15.27010 0.75391 1.19051 1.49554 8 8 0 1.77 2013-Sep-20 09:11:38 4171698.69098 872123.15931 4730019.58334 11.80803 48.17153 540.33445 1.51794 3.13529 15.74380 0.32632 1.21222 1.96924 8 8 0 1.77 2013-Sep-20 09:11:38 4171698.72521 872122.93230 4730019.69460 11.80802 48.17153 540.40872 1.28873 3.21914 15.81807 0.09711 1.29606 2.04351 8 8 0 1.77 2013-Sep-20 09:11:38 4171698.66931 872122.71251 4730019.83349 11.80802 48.17153 540.44574 1.08503 3.38605 15.85508 -0.10658 1.46298 2.08052 8 8 0 1.77 2013-Sep-20 09:11:38 4171699.00295 872122.78526 4730020.35876 11.80802 48.17153 541.06486 1.08797 3.48191 16.47420 -0.10364 1.55884 2.69964 8 8 0 1.77 2013-Sep-20 09:11:38 4171700.11472 872122.80642 4730020.88670 11.80802 48.17152 542.18689 0.88117 3.01987 17.59624 -0.31044 1.09680 3.82167 8 8 0 1.77 2013-Sep-20 09:11:38 4171699.80387 872122.80827 4730020.90225 11.80802 48.17153 541.99581 0.94660 3.25669 17.40515 -0.24502 1.33361 3.63059 8 8 0 1.77 2013-Sep-20 09:11:39 4171699.70984 872122.81727 4730021.22894 11.80802 48.17153 542.17908 0.97465 3.54177 17.58843 -0.21697 1.61869 3.81387 8 8 0 1.77 2013-Sep-20 09:11:39 4171699.82524 872122.89495 4730021.46017 11.80802 48.17153 542.43733 1.02707 3.59996 17.84667 -0.16454 1.67688 4.07211 8 8 0 1.77 2013-Sep-20 09:11:39 4171700.08447 872122.55080 4730021.35202 11.80801 48.17153 542.47899 0.63716 3.39124 17.88833 -0.55446 1.46816 4.11377 8 8 0 1.77 2013-Sep-20 09:11:39 4171700.84119 872122.18652 4730021.89322 11.80801 48.17153 543.32654 0.12574 3.25578 18.73588 -1.06588 1.33270 4.96132 8 8 0 1.77 2013-Sep-20 09:11:39 4171701.05830 872122.04611 4730022.34280 11.80800 48.17153 543.78410 -0.05613 3.41866 19.19344 -1.24775 1.49558 5.41888 8 8 0 1.77 2013-Sep-20 09:11:39 4171700.75315 872122.03694 4730022.10137 11.80801 48.17153 543.40375 -0.00266 3.48161 18.81310 -1.19428 1.55854 5.03853 8 8 0 1.77 2013-Sep-20 09:11:39 4171700.56624 872121.96730 4730022.35195 11.80801 48.17153 543.45895 -0.03259 3.79568 18.86829 -1.22420 1.87260 5.09373 8 8 0 1.77 2013-Sep-20 09:11:39 4171701.19361 872121.94916 4730022.99533 11.80800 48.17153 544.34543 -0.17872 3.76992 19.75477 -1.37034 1.84684 5.98021 8 8 0 1.77 2013-Sep-20 09:11:39 4171700.96928 872121.74727 4730022.88855 11.80800 48.17153 544.09187 -0.33043 3.89311 19.50121 -1.52205 1.97003 5.72665 8 8 0 1.77 2013-Sep-20 09:11:39 4171701.42617 872121.82050 4730022.90283 11.80800 48.17153 544.41076 -0.35225 3.55823 19.82010 -1.54387 1.63516 6.04554 8 8 0 1.77 2013-Sep-20 09:11:39 4171701.53088 872121.64036 4730022.80282 11.80800 48.17153 544.38000 -0.55000 3.44263 19.78935 -1.74162 1.51955 6.01479 8 8 0 1.77 2013-Sep-20 09:11:39 4171702.34254 872121.67101 4730022.76349 11.80800 48.17152 544.88472 -0.68609 2.81972 20.29407 -1.87771 0.89664 6.51950 8 8 0 1.77 2013-Sep-20 09:11:39 4171702.28366 872121.18544 4730023.27272 11.80799 48.17153 545.15947 -1.14934 3.27631 20.56881 -2.34096 1.35323 6.79425 8 8 0 1.77 2013-Sep-20 09:11:39 4171701.47633 872121.32373 4730022.14251 11.80799 48.17153 543.80916 -0.84877 3.09033 19.21850 -2.04039 1.16726 5.44394 8 8 0 1.77 2013-Sep-20 09:11:39 4171700.83881 872121.33110 4730021.77560 11.80800 48.17153 543.12059 -0.71110 3.30951 18.52994 -1.90271 1.38643 4.75538 8 8 0 1.77 2013-Sep-20 09:11:39 4171700.43604 872121.04586 4730021.69105 11.80799 48.17153 542.75574 -0.90788 3.59039 18.16509 -2.09949 1.66731 4.39053 8 8 0 1.77 2013-Sep-20 09:11:39 4171700.98825 872120.91235 4730021.57206 11.80799 48.17153 543.00933 -1.15157 3.12862 18.41868 -2.34319 1.20554 4.64412 8 8 0 1.77 2013-Sep-20 09:11:39 4171700.84387 872121.02627 4730021.07622 11.80799 48.17152 542.56116 -1.01051 2.88588 17.97050 -2.20212 0.96281 4.19594 8 8 0 1.77 2013-Sep-20 09:11:39 4171701.81682 872121.15354 4730021.32315 11.80799 48.17152 543.39766 -1.08503 2.32151 18.80701 -2.27665 0.39843 5.03244 8 8 0 1.77 2013-Sep-20 09:11:39 4171701.24723 872121.27623 4730020.62791 11.80799 48.17152 542.52452 -0.84838 2.25458 17.93387 -2.04000 0.33151 4.15930 8 8 0 1.77 2013-Sep-20 09:11:39 4171701.65371 872121.36783 4730020.99764 11.80799 48.17152 543.07787 -0.84190 2.19072 18.48721 -2.03352 0.26764 4.71265 8 8 0 1.77 2013-Sep-20 09:11:39 4171700.85918 872121.70263 4730020.19240 11.80800 48.17152 542.00488 -0.35160 2.18216 17.41422 -1.54322 0.25908 3.63966 8 8 0 1.77 2013-Sep-20 09:11:39 4171700.56389 872121.70693 4730020.33065 11.80800 48.17152 541.91572 -0.28696 2.48907 17.32507 -1.47858 0.56600 3.55050 8 8 0 1.77 2013-Sep-20 09:11:39 4171700.47592 872121.79982 4730019.85935 11.80800 48.17152 541.51979 -0.17803 2.22477 16.92913 -1.36965 0.30169 3.15457 8 8 0 1.77 2013-Sep-20 09:11:39 4171701.35448 872121.62620 4730019.94851 11.80800 48.17151 542.13604 -0.52777 1.66990 17.54539 -1.71939 -0.25317 3.77082 8 8 0 1.77 2013-Sep-20 09:11:40 4171701.03147 872121.56844 4730020.26469 11.80800 48.17152 542.15291 -0.51820 2.12517 17.56225 -1.70982 0.20209 3.78769 8 8 0 1.77 2013-Sep-20 09:11:40 4171700.45478 872121.84957 4730019.54638 11.80800 48.17152 541.27957 -0.12501 2.02387 16.68891 -1.31663 0.10080 2.91435 8 8 0 1.77 2013-Sep-20 09:11:40 4171699.17139 872121.87706 4730018.49289 11.80801 48.17152 539.66053 0.16452 2.25319 15.06988 -1.02710 0.33011 1.29531 8 8 0 1.77 2013-Sep-20 09:11:40 4171697.92280 872122.10891 4730017.84977 11.80801 48.17152 538.39789 0.64697 2.69962 13.80723 -0.54465 0.77655 0.03267 8 8 0 1.77 2013-Sep-20 09:11:40 4171697.14621 872122.20402 4730016.86091 11.80802 48.17152 537.16707 0.89897 2.59208 12.57642 -0.29264 0.66900 -1.19815 8 8 0 1.77 2013-Sep-20 09:11:40 4171697.13207 872122.23190 4730016.85570 11.80802 48.17152 537.15776 0.92916 2.59467 12.56711 -0.26245 0.67159 -1.20746 8 8 0 1.77 2013-Sep-20 09:11:40 4171697.40063 872122.34713 4730016.74587 11.80802 48.17152 537.26696 0.98700 2.30797 12.67631 -0.20461 0.38489 -1.09826 8 8 0 1.77 2013-Sep-20 09:11:40 4171697.22457 872122.32399 4730016.24064 11.80802 48.17152 536.77241 1.00038 2.10297 12.18176 -0.19124 0.17989 -1.59281 8 8 0 1.77 2013-Sep-20 09:11:40 4171698.06326 872122.22972 4730016.51706 11.80802 48.17151 537.51300 0.73648 1.68997 12.92235 -0.45514 -0.23311 -0.85222 8 8 0 1.77 2013-Sep-20 09:11:40 4171697.48522 872122.40385 4730015.81532 11.80802 48.17151 536.63653 1.02521 1.61704 12.04588 -0.16641 -0.30604 -1.72869 8 8 0 1.77 2013-Sep-20 09:11:40 4171697.33030 872122.67752 4730014.96153 11.80802 48.17151 535.93655 1.32479 1.11890 11.34590 0.13318 -0.80417 -2.42867 8 8 0 1.77 2013-Sep-20 09:11:40 4171697.92837 872122.58276 4730016.00451 11.80802 48.17151 537.09120 1.10965 1.39270 12.50055 -0.08197 -0.53037 -1.27402 8 8 0 1.77 2013-Sep-20 09:11:40 4171697.86454 872122.85176 4730015.72676 11.80802 48.17151 536.87928 1.38602 1.21301 12.28862 0.19440 -0.71007 -1.48594 8 8 0 1.77 2013-Sep-20 09:11:40 4171698.36123 872122.55819 4730016.22885 11.80802 48.17151 537.53759 0.99702 1.23034 12.94693 -0.19459 -0.69274 -0.82763 8 8 0 1.77 2013-Sep-20 09:11:40 4171698.45215 872122.84936 4730016.21352 11.80802 48.17151 537.62525 1.26343 1.10940 13.03460 0.07181 -0.81367 -0.73997 8 8 0 1.77 2013-Sep-20 09:11:40 4171698.63720 872123.07349 4730016.28996 11.80803 48.17151 537.83359 1.44494 0.99124 13.24294 0.25333 -0.93184 -0.53163 8 8 0 1.77 2013-Sep-20 09:11:40 4171698.94598 872123.06790 4730016.21553 11.80802 48.17150 537.97894 1.37628 0.71723 13.38828 0.18466 -1.20584 -0.38628 8 8 0 1.77 2013-Sep-20 09:11:40 4171699.18545 872123.28182 4730016.61339 11.80803 48.17150 538.46092 1.53667 0.77529 13.87027 0.34506 -1.14779 0.09570 8 8 0 1.77 2013-Sep-20 09:11:40 4171699.13623 872123.21815 4730016.21580 11.80803 48.17150 538.12384 1.48443 0.55574 13.53318 0.29281 -1.36733 -0.24138 8 8 0 1.77 2013-Sep-20 09:11:40 4171699.18814 872123.46754 4730016.66122 11.80803 48.17150 538.52366 1.71792 0.77690 13.93301 0.52630 -1.14617 0.15844 8 8 0 1.77 2013-Sep-20 09:11:40 4171699.92052 872123.45256 4730017.32933 11.80803 48.17150 539.49755 1.55339 0.69057 14.90689 0.36177 -1.23250 1.13233 8 8 0 1.77 2013-Sep-20 09:11:40 4171700.45994 872123.61056 4730017.19824 11.80803 48.17150 539.77355 1.59765 0.18562 15.18290 0.40604 -1.73746 1.40834 8 8 0 1.77 2013-Sep-20 09:11:40 4171700.16570 872123.75511 4730016.66704 11.80803 48.17150 539.20538 1.79936 0.02393 14.61473 0.60775 -1.89915 0.84016 8 8 0 1.77 2013-Sep-20 09:11:40 4171700.52505 872123.76365 4730016.45094 11.80803 48.17149 539.28010 1.73419 -0.38360 14.68945 0.54257 -2.30667 0.91488 8 8 0 1.77 2013-Sep-20 09:11:40 4171700.59958 872123.87449 4730016.61073 11.80803 48.17149 539.46295 1.82742 -0.34829 14.87229 0.63581 -2.27137 1.09773 8 8 0 1.77 2013-Sep-20 09:11:41 4171700.03977 872123.41506 4730016.06913 11.80803 48.17150 538.63125 1.49228 -0.23112 14.04059 0.30066 -2.15419 0.26603 8 8 0 1.77 2013-Sep-20 09:11:41 4171700.78730 872123.52751 4730016.16879 11.80803 48.17149 539.20883 1.44938 -0.72703 14.61818 0.25776 -2.65011 0.84361 8 8 0 1.77 2013-Sep-20 09:11:41 4171701.15722 872123.53886 4730015.89908 11.80802 48.17149 539.25089 1.38479 -1.17844 14.66023 0.19317 -3.10152 0.88567 8 8 0 1.77 2013-Sep-20 09:11:41 4171701.28142 872123.70878 4730016.07576 11.80803 48.17149 539.48680 1.52570 -1.17712 14.89615 0.33408 -3.10019 1.12158 8 8 0 1.77 2013-Sep-20 09:11:41 4171701.25351 872123.61063 4730016.14594 11.80802 48.17149 539.50748 1.43533 -1.09499 14.91682 0.24372 -3.01806 1.14226 8 8 0 1.77 2013-Sep-20 09:11:41 4171701.62854 872123.76804 4730015.83873 11.80803 48.17148 539.54487 1.51267 -1.59741 14.95422 0.32106 -3.52048 1.17965 8 8 0 1.77 2013-Sep-20 09:11:41 4171702.32314 872123.47508 4730016.69252 11.80802 48.17148 540.59451 1.08378 -1.48997 16.00386 -0.10784 -3.41305 2.22929 8 8 0 1.77 2013-Sep-20 09:11:41 4171701.64336 872123.25849 4730016.32060 11.80802 48.17149 539.84406 1.01088 -1.20916 15.25341 -0.18074 -3.13224 1.47884 8 8 0 1.77 2013-Sep-20 09:11:41 4171701.58960 872123.25338 4730016.73460 11.80802 48.17149 540.11676 1.01687 -0.89307 15.52611 -0.17474 -2.81614 1.75154 8 8 0 1.77 2013-Sep-20 09:11:41 4171701.89835 872123.10856 4730016.94835 11.80802 48.17149 540.45783 0.81194 -0.95363 15.86717 -0.37968 -2.87671 2.09261 8 8 0 1.77 2013-Sep-20 09:11:41 4171701.05306 872123.13763 4730016.73245 11.80802 48.17149 539.74912 1.01336 -0.48552 15.15846 -0.17826 -2.40859 1.38390 8 8 0 1.77 2013-Sep-20 09:11:41 4171701.24597 872123.32675 4730017.45947 11.80802 48.17150 540.44259 1.15900 -0.17020 15.85194 -0.03262 -2.09328 2.07737 8 8 0 1.77 2013-Sep-20 09:11:41 4171701.42575 872123.33472 4730017.53661 11.80802 48.17150 540.61851 1.13002 -0.25110 16.02786 -0.06160 -2.17418 2.25329 8 8 0 1.77 2013-Sep-20 09:11:41 4171701.23715 872123.28572 4730017.21918 11.80802 48.17149 540.25219 1.12065 -0.31776 15.66153 -0.07097 -2.24084 1.88697 8 8 0 1.77 2013-Sep-20 09:11:41 4171700.90322 872122.88576 4730017.09056 11.80802 48.17150 539.88377 0.79749 -0.09900 15.29312 -0.39413 -2.02207 1.51855 8 8 0 1.77 2013-Sep-20 09:11:41 4171700.84970 872122.84441 4730017.12197 11.80802 48.17150 539.86660 0.76796 -0.03271 15.27595 -0.42366 -1.95578 1.50138 8 8 0 1.77 2013-Sep-20 09:11:41 4171700.57522 872122.55720 4730017.15672 11.80801 48.17150 539.67412 0.54299 0.23446 15.08346 -0.64862 -1.68862 1.30890 8 8 0 1.77 2013-Sep-20 09:11:41 4171700.39594 872122.45672 4730017.03241 11.80801 48.17150 539.45074 0.48133 0.29764 14.86008 -0.71029 -1.62543 1.08552 8 8 0 1.77 2013-Sep-20 09:11:41 4171700.80498 872122.29960 4730017.06307 11.80801 48.17150 539.71916 0.24383 0.04370 15.12851 -0.94779 -1.87937 1.35394 8 8 0 1.77 2013-Sep-20 09:11:41 4171699.89102 872122.15259 4730016.48617 11.80801 48.17150 538.67260 0.28696 0.34800 14.08195 -0.90466 -1.57507 0.30739 8 8 0 1.77 2013-Sep-20 09:11:41 4171699.47421 872122.10703 4730016.29735 11.80801 48.17150 538.25360 0.32766 0.53304 13.66294 -0.86396 -1.39004 -0.11162 8 8 0 1.77 2013-Sep-20 09:11:41 4171699.66850 872122.11360 4730016.59772 11.80801 48.17150 538.60515 0.29433 0.59064 14.01449 -0.89729 -1.33244 0.23993 8 8 0 1.77 2013-Sep-20 09:11:41 4171699.84307 872122.07987 4730016.22762 11.80801 48.17150 538.43872 0.22559 0.22164 13.84807 -0.96602 -1.70144 0.07350 8 8 0 1.77 2013-Sep-20 09:11:41 4171699.30994 872121.99757 4730016.22422 11.80801 48.17150 538.07694 0.25413 0.62077 13.48628 -0.93749 -1.30230 -0.28828 8 8 0 1.77 2013-Sep-20 09:11:41 4171699.01634 872121.81703 4730016.78096 11.80801 48.17151 538.27549 0.13749 1.23373 13.68483 -1.05413 -0.68934 -0.08973 8 8 0 1.77 2013-Sep-20 09:11:42 4171698.67867 872121.85800 4730016.70871 11.80801 48.17151 538.00681 0.24669 1.42559 13.41616 -0.94493 -0.49748 -0.35841 8 8 0 1.77 2013-Sep-20 09:11:42 4171697.93864 872121.93373 4730016.51253 11.80801 48.17151 537.38789 0.47225 1.82297 12.79723 -0.71937 -0.10010 -0.97733 8 8 0 1.77 2013-Sep-20 09:11:42 4171698.65654 872121.82911 4730016.87767 11.80801 48.17151 538.11433 0.22294 1.55882 13.52367 -0.96867 -0.36425 -0.25089 8 8 0 1.77 2013-Sep-20 09:11:42 4171698.25166 872121.75893 4730016.31071 11.80801 48.17151 537.41798 0.23710 1.48672 12.82732 -0.95452 -0.43635 -0.94724 8 8 0 1.77 2013-Sep-20 09:11:42 4171698.08372 872121.74390 4730016.11703 11.80801 48.17151 537.16198 0.25675 1.48234 12.57132 -0.93487 -0.44073 -1.20324 8 8 0 1.77 2013-Sep-20 09:11:42 4171698.19400 872121.69853 4730015.64966 11.80801 48.17151 536.87952 0.18977 1.09714 12.28886 -1.00184 -0.82594 -1.48570 8 8 0 1.77 2013-Sep-20 09:11:42 4171697.44883 872121.90197 4730014.68147 11.80801 48.17151 535.69940 0.54139 0.96393 11.10875 -0.65022 -0.95914 -2.66582 8 8 0 1.77 2013-Sep-20 09:11:42 4171697.60936 872121.97606 4730014.99269 11.80801 48.17151 536.04621 0.58106 1.04311 11.45555 -0.61055 -0.87997 -2.31901 8 8 0 1.77 2013-Sep-20 09:11:42 4171697.30997 872121.94969 4730014.80540 11.80801 48.17151 535.70761 0.61652 1.14059 11.11696 -0.57510 -0.78248 -2.65760 8 8 0 1.77 2013-Sep-20 09:11:42 4171696.67498 872122.30815 4730014.21412 11.80802 48.17151 534.90143 1.09734 1.15475 10.31078 -0.09428 -0.76832 -3.46379 8 8 0 1.77 2013-Sep-20 09:11:42 4171696.14737 872122.25976 4730013.48930 11.80802 48.17151 534.01031 1.15793 1.06357 9.41965 -0.03369 -0.85951 -4.35491 8 8 0 1.77 2013-Sep-20 09:11:42 4171695.58820 872122.25426 4730013.30308 11.80802 48.17151 533.50578 1.26698 1.34806 8.91513 0.07536 -0.57501 -4.85944 8 8 0 1.77 2013-Sep-20 09:11:42 4171695.46016 872122.52534 4730013.66225 11.80803 48.17151 533.72681 1.55852 1.63965 9.13616 0.36690 -0.28343 -4.63840 8 8 0 1.77 2013-Sep-20 09:11:42 4171695.53818 872122.49507 4730013.68190 11.80803 48.17151 533.78826 1.51292 1.60046 9.19761 0.32131 -0.32261 -4.57696 8 8 0 1.77 2013-Sep-20 09:11:42 4171695.59275 872122.49625 4730014.22604 11.80803 48.17151 534.22952 1.50292 1.92337 9.63886 0.31130 0.00029 -4.13570 8 8 0 1.77 2013-Sep-20 09:11:42 4171695.10915 872122.43456 4730014.12230 11.80803 48.17152 533.82810 1.54149 2.21632 9.23745 0.34988 0.29325 -4.53712 8 8 0 1.77 2013-Sep-20 09:11:42 4171694.77850 872122.56472 4730013.90581 11.80803 48.17152 533.46870 1.73656 2.29326 8.87805 0.54494 0.37019 -4.89652 8 8 0 1.77 2013-Sep-20 09:11:42 4171695.47456 872122.64284 4730014.93579 11.80803 48.17152 534.70123 1.67058 2.46055 10.11057 0.47897 0.53748 -3.66399 8 8 0 1.77 2013-Sep-20 09:11:42 4171694.86781 872122.86137 4730014.62148 11.80803 48.17152 534.10077 2.00866 2.66017 9.51011 0.81704 0.73710 -4.26445 8 8 0 1.77 2013-Sep-20 09:11:42 4171695.25746 872122.98096 4730015.01290 11.80803 48.17152 534.66311 2.04598 2.61878 10.07245 0.85436 0.69570 -3.70211 8 8 0 1.77 2013-Sep-20 09:11:42 4171696.01647 872122.67914 4730015.99900 11.80803 48.17152 535.85218 1.59522 2.76882 11.26152 0.40361 0.84574 -2.51304 8 8 0 1.77 2013-Sep-20 09:11:42 4171696.45623 872122.47580 4730015.98330 11.80802 48.17152 536.09980 1.30620 2.46861 11.50915 0.11458 0.54554 -2.26542 8 8 0 1.77 2013-Sep-20 09:11:42 4171696.67520 872122.25393 4730015.74760 11.80802 48.17152 536.03684 1.04421 2.18554 11.44618 -0.14740 0.26247 -2.32838 8 8 0 1.77 2013-Sep-20 09:11:42 4171696.35253 872122.63876 4730015.55226 11.80803 48.17152 535.73316 1.48693 2.23194 11.14251 0.29532 0.30886 -2.63206 8 8 0 1.77 2013-Sep-20 09:11:42 4171696.71857 872123.03119 4730015.30768 11.80803 48.17151 535.84342 1.79615 1.74201 11.25277 0.60453 -0.18107 -2.52180 8 8 0 1.77 2013-Sep-20 09:11:43 4171696.97698 872122.77646 4730015.99104 11.80803 48.17152 536.48654 1.49393 2.04810 11.89589 0.30231 0.12503 -1.87868 8 8 0 1.77 2013-Sep-20 09:11:43 4171696.76492 872122.85934 4730015.55238 11.80803 48.17151 536.03255 1.61845 1.89759 11.44190 0.42684 -0.02548 -2.33267 8 8 0 1.77 2013-Sep-20 09:11:43 4171696.84952 872123.24895 4730015.54934 11.80803 48.17151 536.13869 1.98251 1.77446 11.54803 0.79089 -0.14862 -2.22653 8 8 0 1.77 2013-Sep-20 09:11:43 4171696.47072 872123.17954 4730015.01982 11.80803 48.17151 535.48737 1.99208 1.70819 10.89671 0.80047 -0.21489 -2.87785 8 8 0 1.77 2013-Sep-20 09:11:43 4171697.03787 872123.03775 4730015.53349 11.80803 48.17151 536.22101 1.73724 1.65871 11.63035 0.54562 -0.26437 -2.14421 8 8 0 1.77 2013-Sep-20 09:11:43 4171697.07897 872122.98161 4730015.23720 11.80803 48.17151 536.01940 1.67387 1.43969 11.42875 0.48226 -0.48338 -2.34582 8 8 0 1.77 2013-Sep-20 09:11:43 4171696.47623 872123.03652 4730015.33817 11.80803 48.17152 535.70866 1.85096 1.93829 11.11801 0.65934 0.01521 -2.65656 8 8 0 1.77 2013-Sep-20 09:11:43 4171696.14654 872123.00641 4730015.18816 11.80803 48.17152 535.37756 1.88895 2.08330 10.78691 0.69734 0.16022 -2.98766 8 8 0 1.77 2013-Sep-20 09:11:43 4171696.39420 872123.38656 4730015.14689 11.80804 48.17151 535.56036 2.21038 1.81717 10.96970 1.01877 -0.10590 -2.80486 8 8 0 1.77 2013-Sep-20 09:11:43 4171696.61796 872123.54419 4730015.24727 11.80804 48.17151 535.80273 2.31889 1.69688 11.21207 1.12727 -0.22620 -2.56249 8 8 0 1.77 2013-Sep-20 09:11:43 4171696.02291 872123.50783 4730014.90679 11.80804 48.17151 535.15562 2.40507 1.90937 10.56497 1.21345 -0.01370 -3.20960 8 8 0 1.77 2013-Sep-20 09:11:43 4171696.04014 872123.78410 4730014.70349 11.80804 48.17151 535.05308 2.67196 1.71909 10.46243 1.48035 -0.20399 -3.31213 8 8 0 1.77 2013-Sep-20 09:11:43 4171695.70521 872123.71814 4730014.36057 11.80804 48.17151 534.56992 2.67593 1.74475 9.97926 1.48432 -0.17833 -3.79530 8 8 0 1.77 2013-Sep-20 09:11:43 4171696.43152 872123.86969 4730015.06849 11.80804 48.17151 535.59223 2.67565 1.66399 11.00158 1.48403 -0.25908 -2.77299 8 8 0 1.77 2013-Sep-20 09:11:43 4171696.31613 872123.79782 4730014.34803 11.80804 48.17151 534.97025 2.62892 1.27864 10.37959 1.43730 -0.64443 -3.39497 8 8 0 1.77 2013-Sep-20 09:11:43 4171696.50031 872123.68029 4730014.81575 11.80804 48.17151 535.42296 2.47618 1.47415 10.83230 1.28456 -0.44892 -2.94226 8 8 0 1.77 2013-Sep-20 09:11:43 4171696.49082 872123.61267 4730014.66764 11.80804 48.17151 535.29718 2.41194 1.39261 10.70653 1.22032 -0.53046 -3.06804 8 8 0 1.77 2013-Sep-20 09:11:43 4171696.80851 872123.90828 4730015.06081 11.80804 48.17151 535.83787 2.63628 1.37803 11.24722 1.44467 -0.54505 -2.52735 8 8 0 1.77 2013-Sep-20 09:11:43 4171696.68423 872124.27510 4730015.10958 11.80805 48.17151 535.84314 3.02076 1.44526 11.25249 1.82915 -0.47781 -2.52207 8 8 0 1.77 2013-Sep-20 09:11:43 4171696.19785 872124.03702 4730014.73344 11.80804 48.17151 535.21287 2.88726 1.58548 10.62221 1.69564 -0.33760 -3.15235 8 8 0 1.77 2013-Sep-20 09:11:43 4171695.80435 872124.33822 4730014.77271 11.80805 48.17151 535.02636 3.26260 1.85274 10.43571 2.07099 -0.07033 -3.33886 8 8 0 1.77 2013-Sep-20 09:11:43 4171695.51952 872124.29262 4730014.48981 11.80805 48.17151 534.62341 3.27625 1.87878 10.03275 2.08464 -0.04430 -3.74181 8 8 0 1.77 2013-Sep-20 09:11:43 4171695.94955 872124.34511 4730015.05820 11.80805 48.17152 535.33482 3.23964 1.93618 10.74416 2.04802 0.01310 -3.03040 8 8 0 1.77 2013-Sep-20 09:11:43 4171695.70147 872124.15836 4730014.66480 11.80805 48.17151 534.85425 3.10760 1.88324 10.26360 1.91598 -0.03984 -3.51097 8 8 0 1.77 2013-Sep-20 09:11:43 4171695.55169 872123.99272 4730014.04912 11.80805 48.17151 534.27510 2.97612 1.60715 9.68445 1.78450 -0.31593 -4.09012 8 8 0 1.77 2013-Sep-20 09:11:44 4171695.33438 872123.95169 4730014.32146 11.80805 48.17152 534.33058 2.98043 1.95353 9.73992 1.78881 0.03045 -4.03464 8 8 0 1.77 2013-Sep-20 09:11:44 4171695.74072 872123.80592 4730014.69438 11.80804 48.17152 534.85382 2.75459 1.92808 10.26317 1.56297 0.00501 -3.51140 8 8 0 1.77 2013-Sep-20 09:11:44 4171695.29452 872123.79905 4730014.35097 11.80804 48.17152 534.30571 2.83918 2.02556 9.71505 1.64756 0.10248 -4.05951 8 8 0 1.77 2013-Sep-20 09:11:44 4171695.54611 872123.99294 4730014.27107 11.80805 48.17151 534.43687 2.97748 1.75920 9.84622 1.78586 -0.16387 -3.92834 8 8 0 1.77 2013-Sep-20 09:11:44 4171695.96067 872124.12538 4730014.37722 11.80805 48.17151 534.80466 3.02229 1.50743 10.21401 1.83067 -0.41564 -3.56056 8 8 0 1.77 2013-Sep-20 09:11:44 4171695.28197 872124.16881 4730013.77999 11.80805 48.17151 533.92252 3.20368 1.59754 9.33186 2.01206 -0.32554 -4.44270 8 8 0 1.77 2013-Sep-20 09:11:44 4171695.25290 872124.19400 4730013.19159 11.80805 48.17151 533.46854 3.23428 1.22250 8.87788 2.04266 -0.70057 -4.89668 8 8 0 1.77 2013-Sep-20 09:11:44 4171695.24055 872123.97978 4730013.54071 11.80805 48.17151 533.69138 3.02712 1.49699 9.10073 1.83550 -0.42608 -4.67383 8 8 0 1.77 2013-Sep-20 09:11:44 4171695.74913 872123.62641 4730014.70238 11.80804 48.17152 534.84077 2.57715 1.95466 10.25012 1.38554 0.03158 -3.52445 8 8 0 1.77 2013-Sep-20 09:11:44 4171696.64552 872123.35533 4730015.13090 11.80803 48.17151 535.70824 2.12838 1.62797 11.11758 0.93676 -0.29511 -2.65698 8 8 0 1.77 2013-Sep-20 09:11:44 4171696.89713 872123.09716 4730014.54717 11.80803 48.17151 535.40229 1.82418 1.09452 10.81164 0.63257 -0.82855 -2.96292 8 8 0 1.77 2013-Sep-20 09:11:44 4171696.80211 872122.99782 4730014.37511 11.80803 48.17151 535.19849 1.74639 1.06423 10.60784 0.55477 -0.85885 -3.16672 8 8 0 1.77 2013-Sep-20 09:11:44 4171697.00485 872122.87860 4730014.09844 11.80803 48.17150 535.10841 1.58821 0.75002 10.51776 0.39660 -1.17305 -3.25680 8 8 0 1.77 2013-Sep-20 09:11:44 4171697.08717 872122.87208 4730013.87906 11.80803 48.17150 534.99779 1.56498 0.54467 10.40714 0.37336 -1.37841 -3.36742 8 8 0 1.77 2013-Sep-20 09:11:44 4171698.47976 872122.72102 4730014.79958 11.80802 48.17150 536.57216 1.13215 0.16588 11.98151 -0.05947 -1.75720 -1.79305 8 8 0 1.77 2013-Sep-20 09:11:44 4171698.43171 872122.56928 4730014.74034 11.80802 48.17150 536.47595 0.99345 0.18455 11.88530 -0.19817 -1.73852 -1.88927 8 8 0 1.77 2013-Sep-20 09:11:44 4171699.10059 872122.19448 4730015.49516 11.80801 48.17150 537.42389 0.48972 0.25723 12.83324 -0.70190 -1.66584 -0.94133 8 8 0 1.77 2013-Sep-20 09:11:44 4171698.68942 872122.44197 4730014.83165 11.80802 48.17150 536.69485 0.81610 0.07689 12.10419 -0.37551 -1.84618 -1.67037 8 8 0 1.77 2013-Sep-20 09:11:44 4171698.48407 872122.73722 4730014.64980 11.80802 48.17150 536.46559 1.14712 0.06038 11.87493 -0.04449 -1.86270 -1.89963 8 8 0 1.77 2013-Sep-20 09:11:44 4171698.56808 872122.70679 4730014.58921 11.80802 48.17150 536.47112 1.10015 -0.03667 11.88047 -0.09147 -1.95975 -1.89410 8 8 0 1.77 2013-Sep-20 09:11:44 4171698.33519 872122.54320 4730014.29899 11.80802 48.17150 536.08052 0.98768 -0.03541 11.48986 -0.20394 -1.95849 -2.28470 8 8 0 1.77 2013-Sep-20 09:11:44 4171698.06374 872122.36906 4730014.63007 11.80802 48.17150 536.12626 0.87276 0.40993 11.53560 -0.31885 -1.51314 -2.23896 8 8 0 1.77 2013-Sep-20 09:11:44 4171697.35527 872122.20393 4730014.00595 11.80802 48.17150 535.17618 0.85611 0.53563 10.58552 -0.33551 -1.38745 -3.18904 8 8 0 1.77 2013-Sep-20 09:11:44 4171696.96537 872122.23825 4730013.39245 11.80802 48.17150 534.46919 0.96950 0.40563 9.87853 -0.22212 -1.51744 -3.89603 8 8 0 1.77 2013-Sep-20 09:11:44 4171697.14564 872122.31418 4730013.87948 11.80802 48.17150 534.96014 1.00693 0.58737 10.36949 -0.18469 -1.33571 -3.40508 8 8 0 1.77 2013-Sep-20 09:11:45 4171697.20998 872122.45729 4730014.24081 11.80802 48.17150 535.29091 1.13384 0.75959 10.70025 -0.05777 -1.16348 -3.07431 8 8 0 1.77 2013-Sep-20 09:11:45 4171697.55810 872122.46251 4730014.32625 11.80802 48.17150 535.58254 1.06772 0.56186 10.99189 -0.12390 -1.36122 -2.78268 8 8 0 1.77 2013-Sep-20 09:11:45 4171698.02675 872122.31732 4730014.72367 11.80802 48.17150 536.16479 0.82969 0.50723 11.57414 -0.36192 -1.41585 -2.20042 8 8 0 1.77 2013-Sep-20 09:11:45 4171697.85735 872122.22972 4730014.88644 11.80802 48.17150 536.16354 0.77861 0.75269 11.57289 -0.41301 -1.17038 -2.20168 8 8 0 1.77 2013-Sep-20 09:11:45 4171698.19975 872122.30750 4730015.69228 11.80802 48.17151 536.99814 0.78468 1.02850 12.40748 -0.40694 -0.89457 -1.36708 8 8 0 1.77 2013-Sep-20 09:11:45 4171698.11828 872122.01721 4730016.26904 11.80801 48.17151 537.33511 0.51720 1.51684 12.74445 -0.67441 -0.40624 -1.03011 8 8 0 1.77 2013-Sep-20 09:11:45 4171698.36364 872122.02906 4730016.60572 11.80801 48.17151 537.74777 0.47859 1.56060 13.15712 -0.71302 -0.36247 -0.61745 8 8 0 1.77 2013-Sep-20 09:11:45 4171697.97003 872122.03509 4730016.96931 11.80801 48.17152 537.76258 0.56504 2.08925 13.17192 -0.62657 0.16618 -0.60264 8 8 0 1.77 2013-Sep-20 09:11:45 4171698.11150 872121.74281 4730017.74519 11.80801 48.17152 538.39318 0.25000 2.54807 13.80252 -0.94162 0.62500 0.02796 8 8 0 1.77 2013-Sep-20 09:11:45 4171698.51446 872121.53447 4730018.09510 11.80801 48.17152 538.88852 -0.03639 2.51929 14.29787 -1.22801 0.59621 0.52330 8 8 0 1.77 2013-Sep-20 09:11:45 4171699.49571 872121.44185 4730018.38053 11.80800 48.17152 539.72913 -0.32785 2.00806 15.13847 -1.51946 0.08498 1.36391 8 8 0 1.77 2013-Sep-20 09:11:45 4171700.30319 872121.34912 4730019.28864 11.80800 48.17152 540.92026 -0.58386 2.03887 16.32961 -1.77547 0.11579 2.55505 8 8 0 1.77 2013-Sep-20 09:11:45 4171700.18771 872121.38148 4730019.42828 11.80800 48.17152 540.95334 -0.52854 2.21129 16.36269 -1.72016 0.28821 2.58812 8 8 0 1.77 2013-Sep-20 09:11:45 4171700.31261 872121.53254 4730019.50423 11.80800 48.17152 541.11208 -0.40624 2.14781 16.52142 -1.59786 0.22473 2.74686 8 8 0 1.77 2013-Sep-20 09:11:45 4171700.89777 872121.61524 4730019.60038 11.80800 48.17151 541.57700 -0.44503 1.77252 16.98635 -1.63665 -0.15056 3.21178 8 8 0 1.77 2013-Sep-20 09:11:45 4171701.43846 872121.50501 4730019.69455 11.80800 48.17151 541.98509 -0.66358 1.45776 17.39444 -1.85520 -0.46532 3.61987 8 8 0 1.77 2013-Sep-20 09:11:45 4171701.49240 872121.42833 4730019.58022 11.80800 48.17151 541.92464 -0.74968 1.35386 17.33399 -1.94129 -0.56922 3.55943 8 8 0 1.77 2013-Sep-20 09:11:45 4171701.07004 872121.33254 4730019.00074 11.80800 48.17151 541.20407 -0.75701 1.29007 16.61341 -1.94863 -0.63300 2.83885 8 8 0 1.77 2013-Sep-20 09:11:45 4171700.97352 872121.32348 4730019.12476 11.80800 48.17151 541.23223 -0.74613 1.44457 16.64157 -1.93774 -0.47851 2.86701 8 8 0 1.77 2013-Sep-20 09:11:45 4171700.89373 872121.23329 4730018.86608 11.80799 48.17151 540.97509 -0.81807 1.34399 16.38444 -2.00969 -0.57908 2.60987 8 8 0 1.77 2013-Sep-20 09:11:45 4171701.37283 872121.32846 4730019.41306 11.80799 48.17151 541.70840 -0.82296 1.34482 17.11775 -2.01458 -0.57826 3.34319 8 8 0 1.77 2013-Sep-20 09:11:45 4171701.83106 872120.93870 4730020.08757 11.80799 48.17151 542.45695 -1.29824 1.51987 17.86629 -2.48986 -0.40321 4.09173 8 8 0 1.77 2013-Sep-20 09:11:45 4171700.94903 872120.81950 4730019.50724 11.80799 48.17151 541.43247 -1.23442 1.79435 16.84181 -2.42604 -0.12873 3.06725 8 8 0 1.77 2013-Sep-20 09:11:45 4171700.77325 872120.83683 4730019.85572 11.80799 48.17152 541.57976 -1.18149 2.15232 16.98910 -2.37311 0.22925 3.21454 8 8 0 1.77 2013-Sep-20 09:11:45 4171700.20884 872121.00436 4730018.81691 11.80799 48.17151 540.46011 -0.90200 1.84566 15.86946 -2.09362 -0.07742 2.09489 8 8 0 1.77 2013-Sep-20 09:11:46 4171699.72112 872121.43452 4730018.67812 11.80800 48.17152 540.09702 -0.38115 2.04324 15.50636 -1.57277 0.12016 1.73180 8 8 0 1.77 gnss-sdr-0.0.9/src/utils/gnuplot/8_GPS.plt000066400000000000000000000021101305042567700203030ustar00rootroot00000000000000#set terminal pdf color font "Bold,14" #set output "IFEN_accuracy.pdf" set terminal jpeg font "Helvetica, 14" set output "8_GPS_accuracy_precision.jpeg" set grid set xrange [-8:8] set yrange [-8:8] set ylabel "North [m]" set xlabel "East [m]" set key Left left set title "IFEN simulated data, 8 GPS - Accuracy and Precision" file1="8_GPS_GNSS_SDR_solutions.txt" #file2="8_GAL_GNSS_SDR_solutions.txt" #file3="8_GPS_GNSS_SDR_solutions.txt" #values to copy from statistic file DRMS= 2.034509899 DUE_DRMS= 4.069019799 CEP= 1.678044871 #difference with respect to the reference position #values to copy from statistic file delta_E=-0.560 #gps delta_N=1.323 #gps set parametric #dummy variable is t for curves, u/v for surfaces set size square set angle degree set trange [0:360] #radius_6_GPS=6 plot file1 u 9:10 with points pointsize 0.3 lc rgb "red" notitle,\ DRMS*sin(t)+delta_E,DRMS*cos(t)+delta_N lw 3 lc rgb "black" title "DRMS",\ DUE_DRMS*sin(t)+delta_E,DUE_DRMS*cos(t)+delta_N lw 2 lc rgb "gray" title "2DRMS",\ CEP*sin(t)+delta_E,CEP*cos(t)+delta_N lw 1 lc rgb "black" title "CEP" gnss-sdr-0.0.9/src/utils/gnuplot/8_GPS_GNSS_SDR_solutions.txt000066400000000000000000011321261305042567700240200ustar00rootroot00000000000000 time X [m] Y [m] Z [m] Long [deg] Lat [deg] h [m] E(Acc) [m] N(Acc) [m] Up(Acc) [m] E(Pre) [m] N(Pre) [m] Up(Pre) [m] Tot Sat Gal GPS GDOP 1999-Aug-27 09:09:17 4171696.06632 872121.00018 4730014.78492 11.80800 48.17152 534.75093 -0.05841 2.17880 10.16027 0.50199 0.85511 -0.63258 8 0 8 2.00 1999-Aug-27 09:09:17 4171695.88605 872119.68584 4730014.82036 11.80799 48.17152 534.48029 -1.30804 2.53433 9.88964 -0.74764 1.21065 -0.90322 8 0 8 2.00 1999-Aug-27 09:09:18 4171696.40670 872119.79288 4730014.34609 11.80799 48.17151 534.48137 -1.30981 1.82197 9.89072 -0.74941 0.49829 -0.90214 8 0 8 2.00 1999-Aug-27 09:09:18 4171698.20885 872120.51947 4730014.34802 11.80799 48.17150 535.75840 -0.96738 0.39802 11.16774 -0.40698 -0.92567 0.37488 8 0 8 2.00 1999-Aug-27 09:09:18 4171702.27793 872120.49428 4730015.18457 11.80798 48.17148 539.03457 -1.82470 -2.00813 14.44391 -1.26430 -3.33182 3.65105 8 0 8 2.00 1999-Aug-27 09:09:18 4171699.74782 872120.39698 4730014.70421 11.80799 48.17149 537.01172 -1.40220 -0.46825 12.42107 -0.84180 -1.79194 1.62821 8 0 8 2.00 1999-Aug-27 09:09:18 4171699.15761 872121.32123 4730014.44286 11.80800 48.17149 536.55782 -0.37673 -0.35299 11.96717 0.18367 -1.67667 1.17431 8 0 8 2.00 1999-Aug-27 09:09:18 4171695.94636 872120.49857 4730012.84683 11.80800 48.17151 533.16001 -0.52485 1.05026 8.56935 0.03555 -0.27343 -2.22350 8 0 8 2.00 1999-Aug-27 09:09:18 4171695.25129 872119.76318 4730014.45124 11.80799 48.17152 533.80143 -1.10245 2.73935 9.21077 -0.54205 1.41567 -1.58208 8 0 8 2.00 1999-Aug-27 09:09:18 4171695.16469 872121.05173 4730014.78341 11.80801 48.17152 534.16826 0.17655 2.82756 9.57760 0.73695 1.50387 -1.21525 8 0 8 2.00 1999-Aug-27 09:09:18 4171696.64867 872121.19256 4730016.40527 11.80801 48.17152 536.36473 0.01073 2.80533 11.77407 0.57113 1.48165 0.98122 8 0 8 2.00 1999-Aug-27 09:09:18 4171692.76552 872120.73763 4730014.38277 11.80801 48.17154 532.26070 0.36005 4.35816 7.67005 0.92045 3.03448 -3.12281 8 0 8 2.00 1999-Aug-27 09:09:18 4171695.49138 872121.53628 4730018.18595 11.80801 48.17154 536.98304 0.58400 4.78456 12.39238 1.14439 3.46088 1.59952 8 0 8 2.00 1999-Aug-27 09:09:18 4171696.93316 872121.12598 4730017.43636 11.80800 48.17153 537.30967 -0.11265 3.29562 12.71901 0.44775 1.97193 1.92616 8 0 8 2.00 1999-Aug-27 09:09:18 4171697.35095 872121.67098 4730018.84384 11.80801 48.17153 538.70555 0.33532 3.84645 14.11490 0.89572 2.52276 3.32204 8 0 8 2.00 1999-Aug-27 09:09:18 4171698.89293 872121.22674 4730019.31976 11.80800 48.17153 540.00615 -0.41506 3.10689 15.41549 0.14534 1.78320 4.62263 8 0 8 2.00 1999-Aug-27 09:09:18 4171699.15121 872121.54749 4730016.54754 11.80800 48.17151 538.15281 -0.15395 1.02080 13.56216 0.40645 -0.30289 2.76930 8 0 8 2.00 1999-Aug-27 09:09:18 4171694.90892 872119.71605 4730013.67957 11.80799 48.17152 532.99650 -1.07852 2.48162 8.40584 -0.51812 1.15794 -2.38701 8 0 8 2.00 1999-Aug-27 09:09:18 4171692.41588 872119.13610 4730013.11721 11.80799 48.17153 530.87088 -1.13603 4.01338 6.28022 -0.57564 2.68970 -4.51264 8 0 8 2.00 1999-Aug-27 09:09:18 4171699.63356 872120.55401 4730014.57715 11.80799 48.17149 536.86388 -1.22511 -0.49359 12.27323 -0.66471 -1.81728 1.48037 8 0 8 2.00 1999-Aug-27 09:09:18 4171700.85643 872120.06378 4730014.86843 11.80798 48.17149 537.81230 -1.95520 -1.11652 13.22165 -1.39481 -2.44020 2.42879 8 0 8 2.00 1999-Aug-27 09:09:18 4171701.89475 872121.33150 4730013.76763 11.80799 48.17147 537.84287 -0.92679 -2.80127 13.25221 -0.36639 -4.12496 2.45935 8 0 8 2.00 1999-Aug-27 09:09:18 4171700.18412 872122.62597 4730012.58046 11.80801 48.17147 536.01822 0.69034 -2.54268 11.42757 1.25074 -3.86637 0.63471 8 0 8 2.00 1999-Aug-27 09:09:18 4171697.57154 872120.46629 4730014.33879 11.80799 48.17151 535.32823 -0.88901 0.86481 10.73758 -0.32862 -0.45887 -0.05528 8 0 8 2.00 1999-Aug-27 09:09:18 4171700.00459 872121.36077 4730014.31739 11.80800 48.17149 537.02263 -0.51135 -1.06045 12.43197 0.04905 -2.38414 1.63911 8 0 8 2.00 1999-Aug-27 09:09:18 4171700.83364 872121.75541 4730014.81654 11.80800 48.17149 537.98962 -0.29471 -1.39244 13.39896 0.26568 -2.71613 2.60610 8 0 8 2.00 1999-Aug-27 09:09:18 4171691.05768 872120.37346 4730013.62547 11.80801 48.17154 530.53186 0.35307 5.15431 5.94120 0.91347 3.83062 -4.85166 8 0 8 2.00 1999-Aug-27 09:09:19 4171687.50657 872118.91940 4730009.49557 11.80800 48.17154 524.93791 -0.34355 5.21187 0.34725 0.21684 3.88819 -10.44560 8 0 8 2.00 1999-Aug-27 09:09:19 4171696.71721 872119.36081 4730014.10628 11.80798 48.17151 534.44641 -1.79628 1.50144 9.85576 -1.23588 0.17775 -0.93710 8 0 8 2.00 1999-Aug-27 09:09:19 4171696.31779 872118.42098 4730013.93628 11.80797 48.17151 533.93074 -2.63448 1.82270 9.34009 -2.07409 0.49901 -1.45277 8 0 8 2.00 1999-Aug-27 09:09:19 4171694.85857 872119.19354 4730014.00161 11.80798 48.17152 533.13229 -1.57967 2.81279 8.54163 -1.01927 1.48911 -2.25122 8 0 8 2.00 1999-Aug-27 09:09:19 4171696.32786 872120.53001 4730015.60726 11.80800 48.17152 535.47026 -0.57214 2.60815 10.87961 -0.01175 1.28447 0.08675 8 0 8 2.00 1999-Aug-27 09:09:19 4171695.06688 872120.80667 4730013.61388 11.80801 48.17152 533.19951 -0.04331 2.15630 8.60885 0.51709 0.83262 -2.18401 8 0 8 2.00 1999-Aug-27 09:09:19 4171697.29174 872119.77460 4730011.88774 11.80799 48.17149 533.22480 -1.50881 -0.46025 8.63414 -0.94842 -1.78393 -2.15871 8 0 8 2.00 1999-Aug-27 09:09:19 4171695.80482 872120.06301 4730012.41930 11.80799 48.17151 532.68960 -0.92223 0.93480 8.09895 -0.36184 -0.38889 -2.69391 8 0 8 2.00 1999-Aug-27 09:09:19 4171697.11970 872119.96889 4730013.32425 11.80799 48.17150 534.20942 -1.28343 0.59362 9.61877 -0.72304 -0.73007 -1.17409 8 0 8 2.00 1999-Aug-27 09:09:19 4171697.39820 872120.76331 4730013.51870 11.80800 48.17150 534.64452 -0.56281 0.39903 10.05387 -0.00241 -0.92465 -0.73899 8 0 8 2.00 1999-Aug-27 09:09:19 4171699.71186 872120.40542 4730015.27760 11.80799 48.17150 537.41665 -1.38658 -0.06091 12.82600 -0.82618 -1.38460 2.03314 8 0 8 2.00 1999-Aug-27 09:09:19 4171699.30564 872122.12980 4730014.83518 11.80801 48.17149 537.05714 0.38444 -0.32261 12.46649 0.94483 -1.64630 1.67363 8 0 8 2.00 1999-Aug-27 09:09:19 4171692.43846 872120.33396 4730012.61079 11.80801 48.17153 530.67173 0.03185 3.47653 6.08108 0.59224 2.15285 -4.71178 8 0 8 2.00 1999-Aug-27 09:09:19 4171693.21098 872121.69044 4730014.32957 11.80802 48.17153 532.64189 1.20155 3.85249 8.05123 1.76194 2.52881 -2.74162 8 0 8 2.00 1999-Aug-27 09:09:19 4171693.86721 872120.18962 4730014.45907 11.80800 48.17153 532.96195 -0.40181 3.68906 8.37129 0.15859 2.36538 -2.42157 8 0 8 2.00 1999-Aug-27 09:09:19 4171698.71781 872121.40717 4730017.22188 11.80800 48.17151 538.35323 -0.20261 1.80803 13.76257 0.35779 0.48434 2.96971 8 0 8 2.00 1999-Aug-27 09:09:19 4171699.98798 872122.00531 4730015.74601 11.80801 48.17150 538.16428 0.12295 -0.19387 13.57362 0.68335 -1.51756 2.78076 8 0 8 2.00 1999-Aug-27 09:09:19 4171702.23571 872124.12091 4730017.33868 11.80803 48.17149 541.10706 1.73383 -1.09374 16.51640 2.29422 -2.41743 5.72354 8 0 8 2.00 1999-Aug-27 09:09:19 4171703.66160 872123.93996 4730017.05561 11.80802 48.17148 541.80224 1.26492 -2.29494 17.21159 1.82532 -3.61863 6.41873 8 0 8 2.00 1999-Aug-27 09:09:19 4171700.17890 872122.19994 4730016.23255 11.80801 48.17150 538.67801 0.27440 -0.03833 14.08736 0.83480 -1.36202 3.29450 8 0 8 2.00 1999-Aug-27 09:09:19 4171697.52445 872121.64690 4730017.13141 11.80801 48.17152 537.53952 0.27625 2.58154 12.94886 0.83665 1.25786 2.15601 8 0 8 2.00 1999-Aug-27 09:09:19 4171694.37948 872120.48604 4730017.31347 11.80800 48.17154 535.46375 -0.21648 5.17383 10.87310 0.34392 3.85015 0.08024 8 0 8 2.00 1999-Aug-27 09:09:19 4171694.72972 872120.10541 4730015.28313 11.80800 48.17153 534.12754 -0.66073 3.62238 9.53688 -0.10034 2.29869 -1.25598 8 0 8 2.00 1999-Aug-27 09:09:19 4171698.19767 872120.41898 4730017.15531 11.80799 48.17152 537.82923 -1.06345 2.29369 13.23857 -0.50305 0.97000 2.44571 8 0 8 2.00 1999-Aug-27 09:09:19 4171698.26754 872119.74055 4730014.76840 11.80798 48.17150 536.00365 -1.74182 0.75434 11.41300 -1.18143 -0.56935 0.62014 8 0 8 2.00 1999-Aug-27 09:09:20 4171696.99939 872121.56118 4730012.25156 11.80801 48.17150 533.54887 0.29979 -0.27681 8.95822 0.86018 -1.60050 -1.83464 8 0 8 2.00 1999-Aug-27 09:09:20 4171694.21647 872121.07300 4730009.54888 11.80801 48.17150 529.65169 0.39141 0.02501 5.06104 0.95181 -1.29868 -5.73182 8 0 8 2.00 1999-Aug-27 09:09:20 4171695.44362 872121.88269 4730012.56076 11.80802 48.17151 532.80755 0.93286 1.01512 8.21690 1.49325 -0.30857 -2.57596 8 0 8 2.00 1999-Aug-27 09:09:20 4171694.83915 872119.52523 4730014.96864 11.80799 48.17153 533.88546 -1.25103 3.42129 9.29480 -0.69063 2.09761 -1.49805 8 0 8 2.00 1999-Aug-27 09:09:20 4171694.83635 872120.68506 4730014.91086 11.80800 48.17153 533.99886 -0.11517 3.20795 9.40820 0.44523 1.88427 -1.38466 8 0 8 2.00 1999-Aug-27 09:09:20 4171695.79298 872121.03515 4730014.69556 11.80801 48.17152 534.51068 0.03176 2.31324 9.92002 0.59216 0.98955 -0.87283 8 0 8 2.00 1999-Aug-27 09:09:20 4171697.75683 872120.14324 4730014.16804 11.80799 48.17150 535.27786 -1.24315 0.66505 10.68721 -0.68275 -0.65863 -0.10565 8 0 8 2.00 1999-Aug-27 09:09:20 4171700.33516 872120.56118 4730015.29096 11.80799 48.17149 537.85475 -1.36166 -0.53037 13.26410 -0.80127 -1.85406 2.47124 8 0 8 2.00 1999-Aug-27 09:09:20 4171698.18473 872117.92565 4730013.18441 11.80796 48.17150 534.52161 -3.50137 0.03510 9.93096 -2.94097 -1.28858 -0.86190 8 0 8 2.00 1999-Aug-27 09:09:20 4171695.52019 872119.15720 4730014.94197 11.80798 48.17152 534.25993 -1.75063 2.96289 9.66928 -1.19023 1.63920 -1.12358 8 0 8 2.00 1999-Aug-27 09:09:20 4171694.88506 872120.08880 4730014.02193 11.80800 48.17152 533.28690 -0.70877 2.67051 8.69625 -0.14838 1.34683 -2.09661 8 0 8 2.00 1999-Aug-27 09:09:20 4171693.82362 872120.37903 4730015.57385 11.80800 48.17154 533.79001 -0.20749 4.43542 9.19936 0.35291 3.11174 -1.59350 8 0 8 2.00 1999-Aug-27 09:09:20 4171693.83316 872119.22015 4730012.33073 11.80799 48.17152 531.22150 -1.34380 2.44232 6.63084 -0.78340 1.11864 -4.16201 8 0 8 2.00 1999-Aug-27 09:09:20 4171695.12240 872119.82948 4730012.90829 11.80799 48.17151 532.57663 -1.01118 1.79425 7.98597 -0.45078 0.47057 -2.80689 8 0 8 2.00 1999-Aug-27 09:09:20 4171694.42510 872119.73886 4730013.51030 11.80799 48.17152 532.55765 -0.95718 2.71815 7.96699 -0.39679 1.39446 -2.82587 8 0 8 2.00 1999-Aug-27 09:09:20 4171694.96146 872121.56456 4730012.63614 11.80802 48.17151 532.50555 0.72013 1.46557 7.91490 1.28052 0.14189 -2.87796 8 0 8 2.00 1999-Aug-27 09:09:20 4171697.88040 872121.63481 4730016.04733 11.80801 48.17151 536.96243 0.19158 1.60079 12.37178 0.75197 0.27711 1.57892 8 0 8 2.00 1999-Aug-27 09:09:20 4171700.17713 872123.03665 4730015.94819 11.80802 48.17149 538.57915 1.09376 -0.35426 13.98849 1.65416 -1.67795 3.19564 8 0 8 2.00 1999-Aug-27 09:09:20 4171699.17846 872122.03655 4730016.34697 11.80801 48.17150 538.08789 0.31919 0.79259 13.49724 0.87959 -0.53110 2.70438 8 0 8 2.00 1999-Aug-27 09:09:20 4171696.47075 872121.42370 4730014.25602 11.80801 48.17151 534.67863 0.27339 1.46651 10.08797 0.83378 0.14283 -0.70489 8 0 8 2.00 1999-Aug-27 09:09:20 4171693.84722 872120.90043 4730014.86401 11.80801 48.17153 533.34764 0.29806 3.86531 8.75699 0.85845 2.54163 -2.03587 8 0 8 2.00 1999-Aug-27 09:09:20 4171694.34839 872120.49578 4730014.82261 11.80800 48.17153 533.58873 -0.20059 3.53386 8.99808 0.35981 2.21018 -1.79478 8 0 8 2.00 1999-Aug-27 09:09:20 4171695.56278 872121.11545 4730015.15883 11.80801 48.17152 534.71657 0.15747 2.77786 10.12591 0.71787 1.45417 -0.66694 8 0 8 2.00 1999-Aug-27 09:09:20 4171688.86834 872119.94660 4730011.78669 11.80801 48.17155 527.67426 0.38325 5.58996 3.08361 0.94364 4.26627 -7.70925 8 0 8 2.00 1999-Aug-27 09:09:20 4171693.87341 872120.97816 4730013.78871 11.80801 48.17153 532.57410 0.36878 3.11724 7.98344 0.92918 1.79355 -2.80942 8 0 8 2.00 1999-Aug-27 09:09:21 4171692.49418 872120.61323 4730013.68775 11.80801 48.17153 531.54871 0.29381 4.11153 6.95805 0.85421 2.78785 -3.83480 8 0 8 2.00 1999-Aug-27 09:09:21 4171688.04342 872120.08485 4730011.73852 11.80801 48.17155 527.11874 0.68739 6.13843 2.52808 1.24778 4.81474 -8.26478 8 0 8 2.00 1999-Aug-27 09:09:21 4171690.26676 872119.77888 4730014.50173 11.80800 48.17156 530.58734 -0.06708 6.40623 5.99669 0.49332 5.08254 -4.79617 8 0 8 2.00 1999-Aug-27 09:09:21 4171694.50317 872122.32494 4730017.54632 11.80803 48.17154 535.96895 1.55819 4.95851 11.37829 2.11859 3.63482 0.58544 8 0 8 2.00 1999-Aug-27 09:09:21 4171692.79089 872120.98460 4730014.29909 11.80801 48.17154 532.24862 0.59660 4.24619 7.65797 1.15700 2.92251 -3.13489 8 0 8 2.00 1999-Aug-27 09:09:21 4171698.76090 872120.39522 4730016.70553 11.80799 48.17151 537.85850 -1.20196 1.58654 13.26785 -0.64156 0.26285 2.47499 8 0 8 2.00 1999-Aug-27 09:09:21 4171704.29728 872123.80645 4730017.80307 11.80802 48.17148 542.75595 1.00416 -2.23975 18.16530 1.56455 -3.56344 7.37244 8 0 8 2.00 1999-Aug-27 09:09:21 4171700.64259 872121.02241 4730014.97815 11.80799 48.17149 537.88529 -0.97311 -1.03355 13.29464 -0.41271 -2.35724 2.50178 8 0 8 2.00 1999-Aug-27 09:09:21 4171699.25135 872119.95723 4730013.41049 11.80798 48.17149 535.66361 -1.73104 -0.90187 11.07296 -1.17065 -2.22555 0.28010 8 0 8 2.00 1999-Aug-27 09:09:21 4171698.28300 872120.98618 4730012.00275 11.80800 48.17149 534.12293 -0.52571 -1.29130 9.53228 0.03468 -2.61499 -1.26058 8 0 8 2.00 1999-Aug-27 09:09:21 4171702.41054 872122.20164 4730014.76464 11.80800 48.17147 539.04123 -0.18061 -2.64525 14.45057 0.37979 -3.96893 3.65772 8 0 8 2.00 1999-Aug-27 09:09:21 4171700.92649 872119.24980 4730014.63659 11.80797 48.17149 537.57420 -2.76630 -1.19811 12.98354 -2.20590 -2.52180 2.19068 8 0 8 2.00 1999-Aug-27 09:09:21 4171700.93647 872120.16346 4730016.75805 11.80798 48.17150 539.28620 -1.87401 0.07010 14.69555 -1.31362 -1.25359 3.90269 8 0 8 2.00 1999-Aug-27 09:09:21 4171699.13405 872119.61011 4730016.43377 11.80798 48.17151 537.79244 -2.04682 1.25285 13.20179 -1.48642 -0.07084 2.40893 8 0 8 2.00 1999-Aug-27 09:09:21 4171698.23324 872120.78051 4730018.54953 11.80800 48.17153 538.94068 -0.71685 3.14243 14.35002 -0.15646 1.81874 3.55716 8 0 8 2.00 1999-Aug-27 09:09:21 4171698.42739 872119.73233 4730014.62931 11.80798 48.17150 536.00324 -1.78258 0.54624 11.41259 -1.22218 -0.77745 0.61973 8 0 8 2.00 1999-Aug-27 09:09:21 4171701.24371 872121.23133 4730018.80060 11.80799 48.17151 541.15449 -0.89161 1.04536 16.56383 -0.33121 -0.27833 5.77098 8 0 8 2.00 1999-Aug-27 09:09:21 4171700.03882 872122.95815 4730015.46396 11.80802 48.17149 538.11733 1.04523 -0.56435 13.52667 1.60563 -1.88804 2.73381 8 0 8 2.00 1999-Aug-27 09:09:21 4171697.74177 872121.47863 4730014.30574 11.80801 48.17150 535.55288 0.06707 0.56424 10.96223 0.62746 -0.75944 0.16937 8 0 8 2.00 1999-Aug-27 09:09:21 4171702.02315 872123.14743 4730015.99199 11.80802 48.17148 539.83197 0.82444 -1.68839 15.24132 1.38484 -3.01208 4.44846 8 0 8 2.00 1999-Aug-27 09:09:21 4171700.00113 872122.42775 4730015.48313 11.80801 48.17149 538.03462 0.53377 -0.44320 13.44397 1.09416 -1.76689 2.65111 8 0 8 2.00 1999-Aug-27 09:09:21 4171701.16441 872122.64495 4730018.18176 11.80801 48.17150 540.83451 0.50832 0.47494 16.24386 1.06872 -0.84874 5.45100 8 0 8 2.00 1999-Aug-27 09:09:21 4171697.28530 872121.05176 4730015.79983 11.80800 48.17152 536.30996 -0.25736 1.95869 11.71931 0.30304 0.63500 0.92645 8 0 8 2.00 1999-Aug-27 09:09:21 4171694.86685 872119.29764 4730013.91022 11.80799 48.17152 533.08380 -1.47947 2.72993 8.49315 -0.91907 1.40625 -2.29971 8 0 8 2.00 1999-Aug-27 09:09:21 4171693.51569 872119.52601 4730012.67172 11.80799 48.17152 531.31009 -0.97944 2.85465 6.71943 -0.41904 1.53096 -4.07343 8 0 8 2.00 1999-Aug-27 09:09:22 4171690.88592 872118.61848 4730013.90752 11.80799 48.17155 530.39040 -1.32963 5.73528 5.79974 -0.76923 4.41160 -4.99312 8 0 8 2.00 1999-Aug-27 09:09:22 4171692.52746 872119.09683 4730010.59881 11.80799 48.17152 529.06178 -1.19732 2.25845 4.47113 -0.63692 0.93477 -6.32173 8 0 8 2.00 1999-Aug-27 09:09:22 4171697.96983 872119.63185 4730016.19910 11.80798 48.17152 536.86055 -1.78730 1.94219 12.26990 -1.22691 0.61851 1.47704 8 0 8 2.00 1999-Aug-27 09:09:22 4171697.50798 872121.03459 4730016.00991 11.80800 48.17152 536.60952 -0.31974 1.93899 12.01887 0.24066 0.61531 1.22601 8 0 8 2.00 1999-Aug-27 09:09:22 4171694.63478 872119.17111 4730013.22461 11.80798 48.17152 532.40416 -1.55583 2.46125 7.81351 -0.99543 1.13757 -2.97935 8 0 8 2.00 1999-Aug-27 09:09:22 4171692.49931 872121.27124 4730014.45843 11.80802 48.17154 532.21613 0.93684 4.52143 7.62548 1.49724 3.19774 -3.16738 8 0 8 2.00 1999-Aug-27 09:09:22 4171696.61631 872121.17587 4730014.55722 11.80801 48.17151 534.96426 0.00102 1.59900 10.37361 0.56142 0.27532 -0.41925 8 0 8 2.00 1999-Aug-27 09:09:22 4171693.90220 872119.54058 4730010.59889 11.80799 48.17151 530.01982 -1.04427 1.18815 5.42917 -0.48387 -0.13554 -5.36369 8 0 8 2.00 1999-Aug-27 09:09:22 4171700.29891 872120.23397 4730014.91080 11.80798 48.17149 537.50316 -1.67453 -0.70757 12.91250 -1.11414 -2.03126 2.11964 8 0 8 2.00 1999-Aug-27 09:09:22 4171700.73872 872120.07867 4730017.23077 11.80798 48.17150 539.49778 -1.91654 0.54252 14.90713 -1.35614 -0.78117 4.11427 8 0 8 2.00 1999-Aug-27 09:09:22 4171695.39060 872119.68205 4730016.46018 11.80799 48.17153 535.37825 -1.21037 3.98988 10.78760 -0.64998 2.66620 -0.00526 8 0 8 2.00 1999-Aug-27 09:09:22 4171696.15920 872120.45485 4730016.73467 11.80800 48.17153 536.18998 -0.61120 3.49450 11.59933 -0.05081 2.17081 0.80647 8 0 8 2.00 1999-Aug-27 09:09:22 4171698.77574 872122.62338 4730016.30861 11.80802 48.17151 537.87650 0.97601 0.97126 13.28584 1.53641 -0.35243 2.49299 8 0 8 2.00 1999-Aug-27 09:09:22 4171696.06143 872121.09773 4730012.70430 11.80801 48.17150 533.21068 0.03809 0.77992 8.62003 0.59848 -0.54377 -2.17283 8 0 8 2.00 1999-Aug-27 09:09:22 4171698.80745 872123.16248 4730015.52177 11.80803 48.17150 537.38446 1.49721 0.34119 12.79381 2.05760 -0.98250 2.00095 8 0 8 2.00 1999-Aug-27 09:09:22 4171699.80683 872120.87722 4730013.81195 11.80799 48.17149 536.45092 -0.94420 -1.17957 11.86026 -0.38380 -2.50325 1.06740 8 0 8 2.00 1999-Aug-27 09:09:22 4171699.60136 872121.34962 4730012.32373 11.80800 48.17148 535.27231 -0.43975 -2.09423 10.68166 0.12065 -3.41792 -0.11120 8 0 8 2.00 1999-Aug-27 09:09:22 4171698.11557 872121.29054 4730015.23191 11.80800 48.17151 536.46136 -0.19353 0.93796 11.87070 0.36686 -0.38573 1.07785 8 0 8 2.00 1999-Aug-27 09:09:22 4171694.36863 872118.16382 4730013.70923 11.80797 48.17153 532.45407 -2.48734 3.13217 7.86341 -1.92695 1.80848 -2.92945 8 0 8 2.00 1999-Aug-27 09:09:22 4171695.40431 872120.65352 4730014.23353 11.80800 48.17152 533.86060 -0.26226 2.34679 9.26994 0.29813 1.02310 -1.52291 8 0 8 2.00 1999-Aug-27 09:09:22 4171695.10118 872120.16780 4730013.76995 11.80800 48.17152 533.25100 -0.67567 2.33278 8.66034 -0.11528 1.00910 -2.13251 8 0 8 2.00 1999-Aug-27 09:09:22 4171695.19665 872118.89598 4730012.49401 11.80798 48.17151 532.18899 -1.94012 1.60615 7.59834 -1.37972 0.28247 -3.19452 8 0 8 2.00 1999-Aug-27 09:09:22 4171697.01626 872120.78139 4730015.94960 11.80800 48.17152 536.20904 -0.46696 2.29603 11.61839 0.09344 0.97235 0.82553 8 0 8 2.00 1999-Aug-27 09:09:22 4171700.27502 872124.36651 4730017.07026 11.80804 48.17150 539.66064 2.37545 0.11987 15.06998 2.93585 -1.20381 4.27713 8 0 8 2.00 1999-Aug-27 09:09:22 4171701.59082 872125.47747 4730017.55732 11.80805 48.17149 541.03412 3.19364 -0.68442 16.44347 3.75404 -2.00810 5.65061 8 0 8 2.00 1999-Aug-27 09:09:23 4171701.74377 872123.61169 4730019.27097 11.80802 48.17150 542.15626 1.33605 0.63136 17.56561 1.89645 -0.69233 6.77275 8 0 8 2.00 1999-Aug-27 09:09:23 4171700.40382 872123.79576 4730017.35293 11.80803 48.17150 539.87746 1.79042 0.30147 15.28681 2.35082 -1.02222 4.49395 8 0 8 2.00 1999-Aug-27 09:09:23 4171703.87978 872122.47863 4730016.16442 11.80800 48.17147 541.08118 -0.21013 -2.82560 16.49052 0.35026 -4.14928 5.69766 8 0 8 2.00 1999-Aug-27 09:09:23 4171703.45808 872121.08026 4730017.96397 11.80799 48.17149 541.95598 -1.49262 -1.10466 17.36532 -0.93222 -2.42835 6.57246 8 0 8 2.00 1999-Aug-27 09:09:23 4171699.72388 872119.98180 4730016.06592 11.80798 48.17150 537.95410 -1.80369 0.52065 13.36344 -1.24329 -0.80304 2.57059 8 0 8 2.00 1999-Aug-27 09:09:23 4171698.59992 872121.33310 4730016.93166 11.80800 48.17151 538.04990 -0.25099 1.71176 13.45925 0.30941 0.38808 2.66639 8 0 8 2.00 1999-Aug-27 09:09:23 4171699.67899 872121.41363 4730016.82641 11.80800 48.17151 538.68688 -0.39298 0.84224 14.09623 0.16742 -0.48145 3.30337 8 0 8 2.00 1999-Aug-27 09:09:23 4171699.62290 872121.08301 4730015.76318 11.80800 48.17150 537.81288 -0.70512 0.22449 13.22223 -0.14473 -1.09920 2.42937 8 0 8 2.00 1999-Aug-27 09:09:23 4171701.67451 872120.80703 4730017.63286 11.80799 48.17150 540.50767 -1.39509 0.01707 15.91701 -0.83469 -1.30662 5.12415 8 0 8 2.00 1999-Aug-27 09:09:23 4171698.45889 872121.17270 4730015.58554 11.80800 48.17151 536.93290 -0.37913 0.94135 12.34224 0.18126 -0.38234 1.54938 8 0 8 2.00 1999-Aug-27 09:09:23 4171695.25417 872121.71540 4730013.26065 11.80802 48.17151 533.18257 0.80787 1.64556 8.59191 1.36826 0.32188 -2.20094 8 0 8 2.00 1999-Aug-27 09:09:23 4171692.27569 872119.24784 4730009.88592 11.80799 48.17152 528.38683 -0.99798 1.94364 3.79618 -0.43758 0.61995 -6.99668 8 0 8 2.00 1999-Aug-27 09:09:23 4171696.59465 872120.55718 4730009.69348 11.80800 48.17148 531.24150 -0.60015 -1.53450 6.65084 -0.03975 -2.85818 -4.14201 8 0 8 2.00 1999-Aug-27 09:09:23 4171693.87027 872119.94491 4730011.79914 11.80800 48.17152 530.94852 -0.64196 1.95023 6.35786 -0.08156 0.62655 -4.43499 8 0 8 2.00 1999-Aug-27 09:09:23 4171693.62076 872121.21537 4730013.03881 11.80801 48.17152 531.88275 0.65267 2.76523 7.29210 1.21307 1.44154 -3.50076 8 0 8 2.00 1999-Aug-27 09:09:23 4171697.10208 872120.62247 4730013.05306 11.80800 48.17150 534.08503 -0.64007 0.32595 9.49438 -0.07967 -0.99774 -1.29848 8 0 8 2.00 1999-Aug-27 09:09:23 4171697.20198 872122.82017 4730012.92004 11.80803 48.17150 534.35104 1.49068 -0.17073 9.76039 2.05107 -1.49442 -1.03247 8 0 8 2.00 1999-Aug-27 09:09:23 4171696.20403 872120.73201 4730014.99257 11.80800 48.17152 534.95895 -0.34908 2.25773 10.36830 0.21132 0.93405 -0.42456 8 0 8 2.00 1999-Aug-27 09:09:23 4171697.55230 872119.45140 4730016.34870 11.80798 48.17152 536.67484 -1.87850 2.37401 12.08418 -1.31810 1.05032 1.29133 8 0 8 2.00 1999-Aug-27 09:09:23 4171697.71616 872120.74176 4730013.67756 11.80800 48.17150 534.96751 -0.64897 0.27635 10.37686 -0.08857 -1.04734 -0.41600 8 0 8 2.00 1999-Aug-27 09:09:23 4171698.65261 872119.76049 4730014.52523 11.80798 48.17150 536.07655 -1.80110 0.30827 11.48589 -1.24071 -1.01542 0.69304 8 0 8 2.00 1999-Aug-27 09:09:23 4171700.77057 872121.23510 4730016.35719 11.80799 48.17150 539.02545 -0.79110 -0.23964 14.43479 -0.23070 -1.56332 3.64193 8 0 8 2.00 1999-Aug-27 09:09:23 4171698.88396 872119.69364 4730016.07676 11.80798 48.17151 537.37456 -1.91388 1.18444 12.78391 -1.35349 -0.13925 1.99105 8 0 8 2.00 1999-Aug-27 09:09:23 4171700.76840 872121.17525 4730016.74354 11.80799 48.17150 539.30375 -0.84924 0.02873 14.71310 -0.28884 -1.29496 3.92024 8 0 8 2.00 1999-Aug-27 09:09:23 4171700.63138 872121.42159 4730014.53158 11.80800 48.17149 537.59969 -0.58008 -1.38406 13.00904 -0.01968 -2.70774 2.21618 8 0 8 2.00 1999-Aug-27 09:09:24 4171702.35156 872120.64068 4730012.37503 11.80798 48.17146 537.00910 -1.69646 -3.95786 12.41844 -1.13606 -5.28154 1.62559 8 0 8 2.00 1999-Aug-27 09:09:24 4171699.91282 872119.01307 4730012.09608 11.80797 48.17148 534.98714 -2.79059 -2.11694 10.39648 -2.23020 -3.44063 -0.39637 8 0 8 2.00 1999-Aug-27 09:09:24 4171699.94506 872119.81074 4730012.63023 11.80798 48.17148 535.51505 -2.01639 -1.90586 10.92440 -1.45600 -3.22955 0.13154 8 0 8 2.00 1999-Aug-27 09:09:24 4171699.74207 872121.95179 4730014.54873 11.80801 48.17149 537.10430 0.12089 -0.80482 12.51364 0.68129 -2.12851 1.72079 8 0 8 2.00 1999-Aug-27 09:09:24 4171700.57314 872120.42580 4730014.39324 11.80798 48.17149 537.32270 -1.54287 -1.28200 12.73204 -0.98248 -2.60569 1.93918 8 0 8 2.00 1999-Aug-27 09:09:24 4171699.33310 872120.32239 4730014.09684 11.80799 48.17149 536.27823 -1.39034 -0.55944 11.68758 -0.82994 -1.88313 0.89472 8 0 8 2.00 1999-Aug-27 09:09:24 4171697.14398 872120.86363 4730014.82407 11.80800 48.17151 535.46495 -0.41259 1.43971 10.87430 0.14780 0.11603 0.08144 8 0 8 2.00 1999-Aug-27 09:09:24 4171699.48700 872120.47236 4730015.31533 11.80799 48.17150 537.30711 -1.27504 0.11805 12.71646 -0.71464 -1.20563 1.92360 8 0 8 2.00 1999-Aug-27 09:09:24 4171696.15722 872119.33904 4730012.33941 11.80798 48.17150 532.76131 -1.70300 0.73488 8.17066 -1.14260 -0.58881 -2.62220 8 0 8 2.00 1999-Aug-27 09:09:24 4171698.98685 872121.23890 4730014.84026 11.80800 48.17150 536.73124 -0.42238 0.04914 12.14059 0.13802 -1.27455 1.34773 8 0 8 2.00 1999-Aug-27 09:09:24 4171695.07266 872120.95475 4730015.36847 11.80801 48.17153 534.53090 0.10046 3.29965 9.94025 0.66086 1.97596 -0.85261 8 0 8 2.00 1999-Aug-27 09:09:24 4171698.78133 872121.41440 4730014.84369 11.80800 48.17150 536.62358 -0.20853 0.17457 12.03293 0.35187 -1.14911 1.24007 8 0 8 2.00 1999-Aug-27 09:09:24 4171697.30593 872121.39355 4730013.75679 11.80801 48.17150 534.84771 0.07297 0.52901 10.25706 0.63337 -0.79467 -0.53580 8 0 8 2.00 1999-Aug-27 09:09:24 4171697.12391 872121.11386 4730017.80195 11.80800 48.17153 537.70495 -0.16355 3.40215 13.11430 0.39685 2.07847 2.32144 8 0 8 2.00 1999-Aug-27 09:09:24 4171696.56955 872120.23107 4730016.81837 11.80799 48.17153 536.48968 -0.91422 3.28515 11.89903 -0.35382 1.96146 1.10617 8 0 8 2.00 1999-Aug-27 09:09:24 4171695.11351 872119.49595 4730017.40023 11.80799 48.17154 535.87245 -1.33583 4.84729 11.28179 -0.77543 3.52360 0.48893 8 0 8 2.00 1999-Aug-27 09:09:24 4171694.78969 872119.62586 4730014.84672 11.80799 48.17153 533.77606 -1.14240 3.36072 9.18540 -0.58200 2.03703 -1.60745 8 0 8 2.00 1999-Aug-27 09:09:24 4171700.33633 872120.75391 4730015.46899 11.80799 48.17149 538.01448 -1.17325 -0.44189 13.42382 -0.61285 -1.76557 2.63097 8 0 8 2.00 1999-Aug-27 09:09:24 4171697.01167 872121.58222 4730011.88278 11.80801 48.17149 533.28496 0.31787 -0.53492 8.69431 0.87827 -1.85860 -2.09855 8 0 8 2.00 1999-Aug-27 09:09:24 4171693.64754 872120.65812 4730011.90250 11.80801 48.17152 530.97747 0.10174 2.07286 6.38682 0.66213 0.74918 -4.40604 8 0 8 2.00 1999-Aug-27 09:09:24 4171692.26081 872120.67325 4730011.57983 11.80801 48.17152 529.83386 0.40032 2.86681 5.24321 0.96071 1.54313 -5.54965 8 0 8 2.00 1999-Aug-27 09:09:24 4171698.53981 872121.11428 4730015.80070 11.80800 48.17151 537.13807 -0.45288 1.03472 12.54742 0.10752 -0.28896 1.75456 8 0 8 2.00 1999-Aug-27 09:09:24 4171696.26879 872119.69321 4730015.05164 11.80799 48.17152 534.90348 -1.37915 2.40829 10.31283 -0.81876 1.08460 -0.48003 8 0 8 2.00 1999-Aug-27 09:09:24 4171694.69933 872118.71916 4730012.08588 11.80798 48.17151 531.53610 -2.01143 1.72366 6.94545 -1.45103 0.39998 -3.84741 8 0 8 2.00 1999-Aug-27 09:09:24 4171699.58368 872120.67641 4730013.31263 11.80799 48.17149 535.90577 -1.09509 -1.31918 11.31512 -0.53469 -2.64287 0.52226 8 0 8 2.00 1999-Aug-27 09:09:25 4171700.17170 872118.91897 4730014.17365 11.80797 48.17149 536.69138 -2.93567 -0.90588 12.10072 -2.37528 -2.22957 1.30786 8 0 8 2.00 1999-Aug-27 09:09:25 4171701.64183 872119.60517 4730013.82382 11.80797 48.17148 537.48403 -2.56483 -2.31610 12.89338 -2.00443 -3.63978 2.10052 8 0 8 2.00 1999-Aug-27 09:09:25 4171701.59558 872122.11899 4730016.02328 11.80800 48.17149 539.43582 -0.09474 -1.19885 14.84517 0.46566 -2.52253 4.05231 8 0 8 2.00 1999-Aug-27 09:09:25 4171703.61990 872121.01985 4730016.76083 11.80798 48.17148 541.15686 -1.58486 -2.01586 16.56621 -1.02447 -3.33954 5.77335 8 0 8 2.00 1999-Aug-27 09:09:25 4171701.09578 872121.60515 4730014.09368 11.80800 48.17148 537.60160 -0.49543 -2.04280 13.01094 0.06497 -3.36649 2.21808 8 0 8 2.00 1999-Aug-27 09:09:25 4171699.76782 872122.63650 4730016.47835 11.80802 48.17150 538.65239 0.78584 0.35887 14.06174 1.34623 -0.96482 3.26888 8 0 8 2.00 1999-Aug-27 09:09:25 4171694.37645 872120.50463 4730013.87324 11.80800 48.17152 532.90084 -0.19767 2.87892 8.31018 0.36273 1.55523 -2.48267 8 0 8 2.00 1999-Aug-27 09:09:25 4171690.96030 872118.32459 4730011.48687 11.80798 48.17153 528.59510 -1.63252 4.11150 4.00445 -1.07213 2.78782 -6.78841 8 0 8 2.00 1999-Aug-27 09:09:25 4171692.31018 872117.40922 4730011.46359 11.80797 48.17153 529.33403 -2.80474 3.25098 4.74337 -2.24435 1.92730 -6.04948 8 0 8 2.00 1999-Aug-27 09:09:25 4171695.52334 872118.85459 4730011.18502 11.80798 48.17150 531.42122 -2.04748 0.50122 6.83057 -1.48708 -0.82247 -3.96229 8 0 8 2.00 1999-Aug-27 09:09:25 4171696.07825 872121.17335 4730012.55148 11.80801 48.17150 533.11811 0.10865 0.65421 8.52745 0.66905 -0.66948 -2.26540 8 0 8 2.00 1999-Aug-27 09:09:25 4171693.49768 872120.90121 4730014.34574 11.80801 48.17153 532.73339 0.37035 3.77451 8.14273 0.93075 2.45083 -2.65013 8 0 8 2.00 1999-Aug-27 09:09:25 4171700.52163 872123.50052 4730019.02947 11.80803 48.17151 541.16334 1.47733 1.37866 16.57268 2.03772 0.05497 5.77982 8 0 8 2.00 1999-Aug-27 09:09:25 4171696.76605 872121.18363 4730015.45778 11.80801 48.17152 535.73412 -0.02203 2.08920 11.14347 0.53837 0.76551 0.35061 8 0 8 2.00 1999-Aug-27 09:09:25 4171693.76606 872119.32232 4730012.61168 11.80799 48.17152 531.40098 -1.23005 2.66305 6.81033 -0.66965 1.33937 -3.98253 8 0 8 2.00 1999-Aug-27 09:09:25 4171696.20759 872119.57829 4730013.34626 11.80799 48.17151 533.57709 -1.47911 1.33312 8.98644 -0.91872 0.00943 -1.80642 8 0 8 2.00 1999-Aug-27 09:09:25 4171697.28282 872122.01346 4730014.67278 11.80801 48.17151 535.59977 0.68449 1.06222 11.00912 1.24489 -0.26147 0.21626 8 0 8 2.00 1999-Aug-27 09:09:25 4171697.38868 872120.59481 4730014.87393 11.80800 48.17151 535.62516 -0.72580 1.33548 11.03451 -0.16540 0.01179 0.24165 8 0 8 2.00 1999-Aug-27 09:09:25 4171701.47703 872121.73941 4730015.89576 11.80800 48.17149 539.21161 -0.44202 -1.13954 14.62096 0.11837 -2.46322 3.82810 8 0 8 2.00 1999-Aug-27 09:09:25 4171698.56067 872121.95165 4730015.61104 11.80801 48.17150 537.12465 0.36251 0.76535 12.53399 0.92290 -0.55834 1.74113 8 0 8 2.00 1999-Aug-27 09:09:25 4171696.65831 872120.93186 4730015.95828 11.80800 48.17152 536.00237 -0.24642 2.53995 11.41171 0.31398 1.21627 0.61886 8 0 8 2.00 1999-Aug-27 09:09:25 4171698.12161 872120.99480 4730015.67877 11.80800 48.17151 536.75791 -0.48425 1.27665 12.16726 0.07614 -0.04704 1.37440 8 0 8 2.00 1999-Aug-27 09:09:25 4171699.22246 872122.04848 4730015.70174 11.80801 48.17150 537.63745 0.32186 0.32837 13.04680 0.88225 -0.99532 2.25394 8 0 8 2.00 1999-Aug-27 09:09:25 4171701.82105 872121.33286 4730013.71505 11.80799 48.17147 537.75576 -0.91038 -2.78278 13.16510 -0.34998 -4.10647 2.37224 8 0 8 2.00 1999-Aug-27 09:09:25 4171701.09452 872120.15846 4730011.31476 11.80798 48.17146 535.33265 -1.91125 -3.67456 10.74200 -1.35085 -4.99825 -0.05086 8 0 8 2.00 1999-Aug-27 09:09:26 4171699.31797 872121.96160 4730011.33167 11.80801 48.17147 534.43161 0.21727 -2.64246 9.84096 0.77767 -3.96615 -0.95190 8 0 8 2.00 1999-Aug-27 09:09:26 4171696.40654 872120.50838 4730010.91995 11.80800 48.17149 532.02594 -0.60942 -0.57192 7.43528 -0.04903 -1.89560 -3.35757 8 0 8 2.00 1999-Aug-27 09:09:26 4171697.43050 872120.78032 4730011.77655 11.80800 48.17149 533.36978 -0.55277 -0.78897 8.77913 0.00763 -2.11265 -2.01373 8 0 8 2.00 1999-Aug-27 09:09:26 4171694.44315 872121.78184 4730012.10140 11.80802 48.17151 531.79840 1.03887 1.45386 7.20774 1.59927 0.13018 -3.58511 8 0 8 2.00 1999-Aug-27 09:09:26 4171694.10709 872121.73487 4730015.54433 11.80802 48.17153 534.13810 1.06166 4.00224 9.54744 1.62205 2.67856 -1.24541 8 0 8 2.00 1999-Aug-27 09:09:26 4171695.71266 872121.88653 4730013.82285 11.80802 48.17151 533.92414 0.88156 1.65999 9.33349 1.44196 0.33631 -1.45937 8 0 8 2.00 1999-Aug-27 09:09:26 4171699.38466 872123.23049 4730016.78694 11.80803 48.17150 538.71327 1.44566 0.75356 14.12262 2.00606 -0.57013 3.32976 8 0 8 2.00 1999-Aug-27 09:09:26 4171704.47493 872124.91527 4730020.86486 11.80803 48.17149 545.30472 2.05316 -0.49648 20.71407 2.61356 -1.82017 9.92121 8 0 8 2.00 1999-Aug-27 09:09:26 4171700.20851 872122.02322 4730018.07017 11.80801 48.17151 540.04252 0.09536 1.19254 15.45186 0.65576 -0.13115 4.65900 8 0 8 2.00 1999-Aug-27 09:09:26 4171697.04585 872120.19022 4730015.12500 11.80799 48.17151 535.53323 -1.05167 1.81466 10.94257 -0.49127 0.49097 0.14972 8 0 8 2.00 1999-Aug-27 09:09:26 4171694.95298 872119.67251 4730012.73626 11.80799 48.17151 532.31642 -1.13015 1.82703 7.72577 -0.56976 0.50334 -3.06709 8 0 8 2.00 1999-Aug-27 09:09:26 4171698.15175 872120.05774 4730012.81519 11.80799 48.17149 534.51593 -1.40765 -0.51218 9.92528 -0.84725 -1.83586 -0.86758 8 0 8 2.00 1999-Aug-27 09:09:26 4171695.77711 872118.64724 4730013.51632 11.80797 48.17151 533.29574 -2.30238 1.90249 8.70508 -1.74198 0.57881 -2.08777 8 0 8 2.00 1999-Aug-27 09:09:26 4171698.30525 872120.50803 4730015.75047 11.80799 48.17151 536.86479 -0.99830 1.26475 12.27414 -0.43790 -0.05894 1.48128 8 0 8 2.00 1999-Aug-27 09:09:26 4171700.05296 872120.23959 4730013.14219 11.80798 48.17148 536.02550 -1.61870 -1.70852 11.43485 -1.05830 -3.03221 0.64199 8 0 8 2.00 1999-Aug-27 09:09:26 4171698.90391 872121.40123 4730014.81886 11.80800 48.17150 536.68330 -0.24650 0.07061 12.09265 0.31389 -1.25307 1.29979 8 0 8 2.00 1999-Aug-27 09:09:26 4171700.93193 872120.91958 4730017.11237 11.80799 48.17150 539.65044 -1.13297 0.19442 15.05979 -0.57257 -1.12927 4.26693 8 0 8 2.00 1999-Aug-27 09:09:26 4171700.82144 872120.99287 4730016.40920 11.80799 48.17150 539.06436 -1.03861 -0.20512 14.47370 -0.47822 -1.52881 3.68084 8 0 8 2.00 1999-Aug-27 09:09:26 4171698.73942 872121.03495 4730015.08746 11.80800 48.17150 536.72608 -0.57138 0.42556 12.13543 -0.01098 -0.89812 1.34257 8 0 8 2.00 1999-Aug-27 09:09:26 4171699.28037 872120.15913 4730013.84183 11.80798 48.17149 536.03151 -1.53936 -0.66616 11.44086 -0.97896 -1.98984 0.64800 8 0 8 2.00 1999-Aug-27 09:09:26 4171699.43631 872122.97877 4730017.68419 11.80802 48.17151 539.38122 1.18870 1.35265 14.79056 1.74910 0.02896 3.99771 8 0 8 2.00 1999-Aug-27 09:09:26 4171700.04339 872122.73179 4730014.54631 11.80802 48.17149 537.40564 0.82272 -1.14515 12.81498 1.38312 -2.46884 2.02213 8 0 8 2.00 1999-Aug-27 09:09:26 4171701.70405 872121.34926 4730016.74069 11.80799 48.17149 539.93616 -0.87037 -0.68214 15.34550 -0.30998 -2.00583 4.55265 8 0 8 2.00 1999-Aug-27 09:09:26 4171700.49068 872120.89603 4730015.81358 11.80799 48.17149 538.39140 -1.06572 -0.34633 13.80075 -0.50533 -1.67001 3.00789 8 0 8 2.00 1999-Aug-27 09:09:26 4171699.41637 872121.95778 4730019.48264 11.80801 48.17152 540.56897 0.19340 2.72227 15.97832 0.75380 1.39858 5.18546 8 0 8 2.00 1999-Aug-27 09:09:27 4171696.45920 872121.56947 4730015.54654 11.80801 48.17152 535.65261 0.41844 2.31336 11.06195 0.97884 0.98968 0.26910 8 0 8 2.00 1999-Aug-27 09:09:27 4171696.05996 872119.35928 4730012.55507 11.80798 48.17151 532.86128 -1.66328 0.94655 8.27063 -1.10289 -0.37714 -2.52223 8 0 8 2.00 1999-Aug-27 09:09:27 4171697.99070 872119.45592 4730014.78302 11.80798 48.17151 535.79498 -1.96378 1.00941 11.20433 -1.40338 -0.31428 0.41147 8 0 8 2.00 1999-Aug-27 09:09:27 4171696.46530 872117.33389 4730015.60471 11.80796 48.17152 535.12191 -3.72876 2.99355 10.53125 -3.16836 1.66987 -0.26161 8 0 8 2.00 1999-Aug-27 09:09:27 4171697.96490 872118.64645 4730018.65970 11.80797 48.17153 538.55637 -2.75084 3.73702 13.96571 -2.19044 2.41334 3.17285 8 0 8 2.00 1999-Aug-27 09:09:27 4171696.15191 872118.71406 4730015.46478 11.80797 48.17152 535.00141 -2.31366 2.91836 10.41075 -1.75327 1.59467 -0.38210 8 0 8 2.00 1999-Aug-27 09:09:27 4171695.06855 872119.28133 4730013.36696 11.80798 48.17152 532.80844 -1.53671 2.22300 8.21779 -0.97631 0.89931 -2.57507 8 0 8 2.00 1999-Aug-27 09:09:27 4171694.93976 872119.04421 4730012.44017 11.80798 48.17151 532.00141 -1.74245 1.73501 7.41076 -1.18206 0.41132 -3.38210 8 0 8 2.00 1999-Aug-27 09:09:27 4171693.96270 872120.09494 4730011.79726 11.80800 48.17151 531.02793 -0.51402 1.85868 6.43728 0.04637 0.53500 -4.35558 8 0 8 2.00 1999-Aug-27 09:09:27 4171695.67092 872120.01580 4730015.35043 11.80799 48.17152 534.77987 -0.94104 2.99443 10.18921 -0.38064 1.67075 -0.60365 8 0 8 2.00 1999-Aug-27 09:09:27 4171695.51089 872119.89420 4730015.16401 11.80799 48.17152 534.51989 -1.02733 3.00537 9.92924 -0.46693 1.68168 -0.86362 8 0 8 2.00 1999-Aug-27 09:09:27 4171698.79940 872119.96533 4730016.72082 11.80798 48.17151 537.83636 -1.63064 1.63421 13.24570 -1.07024 0.31052 2.45284 8 0 8 2.00 1999-Aug-27 09:09:27 4171696.28314 872120.13448 4730013.15202 11.80799 48.17151 533.55758 -0.95015 1.06367 8.96693 -0.38976 -0.26001 -1.82593 8 0 8 2.00 1999-Aug-27 09:09:27 4171696.37664 872120.81522 4730012.71253 11.80800 48.17150 533.38403 -0.30296 0.59858 8.79338 0.25744 -0.72511 -1.99948 8 0 8 2.00 1999-Aug-27 09:09:27 4171698.21921 872121.44258 4730014.95401 11.80800 48.17150 536.34269 -0.06592 0.65384 11.75203 0.49448 -0.66984 0.95917 8 0 8 2.00 1999-Aug-27 09:09:27 4171697.67009 872121.57648 4730015.44628 11.80801 48.17151 536.36931 0.17752 1.36224 11.77865 0.73792 0.03855 0.98580 8 0 8 2.00 1999-Aug-27 09:09:27 4171696.21850 872123.88290 4730015.26992 11.80804 48.17152 535.60507 2.73217 1.95169 11.01441 3.29257 0.62800 0.22156 8 0 8 2.00 1999-Aug-27 09:09:27 4171693.60003 872122.60285 4730013.26021 11.80803 48.17152 532.22354 2.01503 2.71644 7.63289 2.57543 1.39275 -3.15997 8 0 8 2.00 1999-Aug-27 09:09:27 4171696.14842 872121.04628 4730016.20840 11.80801 48.17153 535.87151 -0.03009 3.06121 11.28086 0.53031 1.73752 0.48800 8 0 8 2.00 1999-Aug-27 09:09:27 4171697.47505 872120.07692 4730012.68315 11.80799 48.17150 533.97842 -1.25040 -0.10959 9.38777 -0.69000 -1.43328 -1.40509 8 0 8 2.00 1999-Aug-27 09:09:27 4171702.50503 872120.68762 4730016.92825 11.80798 48.17149 540.50850 -1.68192 -1.04039 15.91784 -1.12152 -2.36408 5.12498 8 0 8 2.00 1999-Aug-27 09:09:27 4171698.63401 872120.95423 4730016.25924 11.80800 48.17151 537.51940 -0.62882 1.29623 12.92874 -0.06842 -0.02746 2.13589 8 0 8 2.00 1999-Aug-27 09:09:27 4171701.02259 872119.93443 4730017.69381 11.80798 48.17150 540.00843 -2.11581 0.66627 15.41778 -1.55542 -0.65742 4.62492 8 0 8 2.00 1999-Aug-27 09:09:27 4171699.32600 872119.42852 4730013.73535 11.80798 48.17149 535.88225 -2.26385 -0.65904 11.29160 -1.70345 -1.98273 0.49874 8 0 8 2.00 1999-Aug-27 09:09:27 4171698.68327 872120.18889 4730015.34896 11.80799 48.17150 536.76883 -1.38804 0.76992 12.17817 -0.82764 -0.55376 1.38531 8 0 8 2.00 1999-Aug-27 09:09:28 4171697.81165 872120.76137 4730018.39320 11.80800 48.17153 538.54636 -0.64931 3.34859 13.95571 -0.08891 2.02490 3.16285 8 0 8 2.00 1999-Aug-27 09:09:28 4171700.60618 872121.04086 4730021.54642 11.80799 48.17153 542.75835 -0.94759 3.37060 18.16769 -0.38720 2.04691 7.37484 8 0 8 2.00 1999-Aug-27 09:09:28 4171696.55047 872120.56249 4730016.21715 11.80800 48.17152 536.07446 -0.58591 2.84757 11.48381 -0.02551 1.52388 0.69095 8 0 8 2.00 1999-Aug-27 09:09:28 4171694.77522 872120.24503 4730015.14350 11.80800 48.17153 534.07225 -0.53337 3.47478 9.48160 0.02702 2.15109 -1.31126 8 0 8 2.00 1999-Aug-27 09:09:28 4171696.01890 872119.72846 4730014.84175 11.80799 48.17152 534.58876 -1.29351 2.44520 9.99811 -0.73311 1.12152 -0.79475 8 0 8 2.00 1999-Aug-27 09:09:28 4171692.69495 872118.97234 4730011.15892 11.80799 48.17152 529.57150 -1.35344 2.52881 4.98084 -0.79304 1.20512 -5.81202 8 0 8 2.00 1999-Aug-27 09:09:28 4171692.84649 872118.15827 4730012.32221 11.80798 48.17153 530.42615 -2.18130 3.31822 5.83549 -1.62090 1.99453 -4.95736 8 0 8 2.00 1999-Aug-27 09:09:28 4171696.33167 872118.55329 4730012.19501 11.80797 48.17150 532.66036 -2.50781 0.63114 8.06970 -1.94742 -0.69254 -2.72315 8 0 8 2.00 1999-Aug-27 09:09:28 4171695.04953 872118.10498 4730012.07460 11.80797 48.17151 531.67249 -2.68428 1.55437 7.08184 -2.12388 0.23068 -3.71102 8 0 8 2.00 1999-Aug-27 09:09:28 4171699.57214 872119.16545 4730015.97531 11.80797 48.17150 537.67612 -2.57171 0.69537 13.08547 -2.01132 -0.62831 2.29261 8 0 8 2.00 1999-Aug-27 09:09:28 4171695.58995 872119.68773 4730014.33659 11.80799 48.17152 533.92678 -1.24560 2.42738 9.33613 -0.68520 1.10370 -1.45673 8 0 8 2.00 1999-Aug-27 09:09:28 4171697.64843 872119.82537 4730015.04305 11.80799 48.17151 535.81574 -1.53211 1.37613 11.22508 -0.97171 0.05245 0.43223 8 0 8 2.00 1999-Aug-27 09:09:28 4171701.31873 872121.92283 4730014.67684 11.80800 48.17148 538.22503 -0.23009 -1.86494 13.63438 0.33030 -3.18863 2.84152 8 0 8 2.00 1999-Aug-27 09:09:28 4171698.23280 872121.40446 4730011.13211 11.80800 48.17148 533.49849 -0.10601 -1.89910 8.90784 0.45438 -3.22278 -1.88502 8 0 8 2.00 1999-Aug-27 09:09:28 4171694.48574 872121.28277 4730010.63185 11.80801 48.17150 530.66307 0.54164 0.51885 6.07241 1.10204 -0.80483 -4.72045 8 0 8 2.00 1999-Aug-27 09:09:28 4171696.98661 872121.61651 4730012.85476 11.80801 48.17150 533.99754 0.35656 0.12635 9.40689 0.91696 -1.19733 -1.38597 8 0 8 2.00 1999-Aug-27 09:09:28 4171694.55711 872118.29822 4730012.32549 11.80797 48.17152 531.56436 -2.39436 2.05138 6.97371 -1.83396 0.72769 -3.81915 8 0 8 2.00 1999-Aug-27 09:09:28 4171697.21519 872118.78904 4730014.14288 11.80797 48.17151 534.72073 -2.45785 1.24983 10.13008 -1.89746 -0.07386 -0.66278 8 0 8 2.00 1999-Aug-27 09:09:28 4171698.48884 872120.82997 4730014.59317 11.80800 48.17150 536.16621 -0.72074 0.30995 11.57556 -0.16034 -1.01374 0.78270 8 0 8 2.00 1999-Aug-27 09:09:28 4171697.02598 872120.55191 4730014.79281 11.80800 48.17151 535.32210 -0.69357 1.55246 10.73144 -0.13317 0.22878 -0.06142 8 0 8 2.00 1999-Aug-27 09:09:28 4171700.54880 872121.67153 4730015.83830 11.80800 48.17149 538.55359 -0.31852 -0.49048 13.96294 0.24187 -1.81416 3.17008 8 0 8 2.00 1999-Aug-27 09:09:28 4171696.20338 872119.55454 4730013.78848 11.80799 48.17151 533.90062 -1.50150 1.63473 9.30996 -0.94110 0.31105 -1.48289 8 0 8 2.00 1999-Aug-27 09:09:28 4171691.21962 872118.09963 4730010.26796 11.80798 48.17153 527.82542 -1.90578 3.14377 3.23476 -1.34538 1.82008 -7.55809 8 0 8 2.00 1999-Aug-27 09:09:28 4171692.95673 872120.63511 4730013.86484 11.80801 48.17153 531.98560 0.22058 3.88892 7.39494 0.78097 2.56524 -3.39791 8 0 8 2.00 1999-Aug-27 09:09:28 4171694.66149 872120.50710 4730012.95803 11.80800 48.17152 532.40528 -0.25358 2.06027 7.81463 0.30682 0.73659 -2.97823 8 0 8 2.00 1999-Aug-27 09:09:29 4171693.61758 872120.41291 4730015.09486 11.80800 48.17154 533.30322 -0.13215 4.26110 8.71257 0.42824 2.93742 -2.08029 8 0 8 2.00 1999-Aug-27 09:09:29 4171697.51818 872120.61940 4730014.24136 11.80800 48.17151 535.24169 -0.72823 0.81540 10.65104 -0.16783 -0.50828 -0.14182 8 0 8 2.00 1999-Aug-27 09:09:29 4171697.58106 872119.94106 4730013.36511 11.80799 48.17150 534.53723 -1.40508 0.28861 9.94658 -0.84468 -1.03508 -0.84628 8 0 8 2.00 1999-Aug-27 09:09:29 4171696.05111 872121.86420 4730014.46920 11.80802 48.17151 534.62366 0.79044 1.84759 10.03300 1.35084 0.52390 -0.75986 8 0 8 2.00 1999-Aug-27 09:09:29 4171695.85753 872121.21044 4730014.27483 11.80801 48.17152 534.26324 0.19013 1.95885 9.67259 0.75052 0.63516 -1.12027 8 0 8 2.00 1999-Aug-27 09:09:29 4171692.62293 872118.65308 4730013.37197 11.80798 48.17153 531.12995 -1.65121 4.10591 6.53930 -1.09081 2.78223 -4.25356 8 0 8 2.00 1999-Aug-27 09:09:29 4171695.36568 872119.93707 4730017.84636 11.80799 48.17154 536.42969 -0.95565 4.89362 11.83903 -0.39525 3.56993 1.04617 8 0 8 2.00 1999-Aug-27 09:09:29 4171697.22642 872118.70625 4730016.93136 11.80797 48.17153 536.79459 -2.54118 3.11390 12.20394 -1.98079 1.79022 1.41108 8 0 8 2.00 1999-Aug-27 09:09:29 4171695.95607 872119.34787 4730015.31159 11.80798 48.17152 534.84592 -1.65319 2.86240 10.25526 -1.09280 1.53871 -0.53759 8 0 8 2.00 1999-Aug-27 09:09:29 4171698.15542 872121.46849 4730016.73285 11.80801 48.17151 537.63008 -0.02751 1.88273 13.03942 0.53289 0.55905 2.24657 8 0 8 2.00 1999-Aug-27 09:09:29 4171701.43723 872124.23937 4730020.38486 11.80803 48.17151 542.87182 2.01317 1.50209 18.28117 2.57357 0.17840 7.48831 8 0 8 2.00 1999-Aug-27 09:09:29 4171700.96003 872124.10109 4730019.91533 11.80803 48.17151 542.19158 1.97547 1.55810 17.60092 2.53587 0.23442 6.80807 8 0 8 2.00 1999-Aug-27 09:09:29 4171702.38031 872123.37573 4730020.69746 11.80802 48.17151 543.60253 0.97482 1.15439 19.01187 1.53522 -0.16930 8.21901 8 0 8 2.00 1999-Aug-27 09:09:29 4171698.58910 872122.10236 4730016.36782 11.80801 48.17151 537.72768 0.50421 1.22632 13.13702 1.06460 -0.09737 2.34417 8 0 8 2.00 1999-Aug-27 09:09:29 4171696.50006 872121.11585 4730014.25520 11.80801 48.17151 534.65514 -0.03394 1.49153 10.06448 0.52646 0.16784 -0.72837 8 0 8 2.00 1999-Aug-27 09:09:29 4171693.65296 872119.99769 4730013.74967 11.80800 48.17153 532.26729 -0.54583 3.40149 7.67664 0.01457 2.07781 -3.11622 8 0 8 2.00 1999-Aug-27 09:09:29 4171696.20766 872122.53795 4730015.28874 11.80802 48.17152 535.42847 1.41790 2.17723 10.83782 1.97829 0.85355 0.04496 8 0 8 2.00 1999-Aug-27 09:09:29 4171696.57512 872120.04048 4730014.10466 11.80799 48.17151 534.44520 -1.10192 1.50036 9.85455 -0.54152 0.17667 -0.93831 8 0 8 2.00 1999-Aug-27 09:09:29 4171697.90060 872120.73898 4730015.98371 11.80800 48.17151 536.80596 -0.68943 1.68023 12.21530 -0.12903 0.35654 1.42245 8 0 8 2.00 1999-Aug-27 09:09:29 4171700.46014 872120.72117 4730014.75355 11.80799 48.17149 537.55772 -1.23063 -1.00433 12.96707 -0.67023 -2.32801 2.17421 8 0 8 2.00 1999-Aug-27 09:09:29 4171700.57415 872121.85123 4730013.63979 11.80800 48.17148 536.95645 -0.14781 -2.00256 12.36580 0.41258 -3.32625 1.57294 8 0 8 2.00 1999-Aug-27 09:09:29 4171699.25826 872121.05627 4730015.58189 11.80800 48.17150 537.43611 -0.65668 0.37363 12.84546 -0.09628 -0.95006 2.05260 8 0 8 2.00 1999-Aug-27 09:09:29 4171695.72956 872121.47831 4730013.70623 11.80801 48.17151 533.79256 0.47852 1.63214 9.20191 1.03891 0.30845 -1.59095 8 0 8 2.00 1999-Aug-27 09:09:29 4171694.17733 872120.59947 4730012.70734 11.80800 48.17152 531.91503 -0.06409 2.23214 7.32438 0.49631 0.90846 -3.46848 8 0 8 2.00 1999-Aug-27 09:09:29 4171696.88305 872121.03559 4730013.59697 11.80800 48.17150 534.40372 -0.19087 0.78544 9.81306 0.36952 -0.53824 -0.97979 8 0 8 2.00 1999-Aug-27 09:09:30 4171701.64269 872122.38415 4730015.59587 11.80801 48.17148 539.18428 0.15517 -1.55868 14.59363 0.71557 -2.88236 3.80077 8 0 8 2.00 1999-Aug-27 09:09:30 4171699.24056 872122.70098 4730014.06409 11.80802 48.17149 536.51803 0.95685 -0.87648 11.92737 1.51725 -2.20016 1.13452 8 0 8 2.00 1999-Aug-27 09:09:30 4171694.70063 872121.52782 4730015.74840 11.80802 48.17153 534.64936 0.73753 3.73700 10.05871 1.29793 2.41331 -0.73415 8 0 8 2.00 1999-Aug-27 09:09:30 4171694.29301 872120.14778 4730015.58621 11.80800 48.17153 534.07408 -0.52989 4.13657 9.48342 0.03050 2.81289 -1.30943 8 0 8 2.00 1999-Aug-27 09:09:30 4171696.63353 872120.91509 4730013.77828 11.80800 48.17151 534.35949 -0.25777 1.10673 9.76884 0.30263 -0.21695 -1.02402 8 0 8 2.00 1999-Aug-27 09:09:30 4171697.17595 872121.12871 4730014.31358 11.80800 48.17151 535.14161 -0.15966 1.03552 10.55095 0.40074 -0.28816 -0.24190 8 0 8 2.00 1999-Aug-27 09:09:30 4171695.34992 872121.92875 4730013.10972 11.80802 48.17151 533.16173 0.99712 1.44254 8.57107 1.55751 0.11885 -2.22178 8 0 8 2.00 1999-Aug-27 09:09:30 4171697.38489 872122.19903 4730014.86162 11.80802 48.17151 535.83244 0.84525 1.08542 11.24179 1.40565 -0.23827 0.44893 8 0 8 2.00 1999-Aug-27 09:09:30 4171699.23888 872121.79720 4730017.57226 11.80801 48.17151 539.00769 0.07254 1.60216 14.41703 0.63294 0.27848 3.62418 8 0 8 2.00 1999-Aug-27 09:09:30 4171699.17776 872120.17996 4730017.82589 11.80799 48.17152 538.93608 -1.49797 2.06249 14.34542 -0.93758 0.73881 3.55257 8 0 8 2.00 1999-Aug-27 09:09:30 4171695.51540 872119.58019 4730016.51864 11.80799 48.17153 535.48938 -1.33561 3.95337 10.89872 -0.77521 2.62968 0.10587 8 0 8 2.00 1999-Aug-27 09:09:30 4171697.54801 872120.21206 4730019.09315 11.80799 48.17153 538.82086 -1.13305 4.09143 14.23021 -0.57265 2.76775 3.43735 8 0 8 2.00 1999-Aug-27 09:09:30 4171696.67689 872119.21265 4730015.34537 11.80798 48.17152 535.32317 -1.93305 2.37980 10.73252 -1.37265 1.05611 -0.06034 8 0 8 2.00 1999-Aug-27 09:09:30 4171692.89505 872118.40925 4730012.50340 11.80798 48.17153 530.62711 -1.94556 3.36536 6.03645 -1.38516 2.04168 -4.75641 8 0 8 2.00 1999-Aug-27 09:09:30 4171695.08675 872118.05343 4730010.81661 11.80797 48.17150 530.75237 -2.74235 0.69612 6.16171 -2.18195 -0.62756 -4.63115 8 0 8 2.00 1999-Aug-27 09:09:30 4171696.36912 872120.50320 4730015.79200 11.80800 48.17152 535.63119 -0.60683 2.70535 11.04054 -0.04643 1.38167 0.24768 8 0 8 2.00 1999-Aug-27 09:09:30 4171701.01218 872121.86039 4730021.49231 11.80800 48.17152 543.09490 -0.22848 2.91342 18.50425 0.33192 1.58973 7.71139 8 0 8 2.00 1999-Aug-27 09:09:30 4171697.22442 872119.82387 4730017.16852 11.80799 48.17153 537.12252 -1.44681 3.10311 12.53186 -0.88641 1.77942 1.73900 8 0 8 2.00 1999-Aug-27 09:09:30 4171700.43027 872121.72800 4730016.55302 11.80800 48.17150 539.01649 -0.23899 0.06401 14.42583 0.32140 -1.25967 3.63298 8 0 8 2.00 1999-Aug-27 09:09:30 4171699.07333 872122.59923 4730019.15486 11.80802 48.17152 540.18834 0.89148 2.65606 15.59768 1.45187 1.33238 4.80483 8 0 8 2.00 1999-Aug-27 09:09:30 4171692.73917 872121.47573 4730015.60356 11.80802 48.17154 533.25390 1.08792 5.07898 8.66325 1.64832 3.75530 -2.12961 8 0 8 2.00 1999-Aug-27 09:09:30 4171692.60237 872120.97868 4730015.80892 11.80801 48.17155 533.24979 0.62938 5.39151 8.65914 1.18978 4.06782 -2.13372 8 0 8 2.00 1999-Aug-27 09:09:30 4171690.60725 872121.56083 4730013.58654 11.80803 48.17155 530.37085 1.60749 5.27582 5.78019 2.16788 3.95213 -5.01267 8 0 8 2.00 1999-Aug-27 09:09:30 4171688.60919 872119.24947 4730009.20002 11.80800 48.17154 525.48251 -0.24610 4.16022 0.89185 0.31430 2.83654 -9.90101 8 0 8 2.00 1999-Aug-27 09:09:30 4171692.56569 872119.97236 4730012.02702 11.80800 48.17153 530.27045 -0.34813 3.04954 5.67980 0.21227 1.72586 -5.11306 8 0 8 2.00 1999-Aug-27 09:09:31 4171697.72143 872120.52088 4730014.62973 11.80799 48.17151 535.65032 -0.86626 0.94119 11.05966 -0.30586 -0.38250 0.26681 8 0 8 2.00 1999-Aug-27 09:09:31 4171701.15804 872120.80975 4730014.24601 11.80799 48.17148 537.64720 -1.28674 -1.86534 13.05655 -0.72634 -3.18903 2.26369 8 0 8 2.00 1999-Aug-27 09:09:31 4171697.07844 872119.06255 4730011.97287 11.80798 48.17150 533.05182 -2.16215 -0.13933 8.46117 -1.60175 -1.46301 -2.33169 8 0 8 2.00 1999-Aug-27 09:09:31 4171695.66382 872119.86198 4730011.95801 11.80799 48.17150 532.22639 -1.09016 0.76066 7.63574 -0.52976 -0.56303 -3.15712 8 0 8 2.00 1999-Aug-27 09:09:31 4171696.86800 872120.08411 4730012.87469 11.80799 48.17150 533.72584 -1.11914 0.45982 9.13519 -0.55874 -0.86387 -1.65767 8 0 8 2.00 1999-Aug-27 09:09:31 4171693.62714 872120.05147 4730011.93252 11.80800 48.17152 530.90373 -0.48790 2.20027 6.31308 0.07249 0.87658 -4.47978 8 0 8 2.00 1999-Aug-27 09:09:31 4171696.07608 872122.50109 4730014.29490 11.80802 48.17151 534.59699 1.40875 1.61603 10.00634 1.96914 0.29234 -0.78652 8 0 8 2.00 1999-Aug-27 09:09:31 4171697.83145 872122.55249 4730018.26177 11.80802 48.17152 538.70579 1.09985 2.97338 14.11513 1.66025 1.64969 3.32227 8 0 8 2.00 1999-Aug-27 09:09:31 4171697.66400 872122.31454 4730017.84333 11.80802 48.17152 538.25221 0.90120 2.85274 13.66156 1.46160 1.52905 2.86870 8 0 8 2.00 1999-Aug-27 09:09:31 4171695.66755 872122.91343 4730016.86073 11.80803 48.17153 536.29850 1.89596 3.56228 11.70785 2.45635 2.23860 0.91499 8 0 8 2.00 1999-Aug-27 09:09:31 4171694.01567 872121.70181 4730015.01432 11.80802 48.17153 533.67897 1.04800 3.72050 9.08832 1.60840 2.39681 -1.70454 8 0 8 2.00 1999-Aug-27 09:09:31 4171696.68720 872120.51201 4730018.08785 11.80800 48.17153 537.55077 -0.66330 4.00311 12.96012 -0.10290 2.67942 2.16726 8 0 8 2.00 1999-Aug-27 09:09:31 4171698.63840 872120.13718 4730016.25562 11.80799 48.17151 537.40807 -1.42947 1.41519 12.81741 -0.86908 0.09150 2.02456 8 0 8 2.00 1999-Aug-27 09:09:31 4171694.42403 872119.46304 4730014.68014 11.80799 48.17153 533.39101 -1.22695 3.54116 8.80035 -0.66656 2.21747 -1.99250 8 0 8 2.00 1999-Aug-27 09:09:31 4171696.14758 872119.90882 4730014.70763 11.80799 48.17152 534.59745 -1.14330 2.23440 10.00679 -0.58291 0.91071 -0.78607 8 0 8 2.00 1999-Aug-27 09:09:31 4171696.38179 872119.79404 4730013.91005 11.80799 48.17151 534.14036 -1.30358 1.54916 9.54971 -0.74318 0.22547 -1.24315 8 0 8 2.00 1999-Aug-27 09:09:31 4171696.71602 872119.75736 4730013.90662 11.80799 48.17151 534.35098 -1.40788 1.30869 9.76033 -0.84748 -0.01499 -1.03253 8 0 8 2.00 1999-Aug-27 09:09:31 4171695.07836 872119.44341 4730012.17439 11.80799 48.17151 531.94832 -1.38007 1.39580 7.35767 -0.81967 0.07211 -3.43519 8 0 8 2.00 1999-Aug-27 09:09:31 4171698.26005 872119.83954 4730014.42735 11.80798 48.17150 535.75814 -1.64340 0.51726 11.16748 -1.08300 -0.80643 0.37462 8 0 8 2.00 1999-Aug-27 09:09:31 4171700.50436 872121.49937 4730016.69636 11.80800 48.17150 539.14046 -0.47795 0.14043 14.54981 0.08244 -1.18326 3.75695 8 0 8 2.00 1999-Aug-27 09:09:31 4171696.76335 872122.03322 4730017.33534 11.80802 48.17153 537.24735 0.81014 3.21377 12.65670 1.37053 1.89008 1.86384 8 0 8 2.00 1999-Aug-27 09:09:31 4171695.66942 872122.27058 4730016.34227 11.80802 48.17153 535.82566 1.26632 3.31318 11.23501 1.82672 1.98949 0.44215 8 0 8 2.00 1999-Aug-27 09:09:31 4171695.55052 872121.58596 4730017.65062 11.80801 48.17154 536.62952 0.62052 4.37684 12.03887 1.18092 3.05315 1.24601 8 0 8 2.00 1999-Aug-27 09:09:31 4171695.18186 872121.93718 4730018.07277 11.80802 48.17154 536.75136 1.03975 4.87370 12.16070 1.60015 3.55002 1.36785 8 0 8 2.00 1999-Aug-27 09:09:31 4171696.97378 872121.52652 4730016.88373 11.80801 48.17152 536.97906 0.27110 2.83636 12.38840 0.83150 1.51267 1.59554 8 0 8 2.00 1999-Aug-27 09:09:32 4171697.21127 872121.30171 4730016.57533 11.80801 48.17152 536.87361 0.00245 2.49176 12.28295 0.56285 1.16807 1.49010 8 0 8 2.00 1999-Aug-27 09:09:32 4171702.00213 872121.22742 4730019.01515 11.80799 48.17150 541.80891 -1.05063 0.63586 17.21826 -0.49024 -0.68783 6.42540 8 0 8 2.00 1999-Aug-27 09:09:32 4171699.91229 872119.79111 4730017.20794 11.80798 48.17151 538.90204 -2.02890 1.17393 14.31138 -1.46850 -0.14976 3.51853 8 0 8 2.00 1999-Aug-27 09:09:32 4171696.78514 872120.07854 4730012.13567 11.80799 48.17150 533.12032 -1.10764 0.02825 8.52967 -0.54724 -1.29543 -2.26319 8 0 8 2.00 1999-Aug-27 09:09:32 4171694.50918 872121.14374 4730010.13249 11.80801 48.17150 530.28730 0.40075 0.18993 5.69665 0.96115 -1.13376 -5.09621 8 0 8 2.00 1999-Aug-27 09:09:32 4171690.82123 872120.15686 4730008.30173 11.80801 48.17151 526.38098 0.18943 1.80937 1.79033 0.74983 0.48569 -9.00253 8 0 8 2.00 1999-Aug-27 09:09:32 4171694.96114 872121.10898 4730011.62040 11.80801 48.17151 531.68630 0.27424 0.85787 7.09565 0.83464 -0.46581 -3.69721 8 0 8 2.00 1999-Aug-27 09:09:32 4171693.94699 872121.56118 4730011.79999 11.80802 48.17151 531.21980 0.92441 1.64839 6.62915 1.48480 0.32470 -4.16371 8 0 8 2.00 1999-Aug-27 09:09:32 4171692.86553 872120.49465 4730012.77481 11.80801 48.17153 531.09467 0.10175 3.24991 6.50401 0.66215 1.92623 -4.28884 8 0 8 2.00 1999-Aug-27 09:09:32 4171695.47049 872120.50442 4730012.46803 11.80800 48.17151 532.56791 -0.42175 1.14383 7.97725 0.13865 -0.17985 -2.81560 8 0 8 2.00 1999-Aug-27 09:09:32 4171696.65905 872120.46183 4730013.36098 11.80800 48.17151 534.00335 -0.70666 0.87893 9.41269 -0.14626 -0.44475 -1.38017 8 0 8 2.00 1999-Aug-27 09:09:32 4171699.24414 872120.41123 4730013.99637 11.80799 48.17149 536.15743 -1.28518 -0.57511 11.56677 -0.72478 -1.89879 0.77392 8 0 8 2.00 1999-Aug-27 09:09:32 4171698.00759 872120.14192 4730013.39024 11.80799 48.17150 534.86181 -1.29575 -0.03636 10.27115 -0.73535 -1.36004 -0.52171 8 0 8 2.00 1999-Aug-27 09:09:32 4171698.83099 872120.17939 4730014.34490 11.80799 48.17150 536.11579 -1.42757 -0.00598 11.52513 -0.86717 -1.32966 0.73227 8 0 8 2.00 1999-Aug-27 09:09:32 4171701.98181 872119.91313 4730015.72577 11.80797 48.17149 539.16523 -2.33295 -1.34260 14.57457 -1.77255 -2.66629 3.78172 8 0 8 2.00 1999-Aug-27 09:09:32 4171694.15948 872119.82836 4730013.69402 11.80799 48.17152 532.53337 -0.81522 3.02076 7.94271 -0.25483 1.69708 -2.85015 8 0 8 2.00 1999-Aug-27 09:09:32 4171698.92632 872119.53374 4730014.11297 11.80798 48.17150 535.91709 -2.07906 -0.13174 11.32643 -1.51866 -1.45543 0.53358 8 0 8 2.00 1999-Aug-27 09:09:32 4171698.76445 872120.87921 4730014.03623 11.80800 48.17150 535.93785 -0.72894 -0.27001 11.34720 -0.16854 -1.59370 0.55434 8 0 8 2.00 1999-Aug-27 09:09:32 4171696.84013 872122.10972 4730015.42929 11.80802 48.17151 535.88764 0.86931 1.87495 11.29698 1.42970 0.55127 0.50413 8 0 8 2.00 1999-Aug-27 09:09:32 4171694.69114 872121.20485 4730013.63208 11.80801 48.17152 533.02213 0.42334 2.38178 8.43147 0.98373 1.05810 -2.36139 8 0 8 2.00 1999-Aug-27 09:09:32 4171693.53303 872121.67741 4730014.34000 11.80802 48.17153 532.85811 1.12288 3.62654 8.26745 1.68328 2.30285 -2.52540 8 0 8 2.00 1999-Aug-27 09:09:32 4171693.42338 872120.81205 4730013.56786 11.80801 48.17153 532.09308 0.29827 3.32353 7.50242 0.85867 1.99984 -3.29044 8 0 8 2.00 1999-Aug-27 09:09:32 4171697.62425 872121.90305 4730015.77275 11.80801 48.17151 536.62722 0.50656 1.56360 12.03657 1.06695 0.23992 1.24371 8 0 8 2.00 1999-Aug-27 09:09:32 4171699.26241 872121.29853 4730015.65849 11.80800 48.17150 537.52896 -0.42039 0.38475 12.93831 0.14001 -0.93894 2.14545 8 0 8 2.00 1999-Aug-27 09:09:32 4171697.72917 872119.77985 4730013.72279 11.80798 48.17150 534.87844 -1.59319 0.44370 10.28779 -1.03279 -0.87999 -0.50507 8 0 8 2.00 1999-Aug-27 09:09:33 4171699.42492 872118.90979 4730012.88667 11.80797 48.17149 535.24365 -2.79184 -1.21809 10.65300 -2.23144 -2.54177 -0.13986 8 0 8 2.00 1999-Aug-27 09:09:33 4171697.62183 872120.39743 4730015.52709 11.80799 48.17151 536.23712 -0.96671 1.63111 11.64647 -0.40632 0.30743 0.85361 8 0 8 2.00 1999-Aug-27 09:09:33 4171699.40322 872121.44393 4730018.48316 11.80800 48.17152 539.74551 -0.30688 2.14365 15.15486 0.25352 0.81997 4.36200 8 0 8 2.00 1999-Aug-27 09:09:33 4171696.50861 872119.38235 4730016.40788 11.80798 48.17153 536.02821 -1.73251 3.18525 11.43755 -1.17211 1.86156 0.64470 8 0 8 2.00 1999-Aug-27 09:09:33 4171696.11959 872120.27620 4730014.58602 11.80800 48.17152 534.53869 -0.77796 2.11769 9.94804 -0.21757 0.79400 -0.84482 8 0 8 2.00 1999-Aug-27 09:09:33 4171696.40658 872120.88844 4730013.44628 11.80800 48.17151 533.96032 -0.23741 1.05491 9.36966 0.32299 -0.26877 -1.42319 8 0 8 2.00 1999-Aug-27 09:09:33 4171699.03437 872121.01847 4730014.50770 11.80800 48.17150 536.48437 -0.64786 -0.17369 11.89371 -0.08746 -1.49738 1.10086 8 0 8 2.00 1999-Aug-27 09:09:33 4171698.43446 872119.72760 4730014.16714 11.80798 48.17150 535.66283 -1.78866 0.23358 11.07217 -1.22826 -1.09011 0.27932 8 0 8 2.00 1999-Aug-27 09:09:33 4171696.15422 872119.94071 4730014.97729 11.80799 48.17152 534.80707 -1.11344 2.40453 10.21642 -0.55305 1.08084 -0.57644 8 0 8 2.00 1999-Aug-27 09:09:33 4171698.66145 872119.94665 4730016.04554 11.80798 48.17151 537.24057 -1.62069 1.28733 12.64991 -1.06029 -0.03636 1.85706 8 0 8 2.00 1999-Aug-27 09:09:33 4171696.09688 872119.97978 4730016.50487 11.80799 48.17153 535.91324 -1.06346 3.45914 11.32258 -0.50307 2.13546 0.52973 8 0 8 2.00 1999-Aug-27 09:09:33 4171697.51299 872119.10364 4730016.67140 11.80798 48.17152 536.84218 -2.21085 2.67092 12.25152 -1.65046 1.34723 1.45866 8 0 8 2.00 1999-Aug-27 09:09:33 4171698.41183 872119.91092 4730016.51625 11.80798 48.17151 537.42350 -1.60458 1.78876 12.83284 -1.04419 0.46508 2.03999 8 0 8 2.00 1999-Aug-27 09:09:33 4171698.25962 872119.88862 4730014.19551 11.80798 48.17150 535.59180 -1.59526 0.35547 11.00115 -1.03486 -0.96821 0.20829 8 0 8 2.00 1999-Aug-27 09:09:33 4171697.02705 872120.28396 4730012.93128 11.80799 48.17150 533.89911 -0.95607 0.35108 9.30846 -0.39567 -0.97260 -1.48440 8 0 8 2.00 1999-Aug-27 09:09:33 4171695.25583 872120.07197 4730015.60515 11.80799 48.17153 534.70636 -0.80112 3.45850 10.11571 -0.24072 2.13482 -0.67715 8 0 8 2.00 1999-Aug-27 09:09:33 4171696.28938 872121.51344 4730014.75455 11.80801 48.17151 534.94396 0.39835 1.91759 10.35330 0.95874 0.59390 -0.43955 8 0 8 2.00 1999-Aug-27 09:09:33 4171695.16030 872120.62723 4730011.53066 11.80800 48.17150 531.68370 -0.23806 0.72622 7.09304 0.32234 -0.59746 -3.69982 8 0 8 2.00 1999-Aug-27 09:09:33 4171695.02384 872120.64595 4730011.62648 11.80800 48.17151 531.66857 -0.19182 0.88680 7.07792 0.36858 -0.43688 -3.71494 8 0 8 2.00 1999-Aug-27 09:09:33 4171696.91601 872120.80654 4730012.17926 11.80800 48.17150 533.33758 -0.42182 -0.14914 8.74692 0.13858 -1.47282 -2.04594 8 0 8 2.00 1999-Aug-27 09:09:33 4171697.64558 872120.78756 4730015.07505 11.80800 48.17151 535.96903 -0.58970 1.25284 11.37837 -0.02930 -0.07085 0.58552 8 0 8 2.00 1999-Aug-27 09:09:33 4171693.61085 872122.11651 4730014.53447 11.80803 48.17153 533.11374 1.53678 3.63252 8.52309 2.09717 2.30883 -2.26977 8 0 8 2.00 1999-Aug-27 09:09:33 4171694.72678 872120.98541 4730013.18655 11.80801 48.17152 532.68346 0.20125 2.09212 8.09281 0.76165 0.76844 -2.70005 8 0 8 2.00 1999-Aug-27 09:09:33 4171696.76980 872121.56196 4730014.40681 11.80801 48.17151 535.00507 0.34753 1.32788 10.41442 0.90793 0.00419 -0.37844 8 0 8 2.00 1999-Aug-27 09:09:33 4171693.59671 872120.25449 4730013.51466 11.80800 48.17153 532.09050 -0.28296 3.24664 7.49985 0.27744 1.92295 -3.29301 8 0 8 2.00 1999-Aug-27 09:09:34 4171699.28132 872120.50191 4730017.23875 11.80799 48.17151 538.61011 -1.20403 1.54630 14.01946 -0.64363 0.22262 3.22660 8 0 8 2.00 1999-Aug-27 09:09:34 4171699.86172 872122.52524 4730018.26593 11.80801 48.17151 540.03051 0.65772 1.49948 15.43986 1.21812 0.17579 4.64700 8 0 8 2.00 1999-Aug-27 09:09:34 4171701.12598 872120.55104 4730018.00306 11.80799 48.17150 540.39051 -1.53342 0.70308 15.79985 -0.97302 -0.62061 5.00700 8 0 8 2.00 1999-Aug-27 09:09:34 4171708.37147 872121.90570 4730019.72723 11.80798 48.17146 546.58993 -1.69009 -3.63832 21.99927 -1.12969 -4.96200 11.20641 8 0 8 2.00 1999-Aug-27 09:09:34 4171703.20144 872119.61693 4730019.04888 11.80797 48.17150 542.39717 -2.87247 0.02918 17.80651 -2.31207 -1.29450 7.01365 8 0 8 2.00 1999-Aug-27 09:09:34 4171700.15044 872121.29836 4730016.95583 11.80800 48.17150 539.07533 -0.60228 0.60226 14.48468 -0.04188 -0.72143 3.69182 8 0 8 2.00 1999-Aug-27 09:09:34 4171697.86516 872120.21669 4730011.43870 11.80799 48.17149 533.32486 -1.19342 -1.24537 8.73420 -0.63302 -2.56905 -2.05866 8 0 8 2.00 1999-Aug-27 09:09:34 4171697.96791 872119.69143 4730013.95733 11.80798 48.17150 535.19699 -1.72859 0.43946 10.60634 -1.16820 -0.88422 -0.18652 8 0 8 2.00 1999-Aug-27 09:09:34 4171698.80346 872121.07641 4730013.12718 11.80800 48.17149 535.31286 -0.54390 -0.93479 10.72220 0.01650 -2.25847 -0.07066 8 0 8 2.00 1999-Aug-27 09:09:34 4171697.68479 872120.31293 4730015.46101 11.80799 48.17151 536.21745 -1.06230 1.55400 11.62680 -0.50191 0.23032 0.83394 8 0 8 2.00 1999-Aug-27 09:09:34 4171698.08641 872121.24988 4730015.79887 11.80800 48.17151 536.85924 -0.22736 1.34353 12.26858 0.33303 0.01984 1.47572 8 0 8 2.00 1999-Aug-27 09:09:34 4171696.75518 872120.52645 4730014.06298 11.80800 48.17151 534.59801 -0.66307 1.26714 10.00736 -0.10268 -0.05655 -0.78550 8 0 8 2.00 1999-Aug-27 09:09:34 4171694.69008 872118.20352 4730012.43216 11.80797 48.17152 531.71773 -2.51426 2.03997 7.12707 -1.95386 0.71629 -3.66578 8 0 8 2.00 1999-Aug-27 09:09:34 4171693.92961 872120.24470 4730013.62039 11.80800 48.17153 532.38526 -0.36065 3.07583 7.79461 0.19974 1.75215 -2.99825 8 0 8 2.00 1999-Aug-27 09:09:34 4171693.22238 872120.36607 4730013.27242 11.80800 48.17153 531.68086 -0.09714 3.34110 7.09021 0.46326 2.01742 -3.70265 8 0 8 2.00 1999-Aug-27 09:09:34 4171692.05442 872119.12393 4730014.20866 11.80799 48.17154 531.44655 -1.07399 5.00677 6.85590 -0.51359 3.68309 -3.93696 8 0 8 2.00 1999-Aug-27 09:09:34 4171694.53114 872121.02153 4730015.22175 11.80801 48.17153 534.07719 0.27664 3.58659 9.48654 0.83703 2.26291 -1.30632 8 0 8 2.00 1999-Aug-27 09:09:34 4171695.81222 872120.57806 4730015.25614 11.80800 48.17152 534.87858 -0.41960 2.74276 10.28792 0.14080 1.41908 -0.50493 8 0 8 2.00 1999-Aug-27 09:09:34 4171698.06618 872121.46356 4730016.26816 11.80801 48.17151 537.22488 -0.01407 1.63867 12.63423 0.54633 0.31498 1.84137 8 0 8 2.00 1999-Aug-27 09:09:34 4171699.01732 872119.70030 4730014.69030 11.80798 48.17150 536.42942 -1.93465 0.16151 11.83876 -1.37426 -1.16217 1.04591 8 0 8 2.00 1999-Aug-27 09:09:34 4171699.82202 872121.16891 4730015.59563 11.80800 48.17150 537.82974 -0.66178 -0.04558 13.23909 -0.10139 -1.36927 2.44623 8 0 8 2.00 1999-Aug-27 09:09:34 4171702.86784 872122.43685 4730017.59790 11.80801 48.17149 541.48304 -0.04395 -1.12515 16.89239 0.51645 -2.44883 6.09953 8 0 8 2.00 1999-Aug-27 09:09:34 4171702.63297 872122.24502 4730015.66322 11.80800 48.17148 539.86193 -0.18366 -2.21483 15.27127 0.37674 -3.53852 4.47841 8 0 8 2.00 1999-Aug-27 09:09:34 4171698.66254 872119.63600 4730012.37379 11.80798 48.17149 534.46291 -1.92499 -1.11480 9.87225 -1.36459 -2.43848 -0.92061 8 0 8 2.00 1999-Aug-27 09:09:34 4171697.02897 872120.82942 4730013.20924 11.80800 48.17150 534.18193 -0.42254 0.45188 9.59128 0.13786 -0.87181 -1.20158 8 0 8 2.00 1999-Aug-27 09:09:35 4171697.35413 872121.80375 4730013.32505 11.80801 48.17150 534.61345 0.46463 0.14338 10.02280 1.02502 -1.18031 -0.77006 8 0 8 2.00 1999-Aug-27 09:09:35 4171696.44597 872120.61282 4730010.72912 11.80800 48.17149 531.92374 -0.51526 -0.74387 7.33308 0.04514 -2.06755 -3.45977 8 0 8 2.00 1999-Aug-27 09:09:35 4171695.36594 872120.34733 4730010.99191 11.80800 48.17150 531.37829 -0.55412 0.25962 6.78763 0.00627 -1.06407 -4.00522 8 0 8 2.00 1999-Aug-27 09:09:35 4171696.56324 872120.79878 4730013.25491 11.80800 48.17151 533.90775 -0.35723 0.82670 9.31709 0.20316 -0.49698 -1.47577 8 0 8 2.00 1999-Aug-27 09:09:35 4171697.56720 872121.50942 4730014.70388 11.80801 48.17151 535.73980 0.13293 0.95240 11.14915 0.69332 -0.37128 0.35629 8 0 8 2.00 1999-Aug-27 09:09:35 4171698.25006 872119.86835 4730015.70630 11.80798 48.17151 536.70856 -1.61315 1.37308 12.11790 -1.05275 0.04940 1.32504 8 0 8 2.00 1999-Aug-27 09:09:35 4171697.47598 872118.83529 4730014.64227 11.80797 48.17151 535.26940 -2.46594 1.38560 10.67875 -1.90555 0.06191 -0.11411 8 0 8 2.00 1999-Aug-27 09:09:35 4171697.04959 872118.55109 4730013.83247 11.80797 48.17151 534.34886 -2.65688 1.19987 9.75820 -2.09648 -0.12381 -1.03465 8 0 8 2.00 1999-Aug-27 09:09:35 4171695.95069 872119.19402 4730015.53952 11.80798 48.17153 534.99125 -1.80269 3.04179 10.40059 -1.24229 1.71810 -0.39227 8 0 8 2.00 1999-Aug-27 09:09:35 4171693.49292 872119.03925 4730013.07133 11.80799 48.17153 531.52655 -1.45124 3.21198 6.93590 -0.89084 1.88830 -3.85696 8 0 8 2.00 1999-Aug-27 09:09:35 4171696.83615 872119.88164 4730015.95728 11.80799 48.17152 535.97439 -1.31081 2.56971 11.38374 -0.75041 1.24602 0.59088 8 0 8 2.00 1999-Aug-27 09:09:35 4171699.58061 872121.46155 4730017.91961 11.80800 48.17151 539.44378 -0.32594 1.63574 14.85313 0.23446 0.31205 4.06027 8 0 8 2.00 1999-Aug-27 09:09:35 4171699.45612 872122.39307 4730016.47007 11.80801 48.17150 538.40953 0.61135 0.61781 13.81887 1.17174 -0.70588 3.02602 8 0 8 2.00 1999-Aug-27 09:09:35 4171697.32487 872121.59922 4730015.67403 11.80801 48.17151 536.31677 0.27042 1.76245 11.72611 0.83082 0.43877 0.93326 8 0 8 2.00 1999-Aug-27 09:09:35 4171697.42957 872121.86201 4730016.07882 11.80801 48.17151 536.72260 0.50622 1.91597 12.13194 1.06662 0.59229 1.33908 8 0 8 2.00 1999-Aug-27 09:09:35 4171700.22852 872122.23658 4730017.06909 11.80801 48.17150 539.33874 0.30011 0.47778 14.74809 0.86050 -0.84590 3.95523 8 0 8 2.00 1999-Aug-27 09:09:35 4171696.45064 872119.53000 4730015.17631 11.80798 48.17152 535.09282 -1.57612 2.38368 10.50216 -1.01572 1.06000 -0.29070 8 0 8 2.00 1999-Aug-27 09:09:35 4171696.00356 872120.28397 4730014.02726 11.80800 48.17151 534.04766 -0.74662 1.82850 9.45700 -0.18622 0.50481 -1.33586 8 0 8 2.00 1999-Aug-27 09:09:35 4171694.99100 872120.59367 4730012.82991 11.80800 48.17151 532.53673 -0.23626 1.72129 7.94607 0.32413 0.39760 -2.84678 8 0 8 2.00 1999-Aug-27 09:09:35 4171696.60258 872121.95214 4730014.89366 11.80802 48.17151 535.31193 0.76367 1.71503 10.72128 1.32407 0.39135 -0.07158 8 0 8 2.00 1999-Aug-27 09:09:35 4171697.87955 872121.40642 4730013.75240 11.80801 48.17150 535.22065 -0.03181 0.10574 10.62999 0.52858 -1.21795 -0.16286 8 0 8 2.00 1999-Aug-27 09:09:35 4171695.59892 872119.39685 4730013.44616 11.80799 48.17151 533.22944 -1.53216 1.87137 8.63878 -0.97177 0.54768 -2.15408 8 0 8 2.00 1999-Aug-27 09:09:35 4171695.48999 872118.37937 4730014.52699 11.80797 48.17152 533.82485 -2.50582 2.82677 9.23420 -1.94543 1.50308 -1.55866 8 0 8 2.00 1999-Aug-27 09:09:35 4171695.51946 872118.63294 4730012.25455 11.80798 48.17151 532.18540 -2.26364 1.25112 7.59474 -1.70325 -0.07257 -3.19811 8 0 8 2.00 1999-Aug-27 09:09:35 4171692.90271 872117.84713 4730007.24512 11.80797 48.17150 526.63722 -2.49735 -0.06127 2.04657 -1.93696 -1.38496 -8.74629 8 0 8 2.00 1999-Aug-27 09:09:36 4171691.49051 872117.25739 4730005.97369 11.80797 48.17150 524.68747 -2.78563 0.21076 0.09681 -2.22523 -1.11293 -10.69605 8 0 8 2.00 1999-Aug-27 09:09:36 4171697.11850 872119.03844 4730011.99926 11.80798 48.17150 533.09434 -2.19394 -0.14727 8.50369 -1.63354 -1.47096 -2.28917 8 0 8 2.00 1999-Aug-27 09:09:36 4171697.22326 872118.14427 4730016.65148 11.80796 48.17152 536.50728 -3.09063 3.01525 11.91662 -2.53023 1.69156 1.12377 8 0 8 2.00 1999-Aug-27 09:09:36 4171694.39669 872118.54398 4730013.78273 11.80798 48.17153 532.57904 -2.12097 3.10274 7.98838 -1.56057 1.77906 -2.80447 8 0 8 2.00 1999-Aug-27 09:09:36 4171695.58184 872119.94928 4730014.06818 11.80799 48.17152 533.75717 -0.98793 2.21442 9.16652 -0.42753 0.89073 -1.62634 8 0 8 2.00 1999-Aug-27 09:09:36 4171695.00566 872120.37772 4730014.92336 11.80800 48.17153 534.07675 -0.45065 3.13966 9.48609 0.10975 1.81597 -1.30676 8 0 8 2.00 1999-Aug-27 09:09:36 4171692.81014 872119.18421 4730010.99778 11.80799 48.17152 529.55553 -1.16963 2.30502 4.96488 -0.60923 0.98134 -5.82798 8 0 8 2.00 1999-Aug-27 09:09:36 4171694.52287 872120.36450 4730010.80079 11.80800 48.17150 530.68787 -0.36479 0.74446 6.09722 0.19560 -0.57922 -4.69564 8 0 8 2.00 1999-Aug-27 09:09:36 4171700.30752 872122.07606 4730015.60292 11.80801 48.17149 538.27590 0.12682 -0.53315 13.68524 0.68721 -1.85684 2.89238 8 0 8 2.00 1999-Aug-27 09:09:36 4171695.65064 872121.76281 4730014.43641 11.80802 48.17152 534.32396 0.77315 2.13328 9.73331 1.33355 0.80959 -1.05955 8 0 8 2.00 1999-Aug-27 09:09:36 4171696.32540 872121.31633 4730014.93405 11.80801 48.17152 535.07432 0.19803 2.04108 10.48367 0.75843 0.71740 -0.30919 8 0 8 2.00 1999-Aug-27 09:09:36 4171694.08971 872119.52159 4730015.00622 11.80799 48.17153 533.42373 -1.10123 3.99353 8.83307 -0.54083 2.66985 -1.95978 8 0 8 2.00 1999-Aug-27 09:09:36 4171695.52061 872120.24332 4730013.64967 11.80800 48.17152 533.44548 -0.68758 1.93513 8.85483 -0.12719 0.61144 -1.93803 8 0 8 2.00 1999-Aug-27 09:09:36 4171696.71569 872121.29610 4730014.41147 11.80801 48.17151 534.93694 0.09837 1.41099 10.34629 0.65876 0.08730 -0.44657 8 0 8 2.00 1999-Aug-27 09:09:36 4171702.27376 872122.19924 4730017.69220 11.80800 48.17149 541.13307 -0.15496 -0.59272 16.54242 0.40543 -1.91641 5.74956 8 0 8 2.00 1999-Aug-27 09:09:36 4171698.50649 872119.52753 4730012.80096 11.80798 48.17149 534.66454 -1.99923 -0.69956 10.07388 -1.43884 -2.02324 -0.71898 8 0 8 2.00 1999-Aug-27 09:09:36 4171699.07462 872121.56962 4730015.98739 11.80800 48.17150 537.68845 -0.11661 0.69972 13.09779 0.44379 -0.62396 2.30494 8 0 8 2.00 1999-Aug-27 09:09:36 4171696.67511 872122.50627 4730012.84038 11.80802 48.17150 533.90491 1.29123 0.20830 9.31426 1.85163 -1.11539 -1.47860 8 0 8 2.00 1999-Aug-27 09:09:36 4171695.56946 872120.59019 4730012.13965 11.80800 48.17151 532.39952 -0.35804 0.83957 7.80887 0.20235 -0.48411 -2.98399 8 0 8 2.00 1999-Aug-27 09:09:36 4171699.98802 872121.31653 4730013.55023 11.80800 48.17148 536.43413 -0.55126 -1.55325 11.84347 0.00914 -2.87693 1.05062 8 0 8 2.00 1999-Aug-27 09:09:36 4171697.80250 872121.74640 4730013.03644 11.80801 48.17149 534.68325 0.31674 -0.36738 10.09260 0.87714 -1.69106 -0.70026 8 0 8 2.00 1999-Aug-27 09:09:36 4171695.93696 872121.90295 4730012.09481 11.80802 48.17150 532.78516 0.85173 0.34145 8.19451 1.41212 -0.98223 -2.59835 8 0 8 2.00 1999-Aug-27 09:09:36 4171695.84480 872121.69328 4730012.81016 11.80801 48.17151 533.22943 0.66536 0.91771 8.63877 1.22576 -0.40597 -2.15408 8 0 8 2.00 1999-Aug-27 09:09:36 4171695.04357 872120.42302 4730014.05958 11.80800 48.17152 533.46404 -0.41406 2.52904 8.87339 0.14633 1.20536 -1.91947 8 0 8 2.00 1999-Aug-27 09:09:36 4171696.24344 872121.06228 4730015.90457 11.80801 48.17152 535.70933 -0.03386 2.78685 11.11867 0.52653 1.46316 0.32582 8 0 8 2.00 1999-Aug-27 09:09:37 4171693.44263 872120.98042 4730016.16529 11.80801 48.17154 534.06409 0.45914 5.01605 9.47344 1.01954 3.69236 -1.31942 8 0 8 2.00 1999-Aug-27 09:09:37 4171696.02366 872120.58354 4730015.12274 11.80800 48.17152 534.91794 -0.45750 2.49873 10.32729 0.10290 1.17505 -0.46557 8 0 8 2.00 1999-Aug-27 09:09:37 4171694.70894 872119.55184 4730013.01137 11.80799 48.17152 532.34564 -1.19834 2.20690 7.75499 -0.63794 0.88321 -3.03787 8 0 8 2.00 1999-Aug-27 09:09:37 4171698.88447 872119.98281 4730014.36359 11.80798 48.17150 536.13780 -1.63093 -0.00255 11.54715 -1.07053 -1.32624 0.75429 8 0 8 2.00 1999-Aug-27 09:09:37 4171695.60032 872118.64288 4730010.78624 11.80798 48.17150 531.14543 -2.27047 0.21140 6.55478 -1.71007 -1.11228 -4.23808 8 0 8 2.00 1999-Aug-27 09:09:37 4171694.08106 872121.09215 4730013.98530 11.80801 48.17153 532.87169 0.43786 3.07951 8.28103 0.99826 1.75582 -2.51183 8 0 8 2.00 1999-Aug-27 09:09:37 4171691.22538 872120.25457 4730011.31036 11.80801 48.17153 528.90000 0.20237 3.50616 4.30935 0.76277 2.18248 -6.48351 8 0 8 2.00 1999-Aug-27 09:09:37 4171691.54630 872119.61168 4730014.47011 11.80800 48.17155 531.37623 -0.49258 5.47737 6.78558 0.06782 4.15369 -4.00728 8 0 8 2.00 1999-Aug-27 09:09:37 4171698.60869 872120.75929 4730018.34504 11.80799 48.17152 539.03049 -0.81445 2.73545 14.43984 -0.25405 1.41176 3.64698 8 0 8 2.00 1999-Aug-27 09:09:37 4171697.69976 872120.98344 4730015.73357 11.80800 48.17151 536.52182 -0.40905 1.62262 11.93117 0.15135 0.29893 1.13831 8 0 8 2.00 1999-Aug-27 09:09:37 4171698.39017 872122.76095 4730016.81731 11.80802 48.17151 538.02263 1.18957 1.57076 13.43198 1.74997 0.24708 2.63912 8 0 8 2.00 1999-Aug-27 09:09:37 4171698.57029 872121.02755 4730018.49718 11.80800 48.17152 539.15540 -0.54401 2.82401 14.56475 0.01639 1.50033 3.77189 8 0 8 2.00 1999-Aug-27 09:09:37 4171701.32647 872121.50722 4730019.29340 11.80800 48.17151 541.61337 -0.63849 1.27158 17.02271 -0.07810 -0.05211 6.22986 8 0 8 2.00 1999-Aug-27 09:09:37 4171696.84721 872122.07441 4730016.42916 11.80802 48.17152 536.63249 0.83330 2.54198 12.04183 1.39370 1.21830 1.24898 8 0 8 2.00 1999-Aug-27 09:09:37 4171695.87386 872122.40752 4730013.79443 11.80802 48.17151 534.07930 1.35853 1.44402 9.48864 1.91893 0.12034 -1.30422 8 0 8 2.00 1999-Aug-27 09:09:37 4171696.67947 872122.63915 4730015.50826 11.80802 48.17152 535.91385 1.42042 1.96407 11.32320 1.98081 0.64039 0.53034 8 0 8 2.00 1999-Aug-27 09:09:37 4171698.55431 872122.32682 4730014.70746 11.80802 48.17150 536.49839 0.73103 0.11017 11.90774 1.29143 -1.21351 1.11488 8 0 8 2.00 1999-Aug-27 09:09:37 4171693.80849 872121.01035 4730011.17499 11.80801 48.17151 530.58851 0.41357 1.41658 5.99786 0.97397 0.09290 -4.79500 8 0 8 2.00 1999-Aug-27 09:09:37 4171698.04244 872122.43226 4730012.95954 11.80802 48.17149 534.87619 0.93899 -0.69825 10.28553 1.49939 -2.02194 -0.50733 8 0 8 2.00 1999-Aug-27 09:09:37 4171694.64738 872120.26629 4730008.96003 11.80800 48.17149 529.38412 -0.48640 -0.55899 4.79346 0.07399 -1.88268 -5.99940 8 0 8 2.00 1999-Aug-27 09:09:37 4171697.85162 872123.05508 4730012.88843 11.80803 48.17149 534.78362 1.58768 -0.70146 10.19297 2.14808 -2.02515 -0.59989 8 0 8 2.00 1999-Aug-27 09:09:37 4171700.61563 872123.27596 4730017.18426 11.80802 48.17150 539.81911 1.23828 0.11376 15.22845 1.79868 -1.20992 4.43559 8 0 8 2.00 1999-Aug-27 09:09:37 4171698.43581 872121.05763 4730014.89759 11.80800 48.17150 536.38951 -0.48705 0.51693 11.79885 0.07334 -0.80676 1.00599 8 0 8 2.00 1999-Aug-27 09:09:37 4171694.77402 872119.84318 4730015.80402 11.80799 48.17153 534.50881 -0.92648 3.97744 9.91815 -0.36608 2.65375 -0.87470 8 0 8 2.00 1999-Aug-27 09:09:37 4171696.48262 872119.07398 4730013.67040 11.80798 48.17151 533.92934 -2.02903 1.42559 9.33869 -1.46864 0.10190 -1.45417 8 0 8 2.00 1999-Aug-27 09:09:38 4171694.93509 872119.07012 4730015.93280 11.80798 48.17153 534.60441 -1.71614 4.06372 10.01375 -1.15574 2.74003 -0.77910 8 0 8 2.00 1999-Aug-27 09:09:38 4171693.15885 872118.95806 4730014.34136 11.80799 48.17154 532.24376 -1.46235 4.31501 7.65310 -0.90195 2.99132 -3.13976 8 0 8 2.00 1999-Aug-27 09:09:38 4171693.98307 872119.36781 4730014.46331 11.80799 48.17153 532.92859 -1.22994 3.73270 8.33794 -0.66954 2.40901 -2.45492 8 0 8 2.00 1999-Aug-27 09:09:38 4171692.82103 872120.59896 4730015.13101 11.80801 48.17154 532.83557 0.21295 4.83783 8.24492 0.77335 3.51414 -2.54794 8 0 8 2.00 1999-Aug-27 09:09:38 4171692.07555 872120.59957 4730012.61332 11.80801 48.17153 530.47297 0.36610 3.70241 5.88232 0.92650 2.37873 -4.91054 8 0 8 2.00 1999-Aug-27 09:09:38 4171697.83623 872120.02916 4730011.72810 11.80799 48.17149 533.49603 -1.37106 -1.00267 8.90537 -0.81067 -2.32636 -1.88748 8 0 8 2.00 1999-Aug-27 09:09:38 4171698.75223 872119.55535 4730012.51049 11.80798 48.17149 534.61231 -2.02229 -1.07676 10.02165 -1.46189 -2.40044 -0.77120 8 0 8 2.00 1999-Aug-27 09:09:38 4171697.35350 872119.44372 4730012.59464 11.80798 48.17150 533.74670 -1.84532 0.01658 9.15605 -1.28493 -1.30710 -1.63681 8 0 8 2.00 1999-Aug-27 09:09:38 4171696.89799 872120.30768 4730013.37937 11.80799 48.17150 534.15199 -0.90644 0.74043 9.56134 -0.34604 -0.58326 -1.23152 8 0 8 2.00 1999-Aug-27 09:09:38 4171693.99146 872122.16907 4730011.68825 11.80803 48.17151 531.24853 1.51033 1.44874 6.65788 2.07073 0.12506 -4.13498 8 0 8 2.00 1999-Aug-27 09:09:38 4171699.06929 872120.92377 4730013.77041 11.80800 48.17149 535.94486 -0.74771 -0.67642 11.35421 -0.18731 -2.00011 0.56135 8 0 8 2.00 1999-Aug-27 09:09:38 4171698.09780 872120.89598 4730012.04552 11.80800 48.17149 534.02159 -0.57611 -1.11394 9.43094 -0.01571 -2.43762 -1.36192 8 0 8 2.00 1999-Aug-27 09:09:38 4171697.62832 872120.08453 4730014.48188 11.80799 48.17151 535.41982 -1.27432 0.97703 10.82917 -0.71392 -0.34665 0.03631 8 0 8 2.00 1999-Aug-27 09:09:38 4171698.37965 872120.21252 4730014.80919 11.80799 48.17150 536.17164 -1.30279 0.62780 11.58099 -0.74239 -0.69589 0.78813 8 0 8 2.00 1999-Aug-27 09:09:38 4171700.21005 872120.77261 4730013.85652 11.80799 48.17148 536.73307 -1.12910 -1.42799 12.14242 -0.56870 -2.75167 1.34956 8 0 8 2.00 1999-Aug-27 09:09:38 4171696.37267 872120.32939 4730013.50859 11.80800 48.17151 533.90832 -0.77769 1.20646 9.31766 -0.21730 -0.11723 -1.47520 8 0 8 2.00 1999-Aug-27 09:09:38 4171695.67572 872118.84021 4730010.94539 11.80798 48.17150 531.34018 -2.09273 0.23245 6.74952 -1.53234 -1.09123 -4.04334 8 0 8 2.00 1999-Aug-27 09:09:38 4171697.02986 872120.00599 4730015.83543 11.80799 48.17152 536.02703 -1.22873 2.32820 11.43637 -0.66833 1.00452 0.64352 8 0 8 2.00 1999-Aug-27 09:09:38 4171697.45395 872119.42408 4730016.50221 11.80798 48.17152 536.72130 -1.88510 2.55228 12.13064 -1.32471 1.22860 1.33779 8 0 8 2.00 1999-Aug-27 09:09:38 4171696.55617 872120.85156 4730014.43792 11.80800 48.17151 534.79185 -0.30412 1.61276 10.20120 0.25628 0.28907 -0.59166 8 0 8 2.00 1999-Aug-27 09:09:38 4171694.89435 872120.71952 4730013.86291 11.80800 48.17152 533.26055 -0.09331 2.46151 8.66989 0.46709 1.13783 -2.12296 8 0 8 2.00 1999-Aug-27 09:09:38 4171692.49716 872119.92798 4730011.62320 11.80800 48.17152 529.91875 -0.37755 2.83699 5.32810 0.18285 1.51331 -5.46476 8 0 8 2.00 1999-Aug-27 09:09:38 4171698.75757 872120.40647 4730013.36202 11.80799 48.17149 535.36646 -1.19027 -0.64254 10.77581 -0.62987 -1.96623 -0.01705 8 0 8 2.00 1999-Aug-27 09:09:38 4171693.40070 872121.00298 4730014.59494 11.80801 48.17153 532.86966 0.48981 3.99592 8.27900 1.05020 2.67223 -2.51386 8 0 8 2.00 1999-Aug-27 09:09:38 4171698.66517 872121.52431 4730012.70301 11.80800 48.17149 534.96764 -0.07718 -1.18509 10.37698 0.48322 -2.50877 -0.41587 8 0 8 2.00 1999-Aug-27 09:09:39 4171695.15203 872119.94455 4730011.12579 11.80799 48.17150 531.28345 -0.90461 0.56633 6.69279 -0.34421 -0.75735 -4.10007 8 0 8 2.00 1999-Aug-27 09:09:39 4171692.91222 872119.42413 4730011.31360 11.80799 48.17152 529.89024 -0.95567 2.40461 5.29959 -0.39527 1.08092 -5.49327 8 0 8 2.00 1999-Aug-27 09:09:39 4171691.15859 872120.87789 4730012.05457 11.80802 48.17153 529.49601 0.82617 3.95615 4.90536 1.38657 2.63247 -5.88750 8 0 8 2.00 1999-Aug-27 09:09:39 4171694.41977 872121.57805 4730012.54706 11.80802 48.17151 532.08741 0.84417 1.79920 7.49675 1.40457 0.47552 -3.29610 8 0 8 2.00 1999-Aug-27 09:09:39 4171695.59139 872120.43760 4730013.39115 11.80800 48.17151 533.32556 -0.51190 1.68148 8.73491 0.04850 0.35779 -2.05795 8 0 8 2.00 1999-Aug-27 09:09:39 4171698.53769 872120.26984 4730013.58251 11.80799 48.17149 535.36858 -1.27901 -0.31429 10.77792 -0.71862 -1.63797 -0.01493 8 0 8 2.00 1999-Aug-27 09:09:39 4171697.70969 872120.31103 4730014.25080 11.80799 48.17150 535.33166 -1.06926 0.72904 10.74100 -0.50886 -0.59465 -0.05185 8 0 8 2.00 1999-Aug-27 09:09:39 4171697.38095 872120.39417 4730013.71053 11.80799 48.17150 534.72583 -0.92061 0.59583 10.13518 -0.36022 -0.72786 -0.65768 8 0 8 2.00 1999-Aug-27 09:09:39 4171697.79485 872119.28249 4730013.74564 11.80798 48.17150 534.87047 -2.09346 0.48687 10.27982 -1.53307 -0.83682 -0.51304 8 0 8 2.00 1999-Aug-27 09:09:39 4171698.91720 872120.86233 4730015.57009 11.80800 48.17150 537.17821 -0.77672 0.64409 12.58755 -0.21632 -0.67960 1.79470 8 0 8 2.00 1999-Aug-27 09:09:39 4171701.18089 872121.54729 4730017.43251 11.80800 48.17150 540.13718 -0.56948 0.13061 15.54652 -0.00909 -1.19307 4.75366 8 0 8 2.00 1999-Aug-27 09:09:39 4171699.74052 872120.27928 4730018.48044 11.80799 48.17152 539.80473 -1.51591 2.07340 15.21407 -0.95551 0.74972 4.42121 8 0 8 2.00 1999-Aug-27 09:09:39 4171697.18499 872119.92802 4730015.13635 11.80799 48.17151 535.59673 -1.33680 1.76072 11.00608 -0.77640 0.43703 0.21322 8 0 8 2.00 1999-Aug-27 09:09:39 4171698.09297 872120.62413 4730017.00237 11.80799 48.17152 537.67491 -0.84121 2.23678 13.08425 -0.28082 0.91309 2.29140 8 0 8 2.00 1999-Aug-27 09:09:39 4171698.66033 872120.96833 4730017.92186 11.80800 48.17152 538.77741 -0.62041 2.38368 14.18675 -0.06001 1.06000 3.39390 8 0 8 2.00 1999-Aug-27 09:09:39 4171695.45422 872120.14946 4730014.57213 11.80800 48.17152 534.07669 -0.76587 2.61306 9.48604 -0.20547 1.28938 -1.30682 8 0 8 2.00 1999-Aug-27 09:09:39 4171693.42354 872120.62029 4730014.16050 11.80801 48.17153 532.50862 0.11054 3.74788 7.91797 0.67094 2.42419 -2.87489 8 0 8 2.00 1999-Aug-27 09:09:39 4171693.89426 872121.81613 4730014.25517 11.80802 48.17153 533.04964 1.18475 3.28535 8.45898 1.74514 1.96166 -2.33387 8 0 8 2.00 1999-Aug-27 09:09:39 4171699.41413 872124.10661 4730017.58392 11.80804 48.17151 539.44595 2.29721 1.12998 14.85529 2.85761 -0.19371 4.06243 8 0 8 2.00 1999-Aug-27 09:09:39 4171700.18274 872122.32864 4730016.98796 11.80801 48.17150 539.26096 0.39959 0.44303 14.67031 0.95998 -0.88066 3.87745 8 0 8 2.00 1999-Aug-27 09:09:39 4171700.09325 872121.95425 4730015.39756 11.80801 48.17149 537.96638 0.05143 -0.49525 13.37573 0.61182 -1.81894 2.58287 8 0 8 2.00 1999-Aug-27 09:09:39 4171698.81576 872121.40443 4730015.00241 11.80800 48.17150 536.76297 -0.22534 0.25683 12.17231 0.33506 -1.06686 1.37945 8 0 8 2.00 1999-Aug-27 09:09:39 4171699.28642 872120.20719 4730013.81204 11.80799 48.17149 536.01982 -1.49355 -0.69776 11.42917 -0.93315 -2.02145 0.63631 8 0 8 2.00 1999-Aug-27 09:09:39 4171696.96069 872119.79952 4730011.42593 11.80799 48.17149 532.66798 -1.41668 -0.53058 8.07732 -0.85628 -1.85426 -2.71554 8 0 8 2.00 1999-Aug-27 09:09:39 4171697.55229 872120.85111 4730011.75205 11.80800 48.17149 533.44069 -0.50840 -0.90494 8.85003 0.05200 -2.22862 -1.94283 8 0 8 2.00 1999-Aug-27 09:09:40 4171695.29267 872118.67825 4730010.71330 11.80798 48.17150 530.89508 -2.17288 0.38176 6.30442 -1.61249 -0.94193 -4.48843 8 0 8 2.00 1999-Aug-27 09:09:40 4171695.24319 872119.38763 4730012.20358 11.80799 48.17151 532.07006 -1.46839 1.30355 7.47941 -0.90799 -0.02014 -3.31345 8 0 8 2.00 1999-Aug-27 09:09:40 4171694.72579 872118.38037 4730012.24280 11.80797 48.17151 531.62407 -2.34846 1.86067 7.03341 -1.78806 0.53699 -3.75944 8 0 8 2.00 1999-Aug-27 09:09:40 4171697.67452 872119.33485 4730013.52711 11.80798 48.17150 534.63623 -2.01759 0.42091 10.04558 -1.45719 -0.90277 -0.74728 8 0 8 2.00 1999-Aug-27 09:09:40 4171697.82608 872120.05972 4730012.91180 11.80799 48.17150 534.37559 -1.33907 -0.21051 9.78494 -0.77867 -1.53420 -1.00792 8 0 8 2.00 1999-Aug-27 09:09:40 4171695.80533 872119.69099 4730014.86321 11.80799 48.17152 534.46023 -1.28648 2.62100 9.86957 -0.72609 1.29731 -0.92328 8 0 8 2.00 1999-Aug-27 09:09:40 4171692.67895 872119.11809 4730011.72434 11.80799 48.17152 530.00226 -1.20750 2.89534 5.41161 -0.64710 1.57165 -5.38125 8 0 8 2.00 1999-Aug-27 09:09:40 4171691.45664 872121.35897 4730013.68363 11.80802 48.17154 530.97012 1.23609 4.75183 6.37947 1.79648 3.42815 -4.41339 8 0 8 2.00 1999-Aug-27 09:09:40 4171691.16821 872120.76859 4730011.61072 11.80802 48.17153 529.15664 0.71722 3.66979 4.56599 1.27762 2.34611 -6.22687 8 0 8 2.00 1999-Aug-27 09:09:40 4171694.84555 872121.34840 4730012.36005 11.80801 48.17151 532.19466 0.53225 1.39895 7.60401 1.09265 0.07527 -3.18885 8 0 8 2.00 1999-Aug-27 09:09:40 4171695.86518 872122.37059 4730013.40839 11.80802 48.17151 533.78094 1.32417 1.19853 9.19028 1.88456 -0.12515 -1.60257 8 0 8 2.00 1999-Aug-27 09:09:40 4171697.45617 872121.03581 4730013.19940 11.80800 48.17150 534.48163 -0.30794 0.10226 9.89098 0.25246 -1.22142 -0.90188 8 0 8 2.00 1999-Aug-27 09:09:40 4171698.48020 872121.60317 4730016.10076 11.80801 48.17151 537.38947 0.03786 1.20377 12.79881 0.59826 -0.11991 2.00595 8 0 8 2.00 1999-Aug-27 09:09:40 4171700.74658 872122.11860 4730015.66166 11.80801 48.17149 538.61208 0.07861 -0.82071 14.02143 0.63901 -2.14439 3.22857 8 0 8 2.00 1999-Aug-27 09:09:40 4171700.82095 872121.21961 4730016.15657 11.80799 48.17149 538.90673 -0.81658 -0.40781 14.31608 -0.25618 -1.73150 3.52322 8 0 8 2.00 1999-Aug-27 09:09:40 4171699.66718 872122.36392 4730014.94434 11.80801 48.17149 537.40644 0.53962 -0.54921 12.81578 1.10002 -1.87289 2.02292 8 0 8 2.00 1999-Aug-27 09:09:40 4171698.11038 872120.88128 4730012.24206 11.80800 48.17149 534.17425 -0.59307 -0.98979 9.58359 -0.03268 -2.31348 -1.20926 8 0 8 2.00 1999-Aug-27 09:09:40 4171697.60006 872121.74786 4730012.09196 11.80801 48.17149 533.84753 0.35960 -0.84983 9.25688 0.91999 -2.17351 -1.53598 8 0 8 2.00 1999-Aug-27 09:09:40 4171697.60014 872121.18845 4730014.26184 11.80800 48.17150 535.38812 -0.18799 0.68251 10.79746 0.37241 -0.64117 0.00460 8 0 8 2.00 1999-Aug-27 09:09:40 4171697.91842 872121.73975 4730013.75973 11.80801 48.17150 535.29698 0.28651 0.03145 10.70632 0.84691 -1.29223 -0.08653 8 0 8 2.00 1999-Aug-27 09:09:40 4171695.15522 872122.21755 4730015.22631 11.80802 48.17152 534.65120 1.31964 2.95207 10.06055 1.88004 1.62839 -0.73231 8 0 8 2.00 1999-Aug-27 09:09:40 4171697.37458 872120.47847 4730014.81229 11.80799 48.17151 535.55415 -0.83679 1.32239 10.96349 -0.27639 -0.00130 0.17064 8 0 8 2.00 1999-Aug-27 09:09:40 4171699.01698 872122.98577 4730013.90137 11.80802 48.17149 536.28969 1.28136 -0.86535 11.69904 1.84176 -2.18903 0.90618 8 0 8 2.00 1999-Aug-27 09:09:40 4171698.97986 872121.44571 4730014.16573 11.80800 48.17149 536.25228 -0.21851 -0.42714 11.66162 0.34188 -1.75083 0.86876 8 0 8 2.00 1999-Aug-27 09:09:40 4171694.18912 872120.61192 4730011.25548 11.80800 48.17151 530.84259 -0.05431 1.25339 6.25193 0.50608 -0.07030 -4.54093 8 0 8 2.00 1999-Aug-27 09:09:41 4171697.15714 872121.60191 4730014.40438 11.80801 48.17151 535.26157 0.30738 1.03765 10.67091 0.86777 -0.28604 -0.12194 8 0 8 2.00 1999-Aug-27 09:09:41 4171700.23085 872123.47530 4730018.63114 11.80803 48.17151 540.67326 1.51214 1.32894 16.08261 2.07254 0.00526 5.28975 8 0 8 2.00 1999-Aug-27 09:09:41 4171699.59723 872122.87076 4730017.97253 11.80802 48.17151 539.68638 1.05005 1.44404 15.09573 1.61044 0.12035 4.30287 8 0 8 2.00 1999-Aug-27 09:09:41 4171698.65007 872121.55394 4730015.03897 11.80801 48.17150 536.70246 -0.04508 0.37926 12.11181 0.51531 -0.94442 1.31895 8 0 8 2.00 1999-Aug-27 09:09:41 4171701.61508 872120.26873 4730015.52614 11.80798 48.17149 538.82561 -1.90984 -1.26248 14.23495 -1.34944 -2.58616 3.44209 8 0 8 2.00 1999-Aug-27 09:09:41 4171697.30997 872120.60706 4730013.70212 11.80800 48.17150 534.70228 -0.69770 0.60953 10.11163 -0.13730 -0.71415 -0.68123 8 0 8 2.00 1999-Aug-27 09:09:41 4171697.72924 872120.32060 4730014.46824 11.80799 48.17151 535.50775 -1.06390 0.85834 10.91710 -0.50350 -0.46535 0.12424 8 0 8 2.00 1999-Aug-27 09:09:41 4171696.97215 872118.37119 4730016.35866 11.80797 48.17152 536.15613 -2.81713 2.96852 11.56548 -2.25673 1.64483 0.77262 8 0 8 2.00 1999-Aug-27 09:09:41 4171697.03364 872119.39636 4730015.43828 11.80798 48.17152 535.65036 -1.82623 2.15354 11.05971 -1.26583 0.82985 0.26685 8 0 8 2.00 1999-Aug-27 09:09:41 4171695.27896 872120.73886 4730018.24424 11.80800 48.17154 536.77898 -0.15308 5.09995 12.18832 0.40731 3.77627 1.39547 8 0 8 2.00 1999-Aug-27 09:09:41 4171692.97992 872119.35118 4730014.80335 11.80799 48.17154 532.52485 -1.04093 4.69367 7.93419 -0.48054 3.36999 -2.85866 8 0 8 2.00 1999-Aug-27 09:09:41 4171692.78364 872120.66451 4730014.54407 11.80801 48.17154 532.38275 0.28477 4.46367 7.79210 0.84517 3.13999 -3.00076 8 0 8 2.00 1999-Aug-27 09:09:41 4171693.71699 872120.52385 4730014.08167 11.80801 48.17153 532.62828 -0.04391 3.49598 8.03763 0.51649 2.17230 -2.75523 8 0 8 2.00 1999-Aug-27 09:09:41 4171697.27466 872122.78262 4730014.37126 11.80802 48.17150 535.47473 1.43905 0.74981 10.88408 1.99945 -0.57388 0.09122 8 0 8 2.00 1999-Aug-27 09:09:41 4171692.98978 872121.83057 4730011.10906 11.80802 48.17151 530.11687 1.38397 1.84469 5.52621 1.94437 0.52100 -5.26664 8 0 8 2.00 1999-Aug-27 09:09:41 4171694.65876 872120.61319 4730010.27301 11.80800 48.17150 530.41725 -0.14917 0.25544 5.82659 0.41123 -1.06824 -4.96626 8 0 8 2.00 1999-Aug-27 09:09:41 4171695.18119 872120.98903 4730010.73617 11.80801 48.17150 531.15470 0.11181 0.12597 6.56404 0.67220 -1.19772 -4.22881 8 0 8 2.00 1999-Aug-27 09:09:41 4171696.43156 872118.89827 4730013.28241 11.80798 48.17151 533.58292 -2.19058 1.23088 8.99226 -1.63018 -0.09281 -1.80060 8 0 8 2.00 1999-Aug-27 09:09:41 4171698.44302 872120.09438 4730013.71737 11.80799 48.17150 535.38332 -1.43139 -0.12854 10.79267 -0.87099 -1.45223 -0.00019 8 0 8 2.00 1999-Aug-27 09:09:41 4171697.89623 872120.56540 4730014.62135 11.80799 48.17150 535.76426 -0.85845 0.80132 11.17360 -0.29805 -0.52237 0.38075 8 0 8 2.00 1999-Aug-27 09:09:41 4171700.53650 872119.58913 4730014.18655 11.80797 48.17149 537.03058 -2.35434 -1.26554 12.43992 -1.79395 -2.58922 1.64707 8 0 8 2.00 1999-Aug-27 09:09:41 4171697.10785 872120.46373 4730016.27228 11.80799 48.17152 536.46592 -0.79664 2.49286 11.87527 -0.23624 1.16917 1.08241 8 0 8 2.00 1999-Aug-27 09:09:41 4171696.72246 872121.25712 4730017.58308 11.80801 48.17153 537.29935 0.05883 3.52715 12.70870 0.61923 2.20346 1.91584 8 0 8 2.00 1999-Aug-27 09:09:41 4171696.54422 872120.37505 4730017.40870 11.80800 48.17153 536.93268 -0.76810 3.67536 12.34203 -0.20771 2.35168 1.54917 8 0 8 2.00 1999-Aug-27 09:09:41 4171696.85513 872120.19941 4730014.86649 11.80799 48.17151 535.21736 -1.00365 1.77996 10.62671 -0.44325 0.45628 -0.16615 8 0 8 2.00 1999-Aug-27 09:09:42 4171697.36181 872118.39137 4730014.55079 11.80797 48.17151 535.06613 -2.87711 1.47555 10.47548 -2.31671 0.15187 -0.31738 8 0 8 2.00 1999-Aug-27 09:09:42 4171700.29486 872119.08585 4730016.15221 11.80797 48.17150 538.26886 -2.79752 0.29835 13.67821 -2.23713 -1.02533 2.88535 8 0 8 2.00 1999-Aug-27 09:09:42 4171695.78933 872120.46729 4730017.56443 11.80800 48.17154 536.56853 -0.52334 4.31575 11.97787 0.03706 2.99206 1.18501 8 0 8 2.00 1999-Aug-27 09:09:42 4171696.17197 872120.84306 4730013.57114 11.80800 48.17151 533.89401 -0.23382 1.31623 9.30336 0.32657 -0.00746 -1.48950 8 0 8 2.00 1999-Aug-27 09:09:42 4171699.61109 872120.96823 4730015.46169 11.80799 48.17150 537.56485 -0.81505 0.04954 12.97420 -0.25465 -1.27414 2.18134 8 0 8 2.00 1999-Aug-27 09:09:42 4171697.76346 872119.98697 4730014.17450 11.80799 48.17150 535.26569 -1.39747 0.68835 10.67503 -0.83707 -0.63534 -0.11783 8 0 8 2.00 1999-Aug-27 09:09:42 4171696.89494 872120.19906 4730015.53561 11.80799 48.17152 535.74189 -1.01214 2.19721 11.15123 -0.45174 0.87353 0.35838 8 0 8 2.00 1999-Aug-27 09:09:42 4171695.81978 872120.13971 4730012.97252 11.80799 48.17151 533.12206 -0.85022 1.28113 8.53141 -0.28982 -0.04255 -2.26145 8 0 8 2.00 1999-Aug-27 09:09:42 4171695.33620 872120.60644 4730014.72257 11.80800 48.17152 534.17412 -0.29441 2.72979 9.58347 0.26599 1.40611 -1.20939 8 0 8 2.00 1999-Aug-27 09:09:42 4171697.47775 872120.60978 4730014.41898 11.80800 48.17151 535.34634 -0.72937 0.96482 10.75568 -0.16897 -0.35886 -0.03717 8 0 8 2.00 1999-Aug-27 09:09:42 4171694.40429 872120.32412 4730012.28650 11.80800 48.17151 531.71203 -0.38005 1.82793 7.12137 0.18034 0.50424 -3.67148 8 0 8 2.00 1999-Aug-27 09:09:42 4171694.16059 872120.54094 4730013.42581 11.80800 48.17152 532.43148 -0.11795 2.73242 7.84082 0.44244 1.40874 -2.95203 8 0 8 2.00 1999-Aug-27 09:09:42 4171695.09491 872121.20464 4730014.25094 11.80801 48.17152 533.74681 0.34051 2.50003 9.15616 0.90091 1.17635 -1.63670 8 0 8 2.00 1999-Aug-27 09:09:42 4171696.53188 872120.87809 4730012.84100 11.80800 48.17150 533.58967 -0.27318 0.56144 8.99902 0.28721 -0.76224 -1.79384 8 0 8 2.00 1999-Aug-27 09:09:42 4171692.26677 872119.67148 4730009.25792 11.80800 48.17151 527.97088 -0.58148 1.46673 3.38023 -0.02108 0.14304 -7.41263 8 0 8 2.00 1999-Aug-27 09:09:42 4171694.33169 872121.20333 4730013.59550 11.80801 48.17152 532.76001 0.49541 2.61980 8.16936 1.05581 1.29611 -2.62350 8 0 8 2.00 1999-Aug-27 09:09:42 4171695.44890 872119.90931 4730011.23702 11.80799 48.17150 531.55531 -0.99985 0.42937 6.96466 -0.43945 -0.89432 -3.82820 8 0 8 2.00 1999-Aug-27 09:09:42 4171697.73081 872119.89397 4730014.03555 11.80799 48.17150 535.12814 -1.48181 0.63368 10.53748 -0.92142 -0.69001 -0.25537 8 0 8 2.00 1999-Aug-27 09:09:42 4171696.98295 872118.64507 4730017.03042 11.80797 48.17153 536.70112 -2.55126 3.36688 12.11046 -1.99086 2.04319 1.31760 8 0 8 2.00 1999-Aug-27 09:09:42 4171699.30286 872117.80808 4730014.86369 11.80795 48.17150 536.48678 -3.84525 0.35741 11.89612 -3.28486 -0.96628 1.10326 8 0 8 2.00 1999-Aug-27 09:09:42 4171701.19840 872119.03803 4730014.54529 11.80796 48.17148 537.65477 -3.02923 -1.42504 13.06412 -2.46883 -2.74873 2.27126 8 0 8 2.00 1999-Aug-27 09:09:42 4171696.85464 872118.25789 4730015.04906 11.80797 48.17152 535.08812 -2.90398 2.19812 10.49747 -2.34358 0.87444 -0.29539 8 0 8 2.00 1999-Aug-27 09:09:42 4171693.75820 872120.79611 4730013.82056 11.80801 48.17153 532.49777 0.21416 3.25027 7.90712 0.77455 1.92659 -2.88574 8 0 8 2.00 1999-Aug-27 09:09:42 4171698.08504 872120.14797 4730013.75417 11.80799 48.17150 535.18438 -1.30567 0.14893 10.59372 -0.74528 -1.17476 -0.19913 8 0 8 2.00 1999-Aug-27 09:09:42 4171697.28623 872120.46076 4730015.77416 11.80799 48.17152 536.21079 -0.83605 2.03101 11.62013 -0.27565 0.70732 0.82728 8 0 8 2.00 1999-Aug-27 09:09:43 4171694.90418 872119.59313 4730016.13852 11.80799 48.17153 534.80891 -1.19787 4.14371 10.21825 -0.63747 2.82002 -0.57461 8 0 8 2.00 1999-Aug-27 09:09:43 4171695.13206 872119.77124 4730013.35911 11.80799 48.17152 532.91091 -1.07016 2.09674 8.32025 -0.50976 0.77305 -2.47260 8 0 8 2.00 1999-Aug-27 09:09:43 4171697.16571 872119.67096 4730016.35857 11.80798 48.17152 536.45980 -1.58447 2.62908 11.86915 -1.02408 1.30540 1.07629 8 0 8 2.00 1999-Aug-27 09:09:43 4171699.18934 872120.57076 4730020.42699 11.80799 48.17153 540.93516 -1.11781 3.72913 16.34450 -0.55742 2.40545 5.55165 8 0 8 2.00 1999-Aug-27 09:09:43 4171698.40631 872121.04109 4730016.66561 11.80800 48.17151 537.68542 -0.49720 1.72007 13.09477 0.06320 0.39638 2.30191 8 0 8 2.00 1999-Aug-27 09:09:43 4171697.09965 872121.75081 4730016.22639 11.80801 48.17152 536.60202 0.46489 2.27198 12.01137 1.02529 0.94829 1.21851 8 0 8 2.00 1999-Aug-27 09:09:43 4171696.06521 872122.54206 4730014.89379 11.80803 48.17152 535.04175 1.45108 2.01711 10.45109 2.01147 0.69343 -0.34176 8 0 8 2.00 1999-Aug-27 09:09:43 4171691.94580 872120.91463 4730010.15318 11.80802 48.17152 528.59810 0.70105 2.10833 4.00745 1.26144 0.78465 -6.78541 8 0 8 2.00 1999-Aug-27 09:09:43 4171695.93370 872120.36779 4730011.31158 11.80800 48.17150 531.98991 -0.65028 0.05558 7.39926 -0.08988 -1.26810 -3.39360 8 0 8 2.00 1999-Aug-27 09:09:43 4171696.30528 872120.33452 4730012.07169 11.80800 48.17150 532.79433 -0.75888 0.29655 8.20368 -0.19848 -1.02714 -2.58918 8 0 8 2.00 1999-Aug-27 09:09:43 4171693.65256 872119.78578 4730011.38595 11.80800 48.17151 530.47679 -0.75318 1.85773 5.88614 -0.19278 0.53404 -4.90672 8 0 8 2.00 1999-Aug-27 09:09:43 4171694.42287 872120.92124 4730011.78981 11.80801 48.17151 531.43554 0.20062 1.39208 6.84489 0.76102 0.06840 -3.94797 8 0 8 2.00 1999-Aug-27 09:09:43 4171696.60174 872121.72687 4730014.02268 11.80801 48.17151 534.63164 0.54334 1.16913 10.04098 1.10374 -0.15455 -0.75187 8 0 8 2.00 1999-Aug-27 09:09:43 4171693.45936 872121.25458 4730013.20758 11.80802 48.17152 531.90850 0.72408 2.98953 7.31785 1.28447 1.66585 -3.47501 8 0 8 2.00 1999-Aug-27 09:09:43 4171697.21918 872120.93450 4730015.08153 11.80800 48.17151 535.71556 -0.35861 1.54576 11.12490 0.20179 0.22207 0.33204 8 0 8 2.00 1999-Aug-27 09:09:43 4171699.70612 872120.97369 4730016.30520 11.80799 48.17150 538.25617 -0.82916 0.54194 13.66551 -0.26877 -0.78175 2.87266 8 0 8 2.00 1999-Aug-27 09:09:43 4171697.02645 872119.64872 4730014.70587 11.80798 48.17151 535.13435 -1.57775 1.63186 10.54369 -1.01735 0.30817 -0.24916 8 0 8 2.00 1999-Aug-27 09:09:43 4171697.43101 872120.36149 4730015.65495 11.80799 48.17151 536.20292 -0.96284 1.86105 11.61227 -0.40245 0.53736 0.81941 8 0 8 2.00 1999-Aug-27 09:09:43 4171697.65205 872120.19559 4730014.62481 11.80799 48.17151 535.55697 -1.17046 1.03812 10.96631 -0.61007 -0.28557 0.17346 8 0 8 2.00 1999-Aug-27 09:09:43 4171697.43022 872119.32991 4730013.03915 11.80798 48.17150 534.11248 -1.97243 0.27442 9.52182 -1.41204 -1.04926 -1.27103 8 0 8 2.00 1999-Aug-27 09:09:43 4171699.35400 872122.87431 4730015.32937 11.80802 48.17150 537.55855 1.10330 -0.14183 12.96790 1.66370 -1.46552 2.17504 8 0 8 2.00 1999-Aug-27 09:09:43 4171699.09081 872121.87906 4730015.75238 11.80801 48.17150 537.56612 0.18297 0.48399 12.97547 0.74336 -0.83969 2.18261 8 0 8 2.00 1999-Aug-27 09:09:43 4171696.97064 872121.97089 4730013.05812 11.80802 48.17150 534.18702 0.70671 0.21959 9.59637 1.26711 -1.10410 -1.19649 8 0 8 2.00 1999-Aug-27 09:09:43 4171691.76096 872120.49415 4730010.54077 11.80801 48.17152 528.70887 0.32729 2.56575 4.11822 0.88769 1.24206 -6.67464 8 0 8 2.00 1999-Aug-27 09:09:43 4171694.40816 872120.57044 4730015.12435 11.80800 48.17153 533.86277 -0.13974 3.68012 9.27212 0.42066 2.35644 -1.52074 8 0 8 2.00 1999-Aug-27 09:09:44 4171699.06843 872120.29562 4730018.88993 11.80799 48.17152 539.67335 -1.36238 2.83421 15.08269 -0.80199 1.51052 4.28984 8 0 8 2.00 1999-Aug-27 09:09:44 4171698.37365 872120.56215 4730017.82042 11.80799 48.17152 538.45924 -0.95933 2.58707 13.86858 -0.39893 1.26338 3.07573 8 0 8 2.00 1999-Aug-27 09:09:44 4171701.47020 872123.13160 4730020.47978 11.80802 48.17151 542.81290 0.92210 1.71026 18.22224 1.48249 0.38657 7.42939 8 0 8 2.00 1999-Aug-27 09:09:44 4171699.29855 872122.01117 4730017.12211 11.80801 48.17151 538.74041 0.26977 1.22581 14.14976 0.83017 -0.09787 3.35690 8 0 8 2.00 1999-Aug-27 09:09:44 4171702.56294 872121.88352 4730018.06390 11.80800 48.17149 541.55573 -0.52318 -0.50760 16.96507 0.03721 -1.83129 6.17221 8 0 8 2.00 1999-Aug-27 09:09:44 4171704.68765 872122.90472 4730017.94736 11.80801 48.17148 542.99524 0.04162 -2.29076 18.40459 0.60202 -3.61445 7.61173 8 0 8 2.00 1999-Aug-27 09:09:44 4171702.83030 872121.20817 4730017.33164 11.80799 48.17149 541.09245 -1.23895 -1.08798 16.50180 -0.67855 -2.41167 5.70894 8 0 8 2.00 1999-Aug-27 09:09:44 4171701.68100 872121.80029 4730017.50136 11.80800 48.17150 540.54947 -0.42417 -0.22681 15.95882 0.13623 -1.55050 5.16596 8 0 8 2.00 1999-Aug-27 09:09:44 4171699.47589 872120.18938 4730018.56309 11.80798 48.17152 539.68129 -1.54976 2.33525 15.09064 -0.98936 1.01156 4.29778 8 0 8 2.00 1999-Aug-27 09:09:44 4171701.41488 872121.11101 4730017.12194 11.80799 48.17150 539.99896 -1.04441 -0.18065 15.40831 -0.48402 -1.50434 4.61545 8 0 8 2.00 1999-Aug-27 09:09:44 4171698.91621 872121.45153 4730016.78209 11.80800 48.17151 538.16109 -0.19979 1.36326 13.57043 0.36061 0.03957 2.77758 8 0 8 2.00 1999-Aug-27 09:09:44 4171696.42893 872122.07185 4730016.33541 11.80802 48.17152 536.28923 0.91639 2.78494 11.69857 1.47679 1.46126 0.90572 8 0 8 2.00 1999-Aug-27 09:09:44 4171694.12929 872121.94016 4730014.87283 11.80802 48.17153 533.68024 1.25806 3.50692 9.08959 1.81846 2.18323 -1.70327 8 0 8 2.00 1999-Aug-27 09:09:44 4171694.98531 872121.97854 4730014.82167 11.80802 48.17152 534.20615 1.12046 2.84259 9.61550 1.68086 1.51891 -1.17736 8 0 8 2.00 1999-Aug-27 09:09:44 4171699.38040 872123.51326 4730018.79199 11.80803 48.17152 540.24313 1.72333 2.05072 15.65248 2.28373 0.72703 4.85962 8 0 8 2.00 1999-Aug-27 09:09:44 4171701.19544 872122.96775 4730018.29576 11.80802 48.17150 540.98376 0.81794 0.47912 16.39311 1.37834 -0.84457 5.60025 8 0 8 2.00 1999-Aug-27 09:09:44 4171701.04734 872122.46032 4730017.28098 11.80801 48.17150 540.06168 0.35156 -0.01224 15.47103 0.91196 -1.33593 4.67817 8 0 8 2.00 1999-Aug-27 09:09:44 4171697.30626 872119.66767 4730015.12546 11.80798 48.17151 535.63225 -1.61646 1.70471 11.04160 -1.05606 0.38102 0.24874 8 0 8 2.00 1999-Aug-27 09:09:44 4171696.58641 872120.45964 4730015.83831 11.80800 48.17152 535.80160 -0.69393 2.58439 11.21094 -0.13354 1.26070 0.41808 8 0 8 2.00 1999-Aug-27 09:09:44 4171699.06365 872122.05055 4730013.29856 11.80801 48.17149 535.74335 0.35639 -1.15880 11.15270 0.91678 -2.48249 0.35984 8 0 8 2.00 1999-Aug-27 09:09:44 4171698.47305 872121.47685 4730012.28886 11.80800 48.17149 534.52715 -0.08432 -1.31392 9.93649 0.47608 -2.63761 -0.85636 8 0 8 2.00 1999-Aug-27 09:09:44 4171700.71606 872123.14928 4730013.23811 11.80802 48.17147 536.92693 1.09373 -2.57188 12.33627 1.65412 -3.89556 1.54342 8 0 8 2.00 1999-Aug-27 09:09:44 4171699.04219 872122.27915 4730012.47326 11.80801 48.17148 535.14557 0.58454 -1.72840 10.55491 1.14494 -3.05209 -0.23794 8 0 8 2.00 1999-Aug-27 09:09:44 4171698.24141 872121.46138 4730015.72522 11.80800 48.17151 536.93440 -0.05206 1.14911 12.34375 0.50834 -0.17458 1.55089 8 0 8 2.00 1999-Aug-27 09:09:44 4171697.49344 872120.87994 4730016.53134 11.80800 48.17152 536.96747 -0.46814 2.32092 12.37681 0.09226 0.99723 1.58396 8 0 8 2.00 1999-Aug-27 09:09:45 4171699.18831 872120.17549 4730015.08552 11.80799 48.17150 536.90038 -1.50451 0.22792 12.30972 -0.94411 -1.09577 1.51686 8 0 8 2.00 1999-Aug-27 09:09:45 4171704.46175 872122.36491 4730019.01793 11.80800 48.17149 543.57184 -0.44054 -1.32971 18.98118 0.11986 -2.65340 8.18833 8 0 8 2.00 1999-Aug-27 09:09:45 4171701.72981 872120.24864 4730016.43186 11.80798 48.17149 539.57265 -1.95298 -0.73907 14.98200 -1.39258 -2.06276 4.18914 8 0 8 2.00 1999-Aug-27 09:09:45 4171697.81022 872118.62691 4730012.58844 11.80797 48.17150 533.92875 -2.73831 -0.19612 9.33810 -2.17792 -1.51980 -1.45476 8 0 8 2.00 1999-Aug-27 09:09:45 4171699.80723 872119.88539 4730015.50479 11.80798 48.17150 537.57723 -1.91511 0.10034 12.98658 -1.35472 -1.22335 2.19372 8 0 8 2.00 1999-Aug-27 09:09:45 4171696.82076 872119.03727 4730013.47561 11.80798 48.17151 533.99992 -2.13416 1.05465 9.40926 -1.57376 -0.26904 -1.38359 8 0 8 2.00 1999-Aug-27 09:09:45 4171697.46345 872121.56220 4730015.32490 11.80801 48.17151 536.14203 0.20582 1.43419 11.55137 0.76622 0.11050 0.75852 8 0 8 2.00 1999-Aug-27 09:09:45 4171694.11260 872120.23086 4730013.93035 11.80800 48.17153 532.73379 -0.41165 3.15119 8.14313 0.14875 1.82750 -2.64972 8 0 8 2.00 1999-Aug-27 09:09:45 4171696.16397 872121.93282 4730016.21624 11.80802 48.17152 536.00849 0.83451 2.91992 11.41784 1.39491 1.59623 0.62498 8 0 8 2.00 1999-Aug-27 09:09:45 4171697.53226 872121.09103 4730016.18361 11.80800 48.17152 536.76251 -0.26946 2.02852 12.17186 0.29094 0.70483 1.37900 8 0 8 2.00 1999-Aug-27 09:09:45 4171697.90088 872119.82757 4730015.35138 11.80798 48.17151 536.21058 -1.58162 1.39729 11.61993 -1.02122 0.07360 0.82707 8 0 8 2.00 1999-Aug-27 09:09:45 4171693.52498 872120.84335 4730015.38593 11.80801 48.17154 533.51840 0.30813 4.45712 8.92775 0.86852 3.13343 -1.86511 8 0 8 2.00 1999-Aug-27 09:09:45 4171699.05497 872119.19116 4730014.74349 11.80797 48.17150 536.42414 -2.44072 0.24716 11.83349 -1.88032 -1.07653 1.04063 8 0 8 2.00 1999-Aug-27 09:09:45 4171696.27166 872120.70632 4730015.52805 11.80800 48.17152 535.39861 -0.38807 2.56943 10.80796 0.17233 1.24575 0.01510 8 0 8 2.00 1999-Aug-27 09:09:45 4171698.72052 872121.41552 4730015.58134 11.80800 48.17150 537.13369 -0.19499 0.71069 12.54304 0.36540 -0.61299 1.75018 8 0 8 2.00 1999-Aug-27 09:09:45 4171699.72092 872119.54123 4730017.03135 11.80798 48.17151 538.61143 -2.23433 1.23383 14.02078 -1.67394 -0.08985 3.22792 8 0 8 2.00 1999-Aug-27 09:09:45 4171698.28179 872118.67400 4730016.30588 11.80797 48.17152 537.01305 -2.78872 1.93192 12.42239 -2.22833 0.60823 1.62953 8 0 8 2.00 1999-Aug-27 09:09:45 4171696.62529 872120.23990 4730015.59155 11.80799 48.17152 535.61312 -0.91698 2.42497 11.02247 -0.35659 1.10129 0.22961 8 0 8 2.00 1999-Aug-27 09:09:45 4171695.16861 872119.86765 4730010.69115 11.80799 48.17150 530.95990 -0.98327 0.27611 6.36925 -0.42287 -1.04758 -4.42361 8 0 8 2.00 1999-Aug-27 09:09:45 4171699.00666 872121.15480 4730014.91196 11.80800 48.17150 536.78612 -0.50875 0.09534 12.19547 0.05165 -1.22835 1.40261 8 0 8 2.00 1999-Aug-27 09:09:45 4171698.73384 872121.76362 4730016.54584 11.80801 48.17151 537.90859 0.14302 1.29113 13.31793 0.70341 -0.03255 2.52507 8 0 8 2.00 1999-Aug-27 09:09:45 4171703.25851 872122.89099 4730017.88546 11.80801 48.17149 542.01432 0.32064 -1.28757 17.42366 0.88104 -2.61125 6.63081 8 0 8 2.00 1999-Aug-27 09:09:45 4171698.81633 872122.43844 4730014.93906 11.80802 48.17150 536.85724 0.78667 0.05649 12.26659 1.34707 -1.26719 1.47373 8 0 8 2.00 1999-Aug-27 09:09:45 4171698.94009 872119.86354 4730015.85412 11.80798 48.17151 537.26849 -1.75907 0.96910 12.67783 -1.19867 -0.35458 1.88498 8 0 8 2.00 1999-Aug-27 09:09:45 4171701.15538 872122.56765 4730019.56439 11.80801 48.17151 541.84833 0.43450 1.41540 17.25767 0.99490 0.09171 6.46482 8 0 8 2.00 1999-Aug-27 09:09:46 4171701.68031 872122.94086 4730021.07828 11.80801 48.17152 543.37000 0.69240 1.98524 18.77934 1.25280 0.66155 7.98648 8 0 8 2.00 1999-Aug-27 09:09:46 4171701.39892 872124.24117 4730019.56615 11.80803 48.17151 542.23701 2.02278 0.98376 17.64636 2.58317 -0.33993 6.85350 8 0 8 2.00 1999-Aug-27 09:09:46 4171696.99921 872120.13765 4730013.75659 11.80799 48.17151 534.47595 -1.09358 0.94409 9.88530 -0.53318 -0.37959 -0.90756 8 0 8 2.00 1999-Aug-27 09:09:46 4171696.75308 872120.21404 4730013.80959 11.80799 48.17151 534.36520 -0.96845 1.14731 9.77454 -0.40805 -0.17637 -1.01831 8 0 8 2.00 1999-Aug-27 09:09:46 4171695.58049 872120.50575 4730013.18151 11.80800 48.17151 533.17153 -0.44296 1.53923 8.58088 0.11744 0.21554 -2.21198 8 0 8 2.00 1999-Aug-27 09:09:46 4171697.66598 872120.63455 4730015.09356 11.80800 48.17151 535.97526 -0.74364 1.27363 11.38460 -0.18324 -0.05006 0.59174 8 0 8 2.00 1999-Aug-27 09:09:46 4171699.37208 872119.76836 4730016.07145 11.80798 48.17150 537.69944 -1.94063 0.81348 13.10879 -1.38023 -0.51021 2.31593 8 0 8 2.00 1999-Aug-27 09:09:46 4171702.60860 872120.54463 4730017.82704 11.80798 48.17149 541.22632 -1.84309 -0.49472 16.63566 -1.28269 -1.81841 5.84281 8 0 8 2.00 1999-Aug-27 09:09:46 4171698.15320 872119.74798 4730016.63325 11.80798 48.17152 537.31961 -1.71115 2.08028 12.72896 -1.15075 0.75659 1.93610 8 0 8 2.00 1999-Aug-27 09:09:46 4171695.80354 872121.03971 4730013.61087 11.80801 48.17151 533.70995 0.03406 1.58146 9.11929 0.59445 0.25778 -1.67356 8 0 8 2.00 1999-Aug-27 09:09:46 4171697.41529 872120.94586 4730011.73169 11.80800 48.17149 533.34901 -0.38762 -0.83304 8.75836 0.17277 -2.15672 -2.03450 8 0 8 2.00 1999-Aug-27 09:09:46 4171698.94488 872121.23758 4730014.49183 11.80800 48.17150 536.44403 -0.41508 -0.15241 11.85337 0.14532 -1.47610 1.06052 8 0 8 2.00 1999-Aug-27 09:09:46 4171697.59621 872121.91489 4730014.12868 11.80801 48.17150 535.38546 0.52389 0.48581 10.79481 1.08428 -0.83787 0.00195 8 0 8 2.00 1999-Aug-27 09:09:46 4171695.53847 872121.58187 4730014.81530 11.80801 48.17152 534.50837 0.61899 2.49537 9.91772 1.17939 1.17168 -0.87514 8 0 8 2.00 1999-Aug-27 09:09:46 4171697.46972 872120.87346 4730016.66034 11.80800 48.17152 537.04722 -0.46962 2.42524 12.45657 0.09077 1.10155 1.66371 8 0 8 2.00 1999-Aug-27 09:09:46 4171693.80967 872120.40914 4730015.51110 11.80800 48.17154 533.73826 -0.17516 4.39917 9.14761 0.38524 3.07548 -1.64525 8 0 8 2.00 1999-Aug-27 09:09:46 4171692.89894 872120.43015 4730015.04162 11.80801 48.17154 532.79679 0.03177 4.74712 8.20613 0.59217 3.42344 -2.58673 8 0 8 2.00 1999-Aug-27 09:09:46 4171697.23779 872120.68836 4730015.01526 11.80800 48.17151 535.64473 -0.60335 1.52552 11.05408 -0.04296 0.20183 0.26122 8 0 8 2.00 1999-Aug-27 09:09:46 4171695.08164 872118.59333 4730009.80918 11.80798 48.17150 530.07203 -2.21283 -0.05434 5.48137 -1.65243 -1.37802 -5.31148 8 0 8 2.00 1999-Aug-27 09:09:46 4171698.12805 872120.28739 4730012.56566 11.80799 48.17149 534.34586 -1.17801 -0.69632 9.75521 -0.61762 -2.02000 -1.03765 8 0 8 2.00 1999-Aug-27 09:09:46 4171699.31309 872120.61188 4730016.26125 11.80799 48.17151 537.91748 -1.10288 0.85446 13.32682 -0.54248 -0.46922 2.53396 8 0 8 2.00 1999-Aug-27 09:09:46 4171700.52951 872122.43808 4730014.90380 11.80801 48.17149 537.94928 0.43575 -1.21652 13.35862 0.99615 -2.54020 2.56576 8 0 8 2.00 1999-Aug-27 09:09:46 4171702.46530 872121.46955 4730015.96240 11.80799 48.17148 539.86958 -0.90841 -1.77477 15.27892 -0.34801 -3.09845 4.48606 8 0 8 2.00 1999-Aug-27 09:09:46 4171701.48111 872120.31638 4730015.77507 11.80798 48.17149 538.93014 -1.83578 -1.00601 14.33949 -1.27538 -2.32970 3.54663 8 0 8 2.00 1999-Aug-27 09:09:46 4171697.04983 872119.32552 4730013.62044 11.80798 48.17151 534.29671 -1.89889 0.94021 9.70606 -1.33849 -0.38348 -1.08680 8 0 8 2.00 1999-Aug-27 09:09:47 4171693.39212 872118.26803 4730012.21691 11.80798 48.17152 530.71884 -2.18552 2.83329 6.12819 -1.62512 1.50960 -4.66467 8 0 8 2.00 1999-Aug-27 09:09:47 4171696.50159 872119.96726 4730015.15385 11.80799 48.17152 535.16901 -1.15854 2.26486 10.57835 -0.59815 0.94118 -0.21450 8 0 8 2.00 1999-Aug-27 09:09:47 4171696.39982 872119.26228 4730016.09353 11.80798 48.17153 535.70657 -1.82778 3.07326 11.11591 -1.26738 1.74958 0.32306 8 0 8 2.00 1999-Aug-27 09:09:47 4171696.30165 872120.01182 4730015.18970 11.80799 48.17152 535.07129 -1.07400 2.42781 10.48063 -0.51361 1.10412 -0.31223 8 0 8 2.00 1999-Aug-27 09:09:47 4171697.59902 872120.38681 4730014.63843 11.80799 48.17151 535.55860 -0.97244 1.05672 10.96795 -0.41204 -0.26697 0.17509 8 0 8 2.00 1999-Aug-27 09:09:47 4171693.88640 872119.29736 4730012.08050 11.80799 48.17152 531.08033 -1.27911 2.22484 6.48967 -0.71871 0.90116 -4.30318 8 0 8 2.00 1999-Aug-27 09:09:47 4171698.02314 872119.12096 4730013.90452 11.80797 48.17150 535.11584 -2.29829 0.45094 10.52518 -1.73789 -0.87274 -0.26768 8 0 8 2.00 1999-Aug-27 09:09:47 4171703.09006 872120.32763 4730015.06462 11.80798 48.17147 539.45260 -2.15401 -2.65507 14.86194 -1.59362 -3.97875 4.06908 8 0 8 2.00 1999-Aug-27 09:09:47 4171699.85682 872120.86545 4730015.72944 11.80799 48.17150 537.91075 -0.96595 0.06454 13.32009 -0.40555 -1.25914 2.52724 8 0 8 2.00 1999-Aug-27 09:09:47 4171700.59110 872121.95550 4730015.33521 11.80800 48.17149 538.24508 -0.04922 -0.90014 13.65443 0.51118 -2.22383 2.86157 8 0 8 2.00 1999-Aug-27 09:09:47 4171700.52317 872121.92729 4730016.67951 11.80800 48.17150 539.19858 -0.06293 0.05023 14.60793 0.49746 -1.27346 3.81507 8 0 8 2.00 1999-Aug-27 09:09:47 4171703.54971 872124.01203 4730019.50536 11.80802 48.17149 543.56446 1.35837 -0.59058 18.97381 1.91876 -1.91427 8.18095 8 0 8 2.00 1999-Aug-27 09:09:47 4171703.39844 872123.18357 4730016.96111 11.80801 48.17148 541.45681 0.57838 -2.05069 16.86616 1.13878 -3.37438 6.07330 8 0 8 2.00 1999-Aug-27 09:09:47 4171699.26239 872123.45521 4730015.23582 11.80803 48.17150 537.50832 1.69065 -0.22598 12.91766 2.25105 -1.54966 2.12481 8 0 8 2.00 1999-Aug-27 09:09:47 4171698.44764 872122.50948 4730014.65877 11.80802 48.17150 536.41741 0.93166 0.12765 11.82676 1.49205 -1.19603 1.03390 8 0 8 2.00 1999-Aug-27 09:09:47 4171697.00072 872120.81062 4730015.89677 11.80800 48.17152 536.16352 -0.43516 2.26767 11.57286 0.12523 0.94399 0.78001 8 0 8 2.00 1999-Aug-27 09:09:47 4171695.85051 872120.24647 4730013.65841 11.80800 48.17151 533.66778 -0.75201 1.69986 9.07712 -0.19161 0.37617 -1.71573 8 0 8 2.00 1999-Aug-27 09:09:47 4171696.10124 872119.92189 4730014.01141 11.80799 48.17151 534.05019 -1.12102 1.80190 9.45954 -0.56063 0.47821 -1.33332 8 0 8 2.00 1999-Aug-27 09:09:47 4171698.37700 872120.38939 4730016.31107 11.80799 48.17151 537.31317 -1.12911 1.60437 12.72251 -0.56871 0.28069 1.92966 8 0 8 2.00 1999-Aug-27 09:09:47 4171698.75589 872121.90718 4730016.98626 11.80801 48.17151 538.27075 0.27903 1.54687 13.68010 0.83942 0.22318 2.88724 8 0 8 2.00 1999-Aug-27 09:09:47 4171700.26448 872122.60285 4730018.15516 11.80801 48.17151 540.22148 0.65127 1.12001 15.63083 1.21167 -0.20368 4.83797 8 0 8 2.00 1999-Aug-27 09:09:47 4171700.20644 872121.73939 4730017.56083 11.80800 48.17151 539.62290 -0.18205 0.89765 15.03224 0.37835 -0.42604 4.23939 8 0 8 2.00 1999-Aug-27 09:09:47 4171698.85392 872120.49649 4730016.15512 11.80799 48.17151 537.52291 -1.12187 1.13619 12.93225 -0.56147 -0.18750 2.13939 8 0 8 2.00 1999-Aug-27 09:09:47 4171692.54528 872120.05363 4730012.07594 11.80800 48.17153 530.30467 -0.26440 3.08467 5.71401 0.29600 1.76098 -5.07884 8 0 8 2.00 1999-Aug-27 09:09:47 4171692.81701 872120.65564 4730012.03679 11.80801 48.17152 530.53504 0.26927 2.76857 5.94438 0.82966 1.44489 -4.84847 8 0 8 2.00 1999-Aug-27 09:09:48 4171692.34585 872120.69000 4730013.10348 11.80801 48.17153 531.02700 0.39931 3.81836 6.43634 0.95971 2.49467 -4.35651 8 0 8 2.00 1999-Aug-27 09:09:48 4171693.17136 872120.08749 4730010.89196 11.80800 48.17151 529.83575 -0.35938 1.83325 5.24510 0.20101 0.50957 -5.54776 8 0 8 2.00 1999-Aug-27 09:09:48 4171696.89069 872119.83396 4730014.71300 11.80799 48.17151 535.07633 -1.36864 1.70739 10.48567 -0.80824 0.38370 -0.30718 8 0 8 2.00 1999-Aug-27 09:09:48 4171697.43848 872122.22212 4730018.09870 11.80802 48.17153 538.28267 0.85688 3.20162 13.69201 1.41728 1.87794 2.89916 8 0 8 2.00 1999-Aug-27 09:09:48 4171695.70438 872120.10322 4730015.44187 11.80799 48.17152 534.88178 -0.86233 3.01768 10.29112 -0.30193 1.69400 -0.50174 8 0 8 2.00 1999-Aug-27 09:09:48 4171695.07286 872120.78931 4730014.85072 11.80800 48.17152 534.12265 -0.06152 2.97944 9.53200 0.49887 1.65576 -1.26086 8 0 8 2.00 1999-Aug-27 09:09:48 4171692.24402 872118.97366 4730008.80821 11.80799 48.17151 527.52570 -1.25988 1.28981 2.93505 -0.69948 -0.03387 -7.85781 8 0 8 2.00 1999-Aug-27 09:09:48 4171692.00807 872119.70585 4730011.48778 11.80800 48.17153 529.46825 -0.49489 3.13728 4.87760 0.06550 1.81359 -5.91526 8 0 8 2.00 1999-Aug-27 09:09:48 4171694.40315 872120.56424 4730010.76085 11.80800 48.17150 530.60723 -0.14478 0.77468 6.01657 0.41562 -0.54900 -4.77629 8 0 8 2.00 1999-Aug-27 09:09:48 4171696.64634 872119.57362 4730012.24942 11.80798 48.17150 533.04557 -1.57347 0.28234 8.45492 -1.01307 -1.04135 -2.33794 8 0 8 2.00 1999-Aug-27 09:09:48 4171699.33930 872121.22358 4730014.54619 11.80800 48.17149 536.74010 -0.50949 -0.40171 12.14944 0.05090 -1.72539 1.35659 8 0 8 2.00 1999-Aug-27 09:09:48 4171701.05397 872120.99469 4730016.20892 11.80799 48.17149 539.06716 -1.08442 -0.50856 14.47651 -0.52402 -1.83225 3.68365 8 0 8 2.00 1999-Aug-27 09:09:48 4171700.97163 872121.24429 4730015.32153 11.80799 48.17149 538.38624 -0.82324 -1.07837 13.79558 -0.26285 -2.40205 3.00273 8 0 8 2.00 1999-Aug-27 09:09:48 4171699.58707 872119.75490 4730017.86644 11.80798 48.17151 539.17548 -1.99780 1.85581 14.58482 -1.43740 0.53212 3.79197 8 0 8 2.00 1999-Aug-27 09:09:48 4171700.20093 872120.34760 4730017.04549 11.80798 48.17150 539.04535 -1.54326 0.77020 14.45470 -0.98286 -0.55349 3.66184 8 0 8 2.00 1999-Aug-27 09:09:48 4171698.90964 872119.13461 4730015.19794 11.80797 48.17150 536.66019 -2.46633 0.66485 12.06953 -1.90594 -0.65883 1.27667 8 0 8 2.00 1999-Aug-27 09:09:48 4171694.76704 872120.30830 4730014.11786 11.80800 48.17152 533.31129 -0.46977 2.78709 8.72064 0.09063 1.46341 -2.07222 8 0 8 2.00 1999-Aug-27 09:09:48 4171693.94766 872121.02047 4730014.42168 11.80801 48.17153 533.09999 0.39500 3.47876 8.50934 0.95540 2.15508 -2.28352 8 0 8 2.00 1999-Aug-27 09:09:48 4171695.44767 872123.38205 4730018.21088 11.80804 48.17154 537.22497 2.39966 4.55163 12.63431 2.96006 3.22794 1.84146 8 0 8 2.00 1999-Aug-27 09:09:48 4171697.14426 872124.28247 4730015.94800 11.80805 48.17151 536.76920 2.93385 1.66775 12.17854 3.49424 0.34406 1.38569 8 0 8 2.00 1999-Aug-27 09:09:48 4171697.95950 872121.38226 4730014.19699 11.80800 48.17150 535.60083 -0.07182 0.34761 11.01018 0.48858 -0.97608 0.21732 8 0 8 2.00 1999-Aug-27 09:09:48 4171697.15445 872121.15556 4730013.71186 11.80800 48.17150 534.68287 -0.12898 0.64582 10.09221 0.43142 -0.67786 -0.70064 8 0 8 2.00 1999-Aug-27 09:09:48 4171696.41619 872119.96715 4730015.21261 11.80799 48.17152 535.15703 -1.14117 2.36636 10.56638 -0.58077 1.04267 -0.22648 8 0 8 2.00 1999-Aug-27 09:09:48 4171699.98465 872120.25053 4730014.02060 11.80798 48.17149 536.63695 -1.59401 -1.07456 12.04629 -1.03361 -2.39825 1.25343 8 0 8 2.00 1999-Aug-27 09:09:48 4171696.53809 872119.16140 4730010.95459 11.80798 48.17149 531.95380 -1.95481 -0.43938 7.36315 -1.39441 -1.76306 -3.42971 8 0 8 2.00 1999-Aug-27 09:09:49 4171698.21589 872120.63006 4730013.44774 11.80799 48.17150 535.10725 -0.86057 -0.22437 10.51659 -0.30017 -1.54806 -0.27626 8 0 8 2.00 1999-Aug-27 09:09:49 4171700.16306 872120.57705 4730016.04850 11.80799 48.17150 538.30905 -1.31091 0.09794 13.71839 -0.75051 -1.22574 2.92553 8 0 8 2.00 1999-Aug-27 09:09:49 4171699.25356 872119.72042 4730015.75642 11.80798 48.17150 537.38079 -1.96330 0.69714 12.79014 -1.40290 -0.62654 1.99728 8 0 8 2.00 1999-Aug-27 09:09:49 4171696.61861 872118.83876 4730015.60215 11.80797 48.17152 535.42544 -2.28710 2.65056 10.83479 -1.72670 1.32688 0.04193 8 0 8 2.00 1999-Aug-27 09:09:49 4171698.53630 872122.04610 4730016.93435 11.80801 48.17151 538.10768 0.45994 1.65123 13.51703 1.02034 0.32754 2.72417 8 0 8 2.00 1999-Aug-27 09:09:49 4171697.06156 872121.20830 4730014.54500 11.80800 48.17151 535.25024 -0.05835 1.26116 10.65959 0.50204 -0.06252 -0.13327 8 0 8 2.00 1999-Aug-27 09:09:49 4171699.05235 872122.14843 4730017.06118 11.80801 48.17151 538.55303 0.45451 1.34382 13.96237 1.01490 0.02013 3.16951 8 0 8 2.00 1999-Aug-27 09:09:49 4171701.39029 872121.03000 4730015.57490 11.80799 48.17149 538.81908 -1.11868 -1.18209 14.22843 -0.55828 -2.50577 3.43557 8 0 8 2.00 1999-Aug-27 09:09:49 4171703.40345 872122.75532 4730018.38870 11.80801 48.17149 542.46540 0.15818 -1.03698 17.87475 0.71858 -2.36066 7.08189 8 0 8 2.00 1999-Aug-27 09:09:49 4171701.87405 872122.03830 4730015.66548 11.80800 48.17148 539.33998 -0.23071 -1.62827 14.74932 0.32969 -2.95195 3.95647 8 0 8 2.00 1999-Aug-27 09:09:49 4171698.74167 872120.58419 4730016.71836 11.80799 48.17151 537.88129 -1.01306 1.58031 13.29064 -0.45266 0.25663 2.49778 8 0 8 2.00 1999-Aug-27 09:09:49 4171697.85404 872118.80103 4730014.58622 11.80797 48.17151 535.46976 -2.57685 1.07769 10.87911 -2.01645 -0.24599 0.08625 8 0 8 2.00 1999-Aug-27 09:09:49 4171693.88898 872121.47559 4730012.31102 11.80802 48.17152 531.55105 0.85249 2.04456 6.96039 1.41289 0.72087 -3.83247 8 0 8 2.00 1999-Aug-27 09:09:49 4171692.73549 872122.13360 4730013.69224 11.80803 48.17153 531.91707 1.73262 3.70669 7.32641 2.29302 2.38300 -3.46645 8 0 8 2.00 1999-Aug-27 09:09:49 4171694.74505 872121.15787 4730014.22837 11.80801 48.17152 533.49523 0.36633 2.74730 8.90457 0.92672 1.42361 -1.88828 8 0 8 2.00 1999-Aug-27 09:09:49 4171694.12421 872121.61855 4730013.26923 11.80802 48.17152 532.43812 0.94429 2.49023 7.84746 1.50469 1.16654 -2.94539 8 0 8 2.00 1999-Aug-27 09:09:49 4171691.91409 872118.56063 4730010.82041 11.80798 48.17152 528.75333 -1.59665 2.93538 4.16268 -1.03625 1.61170 -6.63018 8 0 8 2.00 1999-Aug-27 09:09:49 4171692.34124 872119.63168 4730012.07041 11.80800 48.17153 530.10977 -0.63567 3.29414 5.51911 -0.07527 1.97045 -5.27375 8 0 8 2.00 1999-Aug-27 09:09:49 4171693.95044 872118.92806 4730011.36352 11.80798 48.17151 530.53748 -1.65370 1.75629 5.94683 -1.09331 0.43261 -4.84603 8 0 8 2.00 1999-Aug-27 09:09:49 4171698.77478 872123.61826 4730017.23896 11.80803 48.17151 538.70489 1.95004 1.44072 14.11424 2.51043 0.11703 3.32138 8 0 8 2.00 1999-Aug-27 09:09:49 4171696.31690 872121.93855 4730014.79278 11.80802 48.17151 535.04842 0.80883 1.85819 10.45776 1.36923 0.53451 -0.33509 8 0 8 2.00 1999-Aug-27 09:09:49 4171699.93122 872122.13353 4730014.69305 11.80801 48.17149 537.36011 0.26008 -0.87425 12.76946 0.82048 -2.19794 1.97660 8 0 8 2.00 1999-Aug-27 09:09:49 4171692.71934 872119.44921 4730010.43797 11.80799 48.17152 529.11529 -0.89166 1.95751 4.52463 -0.33126 0.63382 -6.26822 8 0 8 2.00 1999-Aug-27 09:09:49 4171694.34623 872120.27288 4730012.52534 11.80800 48.17152 531.84511 -0.41833 2.03737 7.25445 0.14207 0.71369 -3.53841 8 0 8 2.00 1999-Aug-27 09:09:49 4171698.31933 872121.58324 4730015.96913 11.80801 48.17151 537.18365 0.05127 1.23636 12.59299 0.61167 -0.08733 1.80014 8 0 8 2.00 1999-Aug-27 09:09:50 4171702.84287 872121.41183 4730016.87196 11.80799 48.17148 540.78592 -1.04217 -1.43477 16.19527 -0.48177 -2.75846 5.40241 8 0 8 2.00 1999-Aug-27 09:09:50 4171702.01651 872120.77607 4730015.78666 11.80799 48.17148 539.35102 -1.49537 -1.45889 14.76036 -0.93498 -2.78258 3.96750 8 0 8 2.00 1999-Aug-27 09:09:50 4171697.96665 872121.42282 4730014.00941 11.80801 48.17150 535.47126 -0.03358 0.21111 10.88061 0.52682 -1.11258 0.08775 8 0 8 2.00 1999-Aug-27 09:09:50 4171698.06741 872123.27025 4730014.87056 11.80803 48.17150 536.43084 1.75413 0.43023 11.84018 2.31453 -0.89346 1.04732 8 0 8 2.00 1999-Aug-27 09:09:50 4171697.47715 872122.11285 4730014.55863 11.80802 48.17151 535.65513 0.74202 0.82920 11.06447 1.30241 -0.49449 0.27162 8 0 8 2.00 1999-Aug-27 09:09:50 4171695.93099 872121.53096 4730013.84107 11.80801 48.17151 534.03172 0.48884 1.56712 9.44106 1.04923 0.24343 -1.35179 8 0 8 2.00 1999-Aug-27 09:09:50 4171698.33345 872121.06300 4730016.19552 11.80800 48.17151 537.29057 -0.46085 1.45637 12.69991 0.09955 0.13268 1.90706 8 0 8 2.00 1999-Aug-27 09:09:50 4171698.99778 872119.04693 4730014.73850 11.80797 48.17150 536.36341 -2.57019 0.30753 11.77275 -2.00980 -1.01615 0.97990 8 0 8 2.00 1999-Aug-27 09:09:50 4171700.49335 872120.52372 4730016.15343 11.80799 48.17150 538.59557 -1.43070 -0.06486 14.00492 -0.87031 -1.38854 3.21206 8 0 8 2.00 1999-Aug-27 09:09:50 4171698.95491 872119.42953 4730014.64769 11.80798 48.17150 536.31997 -2.18692 0.21990 11.72931 -1.62652 -1.10378 0.93646 8 0 8 2.00 1999-Aug-27 09:09:50 4171694.91363 872119.32794 4730011.01302 11.80799 48.17150 530.95964 -1.45938 0.75904 6.36899 -0.89899 -0.56465 -4.42387 8 0 8 2.00 1999-Aug-27 09:09:50 4171697.82660 872120.73732 4730015.03615 11.80800 48.17151 536.05135 -0.67591 1.10252 11.46070 -0.11552 -0.22117 0.66784 8 0 8 2.00 1999-Aug-27 09:09:50 4171694.91545 872119.66285 4730015.21448 11.80799 48.17153 534.13723 -1.13193 3.50861 9.54657 -0.57153 2.18492 -1.24628 8 0 8 2.00 1999-Aug-27 09:09:50 4171696.86850 872120.26149 4730015.84651 11.80799 48.17152 535.96481 -0.94562 2.41432 11.37416 -0.38522 1.09064 0.58130 8 0 8 2.00 1999-Aug-27 09:09:50 4171696.36160 872121.23412 4730014.59953 11.80801 48.17151 534.83747 0.11016 1.80412 10.24682 0.67055 0.48044 -0.54604 8 0 8 2.00 1999-Aug-27 09:09:50 4171701.56924 872120.98524 4730016.67753 11.80799 48.17149 539.75141 -1.19911 -0.57044 15.16076 -0.63871 -1.89412 4.36790 8 0 8 2.00 1999-Aug-27 09:09:50 4171697.96372 872120.36959 4730014.86898 11.80799 48.17151 535.96612 -1.06392 0.94709 11.37546 -0.50353 -0.37659 0.58261 8 0 8 2.00 1999-Aug-27 09:09:50 4171695.67864 872120.24905 4730015.51454 11.80800 48.17153 534.93902 -0.71431 3.06268 10.34836 -0.15392 1.73900 -0.44449 8 0 8 2.00 1999-Aug-27 09:09:50 4171695.61797 872119.66446 4730012.14034 11.80799 48.17151 532.30537 -1.27411 0.94581 7.71471 -0.71372 -0.37788 -3.07814 8 0 8 2.00 1999-Aug-27 09:09:50 4171694.70504 872120.00385 4730015.66271 11.80800 48.17153 534.38041 -0.75509 3.90900 9.78976 -0.19469 2.58532 -1.00310 8 0 8 2.00 1999-Aug-27 09:09:50 4171697.96362 872117.63495 4730013.26957 11.80796 48.17150 534.40106 -3.74068 0.29750 9.81040 -3.18028 -1.02619 -0.98246 8 0 8 2.00 1999-Aug-27 09:09:50 4171695.31041 872119.53022 4730015.41819 11.80799 48.17153 534.52875 -1.34258 3.37662 9.93810 -0.78218 2.05293 -0.85476 8 0 8 2.00 1999-Aug-27 09:09:50 4171697.58165 872120.93185 4730014.07771 11.80800 48.17150 535.20383 -0.43538 0.61233 10.61317 0.12502 -0.71135 -0.17969 8 0 8 2.00 1999-Aug-27 09:09:50 4171696.51831 872120.99038 4730016.69091 11.80800 48.17153 536.46489 -0.16049 3.12174 11.87423 0.39990 1.79805 1.08138 8 0 8 2.00 1999-Aug-27 09:09:50 4171693.97586 872119.92486 4730014.49029 11.80800 48.17153 533.02001 -0.68320 3.67101 8.42935 -0.12280 2.34732 -2.36350 8 0 8 2.00 1999-Aug-27 09:09:51 4171698.83160 872120.75418 4730016.64600 11.80799 48.17151 537.90928 -0.86506 1.44054 13.31863 -0.30467 0.11686 2.52577 8 0 8 2.00 1999-Aug-27 09:09:51 4171696.18843 872119.27186 4730016.09547 11.80798 48.17153 535.57133 -1.77514 3.22728 10.98067 -1.21475 1.90360 0.18781 8 0 8 2.00 1999-Aug-27 09:09:51 4171697.89322 872120.01620 4730016.28941 11.80799 48.17152 536.93029 -1.39541 1.99969 12.33964 -0.83501 0.67600 1.54678 8 0 8 2.00 1999-Aug-27 09:09:51 4171696.38829 872121.01874 4730015.74659 11.80800 48.17152 535.68023 -0.10612 2.58247 11.08957 0.45427 1.25879 0.29672 8 0 8 2.00 1999-Aug-27 09:09:51 4171700.25159 872121.10186 4730018.51246 11.80799 48.17151 540.27446 -0.81532 1.59657 15.68381 -0.25493 0.27288 4.89095 8 0 8 2.00 1999-Aug-27 09:09:51 4171696.90037 872120.36655 4730016.36339 11.80799 48.17152 536.38510 -0.84930 2.71977 11.79445 -0.28890 1.39608 1.00159 8 0 8 2.00 1999-Aug-27 09:09:51 4171701.64901 872119.70392 4730014.45594 11.80797 48.17148 537.97323 -2.46964 -1.91482 13.38257 -1.90924 -3.23851 2.58971 8 0 8 2.00 1999-Aug-27 09:09:51 4171700.20246 872120.82816 4730016.33308 11.80799 48.17150 538.58109 -1.07318 0.22070 13.99043 -0.51278 -1.10299 3.19758 8 0 8 2.00 1999-Aug-27 09:09:51 4171702.14608 872122.16969 4730017.91153 11.80800 48.17149 541.20912 -0.15776 -0.34881 16.61847 0.40263 -1.67250 5.82561 8 0 8 2.00 1999-Aug-27 09:09:51 4171702.41600 872123.04642 4730018.46547 11.80801 48.17149 541.91773 0.64518 -0.30995 17.32708 1.20558 -1.63364 6.53422 8 0 8 2.00 1999-Aug-27 09:09:51 4171701.52501 872121.15522 4730017.63574 11.80799 48.17150 540.45975 -1.02367 0.07494 15.86909 -0.46328 -1.24875 5.07623 8 0 8 2.00 1999-Aug-27 09:09:51 4171702.39338 872121.07577 4730015.33413 11.80799 48.17148 539.30073 -1.27914 -2.08126 14.71008 -0.71874 -3.40495 3.91722 8 0 8 2.00 1999-Aug-27 09:09:51 4171696.73145 872121.04089 4730012.73463 11.80800 48.17150 533.66292 -0.15467 0.32012 9.07226 0.40573 -1.00357 -1.72059 8 0 8 2.00 1999-Aug-27 09:09:51 4171697.67677 872122.41218 4730013.72534 11.80802 48.17150 535.20537 0.99416 0.08223 10.61471 1.55456 -1.24145 -0.17814 8 0 8 2.00 1999-Aug-27 09:09:51 4171695.86896 872121.72592 4730014.85420 11.80801 48.17152 534.77276 0.69237 2.25829 10.18210 1.25276 0.93461 -0.61075 8 0 8 2.00 1999-Aug-27 09:09:51 4171696.10789 872122.22229 4730013.55864 11.80802 48.17151 534.03109 1.12933 1.14432 9.44044 1.68973 -0.17937 -1.35242 8 0 8 2.00 1999-Aug-27 09:09:51 4171695.48384 872121.78626 4730016.30946 11.80802 48.17153 535.61398 0.83023 3.50051 11.02332 1.39063 2.17682 0.23046 8 0 8 2.00 1999-Aug-27 09:09:51 4171691.53135 872119.74984 4730009.87138 11.80800 48.17152 527.95861 -0.35429 2.40029 3.36795 0.20611 1.07661 -7.42490 8 0 8 2.00 1999-Aug-27 09:09:51 4171696.37945 872122.22381 4730014.64761 11.80802 48.17151 535.02001 1.07525 1.67226 10.42935 1.63565 0.34857 -0.36350 8 0 8 2.00 1999-Aug-27 09:09:51 4171695.04039 872121.88908 4730015.95157 11.80802 48.17153 535.07184 1.02162 3.56959 10.48119 1.58201 2.24590 -0.31167 8 0 8 2.00 1999-Aug-27 09:09:51 4171696.23661 872119.92847 4730013.67553 11.80799 48.17151 533.88918 -1.14229 1.47815 9.29853 -0.58189 0.15447 -1.49433 8 0 8 2.00 1999-Aug-27 09:09:51 4171692.28530 872118.72674 4730012.67859 11.80799 48.17153 530.40294 -1.51002 3.87852 5.81228 -0.94962 2.55484 -4.98057 8 0 8 2.00 1999-Aug-27 09:09:51 4171693.05010 872119.25337 4730012.77064 11.80799 48.17153 531.04265 -1.15103 3.30178 6.45200 -0.59064 1.97810 -4.34086 8 0 8 2.00 1999-Aug-27 09:09:51 4171691.22178 872118.53771 4730012.43732 11.80799 48.17154 529.50310 -1.47742 4.52215 4.91244 -0.91702 3.19847 -5.88041 8 0 8 2.00 1999-Aug-27 09:09:51 4171692.09931 872120.21916 4730013.08458 11.80801 48.17153 530.78771 -0.01112 4.05737 6.19706 0.54928 2.73369 -4.59580 8 0 8 2.00 1999-Aug-27 09:09:52 4171695.04379 872119.92570 4730015.55920 11.80799 48.17153 534.51374 -0.90091 3.60481 9.92309 -0.34051 2.28113 -0.86977 8 0 8 2.00 1999-Aug-27 09:09:52 4171693.23156 872118.99750 4730013.93497 11.80799 48.17153 531.99378 -1.43862 3.98494 7.40313 -0.87822 2.66126 -3.38973 8 0 8 2.00 1999-Aug-27 09:09:52 4171695.03156 872120.49094 4730012.72603 11.80800 48.17151 532.47177 -0.34513 1.63810 7.88112 0.21527 0.31441 -2.91174 8 0 8 2.00 1999-Aug-27 09:09:52 4171692.44555 872120.19115 4730011.21601 11.80800 48.17152 529.61756 -0.10939 2.56295 5.02691 0.45101 1.23926 -5.76595 8 0 8 2.00 1999-Aug-27 09:09:52 4171694.96610 872122.50465 4730013.16719 11.80803 48.17151 533.03259 1.63937 1.67300 8.44193 2.19976 0.34932 -2.35093 8 0 8 2.00 1999-Aug-27 09:09:52 4171699.52572 872122.18187 4730015.95146 11.80801 48.17150 538.03970 0.39037 0.25338 13.44904 0.95077 -1.07030 2.65619 8 0 8 2.00 1999-Aug-27 09:09:52 4171699.39159 872123.42002 4730017.00027 11.80803 48.17151 538.90262 1.62977 0.86188 14.31197 2.19016 -0.46181 3.51911 8 0 8 2.00 1999-Aug-27 09:09:52 4171700.85857 872121.23598 4730014.03652 11.80799 48.17148 537.35377 -0.80825 -1.85162 12.76312 -0.24785 -3.17530 1.97026 8 0 8 2.00 1999-Aug-27 09:09:52 4171695.99802 872121.62962 4730015.63340 11.80801 48.17152 535.42448 0.57169 2.69849 10.83383 1.13209 1.37480 0.04097 8 0 8 2.00 1999-Aug-27 09:09:52 4171696.81760 872122.02495 4730014.47354 11.80802 48.17151 535.14919 0.79094 1.26692 10.55853 1.35134 -0.05677 -0.23432 8 0 8 2.00 1999-Aug-27 09:09:52 4171696.77624 872121.03798 4730015.86061 11.80800 48.17152 536.02106 -0.16667 2.37262 11.43041 0.39372 1.04893 0.63755 8 0 8 2.00 1999-Aug-27 09:09:52 4171697.54798 872121.26017 4730014.07443 11.80800 48.17150 535.22421 -0.10711 0.58464 10.63355 0.45329 -0.73904 -0.15931 8 0 8 2.00 1999-Aug-27 09:09:52 4171693.40606 872120.75431 4730012.00122 11.80801 48.17152 530.90653 0.24531 2.30017 6.31587 0.80570 0.97648 -4.47699 8 0 8 2.00 1999-Aug-27 09:09:52 4171698.56341 872122.08972 4730014.39904 11.80801 48.17150 536.24216 0.49709 -0.06599 11.65150 1.05749 -1.38968 0.85864 8 0 8 2.00 1999-Aug-27 09:09:52 4171693.73627 872121.18501 4730013.50677 11.80801 48.17152 532.30271 0.59932 2.99770 7.71205 1.15972 1.67401 -3.08080 8 0 8 2.00 1999-Aug-27 09:09:52 4171696.12716 872120.24567 4730014.87457 11.80799 48.17152 534.75448 -0.80940 2.30926 10.16382 -0.24900 0.98558 -0.62904 8 0 8 2.00 1999-Aug-27 09:09:52 4171693.65943 872120.62653 4730013.27054 11.80801 48.17152 532.00031 0.06838 2.98136 7.40966 0.62877 1.65767 -3.38320 8 0 8 2.00 1999-Aug-27 09:09:52 4171695.65975 872119.17529 4730010.79326 11.80798 48.17150 531.26212 -1.76148 0.09155 6.67146 -1.20109 -1.23213 -4.12139 8 0 8 2.00 1999-Aug-27 09:09:52 4171697.36064 872119.74163 4730016.60157 11.80798 48.17152 536.77776 -1.55518 2.63819 12.18711 -0.99478 1.31451 1.39425 8 0 8 2.00 1999-Aug-27 09:09:52 4171698.10737 872120.08051 4730014.83040 11.80799 48.17151 535.99169 -1.37628 0.86067 11.40103 -0.81589 -0.46302 0.60817 8 0 8 2.00 1999-Aug-27 09:09:52 4171699.43396 872119.52246 4730015.30587 11.80798 48.17150 537.13581 -2.19398 0.29527 12.54516 -1.63359 -1.02841 1.75230 8 0 8 2.00 1999-Aug-27 09:09:52 4171698.65651 872119.95153 4730014.43009 11.80798 48.17150 536.03427 -1.61490 0.21284 11.44361 -1.05451 -1.11085 0.65075 8 0 8 2.00 1999-Aug-27 09:09:52 4171698.85831 872120.69157 4730013.06029 11.80799 48.17149 535.24630 -0.93181 -0.96071 10.65564 -0.37142 -2.28440 -0.13722 8 0 8 2.00 1999-Aug-27 09:09:52 4171702.09735 872123.13976 4730015.91420 11.80802 48.17148 539.82139 0.80175 -1.79321 15.23074 1.36215 -3.11690 4.43788 8 0 8 2.00 1999-Aug-27 09:09:52 4171702.62734 872123.95096 4730018.75188 11.80803 48.17149 542.39255 1.48733 -0.41100 17.80190 2.04773 -1.73469 7.00904 8 0 8 2.00 1999-Aug-27 09:09:53 4171699.55810 872122.98705 4730018.84565 11.80802 48.17152 540.32731 1.17189 2.03714 15.73665 1.73229 0.71345 4.94380 8 0 8 2.00 1999-Aug-27 09:09:53 4171702.58397 872123.63153 4730018.69268 11.80802 48.17149 542.27653 1.18353 -0.37015 17.68588 1.74393 -1.69384 6.89302 8 0 8 2.00 1999-Aug-27 09:09:53 4171700.84003 872121.91546 4730015.96144 11.80800 48.17149 538.86875 -0.13936 -0.65797 14.27810 0.42104 -1.98165 3.48524 8 0 8 2.00 1999-Aug-27 09:09:53 4171698.83605 872121.90151 4730015.09620 11.80801 48.17150 536.91394 0.25708 0.22878 12.32328 0.81747 -1.09491 1.53043 8 0 8 2.00 1999-Aug-27 09:09:53 4171700.53178 872121.94771 4730014.08790 11.80801 48.17148 537.27587 -0.04471 -1.68753 12.68522 0.51569 -3.01121 1.89236 8 0 8 2.00 1999-Aug-27 09:09:53 4171695.59403 872118.37755 4730013.28540 11.80797 48.17151 532.96736 -2.52889 1.92315 8.37670 -1.96850 0.59946 -2.41616 8 0 8 2.00 1999-Aug-27 09:09:53 4171695.48056 872119.79763 4730013.15611 11.80799 48.17151 532.99074 -1.11564 1.70314 8.40008 -0.55524 0.37946 -2.39278 8 0 8 2.00 1999-Aug-27 09:09:53 4171692.67114 872119.28211 4730009.45309 11.80799 48.17151 528.32714 -1.04535 1.36132 3.73649 -0.48496 0.03764 -7.05637 8 0 8 2.00 1999-Aug-27 09:09:53 4171694.87757 872120.03120 4730011.45064 11.80800 48.17151 531.35817 -0.76362 0.96996 6.76751 -0.20323 -0.35373 -4.02534 8 0 8 2.00 1999-Aug-27 09:09:53 4171696.40916 872121.56224 4730012.62425 11.80801 48.17150 533.44143 0.42160 0.40208 8.85078 0.98200 -0.92160 -1.94208 8 0 8 2.00 1999-Aug-27 09:09:53 4171697.17786 872121.32476 4730013.35249 11.80801 48.17150 534.45346 0.03185 0.36328 9.86281 0.59224 -0.96040 -0.93005 8 0 8 2.00 1999-Aug-27 09:09:53 4171699.43371 872120.90242 4730012.49127 11.80799 48.17148 535.22669 -0.84317 -1.79203 10.63603 -0.28278 -3.11572 -0.15683 8 0 8 2.00 1999-Aug-27 09:09:53 4171703.10351 872120.89149 4730014.17359 11.80798 48.17147 538.87438 -1.60484 -3.34508 14.28373 -1.04444 -4.66876 3.49087 8 0 8 2.00 1999-Aug-27 09:09:53 4171701.43138 872120.85068 4730013.92046 11.80799 48.17148 537.58864 -1.30260 -2.28806 12.99798 -0.74221 -3.61175 2.20513 8 0 8 2.00 1999-Aug-27 09:09:53 4171699.00645 872119.88430 4730014.06178 11.80798 48.17150 535.97909 -1.75232 -0.27777 11.38844 -1.19192 -1.60145 0.59558 8 0 8 2.00 1999-Aug-27 09:09:53 4171698.56922 872120.59969 4730016.07177 11.80799 48.17151 537.28904 -0.96259 1.27252 12.69838 -0.40220 -0.05117 1.90553 8 0 8 2.00 1999-Aug-27 09:09:53 4171702.77367 872122.96953 4730017.52657 11.80801 48.17149 541.44111 0.49672 -1.18525 16.85045 1.05712 -2.50894 6.05760 8 0 8 2.00 1999-Aug-27 09:09:53 4171699.57639 872121.08073 4730013.42677 11.80800 48.17149 536.04124 -0.69784 -1.29940 11.45059 -0.13744 -2.62309 0.65773 8 0 8 2.00 1999-Aug-27 09:09:53 4171699.06515 872120.17241 4730014.85069 11.80799 48.17150 536.64458 -1.48231 0.16160 12.05393 -0.92192 -1.16208 1.26107 8 0 8 2.00 1999-Aug-27 09:09:53 4171699.00560 872118.70622 4730015.36338 11.80797 48.17150 536.78764 -2.90530 0.77052 12.19699 -2.34490 -0.55317 1.40413 8 0 8 2.00 1999-Aug-27 09:09:53 4171697.49105 872120.49015 4730015.94210 11.80799 48.17152 536.47364 -0.84919 1.98914 11.88299 -0.28880 0.66545 1.09013 8 0 8 2.00 1999-Aug-27 09:09:53 4171696.04833 872120.90365 4730013.70680 11.80800 48.17151 533.92266 -0.14921 1.48764 9.33200 0.41119 0.16396 -1.46086 8 0 8 2.00 1999-Aug-27 09:09:53 4171697.41805 872121.32736 4730014.77169 11.80801 48.17151 535.66812 -0.01476 1.13417 11.07747 0.54564 -0.18952 0.28461 8 0 8 2.00 1999-Aug-27 09:09:53 4171699.20192 872120.79325 4730013.27143 11.80799 48.17149 535.64181 -0.90260 -1.08603 11.05116 -0.34221 -2.40972 0.25830 8 0 8 2.00 1999-Aug-27 09:09:53 4171699.87114 872118.81715 4730014.46100 11.80797 48.17149 536.69540 -2.97383 -0.47950 12.10474 -2.41344 -1.80319 1.31188 8 0 8 2.00 1999-Aug-27 09:09:54 4171699.56085 872118.02418 4730015.71985 11.80796 48.17150 537.32264 -3.68653 0.70727 12.73199 -3.12613 -0.61642 1.93913 8 0 8 2.00 1999-Aug-27 09:09:54 4171701.47217 872120.01082 4730017.82587 11.80798 48.17150 540.41074 -2.13305 0.41478 15.82009 -1.57265 -0.90891 5.02723 8 0 8 2.00 1999-Aug-27 09:09:54 4171697.52389 872118.48211 4730015.10330 11.80797 48.17151 535.59601 -2.82146 1.71197 11.00536 -2.26106 0.38829 0.21250 8 0 8 2.00 1999-Aug-27 09:09:54 4171695.57627 872118.56208 4730016.61309 11.80797 48.17153 535.46055 -2.34463 4.12721 10.86989 -1.78423 2.80352 0.07703 8 0 8 2.00 1999-Aug-27 09:09:54 4171695.92575 872119.17136 4730017.70129 11.80798 48.17154 536.58271 -1.81976 4.50513 11.99205 -1.25936 3.18144 1.19919 8 0 8 2.00 1999-Aug-27 09:09:54 4171700.06956 872119.83335 4730014.76660 11.80798 48.17149 537.19132 -2.01974 -0.57537 12.60066 -1.45934 -1.89906 1.80780 8 0 8 2.00 1999-Aug-27 09:09:54 4171700.15925 872120.16104 4730016.04578 11.80798 48.17150 538.24776 -1.71733 0.16234 13.65710 -1.15694 -1.16135 2.86425 8 0 8 2.00 1999-Aug-27 09:09:54 4171698.98515 872121.26475 4730016.88240 11.80800 48.17151 538.25534 -0.39673 1.40834 13.66469 0.16367 0.08466 2.87183 8 0 8 2.00 1999-Aug-27 09:09:54 4171700.97122 872119.93400 4730018.34293 11.80798 48.17151 540.45853 -2.10573 1.13671 15.86788 -1.54533 -0.18698 5.07502 8 0 8 2.00 1999-Aug-27 09:09:54 4171701.80741 872121.47275 4730019.56718 11.80800 48.17151 542.12663 -0.77065 1.10864 17.53597 -0.21025 -0.21505 6.74311 8 0 8 2.00 1999-Aug-27 09:09:54 4171699.27688 872120.96832 4730016.71036 11.80800 48.17151 538.27714 -0.74658 1.12603 13.68648 -0.18618 -0.19766 2.89363 8 0 8 2.00 1999-Aug-27 09:09:54 4171699.35165 872119.53223 4730013.59905 11.80798 48.17149 535.81159 -2.16758 -0.78447 11.22093 -1.60718 -2.10816 0.42808 8 0 8 2.00 1999-Aug-27 09:09:54 4171696.04914 872118.70755 4730012.16756 11.80797 48.17150 532.47653 -2.29901 0.79538 7.88587 -1.73861 -0.52830 -2.90699 8 0 8 2.00 1999-Aug-27 09:09:54 4171697.64791 872120.01524 4730013.29576 11.80799 48.17150 534.53933 -1.34615 0.18228 9.94867 -0.78576 -1.14140 -0.84419 8 0 8 2.00 1999-Aug-27 09:09:54 4171698.50860 872121.40987 4730013.76595 11.80800 48.17149 535.64185 -0.15716 -0.34456 11.05120 0.40324 -1.66825 0.25834 8 0 8 2.00 1999-Aug-27 09:09:54 4171697.76601 872122.01250 4730018.21739 11.80801 48.17153 538.55630 0.58468 3.07385 13.96565 1.14508 1.75017 3.17279 8 0 8 2.00 1999-Aug-27 09:09:54 4171697.87418 872121.62715 4730016.09601 11.80801 48.17151 536.99360 0.18535 1.63896 12.40295 0.74575 0.31528 1.61009 8 0 8 2.00 1999-Aug-27 09:09:54 4171695.00694 872119.78269 4730014.73859 11.80799 48.17153 533.85871 -1.03335 3.10623 9.26805 -0.47295 1.78255 -1.52480 8 0 8 2.00 1999-Aug-27 09:09:54 4171692.98447 872119.03661 4730010.52806 11.80799 48.17151 529.29918 -1.34977 1.88712 4.70852 -0.78938 0.56343 -6.08433 8 0 8 2.00 1999-Aug-27 09:09:54 4171696.08776 872119.17869 4730010.66490 11.80798 48.17149 531.44633 -1.84574 -0.30675 6.85568 -1.28535 -1.63044 -3.93718 8 0 8 2.00 1999-Aug-27 09:09:54 4171696.88518 872119.27883 4730013.87921 11.80798 48.17151 534.37567 -1.91090 1.24000 9.78502 -1.35050 -0.08369 -1.00784 8 0 8 2.00 1999-Aug-27 09:09:54 4171700.50795 872120.62964 4730015.40532 11.80799 48.17149 538.06210 -1.33001 -0.59057 13.47145 -0.76961 -1.91426 2.67859 8 0 8 2.00 1999-Aug-27 09:09:54 4171696.69454 872120.26372 4730015.92500 11.80799 48.17152 535.91004 -0.90784 2.59321 11.31939 -0.34744 1.26953 0.52653 8 0 8 2.00 1999-Aug-27 09:09:54 4171699.74691 872119.07327 4730013.60269 11.80797 48.17149 536.00969 -2.69771 -1.00035 11.41903 -2.13732 -2.32404 0.62617 8 0 8 2.00 1999-Aug-27 09:09:54 4171698.25774 872120.25479 4730015.86336 11.80799 48.17151 536.88334 -1.23646 1.41330 12.29269 -0.67607 0.08962 1.49983 8 0 8 2.00 1999-Aug-27 09:09:55 4171694.66342 872121.26232 4730013.93001 11.80801 48.17152 533.23387 0.48527 2.59193 8.64322 1.04566 1.26825 -2.14964 8 0 8 2.00 1999-Aug-27 09:09:55 4171691.13996 872117.89442 4730013.14412 11.80798 48.17154 529.88857 -2.09035 5.15129 5.29791 -1.52996 3.82760 -5.49494 8 0 8 2.00 1999-Aug-27 09:09:55 4171691.61574 872117.93210 4730010.55596 11.80798 48.17153 528.27575 -2.15082 3.07246 3.68509 -1.59043 1.74878 -7.10777 8 0 8 2.00 1999-Aug-27 09:09:55 4171692.44866 872119.74001 4730011.37280 11.80800 48.17152 529.67486 -0.55162 2.73404 5.08420 0.00878 1.41035 -5.70865 8 0 8 2.00 1999-Aug-27 09:09:55 4171695.43700 872120.46172 4730011.32902 11.80800 48.17150 531.69148 -0.45669 0.41516 7.10083 0.10370 -0.90852 -3.69203 8 0 8 2.00 1999-Aug-27 09:09:55 4171698.73703 872120.82502 4730015.16480 11.80800 48.17150 536.75351 -0.77637 0.51090 12.16285 -0.21598 -0.81279 1.36999 8 0 8 2.00 1999-Aug-27 09:09:55 4171698.44296 872121.33724 4730014.26434 11.80800 48.17150 535.96047 -0.21481 0.04677 11.36981 0.34558 -1.27692 0.57696 8 0 8 2.00 1999-Aug-27 09:09:55 4171700.47405 872120.81030 4730014.41915 11.80799 48.17149 537.32979 -1.14623 -1.25108 12.73913 -0.58584 -2.57476 1.94628 8 0 8 2.00 1999-Aug-27 09:09:55 4171700.63064 872120.06416 4730016.11262 11.80798 48.17150 538.59206 -1.90863 -0.12214 14.00141 -1.34823 -1.44582 3.20855 8 0 8 2.00 1999-Aug-27 09:09:55 4171698.84239 872120.93929 4730016.47208 11.80800 48.17151 537.81200 -0.68609 1.28846 13.22134 -0.12569 -0.03523 2.42848 8 0 8 2.00 1999-Aug-27 09:09:55 4171695.09195 872118.84721 4730014.58941 11.80798 48.17153 533.67537 -1.96643 3.08738 9.08472 -1.40603 1.76369 -1.70814 8 0 8 2.00 1999-Aug-27 09:09:55 4171697.29848 872120.51168 4730012.46125 11.80800 48.17150 533.75714 -0.78871 -0.19508 9.16648 -0.22831 -1.51876 -1.62637 8 0 8 2.00 1999-Aug-27 09:09:55 4171695.89876 872121.66594 4730013.12868 11.80801 48.17151 533.49827 0.62755 1.09495 8.90761 1.18795 -0.22873 -1.88524 8 0 8 2.00 1999-Aug-27 09:09:55 4171694.73702 872121.00956 4730012.93178 11.80801 48.17151 532.50360 0.22280 1.91106 7.91294 0.78319 0.58737 -2.87992 8 0 8 2.00 1999-Aug-27 09:09:55 4171697.63379 872120.12947 4730017.11196 11.80799 48.17152 537.38932 -1.23145 2.72020 12.79866 -0.67105 1.39652 2.00581 8 0 8 2.00 1999-Aug-27 09:09:55 4171697.68904 872120.92572 4730014.98815 11.80800 48.17151 535.95150 -0.46335 1.14212 11.36084 0.09704 -0.18157 0.56799 8 0 8 2.00 1999-Aug-27 09:09:55 4171696.62000 872121.40895 4730015.03597 11.80801 48.17151 535.35521 0.22841 1.88006 10.76456 0.78881 0.55637 -0.02830 8 0 8 2.00 1999-Aug-27 09:09:55 4171696.80247 872122.90648 4730015.18747 11.80803 48.17151 535.79159 1.65692 1.61966 11.20094 2.21731 0.29597 0.40808 8 0 8 2.00 1999-Aug-27 09:09:55 4171696.34658 872121.43321 4730014.71267 11.80801 48.17151 534.93914 0.30811 1.86018 10.34848 0.86850 0.53649 -0.44437 8 0 8 2.00 1999-Aug-27 09:09:55 4171694.29667 872122.67858 4730015.04264 11.80803 48.17153 534.01681 1.94661 3.38549 9.42615 2.50700 2.06180 -1.36670 8 0 8 2.00 1999-Aug-27 09:09:55 4171692.13831 872120.65659 4730012.69678 11.80801 48.17153 530.58391 0.40908 3.70360 5.99326 0.96947 2.37992 -4.79960 8 0 8 2.00 1999-Aug-27 09:09:55 4171694.23194 872120.44410 4730014.42863 11.80800 48.17153 533.21209 -0.22734 3.36393 8.62143 0.33305 2.04025 -2.17142 8 0 8 2.00 1999-Aug-27 09:09:55 4171698.32126 872121.37567 4730014.16697 11.80800 48.17150 535.81371 -0.15230 0.06473 11.22306 0.40810 -1.25895 0.43020 8 0 8 2.00 1999-Aug-27 09:09:55 4171700.76351 872121.36473 4730014.66514 11.80800 48.17149 537.77771 -0.66277 -1.38269 13.18705 -0.10237 -2.70638 2.39420 8 0 8 2.00 1999-Aug-27 09:09:55 4171698.49522 872121.81732 4730017.24078 11.80801 48.17151 538.27798 0.24441 1.92044 13.68732 0.80481 0.59675 2.89446 8 0 8 2.00 1999-Aug-27 09:09:56 4171702.81391 872120.88969 4730019.62976 11.80798 48.17150 542.75072 -1.54733 0.50516 18.16006 -0.98694 -0.81853 7.36721 8 0 8 2.00 1999-Aug-27 09:09:56 4171701.38777 872121.82179 4730016.31742 11.80800 48.17149 539.47878 -0.34312 -0.80579 14.88813 0.21728 -2.12947 4.09527 8 0 8 2.00 1999-Aug-27 09:09:56 4171698.54403 872121.95492 4730016.61772 11.80801 48.17151 537.86435 0.36911 1.44834 13.27369 0.92950 0.12465 2.48084 8 0 8 2.00 1999-Aug-27 09:09:56 4171697.17901 872121.11271 4730014.63374 11.80800 48.17151 535.37999 -0.17595 1.24925 10.78934 0.38444 -0.07443 -0.00352 8 0 8 2.00 1999-Aug-27 09:09:56 4171697.09264 872121.25042 4730015.91479 11.80801 48.17152 536.29696 -0.02348 2.14559 11.70631 0.53691 0.82190 0.91345 8 0 8 2.00 1999-Aug-27 09:09:56 4171699.59055 872121.84221 4730017.91063 11.80801 48.17151 539.49553 0.04463 1.56446 14.90488 0.60503 0.24077 4.11202 8 0 8 2.00 1999-Aug-27 09:09:56 4171698.84582 872123.26530 4730017.29305 11.80803 48.17151 538.74340 1.59001 1.47880 14.15275 2.15040 0.15511 3.35989 8 0 8 2.00 1999-Aug-27 09:09:56 4171699.81090 872122.81339 4730017.99797 11.80802 48.17151 539.83699 0.95017 1.31390 15.24634 1.51057 -0.00979 4.45348 8 0 8 2.00 1999-Aug-27 09:09:56 4171695.03670 872121.57796 4730013.48874 11.80802 48.17152 533.19182 0.71784 1.97725 8.60116 1.27823 0.65357 -2.19169 8 0 8 2.00 1999-Aug-27 09:09:56 4171695.04848 872121.21140 4730012.33657 11.80801 48.17151 532.29094 0.35663 1.25617 7.70029 0.91702 -0.06751 -3.09257 8 0 8 2.00 1999-Aug-27 09:09:56 4171696.40730 872120.50518 4730012.20451 11.80800 48.17150 532.98318 -0.61271 0.28470 8.39253 -0.05231 -1.03899 -2.40033 8 0 8 2.00 1999-Aug-27 09:09:56 4171698.72748 872122.45637 4730013.79140 11.80802 48.17149 535.94652 0.82241 -0.64680 11.35587 1.38280 -1.97049 0.56301 8 0 8 2.00 1999-Aug-27 09:09:56 4171703.96739 872123.84066 4730015.02347 11.80802 48.17146 540.47407 1.10515 -3.85808 15.88342 1.66555 -5.18176 5.09056 8 0 8 2.00 1999-Aug-27 09:09:56 4171703.16871 872124.16891 4730018.17486 11.80803 48.17149 542.34574 1.58989 -1.22392 17.75508 2.15029 -2.54761 6.96222 8 0 8 2.00 1999-Aug-27 09:09:56 4171703.21681 872124.67995 4730017.42717 11.80803 48.17148 541.88974 2.08027 -1.83557 17.29909 2.64067 -3.15925 6.50623 8 0 8 2.01 1999-Aug-27 09:09:56 4171698.14915 872123.13212 4730014.62054 11.80803 48.17150 536.27904 1.60220 0.22493 11.68838 2.16260 -1.09876 0.89552 8 0 8 2.01 1999-Aug-27 09:09:56 4171695.66717 872121.19840 4730014.80982 11.80801 48.17152 534.53597 0.21730 2.45632 9.94532 0.77769 1.13263 -0.84754 8 0 8 2.01 1999-Aug-27 09:09:56 4171692.34626 872121.02784 4730013.88176 11.80802 48.17154 531.65330 0.72991 4.28558 7.06264 1.29031 2.96190 -3.73022 8 0 8 2.01 1999-Aug-27 09:09:56 4171692.34564 872120.26465 4730012.93450 11.80801 48.17153 530.84290 -0.01700 3.77068 6.25224 0.54340 2.44699 -4.54062 8 0 8 2.01 1999-Aug-27 09:09:56 4171693.95977 872120.82300 4730013.50194 11.80801 48.17152 532.39561 0.19923 2.88666 7.80495 0.75963 1.56298 -2.98790 8 0 8 2.01 1999-Aug-27 09:09:56 4171695.05282 872119.83008 4730012.62738 11.80799 48.17151 532.32197 -0.99635 1.65757 7.73131 -0.43595 0.33388 -3.06154 8 0 8 2.01 1999-Aug-27 09:09:56 4171696.47160 872120.57611 4730013.39240 11.80800 48.17151 533.91999 -0.55644 1.01918 9.32934 0.00396 -0.30451 -1.46352 8 0 8 2.01 1999-Aug-27 09:09:56 4171697.75946 872119.66939 4730013.00066 11.80798 48.17150 534.34505 -1.70751 -0.04315 9.75440 -1.14711 -1.36683 -1.03846 8 0 8 2.01 1999-Aug-27 09:09:56 4171703.14076 872121.84367 4730015.53427 11.80800 48.17147 540.04255 -0.68043 -2.61000 15.45189 -0.12003 -3.93369 4.65903 8 0 8 2.01 1999-Aug-27 09:09:56 4171698.28961 872119.68208 4730016.38749 11.80798 48.17151 537.21654 -1.80357 1.82693 12.62588 -1.24318 0.50325 1.83302 8 0 8 2.01 1999-Aug-27 09:09:57 4171696.78284 872120.08408 4730018.16576 11.80799 48.17153 537.61286 -1.10174 4.05057 13.02221 -0.54134 2.72689 2.22935 8 0 8 2.01 1999-Aug-27 09:09:57 4171698.09506 872121.58882 4730017.83281 11.80801 48.17152 538.42673 0.10263 2.64198 13.83607 0.66303 1.31829 3.04322 8 0 8 2.01 1999-Aug-27 09:09:57 4171694.53161 872120.85652 4730014.14116 11.80801 48.17152 533.24979 0.11503 2.89076 8.65913 0.67542 1.56707 -2.13372 8 0 8 2.01 1999-Aug-27 09:09:57 4171696.70845 872120.53157 4730012.67682 11.80800 48.17150 533.53531 -0.64849 0.37600 8.94466 -0.08810 -0.94768 -1.84820 8 0 8 2.01 1999-Aug-27 09:09:57 4171694.17822 872118.68139 4730010.44278 11.80798 48.17151 529.96643 -1.94176 1.01372 5.37577 -1.38136 -0.30997 -5.41709 8 0 8 2.01 1999-Aug-27 09:09:57 4171691.32413 872117.63219 4730011.88793 11.80797 48.17154 529.03697 -2.38472 4.21918 4.44632 -1.82432 2.89550 -6.34654 8 0 8 2.01 1999-Aug-27 09:09:57 4171692.97155 872119.33808 4730014.66730 11.80799 48.17154 532.41622 -1.05204 4.61105 7.82556 -0.49165 3.28736 -2.96729 8 0 8 2.01 1999-Aug-27 09:09:57 4171694.68080 872119.33214 4730014.88370 11.80799 48.17153 533.69244 -1.40763 3.50959 9.10178 -0.84723 2.18590 -1.69108 8 0 8 2.01 1999-Aug-27 09:09:57 4171696.92551 872119.56632 4730015.31227 11.80798 48.17152 535.50907 -1.63774 2.12246 10.91842 -1.07735 0.79877 0.12556 8 0 8 2.01 1999-Aug-27 09:09:57 4171697.91641 872121.05163 4730017.21901 11.80800 48.17152 537.77942 -0.38664 2.44485 13.18876 0.17376 1.12116 2.39591 8 0 8 2.01 1999-Aug-27 09:09:57 4171695.03465 872121.57041 4730012.91418 11.80802 48.17151 532.76131 0.71088 1.59672 8.17066 1.27127 0.27304 -2.62220 8 0 8 2.01 1999-Aug-27 09:09:57 4171693.25986 872122.16093 4730011.39838 11.80803 48.17151 530.55385 1.65207 1.79028 5.96319 2.21247 0.46659 -4.82967 8 0 8 2.01 1999-Aug-27 09:09:57 4171695.93617 872120.53982 4730011.61027 11.80800 48.17150 532.23757 -0.48239 0.22674 7.64692 0.07801 -1.09694 -3.14594 8 0 8 2.01 1999-Aug-27 09:09:57 4171696.66712 872121.13081 4730013.71981 11.80800 48.17151 534.36729 -0.05348 1.01035 9.77663 0.50692 -0.31334 -1.01622 8 0 8 2.01 1999-Aug-27 09:09:57 4171698.03720 872121.75260 4730015.20393 11.80801 48.17151 536.45241 0.27478 0.90600 11.86175 0.83518 -0.41769 1.06890 8 0 8 2.01 1999-Aug-27 09:09:57 4171695.58963 872119.54168 4730014.20065 11.80799 48.17152 533.80534 -1.38850 2.35923 9.21469 -0.82810 1.03554 -1.57817 8 0 8 2.01 1999-Aug-27 09:09:57 4171693.26667 872117.91775 4730013.36182 11.80797 48.17153 531.44227 -2.50270 3.74174 6.85161 -1.94231 2.41805 -3.94124 8 0 8 2.01 1999-Aug-27 09:09:57 4171693.04107 872118.77160 4730011.54268 11.80798 48.17152 530.05600 -1.62076 2.56290 5.46535 -1.06036 1.23921 -5.32751 8 0 8 2.01 1999-Aug-27 09:09:57 4171691.37081 872118.97351 4730014.02342 11.80799 48.17155 530.84173 -1.08133 5.40477 6.25108 -0.52094 4.08109 -4.54178 8 0 8 2.01 1999-Aug-27 09:09:57 4171695.89944 872120.24748 4730017.98876 11.80800 48.17154 536.92660 -0.76103 4.55194 12.33594 -0.20063 3.22825 1.54309 8 0 8 2.01 1999-Aug-27 09:09:57 4171693.60319 872120.27540 4730015.12961 11.80800 48.17154 533.30095 -0.26381 4.31574 8.71030 0.29658 2.99206 -2.08256 8 0 8 2.01 1999-Aug-27 09:09:57 4171694.51508 872119.88648 4730013.55454 11.80799 48.17152 532.66950 -0.83110 2.65951 8.07884 -0.27070 1.33583 -2.71401 8 0 8 2.01 1999-Aug-27 09:09:57 4171696.62682 872119.69056 4730014.88941 11.80799 48.17152 535.01596 -1.45501 2.03936 10.42530 -0.89461 0.71568 -0.36755 8 0 8 2.01 gnss-sdr-0.0.9/src/utils/gnuplot/8_GPS_accuracy_precision.jpeg000066400000000000000000001541521305042567700243740ustar00rootroot00000000000000ÿØÿàJFIF``ÿþ;CREATOR: gd-jpeg v1.0 (using IJG JPEG v80), quality = 90 ÿÛC     ÿÛC   ÿÀà€"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ýS¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¾vÿ‚ƒx§Zð_ì‘ã]cÃÚ½þ…«ÛÏ¥ˆoôË—·ž0úª8Y†‘™N!ˆ<á¾+hW_?nõð^£ãÿøWÃÿ ¡ÖÏÃ^%¹Ò£{¿íI¢20Àf(pN2B¯  °¨¯‹j¿Ïû?þÇÿµüJñíî§s6jzŸ‹n¯n,±©@öyKî‡zLÊûHÜ0½WÃ_³/‡téZœ~&êSY]År–wþ=¼¹·‘Ã剜‰ˆÃ!á õ }¢¾ñ/Çü*ý¸þ+øŽû]Ô/þøy¼=¥ëº4×Io¥E¨ZšŒQ“¶1𯙴d¬ìNq‘íçź¼ŸðP›OǬ޿†¤øY.¤4µºsf×?ÚÑ ¸ò³°É°•ߌí8Î(èº+;1üzÐ> Iáû+ý?Yñˆ^xoGñU®âû¯êZIâõÑŠé–SÊÁs;¸•Ø#4hèåÜOôÕÂ|*øÅ¢ü_“Ɖ£ZßÛ xŽïÃßn̺·XÙÞ-®ÙŒ‰W¶·*;üíÿ ÿ £ãì‘â_kº7„ã_‡Ãþ3»øoý7 ÑÑc“Ì2¾^ö ¼FFx«ß~?xŸÆÿµ'ǯëzUý†|"úöeÅÔ6ÑÅj­n žc¤…ÛÏ$ÏAÄjwùm„ GÑ_Xÿ×+È;ù}\ÆŽ ÐÐ4WÎðOÏêÞ,ý~kþ&Öï5N{kÉ.õMZíçš@·“¨i%–8U$ðì+ƒøÙûrø{Zøñ#Tð®ã»mMR³Ò> Zi2C¦Ó±ÀðÜ+ù¨<ýгl ˜PÙWÌ^ý«t|:ø=á»ûøÿâ¿àë `éZ§Ûo¥‡ìÉæ]LòÈŠ8a¹Ÿ%³\‡ÅÏÛ’ê ü.Ö~h>"›ûKâ$^ñ—s§[Ç{nñ£ôÇŽiT%Ì›¡S´ßtˆpìÊ+ÃüûZxsÁuOé^ñüQ¤ZG{ªØøGK[£§Ç šÒIîe!‚©f#µzŠ^øÕðóEñ¯…®d»ÐµhšKy%ŒÆà«´nŒ§£+£©ªzõ ¶ŠóÚoân³ðkàüiáí+ûkZÑ´ö¸µ³dgRù ½Õy(‹°|¨ykÅþ|Qøƒáo_ üªüJÓ~0è¾6Ñou©ì4»{VÑL$‘έoÁ¶˜¹‰|ܶìa"€>¶¢¼ßöøÃÀ/þ0ñüÖÂõ´[#,ÌHY§vXáF#G@HìMy'‡eø§Â°k^6øçñÇâì q8ðö¦¶zV;.D1Yªl’48S¿%ö“•-ÀÔtWÃÿo>.GðoàO‡> x†ûÞ.Õ~'iÞÖ5ja&§bñÝ x ˜üÅÌ®@kxÛÃú¯ìÏñ³àÕ¿…>&xÓÅ-âßcjžñV»&®&±hdy/#åâò ),§0Œ‚öUð|ÿôŸˆ?´'Äß |[øÍâ„Ú–•«}ÂþÓµ£ ZͧÓʼY°æI\¹ÚÌØÀqÀú“ö}ѼwáïͦxûÄ6~-»µÔ.J×­˜oôÍÀÚËqµ|ý¤†Ú;AËMzeV7Œ¼W§øÂ߉ui|/G²›Pº“û±D…ÜþJhfŠøCö ø“ñMø°š_ÄïjZ°ø§á¡ã­ßPº’X´×ûL¾eº¹;[Ëo&Àx¾“ø—ûKhükƒ­4xãÅcÆ‘á=8]Ëgj[jË33¢ b »qÇ r2ë”WƒÝ~ÙÞ“Ã~Ôtm{Åú§Š>Ñý›á½ Mi5Bmإϛ ”ùN ±‘”g¡#šw„¿løËÆ~𥆿iâêž”Ú~¡b¶óiWV6Âæh¯œ2)C‘[pä š÷j+Â~8~ؾ ø¯ø‹Hñ™®Þ\è~ƒÅw/¦[Âèö²ß‹D/2(•ƒ@]¼î'å§ë?¶‚|;ðÚïÇZ®›â]?BmY4}#ÏÒ\Oâ dPн„YÝ,rÛ‚gc˜$Üè¯øiûPø{â5ßxľñ>›¦mI¦xºÅ-KþY¹’IÆ NàAíÁÇ1¦þÜž Õ_M»‡Ãž2O j÷ƒOÒ|[>åiZÃ1X£ŠVpÃÌq±DD$˜ ôUãŸðÔþ“ào†~(ÛZê׺Gˆî,ì´í.cþКêâà[­¿–d æ,…ƒ ø[àœsÝ|Pø™á߃žÖ|gâ»ïìßé0‰®®<¶r`Š¡TY™•@ØPSEx_ÃïÚëÃÞ9ñç‡ü#}áø'Uñ¬×zx§J[hµ4Š1$‚IæXÎâ®Û‘X·íÝàí7þ¦·ð‡õˆ<«]é^!¸Ó4¨¦ŠÁm—ºvó€0œ¾1™1’Š$é:+Ä1þÑ´]Ô޹'‡l®ttýZBÚ\Ÿaeº„[ÈrÞ|o¼(™s“Á «h¯¾'xcQø¯ûyÝxçÆ¾ðÝ·ÃXu•±ð·ˆ®tÄ{¯íI¡22ÄÀ1(pIùWžAðßâÿÀŽ_ü!qã/|Gø}áOÅâ¹æÕîÆ£¨i7*eó,¾ÐÅK´‘Gæ*HÜ`r>b@>Ä¢¼Ã¶¿€|IðËTø‡%ˆ´_ØØÙݦ³ªi…!½’à`ZÛmf3Ϙ‰Â¢C€Í‚F×ÃßÚÃ~8ñlÞÔô|?ñ°}RÞÇÆZp±kËD I4LЄÈÜ¥ƒ¨9*8öJ+çÏþÛžñ¡¢Èš'‹l¼'®j ¦i^4¾ÑÚ-öáܤA%-½UÜmWxÕI#šå¾~Ô~ðWìÿðâïO¸ø‰ãë¯ÞjvÚŸ«Fš—‰5&‚î´*â=‘m 1p!<ƒ@VQ_*ø¿öžð_ÄOÅs/Äok6?t]çC¶4û伟s[Ã~¥ÊÉc*丛rŠôŸ‰Ÿ´ï‡þxÜx6ÏÃÞ(ñÏŠ’ÈjWzW„tÑy-•±b«$Åwv®âç/# ÃE|ù¨~Ü-ôï‡7¶ëšì>h­–§¦~Ê^*Óµ+)’æÖòÓàì‘M¨Á’Du€e``A+ìÚ(æ_‡? n5ŸÚ—ö£_ørêOøŸOðå”S_Z:ÚjQ-…Äw M»Â¶Òv–àוþÌ_ þ#ü;ý¶o4oiZ¥ÿ„ü'ðþãúŒ&·ÛêgR·¸µ‰æÛ³ÏŽ'h™3’ -Œr~>mý±ü3i¬ÍàGQøâXi·—,Þ!ð-ÜÑëÞ‘â&¶ŽT‚²H)ÚÜ ùö}㌴®«¦xß_ð–—ñ“ÃW¾›Åš`]v2-æê{Ô‰XRB1$ª§-€@¢”Pοü+¬é¶7í#­Þè÷ÖšF«†NÔn-]-ï<«9Öa „m“c ´¤€q_;Eð¯ÆIÿ‚Ó¼¹k©êGEÖ4Ë%›IÖ!º¸’Xe¸»,ßnÙœª¯ö¥ò·ìqð¿]oø'ç‡ü®XßøW]½ÑuM:k}JÚK{‹Fž{¬ñ¸ ¼H¬2:{ו_ø³ÇºoìI¬|“à—Œeñæ™áü:æßMé3¬Vͺ†éIYY‘w¬h )U Îkïê(á½JOˆÞ±ø!¢êšwÄ];á¼?ì¡¿‹ÀymLkIJmï ¡ž–0y]Ÿ9 ‘ƒÐ<ã_øpÃ?Ã@4?öž;–ÖK)õK¦Ñä¶d¬êÒ¹T¦$ØîÀ°$œæ¿Qè þ-ê;¹ý¡¼Q¥øLøyà'°²³ør¦ÞÚþV¾Ô/¯b)$æmUÝ,hMWýŒ|[}û>~Êß<'ã/x³JÖ!ñTÞ¸„éåÚÍy<°\´ŽT5¯ï¢ÏRÀ»ª€I¯²+'_ð®—â†ÒΩln†›{£l†WTYÐ0GeRí,X+‚`7*絆|mãÙÓÇZ7ë©mø§é-káM9µ ì.l¡xZÞhPïUpáÃãnIõÇÕ´PĶ2üCðgÆÿ üwñ­It_ÃWþ¾ðï…m棢«jjµ¸šbdycKåçkuéƒGÇ:×Ä{ã—_uË/ xkÄÄ'KÓ´ã.¿-•Öœ–ÑÞÜÚ)/Ÿ4?ÈåE\Œ‘_tQ@—ÿµÖ‰ñ㟋þ-øƒHø[ã+]*ûá…†•£­Æ1¸½t×à™”ÄŠK5¼–ýà•×ÙŸµ½ßt/…:Wü+›mW)­XŬ7†íc¹Õ-ôÄ\½”R++LÀ£i @â½ÒŠüíÒ~kž*ý£uë‹ üL²ðï¾jž¶ñWRææe¿’Q ’ufceU!U– X©ó‚}Ká7ÄÏèß >|'O‚ºü^1Ñ£ÓtMNç\Ó¿âAk¶Èæ½K°Û%ù#/¡-¹”cŒŸ°( „¾|>Ö$ý°u?…÷¤ü>øy®ÞüB²læ&—R‰~Çnø|™¥Ôœ{¨ôçéßÚnóǶ¼eqðÂÛí~:ŽÐ6!HùóÌ(ò´‚?0ªœ‚ÁFkOáoÁÍ/áeLj/áÔõ_ëÞ ¹ŽëT×5¹£’îèÇŽ$>Z"*" *ª2ORMw´ùía¢ë7´ÇÀYxKã&·¢è÷Z•–±®xÚÚwžnìš¶Ù+¶d™"HðGÌÛ8ïþøÄv?lK; ê–úŽ¿â¿Ï¥[Ëc"˨Ã-ŒKÀ¥s*;n S!Ž@ɯ²¨ ‚~é~/ý˜5ÿx«Zøwâ¯è>-øwá}:á´-1îïôMBÂÈE%´ö¼JŠÛ²[2à‚G¢þÈV+¼ý¡hÏøÁ·‚lüGy¡Üé°êvå<øRÍ×!ÆQ¤¡‘Q›c³)9õò޾é_?o–Ô|gà(|'O‚ºü^1Ñ£ÓtMNç\Ó¿âAk¶Èæ½K°Û%ù#/¡-¹”cŒŸ$ðà ýöNøŒ~xÚöãEÔõ׸Ô|0nl¼Ká§–ú塚 t ,‰*•Þ:mØÛ[Šý¢€?:çÐ~0xËHðJêºgõÿ i<5{áù¼Y¦×aÓ"Þn§½H…$#Jªq’Ø캅߈?gÚ£â‡/< âøWÇúv’ö—ÞÓŽ¡5•Í”/[KÈ®:¾6dœž¸ú¾ŠüøøKð?Ç^øÍð Äzÿ„ïì©âÿx¯S³Š<:wÖèÐÜJ€¤lJ®2GÌÛG Š÷ï‚ÞÖt¯Ûö’Ö¯t‹û=VƒÃOÔg¶t·¼1YN²ˆd#l›”6Òv’Ækèš(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¾'¹ý´>$Çð¾óãŠxsÂÇàå®¶tæÒškíöµßb7óä‰<Ï›È+÷xßžkíŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šüšš-:O;:kð֯㑨Ÿýšãû5®ÅþÐÿ`ÛöSmöOÞ}«nìüþfkõ–Š(Ïÿh_êžøñ/Äš%רµ­Ã:ž¡cs嬞LñZÉ$oµÁVÃ(8`AÇ ŠÊÿ…7âïú.ß?ðÃßüª£ö±ÿ“XøÉÿbf³ÿ¤3WªÐ•›ñwýoˆøáïþUQÿ oÅßô]¾ à‡¿ùU^QûUXêž/ý¦¿gŸÃâïø[B×¢ñ#ê+á}j}2K“okm$;Ú&¶¶qœãsc©ªš¦›âOÙ7ã?Ã4¶ñ÷Š|gðóÇ:±ðÕö™âýHê3ØßIÉk5½ÃáI•‘‰9äãÅÿ oÅßô]¾ à‡¿ùUGü)¿Ñvøÿ€>ÿåU|ëðá=ßÇ}WãN·â?Š_tù4¯‰:ögã+ËK[kHfS$Aö¨PäŒÆy?Ä?üVñGì·¤è:7Ä-uuƒñŸþ}Æ–—¯mu«i»åФš"¢U.J–1„’3@[ø7á×Ä­gÄ~;´Õ¾2|@±°Òu¨ì´‰ÿ²´þÙjtë9Ú]Í¥&.'¹rau·•‰êÿáMø»þ‹·Äüð÷ÿ*«Î|oñïSñì[¤x¯Ã³¾Ÿã?YYhZp„˜åµÕ¯$[GÚF ´4­ž1ä“Ú¼3Â_> øþ £à?ë·:•Þ».ŸâÈRÔtí/û^ê)ïýìÍH¨ ´Œ`õÏü)¿Ñvøÿ€>ÿåUð¦ü]ÿEÛâþø{ÿ•Uã? tQªx›Â%øñîûâ6Ž·Ñ§Š4?xŸûU$ÓHycR­%½Â6«ûµ9ÁÀàýw@Uÿ oÅßô]¾ à‡¿ùU\§Œ¾|JѼGàKM'ã'Ä ë [Z’ËWŸû+A“ìv£N¼eܺPæâ h÷>W÷»q¹” ( *ÿ…7âïú.ß?ðÃßüª£þß‹¿è»|@ÿÀòª½VŠò¯øS~.ÿ¢íñÿ|=ÿʪ?áMø»þ‹·Äüð÷ÿ*«Õh *ÿ…7âïú.ß?ðÃßüª®Sá?ï‰^+øYàÝoÄÿ> hÞ$Ô´[+ÝSNþÊÐ`û-Ô#Í—&”]6»2íbXcäWÐP•›ñwýoˆøáïþUQÿ oÅßô]¾ à‡¿ùU^«EyWü)¿Ñvøÿ€>ÿåUð¦ü]ÿEÛâþø{ÿ•Uê´PÏzg€¾"Ýü[ñ/‡føÓãØô?CÒõ KѦh¥¸¸¸Ô#ž2çKÚÁÖØ…æ’I ¸ëÿáMø»þ‹·Äüð÷ÿ*«ÒbV½Ë$ zwJwI˜Èë„àŒñûÓŽ†®P•›ñwýoˆøáïþUQÿ oÅßô]¾ à‡¿ùU^«EyWü)¿Ñvøÿ€>ÿåUr7ðÄ]Äßìtß>=º³ÖõÉtýNVÓ46Öë¦ß\¬ŠWK šÞÜÙŒne#èJ§|¬×Zy[$ºrZVeØyOûÅÏ$“„ãœH{@mÿ oÅßô]¾ à‡¿ùUGü)¿Ñvøÿ€>ÿåUz­å_ð¦ü]ÿEÛâþø{ÿ•T›ñwýoˆøáïþUWªÑ@Uÿ oÅßô]¾ à‡¿ùU\‡Áï|Eñ¿ÂOx‹_øÓãÝ7^Õô;CP²LÐ"[{‰mÒIcúYe ìÃkF0I5ô%SÑ•“H±W²M5ò•–Üí»x!zqÇP››ñwýoˆøáïþUQÿ oÅßô]¾ à‡¿ùU^«EyWü)¿Ñvøÿ€>ÿåUð¦ü]ÿEÛâþø{ÿ•Uê´PÏzg€¾"Ýü[ñ/‡føÓãØô?CÒõ KѦh¥¸¸¸Ô#ž2çKÚÁÖØ…æ’I ¸ëÿáMø»þ‹·Äüð÷ÿ*«ÒbV½Ë$ zwJwI˜Èë„àŒñûÓŽ†®P•›ñwýoˆøáïþUQÿ oÅßô]¾ à‡¿ùU^«EyWü)¿Ñvøÿ€>ÿåUrŸ<;ão…úN‰¯[übñ†·ÿ6§Í§j–:'Ùî »Õí-&G0éÑÈ3¤ñ_@W•~ÒßòN´ûü'ÿ©@«EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP•~Ö?òk?ìLÖô†jõZò¯ÚÇþMcã'ý‰šÏþÍ^«@)þÕWÚ§„?i¯ÙçÇøGÅ>)д¼Hš‹x_EŸS’ØÜZÛGõ‰NÝÍœgÚØèj®§©x“ö²øÏðÍ­¼âŸ|<ð6ª|K}©ø¿M:l÷÷ÉÇk ½»åA‘Ù” pqŸ­«'Å>,Ðü ¡]k~$Ötÿè¶»~Ѩê—Imoæ»ärr̪2y,S@%þÍÿ²Ÿƒgð'Âß[~ÕàËÍþ/…Þ×µ?éz´¶ì,n./ b´±·|3ÝjRm°àVÀ}#ãÂïØ7áéð†îâñ~‡®]ÞêÞÕ-½æ¡¦Víæ·Eœ.GÑÑŽ mÎà×Þ øƒáoˆºsêñ.‘â{ßË{­þ+¸•±¥£fãµ;ÁÞ<ðÏÄ=2mG¾"Ò|M§Ã;[Iw£ßEwJ ž6 0 ¤©9‡­|e«ønÓãÇ_…^$øwðWÅ? ¼C¢x‚=OÄ^-Öô!¡«iÈçY·9ºy‹*pŸ˜kîªÂ¶ñï†o|awá;i3øªÒÜ]Üèq_D×ÐÀvâW€6õOÞ'ÌF>uç‘Ygã/€Š¿á>9ðßü$žg•ýý¯oöÍùÆß'~üûb€\h^]®£ÜÄ8<ôzq ®ŸjþЛ“ö)<­¹ó<̾ýݶãËÆ9Îìö«QEV~§$ {¤‰®¦·‘®˜CD…ü™IGÀåv†nqÊ/°:^çí^u§ÙüŸ'Í?iós»ËØØÙâß³¯ÝßbŠ( Š( ³ü=$ècÚÝM}jÖ±®® 2L›×r@%ˆÁ9“Z_OûWö}·Û¼Ÿ·yKçýŸ>_™»fyÛœã<â€,QEQEŸ~ñêgº°µb|¸Ð¼»]F1¹ˆpyéôã:]>Õý¡6ÿ'ì>Ry[sæy™}û»mÇ—ŒsÙíV(¢Š(¯*ý¥¿äiö9øOÿR:½V¼«ö–ÿ’u¤Øçá?ýHtêõZ(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€<ƒÄßµÇÂxâ_ë7²³Öà-nÃ3ÛÚÌø ÷*†\ä|²:ŸjõúüÙø¨üC±ýƒ5¿êžð?ˆü,ºÎ¹â=[K‡¿×BÞÎ÷r½ÀaR,ª)ŠLùHKp?B¼ ®Øø£Á>Öt¸¤·Óu>ÞîÖ)†"’5tVà… á¿kù5ŒŸö&k?úC5z­yWícÿ&±ñ“þÄÍgÿHf®‹Áž;ÖüQw,:ŸÃŸx>4ÆÛjãK‘!ÖövãrÞÏ$y‡íð[Ãþ?ñ½‡Š~*x‚É>ø{G”Ë jokjú‹Ê¸º¹`ÊŽ‹تÙÃ1#¯?øþ ßö$ý¢&ÐbÕ"ø3sâ-¼ ²e.m¾ßd.Z7Î-Z^cŒn÷¯¦¿h_‚ÿ¾)ülð÷‰t=#Á߃|9fÑÙxwÇw×) jFRN¡äÛE*>#‘ù‡*L‡b’ Iñ‹áÇ?Úöqñç§ãÿ„ß´í¡7‚¼y©xÁþÔ]´þ¸¾¼Ô¯-•ƒ5´m‚Â7qsñßµÀ!6lÈPwç#qÍyìîþñgí©ñÄÿôôðÏ…í<%g¤êÚLÚ{é7º‘¹icº62"J¨°~ìJñ¨bÄ.pƼ³þ owÿ ßM±Ó.¦ò´é‡ˆ­¤™¶¢ßiú­Í¥ÚŒñ“nÖ-ôŒúWÖmðs]·ý°⭵Ɯ|9sà¡á›ËG•Öì\%鸎UQV]¬PåÁ`WƒKû|A´ý“¾øFñ…¤|FðÅö­ÿ„–v´û¢÷©s7”·“vŒ2€ "^pP˜~ϺN±ñö¼ñ—Œlo¤Òµÿ‰ß õ­kM¼”°k8dÕ¢µÓ[×å·‚Ùøõ5rËOð7ÂßÙæ…Ÿ~ê~¶ŠÄi×_ôm2 VÈÎFѨ›ÈCK Ìÿ¼Ðàðr>Zú^÷öU7?± ö¶‡ÂÉ~­¼î—ñ–¹F ˜M¡*@mÛƒcåÇ5Å·ÀÚ-þ\üŸÅþ¾ðdºcx|x®êÖñµŸìæCÝmþ¥¦¡¼ÎÀœžhèÅžð‡…|;§Íâ9µ„]2ØÁª\nžKè‚[†t]¬Ï·q#'8Á«_ð´ü/ÿAOü——ÿ‰­xJËÀ> Ð<1¦y‡MÑtû}6×Í9*Ö4Ü{ª3[tÉÿÂÓð¿ý?ò^_þ&øZ~ÿ §þKËÿÄ×YErð´ü/ÿAOü——ÿ‰£þŸ…ÿè)ÿ’òÿñ5ÖQ@š'4oݽ¶yö‰Ñ …|§\( g,êEmÑQÜJÐ[Ë"B÷ŠYbŒ¨g }Ѹ“Ó’©%Mo¦g²S§Ü¨¸RÒ1h±lBçlŸ>I'“pÈëŽj95;”´º˜i7$2˜ÒÝ^ó®@Þ„É´/$üÅOŽ€€hQUþÓ'ö‡ÙþÉ7“åyŸkÊy{³˜Ý¿v9û¸Ç|ñUãÔî^ÒÖc¤Þ$“J#{vxwÀ¹#{‘&Ò¼ò–<Ž:€Í|9»ñ&¡&©qâÿÚhz÷˜Ñ+i×osm5šÏ8·Ã²¯Îs0ÆHtb·•kXé¨\oWM“Kµ¬/¢ù9‘šK!ß»æÀOÞŒàœ’.-ôÌöJtû• ZF--ˆ\í“çÉ$ñònqÍLW,Rnæõê*ÕeR0QMÞÊö^Jí»z¶\¢¸¯èú׃<3©[êzŽ»âûÅÔ®fŠmGì‹;Å$Å‘cØÊ7Êž*¢ìzß´Éý¡ö²Mäù^gÚòž^ìãf7oÝŽ~î1ß}£'®9ªz&¡s&—¢y‰6¢×6¨ó_§’6Àw0W#æ'/x÷Æ lQYòjw)iu0ÒoHe1¥º¼;ç\½ “h^IùŠž±ö™?´>ÏöI¼Ÿ+Ìû^SËÝœlÆíû±ÏÝÆ;犱Egǩܽ¥¬ÇI¼I&”FöìðïrF÷"M¥xå,yuF¾™^õFŸrÂÝCFÁ¢ÅÉ+±üù>}£'®9 àޝÞ:ÚÌ—FÖ÷L—"—j)Î7).O$^¼cB±àÔ.[[ LÑÏk½§îsbß¼;¤!÷ü Úç’jÄšÊZ]L4›Ç’Lin¯ù× oBdÚ’~b§ƒÇ@@4(ªÿi“ûCìÿd›Éò¼Ïµå<½ÙÆÌnß»ýÜc¾xªñêw/ik1ÒoI¥½»<;à\‘½È“i^ùKG@Я*ý¥¿äiö9øOÿR:½%¯¦W½Q§Ü°·PѰh±rJçl>AŸhÉëŽkÁÿhïë3麈ÿüGo¦¿Œ|$Íâ9.4Ó`„ëšt›J-á¸ÈoÝq ù§Ï@BQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEóÖ¿ûxÄúÌO®ø¾ÇÂZÝûêz§‚¬u–‹F¼Ü<…¢ ½UÜndII'ŠúÖÖhm­¢K{xPGQ(TE@©h *ý¬äÖ>2Ø™¬ÿé Õêµå_µüšÇÆOû5Ÿý!š½V€<÷ãÇO |ÒôËÉ{s«\‹-+FÒ-ïPÔgÆ|¸!NXÉ<‘’23Ìü;ýª<;ãŸÛx/Sðß‹>ø¢ú .tí;Æ:WØÎ¥c2wWtr€†dÜq€qÁø™£ÿ‡“ø,kXûü+‹ßøGüìmþÐûrý«ËÏü´û0\ãøs^¹ñWÄÐ|Wðå|]kο}­ý“Ã'ìÍ4Ñ^4/½Ð¨Ê(Œ0f<`Œõ 8¶ýµ¬õ­{ÅZo‡~üNñ\^ÖïÿÕΜ. ®62†Egh«û»_Mow·]Ït‰Xj÷,l’40DèeÝ)Ý&c#®‚3ÇïN:Űø¦ê?uoEo¨®©¦YA4ÒXÊ–­¬ê¡&#k7È{àüÁKå ›‹¯¶¯sxÑÍâAÉÓ“jÆÍ B;A%dÉ£<®{Iø£}¯èVs[ë:މ0Óõï\E%Å”®ƒ !t`Τ·UÙ¾7R>GÎVi'o×M‘žšœ*JPrIn¯h7$”¥£Ó¥´Õ«;èýfŠó‡$ƒÂþѼ7â gU»Õ¬í7Õ\ä±ÀË;ncèÍÄI,N²DêUä{Џ¶ÒmXç­Ó©(B\É6“WI®övz謹qõNùY®´ò¶Itä´¬Ê °òŸ÷‹žI' Ç8ö±|Wâ»MoÃx{IÓµ.âõ£Ö®/o-m¼§!âP‡{o :õÂài"ÖÔä/t‘5ÔÖò5Ócˆ³¿“)(ø®ÐÍÎ9EöR»k±S¤éÂm>e}mYµªÝ=/®êÏfhQEFEPTôedÒ,Uì“Mqa¬£ee·;GîÁ^^œqÇr³ü=$ècÚÝM}jÖ±®® 2L›×r@%ˆÁ9“@QEQES‰Xj÷,l’40DèeÝ)Ý&c#®‚3ÇïN:¹YðI×ïn¦{¡k{V'Ë ËµÔc˜‡ž‘¯N3¡@Q@yWí-ÿ$ëHÿ±ÏÂúéÕêµå_´·ü“­#þÇ? ÿêC§PªÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEå_µüšÇÆOû5Ÿý!š½V¼«ö±ÿ“XøÉÿbf³ÿ¤3WªÐügøá_Žº^™mâ(ïmoô›‘{¥kZEÛZjløÁ’ “•$`È8Žoáïì¯áÏxæÓÆz§ˆüWñÅIm¦ê^1Õ~ØÚtr H-ÑQ#BãŸib3ÉÏ´Q@8[~Å6z.½â­Kÿ¾'xR/kwž ½Ó´mNÊ;eº¹“|¥¬Ù€èXœ(É=k£ÙgNÕ4? éÞ"ñ׌ü[/†|[mã C[½¶’çí0DcŽÝÙ-ÕM¿ÌÌT(mÌ~p8¯l¢€ +?LŽ½ÕŒ6³[È×Jf’PBÎþL@:dò»B¯åÜ (¢Š(¢³õ8à{Ý$Ík5Ä‹tÆ"¬äÊ ¾ ´²óž]}ˆÐ¢ŠÁñ'ŠãÐ¥¶³··mGVº` ²‰¶±Ù;T`ò}`HÖÔ5 m*Êk»¹– x—sÈÝþ§°’k‘ÿ„—Xñ„ÞW‡#ûœ¿U¼„üÿ>?r§†à¿C´ã.±ðuÞ¿zšŸ‹<›‰‘Wìú|$ùt$‘Ÿ™‰#$qÔŒc´ [Iøw¥X³O|­­_È Is¨~ô·p§ —ŒäÆq]MÅx?Ä÷sx‰ü7ƒµ}A°Ò,îm5kÖŒC!pÀÛmÞ\>"ñ»M).a¶–kKWŸÉó'˜ûÚ‹œ–>Ws²«o)ÁÓrž‘Ö÷íóèy”pØ¥Œ§G ïUn<¼Žï™Ù«8ý¥~š§¦è¯âoé ¼;®]K +¡øsH†èi:5¹’êA•F N"" ‡åAåÊXª¡#'ÄcKð¶«Å ß]ø_–Úl³êzTÖko ä’,+ó«Æ&ó•#Ž0„y™XÑvþñ%ÝÐ<=áKŸßx¿IÒm$ÕõM6Ô?ˆ­‘Y/m‰sIA!¸U$Ž«ää©¶|@ðׯ¯kfÆÞk­>ÞöëDÔl5k‰¼ÈÎÙ#’)Ýde;Xg† Á”a+Éò¶“û+Ó¯O+¯Äô©8Ò‹­NœåeVM-¦’q³RIÝK–o]½ÔÑÒ¨ÒüQ¥Úܨ³Õôë„K‹yFÉá‘Yr²!äTä0ê½yw‚Ƨ5‚ßÙY^ü=½ŸT¹°·ð÷ˆn"‘/|¦l<{Ž^(]Î2p®QŒadnïÅž1“Gø}¨x›Ãú\Þ2hì핎“*3_)]Éå¾pÊA •ÜHûªìB“Rðf…㙼5­kþ†MSH_Ø. ‘¼ö²`Œ£2–g ˾4`IDa«”œ’ƒÕ}Îþv~v_yÃN•(R”±´dÚNéÎ.)»róGFÜy¤×GË­ÑÊYx·Ä×ô;{Ûë- GK)á¿Ñî¬\Íwv]DRA>ý¡0­Ôc’¿½.­¤Üý«Î´û?“äù§í>nwy{1ü[öuã»â«kÚ Ÿ‰4Ù,o£ó"~C³)ìGÿXä+‹Ô›Wð\örßÁ/‰4‹k—šÞéYÚê×1°-&8`¥|¿3vÌó·9ÆyÅX¬ÿGZ˜–¶³XÚ­¬B+[€D¦ÁµH`0IäP…Q@Q@Óí_Úoò~Ãå'•·>g™—ß»¶ÜyxÇ9ÝžÕb³àޝÞ:ÚÌ—FÖ÷L—"—j)Î7).O$^¼cB€ (¢€ ò¯Ú[þIÖ‘ÿcŸ„ÿõ!Ó«ÕkÊ¿ioù'ZGýŽ~ÿÔ‡N U¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š¯¨Zû ›Q<Ö¦hš?>ݶÉA”pÃ9hâÚwã׋õß‹¿ 4ïê·O€ô‰š‡5ýNÎfµ{é§Ì¶(ÊFè!JÌC<¡ýÛWÛõñÅoØsĺ/„>xoáÿŽük¬èþñ¾•¨Íi{6ŽƒLµIdyïÑœm,è\¿ÎeÞÎK$†¾ÒÑì%Ò´‹)¯îuI­ H^úógŸrÊ $òÕS{“µUrNP›~Ö?òk?ìLÖô†jõZò¯ÚÇþMcã'ý‰šÏþÍ]ƒ> |=øqw-ׄ¼ ០ÝK2mG·³wÀ`2Ñ¢“€ì?àGÔÐgEgÉáí*[K«WÓ,ÞÖîS=Ä-šBA.ëŒ3d“ϬgZÿh}»ìÐý»Êò>Óå3ËÎvnë·<ã¦hÅŸ‡´¨­-mSL³K[IDöð¬$:.0­’NG<š‘´m=ÞõÚÆÙžùB]1…sp¡v'0‘ƒž(±fk­@5ê]8 ªƒl<¤ýÛc’IËóÎ$€«•§è–QÞ¼ŸØ–vmg.Ë9Ò4ÜP×\ §ËǤc¶X“ÃÚT¶—V¯¦Y½­Ü¦{ˆZ)4„‚]×fÈ'žhQUÿ³­´>Ýöh~ÝåyiòÇ™åç;7uÛžqÓ5^?iQZZÚ¦™f–¶’‰íáX$2Ht\a[$œŽy4¡Tï™–ëO z– ÎCDʤÜ)ÿv¹äpüsˆÏbhmOw½v±¶g¾P—La\Ü(] IÇÌ$`烊Çñ-Þ—áK}.úm6Ù ³f‚Q^Õ MÄ ŒüÅQ6®8lŸ•M?Å^*þÄòl¬¡ûvµwŵ¢ÿèoè£Ó8=$ð¯ö'{{7Ûµ«¾nnÛÿ@OE™ÀèÁÞ¶¸·¾ÕuÍ6Ýïµv2\YÉn¢$RÁ€1ò ªÄ·Í3ÎIìÿ³­´>Ýöh~ÝåyiòÇ™åç;7uÛžqÓ4b¹Ÿ‰iâY>x„x6h`ñOØ¥:kOȦp¤ª€ìªô çj’ ©½y£éÚvŠÛB†ò=?7Všu¬0©óW,¾Pr¨®I8bTe¹#“\E‡5 ý/Á·Ó|-Ôà¹ñ‹,Ü-÷éh rë, ¯€!I B°¾eœ$Ú¿kútõýOSB³œqã(4í';'+5&®š‹¿GðîÒ}OÃMXñOÃïjÞ Ò&еËË(¥½ÓçŒFÐÌTo7±U'$+à _ˆß—áOÃüA%¥÷Œ¯ [ÛZä[mFê\$_êÃ,k#‘ór>`ª™»EÑ´ô{'[e{)jÂͺ•ÚD|| €8¬ý+Úcxv;9¼?a§Ár©5Θ°ÆÑ,¸RC6¹»íÕN2ö|‘–¶ßõ3…zíêѽ>k¸&ÒµïÊž­+i}íær ìluvßÇš…ž­áŸx›Dn<5ªjlÿgŠË·Ý†2v‚¾`ÊDòʇÂßÚOÃî|[§ÝøEµß \ÝGªiš­ÄA ‚Mǘ¬P o*ÄFÙ•(ï“ãÙ‹Bñgˆõø–ó\ñN³ ìzŽŠ¶—Ù]iÑÄ#qgo*ò¬ñ°Øó )II¤å¾øSà爭µÍ7WøPžÔ¥ðôZ¦¹o¬éÆ(,íæ’y[£„Œ«o`ÊceUEµ³G•ψ¥8ÁZ+]þמŠÉß]ö{vû¿«å8Ü-\DJ³Jš÷”•íÊ”çÏ8(µÜW¿ï$ï/Vøö-u/…^+Ñ^ÇQ×/ot›—‹EÑ/E¶¡wíW1䪙#ܸ!‚”“xùŸŠ¿ uOˆ1|1µ´Ò®ÓL±¹í5Ô5ÆpIc,'ÍCçExภæCcmñO3 è?íþ8ëöËâM#Äž12Oc§hó[[§öE´v¶ñÍeDPÊ©òÎÕY‘Fåºgôí ÆþÖ/üEÙ6–¾œÙÏ{©éíi²ù #´2È¡Db22A( -ãg×÷xŽgQ¥wk&ŸÂï¿éÑyœ-â²uJ8J\‘u¥Å~ö*žŠëE¢R²æ•Ö±Jõ>j–kcwᘼ{ÿ ֩ሠҵI¦ ö„ºPÌÏ!^NàÊœ– ÀÁääì|¥xëá÷Žì×Ó|!×üs{{§\Ip–Ïu"¬ˆ% •ÕâŽWdR ÌîŒw ß•¼ñ‰øË£ëÚGƒ¾êz_‡ü]¨ ñö–,²³ ô±± B:ªØuùÔ ü_ƒEþiâ-GXÑZHΟe}¶¬HŒªb73º³³`[qÚI$îìµ ]JšÒ樖I!i :‰#r’!#ø•Քޠ©‘^-à{üOø¿¬ÞA£Ëaðææ]ÖÞR,¤ó‚HÓý–FâD Ê2@Ý™bÙoÁû=Wñ¿ð¯mtø?´`×ü5{ ½®¡utn^8æùÈ"c¸Tv I"Û¸¶ì¥V0Q…5îÝ¥®º5ߢw¿d´¹óy†¾&U±XÉ¿l£ I¸¥åÒn ®iÅEÅÙsJMJÍ]ûÅS¾f[­<-êZƒ9 *“r<§ýÚçAÃñÎ#=‰ªrhZs’`¶’ëC´ûB[ZÛù×6°2ºƒQ©:¨EËl*#á]CÃÿ¼ kšw†c›E×\j2E©X¬D^7>sÆëó¹!Wrä0pÊ̘'»ž<Ü·Ôù_«ÖTgÊšW¶—i´¾i6¼…Ô4ûŸ‡÷³jºT->…+o¾Ó£ë ï,C°õ1킎Ÿ¨[j¶PÝÚL³ÛÊ»’EèGô=ˆ<ƒGöu¯ö‡Û¾ÍÛ¼¯#í>Xó<¼çfî»sÎ:f¸3gkàvÚÇPn<34¢{nã-Ð$€œ¨ÆHcÓ=xv6sž‰ESmOw½v±¶g¾P—La\Ü(] IÇÌ$`烊FÓÑìlm•ìT¥«W6êWiñò‚àb€.U=™ô‹{ÔÔœÁkØÕUnÑûÀ€¯sÅG'‡´©m.­_L³{[¹L÷´Ri »®0ÍO< FÓmÒÞÆõô‹m7PqÀÑÆ¨Ín˜È£”SØqÆ@  J+>?iQZZÚ¦™f–¶’‰íáX$2Ht\a[$œŽy5#hÚ{½ëµ³=ò„ºc æáBíN>`#<PÊ*šèÚz=“­²½Š”µa æÝJí">>P@ Trx{J–ÒêÕôË7µ»”Ïq @…&Kºã ÙäóÀ  "f:½Ê›Ô‘dwDwI™ ë‡à ñû£Ž¦®VzZ£kó\¶› ȶ©j_)‘Áw-MÁWj7\þƈü=¥EikjšešZÚJ'·…`@È !Ñq…l’r9äÐ…M´m=ÞõÚÆÙžùB]1…sp¡v'0‘ƒž(]OG²u±¶W±R–¬!\Û©]¤GÇÊ`cй^UûKÉ:Ò?ìsðŸþ¤:uz,žÒ¥´ºµ}2Íínå3ÜBÐ!I¤$î¸Ã6@9<ð+Ãÿio„þû.‘ãoøC|?ÿ Ÿü&~ÿŠû.íùiÐÿÇÆÏ3ýWîþ÷Ýùzq@@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEå_µüšÇÆOû5Ÿý!š½V¼«ö±ÿ“XøÉÿbf³ÿ¤3WªÐEPEP~™${«n¦¸‘n”M¤•ü˜ˆDÈáv•n3Ë·¸^Ûí^ußÚ<Ÿ'Ífò³»Ëعߟâß¿§Ûß5b€ (¢€ àMä"ø‰ —d­gh2D×›ߪ ÆÝø(„šºkÒx@–kug¾™…½ª"îf•¸9#“ƒ×ïLð߇§ðÆ¥XZ‹rË_»çså’„“¿`¿€ø †Šæl é>‹ÃÖ—ye=ÔÞ â¶²FÈ'·nmǶ~îÐÀJÑpž7ñ7†¼Qð{Ã:ßÄÏj+o}{§¹ðõÆœ×÷wrL«dˆÁ _Êdß'’z_xGÅþ øá-COñoö„4¯6æÿL´·hÔ'ÆØãyr˜J»åv‚¥Ab4ª¹|ü/MìßTöVùî{”°è¯ö«Eþö7•ù9¡9%ù¥Ìûr]Æí¦ÍkÿˆnñIðt¶ú‹jš”÷ðÍŒ¯j±ÄȬ`6«|ã¾Ê©’ ù|||cáM9ït½GÃ÷’ ÖÎÏ]¸‰ïom`uŒ]á’¬"Ç Áedwæîüs⿊>#ÐgøU¯xb_[ÉxšÆ¹8kæ71Úˆ£;Iu”:È7 ¸&Ñ?æWí?ûRø—àÿÆí9—ð ö]ø Éð¿Á°|MÒŸLm3\“NÓOˆµG§FF5ÚÓÎIf$Csæ„_1dV¶ËJ›’­)ɧÑ;§ÒöÝ«ZëUäîväøìlhÏ,¥‡¥ ÇGRqåœZ¼”›QŒù”¹dí6þÔytò ßø)W‚mK×t- ´ÏØI©[Ŭ[ø*ƶ/Åe|À4A @J±DùCH«*Ýz—Äßø,ÃÿxÖÏÃöÿ4¯ÛÜÙ\Éwgcae ×—*4Ñåî.Lhê…Ãò_zV÷o ü]ø©â¿_øÓÄ_¼u£xZþÊ=Ýõ=94Ëÿ2Kuž}E­¥ŠY<öE2.æ/´¬¨ñˆüÆ:ć/«\üU7z_‡µ ÍÃÅ><Òÿ¶¯¦6RÇ%š:{çY˜d|(WdÏ™<2ã)*0n95-õµº^ÏU~ÿyêR£<Ëãq´UJ:Á{>u&Û“¦¥âÔ·*oFÜJï¶ø{ûPxã_ŠuÇÓ¿i /‡^ºÒáÑü;áˆ,Æ“&˜f€²Ç2NžQh|†C%¼­–e 4HÑþ¡ýVìÙ͉ª]ËðßI¶™§kºmÄ:¢][M,sË$³¹T*ü±„ uÏ/ ~Ìß³—Ç+Ïø*h$øsâ[ n­tïÙ Ûw–KOô‰5;³å[«œÜ˜Dè"twŒíi¶¼MàÚÓþ ò×ú§ƒ<{Æ/‡: ךN¦ïptÛâ1DòX¼¦khUŒÛM¤¥JÚ—j&ÑÓ†…*’Ua-Uî›wO¶ûy[UnÇ‹žbqØJÀbi.Y(¸ÉF 2ŠÓžÊroG'6ã'5öš?Iõo‡j>8Mnj:^—5•Ͷ£¢iÛ-㿚U‰åæ@%¤q*‡V¡#ØÈ‰$Ô-£´ºÔÒ0&–$9U'þùõ`‘‚HðZž›ûGi7ñé^(’OiÍ Ú´Z‘:LOl²˜à{rü3,²?A†E(û–§§ÞÇ©X[]³$W¬¨·¼2` €ÈÜò¬‚¢çí^u§ÙüŸ'Í?iós»ËØØÙâß³¯ÝßèºQ’\ºYß§õ¯sãiã«Ò”ÕVåxr4ܶV²Ñ§h´š‹ÓDš±bªjÚdÖ›scr»  7‘èFA{*ݹ土ÃÍBs¦Ï£_q¨iögà€ÑÿË6(àÜ…õ®²¸Ÿ§ü"þ$ÓüMâÙñg¨í_ùfÇåáIà“œ¨£­vÔV‡¤‚]L{[©¯­ZÖ#ÕÁ&I“`ÚîH±' rkB«éÿjþ϶ûw“öï)|ÿ³çËó07lÏ;sœgœPŠ(¢€ (¢€3à’¯Þ"ÝL÷BÖö¬O——k¨Æ71=#^œgB«§Ú¿´&ßäý‡ÊO+n|Ï3/¿wm¸òñŽs»=ªÅQEå_´·ü“­#þÇ? ÿêC§Wª×•~ÒßòN´ûü'ÿ©@«EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPE|©wûlëóøS[ø‡¡ü!ԵτEÅÂMâˆõ˜#»žÞÞFŽâê \¼HÈü™ˆRp9ÇÓš¹eâmNÖ4ÉÅÖ¨[Gwm:‚‘H¡‘†yåH4ç?µüšÇÆOû5Ÿý!š½V¼«ö±ÿ“XøÉÿbf³ÿ¤3WªÐEPEP~™ {«mf·‘®”Í$ …ü˜€tÉåv…^1Ê7¹:NÅ™®µ×©tà,Jª °ò“÷mŽI'/Ï8v®PEPsñ'Ĉ#1/Ù4¼Çg@wM*‚ sÐpTúƒ]&§{¤™­f¸‘n˜Ã$@•ü™AwÁáv–^s˯±÷ÃÃålj5“íOªIŸÌ.$Ëœ`8Çlz éo™–ëO z– ÎCDʤÜ)ÿv¹äpüsˆÏbhåQ@s>+ø¦øÇ[ðÆ©}q¨ÃqáëÖ¿´K+é`ŽI O¢pç¯8ÊçcÈ®_ü@Ótïˆ:Oƒ¥·Ô[TÔì§¿†hìe{UŽ&E`óµ[çð>PÅL‘ä?jðÎß³ï¾!%¯Ûnô{!ö8?1êY 1w¡1 ¥Œ¾6ÀÛrpO’ªqzÙþ;±úάo(¶ž×‹¼]¼ž«ï?;ÿl¯Ú¯Ç'ã=‡Ãχ^¹ð'Ä=I¦Ð,RÛ]ÜÀ/¯;<1¸‚‹—òdfÊ«yÛ¤ßk<>Åû-~Ë?³ÏÀ~(¾ñíׇüYâ6$ÿ„¿VÔ ó$Ñæ’,-¢ã͉•¢ ó¥˜2ðê°ÅOþ mû0YxcÀSþÐ_a’óÇž${›û-W\•ÚK+Îû¦ó”šàù²Ë>è^2¬¢ICzÇìµs£®xƒÄ¾>ñö¯êq«x§EÓ¯’;k'M¹€Ôo0~Õ%±‰H`M¤ £$s2¿''°Q¦õR½Û¶º|¿-—Ìú?¬<ÎUqN¢¡ìã?u)+´Ú›Ñ»¶ä½ùÝiîž —öºw¸¼qw¯kžøw Ýü¿| a¬N5;ÛÆy£’[›ˆg º‡Øë FÈ7ªÊÍ#Iyè¾8ð¿‰>|¶‹Æqø-;M}R»ðΙá¶Ï ѽ“ι¸)2&ù£FY%r#„°«!>d¼ö¹ð:îÓàWˆ|)yâÝ[RÐ~x’÷PÕ¬±n!ûLfÕZÝ,åt“gÞbä/—Û$™ƒÆ‘¼ÞMðrÇÆW¾>¹¥ñoÅý°ð´Úö§ÞÝÍg=¬QJmÙy™ÊY€ÐÆñ” ‘¶$1©^¤-FP·2µ“²½¬Û³³³²Wi$¾gô^)Áâ”óX…7F£›”âå7%(Æ.Q挥*“ä„å9M5k¨ž‡ñ âÿÅøAþxëÂw‰…åêGiâÉ4›°±‘7Ó¢ÀŠÂX帷‹ ºÐË I# ÞðŒ¾ðç‰ümá¯|WÐüW¥éº´æñ|a¦^\Ü]jö±yÒ6œåb{{¨#*¢ÂÞ`¸ƒËô?‚º/‹üMðÃCñ†/­>x{NþÓÕ/4Û‡Ôµ §BÖ­sþ‹"2QÂGlË·Éx¢Ä¥·–þÏ? ~ ÞéZƒ/uÚêÚšÀÅ °OvÑ]Z5æŸ"mžͤ:&åI‘Ý<…¸®JŽtäÓ›—}t·ªº»³æ³ÒÚÜÅâ0QÂâèÆPÃF“i¨5ÎäõÖNI(ÓRŠ¥ÍÚ“åqLÉñ—Áx?hïèþ+Ô5?ü@ø‹­ZÛÝiÖËo‡-’+ mšÚ3æ‘bÏzš“˜#-{ª­ÁÚ?xðuãŽx  ”QEQEgÁ_¼uµ™.¬î˜.D.ÔSœnR\ž:H½xÆ…S‰˜ê÷*oRDDEUÝÝ&d'®€3ÇîŽ:š¹@Q@yWí-ÿ$ëHÿ±ÏÂúéÕêµå_´·ü“­#þÇ? ÿêC§PªÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQ\¿Å4ñ4Ÿ |^ž u‹ÆM£Þ ßËÂßy/ör|ÀSfϾ úñšù‹ÄøÑàM3O¹ñ—ퟧøJK´M[Â%º™ÑÙCí'µ}‹E|eáŸ|TñåÝÅ„ÿn Äú¤05Á²Ò|+¡\Ê7‰ ¹”n#°õ¯©~'‰£øcáñ«¬¾2]Ìknž^ûÉO´倘ó7ýÀÓŒPQHNOJZk¢ÊŒŽ¡Ñ†XdèhữˆúWíoáûïÚøßÂß ~É<¶Omý´z׈`IYeÚ…‚Ù[HÁ±ò´Ž¼ü¡ëíO Yéz‡t«]@º,‘Eb-X4B@#ØA ®Ð0sÓçŸðÉß?èü?ÿÂ^ÇÿW¦išež‹¦Úiú}¤‘$ö¶Ñˆâ†5Qª0 3ý¬äÖ>2Ø™¬ÿé ÕÑx3Jø…cw+x·ÅÖíN<¸ô_ Üiμ6rÒ_ÜÉ_áÁëG;ûXÿɬ|dÿ±3YÿÒ«Õh>H5Sit©yf·M)6ò5£”Ž<Œ+¯š ¶3óQÈùxÁ±²ëûCØ|¬y>Ió<Ìýíû±·mÛœó»µX¢€3ãƒU–ª÷–mt²ƒq"Ú8I#ÉÊ¢ù¤£c1f—œ -@½é[›`Ž ZƒnÄÄÛy23÷ƒ888ã'­\¢€1ôø5%½rñÙÛF%ÿI‘ ù¯“®÷x`W¼‘äpjÄj¦ÒéRòÍnšRmäkG)yW_4lgæ £‘òñ‚i’@÷º°†êk‰éDÑÊIXɈ„LŽiVã<»{¡@ö]hoó¡û•'É>g™Ÿ½¿v6ã»sžwv¬ÍNãUÒ¼>÷osg=Õ¢´÷m]hÔ3Eó F#q,'iÎÝrßæ’ê´lU•882(#èA û‡á晩Øx6Ú6»´"X<Û@-ØùE÷>d;Ç™÷‡&0FOZ×¼ƒR7º òìîãŽVûd† ­ò\ bËŸ7ÊGÌq!ç‚N•¥¬V6Û@» …8×$á@À<ôWS’½ÒD×S[È×L!Ž"BÎþL¤£àr»C78åØH5Sit©yf·M)6ò5£”Ž<Œ+¯š ¶3óQÈùxÁ±²ëûCØ|¬y>Ió<Ìýíû±·mÛœó»µX¢€9Kãm;ÀWÓøZ=#Wñt´[ÞÄð[\‘œ ýá(ØÆ7> %n_Ìø(çÅ~ÑŸ~þÎö–ú†g£Þ²º~5ô‘Ü4{xP*Ïs´&ê@Ê‘ Ëm #×è߯¯øFõøD#üXý¤î~'Yk:“X^Ís}â[¤XtجáˆG1ŽLrÉÛ´hz: ¢2_›˜BdIãFIÍÏÏÓ|-øÓ6¡âŸƒzƒõ}'ÁÊÚ;{Áš’ÚÂ{{„‚d¹´3F¯4Ò6®di „ó"yg“jU¡Oå rÆö²åÕóoùöºÚú³ËÇe¸œ^A 8ŠJ­U>yºÍS±¿-ÚM6ÔRWšŒÛRq¼bpþ8ð$Ön<®ø€è¾8ñgˆâÔW]ðÞ“ ºZïjÙºu "]Eo(H·ƒ"’ÒÜÜ$KcûV|×lÿÙ¢ÿÄWZÝý¦«á½:þX<£Y5Ä-¯ØI$Q®}Æé »¶Œã¤±ºŒïYQ~ë¿´WÄßxËÅÞ4×>Zøg_%Ò$µ’´´µÌ·™.ŒæåÉ,›Óz¡™¥$Ë»ªý“>!_j~1ø­©øz÷íŸSÅZµÛj~ ¿XdÓex-/¦h£1‚°É=åӀ퀀:0¸ô0ä猓år¼uÖÉÙ¶¯}í{÷Ôù,¤ñ+^HºÔè¨U÷W*”¡ÍFN*-¸s{5 »Er»µoý€¾"wö»m_âÇ‚`]Qü(—SØÛÛǧN!„[‹6F ±¼Ò0V$M&cp÷/÷ÛiÚÝ®Ÿaln­µ{èçÂj—–Š0ódEe#r„ÇåÞ’(*%¿a ífÞßâGÁ¯ øêí4È> éRèºÄ>iá£{¦’æE*ÍõÓ­&»0vÆn%_Òoßo<ãχžÐìÄz¶¥¨nô++Ï.ýìÌo˜‘¢»ï&GQû‚~êÉ$>’­N”ç/²­ç«míwÝtZ=.Š©—c3 >’Ö´ÝFÓJ68Æ7rq¾ 'yÉsFîÒnþ½²ëûCØ|¬y>Ió<Ìýíû±·mÛœó»µrÞ"ºñÝï„àѬ´]VÞ}@¦»{pò[}žÐ+6èbË–c€¼¹ù¶»]ž.ÆŠôd¹•“±ñÔj*Sæ”´jÎöÕ5}wWº×t¯u¡M¢Ô Þ•¹¶ê¨6ìLM·“!ó?x3ƒ³Ž2z×+z·ÚÄŸÍ$–ò‹Û -&e—%‘Š®ã´)Œ–ã#ÐÖ‡Ãÿ j^Ñ.,uOê>,¸’öæéou4‰dŽ9%gH€Tm@qéœí›#Jþ=ˆG{á{´,— ªÅ ȬAùÞ¼v;@>ßSD[”SjÌ+ªÊ榓ѫ¤üìÒz7¤ƒU6—J—–ktÒ“o#Z9HãȺù »c?0e—Œôh¯RÞļÚm ³[LŽ=Ío.Ê$VÚQGË€²8­JÏðôK iku5õ«ZÄbº¸$É2l]É–#äMQ€Gª--Uï,ÚéeâE´p’G“•EóIFÆ>bÌ8?/84Z{Ò·6Á@µ݉‰¶òd>gïpp6qÆOZ¹ESXµöE®mŠ"‘t»+màÆ|ÏÝŒäàï㌎µj¦ÒéRòÍnšRmäkG)yW_4lgæ £‘òñƒ¡EeÅèñ=̦ hôóg‰Ä¿–]òeKnûˆ0@+ÖSƒÁ$pj¢ÒÕ^òÍ®–Pn$[G $y9T_4”lcæ,Ãòó€A$_¼Eº™î…¬íXŸ.4/.×QŒnbzF½8Î…Shµ÷¥nm‚:j »mäÈ|ÏÞ ààl㌞´,Z€{"×6ÅHºÝ•¶ðc>gîÆrpwñÆGZ¹Egɪm.•/,Öé¥&ÞF´r‘Ç‘…uóAvÆ~`Ê9/>ûKi¾8û.‘wÿ ‡ÿá ÿ„ÏÂñ(þÁŸûGþCšpÿß¶ùë~oøöû¿/_ž¾€¯*ý¥¿äiö9øOÿR:€=VŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ¾#ýªµ/ø{ö¶ðÍçŒ>j_^óÁïnžÒ|?ýµ>’©xÌ/>ÌãË+)vŒ¶w/0c_hêÚµŽ¥^êzí¾¦ÙB÷7W—r¬PÁ)g‘݈ ª ’Ä€$×Ͼ|iÔ~4é_>ê?-¬[ÃÉ¥Þ7ŠöY/‡Ÿ$¨?qòùh2*Ù’]ÅP+þÌþ$øk¬xîþþΞ"øE©®›#É­êþ‹AŠx|Ø· Ë31Gòú?Ã_K×ü ÿ…ýˆîäø³qðѼ6¶Na>‹PŽè\ïM¥ÍÔò¶y¹Ç9ÙÛ5ë:N­c¯éVZž™{o¨é·°¥Í­å¤«,3Äê$GRC+)0$AnŠ( Š( *ý¬äÖ>2Ø™¬ÿé Õêµå_µüšÇÆOû5Ÿý!š½V€ (¢€ (¢€+Û}«Î»ûG“äù£ìÞVwy{;óü[÷ôã{æ¬V~™ {«mf·‘®”Í$ …ü˜€tÉåv…^1Ê7¹:W3ñ*Ö[Ïê±Â»Ü"ÈF@ùUÕ˜óè5ÓVO‹äTÖ¿ëÊoýÔ{N¾SÓío" ±\D² q†€#>üÑsö¯:ÓìþO“柴ù¹ÝåìllÇñoÙ׌ná/ù4_úò‡ÿE­M©ÇÞé&kY®$[¦0É%`&P]ðx]¥—œòëì@…ÌØ|@Óuˆ:·ƒ¢·ÔWTÓ, ¿ši,eKVŽVuP“µ›ä=ð~`¥Œr„éªc(ËX³z´*Ðj5bÓi5~©«§èÓ¸W婸oª|Xÿ‚®ükÒ~ÏáØ®íô}6ûf±hÚ¹‚4fÈ»!Þ!ó/BH·aüÑú;¯øêãÃÞ2²Ó.tµðóé·Z…ïŠ^hc±°òJü’–pFT±'„V‹óWâÿņþÿ‚«üø¤_Ãyáïé6ë©ê¶w^ÜCu§£Íæ8yQ5™‘Òˆ¥Š'w=GJªt¦÷º¶ßתÐõ°”ñø SÌ0ð¿+Œ”’æIݤ®“m|2³ÚÛëêßüeñsÁŸµÏ´ïÃì^3ðΗ¥Øiº‚[B«nòêbòî$_2Uqv bñ9™(2EýAðvOüLø}âIüw¬øcR²Ö临ÓÿáHî­b¶ mÝ–I ‘Ê®ÈÎEm»ˆ|çÊ€ñ¿ƒþ)ø__ø¹eá-¼d÷þ¸±¹¿Žâ"Õ/®,nÃNª|‰ïíäÀùþßáãùf…à/[| ðÞ³yáOÙx[Å>!¹EñÍý®™ż–0<³HåÕYv3–ÜŽT0²>5G*5ÝU'$Õù[jËEª³î÷ýÒ°”éfYdp2£u)ÉGÚœ'í%yÊÑ—¹©@/d´x®B7Ú%ºFÛåÅ­&fYP¬e]±ÞyçÆ½ Gñ'޼E¬hFîjžóI¿ŽÏR¾‚ùá•%“sÃrJºÜòÉrbZhYÛÍ“ÉÅ{IǹRzëmV½uI;&ômÙ¡dK3ž:ø’£«9E¸Þ*IBK•«Á¨ÊU å(Æó„b¥6›nÜ×Ë-wáçÄ[èÿuÏèº ~]–µ{c%ö“¨ZDÊÓ˘²ß}¦Þ"’+5äJ$ß*I'yñCÄ~øƒû7ø{MñGŠõ/Ä£V½¶¶×g’;Øõ «8–#s|,šEeh¾Í¹ó&@ñ•i¢ß,½§ìÓð&ìx‡Äwlô›x‹ÂZmµÖ…s¬Ü\_G<öÁ’H©‰âWŠC•Í¿ÚmÖµx÷í+§è¾°ø›á°ç×ìµ­ôµ»aq¶ò$›íªÃt …Õ¼ØÕB•âµætêað®RK•ó+;úí謚³×SÙ§ŒÂgõ:¥'Z›¥/iMSWM(?}&ݧ7)F|ñ|¯–×Ó¥Ñ|ñÓö£ð´žÔ5«Kß'‰.ø‡Vµµ{‰”;³O–\‰‘‘|‰6æàÄ$h•¼¢ßöu»Öôè~)hóxKâìÚ¥êÒàE¨G¼MfBƒËxÝ¢…"¼n¥U¢h­‡wàMgá7‹o|5§øBMGÀs>.4‹¨mã¾Öä†å^+‹(Qå„ÌÍŠ„:B6Á< qì_².¥ã3ðÊ] Ç^ÔtMsC½žÒKûåWSf‘¤i—n ¶_ .J~2FgÛßC G(Æmɵñ]ËUky+]Ú馺ê|¦kÄ9–OBµl58PŒ$—²å6áQÉM»7)9rÁIÂQ•9iʹS^Kã/Ž:Ž~]øÆî÷ÆZÎãë%ðÅ·t6~¤žaeûDk”i &Õ`^T–ŠTÄpÕøIà›¯ ü\øÙ/€<¨éÚ§†ÜhV—z±ƒIiît=#Ì´¸D¬— ä‰ +2ÈÎ ²)J=7Á_®> |8ñ§ƒþ Ëiâ _ëw·†µëK¨^âH.I¸[”1D¨ŽixÈc$«³É ¾×Âi¾ý›uÏŒ:š_\Úkzt¾=¼‚9 Åȳ[¾Ëi_ç™,m­bfgýä¨î[ç&½|>¥_~«Ý-m­îï½úê¬íÙçÎþË€Wåœïfé¸8ÁCáp»TïN|Ñç½ù¥sæoø&6‹í1û\“e•-Ÿ‰’Õtý:áÍ•º›ÝK1¢Šê¾Zª1H\€;÷þµöký3S›û:Ý£—ìmy{…‘cœªˆ¢sѤm†Üá° ¯Îø$Ãéß$ñ†‰öm uɱ>§e4«éVÖa[b\ s5ÒïQ’ùÜÌ!1?è/Äxs⦓¥øŸA]~ÅuXËŠѣ²É È09VÞ‚×­­šŒu]öwùŸ¯fêS©^¯»+ß–îQWi¯zÊïWng£ÕݲKÿêVŸtŸEáFëK¼²žêoFñ [Y#d ‚Û·6ãÛ?wh`%hºj(­j÷w8êNPQ‚•¯«»ÕÝ»;Yie¦×¸W#ã§7:§…´ø£gžMI.†0$C/’O\6ힺ¹?ÿÈùáû|ÿÑB¨Àë*¾Ÿö¯ìûo·y?nò—Ïû>|¿3vÌó·9ÆyÅX¬ÿGZ˜–¶³XÚ­¬B+[€D¦ÁµH`0IäP…Q@Q@Óí_Úoò~Ãå'•·>g™—ß»¶ÜyxÇ9ÝžÕb³àޝÞ:ÚÌ—FÖ÷L—"—j)Î7).O$^¼cB€ (¢€ ò¯Ú[þIÖ‘ÿcŸ„ÿõ!Ó«ÕkÊ¿ioù'ZGýŽ~ÿÔ‡N U¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š('ÅžÒüsá]gÃzݯÛt]bÊm>úÛÌhüè%C‰¹eʱRÏù¯þqû1Ñ2ÿÊþ©ÿÉ5ôþ­«XèUî§©ÞÛéÚm”/suyw*Å "–yØ€ªª ,HM|AñÏãÃÏ‹t=çöš_ü=O´ÖóøÆVÖfãTûA-ÕÄlÛBb(¯€Ä¾T‚èðëÙ‹þ‰—þWõOþI¯¥<'ám/ÀÞѼ7¢Zý‹EÑì¡Óìm¼Æ“É‚$Æ›œ–l*–$œrI¯Ÿ¿f ü5Ñüw7ƒh¿|]ÔÛM‘$Ñ5E¯E>lDÜåYX"y”⯥袊(ȵ¯ÚÛᇼy'ƒuØ[kÑ]-ŒÈc”ÛÁrßvnBcž6;†Ï¯]¯Ïo†ºV•«Á$üwu¬Ã êúg‰5-MæÁwÔÖîè£>yÞ8@'Ÿ•kí‚÷—Ú‡Áß]jeÎ¥>ƒa-Ñ’Þk[¡|“Ôî&€9ÏÚÇþMcã'ý‰šÏþÍ^«^UûXÿɬ|dÿ±3YÿÒ«¢ðgŽõ¿]˧ðçÄÞ1¶ãZ¸ÒäGÈcÀµ½¸À÷†3ÉŸ&§r–—S &ñä†S[«Ã¾uÈЙ6…䟘©àñÐi“ûCìÿd›Éò¼Ïµå<½ÙÆÌnß»ýÜc¾x  V|zËÚZÌt›Ä’iDonÏø$or$ÚW€~RÇ‘ÇP$ké•ïTi÷,-Ô4l,\’¹ÛÏAãçÚ2zãš,YšëP z—@NĪ Û)?vØä’rüó‰`*åcé÷—?mpÚ Öks.÷¸BzCÝ(ÙÌCnÿõ@ä)¬I©Ü¥¥ÔÃI¼y!”Æ–êðïrô&M¡y'æ*x¹qàÿ ø§_Ò|yªjy—?Ù–B¸Õ$HÑ@UŽrˆƒdÛ ŒB¡ÞÓõ+‹ÃmçiW–>m²Îæáá>KœfÙ#eÇr»“ŽÖ4Ü’ä¨ï%Ù4¿_ºç¥Œ§FRxœ$)IÙ)J2’i&Ó²‹k]*OmÓ ñg‹4øsP×õýB/H°ŒËqu9;Qs€³@ ,H@¯Ïø*ß¾üIøo«x:ÏâχñXÞÉŸ.%Mç÷)+(è$’ÖPÆw¢P$ûo⹸ñ‡tß ]xOÄWg‹$—KÔ®´ËÈ`—I„ÆíçHË!IQòüÈÊY[s2Ã-?ˆ– Uô ø×H²»šö{[]5©cš}Vkey!d’C#•.èLÄ+5ÉB[Ï!ùêN|íÆÖVÞû¾—û»ö=\ ððohçS™Ú›‹÷#m\wºµMމJé^ÿèÿ¶g?mO…^ðÇ‚<7§ËñrÞí5««í:""Ðåµ—t2Æ·leñµ‹Hñ´Rù{‹ÎñÅÚéšßî´/ øSÃ|ÏEc­YkZ½Ä¥ªy+qÚz[ÚÉ$–å 2[ìsA"y n¾rÃò7Çß øsö-ý´5Ù/4Iuo„¾,û=Ö¥áíP÷|3MÌ–e ) i_ ÿh¿ÚÚüDÖü1âoŠ-²Ëy¦[¥®§vìv)ù@[ˆÃ}àˆ%Ž014q6?ißÀwš ­çÃkKÿ5µŸ‚ô½SD¿˜ø`ž…’q™ÓɈ*ÈX2¼‘’âêQÎ?<á…Þ±·ø9âïè·úå…ÕÞx‘Åu¥#&f2Kþ¶ ® 6r„¬r¢ $/o·Ú#ðˆ&ø‘¢üCð‡ÂÍGâf³um¥ksø›Åš¤ÖÓî…•žÎßÍÛ¾Õ O³aE“Åí èr.ukµï]jï´œ»ôÕ«µ×饄L3Uˆ’ÂÔU:s~ÉFIÆ<©¹Q…$• •çîÆ\±’~ïüP·ð‡Âßk> ·Ÿþ%õ§ŒbÕN›¨énòÛ´±OzÄÅ,ÙÔÈê-&K<‘Eí f¯[|Òµºß„£ðmÎ¥Ô2j&;}IL ‰R/›~í±!ƒÊ!‡™Ä£ñÿ€uÏ;ÒQø^þø‡ãh&º¹Ôo[Ëm;J‚2Šë o'вˆÝ ` ’pÑÛñÿÀOÚßìõàŸ®§êi²\Ãw`×VÓ\€“µ˜\N@DdƱÂAXƈÇè¸T«SÙsÅ'Ê’ÓtÒ’jíìÞ»iä½l^g FƒþÐXj²œ]YÊ¥¥eœéJ2öqƒjpº““UM©JçÂï Y|Lñç†gøC­ë>³øyÇ£Ÿé’Ýiú½œ×%Ýê¾TG$¬nÔÇ…."@¦"Ž ¶¾1øïñëZØ_i6¾—R»’ÿÄ?زÛMœ7“GäÜZ\”}›§ÍñI#îÂö~ømñ;Á:ŸŒõ«3Oð߇¯uo:ûDОæþêçJŠÚX)á Lª#hÄiŒ®Ðik_4~Î_mô/ÚnêÇB»½Ñµ½^ÆA‡ÄhÝ,ž(þÍ>¢ï!“& x­íÊ ådŽ9 ‡%z¹%MÒ¥+ÇÚV|ªÚ[NŠÖ]M÷ðV"†2ìu Ï *NqUd¤ùœ“šIÎ\îUNpZÉû­(ý ñOÄ×:?Åß~Ï ‚ëÞ¿Òÿ³õé,ô+‡û$7>c§‘t­¸Í:[] ˜ ±fægy"±ù/üsö‰Ñ,¾Zþξ ‚=oƾ!º°†ïEÓ-f±µY[xca¶âYRÜ$A\ùe‰UßmOŒ¾6ñ×ì#ሾ>¹¹¬Þ)×tÙ¬u}uÍÖ£©\ 63ßgDîÆXB(B4Õm|{öJý‘~&þÑ_çý¤þ#´Ú;kZ´ZÕ…§™"Ý]ÚeäÍ¡iD¶èvð[–‘H…Ë«mHüÏ¢¥*„ù`÷Ñmåe®Ú_kYésñ¬}&*¾UÄE'~jòmÛÊIE76äãg''(ÚN)#ïÙ¯D±ø%ðßEø)¤é®Þ(ð†­nï¥ÒéwW³ù3Gw$lv½ÏšÙ Àv¤Å"G×üø”ß¼áÍj]WF‹T3½®©k£Ü­Ô ur G<‚Ù~RÃjü¯"#kø§Á¶ž2×¼©ß[kVóè×o¨Ãö=CÈŠ ,›.Q$`!ÈùCte'ËyïHN—fÇÂné¡3ù0›hØ3ÝF …%ÝÛ9*çÌrG\ôÆ5}¥äô×çµ¾íWŸ‘âÖ«—ýQS£MûGÊÛoáiII.ê^ì¶N/KÊ×::+‘ñ\>/»ñW†Ã×všv‹orÓëO{j&ûTD1(d}Å[;qÑ·»Ñêw/ik1ÒoI¥½»<;à\‘½È“i^ùKG@Ý;¶­±åΚ„!%4ù•ì¯u«VzZî×ѽë¡¡\u²®¥ñNòaäÓ´ô¤p¿,®ÛÔ¯9å ýG~z+Qí—Py,§Hm#óVx‚Î6–! ~1ŒûF{ãšå~Í5Ìsêïg4¯­]K+N²«-¼I‘>æ®à6)ãÀÆ(ÀîjžŒÌúE‹=êjN`Œµìjª·hýà À ׎9⣓S¹KK©†“xòC)-Õáß:ä èL›BòOÌTðxè z4ó%½«è裂³Ùcxš vÀ@ÚÙ%}BíÀàö  J+>=Nåí-f:MâI4¢7·g‡| ’7¹m+À?)cÈã¨5ôÊ÷ª4û–ê6 .I\íçÈ ñóí=qÍ\¢©­ôÌöJtû• ZF--ˆ\í“çÉ$ñònqÍG&§r–—S &ñä†S[«Ã¾uÈЙ6…䟘©àñÐ "f:½Ê›Ô‘dwDwI™ ë‡à ñû£Ž¦®Vz<‹¯Ì¿Ù›a{T?ÚJÉó°wýË ïùCn|íÐõ#Ôî^ÒÖc¤Þ$“J#{vxwÀ¹#{‘&Ò¼ò–<Ž:€¡ESké•ïTi÷,-Ô4l,\’¹ÛÏAãçÚ2zãšúf{%:}Ê‹…-#‹Ä.vÉóä’xù7 ޏæ€.W•~ÒßòN´ûü'ÿ©^‹&§r–—S &ñä†S[«Ã¾uÈЙ6…䟘©àñÐý¥¼e«ý—HÐ?áñöWü&~ÿЧÏÓ¿³¿ä9§?Üû_Ú¾÷îÿÔ}î~çÏ@@QEQEQEQEQEQEQEQEQEQEQEQEQEQE[SÓ,õ­6ïOÔ- ¿°»‰à¸µ¹ŒIѰ*èèÀ†R ‚ |7ü&qüJÕth`¿ÝivöÜ@Ö;4Ó!“í,žSTOÜæGÌH‘1÷õ|]ûgjþ+ø7ñ‹Ã¿¼?㟆^·!Ðæ“ÆföK½Q|÷™ À|Q–‰Õ£Q"³>[k@;ÙÃGñ„?o¯5/Ù¿Âü>š;Ãöý>ëOºÔonZhŠÆÓa®Y]ya‚+éªùöCøáñ ãö¥ªë>0øMâ¿ [[ñà$ÔRþ ²ècó’é¾HÊ º¨$…Ç«éÊ(¢Šù÷]ýˆü ¯êšÈ—VñE¯…u½Lë:¯‚íu]š5õÑu‘ÞHvoÝC2+ªÕzWÐ*¡*€ª-å_µüšÇÆOû5Ÿý!š½V¼«ö±ÿ“XøÉÿbf³ÿ¤3WªÐEPEP~™${«n¦¸‘n”M¤•ü˜ˆDÈáv•n3Ë·¸^Ûí^ußÚ<Ÿ'Ífò³»Ëعߟâß¿§Ûß5b€ (¢€9ˆ¶ÓAea­ÚÄÒ\i7vTvVhO(À<—$Žpv'¾³¼mà^Í\;ÕbÜ«pL0Wû»7>9EïÁÓšî"x¥E’'R®Ž2¬ÜW ᙯü'¬Ûx^T_²=IJÚÜË–ó-ö;R b@ûIÝÆ tù2ßQEBòxu·éVúŸØõ!lšÙ£k‹U“zÇ0G Ì´º•&68"²<àé<=á?išÖ©7‹5M5Û­jq!¸y„m”`|­±Ý3’åX†g%™¬YøÃÚŒµ[höø“P¶ŽÒëSHÀšXåTŸûäÕ‚F "4 ½Y(ÝóMkëÒÿ™ß:êœ= >Wfî’|Ü­4š»åÕ¥ªMYµsÅ~2þÈ_>=Mâiüac}s®iqi~x½}ÚzÆæDšÐ6V)7ìcÁC°‚¤I0“óÂ7Ÿ¿àúµß>ø·LøÁðWíV‘kßdDˆãtñ¤w06ùì ‘§ò¦Bbra,_xˆþœøÃÆ1ñ·ã/†sA7„õÍ^Êîo kÚCM,mqD ÜO䌒m%~e¨Úßg–|_è+gð{Äž2ñÁ…¹ø‡q¥ÜiZö’¶¶†O”g¾Õ;‡gwù7H ³*ÿÏU¢ªòÓŽŠîZ=úüÿ4ôg×Ë.¯< ©¬ÝI*p¦¹ãnW¬ov“…ÓWNМ_4uMy_ŒüEðŸþ àñÂMn;.é{}–ÚYÃXŠØùfæÎtpKÀDæ2À´ îÉæÞPØžÑxòÉI§i(¦ù¿+”×Ú=[á'‹~$¬—þ3ñ÷‡>'xÃÁÞ ¹kË+Èå±Óå6¶­ÛIÚŒR5ý²¿h_øBÆßâWìÍã 4}>ækÍf#N½Ótëû1 ë=¥ÃÇå·Ïæ‰FÜnP’$rÇÉYüqøÕñÏ^°ð€š/ˆ|% ½ñeÓ\k¶ Ê ;»¦¶Ž'WhÕGæ@ZC Œ''ÕêQ•©%u{6Ûm¾×oKh®ï¦ö>…g<Ê“–:u9¸sœcFœ.Ò“Œ ¹œŸ4œ#Ëï]EÉ$¿@§ð¾/øÃD_xæO†a-bÔ.þx;S‘înmÀ–6óu,Døß*«ýš4Ù…ýã1ŠDøÑ¿à£z'ìýà¿èö>ðWˆ5kK©î¼'†‘m[™fº…î®Í¼³GòÆ1ùò+ÇóJ— rœW‰e¿´¯Å=*Óö•ø³¤ü:ñ©lÖ>åAyqp‰/™0Ùº[¤LòÌ©$³y®ñl ÜöGÂ_ø&çìãá­;J½ðݵ޽­iw0]G⑯I-æðñÝÄs ,1“EµãËue`Ì$>‹\óæŒµKï¢ø¼úè|tj}[ ìjÐýÝT­QÁÞ žWtÓqwånMÞÍZé[À¾~À?ÿjíwßÿjoê`òïmüÛ¢¸òÙv´RF‚8´ýâfu…LŽ 0Ê2>Öøy{} ügñ–›€ü[ka­êSÝÜx‡SÔ–âÇt6ÖŠ 4‡bIæ0rß".6ÆñÚï|Z¼ø‡áïµø‹Â·þ}MÑ/%ŸIÖÔÁç] ­†çxTEUs†Ú¼fÄ‚X/ø3ÃÚ·ƒ|5—ŠÇ‘Q7džb¤)U©UFÍrë{+~=õó1ÂSŽ:®pš®¹9o>dï{µ_•¨»;ÅÝZí4rZ/‡tŸÉñ›Fð–»âß ø‚ûR_ê×kpVÚäÚŵ¬üï—fܰ«í+±’?³0ô­NêËÃZ~“.³®Í veŒ—÷r$KpRÚS#ÜUWb¼‡„PPŒ\Þsâ†:G€<3-®¹ñ{™¨øŒ(Öʱ3}¢pX¤¨Q÷ŽÜï)A7Ião ÙxëB—@Õ´û=SB¿ÌZ­Øož-ŒTÆW•q Œ†È+‚A §F<±n+ÞíªZën«®­\Ë0ªªV§³½Õ¤¹e6¢•7-Td®¡xÂ|¶Võ{ôU}?OµÒl-¬lm¡³²¶a‚ÚÞ0‘Å€G  )×wQXÚMs;l‚i$l…$àsÐWo©ón×vØåþ$^M&—o¢Ùîû~­(‚=¥†ÔÊŒO ê--b±´†ÚÙ(±Æ¹' Éç ¯3Ô[Å–™âxF¶¾×–ÄÅáí7T˜D€Nç p[$¨Ü¹ÜTº©=+O{©,-žúmïZ53Ão)–4“r«•RÊ@bªHç¥O7½Êlé5IVº³mZêú$öÞÚèífÓ] Ÿáé —@ÓÖêkëVµˆÅupI’dØ6»’,F ȚЪúÚ¿³í¾Ýäý»Ê_?ìùòüÌ Û3ÎÜççFŠ(¢€ (¢€3à’¯Þ"ÝL÷BÖö¬O——k¨Æ71=#^œgB«§Ú¿´&ßäý‡ÊO+n|Ï3/¿wm¸òñŽs»=ªÅQEå_´·ü“­#þÇ? ÿêC§Wª×•~ÒßòN´ûü'ÿ©@«EPEPEPEPEPEPEPEPEPEPEPEPEPEP_.üxµÖ~~Òø²ß µ‰þÃo¡<;m棣]}¤Íöˆ­Ü©q*0Fd9PÏ ôwŠtýGWðίc£êÇAÕî¬æ‚ÏU[t¸6S²â'ùdØÄ6Æá¶àðkãß‹ZOÅŸújÞ0ý²dÓ#ü«KEø{¥Ëu{/ŠÞårHPzóÍvŸíµŸ‰?´ˆ>,/Ãm_ᇆ¤ðÚh^Gˆ­£³Ôu›¯´‰~Ñ-º("E(¬çqóOa…úоOýŽ,i Oĺ¿‰>-ø²æïÀ×m‹¡ëZ-ŽŸª´†HÙn®#¶OÜaEòŒŒ~˜¢¾° Š( Š( *ý¬äÖ>2Ø™¬ÿé Õêµå_µüšÇÆOû5Ÿý!š½V€ (¢€ (¢€3ôÈàKÝXÃk5¼t¦i%,ïäĦO+´*ñŽQ½ÉЪv,Íu¨½K 'bUPm‡”Ÿ»lrI9~yă°r€ (¢€ å¾ hÿÛ:e¼P[Ìú˜”›;˜˜$Ti2Í‘µ[ËÙœãs'¶:š§|Ì·Zx[Ôµr&U&äyOûµÏ ƒ‡ãœF{@<'âh¼K¦‡?º¿ƒÝÛ2”h¥FÓÈâuÈøÇ@¹‚_øHt5dÖ­ÔŠ5ÊÝÇÆQ×#$F9àÎÜnè:õŸ‰4Øï¬dó"~ žº°ìGÿ\dh”ñÞ—áo k°|Oñ¯w¤§‡´Û‹V‘¯åK1¬„îNË"ª€ v)òE²ÿÃâ|,.|G¯é>%žîæk«=CD·0Û½œŽZß;†ýÙ^Aè@Ì…L¯A´-Sâ-·¼9ãÿ é/áIîE¶šÝ´Í{kå£y’ ªcu“$2ÊÃõk,½.¡á«[Ÿ ÜøzÆI´+),šÂ 4‚-䳌ÆQL FÈ1· @ãŠäŒ[›©§Í6öw[l•™ô5ëB8ha+NóMkîÊ1§nh¨É^I©N\ñNÛ-Ñ2Ò|#si¦xZþðÿµAô»ÇXžX&šYVR’— .Þ¬øÕÅ÷¾|'ðü*߇…?µ®õÏì«aÛ¯OÏ'$à ¨¹Ú‰“µW'1ü<ðŸáÖukMVûX»ñÑj—W42H H÷Â…ŠÆ¬6 * ìHÕ2«Fx…fÒê“Z>û;ÙüºøË ”Jº¡Ô’mFrŒ½ø]'sÇ‘J7m¯~ÍÂê÷<à|Cø±ãËÍ´/Ýø ]6=[P]~ÎÏ·4Ìœ \ÄC¬‹ôMÎe0ÜyoÄÏÚwR´ý•ç·-Ó¬~,¥•¬z­°ž+=BØÉ9Š_.2´ŒFñ2‚E^ÿðWJÿ„_þÿÁ x‹JÓ¬5¹å¶Ô5ýGíŸÚ>~'y!c#0@Òƒ×ï3š`¾[ð›à?‰~~Ðþ5¾¶ðƇ§ü-×dYSOŠéeX§¶0Ëksmåo5æ+رø8Ž'V‡òÉÞw‹zû·ê’IhÕ¯¦÷Ôû,''§^³¯BšŽÙÕ§Å{Uw NR©&ås(^ZÅA¸ÚÏ[â—Š>)øöz¼O x{ÄZ'Œ¤Ô¿±GÛÕ¯¥€La7{â‘ã eE!2Ì€G¶áoþÉwZðOÖ.tOøDõ+c§ë×Zªîméib’Æ“^J±¼žL^c*—+ …$#ÂÚôÞ0ðׄu­cÃŽƒ©Ý‘qý›u†“O”Á.L¥O ´²À6d@È•]xÃÞ-Õt-KYÑí5+ýäÝé·†kiJãrŸÈàñ¹±¹+æeºÓÂÞ¥¨3Ñ2©7#ÊÝ®y?â3ØšiO¶ôÿ†òõêg9áÖ0„o7«oKZú-lÓ\­·ÓVZor¸o\köÞ´f–ÂÚQ6©*g` ÷b,d’#¨8#•8·âývæêöèÓ2êw ÌÑ.ãiñ99nF;àö%Mnè: Ÿ†ôØìlcòâNKYÛ»1îOÿX`+Sˆ½ 1ÛÄ‘D‹H¡QaT°§ÑEŸáèà‹@ÓÖÖkUµˆEkp’Ø6£‚I É<ŠÐªz33é,÷©©9‚2×±ªªÜ£÷€/7^8犹EPEP|À5ûÇ[Y’èÚÀéòä@òíE9Æå%É㤋׌hU8™Ž¯r¦õ$ADY]ÑÒfBzáø<~èã©«”QEW•~ÒßòN´ûü'ÿ©^«^UûKÉ:Ò?ìsðŸþ¤:uz­Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@¾5ƒ]ºðn½…îml¼K%„é¥Üß)kx®Ìl!y”´à |Cðßö^ý§þxºóÆ7z—Áßxêè°ox­u{»è£9ÄPí)¼c$m…`àæ¾ø¢€Ñ&<Æ–@XnUvרþ×5¿xGOÔ¼E᩼!¬Î®n4Yï!»{b‚ƒ,$£eB·ÊxÝŽ ÐûXÿɬ|dÿ±3YÿÒ«ÕkÊ¿kù5ŒŸö&k?úC5t^ ø-ð÷áÅÜ·^ð'†|/u.<É´]ÞÍ߀ËFŠN°ÿS@Ÿ'‡´©m.­_L³{[¹L÷´Ri »®0ÍO< ±ýký¡öï³Cöï+ÈûO–<Ï/9Ù»®ÜóŽ™  V|~Ò¢´µµM2Í-m%Û° Hdè¸Â¶I9òjFÑ´÷{×kf{å tÆÍÂ…Úœ|ÀFx8 ÅYnµÖIj ପÊMÈò“÷ŽA)Ï8Œv"®V•¥iÚ-i4ú|â(ÖHÆ, ·ˆypp6!a!xË ¹'‡´©m.­_L³{[¹L÷´Ri »®0ÍO< Т«ÿgZÿh}»ìÐý»Êò>Óå3ËÎvnë·<ã¦j¼~Ò¢´µµM2Í-m%Û° Hdè¸Â¶I9òhB©ß+5ÖžVÉ.€œ–•™A¶SþñsÉ$á8çÀÐÚ6žïzíclÏ|¡.˜Â¹¸P»@“˜HÁÏŸ¨éZD:‡‡HÒÖ{IÞ-=aŒ ·ÆÊžXc˜×й\޳áCMÕ%Ö|4ÐÅw2ŸµYO‘ ÉÁ!¸èùïs‘ónÞ“ÃÚT¶—V¯¦Y½­Ü¦{ˆZ)4„‚]×fÈ'žXþεþÐûwÙ¡ûw•ä}§Ëg—œìÝ×nyÇLÐg†|Ygâ[|!û5üyØÊq,L ‘ÔŒ‘Î;ö9ž3ñ燾iPê^%Ö-4K ®b´Žâò@ŠÒÈØUÏæI説ÌB«ƒão†Vú–ƒ ZéúF³jË=›ˆ¼˜YÕƒlsÊç$0VÁFæõoøÃ^$ øâQ¿ÕJ\+2Û´÷±ÆÁ¢’KcóF!°pb;AÚMe94šNÏ¥ö¹Û†¥Î2©(«ó(ü\ªÍ½šZui­è^<ñÃÏë%Ô¡»žÃK¶{©£±·iæeQ“µGêI £,ÅT£3kž ±kx®<6÷š|f8£…RkñŒ’Ç…hó®˜pW¨©4¤Ðõx,/4ø¬®#³S¬‘F¹¶@(¼f?—¯`\„þxF ^ûÅVbïS:þ›iÊ_\<¶×I]'hå2¶àÅŠõÉYä.KŸ›MŸá¾¿–Ÿ‰TžÙ>{ªŠí=—Ãh´ík{ÍÊîú.^¥Ÿøž|%ø7ÿ1o‰zö‰¦ÿ°—šœˆ?Ï÷ä*¿òÖO¿­âÍWıü>Ô5 hÏ⟱¬ôZácQ9\ùrb@Ö濳nÞêê·ï¯Íéøž®%ÓQXØÅTN¬µq”y’åvj/‘'wîÅó+ô\¦à o\øðàÂ{àÿøGõY|í?SÒnÂMos´˜ät]͘dù°¨Î ¡Y'ö‘¼Ð´¯†Rjž$ð4Þ>Ñ´ÛÛkÛ‹#ŽF¶$TMÙQÁо#i{íGÃ:^«i«[Ïfuh µì ³¡B˜2!¤€AÈìEyÿÁÝ?áçìûªøwSÒµŒ6ú]µ×öv™|‘±nO˱B|êL™LƼGÅhÎ4œ7÷_¼ìõ[][[ù/‘Ó—VÃTÇÃü?ÞÆÔâä—,Ÿ½Ë75Êãd½é-ÓæÑ›_m£ñ¬:·‹ç»ÔõÝÅ-c¬évþ!³†&Ó ¤ ÀØŽHÖT|”;ÕÓsš^çÇ–~!Ô<¬[xOP´Ò¼I-³­…íôhb—Qú)Á(ànc—¸Öoüc§êqi¶—wÞ )Û$9(Z÷G¼emfÝhËoøóáæñúƑ©G,T±}>kë<‹¥…ŽJ¬£¹ä¡Ê7!•”t„oE¨»»>½zë«ZýÇ"«Žc•£Éh´œSJr¾[F3÷Rì§»zÜæ®ô?·ÆOjÚ>o…-´K˜5t¶¹K{y¯ k VŠG䌯ïÎЬ7.n}.°#ðö…áo ÚÚ¦˜KÑcÛ°=䱘Ôè¸y$—©ÈÜìÄõcÏgñÀzãñsÄ-m5»º¹‚öÑa¸hvËÀl ¡ÌÅ9Fe ›‚6Ó–¯]_¢ûŽlD«c)¤i%ZŒmvܤ¯k®g®Ý]O¯1ñÿÄ‹¤Ó/fðž‰q⛽.7¹‘¬ Ydù ì¡äÚ\€ Ü298«)áÿµ¤ÚºxwL´Ë³°µDóÑ=¬ã1‚R˜ÁF2zß hÖúf—%´PZOuòÙ¬A¢»@üL;ð©¿-üQ¡Î@v›M'ç(Âq”ãÌ“ÕwòÓ]I< Å¢èÈmî!¿»EžðÞkƒ+ •£2åI# Ì:á›%AUÿ³­´>Ýöh~ÝåyiòÇ™åç;7uÛžqÓ5^?iQZZÚ¦™f–¶’‰íáX$2Ht\a[$œŽy4Èní´¬hQTÛFÓÝï]¬m™ï”%ÓW7 hqó 9àâ…Ñ´ô{'[e{)jÂͺ•ÚD|| €8 Eʧ£+&‘b¯dškˆ# e+-¹Ú?v ðBôãŽ8¨äðö•-¥Õ«é–okw)žâ M! —uƲÉçUü=e¦Ë§éš©ûtcQjw ›™ ÀeÞä9áˆ8äç±EgÇáí*+K[TÓ,ÒÖÒQ=¼+†@I‹Œ+d“‘Ï&¤mOw½v±¶g¾P—La\Ü(] IÇÌ$`烊¹ES]OG²u±¶W±R–¬!\Û©]¤GÇÊ`cŠŽOiRÚ]Z¾™fö·r™î!h¤Ò w\a› žx$JÃW¹cd‘¡‚ /C.éNé3pœž?zqÐÕÊÇ‚ËM>/¼»S¿W0Dá“ý\IJílÈÏü³^±‡´¨­-mSL³K[IDöð¬$:.0­’NG<šÐ¢©¶§»Þ»XÛ3ß(K¦0®n.Ð$ãæ0sÁÅ £ièöN¶6Êö*RÕ„+›u+´ˆøùA p1@+Ê¿ioù'ZGýŽ~ÿÔ‡N¯E“ÃÚT¶—V¯¦Y½­Ü¦{ˆZ)4„‚]×fÈ'žxí-ðŸÀÿeÒ(xÂ>Ô5‰nΨ¶‘™–’ÕÔíœ*G³@ìV* ‘>ðóCÐt-7LûZØ­£¶ûf¡rÜO±Bù’¾Ñ¹ÛfÀÉ$ÖOÄ„öž1Ñ-ìt»Óá;ˆïm®š÷L²·i$Ž9UÞ"$F\ zgƒ¦øß7Ρ&µ}ši·OÄì§õZ˜šTçhÁ4¥/{ÞWw“øšmih®›^å >.xJÂKÿ›ˆÖK ¸k9-îÊ#JäLeTÚˆ$܈*Z\€Mnjw’¬zo…u)[ig7صP8Æ dÏNùÆÆaca¬]Gi§5£‹XCM{ tß1T\q¹IrpúÅÎr1­[%cÏœ”µWù»éÑmÓúHàl´xÂÍŸÄWÓh<’#éVb0ÅP"³|¯÷ö’Ü0ÈSò¬^°±Ô5_i·ŸD´Òu(£´¾Ôü©ÓR ±L“Âw3’*°ì ¡ÈH‘ú.-Û_ø&°­)ûŠïgwî»§u¯m5¾÷ßPª÷?jó­>Ïäù>iûO›Þ^ÆÆÌýxÆîø«Ÿ©ÇÞé&kY®$[¦0É%`&P]ðx]¥—œòëìEœÆ…Q@Q@WÓþÕýŸmöï'íÞRùÿgÏ—æ`nÙžvç8Ï8«Ÿáèà‹@ÓÖÖkUµˆEkp’Ø6£‚I É<ŠÐ¢Š(¢Š(º}«ûBmþOØ|¤ò¶çÌó2û÷vÛ/ç;³Ú¬V|À5ûÇ[Y’èÚÀéòä@òíE9Æå%É㤋׌hPEP^UûKÉ:Ò?ìsðŸþ¤:uz­yWí-ÿ$ëHÿ±ÏÂúéÔê´QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW†þ×_µf‡û&|4>%Ô4÷×õ{™<­;C‚%îˆ#Ìv}¯åÆŠAgÚ@,‹Õ…{•yWícÿ&±ñ“þÄÍgÿHf¯U¯*ý¬äÖ>2Ø™¬ÿé Õê´QEQENÅ™®µ×©tà,Jª °ò“÷mŽI'/Ï8v®U;eºÔ Y%¨3‚²«)7#ÊOÞ69§<â1ØŠ¹@Q@S¾f[­<-êZƒ9 *“r<§ýÚçAÃñÎ#=‰«•NùY®´ò¶Itä´¬Ê °òŸ÷‹žI' Ç8ö€.QEQEV]µÜÖ¾ŠåüCq˜=Ÿ–|Á3˜òË.ze‚Ã9­Jòˆ×âÆµ¤j6–V^ðÚê–#LffÔV]8,Mq¢ùa|ê0FpÈ»0—-•Iò-~ŸÕ¾ó¿ †úÄýéÆ)ZîNËV–ËÞ{Ýò¦Ò»èw>ñ÷‹|£ë:–…wá›ûëdžm&ù”ÍlÄr­Ìd+`Ê•ÔQWÒI»œµ§•%8G•6ÚJí%ÚîïMµwîQEQ‘N&c«Ü©½IAAWtGt™ž¸~Ϻ8êjåS‰Xj÷,l’40DèeÝ)Ý&c#®‚3ÇïN:¹@U{mBÖòk¨mîaž[I7Ç f†BŠáºÛœ:ž„P4›»KbÅS¾f[­<-êZƒ9 *“r<§ýÚçAÃñÎ#=‰«•NùY®´ò¶Itä´¬Ê °òŸ÷‹žI' Ç8ö(¢Š(¢Š*žŒÌúE‹=êjN`Œµìjª·hýà À ׎9â®U=Y4‹{$Ó\Ak(ÙYmÎÑû°W‚§qÅ\¢Š(¢Š(œLÇW¹Sz’ ‚",‚®èŽé3!=püž?tqÔÕʧ°ÕîXÙ$h`ˆ Ð˺SºLÆG\'gÞœt5r€ (¢€ ò¯Ú[þIÖ‘ÿcŸ„ÿõ!Ó«ÕkÊ¿ioù'ZGýŽ~ÿÔ‡N U¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(®;Ä–'ñ†—>®xjÇ©åhXêZ5ÅÍôØ™|›„»#Ì{Bî‰ö°$îhìh Ì¿ÛBËÇó|øïâÏ|0ÖíõHA¤éZÈÔ´ÉtíF‹P¡nÌåçuHÂ,–dRÆ ~ŽxGZ¿ñ‡m5 S@½ð½ôÛüÍ'QšÞYàÕšÞI#;€ 6¹á†prž&ð¶‹ã]ëEñ‘a¯h÷AEÆ©Û%ͼÀ0`7[  ŒŽ Õ©@UûXÿɬ|dÿ±3YÿÒ«¢ðf•ñ ÆîVñoŠ<3­Úœyq辸Óxl夿¸’¿Â1ƒ× Žwö±ÿ“XøÉÿbf³ÿ¤3WªÐ|j¦ÒéRòÍnšRmäkG)yW_4lgæ £‘òñƒce×ö†ÿ:°ùXò|“æy™ûÛ÷cn8Û·9çwj±EgǪ--Uï,ÚéeâE´p’G“•EóIFÆ>bÌ8?/84Z{Ò·6Á@µ݉‰¶òd>gïpp6qÆOZ¹EaéBáµ ‘¦—&)ÂêIáeûfKžAÍ\’ TÚ]*^Y­ÓJM¼hå## ëæ‚íŒüÁ”r>^0l[}«Î»ûG“äù£ìÞVwy{;óü[÷ôã{æ¬P}—_Úüè~ÃåcÉòO™ægïoݸãnÜçݪ¼pj¢ÒÕ^òÍ®–Pn$[G $y9T_4”lcæ,Ãòó¡EShµ÷¥nm‚:j »mäÈ|ÏÞ ààl㌞µŸ¨‹„Ô<8'ÔÒçºÉ08’ýžO”|ä"ðÛ¹Eç#ʯsö¯:ÓìþO“柴ù¹ÝåìllÇñoÙ׌n$©´ºT¼³[¦”›yÑÊGF×ÍÛùƒ(ä|¼`ØÙuý¡¿Î‡ì>V<Ÿ$ùžf~öýØÛŽ6íÎyÝÚ¬Q@ñÁª‹KU{Ë6ºYA¸‘m$‘äåQ|ÒQ±˜³ËΠ^ô­Í°GP-A·bbm¼™™ûÁœ œq“Ö®Q@Ö-@=‘k›bˆ¤]nÀÊÛx1Ÿ3÷c98;øã#­qZß„õ¯ü=°³Ñg™—ß»¶ÜyxÇ9ÝžÕb€3ãƒU–ª÷–mt²ƒq"Ú8I#ÉÊ¢ù¤£c1f—œ _ü>Ó|%¬x«SÑ,4½2ó_nçž "IÂmß1ßûÁœ¶Õ2ÒYÙUEKŠm6¶5…j”ã(BM)hÒz4Õûê“×®¥5‹PdZæØ¢)@[°2¶Þ gÌýØÎNþ8ÈëYz²^«Y£êðÚßK|ßaÙjæ'T‡Ê™Ÿ>HÙ܃r¡Ç=W¹ûWiö'ÉóOÚ|Üîòö66cø·ìëÆ7wÅQlºþÐßçCö+O’|Ï3?{~ìmÇvç<îíUãƒU–ª÷–mt²ƒq"Ú8I#ÉÊ¢ù¤£c1f—œ (›E¨½+slÔ Pmؘ›o&Cæ~ðggdõ¡bÔÙ¹¶(ŠEÐì ­·ƒó?v3“ƒ¿Ž2:ÕÊ(>H5Sit©yf·M)6ò5£”Ž<Œ+¯š ¶3óQÈùxÁ¯áíòéúdÖº‡Û´†±‹Ê’â673²¼…†r¸È(NsÚ¶*¾Ÿö¯ìûo·y?nò—Ïû>|¿3vÌó·9ÆyÅWŽ TZZ«ÞYµÒÊ Ä‹há$'*‹æ’Œ|Řp~^p$hµ÷¥nm‚:j »mäÈ|ÏÞ ààl㌞µrЦ±jì‹\ÛE"è vVÛÁŒùŸ»ÉÁßÇj9 ÕM¥Ò¥åšÝ4¤ÛÈÖŽR8ò0®¾h.ØÏÌG#åãBŠÇƒyñ}æÝC|bÆ ú{Fß»&Ivʯ»o͇R6ç÷jr8Äpj¢ÒÕ^òÍ®–Pn$[G $y9T_4”lcæ,Ãòóa>Õý¡6ÿ'ì>Ry[sæy™}û»mÇ—ŒsÙíV(›E¨½+slÔ Pmؘ›o&Cæ~ðggdõ¡bÔÙ¹¶(ŠEÐì ­·ƒó?v3“ƒ¿Ž2:ÕÊ(>H5Sit©yf·M)6ò5£”Ž<Œ+¯š ¶3óQÈùxÁðÿÚ[MñÇÙt‹¿øH|?ÿgü&~ÿ‰Gö ÿÚ?òÓ‡ü~ý·Ëÿ[óÇ·ÝùzüõôyWí-ÿ$ëHÿ±ÏÂúéÔê´QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEyWícÿ&±ñ“þÄÍgÿHf¯U¯*ý¬äÖ>2Ø™¬ÿé Õê´QEQEŸ¦G^êÆY­äk¥3I(!g& 2y]¡WŒrîN…S±fk­@5ê]8 ªƒl<¤ýÛc’IËóÎ$€«”QEV~§{¤™­f¸‘n˜Ã$@•ü™AwÁáv–^s˯±Nù™n´ð·©j ä4LªMÈòŸ÷kžAÇ8Œö&€.QEQEV‡£‚-LK[Y¬mVÖ!­À"HS`ÚŽ $0$ò+B©èÌϤX³Þ¦¤æË^ƪ«pvÞ¼Ýxãž(åQ@Q@ðG×ïmfK£k{¦Ë‘˵ç”—'Ž’/^1¡Tâf:½Ê›Ô‘dwDwI™ ë‡à ñû£Ž¦®PEPYúœp=î’fµšâEºc ‘Vòeß…ÚYyÏ.¾ÄhU;æeºÓÂÞ¥¨3Ñ2©7#ÊÝ®y?â3Øš¹EPEPYþŽ´ 1-mf±µ[X„V·‰!Mƒj8$À`“È­ §£3>‘bÏzš“˜#-{ª­ÁÚ?xðuãŽx  ”QEQEgÁ_¼uµ™.¬î˜.D.ÔSœnR\ž:H½xÆ…S‰˜ê÷*oRDDEUÝÝ&d'®€3ÇîŽ:š¹@Q@yWí-ÿ$ëHÿ±ÏÂúéÕêµå_´·ü“­#þÇ? ÿêC§PªÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEqÞ$ø³áÿ xÃKðÅüzÛjº—•öv²ðþ¡wj<É kæ]CÃ̧>c®Ñ†l)€-ø¯âƒ| }ceâ_è~¼¾8´·Õu(md¸9ÇîÖF¹ãŒ×J`9¡ùíà›]Sâ‡imrÿàµÅ9Åš‡‡®/uJW]>Ò$Š+;x¤&@7Hy‰I‘âÀãëÿÙ«ÄžñoÀOjž –ú_ Ë¥Cž59 —QăËò¥bN] ''•àž´Wö±ÿ“XøÉÿbf³ÿ¤3Wª×•~Ö?òk?ìLÖô†jè¼ñgDñíܶÚe‰­¤›Z𮩥¡ÈcÃÝ[Æ­÷OBqÀ?xd³¢³ä×-£´º¹1Þí¥0º­”ÅËQnuä|ÊêsÁ«nûCì{fó¼¯;wþ^Üãf6nÏðç8ç  V|zå´––·";ÁÌ¢V²˜8bHË¡Mȼ™€y#j°«Þ¡KœÙ¨y1k) îýÙÛ‰DÜAã¯X«-Ö ZÉ-Aœ•YI¹R~ñ±È å9çŽÄUÊÃÒµ›u ˜ážþâ[™Áhæ¶›e³ x›a%ˆ(Øb2Îî@¹&¹m¥ÕÉŽðÇm)…Õl¦.X2ˆs¯#æPGSž hQUþÝö‡ØöÍçy^vï!ü½¹Æ<ÌlÝŸáÎqÎ1Uã×-¤´µ¹Þîe¢µ”ÁÃF] nEàüÌèsÈ  §|¬×Zy[$ºrZVeØyOûÅÏ$“„ãœH{Cj°«Þ¡KœÙ¨y1k) îýÙÛ‰DÜAã¯NóR³–÷Aqym%Ì­%´b)f"&9r¿/ÊK}§(?ºElQYòk–ÑÚ]\˜ï vÒ˜]VÊbå(7:ò>eu9àÕ·Gý¡ö=³yÞW»È/nq37gøsœsŒPŠ+>=rÚKK[‘àŽæQ +YL1$eЦä^ÌÀ‡<Š‘µXUïP¥ÎlÔ<˜µ”†w~ìíć¢n ñ׊¹TôedÒ,Uì“Mqa¬£ee·;GîÁ^^œqÇ.« =’¹Íâ—6²€ .ïÞ¸Œàô}¤ž:ñYzˆ4óá[{Ëiµ+û"Ž5¸šÎw¸œmP$Û°<›²©“Øà ¢«ýº?í±í›Îò¼íÞCù{sŒy˜Ù»?Üãœb«Ç®[Iikr#¼ÜÊ!Ek)ƒ†$ŒºÜ‹Áù˜Ðç‘@U6ÕaW½B—9³PòbÖRÝû³·‰¸ƒÇ^(]V{$ s›Å/me@]ß¼;qÁèûIǶo;Êó·yåíÎ1æcfìÿsŽqбEgÇ®[Iikr#¼ÜÊ!Ek)ƒ†$ŒºÜ‹Áù˜Ðç‘R6« ½ê¹Íš‡“²À®ïݸàtMÄ:ñ@*ò³]iål’è ÉiY”aå?ï<’NŽq!ì ªÂÏd.sx¥ãͬ ( »÷‡n#8=i'޼V^­â >³žyµ(<›æ!†Îrn$I•Ø™nç £nPñ@_íÑÿh}lÞw•çnòËÛœcÌÆÍÙþçã^=rÚKK[‘àŽæQ +YL1$eЦä^ÌÀ‡<ŠÐ¢©¶« ½ê¹Íš‡“²À®ïݸàtMÄ:ñBê°³Ù KœÞ)xók( îýáÛˆÎGÚIã¯r©èÊɤX«Ù&šâÃYFÊËnvÝ‚¼½8ãŽ*95Ëhí.®Lw†;iL.«e1rÀ”@›y2‚:œðj¿‡µ+9tý2ÚÖâòú6±Šx¯."ùÑàg”¨Rç‚TÜç±EgÇ®[Iikr#¼ÜÊ!Ek)ƒ†$ŒºÜ‹Áù˜Ðç‘R6« ½ê¹Íš‡“²À®ïݸàtMÄ:ñ@(ªkªÂÏd.sx¥ãͬ ( »÷‡n#8=i'޼Trk–ÑÚ]\˜ï vÒ˜]VÊbå(7:ò>eu9àБ+ ^å’F†€½ »¥;¤ÌduÂpFxýéÇCW+.+»aâ{›asr÷†Î)Ø«#Œ<\mİ#9"1Æ5$zå´––·";ÁÌ¢V²˜8bHË¡Mȼ™€y¡ESmV{Ô)s›5&-e!]ß»;q!À蛈eu9àׇþÒßô²éûˆ?µá3ðŸúGü#šöwü‡4éãÿÈû/ÝãýoÞù>ÿË@@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEó׉ÿfEâ¿j?>*^|>ÒèŸ~øÁ^ŠHt]Ñm-ÄϾF’îp2Ìı –8¥uTP•~Ö?òk?ìLÖô†jõZò¯ÚÇþMcã'ý‰šÏþÍ^«@Q@Q@í¾Õç]ý£Éò|Ñöo+;¼½‹ùþ-ûúq½óV+?LŽ½ÕŒ6³[È×Jf’PBÎþL@:dò»B¯åÜ (¢Š*½ÏÚ¼ëO³ù>Oš~Óæçw—±±³Å¿g^1»¾*ÅgêqÀ÷ºIšÖk‰éŒ2D XÉ”|ieç<ºû¡EPEPUôÿµgÛ}»Éûw”¾Ùóåù˜¶g¹Î3Î*Ågøz8"Ð4ĵµšÆÕmbZÜ$…6 ¨à’C€rO"€4(¢Š(¢Š®ŸjþЛ“ö)<­¹ó<̾ýݶãËÆ9Îìö«Ÿp ~ñÖÖdº6°º`|¹<»QNq¹Irxé"õãQEU{ŸµyÖŸgò|Ÿ4ý§ÍÎï/ccf?‹~μcw|UŠÏÔãït“5¬×-Ódˆ°?“(.ø<.ÒËÎyuö BŠ( Š( «éÿjþ϶ûw“öï)|ÿ³çËó07lÏ;sœgœUŠÏðôpE i‰kk5ªÚÄ"µ¸I lQÁ$†äžEhQEQE]>Õý¡6ÿ'ì>Ry[sæy™}û»mÇ—ŒsÙíV+>àýã­¬Étm`tÀùr yv¢œãr’äñÒEëÆ4(¢Š(¯*ý¥¿äiö9øOÿR:½V¼«ö–ÿ’u¤Øçá?ýHtêõZ(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€<«ö±ÿ“XøÉÿbf³ÿ¤3Wª×•~Ö?òk?ìLÖô†jõZ(¢Š(¢Š§bÌ×Z€kÔºp%UØyIû¶Ç$“—çœH;W*вÝj¬’ÔÁYU”›‘å'ï‚SžqìE\ Š( ©ß3-Öžõ-Aœ†‰•I¹SþísÈ áøçžÄÕʧ|¬×Zy[$ºrZVeØyOûÅÏ$“„ãœH{@(¢Š(¢Š*žŒÌúE‹=êjN`Œµìjª·hýà À ׎9â®U=Y4‹{$Ó\Ak(ÙYmÎÑû°W‚§qÅ\¢Š(¢Š(œLÇW¹Sz’ ‚",‚®èŽé3!=püž?tqÔÕʧ°ÕîXÙ$h`ˆ Ð˺SºLÆG\'gÞœt5r€ (¢€ §|Ì·Zx[Ôµr&U&äyOûµÏ ƒ‡ãœF{W*ò³]iål’è ÉiY”aå?ï<’NŽq!ì \¢Š(¢Š(ªz33é,÷©©9‚2×±ªªÜ£÷€/7^8犹TôedÒ,Uì“Mqa¬£ee·;GîÁ^^œqÇrŠ( Š(  q3^åMêH‚ˆ² »¢;¤Ì„õÃðxýÑÇSW*œJÃW¹cd‘¡‚ /C.éNé3pœž?zqÐÕÊ(¢Š+Ê¿ioù'ZGýŽ~ÿÔ‡N¯U¯*ý¥¿äiö9øOÿR:€=VŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š+Žñ'ÂÍ/Å>0ÒüIuªø–Ö÷Nò¼«]7ÄWÖv2yrkË ¹$†Þ¹@VÊ€(äψŸ¾'^Üüxñ&ñHøyoðÆò[m;ÁÚ†“í¬$P,©5Ä’.Û¦b‘y;{cqëöÿ]øÇáÿ†uýCM“F¿Õt»[ë6`CÚI,Jíg*X©Ï¥|ñkᎧ&¯ñÖÇÆ?üOñâOˆµ9æðŒ´Ë´ÃahѨӣŽópf—s>vnäüù¯½~éúæ‘ð÷Âö>&¼]GÄ–º]¬✉î–HûNþ4Æ~Ö?òk?ìLÖô†jõZÉñg…´¿øWYðÞ·köÝX²›O¾¶ó?: PÇ"nBr¬FT‚3Á¸øfŸÿÐ_âþÿòuz­å_ðÍ>ÿ ¿Äü8þ!ÿäê?áš|#ÿAˆøqüCÿÉÔê´W•Ã4øGþ‚ÿ?ðãø‡ÿ“¨ÿ†iðýþ áÇñÿ'P[áXø‡Ä7°´7ÆãBÖ#Ó¯Ù_,JÚ}Èò0Iòü»˜óœþgÁ=Exý—ì§à=:æþâÒïÇ·ó ›Éaø…âk™Di’B/²ì#Š4Ürvƃ¢€-ÿÃ4øGþ‚ÿ?ðãø‡ÿ“¨Õh¯*ÿ†iðýþ áÇñÿ'Qÿ Óáú ü@ÿÃâþN U®_Åþ*±ð÷ˆ<avo…Æ»¬I§Y‹B¾Y•tûË“çäƒåùvÒc;ü¾1’9/øfŸÿÐ_âþÿòuT½ý”ü¨ÜØ\]ÝøâêâÂcsg,ß¼@ím)â2FMöQŒrÈ›†Ùtb°Q^Uÿ Óáú ü@ÿÃâþN£þ§Â?ôøÿ‡Ä?ü@«EyWü3O„è/ñÿ?ˆù:øfŸÿÐ_âþÿòuz­rÿ ñ&˜o›MÖt{=FÔêeMÑŠXRDó¶’<ͬ7`‘œàšä¿áš|#ÿAˆøqüCÿÉÕSIý”ü iVZf™wã;M²…-­lí>!x‚(`‰*Fˆ·À*ª€€@ÁEyWü3O„è/ñÿ?ˆù:øfŸÿÐ_âþÿòuz­å_ðÍ>ÿ ¿Äü8þ!ÿäê?áš|#ÿAˆøqüCÿÉÔÖéþ*±¼ø¯øn3}ý¥§èún£8¯ÙDW_G—Î|ÍÖ’ïÈV çExü²Ÿ€áÕn58îüpš•Ì1[Ox¿¼@&–(ÚFŽ6·e•iJ©8G#ŽmÿÃ4øGþ‚ÿ?ðãø‡ÿ“¨Õh¯*ÿ†iðýþ áÇñÿ'Qÿ Óáú ü@ÿÃâþN U®_Åþ*±ð÷ˆ<avo…Æ»¬I§Y‹B¾Y•tûË“çäƒåùvÒc;ü¾1’9/øfŸÿÐ_âþÿòuT½ý”ü¨ÜØ\]ÝøâêâÂcsg,ß¼@ím)â2FMöQŒrÈ›†Ùtb°Q^Uÿ Óáú ü@ÿÃâþN£þ§Â?ôøÿ‡Ä?ü@«EyWü3O„è/ñÿ?ˆù:øfŸÿÐ_âþÿòuz­rÿ ñ&˜o›MÖt{=FÔêeMÑŠXRDó¶’<ͬ7`‘œàšä¿áš|#ÿAˆøqüCÿÉÕSIý”ü iVZf™wã;M²…-­lí>!x‚(`‰*Fˆ·À*ª€€@ÁEyWü3O„è/ñÿ?ˆù:øfŸÿÐ_âþÿòuz­å_ðÍ>ÿ ¿Äü8þ!ÿäê?áš|#ÿAˆøqüCÿÉÔÖéþ*±¼ø¯øn3}ý¥§èún£8¯ÙDW_G—Î|ÍÖ’ïÈV çExü²Ÿ€áÕn58îüpš•Ì1[Ox¿¼@&–(ÚFŽ6·e•iJ©8G#ŽmÿÃ4øGþ‚ÿ?ðãø‡ÿ“¨Õh¯*ÿ†iðýþ áÇñÿ'Qÿ Óáú ü@ÿÃâþN U¯*ý¥¿äiö9øOÿR:øfŸÿÐ_âþÿòu û3x'í–0ÔþÃ{m¨Coªxç[½·óíæIáw†kÇöK8¤eGê´QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQU5mZÇ@Ò¯u=NößNÓl¡{›«Ë¹V(`‰³ÈîÄUPIb@hÝòwí“ñ;Dñßì×&·àÏizß„-¼G§Ûø–O kq4×¶T7VóDÿñðèñâ Á˜6ÑÀwöIÃöß´ÿ,¾Øê^ømiá»5¾ð¦¸—wWy‹-Ü6W½Š#ÈÒmUwÆ7c4öQ@W)ÿ cÀÿðÿÂÿ —‡ÿá3ÿ¡sûRíõ^wü{ïó?Õ~óîýß›§4ÕÑ_–ÞÖ¼ñƒàþ«ñÇú'ÄTñ.£ªÝÞÉñ;E‰Ú F—l¶ñ[0sQ"o1Ã"üÎ’§§º=ÜWúEÌ7‰¨Ã4 "^E“©PDƒaÏs@(¢Š(®Æ¿¼+ð×J‹Sñ‰´ é²Ì-£¼Öïâ³…å*Ì##(,UíÎp¤ö5åÿþ+]ëÖÞð/Ã-ZÞëÅž8¶ûU¦·c"ÜC¥i6«¹IV]Vpò:c 5{…óüAY?b¯+Ë$Î'ÕÁ’VÜîµo9cܞ澟 Š( Šñ¿x¯Mý£~xËÿ~)xyüE-´v­¬èzœWÇM¶ ·å‘š4˜!àîåãç'øà/‡¿´¿Ã þωr<[¥j‡þ¹ôÛéî­WIòœLº“³4mpï´ oœ0'å ¼h¢Š(¢Š(¯Í½ὯÅOثƴ~¡©jqü_š-cÅw‰#¿™&ÓÄÞE¬*bÂ#¶cÛƒ¼ç8ûûᇊ%ñ¿Ã_ xŠáBO«éš„Š«´–€;rÔÓQEQE|µñãà×Ãéüq⯉?üCa}à k;[/èú…ÜÐA§0G7.#FmÄ®F ¸çú–Šùëö¶ñM·Àt$WƒO}^ùü7ˆ›P‹E2“f—þmÁ3ÜíÙÛô-QEWñ‹â¦ðwÀ—ž!¾‚]BãzZiÚU¯7•ì­² XGw‘ÈÃ,xRkæØ«IñfûP~ÒqxçU]_ÅSAá{»÷‡ýE¼“ZÝËöhé”[üµ'’É4öuQ@Q@ùmà}kÁ_>ê¿ü¢|EOê:­Ý쟴X ð¤ivËo°30E&ó2/Ìá‰*qú{£ÝŤXÜÃxšŒ3@’%äXÙ:•H1ÆñÇ4rŠ( Š+ãÚõt+¯ÚGáÅÄ‹=GÅß n´;ñ„ô4žòäêŠêÂîk+ÞÍ Â…eG<íÝ’öuóGüöêîûàn£r5 nü3/‰5&ðÅ¥ÝçÚnôÝ$J½¥ÃfYc!ó1dTò0>— Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( šè²£#¨ta†Vzuãß´‡À»¯Œ Ðí¼9g ø“Ã^ ²ñF5ݹ’ͯ-X”K„R ƒ2’§#‚3Œ?„ß|t>:k?>%ßxyòW’{Tˆ~êVlª²3©ÁÆ>¬ð§†ìüá}@Óƒ®Ÿ¥YÃcl$9aH2{œ(­Z(¢Š(+‹XnÐ$ðÇ2²(aŸ^kÌ|_û3|?ñ·Œ®ês5ÅœQ€b“—•VFqÜ©8ÇÖú&iáÝÃJÓâXXÛÇko9Ù(U^}®Ñ@Q@|“ñàwƽSö–Õ¾#iÃOivÖöÖ¾¶ñ…ýø“EUŒ‰#Š+ve–RÄÈ mª€2+ëj(ŽøW/Ä |7+|I¶ðÕ®¿ö–§…n.&µò6®ÒZtFß»~F1¼õ®ÆŠ(¢Š(†ø¡ðWÂ?#Ñ—ÅVW—O£]Ý>k VïOšÚb… ¬–ÒÆùÚÌ:ô&¼à·ìƒÂÚ;â7Ä·^Ï£ê±é‹¡A'‰u;»ˆÌV²ÃuöÕšB³‚d?1¥ØÛåšúVŠ(¢Š(¢Šøúëö[ø¹¢ü3ñ'Á x— µ‰¯¡‡R½·¹}gMÓï%y'µH‡î¥aæÊ«#:œ‘œcêÏ xnÏÁ¾Ñô 8:éúUœ66ÂC–D'¹ÂŠÕ¢€ (¢€ ð?‹?_ø}¼E/†/ôŸùéiqhÓ‹„xå„3Ç"È~V §cŸ|¢€<‹öfø+¨üðn»»ªÛjþ'ñ7ˆ/¼O¬Ï§ÂÑZ%ÝÓ)xàF%„j@ÝÉ “ŒàzíPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPE~güðß칫øÇãœÿ¦ðL~,]J=VËQ°iü°Å„iµ–Ti•$¢(¯˜?à™ñ$?±O€#E‰>¬ª£ U¼À¯§è¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(ã_ƒÇãGÀMkâÆŸÀ½OÅšwˆ<}¬øŽÃS³ñ.•n’[\Ì _$³‡RUa€#v¿ñŸHøÃñªÃÀšµ×Âý_Mдbí|Aðö?ÚÛ\ë6íl‚Úà][Ì#1Ç+HL/"–Ú20E}wE|àÙï⇂i]¯†@gÈ4ê>0ý ¿oH·û^­ªxA±³·Þ©æÍ.‡p‘®æ!FY€É òE}Á\F…ð_Âø§â_ˆÚf›=¯‹üI6Úµâê&+´…"Ýnd0†E@p€/ÏÎÙðü ñÆ¡ð+öMðõ¾‰ækñ…ï¼Cmö¸Ø¡´±’+–Ü_l›€Äe‹g*æ½?†ž$_ÛšãâÓâ‡è#Qóâæøjo9‹ËÝæ«`Û¶íçÏîՓ⯠XøÏÃ÷š6¤×‹cv¡e6ÓÙN`ÃlÐ:HœÊ°ÈÈèH ž?àšŸòe¾ÿ¯_ÿNוôírß >xgà×ôßø?M:O‡tã)¶³7Ü2JòÉûÉY²ò;rÇ®ÔÐEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPÿÙgnss-sdr-0.0.9/src/utils/gnuplot/8_Galileo.plt000066400000000000000000000021301305042567700212300ustar00rootroot00000000000000#set terminal pdf color font "Bold,14" #set output "IFEN_accuracy.pdf" set terminal jpeg font "Helvetica, 14" set output "8_GALILEO_accuracy_precision.jpeg" set grid set xrange [-8:8] set yrange [-8:8] set ylabel "North [m]" set xlabel "East [m]" set key Left left set title "IFEN simulated data, 8 Galileo - Accuracy and Precision" #file1="8_GPS_GNSS_SDR_solutions.txt" file2="8_GAL_GNSS_SDR_solutions.txt" #file3="8_GPS_GNSS_SDR_solutions.txt" #values to copy from statistic file DRMS= 1.870121081 DUE_DRMS= 3.740242162 CEP= 1.556390643 #difference with respect to the reference position #values to copy from statistic file delta_E=1.191 #galileo delta_N=1.923 #galileo set parametric #dummy variable is t for curves, u/v for surfaces set size square set angle degree set trange [0:360] #radius_6_GPS=6 plot file2 u 9:10 with points pointsize 0.3 lc rgb "blue" notitle,\ DRMS*sin(t)+delta_E,DRMS*cos(t)+delta_N lw 3 lc rgb "black" title "DRMS",\ DUE_DRMS*sin(t)+delta_E,DUE_DRMS*cos(t)+delta_N lw 2 lc rgb "gray" title "2DRMS",\ CEP*sin(t)+delta_E,CEP*cos(t)+delta_N lw 1 lc rgb "black" title "CEP" gnss-sdr-0.0.9/src/utils/gnuplot/8_sat_accuracy_precision.jpeg000066400000000000000000001420231305042567700245240ustar00rootroot00000000000000ÿØÿàJFIF``ÿþ;CREATOR: gd-jpeg v1.0 (using IJG JPEG v80), quality = 90 ÿÛC     ÿÛC   ÿÀà€"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ýS¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šó?Ú[âÂüøã_Œ½3Oseó.äÄvéŽû¥xÇã@™E|‰û ëž7ðV¹ã¿ƒŸ|I©x£Åº z~»m©ëos<ö·–¨e]رHnTäÿ®Û\ý·ü ¢ÞëS.‹âÍOÂZóiÚ¯4íÍ£YLŒ@ÒîÞÊŒpÏ2Œu ¡h¯ ñ¯íá? x›\ÑtÏø³Ç áø’mrûšWÛ-t°éæ,…×slÃ{yqÑü&ý£|!ñ³Å¾)м+%ÝèÐ,´­BMIãUµº‡P§·hNâç‡ptB žpê4WÍ:·í÷ðóE×SH¸ÒЛÂ^1Õümâ-(kPø;LÒÒMRÒ×^åZUŠ-¬2™H r¢¼OIý¯þj?õ¯ˆ·Sjz6—¢ê2hÚŽ™©X:jVÚŠ2§Øºî-1iR~ðä`ãœÔn¯øoÏ‹Åñ¯ƒ¯â[kƒa¯iQÛÊÖs\ÇmöÅ>iFŠ9&̼ЇGÑ\V±ñcIÒ>,øwáçÙ¯o5ígN»ÕCZ¢46vÐ4hdœ— ¡ÞUDÚ­–ÎpkÊ?à¡~%Ö|#û!øãUðþ³¨øV†]1!Ôt«§µ¹ˆ>§j²D!—(̧Ät4ôeñ/íàmKöWð¶‡ãüWø©x•5í:ÊÛÃ>&ñ,Úµ¶¸³\¤RZˆ&$îØìÁ“l=ðG´jÿµß…4¿ŒúçÂø´/ê¾)ѦÓÖétëš‚é7›²þ`Ù §šîiu 4îTWÏOíÇà-^ÿK™tÚø;U¿fŸã›­ Ç¡Ý\3˜Ð,Å·…gVFŒ!?Å]_Ä¿Ú[@øwãX¼i x›Ç+ûÔn4 éÂî[;RÛVY™@]ÛŽ8S‘\¢¾bð‡í+ðãÇbñ ‡Š¼[ ´îõ«› ·èV–¶ú—s,öÌ|Ä¿ŠDd'na€'#;~ ý´¼)âýw¶røKÆþÒ¼W2Ûè>"×4_³éÚ”Ž…âXÜHξb‚ɽpé@AQ_.|&ý¥ü àOÙ“À¾"Tñß‹à×µ+Í7Eµ×•u/ê·"öáZ,FÅX)G KXÖ0H8Ýøcö®ðŸ‰<9ãëù´¯èǬRÖü3­Ø­¶§ •]yê6ÖY ärFE{Eó¯…ÿnOøžëÀN|=âý'Bñ¼¶Öš/ˆõ--cÓ¦¼ž=ÉhdY„»·G¥ #mvuzÇÆO‰v?þø³ÆúŠy¶º›5ñ„6Ó3"’‘ƒØ»mQî€;*+Âþ |E¸ðÌÞøyã[Zÿâ‰<=?Š®5;œ5›ÎeF¹´ˆ—,žQ¸P‘„ #QÎx¬¿þÜÿ,³ûÕ©BëqµYÕã![ ŒÝî2ì”W„øöÂðŸ¼Sáíãþ.ðšx™XøTñ.m,õrxXdÞÄ3 ,« Bà9C\ý·ü ¢ÞëS.‹âÍOÂZóiÚ¯4íÍ£YLŒ@ÒîÞÊŒpÏ2Œu ¡h¯œ?bÿÞ&øóiñJoéWö)¡øÊÿMÓd»†Ú5KEoÝÚ“ ºh@ýãr§ÌM®üáß¾£wáÏÇ©¶¨öð[:ÎR4”w‘]E¹&YpREÙæ6P}E|ë­~Ý>ѯ5{ìo_ø?GÔ—©xÞÇG2è–“«„pÓÞÊŽv³¤l ÷ägèh'Žêæ†Dš:IVR2#¨#½IE|uðk@ñ?í™ ê5ω^1ð—…5=FîÛÂúƒµ?ìÄ‚Æ žžâERòË#ÆÌA;@ãŸø÷ãìßðRçÃú†¯kâßk^-¶ðŸ|E¨igŽð"[äU e„,Ù aö!#–È×”WËzçì¡ãíÂ×Ï…þ<üB½ø“k¹†mcQIô‹Û3å=O*8œ‚ /(9l`ù×ÅoÚ¯íû8~Ìþ&Òõ­oÁMãŸéZN°ÞÔæ°œ+%ä7P¬±°mžlD€IûªO"€>颾6ø‹àÍgömø£ðjoüJñωn|KâÈ4=OÃ(ñº¼W:t‘È×(“e£0½H<õÁEø}}ñËö¼ý¡´­câ'ÄIðÔºišw†üUw§[@'ÓåÄq¸_™×wrXõ&€>Í¢¾Ñ—bòêww€°{e·8+"}ÛŠªíëÊæo ~ÕÞñ'‡<}6•âXð5ƒêZ߆u»¶Ôá€Bò«¢o1¸uFÚË!\ŽHÈ h¢¾mÓoo‡ºŸí¼Xš7‹£Ò5°Ã£–ÑËI­^\£7Øì•\ùÓDQ’\|ŠÀ€í^1ñÃö£>'øçðëHañὯ†¼]}â-HÛM¾’Üiaíî" #A,ˆbœÄÛ›dˆs·¸ß4W̾ý®|!áM3ῃ,tÏøËZÖ|aâm'Ì·†óRÔ­˜$j'“ÍÝ‘ºY±Êç~pçü6çÃx¾\|@ºÝ•¼ãxbMm5¿µ—Wþ<|…$yØç±ŽôïÔW‰øö©Òý§ü%ãH|Zš¦³à}W–ŸÚ:Îâ»/²]ÚÙìg8VuxˆGù‘›ppqžk¶„üg­x^ xãÃzG‹e[mÄZÞöm?R‘мK‹#:™Bꛇ"€>ƒ¢¼CöcñÖ¥¨ü>ñôú—ˆ>ëm¤›Û¹ —v"Ïa<¬yi *3Y¢f9-^ß@òÿˆ×㿌µ_ˆþ!‡Çvßü1áËË‹]ÂóC¶»Q‚•šúêirË ŒXª¹9=|ÓâÆ/|rýšÿf?ik~½ñߎ´;Xÿ„kRŸO™à–;Ä•RD`â71¬Š « ¶73,X`^)cy†¡ã âü>¾øåû^~ÐÚV±ñ⋤øj]4Í;Ã~*»Ó­ éŠòâ8Ü/Ì뻀9,z“@fÑ_›ß>!øïáÿÀ/ÚÇúOÄëšOï´h¼9ã µmJ'¸{w»µûd{YÌ%‚ÀHUaôOÃ?Ž—þ ý|5±‹ZÓ<*Ú”¾$×üG§Zƒ¨³LÚCæKÂ^IÜŽˆòTŠúrŠøûÅß⢀>3øu­ø·öTñÅÝYøcâø–ëÅZ.¥á0ÞYݨcÒV6þ[ÆPp»H9ÀÎøY«xãà7Çψ>#ñ·ÂÍzeñæ‡áé­ÓÀZSj6VwV–²E=£8ˆ‡—œ„!IÜöíù±ðáŸæý¢~ëþ&ð¹¢ ø£ãÝgPµ½’\éðù4ÁvÞPV9s¶B¿)5ôí+«øêÏão†mdƒÇëð¢]S4ß ìüëéµ_<ŠåÑL±Aäò eÏ,ãêj(ó?Á_¼mðãÆv¶ŸüQk¬ø[ã5¿Ä»M [v–]cM ÇzîÉqp›÷Žw*ä±aŸ¥µkRý­Ä^ †zφ<{á«ÛÝÆzSX^¥äÁR­cc¹‚á¤wÆÜ¢O¦«Æ>›Åž½ÒmõÍOÃrÜ…Q©èÏ]B>[I¨$¤•' qƒ‚>Ný†ôß|kð$xö+Ë gRÓm¼ nö÷O ÄVö¯&†xÈhÚ[×¹mÈC)pr3[¶gÁK›?سÇÞð·Š|c{{¦Ü%î¡}®ßIFÌȨfyeØ©bŠvŒ;`e}ðçáö‰ð«Àú7„¼;lÖº6“n-íãw.äd–gcË31ff=KÞºJóoþÍ_ ¼®A¬øoá§…4=^ ˜oìtkx§ˆ‘‚QÂeN8àŠñ„¾"ñOÇÛÓ®ôxüYáÍJÑuË»i#¶šFÓ.bÅ)\8Ú=ûs´ã<×ÖôP懾øÓÅü3ð_ÄOÇ#©$6:F£¢›m"ËÃÖÉ‘îž=Oìf$òüÄÚÒJÅUI$î?@êÿìñûSüNñ­ï‚fY28$Ž÷Wð׋>2x§ãßÅ<â hן çð~‰¥ë-¥«Ï¶âf—ì¼È¸gXÐ0ÜÙàuíº(âŸü<ñ,ß³ìy¤ÛxkV“RмOà«ZÆ+ LÚ|pÀ>Ñ%ÂÌKgypž¸¯bý¹|¨|Dý’>(hzTo6¡&÷1C%å0:ÎQ@êXDTäâ½ÒŒŒ”ñçíqqâOüøiñ“áN{âOé‘5ÆŸi¥@ÓÍ%ž§§¼µB¼–òDœc#„ƒöfñ'‚?hχ^Òô+»†Wþñ³¬ÅnæÒ+ÝÒâ…ßwLé`ä1ÉòúkíÏø Iøiá¸ô 9-´x&š[kG}Ël²HÒ£þìj\…^ЏQÀttùáûL|'ñ·‰¯l³¤xG[Ô¿¶¢ð<ºOÙìda© IK‘lq‰š5S¹P’R{®‘¤êž$ý¼´/§‡u‹_ Ý|%0¥þ¡§KAs&§¢ÚBÊw2I‰ˆpdpkéª(çoØçÂÚÏ…î~:ñ_ÄÏ |@ýŒ5ßxjãÄÿ­lüG>µ¤é1Änœ8UÞ4#L‘8rˆFæVUêEñ¯àïÄÚÿSøÉâïøKYð]×m|'¢Zxš§ÞkŨ¥ü¬as˜„òTÉ´39vßµüOð—Bñwįxæÿí_Ûž[ôÓ<©vÅ‹¸’)¼ÅÇÍò¢ã‘ƒžµÚPÂÐø×àÿÃôÐ5[OYXëÒx;Key4YÖEºóây"%”íÆF ý›¼7ñö»ý¢õψ ¬µí.âoÿbj> ÑÄÐL«¦*Oöi$M¬ª«ì'@<ŠúòŠøx|2×¼ ~Øÿ ¼=ámf×Á>k¿é–¶3Ég$·:LÂî "©csÜ¡Î_…äÖÂÉ~ h? ,iÞ*ðÿƇÿ´Gƒ|¬xšÊ ŸøÂÉ‘¬E§Í"ÝC$vòýôR’"CsŽ9#J×âŸÄOŽŸ<iá x¿áßô‹ÆÔ¼M«x¯L]>KôXÙb±‚ ‘Ã9Üî€aŽ@?JÑ@;|i𶵪þØ¿³vµe¤_ÞhúL'†£³½½™–ʈM cÞÊÁw¸‚q_DÑE|wà­Å²×Œ>3húÃ?øÒxªóÅz©á;í¶÷bê8ÇÙgu?èídzt˜]§ ãÎðÏŽ¿goŒÞ/ñ¯‹þkµŸÄD™áø}§F=þÎÝá–Å¢Vܨw†}Ì瞸ûVŠüõð§Áoˆ¿ OÃ?ŒWþ Ôu›ø—ĺ¿‚´­—úuž±”ž\`âG„"3"’ß¼#6:ý_Ã^,øÉ⟠ðWˆ<5£^|3ŸÁú&—¬X´–¯>Û‰š_²ó"ác@ÃsgÔ¶è ‰5†ž/ð§ÁßÙ'Çgƒµ-r÷á¾›huÏ A—¨ywZ[Îé ›KO äùg ’z`×ûIßxÏã÷ůëšÂi¾Óüã¾ÕtYa¹šê}%•"h@gKÒ=ûLŽònOè}ñOì×ðóĺ'Ç߃š–©á­ZÂÇNø§h÷7w–Ŷ ·6Å­]Ù@I‡&2Cç-ô‹^øsñ¢ h^%ÓeÔþ7^_^Ë¥éõI4 ÜMu§G2™ŽÐ•Xœ»Çß4PÂßü?ªé¶ö›ãüñ4xSZð<ú ~!ñš\\Î÷‹yÁ3+³(ŠFʪë/œ'Ï“äþø?ñ#Nøû9j‹á¯hš‡ÂÍcZ°ñ›£éЦ²‹t[eÝ”WqÃ¥cÌÌÖ‚Î ("Ü yòŸùnà!ÆGð^ÏÇñ÷Ã=+á—†þ,ø/FK´‹ÅžñÄoqáÍ2Áco6;+›Œ¹e}¢/)ÈaÉ 2ßôÙº2†(HÀeÆG¸Í|«ðkÁüPø×ûPë²Ýjv^ÖµÝ'A†ëHÔgÓîLÚe¢%ÃG<’/ï\ÆJ°ÈFS‘‘_IøCÂÖ¾ ðí¦eu©^Û[oÙ>±¨Ï¨]6çg;çÞGÁbæ8€ªþð&‘ðÓÂVÐàxtû0Ä\¼³Hì^IdsËÈîÌìÇ’ÌOzèhà?øöóâ¯ÅoZ|\øuñƒVð‹«Éc¡øGÃ~½}'S†_^MSuæ:–H‰òÕB’±®çö¡Õî|Wð¯à‹<3ð÷ÆKÐþ"iZ­Ç‡m|78Ôìlm£»F-dŠZ5P£aÓû¾â€>9øÁâ¿þØ–ÚÃ?ü7ñ¯†¼/u¬Y_ø—Ä>0Ñ_J†+i–s 1,²á=5~.ë¾)Ô< úuÝÛ¾•iq` ÞÝyˆ7ÉÆ‚®ïÆNÜŸKø'ñŸÅº×Äÿ|/ø¦i^3Ðlíµh/ü>eû§c9e¢JKÆÉ"efnz(ܨ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+â/Ú/öºÑ¥øÛ¯ü%¾ø©kðsú½±ÖuÈbi5}BYãó>ÍdÛ-Õ#d/1Ã8 ¯·h nïþø2oÙïâo‰ÿ¶>x[Ö4}rÿNŠ{—¶}BÍU®ç%K¶$(ÒHAÇš;p=Gà–³mñ³öÁñÇÅ_ nü§øJËÂvZÁ‰ãƒR¸ûL—S4€Þ±îT-Ó-Á"¾©¢€ ñÿŠâ]ãG‚ÿåUð¦ü]ÿEÛâþø{ÿ•Uêµò'í5ûRøŸÃ?¾x3À ‰¦èz/‹õ–‰$HþÙ/˧G½HóòHˆLX ¿Íÿ oÅßô]¾ à‡¿ùUGü)¿Ñvøÿ€>ÿåUwž4ñU—|®ø—R,4íÂ}Fä ËyPÆÒ>=ð¦¾\ø?ð—Ç?´—€4¯‰¿>*øÛÃ7ž'·]OKðoìË&ÊQ¾ÝÔ-<ž[+3É‘–Æß—$ÙÿáMø»þ‹·Äüð÷ÿ*¨ÿ…7âïú.ß?ðÃßüª¯›ÿhKï? bŸŠÖž,ñ]ԺƫiÖþñ®‘wö=F÷O“Rµ@ÓJ˜æ ÏÊÜçæ&ßíàmKöWð¶‡ãüWø©x•5í:ÊÛÃ>&ñ,Úµ¶¸³\¤RZˆ&$îØìÁ“l=ð@­xËá×Ä­Ä~´Ò~2|@¾°Õµ©,µyÿ²´>Çj4ëÉÖ]Ë¥n ¶så{·™HêÿáMø»þ‹·Äüð÷ÿ*«çÏ?,ïjýcÁ>(øƒá‚-´‹9¼0t­E´{}jy7›©e¾¬leÔwÆsŸuý|;ã/ §‰ìõÅñÀÏs Ç„µÛ‹µºÔZÙ£ýôW2¢*I²A„pY˜’0½ÿ oÅßô]¾ à‡¿ùUGü)¿Ñvøÿ€>ÿåU;ãÕïÄw±ðÖ‰ðÔC§ßk¢Ûj^$¸¶K”Ñl–7y'»#’¨ŠF_$q^wðâoŒãý ügð³Ä1´ø¥éz¦µ‰íl`µ–ÎYexÚÊäAû¢ä/˜¸ vç9ìè_ð¦ü]ÿEÛâþø{ÿ•T›ñwýoˆøáïþUW-ûT|Nñ^…¨ü<ømà ètüBÔæ²ƒYž8Ó,­âó¯.R6ù^EU¸%½«–ñ‡ìÇñ#À~ÿÂߌ^8Öüu`ñ̺ou•¾Òµ`yË Xw.pÑí+õù€©›ñwýoˆøáïþUW)ñcá×į |,ñ–·áŒŸ5Ÿiº-íî—§eh3ýªê8á‹ËJûUv© s€rk›ý²xGY½ð_޾!jг_iwmÆ›ekÚo&Œ‚"4È 0r;àæx;ãN¹ãïø'‹¡yaãÁÚΟ©]G;%ݶ©ek4O/˜§rÈZ5”09Á bÿ…7âïú.ß?ðÃßüª£þß‹¿è»|@ÿÀòª­~Ìšµö¿û6ü(Ôõ;ÛGR½ð–“suyw+K4ò½œLò;±%™˜’X’I$šôºò¯øS~.ÿ¢íñÿ|=ÿʪ?áMø»þ‹·Äüð÷ÿ*«Õh *ÿ…7âïú.ß?ðÃßüª£þß‹¿è»|@ÿÀòª½VŠò¯øS~.ÿ¢íñÿ|=ÿʪå>ü:ø•â¿…ž ÖüOñ“ââMKE²½Õ4ïì­²ÝI<ÑyriEÓk³.Ö%†0NE}EyWü)¿Ñvøÿ€>ÿåUð¦ü]ÿEÛâþø{ÿ•Uê´P•›ñwýoˆøáïþUQÿ oÅßô]¾ à‡¿ùU^«EyWü)¿Ñvøÿ€>ÿåUð¦ü]ÿEÛâþø{ÿ•Uê´PÏ |ñÅÞ½¾Öþ4øöÂò-sXÓãŠ=3@Œ5½¶¥smm&K$—†œ·F.J€¤×ÿ›ñwýoˆøáïþUW¤éJËjáì“O>|ÇÊ”†kbN8Ëœ÷ÎyÍ\ *ÿ…7âïú.ß?ðÃßüª£þß‹¿è»|@ÿÀòª½VŠò¯øS~.ÿ¢íñÿ|=ÿʪ?áMø»þ‹·Äüð÷ÿ*«Õh *ÿ…7âïú.ß?ðÃßüª®CLðÄ[¿‹~%ðìß|{ƒ§èz^¡iz4Í4·„sÆ\é{X"ZÛ <ÒI!—BU8•†¯rÆÉ#C@^†]ÒÒf2:á8#<~ôã¡ 6ÿ…7âïú.ß?ðÃßüª£þß‹¿è»|@ÿÀòª½VŠò¯øS~.ÿ¢íñÿ|=ÿʪ?áMø»þ‹·Äüð÷ÿ*«Õh *ÿ…7âïú.ß?ðÃßüª£þß‹¿è»|@ÿÀòª½VŠñMÛÅ~øûᯠßüEñŒô]cÃ:Ρ-¶»i¦GäÏku¥ÇÆÖ–p7ݼ˜ÅÊð¯k¯*ñü?ÃÏû=ÕÓJðÏÄo xT–ZN¹ku32p‘ÈXð éÚ€<⯎ü]àŸŠþ#ÓüsðÛUø£ðwZ´µ}|= ÇªÉ¦Ü¢•¹†êÜ î²:¹º;ãšý•~Kä|b—þ¿ü+ømâÝVÊãÃÞP›KÔ,V—í öyCÚ‰å÷jàíM¤m ¦üeñ­¡¹ñgŠ4o [ÎÅb›YÔ!´IêÈÊ ät­=^Ó£i«i·t7–3¬ÐÈ:e]I} yÄGÅ?ü7àøü)á­[â'ƒ-ï'·ñ%¤ÓÜë赕]’hy‹Ï²V‘··–B¨xóÙkÁSÚü}ñÏŠüàWáWÂkÝÒÒ?êzwöX¿ÕVFi/"±ÿ– C²2J¦ãÎ>µ¢€>yýªþø»RñÃ?Š^ÓS_ñ_ÃÍFæãûæJÂê Ü1»|¢]Š¥7qzœã´>£iûQxÄÚ'ìÍâ;¿‰h³iöúçŽü3’i1íæ;™ 4ެîcHCeØM}ÛE|û5| ñÇÄÿxoÄõï>CàhÑž>k‹™ÚÊ9uÙ}k(ÂɲÊ “àƒq¾øÃá§í]ðÞÊÏÄþ1ðÿŒ¼!âYšÀJ×:¤ö“AwlÍo Dn$“Ëe‰X®0§­}çE|§û2~ÐK |-øQà Oá—Å;Y²Ñ´ êæïÁw±YÁ:Aï3 U‰X\àšú²Š(¢Š(¢Š(&ÛÃV¶¾&½×R[£ywo´‘½Ã´!P±c'üÇéÉ,嵨¢³§N“PV»oæÝÛù³TiÑMSŠI¶Ý»·vý[ (¢´6 (¢€ (¢€3ô9 ’ÊCmu5äbêà'$°q3‡A>U`Ê=”c=kB«Øý«Éo¶y>w›&ß#;|½íåç?ųnîÙÎ8ÅX Š( Š( ³à’¯Þ"ÝL÷BÖö¬O——k¨Æ71=#^œgB«§Ú¿´&ßäý‡ÊO+n|Ï3/¿wm¸òñŽs»=¨ÅQ@Q@Q@Uâ?ù:‡Ÿö&x—ÿK´*õZò¯ÿÉÓü<ÿ±3Ä¿ú]¡WªÐEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^Uâ?ù:‡Ÿö&x—ÿK´*õZò¯ÿÉÓü<ÿ±3Ä¿ú]¡Pª×äÝíÆšÞ¾œÉ«7í.||tè>%‹›ìEŸíá•¡»ìÂÜZþèÚýíÙO/=?Y+âfý‹þ%ÿ£ÿ… "ñf™m¯x‹]¼Ðß\¿¼šô#ìDz4iæªv…BÄ™«ë[J´×t«Ý7P·K» È^ÞâÞA•–7R¬§Ø‚Gã_1xàßÇï€:D~ ø{âOø«À6Lˤ7ò-KL€±+kpËp‰œ)%>røÌ~xoö0ý¡|#ðóĺÕþ‘¦ë:&§'…u÷Oo¥Þ§lëIu9‰ü·uP9?Ç“éß´]§ƒ¾5xo@Ð>ü7Ö!ø†šþw¦ø„xûDE\¤’ÜËuqm å«®Ðıa…$ oŠ¿aˆºç…¾?ÛÜø×Hñˆ~&7†®—R¿Y-#Ž{ £-ÂÒ7òá„H@2( F7ºhãŠþ ñ/ÃÿÚ›Ä5¿„SühðV«£YXXÉ¥­½Þ¡áï$?Vs‘æ ™·“ÏîAíÿc§øYª\|F×~]êZmž©ªÃ.­à»ëO°®|°ì%©E1@ ܲ’¿)H¼kðâ§…>5kß>ë¾¹OÚZÛk~ñ‰¹[o6ÙJEqo,š6Øv²lÁêI8Û½û>|ñÃÿ|@ñǵ]7Sñ׎nígÔWDâ°µ†Ú&Þ¼Â]ö©b]°X·AŒi¢Š(¢Š(¢Š(¢Š(¢Š(¢Š("ÛÅZm߈î´¥˜ê–±‰¦„ÛJª‘»_y]»[q s†1Ì&BkÕt .ßU—S‹M´R—™x(™÷,JÙ|då`€yÆ?q~¦<ÚóÕö^ï²¾Ê÷¶ýmnº…QT`QEQEgèqÁ”‚ÚÖk8ÍÕÁ1Îbæg.ã$ü¬Å˜{0Æ:V…SÒ™šÕËÞ¦ |ù‡›¨ <ÖÄ|q”!îJóš¹@Q@Q@gÁ_¼uµ™.¬î˜.D.ÔSœnR\ž:H½xÆ…S‰˜ê÷*oRDDEUÝÝ&d'®€3ÇîŽ:š¹EPEPEP•xþNŸáçý‰ž%ÿÒí ½V¼«Äòtÿ?ìLñ/þ—hUê´QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW!ñKâÏ…¾ x]¼CâýLézX”@²-¼“¼’f©³3À«¯¢€>mƒöÇþÕý’ô:OƒžöïZ½†ÃLð̺‰§–]KìQ©¸òˆRÖã•çïWuð«Çß|Qâ9íeÍz¿‚uÈ<û_x[Á¿ üwªø×ÂZž}{âm+PñÚäZCFcû%ÂO4’Ìn¶y\ñå—Ýž1ž+Ñ4ËOÅáõ‡PÕt»­p*î½¶Ó$†Øœ.â k‡` Ýæñ‘ÉÁ'óæm^OئöÉlmÿá›®|`d>0/ÿ ÓŽ°Ü}“Yo´þìKæoòðÞM~ªWϺ§í§áV×õ}3Â^ñÏĸ´yÚ×QÔü¡›Ë+y×ïÅç3¢ÈëÆD[ú×¥|t¹Õì¾ |A¸ðÿ˜uè|=¨I§ù?í"ÚCÜwß·åß²tãHý‰>Íð×JÒõ˱áû'K­@ØÛÍtÛ~ÛæN‘LQĦr~F˧Èõ?„?<)ñÓÁéâOj&þÀLö³Å4M Å¥Âq$Dà4r.FTŽ„A<‡ÀOÚ¿Á´wˆK,ØU!·*àôÜ9¯@¯•gù>ÏÚçþåý5É_UPEPEPEPEPEPEPEyW‡¾/ø—Yý¡¼OðöëáÖ«¦øcIÓ’öׯó~ŨJVܘ#›žAĬpÜuÛêµÙ‰ÂVÁ¸F²Kš*JÍ=$®¶nÎÝ«f“&2RØ(¢Šã((ª÷éu%¤‹e46÷G$¸„ʃ‘œ¨e'Œÿþ”lºþÐßçCö+O’|Ï3?{~ìmÇvç<îí@(¬øàÕE¥ª½å›], ÜH¶ŽHòr¨¾i(ØÇÌY‡åçF‹P/zVæØ#¨ Û±16ÞL‡ÌýàÎÎ8Éë@”¬¶®É4óçÌ|¨ÙHaæ¶$㌸ùÏp\çœÕÊÃÐEÄ–¶Í¦—°$÷+xó@ûä”Já–2_÷h’P•TÆãrH5Sit©yf·M)6ò5£”Ž<Œ+¯š ¶3óQÈùxÁТ«ìºþÐßçCö+O’|Ï3?{~ìmÇvç<îíUãƒU–ª÷–mt²ƒq"Ú8I#ÉÊ¢ù¤£c1f—œ *›E¨½+slÔ Pmؘ›o&Cæ~ðggdõ¡bÔÙ¹¶(ŠEÐì ­·ƒó?v3“ƒ¿Ž2:Ðʧ°ÕîXÙ$h`ˆ Ð˺SºLÆG\'gÞœt5j¦ÒéRòÍnšRmäkG)yW_4lgæ £‘òñƒ^ çÅ÷›u ñ‹7éí~ì™%Û*¾í¿6HÛŸÝ©Èà Š+>85Qij¯yf×K(7-£„’<œª/šJ61óaÁùyÀ‘¢Ô Þ•¹¶ê¨6ìLM·“!ó?x3ƒ³Ž2zÐÊ*šÅ¨²-slQ‹ -Ø[o3æ~ìg'du¨äƒU6—J—–ktÒ“o#Z9HãȺù »c?0e—Œ *¾Ë¯í þt?aò±äù'Ìó3÷·îÆÜq·nsÎîÕ^85Qij¯yf×K(7-£„’<œª/šJ61óaÁùyÀó¯ÿÉÓü<ÿ±3Ä¿ú]¡Wª×ÏúF›ã?ö§ðWü&^!ðþ½¿Áž"û'öƒ>™åbûCßæy··>fr˜ÆÍ»[;· ¿@PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPà é_ ØøoH²ðºÆÑ.‰ocvA‹2ˆB„ÁbIä’i¾øyá_‡v“ZøSÃ:?†mg2X4{­Fþó,j žzšèh ¼«Äòtÿ?ìLñ/þ—hUêµå^#ÿ“§øyÿbg‰ô»B U¯[öø~u'ûWÅ#ÁŸÚ¿Û'ÀCVÿ‰ ºó|ìù7lóyåoò÷8¯¢¨ ¾y›ö&ð¶›®jWÞñŸ>ØjSµÕæ‡á wìº|²±ËºÂñ¿”[¿”SÛô5óf‘û|-ð÷­ èÿ> ø+Zñ_Øÿµ!ðæ¡g ¼¿e€AË%«· å.ÝöøJ_øJÃCŸÄ:ÇŠ¥µó3«ëóG-ìû¤gýãFˆ§ní£ >U^§$èêqÀ÷ºIšÖk‰éŒ2D XÉ”|ieç<ºû¡@Q@Q@Vˆc‚]SK«Y¯­ZÖQ-­¸&I“a܈±rhBŠ( Š( Š( Š+?ÃÑÁ¦%­¬Ö6«kŠÖà$)°mG’ ’y¡EPEPEP{µy-öÏ'ÎódÛägo—½¼¼çø¶mÝÛ9Ç«Ÿ¡ÇvR kY¬ã7WÇ8!‹™œ»Œ“ò³aìÃéZQEQEUtûWö„ÛüŸ°ùIåmÏ™æe÷îí·^1ÎwgµX¬ø#€k÷޶³%ѵ€=ÓåÈåÚŠsÊK“ÇI¯ТŠ(¢Š(¢Š(ʼGÿ'OðóþÄÏÿév…^«^Uâ?ù:‡Ÿö&x—ÿK´*õZ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ʼGÿ'OðóþÄÏÿév…^«^Uâ?ù:‡Ÿö&x—ÿK´*õZ(¢€ (¢€ (¢€)ß3-Öžõ-Aœ†‰•I¹SþísÈ áøçžÄÕʧ|¬×Zy[$ºrZVeØyOûÅÏ$“„ãœH{W(¢Š(¢Š(ªzË2iÌ—©¦¸‚B·²*²Û§÷„7/^xãš¹Tõ•gÒ/•,“Rsl¤eU¸;OîÉnnœñÏ4rŠ( Š( Š( ©èÌϤX³Þ¦¤æË^ƪ«pvÞ¼Ýxãž*åSÑ•“H±W²M5ò•–Üí»x!zqÇPÊ(¢€ (¢€ (¢€)éLÍjåïSP>|ÃÍTkb>8Ê÷%yÍ\ªzR²Ú¸{$ÓÏŸ1ò£e!‡šØ“Ž2ãç=ÁsžsW(¢Š(¢Š(ªq3^åMêH‚ˆ² »¢;¤Ì„õÃðxýÑÇSW*œJÃW¹cd‘¡‚ /C.éNé3pœž?zqÐÐÊ(¢€ (¢€ (¢€<«Äòtÿ?ìLñ/þ—hUêµå^#ÿ“§øyÿbg‰ô»B¯U Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š+Å~1Ð| £K«ø“ZÓô ./¿{©\¥¼JpN798ãØÐÅãºgí]àÿÙòŒÓ]^iþ œIä›|ÝLËpÖè‰,ÒHŸ*ƒ’go8Ÿá_í+áÿ‰þ0¼ðŒº‰<âÛ{!©®‡âÍ8YÜÜY—Ùöˆ¶»« l)ù·)8 P­×•xþNŸáçý‰ž%ÿÒí ½V¼«Äòtÿ?ìLñ/þ—hTê´QEQEQEgêr@—ºHšêkyé„1ÄHYßÉ””|Whfç¢û¡Uî~ÕçZ}ŸÉò|ÓöŸ7;¼½˜þ-û:ñÝñV(¢Š(¢Š(¬ÿÉZ¦÷WSXÚ­¬¦[«rD¦Ã¹Ð€H`2FäV…WÔ~ÕýŸsö'íÞSyhÏ—æ`íߎvçÇ8  QEQEQEŸáé —@ÓÖêkëVµˆÅupI’dØ6»’,F ȚЪúÚ¿³í¾Ýäý»Ê_?ìùòüÌ Û3ÎÜççbŠ( Š( Š(  ýH$²Û]Myº¸IÉ,LáÐd•X2eÏZЪö?jò[ížOæÉ·ÈÎß/{yyÏñlÛ»¶sŽ1V(¢Š(¢Š(¬ø$€ë÷ˆ·S=е€½«寅åÚê1ÌCƒÏH×§Ъéö¯í ·ù?aò“ÊÛŸ3ÌËïÝÛn<¼cœîÏj±EPEPEP•xþNŸáçý‰ž%ÿÒí ½V¼«Äòtÿ?ìLñ/þ—hUê´QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEVG‰ü øÛOKhšv½b’ ’ÛS´Žæ5…p@`†zàŸZ×¢€?1¼‹ø'¿ì¡¨Ýát=;â>—u«K ýÜV£T»]òv$x³ž?:úwâ¦/¿oPiÀ=퇇|Cuª„d³u·ŽþŠf ÷Ízæ‡ðÀøBŸ m<5lþH$¶%ãÉuäiX•™ÏÎÅ-q‚01ÂïÙ÷áÿÁ›Ûûßøy4ÛûøÒ‹éîg»¹xÓîGæÎîád(ãŽz%xWÅ›ßX~Ò_ äð†£ëš‘ð—‰K}oW—M…bûf‡—GmpKn6ì‚N်וxþNŸáçý‰ž%ÿÒí €;­2ïÄrø}fÔ4­.×\*»¬­µ9&¶ ¸ ÚÝ€w`ù\àp2@Óßuý¡³É‡ì>V|ï8ùžf~î͸ێwnÎxÛÞ¬Q@ñϪ›KV{;5ºi@¸nܤqä呼 ]±”ªŽOÍÆL. ô-µ±DPmI¸`em¼‰—û±œ üsÒ®Q@Ö]@½kk`ޤÝpÄÄÛx/÷ƒ9;8ç¥G$ú¨´ºd³³k¥”‹xÚíÂIFÛÊ%ùB°à|ÜähQ@úž÷×4•›OûEªÊÏ ÔR1x'ò¥ºÀM…—qcó:½XŽ}TÚZ³ÙÙ­ÓJÄkvå#',åíŒ|¥Tr~n2d¾f[­<-êZƒ9 *“r<§ýÚçAÃñÎ#=‰«”M¥ÔÞ…¶¶(Š ©7 ­·‘ òÿv3‘¿Žp:P²êìƒ[[u&苆&&ÛÀŒy¼ÈÉÙÇ8=*åŸ$ú¨´ºd³³k¥”‹xÚíÂIFÛÊ%ùB°à|ÜäXßuý¡³É‡ì>V|ï8ùžf~î͸ێwnÎxÛÞŸsn·vÒÀåÕ%BŒb‘£`ÁÃ)O¸ ŽÕƒa.‡ð÷NÐ<=&¥äù¸³±[ÙËË;(Î2ÙAePUkž¥_e$çeíÛ[¤•¼ïß}-©ËV·±’u,¡o‰»jÚIZÝo½÷²¶¦œsê¦ÒÕžÎÍnšP.#[·)y9do(lcå*£“óq“OÄfâMÄÜi‰f,ä[A;™nÁ·Æ@@P“ò¥‰Îxд –¸Ó4]?NÆÒÚZÇ$¤¨ãØWOü+Í˸àS·þ‘Àìÿ…ê‹þ\Ó¿øê[ÿMóiþóàÛöŒðp{кµ±DPmIŽè[o"Aä~ìg#àt­­3âï‡5Km:æ=wBŽ •ÏŸ©y2BÀ`ŽDVa¸– Æ8®â°.~ø^öæ[‹ éÏ+™$–[™‰ÉbJä’yÍ>LÞ.þÒœ¿íÉGñç—ä½GìóØ;ûj3]½œáøûIßÒËÔv›â)5í.òëI}'Shç1Bmµ2Q´üò,gcí9ÚcŽyÈ—ÃÛâÓôÈmtÿ°é c•ÄŒ.a8bxÊœaq’\œŒc½r:ÿÀŸ ê½þ޳ø[Z1_é4;˜òÁ ç»Içæ9¥ ø£¢Ûý¢ÎûBñÆœÏÑHËö[«ˆ˜.BÄJ>ñ KqÏ<-G×ñ˜k¬^µüÔýõóŽ“OÉ)/3?í<~ë„m5'ξq|³OÉFkû×±èqϪ›KV{;5ºi@¸nܤqä呼 ]±”ªŽOÍÆL. ô-µ±DPmI¸`em¼‰—û±œ üsÒ¸ß |eÐüGxº]úÏáÏ Šú^ª†ÞÁ0œÉppÇ®Ð+¾¯S ŒÃãaí0óR^]f·OÉê{8,à ˜Óö¸JŠkgn³[§äÒe5—P/dÚØ#©7D\116ÞcËýàÎFNÎ9ÁéQÉ>ª-.™,ìÚée"Þ6»p’G‘†vò‰FÆ~P¬879Waè÷Ýhlòaû•Ÿ;Î>g™Ÿ»³n6ãÛ³ž6÷ªñϪ›KV{;5ºi@¸nܤqä呼 ]±”ªŽOÍÆN…‡¢›ˆ­u%µÓÒžv¶K‰Ý^yL²ÁC±L²_*Ààpµ ²êìƒ[[u&苆&&ÛÀŒy¼ÈÉÙÇ8=(Ò™šÕËÞ¦ |ù‡›¨ <ÖÄ|q”!îJóš¹@òOª‹K¦K;6ºYH·®Ü$‘äa¼¢Q±Ÿ”+ÍÎE÷_Ú<˜~ÃågÎó™ægîìÛ¸çvìç½êÅŸú©´µg³³[¦” ˆÖíÊGNYÊÛùJ¨äüÜdÈÒêïBÛ[EÔ›†VÛÈy»ÀÈßÇ8*åMeÔ Ù¶¶êMÑ LM·òÿx3‘“³ŽpzVZ=êêš¼±iLE E3Ý8·¸€<»,íuÌ…”+cz|Ǫ-.™,ìÚée"Þ6»p’G‘†vò‰FÆ~P¬8797Ýhlòaû•Ÿ;Î>g™Ÿ»³n6ãÛ³ž6÷«PÏúF¥ãCö§ðWü&^ðþƒ³Áž"û'ö½>§ææûCßæy¶VÞ^0˜ÆýÛ›;vß@W•xþNŸáçý‰ž%ÿÒí ½V€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ +ä½gá÷íÓx»Äº÷í#ÃÇ­ß›  i6öšoÚ\Z3\É´óïüÀœMrúañÖµ©Ziúíñá«ûû¹R {[ox~If‘ˆTDE–bH’M}¹EygìÿáÑüO¦üNñgü&÷ÐëMý‘® [¸°6¶ÄfqµœÜ¯Í– ЭzQEQEå^#ÿ“§øyÿbg‰ô»B¯U¯*ñü?ÃÏû¡«¦§ekkgÀ[ œÈÓE°Î §vQŒ(wÉÿ„ÿÃw:ÿöeÜ¿eÔmµ±Û ûv̜ŜÂÌ9ùd+‘¾£¤‰¿¬®Oâ'´¿iÖ·WvßÚ:›Ë·LÓâ]ÓÏ9‚GA`8 ŽK>N.RÂPö²ª”bï'%}/²µµ[GFôKVxxéˆöÓ®” ù¤æ¯u{Ùr¸Ù«Ú6MÝ%fÊß~!§XjÑ‹+­]¼Ò5Î%C¨|›Ô‚3ÁRѹãó­*Î:ž*ñ%üº4SL¶¶¸ ŸˆâI§È>c0üôR Rµ|ð5od—PñŽž‚D³h:he´´2¨ó\ó“)"ðí³ÞxFåüÝ[C‡­©ïqn:Þ^€ÊÓô]jÇÄZU¶¥¦Ü¥åÊoŠhú0þ`ƒAäAÁð8éV”°Ø˜òÖŽë£_Íñ|^]Þ]˜Ï9a1qPÄAjºItœX?¾/Ý–»Ý¢Š+Ø=âž”¬¶®É4óçÌ|¨ÙHaæ¶$㌸ùÏp\çœÕÊÏÐä‚K) µÔב‹«€dœ’ÁÄÎ@ùUƒ(öQŒõ­ (¢Š(¢Š*œJÃW¹cd‘¡‚ /C.éNé3pœž?zqÐÕÊÏ‚H¿x‹u3Ý X Ú±>\h^]®£ÜÄ8<ôzq (¢€ (¢€ (¢€<«Äòtÿ?ìLñ/þ—hUêµå^#ÿ“§øyÿbg‰ô»B¯U Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ˜?à Ï Z|'ðŽ¡â=.OiÖ1Óg>†žM}šŸcHÔíµÚP­ò±€)À5Äü>ñŸÁ‹¿øj/ö;ñ‡…õIu+dµÖ®¾ÛÙǧLeP—8‰cl9}Фö¯cý¢¼-âŒþ Ñ[á&µáñ7‡¼Oâê:ԲϔÖÂh¦Eò7bpìbdp@V”iþ‡ö´_èÿð’]| ¸´¿²íõavm·;É.û›7mÜ6îÆx ¢¨ªVÖŸªÏ•õµäÚ|ÿe¼ŽÞev¶›ËI<¹?#ì’7Úpvºž„UÚ(¢Š(¢Š+ʼGÿ'OðóþÄÏÿév…^«^Uâ?ù:‡Ÿö&x—ÿK´*õZ(¢€ (¢€ (¢€+Üý«Î´û?“äù§í>nwy{1ü[öuã»â¬V~§{¤™­f¸‘n˜Ã$@•ü™AwÁáv–^s˯±QEKZÖ¬|;¥\êZ•ÊYØÛ&ùf“¢æI8I “^sð·H›Å¾!Õ~ êöo·¯äè±]! od¨.ÁL€ó€?ˆ©Û'1xÊ/øY?ô¿ y~n‰ mÕ5]É”’b?s Ü„$g ®ãªW¬WÍAjcI „š÷ª%fý!w§Åw}ò×öÖ`êËø8i5üÕ´¤ü©ÝÅ+|i»û¨Àñ-ÍõÕ´VÚ¯§ØjBö(Ÿíiæä%’ ¡ÞbËc©\ý܇_ø§âGñ'ÄÍFÎ]^I´ Y>¥oi¥E3æî5,ïÊç™å ŽÌG è_ SQñu¿Šõ­2ËJÔ­îîf66;f†w,)ÙÊ µwcûÛ\ÙMÁáO‡W¯§éž½Ô¯µ›Y#¸G´cþŠeýïÎ:­?*úF¤¢ùdx™•tÝÜåÍð¯f’ÕÉûÑv¿*ÑŸ;›ÒÆæT=¶*ÔhûH·ÌêKš+à^É(»¹ËÞ‹µùVXåþ#ø‚ëÆØ/Ã-e/SJ·ŽkÑBF­ÐÉLƒyF¨$©Ú›FçÑÆ4¼I7„4o e<;xwNò-ÑÒëlW7-ldD‘[rÈ¿*|Ñ’ÌŒe(?Ÿã±ªÖ†2U”yã I^|–’𢔬¢—4“voK-Ÿå¹–+Z¼1ó®£í# J7©ìùg¨Ú 3´`£Í5&âÞœ©hý+ÇB×ÅŸ¼!g »Á¯iéöé;Ç jÈάˆ§lÏ¢–¸Ý´),¡š-+Ký3àGƒt“âiîµ=JW¸ó5¢’|Ë&ftçå È£]ì7>r¾WáoËñ3Ä®êðA7ˆ´/ôÍ3KÓ­=üaøA“vv2¬ƒï8ß1@NÝš_â"èZýæ¹­ùº  g¥<0rÙ?{pf½Ãþ›Oñoˆ5Ûá§Ís|é´öÖÆ9’ÝT|’1'qÝÔõ;A'?ñ±Ô|ð4[Oqua6¼ðˆô¸ o&Â=Šd„>¡lÁ÷–9ó&=ô?ÖÏÀ:}Ìš ÚµµÅ•ô2êÌðÄd+’&!‹™%²ÁvÈwIåÞÖ]˜S¥SÙf3|Ôâª$öÔ•’ÖMòûÞórÖöVgÐe9¥5½ŽkRNT¡©=£u5Ê–²o“Þ÷äå­í;zWÓþÕýŸmöï'íÞRùÿgÏ—æ`nÙžvç8Ï8¬ÏxŠO è/¨ÃdÚ”«=¼ iyšY’ ¨pFó¿åÞU3ïnuÆð÷Ž4-#Ã>ƒSšÛÃ2h©~tËéÙΉYôªŒcvK…lFäµ±úëÒ§.YÉ'¦únì¾÷¢?a”y)ª²i'%ª»“ÙZ÷»Ùi«Ñjv”U8õ{;‹ ï-îòÞ•­392H€&Iude*;”ŒgŠ‡Ãšõ¿Š4+ZÑ'ŽÚò%š4¸ˆÆàP˜È=A ‚kÚÃS¿¼Õíä­¯âŒeR«ì$í;7n¶M&íäÚF•xõì)ðGÇp^[/Ùü¯Ê¶óÛ‰Õb±½cÄ¡X ±•^pplð¨µì5›â=ÓÅ:ö“~›í/"hŸ¹èË@e8 ã‚í^neƒ–*š©EÚ¬àüú§ýÙ-%å®é6m—ÏJ50ï–½7Í yõ‹þì×»%Û]Ò4¨¯9ø'­]¶…wá}XmÖ¼5(°› @’|‰(¿)P@êH@ÇïW£WNvˆ+s-WTÖ?4ÓOÍyn:–ž* ÜËT÷‹ZJ/Î2N/Íì~Õä·Û<Ÿ;Í“o‘¾^öòóŸâÙ·wlçb¬V~‡ÙH-­f³ŒÝ\à†.frî2OÊÌY‡³ c¥hWqéQ@Q@WOµhM¿Éû”žVÜùžf_~îÛqåãçv{UŠÏ‚8¿xëk2]XÝ0>\ˆ]¨§8ܤ¹7èÞœxžÛOñLúˆ-SZÓìCH—$dIQ¶².òF…`|<ð‡Áx|qá«'öÃñ‡‰µ$Ôm¤´Ðîþ*Áw¡(•J[½¾s*ÈØCV W½}-ðSà'?go Ýxoáî…ÿþ‹uzú„Ößlžçtì‘ÆÏºgvX£/L“Ÿ@¢Š(¢Šåþ&|Mð×Áßj-ñv¥ý“áûÜ]‹yg*d•bŒâVv%äE©ëé\Â¯Ú—á·Æ¿Ï¡xCY¿Ô58mZñâºÐµ %+*“æ\A—_”óœ`eþÖ?|CñGÀžÐ|5¨hv€ñ>—¨:ø‚gH'ŠÚqpc €´ŒZ4ù\€~aÖ²t?‹_| ñÿÂÿ þ!·‡|AoâÝ:ö÷G×<9c=ƒC- Fš‹ygŸå) +"¸ä`¯9AW•xþNŸáçý‰ž%ÿÒí ½V¼+âωµ þÒ_ îôÏ ë1¸ x’&±Ñ%²ŽhÔÞhdÈMÝÄ ´Ëe†Œî´V&™¯ß_ø}uü5ªi×eT&æKSr¤…$Žv‹+’$ÇÊqž3§ö™?´>ÏöI¼Ÿ+Ìû^SËÝœlÆíû±ÏÝÆ;犱Egǩܽ¥¬ÇI¼I&”FöìðïrF÷"M¥xå,yuF¾™^õFŸrÂÝCFÁ¢ÅÉ+±üù>}£'®9  ”U5¾™žÉNŸr¢áKHŢű ²|ù$ž>MÃ#®9¨äÔîRÒêa¤Þ<ÊcKuxwιz&м“ó<:%ó2ÝiáoRÔÈh™T›‘å?î×<‚ŽqìM\¬»éæmgOtwº€1•µx„vÇcŒ¨-¼¹áx\bCópEI§rö–³&ñ$šQ۳þÉ܉6•à”±äqÔ ­©j6úFuw'•ikÏ4›KmE˜àdœzSúe{Õ}Ë u ‹$®vÇóäxùöŒž¸æ¼÷ã·‰ï4χkkcx·úÞË’4ŽFG“¡`å™<År:Ž àÇâ– WþÄ[õihºnôó<Ìϲì lcû”½ZZ.š·¢WÕè?àÐxkw‘¿öƽq.¡y4Ñ*4…¶…!_œŸ¼b85è×6ëwm,]RT(Æ)6Œ2Tû‚íXú:?‡¼5•¶—4zb%”»Àf¸¢Èð¸#Ÿ˜©àü£€u~Ó'ö‡ÙþÉ7“åyŸkÊy{³˜Ý¿v9û¸Ç|ñQ—aK õåŠOÍÛVý]Ûõ3ʰ+—ÑÁËW¤üݽæûÝݾ홚w…-ôŸÇáëK»Øm£´6‘Ý É¸@TÊç£ ä`ap+?LÑcðø´¹5ÿ³ýŽÔÀº¾ W;p†;v«0 „ô ¹5Y5¯i—ú…î•6ª—:„QÙiv‘ÅŤ UÈÞk#`å¸'®IE$EÅüJøssÿÍµŽ ìÖöÔz‡T¾’ý¦s•æß†V(YVÞĉXäùXšßTƒ¯‡Ã·*PjÚ¦£ud’º’|·ÑÝ$•®ìx˜¼BÀÓ–' „ntiµËªj<É%“Œ“årÑó$’µåcCPx¼k¦kñ•ý—«E+^Ãi§³‹{ÌÉ,‘®òbYü¶fRË»æ`QÕü¯Сk×PÉ¥[Mo αc{"·ò6Ù:3•Ë €/̽=œˆþ7é×~)Öa†Îãâ.¹°Ú[ʲ˜âW‰ãŽ9¦’2VHÊ®Ö(ä0bDªH’¾yâëâh{£ìÔãmQPM+ÊÎ]—6ªJ-]-ñÉò¬ûŠé<&[‡ŒèF¤}ë/eF0Œ’•ZÍ5MiÏ)5%®–’òOÅ]/ãìz‹~(Y‡Ú¦«oý«m Cm:ØimtL–壅¤YRÊê IÑ\±¯aýƒeÑü)û;|Hð'ˆ®¡ºHµÁqu{¥3Ü !Š>,#¡V¶2`ðv²6l>I§|ñU·µuÛ=/Lð§Ž~Ó©ë:šYYjPGp¢å¢k{9(ÄÊcIcòÌFyr˜¤;âFŸá¾&hÞø-áÛωbyàþÛ¾ñWÚÌv××pK'¢Ý–Ni0ÎÌÑaqå̯ýŽÎ¨qVS›!§J•èFXŠ“t!F*\³¬©¹:vœªG–N2Ÿ=9iÍÊÿ¢ðy&G‹ÃW£_;§V¬a%?cJU¤Õž“ŒýŒeyÊôçf—2—+¹ú1sâok~Ñ$× øið¿DñV•ðóÆv¾ñ_Ľ[ËÝ7ÅRê,aÓô˵Žó¶BʱZ·Q¾ù®¢yîÊ3_Hx‹á$ž Š +á~½âѬ½½ê^iÐ_ŤjÉ}5ªÛAr<©£’öá•b@ûçŠdܲ™aáÍòL³Ô?µ)ÔÄÖ×™Bq§©Þ´•Z²I«ÙÆ”›|ËFœ¾³&á<)ˇÇ:q‚‹r•9͵Ù)róµ$½øF›”ÚWærKÜtÛs@ðŸØ¼5cð+ã=‹„g´ÒÏ…²ë,Ûb® ®*¨ÚŠT*¨NOø(_ÃïêPZøû¿>Áu ’Z^øÇÃRÛÅtÈÈ8„FWfE'åÚV¨!²¶¹Û½ÏîÌyšåÕaŽK–`Ž¥i<’T0DX-yp\Abš§,WèªÊ2JÚ|Q’߯+M–3†3l>®iZ§´ Úp¨£'©;{ÍÙÆW½ÔÔeåµúÿ…´Ã–ñ¿‚|e¥kÓ¼/plaŸË½Ž$“Ëg’ÙöÍî*2Èܤd0'ЫÀ¾+~Çÿ ~-_iڜ޹ð—Šåµ%ñW…$‡NÔl®Œ‰3K,ˆH–VtÀvIJ’åJ“º¼¹¼Uñwö0Ô§ºñD¾)øÑð`‹¡öö¶Šç_ж4³,³:ÈMÅ»!ÃM+&ÝŸv©ßG£.ÍtÉëµW[R«e'å ‹Ü“¶ÊJ›né&ìŸÈ{IÃø‹Nëü¿áÏvøäx⟆<_ÿ¶–ýU˜yJ‡pÌ,Û°G+–|ð°ìÞ±^_¯ø‹FøáðnöÿÂóK®è®”Ú…†§§džHÛrðŸ0I¾=¬…2®ÃïMâøwVû5Íô÷hܺˆ¬ŠJK+Ê6oF8\œ…ì?-£Jy~iˆÁTN<þýžI>JŠÏ]Ô[Óy;Ÿ;K›b0±~åTªÇÉüòº„½fﺿG¥35«—½M@ùó65Py­ˆøã(>CÜ”9ç5r±ôˢáÔU´¬~Ï,¯G$%nòîw&aŸ†;ÂòýO&®-ôÌöJtû• ZF--ˆ\í“çÉ$ñònqÍ{§Õ—(¬ù5;”´º˜i7$2˜ÒÝ^ó®@Þ„É´/$üÅOŽ€ØûLŸÚgû$ÞO•æ}¯)åîÎ6cvýØçîãóÅX¢³ãÔî^ÒÖc¤Þ$“J#{vxwÀ¹#{‘&Ò¼ò–<Ž:#_L¯z£O¹an¡£`Ñbä•ÎØþ|‚>Ñ“×Ðʧ1ÕîTÞ¤ˆ ˆ‹ «º#ºLÈO\?gÝu4-ôÌöJtû• ZF--ˆ\í“çÉ$ñònqÍgFí/5ILJ.sÇr¤–þmàü/ï îÙOÎß(=@7(ªÿi“ûCìÿd›Éò¼Ïµå<½ÙÆÌnß»ýÜc¾xªñêw/ik1ÒoI¥½»<;à\‘½È“i^ùKG@Т©µôÊ÷ª4û–ê6 .I\íçÈ ñóí=qÍ }3=’>åE–‘‹E‹b;dùòI<|›†G\s@(¬ù5;”´º˜i7$2˜ÒÝ^ó®@Þ„É´/$üÅOŽ€ØûLŸÚgû$ÞO•æ}¯)åîÎ6cvýØçîãóÅy—ˆÿäéþØ™â_ý.ЫÕkçý#ÆZ¿‹jjøÄ û?ƒ ~È>ø‹¦êºªý¯Ä—+¦‰5’ ¥”ë¾ÝüÕÜO”lûÒ¡xSBñÝ׎<(-?bï|?†=bÒkÏÝjZ=ÛX[$¡¥’í‚ÉçË`N×ÚH W¨~Û¾Ö¼Að‡OÔ´ wÂ^Ô<5­ÚëÉâÍ4VÚa…d 4f> »Ý,ŠÈÊî¥I+^/û>~Ö?þ2üCÒ<=añ3à7ˆâŽæ6Ôlô»}b J{E`n ²ÌUAbAÁ# ºè¢Š(¢Šâ>.üð÷Æ¿ A¢ø…nâ—‘j6†›rÖ×–qg˸‚UårÃ<Œ1k›øiû6h?+´3sŽQ}Ъ÷?jó­>Ïäù>iûO›Þ^ÆÆÌýxÆîø«Wš|QYµoü8ÐÕÒ%Ô¤ÔžB…›uªU† Àúp{`ú]yÏŽ?ä°ü3ÿ¸Ÿþ“­xYÒæÂ(½œé'èêÁ5óLù®!\Ø´ªQ‹ô•ji¯šmQ\Û­Ý´°9uIP£¤hØ0pÊASî#µKE{&¬Ï¤iIYìpÞ%¿? >Åiu«Oh‘YXÃ7™;I#0DÞTŒžÊ:"íÊŠòßø+Úk]Þø¹›CuPGËf92Å$Ó,Q‹^êµîï¾ÖÑ4Ÿ*OFϊ͸}cTeG–šŠ„%ɯÌÛø¶åÑ8§È“ѳÏ<;¿ ~ÛÏ…œÚV Í<šô‰ 2ù¦9.TÆædbŠ[i™@_3‚»‹S»ð†¡­x»^°ð}¦‡rº€¼x!š+9-öAö-‹`°UP¹Üê†6óQƒz4H¿t .àÕot; í.-¿²ä[yÖU2‘Ë! G0°ç Æ\Ž<[i§üsø‹¤®“uý£àÚfÿkÞÁ”Z¥üQ6ÑóÌ«"*ˆ†ò2ˆÈ®º>2å§NŒ¡O %¤¢§¦ö¥¿%¶õWLñp9% Ç“‰öŸÙ8j*R”eó¤­¬ý¥Yû:t¹œm&äôM¬˜¼K7Å-v;‹ÝûDøsrés{ Á©y'Z)#4>g–€GÅBã%Œ{C'•ÐøçWµðgö Ž£§ÿeÉ©HÖºfg“’Ç9ŽHL,žMûòA+6æywÕkú‡‰ü ¥iÚf‰>¡®µåýÁºO>æâòà¤lÄ!Ú‡åò÷äü€“l¿|Fø¡uàŸx–mJ-. ¶…à²o³ÛOr—!¢hDFFfY£• ]W,‹µCüF ‰â } § ¹ý´£(«{ó¶K»9.k]+¹$|kÍÿÖêÂV§åTT<-û7Îæ|ñ”«MNQöµz_“ÙÇ‘Gø‰ñÄÚ×í ãÂZ޾—ªXYéÓIÍ$ZtÅ-áìã%;–š9c€͘ª<Åö‡~øvçE·¸º¾ð·‰tf·é:½„¦)¿Ö¼·æ4˜·ï-ŽÀ¨Ä Ñ,é%¿ž|;ðF‡®ü,oxr)üOñSÓ丹}JææîëRÔeû@fòÔ¦ïÞîŒ-æ7$J¥Åye‡Œ—ᮃ¬ÛÉ.­q,zl–º\é-©D¸;ù©+G(ÿFŒ*•–6ó ðcLÿGñLfYd!ìð’§…tœ# µëR¤ã*µi)sIsFJ É(&ÓŠ•Is@øm”eùžË1SÃbp´ý^|<]ÆO’JiÉ'FQjóK{[.KJ~áûhhÞ$øÏáÈ5-[Ŷµ÷‚Ì7sæe¶bciA²ÑW“Ȉ)âG1ýš1p¥~Ö¾¹ñ²ØøO@ñ ,ôø·¬e-irÖ¿h"E•ÒæHÚ&žì˜Š6ûCDÞß6~Ð_¡ñ¿Ž|?¨h°E£Ë¡XÅjÆ"Š— +ÌÒo?4ŽB¾cäFžfi<ÒûÄO®x†}[Vµ¶¹{‰i¡´‚;8Ù˜’v¤*ªƒ-@¯èÞð²¿pf ŽwÍSÙÆ¥JVrZr©.iSåªÒšŸ*iÔ©¦Úk—S¢Ë2¬Éá%MrFiMJUeMÉIÞ§74ªÁÁ¿w‘M­yw³ýlý’.øá½GFÔ Ôl¤óñ,¤ÎçkªÀ•`Ï Wæ'í‘âÏþÑ¿´ßŠu¯ xvƒá„7]ýËF—öK…Íäææç͈BŠê’b 7ØPy…¶×¹ÿÁ>~-KðŸÆ«àÏϟᯉAâ õ­ã´µþØx¢VqˆàHÕœ¸(¢Š(¢Š+> :ýâ-ÔÏt-`/jÄùq¡yvºŒcsàóÒ5éÆt*º}«ûBmþOØ|¤ò¶çÌó2û÷vÛ/ç;³Ú€,QEQEQEå^#ÿ“§øyÿbg‰ô»B¯U¯*ñü?ÃÏû`’ßò31d Ü1ˆrò½kÅ¿í;ñ á}®ƒðGÆ>ÿ„[ÄVºÝ÷Š|g¤Å¥‹;X7-­°ìò™²#*¿.'¦W°øðÓã‡uâ?MûV'‚<"—]Çïƒt¦ƒM¶g%"iå ¸E*›Û–ÆO&¼{àŽ¯ûKüVø§ j^ø¿¨ø—àõ•ìSj~!ñƒtý-f‘LØF±´Ò+ eó–IRHûöŠ( Š( Š( ¼«Äòtÿ?ìLñ/þ—hUêµå^#ÿ“§øyÿbg‰ô»B U¢Š(¢Š(¢Š(?S޽ÒLÖ³\H·La’ JÀþL »àð»K/9åר §|Ì·Zx[Ôµr&U&äyOûµÏ ƒ‡ãœF{W(¯9ñÇü–†÷ÿÒu¯F¯0øèŸÙ~ñZE9mU†[‰mäÚëjçlª`yò×ýjðsÇÉ•^”&ý!8Éþ Ÿ3ÄmÃ.•n”åNoü4êBrÿÉbÿ]O¢Š+Þ>˜+?Ä1Á.©¥Õ¬×Ö­k(–ÖÜ$ɰîD‚XŒ‚95ç_üCñgFñ¿Ã«_‡¾Òµß _j&?^êªK§Úy°$ Ï-±® '(¿/fôe™4‹æKÔÓ\A![ÙYmÎÓû‚¯Tý¬äÔþëVð„]]éÞ'ñU¼^ÒâÓíÖÝb‘¤Š5U˜4h7FAm푳÷o„3jÿ bðWƒ¾hÚF¥áz-—ZMäßlq$Îv3FÒ“„#É,ñ° ±Ôß<wñ‹ö¬ðw…F§‹†|77‰m®ÒØË3O%ÒÁŒùŠiŽ'V‚§®A_¦4ëÓlã·C»nYä(ªdrK;°Ps1,pI'ù¼2šµqXˆÐ“§+©+^ús%wx÷nËìÚÊ-=qùm\¯†ÊðV…:®XªŽ×R©RôãŽÿ»§Q4’R«hí8¿‘¿h]sÄb×t¿ ø’I<6²ÝZ]iw%²GåC5½¹ë#J [ ü€‘#¼Iqð_Æ9ìüCñ;DÐî – Úí;û¿¶óÖØ:ÅHé"QûÂCBÌÞsÏûå›yý6ø––^ðþ¹a®|? á +£ªÚ]h÷ÑIJɺ5 b¤3™Y6._$(åׯŸ4xÏã¯Äïê–Ëêrø_Vµð·Û.¤›R´™fjXHÊ—1ÊûT­# E–ºxj–'ŽÌsh§*˜l<çjžìçReζ§Ó©NÏYF-%câøoŠË±pX¼$ªa£>jžÍUu,ã)Æ1«îË–Î->W†*îþw¯øW^øc Ílu] Á*År,ôB²ÚíG#6øTBãtæ&º|ŒìæO˜|GâÙx¿Å¿Û‚æÏ]ÔÚ{}Y5»6ñ\Ê$tc*#—z.6·,¤…fèOŒ–úÝ•¶¥¢¼vúuý½ÚObò¤-)‚]ÎG!¥!£°wç.FùK¿ÍÞ0“W»ñ§&½w6§ye"é²Ü»°9‰ 1(¡‚ªÂ)Q…@¸^1ýôuÃáñUsLn-Ò“¬’qmº©Þ-;I8J3”’改H¥Ê“gî<[‰o-ÀסN0©ZN²• q…'e .jrsr§ eÒÕ$ÓV²Æ¹}ÐÚ#ÉÛñþ·çc»§¾Þÿv›,p¤4s%`L‰³>psÎG=8È«ú‰Ô`µóIóm¡[uàa” öÆQŒàœÕþíÀ¼©GÚ§NQœÛŠ|ÉÝÊÞô•Ü_2šååi¥p?ÆNŒjKÙ?i¤ÚåjÊ7Ò.É«8ëÌšnZ¶¤ìþ.X|Iø)á;_ƒ¬üHÒo•¬ÌÑÛ[D-m j¢)wÍ=Ëy¤™G“†$:ãÇ讬FŽ&­*õ½M¶šÑê¬Õ÷³Ñµ{;+Ýhy±©(ÅÅ=õýz…wŠõ#I·×´=ZëDñ‡ ŠKLžK[˜àt1ádB;™x#åÝêsÈiÖ‘^Ü­ c¥–×’TñQtöR’ýÔ».Zœ®ïe}VëôÓö›CýŸ<-£ø«â7Œo£ñoÇ+¸Ž™¦jZ]ÓO,ðÝMÈ×~ÿ?íÊ$ "@rÀ–¿híz×Ä?²Ïü{ ßÝXk~ø‰kâ-1Äiû›Âö¢!*:²¸_ÀÈÜ$€Ê|_Ä?µ‹ü]ø¥áx Eð׆|àé-W×> ÑþÓ®%½¼p¤öÐÜ9¹XdýÛH²©‰ñmóCà7«üðoÄöwý©-ðÄÚ·†$k¸ž+‹fÓîÀ™aG&&h>Æz«°T ’§ÊÙžu¸¿ Ÿc$£R0…gM¸®hÖ­ Ti¤¡k}^5—4¤ÜÕ) ]NyÔ0V·°„ܼ¥'ʯóŒûkklϽ|¨iz¾¡¢ú]ä’ÜÁ:8t¸W•ŸÎ!£“"08*êGVÕyì‰{¡û.ü+–R ]ÖQ‹r¥Q’%F„í$nˆ©‰»îŒç"½v¿$Çaþ©Š«†þIJ:ï£hûˆ¾h§Ü(¢Šâ((¢Š+>àýã­¬Étm`tÀùr yv¢œãr’äñÒEëÆ4*œLÇW¹Sz’ ‚",‚®èŽé3!=püž?tqÔÐÊ(¢€ (¢€ (¢€<«Äòtÿ?ìLñ/þ—hUêµå^#ÿ“§øyÿbg‰ô»B¯U Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( …¾'þË_´WÄšŸ‹u=ká¼5i,¾ðߌ£%–™öò]­ Ç$û †y<Îs‚0+×¼)oûXÅâM|Cqð_þµ»„j)¤ÛjËuö]ãÍo}‚M›¶îsŒñ_EÑ@Q@Q@Q@yWˆÿäéþØ™â_ý.ЫÕkʼGÿ'OðóþÄÏÿév…@«EPEPEP;åfºÓÊÙ%Ð’Ò³(6ÃÊÞ.y$œ'âCعYúœ%î’&ºšÞFºa qwòe%•Ú¹Ç(¾ÀèPXž4ðµ¿|-©h—M²;ÈŠ 0O–à†GÀ#;X+c<ãƒ[tVUiB½9Rª¯&šîžW¡OJt+Fð’i®é«5óG ð_Ä÷>'ð “j çV°wÓï–Uu‘eŒã¿’å6>¬zrs^Oe/ü+OŒ“ØI'— ø¿uÕ¾÷ùb¿_õŠ7?òvòÏŽ½b¼|š´å†ú½gz”Ÿ$¼í´¿íèÚ_3ÁÈ+Ôž긇z´³—vãnYÛñå•üúlOYV}"ùRÉ5'0HÊFU[ƒ´þì–àéÏóW+?Ä2A©½ÕÔÖ6«k)–êÜ‘$)°ît  ‘€yîŸJx‡Â=>ÖOÚÓãåóÛB×°Ç¡CËF ‰Ù’è­Ô+ã$ EÏA^ÿ^ðPµö´øùb÷0­ìÑèSElÒ#Æ–d;ªõ*¦HÁ#€]sÔW´x›ÅZo„,#¼Õ%šy$«Cm,äÈA(˜Xîr6(Æ]ÙrîŠÞv Æ4¤ÛûSÿÒä}Ó«WFœbÛt0ÖZ¿ù‡§·Îûyž?ñóÀš†³áŸêž$ÕnµmÜÒü=¤$Ví$’ùqF¥Wå—nÉ·~íœB4¾x/OÔ¾+øÛ[ñ¦®ºgŠ#:f­emw4W_mŽêݯGù¾`òÄ21”у²£þ¹ßxž÷Eðeö¡âËg‹£jaÒ.ZI RN"üŽ\‡$y‘Î!‘–!ù7ñHð6•ñjÎçÄ(Öõ #\ðUÝ÷‡î ˆ$VÚŒ—7Y¸mãÊÉ)'’X-Ä®…†É^UUVg‡Á9F¦+ S^f¦œ'Nµ­/y®Zr*zAKK^þ? e®® ÃípþÞ´$ñRœá7S‚qž‰EÔVMíîG–í”~- 5Ÿê:µºÂm p¯—å½ÏÙÖ5åq# ExJ©Ae MPÇ$QšüC¨kz”’j6ú…æI®‹²ÀªUaÀÃ(8P1_QøXÓ~]êx“¶~0ð¶¤Û¹¡»n#ŠI|·´2›$-œÊΊ² ‡Dþ-«xš oLÖlaÓ§¹ŠÖH’{(Ù•fub¡Æ ðÍÿ8[ÂÜò¶G˜ÔÅCLe:*r¿,¨§V)4Ü£ ÎRœ¤£¢Rj.MÿWqÎSý±†Xâ½±EJÊñ¨½Œ\¡4½¥Nh(ÎN1…Úåisò³Ë5[´½½y"b…UcV5BQ*– Æâ=Ø“ÔÕJ¹q=æ§Ë y¢´‰!Þ©òÆׯZ§_éÞ\½ž4%e*iE¥.kY+]µw7t·í«þ ÆFÕÎ’jÕ{ª_¤Si$ÓJÍ­:l¤‹kâ6Ø›˜~õ·|ƒœôíÎOñǼtçs#@|ªAŽßN½éµÙ´Ü¤õvº½Ò~_ÕºÙ6ïÏ9&”VÊúÚͯ?ëÊí%b»_„ÿ üGñ_½ÿ„wNþÑþÁ²}wQýüqyP:y²üì»¶ï_•rÇ<\U}QðÏÁžŸà´|`ñ&¡á;û$¹ÔþønËL\j3KK%ÝÑ[6ymæd´Ž)ÞP‚eV Æ™ƒË²,MHîá5³“·+»Qœ­¼µŠŒo&ýÛ?k ¦êæ¸X¯ùùý)õû:þË6÷­ðÿ[ñFˆúOŒonç]-4ë«aÖ‡.ëŸí€¥˜Ü‘s¯^×%N4¢“t©Qw§)9¾hS”¹êÉÅi ½ß4N'Jus<Ç0«½¥Irßþ}ÆRQùÊòšÿë©ôÇìEáh¼û'|0°†9âI´tÔ ÜJ²1k–k– ª€™‰UÆUHRIŸp®OáG„ô¿|;м/¢ßÞêZ^‡ö\:‹‡œ¬ bÚÄ*ƒ´¡^ (Ç®²¿=Ìñ_^ÇWÅ^þÒr•ÞïšMßñ>ŽåŠ`¢Š+Í,(¢Š*œJÃW¹cd‘¡‚ /C.éNé3pœž?zqÐÕÊÏ‚H¿x‹u3Ý X Ú±>\h^]®£ÜÄ8<ôzq (¢€ (¢€ (¢€<«Äòtÿ?ìLñ/þ—hUêµå^#ÿ“§øyÿbg‰ô»B¯U Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( œnmwT·øyà iz¥Þо:ñ¶‘áKÛë SÅiq#´ár¥’"¹˜ŽõÈi>Ñ¿f?Ûᯆ¼ú/„|}¡êÑj\Ë5¨º²X¦ŽéUÙ¶ÈVFBÃï¹'5í_´‡Á‰þ7ü;‹JÓuDÐüI¤êvšî‡ªK•-oíeD΀Ê~e>É"¹Oüñÿˆ>8iÿ¾)ßxp^è:DÚN‡£x\ÜIo Nên.¤’eV.ÊŠà/rFh߫¾,üBð¯Ã_ÚKá¾§âÿhþÓeð—‰-£¼Öïâ³…å7šÃÈÊ G;sœ)={­yWˆÿäéþØ™â_ý.ШºÓÛö9­a"GûÞ~Ñä°ó7~èÇæþê¾ý ü¯üKøAíý‡‡t¯Ù_ZßÛK£Ã¦Ch#y>Íi¼P«öd‡ ï¤Pbl¼Á'wég¯üK§éIáku@ÈÁâ”GåHw ÓEó …Îá ‰]§‹Ë~%xáÃ/†iþ1²þÕÐ5+˜ìËÜKkg6ò²D²«@UK+•[daPb+h‡²–'—ãif$¹©YÚKÜoû˪{Ivºêtd8Ü$0òÁ:7öóÓ‘Þ²Ž‹•;Å&¾(ÞÜÒ³MrÙþQøsÄ×Þ2ð¬5•„Ò}ŽæêúXe’X˜B†o—%UR8w³*© fBDhˤñvŸ¯jzú߉´ý3R¹3[ÛÛ³¼vi½œF»ÙØ(ùTd±ÀäžµìÞ;Ô­þx÷ļðûKÖþj>±j¶wÒéV×-Ë›ÎIZ]¦FW‘•¾7Ê…Š$^/y§\I¥«kÖZ­þ™a º´ÇmÜñ3E˜RDÀ*ϰ]-ܧæ_ܼ?áL¢¤ëâðòOön‹„ÿFt§(ÅJîGzRÖŒTÚ’“GÚñæ1…:U)8VÂóûe8/eYV„’sq¨¬çN.<¶÷j¿fœyS;ý +o ϧÚAYjEæHS*ªœŒ|Ä1ù±¸d€@fÉ|S¡^¾´ cHÂÊ«'ÊB:«.9<8Ǩç¥zÇÁ»/‰´Ûÿx/G·Ô‹*Úê wg Á¶ù%¹ŒùnIÆËI¤f …X™_åb­ÌÿÂm¨øÿâv‰#øzýjY¬ìa·håšg™R8U°È¾\%J¨ R£Öà.iÃÓ¾|4ñM¦é¾9ƒÄ¿fƒEñŽš×0Á¦ËÞdáRâÖ9¤PÑÿü®Fý¿/Ñ~>°Ñ>4üýxµ({#j’3W‹±§Ó÷•j$­})FsvI#õ—MþÍÒ×B´–žÖÕ<›/7t‹á°Ib£n=ûæ¾Kð_‹­i_Û0øÞËW„ü5ø_š&…  A¬kW±¹1HÐ*¬YB‹!æ;y”˜çç¯~Ô>>ýºî<  |"¹ñÿA¨ßG¨i:F¯p¶K¦˜íˆÔ//#T}豈ä'-‚ãI~¼ý€|oàŸþÍú6Ÿà]VÛEðÔÍ£M&±Ã-ÍØHî..,óYà¾Ýçib ½J¼7ˆá ¦¶+ö™/fà­û˜MÊ.M«¦êF.ììã)½âM9¤£Nš´Þvµ’ôÿ#Þ¬õ˜‘/ÒúúÁn,YÞåa˜bÞÌÑ2r¤Æ’p2Ž*Âë:{½’-õ³=ò—µQ2æáBî&>~`#<ÔzpGe ¶µšÎ3upLs‚¹™Ë¸É?+1fÌ1Ž•¡_’‘Ÿ'ˆt¨­.®ŸS³K[IL4裶p­’<бý£ký¡ö´Ãöï+Ïû7˜<Ï/8ß·®Üñž™«P|~!Ò¥´µºMNÍínå[̳¡I¤$€ˆÙÃ6AðjFÖtô{Ôkëe{t¦eͺ•Ü œü €NN8«”P5Öt÷{$[ëf{å/j¢eÍÂ…ÜL|üÀFx9ªðÚÅ.¡u6§¦¦‘i²›ÏÃp„‰#µzÄë’sÚ¶+>àýã­¬Étm`tÀùr yv¢œãr’äñÒEëÆ,hÚÿh}‡í0ý»ÊóþÍæ3ËÎ7íë·Ãö˜~Ýåyÿfó™åçöõÛž3Ó5bŠùÿHø±àе?‚¿á ñ—‡ü[öx‹íØZ¤¿gß}¡ìó<§m»¶>3Œílt5ôyWˆÿäéþØ™â_ý.ЫÕh¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯*ñü?ÃÏûY_uðÊí»=O”«€Äåµ^'*JQ“nt›²mý¨;5_V¾]·ÊýãÑkæ/?eߎZŸÄa§Lÿ ¼cxŠKÑŽ—¨+•ŽíãX÷yM¹·ijÍ!9o)Ñeñ—þyŸð”éð”è‘îoí­0³ÆƒÌlËp«’6ªŽ¬Æ»-#žø‘¦Ïgga­ZÝA"Oa.žv8’¶àî\ñG‡Ç5IIÓ­Td­$öÛi'³qmk½ÏªáÎ-ÁQÄÏ ˆ‹^Ò<µ(ÏÜ›‹iÞ;¦ã$¥Çž*I^ú§Â~к–®|-wµšmRþêÊæûÃÑé¶&ý5+Ÿ²È°Æ»c:¸›yE#̉fß¾p§Í<;ñÄ~ðgƒ|/ñ7ÂÚŽµªxÏVžÖîØ\\yzl1jvQÇpÏ$¾m»$«ónÙ8dY¦âIœÔþx—öjÕìu_ iÓ|Føeë—ðsØ­Ö¥¢Ç,°KæXÊÙ’EYáI<¼€ £[téé ?iüfÖím¼!o6£§ùq5ý̱Íšl¯î!™<¢»”ºÈc$J «Vâ¹½¥fªË’mY-ÓÚíw[¯$ÝÒg줰yle‚¥õ¬,dç*‰¸JIF¶´ä›ŒšÕNQŠ„¥|Iã¯Ù·Æ^ðö¿q-†k¥Z\M§Ï=΄÷Àéò$PùÁ—Ky+i3IrJ±Á•~Яsã2ü"ñþ…ã¿x+Â2G­é5ºjcÃ~,ä¶¶·†qt„BÚ(àòÖæfigŽa$àoû@ŽOÐ|RhµßÇW ¦^i—‘ÜO§Z´ ÍØ®¡I7jL›ÓyÛ»ìÌñdû&éoað‡‚›ÅVãß hZ-!¸·ÒÒ}>+hRÞÐY$Aâçªe$‰Sµ#Th…ì@}¿¯'Íq™wO.zriÔ§+ÚI)kdÓRW´e§{Ij}&e›Ë1ÂSžeBÑ&¡Q8¥f¹[n2S‹pwM8µ$ÒÑþÊß<)ªYxŠmoR‘¼}ª_ÛʶÓ<Òj7R­í¨1+.%Ì<ÎZ!q(0­ÂG¶qyÝïÂ_ ø—àÅËMKÀ¾·ñåæ³¤@Ñê:¯Øíãqsm¼6cÊiL¶êϺcä—tŽáncgÆïƒÞñEõ¤? ïí¼I4Žú¶¯-ô$·¨T›†¹’þfŒnŽú7O2HÂ}¢ißN‘#»7Àká–“à£ðïãÇŒôÝqí`žëOºjð5ìpà Z‹(qшo’Uòâ*l@ý…Âó„ªRÇTÀ­/ÂS…Ü›IN<ÓšŒ¹låEµ¤“›¹òüYÆË#ÁËÆ3…w(&ì¦Òå§Íì¬ùlí8¸O–WℬüþÏ>?—ãž–÷^:´ñ_Šõ=ÿì÷Ú®·§O~÷âÊím­Ò)¾h¢Œ\m ’cb©¯ì_°×‚|mð åŒ1·ŽxÃ\ñ†¹k«x§öj°ƒÀ t C¡ÞøÛ_Òô½ ã_”ݵ«Ëo©Ìˆì\,LXÉW‡’˜Õþ¢øÿûø{ák5ÿˆz4ž?ø…-ÕÅÆ¡©øšàÞE,ŽY!.b–22êó)—ÞÂ6Äq÷¿bŸ†ÿ´Å'Æþ6MWRŸNÓ†˜4ˆo<‹)â 3©“b‰·ŽVU*ätàßõ[„k)PR©îÙ¹RN hÜ.{ÎRkZ“œlìù4Óì*Ò¡—et¸{*¥T(É·Ë+º“ø]G+-,½ÕgdÛr““gÊÚ6¤|#O„_~øJ:ïÆ_ ÛˆwßMw(±kb²]ÙÜͨ`ª:ùbE&4Â0(î¿‚_4o€ß toø~æúóHÒ¼ï"mJDyÛÍšI›s""ŸšF 8¯ZñÙöð×ì·qªj·Z”5ñ=ÔÈÖº½Î•»iÑ,n…mòÒ:3‰dÁÀeØ»FÒ[ê ëã öŽ>·Õ05åV’|Ò©%$êÔ÷­+I¶”!%N ꢺèyøzN šJÏ·eÿrž”ÌÖ®^õ5çÌ<ØÕ@Qæ¶#㌠ùrPçœÕʧ¥+-«‡²M<ùó*6Ry­‰8ã.>sÜ9ç5r¿8;Š( Š( ©ÄÌu{•7©"""È*îˆî“2×Àã÷GM\ªq+ ^å’F†€½ »¥;¤ÌduÂpFxýéÇC@(¢Š(¢Š(¢Šò¯ÿÉÓü<ÿ±3Ä¿ú]¡Wª×•xþNŸáçý‰ž%ÿÒí ½V€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ò¯ÿÉÓü<ÿ±3Ä¿ú]¡Wª×•xþNŸáçý‰ž%ÿÒí €=VŠ( Š( Š(  ýNH÷I]Mo#]0†8‰ ;ù2’Êí Üã”_`t*½ÏÚ¼ëO³ù>Oš~Óæçw—±±³Å¿g^1»¾*ÅQEQEŸâ ‹@ÔÞêêkUµ”ËunH’Øw: HÀ<ŠÐªúÚ¿³î~Ãäý»Êo#íòüÌ»ñÎÜã8çb¸ÿü ðoŠn~Ѩè¯>÷‘¥ƒt #1Ë3˜Ê—$Œå³Ôúšì(®\F‹‡³ÄSSi$×ÜÎ,~Éþ"¸ñ xËKÕRÛÄ®æ=KÂÑ6›©_I1 C¬1ùa‹É 3_–F2È~O°¨¯¯àgZ\Ðÿ ¤’ôùWÉ\Ï,Á,–ª«•V«‡èÕ:“ŒZjÎ.p³V_EØùSH¶ý¥¼á-1#‹Ã4Öx$u5–ÏUŽ1´m ŸÉ£¢’dÝ6æËsžlŸ~)üÒ5 ºï…Ì «ÑôË-FÎæXíŸxšá0°…Ž×vÕßåD¤$qÃh>¿øñ"?‡vR%´:õ܆8¬ZgIq´:„ŽF*%xàd™•cLñC/M¨h^¯soq}¦Ú^Ïo&[ˆF‹G(ÚH$~ò_â‰UM|¢v5楗Å%øÆÏñ?C¯‹Âc)F¦qR§WG:u*МùîÕ”éÞò|ÍRîÒµ•¾×þ"é:nœ_ømñ^÷Ä:´“ÛÄÚ´g\2`¸„•bÓ1K4(Ë @Øý÷–ú†> øÏkk{'‚¾ÛióÜ'Ú¢ÕŸö¯ìûo·y?nò—Ïû>|¿3vÌó·9ÆyÅc‡áÊ*ûTìÓºi%-­¬Ûëÿ“n•EVœj$ÕÒz«={§ª}ÓØ(¢ŠÐÐÏÐä‚K) µÔב‹«€dœ’ÁÄÎ@ùUƒ(öQŒõ­ ¯cö¯%¾ÙäùÞl›|Œíò÷·—œÿÍ»»g8ãb€ (¢€ (¢€ Ï‚H¿x‹u3Ý X Ú±>\h^]®£ÜÄ8<ôzq ®ŸjþЛ“ö)<­¹ó<̾ýݶãËÆ9Îìö  QEQEQEyWˆÿäéþØ™â_ý.ЫÕkʼGÿ'OðóþÄÏÿév…^«@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@㟶7ŽnþþË_üC§ÞM§j6ÚÄv—–Òå‚yWÊŽDpAVW‘H#@ÅxïìýoðãOø•á{x¾0üZÕ)þÑ?þ\x¯áå¿Ã?ø'\OÜÞÏ®[ê7×Ä齸ƒîÄZL»HT£åÈÁúžŠ+¾,ü=ð¯Ä¯ÚKá¾™âÿ èþ*Óbð—‰.c³Öì"¼…%š‰H¬w±œ1Í{­yWˆÿäéþØ™â_ý.ШºÓ<áÍÃë¡iú—a¡ªª®™mgvÀ(P Dª*ÇG ­?ìë_í·}š·y^GÚ|±æyyÎÍÝvçœtÍX¢€3ãðö•¥­ªi–iki(žÞC $‡EƲIÈç“R6§»Þ»XÛ3ß(K¦0®n.Ð$ãæ0sÁÅ\¢€)®§£Ù:ØÛ+Ø©KV®mÔ®Ò#ãå01ÀÅG'‡´©m.­_L³{[¹L÷´Ri »®0ÍO< Т€2ï´ÛvÖtûõÒ-®¯Zý•¶Ñls•b7[ ´ùhO@jHü=¥EikjšešZÚJ'·…`@È !Ñq…l’r9äÑ©É^é"k©­äk¦Ç!g&RQð9]¡›œr‹ì…SmOw½v±¶g¾P—La\Ü(] IÇÌ$`烊FÓÑìlm•ìT¥«W6êWiñò‚àb®Q@òx{J–ÒêÕôË7µ»”Ïq @…&Kºã ÙäóÀ«ÙÖ¿Únû4?nò¼´ùcÌòó›ºíÏ8éš±EgÇáí*+K[TÓ,ÒÖÒQ=¼+†@I‹Œ+d“‘Ï&£Ô´Ûxlõ{‹}"Úöòê%€ª!½*„$r9 —æÈúV¥gø†H"Ð57ººšÆÕme2Ý[’$…6΄C’0"€$]OG²u±¶W±R–¬!\Û©]¤GÇÊ`cŠŽOiRÚ]Z¾™fö·r™î!h¤Ò w\a› žx¡EWþεþÐûwÙ¡ûw•ä}§Ëg—œìÝ×nyÇLÕxü=¥EikjšešZÚJ'·…`@È !Ñq…l’r9äÖ…M´m=ÞõÚÆÙžùB]1…sp¡v'0‘ƒž(]OG²u±¶W±R–¬!\Û©]¤GÇÊ`cйEgÉáí*[K«WÓ,ÞÖîS=Ä-šBA.ëŒ3d“ϣѴÛt·±½}"ÛMÔœp4qª3[¦ò¨åöq+R³ü=$ècÚÝM}jÖ±®® 2L›×r@%ˆÁ9“@~Ò¢´µµM2Í-m%Û° Hdè¸Â¶I9òjFÑ´÷{×kf{å tÆÍÂ…Úœ|ÀFx8«”P5Ñ´ô{'[e{)jÂͺ•ÚD|| €8¨äðö•-¥Õ«é–okw)žâ M! —uƲÉçZPìë_í·}š·y^GÚ|±æyyÎÍÝvçœtÍWÃÚTV–¶©¦Y¥­¤¢{xV €’VÉ'#žMhQ@úf‰eäê-&‰gc%ô²¥Ôi7Ú“{…y6õ;°ÙÆòz¸º6ždëcl¯b¥-XB¹·R»H”ÀLJ$YHm®¦¼Œ]\$ä–&pè2ʬG²Œg­hP|žÒ¥´ºµ}2Íínå3ÜBÐ!I¤$î¸Ã6@9<ð*Çöu¯ö‡Û¾ÍÛ¼¯#í>Xó<¼çfî»sÎ:f¬Q@ñø{JŠÒÖÕ4Ë4µ´”Oo À!C¢ã Ù$äsÉ©FÓÝï]¬m™ï”%ÓW7 hqó 9àâ®Q@×FÓÑìlm•ìT¥«W6êWiñò‚àb³Ç‡4É/5KyXó<¼çfî»sÎ:f¬Q@?é üð¿ö§ðWü!¾ ðÿ„¾ÝàÏ}¯û K‚Ëí/´=žg”‹»n÷ÆsÍŽ¦¾€¯*ñü?ÃÏûaæÆª5±eÈ{’‡<æ®U=)Ym\=’içϘùQ²ÃÍlIÇqóžà¹Ï9«”QEQEU8™Ž¯r¦õ$ADY]ÑÒfBzáø<~èã©«•N%a«Ü±²HÐÁ¡—t§t™ŒŽ¸NϽ8èhåQ@Q@Q@Uâ?ù:‡Ÿö&x—ÿK´*õZò¯ÿÉÓü<ÿ±3Ä¿ú]¡WªÐEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPX~5Õõ Ã×Ú€Þ'ÕáU6úJ]Çjn `ódùW–Éþî$UýkJ‹]Ñï´Ù幂È$·yl®d¶Ô©h匇À9¤2œA¬øÃáÖ6›§êæ£ ³µÁ—_Ö®õYÃUÚ²ÜÉ#ªaÐKe‰ )øö¾ñ¶û/|vø›ãm2Ûþ?x¯SÑìô$txlÞ6·†S,a|åY¥ É÷˜‚8¢_übø ñáB|Cñ¥Žt/ê#AÔmcÑá±:6£$ ,?fxÎeˆ´n‡ÌË`dœNýŸ|Wñ#ödý©¼t›ÍZñÄm{UÑR·kqxê ‹Y#.1ÊЀ²—œçº½{Xñ_íMñà­ŒŸ¼SàÍ?ÂZä~+ñ爴ói7Vöò$6ÖìÇý ´³2¡Fsœ€õýyWˆÿäéþØ™â_ý.ЫÕkŠñ÷Áï |JÕtOYÄ–• ŵ¥æ‰¯_é3$S´-4eí'ˆº³[Âv±#1‚1@­å_ðÍ>ÿ ¿Äü8þ!ÿäê?áš|#ÿAˆøqüCÿÉÔê´W•Ã4øGþ‚ÿ?ðãø‡ÿ“¨ÿ†iðýþ áÇñÿ'PªÑ^Uÿ Óáú ü@ÿÃâþN£þ§Â?ôøÿ‡Ä?ü@o‹üUcáïx"Âìß wX“N³…|³*é÷—'ÏÉËòí¤Æ2wù|c$uã÷¿²Ÿ€õ› ‹»¿]\XLnlå›âˆ­¥1¼FHɾÊ1ŽYpÁÛ#ŽŒA·ÿ Óáú ü@ÿÃâþN U¢¼«þ§Â?ôøÿ‡Ä?üGü3O„è/ñÿ?ˆù:€=VŠò¯øfŸÿÐ_âþÿòuðÍ>ÿ ¿Äü8þ!ÿäêõZåþ)øªÇÀ¿ |_âMLß.›£h÷šÑÓ ‹¡P¼äî y›TíÉ8ÉÉÃ4øGþ‚ÿ?ðãø‡ÿ“ª¦­û)ø_Ò¯tÍNïÇŽ›{ Û]YÝüBñ°Ï©Wѯˆee$ ‚ €=‚Šò¯øfŸÿÐ_âþÿòuðÍ>ÿ ¿Äü8þ!ÿäêõZ+Ê¿áš|#ÿAˆøqüCÿÉÔÃ4øGþ‚ÿ?ðãø‡ÿ“¨Õh¯*ÿ†iðýþ áÇñÿ'Qÿ Óáú ü@ÿÃâþN U®_ágЬ|uðÇÂ$Ó óiºÎg¨ÚL©º1K HžvÒG™µ†ì3œ\—ü3O„è/ñÿ?ˆù:ªi?²Ÿ€ô *ËLÓ.üq§i¶P¥µ­§Ä/E "…HÑøUPP(Ø(¯*ÿ†iðýþ áÇñÿ'Qÿ Óáú ü@ÿÃâþN U¢¼«þ§Â?ôøÿ‡Ä?üGü3O„è/ñÿ?ˆù:€=VŠò¯øfŸÿÐ_âþÿòuðÍ>ÿ ¿Äü8þ!ÿäêë~øªÇÆ>»¿ÓÍó[ìjºs@¯™æÚêÒãi#Ëó!/¾Í™ä¢¼Lý”ü¢Û=¾Ÿwã‹ wšk–ŠÛâˆ#V–YYd!o€,ò;»7VfbrI5oþ§Â?ôøÿ‡Ä?ü@«EyWü3O„è/ñÿ?ˆù:øfŸÿÐ_âþÿòuz­å_ðÍ>ÿ ¿Äü8þ!ÿäê?áš|#ÿAˆøqüCÿÉÔêµËéþ*±¼ø¯øn3}ý¥§èún£8¯ÙDW_G—Î|ÍÖ’ïÈV ç—ü3O„è/ñÿ?ˆù:ªGû)øVãSŽïÇ ©\ô÷‹ñ Äib¤hãgûvYQ¦”ª“€dr1¸äØ(¯*ÿ†iðýþ áÇñÿ'Qÿ Óáú ü@ÿÃâþN U¢¼«þ§Â?ôøÿ‡Ä?üGü3O„è/ñÿ?ˆù:€=VŠò¯øfŸÿÐ_âþÿòuðÍ>ÿ ¿Äü8þ!ÿäê.húå¿ÃÏøw\Ô- òÚóE¾·ÔÅ„²+ˆd’8ÜŒeX…b7laž;z+á_„Úç‹>|Bý´õM{Å2x×Ä^Ò´½F=V{$¶lÒn.cAª«¸.\dòMqþ!øceðcöJøuûAéަ~*Fú»¬ø†[ù¥›X[éà[›iÔ¹Wˆ‹’〃$äôjŠ( Š( Š©«jÖ:•{©êw¶úv›e ÜÝ^]ʱCH¥žGv *ª‚K“_/~×Þ,Ðþ9~Îðéþeø§ êž+Ò4ÍZ?Êš¡éw Å R#EÎæP<ÅÉ «(¯“g?üøkñ¡ôàþ§ðwâ-þ“,–°ë h؉Ê š ™âr¬±–MÁÆ3Œd×ÖTQEQEQ_8þÜÚî©oðóÁÒõK½|uãm#—·Ö§ŠÒâGiÂ8åK$Er;1ëÒ|£~̶/Ã_ x )ô_øûCÕ¢Ô4¹–kQud±MÒ«³m¬Œ…‡ÞrNhëÚ(¢€ (¢€ (¯ý²N°ß²ÇÅ oé—Úα}¡\iöö:m»Ïq+N¾Iˆ „ð8žÔì´WÄ¿<ð/à÷ÅOÅ?ÀýoáwŒ5 öÞñ¹F+ë!•ã ÔÂ)ž3&#™Pœ9â¾Ú Š( Š( ŠðÛCñ†¥û;øêÿÂÞ7“Áði~Õ/oâƒNŽâ]B4¶g¬®ÀÁŽ¥Ôùò0TWŒké/<%ûü%¼¼º¶ð§‹ôQ{®[ÚNðè,4ˆfKgt!¼·w]ÊÈ_jûšŠùOàv…mð?ö¿ñ·Â <öÞ¿ð•—Šì4WåƒL¸ûL–³,É(²mW+œdp¯«(¢Š(¢Šä>)xgÅ>.ð»iÞñ‰ð.¨ò‚Ú²é‘߸k«„(l•;Žq·æ€:ú+ósÁÖz§ÿà–¿ ´Q ë>1Ox‚Ö^ÓI¶{«™m·,÷ @#¬DfQ–aœ×¸þÎ~ø-ð×ãCè:'ÁýOàïÄ[ý&Y-aÖ6þѱ!”A43ÄåYc,›ƒŒgÉ ¬¨¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š)®‹*2:‡FeaG¡§Q@[ÚÃh… †8Pœ•BŒúñ_:xötñÇ„>ücѬ,|[ñï€õ/‹ƒ¬¼?à½QuÛ]?ÂKu$º…úFñÃ$¯8_%ÌfØ»É'»¤è¢€ (¢€ ‚ÚÆÚÏwÙíâƒv7yh?\TôP…øKö|¼µøÃûAkÞ!–ÆóÂÿ¡Òímí-¥´,0iæÖáf®âÇnÖn98}ðÁ¯ˆ^,øÝ |Lø«á¨n|/§ÝØè:'…òCÝlYî&žuVf)PrO_ ¨¢€ (¢€ (¢€<³öø1?Æÿ‡qiZn¨š‰4NÓ]ÐõIb2¥­ý¬¢H™Ð¹O̧Ð9#$W)à_ƒ~?ñÇ ?âwÅ;ï ÝH›IÐôo ›‰-áiÝMÅÔ’LªÅÙQP \îHÍ{õQEQEW#ñ_ÂÚ÷Œü«i>ñ4Þñ ȯc­AËöyQÕÆännÆÝcŒ먠›$ø1ñcâß|©|XÔ|eáÿê‹®Úéþ[©%Ô/Ò7Ž%yÂù(žc6ÅÞI8-Ü}'EQEQEÅ|oðU÷į‚þ>ð†™-¼–¿áýCJµ–í™aIg¶’$g*¬B†pIœgô¯%ñ7ìÙâyþü“ÃÚ¾•§üJø_oj¶—7k,š}Øûµ¼·r 8ŽU8]Ãhùy8ú>ŠñƒüW¤|Qñň—ú=׌5Û;]&ÚÇ@óZËL°€³ˆ’IB¼Œò;;1Uä Í{}PEPEPËß ?g/‰ß ?dÿ‡þÐ|e¥hž<ð¥Ó]½Ä)%Ε¨¡¹žCk6åI<§IFYB²²‚2;þø5ñ ÅŸ´‰Ÿoü5 Ï…ôû»Dð žHc{­‹=ÄÓΪÌÅ#  ®IëôQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ^UûXÿɬ|dÿ±3Yÿҫ䃞 ý‡.>ø_Ü|4#“B±mL^k¤âèÛ¡›ÌS(ÃïÝ‘ŽhôRŠð߈?ü}¥üEÕ¼'à_ƒz¯Œ‘iÕæµ©ê+£iÒ3¨eŠÚy#q;€~l`)+Ž‹öêÓüIðïá.³àÿ]ë¾$ø—-ä>ƒy¨ÃaofYn¼Û—Ü +) µI|Œ ñ@QÑ_þÕ_´OÅ;oÙKâ¥uo†1Ðu}.ÎæéµLÂ-溇ØÝ¤[nC°º€…®IÊìo³4;‹û½OŸU³‡NÕ%·îìíî ÄpLT%*†EVÈ µrvŒâ€/Q__±×ÆÙþ ýðg_°ðsø†ïÆ^/}"òßO`¸–yﮡYÆT‰dXí¢Œ!(jêkÝ¡ý¬üz~*_|.›à­Â|A]2=rÊÒ?Àú|ºy‘£iæºòÁˆ¬Š#رÈK8ù¨éú+óÓö¿ñ燿iߨ+â?Œu.‰ãê’h’Z_H—2é7ñß[Er°Ì  ¬£p##Wè]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEyÿí ámSÇ?¾%øoDµûnµ¬xgSÓìm¼ÅΞ[Y#79 ¹f,@ä^+ð³âGÆï‡ß üGñ·Æ}OÄž+øR>!xk[ÑôÑ£h¯Š"‡NðÅÈ„ý®Ë`ÍÆel™cI¸L(9®?À?³×ÄÏ þÌžø{âƒñõ‡†5}R=SB¾¿¶Y¯ žyg·½Ón í·(Ó2²IµØ ¹Í}ýE|ªþË¿u¿ÙSãG„í´yô¥×õ=6óÂ^ÔüF5)4¨-®måš#y#i‰ÙSyUànäšû»A¾»Ôô=:òÿN“G¿¸¶Ž[:iRWµ‘”‰ F*IRT•8È$Uú(óöhøiâO‰°_쬾Ó´›Aøo¯j#ÏŠ/"ÆßW¾3Kó²îÚ|«–=¯ª£øiâEý¹®>!7þ)øq‚5>.o†¦ó˜¼½Þgú¶ »nÞqœñ]ÿÁÿ‚þø àåð¯´Ùô¤ò\Çc.¡sx±;ã~Ã<ŽÈ¤Û…ÜÌØË1=½~vþÐ ÷VÒ’lmõ{Ë(fÉS‰VÞXÄ Rî FF wôQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÙgnss-sdr-0.0.9/src/utils/gnuplot/8_sat_accuracy_precision.plt000066400000000000000000000027001305042567700243730ustar00rootroot00000000000000#to load the file digit from terminal: #> gnuplot 8_sat_IFEN_accuracy_precision.plt #set terminal pdf color font "Bold,14" #set output "IFEN_solutions_pdf" set terminal jpeg font "Helvetica, 14" set output "8_sat_accuracy_precision.jpeg" set grid set xrange [-15:15] set yrange [-10:20] set ylabel "North [m]" set xlabel "East [m]" set key Left left set title "Accuracy-Precision (with respect to CORRECT coordinates)- 2DRMS" file1="4_GPS_3_GAL_GNSS_SDR_solutions.txt" file2="8_GAL_GNSS_SDR_solutions.txt" file3="8_GPS_GNSS_SDR_solutions.txt" #values to copy from statistic file DRMS_1=2*3.077 #it is 2*DRMS combined DRMS_2=2*1.87 # gal DRMS_3=2*2.034 # gps #difference with respect to the reference position #values to copy from statistic file delta_E_1=-1.812 #combined delta_N_1= 3.596 #combined delta_E_2= 1.191 #gal delta_N_2= 1.923 #gal delta_E_3= -0.560 #gps delta_N_3= 1.323 #gps set parametric #dummy variable is t for curves, u/v for surfaces set size square set angle degree set trange [0:360] plot file1 u 9:10 with points pointsize 0.3 lc rgb "green" title "4 GPS-3 GAL",\ file3 u 9:10 with points pointsize 0.3 lc rgb "red" title "8 GPS",\ file2 u 9:10 with points pointsize 0.3 lc rgb "blue" title "8 GAL",\ DRMS_1*sin(t)+delta_E_1,DRMS_1*cos(t)+delta_N_1 lw 2 lc rgb "green" notitle,\ DRMS_3*sin(t)+delta_E_3,DRMS_3*cos(t)+delta_N_3 lw 2 lc rgb "red" notitle,\ DRMS_2*sin(t)+delta_E_2,DRMS_2*cos(t)+delta_N_2 lw 2 lc rgb "blue" notitle gnss-sdr-0.0.9/src/utils/gnuplot/statistics/000077500000000000000000000000001305042567700211025ustar00rootroot00000000000000gnss-sdr-0.0.9/src/utils/gnuplot/statistics/4_GPS_3_GAL_GNSS_SDR_statitics.txt000066400000000000000000000016151305042567700270600ustar00rootroot00000000000000Num of GPS observation 4 Num of GALILEO observation 3 GDOP mean= 2.380532594 ENU computed at (IFEN true coordinates): ref Longitude = 11.808005630, Ref Latitude = 48.171497670 for Accuracy ENU computed at (average coordinates) mean Longitude = 11.807981252, mean Latitude = 48.171530020 for Precision ACCURACY (respect true position) East offset [m] = -1.812959237, East st. dev = 1.899085141 Nord offset [m] = 3.596061973,Noth st. dev = 2.422058671 Up offset [m] = 8.995532878, Up st. dev = 3.881428324 DRMS= 3.077806456 DUE_DRMS= 6.155612912 CEP= 2.565164055 MRSE= 4.953622757 SEP= 12.514572993 PRECISION (respect average solution) East offset [m] = 0.000000000, East st. dev = 1.899086239 Nord offset [m] = -0.000000001, ,Noth st. dev = 2.422059160 Up offset [m]= -0.000000003, Up st. dev = 3.881427482 ---------------------------------------------------------------------------------------------- gnss-sdr-0.0.9/src/utils/gnuplot/statistics/8_GAL_GNSS_SDR_statitics.txt000066400000000000000000000016141305042567700261300ustar00rootroot00000000000000Num of GPS observation 0 Num of GALILEO observation 8 GDOP mean= 1.769225604 ENU computed at (IFEN true coordinates): ref Longitude = 11.808005630, Ref Latitude = 48.171497670 for Accuracy ENU computed at (average coordinates) mean Longitude = 11.808021645, mean Latitude = 48.171514975 for Precision ACCURACY (respect true position) East offset [m] = 1.191616778, East st. dev = 1.370472661 Nord offset [m] = 1.923075914,Noth st. dev = 1.272461214 Up offset [m] = 13.774563698, Up st. dev = 3.492269580 DRMS= 1.870121081 DUE_DRMS= 3.740242162 CEP= 1.556390643 MRSE= 3.961476957 SEP= 8.003582836 PRECISION (respect average solution) East offset [m] = -0.000000002, East st. dev = 1.370472897 Nord offset [m] = -0.000000001, ,Noth st. dev = 1.272461012 Up offset [m]= 0.000000002, Up st. dev = 3.492269562 ---------------------------------------------------------------------------------------------- gnss-sdr-0.0.9/src/utils/gnuplot/statistics/8_GPS_GNSS_SDR_statitics.txt000066400000000000000000000016151305042567700261570ustar00rootroot00000000000000Num of GPS observation 8 Num of GALILEO observation 0 GDOP mean= 2.002216944 ENU computed at (IFEN true coordinates): ref Longitude = 11.808005630, Ref Latitude = 48.171497670 for Accuracy ENU computed at (average coordinates) mean Longitude = 11.807998091, mean Latitude = 48.171509585 for Precision ACCURACY (respect true position) East offset [m] = -0.560396234, East st. dev = 1.105718017 Nord offset [m] = 1.323685667,Noth st. dev = 1.707810937 Up offset [m] = 10.792857384, Up st. dev = 3.121160956 DRMS= 2.034509899 DUE_DRMS= 4.069019799 CEP= 1.678044871 MRSE= 3.725704798 SEP= 7.079246885 PRECISION (respect average solution) East offset [m] = 0.000000000, East st. dev = 1.105718027 Nord offset [m] = -0.000000005, ,Noth st. dev = 1.707811217 Up offset [m]= -0.000000005, Up st. dev = 3.121160800 ---------------------------------------------------------------------------------------------- gnss-sdr-0.0.9/src/utils/gpstk/000077500000000000000000000000001305042567700163505ustar00rootroot00000000000000gnss-sdr-0.0.9/src/utils/gpstk/gnsspvt/000077500000000000000000000000001305042567700200545ustar00rootroot00000000000000gnss-sdr-0.0.9/src/utils/gpstk/gnsspvt/CMakeLists.txt000066400000000000000000000034231305042567700226160ustar00rootroot00000000000000# CMAKE for GPSTK by Javier Arribas 2012 cmake_minimum_required (VERSION 2.6) project (gnsspvt_project) include_directories(${gnsspvt_project_SOURCE_DIR}/src) add_library (kml_printer_gpstk ${gnsspvt_project_SOURCE_DIR}/src/kml_printer_gpstk.cpp) add_executable(gnsspvt ${gnsspvt_project_SOURCE_DIR}/src/gnsspvt.cpp) target_link_libraries (gnsspvt kml_printer_gpstk) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/CMakeModules/") find_package(GPSTK REQUIRED) if ( NOT GPSTK_FOUND ) message(FATAL_ERROR "GPSTK library not found!") endif( NOT GPSTK_FOUND ) find_package(GLOG REQUIRED) if ( NOT GLOG_FOUND ) message(FATAL_ERROR "GLOG library not found!") endif( NOT GLOG_FOUND ) include_directories(${GLOG_INCLUDE_DIRS}) # IMPORTANT NOTICE: The GPSTK linking order is critical. First it is required to link agains libprocframe to avoid vtable errors include_directories(${GPSTK_INCLUDE_DIR}/gpstk ${GEOMATICS_INCLUDE_DIR} ${PROCFRAME_INCLUDE_DIR} ${VDRAW_INCLUDE_DIR} ${VPLOT_INCLUDE_DIR} ${RXIO_INCLUDE_DIR}) # set(LIBS ${LIBS} ${GPSTK_LIBRARIES} ${GEOMATICS_LIBRARIES} ${VDRAW_LIBRARIES} ${VPLOT_LIBRARIES} ${RXIO_LIBRARIES}) set(LIBS ${LIBS} ${PROCFRAME_LIBRARIES} ${GPSTK_LIBRARIES} ${GEOMATICS_LIBRARIES} ${GLOG_LIBRARIES}) target_link_libraries(gnsspvt ${LIBS}) message(STATUS "GPSTK_INCLUDE_DIR="${GLOG_LIBRARIES}) #message(STATUS "GPSTK_LIBRARIES=${GPSTK_LIBRARIES}") #message(STATUS "LIBS=${LIBS}") # debug info: print all variables #get_cmake_property(_variableNames VARIABLES) #foreach (_variableName ${_variableNames}) # message(STATUS "${_variableName}=${${_variableName}}") #endforeach() #get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES) #foreach(dir ${dirs}) # message(STATUS "INCLUDE_DIRECTORIES='${dir}'") #endforeach() gnss-sdr-0.0.9/src/utils/gpstk/gnsspvt/CMakeModules/000077500000000000000000000000001305042567700223655ustar00rootroot00000000000000gnss-sdr-0.0.9/src/utils/gpstk/gnsspvt/CMakeModules/FindGLOG.cmake000066400000000000000000000055761305042567700247350ustar00rootroot00000000000000# - Try to find the Google Glog library # # This module defines the following variables # # GLOG_FOUND - Was Glog found # GLOG_INCLUDE_DIRS - the Glog include directories # GLOG_LIBRARIES - Link to this # # This module accepts the following variables # # GLOG_ROOT - Can be set to Glog install path or Windows build path # #============================================================================= # FindGlog.cmake, adapted from FindBullet.cmake which has the following # copyright - #----------------------------------------------------------------------------- # Copyright 2009 Kitware, Inc. # Copyright 2009 Philip Lowman # # 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.) if (NOT DEFINED GLOG_ROOT) set (GLOG_ROOT /usr /usr/local) endif (NOT DEFINED GLOG_ROOT) if(MSVC) set(LIB_PATHS ${GLOG_ROOT} ${GLOG_ROOT}/Release) else(MSVC) set (LIB_PATHS ${GLOG_ROOT} ${GLOG_ROOT}/lib) endif(MSVC) macro(_FIND_GLOG_LIBRARIES _var) find_library(${_var} NAMES ${ARGN} PATHS ${LIB_PATHS} PATH_SUFFIXES lib ) mark_as_advanced(${_var}) endmacro() macro(_GLOG_APPEND_LIBRARIES _list _release) set(_debug ${_release}_DEBUG) if(${_debug}) set(${_list} ${${_list}} optimized ${${_release}} debug ${${_debug}}) else() set(${_list} ${${_list}} ${${_release}}) endif() endmacro() if(MSVC) find_path(GLOG_INCLUDE_DIR NAMES raw_logging.h PATHS ${GLOG_ROOT}/src/windows ${GLOG_ROOT}/src/windows/glog ) else(MSVC) # Linux/OS X builds find_path(GLOG_INCLUDE_DIR NAMES raw_logging.h PATHS ${GLOG_ROOT}/include/glog ) endif(MSVC) # Find the libraries if(MSVC) _FIND_GLOG_LIBRARIES(GLOG_LIBRARIES libglog.lib) else(MSVC) # Linux/OS X builds _FIND_GLOG_LIBRARIES(GLOG_LIBRARIES libglog.so) endif(MSVC) message("glog library = " ${GLOG_LIBRARIES}) # handle the QUIETLY and REQUIRED arguments and set GLOG_FOUND to TRUE if # all listed variables are TRUE include("${CMAKE_ROOT}/Modules/FindPackageHandleStandardArgs.cmake") FIND_PACKAGE_HANDLE_STANDARD_ARGS(Glog DEFAULT_MSG GLOG_LIBRARIES) if(MSVC) string(REGEX REPLACE "/glog$" "" VAR_WITHOUT ${GLOG_INCLUDE_DIR}) string(REGEX REPLACE "/windows$" "" VAR_WITHOUT ${VAR_WITHOUT}) set(GLOG_INCLUDE_DIRS ${GLOG_INCLUDE_DIRS} "${VAR_WITHOUT}") string(REGEX REPLACE "/libglog.lib" "" GLOG_LIBRARIES_DIR ${GLOG_LIBRARIES}) else(MSVC) # Linux/OS X builds set(GLOG_INCLUDE_DIRS ${GLOG_INCLUDE_DIR}) string(REGEX REPLACE "/libglog.so" "" GLOG_LIBRARIES_DIR ${GLOG_LIBRARIES}) endif(MSVC) if(GLOG_FOUND) # _GLOG_APPEND_LIBRARIES(GLOG GLOG_LIBRARIES) endif() gnss-sdr-0.0.9/src/utils/gpstk/gnsspvt/CMakeModules/FindGPSTK.cmake000066400000000000000000000053471305042567700250710ustar00rootroot00000000000000# - Find gpstk library # Find the native gpstk includes and library # This module defines # GPSTK_INCLUDE_DIR, where to find tiff.h, etc. # GPSTK_LIBRARIES, libraries to link against to use GPSTK. # GPSTK_FOUND, If false, do not try to use GPSTK. # also defined, but not for general use are # GPSTK_LIBRARY, where to find the GPSTK library. FIND_PATH(GPSTK_INCLUDE_DIR gpstk/Matrix.hpp) FIND_PATH(GEOMATICS_INCLUDE_DIR gpstk/random.hpp) FIND_PATH(PROCFRAME_INCLUDE_DIR gpstk/SolverWMS.hpp) FIND_PATH(VDRAW_INCLUDE_DIR gpstk/Layout.hpp) FIND_PATH(VPLOT_INCLUDE_DIR gpstk/ScatterPlot.hpp) FIND_PATH(RXIO_INCLUDE_DIR gpstk/EphReader.hpp) SET(GPSTK_NAMES ${GPSTK_NAMES} gpstk libgpstk) FIND_LIBRARY(GPSTK_LIBRARY NAMES ${GPSTK_NAMES} ) SET(GEOMATICS_NAMES ${GEOMATICS_NAMES} geomatics libgeomatics) FIND_LIBRARY(GEOMATICS_LIBRARY NAMES ${GEOMATICS_NAMES} ) SET(PROCFRAME_NAMES ${PROCFRAME_NAMES} procframe libprocframe) FIND_LIBRARY(PROCFRAME_LIBRARY NAMES ${PROCFRAME_NAMES} ) SET(VDRAW_NAMES ${VDRAW_NAMES} vdraw libvdraw) FIND_LIBRARY(VDRAW_LIBRARY NAMES ${VDRAW_NAMES} ) SET(VPLOT_NAMES ${VPLOT_NAMES} vplot libvplot) FIND_LIBRARY(VPLOT_LIBRARY NAMES ${VPLOT_NAMES} ) SET(RXIO_NAMES ${RXIO_NAMES} rxio librxio) FIND_LIBRARY(RXIO_LIBRARY NAMES ${RXIO_NAMES} ) # handle the QUIETLY and REQUIRED arguments and set GPSTK_FOUND to TRUE if # all listed variables are TRUE INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(GPSTK DEFAULT_MSG GPSTK_LIBRARY GPSTK_INCLUDE_DIR) FIND_PACKAGE_HANDLE_STANDARD_ARGS(GEOMATICS DEFAULT_MSG GEOMATICS_LIBRARY GEOMATICS_INCLUDE_DIR) FIND_PACKAGE_HANDLE_STANDARD_ARGS(PROCFRAME DEFAULT_MSG PROCFRAME_LIBRARY PROCFRAME_INCLUDE_DIR) FIND_PACKAGE_HANDLE_STANDARD_ARGS(VDRAW DEFAULT_MSG VDRAW_LIBRARY VDRAW_INCLUDE_DIR) FIND_PACKAGE_HANDLE_STANDARD_ARGS(VPLOT DEFAULT_MSG VPLOT_LIBRARY VPLOT_INCLUDE_DIR) FIND_PACKAGE_HANDLE_STANDARD_ARGS(RXIO DEFAULT_MSG RXIO_LIBRARY RXIO_INCLUDE_DIR) IF(GPSTK_FOUND) SET( GPSTK_LIBRARIES ${GPSTK_LIBRARY} ) ENDIF(GPSTK_FOUND) IF(GEOMATICS_FOUND) SET( GEOMATICS_LIBRARIES ${GEOMATICS_LIBRARY} ) ENDIF(GEOMATICS_FOUND) IF(PROCFRAME_FOUND) SET( PROCFRAME_LIBRARIES ${PROCFRAME_LIBRARY} ) ENDIF(PROCFRAME_FOUND) IF(VDRAW_FOUND) SET( VDRAW_LIBRARIES ${VDRAW_LIBRARY} ) ENDIF(VDRAW_FOUND) IF(VPLOT_FOUND) SET( VPLOT_LIBRARIES ${VPLOT_LIBRARY} ) ENDIF(VPLOT_FOUND) IF(RXIO_FOUND) SET( RXIO_LIBRARIES ${RXIO_LIBRARY} ) ENDIF(RXIO_FOUND) MARK_AS_ADVANCED(GPSTK_INCLUDE_DIR GPSTK_LIBRARY) MARK_AS_ADVANCED(GEOMATICS_INCLUDE_DIR GEOMATICS_LIBRARY) MARK_AS_ADVANCED(PROCFRAME_INCLUDE_DIR PROCFRAME_LIBRARY) MARK_AS_ADVANCED(VDRAW_INCLUDE_DIR VDRAW_LIBRARY) MARK_AS_ADVANCED(VPLOT_INCLUDE_DIR VPLOT_LIBRARY) MARK_AS_ADVANCED(RXIO_INCLUDE_DIR RXIO_LIBRARY) gnss-sdr-0.0.9/src/utils/gpstk/gnsspvt/README000066400000000000000000000035071305042567700207410ustar00rootroot00000000000000ABOUT GNSSPVT ---------------------- This program uses the high level GpsTk classes to implement a simple PVT solver that uses RINEX files as an input. The output is written both in the console and in a Google Earth KML file. HOW TO BUILD GNSSPVT ---------------------- Installation in Ubuntu 11.04, 11.10, 12.04 (32 and 64 bits) ----------------------------------------------------------- - Install CMake through your OS's package manager or by some other means. - Install GpsTk: The following procedure will build and install the GPSTk. Ensure that prerequisites such as jam have been installed. Download the GPSTk source distribution from http://www.gpstk.org/bin/view/Documentation/GPSTkDownloads Extract the GPSTk tarball. For example, using GNU tar tar xvzf gpstk.tar.gz Change into the gpstk/dev directory (if using Subversion) or the gpstk/ directory (if using the tarball)and type jam To build the source documentation using doxygen: doxygen To install GPSTk as a system library in /usr/local, assume root privileges then execute jam install To install to a different directory, define the environment variable PREFIX to point to the root of the installation - Download, unzip, configure, build and install glog, a Google's library that implements application-level logging: $ wget http://google-glog.googlecode.com/files/glog-0.3.2.tar.gz $ tar xvfz glog-0.3.2.tar.gz $ cd glog-0.3.2 $ ./configure $ make $ sudo make install - Go to GNSSPVT root directory and compile the gnsspvt: $ cd gnss-sdr/src/utils/gpstk/gnsspvt/ $ mkdir build $ cd build $ cmake ../ $ make If everything goes well, the executable file is available in the build directory. USAGE ---------------------- ./gnsspvt -i path_to_rinex_observable_file -n path_to_rinex_navigation_file -k path_to_kml_output_file gnss-sdr-0.0.9/src/utils/gpstk/gnsspvt/src/000077500000000000000000000000001305042567700206435ustar00rootroot00000000000000gnss-sdr-0.0.9/src/utils/gpstk/gnsspvt/src/gnsspvt.cpp000066400000000000000000000473341305042567700230660ustar00rootroot00000000000000/*! * \file gnsspvt.cpp * \brief Adapted version of high level gpstk PVT solver to read RINEX files, * compute the position, velocity and time solution, and write Google Earth KML output file. * The input Observables and Navigation files can be RINEX 2.10 or RINEX 3.00. * It is a modified version of the example5.cpp code provided in gpstk source code. * * \author Javier Arribas, 2012. jarribas(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2012 (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 . * * ------------------------------------------------------------------------- */ // Modified Example program Nro 5 for GPSTk // This program shows how to use some high-level GPSTk classes // Basic input/output C++ class #include // Classes for handling observations RINEX files (data) #include "gpstk/Rinex3ObsData.hpp" #include "gpstk/Rinex3ObsStream.hpp" // Class to easily extract data from Rinex3ObsData objects #include "gpstk/ExtractData.hpp" // Classes for handling satellite navigation parameters RINEX files // (Broadcast ephemerides) #include "gpstk/Rinex3NavHeader.hpp" #include "gpstk/Rinex3NavData.hpp" #include "gpstk/Rinex3NavStream.hpp" // Class to store satellite broadcast navigation data #include "gpstk/GPSEphemerisStore.hpp" // Class to model GPS data for a mobile receiver #include "gpstk/ModeledPR.hpp" #include "gpstk/GNSSconstants.hpp" #include "gpstk/CommonTime.hpp" #include "gpstk/SatID.hpp" #include "gpstk/Matrix.hpp" #include "gpstk/XvtStore.hpp" #include "gpstk/TropModel.hpp" // Class to model the tropospheric delays #include "gpstk/TropModel.hpp" // Classes to model ans store ionospheric delays #include "gpstk/IonoModel.hpp" #include "gpstk/IonoModelStore.hpp" // Class to solve the equations system using a Weighted Least Mean Square method #include "gpstk/SolverWMS.hpp" // Class to compute the weights to be used for each satellite #include "gpstk/MOPSWeight.hpp" // Basic framework for programs in the GPSTk. The 'process()' method MUST // be implemented #include "gpstk/BasicFramework.hpp" #include "gpstk/geometry.hpp" // DEG_TO_RAD // Time-class year-day-second #include "gpstk/YDSTime.hpp" #include "kml_printer_gpstk.h" using namespace std; using namespace gpstk; // A new class is declared that will handle program behaviour // This class inherits from BasicFramework class gpstk_solver : public BasicFramework { public: // Constructor declaration gpstk_solver(char* arg0); ~gpstk_solver(); protected: // Method that will take care of processing virtual void process(); // Method that hold code to be run BEFORE processing virtual void spinUp(); virtual int Prepare( const CommonTime& Tr, std::vector& Satellite, std::vector& Pseudorange, const XvtStore& Eph ); virtual int Prepare2( const CommonTime& Tr, const Vector& Satellite, const Vector& Pseudorange, const XvtStore& Eph ); private: // These field represent options at command line interface (CLI) CommandOptionWithArg dataFile; CommandOptionWithArg navFile; CommandOptionWithArg kmlFile; Kml_Printer_gpstk kml_printer; // If you want to share objects and variables among methods, you'd // better declare them here Rinex3ObsStream rObsFile; // Object to read Rinex observation data files Rinex3ObsData rData; // Object to store Rinex observation data Rinex3NavStream rNavFile; // Object to read Rinex navigation data files Rinex3NavData rNavData; // Object to store Rinex navigation data Rinex3NavHeader rNavHeader; // Object to read the header of Rinex // navigation data files IonoModelStore ionoStore; // Object to store ionospheric models GPSEphemerisStore bceStore; // Object to store ephemeris ModeledPR modelPR; // Declare a ModeledReferencePR object MOPSTropModel mopsTM; // Declare a MOPSTropModel object ExtractData obsC1; // Declare an ExtractData object int indexC1; // Index to "C1" observation bool useFormerPos; // Flag indicating if we have an a priori // position Position formerPosition; // Object to store the former position IonoModel ioModel; // Declare a Ionospheric Model object SolverWMS solver; // Declare an object to apply WMS method MOPSWeight mopsWeights; // Object to compute satellites' weights }; // Let's implement constructor details gpstk_solver::gpstk_solver(char* arg0) : BasicFramework(arg0, "\nProgram to print the position solution in ECEF " "and longitude, latitude, height, based in C1 and " "given a RINEX observations file and a RINEX " "broadcast navigation file.\n\n" "The output is: \n" " Time(sec) X(m) Y(m) Z(m) Lon(deg) " " Lat(deg) Height(m)\n"), // Option initialization. "true" means a mandatory option dataFile(CommandOption::stdType, 'i', "datainput", " [-i|--datainput] Name of RINEX observations file.", true), navFile(CommandOption::stdType, 'n', "navinput", " [-n|--navinput] Name of RINEX broadcast navigation file.", true), kmlFile(CommandOption::stdType, 'k', "kmloutput", " [-n|--navinput] Name of KML output file.", true) { // These options may appear just once at CLI dataFile.setMaxCount(1); navFile.setMaxCount(1); kmlFile.setMaxCount(1); } // End of constructor details /* Method to set an a priori position of receiver using * Bancroft's method. * * @param Tr Time of observation * @param Satellite std::vector of satellites in view * @param Pseudorange std::vector of pseudoranges measured from * rover station to satellites * @param Eph Satellites Ephemeris * * @return * 0 if OK * -1 if problems arose */ int gpstk_solver::Prepare( const CommonTime& Tr, std::vector& Satellite, std::vector& Pseudorange, const XvtStore& Eph ) { Matrix SVP; Bancroft Ban; Vector vPos; PRSolution2 raimObj; try { cerr << "Tr=" <::iterator it = Satellite.begin() ; it != Satellite.end(); ++it) { cerr << "SatID=" << *it<& Satellite, const Vector& Pseudorange, const XvtStore& Eph ) { int i; std::vector vSat; std::vector vPR; // Convert from gpstk::Vector to std::vector for (i = 0; i < (int)Satellite.size(); i++) { vSat.push_back(Satellite[i]); } for (i = 0; i < (int)Pseudorange.size(); i++) { vPR.push_back(Pseudorange[i]); } return Prepare(Tr, vSat, vPR, Eph); } // End of method 'ModeledPR::Prepare()' // Method that will be executed AFTER initialization but BEFORE processing void gpstk_solver::spinUp() { //open KML output file if (kml_printer.set_headers(kmlFile.getValue()[0].c_str())!=true) { cerr << "Problem creating the kml file "<> roh; // We need the index pointing to C1-type observations try { indexC1 = roh.getObsIndex( "C1" ); } catch(...) { cerr << "The observation file doesn't have C1 pseudoranges." << endl; exit(1); } // Activate failbit to enable exceptions rNavFile.exceptions(ios::failbit); // Read nav file and store unique list of ephemerides try { rNavFile.open(navFile.getValue()[0].c_str(), std::ios::in); } catch(...) { cerr << "Problem opening file " << navFile.getValue()[0].c_str() << endl; cerr << "Maybe it doesn't exist or you don't have proper read " << "permissions." << endl; exit (-1); } // We will need to read ionospheric parameters (Klobuchar model) from // the file header rNavFile >> rNavHeader; // Let's feed the ionospheric model (Klobuchar type) from data in the // navigation (ephemeris) file header. First, we must check if there are // valid ionospheric correction parameters in the header if(rNavHeader.valid & Rinex3NavHeader::validIonoCorrGPS) { // Extract the Alpha and Beta parameters from the header double* ionAlpha = rNavHeader.mapIonoCorr["GPSA"].param; double* ionBeta = rNavHeader.mapIonoCorr["GPSB"].param; // Feed the ionospheric model with the parameters ioModel.setModel(ionAlpha, ionBeta); } else { cerr << "WARNING: Navigation file " << navFile.getValue()[0].c_str() << " doesn't have valid ionospheric correction parameters." << endl; } // WARNING-WARNING-WARNING: In this case, the same model will be used // for the full data span ionoStore.addIonoModel(CommonTime::BEGINNING_OF_TIME, ioModel); // Storing the ephemeris in "bceStore" while (rNavFile >> rNavData) { bceStore.addEphemeris(rNavData); rNavData.dump(cerr); cerr<> rData ) { // Begin usable data with enough number of satellites if( (rData.epochFlag == 0 || rData.epochFlag == 1) && (rData.numSVs > 3) ) { // Number of satellites with valid data in this epoch int validSats = 0; int prepareResult; double rxAltitude; // Receiver altitude for tropospheric model double rxLatitude; // Receiver latitude for tropospheric model // We need to extract C1 data from this epoch. Skip epoch if not // enough data (4 SV at least) is available if( obsC1.getData(rData, indexC1) < 4 ) { // The former position will not be valid next time useFormerPos = false; continue; } // If possible, use former position as a priori if( useFormerPos ) { prepareResult = modelPR.Prepare(formerPosition); // We need to seed this kind of tropospheric model with // receiver altitude rxAltitude = formerPosition.getAltitude(); rxLatitude = formerPosition.getGeodeticLatitude(); } else { // Use Bancroft method is no a priori position is available cerr << "Bancroft method was used at epoch " << static_cast(rData.time).sod << endl; Prepare2( rData.time,obsC1.availableSV,obsC1.obsData,bceStore ); prepareResult = modelPR.Prepare( rData.time, obsC1.availableSV, obsC1.obsData, bceStore ); // We need to seed this kind of tropospheric model with // receiver altitude rxAltitude = modelPR.rxPos.getAltitude(); rxLatitude = modelPR.rxPos.getGeodeticLatitude(); } // If there were problems with Prepare(), skip this epoch if( prepareResult ) { // The former position will not be valid next time useFormerPos = false; continue; } // If there were no problems, let's feed the tropospheric model mopsTM.setReceiverHeight(rxAltitude); mopsTM.setReceiverLatitude(rxLatitude); mopsTM.setDayOfYear(static_cast(rData.time).doy); // Now, let's compute the GPS model for our observable (C1) validSats = modelPR.Compute( rData.time, obsC1.availableSV, obsC1.obsData, bceStore, &mopsTM, &ionoStore ); // Only get into further computations if there are enough // satellites if( validSats >= 4 ) { // Now let's solve the navigation equations using the WMS method try { // First, compute the satellites' weights int goodSv = mopsWeights.getWeights( rData.time, modelPR.availableSV, bceStore, modelPR.ionoCorrections, modelPR.elevationSV, modelPR.azimuthSV, modelPR.rxPos ); // Some minimum checking is in order if ( goodSv != (int)modelPR.prefitResiduals.size() ) continue; // Then, solve the system solver.Compute( modelPR.prefitResiduals, modelPR.geoMatrix, mopsWeights.weightsVector ); } catch( InvalidSolver& e ) { cerr << "Couldn't solve equations system at epoch " << static_cast(rData.time).sod << endl; cerr << e << endl; // The former position will not be valid next time useFormerPos = false; continue; } // With "solver", we got the difference vector between the // a priori position and the computed, 'real' position. Then, // let's convert the solution to a Position object Position solPos( (modelPR.rxPos.X() + solver.solution[0]), (modelPR.rxPos.Y() + solver.solution[1]), (modelPR.rxPos.Z() + solver.solution[2]) ); // Print results cout << static_cast(rData.time).sod << " "; // Output field #1 cout << "X="<= 4 )' else { // The former position will not be valid next time useFormerPos = false; } } // End of 'if( (rData.epochFlag == 0 || rData.epochFlag == 1) &&...' else { // The former position will not be valid next time useFormerPos = false; } } // End of 'while( rObsFile >> rData )' return; } // End of 'gpstk_solver::process()' gpstk_solver::~gpstk_solver() { kml_printer.close_file(); } // Main function int main(int argc, char* argv[]) { try { gpstk_solver program(argv[0]); if (!program.initialize(argc, argv)) return 0; if (!program.run()) return 1; return 0; } catch(Exception& e) { cout << "Problem: " << e << endl; return 1; } catch(...) { cout << "Unknown error." << endl; return 1; } return 0; } // End of 'main()' gnss-sdr-0.0.9/src/utils/gpstk/gnsspvt/src/kml_printer_gpstk.cpp000066400000000000000000000104541305042567700251110ustar00rootroot00000000000000/*! * \file kml_printer.cc * \brief Implementation of a class that prints PVT information to a kml file * for GPSTK data structures * \author Javier Arribas, 2012. jarribas(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2012 (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 . * * ------------------------------------------------------------------------- */ #include "kml_printer_gpstk.h" #include #include #include bool Kml_Printer_gpstk::set_headers(std::string filename) { time_t rawtime; struct tm * timeinfo; time ( &rawtime ); timeinfo = localtime ( &rawtime ); kml_file.open(filename.c_str()); if (kml_file.is_open()) { DLOG(INFO) << "KML printer writing on " << filename.c_str(); // Set iostream numeric format and precision kml_file.setf(kml_file.fixed,kml_file.floatfield); kml_file << std::setprecision(14); kml_file << "" << std::endl << "" << std::endl << " " << std::endl << " GNSS Track" << std::endl << " GNSS-SDR Receiver position log file created at " << asctime (timeinfo) << " " << std::endl << "" << std::endl << "" << std::endl << "GNSS-SDR PVT" << std::endl << "GNSS-SDR position log" << std::endl << "#yellowLineGreenPoly" << std::endl << "" << std::endl << "0" << std::endl << "1" << std::endl << "absolute" << std::endl << "" << std::endl; return true; } else { return false; } } bool Kml_Printer_gpstk::print_position(gpstk::Position position) { double latitude; double longitude; double height; latitude = position.geodeticLatitude(); longitude = position.getLongitude(); if (longitude>190) { longitude=longitude-360; } height = position.getHeight(); if (kml_file.is_open()) { kml_file << longitude << "," << latitude << "," << height << std::endl; return true; } else { return false; } } bool Kml_Printer_gpstk::close_file() { if (kml_file.is_open()) { kml_file << "" << std::endl << "" << std::endl << "" << std::endl << "" << std::endl << ""; kml_file.close(); return true; } else { return false; } } Kml_Printer_gpstk::Kml_Printer_gpstk () {} Kml_Printer_gpstk::~Kml_Printer_gpstk () {} gnss-sdr-0.0.9/src/utils/gpstk/gnsspvt/src/kml_printer_gpstk.h000066400000000000000000000033061305042567700245540ustar00rootroot00000000000000/*! * \file kml_printer.h * \brief Interface of a class that prints PVT information to a kml file * for GPSTK data structures * \author Javier Arribas, 2012. jarribas(at)cttc.es * * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2015 (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_KML_PRINTER_H_ #define GNSS_SDR_KML_PRINTER_H_ #include #include #include "gpstk/Position.hpp" /*! * \brief Prints PVT information to OGC KML format file (can be viewed with Google Earth) * * See http://www.opengeospatial.org/standards/kml */ class Kml_Printer_gpstk { private: std::ofstream kml_file; public: bool set_headers(std::string filename); bool print_position(gpstk::Position position); bool close_file(); Kml_Printer_gpstk(); ~Kml_Printer_gpstk(); }; #endif gnss-sdr-0.0.9/src/utils/matlab/000077500000000000000000000000001305042567700164605ustar00rootroot00000000000000gnss-sdr-0.0.9/src/utils/matlab/galileo_e1_dll_pll_veml_plot_sample_32bits.m000066400000000000000000000076151305042567700271620ustar00rootroot00000000000000% /*! % * \file galileo_l1_ca_dll_pll_vml_plot_sample_64bits.m % * \brief Read GNSS-SDR Tracking dump binary file using the provided % function and plot some internal variables % * \author Javier Arribas, 2011. jarribas(at)cttc.es % * ------------------------------------------------------------------------- % * % * Copyright (C) 2010-2011 (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 . % * % * ------------------------------------------------------------------------- % */ close all; clear all; samplingFreq = 20480000/4; %[Hz] channels=8; %path='/home/javier/workspace/gnss-sdr/trunk/install/'; path='/home/gnss/workspace/gnss-sdr/trunk/data/'; clear PRN_absolute_sample_start; for N=1:1:channels tracking_log_path=[path 'veml_tracking_ch_' num2str(N-1) '.dat']; GNSS_tracking(N)= galileo_e1_dll_pll_veml_read_tracking_dump_32bits(tracking_log_path); end % GNSS-SDR format conversion to MATLAB GPS receiver for N=1:1:channels trackResults(N).status = 'T'; %fake track trackResults(N).codeFreq = GNSS_tracking(N).code_freq_hz.'; trackResults(N).carrFreq = GNSS_tracking(N).carrier_doppler_hz.'; trackResults(N).dllDiscr = GNSS_tracking(N).code_error.'; trackResults(N).dllDiscrFilt = GNSS_tracking(N).code_nco.'; trackResults(N).pllDiscr = GNSS_tracking(N).carr_error.'; trackResults(N).pllDiscrFilt = GNSS_tracking(N).carr_nco.'; trackResults(N).I_P = GNSS_tracking(N).prompt_I.'; trackResults(N).Q_P = GNSS_tracking(N).prompt_Q.'; trackResults(N).I_VE = GNSS_tracking(N).VE.'; trackResults(N).I_E = GNSS_tracking(N).E.'; trackResults(N).I_L = GNSS_tracking(N).L.'; trackResults(N).I_VL = GNSS_tracking(N).VL.'; trackResults(N).Q_VE = zeros(1,length(GNSS_tracking(N).VE)); trackResults(N).Q_E = zeros(1,length(GNSS_tracking(N).E)); trackResults(N).Q_L = zeros(1,length(GNSS_tracking(N).L)); trackResults(N).Q_VL = zeros(1,length(GNSS_tracking(N).VL)); trackResults(N).PRN = N; %fake PRN % Use original MATLAB tracking plot function settings.numberOfChannels = channels; settings.msToProcess = length(GNSS_tracking(N).E)*4; plotVEMLTracking(N,trackResults,settings) end % for N=1:1:channels % % figure; % % plot([GNSS_tracking(N).E,GNSS_tracking(N).P,GNSS_tracking(N).L],'-*'); % % title(['Early, Prompt, and Late correlator absolute value output for channel ' num2str(N)']); % % figure; % % plot(GNSS_tracking(N).prompt_I,GNSS_tracking(N).prompt_Q,'+'); % % title(['Navigation constellation plot for channel ' num2str(N)]); % % figure; % % % % plot(GNSS_tracking(N).prompt_Q,'r'); % % hold on; % % plot(GNSS_tracking(N).prompt_I); % % title(['Navigation symbols I(red) Q(blue) for channel ' num2str(N)]); % % % figure; % t=0:4:length(GNSS_tracking(N).carrier_doppler_hz)*4-1; % t=t/1000; % plot(t,GNSS_tracking(N).carrier_doppler_hz/1000); % xlabel('Time(s)');ylabel('Doppler(KHz)');title(['Doppler frequency channel ' num2str(N)]); % end gnss-sdr-0.0.9/src/utils/matlab/galileo_e1_dll_pll_veml_plot_sample_64bits.m000066400000000000000000000075701305042567700271670ustar00rootroot00000000000000% /*! % * \file galileo_l1_ca_dll_pll_vml_plot_sample_64bits.m % * \brief Read GNSS-SDR Tracking dump binary file using the provided % function and plot some internal variables % * \author Javier Arribas, 2011. jarribas(at)cttc.es % * ------------------------------------------------------------------------- % * % * Copyright (C) 2010-2011 (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 . % * % * ------------------------------------------------------------------------- % */ close all; clear all; samplingFreq = 64e6/8; %[Hz] channels=1; %path='/home/javier/workspace/gnss-sdr/trunk/install/'; path='/home/luis/dev/gnss-sdr/trunk/data/'; clear PRN_absolute_sample_start; for N=1:1:channels tracking_log_path=[path 'veml_tracking_ch_' num2str(N-1) '.dat']; GNSS_tracking(N)= galileo_e1_dll_pll_veml_read_tracking_dump(tracking_log_path); end % GNSS-SDR format conversion to MATLAB GPS receiver for N=1:1:channels trackResults(N).status='T'; %fake track trackResults(N).codeFreq=GNSS_tracking(N).code_freq_hz.'; trackResults(N).carrFreq=GNSS_tracking(N).carrier_doppler_hz.'; trackResults(N).dllDiscr = GNSS_tracking(N).code_error.'; trackResults(N).dllDiscrFilt = GNSS_tracking(N).code_nco.'; trackResults(N).pllDiscr = GNSS_tracking(N).carr_error.'; trackResults(N).pllDiscrFilt = GNSS_tracking(N).carr_nco.'; trackResults(N).I_P=GNSS_tracking(N).prompt_I.'; trackResults(N).Q_P=GNSS_tracking(N).prompt_Q.'; trackResults(N).I_VE= GNSS_tracking(N).VE.'; trackResults(N).I_E= GNSS_tracking(N).E.'; trackResults(N).I_L = GNSS_tracking(N).L.'; trackResults(N).I_VL = GNSS_tracking(N).VL.'; trackResults(N).Q_VE = zeros(1,length(GNSS_tracking(N).VE)); trackResults(N).Q_E = zeros(1,length(GNSS_tracking(N).E)); trackResults(N).Q_L =zeros(1,length(GNSS_tracking(N).L)); trackResults(N).Q_VL =zeros(1,length(GNSS_tracking(N).VL)); trackResults(N).PRN=N; %fake PRN % Use original MATLAB tracking plot function settings.numberOfChannels=channels; settings.msToProcess=length(GNSS_tracking(N).E)*4; plotVEMLTracking(N,trackResults,settings) end % for N=1:1:channels % % figure; % % plot([GNSS_tracking(N).E,GNSS_tracking(N).P,GNSS_tracking(N).L],'-*'); % % title(['Early, Prompt, and Late correlator absolute value output for channel ' num2str(N)']); % % figure; % % plot(GNSS_tracking(N).prompt_I,GNSS_tracking(N).prompt_Q,'+'); % % title(['Navigation constellation plot for channel ' num2str(N)]); % % figure; % % % % plot(GNSS_tracking(N).prompt_Q,'r'); % % hold on; % % plot(GNSS_tracking(N).prompt_I); % % title(['Navigation symbols I(red) Q(blue) for channel ' num2str(N)]); % % % figure; % t=0:4:length(GNSS_tracking(N).carrier_doppler_hz)*4-1; % t=t/1000; % plot(t,GNSS_tracking(N).carrier_doppler_hz/1000); % xlabel('Time(s)');ylabel('Doppler(KHz)');title(['Doppler frequency channel ' num2str(N)]); % end gnss-sdr-0.0.9/src/utils/matlab/galileo_e1b_observables_plot_sample.m000066400000000000000000000013021305042567700257630ustar00rootroot00000000000000% Read observables dump clear all; close all; %IFEN NSR Sampler Fs=20480000 % GNSS-SDR decimation factor 8 samplingFreq = 20480000/8; %[Hz] channels=4; path='/home/gnss/workspace/gnss-sdr/trunk/install/'; observables_log_path=[path 'observables.dat']; GNSS_observables= gps_l1_ca_read_observables_dump(channels,observables_log_path); skip=9000; ref_channel=1; plot(GNSS_observables.d_TOW_at_current_symbol(ref_channel,skip:end),GNSS_observables.Pseudorange_m(:,skip:end).') title('psudoranges'); figure plot(GNSS_observables.d_TOW_at_current_symbol(ref_channel,skip:end),GNSS_observables.Prn_timestamp_ms(:,skip:end).') title('Prn_timestamps'); gnss-sdr-0.0.9/src/utils/matlab/galileo_e5a_dll_pll_plot_sample_64bits.m000066400000000000000000000072041305042567700263030ustar00rootroot00000000000000% /*! % * \file galileo_e5a_dll_pll_plot_sample_64bits.m % * \brief Read GNSS-SDR Tracking dump binary file using the provided % function and plot some internal variables % * \author Javier Arribas, Marc Sales 2014. jarribas(at)cttc.es % marcsales92@gmail.com % * ------------------------------------------------------------------------- % * % * Copyright (C) 2010-2014 (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 . % * % * ------------------------------------------------------------------------- % */ close all; clear all; samplingFreq = 64e6/32; %[Hz] channels=1; %path='/home/javier/workspace/gnss-sdr/trunk/install/'; path='/home/marc/git/gnss-sdr/data/'; clear PRN_absolute_sample_start; for N=1:1:channels tracking_log_path=[path 'e5a_tracking_ch_' num2str(N-1) '.dat']; GNSS_tracking(N)= gps_l1_ca_dll_pll_read_tracking_dump_64bits(tracking_log_path); end % GNSS-SDR format conversion to MATLAB GPS receiver for N=1:1:channels trackResults(N).status='T'; %fake track trackResults(N).codeFreq=GNSS_tracking(N).code_freq_hz.'; trackResults(N).carrFreq=GNSS_tracking(N).carrier_doppler_hz.'; trackResults(N).dllDiscr = GNSS_tracking(N).code_error.'; trackResults(N).dllDiscrFilt = GNSS_tracking(N).code_nco.'; trackResults(N).pllDiscr = GNSS_tracking(N).carr_error.'; trackResults(N).pllDiscrFilt = GNSS_tracking(N).carr_nco.'; trackResults(N).I_PN=GNSS_tracking(N).prompt_I.'; trackResults(N).Q_PN=GNSS_tracking(N).prompt_Q.'; trackResults(N).Q_P=zeros(1,length(GNSS_tracking(N).P)); trackResults(N).I_P=GNSS_tracking(N).P.'; trackResults(N).I_E= GNSS_tracking(N).E.'; trackResults(N).I_L = GNSS_tracking(N).L.'; trackResults(N).Q_E = zeros(1,length(GNSS_tracking(N).E)); trackResults(N).Q_L =zeros(1,length(GNSS_tracking(N).E)); trackResults(N).PRN=N; %fake PRN % Use original MATLAB tracking plot function settings.numberOfChannels=channels; settings.msToProcess=length(GNSS_tracking(N).E); plotTrackingE5a(N,trackResults,settings) end for N=1:1:channels % figure; % plot([GNSS_tracking(N).E,GNSS_tracking(N).P,GNSS_tracking(N).L],'-*'); % title(['Early, Prompt, and Late correlator absolute value output for channel ' num2str(N)']); % figure; % plot(GNSS_tracking(N).prompt_I,GNSS_tracking(N).prompt_Q,'+'); % title(['Navigation constellation plot for channel ' num2str(N)]); % figure; % % plot(GNSS_tracking(N).prompt_Q,'r'); % hold on; % plot(GNSS_tracking(N).prompt_I); % title(['Navigation symbols I(red) Q(blue) for channel ' num2str(N)]); % figure; t=0:length(GNSS_tracking(N).carrier_doppler_hz)-1; t=t/1000; plot(t,GNSS_tracking(N).carrier_doppler_hz/1000); xlabel('Time(s)');ylabel('Doppler(KHz)');title(['Doppler frequency channel ' num2str(N)]); endgnss-sdr-0.0.9/src/utils/matlab/gps_l1_ca_dll_fll_pll_plot_sample.m000066400000000000000000000105301305042567700254230ustar00rootroot00000000000000% /*! % * \file gps_l1_ca_dll_fll_pll_plot_sample.m % * \brief Read GNSS-SDR Tracking dump binary file using the provided % function and plot some internal variables % * \author Javier Arribas, 2011. jarribas(at)cttc.es % * ------------------------------------------------------------------------- % * % * Copyright (C) 2010-2011 (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 . % * % * ------------------------------------------------------------------------- % */ %close all; %clear all; samplingFreq = 64e6/16; %[Hz] channels=4; path='/home/javier/workspace/gnss-sdr-ref/trunk/install/'; for N=1:1:channels tracking_log_path=[path 'tracking_ch_' num2str(N-1) '.dat']; GNSS_tracking(N)= gps_l1_ca_dll_fll_pll_read_tracking_dump(tracking_log_path,samplingFreq); end % GNSS-SDR format conversion to MATLAB GPS receiver channel_PRN_ID=[32,14,20,11]; tracking_loop_start=1;%10001; tracking_loop_end=70000; for N=1:1:channels trackResults_sdr(N).status='T'; %fake track trackResults_sdr(N).codeFreq=GNSS_tracking(N).code_freq_hz(tracking_loop_start:tracking_loop_end).'; trackResults_sdr(N).carrFreq=GNSS_tracking(N).carrier_doppler_hz(tracking_loop_start:tracking_loop_end).'; trackResults_sdr(N).dllDiscr = GNSS_tracking(N).code_error_chips(tracking_loop_start:tracking_loop_end).'; trackResults_sdr(N).dllDiscrFilt = GNSS_tracking(N).code_phase_samples(tracking_loop_start:tracking_loop_end).'; trackResults_sdr(N).pllDiscr = GNSS_tracking(N).PLL_discriminator_hz(tracking_loop_start:tracking_loop_end).'; trackResults_sdr(N).pllDiscrFilt = GNSS_tracking(N).carr_nco(tracking_loop_start:tracking_loop_end).'; trackResults_sdr(N).absoluteSample = (GNSS_tracking(N).var2(tracking_loop_start:tracking_loop_end)+GNSS_tracking(N).var1(tracking_loop_start:tracking_loop_end)).'; trackResults_sdr(N).prn_delay_ms = 1000*trackResults_sdr(N).absoluteSample/samplingFreq; %trackResults_sdr(N).absoluteSample = (GNSS_tracking(N).PRN_start_sample(tracking_loop_start:tracking_loop_end)+GNSS_tracking(N).var1(tracking_loop_start:tracking_loop_end)).'; trackResults_sdr(N).I_P=GNSS_tracking(N).prompt_I(tracking_loop_start:tracking_loop_end).'; trackResults_sdr(N).Q_P=GNSS_tracking(N).prompt_Q(tracking_loop_start:tracking_loop_end).'; trackResults_sdr(N).I_E= GNSS_tracking(N).E(tracking_loop_start:tracking_loop_end).'; trackResults_sdr(N).I_L = GNSS_tracking(N).L(tracking_loop_start:tracking_loop_end).'; trackResults_sdr(N).Q_E = zeros(1,tracking_loop_end-tracking_loop_start+1); trackResults_sdr(N).Q_L =zeros(1,tracking_loop_end-tracking_loop_start+1); trackResults_sdr(N).PRN=channel_PRN_ID(N); % Use original MATLAB tracking plot function settings.numberOfChannels=channels; settings.msToProcess=tracking_loop_end-tracking_loop_start+1; %plotTracking(N,trackResults_sdr,settings) end % for N=1:1:channels % figure; % plot([GNSS_tracking(N).E,GNSS_tracking(N).P,GNSS_tracking(N).L],'-*'); % title(['Early, Prompt, and Late correlator absolute value output for channel ' num2str(N)']); % figure; % plot(GNSS_tracking(N).prompt_I,GNSS_tracking(N).prompt_Q,'+'); % title(['Navigation constellation plot for channel ' num2str(N)]); % figure; % % plot(GNSS_tracking(N).prompt_Q,'r'); % hold on; % plot(GNSS_tracking(N).prompt_I); % title(['Navigation symbols I(red) Q(blue) for channel ' num2str(N)]); % end gnss-sdr-0.0.9/src/utils/matlab/gps_l1_ca_dll_pll_plot_sample.m000066400000000000000000000064521305042567700245760ustar00rootroot00000000000000% /*! % * \file gps_l1_ca_dll_pll_plot_sample.m % * \brief Read GNSS-SDR Tracking dump binary file using the provided % function and plot some internal variables % * \author Javier Arribas, 2011. jarribas(at)cttc.es % * ------------------------------------------------------------------------- % * % * Copyright (C) 2010-2011 (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 . % * % * ------------------------------------------------------------------------- % */ close all; clear all; samplingFreq = 64e6/16; %[Hz] channels=4; path='/home/javier/workspace/gnss-sdr/trunk/install/'; clear PRN_absolute_sample_start; for N=1:1:channels tracking_log_path=[path 'tracking_ch_' num2str(N-1) '.dat']; GNSS_tracking(N)= gps_l1_ca_dll_pll_read_tracking_dump(tracking_log_path); end % GNSS-SDR format conversion to MATLAB GPS receiver for N=1:1:channels trackResults(N).status='T'; %fake track trackResults(N).codeFreq=GNSS_tracking(N).code_freq_hz.'; trackResults(N).carrFreq=GNSS_tracking(N).carrier_doppler_hz.'; trackResults(N).dllDiscr = GNSS_tracking(N).code_error.'; trackResults(N).dllDiscrFilt = GNSS_tracking(N).code_nco.'; trackResults(N).pllDiscr = GNSS_tracking(N).carr_error.'; trackResults(N).pllDiscrFilt = GNSS_tracking(N).carr_nco.'; trackResults(N).I_P=GNSS_tracking(N).prompt_I.'; trackResults(N).Q_P=GNSS_tracking(N).prompt_Q.'; trackResults(N).I_E= GNSS_tracking(N).E.'; trackResults(N).I_L = GNSS_tracking(N).L.'; trackResults(N).Q_E = zeros(1,length(GNSS_tracking(N).E)); trackResults(N).Q_L =zeros(1,length(GNSS_tracking(N).E)); trackResults(N).PRN=N; %fake PRN % Use original MATLAB tracking plot function settings.numberOfChannels=channels; settings.msToProcess=length(GNSS_tracking(N).E); plotTracking(N,trackResults,settings) end % for N=1:1:channels % figure; % plot([GNSS_tracking(N).E,GNSS_tracking(N).P,GNSS_tracking(N).L],'-*'); % title(['Early, Prompt, and Late correlator absolute value output for channel ' num2str(N)']); % figure; % plot(GNSS_tracking(N).prompt_I,GNSS_tracking(N).prompt_Q,'+'); % title(['Navigation constellation plot for channel ' num2str(N)]); % figure; % % plot(GNSS_tracking(N).prompt_Q,'r'); % hold on; % plot(GNSS_tracking(N).prompt_I); % title(['Navigation symbols I(red) Q(blue) for channel ' num2str(N)]); % end gnss-sdr-0.0.9/src/utils/matlab/gps_l1_ca_dll_pll_plot_sample_64bits.m000066400000000000000000000071041305042567700257640ustar00rootroot00000000000000% /*! % * \file gps_l1_ca_dll_pll_plot_sample_64bits.m % * \brief Read GNSS-SDR Tracking dump binary file using the provided % function and plot some internal variables % * \author Javier Arribas, 2011. jarribas(at)cttc.es % * ------------------------------------------------------------------------- % * % * Copyright (C) 2010-2011 (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 . % * % * ------------------------------------------------------------------------- % */ close all; clear all; samplingFreq = 64e6/32; %[Hz] channels=1; %path='/home/javier/workspace/gnss-sdr/trunk/install/'; path='/home/luis/dev/gnss-sdr/trunk/data/'; clear PRN_absolute_sample_start; for N=1:1:channels tracking_log_path=[path 'tracking_ch_' num2str(N-1) '.dat']; GNSS_tracking(N)= gps_l1_ca_dll_pll_read_tracking_dump_64bits(tracking_log_path); end % GNSS-SDR format conversion to MATLAB GPS receiver for N=1:1:channels trackResults(N).status='T'; %fake track trackResults(N).codeFreq=GNSS_tracking(N).code_freq_hz.'; trackResults(N).carrFreq=GNSS_tracking(N).carrier_doppler_hz.'; trackResults(N).dllDiscr = GNSS_tracking(N).code_error.'; trackResults(N).dllDiscrFilt = GNSS_tracking(N).code_nco.'; trackResults(N).pllDiscr = GNSS_tracking(N).carr_error.'; trackResults(N).pllDiscrFilt = GNSS_tracking(N).carr_nco.'; trackResults(N).I_P=GNSS_tracking(N).prompt_I.'; trackResults(N).Q_P=GNSS_tracking(N).prompt_Q.'; trackResults(N).I_E= GNSS_tracking(N).E.'; trackResults(N).I_L = GNSS_tracking(N).L.'; trackResults(N).Q_E = zeros(1,length(GNSS_tracking(N).E)); trackResults(N).Q_L =zeros(1,length(GNSS_tracking(N).E)); trackResults(N).PRN=N; %fake PRN % Use original MATLAB tracking plot function settings.numberOfChannels=channels; settings.msToProcess=length(GNSS_tracking(N).E); plotTracking(N,trackResults,settings) end for N=1:1:channels % figure; % plot([GNSS_tracking(N).E,GNSS_tracking(N).P,GNSS_tracking(N).L],'-*'); % title(['Early, Prompt, and Late correlator absolute value output for channel ' num2str(N)']); % figure; % plot(GNSS_tracking(N).prompt_I,GNSS_tracking(N).prompt_Q,'+'); % title(['Navigation constellation plot for channel ' num2str(N)]); % figure; % % plot(GNSS_tracking(N).prompt_Q,'r'); % hold on; % plot(GNSS_tracking(N).prompt_I); % title(['Navigation symbols I(red) Q(blue) for channel ' num2str(N)]); % figure; t=0:length(GNSS_tracking(N).carrier_doppler_hz)-1; t=t/1000; plot(t,GNSS_tracking(N).carrier_doppler_hz/1000); xlabel('Time(s)');ylabel('Doppler(KHz)');title(['Doppler frequency channel ' num2str(N)]); end gnss-sdr-0.0.9/src/utils/matlab/gps_l1_ca_observables_plot_sample.m000066400000000000000000000004231305042567700254530ustar00rootroot00000000000000% Read observables dump %clear all; samplingFreq = 64e6/16; %[Hz] channels=4; path='/home/gnss/workspace/gnss-sdr/trunk/install/'; observables_log_path=[path 'observables.dat']; GNSS_observables= gps_l1_ca_read_observables_dump(channels,observables_log_path); gnss-sdr-0.0.9/src/utils/matlab/gps_l1_ca_pvt_plot_sample_agilent_cap2.m000066400000000000000000000053341305042567700263730ustar00rootroot00000000000000% /*! % * \file gps_l1_ca_pvt_plot_sample.m % * \brief Read GNSS-SDR PVT dump binary file using the provided % function and plot some internal variables % * \author Javier Arribas, 2011. jarribas(at)cttc.es % * ------------------------------------------------------------------------- % * % * Copyright (C) 2010-2011 (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 . % * % * ------------------------------------------------------------------------- % */ close all; clear all; % True position of the antenna in UTM system (if known). Otherwise enter % all NaN's and mean position will be used as a reference . settings.truePosition.E = nan; settings.truePosition.N = nan; settings.truePosition.U = nan; settings.navSolPeriod=100; %[ms] filename='/home/javier/workspace/gnss-sdr/trunk/install/PVT.dat'; navSolutions = gps_l1_ca_pvt_read_pvt_dump (filename); % Reference position for Agilent cap2.dat (San Francisco static scenario) % Scenario latitude is 37.8194388888889 N37 49 9.98 % Scenario longitude is -122.4784944 W122 28 42.58 % Scenario elevation is 35 meters. lat=[37 49 9.98]; long=[-122 -28 -42.58]; lat_deg=dms2deg(lat); long_deg=dms2deg(long); h=35; %Choices i of Reference Ellipsoid % 1. International Ellipsoid 1924 % 2. International Ellipsoid 1967 % 3. World Geodetic System 1972 % 4. Geodetic Reference System 1980 % 5. World Geodetic System 1984 [X, Y, Z]=geo2cart(lat, long, h, 5); % geographical to cartesian conversion %=== Convert to UTM coordinate system ============================= utmZone = findUtmZone(lat_deg, long_deg); [settings.truePosition.E, ... settings.truePosition.N, ... settings.truePosition.U] = cart2utm(X, Y, Z, utmZone); for k=1:1:length(navSolutions.X) [navSolutions.E(k), ... navSolutions.N(k), ... navSolutions.U(k)]=cart2utm(navSolutions.X(k), navSolutions.Y(k), navSolutions.Z(k), utmZone); end plot_skyplot=0; plotNavigation(navSolutions,settings,plot_skyplot); gnss-sdr-0.0.9/src/utils/matlab/gps_l1_ca_pvt_raw_plot_sample.m000066400000000000000000000004011305042567700246220ustar00rootroot00000000000000% Read PVG raw dump %clear all; samplingFreq = 64e6/16; %[Hz] channels=4; path='/home/javier/workspace/gnss-sdr-ref/trunk/install/'; pvt_raw_log_path=[path 'PVT_raw.dat']; GNSS_PVT_raw= gps_l1_ca_read_pvt_raw_dump(channels,pvt_raw_log_path); gnss-sdr-0.0.9/src/utils/matlab/gps_l1_ca_telemetry_plot_sample.m000066400000000000000000000031611305042567700251600ustar00rootroot00000000000000% /*! % * \file gps_l1_ca_dll_fll_pll_plot_sample.m % * \brief Read GNSS-SDR Tracking dump binary file using the provided % function and plot some internal variables % * \author Javier Arribas, 2011. jarribas(at)cttc.es % * ------------------------------------------------------------------------- % * % * Copyright (C) 2010-2011 (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 . % * % * ------------------------------------------------------------------------- % */ %close all; %clear all; samplingFreq = 64e6/16; %[Hz] channels=4; path='/home/javier/workspace/gnss-sdr-ref/trunk/install/'; clear PRN_absolute_sample_start; for N=1:1:channels telemetry_log_path=[path 'telemetry' num2str(N-1) '.dat']; GNSS_telemetry(N)= gps_l1_ca_read_telemetry_dump(telemetry_log_path); end gnss-sdr-0.0.9/src/utils/matlab/help_script1.m000066400000000000000000000021441305042567700212340ustar00rootroot00000000000000%help script to compare GNSS-SDR Preambles starts channel=3; % From GNSS_SDR telemetry decoder % 1 find preambles indexes preambles_index=find(GNSS_telemetry(channel).Preamble_symbol_counter==0); % 2 Get associated timestamp ms preambles_timestamp_sdr_ms=GNSS_telemetry(channel).prn_delay_ms(preambles_index); % From Matlab receiver [firstSubFrame, activeChnList, javi_subFrameStart_sample] = findPreambles(trackResults_sdr,settings); preambles_timestamp_matlab_ms=trackResults_sdr(channel).prn_delay_ms(javi_subFrameStart_sample(channel,1:6)); %Compare common_start_index=max(find(abs(preambles_timestamp_sdr_ms-preambles_timestamp_matlab_ms(1))<2000)); error_ms=preambles_timestamp_sdr_ms(common_start_index:(common_start_index+length(preambles_timestamp_matlab_ms)-1))-preambles_timestamp_matlab_ms.' % figure % stem(tracking_loop_start+javi_subFrameStart_sample(channel,:),1000*trackResults_sdr(channel).absoluteSample(javi_subFrameStart_sample(channel,:))/settings.samplingFreq); % % hold on; % % plot(GNSS_observables.preamble_delay_ms(channel,:)); % % plot(GNSS_observables.prn_delay_ms(channel,:),'r')gnss-sdr-0.0.9/src/utils/matlab/help_script2.m000066400000000000000000000003531305042567700212350ustar00rootroot00000000000000% compare pseudoranges close all; % GNSS SDR plot(GNSS_PVT_raw.tx_time(1,1:300).'-200/settings.samplingFreq,GNSS_PVT_raw.Pseudorange_m(1,1:300).') % MATLAB hold on; plot(navSolutions.transmitTime,navSolutions.channel.rawP(1,:),'g') gnss-sdr-0.0.9/src/utils/matlab/libs/000077500000000000000000000000001305042567700174115ustar00rootroot00000000000000gnss-sdr-0.0.9/src/utils/matlab/libs/galileo_e1_dll_pll_veml_read_tracking_dump.m000066400000000000000000000212051305042567700302170ustar00rootroot00000000000000% /*! % * \file galileo_e1_dll_pll_veml_read_tracking_dump.m % * \brief Read GNSS-SDR Tracking dump binary file into MATLAB. % * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com % * ------------------------------------------------------------------------- % * % * Copyright (C) 2010-2012 (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 . % * % * ------------------------------------------------------------------------- % */ function [GNSS_tracking] = galileo_e1_dll_pll_veml_read_tracking_dump (filename, count) %% usage: galileo_e1_dll_pll_veml_read_tracking_dump (filename, [count]) %% %% open GNSS-SDR tracking binary log file .dat and return the contents %% m = nargchk (1,2,nargin); num_float_vars=17; num_unsigned_long_int_vars=1; num_double_vars=1; double_size_bytes=8; unsigned_long_int_size_bytes=8; float_size_bytes=4; skip_bytes_each_read=float_size_bytes*num_float_vars+unsigned_long_int_size_bytes*num_unsigned_long_int_vars+double_size_bytes*num_double_vars; bytes_shift=0; if (m) usage (m); end if (nargin < 2) count = Inf; end %loops_counter = fread (f, count, 'uint32',4*12); f = fopen (filename, 'rb'); if (f < 0) else v1 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v2 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v3 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v4 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v5 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v6 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v7 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v8 = fread (f, count, 'uint64',skip_bytes_each_read-unsigned_long_int_size_bytes); bytes_shift=bytes_shift+unsigned_long_int_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v9 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v10 = fread (f, count, '*float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v11 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v12 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v13 = fread (f, count, '*float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v14 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v15 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v16 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v17 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v18 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v19 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); fclose (f); %%%%%%%% output vars %%%%%%%% % // EPR % d_dump_file.write((char*)&tmp_VE, sizeof(float)); % d_dump_file.write((char*)&tmp_E, sizeof(float)); % d_dump_file.write((char*)&tmp_P, sizeof(float)); % d_dump_file.write((char*)&tmp_L, sizeof(float)); % d_dump_file.write((char*)&tmp_VL, sizeof(float)); % // PROMPT I and Q (to analyze navigation symbols) % d_dump_file.write((char*)&prompt_I, sizeof(float)); % d_dump_file.write((char*)&prompt_Q, sizeof(float)); % // PRN start sample stamp % //tmp_float=(float)d_sample_counter; % d_dump_file.write((char*)&d_sample_counter, sizeof(unsigned long int)); % // accumulated carrier phase % d_dump_file.write((char*)&d_acc_carrier_phase_rad, sizeof(float)); % % // carrier and code frequency % d_dump_file.write((char*)&d_carrier_doppler_hz, sizeof(float)); % d_dump_file.write((char*)&d_code_freq_hz, sizeof(float)); % % //PLL commands % d_dump_file.write((char*)&carr_error, sizeof(float)); % d_dump_file.write((char*)&carr_nco, sizeof(float)); % % //DLL commands % d_dump_file.write((char*)&code_error, sizeof(float)); % d_dump_file.write((char*)&code_nco, sizeof(float)); % % // CN0 and carrier lock test % d_dump_file.write((char*)&d_CN0_SNV_dB_Hz, sizeof(float)); % d_dump_file.write((char*)&d_carrier_lock_test, sizeof(float)); % % // AUX vars (for debug purposes) % tmp_float = d_rem_code_phase_samples; % d_dump_file.write((char*)&tmp_float, sizeof(float)); % tmp_double=(double)(d_sample_counter+d_current_prn_length_samples); % d_dump_file.write((char*)&tmp_double, sizeof(double)); VE=v1; E=v2; P=v3; L=v4; VL=v5; prompt_I=v6; prompt_Q=v7; PRN_start_sample=v8; acc_carrier_phase_rad=v9; carrier_doppler_hz=v10; code_freq_hz=v11; carr_error=v12; carr_nco=v13; code_error=v14; code_nco=v15; CN0_SNV_dB_Hz=v16; carrier_lock_test=v17; var1=v18; var2=v19; GNSS_tracking.VE=VE; GNSS_tracking.E=E; GNSS_tracking.P=P; GNSS_tracking.L=L; GNSS_tracking.VL=VL; GNSS_tracking.prompt_I=prompt_I; GNSS_tracking.prompt_Q=prompt_Q; GNSS_tracking.PRN_start_sample=PRN_start_sample; GNSS_tracking.acc_carrier_phase_rad=acc_carrier_phase_rad; GNSS_tracking.carrier_doppler_hz=carrier_doppler_hz; GNSS_tracking.code_freq_hz=code_freq_hz; GNSS_tracking.carr_error=carr_error; GNSS_tracking.carr_nco=carr_nco; GNSS_tracking.code_error=code_error; GNSS_tracking.code_nco=code_nco; GNSS_tracking.CN0_SNV_dB_Hz=CN0_SNV_dB_Hz; GNSS_tracking.carrier_lock_test=carrier_lock_test; GNSS_tracking.var1=var1; GNSS_tracking.var2=var2; end gnss-sdr-0.0.9/src/utils/matlab/libs/galileo_e1_dll_pll_veml_read_tracking_dump_32bits.m000066400000000000000000000212141305042567700314050ustar00rootroot00000000000000% /*! % * \file galileo_e1_dll_pll_veml_read_tracking_dump.m % * \brief Read GNSS-SDR Tracking dump binary file into MATLAB. % * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com % * ------------------------------------------------------------------------- % * % * Copyright (C) 2010-2012 (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 . % * % * ------------------------------------------------------------------------- % */ function [GNSS_tracking] = galileo_e1_dll_pll_veml_read_tracking_dump_32bits (filename, count) %% usage: galileo_e1_dll_pll_veml_read_tracking_dump (filename, [count]) %% %% open GNSS-SDR tracking binary log file .dat and return the contents %% m = nargchk (1,2,nargin); num_float_vars=17; num_unsigned_long_int_vars=1; num_double_vars=1; double_size_bytes=8; unsigned_long_int_size_bytes=4; float_size_bytes=4; skip_bytes_each_read=float_size_bytes*num_float_vars+unsigned_long_int_size_bytes*num_unsigned_long_int_vars+double_size_bytes*num_double_vars; bytes_shift=0; if (m) usage (m); end if (nargin < 2) count = Inf; end %loops_counter = fread (f, count, 'uint32',4*12); f = fopen (filename, 'rb'); if (f < 0) else v1 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v2 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v3 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v4 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v5 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v6 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v7 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v8 = fread (f, count, 'uint32',skip_bytes_each_read-unsigned_long_int_size_bytes); bytes_shift=bytes_shift+unsigned_long_int_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v9 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v10 = fread (f, count, '*float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v11 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v12 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v13 = fread (f, count, '*float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v14 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v15 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v16 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v17 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v18 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v19 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); fclose (f); %%%%%%%% output vars %%%%%%%% % // EPR % d_dump_file.write((char*)&tmp_VE, sizeof(float)); % d_dump_file.write((char*)&tmp_E, sizeof(float)); % d_dump_file.write((char*)&tmp_P, sizeof(float)); % d_dump_file.write((char*)&tmp_L, sizeof(float)); % d_dump_file.write((char*)&tmp_VL, sizeof(float)); % // PROMPT I and Q (to analyze navigation symbols) % d_dump_file.write((char*)&prompt_I, sizeof(float)); % d_dump_file.write((char*)&prompt_Q, sizeof(float)); % // PRN start sample stamp % //tmp_float=(float)d_sample_counter; % d_dump_file.write((char*)&d_sample_counter, sizeof(unsigned long int)); % // accumulated carrier phase % d_dump_file.write((char*)&d_acc_carrier_phase_rad, sizeof(float)); % % // carrier and code frequency % d_dump_file.write((char*)&d_carrier_doppler_hz, sizeof(float)); % d_dump_file.write((char*)&d_code_freq_hz, sizeof(float)); % % //PLL commands % d_dump_file.write((char*)&carr_error, sizeof(float)); % d_dump_file.write((char*)&carr_nco, sizeof(float)); % % //DLL commands % d_dump_file.write((char*)&code_error, sizeof(float)); % d_dump_file.write((char*)&code_nco, sizeof(float)); % % // CN0 and carrier lock test % d_dump_file.write((char*)&d_CN0_SNV_dB_Hz, sizeof(float)); % d_dump_file.write((char*)&d_carrier_lock_test, sizeof(float)); % % // AUX vars (for debug purposes) % tmp_float = d_rem_code_phase_samples; % d_dump_file.write((char*)&tmp_float, sizeof(float)); % tmp_double=(double)(d_sample_counter+d_current_prn_length_samples); % d_dump_file.write((char*)&tmp_double, sizeof(double)); VE=v1; E=v2; P=v3; L=v4; VL=v5; prompt_I=v6; prompt_Q=v7; PRN_start_sample=v8; acc_carrier_phase_rad=v9; carrier_doppler_hz=v10; code_freq_hz=v11; carr_error=v12; carr_nco=v13; code_error=v14; code_nco=v15; CN0_SNV_dB_Hz=v16; carrier_lock_test=v17; var1=v18; var2=v19; GNSS_tracking.VE=VE; GNSS_tracking.E=E; GNSS_tracking.P=P; GNSS_tracking.L=L; GNSS_tracking.VL=VL; GNSS_tracking.prompt_I=prompt_I; GNSS_tracking.prompt_Q=prompt_Q; GNSS_tracking.PRN_start_sample=PRN_start_sample; GNSS_tracking.acc_carrier_phase_rad=acc_carrier_phase_rad; GNSS_tracking.carrier_doppler_hz=carrier_doppler_hz; GNSS_tracking.code_freq_hz=code_freq_hz; GNSS_tracking.carr_error=carr_error; GNSS_tracking.carr_nco=carr_nco; GNSS_tracking.code_error=code_error; GNSS_tracking.code_nco=code_nco; GNSS_tracking.CN0_SNV_dB_Hz=CN0_SNV_dB_Hz; GNSS_tracking.carrier_lock_test=carrier_lock_test; GNSS_tracking.var1=var1; GNSS_tracking.var2=var2; end gnss-sdr-0.0.9/src/utils/matlab/libs/geoFunctions/000077500000000000000000000000001305042567700220545ustar00rootroot00000000000000gnss-sdr-0.0.9/src/utils/matlab/libs/geoFunctions/cart2geo.m000066400000000000000000000035731305042567700237500ustar00rootroot00000000000000function [phi, lambda, h] = cart2geo(X, Y, Z, i) %CART2GEO Conversion of Cartesian coordinates (X,Y,Z) to geographical %coordinates (phi, lambda, h) on a selected reference ellipsoid. % %[phi, lambda, h] = cart2geo(X, Y, Z, i); % % Choices i of Reference Ellipsoid for Geographical Coordinates % 1. International Ellipsoid 1924 % 2. International Ellipsoid 1967 % 3. World Geodetic System 1972 % 4. Geodetic Reference System 1980 % 5. World Geodetic System 1984 %Kai Borre 10-13-98 %Copyright (c) by Kai Borre %Revision: 1.0 Date: 1998/10/23 % % CVS record: % $Id: cart2geo.m,v 1.1.2.3 2007/01/29 15:22:49 dpl Exp $ %========================================================================== a = [6378388 6378160 6378135 6378137 6378137]; f = [1/297 1/298.247 1/298.26 1/298.257222101 1/298.257223563]; lambda = atan2(Y,X); ex2 = (2-f(i))*f(i)/((1-f(i))^2); c = a(i)*sqrt(1+ex2); phi = atan(Z/((sqrt(X^2+Y^2)*(1-(2-f(i)))*f(i)))); h = 0.1; oldh = 0; iterations = 0; while abs(h-oldh) > 1.e-12 oldh = h; N = c/sqrt(1+ex2*cos(phi)^2); phi = atan(Z/((sqrt(X^2+Y^2)*(1-(2-f(i))*f(i)*N/(N+h))))); h = sqrt(X^2+Y^2)/cos(phi)-N; iterations = iterations + 1; if iterations > 100 fprintf('Failed to approximate h with desired precision. h-oldh: %e.\n', h-oldh); break; end end phi = phi*180/pi; % b = zeros(1,3); % b(1,1) = fix(phi); % b(2,1) = fix(rem(phi,b(1,1))*60); % b(3,1) = (phi-b(1,1)-b(1,2)/60)*3600; lambda = lambda*180/pi; % l = zeros(1,3); % l(1,1) = fix(lambda); % l(2,1) = fix(rem(lambda,l(1,1))*60); % l(3,1) = (lambda-l(1,1)-l(1,2)/60)*3600; %fprintf('\n phi =%3.0f %3.0f %8.5f',b(1),b(2),b(3)) %fprintf('\n lambda =%3.0f %3.0f %8.5f',l(1),l(2),l(3)) %fprintf('\n h =%14.3f\n',h) %%%%%%%%%%%%%% end cart2geo.m %%%%%%%%%%%%%%%%%%% gnss-sdr-0.0.9/src/utils/matlab/libs/geoFunctions/cart2utm.m000066400000000000000000000121761305042567700240020ustar00rootroot00000000000000function [E, N, U] = cart2utm(X, Y, Z, zone) %CART2UTM Transformation of (X,Y,Z) to (N,E,U) in UTM, zone 'zone'. % %[E, N, U] = cart2utm(X, Y, Z, zone); % % Inputs: % X,Y,Z - Cartesian coordinates. Coordinates are referenced % with respect to the International Terrestrial Reference % Frame 1996 (ITRF96) % zone - UTM zone of the given position % % Outputs: % E, N, U - UTM coordinates (Easting, Northing, Uping) %Kai Borre -11-1994 %Copyright (c) by Kai Borre % % CVS record: % $Id: cart2utm.m,v 1.1.1.1.2.6 2007/01/30 09:45:12 dpl Exp $ %This implementation is based upon %O. Andersson & K. Poder (1981) Koordinattransformationer % ved Geod\ae{}tisk Institut. Landinspekt\oe{}ren % Vol. 30: 552--571 and Vol. 31: 76 % %An excellent, general reference (KW) is %R. Koenig & K.H. Weise (1951) Mathematische Grundlagen der % h\"oheren Geod\"asie und Kartographie. % Erster Band, Springer Verlag % Explanation of variables used: % f flattening of ellipsoid % a semi major axis in m % m0 1 - scale at central meridian; for UTM 0.0004 % Q_n normalized meridian quadrant % E0 Easting of central meridian % L0 Longitude of central meridian % bg constants for ellipsoidal geogr. to spherical geogr. % gb constants for spherical geogr. to ellipsoidal geogr. % gtu constants for ellipsoidal N, E to spherical N, E % utg constants for spherical N, E to ellipoidal N, E % tolutm tolerance for utm, 1.2E-10*meridian quadrant % tolgeo tolerance for geographical, 0.00040 second of arc % B, L refer to latitude and longitude. Southern latitude is negative % International ellipsoid of 1924, valid for ED50 a = 6378388; f = 1/297; ex2 = (2-f)*f / ((1-f)^2); c = a * sqrt(1+ex2); vec = [X; Y; Z-4.5]; alpha = .756e-6; R = [ 1 -alpha 0; alpha 1 0; 0 0 1]; trans = [89.5; 93.8; 127.6]; scale = 0.9999988; v = scale*R*vec + trans; % coordinate vector in ED50 L = atan2(v(2), v(1)); N1 = 6395000; % preliminary value B = atan2(v(3)/((1-f)^2*N1), norm(v(1:2))/N1); % preliminary value U = 0.1; oldU = 0; iterations = 0; while abs(U-oldU) > 1.e-4 oldU = U; N1 = c/sqrt(1+ex2*(cos(B))^2); B = atan2(v(3)/((1-f)^2*N1+U), norm(v(1:2))/(N1+U) ); U = norm(v(1:2))/cos(B)-N1; iterations = iterations + 1; if iterations > 100 fprintf('Failed to approximate U with desired precision. U-oldU: %e.\n', U-oldU); break; end end %Normalized meridian quadrant, KW p. 50 (96), p. 19 (38b), p. 5 (21) m0 = 0.0004; n = f / (2-f); m = n^2 * (1/4 + n*n/64); w = (a*(-n-m0+m*(1-m0))) / (1+n); Q_n = a + w; %Easting and longitude of central meridian E0 = 500000; L0 = (zone-30)*6 - 3; %Check tolerance for reverse transformation tolutm = pi/2 * 1.2e-10 * Q_n; tolgeo = 0.000040; %Coefficients of trigonometric series %ellipsoidal to spherical geographical, KW p. 186--187, (51)-(52) % bg[1] = n*(-2 + n*(2/3 + n*(4/3 + n*(-82/45)))); % bg[2] = n^2*(5/3 + n*(-16/15 + n*(-13/9))); % bg[3] = n^3*(-26/15 + n*34/21); % bg[4] = n^4*1237/630; %spherical to ellipsoidal geographical, KW p. 190--191, (61)-(62) % gb[1] = n*(2 + n*(-2/3 + n*(-2 + n*116/45))); % gb[2] = n^2*(7/3 + n*(-8/5 + n*(-227/45))); % gb[3] = n^3*(56/15 + n*(-136/35)); % gb[4] = n^4*4279/630; %spherical to ellipsoidal N, E, KW p. 196, (69) % gtu[1] = n*(1/2 + n*(-2/3 + n*(5/16 + n*41/180))); % gtu[2] = n^2*(13/48 + n*(-3/5 + n*557/1440)); % gtu[3] = n^3*(61/240 + n*(-103/140)); % gtu[4] = n^4*49561/161280; %ellipsoidal to spherical N, E, KW p. 194, (65) % utg[1] = n*(-1/2 + n*(2/3 + n*(-37/96 + n*1/360))); % utg[2] = n^2*(-1/48 + n*(-1/15 + n*437/1440)); % utg[3] = n^3*(-17/480 + n*37/840); % utg[4] = n^4*(-4397/161280); %With f = 1/297 we get bg = [-3.37077907e-3; 4.73444769e-6; -8.29914570e-9; 1.58785330e-11]; gb = [ 3.37077588e-3; 6.62769080e-6; 1.78718601e-8; 5.49266312e-11]; gtu = [ 8.41275991e-4; 7.67306686e-7; 1.21291230e-9; 2.48508228e-12]; utg = [-8.41276339e-4; -5.95619298e-8; -1.69485209e-10; -2.20473896e-13]; %Ellipsoidal latitude, longitude to spherical latitude, longitude neg_geo = 'FALSE'; if B < 0 neg_geo = 'TRUE '; end Bg_r = abs(B); [res_clensin] = clsin(bg, 4, 2*Bg_r); Bg_r = Bg_r + res_clensin; L0 = L0*pi / 180; Lg_r = L - L0; %Spherical latitude, longitude to complementary spherical latitude % i.e. spherical N, E cos_BN = cos(Bg_r); Np = atan2(sin(Bg_r), cos(Lg_r)*cos_BN); Ep = atanh(sin(Lg_r) * cos_BN); %Spherical normalized N, E to ellipsoidal N, E Np = 2 * Np; Ep = 2 * Ep; [dN, dE] = clksin(gtu, 4, Np, Ep); Np = Np/2; Ep = Ep/2; Np = Np + dN; Ep = Ep + dE; N = Q_n * Np; E = Q_n*Ep + E0; if neg_geo == 'TRUE ' N = -N + 20000000; end; %%%%%%%%%%%%%%%%%%%% end cart2utm.m %%%%%%%%%%%%%%%%%%%%gnss-sdr-0.0.9/src/utils/matlab/libs/geoFunctions/check_t.m000066400000000000000000000012471305042567700236360ustar00rootroot00000000000000function corrTime = check_t(time) %CHECK_T accounting for beginning or end of week crossover. % %corrTime = check_t(time); % % Inputs: % time - time in seconds % % Outputs: % corrTime - corrected time (seconds) %Kai Borre 04-01-96 %Copyright (c) by Kai Borre % % CVS record: % $Id: check_t.m,v 1.1.1.1.2.4 2006/08/22 13:45:59 dpl Exp $ %========================================================================== half_week = 302400; % seconds corrTime = time; if time > half_week corrTime = time - 2*half_week; elseif time < -half_week corrTime = time + 2*half_week; end %%%%%%% end check_t.m %%%%%%%%%%%%%%%%%gnss-sdr-0.0.9/src/utils/matlab/libs/geoFunctions/clksin.m000066400000000000000000000016611305042567700235210ustar00rootroot00000000000000function [re, im] = clksin(ar, degree, arg_real, arg_imag) %Clenshaw summation of sinus with complex argument %[re, im] = clksin(ar, degree, arg_real, arg_imag); % Written by Kai Borre % December 20, 1995 % % See also WGS2UTM or CART2UTM % % CVS record: % $Id: clksin.m,v 1.1.1.1.2.4 2006/08/22 13:45:59 dpl Exp $ %========================================================================== sin_arg_r = sin(arg_real); cos_arg_r = cos(arg_real); sinh_arg_i = sinh(arg_imag); cosh_arg_i = cosh(arg_imag); r = 2 * cos_arg_r * cosh_arg_i; i =-2 * sin_arg_r * sinh_arg_i; hr1 = 0; hr = 0; hi1 = 0; hi = 0; for t = degree : -1 : 1 hr2 = hr1; hr1 = hr; hi2 = hi1; hi1 = hi; z = ar(t) + r*hr1 - i*hi - hr2; hi = i*hr1 + r*hi1 - hi2; hr = z; end r = sin_arg_r * cosh_arg_i; i = cos_arg_r * sinh_arg_i; re = r*hr - i*hi; im = r*hi + i*hr; gnss-sdr-0.0.9/src/utils/matlab/libs/geoFunctions/clsin.m000066400000000000000000000011531305042567700233420ustar00rootroot00000000000000function result = clsin(ar, degree, argument) %Clenshaw summation of sinus of argument. % %result = clsin(ar, degree, argument); % Written by Kai Borre % December 20, 1995 % % See also WGS2UTM or CART2UTM % % CVS record: % $Id: clsin.m,v 1.1.1.1.2.4 2006/08/22 13:45:59 dpl Exp $ %========================================================================== cos_arg = 2 * cos(argument); hr1 = 0; hr = 0; for t = degree : -1 : 1 hr2 = hr1; hr1 = hr; hr = ar(t) + cos_arg*hr1 - hr2; end result = hr * sin(argument); %%%%%%%%%%%%%%%%%%%%%%% end clsin.m %%%%%%%%%%%%%%%%%%%%%gnss-sdr-0.0.9/src/utils/matlab/libs/geoFunctions/deg2dms.m000066400000000000000000000020021305042567700235510ustar00rootroot00000000000000function dmsOutput = deg2dms(deg) %DEG2DMS Conversion of degrees to degrees, minutes, and seconds. %The output format (dms format) is: (degrees*100 + minutes + seconds/100) % Written by Kai Borre % February 7, 2001 % Updated by Darius Plausinaitis %%% Save the sign for later processing neg_arg = false; if deg < 0 % Only positive numbers should be used while spliting into deg/min/sec deg = -deg; neg_arg = true; end %%% Split degrees minutes and seconds int_deg = floor(deg); decimal = deg - int_deg; min_part = decimal*60; min = floor(min_part); sec_part = min_part - floor(min_part); sec = sec_part*60; %%% Check for overflow if sec == 60 min = min + 1; sec = 0; end if min == 60 int_deg = int_deg + 1; min = 0; end %%% Construct the output dmsOutput = int_deg * 100 + min + sec/100; %%% Correct the sign if neg_arg == true dmsOutput = -dmsOutput; end %%%%%%%%%%%%%%%%%%% end deg2dms.m %%%%%%%%%%%%%%%%gnss-sdr-0.0.9/src/utils/matlab/libs/geoFunctions/dms2deg.m000066400000000000000000000004121305042567700235540ustar00rootroot00000000000000 function deg = dms2deg(dms) %DMS2DEG Conversion of degrees, minutes, and seconds to degrees. % Written by Javier Arribas 2011 % December 7, 2011 %if (dms(1)>=0) deg=dms(1)+dms(2)/60+dms(3)/3600; %else %deg=dms(1)-dms(2)/60-dms(3)/3600; %end gnss-sdr-0.0.9/src/utils/matlab/libs/geoFunctions/dms2mat.m000066400000000000000000000065331305042567700236100ustar00rootroot00000000000000function [dout,mout,sout] = dms2mat(dms,n) %DMS2MAT Converts a dms vector format to a [deg min sec] matrix % % [d,m,s] = DMS2MAT(dms) converts a dms vector format to a % deg:min:sec matrix. The vector format is dms = 100*deg + min + sec/100. % This allows compressed dms data to be expanded to a d,m,s triple, % for easier reporting and viewing of the data. % % [d,m,s] = DMS2MAT(dms,n) uses n digits in the accuracy of the % seconds calculation. n = -2 uses accuracy in the hundredths position, % n = 0 uses accuracy in the units position. Default is n = -5. % For further discussion of the input n, see ROUNDN. % % mat = DMS2MAT(...) returns a single output argument of mat = [d m s]. % This is useful only if the input dms is a single column vector. % % See also MAT2DMS % Copyright 1996-2002 Systems Planning and Analysis, Inc. and The MathWorks, Inc. % Written by: E. Byrns, E. Brown % $Revision: 1.10 $ $Date: 2002/03/20 21:25:06 $ if nargin == 0 error('Incorrect number of arguments') elseif nargin == 1 n = -5; end % Test for empty arguments if isempty(dms); dout = []; mout = []; sout = []; return; end % Test for complex arguments if ~isreal(dms) warning('Imaginary parts of complex ANGLE argument ignored') dms = real(dms); end % Don't let seconds be rounded beyond the tens place. % If you did, then 55 seconds rounds to 100, which is not good. if n == 2; n = 1; end % Construct a sign vector which has +1 when dms >= 0 and -1 when dms < 0. signvec = sign(dms); signvec = signvec + (signvec == 0); % Ensure +1 when dms = 0 % Decompress the dms data vector dms = abs(dms); d = fix(dms/100); % Degrees m = fix(dms) - abs(100*d); % Minutes [s,msg] = roundn(100*rem(dms,1),n); % Seconds: Truncate to roundoff error if ~isempty(msg); error(msg); end % Adjust for 60 seconds or 60 minutes. % Test for seconds > 60 to allow for round-off from roundn, % Test for minutes > 60 as a ripple effect from seconds > 60 indx = find(s >= 60); if ~isempty(indx); m(indx) = m(indx) + 1; s(indx) = s(indx) - 60; end indx = find(m >= 60); if ~isempty(indx); d(indx) = d(indx) + 1; m(indx) = m(indx) - 60; end % Data consistency checks if any(m > 59) | any (m < 0) error('Minutes must be >= 0 and <= 59') elseif any(s >= 60) | any( s < 0) error('Seconds must be >= 0 and < 60') end % Determine where to store the sign of the angle. It should be % associated with the largest nonzero component of d:m:s. dsign = signvec .* (d~=0); msign = signvec .* (d==0 & m~=0); ssign = signvec .* (d==0 & m==0 & s~=0); % In the application of signs below, the comparison with 0 is used so that % the sign vector contains only +1 and -1. Any zero occurances causes % data to be lost when the sign has been applied to a higher component % of d:m:s. Use fix function to eliminate potential round-off errors. d = ((dsign==0) + dsign).*fix(d); % Apply signs to the degrees m = ((msign==0) + msign).*fix(m); % Apply signs to minutes s = ((ssign==0) + ssign).*s; % Apply signs to seconds % Set the output arguments if nargout <= 1 dout = [d m s]; elseif nargout == 3 dout = d; mout = m; sout = s; else error('Invalid number of output arguments') end gnss-sdr-0.0.9/src/utils/matlab/libs/geoFunctions/e_r_corr.m000066400000000000000000000021571305042567700240310ustar00rootroot00000000000000function X_sat_rot = e_r_corr(traveltime, X_sat) %E_R_CORR Returns rotated satellite ECEF coordinates due to Earth %rotation during signal travel time % %X_sat_rot = e_r_corr(traveltime, X_sat); % % Inputs: % travelTime - signal travel time % X_sat - satellite's ECEF coordinates % % Outputs: % X_sat_rot - rotated satellite's coordinates (ECEF) %Written by Kai Borre %Copyright (c) by Kai Borre % % CVS record: % $Id: e_r_corr.m,v 1.1.1.1.2.6 2006/08/22 13:45:59 dpl Exp $ %========================================================================== Omegae_dot = 7.292115147e-5; % rad/sec %--- Find rotation angle -------------------------------------------------- omegatau = Omegae_dot * traveltime; %--- Make a rotation matrix ----------------------------------------------- R3 = [ cos(omegatau) sin(omegatau) 0; -sin(omegatau) cos(omegatau) 0; 0 0 1]; %--- Do the rotation ------------------------------------------------------ X_sat_rot = R3 * X_sat; %%%%%%%% end e_r_corr.m %%%%%%%%%%%%%%%%%%%%gnss-sdr-0.0.9/src/utils/matlab/libs/geoFunctions/findUtmZone.m000066400000000000000000000051321305042567700244750ustar00rootroot00000000000000function utmZone = findUtmZone(latitude, longitude) %Function finds the UTM zone number for given longitude and latitude. %The longitude value must be between -180 (180 degree West) and 180 (180 %degree East) degree. The latitude must be within -80 (80 degree South) and %84 (84 degree North). % %utmZone = findUtmZone(latitude, longitude); % %Latitude and longitude must be in decimal degrees (e.g. 15.5 degrees not %15 deg 30 min). %-------------------------------------------------------------------------- % SoftGNSS v3.0 % % Copyright (C) Darius Plausinaitis % Written by Darius Plausinaitis %-------------------------------------------------------------------------- %This program is free software; you can redistribute it and/or %modify it under the terms of the GNU General Public License %as published by the Free Software Foundation; either version 2 %of the License, or (at your option) any later version. % %This program is distributed in the hope that it will be useful, %but WITHOUT ANY WARRANTY; without even the implied warranty of %MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %GNU General Public License for more details. % %You should have received a copy of the GNU General Public License %along with this program; if not, write to the Free Software %Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, %USA. %========================================================================== %CVS record: %$Id: findUtmZone.m,v 1.1.2.2 2006/08/22 13:45:59 dpl Exp $ %% Check value bounds ===================================================== if ((longitude > 180) || (longitude < -180)) error('Longitude value exceeds limits (-180:180).'); end if ((latitude > 84) || (latitude < -80)) error('Latitude value exceeds limits (-80:84).'); end %% Find zone ============================================================== % Start at 180 deg west = -180 deg utmZone = fix((180 + longitude)/ 6) + 1; %% Correct zone numbers for particular areas ============================== if (latitude > 72) % Corrections for zones 31 33 35 37 if ((longitude >= 0) && (longitude < 9)) utmZone = 31; elseif ((longitude >= 9) && (longitude < 21)) utmZone = 33; elseif ((longitude >= 21) && (longitude < 33)) utmZone = 35; elseif ((longitude >= 33) && (longitude < 42)) utmZone = 37; end elseif ((latitude >= 56) && (latitude < 64)) % Correction for zone 32 if ((longitude >= 3) && (longitude < 12)) utmZone = 32; end endgnss-sdr-0.0.9/src/utils/matlab/libs/geoFunctions/geo2cart.m000066400000000000000000000030071305042567700237400ustar00rootroot00000000000000function [X, Y, Z] = geo2cart(phi, lambda, h, i) %GEO2CART Conversion of geographical coordinates (phi, lambda, h) to %Cartesian coordinates (X, Y, Z). % %[X, Y, Z] = geo2cart(phi, lambda, h, i); % %Format for phi and lambda: [degrees minutes seconds]. %h, X, Y, and Z are in meters. % %Choices i of Reference Ellipsoid % 1. International Ellipsoid 1924 % 2. International Ellipsoid 1967 % 3. World Geodetic System 1972 % 4. Geodetic Reference System 1980 % 5. World Geodetic System 1984 % % Inputs: % phi - geocentric latitude (format [degrees minutes seconds]) % lambda - geocentric longitude (format [degrees minutes seconds]) % h - height % i - reference ellipsoid type % % Outputs: % X, Y, Z - Cartesian coordinates (meters) %Kai Borre 10-13-98 %Copyright (c) by Kai Borre % % CVS record: % $Id: geo2cart.m,v 1.1.2.7 2006/08/22 13:45:59 dpl Exp $ %========================================================================== b = phi(1) + phi(2)/60 + phi(3)/3600; b = b*pi / 180; l = lambda(1) + lambda(2)/60 + lambda(3)/3600; l = l*pi / 180; a = [6378388 6378160 6378135 6378137 6378137]; f = [1/297 1/298.247 1/298.26 1/298.257222101 1/298.257223563]; ex2 = (2-f(i))*f(i) / ((1-f(i))^2); c = a(i) * sqrt(1+ex2); N = c / sqrt(1 + ex2*cos(b)^2); X = (N+h) * cos(b) * cos(l); Y = (N+h) * cos(b) * sin(l); Z = ((1-f(i))^2*N + h) * sin(b); %%%%%%%%%%%%%% end geo2cart.m %%%%%%%%%%%%%%%%%%%%%%%% gnss-sdr-0.0.9/src/utils/matlab/libs/geoFunctions/leastSquarePos.m000066400000000000000000000105551305042567700252130ustar00rootroot00000000000000function [pos, el, az, dop] = leastSquarePos(satpos, obs, settings) %Function calculates the Least Square Solution. % %[pos, el, az, dop] = leastSquarePos(satpos, obs, settings); % % Inputs: % satpos - Satellites positions (in ECEF system: [X; Y; Z;] - % one column per satellite) % obs - Observations - the pseudorange measurements to each % satellite: % (e.g. [20000000 21000000 .... .... .... .... ....]) % settings - receiver settings % % Outputs: % pos - receiver position and receiver clock error % (in ECEF system: [X, Y, Z, dt]) % el - Satellites elevation angles (degrees) % az - Satellites azimuth angles (degrees) % dop - Dilutions Of Precision ([GDOP PDOP HDOP VDOP TDOP]) %-------------------------------------------------------------------------- % SoftGNSS v3.0 %-------------------------------------------------------------------------- %Based on Kai Borre %Copyright (c) by Kai Borre %Updated by Darius Plausinaitis, Peter Rinder and Nicolaj Bertelsen % % CVS record: % $Id: leastSquarePos.m,v 1.1.2.12 2006/08/22 13:45:59 dpl Exp $ %========================================================================== %=== Initialization ======================================================= nmbOfIterations = 7; dtr = pi/180; pos = zeros(4, 1); X = satpos; nmbOfSatellites = size(satpos, 2); A = zeros(nmbOfSatellites, 4); omc = zeros(nmbOfSatellites, 1); az = zeros(1, nmbOfSatellites); el = az; %=== Iteratively find receiver position =================================== for iter = 1:nmbOfIterations for i = 1:nmbOfSatellites if iter == 1 %--- Initialize variables at the first iteration -------------- Rot_X = X(:, i); trop = 2; else %--- Update equations ----------------------------------------- rho2 = (X(1, i) - pos(1))^2 + (X(2, i) - pos(2))^2 + ... (X(3, i) - pos(3))^2; traveltime = sqrt(rho2) / settings.c ; %--- Correct satellite position (do to earth rotation) -------- Rot_X = e_r_corr(traveltime, X(:, i)); %--- Find the elevation angel of the satellite ---------------- [az(i), el(i), dist] = topocent(pos(1:3, :), Rot_X - pos(1:3, :)); if (settings.useTropCorr == 1) %--- Calculate tropospheric correction -------------------- trop = tropo(sin(el(i) * dtr), ... 0.0, 1013.0, 293.0, 50.0, 0.0, 0.0, 0.0); else % Do not calculate or apply the tropospheric corrections trop = 0; end end % if iter == 1 ... ... else %--- Apply the corrections ---------------------------------------- omc(i) = (obs(i) - norm(Rot_X - pos(1:3), 'fro') - pos(4) - trop); %--- Construct the A matrix --------------------------------------- A(i, :) = [ (-(Rot_X(1) - pos(1))) / obs(i) ... (-(Rot_X(2) - pos(2))) / obs(i) ... (-(Rot_X(3) - pos(3))) / obs(i) ... 1 ]; end % for i = 1:nmbOfSatellites % These lines allow the code to exit gracefully in case of any errors if rank(A) ~= 4 pos = zeros(1, 4); return end %--- Find position update --------------------------------------------- x = A \ omc; %--- Apply position update -------------------------------------------- pos = pos + x; end % for iter = 1:nmbOfIterations pos = pos'; %=== Calculate Dilution Of Precision ====================================== if nargout == 4 %--- Initialize output ------------------------------------------------ dop = zeros(1, 5); %--- Calculate DOP ---------------------------------------------------- Q = inv(A'*A); dop(1) = sqrt(trace(Q)); % GDOP dop(2) = sqrt(Q(1,1) + Q(2,2) + Q(3,3)); % PDOP dop(3) = sqrt(Q(1,1) + Q(2,2)); % HDOP dop(4) = sqrt(Q(3,3)); % VDOP dop(5) = sqrt(Q(4,4)); % TDOP end gnss-sdr-0.0.9/src/utils/matlab/libs/geoFunctions/mat2dms.m000066400000000000000000000101721305042567700236020ustar00rootroot00000000000000function dmsvec = mat2dms(d,m,s,n) %MAT2DMS Converts a [deg min sec] matrix to vector format % % dms = MAT2DMS(d,m,s) converts a deg:min:sec matrix into a vector % format. The vector format is dms = 100*deg + min + sec/100. % This allows d,m,s triple to be compressed into a single value, % which can then be employed similar to a degree or radian vector. % The inputs d, m and s must be of equal size. Minutes and % second must be between 0 and 60. % % dms = MAT2DMS(mat) assumes and input matrix of [d m s]. This is % useful only for single column vectors for d, m and s. % % dms = MAT2DMS(d,m) and dms = MAT2DMS([d m]) assume that seconds % are zero, s = 0. % % dms = MAT2DMS(d,m,s,n) uses n as the accuracy of the seconds % calculation. n = -2 uses accuracy in the hundredths position, % n = 0 uses accuracy in the units position. Default is n = -5. % For further discussion of the input n, see ROUNDN. % % See also DMS2MAT % Copyright 1996-2002 Systems Planning and Analysis, Inc. and The MathWorks, Inc. % Written by: E. Byrns, E. Brown % $Revision: 1.10 $ $Date: 2002/03/20 21:25:51 $ if nargin == 0 error('Incorrect number of arguments') elseif nargin==1 if size(d,2)== 3 s = d(:,3); m = d(:,2); d = d(:,1); elseif size(d,2)== 2 m = d(:,2); d = d(:,1); s = zeros(size(d)); elseif size(d,2) == 0 d = []; m = []; s = []; else error('Single input matrices must be n-by-2 or n-by-3.'); end n = -5; elseif nargin == 2 s = zeros(size(d)); n = -5; elseif nargin == 3 n = -5; end % Test for empty arguments if isempty(d) & isempty(m) & isempty(s); dmsvec = []; return; end % Don't let seconds be rounded beyond the tens place. % If you did, then 55 seconds rounds to 100, which is not good. if n == 2; n = 1; end % Complex argument tests if any([~isreal(d) ~isreal(m) ~isreal(s)]) warning('Imaginary parts of complex ANGLE argument ignored') d = real(d); m = real(m); s = real(s); end % Dimension and value tests if ~isequal(size(d),size(m),size(s)) error('Inconsistent dimensions for input arguments') elseif any(rem(d(~isnan(d)),1) ~= 0 | rem(m(~isnan(m)),1) ~= 0) error('Degrees and minutes must be integers') end if any(abs(m) > 60) | any (abs(m) < 0) % Actually algorithm allows for error('Minutes must be >= 0 and < 60') % up to exactly 60 seconds or % 60 minutes, but the error message elseif any(abs(s) > 60) | any(abs(s) < 0) % doesn't reflect this so that angst error('Seconds must be >= 0 and < 60') % is minimized in the user docs end % Ensure that only one negative sign is present and at the correct location if any((s<0 & m<0) | (s<0 & d<0) | (m<0 & d<0) ) error('Multiple negative entries in a DMS specification') elseif any((s<0 & (m~=0 | d~= 0)) | (m<0 & d~=0)) error('Incorrect negative DMS specification') end % Construct a sign vector which has +1 when % angle >= 0 and -1 when angle < 0. Note that the sign of the % angle is associated with the largest nonzero component of d:m:s negvec = (d<0) | (m<0) | (s<0); signvec = ~negvec - negvec; % Convert to all positive numbers. Allows for easier % adjusting at 60 seconds and 60 minutes d = abs(d); m = abs(m); s = abs(s); % Truncate seconds to a specified accuracy to eliminate round-off errors [s,msg] = roundn(s,n); if ~isempty(msg); error(msg); end % Adjust for 60 seconds or 60 minutes. If s > 60, this can only be % from round-off during roundn since s > 60 is already tested above. % This round-off effect has happened though. indx = find(s >= 60); if ~isempty(indx); m(indx) = m(indx) + 1; s(indx) = 0; end % The user can not put minutes > 60 as input. However, the line % above may create minutes > 60 (since the user can put in m == 60), % thus, the test below includes the greater than condition. indx = find(m >= 60); if ~isempty(indx); d(indx) = d(indx) + 1; m(indx) = m(indx)-60; end % Construct the dms vector format dmsvec = signvec .* (100*d + m + s/100); gnss-sdr-0.0.9/src/utils/matlab/libs/geoFunctions/roundn.m000066400000000000000000000023411305042567700235370ustar00rootroot00000000000000function [x,msg] = roundn(x,n) %ROUNDN Rounds input data at specified power of 10 % % y = ROUNDN(x) rounds the input data x to the nearest hundredth. % % y = ROUNDN(x,n) rounds the input data x at the specified power % of tens position. For example, n = -2 rounds the input data to % the 10E-2 (hundredths) position. % % [y,msg] = ROUNDN(...) returns the text of any error condition % encountered in the output variable msg. % % See also ROUND % Copyright 1996-2002 Systems Planning and Analysis, Inc. and The MathWorks, Inc. % Written by: E. Byrns, E. Brown % $Revision: 1.9 $ $Date: 2002/03/20 21:26:19 $ msg = []; % Initialize output if nargin == 0 error('Incorrect number of arguments') elseif nargin == 1 n = -2; end % Test for scalar n if max(size(n)) ~= 1 msg = 'Scalar accuracy required'; if nargout < 2; error(msg); end return elseif ~isreal(n) warning('Imaginary part of complex N argument ignored') n = real(n); end % Compute the exponential factors for rounding at specified % power of 10. Ensure that n is an integer. factors = 10 ^ (fix(-n)); % Set the significant digits for the input data x = round(x * factors) / factors;gnss-sdr-0.0.9/src/utils/matlab/libs/geoFunctions/satpos.m000066400000000000000000000120721305042567700235450ustar00rootroot00000000000000function [satPositions, satClkCorr] = satpos(transmitTime, prnList, ... eph, settings) %SATPOS Computation of satellite coordinates X,Y,Z at TRANSMITTIME for %given ephemeris EPH. Coordinates are computed for each satellite in the %list PRNLIST. %[satPositions, satClkCorr] = satpos(transmitTime, prnList, eph, settings); % % Inputs: % transmitTime - transmission time % prnList - list of PRN-s to be processed % eph - ephemerides of satellites % settings - receiver settings % % Outputs: % satPositions - position of satellites (in ECEF system [X; Y; Z;]) % satClkCorr - correction of satellite clocks %-------------------------------------------------------------------------- % SoftGNSS v3.0 %-------------------------------------------------------------------------- %Based on Kai Borre 04-09-96 %Copyright (c) by Kai Borre %Updated by Darius Plausinaitis, Peter Rinder and Nicolaj Bertelsen % % CVS record: % $Id: satpos.m,v 1.1.2.17 2007/01/30 09:45:12 dpl Exp $ %% Initialize constants =================================================== numOfSatellites = size(prnList, 2); % GPS constatns gpsPi = 3.1415926535898; % Pi used in the GPS coordinate % system %--- Constants for satellite position calculation ------------------------- Omegae_dot = 7.2921151467e-5; % Earth rotation rate, [rad/s] GM = 3.986005e14; % Universal gravitational constant times % the mass of the Earth, [m^3/s^2] F = -4.442807633e-10; % Constant, [sec/(meter)^(1/2)] %% Initialize results ===================================================== satClkCorr = zeros(1, numOfSatellites); satPositions = zeros(3, numOfSatellites); %% Process each satellite ================================================= for satNr = 1 : numOfSatellites prn = prnList(satNr); %% Find initial satellite clock correction -------------------------------- %--- Find time difference --------------------------------------------- dt = check_t(transmitTime - eph(prn).t_oc); %--- Calculate clock correction --------------------------------------- satClkCorr(satNr) = (eph(prn).a_f2 * dt + eph(prn).a_f1) * dt + ... eph(prn).a_f0 - ... eph(prn).T_GD; time = transmitTime - satClkCorr(satNr); %% Find satellite's position ---------------------------------------------- %Restore semi-major axis a = eph(prn).sqrtA * eph(prn).sqrtA; %Time correction tk = check_t(time - eph(prn).t_oe); %Initial mean motion n0 = sqrt(GM / a^3); %Mean motion n = n0 + eph(prn).deltan; %Mean anomaly M = eph(prn).M_0 + n * tk; %Reduce mean anomaly to between 0 and 360 deg M = rem(M + 2*gpsPi, 2*gpsPi); %Initial guess of eccentric anomaly E = M; %--- Iteratively compute eccentric anomaly ---------------------------- for ii = 1:10 E_old = E; E = M + eph(prn).e * sin(E); dE = rem(E - E_old, 2*gpsPi); if abs(dE) < 1.e-12 % Necessary precision is reached, exit from the loop break; end end %Reduce eccentric anomaly to between 0 and 360 deg E = rem(E + 2*gpsPi, 2*gpsPi); %Compute relativistic correction term dtr = F * eph(prn).e * eph(prn).sqrtA * sin(E); %Calculate the true anomaly nu = atan2(sqrt(1 - eph(prn).e^2) * sin(E), cos(E)-eph(prn).e); %Compute angle phi phi = nu + eph(prn).omega; %Reduce phi to between 0 and 360 deg phi = rem(phi, 2*gpsPi); %Correct argument of latitude u = phi + ... eph(prn).C_uc * cos(2*phi) + ... eph(prn).C_us * sin(2*phi); %Correct radius r = a * (1 - eph(prn).e*cos(E)) + ... eph(prn).C_rc * cos(2*phi) + ... eph(prn).C_rs * sin(2*phi); %Correct inclination i = eph(prn).i_0 + eph(prn).iDot * tk + ... eph(prn).C_ic * cos(2*phi) + ... eph(prn).C_is * sin(2*phi); %Compute the angle between the ascending node and the Greenwich meridian Omega = eph(prn).omega_0 + (eph(prn).omegaDot - Omegae_dot)*tk - ... Omegae_dot * eph(prn).t_oe; %Reduce to between 0 and 360 deg Omega = rem(Omega + 2*gpsPi, 2*gpsPi); %--- Compute satellite coordinates ------------------------------------ satPositions(1, satNr) = cos(u)*r * cos(Omega) - sin(u)*r * cos(i)*sin(Omega); satPositions(2, satNr) = cos(u)*r * sin(Omega) + sin(u)*r * cos(i)*cos(Omega); satPositions(3, satNr) = sin(u)*r * sin(i); %% Include relativistic correction in clock correction -------------------- satClkCorr(satNr) = (eph(prn).a_f2 * dt + eph(prn).a_f1) * dt + ... eph(prn).a_f0 - ... eph(prn).T_GD + dtr; end % for satNr = 1 : numOfSatellites gnss-sdr-0.0.9/src/utils/matlab/libs/geoFunctions/togeod.m000066400000000000000000000055141305042567700235200ustar00rootroot00000000000000function [dphi, dlambda, h] = togeod(a, finv, X, Y, Z) %TOGEOD Subroutine to calculate geodetic coordinates latitude, longitude, % height given Cartesian coordinates X,Y,Z, and reference ellipsoid % values semi-major axis (a) and the inverse of flattening (finv). % %[dphi, dlambda, h] = togeod(a, finv, X, Y, Z); % % The units of linear parameters X,Y,Z,a must all agree (m,km,mi,ft,..etc) % The output units of angular quantities will be in decimal degrees % (15.5 degrees not 15 deg 30 min). The output units of h will be the % same as the units of X,Y,Z,a. % % Inputs: % a - semi-major axis of the reference ellipsoid % finv - inverse of flattening of the reference ellipsoid % X,Y,Z - Cartesian coordinates % % Outputs: % dphi - latitude % dlambda - longitude % h - height above reference ellipsoid % Copyright (C) 1987 C. Goad, Columbus, Ohio % Reprinted with permission of author, 1996 % Fortran code translated into MATLAB % Kai Borre 03-30-96 % % CVS record: % $Id: togeod.m,v 1.1.1.1.2.4 2006/08/22 13:45:59 dpl Exp $ %========================================================================== h = 0; tolsq = 1.e-10; maxit = 10; % compute radians-to-degree factor rtd = 180/pi; % compute square of eccentricity if finv < 1.e-20 esq = 0; else esq = (2 - 1/finv) / finv; end oneesq = 1 - esq; % first guess % P is distance from spin axis P = sqrt(X^2+Y^2); % direct calculation of longitude if P > 1.e-20 dlambda = atan2(Y,X) * rtd; else dlambda = 0; end if (dlambda < 0) dlambda = dlambda + 360; end % r is distance from origin (0,0,0) r = sqrt(P^2 + Z^2); if r > 1.e-20 sinphi = Z/r; else sinphi = 0; end dphi = asin(sinphi); % initial value of height = distance from origin minus % approximate distance from origin to surface of ellipsoid if r < 1.e-20 h = 0; return end h = r - a*(1-sinphi*sinphi/finv); % iterate for i = 1:maxit sinphi = sin(dphi); cosphi = cos(dphi); % compute radius of curvature in prime vertical direction N_phi = a/sqrt(1-esq*sinphi*sinphi); % compute residuals in P and Z dP = P - (N_phi + h) * cosphi; dZ = Z - (N_phi*oneesq + h) * sinphi; % update height and latitude h = h + (sinphi*dZ + cosphi*dP); dphi = dphi + (cosphi*dZ - sinphi*dP)/(N_phi + h); % test for convergence if (dP*dP + dZ*dZ < tolsq) break; end % Not Converged--Warn user if i == maxit fprintf([' Problem in TOGEOD, did not converge in %2.0f',... ' iterations\n'], i); end end % for i = 1:maxit dphi = dphi * rtd; %%%%%%%% end togeod.m %%%%%%%%%%%%%%%%%%%%%% gnss-sdr-0.0.9/src/utils/matlab/libs/geoFunctions/topocent.m000066400000000000000000000026121305042567700240660ustar00rootroot00000000000000function [Az, El, D] = topocent(X, dx) %TOPOCENT Transformation of vector dx into topocentric coordinate % system with origin at X. % Both parameters are 3 by 1 vectors. % %[Az, El, D] = topocent(X, dx); % % Inputs: % X - vector origin corrdinates (in ECEF system [X; Y; Z;]) % dx - vector ([dX; dY; dZ;]). % % Outputs: % D - vector length. Units like units of the input % Az - azimuth from north positive clockwise, degrees % El - elevation angle, degrees %Kai Borre 11-24-96 %Copyright (c) by Kai Borre % % CVS record: % $Id: topocent.m,v 1.1.1.1.2.4 2006/08/22 13:45:59 dpl Exp $ %========================================================================== dtr = pi/180; [phi, lambda, h] = togeod(6378137, 298.257223563, X(1), X(2), X(3)); cl = cos(lambda * dtr); sl = sin(lambda * dtr); cb = cos(phi * dtr); sb = sin(phi * dtr); F = [-sl -sb*cl cb*cl; cl -sb*sl cb*sl; 0 cb sb]; local_vector = F' * dx; E = local_vector(1); N = local_vector(2); U = local_vector(3); hor_dis = sqrt(E^2 + N^2); if hor_dis < 1.e-20 Az = 0; El = 90; else Az = atan2(E, N)/dtr; El = atan2(U, hor_dis)/dtr; end if Az < 0 Az = Az + 360; end D = sqrt(dx(1)^2 + dx(2)^2 + dx(3)^2); %%%%%%%%% end topocent.m %%%%%%%%%gnss-sdr-0.0.9/src/utils/matlab/libs/geoFunctions/tropo.m000066400000000000000000000055241305042567700234030ustar00rootroot00000000000000function ddr = tropo(sinel, hsta, p, tkel, hum, hp, htkel, hhum) %TROPO Calculation of tropospheric correction. % The range correction ddr in m is to be subtracted from % pseudo-ranges and carrier phases % %ddr = tropo(sinel, hsta, p, tkel, hum, hp, htkel, hhum); % % Inputs: % sinel - sin of elevation angle of satellite % hsta - height of station in km % p - atmospheric pressure in mb at height hp % tkel - surface temperature in degrees Kelvin at height htkel % hum - humidity in % at height hhum % hp - height of pressure measurement in km % htkel - height of temperature measurement in km % hhum - height of humidity measurement in km % % Outputs: % ddr - range correction (meters) % % Reference % Goad, C.C. & Goodman, L. (1974) A Modified Tropospheric % Refraction Correction Model. Paper presented at the % American Geophysical Union Annual Fall Meeting, San % Francisco, December 12-17 % A Matlab reimplementation of a C code from driver. % Kai Borre 06-28-95 % % CVS record: % $Id: tropo.m,v 1.1.1.1.2.4 2006/08/22 13:46:00 dpl Exp $ %========================================================================== a_e = 6378.137; % semi-major axis of earth ellipsoid b0 = 7.839257e-5; tlapse = -6.5; tkhum = tkel + tlapse*(hhum-htkel); atkel = 7.5*(tkhum-273.15) / (237.3+tkhum-273.15); e0 = 0.0611 * hum * 10^atkel; tksea = tkel - tlapse*htkel; em = -978.77 / (2.8704e6*tlapse*1.0e-5); tkelh = tksea + tlapse*hhum; e0sea = e0 * (tksea/tkelh)^(4*em); tkelp = tksea + tlapse*hp; psea = p * (tksea/tkelp)^em; if sinel < 0 sinel = 0; end tropo = 0; done = 'FALSE'; refsea = 77.624e-6 / tksea; htop = 1.1385e-5 / refsea; refsea = refsea * psea; ref = refsea * ((htop-hsta)/htop)^4; while 1 rtop = (a_e+htop)^2 - (a_e+hsta)^2*(1-sinel^2); % check to see if geometry is crazy if rtop < 0 rtop = 0; end rtop = sqrt(rtop) - (a_e+hsta)*sinel; a = -sinel/(htop-hsta); b = -b0*(1-sinel^2) / (htop-hsta); rn = zeros(8,1); for i = 1:8 rn(i) = rtop^(i+1); end alpha = [2*a, 2*a^2+4*b/3, a*(a^2+3*b),... a^4/5+2.4*a^2*b+1.2*b^2, 2*a*b*(a^2+3*b)/3,... b^2*(6*a^2+4*b)*1.428571e-1, 0, 0]; if b^2 > 1.0e-35 alpha(7) = a*b^3/2; alpha(8) = b^4/9; end dr = rtop; dr = dr + alpha*rn; tropo = tropo + dr*ref*1000; if done == 'TRUE ' ddr = tropo; break; end done = 'TRUE '; refsea = (371900.0e-6/tksea-12.92e-6)/tksea; htop = 1.1385e-5 * (1255/tksea+0.05)/refsea; ref = refsea * e0sea * ((htop-hsta)/htop)^4; end; %%%%%%%%% end tropo.m %%%%%%%%%%%%%%%%%%% gnss-sdr-0.0.9/src/utils/matlab/libs/gps_l1_ca_dll_fll_pll_read_tracking_dump.m000066400000000000000000000170411305042567700276630ustar00rootroot00000000000000% /*! % * \file gps_l1_ca_dll_fll_pll_read_tracking_dump.m % * \brief Read GNSS-SDR Tracking dump binary file into MATLAB. % * \author Javier Arribas, 2011. jarribas(at)cttc.es % * ------------------------------------------------------------------------- % * % * Copyright (C) 2010-2011 (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 . % * % * ------------------------------------------------------------------------- % */ function [GNSS_tracking] = gps_l1_ca_dll_fll_pll_read_tracking_dump (filename, samplingFreq, count) %% usage: gps_l1_ca_dll_fll_pll_read_tracking_dump (filename, [count]) %% %% open GNSS-SDR tracking binary log file .dat and return the contents %% m = nargchk (1,3,nargin); num_float_vars=16; num_double_vars=1; double_size_bytes=8; float_size_bytes=4; skip_bytes_each_read=float_size_bytes*num_float_vars+double_size_bytes*num_double_vars; bytes_shift=0; if (m) usage (m); end if (nargin < 3) count = Inf; end %loops_counter = fread (f, count, 'uint32',4*12); f = fopen (filename, 'rb'); if (f < 0) else v1 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v2 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v3 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v4 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v5 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v6 = fread (f, count, 'uint32',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v7 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v8 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v9 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v10 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v11 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v12 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v13 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v14 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v15 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v16 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v17 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); fclose (f); %%%%%%%% output vars %%%%%%%% % // EPR % d_dump_file.write((char*)&tmp_E, sizeof(float)); % d_dump_file.write((char*)&tmp_P, sizeof(float)); % d_dump_file.write((char*)&tmp_L, sizeof(float)); % // PROMPT I and Q (to analyze navigation symbols) % d_dump_file.write((char*)&prompt_I, sizeof(float)); % d_dump_file.write((char*)&prompt_Q, sizeof(float)); % // PRN start sample stamp % //tmp_float=(float)d_sample_counter; % d_dump_file.write((char*)&d_sample_counter, sizeof(unsigned long int)); % // accumulated carrier phase % d_dump_file.write((char*)&d_acc_carrier_phase_rad, sizeof(float)); % % // carrier and code frequency % d_dump_file.write((char*)&d_carrier_doppler_hz, sizeof(float)); % d_dump_file.write((char*)&d_code_freq_hz, sizeof(float)); % % //PLL commands % d_dump_file.write((char*)&PLL_discriminator_hz, sizeof(float)); % d_dump_file.write((char*)&carr_nco_hz, sizeof(float)); % % //DLL commands % d_dump_file.write((char*)&code_error_chips, sizeof(float)); % d_dump_file.write((char*)&d_code_phase_samples, sizeof(float)); % % // CN0 and carrier lock test % d_dump_file.write((char*)&d_CN0_SNV_dB_Hz, sizeof(float)); % d_dump_file.write((char*)&d_carrier_lock_test, sizeof(float)); % % // AUX vars (for debug purposes) % tmp_float=0; % d_dump_file.write((char*)&tmp_float, sizeof(float)); % d_dump_file.write((char*)&d_sample_counter_seconds, sizeof(double)); E=v1; P=v2; L=v3; prompt_I=v4; prompt_Q=v5; PRN_start_sample=v6; acc_carrier_phase_rad=v7; carrier_doppler_hz=v8; code_freq_hz=v9; PLL_discriminator_hz=v10; carr_nco_hz=v11; code_error_chips=v12; code_phase_samples=v13; CN0_SNV_dB_Hz=v14; carrier_lock_test=v15; var1=v16; var2=v17; GNSS_tracking.E=E; GNSS_tracking.P=P; GNSS_tracking.L=L; GNSS_tracking.prompt_I=prompt_I; GNSS_tracking.prompt_Q=prompt_Q; GNSS_tracking.PRN_start_sample=PRN_start_sample; GNSS_tracking.acc_carrier_phase_rad=acc_carrier_phase_rad; GNSS_tracking.carrier_doppler_hz=carrier_doppler_hz; GNSS_tracking.code_freq_hz=code_freq_hz; GNSS_tracking.PLL_discriminator_hz=PLL_discriminator_hz; GNSS_tracking.carr_nco=carr_nco_hz; GNSS_tracking.code_error_chips=code_error_chips; GNSS_tracking.code_phase_samples=code_phase_samples; GNSS_tracking.CN0_SNV_dB_Hz=CN0_SNV_dB_Hz; GNSS_tracking.carrier_lock_test=carrier_lock_test; GNSS_tracking.var1=var1; GNSS_tracking.var2=var2; GNSS_tracking.prn_delay_ms=1000*(GNSS_tracking.var2+GNSS_tracking.var1)./samplingFreq; end gnss-sdr-0.0.9/src/utils/matlab/libs/gps_l1_ca_dll_pll_read_observables_dump.m000066400000000000000000000050031305042567700275260ustar00rootroot00000000000000% Javier Arribas 2011 function [observables] = gps_l1_ca_dll_pll_read_observables_dump (channels, filename, count) %% usage: read_tracking_dat (filename, [count]) %% %% open GNSS-SDR tracking binary log file .dat and return the contents %% m = nargchk (1,2,nargin); num_double_vars=5; double_size_bytes=8; skip_bytes_each_read=double_size_bytes*num_double_vars*channels; bytes_shift=0; if (m) usage (m); end if (nargin < 3) count = Inf; end %loops_counter = fread (f, count, 'uint32',4*12); f = fopen (filename, 'rb'); if (f < 0) else for N=1:1:channels observables.preamble_delay_ms(N,:) = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved observables.prn_delay_ms(N,:) = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved observables.Pseudorange_m(N,:) = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved observables.Pseudorange_symbol_shift(N,:) = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved observables.PRN(N,:) = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved end fclose (f); %%%%%%%% output vars %%%%%%%% % for (unsigned int i=0; i. % * % * ------------------------------------------------------------------------- % */ function [GNSS_tracking] = gps_l1_ca_dll_pll_read_tracking_dump (filename, count) %% usage: gps_l1_ca_dll_pll_read_tracking_dump (filename, [count]) %% %% open GNSS-SDR tracking binary log file .dat and return the contents %% m = nargchk (1,2,nargin); num_float_vars=16; num_double_vars=2; double_size_bytes=8; float_size_bytes=4; skip_bytes_each_read=float_size_bytes*num_float_vars+double_size_bytes*num_double_vars; bytes_shift=0; if (m) usage (m); end if (nargin < 2) count = Inf; end %loops_counter = fread (f, count, 'uint32',4*12); f = fopen (filename, 'rb'); if (f < 0) else v1 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v2 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v3 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v4 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v5 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v6 = fread (f, count, 'uint32',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v7 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v8 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v9 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v10 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v11 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v12 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v13 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v14 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v15 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v16 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v17 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v18 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); fclose (f); %%%%%%%% output vars %%%%%%%% % // EPR % d_dump_file.write((char*)&tmp_E, sizeof(float)); % d_dump_file.write((char*)&tmp_P, sizeof(float)); % d_dump_file.write((char*)&tmp_L, sizeof(float)); % // PROMPT I and Q (to analyze navigation symbols) % d_dump_file.write((char*)&prompt_I, sizeof(float)); % d_dump_file.write((char*)&prompt_Q, sizeof(float)); % // PRN start sample stamp % //tmp_float=(float)d_sample_counter; % d_dump_file.write((char*)&d_sample_counter, sizeof(unsigned long int)); % // accumulated carrier phase % d_dump_file.write((char*)&d_acc_carrier_phase_rad, sizeof(float)); % % // carrier and code frequency % d_dump_file.write((char*)&d_carrier_doppler_hz, sizeof(float)); % d_dump_file.write((char*)&d_code_freq_hz, sizeof(float)); % % //PLL commands % d_dump_file.write((char*)&carr_error, sizeof(float)); % d_dump_file.write((char*)&carr_nco, sizeof(float)); % % //DLL commands % d_dump_file.write((char*)&code_error, sizeof(float)); % d_dump_file.write((char*)&code_nco, sizeof(float)); % % // CN0 and carrier lock test % d_dump_file.write((char*)&d_CN0_SNV_dB_Hz, sizeof(float)); % d_dump_file.write((char*)&d_carrier_lock_test, sizeof(float)); % % // AUX vars (for debug purposes) % tmp_float=0; % d_dump_file.write((char*)&tmp_float, sizeof(float)); % d_dump_file.write((char*)&d_sample_counter_seconds, sizeof(double)); E=v1; P=v2; L=v3; prompt_I=v4; prompt_Q=v5; PRN_start_sample=v6; acc_carrier_phase_rad=v7; carrier_doppler_hz=v8; code_freq_hz=v9; carr_error=v10; carr_nco=v11; code_error=v12; code_nco=v13; CN0_SNV_dB_Hz=v14; carrier_lock_test=v15; var1=v16; var2=v17; var3=v18; GNSS_tracking.E=E; GNSS_tracking.P=P; GNSS_tracking.L=L; GNSS_tracking.prompt_I=prompt_I; GNSS_tracking.prompt_Q=prompt_Q; GNSS_tracking.PRN_start_sample=PRN_start_sample; GNSS_tracking.acc_carrier_phase_rad=acc_carrier_phase_rad; GNSS_tracking.carrier_doppler_hz=carrier_doppler_hz; GNSS_tracking.code_freq_hz=code_freq_hz; GNSS_tracking.carr_error=carr_error; GNSS_tracking.carr_nco=carr_nco; GNSS_tracking.code_error=code_error; GNSS_tracking.code_nco=code_nco; GNSS_tracking.CN0_SNV_dB_Hz=CN0_SNV_dB_Hz; GNSS_tracking.carrier_lock_test=carrier_lock_test; GNSS_tracking.var1=var1; GNSS_tracking.var2=var2; GNSS_tracking.var3=var3; end gnss-sdr-0.0.9/src/utils/matlab/libs/gps_l1_ca_dll_pll_read_tracking_dump_64bits.m000066400000000000000000000167771305042567700302400ustar00rootroot00000000000000% /*! % * \file gps_l1_ca_dll_pll_read_tracking_dump.m % * \brief Read GNSS-SDR Tracking dump binary file into MATLAB. % * \author Javier Arribas, 2011. jarribas(at)cttc.es % * ------------------------------------------------------------------------- % * % * Copyright (C) 2010-2011 (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 . % * % * ------------------------------------------------------------------------- % */ function [GNSS_tracking] = gps_l1_ca_dll_pll_read_tracking_dump_64bits (filename, count) %% usage: gps_l1_ca_dll_pll_read_tracking_dump_64bits (filename, [count]) %% %% open GNSS-SDR tracking binary log file .dat and return the contents %% m = nargchk (1,2,nargin); num_float_vars=15; num_unsigned_long_int_vars=1; num_double_vars=1; double_size_bytes=8; unsigned_long_int_size_bytes=8; float_size_bytes=4; skip_bytes_each_read=float_size_bytes*num_float_vars+unsigned_long_int_size_bytes*num_unsigned_long_int_vars+double_size_bytes*num_double_vars; bytes_shift=0; if (m) usage (m); end if (nargin < 2) count = Inf; end %loops_counter = fread (f, count, 'uint32',4*12); f = fopen (filename, 'rb'); if (f < 0) else v1 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v2 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v3 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v4 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v5 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v6 = fread (f, count, 'uint64',skip_bytes_each_read-unsigned_long_int_size_bytes); bytes_shift=bytes_shift+unsigned_long_int_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v7 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v8 = fread (f, count, '*float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v9 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v10 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v11 = fread (f, count, '*float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v12 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v13 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v14 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v15 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v16 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes); bytes_shift=bytes_shift+float_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved float v17 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); fclose (f); %%%%%%%% output vars %%%%%%%% % // EPR % d_dump_file.write((char*)&tmp_E, sizeof(float)); % d_dump_file.write((char*)&tmp_P, sizeof(float)); % d_dump_file.write((char*)&tmp_L, sizeof(float)); % // PROMPT I and Q (to analyze navigation symbols) % d_dump_file.write((char*)&prompt_I, sizeof(float)); % d_dump_file.write((char*)&prompt_Q, sizeof(float)); % // PRN start sample stamp % //tmp_float=(float)d_sample_counter; % d_dump_file.write((char*)&d_sample_counter, sizeof(unsigned long int)); % // accumulated carrier phase % d_dump_file.write((char*)&d_acc_carrier_phase_rad, sizeof(float)); % % // carrier and code frequency % d_dump_file.write((char*)&d_carrier_doppler_hz, sizeof(float)); % d_dump_file.write((char*)&d_code_freq_hz, sizeof(float)); % % //PLL commands % d_dump_file.write((char*)&carr_error, sizeof(float)); % d_dump_file.write((char*)&carr_nco, sizeof(float)); % % //DLL commands % d_dump_file.write((char*)&code_error, sizeof(float)); % d_dump_file.write((char*)&code_nco, sizeof(float)); % % // CN0 and carrier lock test % d_dump_file.write((char*)&d_CN0_SNV_dB_Hz, sizeof(float)); % d_dump_file.write((char*)&d_carrier_lock_test, sizeof(float)); % % // AUX vars (for debug purposes) % tmp_float=0; % d_dump_file.write((char*)&tmp_float, sizeof(float)); % d_dump_file.write((char*)&d_sample_counter_seconds, sizeof(double)); E=v1; P=v2; L=v3; prompt_I=v4; prompt_Q=v5; PRN_start_sample=v6; acc_carrier_phase_rad=v7; carrier_doppler_hz=v8; code_freq_hz=v9; carr_error=v10; carr_nco=v11; code_error=v12; code_nco=v13; CN0_SNV_dB_Hz=v14; carrier_lock_test=v15; var1=v16; var2=v17; GNSS_tracking.E=E; GNSS_tracking.P=P; GNSS_tracking.L=L; GNSS_tracking.prompt_I=prompt_I; GNSS_tracking.prompt_Q=prompt_Q; GNSS_tracking.PRN_start_sample=PRN_start_sample; GNSS_tracking.acc_carrier_phase_rad=acc_carrier_phase_rad; GNSS_tracking.carrier_doppler_hz=carrier_doppler_hz; GNSS_tracking.code_freq_hz=code_freq_hz; GNSS_tracking.carr_error=carr_error; GNSS_tracking.carr_nco=carr_nco; GNSS_tracking.code_error=code_error; GNSS_tracking.code_nco=code_nco; GNSS_tracking.CN0_SNV_dB_Hz=CN0_SNV_dB_Hz; GNSS_tracking.carrier_lock_test=carrier_lock_test; GNSS_tracking.var1=var1; GNSS_tracking.var2=var2; end gnss-sdr-0.0.9/src/utils/matlab/libs/gps_l1_ca_pvt_read_pvt_dump.m000066400000000000000000000110771305042567700252270ustar00rootroot00000000000000% /*! % * \file gps_l1_ca_pvt_read_pvt_dump.m % * \brief Read GNSS-SDR PVT lib dump binary file into MATLAB. The resulting % structure is compatible with the K.Borre MATLAB-based receiver. % * \author Javier Arribas, 2011. jarribas(at)cttc.es % * ------------------------------------------------------------------------- % * % * Copyright (C) 2010-2011 (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 . % * % * ------------------------------------------------------------------------- % */ function [navSolutions] = gps_l1_ca_pvt_read_pvt_dump (filename, count) %% usage: gps_l1_ca_pvt_read_pvt_dump (filename, [count]) %% %% open GNSS-SDR PVT binary log file .dat and return the contents %% % % // PVT GPS time % tmp_double=GPS_current_time; % d_dump_file.write((char*)&tmp_double, sizeof(double)); % // ECEF User Position East [m] % tmp_double=mypos(0); % d_dump_file.write((char*)&tmp_double, sizeof(double)); % // ECEF User Position North [m] % tmp_double=mypos(1); % d_dump_file.write((char*)&tmp_double, sizeof(double)); % // ECEF User Position Up [m] % tmp_double=mypos(2); % d_dump_file.write((char*)&tmp_double, sizeof(double)); % // User clock offset [s] % tmp_double=mypos(3); % d_dump_file.write((char*)&tmp_double, sizeof(double)); % // GEO user position Latitude [deg] % tmp_double=d_latitude_d; % d_dump_file.write((char*)&tmp_double, sizeof(double)); % // GEO user position Longitude [deg] % tmp_double=d_longitude_d; % d_dump_file.write((char*)&tmp_double, sizeof(double)); % // GEO user position Height [m] % tmp_double=d_height_m; % d_dump_file.write((char*)&tmp_double, sizeof(double)); m = nargchk (1,2,nargin); num_double_vars=8; double_size_bytes=8; skip_bytes_each_read=double_size_bytes*num_double_vars; bytes_shift=0; if (m) usage (m); end if (nargin < 3) count = Inf; end %loops_counter = fread (f, count, 'uint32',4*12); f = fopen (filename, 'rb'); if (f < 0) else GPS_current_time = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved ECEF_X = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved ECEF_Y = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved ECEF_Z = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved Clock_Offset = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved Lat = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved Long = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved Height = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved fclose (f); end navSolutions.X=ECEF_X.'; navSolutions.Y=ECEF_Y.'; navSolutions.Z=ECEF_Z.'; navSolutions.dt=Clock_Offset.'; navSolutions.latitude=Lat.'; navSolutions.longitude=Long.'; navSolutions.height=Height.'; navSolutions.TransmitTime=GPS_current_time.'; gnss-sdr-0.0.9/src/utils/matlab/libs/gps_l1_ca_read_observables_dump.m000066400000000000000000000050701305042567700260300ustar00rootroot00000000000000% Javier Arribas 2011 function [observables] = gps_l1_ca_read_observables_dump (channels, filename, count) %% usage: read_tracking_dat (filename, [count]) %% %% open GNSS-SDR tracking binary log file .dat and return the contents %% m = nargchk (1,2,nargin); num_double_vars=5; double_size_bytes=8; skip_bytes_each_read=double_size_bytes*num_double_vars*channels; bytes_shift=0; if (m) usage (m); end if (nargin < 3) count = Inf; end %loops_counter = fread (f, count, 'uint32',4*12); f = fopen (filename, 'rb'); if (f < 0) else for N=1:1:channels observables.d_TOW_at_current_symbol(N,:) = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved observables.Prn_timestamp_ms(N,:) = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved observables.Pseudorange_m(N,:) = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved observables.Flag_valid_pseudorange(N,:) = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved observables.PRN(N,:) = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes); bytes_shift=bytes_shift+double_size_bytes; fseek(f,bytes_shift,'bof'); % move to next interleaved end fclose (f); %%%%%%%% output vars %%%%%%%% % double tmp_double; % for (unsigned int i=0; i. % * % * ------------------------------------------------------------------------- % */ function plotNavigation(navSolutions, settings,plot_skyplot) %Functions plots variations of coordinates over time and a 3D position %plot. It plots receiver coordinates in UTM system or coordinate offsets if %the true UTM receiver coordinates are provided. % %plotNavigation(navSolutions, settings) % % Inputs: % navSolutions - Results from navigation solution function. It % contains measured pseudoranges and receiver % coordinates. % settings - Receiver settings. The true receiver coordinates % are contained in this structure. % plot_skyplot - If ==1 then use satellite coordinates to plot the % the satellite positions %% Plot results in the necessary data exists ============================== if (~isempty(navSolutions)) %% If reference position is not provided, then set reference position %% to the average postion if isnan(settings.truePosition.E) || isnan(settings.truePosition.N) ... || isnan(settings.truePosition.U) %=== Compute mean values ========================================== % Remove NaN-s or the output of the function MEAN will be NaN. refCoord.E = mean(navSolutions.E(~isnan(navSolutions.E))); refCoord.N = mean(navSolutions.N(~isnan(navSolutions.N))); refCoord.U = mean(navSolutions.U(~isnan(navSolutions.U))); %Also convert geodetic coordinates to deg:min:sec vector format meanLongitude = dms2mat(deg2dms(... mean(navSolutions.longitude(~isnan(navSolutions.longitude)))), -5); meanLatitude = dms2mat(deg2dms(... mean(navSolutions.latitude(~isnan(navSolutions.latitude)))), -5); LatLong_str=[num2str(meanLatitude(1)), 'º', ... num2str(meanLatitude(2)), '''', ... num2str(meanLatitude(3)), '''''', ... ',', ... num2str(meanLongitude(1)), 'º', ... num2str(meanLongitude(2)), '''', ... num2str(meanLongitude(3)), ''''''] refPointLgText = ['Mean Position\newline Lat: ', ... num2str(meanLatitude(1)), '{\circ}', ... num2str(meanLatitude(2)), '{\prime}', ... num2str(meanLatitude(3)), '{\prime}{\prime}', ... '\newline Lng: ', ... num2str(meanLongitude(1)), '{\circ}', ... num2str(meanLongitude(2)), '{\prime}', ... num2str(meanLongitude(3)), '{\prime}{\prime}', ... '\newline Hgt: ', ... num2str(mean(navSolutions.height(~isnan(navSolutions.height))), '%+6.1f')]; else % compute the mean error for static receiver mean_position.E = mean(navSolutions.E(~isnan(navSolutions.E))); mean_position.N = mean(navSolutions.N(~isnan(navSolutions.N))); mean_position.U = mean(navSolutions.U(~isnan(navSolutions.U))); refCoord.E = settings.truePosition.E; refCoord.N = settings.truePosition.N; refCoord.U = settings.truePosition.U; error_meters=sqrt((mean_position.E-refCoord.E)^2+(mean_position.N-refCoord.N)^2+(mean_position.U-refCoord.U)^2); refPointLgText = ['Reference Position, Mean 3D error = ' num2str(error_meters) ' [m]']; end figureNumber = 300; % The 300 is chosen for more convenient handling of the open % figure windows, when many figures are closed and reopened. Figures % drawn or opened by the user, will not be "overwritten" by this % function if the auto numbering is not used. %=== Select (or create) and clear the figure ========================== figure(figureNumber); clf (figureNumber); set (figureNumber, 'Name', 'Navigation solutions'); %--- Draw axes -------------------------------------------------------- handles(1, 1) = subplot(4, 2, 1 : 4); handles(3, 1) = subplot(4, 2, [5, 7]); handles(3, 2) = subplot(4, 2, [6, 8]); %% Plot all figures ======================================================= %--- Coordinate differences in UTM system ----------------------------- plot(handles(1, 1), [(navSolutions.E - refCoord.E)', ... (navSolutions.N - refCoord.N)',... (navSolutions.U - refCoord.U)']); title (handles(1, 1), 'Coordinates variations in UTM system'); legend(handles(1, 1), 'E', 'N', 'U'); xlabel(handles(1, 1), ['Measurement period: ', ... num2str(settings.navSolPeriod), 'ms']); ylabel(handles(1, 1), 'Variations (m)'); grid (handles(1, 1)); axis (handles(1, 1), 'tight'); %--- Position plot in UTM system -------------------------------------- plot3 (handles(3, 1), navSolutions.E - refCoord.E, ... navSolutions.N - refCoord.N, ... navSolutions.U - refCoord.U, '+'); hold (handles(3, 1), 'on'); %Plot the reference point plot3 (handles(3, 1), 0, 0, 0, 'r+', 'LineWidth', 1.5, 'MarkerSize', 10); hold (handles(3, 1), 'off'); view (handles(3, 1), 0, 90); axis (handles(3, 1), 'equal'); grid (handles(3, 1), 'minor'); legend(handles(3, 1), 'Measurements', refPointLgText); title (handles(3, 1), 'Positions in UTM system (3D plot)'); xlabel(handles(3, 1), 'East (m)'); ylabel(handles(3, 1), 'North (m)'); zlabel(handles(3, 1), 'Upping (m)'); if (plot_skyplot==1) %--- Satellite sky plot ----------------------------------------------- skyPlot(handles(3, 2), ... navSolutions.channel.az, ... navSolutions.channel.el, ... navSolutions.channel.PRN(:, 1)); title (handles(3, 2), ['Sky plot (mean PDOP: ', ... num2str(mean(navSolutions.DOP(2,:))), ')']); end else disp('plotNavigation: No navigation data to plot.'); end % if (~isempty(navSolutions)) gnss-sdr-0.0.9/src/utils/matlab/libs/plotTracking.m000066400000000000000000000151211305042567700222300ustar00rootroot00000000000000function plotTracking(channelList, trackResults, settings) %This function plots the tracking results for the given channel list. % %plotTracking(channelList, trackResults, settings) % % Inputs: % channelList - list of channels to be plotted. % trackResults - tracking results from the tracking function. % settings - receiver settings. %-------------------------------------------------------------------------- % SoftGNSS v3.0 % % Copyright (C) Darius Plausinaitis % Written by Darius Plausinaitis %-------------------------------------------------------------------------- %This program is free software; you can redistribute it and/or %modify it under the terms of the GNU General Public License %as published by the Free Software Foundation; either version 2 %of the License, or (at your option) any later version. % %This program is distributed in the hope that it will be useful, %but WITHOUT ANY WARRANTY; without even the implied warranty of %MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %GNU General Public License for more details. % %You should have received a copy of the GNU General Public License %along with this program; if not, write to the Free Software %Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, %USA. %-------------------------------------------------------------------------- %CVS record: %$Id: plotTracking.m,v 1.5.2.23 2006/08/14 14:45:14 dpl Exp $ % Protection - if the list contains incorrect channel numbers channelList = intersect(channelList, 1:settings.numberOfChannels); %=== For all listed channels ============================================== for channelNr = channelList %% Select (or create) and clear the figure ================================ % The number 200 is added just for more convenient handling of the open % figure windows, when many figures are closed and reopened. % Figures drawn or opened by the user, will not be "overwritten" by % this function. figure(channelNr +200); clf(channelNr +200); set(channelNr +200, 'Name', ['Channel ', num2str(channelNr), ... ' (PRN ', ... num2str(trackResults(channelNr).PRN), ... ') results']); %% Draw axes ============================================================== % Row 1 handles(1, 1) = subplot(3, 3, 1); handles(1, 2) = subplot(3, 3, [2 3]); % Row 2 handles(2, 1) = subplot(3, 3, 4); handles(2, 2) = subplot(3, 3, [5 6]); % Row 3 handles(3, 1) = subplot(3, 3, 7); handles(3, 2) = subplot(3, 3, 8); handles(3, 3) = subplot(3, 3, 9); %% Plot all figures ======================================================= timeAxisInSeconds = (1:settings.msToProcess)/1000; %----- Discrete-Time Scatter Plot --------------------------------- plot(handles(1, 1), trackResults(channelNr).I_P,... trackResults(channelNr).Q_P, ... '.'); grid (handles(1, 1)); axis (handles(1, 1), 'equal'); title (handles(1, 1), 'Discrete-Time Scatter Plot'); xlabel(handles(1, 1), 'I prompt'); ylabel(handles(1, 1), 'Q prompt'); %----- Nav bits --------------------------------------------------- plot (handles(1, 2), timeAxisInSeconds, ... trackResults(channelNr).I_P); grid (handles(1, 2)); title (handles(1, 2), 'Bits of the navigation message'); xlabel(handles(1, 2), 'Time (s)'); axis (handles(1, 2), 'tight'); %----- PLL discriminator unfiltered-------------------------------- plot (handles(2, 1), timeAxisInSeconds, ... trackResults(channelNr).pllDiscr, 'r'); grid (handles(2, 1)); axis (handles(2, 1), 'tight'); xlabel(handles(2, 1), 'Time (s)'); ylabel(handles(2, 1), 'Amplitude'); title (handles(2, 1), 'Raw PLL discriminator'); %----- Correlation ------------------------------------------------ plot(handles(2, 2), timeAxisInSeconds, ... [sqrt(trackResults(channelNr).I_E.^2 + ... trackResults(channelNr).Q_E.^2)', ... sqrt(trackResults(channelNr).I_P.^2 + ... trackResults(channelNr).Q_P.^2)', ... sqrt(trackResults(channelNr).I_L.^2 + ... trackResults(channelNr).Q_L.^2)'], ... '-*'); grid (handles(2, 2)); title (handles(2, 2), 'Correlation results'); xlabel(handles(2, 2), 'Time (s)'); axis (handles(2, 2), 'tight'); hLegend = legend(handles(2, 2), '$\sqrt{I_{E}^2 + Q_{E}^2}$', ... '$\sqrt{I_{P}^2 + Q_{P}^2}$', ... '$\sqrt{I_{L}^2 + Q_{L}^2}$'); %set interpreter from tex to latex. This will draw \sqrt correctly set(hLegend, 'Interpreter', 'Latex'); %----- PLL discriminator filtered---------------------------------- plot (handles(3, 1), timeAxisInSeconds, ... trackResults(channelNr).pllDiscrFilt, 'b'); grid (handles(3, 1)); axis (handles(3, 1), 'tight'); xlabel(handles(3, 1), 'Time (s)'); ylabel(handles(3, 1), 'Amplitude'); title (handles(3, 1), 'Filtered PLL discriminator'); %----- DLL discriminator unfiltered-------------------------------- plot (handles(3, 2), timeAxisInSeconds, ... trackResults(channelNr).dllDiscr, 'r'); grid (handles(3, 2)); axis (handles(3, 2), 'tight'); xlabel(handles(3, 2), 'Time (s)'); ylabel(handles(3, 2), 'Amplitude'); title (handles(3, 2), 'Raw DLL discriminator'); %----- DLL discriminator filtered---------------------------------- plot (handles(3, 3), timeAxisInSeconds, ... trackResults(channelNr).dllDiscrFilt, 'b'); grid (handles(3, 3)); axis (handles(3, 3), 'tight'); xlabel(handles(3, 3), 'Time (s)'); ylabel(handles(3, 3), 'Amplitude'); title (handles(3, 3), 'Filtered DLL discriminator'); end % for channelNr = channelList gnss-sdr-0.0.9/src/utils/matlab/libs/plotVEMLTracking.m000066400000000000000000000160271305042567700227220ustar00rootroot00000000000000function plotVEMLTracking(channelList, trackResults, settings) %This function plots the tracking results for the given channel list. % %plotTracking(channelList, trackResults, settings) % % Inputs: % channelList - list of channels to be plotted. % trackResults - tracking results from the tracking function. % settings - receiver settings. %-------------------------------------------------------------------------- % SoftGNSS v3.0 % % Copyright (C) Darius Plausinaitis % Written by Darius Plausinaitis %-------------------------------------------------------------------------- %This program is free software; you can redistribute it and/or %modify it under the terms of the GNU General Public License %as published by the Free Software Foundation; either version 2 %of the License, or (at your option) any later version. % %This program is distributed in the hope that it will be useful, %but WITHOUT ANY WARRANTY; without even the implied warranty of %MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %GNU General Public License for more details. % %You should have received a copy of the GNU General Public License %along with this program; if not, write to the Free Software %Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, %USA. %-------------------------------------------------------------------------- %CVS record: %$Id: plotTracking.m,v 1.5.2.23 2006/08/14 14:45:14 dpl Exp $ % Protection - if the list contains incorrect channel numbers channelList = intersect(channelList, 1:settings.numberOfChannels); %=== For all listed channels ============================================== for channelNr = channelList %% Select (or create) and clear the figure ================================ % The number 200 is added just for more convenient handling of the open % figure windows, when many figures are closed and reopened. % Figures drawn or opened by the user, will not be "overwritten" by % this function. figure(channelNr +200); clf(channelNr +200); set(channelNr +200, 'Name', ['Channel ', num2str(channelNr), ... ' (PRN ', ... num2str(trackResults(channelNr).PRN), ... ') results']); %% Draw axes ============================================================== % Row 1 handles(1, 1) = subplot(3, 3, 1); handles(1, 2) = subplot(3, 3, [2 3]); % Row 2 handles(2, 1) = subplot(3, 3, 4); handles(2, 2) = subplot(3, 3, [5 6]); % Row 3 handles(3, 1) = subplot(3, 3, 7); handles(3, 2) = subplot(3, 3, 8); handles(3, 3) = subplot(3, 3, 9); %% Plot all figures ======================================================= timeAxisInSeconds = (1:4:settings.msToProcess)/1000; %----- Discrete-Time Scatter Plot --------------------------------- plot(handles(1, 1), trackResults(channelNr).I_P,... trackResults(channelNr).Q_P, ... '.'); grid (handles(1, 1)); axis (handles(1, 1), 'equal'); title (handles(1, 1), 'Discrete-Time Scatter Plot'); xlabel(handles(1, 1), 'I prompt'); ylabel(handles(1, 1), 'Q prompt'); %----- Nav bits --------------------------------------------------- plot (handles(1, 2), timeAxisInSeconds, ... trackResults(channelNr).I_P); grid (handles(1, 2)); title (handles(1, 2), 'Bits of the navigation message'); xlabel(handles(1, 2), 'Time (s)'); axis (handles(1, 2), 'tight'); %----- PLL discriminator unfiltered-------------------------------- plot (handles(2, 1), timeAxisInSeconds, ... trackResults(channelNr).pllDiscr, 'r'); grid (handles(2, 1)); axis (handles(2, 1), 'tight'); xlabel(handles(2, 1), 'Time (s)'); ylabel(handles(2, 1), 'Amplitude'); title (handles(2, 1), 'Raw PLL discriminator'); %----- Correlation ------------------------------------------------ plot(handles(2, 2), timeAxisInSeconds, ... [sqrt(trackResults(channelNr).I_VE.^2 + ... trackResults(channelNr).Q_VE.^2)', ... sqrt(trackResults(channelNr).I_E.^2 + ... trackResults(channelNr).Q_E.^2)', ... sqrt(trackResults(channelNr).I_P.^2 + ... trackResults(channelNr).Q_P.^2)', ... sqrt(trackResults(channelNr).I_L.^2 + ... trackResults(channelNr).Q_L.^2)', ... sqrt(trackResults(channelNr).I_VL.^2 + ... trackResults(channelNr).Q_VL.^2)'], ... '-*'); grid (handles(2, 2)); title (handles(2, 2), 'Correlation results'); xlabel(handles(2, 2), 'Time (s)'); axis (handles(2, 2), 'tight'); hLegend = legend(handles(2, 2), '$\sqrt{I_{VE}^2 + Q_{VE}^2}$', ... '$\sqrt{I_{E}^2 + Q_{E}^2}$', ... '$\sqrt{I_{P}^2 + Q_{P}^2}$', ... '$\sqrt{I_{L}^2 + Q_{L}^2}$', ... '$\sqrt{I_{VL}^2 + Q_{VL}^2}$'); %set interpreter from tex to latex. This will draw \sqrt correctly set(hLegend, 'Interpreter', 'Latex'); %----- PLL discriminator filtered---------------------------------- plot (handles(3, 1), timeAxisInSeconds, ... trackResults(channelNr).pllDiscrFilt, 'b'); grid (handles(3, 1)); axis (handles(3, 1), 'tight'); xlabel(handles(3, 1), 'Time (s)'); ylabel(handles(3, 1), 'Amplitude'); title (handles(3, 1), 'Filtered PLL discriminator'); %----- DLL discriminator unfiltered-------------------------------- plot (handles(3, 2), timeAxisInSeconds, ... trackResults(channelNr).dllDiscr, 'r'); grid (handles(3, 2)); axis (handles(3, 2), 'tight'); xlabel(handles(3, 2), 'Time (s)'); ylabel(handles(3, 2), 'Amplitude'); title (handles(3, 2), 'Raw DLL discriminator'); %----- DLL discriminator filtered---------------------------------- plot (handles(3, 3), timeAxisInSeconds, ... trackResults(channelNr).dllDiscrFilt, 'b'); grid (handles(3, 3)); axis (handles(3, 3), 'tight'); xlabel(handles(3, 3), 'Time (s)'); ylabel(handles(3, 3), 'Amplitude'); title (handles(3, 3), 'Filtered DLL discriminator'); end % for channelNr = channelList gnss-sdr-0.0.9/src/utils/matlab/plotTrackingE5a.m000066400000000000000000000151241305042567700216350ustar00rootroot00000000000000function plotTracking(channelList, trackResults, settings) %This function plots the tracking results for the given channel list. % %plotTracking(channelList, trackResults, settings) % % Inputs: % channelList - list of channels to be plotted. % trackResults - tracking results from the tracking function. % settings - receiver settings. %-------------------------------------------------------------------------- % SoftGNSS v3.0 % % Copyright (C) Darius Plausinaitis % Written by Darius Plausinaitis %-------------------------------------------------------------------------- %This program is free software; you can redistribute it and/or %modify it under the terms of the GNU General Public License %as published by the Free Software Foundation; either version 2 %of the License, or (at your option) any later version. % %This program is distributed in the hope that it will be useful, %but WITHOUT ANY WARRANTY; without even the implied warranty of %MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %GNU General Public License for more details. % %You should have received a copy of the GNU General Public License %along with this program; if not, write to the Free Software %Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, %USA. %-------------------------------------------------------------------------- %CVS record: %$Id: plotTracking.m,v 1.5.2.23 2006/08/14 14:45:14 dpl Exp $ % Protection - if the list contains incorrect channel numbers channelList = intersect(channelList, 1:settings.numberOfChannels); %=== For all listed channels ============================================== for channelNr = channelList %% Select (or create) and clear the figure ================================ % The number 200 is added just for more convenient handling of the open % figure windows, when many figures are closed and reopened. % Figures drawn or opened by the user, will not be "overwritten" by % this function. figure(channelNr +200); clf(channelNr +200); set(channelNr +200, 'Name', ['Channel ', num2str(channelNr), ... ' (PRN ', ... num2str(trackResults(channelNr).PRN), ... ') results']); %% Draw axes ============================================================== % Row 1 handles(1, 1) = subplot(3, 3, 1); handles(1, 2) = subplot(3, 3, [2 3]); % Row 2 handles(2, 1) = subplot(3, 3, 4); handles(2, 2) = subplot(3, 3, [5 6]); % Row 3 handles(3, 1) = subplot(3, 3, 7); handles(3, 2) = subplot(3, 3, 8); handles(3, 3) = subplot(3, 3, 9); %% Plot all figures ======================================================= timeAxisInSeconds = (1:settings.msToProcess)/1000; %----- Discrete-Time Scatter Plot --------------------------------- plot(handles(1, 1), trackResults(channelNr).I_PN,... trackResults(channelNr).Q_PN, ... '.'); grid (handles(1, 1)); axis (handles(1, 1), 'equal'); title (handles(1, 1), 'Discrete-Time Scatter Plot'); xlabel(handles(1, 1), 'I prompt'); ylabel(handles(1, 1), 'Q prompt'); %----- Nav bits --------------------------------------------------- plot (handles(1, 2), timeAxisInSeconds, ... trackResults(channelNr).I_PN); grid (handles(1, 2)); title (handles(1, 2), 'Bits of the navigation message'); xlabel(handles(1, 2), 'Time (s)'); axis (handles(1, 2), 'tight'); %----- PLL discriminator unfiltered-------------------------------- plot (handles(2, 1), timeAxisInSeconds, ... trackResults(channelNr).pllDiscr, 'r'); grid (handles(2, 1)); axis (handles(2, 1), 'tight'); xlabel(handles(2, 1), 'Time (s)'); ylabel(handles(2, 1), 'Amplitude'); title (handles(2, 1), 'Raw PLL discriminator'); %----- Correlation ------------------------------------------------ plot(handles(2, 2), timeAxisInSeconds, ... [sqrt(trackResults(channelNr).I_E.^2 + ... trackResults(channelNr).Q_E.^2)', ... sqrt(trackResults(channelNr).I_P.^2 + ... trackResults(channelNr).Q_P.^2)', ... sqrt(trackResults(channelNr).I_L.^2 + ... trackResults(channelNr).Q_L.^2)'], ... '-*'); grid (handles(2, 2)); title (handles(2, 2), 'Correlation results'); xlabel(handles(2, 2), 'Time (s)'); axis (handles(2, 2), 'tight'); hLegend = legend(handles(2, 2), '$\sqrt{I_{E}^2 + Q_{E}^2}$', ... '$\sqrt{I_{P}^2 + Q_{P}^2}$', ... '$\sqrt{I_{L}^2 + Q_{L}^2}$'); %set interpreter from tex to latex. This will draw \sqrt correctly set(hLegend, 'Interpreter', 'Latex'); %----- PLL discriminator filtered---------------------------------- plot (handles(3, 1), timeAxisInSeconds, ... trackResults(channelNr).pllDiscrFilt, 'b'); grid (handles(3, 1)); axis (handles(3, 1), 'tight'); xlabel(handles(3, 1), 'Time (s)'); ylabel(handles(3, 1), 'Amplitude'); title (handles(3, 1), 'Filtered PLL discriminator'); %----- DLL discriminator unfiltered-------------------------------- plot (handles(3, 2), timeAxisInSeconds, ... trackResults(channelNr).dllDiscr, 'r'); grid (handles(3, 2)); axis (handles(3, 2), 'tight'); xlabel(handles(3, 2), 'Time (s)'); ylabel(handles(3, 2), 'Amplitude'); title (handles(3, 2), 'Raw DLL discriminator'); %----- DLL discriminator filtered---------------------------------- plot (handles(3, 3), timeAxisInSeconds, ... trackResults(channelNr).dllDiscrFilt, 'b'); grid (handles(3, 3)); axis (handles(3, 3), 'tight'); xlabel(handles(3, 3), 'Time (s)'); ylabel(handles(3, 3), 'Amplitude'); title (handles(3, 3), 'Filtered DLL discriminator'); end % for channelNr = channelList gnss-sdr-0.0.9/src/utils/matlab/plot_acq_grid_gsoc.m000066400000000000000000000055661305042567700224740ustar00rootroot00000000000000% /*! % * \file plot_acq_grid_gsoc.m % * \brief Read GNSS-SDR Acquisition dump binary file using the provided % function and plot acquisition grid of acquisition statistic of PRN sat % % This function analyzes a experiment performed by Luis Esteve in the framework % of the Google Summer of Code (GSoC) 2012, with the collaboration of Javier Arribas % and Carles Fernández, related to the extension of GNSS-SDR to Galileo. % % * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com % * ------------------------------------------------------------------------- % * % * Copyright (C) 2010-2011 (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 . % * % * ------------------------------------------------------------------------- % */ function plot_acq_grid_gsoc(sat) file=['test_statistics_E_1C_sat_' num2str(sat) '_doppler_0.dat']; sampling_freq_Hz=4E6 Doppler_max_Hz = 9875 Doppler_min_Hz = -10000 Doppler_step_Hz = 125 % read files x=read_complex_binary (file); l_y=length(x); Doppler_axes=Doppler_min_Hz:Doppler_step_Hz:Doppler_max_Hz; l_x=length(Doppler_axes); acq_grid = zeros(l_x,l_y); index=0; for k=Doppler_min_Hz:Doppler_step_Hz:Doppler_max_Hz index=index+1; filename=['test_statistics_E_1C_sat_' num2str(sat) '_doppler_' num2str(k) '.dat']; acq_grid(index,:)=abs(read_complex_binary (filename)); end maximum_correlation_peak = max(max(acq_grid)) [fila,col]=find(acq_grid==max(max(acq_grid))); delay_error_sps = col -1 Doppler_error_Hz = Doppler_axes(fila) noise_grid=acq_grid; delay_span=floor(3*sampling_freq_Hz/(1.023e6)); Doppler_span=floor(500/Doppler_step_Hz); noise_grid(fila-Doppler_span:fila+Doppler_span,col-delay_span:col+delay_span)=0; n=numel(noise_grid)-(2*delay_span+1)*(2*Doppler_span+1); noise_floor= sum(sum(noise_grid))/n Gain_dbs = 10*log10(maximum_correlation_peak/noise_floor) %% Plot 3D FULL RESOLUTION [X,Y] = meshgrid(Doppler_axes,1:1:l_y); figure; surf(X,Y,acq_grid'); xlabel('Doppler(Hz)');ylabel('Code Delay(samples)');title(['GLRT statistic of Galileo Parallel Code Phase Search Acquisition. Local replica: E1C cboc PRN ' num2str(sat)]); endgnss-sdr-0.0.9/src/utils/matlab/plot_acq_grid_gsoc_e5.m000066400000000000000000000077411305042567700230620ustar00rootroot00000000000000% /*! % * \file plot_acq_grid_gsoc_e5.m % * \brief Read GNSS-SDR Acquisition dump binary file using the provided % function and plot acquisition grid of acquisition statistic of PRN sat. % CAF input must be 0 or 1 depending if the user desires to read the file % that resolves doppler ambiguity or not. % % This function analyzes a experiment performed by Marc Sales in the framework % of the Google Summer of Code (GSoC) 2014, with the collaboration of Luis Esteve, Javier Arribas % and Carles Fernández, related to the extension of GNSS-SDR to Galileo. % % * \author Marc Sales marcsales92(at)gmail.com, Luis Esteve, 2014. luis(at)epsilon-formacion.com % * ------------------------------------------------------------------------- % * % * Copyright (C) 2010-2014 (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 . % * % * ------------------------------------------------------------------------- % */ function plot_acq_grid_gsoc_e5(sat,CAF) path='/home/marc/git/gnss-sdr/data/'; file=[path 'test_statistics_E5a_sat_' num2str(sat) '_doppler_0.dat']; sampling_freq_Hz=32E6 %Doppler_max_Hz = 14875 %Doppler_min_Hz = -15000 %Doppler_step_Hz = 125 Doppler_max_Hz = 10000 Doppler_min_Hz = -10000 Doppler_step_Hz = 250 % read files %x=read_complex_binary (file); %x=load_complex_data(file); % complex %l_y=length(x); myFile = java.io.File(file); flen = length(myFile); l_y=flen/4;% float Doppler_axes=Doppler_min_Hz:Doppler_step_Hz:Doppler_max_Hz; l_x=length(Doppler_axes); acq_grid = zeros(l_x,l_y); index=0; for k=Doppler_min_Hz:Doppler_step_Hz:Doppler_max_Hz index=index+1; filename=[path 'test_statistics_E5a_sat_' num2str(sat) '_doppler_' num2str(k) '.dat']; fid=fopen(filename,'r'); xx=fread(fid,'float');%floats from squared correlation %xx=load_complex_data (filename); %complex acq_grid(index,:)=abs(xx); end [fila,col]=find(acq_grid==max(max(acq_grid))); if (CAF > 0) filename=[path 'test_statistics_E5a_sat_' num2str(sat) '_CAF.dat']; fid=fopen(filename,'r'); xx=fread(fid,'float');%floats from squared correlation acq_grid(:,col(1))=abs(xx); Doppler_error_Hz = Doppler_axes(xx==max(xx)) maximum_correlation_peak = max(xx) else Doppler_error_Hz = Doppler_axes(fila) maximum_correlation_peak = max(max(acq_grid)) end delay_error_sps = col -1 noise_grid=acq_grid; delay_span=floor(3*sampling_freq_Hz/(1.023e7)); Doppler_span=floor(500/Doppler_step_Hz); noise_grid(fila-Doppler_span:fila+Doppler_span,col-delay_span:col+delay_span)=0; n=numel(noise_grid)-(2*delay_span+1)*(2*Doppler_span+1); noise_floor= sum(sum(noise_grid))/n Gain_dbs = 10*log10(maximum_correlation_peak/noise_floor) %% Plot 3D FULL RESOLUTION [X,Y] = meshgrid(Doppler_axes,1:1:l_y); figure; surf(X,Y,acq_grid'); xlabel('Doppler(Hz)');ylabel('Code Delay(samples)');title(['GLRT statistic of Galileo Parallel Code Phase Search Acquisition. PRN ' num2str(sat)]); end function x=load_complex_data(file) fid = fopen(file,'r'); %fid = fopen('signal_source.dat','r'); myFile = java.io.File(file); flen = length(myFile); num_samples=flen/8; % 8 bytes (2 single floats) per complex sample for k=1:num_samples a(1:2) = fread(fid, 2, 'float'); x(k) = a(1) + a(2)*1i; k=k+1; end end gnss-sdr-0.0.9/src/utils/simulink/000077500000000000000000000000001305042567700170535ustar00rootroot00000000000000gnss-sdr-0.0.9/src/utils/simulink/Multi Thread/000077500000000000000000000000001305042567700213355ustar00rootroot00000000000000gnss-sdr-0.0.9/src/utils/simulink/Multi Thread/README_gnss_sdr_tcp_connector_parallel_tracking.txt000066400000000000000000000154301305042567700334160ustar00rootroot00000000000000 /*! * \file README.txt * \brief How to add a block to the Simulink Library repository of Matlab, * how to use the "gnss_sdr_tcp_connector_parallel_tracking_start.m" script * and how to replace the tracking block of the library. Parallel Computing * version. * * \author David Pubill, 2012. dpubill(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2012 (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 . * * ------------------------------------------------------------------------- */ IMPORTANT: Please, to use this tracking check the configuration file called 'gnss-sdr_tcp_connector_tracking.conf'. There are two major changes: 1.- Choose the [GPS_L1_CA_TCP_CONNECTOR_Tracking] tracking algorithm. 2.- Choose a tcp port for channel 0 (e.g. Tracking.port_ch0=2070;) A) HOW TO add a block to the Simulink Library repository of your Matlab installation --------------------------------------------------------------------------------- (These steps should be followed only the first time) 1.- Copy the content of this folder to a folder accessible from Simulink. 2.- In the Matlab Command Window type: >> simulink; to open the Simulink Library Browser. 3.- Right-click on the Simulink/User-Defined Functions of the Simulink Library menu, and click on "Open User-Defined Functions library" (Window_1). 4.- Open the library model 'gnss_sdr_tcp_connector_tracking_lib.mdl' (Window_2) 5.- If this is not the first time there should be an existing 'gnss-sdr' block in the 'User-Defined Functions' window that should be deleted before drag and drop the new 'gnss_sdr' block (which includes 3 blocks: - 'gnss_sdr_tcp_connector_tracking_rx' block - 'gnss_sdr_tcp_connector_tracking' block - 'gnss_sdr_tcp_connector_tracking_tx' block) from Window_2 to Window_1. A new message should appear: "This library is locked. The action performed requires it to be unlocked". Then, click on the "Unlock" button (the block will be copied) and close Window_2. 6.- Right-click on the 'gnss-sdr' block and click on "Link Options --> Disable link", repeat the action but now clicking on "Link Options --> Break link". This action disables and breaks the link with the original library model. 7.- On Window_1 save the "simulink/User-Defined Functions" library. To do that go to "File > Save". Then, close Window_1. 8.- From "Simulink Library Browser" window, press F5 to refresh and generate the new Simulink Library repository (it may take a few seconds). This completes the installation of the custom Simulink block. B) HOW TO use the "gnss_sdr_tcp_connector_parallel_tracking_start.m" script: ---------------------------------------------------------------- ----------------------- ------------------ ----------------------- | | | | | | | gnss_sdr_tcp_ | | gnss_sdr_tcp_ | | gnss_sdr_tcp_ | | connector_tracking_ | --> | connector_ | --> | connector_tracking_ | | rx | | tracking | | tx | | | | | | | ----------------------- ------------------ ----------------------- The 'gnss_sdr_tcp_connector_parallel_tracking_start.m' is the script that builds and configures a Simulink model for interacting with the GNSS-SDR platform through a TCP communication. Some 'User parameters' can be modified but, by default, these are the values assigned: %User parameters host = '84.88.61.86'; %Remote IP address (GNSS-SDR computer IP) port = 2070; %Remote port (GNSS-SDR computer port for Ch0) num_vars_rx = 9; %Number of variables expected from GNSS-SDR num_vars_tx = 4; %Number of variable to be transmitted to GNSS-SDR timeout = '40'; %Timeout in seconds 'host', 'port' and 'timeout' parameters configure both 'gnss_sdr_tcp_connector_tracking_rx' and 'gnss_sdr_tcp_connector_tracking_tx' blocks. The 'port' parameter sets the base port number for the first channel (ch0). Each of the subsequent channels increases their port by one unit (e.g. ch0_port=2070, ch1_port=2071,...). Also the name of the tracking block can be modified. It must match with the Simulink model name: %Name of the tracking block, it must match the Simulink model name tracking_block_name = 'gnss_sdr_tcp_connector_tracking'; To configure the MATLAB to work in parallel mode (the 'Parallel Computing' Toolbox must be installed in the MATLAB) type in the Matlab Command Window the following: >> matlabpool(C) where C is the number of cores of the computer to be used. Then it should appear a message like this one: "Destroying 1 pre-existing parallel job(s) created by matlabpool that were in the finished or failed state. Starting matlabpool using the 'local' configuration ... connected to 4 labs." Once the MATLAB is configured to work in parallel mode, type the following to run the script: >> gnss_sdr_tcp_connector_parallel_tracking_start(N,C); where N must match the number of channels configured in the GNSS-SDR platform and C is the same as before. Note: to stop working with the parallel mode type in the Command Window the following: >> matlabpool close C) HOW TO replace the tracking block of the library ------------------------------------------------ 1.- Open the library model 'gnss_sdr_tcp_connector_tracking_lib.mdl' 2.- Unlock the library. Click on "Edit > Unlock Library". 3.- Open the "gnss-sdr" block and change the "gnss_sdr_tcp_connector_tracking" block by another one. If the name is different it must be updated in the "gnss_sdr_tcp_connector_parallel_tracking_start.m" code (see section B) 4.- Save the new library. 5.- Go to section A and follow the instructions. gnss-sdr-0.0.9/src/utils/simulink/Multi Thread/gnss_sdr_tcp_connector_parallel_tracking_start.m000066400000000000000000000226001305042567700332300ustar00rootroot00000000000000% /*! % * \file gnss_sdr_tcp_connector_tracking_start.m % * \brief This MATLAB function builds and configures a Simulink model % * for interacting with the GNSS-SDR platform through a TCP % * communication. Parallel Computing version. % * \author David Pubill, 2012. dpubill(at)cttc.es % * % * ---------------------------------------------------------------------- % * % * Copyright (C) 2010-2012 (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 . % * % * ---------------------------------------------------------------------- % */ function gnss_sdr_tcp_connector_parallel_tracking_start(num_channels, num_cores) %The parallel for (parfor) loop allows to build and run a Simulink %model in parallel mode, programming different threads parfor i = 0:num_cores-1; %Open and close the Simulink Library simulink('open'); simulink('close'); %User parameters host = '84.88.61.86'; %Remote IP address (GNSS-SDR computer IP) port = 2070; %Remote port (GNSS-SDR computer port for Ch0) num_vars_rx = 9; %Number of variables expected from GNSS-SDR num_vars_tx = 4; %Number of variable to be transmitted to GNSS-SDR timeout = '40'; %Timeout [s] %Name of the tracking block, it must match the Simulink model name tracking_block_name = 'gnss_sdr_tcp_connector_tracking'; % Layout coordinates for the gnss_sdr_tcp_connector_tracking blocks X0 = 20; X1 = 170; Y0 = 20; Y1 = 140; X_offset = 200; Y_offset = 160; %Calculate the size of the data received from GNSS-SDR %(float = 4 bytes each variable) datasize_RX = num_vars_rx*4; %Create a Simulink model model_name = ['gnss_sdr_tcp_connector_parallel_tracking_aux_', num2str(i)]; new_system(model_name); open_system(model_name); %Set parameters to avoid warnings in the Command Window set_param(model_name,... 'InheritedTsInSrcMsg', 'none'); warning('off', 'Simulink:Commands:SetParamLinkChangeWarn'); %Assign values to the variables used by Simulink in the base workspace assignin('base', 'Ti', 1e-3); assignin('base', 'f0', 1.57542e9); assignin('base', 'SFunSlope', 3.5); assignin('base', 'Tc', 4e-3/4092); assignin('base', 'T', 1e-3); assignin('base', 'B_PLL', 50); assignin('base', 'B_DLL', 2); %Calculate some variables to control the number of blocks that %should content each Simulink model in function of the number of %cores specified min_num_blocks_per_model = floor(num_channels/num_cores); id = rem(num_channels,num_cores); if(i" LastModifiedBy "gnss" ModifiedDateFormat "%" LastModifiedDate "Wed Jun 27 13:07:39 2012" RTWModifiedTimeStamp 262702783 ModelVersionFormat "1.%" ConfigurationManager "None" SampleTimeColors off SampleTimeAnnotations off LibraryLinkDisplay "none" WideLines off ShowLineDimensions off ShowPortDataTypes off ShowLoopsOnError on IgnoreBidirectionalLines off ShowStorageClass off ShowTestPointIcons on ShowSignalResolutionIcons on ShowViewerIcons on SortedOrder off ExecutionContextIcon off ShowLinearizationAnnotations on BlockNameDataTip off BlockParametersDataTip off BlockDescriptionStringDataTip off ToolBar on StatusBar on BrowserShowLibraryLinks off BrowserLookUnderMasks off SimulationMode "normal" LinearizationMsg "none" Profile off ParamWorkspaceSource "MATLABWorkspace" RecordCoverage off CovSaveName "covdata" CovMetricSettings "dw" CovNameIncrementing off CovHtmlReporting on CovForceBlockReductionOff on covSaveCumulativeToWorkspaceVar on CovSaveSingleToWorkspaceVar on CovCumulativeReport off CovReportOnPause on CovModelRefEnable "Off" CovExternalEMLEnable off ExtModeBatchMode off ExtModeEnableFloating on ExtModeTrigType "manual" ExtModeTrigMode "normal" ExtModeTrigPort "1" ExtModeTrigElement "any" ExtModeTrigDuration 1000 ExtModeTrigDurationFloating "auto" ExtModeTrigHoldOff 0 ExtModeTrigDelay 0 ExtModeTrigDirection "rising" ExtModeTrigLevel 0 ExtModeArchiveMode "off" ExtModeAutoIncOneShot off ExtModeIncDirWhenArm off ExtModeAddSuffixToVar off ExtModeWriteAllDataToWs off ExtModeArmWhenConnect on ExtModeSkipDownloadWhenConnect off ExtModeLogAll on ExtModeAutoUpdateStatusClock on ShowModelReferenceBlockVersion off ShowModelReferenceBlockIO off Array { Type "Handle" Dimension 1 Simulink.ConfigSet { $ObjectID 1 Version "1.10.0" Array { Type "Handle" Dimension 9 Simulink.SolverCC { $ObjectID 2 Version "1.10.0" StartTime "0.0" StopTime "10.0" AbsTol "auto" FixedStep "auto" InitialStep "auto" MaxNumMinSteps "-1" MaxOrder 5 ZcThreshold "auto" ConsecutiveZCsStepRelTol "10*128*eps" MaxConsecutiveZCs "1000" ExtrapolationOrder 4 NumberNewtonIterations 1 MaxStep "auto" MinStep "auto" MaxConsecutiveMinStep "1" RelTol "1e-3" SolverMode "Auto" ConcurrentTasks off Solver "VariableStepDiscrete" SolverName "VariableStepDiscrete" SolverJacobianMethodControl "auto" ShapePreserveControl "DisableAll" ZeroCrossControl "UseLocalSettings" ZeroCrossAlgorithm "Nonadaptive" AlgebraicLoopSolver "TrustRegion" SolverResetMethod "Fast" PositivePriorityOrder off AutoInsertRateTranBlk off SampleTimeConstraint "Unconstrained" InsertRTBMode "Whenever possible" } Simulink.DataIOCC { $ObjectID 3 Version "1.10.0" Decimation "1" ExternalInput "[t, u]" FinalStateName "xFinal" InitialState "xInitial" LimitDataPoints on MaxDataPoints "1000" LoadExternalInput off LoadInitialState off SaveFinalState off SaveCompleteFinalSimState off SaveFormat "Array" SaveOutput on SaveState off SignalLogging on DSMLogging on InspectSignalLogs off SaveTime on ReturnWorkspaceOutputs off StateSaveName "xout" TimeSaveName "tout" OutputSaveName "yout" SignalLoggingName "logsout" DSMLoggingName "dsmout" OutputOption "RefineOutputTimes" OutputTimes "[]" ReturnWorkspaceOutputsName "out" Refine "1" } Simulink.OptimizationCC { $ObjectID 4 Version "1.10.0" Array { Type "Cell" Dimension 8 Cell "BooleansAsBitfields" Cell "PassReuseOutputArgsAs" Cell "PassReuseOutputArgsThreshold" Cell "ZeroExternalMemoryAtStartup" Cell "ZeroInternalMemoryAtStartup" Cell "OptimizeModelRefInitCode" Cell "NoFixptDivByZeroProtection" Cell "UseSpecifiedMinMax" PropName "DisabledProps" } BlockReduction on BooleanDataType on ConditionallyExecuteInputs on InlineParams off UseIntDivNetSlope off UseSpecifiedMinMax off InlineInvariantSignals off OptimizeBlockIOStorage on BufferReuse on EnhancedBackFolding off StrengthReduction off ExpressionFolding on BooleansAsBitfields off BitfieldContainerType "uint_T" EnableMemcpy on MemcpyThreshold 64 PassReuseOutputArgsAs "Structure reference" ExpressionDepthLimit 2147483647 FoldNonRolledExpr on LocalBlockOutputs on RollThreshold 5 SystemCodeInlineAuto off StateBitsets off DataBitsets off UseTempVars off ZeroExternalMemoryAtStartup on ZeroInternalMemoryAtStartup on InitFltsAndDblsToZero off NoFixptDivByZeroProtection off EfficientFloat2IntCast off EfficientMapNaN2IntZero on OptimizeModelRefInitCode off LifeSpan "inf" MaxStackSize "Inherit from target" BufferReusableBoundary on SimCompilerOptimization "Off" AccelVerboseBuild off } Simulink.DebuggingCC { $ObjectID 5 Version "1.10.0" RTPrefix "error" ConsistencyChecking "none" ArrayBoundsChecking "none" SignalInfNanChecking "none" SignalRangeChecking "none" ReadBeforeWriteMsg "UseLocalSettings" WriteAfterWriteMsg "UseLocalSettings" WriteAfterReadMsg "UseLocalSettings" AlgebraicLoopMsg "warning" ArtificialAlgebraicLoopMsg "warning" SaveWithDisabledLinksMsg "warning" SaveWithParameterizedLinksMsg "none" CheckSSInitialOutputMsg on UnderspecifiedInitializationDetection "Classic" MergeDetectMultiDrivingBlocksExec "none" CheckExecutionContextPreStartOutputMsg off CheckExecutionContextRuntimeOutputMsg off SignalResolutionControl "UseLocalSettings" BlockPriorityViolationMsg "warning" MinStepSizeMsg "warning" TimeAdjustmentMsg "none" MaxConsecutiveZCsMsg "error" MaskedZcDiagnostic "warning" IgnoredZcDiagnostic "warning" SolverPrmCheckMsg "warning" InheritedTsInSrcMsg "warning" DiscreteInheritContinuousMsg "warning" MultiTaskDSMMsg "error" MultiTaskCondExecSysMsg "error" MultiTaskRateTransMsg "error" SingleTaskRateTransMsg "none" TasksWithSamePriorityMsg "warning" SigSpecEnsureSampleTimeMsg "warning" CheckMatrixSingularityMsg "none" IntegerOverflowMsg "warning" Int32ToFloatConvMsg "warning" ParameterDowncastMsg "error" ParameterOverflowMsg "error" ParameterUnderflowMsg "none" ParameterPrecisionLossMsg "warning" ParameterTunabilityLossMsg "warning" FixptConstUnderflowMsg "none" FixptConstOverflowMsg "none" FixptConstPrecisionLossMsg "none" UnderSpecifiedDataTypeMsg "none" UnnecessaryDatatypeConvMsg "none" VectorMatrixConversionMsg "none" InvalidFcnCallConnMsg "error" FcnCallInpInsideContextMsg "Use local settings" SignalLabelMismatchMsg "none" UnconnectedInputMsg "warning" UnconnectedOutputMsg "warning" UnconnectedLineMsg "warning" SFcnCompatibilityMsg "none" UniqueDataStoreMsg "none" BusObjectLabelMismatch "warning" RootOutportRequireBusObject "warning" AssertControl "UseLocalSettings" EnableOverflowDetection off ModelReferenceIOMsg "none" ModelReferenceMultiInstanceNormalModeStructChecksumCheck "error" ModelReferenceVersionMismatchMessage "none" ModelReferenceIOMismatchMessage "none" ModelReferenceCSMismatchMessage "none" UnknownTsInhSupMsg "warning" ModelReferenceDataLoggingMessage "warning" ModelReferenceSymbolNameMessage "warning" ModelReferenceExtraNoncontSigs "error" StateNameClashWarn "warning" SimStateInterfaceChecksumMismatchMsg "warning" InitInArrayFormatMsg "warning" StrictBusMsg "ErrorLevel1" BusNameAdapt "WarnAndRepair" NonBusSignalsTreatedAsBus "none" LoggingUnavailableSignals "error" BlockIODiagnostic "none" SFUnusedDataAndEventsDiag "warning" SFUnexpectedBacktrackingDiag "warning" SFInvalidInputDataAccessInChartInitDiag "warning" SFNoUnconditionalDefaultTransitionDiag "warning" SFTransitionOutsideNaturalParentDiag "warning" } Simulink.HardwareCC { $ObjectID 6 Version "1.10.0" ProdBitPerChar 8 ProdBitPerShort 16 ProdBitPerInt 32 ProdBitPerLong 32 ProdBitPerFloat 32 ProdBitPerDouble 64 ProdBitPerPointer 32 ProdLargestAtomicInteger "Char" ProdLargestAtomicFloat "None" ProdIntDivRoundTo "Undefined" ProdEndianess "Unspecified" ProdWordSize 32 ProdShiftRightIntArith on ProdHWDeviceType "32-bit Generic" TargetBitPerChar 8 TargetBitPerShort 16 TargetBitPerInt 32 TargetBitPerLong 32 TargetBitPerFloat 32 TargetBitPerDouble 64 TargetBitPerPointer 32 TargetLargestAtomicInteger "Char" TargetLargestAtomicFloat "None" TargetShiftRightIntArith on TargetIntDivRoundTo "Undefined" TargetEndianess "Unspecified" TargetWordSize 32 TargetTypeEmulationWarnSuppressLevel 0 TargetPreprocMaxBitsSint 32 TargetPreprocMaxBitsUint 32 TargetHWDeviceType "Specified" TargetUnknown off ProdEqTarget on } Simulink.ModelReferenceCC { $ObjectID 7 Version "1.10.0" UpdateModelReferenceTargets "IfOutOfDateOrStructuralChange" CheckModelReferenceTargetMessage "error" EnableParallelModelReferenceBuilds off ParallelModelReferenceErrorOnInvalidPool on ParallelModelReferenceMATLABWorkerInit "None" ModelReferenceNumInstancesAllowed "Multi" PropagateVarSize "Infer from blocks in model" ModelReferencePassRootInputsByReference on ModelReferenceMinAlgLoopOccurrences off PropagateSignalLabelsOutOfModel off SupportModelReferenceSimTargetCustomCode off } Simulink.SFSimCC { $ObjectID 8 Version "1.10.0" SFSimEnableDebug on SFSimOverflowDetection on SFSimEcho on SimBlas on SimCtrlC on SimExtrinsic on SimIntegrity on SimUseLocalCustomCode off SimParseCustomCode on SimBuildMode "sf_incremental_build" } Simulink.RTWCC { $BackupClass "Simulink.RTWCC" $ObjectID 9 Version "1.10.0" Array { Type "Cell" Dimension 7 Cell "IncludeHyperlinkInReport" Cell "GenerateTraceInfo" Cell "GenerateTraceReport" Cell "GenerateTraceReportSl" Cell "GenerateTraceReportSf" Cell "GenerateTraceReportEml" Cell "GenerateSLWebview" PropName "DisabledProps" } SystemTargetFile "grt.tlc" GenCodeOnly off MakeCommand "make_rtw" GenerateMakefile on TemplateMakefile "grt_default_tmf" GenerateReport off SaveLog off RTWVerbose on RetainRTWFile off ProfileTLC off TLCDebug off TLCCoverage off TLCAssert off ProcessScriptMode "Default" ConfigurationMode "Optimized" ConfigAtBuild off RTWUseLocalCustomCode off RTWUseSimCustomCode off IncludeHyperlinkInReport off LaunchReport off TargetLang "C" IncludeBusHierarchyInRTWFileBlockHierarchyMap off IncludeERTFirstTime off GenerateTraceInfo off GenerateTraceReport off GenerateTraceReportSl off GenerateTraceReportSf off GenerateTraceReportEml off GenerateCodeInfo off GenerateSLWebview off RTWCompilerOptimization "Off" CheckMdlBeforeBuild "Off" CustomRebuildMode "OnUpdate" Array { Type "Handle" Dimension 2 Simulink.CodeAppCC { $ObjectID 10 Version "1.10.0" Array { Type "Cell" Dimension 21 Cell "IgnoreCustomStorageClasses" Cell "IgnoreTestpoints" Cell "InsertBlockDesc" Cell "InsertPolySpaceComments" Cell "SFDataObjDesc" Cell "MATLABFcnDesc" Cell "SimulinkDataObjDesc" Cell "DefineNamingRule" Cell "SignalNamingRule" Cell "ParamNamingRule" Cell "InlinedPrmAccess" Cell "CustomSymbolStr" Cell "CustomSymbolStrGlobalVar" Cell "CustomSymbolStrType" Cell "CustomSymbolStrField" Cell "CustomSymbolStrFcn" Cell "CustomSymbolStrFcnArg" Cell "CustomSymbolStrBlkIO" Cell "CustomSymbolStrTmpVar" Cell "CustomSymbolStrMacro" Cell "ReqsInCode" PropName "DisabledProps" } ForceParamTrailComments off GenerateComments on IgnoreCustomStorageClasses on IgnoreTestpoints off IncHierarchyInIds off MaxIdLength 31 PreserveName off PreserveNameWithParent off ShowEliminatedStatement off IncAutoGenComments off SimulinkDataObjDesc off SFDataObjDesc off MATLABFcnDesc off IncDataTypeInIds off MangleLength 1 CustomSymbolStrGlobalVar "$R$N$M" CustomSymbolStrType "$N$R$M" CustomSymbolStrField "$N$M" CustomSymbolStrFcn "$R$N$M$F" CustomSymbolStrFcnArg "rt$I$N$M" CustomSymbolStrBlkIO "rtb_$N$M" CustomSymbolStrTmpVar "$N$M" CustomSymbolStrMacro "$R$N$M" DefineNamingRule "None" ParamNamingRule "None" SignalNamingRule "None" InsertBlockDesc off InsertPolySpaceComments off SimulinkBlockComments on MATLABSourceComments off EnableCustomComments off InlinedPrmAccess "Literals" ReqsInCode off UseSimReservedNames off } Simulink.GRTTargetCC { $BackupClass "Simulink.TargetCC" $ObjectID 11 Version "1.10.0" Array { Type "Cell" Dimension 16 Cell "GeneratePreprocessorConditionals" Cell "IncludeMdlTerminateFcn" Cell "CombineOutputUpdateFcns" Cell "SuppressErrorStatus" Cell "ERTCustomFileBanners" Cell "GenerateSampleERTMain" Cell "GenerateTestInterfaces" Cell "ModelStepFunctionPrototypeControlCompliant" Cell "CPPClassGenCompliant" Cell "MultiInstanceERTCode" Cell "PurelyIntegerCode" Cell "SupportComplex" Cell "SupportAbsoluteTime" Cell "SupportContinuousTime" Cell "SupportNonInlinedSFcns" Cell "PortableWordSizes" PropName "DisabledProps" } TargetFcnLib "ansi_tfl_table_tmw.mat" TargetLibSuffix "" TargetPreCompLibLocation "" TargetFunctionLibrary "ANSI_C" UtilityFuncGeneration "Auto" ERTMultiwordTypeDef "System defined" ERTCodeCoverageTool "None" ERTMultiwordLength 256 MultiwordLength 2048 GenerateFullHeader on GenerateSampleERTMain off GenerateTestInterfaces off IsPILTarget off ModelReferenceCompliant on ParMdlRefBuildCompliant on CompOptLevelCompliant on IncludeMdlTerminateFcn on GeneratePreprocessorConditionals "Disable all" CombineOutputUpdateFcns off CombineSignalStateStructs off SuppressErrorStatus off ERTFirstTimeCompliant off IncludeFileDelimiter "Auto" ERTCustomFileBanners off SupportAbsoluteTime on LogVarNameModifier "rt_" MatFileLogging on MultiInstanceERTCode off SupportNonFinite on SupportComplex on PurelyIntegerCode off SupportContinuousTime on SupportNonInlinedSFcns on SupportVariableSizeSignals off EnableShiftOperators on ParenthesesLevel "Nominal" PortableWordSizes off ModelStepFunctionPrototypeControlCompliant off CPPClassGenCompliant off AutosarCompliant off UseMalloc off ExtMode off ExtModeStaticAlloc off ExtModeTesting off ExtModeStaticAllocSize 1000000 ExtModeTransport 0 ExtModeMexFile "ext_comm" ExtModeIntrfLevel "Level1" RTWCAPISignals off RTWCAPIParams off RTWCAPIStates off GenerateASAP2 off } PropName "Components" } } hdlcoderui.hdlcc { $ObjectID 12 Version "1.10.0" Description "HDL Coder custom configuration component" Name "HDL Coder" Array { Type "Cell" Dimension 1 Cell "" PropName "HDLConfigFile" } HDLCActiveTab "0" } PropName "Components" } Name "Configuration" CurrentDlgPage "Solver" ConfigPrmDlgPosition " [ 400, 210, 1280, 840 ] " } PropName "ConfigurationSets" } BlockDefaults { ForegroundColor "black" BackgroundColor "white" DropShadow off NamePlacement "normal" FontName "Helvetica" FontSize 10 FontWeight "normal" FontAngle "normal" ShowName on BlockRotation 0 BlockMirror off } AnnotationDefaults { HorizontalAlignment "center" VerticalAlignment "middle" ForegroundColor "black" BackgroundColor "white" DropShadow off FontName "Helvetica" FontSize 10 FontWeight "normal" FontAngle "normal" UseDisplayTextAsClickCallback off } LineDefaults { FontName "Helvetica" FontSize 9 FontWeight "normal" FontAngle "normal" } BlockParameterDefaults { Block { BlockType Abs ZeroCross on SampleTime "-1" OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: Same as input" LockScale off RndMeth "Floor" SaturateOnIntegerOverflow on } Block { BlockType ComplexToRealImag Output "Real and imag" SampleTime "-1" } Block { BlockType Concatenate NumInputs "2" ConcatenateDimension "1" } Block { BlockType Constant Value "1" VectorParams1D on SamplingMode "Sample based" OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: Inherit from 'Constant value'" LockScale off SampleTime "inf" FramePeriod "inf" PreserveConstantTs off } Block { BlockType DataTypeConversion OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: Inherit via back propagation" LockScale off ConvertRealWorld "Real World Value (RWV)" RndMeth "Zero" SaturateOnIntegerOverflow on SampleTime "-1" } Block { BlockType Display Format "short" Decimation "10" Floating off SampleTime "-1" } Block { BlockType Fcn Expr "sin(u[1])" SampleTime "-1" } Block { BlockType Gain Gain "1" Multiplication "Element-wise(K.*u)" ParamMin "[]" ParamMax "[]" ParamDataTypeStr "Inherit: Same as input" OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: Same as input" LockScale off RndMeth "Floor" SaturateOnIntegerOverflow on SampleTime "-1" } Block { BlockType Inport Port "1" OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: auto" LockScale off BusOutputAsStruct off PortDimensions "-1" VarSizeSig "Inherit" SampleTime "-1" SignalType "auto" SamplingMode "auto" LatchByDelayingOutsideSignal off LatchInputForFeedbackSignals off Interpolate on } Block { BlockType Math Operator "exp" OutputSignalType "auto" SampleTime "-1" OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: Same as first input" LockScale off RndMeth "Floor" SaturateOnIntegerOverflow on IntermediateResultsDataTypeStr "Inherit: Inherit via internal rule" AlgorithmType "Newton-Raphson" Iterations "3" } Block { BlockType Mux Inputs "4" DisplayOption "none" UseBusObject off BusObject "BusObject" NonVirtualBus off } Block { BlockType Outport Port "1" OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: auto" LockScale off BusOutputAsStruct off PortDimensions "-1" VarSizeSig "Inherit" SampleTime "-1" SignalType "auto" SamplingMode "auto" SourceOfInitialOutputValue "Dialog" OutputWhenDisabled "held" InitialOutput "[]" } Block { BlockType Product Inputs "2" Multiplication "Element-wise(.*)" CollapseMode "All dimensions" CollapseDim "1" InputSameDT on OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: Same as first input" LockScale off RndMeth "Zero" SaturateOnIntegerOverflow on SampleTime "-1" } Block { BlockType RealImagToComplex Input "Real and imag" ConstantPart "0" SampleTime "-1" } Block { BlockType SubSystem ShowPortLabels "FromPortIcon" Permissions "ReadWrite" PermitHierarchicalResolution "All" TreatAsAtomicUnit off CheckFcnCallInpInsideContextMsg off SystemSampleTime "-1" RTWFcnNameOpts "Auto" RTWFileNameOpts "Auto" RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" SimViewingDevice off DataTypeOverride "UseLocalSettings" DataTypeOverrideAppliesTo "AllNumericTypes" MinMaxOverflowLogging "UseLocalSettings" Variant off GeneratePreprocessorConditionals off } Block { BlockType Sum IconShape "rectangular" Inputs "++" CollapseMode "All dimensions" CollapseDim "1" InputSameDT on AccumDataTypeStr "Inherit: Inherit via internal rule" OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: Same as first input" LockScale off RndMeth "Floor" SaturateOnIntegerOverflow on SampleTime "-1" } Block { BlockType Switch Criteria "u2 >= Threshold" Threshold "0" InputSameDT on OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: Inherit via internal rule" LockScale off RndMeth "Floor" SaturateOnIntegerOverflow on ZeroCross on SampleTime "-1" AllowDiffInputSizes off } Block { BlockType Terminator } Block { BlockType Trigonometry Operator "sin" ApproximationMethod "None" NumberOfIterations "11" OutputSignalType "auto" SampleTime "-1" } Block { BlockType UnitDelay X0 "0" InputProcessing "Inherited" SampleTime "1" StateMustResolveToSignalObject off RTWStateStorageClass "Auto" } } System { Name "gnss_sdr_tcp_connector_tracking_lib" Location [532, 307, 1230, 742] Open on ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" ReportName "simulink-default.rpt" SIDHighWatermark "2078" Block { BlockType Reference Name "Model Info" SID "2" Ports [] Position [15, 15, 436, 409] ForegroundColor "green" ShowName off LibraryVersion "1.233" FontName "Arial" SourceBlock "simulink/Model-Wide\nUtilities/Model Info" SourceType "CMBlock" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off InitialBlockCM "None" BlockCM "None" Frame "on" DisplayStringWithTags "/*! \n * \\file gnss_sdr_tcp_connector_tracking_lib.mdl\n * \\brief gnss_sdr_tcp_con" "nector_tracking Simulink library model. For \n * further information, please check the README_gnss_sdr_tcp_con" "nector_tracking.txt\n * file or the README_gnss_sdr_tcp_connector_parallel_tracking.txt\n * file for parallel " "computing execution.\n *\n * \\author David Pubill, 2012. dpubill(at)cttc.es\n * ----------------------------" "---------------------------------------------\n *\n * Copyright (C) 2010-2012 (see AUTHORS file for a list of" " contributors)\n *\n * GNSS-SDR is a software defined Global Navigation\n * Satellite Systems receiv" "er\n *\n * This file is part of GNSS-SDR.\n *\n * GNSS-SDR is free software: you can redistribute it and/or " "modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundati" "on, either version 3 of the License, or\n * at your option) any later version.\n *\n * GNSS-SDR is distribute" "d in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * M" "ERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n" " *\n * You should have received a copy of the GNU General Public License\n * along with GNSS-SDR. If not, see" " .\n *\n * ---------------------------------------------------------------------" "----\n */" MaskDisplayString "/*! \\n * \\file gnss_sdr_tcp_connector_tracking_lib.mdl\\n * \\brief gnss_sdr_tcp_c" "onnector_tracking Simulink library model. For \\n * further information, please check the README_gnss_sdr_tcp_" "connector_tracking.txt\\n * file or the README_gnss_sdr_tcp_connector_parallel_tracking.txt\\n * file for para" "llel computing execution.\\n *\\n * \\author David Pubill, 2012. dpubill(at)cttc.es\\n * --------------------" "-----------------------------------------------------\\n *\\n * Copyright (C) 2010-2012 (see AUTHORS file for" " a list of contributors)\\n *\\n * GNSS-SDR is a software defined Global Navigation\\n * Satellite S" "ystems receiver\\n *\\n * This file is part of GNSS-SDR.\\n *\\n * GNSS-SDR is free software: you can redist" "ribute it and/or modify\\n * it under the terms of the GNU General Public License as published by\\n * the Fre" "e Software Foundation, either version 3 of the License, or\\n * at your option) any later version.\\n *\\n * " "GNSS-SDR is distributed in the hope that it will be useful,\\n * but WITHOUT ANY WARRANTY; without even the imp" "lied warranty of\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\n * GNU General Public Li" "cense for more details.\\n *\\n * You should have received a copy of the GNU General Public License\\n * alon" "g with GNSS-SDR. If not, see .\\n *\\n * ---------------------------------------" "----------------------------------\\n */" HorizontalTextAlignment "Left" LeftAlignmentValue "0.02" SourceBlockDiagram "gnss_sdr_tcp_connector_tracking_lib" TagMaxNumber "20" } Block { BlockType SubSystem Name "gnss_sdr" SID "2052" Ports [] Position [460, 127, 605, 263] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "gnss_sdr" Location [395, 454, 1025, 704] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType SubSystem Name "gnss_sdr_tcp_connector_tracking" SID "3" Ports [9, 5] Position [230, 26, 400, 224] AncestorBlock "simulink/User-Defined\nFunctions/gnss_sdr/gnss_sdr_tcp_connector_tracking" LibraryVersion "*1.267" MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "gnss_sdr_tcp_connector_tracking" Location [191, 355, 936, 831] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" SIDHighWatermark "11895" SIDPrevWatermark "11844" Block { BlockType Inport Name "control_id" SID "3:11618" Position [55, 13, 85, 27] IconDisplay "Port number" } Block { BlockType Inport Name "d_E_I" SID "3:11619" Position [55, 48, 85, 62] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "d_E_Q" SID "3:11620" Position [55, 83, 85, 97] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "d_L_I" SID "3:11621" Position [55, 128, 85, 142] Port "4" IconDisplay "Port number" } Block { BlockType Inport Name "d_L_Q" SID "3:11622" Position [55, 163, 85, 177] Port "5" IconDisplay "Port number" } Block { BlockType Inport Name "d_P_I" SID "3:11623" Position [55, 243, 85, 257] Port "6" IconDisplay "Port number" } Block { BlockType Inport Name "d_P_Q" SID "3:11624" Position [55, 278, 85, 292] Port "7" IconDisplay "Port number" } Block { BlockType Inport Name "d_acq_carrier_doppler_[Hz]" SID "3:11625" Position [55, 313, 85, 327] Port "8" IconDisplay "Port number" } Block { BlockType Inport Name "enable_tracking" SID "3:11626" Position [55, 363, 85, 377] Port "9" IconDisplay "Port number" } Block { BlockType Abs Name "Abs" SID "3:11888" Position [295, 214, 315, 236] ShowName off SaturateOnIntegerOverflow off } Block { BlockType Abs Name "Abs1" SID "3:11891" Position [295, 189, 315, 211] ShowName off SaturateOnIntegerOverflow off } Block { BlockType Abs Name "Abs2" SID "3:11892" Position [295, 164, 315, 186] ShowName off SaturateOnIntegerOverflow off } Block { BlockType SubSystem Name "Carrier Tracking \n(PLL)" SID "3:11630" Ports [3, 2] Position [260, 244, 385, 396] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Carrier Tracking \n(PLL)" Location [119, 115, 924, 369] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "P" SID "3:11631" Position [55, 38, 85, 52] IconDisplay "Port number" } Block { BlockType Inport Name "d_acq_carrier_doppler_[Hz]" SID "3:11632" Position [55, 153, 85, 167] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "enable_tracking" SID "3:11633" Position [55, 213, 85, 227] Port "3" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "3:11634" Position [160, 140, 200, 180] ShowName off OutDataTypeStr "double" } Block { BlockType Reference Name "Delay" SID "3:11635" Ports [1, 1] Position [470, 75, 500, 115] BlockRotation 270 ShowName off LibraryVersion "1.233" UserDataPersistent on UserData "DataTag0" SourceBlock "simulink/Discrete/Integer Delay" SourceType "Integer Delay" NumDelays "1" InputProcessing "Inherited" vinit "0.0" samptime "Ti" } Block { BlockType SubSystem Name "Error\nAccumulator" SID "3:11636" Ports [2, 1] Position [575, 28, 685, 92] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Error\nAccumulator" Location [361, 424, 744, 624] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "e" SID "3:11637" Position [30, 23, 60, 37] IconDisplay "Port number" } Block { BlockType Inport Name "enable_tracking" SID "3:11638" Position [30, 58, 60, 72] Port "2" IconDisplay "Port number" } Block { BlockType Constant Name "Constant" SID "3:11639" Position [145, 85, 175, 115] ShowName off Value "0" SampleTime "-1" } Block { BlockType Sum Name "Sum2" SID "3:11640" Ports [2, 1] Position [90, 20, 110, 40] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" } Block { BlockType Switch Name "Switch" SID "3:11641" Position [200, 12, 250, 118] ShowName off Threshold "1" InputSameDT off SaturateOnIntegerOverflow off } Block { BlockType UnitDelay Name "Unit Delay" SID "3:11642" Position [170, 135, 205, 175] BlockMirror on ShowName off SampleTime "-1" } Block { BlockType Outport Name "sum(e)" SID "3:11643" Position [325, 58, 355, 72] IconDisplay "Port number" } Line { SrcBlock "e" SrcPort 1 DstBlock "Sum2" DstPort 1 } Line { SrcBlock "Unit Delay" SrcPort 1 Points [-65, 0] DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 DstBlock "Switch" DstPort 1 } Line { SrcBlock "Switch" SrcPort 1 Points [25, 0] Branch { DstBlock "sum(e)" DstPort 1 } Branch { Points [0, 90] DstBlock "Unit Delay" DstPort 1 } } Line { SrcBlock "enable_tracking" SrcPort 1 DstBlock "Switch" DstPort 2 } Line { SrcBlock "Constant" SrcPort 1 DstBlock "Switch" DstPort 3 } } } Block { BlockType SubSystem Name "First-Order\nLow-Pass Filter" SID "3:11644" Ports [1, 1] Position [310, 21, 370, 69] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "First-Order\nLow-Pass Filter" Location [181, 144, 1019, 332] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In" SID "3:11645" Position [25, 28, 55, 42] IconDisplay "Port number" } Block { BlockType Constant Name "B" SID "3:11646" Position [15, 99, 65, 131] ShowName off Value "B_PLL" SampleTime "T" } Block { BlockType Product Name "Product" SID "3:11647" Ports [2, 1] Position [265, 92, 295, 123] ShowName off InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product1" SID "3:11648" Ports [2, 1] Position [170, 27, 205, 63] ShowName off InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum" SID "3:11649" Ports [2, 1] Position [410, 35, 430, 55] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SampleTime "T" } Block { BlockType Sum Name "Sum1" SID "3:11650" Ports [2, 1] Position [325, 100, 345, 120] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" } Block { BlockType UnitDelay Name "Unit Delay" SID "3:11651" Position [360, 140, 395, 180] BlockMirror on ShowName off SampleTime "T" } Block { BlockType Gain Name "gamma" SID "3:11652" Position [110, 40, 140, 70] Gain "(16*(0.707)^2*T) / (1 + 4*(0.707)^2);" ParamDataTypeStr "Inherit: Inherit via internal rule" OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Gain Name "rho" SID "3:11653" Position [105, 104, 155, 126] Gain "(4*T) / (1 + 4*(0.707)^2)" ParamDataTypeStr "Inherit: Inherit via internal rule" OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out" SID "3:11654" Position [460, 38, 490, 52] IconDisplay "Port number" } Line { SrcBlock "rho" SrcPort 1 DstBlock "Product" DstPort 2 } Line { SrcBlock "gamma" SrcPort 1 DstBlock "Product1" DstPort 2 } Line { Labels [0, 0] SrcBlock "B" SrcPort 1 Points [15, 0] Branch { DstBlock "rho" DstPort 1 } Branch { Points [0, -60] DstBlock "gamma" DstPort 1 } } Line { SrcBlock "Product" SrcPort 1 DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Product1" SrcPort 1 Points [20, 0] Branch { Points [0, 55] DstBlock "Product" DstPort 1 } Branch { DstBlock "Sum" DstPort 1 } } Line { SrcBlock "Sum1" SrcPort 1 Points [70, 0] Branch { DstBlock "Sum" DstPort 2 } Branch { Points [0, 50] DstBlock "Unit Delay" DstPort 1 } } Line { Labels [0, 0] SrcBlock "Unit Delay" SrcPort 1 Points [-20, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "In" SrcPort 1 DstBlock "Product1" DstPort 1 } Line { SrcBlock "Sum" SrcPort 1 DstBlock "Out" DstPort 1 } } } Block { BlockType SubSystem Name "PLL Costas loop two \nquadrant arctan discriminator" SID "3:11866" Ports [1, 1] Position [150, 14, 210, 76] AncestorBlock "gnss_sdr_tcp_connector_tracking_lib/gnss_sdr/gnss_sdr_tcp_connector_tracking/Carrier Tracking \n" "(PLL)/atan2(Q,I)1/PLL Costas loop two quadrant arctan discriminator" LibraryVersion "*1.36" MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "PLL Costas loop two \nquadrant arctan discriminator" Location [32, 150, 415, 234] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" SIDHighWatermark "11859" SIDPrevWatermark "11859" Block { BlockType Inport Name "In" SID "3:11866:11670" Position [25, 38, 55, 52] IconDisplay "Port number" } Block { BlockType ComplexToRealImag Name "Complex to\nReal-Imag" SID "3:11866:11671" Ports [1, 2] Position [80, 28, 110, 57] ShowName off Output "Real and imag" } Block { BlockType Product Name "Divide" SID "3:11866:11672" Ports [2, 1] Position [150, 27, 180, 58] ShowName off Inputs "*/" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Trigonometry Name "Trigonometric\nFunction" SID "3:11866:11673" Ports [1, 1] Position [220, 30, 250, 60] ShowName off Operator "atan" } Block { BlockType Outport Name "Out" SID "3:11866:11674" Position [285, 38, 315, 52] IconDisplay "Port number" } Line { SrcBlock "Divide" SrcPort 1 DstBlock "Trigonometric\nFunction" DstPort 1 } Line { SrcBlock "Complex to\nReal-Imag" SrcPort 1 DstBlock "Divide" DstPort 1 } Line { SrcBlock "In" SrcPort 1 DstBlock "Complex to\nReal-Imag" DstPort 1 } Line { SrcBlock "Trigonometric\nFunction" SrcPort 1 DstBlock "Out" DstPort 1 } Line { SrcBlock "Complex to\nReal-Imag" SrcPort 2 DstBlock "Divide" DstPort 2 } } } Block { BlockType Sum Name "Sum" SID "3:11658" Ports [2, 1] Position [475, 35, 495, 55] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "3:11659" Ports [2, 1] Position [510, 150, 530, 170] ShowName off IconShape "round" Inputs "++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Gain Name "[Hz] to [rad/Ti]" SID "3:11860" Position [285, 143, 355, 177] Gain "2*pi*Ti" } Block { BlockType Gain Name "[rad/Ti] to [rad/s]" SID "3:11664" Position [620, 142, 655, 178] Gain "1/Ti" ParamDataTypeStr "Inherit: Inherit via internal rule" OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "carrier_error" SID "3:11679" Position [720, 53, 750, 67] IconDisplay "Port number" } Block { BlockType Outport Name "carrier_doppler" SID "3:11680" Position [720, 153, 750, 167] Port "2" IconDisplay "Port number" } Line { SrcBlock "Sum" SrcPort 1 DstBlock "Error\nAccumulator" DstPort 1 } Line { SrcBlock "Error\nAccumulator" SrcPort 1 DstBlock "carrier_error" DstPort 1 } Line { SrcBlock "P" SrcPort 1 DstBlock "PLL Costas loop two \nquadrant arctan discriminator" DstPort 1 } Line { SrcBlock "[rad/Ti] to [rad/s]" SrcPort 1 DstBlock "carrier_doppler" DstPort 1 } Line { SrcBlock "Delay" SrcPort 1 DstBlock "Sum" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 DstBlock "[rad/Ti] to [rad/s]" DstPort 1 } Line { SrcBlock "d_acq_carrier_doppler_[Hz]" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "[Hz] to [rad/Ti]" DstPort 1 } Line { SrcBlock "enable_tracking" SrcPort 1 Points [455, 0; 0, -145] DstBlock "Error\nAccumulator" DstPort 2 } Line { SrcBlock "[Hz] to [rad/Ti]" SrcPort 1 Points [125, 0] Branch { DstBlock "Delay" DstPort 1 } Branch { DstBlock "Sum2" DstPort 2 } } Line { SrcBlock "First-Order\nLow-Pass Filter" SrcPort 1 Points [75, 0] Branch { DstBlock "Sum" DstPort 1 } Branch { Points [0, -40; 70, 0] DstBlock "Sum2" DstPort 1 } } Line { SrcBlock "PLL Costas loop two \nquadrant arctan discriminator" SrcPort 1 DstBlock "First-Order\nLow-Pass Filter" DstPort 1 } } } Block { BlockType SubSystem Name "Code Tracking\n(DLL)" SID "3:11681" Ports [4, 1] Position [445, 41, 560, 224] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Code Tracking\n(DLL)" Location [159, 437, 775, 684] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "E" SID "3:11682" Position [25, 43, 55, 57] IconDisplay "Port number" } Block { BlockType Inport Name "P" SID "3:11683" Position [25, 78, 55, 92] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "L" SID "3:11684" Position [25, 113, 55, 127] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "carrier_aid" SID "3:11685" Position [25, 183, 55, 197] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Delay" SID "3:11687" Ports [1, 1] Position [493, 130, 527, 160] BlockRotation 270 ShowName off LibraryVersion "1.233" UserDataPersistent on UserData "DataTag1" SourceBlock "simulink/Discrete/Integer Delay" SourceType "Integer Delay" NumDelays "1" InputProcessing "Inherited" vinit "0.0" samptime "Ti" } Block { BlockType SubSystem Name "Early-Late Power" SID "3:11688" Ports [2, 1] Position [190, 16, 255, 154] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Early-Late Power" Location [509, 255, 823, 453] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "E" SID "3:11689" Position [15, 23, 45, 37] IconDisplay "Port number" } Block { BlockType Inport Name "L" SID "3:11690" Position [15, 133, 45, 147] Port "2" IconDisplay "Port number" } Block { BlockType Math Name "E power" SID "3:11863" Ports [1, 1] Position [90, 15, 120, 45] Operator "magnitude^2" } Block { BlockType Math Name "L power" SID "3:11864" Ports [1, 1] Position [90, 125, 120, 155] Operator "magnitude^2" } Block { BlockType Sum Name "Sum" SID "3:11865" Ports [2, 1] Position [140, 75, 160, 95] ShowName off IconShape "round" Inputs "+|-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" } Block { BlockType Gain Name "to [chip]" SID "3:11703" Position [185, 70, 215, 100] Gain "1/SFunSlope" } Block { BlockType Outport Name "Tau" SID "3:11704" Position [245, 78, 275, 92] IconDisplay "Port number" } Line { SrcBlock "to [chip]" SrcPort 1 DstBlock "Tau" DstPort 1 } Line { SrcBlock "Sum" SrcPort 1 DstBlock "to [chip]" DstPort 1 } Line { SrcBlock "L power" SrcPort 1 Points [25, 0] DstBlock "Sum" DstPort 2 } Line { SrcBlock "E power" SrcPort 1 Points [25, 0] DstBlock "Sum" DstPort 1 } Line { SrcBlock "E" SrcPort 1 DstBlock "E power" DstPort 1 } Line { SrcBlock "L" SrcPort 1 DstBlock "L power" DstPort 1 } } } Block { BlockType Gain Name "Gain" SID "3:11714" Position [350, 70, 380, 100] Gain "-1" ParamDataTypeStr "Inherit: Inherit via internal rule" OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType SubSystem Name "Normalization" SID "3:11716" Ports [3, 3] Position [85, 35, 135, 135] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Normalization" Location [536, 524, 961, 789] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "E" SID "3:11717" Position [25, 28, 55, 42] IconDisplay "Port number" } Block { BlockType Inport Name "P" SID "3:11718" Position [25, 108, 55, 122] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "L" SID "3:11719" Position [25, 198, 55, 212] Port "3" IconDisplay "Port number" } Block { BlockType Product Name "E Normalisation" SID "3:11720" Ports [2, 1] Position [270, 26, 315, 59] Inputs "*/" InputSameDT off RndMeth "Floor" } Block { BlockType Product Name "L Normalisation" SID "3:11721" Ports [2, 1] Position [270, 196, 315, 229] Inputs "*/" InputSameDT off RndMeth "Floor" } Block { BlockType Product Name "P Normalisation" SID "3:11722" Ports [2, 1] Position [270, 106, 315, 139] Inputs "*/" InputSameDT off RndMeth "Floor" } Block { BlockType SubSystem Name "Power Estimation" SID "3:11723" Ports [1, 1] Position [120, 126, 195, 184] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Power Estimation" Location [431, 459, 986, 620] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "in" SID "3:11724" Position [25, 78, 55, 92] IconDisplay "Port number" } Block { BlockType Abs Name "Abs(Im)" SID "3:11725" Position [175, 105, 205, 135] SaturateOnIntegerOverflow off } Block { BlockType Abs Name "Abs(Re)" SID "3:11726" Position [175, 30, 205, 60] SaturateOnIntegerOverflow off } Block { BlockType ComplexToRealImag Name "Complex to\nReal-Imag" SID "3:11728" Ports [1, 2] Position [105, 68, 135, 97] Output "Real and imag" } Block { BlockType Math Name "Im^2" SID "3:11739" Ports [1, 1] Position [335, 105, 365, 135] Operator "square" } Block { BlockType SubSystem Name "Mean(Im)" SID "3:11747" Ports [1, 1] Position [240, 95, 300, 145] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Mean(Im)" Location [489, 513, 989, 689] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "in" SID "3:11748" Position [25, 83, 55, 97] IconDisplay "Port number" } Block { BlockType Gain Name "Gain" SID "3:11749" Position [340, 70, 385, 110] ShowName off Gain "1/10" ParamDataTypeStr "Inherit: Inherit via internal rule" OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Integer Delay" SID "3:11750" Ports [1, 1] Position [125, 28, 160, 62] ShowName off LibraryVersion "1.302" UserDataPersistent on UserData "DataTag2" SourceBlock "simulink/Discrete/Integer Delay" SourceType "Integer Delay" NumDelays "10" InputProcessing "Inherited" vinit "100" samptime "-1" } Block { BlockType Sum Name "Sum" SID "3:11751" Ports [3, 1] Position [195, 80, 215, 100] ShowName off IconShape "round" Inputs "-++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType UnitDelay Name "Unit Delay" SID "3:11752" Position [235, 118, 270, 152] BlockMirror on ShowName off X0 "100*10" SampleTime "-1" } Block { BlockType Outport Name "mean" SID "3:11753" Position [425, 83, 455, 97] IconDisplay "Port number" } Line { SrcBlock "Integer Delay" SrcPort 1 Points [40, 0] DstBlock "Sum" DstPort 1 } Line { SrcBlock "in" SrcPort 1 Points [30, 0] Branch { Points [0, -45] DstBlock "Integer Delay" DstPort 1 } Branch { DstBlock "Sum" DstPort 2 } } Line { SrcBlock "Gain" SrcPort 1 DstBlock "mean" DstPort 1 } Line { SrcBlock "Unit Delay" SrcPort 1 Points [-25, 0] DstBlock "Sum" DstPort 3 } Line { SrcBlock "Sum" SrcPort 1 Points [90, 0] Branch { DstBlock "Gain" DstPort 1 } Branch { Points [0, 45] DstBlock "Unit Delay" DstPort 1 } } } } Block { BlockType SubSystem Name "Mean(Re)" SID "3:11754" Ports [1, 1] Position [240, 20, 300, 70] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Mean(Re)" Location [489, 513, 989, 689] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "in" SID "3:11755" Position [25, 83, 55, 97] IconDisplay "Port number" } Block { BlockType Gain Name "Gain" SID "3:11756" Position [330, 70, 375, 110] Gain "1/10" ParamDataTypeStr "Inherit: Inherit via internal rule" OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Integer Delay" SID "3:11757" Ports [1, 1] Position [125, 28, 160, 62] ShowName off LibraryVersion "1.302" UserDataPersistent on UserData "DataTag3" SourceBlock "simulink/Discrete/Integer Delay" SourceType "Integer Delay" NumDelays "100" InputProcessing "Inherited" vinit "100" samptime "-1" } Block { BlockType Sum Name "Sum" SID "3:11758" Ports [3, 1] Position [195, 80, 215, 100] ShowName off IconShape "round" Inputs "-++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType UnitDelay Name "Unit Delay" SID "3:11759" Position [230, 118, 265, 152] BlockMirror on ShowName off X0 "100*10" SampleTime "-1" } Block { BlockType Outport Name "mean" SID "3:11760" Position [425, 83, 455, 97] IconDisplay "Port number" } Line { SrcBlock "Sum" SrcPort 1 Points [75, 0] Branch { Points [0, 45] DstBlock "Unit Delay" DstPort 1 } Branch { DstBlock "Gain" DstPort 1 } } Line { SrcBlock "Unit Delay" SrcPort 1 Points [-20, 0] DstBlock "Sum" DstPort 3 } Line { SrcBlock "Gain" SrcPort 1 DstBlock "mean" DstPort 1 } Line { SrcBlock "in" SrcPort 1 Points [30, 0] Branch { DstBlock "Sum" DstPort 2 } Branch { Points [0, -45] DstBlock "Integer Delay" DstPort 1 } } Line { SrcBlock "Integer Delay" SrcPort 1 Points [40, 0] DstBlock "Sum" DstPort 1 } } } Block { BlockType Math Name "Power\nto\nAmplitude" SID "3:11763" Ports [1, 1] Position [435, 70, 465, 100] Operator "sqrt" } Block { BlockType Math Name "Re^2" SID "3:11765" Ports [1, 1] Position [335, 30, 365, 60] Operator "square" } Block { BlockType Sum Name "Sum" SID "3:11769" Ports [2, 1] Position [380, 75, 400, 95] ShowName off IconShape "round" Inputs "+|+" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "out" SID "3:11777" Position [490, 78, 520, 92] IconDisplay "Port number" } Line { SrcBlock "Im^2" SrcPort 1 Points [20, 0] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Re^2" SrcPort 1 Points [20, 0] DstBlock "Sum" DstPort 1 } Line { SrcBlock "Complex to\nReal-Imag" SrcPort 1 Points [15, 0; 0, -30] DstBlock "Abs(Re)" DstPort 1 } Line { SrcBlock "Abs(Re)" SrcPort 1 DstBlock "Mean(Re)" DstPort 1 } Line { SrcBlock "Complex to\nReal-Imag" SrcPort 2 Points [20, 0] DstBlock "Abs(Im)" DstPort 1 } Line { SrcBlock "Abs(Im)" SrcPort 1 DstBlock "Mean(Im)" DstPort 1 } Line { SrcBlock "Sum" SrcPort 1 DstBlock "Power\nto\nAmplitude" DstPort 1 } Line { SrcBlock "Mean(Im)" SrcPort 1 DstBlock "Im^2" DstPort 1 } Line { SrcBlock "Mean(Re)" SrcPort 1 DstBlock "Re^2" DstPort 1 } Line { SrcBlock "in" SrcPort 1 DstBlock "Complex to\nReal-Imag" DstPort 1 } Line { SrcBlock "Power\nto\nAmplitude" SrcPort 1 DstBlock "out" DstPort 1 } } } Block { BlockType Outport Name "E'" SID "3:11778" Position [360, 38, 390, 52] IconDisplay "Port number" } Block { BlockType Outport Name "P'" SID "3:11779" Position [360, 118, 390, 132] Port "2" IconDisplay "Port number" } Block { BlockType Outport Name "L'" SID "3:11780" Position [360, 208, 390, 222] Port "3" IconDisplay "Port number" } Line { SrcBlock "P" SrcPort 1 Points [25, 0] Branch { DstBlock "P Normalisation" DstPort 1 } Branch { Labels [0, 0] Points [0, 40] DstBlock "Power Estimation" DstPort 1 } } Line { SrcBlock "E" SrcPort 1 DstBlock "E Normalisation" DstPort 1 } Line { SrcBlock "E Normalisation" SrcPort 1 DstBlock "E'" DstPort 1 } Line { SrcBlock "P Normalisation" SrcPort 1 DstBlock "P'" DstPort 1 } Line { SrcBlock "L" SrcPort 1 DstBlock "L Normalisation" DstPort 1 } Line { SrcBlock "L Normalisation" SrcPort 1 DstBlock "L'" DstPort 1 } Line { SrcBlock "Power Estimation" SrcPort 1 Points [30, 0; 0, 0] Branch { Points [0, -25] Branch { Points [0, -80] DstBlock "E Normalisation" DstPort 2 } Branch { DstBlock "P Normalisation" DstPort 2 } } Branch { Points [0, 65] DstBlock "L Normalisation" DstPort 2 } } } } Block { BlockType Sum Name "Sum" SID "3:11783" Ports [2, 1] Position [500, 75, 520, 95] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Terminator Name "Terminator" SID "3:11784" Position [155, 75, 175, 95] ShowName off } Block { BlockType SubSystem Name "Zero Order\nLow-Pass Filter" SID "3:11785" Ports [1, 1] Position [405, 59, 460, 111] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Zero Order\nLow-Pass Filter" Location [217, 135, 598, 254] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "in" SID "3:11894" Position [25, 28, 55, 42] IconDisplay "Port number" } Block { BlockType Constant Name "B" SID "3:11787" Position [15, 66, 65, 94] ShowName off Value "B_DLL" SampleTime "T" } Block { BlockType Fcn Name "Fcn" SID "3:11788" Position [100, 63, 245, 97] ShowName off Expr "(4*u*T) / (1 + 2*u*T);" } Block { BlockType Product Name "Product" SID "3:11789" Ports [2, 1] Position [285, 42, 315, 73] ShowName off InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "out" SID "3:11895" Position [345, 53, 375, 67] IconDisplay "Port number" } Line { SrcBlock "Fcn" SrcPort 1 Points [20, 0] DstBlock "Product" DstPort 2 } Line { SrcBlock "B" SrcPort 1 DstBlock "Fcn" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "out" DstPort 1 } Line { SrcBlock "in" SrcPort 1 Points [210, 0] DstBlock "Product" DstPort 1 } } } Block { BlockType Gain Name "[chip] to [s]" SID "3:11862" Position [290, 70, 320, 100] Gain "Tc" } Block { BlockType Gain Name "[rad/s] to [s/Ti]" SID "3:11795" Position [290, 174, 415, 206] Gain "-Ti/(2*pi*f0)" ParamDataTypeStr "Inherit: Inherit via internal rule" OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "code_error [s]" SID "3:11798" Position [565, 78, 595, 92] IconDisplay "Port number" } Line { SrcBlock "Gain" SrcPort 1 DstBlock "Zero Order\nLow-Pass Filter" DstPort 1 } Line { SrcBlock "L" SrcPort 1 DstBlock "Normalization" DstPort 3 } Line { SrcBlock "P" SrcPort 1 DstBlock "Normalization" DstPort 2 } Line { SrcBlock "E" SrcPort 1 DstBlock "Normalization" DstPort 1 } Line { SrcBlock "[chip] to [s]" SrcPort 1 DstBlock "Gain" DstPort 1 } Line { SrcBlock "Early-Late Power" SrcPort 1 DstBlock "[chip] to [s]" DstPort 1 } Line { SrcBlock "[rad/s] to [s/Ti]" SrcPort 1 Points [90, 0] DstBlock "Delay" DstPort 1 } Line { SrcBlock "carrier_aid" SrcPort 1 DstBlock "[rad/s] to [s/Ti]" DstPort 1 } Line { SrcBlock "Sum" SrcPort 1 DstBlock "code_error [s]" DstPort 1 } Line { SrcBlock "Delay" SrcPort 1 DstBlock "Sum" DstPort 2 } Line { SrcBlock "Normalization" SrcPort 3 DstBlock "Early-Late Power" DstPort 2 } Line { SrcBlock "Normalization" SrcPort 1 DstBlock "Early-Late Power" DstPort 1 } Line { SrcBlock "Normalization" SrcPort 2 DstBlock "Terminator" DstPort 1 } Line { SrcBlock "Zero Order\nLow-Pass Filter" SrcPort 1 DstBlock "Sum" DstPort 1 } } } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "3:11799" Position [580, 115, 620, 155] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "3:11800" Position [180, 55, 220, 95] ShowName off OutDataTypeStr "double" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "3:11801" Position [580, 340, 620, 380] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "3:11802" Position [580, 265, 620, 305] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "3:11803" Position [180, 135, 220, 175] ShowName off OutDataTypeStr "double" } Block { BlockType DataTypeConversion Name "Data Type \nConversion6" SID "3:11804" Position [180, 250, 220, 290] ShowName off OutDataTypeStr "double" } Block { BlockType Mux Name "Mux" SID "3:11886" Ports [3, 1] Position [335, 159, 340, 241] ShowName off Inputs "3" DisplayOption "bar" } Block { BlockType RealImagToComplex Name "Real-Imag to\nComplex" SID "3:11806" Ports [2, 1] Position [125, 36, 160, 109] ShowName off Input "Real and imag" } Block { BlockType RealImagToComplex Name "Real-Imag to\nComplex1" SID "3:11807" Ports [2, 1] Position [125, 116, 160, 189] ShowName off Input "Real and imag" } Block { BlockType RealImagToComplex Name "Real-Imag to\nComplex2" SID "3:11808" Ports [2, 1] Position [125, 231, 160, 304] ShowName off Input "Real and imag" } Block { BlockType Gain Name "[rad/s] to [Hz]" SID "3:11812" Position [485, 345, 515, 375] Gain "1/(2*pi)" ParamDataTypeStr "Inherit: Inherit via internal rule" OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "control_id_" SID "3:11813" Position [655, 13, 685, 27] IconDisplay "Port number" } Block { BlockType Outport Name "code_error_[s]" SID "3:11814" Position [655, 128, 685, 142] Port "2" IconDisplay "Port number" } Block { BlockType Outport Name "carrier_error" SID "3:11815" Position [655, 278, 685, 292] Port "3" IconDisplay "Port number" } Block { BlockType Outport Name "carrier_doppler_[Hz]" SID "3:11816" Position [655, 353, 685, 367] Port "4" IconDisplay "Port number" } Block { BlockType Outport Name "EPL Scope" SID "3:11893" Position [655, 423, 685, 437] Port "5" IconDisplay "Port number" } Line { SrcBlock "Carrier Tracking \n(PLL)" SrcPort 2 Points [15, 0] Branch { Points [0, -160] DstBlock "Code Tracking\n(DLL)" DstPort 4 } Branch { DstBlock "[rad/s] to [Hz]" DstPort 1 } } Line { SrcBlock "Code Tracking\n(DLL)" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "Real-Imag to\nComplex" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "Carrier Tracking \n(PLL)" SrcPort 1 DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "Real-Imag to\nComplex1" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Real-Imag to\nComplex2" SrcPort 1 DstBlock "Data Type \nConversion6" DstPort 1 } Line { SrcBlock "d_E_I" SrcPort 1 DstBlock "Real-Imag to\nComplex" DstPort 1 } Line { SrcBlock "d_E_Q" SrcPort 1 DstBlock "Real-Imag to\nComplex" DstPort 2 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "code_error_[s]" DstPort 1 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "carrier_error" DstPort 1 } Line { SrcBlock "control_id" SrcPort 1 DstBlock "control_id_" DstPort 1 } Line { SrcBlock "d_L_I" SrcPort 1 DstBlock "Real-Imag to\nComplex1" DstPort 1 } Line { SrcBlock "d_L_Q" SrcPort 1 DstBlock "Real-Imag to\nComplex1" DstPort 2 } Line { SrcBlock "d_P_I" SrcPort 1 DstBlock "Real-Imag to\nComplex2" DstPort 1 } Line { SrcBlock "d_P_Q" SrcPort 1 DstBlock "Real-Imag to\nComplex2" DstPort 2 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 Points [45, 0] Branch { Points [0, -10] DstBlock "Code Tracking\n(DLL)" DstPort 1 } Branch { Points [0, 100] DstBlock "Abs2" DstPort 1 } } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 Points [25, 0] Branch { DstBlock "Code Tracking\n(DLL)" DstPort 3 } Branch { Points [0, 70] DstBlock "Abs" DstPort 1 } } Line { SrcBlock "Data Type \nConversion6" SrcPort 1 Points [10, 0] Branch { DstBlock "Carrier Tracking \n(PLL)" DstPort 1 } Branch { Points [0, -160; 25, 0] Branch { DstBlock "Code Tracking\n(DLL)" DstPort 2 } Branch { Points [0, 90] DstBlock "Abs1" DstPort 1 } } } Line { SrcBlock "d_acq_carrier_doppler_[Hz]" SrcPort 1 DstBlock "Carrier Tracking \n(PLL)" DstPort 2 } Line { SrcBlock "[rad/s] to [Hz]" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "carrier_doppler_[Hz]" DstPort 1 } Line { SrcBlock "enable_tracking" SrcPort 1 DstBlock "Carrier Tracking \n(PLL)" DstPort 3 } Line { SrcBlock "Abs" SrcPort 1 DstBlock "Mux" DstPort 3 } Line { SrcBlock "Abs1" SrcPort 1 DstBlock "Mux" DstPort 2 } Line { SrcBlock "Abs2" SrcPort 1 DstBlock "Mux" DstPort 1 } Line { SrcBlock "Mux" SrcPort 1 Points [50, 0; 0, 230] DstBlock "EPL Scope" DstPort 1 } } } Block { BlockType SubSystem Name "gnss_sdr_tcp_connector_tracking_rx" SID "6" Ports [0, 9] Position [25, 26, 195, 224] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "gnss_sdr_tcp_connector_tracking_rx" Location [6, 82, 455, 978] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "59" Block { BlockType Reference Name "Multiport\nSelector" SID "7" Ports [1, 36] Position [185, 25, 285, 1475] ShowName off LibraryVersion "1.462" SourceBlock "dspindex/Multiport\nSelector" SourceType "Multiport Selector" rowsOrCols "Rows" idxCellArray "{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33," "34,35,36}" idxErrMode "Clip Index" } Block { BlockType Reference Name "RX" SID "8" Ports [0, 1] Position [30, 691, 165, 809] LibraryVersion "1.84" DialogController "instrumentcreatedialog" DialogControllerArgs "DataTag4" SourceBlock "instrumentlib/TCP//IP Receive" SourceType "TCP/IP Receive" Host "84.88.61.86" Port "2070" DataSize "36" EnableBlockingMode on Timeout "5" SampleTime "-1" DataType "uint8" ByteOrder "BigEndian" } Block { BlockType SubSystem Name "Subsystem" SID "9" Ports [4, 1] Position [395, 186, 500, 354] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [528, 347, 1021, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "10" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "11" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "12" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "13" Position [25, 48, 55, 62] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "14" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "15" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "16" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "17" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "18" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "19" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "20" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "21" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "22" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "23" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "24" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "25" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "26" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "27" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "28" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "29" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "30" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "31" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "32" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "33" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "34" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "35" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "36" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "37" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "38" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "39" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "40" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "41" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "42" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "43" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "44" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "45" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "46" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "47" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "48" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "49" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "50" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "51" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "52" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "53" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "54" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "55" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "56" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "57" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "58" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "59" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "60" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "61" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "62" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "63" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "64" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "65" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "66" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "67" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "68" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "69" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "70" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "71" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "72" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "73" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "74" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "75" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "76" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "77" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "78" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "79" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "80" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "81" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "82" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "83" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "84" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "85" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "86" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "87" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "88" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "89" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "90" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "91" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "92" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "93" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "94" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "95" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "96" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "97" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "98" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "99" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "100" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "101" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "102" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "103" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "104" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "105" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "106" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "107" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "108" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "109" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "110" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "111" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "112" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "113" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "114" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "115" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "116" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "117" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "118" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "119" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "120" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "121" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "122" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "123" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "124" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "125" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "126" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "127" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "128" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "129" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "130" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "131" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "132" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "133" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "134" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "135" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "136" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "137" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "138" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "139" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "140" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "141" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "142" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "143" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "144" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "145" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "146" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "147" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "148" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "149" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "150" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "151" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "152" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "153" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "154" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "155" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "156" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "157" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "158" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "159" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "160" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "161" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "162" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "163" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "164" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "165" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "166" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "167" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "168" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "169" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "170" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "171" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "172" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "173" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "174" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "175" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "176" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "177" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "178" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "179" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "180" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "181" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "182" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "183" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "184" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "185" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "186" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "187" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "188" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "189" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "190" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "191" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "192" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "193" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "194" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "195" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "196" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "197" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "198" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "199" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "200" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "201" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "202" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "203" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "204" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "205" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "206" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "207" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "208" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "209" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "210" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "211" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "212" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "213" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "214" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "215" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "216" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "217" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "218" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "219" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "220" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "221" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "222" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "223" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "224" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "225" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "226" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "227" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "228" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction7" DstPort 2 } Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction10" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction11" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction12" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction13" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction14" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction15" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction16" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction17" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction18" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction19" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction20" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction21" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction22" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction23" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 80] Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } Branch { Points [0, 150] Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } Branch { Points [0, 155] Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } Branch { Points [0, 175] Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } Branch { Points [0, 180; 5, 0] Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } Branch { Points [-5, 0; 0, 175] Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } Branch { Points [0, 185] Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } Branch { Points [0, 190] Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } Branch { Points [0, 195] Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } Branch { Points [0, 215] Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } Branch { Points [0, 230] Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } Branch { Points [0, 240] Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } Branch { Points [0, 260] Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } Branch { Points [0, 265] Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } Branch { Points [0, 275] Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } Branch { Points [0, 280] Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } Branch { Points [0, 285] Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } Branch { Points [0, 300] Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } Branch { Points [0, 305] Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } Branch { Points [0, 310] Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } Branch { Points [0, 315] Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } Branch { Points [0, 320] Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } } } } } } } } } } } } } } } } } } } } } } } Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [5, 0] Branch { DstBlock "Math\nFunction2" DstPort 2 } Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } } Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } } } } Block { BlockType Sum Name "Sum" SID "229" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "230" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "231" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "232" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "233" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { DstBlock "Display3" DstPort 1 } Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } Branch { DstBlock "Data Type Conversion1" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { DstBlock "Exponent" DstPort 1 } Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { DstBlock "Sign" DstPort 1 } Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } } } Block { BlockType Outport Name "d_E_I" SID "234" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "d_E_I" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "In4" SrcPort 1 Points [10, 0; 0, -5] DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem1" SID "235" Ports [4, 1] Position [395, 346, 500, 514] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem1" Location [528, 347, 1021, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "236" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "237" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "238" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "239" Position [25, 48, 55, 62] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "240" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "241" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "242" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "243" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "244" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "245" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "246" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "247" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "248" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "249" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "250" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "251" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "252" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "253" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "254" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "255" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "256" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "257" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "258" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "259" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "260" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "261" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "262" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "263" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "264" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "265" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "266" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "267" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "268" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "269" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "270" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "271" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "272" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "273" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "274" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "275" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "276" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "277" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "278" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "279" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "280" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "281" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "282" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "283" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "284" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "285" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "286" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "287" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "288" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "289" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "290" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "291" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "292" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "293" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "294" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "295" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "296" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "297" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "298" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "299" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "300" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "301" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "302" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "303" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "304" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "305" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "306" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "307" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "308" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "309" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "310" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "311" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "312" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "313" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "314" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "315" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "316" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "317" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "318" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "319" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "320" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "321" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "322" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "323" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "324" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "325" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "326" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "327" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "328" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "329" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "330" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "331" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "332" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "333" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "334" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "335" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "336" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "337" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "338" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "339" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "340" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "341" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "342" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "343" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "344" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "345" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "346" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "347" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "348" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "349" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "350" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "351" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "352" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "353" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "354" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "355" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "356" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "357" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "358" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "359" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "360" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "361" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "362" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "363" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "364" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "365" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "366" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "367" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "368" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "369" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "370" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "371" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "372" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "373" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "374" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "375" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "376" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "377" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "378" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "379" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "380" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "381" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "382" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "383" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "384" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "385" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "386" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "387" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "388" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "389" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "390" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "391" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "392" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "393" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "394" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "395" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "396" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "397" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "398" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "399" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "400" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "401" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "402" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "403" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "404" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "405" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "406" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "407" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "408" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "409" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "410" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "411" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "412" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "413" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "414" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "415" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "416" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "417" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "418" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "419" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "420" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "421" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "422" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "423" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "424" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "425" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "426" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "427" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "428" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "429" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "430" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "431" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "432" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "433" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "434" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "435" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "436" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "437" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "438" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "439" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "440" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "441" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "442" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "443" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "444" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "445" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "446" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "447" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "448" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "449" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "450" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "451" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "452" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "453" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "454" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } Branch { Points [5, 0] Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } Branch { DstBlock "Math\nFunction2" DstPort 2 } } } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } Branch { Points [0, 80] Branch { Points [0, 150] Branch { Points [0, 155] Branch { Points [0, 175] Branch { Points [0, 180; 5, 0] Branch { Points [-5, 0; 0, 175] Branch { Points [0, 185] Branch { Points [0, 190] Branch { Points [0, 195] Branch { Points [0, 215] Branch { Points [0, 230] Branch { Points [0, 240] Branch { Points [0, 260] Branch { Points [0, 265] Branch { Points [0, 275] Branch { Points [0, 280] Branch { Points [0, 285] Branch { Points [0, 300] Branch { Points [0, 305] Branch { Points [0, 310] Branch { Points [0, 315] Branch { Points [0, 320] Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } } } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } Branch { DstBlock "Math\nFunction23" DstPort 2 } } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } Branch { DstBlock "Math\nFunction22" DstPort 2 } } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } Branch { DstBlock "Math\nFunction21" DstPort 2 } } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } Branch { DstBlock "Math\nFunction20" DstPort 2 } } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } Branch { DstBlock "Math\nFunction19" DstPort 2 } } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } Branch { DstBlock "Math\nFunction18" DstPort 2 } } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } Branch { DstBlock "Math\nFunction17" DstPort 2 } } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } Branch { DstBlock "Math\nFunction16" DstPort 2 } } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } Branch { DstBlock "Math\nFunction15" DstPort 2 } } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } Branch { DstBlock "Math\nFunction14" DstPort 2 } } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } Branch { DstBlock "Math\nFunction13" DstPort 2 } } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } Branch { DstBlock "Math\nFunction12" DstPort 2 } } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } Branch { DstBlock "Math\nFunction11" DstPort 2 } } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } Branch { DstBlock "Math\nFunction10" DstPort 2 } } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } Branch { DstBlock "Math\nFunction7" DstPort 2 } } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } } } Block { BlockType Sum Name "Sum" SID "455" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "456" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "457" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "458" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "459" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } Branch { DstBlock "Sign" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } Branch { DstBlock "Exponent" DstPort 1 } } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { DstBlock "Data Type Conversion1" DstPort 1 } Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } Branch { DstBlock "Display3" DstPort 1 } } } } Block { BlockType Outport Name "d_E_Q" SID "460" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 Points [10, 0; 0, -5] DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "d_E_Q" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem2" SID "461" Ports [4, 1] Position [395, 506, 500, 674] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem2" Location [528, 347, 1021, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "462" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "463" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "464" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "465" Position [25, 48, 55, 62] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "466" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "467" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "468" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "469" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "470" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "471" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "472" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "473" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "474" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "475" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "476" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "477" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "478" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "479" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "480" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "481" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "482" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "483" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "484" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "485" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "486" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "487" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "488" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "489" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "490" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "491" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "492" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "493" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "494" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "495" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "496" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "497" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "498" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "499" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "500" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "501" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "502" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "503" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "504" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "505" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "506" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "507" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "508" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "509" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "510" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "511" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "512" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "513" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "514" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "515" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "516" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "517" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "518" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "519" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "520" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "521" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "522" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "523" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "524" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "525" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "526" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "527" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "528" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "529" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "530" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "531" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "532" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "533" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "534" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "535" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "536" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "537" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "538" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "539" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "540" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "541" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "542" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "543" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "544" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "545" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "546" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "547" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "548" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "549" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "550" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "551" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "552" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "553" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "554" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "555" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "556" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "557" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "558" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "559" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "560" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "561" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "562" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "563" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "564" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "565" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "566" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "567" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "568" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "569" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "570" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "571" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "572" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "573" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "574" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "575" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "576" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "577" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "578" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "579" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "580" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "581" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "582" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "583" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "584" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "585" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "586" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "587" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "588" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "589" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "590" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "591" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "592" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "593" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "594" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "595" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "596" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "597" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "598" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "599" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "600" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "601" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "602" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "603" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "604" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "605" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "606" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "607" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "608" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "609" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "610" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "611" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "612" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "613" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "614" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "615" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "616" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "617" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "618" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "619" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "620" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "621" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "622" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "623" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "624" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "625" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "626" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "627" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "628" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "629" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "630" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "631" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "632" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "633" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "634" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "635" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "636" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "637" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "638" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "639" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "640" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "641" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "642" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "643" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "644" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "645" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "646" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "647" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "648" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "649" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "650" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "651" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "652" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "653" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "654" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "655" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "656" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "657" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "658" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "659" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "660" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "661" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "662" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "663" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "664" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "665" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "666" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "667" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "668" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "669" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "670" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "671" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "672" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "673" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "674" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "675" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "676" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "677" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "678" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "679" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "680" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction7" DstPort 2 } Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction10" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction11" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction12" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction13" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction14" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction15" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction16" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction17" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction18" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction19" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction20" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction21" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction22" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction23" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 80] Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } Branch { Points [0, 150] Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } Branch { Points [0, 155] Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } Branch { Points [0, 175] Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } Branch { Points [0, 180; 5, 0] Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } Branch { Points [-5, 0; 0, 175] Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } Branch { Points [0, 185] Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } Branch { Points [0, 190] Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } Branch { Points [0, 195] Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } Branch { Points [0, 215] Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } Branch { Points [0, 230] Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } Branch { Points [0, 240] Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } Branch { Points [0, 260] Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } Branch { Points [0, 265] Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } Branch { Points [0, 275] Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } Branch { Points [0, 280] Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } Branch { Points [0, 285] Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } Branch { Points [0, 300] Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } Branch { Points [0, 305] Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } Branch { Points [0, 310] Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } Branch { Points [0, 315] Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } Branch { Points [0, 320] Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } } } } } } } } } } } } } } } } } } } } } } } Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [5, 0] Branch { DstBlock "Math\nFunction2" DstPort 2 } Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } } Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } } } } Block { BlockType Sum Name "Sum" SID "681" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "682" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "683" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "684" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "685" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { DstBlock "Display3" DstPort 1 } Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } Branch { DstBlock "Data Type Conversion1" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { DstBlock "Exponent" DstPort 1 } Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { DstBlock "Sign" DstPort 1 } Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } } } Block { BlockType Outport Name "d_L_I" SID "686" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "d_L_I" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "In4" SrcPort 1 Points [10, 0; 0, -5] DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem3" SID "687" Ports [4, 1] Position [395, 666, 500, 834] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem3" Location [528, 347, 1021, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "688" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "689" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "690" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "691" Position [25, 48, 55, 62] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "692" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "693" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "694" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "695" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "696" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "697" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "698" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "699" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "700" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "701" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "702" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "703" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "704" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "705" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "706" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "707" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "708" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "709" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "710" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "711" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "712" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "713" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "714" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "715" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "716" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "717" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "718" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "719" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "720" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "721" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "722" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "723" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "724" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "725" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "726" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "727" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "728" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "729" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "730" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "731" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "732" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "733" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "734" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "735" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "736" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "737" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "738" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "739" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "740" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "741" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "742" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "743" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "744" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "745" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "746" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "747" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "748" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "749" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "750" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "751" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "752" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "753" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "754" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "755" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "756" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "757" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "758" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "759" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "760" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "761" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "762" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "763" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "764" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "765" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "766" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "767" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "768" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "769" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "770" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "771" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "772" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "773" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "774" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "775" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "776" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "777" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "778" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "779" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "780" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "781" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "782" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "783" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "784" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "785" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "786" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "787" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "788" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "789" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "790" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "791" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "792" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "793" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "794" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "795" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "796" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "797" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "798" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "799" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "800" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "801" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "802" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "803" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "804" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "805" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "806" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "807" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "808" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "809" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "810" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "811" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "812" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "813" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "814" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "815" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "816" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "817" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "818" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "819" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "820" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "821" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "822" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "823" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "824" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "825" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "826" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "827" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "828" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "829" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "830" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "831" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "832" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "833" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "834" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "835" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "836" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "837" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "838" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "839" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "840" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "841" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "842" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "843" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "844" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "845" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "846" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "847" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "848" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "849" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "850" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "851" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "852" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "853" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "854" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "855" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "856" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "857" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "858" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "859" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "860" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "861" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "862" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "863" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "864" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "865" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "866" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "867" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "868" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "869" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "870" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "871" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "872" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "873" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "874" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "875" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "876" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "877" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "878" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "879" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "880" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "881" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "882" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "883" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "884" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "885" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "886" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "887" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "888" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "889" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "890" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "891" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "892" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "893" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "894" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "895" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "896" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "897" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "898" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "899" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "900" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "901" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "902" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "903" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "904" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "905" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "906" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } Branch { Points [5, 0] Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } Branch { DstBlock "Math\nFunction2" DstPort 2 } } } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } Branch { Points [0, 80] Branch { Points [0, 150] Branch { Points [0, 155] Branch { Points [0, 175] Branch { Points [0, 180; 5, 0] Branch { Points [-5, 0; 0, 175] Branch { Points [0, 185] Branch { Points [0, 190] Branch { Points [0, 195] Branch { Points [0, 215] Branch { Points [0, 230] Branch { Points [0, 240] Branch { Points [0, 260] Branch { Points [0, 265] Branch { Points [0, 275] Branch { Points [0, 280] Branch { Points [0, 285] Branch { Points [0, 300] Branch { Points [0, 305] Branch { Points [0, 310] Branch { Points [0, 315] Branch { Points [0, 320] Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } } } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } Branch { DstBlock "Math\nFunction23" DstPort 2 } } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } Branch { DstBlock "Math\nFunction22" DstPort 2 } } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } Branch { DstBlock "Math\nFunction21" DstPort 2 } } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } Branch { DstBlock "Math\nFunction20" DstPort 2 } } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } Branch { DstBlock "Math\nFunction19" DstPort 2 } } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } Branch { DstBlock "Math\nFunction18" DstPort 2 } } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } Branch { DstBlock "Math\nFunction17" DstPort 2 } } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } Branch { DstBlock "Math\nFunction16" DstPort 2 } } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } Branch { DstBlock "Math\nFunction15" DstPort 2 } } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } Branch { DstBlock "Math\nFunction14" DstPort 2 } } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } Branch { DstBlock "Math\nFunction13" DstPort 2 } } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } Branch { DstBlock "Math\nFunction12" DstPort 2 } } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } Branch { DstBlock "Math\nFunction11" DstPort 2 } } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } Branch { DstBlock "Math\nFunction10" DstPort 2 } } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } Branch { DstBlock "Math\nFunction7" DstPort 2 } } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } } } Block { BlockType Sum Name "Sum" SID "907" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "908" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "909" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "910" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "911" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } Branch { DstBlock "Sign" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } Branch { DstBlock "Exponent" DstPort 1 } } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { DstBlock "Data Type Conversion1" DstPort 1 } Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } Branch { DstBlock "Display3" DstPort 1 } } } } Block { BlockType Outport Name "d_L_Q" SID "912" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 Points [10, 0; 0, -5] DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "d_L_Q" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem4" SID "913" Ports [4, 1] Position [395, 826, 500, 994] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem4" Location [528, 347, 1021, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "914" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "915" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "916" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "917" Position [25, 48, 55, 62] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "918" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "919" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "920" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "921" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "922" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "923" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "924" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "925" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "926" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "927" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "928" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "929" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "930" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "931" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "932" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "933" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "934" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "935" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "936" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "937" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "938" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "939" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "940" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "941" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "942" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "943" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "944" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "945" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "946" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "947" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "948" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "949" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "950" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "951" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "952" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "953" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "954" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "955" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "956" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "957" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "958" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "959" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "960" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "961" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "962" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "963" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "964" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "965" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "966" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "967" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "968" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "969" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "970" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "971" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "972" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "973" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "974" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "975" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "976" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "977" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "978" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "979" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "980" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "981" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "982" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "983" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "984" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "985" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "986" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "987" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "988" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "989" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "990" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "991" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "992" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "993" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "994" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "995" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "996" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "997" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "998" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "999" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "1000" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "1001" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "1002" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "1003" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "1004" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "1005" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "1006" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "1007" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "1008" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "1009" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "1010" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "1011" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "1012" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "1013" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "1014" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "1015" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "1016" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "1017" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "1018" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "1019" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "1020" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "1021" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "1022" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "1023" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "1024" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "1025" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "1026" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "1027" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "1028" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "1029" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "1030" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "1031" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "1032" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "1033" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "1034" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "1035" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "1036" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "1037" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "1038" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "1039" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "1040" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "1041" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "1042" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "1043" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "1044" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "1045" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "1046" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "1047" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "1048" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "1049" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "1050" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "1051" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "1052" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "1053" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "1054" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "1055" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "1056" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "1057" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "1058" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "1059" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "1060" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "1061" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "1062" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "1063" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "1064" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "1065" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "1066" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "1067" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "1068" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "1069" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "1070" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "1071" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "1072" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "1073" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "1074" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "1075" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "1076" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "1077" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "1078" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "1079" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "1080" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "1081" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "1082" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "1083" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "1084" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "1085" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "1086" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "1087" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "1088" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "1089" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "1090" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "1091" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "1092" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "1093" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "1094" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "1095" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "1096" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "1097" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "1098" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "1099" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "1100" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "1101" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "1102" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "1103" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "1104" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "1105" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "1106" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "1107" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "1108" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "1109" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "1110" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "1111" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "1112" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "1113" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "1114" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "1115" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "1116" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "1117" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "1118" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "1119" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "1120" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "1121" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "1122" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "1123" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "1124" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "1125" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "1126" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "1127" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "1128" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "1129" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "1130" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "1131" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "1132" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } Branch { Points [5, 0] Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } Branch { DstBlock "Math\nFunction2" DstPort 2 } } } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } Branch { Points [0, 80] Branch { Points [0, 150] Branch { Points [0, 155] Branch { Points [0, 175] Branch { Points [0, 180; 5, 0] Branch { Points [-5, 0; 0, 175] Branch { Points [0, 185] Branch { Points [0, 190] Branch { Points [0, 195] Branch { Points [0, 215] Branch { Points [0, 230] Branch { Points [0, 240] Branch { Points [0, 260] Branch { Points [0, 265] Branch { Points [0, 275] Branch { Points [0, 280] Branch { Points [0, 285] Branch { Points [0, 300] Branch { Points [0, 305] Branch { Points [0, 310] Branch { Points [0, 315] Branch { Points [0, 320] Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } } } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } Branch { DstBlock "Math\nFunction23" DstPort 2 } } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } Branch { DstBlock "Math\nFunction22" DstPort 2 } } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } Branch { DstBlock "Math\nFunction21" DstPort 2 } } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } Branch { DstBlock "Math\nFunction20" DstPort 2 } } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } Branch { DstBlock "Math\nFunction19" DstPort 2 } } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } Branch { DstBlock "Math\nFunction18" DstPort 2 } } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } Branch { DstBlock "Math\nFunction17" DstPort 2 } } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } Branch { DstBlock "Math\nFunction16" DstPort 2 } } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } Branch { DstBlock "Math\nFunction15" DstPort 2 } } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } Branch { DstBlock "Math\nFunction14" DstPort 2 } } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } Branch { DstBlock "Math\nFunction13" DstPort 2 } } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } Branch { DstBlock "Math\nFunction12" DstPort 2 } } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } Branch { DstBlock "Math\nFunction11" DstPort 2 } } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } Branch { DstBlock "Math\nFunction10" DstPort 2 } } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } Branch { DstBlock "Math\nFunction7" DstPort 2 } } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } } } Block { BlockType Sum Name "Sum" SID "1133" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "1134" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "1135" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "1136" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "1137" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } Branch { DstBlock "Sign" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } Branch { DstBlock "Exponent" DstPort 1 } } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { DstBlock "Data Type Conversion1" DstPort 1 } Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } Branch { DstBlock "Display3" DstPort 1 } } } } Block { BlockType Outport Name "d_P_I" SID "1138" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 Points [10, 0; 0, -5] DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "d_P_I" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem5" SID "1139" Ports [4, 1] Position [395, 991, 500, 1149] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem5" Location [528, 347, 1021, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "1140" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "1141" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "1142" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "1143" Position [25, 48, 55, 62] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "1144" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "1145" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "1146" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "1147" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "1148" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "1149" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "1150" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "1151" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "1152" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "1153" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "1154" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "1155" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "1156" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "1157" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "1158" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "1159" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "1160" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "1161" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "1162" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "1163" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "1164" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "1165" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "1166" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "1167" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "1168" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "1169" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "1170" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "1171" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "1172" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "1173" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "1174" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "1175" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "1176" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "1177" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "1178" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "1179" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "1180" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "1181" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "1182" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "1183" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "1184" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "1185" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "1186" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "1187" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "1188" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "1189" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "1190" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "1191" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "1192" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "1193" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "1194" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "1195" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "1196" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "1197" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "1198" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "1199" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "1200" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "1201" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "1202" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "1203" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "1204" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "1205" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "1206" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "1207" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "1208" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "1209" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "1210" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "1211" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "1212" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "1213" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "1214" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "1215" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "1216" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "1217" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "1218" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "1219" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "1220" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "1221" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "1222" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "1223" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "1224" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "1225" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "1226" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "1227" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "1228" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "1229" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "1230" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "1231" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "1232" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "1233" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "1234" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "1235" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "1236" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "1237" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "1238" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "1239" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "1240" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "1241" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "1242" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "1243" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "1244" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "1245" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "1246" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "1247" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "1248" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "1249" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "1250" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "1251" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "1252" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "1253" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "1254" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "1255" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "1256" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "1257" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "1258" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "1259" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "1260" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "1261" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "1262" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "1263" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "1264" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "1265" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "1266" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "1267" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "1268" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "1269" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "1270" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "1271" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "1272" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "1273" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "1274" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "1275" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "1276" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "1277" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "1278" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "1279" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "1280" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "1281" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "1282" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "1283" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "1284" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "1285" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "1286" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "1287" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "1288" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "1289" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "1290" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "1291" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "1292" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "1293" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "1294" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "1295" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "1296" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "1297" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "1298" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "1299" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "1300" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "1301" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "1302" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "1303" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "1304" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "1305" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "1306" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "1307" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "1308" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "1309" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "1310" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "1311" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "1312" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "1313" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "1314" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "1315" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "1316" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "1317" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "1318" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "1319" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "1320" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "1321" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "1322" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "1323" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "1324" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "1325" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "1326" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "1327" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "1328" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "1329" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "1330" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "1331" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "1332" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "1333" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "1334" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "1335" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "1336" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "1337" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "1338" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "1339" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "1340" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "1341" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "1342" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "1343" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "1344" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "1345" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "1346" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "1347" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "1348" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "1349" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "1350" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "1351" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "1352" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "1353" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "1354" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "1355" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "1356" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "1357" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "1358" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction7" DstPort 2 } Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction10" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction11" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction12" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction13" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction14" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction15" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction16" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction17" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction18" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction19" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction20" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction21" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction22" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction23" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 80] Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } Branch { Points [0, 150] Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } Branch { Points [0, 155] Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } Branch { Points [0, 175] Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } Branch { Points [0, 180; 5, 0] Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } Branch { Points [-5, 0; 0, 175] Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } Branch { Points [0, 185] Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } Branch { Points [0, 190] Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } Branch { Points [0, 195] Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } Branch { Points [0, 215] Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } Branch { Points [0, 230] Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } Branch { Points [0, 240] Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } Branch { Points [0, 260] Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } Branch { Points [0, 265] Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } Branch { Points [0, 275] Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } Branch { Points [0, 280] Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } Branch { Points [0, 285] Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } Branch { Points [0, 300] Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } Branch { Points [0, 305] Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } Branch { Points [0, 310] Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } Branch { Points [0, 315] Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } Branch { Points [0, 320] Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } } } } } } } } } } } } } } } } } } } } } } } Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [5, 0] Branch { DstBlock "Math\nFunction2" DstPort 2 } Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } } Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } } } } Block { BlockType Sum Name "Sum" SID "1359" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "1360" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "1361" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "1362" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "1363" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { DstBlock "Display3" DstPort 1 } Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } Branch { DstBlock "Data Type Conversion1" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { DstBlock "Exponent" DstPort 1 } Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { DstBlock "Sign" DstPort 1 } Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } } } Block { BlockType Outport Name "d_P_Q" SID "1364" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "d_P_Q" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "In4" SrcPort 1 Points [10, 0; 0, -5] DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem6" SID "1365" Ports [4, 1] Position [395, 1149, 500, 1311] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem6" Location [528, 347, 1021, 586] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "1366" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "1367" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "1368" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "1369" Position [25, 43, 55, 57] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "1370" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "1371" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "1372" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "1373" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "1374" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "1375" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "1376" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "1377" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "1378" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "1379" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "1380" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "1381" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "1382" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "1383" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "1384" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "1385" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "1386" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "1387" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "1388" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "1389" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "1390" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "1391" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "1392" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "1393" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "1394" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "1395" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "1396" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "1397" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "1398" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "1399" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "1400" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "1401" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "1402" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "1403" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "1404" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "1405" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "1406" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "1407" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "1408" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "1409" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "1410" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "1411" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "1412" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "1413" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "1414" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "1415" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "1416" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "1417" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "1418" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "1419" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "1420" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "1421" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "1422" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "1423" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "1424" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "1425" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "1426" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "1427" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "1428" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "1429" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "1430" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "1431" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "1432" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "1433" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "1434" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "1435" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "1436" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "1437" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "1438" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "1439" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "1440" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "1441" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "1442" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "1443" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "1444" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "1445" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "1446" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "1447" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "1448" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "1449" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "1450" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "1451" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "1452" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "1453" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "1454" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "1455" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "1456" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "1457" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "1458" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "1459" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "1460" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "1461" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "1462" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "1463" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "1464" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "1465" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "1466" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "1467" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "1468" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "1469" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "1470" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "1471" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "1472" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "1473" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "1474" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "1475" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "1476" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "1477" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "1478" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "1479" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "1480" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "1481" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "1482" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "1483" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "1484" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "1485" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "1486" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "1487" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "1488" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "1489" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "1490" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "1491" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "1492" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "1493" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "1494" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "1495" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "1496" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "1497" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "1498" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "1499" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "1500" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "1501" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "1502" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "1503" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "1504" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "1505" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "1506" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "1507" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "1508" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "1509" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "1510" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "1511" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "1512" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "1513" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "1514" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "1515" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "1516" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "1517" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "1518" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "1519" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "1520" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "1521" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "1522" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "1523" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "1524" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "1525" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "1526" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "1527" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "1528" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "1529" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "1530" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "1531" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "1532" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "1533" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "1534" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "1535" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "1536" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "1537" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "1538" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "1539" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "1540" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "1541" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "1542" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "1543" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "1544" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "1545" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "1546" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "1547" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "1548" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "1549" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "1550" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "1551" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "1552" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "1553" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "1554" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "1555" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "1556" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "1557" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "1558" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "1559" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "1560" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "1561" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "1562" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "1563" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "1564" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "1565" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "1566" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "1567" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "1568" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "1569" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "1570" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "1571" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "1572" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "1573" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "1574" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "1575" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "1576" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "1577" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "1578" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "1579" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "1580" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "1581" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "1582" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "1583" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "1584" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } Branch { Points [5, 0] Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } Branch { DstBlock "Math\nFunction2" DstPort 2 } } } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } Branch { Points [0, 80] Branch { Points [0, 150] Branch { Points [0, 155] Branch { Points [0, 175] Branch { Points [0, 180; 5, 0] Branch { Points [-5, 0; 0, 175] Branch { Points [0, 185] Branch { Points [0, 190] Branch { Points [0, 195] Branch { Points [0, 215] Branch { Points [0, 230] Branch { Points [0, 240] Branch { Points [0, 260] Branch { Points [0, 265] Branch { Points [0, 275] Branch { Points [0, 280] Branch { Points [0, 285] Branch { Points [0, 300] Branch { Points [0, 305] Branch { Points [0, 310] Branch { Points [0, 315] Branch { Points [0, 320] Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } } } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } Branch { DstBlock "Math\nFunction23" DstPort 2 } } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } Branch { DstBlock "Math\nFunction22" DstPort 2 } } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } Branch { DstBlock "Math\nFunction21" DstPort 2 } } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } Branch { DstBlock "Math\nFunction20" DstPort 2 } } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } Branch { DstBlock "Math\nFunction19" DstPort 2 } } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } Branch { DstBlock "Math\nFunction18" DstPort 2 } } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } Branch { DstBlock "Math\nFunction17" DstPort 2 } } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } Branch { DstBlock "Math\nFunction16" DstPort 2 } } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } Branch { DstBlock "Math\nFunction15" DstPort 2 } } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } Branch { DstBlock "Math\nFunction14" DstPort 2 } } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } Branch { DstBlock "Math\nFunction13" DstPort 2 } } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } Branch { DstBlock "Math\nFunction12" DstPort 2 } } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } Branch { DstBlock "Math\nFunction11" DstPort 2 } } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } Branch { DstBlock "Math\nFunction10" DstPort 2 } } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } Branch { DstBlock "Math\nFunction7" DstPort 2 } } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } } } Block { BlockType Sum Name "Sum" SID "1585" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "1586" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "1587" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "1588" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "1589" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } Branch { DstBlock "Sign" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } Branch { DstBlock "Exponent" DstPort 1 } } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { DstBlock "Data Type Conversion1" DstPort 1 } Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } Branch { DstBlock "Display3" DstPort 1 } } } } Block { BlockType Outport Name "d_acq_carrier_doppler_hz" SID "1590" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "d_acq_carrier_doppler_hz" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem7" SID "1591" Ports [4, 1] Position [395, 1310, 500, 1470] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem7" Location [528, 347, 1038, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "1592" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "1593" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "1594" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "1595" Position [25, 43, 55, 57] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "1596" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "1597" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "1598" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "1599" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "1600" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "1601" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "1602" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "1603" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "1604" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "1605" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "1606" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "1607" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "1608" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "1609" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "1610" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "1611" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "1612" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "1613" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "1614" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "1615" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "1616" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "1617" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "1618" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "1619" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "1620" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "1621" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "1622" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "1623" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "1624" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "1625" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "1626" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "1627" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "1628" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "1629" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "1630" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "1631" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "1632" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "1633" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "1634" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "1635" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "1636" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "1637" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "1638" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "1639" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "1640" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "1641" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "1642" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "1643" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "1644" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "1645" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "1646" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "1647" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "1648" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "1649" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "1650" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "1651" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "1652" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "1653" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "1654" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "1655" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "1656" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "1657" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "1658" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "1659" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "1660" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "1661" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "1662" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "1663" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "1664" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "1665" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "1666" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "1667" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "1668" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "1669" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "1670" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "1671" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "1672" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "1673" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "1674" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "1675" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "1676" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "1677" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "1678" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "1679" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "1680" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "1681" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "1682" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "1683" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "1684" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "1685" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "1686" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "1687" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "1688" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "1689" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "1690" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "1691" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "1692" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "1693" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "1694" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "1695" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "1696" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "1697" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "1698" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "1699" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "1700" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "1701" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "1702" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "1703" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "1704" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "1705" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "1706" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "1707" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "1708" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "1709" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "1710" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "1711" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "1712" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "1713" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "1714" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "1715" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "1716" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "1717" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "1718" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "1719" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "1720" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "1721" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "1722" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "1723" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "1724" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "1725" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "1726" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "1727" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "1728" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "1729" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "1730" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "1731" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "1732" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "1733" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "1734" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "1735" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "1736" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "1737" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "1738" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "1739" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "1740" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "1741" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "1742" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "1743" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "1744" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "1745" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "1746" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "1747" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "1748" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "1749" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "1750" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "1751" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "1752" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "1753" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "1754" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "1755" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "1756" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "1757" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "1758" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "1759" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "1760" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "1761" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "1762" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "1763" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "1764" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "1765" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "1766" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "1767" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "1768" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "1769" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "1770" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "1771" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "1772" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "1773" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "1774" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "1775" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "1776" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "1777" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "1778" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "1779" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "1780" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "1781" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "1782" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "1783" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "1784" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "1785" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "1786" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "1787" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "1788" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "1789" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "1790" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "1791" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "1792" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "1793" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "1794" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "1795" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "1796" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "1797" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "1798" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "1799" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "1800" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "1801" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "1802" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "1803" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "1804" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "1805" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "1806" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "1807" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "1808" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "1809" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "1810" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction7" DstPort 2 } Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction10" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction11" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction12" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction13" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction14" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction15" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction16" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction17" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction18" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction19" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction20" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction21" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction22" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction23" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 80] Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } Branch { Points [0, 150] Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } Branch { Points [0, 155] Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } Branch { Points [0, 175] Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } Branch { Points [0, 180; 5, 0] Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } Branch { Points [-5, 0; 0, 175] Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } Branch { Points [0, 185] Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } Branch { Points [0, 190] Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } Branch { Points [0, 195] Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } Branch { Points [0, 215] Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } Branch { Points [0, 230] Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } Branch { Points [0, 240] Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } Branch { Points [0, 260] Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } Branch { Points [0, 265] Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } Branch { Points [0, 275] Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } Branch { Points [0, 280] Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } Branch { Points [0, 285] Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } Branch { Points [0, 300] Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } Branch { Points [0, 305] Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } Branch { Points [0, 310] Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } Branch { Points [0, 315] Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } Branch { Points [0, 320] Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } } } } } } } } } } } } } } } } } } } } } } } Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [5, 0] Branch { DstBlock "Math\nFunction2" DstPort 2 } Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } } Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } } } } Block { BlockType Sum Name "Sum" SID "1811" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "1812" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "1813" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "1814" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "1815" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { DstBlock "Display3" DstPort 1 } Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } Branch { DstBlock "Data Type Conversion1" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { DstBlock "Exponent" DstPort 1 } Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { DstBlock "Sign" DstPort 1 } Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } } } Block { BlockType Outport Name "enable_tracking" SID "1816" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "enable_tracking" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem8" SID "1817" Ports [4, 1] Position [395, 31, 500, 189] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem8" Location [528, 347, 1021, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "1818" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "1819" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "1820" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "1821" Position [25, 48, 55, 62] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "1822" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "1823" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "1824" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "1825" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "1826" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "1827" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "1828" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "1829" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "1830" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "1831" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "1832" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "1833" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "1834" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "1835" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "1836" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "1837" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "1838" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "1839" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "1840" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "1841" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "1842" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "1843" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "1844" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "1845" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "1846" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "1847" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "1848" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "1849" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "1850" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "1851" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "1852" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "1853" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "1854" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "1855" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "1856" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "1857" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "1858" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "1859" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "1860" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "1861" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "1862" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "1863" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "1864" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "1865" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "1866" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "1867" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "1868" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "1869" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "1870" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "1871" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "1872" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "1873" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "1874" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "1875" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "1876" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "1877" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "1878" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "1879" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "1880" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "1881" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "1882" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "1883" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "1884" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "1885" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "1886" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "1887" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "1888" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "1889" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "1890" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "1891" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "1892" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "1893" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "1894" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "1895" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "1896" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "1897" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "1898" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "1899" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "1900" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "1901" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "1902" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "1903" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "1904" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "1905" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "1906" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "1907" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "1908" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "1909" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "1910" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "1911" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "1912" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "1913" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "1914" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "1915" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "1916" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "1917" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "1918" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "1919" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "1920" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "1921" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "1922" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "1923" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "1924" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "1925" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "1926" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "1927" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "1928" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "1929" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "1930" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "1931" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "1932" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "1933" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "1934" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "1935" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "1936" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "1937" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "1938" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "1939" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "1940" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "1941" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "1942" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "1943" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "1944" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "1945" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "1946" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "1947" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "1948" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "1949" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "1950" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "1951" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "1952" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "1953" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "1954" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "1955" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "1956" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "1957" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "1958" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "1959" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "1960" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "1961" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "1962" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "1963" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "1964" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "1965" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "1966" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "1967" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "1968" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "1969" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "1970" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "1971" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "1972" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "1973" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "1974" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "1975" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "1976" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "1977" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "1978" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "1979" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "1980" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "1981" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "1982" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "1983" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "1984" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "1985" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "1986" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "1987" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "1988" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "1989" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "1990" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "1991" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "1992" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "1993" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "1994" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "1995" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "1996" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "1997" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "1998" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "1999" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "2000" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "2001" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "2002" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "2003" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "2004" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "2005" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "2006" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "2007" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "2008" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "2009" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "2010" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "2011" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "2012" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "2013" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "2014" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "2015" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "2016" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "2017" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "2018" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "2019" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "2020" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "2021" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "2022" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "2023" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "2024" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "2025" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "2026" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "2027" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "2028" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "2029" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "2030" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "2031" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "2032" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "2033" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "2034" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "2035" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "2036" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction7" DstPort 2 } Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction10" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction11" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction12" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction13" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction14" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction15" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction16" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction17" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction18" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction19" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction20" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction21" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction22" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction23" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 80] Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } Branch { Points [0, 150] Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } Branch { Points [0, 155] Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } Branch { Points [0, 175] Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } Branch { Points [0, 180; 5, 0] Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } Branch { Points [-5, 0; 0, 175] Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } Branch { Points [0, 185] Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } Branch { Points [0, 190] Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } Branch { Points [0, 195] Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } Branch { Points [0, 215] Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } Branch { Points [0, 230] Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } Branch { Points [0, 240] Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } Branch { Points [0, 260] Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } Branch { Points [0, 265] Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } Branch { Points [0, 275] Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } Branch { Points [0, 280] Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } Branch { Points [0, 285] Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } Branch { Points [0, 300] Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } Branch { Points [0, 305] Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } Branch { Points [0, 310] Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } Branch { Points [0, 315] Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } Branch { Points [0, 320] Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } } } } } } } } } } } } } } } } } } } } } } } Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [5, 0] Branch { DstBlock "Math\nFunction2" DstPort 2 } Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } } Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } } } } Block { BlockType Sum Name "Sum" SID "2037" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "2038" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "2039" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "2040" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "2041" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { DstBlock "Display3" DstPort 1 } Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } Branch { DstBlock "Data Type Conversion1" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { DstBlock "Exponent" DstPort 1 } Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { DstBlock "Sign" DstPort 1 } Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } } } Block { BlockType Outport Name "control_id" SID "2042" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "control_id" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "In4" SrcPort 1 Points [10, 0; 0, -5] DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } } } Block { BlockType Outport Name "control_id" SID "2043" Position [555, 103, 585, 117] IconDisplay "Port number" } Block { BlockType Outport Name "d_E_I" SID "2044" Position [560, 263, 590, 277] Port "2" IconDisplay "Port number" } Block { BlockType Outport Name "d_E_Q" SID "2045" Position [560, 423, 590, 437] Port "3" IconDisplay "Port number" } Block { BlockType Outport Name "d_L_I" SID "2046" Position [560, 583, 590, 597] Port "4" IconDisplay "Port number" } Block { BlockType Outport Name "d_L_Q" SID "2047" Position [560, 743, 590, 757] Port "5" IconDisplay "Port number" } Block { BlockType Outport Name "d_P_I" SID "2048" Position [560, 903, 590, 917] Port "6" IconDisplay "Port number" } Block { BlockType Outport Name "d_P_Q" SID "2049" Position [560, 1063, 590, 1077] Port "7" IconDisplay "Port number" } Block { BlockType Outport Name "d_acq_carrier_doppler_hz" SID "2050" Position [555, 1223, 585, 1237] Port "8" IconDisplay "Port number" } Block { BlockType Outport Name "enable_tracking" SID "2051" Position [560, 1383, 590, 1397] Port "9" IconDisplay "Port number" } Line { SrcBlock "RX" SrcPort 1 DstBlock "Multiport\nSelector" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 1 DstBlock "Subsystem8" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 2 DstBlock "Subsystem8" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 3 DstBlock "Subsystem8" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 4 DstBlock "Subsystem8" DstPort 4 } Line { SrcBlock "Multiport\nSelector" SrcPort 5 DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 6 DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 7 DstBlock "Subsystem" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 8 DstBlock "Subsystem" DstPort 4 } Line { SrcBlock "Multiport\nSelector" SrcPort 9 DstBlock "Subsystem1" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 10 DstBlock "Subsystem1" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 11 DstBlock "Subsystem1" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 12 DstBlock "Subsystem1" DstPort 4 } Line { SrcBlock "Multiport\nSelector" SrcPort 13 DstBlock "Subsystem2" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 14 DstBlock "Subsystem2" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 15 DstBlock "Subsystem2" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 16 DstBlock "Subsystem2" DstPort 4 } Line { SrcBlock "Multiport\nSelector" SrcPort 17 DstBlock "Subsystem3" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 18 DstBlock "Subsystem3" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 19 DstBlock "Subsystem3" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 20 DstBlock "Subsystem3" DstPort 4 } Line { SrcBlock "Multiport\nSelector" SrcPort 21 DstBlock "Subsystem4" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 22 DstBlock "Subsystem4" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 23 DstBlock "Subsystem4" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 24 DstBlock "Subsystem4" DstPort 4 } Line { SrcBlock "Multiport\nSelector" SrcPort 25 DstBlock "Subsystem5" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 26 DstBlock "Subsystem5" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 27 DstBlock "Subsystem5" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 28 DstBlock "Subsystem5" DstPort 4 } Line { SrcBlock "Subsystem4" SrcPort 1 DstBlock "d_P_I" DstPort 1 } Line { SrcBlock "Subsystem3" SrcPort 1 DstBlock "d_L_Q" DstPort 1 } Line { SrcBlock "Subsystem2" SrcPort 1 DstBlock "d_L_I" DstPort 1 } Line { SrcBlock "Subsystem1" SrcPort 1 DstBlock "d_E_Q" DstPort 1 } Line { SrcBlock "Subsystem" SrcPort 1 DstBlock "d_E_I" DstPort 1 } Line { SrcBlock "Subsystem8" SrcPort 1 DstBlock "control_id" DstPort 1 } Line { SrcBlock "Subsystem5" SrcPort 1 DstBlock "d_P_Q" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 29 DstBlock "Subsystem6" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 30 DstBlock "Subsystem6" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 31 DstBlock "Subsystem6" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 32 DstBlock "Subsystem6" DstPort 4 } Line { SrcBlock "Subsystem6" SrcPort 1 DstBlock "d_acq_carrier_doppler_hz" DstPort 1 } Line { SrcBlock "Subsystem7" SrcPort 1 DstBlock "enable_tracking" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 33 DstBlock "Subsystem7" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 34 DstBlock "Subsystem7" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 35 DstBlock "Subsystem7" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 36 DstBlock "Subsystem7" DstPort 4 } Annotation { Position [285, 79] } } } Block { BlockType SubSystem Name "gnss_sdr_tcp_connector_tracking_tx" SID "5" Ports [4] Position [430, 26, 600, 224] AncestorBlock "simulink/User-Defined\nFunctions/gnss_sdr/gnss_sdr_tcp_connector_tracking_tx" LibraryVersion "*1.267" MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "gnss_sdr_tcp_connector_tracking_tx" Location [1137, 408, 1500, 698] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" SIDHighWatermark "11844" SIDPrevWatermark "11844" Block { BlockType Inport Name "control_id" SID "5:11610" Position [30, 38, 60, 52] IconDisplay "Port number" } Block { BlockType Inport Name "code_error" SID "5:11611" Position [30, 98, 60, 112] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "carr_error" SID "5:11612" Position [30, 158, 60, 172] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "carrier_doppler_hz" SID "5:11613" Position [30, 218, 60, 232] Port "4" IconDisplay "Port number" } Block { BlockType Display Name "Display" SID "5:11614" Ports [1] Position [175, 234, 330, 266] ShowName off Format "long" Decimation "1" Lockdown off } Block { BlockType Reference Name "TX" SID "5:11615" Ports [1] Position [175, 77, 310, 193] LibraryVersion "1.84" DialogController "instrumentcreatedialog" DialogControllerArgs "DataTag5" SourceBlock "instrumentlib/TCP//IP Send" SourceType "TCP/IP Send" Host "84.88.61.86" Port "2070" EnableBlockingMode on Timeout "10" ByteOrder "LittleEndian" } Block { BlockType Concatenate Name "Vector\nConcatenate1" SID "5:11616" Ports [4, 1] Position [95, 12, 100, 258] BackgroundColor "black" ShowName off NumInputs "4" Mode "Vector" } Line { SrcBlock "carr_error" SrcPort 1 DstBlock "Vector\nConcatenate1" DstPort 3 } Line { SrcBlock "code_error" SrcPort 1 DstBlock "Vector\nConcatenate1" DstPort 2 } Line { SrcBlock "control_id" SrcPort 1 DstBlock "Vector\nConcatenate1" DstPort 1 } Line { SrcBlock "Vector\nConcatenate1" SrcPort 1 Points [15, 0] Branch { DstBlock "TX" DstPort 1 } Branch { Points [0, 115] DstBlock "Display" DstPort 1 } } Line { SrcBlock "carrier_doppler_hz" SrcPort 1 DstBlock "Vector\nConcatenate1" DstPort 4 } } } } } } } MatData { NumRecords 6 DataRecord { Tag DataTag5 Data " %)30 . : 8 ( 0 % \" $ ! 0 . . 8 ( ! " " % \" $ ' 0 0 !P '1C<&EP. * * ------------------------------------------------------------------------- */ IMPORTANT: Please, to use this tracking check the configuration file called 'gnss-sdr_galileo_e1_tcp_connector_tracking.conf'. There are two major changes: 1.- Choose the [Galileo_E1_TCP_CONNECTOR_Tracking] tracking algorithm. 2.- Choose a tcp port for channel 0 (e.g. Tracking.port_ch0=2070;) A) HOW TO add a block to the Simulink Library repository of your Matlab installation --------------------------------------------------------------------------------- (These steps should be followed only the first time) 1.- Copy the content of this folder to a folder accessible from Simulink. 2.- In the Matlab Command Window type: >> simulink; to open the Simulink Library Browser. 3.- Right-click on the Simulink/User-Defined Functions of the Simulink Library menu, and click on "Open User-Defined Functions library" (Window_1) 4.- Open the library model 'gnss_sdr_galileo_e1_tcp_connector_tracking_lib.mdl' (Window_2) 5.- If this is not the first time there should be an existing 'gnss-sdr' block in the 'User-Defined Functions' window that should be deleted before drag and drop the new 'gnss_sdr' block (which includes 3 blocks: - 'gnss_sdr_galileo_e1_tcp_connector_tracking_rx' block - 'gnss_sdr_galileo_e1_tcp_connector_tracking' block - 'gnss_sdr_galileo_e1_tcp_connector_tracking_tx' block) from Window_2 to Window_1. A new message should appear: "This library is locked. The action performed requires it to be unlocked". Then, click on the "Unlock" button (the block will be copied) and close Window_2. 6.- Right-click on the 'gnss-sdr' block and click on "Link Options --> Disable link", repeat the action but now clicking on "Link Options --> Break link". This action disables and breaks the link with the original library model. 7.- On Window_1 save the "simulink/User-Defined Functions" library. To do that go to "File > Save". Then, close Window_1. 8.- From "Simulink Library Browser" window, press F5 to refresh and generate the new Simulink Library repository (it may take a few seconds). This completes the installation of the custom Simulink block. B) HOW TO use the "gnss_sdr_galileo_e1_tcp_connector_tracking_start.m" script: ---------------------------------------------------------------- ---------------------- ---------------- ---------------------- | | | gnss_sdr_ | | | | gnss_sdr_galileo_e1_ | | galileo_e1_ | | gnss_sdr_galileo_e1_ | | tcp_connector_ | --> | tcp_connector_ | --> | tcp_connector_ | | tracking_rx | | tracking | | tracking_tx | | | | | | | ---------------------- ---------------- ---------------------- The 'gnss_sdr_galileo_e1_tcp_connector_tracking_start.m' is the script that builds and configures a simulink model for interacting with the GNSS-SDR platform through a TCP communication. 'User parameters' can be modified but, by default, these are the values assigned: %User parameters host = '84.88.61.86'; %Remote IP address (GNSS-SDR computer IP) port = 2070; %Remote port (GNSS-SDR computer port for Ch0) num_vars_rx = 13; %Number of variables expected from GNSS-SDR num_vars_tx = 4; %Number of variable to be transmitted to GNSS-SDR timeout = '10'; %Timeout in seconds 'host', 'port' and 'timeout' parameters configure both 'gnss_sdr_galileo_e1_tcp_connector_tracking_rx' and 'gnss_sdr_galileo_e1_tcp_connector_tracking_tx' blocks. The 'port' parameter sets the base port number for the first channel (ch0). Each of the subsequent channels increases their port by one unit (e.g. ch0_port=2070, ch1_port=2071,...). Also the name of the tracking block can be modified. It must match with the Simulink model name: %Name of the tracking block, it must match the Simulink model name tracking_block_name = 'gnss_sdr_galileo_e1_tcp_connector_tracking'; To run the script just type in the Matlab Command window the following: >>gnss_sdr_galileo_e1_tcp_connector_tracking_start(N); where N must match the number of channels configured in the GNSS-SDR platform. C) HOW TO replace the tracking block of the library ------------------------------------------------ 1.- Open the library model 'gnss_sdr_galileo_e1_tcp_connector_tracking_lib.mdl' 2.- Unlock the library. Click on "Edit > Unlock Library". 3.- Open the "gnss-sdr" block and change the "gnss_sdr_galileo_e1_tcp_connector_tracking" block by another one. If the name is different it must be updated in the "gnss_sdr_galileo_e1_tcp_connector_parallel_tracking_start.m" code (see section B) 4.- Save the new library. 5.- Go to section A and follow the instructions. gnss-sdr-0.0.9/src/utils/simulink/Single Thread/README_gnss_sdr_tcp_connector_tracking.txt000066400000000000000000000140551305042567700316730ustar00rootroot00000000000000 /*! * \file README.txt * \brief How to add a block to the Simulink Library repository of Matlab, * how to use the "gnss_sdr_tcp_connector_tracking_start.m" script and how * to replace the tracking block of the library. * * \author David Pubill, 2012. dpubill(at)cttc.es * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2012 (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 . * * ------------------------------------------------------------------------- */ IMPORTANT: Please, to use this tracking check the configuration file called 'gnss-sdr_tcp_connector_tracking.conf'. There are two major changes: 1.- Choose the [GPS_L1_CA_TCP_CONNECTOR_Tracking] tracking algorithm. 2.- Choose a tcp port for channel 0 (e.g. Tracking.port_ch0=2060;) A) HOW TO add a block to the Simulink Library repository of your Matlab installation --------------------------------------------------------------------------------- (These steps should be followed only the first time) 1.- Copy the content of this folder to a folder accessible from Simulink. 2.- In the Matlab Command Window type: >> simulink; to open the Simulink Library Browser. 3.- Right-click on the Simulink/User-Defined Functions of the Simulink Library menu, and click on "Open User-Defined Functions library" (Window_1) 4.- Open the library model 'gnss_sdr_tcp_connector_tracking_lib.mdl' (Window_2) 5.- If this is not the first time there should be an existing 'gnss-sdr' block in the 'User-Defined Functions' window that should be deleted before drag and drop the new 'gnss_sdr' block (which includes 3 blocks: - 'gnss_sdr_tcp_connector_tracking_rx' block - 'gnss_sdr_tcp_connector_tracking' block - 'gnss_sdr_tcp_connector_tracking_tx' block) from Window_2 to Window_1. A new message should appear: "This library is locked. The action performed requires it to be unlocked". Then, click on the "Unlock" button (the block will be copied) and close Window_2. 6.- Right-click on the 'gnss-sdr' block and click on "Link Options --> Disable link", repeat the action but now clicking on "Link Options --> Break link". This action disables and breaks the link with the original library model. 7.- On Window_1 save the "simulink/User-Defined Functions" library. To do that go to "File > Save". Then, close Window_1. 8.- From "Simulink Library Browser" window, press F5 to refresh and generate the new Simulink Library repository (it may take a few seconds). This completes the installation of the custom Simulink block. B) HOW TO use the "gnss_sdr_tcp_connector_tracking_start.m" script: ---------------------------------------------------------------- ----------------------- ------------------ ----------------------- | | | | | | | gnss_sdr_tcp_ | | gnss_sdr_tcp_ | | gnss_sdr_tcp_ | | connector_tracking_ | --> | connector_ | --> | connector_tracking_ | | rx | | tracking | | tx | | | | | | | ----------------------- ------------------ ----------------------- The 'gnss_sdr_tcp_connector_tracking_start.m' is the script that builds and configures a simulink model for interacting with the GNSS-SDR platform through a TCP communication. 'User parameters' can be modified but, by default, these are the values assigned: %User parameters host = '84.88.61.86'; %Remote IP address (GNSS-SDR computer IP) port = 2070; %Remote port (GNSS-SDR computer port for Ch0) num_vars_rx = 9; %Number of variables expected from GNSS-SDR num_vars_tx = 4; %Number of variable to be transmitted to GNSS-SDR timeout = '40'; %Timeout in seconds 'host', 'port' and 'timeout' parameters configure both 'gnss_sdr_tcp_connector_tracking_rx' and 'gnss_sdr_tcp_connector_tracking_tx' blocks. The 'port' parameter sets the base port number for the first channel (ch0). Each of the subsequent channels increases their port by one unit (e.g. ch0_port=2070, ch1_port=2071,...). Also the name of the tracking block can be modified. It must match with the Simulink model name: %Name of the tracking block, it must match the Simulink model name tracking_block_name = 'gnss_sdr_tcp_connector_tracking'; To run the script just type in the Matlab Command window the following: >>gnss_sdr_tcp_connector_tracking_start(N); where N must match the number of channels configured in the GNSS-SDR platform. C) HOW TO replace the tracking block of the library ------------------------------------------------ 1.- Open the library model 'gnss_sdr_tcp_connector_tracking_lib.mdl' 2.- Unlock the library. Click on "Edit > Unlock Library". 3.- Open the "gnss-sdr" block and change the "gnss_sdr_tcp_connector_tracking" block by another one. If the name is different it must be updated in the "gnss_sdr_tcp_connector_parallel_tracking_start.m" code (see section B) 4.- Save the new library. 5.- Go to section A and follow the instructions. gnss-sdr-0.0.9/src/utils/simulink/Single Thread/gnss_sdr_galileo_e1_tcp_connector_tracking_lib.mdl000066400000000000000000064642011305042567700335320ustar00rootroot00000000000000Library { Name "gnss_sdr_galileo_e1_tcp_connector_tracking_lib" Version 7.6 MdlSubVersion 0 SavedCharacterEncoding "windows-1252" LibraryType "BlockLibrary" SaveDefaultBlockParams on ScopeRefreshTime 0.035000 OverrideScopeRefreshTime on DisableAllScopes off MaxMDLFileLineLength 120 Created "Thu Mar 08 11:41:48 2012" Creator "David Pubill" UpdateHistory "UpdateHistoryNever" ModifiedByFormat "%" LastModifiedBy "David Pubill" ModifiedDateFormat "%" LastModifiedDate "Fri Oct 19 12:46:31 2012" RTWModifiedTimeStamp 272551143 ModelVersionFormat "1.%" ConfigurationManager "None" SampleTimeColors off SampleTimeAnnotations off LibraryLinkDisplay "none" WideLines off ShowLineDimensions off ShowPortDataTypes off ShowLoopsOnError on IgnoreBidirectionalLines off ShowStorageClass off ShowTestPointIcons on ShowSignalResolutionIcons on ShowViewerIcons on SortedOrder off ExecutionContextIcon off ShowLinearizationAnnotations on BlockNameDataTip off BlockParametersDataTip off BlockDescriptionStringDataTip off ToolBar on StatusBar on BrowserShowLibraryLinks off BrowserLookUnderMasks off SimulationMode "normal" LinearizationMsg "none" Profile off ParamWorkspaceSource "MATLABWorkspace" RecordCoverage off CovSaveName "covdata" CovMetricSettings "dw" CovNameIncrementing off CovHtmlReporting on CovForceBlockReductionOff on covSaveCumulativeToWorkspaceVar on CovSaveSingleToWorkspaceVar on CovCumulativeReport off CovReportOnPause on CovModelRefEnable "Off" CovExternalEMLEnable off ExtModeBatchMode off ExtModeEnableFloating on ExtModeTrigType "manual" ExtModeTrigMode "normal" ExtModeTrigPort "1" ExtModeTrigElement "any" ExtModeTrigDuration 1000 ExtModeTrigDurationFloating "auto" ExtModeTrigHoldOff 0 ExtModeTrigDelay 0 ExtModeTrigDirection "rising" ExtModeTrigLevel 0 ExtModeArchiveMode "off" ExtModeAutoIncOneShot off ExtModeIncDirWhenArm off ExtModeAddSuffixToVar off ExtModeWriteAllDataToWs off ExtModeArmWhenConnect on ExtModeSkipDownloadWhenConnect off ExtModeLogAll on ExtModeAutoUpdateStatusClock on ShowModelReferenceBlockVersion off ShowModelReferenceBlockIO off Array { Type "Handle" Dimension 1 Simulink.ConfigSet { $ObjectID 1 Version "1.10.0" Array { Type "Handle" Dimension 9 Simulink.SolverCC { $ObjectID 2 Version "1.10.0" StartTime "0.0" StopTime "10.0" AbsTol "auto" FixedStep "auto" InitialStep "auto" MaxNumMinSteps "-1" MaxOrder 5 ZcThreshold "auto" ConsecutiveZCsStepRelTol "10*128*eps" MaxConsecutiveZCs "1000" ExtrapolationOrder 4 NumberNewtonIterations 1 MaxStep "auto" MinStep "auto" MaxConsecutiveMinStep "1" RelTol "1e-3" SolverMode "Auto" ConcurrentTasks off Solver "VariableStepDiscrete" SolverName "VariableStepDiscrete" SolverJacobianMethodControl "auto" ShapePreserveControl "DisableAll" ZeroCrossControl "UseLocalSettings" ZeroCrossAlgorithm "Nonadaptive" AlgebraicLoopSolver "TrustRegion" SolverResetMethod "Fast" PositivePriorityOrder off AutoInsertRateTranBlk off SampleTimeConstraint "Unconstrained" InsertRTBMode "Whenever possible" } Simulink.DataIOCC { $ObjectID 3 Version "1.10.0" Decimation "1" ExternalInput "[t, u]" FinalStateName "xFinal" InitialState "xInitial" LimitDataPoints on MaxDataPoints "1000" LoadExternalInput off LoadInitialState off SaveFinalState off SaveCompleteFinalSimState off SaveFormat "Array" SaveOutput on SaveState off SignalLogging on DSMLogging on InspectSignalLogs off SaveTime on ReturnWorkspaceOutputs off StateSaveName "xout" TimeSaveName "tout" OutputSaveName "yout" SignalLoggingName "logsout" DSMLoggingName "dsmout" OutputOption "RefineOutputTimes" OutputTimes "[]" ReturnWorkspaceOutputsName "out" Refine "1" } Simulink.OptimizationCC { $ObjectID 4 Version "1.10.0" Array { Type "Cell" Dimension 8 Cell "BooleansAsBitfields" Cell "PassReuseOutputArgsAs" Cell "PassReuseOutputArgsThreshold" Cell "ZeroExternalMemoryAtStartup" Cell "ZeroInternalMemoryAtStartup" Cell "OptimizeModelRefInitCode" Cell "NoFixptDivByZeroProtection" Cell "UseSpecifiedMinMax" PropName "DisabledProps" } BlockReduction on BooleanDataType on ConditionallyExecuteInputs on InlineParams off UseIntDivNetSlope off UseSpecifiedMinMax off InlineInvariantSignals off OptimizeBlockIOStorage on BufferReuse on EnhancedBackFolding off StrengthReduction off ExpressionFolding on BooleansAsBitfields off BitfieldContainerType "uint_T" EnableMemcpy on MemcpyThreshold 64 PassReuseOutputArgsAs "Structure reference" ExpressionDepthLimit 2147483647 FoldNonRolledExpr on LocalBlockOutputs on RollThreshold 5 SystemCodeInlineAuto off StateBitsets off DataBitsets off UseTempVars off ZeroExternalMemoryAtStartup on ZeroInternalMemoryAtStartup on InitFltsAndDblsToZero off NoFixptDivByZeroProtection off EfficientFloat2IntCast off EfficientMapNaN2IntZero on OptimizeModelRefInitCode off LifeSpan "inf" MaxStackSize "Inherit from target" BufferReusableBoundary on SimCompilerOptimization "Off" AccelVerboseBuild off } Simulink.DebuggingCC { $ObjectID 5 Version "1.10.0" RTPrefix "error" ConsistencyChecking "none" ArrayBoundsChecking "none" SignalInfNanChecking "none" SignalRangeChecking "none" ReadBeforeWriteMsg "UseLocalSettings" WriteAfterWriteMsg "UseLocalSettings" WriteAfterReadMsg "UseLocalSettings" AlgebraicLoopMsg "warning" ArtificialAlgebraicLoopMsg "warning" SaveWithDisabledLinksMsg "warning" SaveWithParameterizedLinksMsg "none" CheckSSInitialOutputMsg on UnderspecifiedInitializationDetection "Classic" MergeDetectMultiDrivingBlocksExec "none" CheckExecutionContextPreStartOutputMsg off CheckExecutionContextRuntimeOutputMsg off SignalResolutionControl "UseLocalSettings" BlockPriorityViolationMsg "warning" MinStepSizeMsg "warning" TimeAdjustmentMsg "none" MaxConsecutiveZCsMsg "error" MaskedZcDiagnostic "warning" IgnoredZcDiagnostic "warning" SolverPrmCheckMsg "warning" InheritedTsInSrcMsg "warning" DiscreteInheritContinuousMsg "warning" MultiTaskDSMMsg "error" MultiTaskCondExecSysMsg "error" MultiTaskRateTransMsg "error" SingleTaskRateTransMsg "none" TasksWithSamePriorityMsg "warning" SigSpecEnsureSampleTimeMsg "warning" CheckMatrixSingularityMsg "none" IntegerOverflowMsg "warning" Int32ToFloatConvMsg "warning" ParameterDowncastMsg "error" ParameterOverflowMsg "error" ParameterUnderflowMsg "none" ParameterPrecisionLossMsg "warning" ParameterTunabilityLossMsg "warning" FixptConstUnderflowMsg "none" FixptConstOverflowMsg "none" FixptConstPrecisionLossMsg "none" UnderSpecifiedDataTypeMsg "none" UnnecessaryDatatypeConvMsg "none" VectorMatrixConversionMsg "none" InvalidFcnCallConnMsg "error" FcnCallInpInsideContextMsg "Use local settings" SignalLabelMismatchMsg "none" UnconnectedInputMsg "warning" UnconnectedOutputMsg "warning" UnconnectedLineMsg "warning" SFcnCompatibilityMsg "none" UniqueDataStoreMsg "none" BusObjectLabelMismatch "warning" RootOutportRequireBusObject "warning" AssertControl "UseLocalSettings" EnableOverflowDetection off ModelReferenceIOMsg "none" ModelReferenceMultiInstanceNormalModeStructChecksumCheck "error" ModelReferenceVersionMismatchMessage "none" ModelReferenceIOMismatchMessage "none" ModelReferenceCSMismatchMessage "none" UnknownTsInhSupMsg "warning" ModelReferenceDataLoggingMessage "warning" ModelReferenceSymbolNameMessage "warning" ModelReferenceExtraNoncontSigs "error" StateNameClashWarn "warning" SimStateInterfaceChecksumMismatchMsg "warning" InitInArrayFormatMsg "warning" StrictBusMsg "ErrorLevel1" BusNameAdapt "WarnAndRepair" NonBusSignalsTreatedAsBus "none" LoggingUnavailableSignals "error" BlockIODiagnostic "none" SFUnusedDataAndEventsDiag "warning" SFUnexpectedBacktrackingDiag "warning" SFInvalidInputDataAccessInChartInitDiag "warning" SFNoUnconditionalDefaultTransitionDiag "warning" SFTransitionOutsideNaturalParentDiag "warning" } Simulink.HardwareCC { $ObjectID 6 Version "1.10.0" ProdBitPerChar 8 ProdBitPerShort 16 ProdBitPerInt 32 ProdBitPerLong 32 ProdBitPerFloat 32 ProdBitPerDouble 64 ProdBitPerPointer 32 ProdLargestAtomicInteger "Char" ProdLargestAtomicFloat "None" ProdIntDivRoundTo "Undefined" ProdEndianess "Unspecified" ProdWordSize 32 ProdShiftRightIntArith on ProdHWDeviceType "32-bit Generic" TargetBitPerChar 8 TargetBitPerShort 16 TargetBitPerInt 32 TargetBitPerLong 32 TargetBitPerFloat 32 TargetBitPerDouble 64 TargetBitPerPointer 32 TargetLargestAtomicInteger "Char" TargetLargestAtomicFloat "None" TargetShiftRightIntArith on TargetIntDivRoundTo "Undefined" TargetEndianess "Unspecified" TargetWordSize 32 TargetTypeEmulationWarnSuppressLevel 0 TargetPreprocMaxBitsSint 32 TargetPreprocMaxBitsUint 32 TargetHWDeviceType "Specified" TargetUnknown off ProdEqTarget on } Simulink.ModelReferenceCC { $ObjectID 7 Version "1.10.0" UpdateModelReferenceTargets "IfOutOfDateOrStructuralChange" CheckModelReferenceTargetMessage "error" EnableParallelModelReferenceBuilds off ParallelModelReferenceErrorOnInvalidPool on ParallelModelReferenceMATLABWorkerInit "None" ModelReferenceNumInstancesAllowed "Multi" PropagateVarSize "Infer from blocks in model" ModelReferencePassRootInputsByReference on ModelReferenceMinAlgLoopOccurrences off PropagateSignalLabelsOutOfModel off SupportModelReferenceSimTargetCustomCode off } Simulink.SFSimCC { $ObjectID 8 Version "1.10.0" SFSimEnableDebug on SFSimOverflowDetection on SFSimEcho on SimBlas on SimCtrlC on SimExtrinsic on SimIntegrity on SimUseLocalCustomCode off SimParseCustomCode on SimBuildMode "sf_incremental_build" } Simulink.RTWCC { $BackupClass "Simulink.RTWCC" $ObjectID 9 Version "1.10.0" Array { Type "Cell" Dimension 7 Cell "IncludeHyperlinkInReport" Cell "GenerateTraceInfo" Cell "GenerateTraceReport" Cell "GenerateTraceReportSl" Cell "GenerateTraceReportSf" Cell "GenerateTraceReportEml" Cell "GenerateSLWebview" PropName "DisabledProps" } SystemTargetFile "grt.tlc" GenCodeOnly off MakeCommand "make_rtw" GenerateMakefile on TemplateMakefile "grt_default_tmf" GenerateReport off SaveLog off RTWVerbose on RetainRTWFile off ProfileTLC off TLCDebug off TLCCoverage off TLCAssert off ProcessScriptMode "Default" ConfigurationMode "Optimized" ConfigAtBuild off RTWUseLocalCustomCode off RTWUseSimCustomCode off IncludeHyperlinkInReport off LaunchReport off TargetLang "C" IncludeBusHierarchyInRTWFileBlockHierarchyMap off IncludeERTFirstTime off GenerateTraceInfo off GenerateTraceReport off GenerateTraceReportSl off GenerateTraceReportSf off GenerateTraceReportEml off GenerateCodeInfo off GenerateSLWebview off RTWCompilerOptimization "Off" CheckMdlBeforeBuild "Off" CustomRebuildMode "OnUpdate" Array { Type "Handle" Dimension 2 Simulink.CodeAppCC { $ObjectID 10 Version "1.10.0" Array { Type "Cell" Dimension 21 Cell "IgnoreCustomStorageClasses" Cell "IgnoreTestpoints" Cell "InsertBlockDesc" Cell "InsertPolySpaceComments" Cell "SFDataObjDesc" Cell "MATLABFcnDesc" Cell "SimulinkDataObjDesc" Cell "DefineNamingRule" Cell "SignalNamingRule" Cell "ParamNamingRule" Cell "InlinedPrmAccess" Cell "CustomSymbolStr" Cell "CustomSymbolStrGlobalVar" Cell "CustomSymbolStrType" Cell "CustomSymbolStrField" Cell "CustomSymbolStrFcn" Cell "CustomSymbolStrFcnArg" Cell "CustomSymbolStrBlkIO" Cell "CustomSymbolStrTmpVar" Cell "CustomSymbolStrMacro" Cell "ReqsInCode" PropName "DisabledProps" } ForceParamTrailComments off GenerateComments on IgnoreCustomStorageClasses on IgnoreTestpoints off IncHierarchyInIds off MaxIdLength 31 PreserveName off PreserveNameWithParent off ShowEliminatedStatement off IncAutoGenComments off SimulinkDataObjDesc off SFDataObjDesc off MATLABFcnDesc off IncDataTypeInIds off MangleLength 1 CustomSymbolStrGlobalVar "$R$N$M" CustomSymbolStrType "$N$R$M" CustomSymbolStrField "$N$M" CustomSymbolStrFcn "$R$N$M$F" CustomSymbolStrFcnArg "rt$I$N$M" CustomSymbolStrBlkIO "rtb_$N$M" CustomSymbolStrTmpVar "$N$M" CustomSymbolStrMacro "$R$N$M" DefineNamingRule "None" ParamNamingRule "None" SignalNamingRule "None" InsertBlockDesc off InsertPolySpaceComments off SimulinkBlockComments on MATLABSourceComments off EnableCustomComments off InlinedPrmAccess "Literals" ReqsInCode off UseSimReservedNames off } Simulink.GRTTargetCC { $BackupClass "Simulink.TargetCC" $ObjectID 11 Version "1.10.0" Array { Type "Cell" Dimension 16 Cell "GeneratePreprocessorConditionals" Cell "IncludeMdlTerminateFcn" Cell "CombineOutputUpdateFcns" Cell "SuppressErrorStatus" Cell "ERTCustomFileBanners" Cell "GenerateSampleERTMain" Cell "GenerateTestInterfaces" Cell "ModelStepFunctionPrototypeControlCompliant" Cell "CPPClassGenCompliant" Cell "MultiInstanceERTCode" Cell "PurelyIntegerCode" Cell "SupportComplex" Cell "SupportAbsoluteTime" Cell "SupportContinuousTime" Cell "SupportNonInlinedSFcns" Cell "PortableWordSizes" PropName "DisabledProps" } TargetFcnLib "ansi_tfl_table_tmw.mat" TargetLibSuffix "" TargetPreCompLibLocation "" TargetFunctionLibrary "ANSI_C" UtilityFuncGeneration "Auto" ERTMultiwordTypeDef "System defined" ERTCodeCoverageTool "None" ERTMultiwordLength 256 MultiwordLength 2048 GenerateFullHeader on GenerateSampleERTMain off GenerateTestInterfaces off IsPILTarget off ModelReferenceCompliant on ParMdlRefBuildCompliant on CompOptLevelCompliant on IncludeMdlTerminateFcn on GeneratePreprocessorConditionals "Disable all" CombineOutputUpdateFcns off CombineSignalStateStructs off SuppressErrorStatus off ERTFirstTimeCompliant off IncludeFileDelimiter "Auto" ERTCustomFileBanners off SupportAbsoluteTime on LogVarNameModifier "rt_" MatFileLogging on MultiInstanceERTCode off SupportNonFinite on SupportComplex on PurelyIntegerCode off SupportContinuousTime on SupportNonInlinedSFcns on SupportVariableSizeSignals off EnableShiftOperators on ParenthesesLevel "Nominal" PortableWordSizes off ModelStepFunctionPrototypeControlCompliant off CPPClassGenCompliant off AutosarCompliant off UseMalloc off ExtMode off ExtModeStaticAlloc off ExtModeTesting off ExtModeStaticAllocSize 1000000 ExtModeTransport 0 ExtModeMexFile "ext_comm" ExtModeIntrfLevel "Level1" RTWCAPISignals off RTWCAPIParams off RTWCAPIStates off GenerateASAP2 off } PropName "Components" } } hdlcoderui.hdlcc { $ObjectID 12 Version "1.10.0" Description "HDL Coder custom configuration component" Name "HDL Coder" Array { Type "Cell" Dimension 1 Cell "" PropName "HDLConfigFile" } HDLCActiveTab "0" } PropName "Components" } Name "Configuration" CurrentDlgPage "Solver" ConfigPrmDlgPosition " [ 400, 210, 1280, 840 ] " } PropName "ConfigurationSets" } BlockDefaults { ForegroundColor "black" BackgroundColor "white" DropShadow off NamePlacement "normal" FontName "Helvetica" FontSize 10 FontWeight "normal" FontAngle "normal" ShowName on BlockRotation 0 BlockMirror off } AnnotationDefaults { HorizontalAlignment "center" VerticalAlignment "middle" ForegroundColor "black" BackgroundColor "white" DropShadow off FontName "Helvetica" FontSize 10 FontWeight "normal" FontAngle "normal" UseDisplayTextAsClickCallback off } LineDefaults { FontName "Helvetica" FontSize 9 FontWeight "normal" FontAngle "normal" } BlockParameterDefaults { Block { BlockType Abs ZeroCross on SampleTime "-1" OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: Same as input" LockScale off RndMeth "Floor" SaturateOnIntegerOverflow on } Block { BlockType ComplexToRealImag Output "Real and imag" SampleTime "-1" } Block { BlockType Concatenate NumInputs "2" ConcatenateDimension "1" } Block { BlockType Constant Value "1" VectorParams1D on SamplingMode "Sample based" OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: Inherit from 'Constant value'" LockScale off SampleTime "inf" FramePeriod "inf" PreserveConstantTs off } Block { BlockType DataTypeConversion OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: Inherit via back propagation" LockScale off ConvertRealWorld "Real World Value (RWV)" RndMeth "Zero" SaturateOnIntegerOverflow on SampleTime "-1" } Block { BlockType Display Format "short" Decimation "10" Floating off SampleTime "-1" } Block { BlockType Gain Gain "1" Multiplication "Element-wise(K.*u)" ParamMin "[]" ParamMax "[]" ParamDataTypeStr "Inherit: Same as input" OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: Same as input" LockScale off RndMeth "Floor" SaturateOnIntegerOverflow on SampleTime "-1" } Block { BlockType Inport Port "1" OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: auto" LockScale off BusOutputAsStruct off PortDimensions "-1" VarSizeSig "Inherit" SampleTime "-1" SignalType "auto" SamplingMode "auto" LatchByDelayingOutsideSignal off LatchInputForFeedbackSignals off Interpolate on } Block { BlockType Math Operator "exp" OutputSignalType "auto" SampleTime "-1" OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: Same as first input" LockScale off RndMeth "Floor" SaturateOnIntegerOverflow on IntermediateResultsDataTypeStr "Inherit: Inherit via internal rule" AlgorithmType "Newton-Raphson" Iterations "3" } Block { BlockType Mux Inputs "4" DisplayOption "none" UseBusObject off BusObject "BusObject" NonVirtualBus off } Block { BlockType Outport Port "1" OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: auto" LockScale off BusOutputAsStruct off PortDimensions "-1" VarSizeSig "Inherit" SampleTime "-1" SignalType "auto" SamplingMode "auto" SourceOfInitialOutputValue "Dialog" OutputWhenDisabled "held" InitialOutput "[]" } Block { BlockType Product Inputs "2" Multiplication "Element-wise(.*)" CollapseMode "All dimensions" CollapseDim "1" InputSameDT on OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: Same as first input" LockScale off RndMeth "Zero" SaturateOnIntegerOverflow on SampleTime "-1" } Block { BlockType RealImagToComplex Input "Real and imag" ConstantPart "0" SampleTime "-1" } Block { BlockType Sqrt Operator "sqrt" OutputSignalType "auto" SampleTime "-1" OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: Same as first input" LockScale off RndMeth "Floor" SaturateOnIntegerOverflow on IntermediateResultsDataTypeStr "Inherit: Inherit via internal rule" AlgorithmType "Exact" Iterations "3" } Block { BlockType SubSystem ShowPortLabels "FromPortIcon" Permissions "ReadWrite" PermitHierarchicalResolution "All" TreatAsAtomicUnit off CheckFcnCallInpInsideContextMsg off SystemSampleTime "-1" RTWFcnNameOpts "Auto" RTWFileNameOpts "Auto" RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" SimViewingDevice off DataTypeOverride "UseLocalSettings" DataTypeOverrideAppliesTo "AllNumericTypes" MinMaxOverflowLogging "UseLocalSettings" Variant off GeneratePreprocessorConditionals off } Block { BlockType Sum IconShape "rectangular" Inputs "++" CollapseMode "All dimensions" CollapseDim "1" InputSameDT on AccumDataTypeStr "Inherit: Inherit via internal rule" OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: Same as first input" LockScale off RndMeth "Floor" SaturateOnIntegerOverflow on SampleTime "-1" } Block { BlockType Switch Criteria "u2 >= Threshold" Threshold "0" InputSameDT on OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: Inherit via internal rule" LockScale off RndMeth "Floor" SaturateOnIntegerOverflow on ZeroCross on SampleTime "-1" AllowDiffInputSizes off } Block { BlockType Trigonometry Operator "sin" ApproximationMethod "None" NumberOfIterations "11" OutputSignalType "auto" SampleTime "-1" } } System { Name "gnss_sdr_galileo_e1_tcp_connector_tracking_lib" Location [724, 337, 1557, 772] Open on ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" ReportName "simulink-default.rpt" SIDHighWatermark "4302" Block { BlockType Reference Name "Model Info" SID "2" Ports [] Position [15, 15, 517, 411] ForegroundColor "green" ShowName off LibraryVersion "1.310" FontName "Arial" SourceBlock "simulink/Model-Wide\nUtilities/Model Info" SourceType "CMBlock" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off InitialBlockCM "None" BlockCM "None" Frame "on" DisplayStringWithTags "/*! \n * \\file gnss_sdr_galileo_e1_tcp_connector_tracking_lib.mdl\n * \\brief gnss_" "sdr_galileo_e1_tcp_connector_tracking Simulink library model. For \n * further information, please check the R" "EADME_gnss_sdr_galileo_e1_tcp_connector_tracking.txt file.\n *\n * \\author David Pubill, 2012. dpubill(at)ctt" "c.es\n * -------------------------------------------------------------------------\n *\n * Copyright (C) 2010" "-2012 (see AUTHORS file for a list of contributors)\n *\n * GNSS-SDR is a software defined Global Navigation\n" " * Satellite Systems receiver\n *\n * This file is part of GNSS-SDR.\n *\n * GNSS-SDR is free soft" "ware: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as publish" "ed by\n * the Free Software Foundation, either version 3 of the License, or\n * at your option) any later vers" "ion.\n *\n * GNSS-SDR is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; withou" "t even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Gener" "al Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n" " * along with GNSS-SDR. If not, see .\n *\n * ---------------------------------" "----------------------------------------\n */" MaskDisplayString "/*! \\n * \\file gnss_sdr_galileo_e1_tcp_connector_tracking_lib.mdl\\n * \\brief gns" "s_sdr_galileo_e1_tcp_connector_tracking Simulink library model. For \\n * further information, please check th" "e README_gnss_sdr_galileo_e1_tcp_connector_tracking.txt file.\\n *\\n * \\author David Pubill, 2012. dpubill(a" "t)cttc.es\\n * -------------------------------------------------------------------------\\n *\\n * Copyright " "(C) 2010-2012 (see AUTHORS file for a list of contributors)\\n *\\n * GNSS-SDR is a software defined Global N" "avigation\\n * Satellite Systems receiver\\n *\\n * This file is part of GNSS-SDR.\\n *\\n * GNSS-" "SDR is free software: you can redistribute it and/or modify\\n * it under the terms of the GNU General Public L" "icense as published by\\n * the Free Software Foundation, either version 3 of the License, or\\n * at your opt" "ion) any later version.\\n *\\n * GNSS-SDR is distributed in the hope that it will be useful,\\n * but WITHOU" "T ANY WARRANTY; without even the implied warranty of\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. " " See the\\n * GNU General Public License for more details.\\n *\\n * You should have received a copy of the G" "NU General Public License\\n * along with GNSS-SDR. If not, see .\\n *\\n * ---" "----------------------------------------------------------------------\\n */" HorizontalTextAlignment "Left" LeftAlignmentValue "0.02" SourceBlockDiagram "gnss_sdr_galileo_e1_tcp_connector_tracking_lib" TagMaxNumber "20" } Block { BlockType SubSystem Name "gnss_sdr" SID "2052" Ports [] Position [580, 137, 725, 273] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "gnss_sdr" Location [702, 290, 1436, 736] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType SubSystem Name "gnss_sdr_galileo_e1_tcp_connector_tracking" SID "2089" Ports [13, 5] Position [260, 16, 450, 394] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "gnss_sdr_galileo_e1_tcp_connector_tracking" Location [336, 160, 1165, 883] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "control_id" SID "2098" Position [55, 13, 85, 27] IconDisplay "Port number" } Block { BlockType Inport Name "d_vE_I" SID "2099" Position [55, 58, 85, 72] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "d_vE_Q" SID "2100" Position [55, 93, 85, 107] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "d_E_I" SID "2101" Position [55, 133, 85, 147] Port "4" IconDisplay "Port number" } Block { BlockType Inport Name "d_E_Q" SID "2102" Position [55, 168, 85, 182] Port "5" IconDisplay "Port number" } Block { BlockType Inport Name "d_L_I" SID "2103" Position [55, 208, 85, 222] Port "6" IconDisplay "Port number" } Block { BlockType Inport Name "d_L_Q" SID "2104" Position [55, 243, 85, 257] Port "7" IconDisplay "Port number" } Block { BlockType Inport Name "d_vL_I" SID "2105" Position [55, 283, 85, 297] Port "8" IconDisplay "Port number" } Block { BlockType Inport Name "d_vL_Q" SID "2106" Position [55, 318, 85, 332] Port "9" IconDisplay "Port number" } Block { BlockType Inport Name "d_P_I" SID "2107" Position [55, 523, 85, 537] Port "10" IconDisplay "Port number" } Block { BlockType Inport Name "d_P_Q" SID "2108" Position [55, 558, 85, 572] Port "11" IconDisplay "Port number" } Block { BlockType Inport Name "d_acq_carrier_doppler_Hz" SID "2109" Position [55, 593, 85, 607] Port "12" IconDisplay "Port number" } Block { BlockType Inport Name "enable_tracking" SID "2110" Position [55, 643, 85, 657] Port "13" IconDisplay "Port number" } Block { BlockType Abs Name "Abs" SID "2111" Position [310, 439, 330, 461] ShowName off SaturateOnIntegerOverflow off } Block { BlockType Abs Name "Abs1" SID "2112" Position [310, 414, 330, 436] ShowName off SaturateOnIntegerOverflow off } Block { BlockType Abs Name "Abs2" SID "2113" Position [310, 389, 330, 411] ShowName off SaturateOnIntegerOverflow off } Block { BlockType Abs Name "Abs3" SID "2114" Position [310, 464, 330, 486] ShowName off SaturateOnIntegerOverflow off } Block { BlockType Abs Name "Abs4" SID "2115" Position [310, 364, 330, 386] ShowName off SaturateOnIntegerOverflow off } Block { BlockType SubSystem Name "Carrier Tracking (PLL)" SID "2116" Ports [3, 2] Position [250, 521, 415, 679] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Carrier Tracking (PLL)" Location [166, 531, 925, 785] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "P" SID "2117" Position [15, 43, 45, 57] IconDisplay "Port number" } Block { BlockType Inport Name "d_acq_carrier_doppler_Hz" SID "2118" Position [55, 203, 85, 217] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "enable_tracking" SID "2119" Position [175, 158, 205, 172] Port "3" IconDisplay "Port number" } Block { BlockType Constant Name "Constant" SID "2120" Position [510, 135, 540, 165] ShowName off Value "0" SampleTime "-1" } Block { BlockType SubSystem Name "PLL Filter" SID "2121" Ports [2, 1] Position [295, 20, 460, 135] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "PLL Filter" Location [166, 531, 1275, 944] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "carr_error" SID "4278" Position [30, 13, 60, 27] IconDisplay "Port number" } Block { BlockType Inport Name "enable_tracking" SID "4279" Position [30, 73, 60, 87] Port "2" IconDisplay "Port number" } Block { BlockType Constant Name "2*zeta" SID "4280" Position [300, 284, 350, 316] Value "2*zeta_PLL" SampleTime "-1" } Block { BlockType Sum Name "Add1" SID "4281" Ports [3, 1] Position [935, 141, 965, 279] ShowName off Inputs "+++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Constant Name "Constant4" SID "4282" Position [720, 155, 750, 185] ShowName off Value "0" SampleTime "-1" } Block { BlockType Constant Name "Constant5" SID "4283" Position [775, 350, 805, 380] ShowName off Value "0" SampleTime "-1" } Block { BlockType Constant Name "Constant6" SID "4284" Position [440, 100, 470, 130] ShowName off Value "0" SampleTime "-1" } Block { BlockType Reference Name "Delay1" SID "4285" Ports [1, 1] Position [955, 293, 985, 327] BlockMirror on NamePlacement "alternate" ShowName off LibraryVersion "1.310" UserDataPersistent on UserData "DataTag0" SourceBlock "simulink/Discrete/Integer Delay" SourceType "Integer Delay" NumDelays "1" InputProcessing "Inherited" vinit "0.0" samptime "-1" } Block { BlockType Reference Name "Delay3" SID "4286" Ports [1, 1] Position [575, 63, 605, 97] NamePlacement "alternate" ShowName off LibraryVersion "1.310" UserDataPersistent on UserData "DataTag1" SourceBlock "simulink/Discrete/Integer Delay" SourceType "Integer Delay" NumDelays "1" InputProcessing "Inherited" vinit "0.0" samptime "-1" } Block { BlockType Product Name "Divide4" SID "4287" Ports [2, 1] Position [370, 170, 405, 270] ShowName off Inputs "*/" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" RndMeth "Floor" SaturateOnIntegerOverflow off Port { PortNumber 1 Name "Tau1" RTWStorageClass "Auto" DataLoggingNameMode "SignalName" } } Block { BlockType Product Name "Divide5" SID "4288" Ports [2, 1] Position [370, 275, 405, 375] ShowName off Inputs "*/" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" RndMeth "Floor" SaturateOnIntegerOverflow off Port { PortNumber 1 Name "Tau2" RTWStorageClass "Auto" DataLoggingNameMode "SignalName" } } Block { BlockType Product Name "Divide6" SID "4289" Ports [2, 1] Position [545, 145, 580, 245] ShowName off Inputs "*/" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Divide7" SID "4290" Ports [2, 1] Position [545, 255, 580, 355] ShowName off Inputs "*/" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "4291" Ports [2, 1] Position [265, 225, 295, 265] ShowName off InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "4292" Ports [2, 1] Position [845, 106, 875, 224] ShowName off InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "4293" Ports [2, 1] Position [685, 274, 715, 316] ShowName off InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Subtract1" SID "4294" Ports [2, 1] Position [685, 35, 710, 95] ShowName off Inputs "+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Switch Name "Switch4" SID "4295" Position [485, 27, 535, 133] ShowName off Threshold "1" InputSameDT off SaturateOnIntegerOverflow off } Block { BlockType Switch Name "Switch5" SID "4296" Position [825, 277, 875, 383] ShowName off Threshold "1" InputSameDT off SaturateOnIntegerOverflow off } Block { BlockType Switch Name "Switch6" SID "4297" Position [765, 82, 815, 188] ShowName off Threshold "1" InputSameDT off SaturateOnIntegerOverflow off } Block { BlockType Gain Name "Wn" SID "4298" Position [170, 227, 215, 263] Gain "(8*zeta_PLL)/(1+(4*(zeta_PLL)^2))" ParamDataTypeStr "Inherit: Inherit via internal rule" OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Constant Name "d_pdi_carr" SID "4299" Position [475, 264, 525, 296] Value "d_pdi_carr" SampleTime "-1" } Block { BlockType Constant Name "k" SID "4300" Position [300, 179, 350, 211] Value "k_PLL" SampleTime "-1" } Block { BlockType Constant Name "lbw" SID "4301" Position [100, 229, 150, 261] Value "B_PLL" SampleTime "-1" } Block { BlockType Outport Name "carr_nco" SID "4302" Position [1040, 203, 1070, 217] IconDisplay "Port number" } Line { SrcBlock "d_pdi_carr" SrcPort 1 DstBlock "Divide7" DstPort 1 } Line { SrcBlock "Divide7" SrcPort 1 DstBlock "Product6" DstPort 2 } Line { SrcBlock "Add1" SrcPort 1 Points [45, 0] Branch { DstBlock "carr_nco" DstPort 1 } Branch { Points [0, 100] DstBlock "Delay1" DstPort 1 } } Line { SrcBlock "Product5" SrcPort 1 DstBlock "Add1" DstPort 1 } Line { SrcBlock "Divide6" SrcPort 1 DstBlock "Product5" DstPort 2 } Line { SrcBlock "carr_error" SrcPort 1 Points [395, 0] Branch { Points [175, 0; 0, 30] Branch { Points [0, 235] DstBlock "Product6" DstPort 1 } Branch { DstBlock "Subtract1" DstPort 1 } } Branch { Points [0, 25] DstBlock "Switch4" DstPort 1 } } Line { Name "Tau2" Labels [0, 0] SrcBlock "Divide5" SrcPort 1 Points [35, 0; 0, -155] DstBlock "Divide6" DstPort 1 } Line { SrcBlock "2*zeta" SrcPort 1 DstBlock "Divide5" DstPort 1 } Line { SrcBlock "Product4" SrcPort 1 DstBlock "Divide4" DstPort 2 } Line { SrcBlock "k" SrcPort 1 DstBlock "Divide4" DstPort 1 } Line { Name "Tau1" Labels [0, 0] SrcBlock "Divide4" SrcPort 1 Points [55, 0] Branch { Points [0, 110] DstBlock "Divide7" DstPort 2 } Branch { DstBlock "Divide6" DstPort 2 } } Line { Labels [0, 0] SrcBlock "lbw" SrcPort 1 DstBlock "Wn" DstPort 1 } Line { SrcBlock "Wn" SrcPort 1 Points [15, 0] Branch { Points [10, 0] Branch { Points [0, 10] DstBlock "Product4" DstPort 2 } Branch { Points [0, -10] DstBlock "Product4" DstPort 1 } } Branch { Points [0, 105] DstBlock "Divide5" DstPort 2 } } Line { SrcBlock "Delay1" SrcPort 1 Points [-30, 0] DstBlock "Add1" DstPort 3 } Line { SrcBlock "Subtract1" SrcPort 1 Points [20, 0; 0, 35] DstBlock "Switch6" DstPort 1 } Line { SrcBlock "Switch6" SrcPort 1 DstBlock "Product5" DstPort 1 } Line { SrcBlock "Product6" SrcPort 1 DstBlock "Switch5" DstPort 1 } Line { SrcBlock "Switch5" SrcPort 1 Points [20, 0; 0, -120] DstBlock "Add1" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Switch5" DstPort 3 } Line { SrcBlock "Delay3" SrcPort 1 DstBlock "Subtract1" DstPort 2 } Line { SrcBlock "Constant6" SrcPort 1 DstBlock "Switch4" DstPort 3 } Line { SrcBlock "enable_tracking" SrcPort 1 Points [25, 0] Branch { Points [335, 0] Branch { Points [0, 55] DstBlock "Switch6" DstPort 2 } Branch { DstBlock "Switch4" DstPort 2 } } Branch { Points [0, 300; 660, 0; 0, -50] DstBlock "Switch5" DstPort 2 } } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Switch6" DstPort 3 } Line { SrcBlock "Switch4" SrcPort 1 DstBlock "Delay3" DstPort 1 } Annotation { Position [998, 349] } Annotation { Position [983, 334] } } } Block { BlockType SubSystem Name "PLL discriminator" SID "2149" Ports [1, 1] Position [75, 18, 185, 82] AncestorBlock "gnss_sdr_tcp_connector_tracking_lib/gnss_sdr/gnss_sdr_tcp_connector_tracking/Carrier Tracking \n" "(PLL)/atan2(Q,I)1/PLL Costas loop two quadrant arctan discriminator" LibraryVersion "*1.36" MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "PLL discriminator" Location [259, 411, 754, 585] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" SIDHighWatermark "11685" Block { BlockType Inport Name "P" SID "2149:11670" Position [15, 68, 45, 82] IconDisplay "Port number" } Block { BlockType Abs Name "Abs" SID "2149:11685" Position [250, 115, 280, 145] ShowName off SaturateOnIntegerOverflow off } Block { BlockType ComplexToRealImag Name "Complex to\nReal-Imag" SID "2149:11671" Ports [1, 2] Position [70, 35, 140, 110] ShowName off Output "Real and imag" } Block { BlockType Constant Name "Constant" SID "2149:11683" Position [315, 120, 345, 150] ShowName off Value "0" SampleTime "-1" } Block { BlockType Product Name "Divide" SID "2149:11672" Ports [2, 1] Position [210, 13, 230, 117] ShowName off Inputs "*/" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Switch Name "Switch" SID "2149:11684" Position [365, 47, 415, 153] ShowName off Criteria "u2 > Threshold" InputSameDT off SaturateOnIntegerOverflow off } Block { BlockType Trigonometry Name "Trigonometric\nFunction" SID "2149:11673" Ports [1, 1] Position [260, 43, 305, 87] ShowName off Operator "atan" } Block { BlockType Outport Name "carr_error" SID "2149:11674" Position [440, 93, 470, 107] IconDisplay "Port number" } Line { SrcBlock "Abs" SrcPort 1 Points [20, 0; 0, -30] DstBlock "Switch" DstPort 2 } Line { SrcBlock "Trigonometric\nFunction" SrcPort 1 DstBlock "Switch" DstPort 1 } Line { SrcBlock "Switch" SrcPort 1 DstBlock "carr_error" DstPort 1 } Line { SrcBlock "Constant" SrcPort 1 DstBlock "Switch" DstPort 3 } Line { SrcBlock "Complex to\nReal-Imag" SrcPort 2 Points [20, 0; 0, -50] DstBlock "Divide" DstPort 1 } Line { SrcBlock "Complex to\nReal-Imag" SrcPort 1 Points [35, 0; 0, 35] Branch { DstBlock "Divide" DstPort 2 } Branch { Points [0, 40] DstBlock "Abs" DstPort 1 } } Line { SrcBlock "Divide" SrcPort 1 DstBlock "Trigonometric\nFunction" DstPort 1 } Line { SrcBlock "P" SrcPort 1 DstBlock "Complex to\nReal-Imag" DstPort 1 } } } Block { BlockType Sum Name "Subtract" SID "2150" Ports [2, 1] Position [575, 187, 605, 218] ShowName off InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Switch Name "Switch" SID "2151" Position [560, 62, 610, 168] ShowName off Threshold "1" InputSameDT off SaturateOnIntegerOverflow off } Block { BlockType Gain Name "[rad/s] to [Hz]" SID "2152" Position [215, 34, 270, 66] ShowName off Gain "1/(2*pi)" ParamDataTypeStr "Inherit: Inherit via internal rule" OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "carr_nco" SID "2153" Position [655, 108, 685, 122] IconDisplay "Port number" } Block { BlockType Outport Name "carrier_doppler_Hz" SID "2154" Position [665, 198, 695, 212] Port "2" IconDisplay "Port number" } Line { SrcBlock "PLL discriminator" SrcPort 1 DstBlock "[rad/s] to [Hz]" DstPort 1 } Line { SrcBlock "P" SrcPort 1 DstBlock "PLL discriminator" DstPort 1 } Line { SrcBlock "enable_tracking" SrcPort 1 Points [35, 0] Branch { Points [260, 0; 0, -50] DstBlock "Switch" DstPort 2 } Branch { Points [0, -60] DstBlock "PLL Filter" DstPort 2 } } Line { SrcBlock "PLL Filter" SrcPort 1 Points [20, 0] Branch { Points [0, 115] DstBlock "Subtract" DstPort 1 } Branch { DstBlock "Switch" DstPort 1 } } Line { SrcBlock "d_acq_carrier_doppler_Hz" SrcPort 1 DstBlock "Subtract" DstPort 2 } Line { SrcBlock "Subtract" SrcPort 1 DstBlock "carrier_doppler_Hz" DstPort 1 } Line { SrcBlock "Switch" SrcPort 1 DstBlock "carr_nco" DstPort 1 } Line { SrcBlock "Constant" SrcPort 1 DstBlock "Switch" DstPort 3 } Line { SrcBlock "[rad/s] to [Hz]" SrcPort 1 DstBlock "PLL Filter" DstPort 1 } } } Block { BlockType SubSystem Name "Code Tracking\n(DLL)" SID "2155" Ports [5, 1] Position [450, 44, 605, 426] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Code Tracking\n(DLL)" Location [514, 607, 1002, 858] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "vE" SID "2156" Position [25, 23, 55, 37] IconDisplay "Port number" } Block { BlockType Inport Name "E" SID "2157" Position [25, 58, 55, 72] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "L" SID "2158" Position [25, 93, 55, 107] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "vL" SID "2159" Position [25, 128, 55, 142] Port "4" IconDisplay "Port number" } Block { BlockType Inport Name "enable_tracking" SID "2160" Position [25, 173, 55, 187] Port "5" IconDisplay "Port number" } Block { BlockType SubSystem Name "DLL Filter" SID "2161" Ports [2, 1] Position [260, 36, 405, 229] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "DLL Filter" Location [158, 107, 1310, 563] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "code_error" SID "2162" Position [30, 13, 60, 27] IconDisplay "Port number" } Block { BlockType Inport Name "enable_tracking" SID "2163" Position [30, 73, 60, 87] Port "2" IconDisplay "Port number" } Block { BlockType Constant Name "2*zeta" SID "2164" Position [300, 284, 350, 316] Value "2*zeta_DLL" SampleTime "-1" } Block { BlockType Sum Name "Add" SID "2165" Ports [3, 1] Position [935, 141, 965, 279] ShowName off Inputs "+++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Constant Name "Constant" SID "2166" Position [720, 155, 750, 185] ShowName off Value "0" SampleTime "-1" } Block { BlockType Constant Name "Constant2" SID "2167" Position [775, 350, 805, 380] ShowName off Value "0" SampleTime "-1" } Block { BlockType Constant Name "Constant3" SID "2168" Position [440, 100, 470, 130] ShowName off Value "0" SampleTime "-1" } Block { BlockType Reference Name "Delay" SID "2169" Ports [1, 1] Position [955, 293, 985, 327] BlockMirror on NamePlacement "alternate" ShowName off LibraryVersion "1.310" UserDataPersistent on UserData "DataTag2" SourceBlock "simulink/Discrete/Integer Delay" SourceType "Integer Delay" NumDelays "1" InputProcessing "Inherited" vinit "0.0" samptime "-1" } Block { BlockType Reference Name "Delay2" SID "2170" Ports [1, 1] Position [575, 63, 605, 97] NamePlacement "alternate" ShowName off LibraryVersion "1.310" UserDataPersistent on UserData "DataTag3" SourceBlock "simulink/Discrete/Integer Delay" SourceType "Integer Delay" NumDelays "1" InputProcessing "Inherited" vinit "0.0" samptime "-1" } Block { BlockType Product Name "Divide" SID "2171" Ports [2, 1] Position [370, 170, 405, 270] ShowName off Inputs "*/" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" RndMeth "Floor" SaturateOnIntegerOverflow off Port { PortNumber 1 Name "Tau1" RTWStorageClass "Auto" DataLoggingNameMode "SignalName" } } Block { BlockType Product Name "Divide2" SID "2172" Ports [2, 1] Position [370, 275, 405, 375] ShowName off Inputs "*/" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" RndMeth "Floor" SaturateOnIntegerOverflow off Port { PortNumber 1 Name "Tau2" RTWStorageClass "Auto" DataLoggingNameMode "SignalName" } } Block { BlockType Product Name "Divide4" SID "2173" Ports [2, 1] Position [545, 145, 580, 245] ShowName off Inputs "*/" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Divide5" SID "2174" Ports [2, 1] Position [545, 255, 580, 355] ShowName off Inputs "*/" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product1" SID "2175" Ports [2, 1] Position [265, 225, 295, 265] ShowName off InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "2176" Ports [2, 1] Position [845, 106, 875, 224] ShowName off InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "2177" Ports [2, 1] Position [685, 274, 715, 316] ShowName off InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Subtract" SID "2178" Ports [2, 1] Position [685, 35, 710, 95] ShowName off Inputs "+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Switch Name "Switch1" SID "2179" Position [485, 27, 535, 133] ShowName off Threshold "1" InputSameDT off SaturateOnIntegerOverflow off } Block { BlockType Switch Name "Switch2" SID "2180" Position [825, 277, 875, 383] ShowName off Threshold "1" InputSameDT off SaturateOnIntegerOverflow off } Block { BlockType Switch Name "Switch4" SID "2181" Position [765, 82, 815, 188] ShowName off Threshold "1" InputSameDT off SaturateOnIntegerOverflow off } Block { BlockType Gain Name "Wn" SID "2182" Position [170, 227, 215, 263] Gain "(8*zeta_DLL)/(1+(4*(zeta_DLL)^2))" ParamDataTypeStr "Inherit: Inherit via internal rule" OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Constant Name "d_pdi_code" SID "2183" Position [475, 264, 525, 296] Value "d_pdi_code" SampleTime "-1" } Block { BlockType Constant Name "k" SID "2184" Position [300, 179, 350, 211] Value "k_DLL" SampleTime "-1" } Block { BlockType Constant Name "lbw" SID "2185" Position [100, 229, 150, 261] Value "B_DLL" SampleTime "-1" } Block { BlockType Outport Name "code_nco" SID "2186" Position [1040, 203, 1070, 217] IconDisplay "Port number" } Line { SrcBlock "d_pdi_code" SrcPort 1 DstBlock "Divide5" DstPort 1 } Line { SrcBlock "Divide5" SrcPort 1 DstBlock "Product3" DstPort 2 } Line { SrcBlock "Add" SrcPort 1 Points [45, 0] Branch { DstBlock "code_nco" DstPort 1 } Branch { Points [0, 100] DstBlock "Delay" DstPort 1 } } Line { SrcBlock "Product2" SrcPort 1 DstBlock "Add" DstPort 1 } Line { SrcBlock "Divide4" SrcPort 1 DstBlock "Product2" DstPort 2 } Line { SrcBlock "code_error" SrcPort 1 Points [395, 0] Branch { Points [175, 0; 0, 30] Branch { Points [0, 235] DstBlock "Product3" DstPort 1 } Branch { DstBlock "Subtract" DstPort 1 } } Branch { Points [0, 25] DstBlock "Switch1" DstPort 1 } } Line { Name "Tau2" Labels [0, 0] SrcBlock "Divide2" SrcPort 1 Points [35, 0; 0, -155] DstBlock "Divide4" DstPort 1 } Line { SrcBlock "2*zeta" SrcPort 1 DstBlock "Divide2" DstPort 1 } Line { SrcBlock "Product1" SrcPort 1 DstBlock "Divide" DstPort 2 } Line { SrcBlock "k" SrcPort 1 DstBlock "Divide" DstPort 1 } Line { Name "Tau1" Labels [0, 0] SrcBlock "Divide" SrcPort 1 Points [55, 0] Branch { Points [0, 110] DstBlock "Divide5" DstPort 2 } Branch { DstBlock "Divide4" DstPort 2 } } Line { Labels [0, 0] SrcBlock "lbw" SrcPort 1 DstBlock "Wn" DstPort 1 } Line { SrcBlock "Wn" SrcPort 1 Points [15, 0] Branch { Points [10, 0] Branch { Points [0, 10] DstBlock "Product1" DstPort 2 } Branch { Points [0, -10] DstBlock "Product1" DstPort 1 } } Branch { Points [0, 105] DstBlock "Divide2" DstPort 2 } } Line { SrcBlock "Delay" SrcPort 1 Points [-30, 0] DstBlock "Add" DstPort 3 } Line { SrcBlock "Subtract" SrcPort 1 Points [20, 0; 0, 35] DstBlock "Switch4" DstPort 1 } Line { SrcBlock "Switch4" SrcPort 1 DstBlock "Product2" DstPort 1 } Line { SrcBlock "Product3" SrcPort 1 DstBlock "Switch2" DstPort 1 } Line { SrcBlock "Switch2" SrcPort 1 Points [20, 0; 0, -120] DstBlock "Add" DstPort 2 } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Switch2" DstPort 3 } Line { SrcBlock "Delay2" SrcPort 1 DstBlock "Subtract" DstPort 2 } Line { SrcBlock "Constant3" SrcPort 1 DstBlock "Switch1" DstPort 3 } Line { SrcBlock "enable_tracking" SrcPort 1 Points [25, 0] Branch { Points [0, 0; 335, 0] Branch { Points [0, 55] DstBlock "Switch4" DstPort 2 } Branch { DstBlock "Switch1" DstPort 2 } } Branch { Points [0, 300; 660, 0; 0, -50] DstBlock "Switch2" DstPort 2 } } Line { SrcBlock "Constant" SrcPort 1 DstBlock "Switch4" DstPort 3 } Line { SrcBlock "Switch1" SrcPort 1 DstBlock "Delay2" DstPort 1 } Annotation { Position [998, 349] } Annotation { Position [983, 334] } } } Block { BlockType SubSystem Name "DLL discriminator" SID "2187" Ports [4, 1] Position [80, 13, 225, 152] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "DLL discriminator" Location [272, 238, 794, 581] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "vE" SID "2188" Position [20, 23, 50, 37] IconDisplay "Port number" } Block { BlockType Inport Name "E" SID "2189" Position [15, 108, 45, 122] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "L" SID "2190" Position [15, 223, 45, 237] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "vL" SID "2191" Position [15, 293, 45, 307] Port "4" IconDisplay "Port number" } Block { BlockType Math Name "E power" SID "2192" Ports [1, 1] Position [95, 100, 125, 130] Operator "magnitude^2" } Block { BlockType Math Name "L power" SID "2193" Ports [1, 1] Position [90, 215, 120, 245] Operator "magnitude^2" } Block { BlockType Sqrt Name "Sqrt" SID "2194" Position [215, 65, 245, 95] ShowName off } Block { BlockType Sqrt Name "Sqrt1" SID "2195" Position [220, 250, 250, 280] ShowName off } Block { BlockType Sum Name "Sum" SID "2196" Ports [2, 1] Position [260, 145, 280, 165] ShowName off IconShape "round" Inputs "+|-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" } Block { BlockType Sum Name "Sum1" SID "2197" Ports [2, 1] Position [320, 180, 340, 200] ShowName off IconShape "round" Inputs "+|+" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" } Block { BlockType Sum Name "Sum2" SID "2198" Ports [2, 1] Position [160, 70, 180, 90] ShowName off IconShape "round" Inputs "+|+" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" } Block { BlockType Sum Name "Sum3" SID "2199" Ports [2, 1] Position [155, 255, 175, 275] ShowName off IconShape "round" Inputs "+|+" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" } Block { BlockType Product Name "vE Normalisation" SID "2200" Ports [2, 1] Position [390, 138, 435, 207] NamePlacement "alternate" ShowName off Inputs "*/" InputSameDT off RndMeth "Floor" } Block { BlockType Math Name "vE power" SID "2201" Ports [1, 1] Position [95, 15, 125, 45] Operator "magnitude^2" } Block { BlockType Math Name "vL power" SID "2202" Ports [1, 1] Position [90, 285, 120, 315] Operator "magnitude^2" } Block { BlockType Outport Name "code_error" SID "2203" Position [465, 168, 495, 182] IconDisplay "Port number" } Line { SrcBlock "vL power" SrcPort 1 Points [40, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Sum3" SrcPort 1 DstBlock "Sqrt1" DstPort 1 } Line { SrcBlock "L power" SrcPort 1 Points [40, 0] DstBlock "Sum3" DstPort 1 } Line { SrcBlock "E power" SrcPort 1 Points [40, 0] DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 DstBlock "Sqrt" DstPort 1 } Line { SrcBlock "vE Normalisation" SrcPort 1 DstBlock "code_error" DstPort 1 } Line { SrcBlock "Sum1" SrcPort 1 DstBlock "vE Normalisation" DstPort 2 } Line { SrcBlock "Sum" SrcPort 1 DstBlock "vE Normalisation" DstPort 1 } Line { SrcBlock "vL" SrcPort 1 DstBlock "vL power" DstPort 1 } Line { SrcBlock "vE" SrcPort 1 DstBlock "vE power" DstPort 1 } Line { SrcBlock "vE power" SrcPort 1 Points [40, 0] DstBlock "Sum2" DstPort 1 } Line { SrcBlock "L" SrcPort 1 DstBlock "L power" DstPort 1 } Line { SrcBlock "E" SrcPort 1 DstBlock "E power" DstPort 1 } Line { SrcBlock "Sqrt" SrcPort 1 Points [20, 0] Branch { Points [60, 0] DstBlock "Sum1" DstPort 1 } Branch { DstBlock "Sum" DstPort 1 } } Line { SrcBlock "Sqrt1" SrcPort 1 Points [15, 0] Branch { Points [60, 0] DstBlock "Sum1" DstPort 2 } Branch { DstBlock "Sum" DstPort 2 } } } } Block { BlockType Outport Name "code_nco" SID "2204" Position [435, 128, 465, 142] IconDisplay "Port number" } Line { SrcBlock "vL" SrcPort 1 DstBlock "DLL discriminator" DstPort 4 } Line { SrcBlock "vE" SrcPort 1 DstBlock "DLL discriminator" DstPort 1 } Line { SrcBlock "E" SrcPort 1 DstBlock "DLL discriminator" DstPort 2 } Line { SrcBlock "L" SrcPort 1 DstBlock "DLL discriminator" DstPort 3 } Line { SrcBlock "DLL Filter" SrcPort 1 DstBlock "code_nco" DstPort 1 } Line { SrcBlock "DLL discriminator" SrcPort 1 DstBlock "DLL Filter" DstPort 1 } Line { SrcBlock "enable_tracking" SrcPort 1 DstBlock "DLL Filter" DstPort 2 } } } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "2205" Position [640, 215, 680, 255] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "2206" Position [200, 140, 240, 180] ShowName off OutDataTypeStr "double" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "2207" Position [640, 620, 680, 660] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "2208" Position [640, 540, 680, 580] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "2209" Position [200, 215, 240, 255] ShowName off OutDataTypeStr "double" } Block { BlockType DataTypeConversion Name "Data Type \nConversion6" SID "2210" Position [180, 530, 220, 570] ShowName off OutDataTypeStr "double" } Block { BlockType DataTypeConversion Name "Data Type \nConversion7" SID "2211" Position [200, 65, 240, 105] ShowName off OutDataTypeStr "double" } Block { BlockType DataTypeConversion Name "Data Type \nConversion8" SID "2212" Position [200, 290, 240, 330] ShowName off OutDataTypeStr "double" } Block { BlockType DataTypeConversion Name "Data Type \nConversion9" SID "2213" Position [180, 580, 220, 620] ShowName off OutDataTypeStr "double" } Block { BlockType Mux Name "Mux" SID "2214" Ports [5, 1] Position [360, 359, 365, 491] ShowName off Inputs "5" DisplayOption "bar" } Block { BlockType RealImagToComplex Name "Real-Imag to\nComplex" SID "2215" Ports [2, 1] Position [125, 121, 160, 194] ShowName off Input "Real and imag" } Block { BlockType RealImagToComplex Name "Real-Imag to\nComplex1" SID "2216" Ports [2, 1] Position [125, 196, 160, 269] ShowName off Input "Real and imag" } Block { BlockType RealImagToComplex Name "Real-Imag to\nComplex2" SID "2217" Ports [2, 1] Position [125, 511, 160, 584] ShowName off Input "Real and imag" } Block { BlockType RealImagToComplex Name "Real-Imag to\nComplex3" SID "2218" Ports [2, 1] Position [125, 46, 160, 119] ShowName off Input "Real and imag" } Block { BlockType RealImagToComplex Name "Real-Imag to\nComplex4" SID "2219" Ports [2, 1] Position [125, 271, 160, 344] ShowName off Input "Real and imag" } Block { BlockType Outport Name "control_id_" SID "2220" Position [725, 13, 755, 27] IconDisplay "Port number" } Block { BlockType Outport Name "code_nco" SID "2221" Position [725, 228, 755, 242] Port "2" IconDisplay "Port number" } Block { BlockType Outport Name "carr_nco" SID "2222" Position [725, 553, 755, 567] Port "3" IconDisplay "Port number" } Block { BlockType Outport Name "carrier_doppler_Hz" SID "2223" Position [725, 633, 755, 647] Port "4" IconDisplay "Port number" } Block { BlockType Outport Name "EPL Scope" SID "2224" Position [385, 418, 415, 432] Port "5" IconDisplay "Port number" } Line { SrcBlock "Data Type \nConversion8" SrcPort 1 Points [10, 0] Branch { DstBlock "Code Tracking\n(DLL)" DstPort 4 } Branch { Points [0, 165] DstBlock "Abs3" DstPort 1 } } Line { SrcBlock "Data Type \nConversion7" SrcPort 1 Points [50, 0] Branch { DstBlock "Code Tracking\n(DLL)" DstPort 1 } Branch { DstBlock "Abs4" DstPort 1 } } Line { SrcBlock "d_vL_Q" SrcPort 1 DstBlock "Real-Imag to\nComplex4" DstPort 2 } Line { SrcBlock "d_vL_I" SrcPort 1 DstBlock "Real-Imag to\nComplex4" DstPort 1 } Line { SrcBlock "Real-Imag to\nComplex4" SrcPort 1 DstBlock "Data Type \nConversion8" DstPort 1 } Line { SrcBlock "d_vE_Q" SrcPort 1 DstBlock "Real-Imag to\nComplex3" DstPort 2 } Line { SrcBlock "d_vE_I" SrcPort 1 DstBlock "Real-Imag to\nComplex3" DstPort 1 } Line { SrcBlock "Real-Imag to\nComplex3" SrcPort 1 DstBlock "Data Type \nConversion7" DstPort 1 } Line { SrcBlock "Mux" SrcPort 1 DstBlock "EPL Scope" DstPort 1 } Line { SrcBlock "enable_tracking" SrcPort 1 Points [120, 0] Branch { DstBlock "Carrier Tracking (PLL)" DstPort 3 } Branch { Points [0, 60; 225, 0] DstBlock "Code Tracking\n(DLL)" DstPort 5 } } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "carrier_doppler_Hz" DstPort 1 } Line { SrcBlock "d_acq_carrier_doppler_Hz" SrcPort 1 DstBlock "Data Type \nConversion9" DstPort 1 } Line { SrcBlock "Data Type \nConversion6" SrcPort 1 Points [5, 0] Branch { DstBlock "Carrier Tracking (PLL)" DstPort 1 } Branch { Points [0, 0; 0, -125] DstBlock "Abs1" DstPort 1 } } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 Points [20, 0] Branch { Points [0, 215] DstBlock "Abs" DstPort 1 } Branch { DstBlock "Code Tracking\n(DLL)" DstPort 3 } } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 Points [40, 0] Branch { Points [0, 240] DstBlock "Abs2" DstPort 1 } Branch { DstBlock "Code Tracking\n(DLL)" DstPort 2 } } Line { SrcBlock "d_P_Q" SrcPort 1 DstBlock "Real-Imag to\nComplex2" DstPort 2 } Line { SrcBlock "d_P_I" SrcPort 1 DstBlock "Real-Imag to\nComplex2" DstPort 1 } Line { SrcBlock "d_L_Q" SrcPort 1 DstBlock "Real-Imag to\nComplex1" DstPort 2 } Line { SrcBlock "d_L_I" SrcPort 1 DstBlock "Real-Imag to\nComplex1" DstPort 1 } Line { SrcBlock "control_id" SrcPort 1 DstBlock "control_id_" DstPort 1 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "carr_nco" DstPort 1 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "code_nco" DstPort 1 } Line { SrcBlock "d_E_Q" SrcPort 1 DstBlock "Real-Imag to\nComplex" DstPort 2 } Line { SrcBlock "d_E_I" SrcPort 1 DstBlock "Real-Imag to\nComplex" DstPort 1 } Line { SrcBlock "Real-Imag to\nComplex2" SrcPort 1 DstBlock "Data Type \nConversion6" DstPort 1 } Line { SrcBlock "Real-Imag to\nComplex1" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Carrier Tracking (PLL)" SrcPort 1 DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "Real-Imag to\nComplex" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "Code Tracking\n(DLL)" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "Carrier Tracking (PLL)" SrcPort 2 DstBlock "Data Type \nConversion3" DstPort 1 } Line { SrcBlock "Abs4" SrcPort 1 DstBlock "Mux" DstPort 1 } Line { SrcBlock "Abs2" SrcPort 1 DstBlock "Mux" DstPort 2 } Line { SrcBlock "Abs1" SrcPort 1 DstBlock "Mux" DstPort 3 } Line { SrcBlock "Abs" SrcPort 1 DstBlock "Mux" DstPort 4 } Line { SrcBlock "Abs3" SrcPort 1 DstBlock "Mux" DstPort 5 } Line { SrcBlock "Data Type \nConversion9" SrcPort 1 DstBlock "Carrier Tracking (PLL)" DstPort 2 } } } Block { BlockType SubSystem Name "gnss_sdr_galileo_e1_tcp_connector_tracking_rx" SID "2088" Ports [0, 13] Position [25, 19, 205, 391] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "gnss_sdr_galileo_e1_tcp_connector_tracking_rx" Location [2, 82, 1670, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "41" Block { BlockType Reference Name "Multiport\nSelector" SID "2225" Ports [1, 52] Position [180, 19, 355, 2201] ShowName off LibraryVersion "1.462" SourceBlock "dspindex/Multiport\nSelector" SourceType "Multiport Selector" rowsOrCols "Rows" idxCellArray "{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33," "34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52}" idxErrMode "Clip Index" } Block { BlockType Reference Name "RX" SID "2226" Ports [0, 1] Position [15, 1046, 150, 1164] LibraryVersion "1.84" DialogController "instrumentcreatedialog" DialogControllerArgs "DataTag4" SourceBlock "instrumentlib/TCP//IP Receive" SourceType "TCP/IP Receive" Host "84.88.61.86" Port "2070" DataSize "52" EnableBlockingMode on Timeout "5" SampleTime "-1" DataType "uint8" ByteOrder "BigEndian" } Block { BlockType SubSystem Name "Subsystem" SID "2227" Ports [4, 1] Position [525, 536, 630, 704] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [528, 347, 1021, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "2228" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "2229" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "2230" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "2231" Position [25, 43, 55, 57] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "2232" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "2233" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "2234" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "2235" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "2236" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "2237" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "2238" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "2239" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "2240" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "2241" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "2242" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "2243" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "2244" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "2245" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "2246" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "2247" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "2248" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "2249" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "2250" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "2251" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "2252" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "2253" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "2254" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "2255" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "2256" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "2257" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "2258" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "2259" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "2260" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "2261" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "2262" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "2263" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "2264" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "2265" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "2266" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "2267" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "2268" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "2269" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "2270" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "2271" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "2272" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "2273" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "2274" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "2275" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "2276" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "2277" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "2278" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "2279" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "2280" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "2281" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "2282" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "2283" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "2284" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "2285" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "2286" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "2287" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "2288" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "2289" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "2290" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "2291" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "2292" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "2293" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "2294" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "2295" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "2296" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "2297" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "2298" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "2299" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "2300" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "2301" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "2302" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "2303" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "2304" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "2305" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "2306" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "2307" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "2308" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "2309" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "2310" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "2311" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "2312" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "2313" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "2314" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "2315" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "2316" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "2317" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "2318" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "2319" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "2320" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "2321" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "2322" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "2323" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "2324" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "2325" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "2326" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "2327" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "2328" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "2329" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "2330" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "2331" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "2332" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "2333" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "2334" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "2335" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "2336" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "2337" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "2338" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "2339" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "2340" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "2341" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "2342" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "2343" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "2344" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "2345" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "2346" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "2347" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "2348" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "2349" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "2350" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "2351" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "2352" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "2353" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "2354" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "2355" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "2356" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "2357" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "2358" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "2359" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "2360" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "2361" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "2362" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "2363" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "2364" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "2365" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "2366" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "2367" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "2368" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "2369" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "2370" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "2371" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "2372" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "2373" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "2374" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "2375" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "2376" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "2377" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "2378" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "2379" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "2380" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "2381" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "2382" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "2383" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "2384" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "2385" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "2386" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "2387" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "2388" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "2389" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "2390" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "2391" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "2392" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "2393" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "2394" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "2395" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "2396" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "2397" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "2398" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "2399" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "2400" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "2401" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "2402" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "2403" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "2404" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "2405" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "2406" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "2407" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "2408" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "2409" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "2410" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "2411" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "2412" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "2413" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "2414" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "2415" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "2416" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "2417" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "2418" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "2419" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "2420" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "2421" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "2422" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "2423" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "2424" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "2425" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "2426" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "2427" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "2428" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "2429" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "2430" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "2431" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "2432" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "2433" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "2434" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "2435" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "2436" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "2437" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "2438" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "2439" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "2440" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "2441" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "2442" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "2443" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "2444" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "2445" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "2446" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } Branch { Points [5, 0] Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } Branch { DstBlock "Math\nFunction2" DstPort 2 } } } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } Branch { Points [0, 80] Branch { Points [0, 150] Branch { Points [0, 155] Branch { Points [0, 175] Branch { Points [0, 180; 5, 0] Branch { Points [-5, 0; 0, 175] Branch { Points [0, 185] Branch { Points [0, 190] Branch { Points [0, 195] Branch { Points [0, 215] Branch { Points [0, 230] Branch { Points [0, 240] Branch { Points [0, 260] Branch { Points [0, 265] Branch { Points [0, 275] Branch { Points [0, 280] Branch { Points [0, 285] Branch { Points [0, 300] Branch { Points [0, 305] Branch { Points [0, 310] Branch { Points [0, 315] Branch { Points [0, 320] Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } } } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } Branch { DstBlock "Math\nFunction23" DstPort 2 } } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } Branch { DstBlock "Math\nFunction22" DstPort 2 } } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } Branch { DstBlock "Math\nFunction21" DstPort 2 } } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } Branch { DstBlock "Math\nFunction20" DstPort 2 } } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } Branch { DstBlock "Math\nFunction19" DstPort 2 } } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } Branch { DstBlock "Math\nFunction18" DstPort 2 } } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } Branch { DstBlock "Math\nFunction17" DstPort 2 } } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } Branch { DstBlock "Math\nFunction16" DstPort 2 } } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } Branch { DstBlock "Math\nFunction15" DstPort 2 } } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } Branch { DstBlock "Math\nFunction14" DstPort 2 } } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } Branch { DstBlock "Math\nFunction13" DstPort 2 } } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } Branch { DstBlock "Math\nFunction12" DstPort 2 } } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } Branch { DstBlock "Math\nFunction11" DstPort 2 } } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } Branch { DstBlock "Math\nFunction10" DstPort 2 } } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } Branch { DstBlock "Math\nFunction7" DstPort 2 } } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } } } Block { BlockType Sum Name "Sum" SID "2447" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "2448" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "2449" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "2450" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "2451" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } Branch { DstBlock "Sign" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } Branch { DstBlock "Exponent" DstPort 1 } } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { DstBlock "Data Type Conversion1" DstPort 1 } Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } Branch { DstBlock "Display3" DstPort 1 } } } } Block { BlockType Outport Name "d_E_I" SID "2452" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "d_E_I" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem1" SID "2453" Ports [4, 1] Position [525, 701, 630, 869] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem1" Location [528, 347, 1021, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "2454" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "2455" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "2456" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "2457" Position [25, 43, 55, 57] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "2458" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "2459" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "2460" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "2461" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "2462" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "2463" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "2464" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "2465" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "2466" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "2467" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "2468" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "2469" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "2470" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "2471" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "2472" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "2473" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "2474" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "2475" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "2476" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "2477" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "2478" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "2479" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "2480" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "2481" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "2482" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "2483" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "2484" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "2485" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "2486" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "2487" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "2488" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "2489" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "2490" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "2491" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "2492" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "2493" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "2494" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "2495" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "2496" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "2497" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "2498" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "2499" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "2500" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "2501" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "2502" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "2503" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "2504" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "2505" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "2506" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "2507" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "2508" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "2509" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "2510" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "2511" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "2512" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "2513" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "2514" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "2515" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "2516" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "2517" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "2518" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "2519" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "2520" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "2521" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "2522" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "2523" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "2524" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "2525" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "2526" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "2527" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "2528" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "2529" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "2530" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "2531" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "2532" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "2533" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "2534" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "2535" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "2536" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "2537" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "2538" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "2539" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "2540" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "2541" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "2542" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "2543" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "2544" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "2545" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "2546" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "2547" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "2548" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "2549" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "2550" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "2551" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "2552" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "2553" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "2554" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "2555" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "2556" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "2557" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "2558" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "2559" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "2560" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "2561" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "2562" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "2563" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "2564" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "2565" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "2566" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "2567" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "2568" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "2569" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "2570" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "2571" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "2572" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "2573" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "2574" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "2575" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "2576" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "2577" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "2578" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "2579" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "2580" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "2581" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "2582" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "2583" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "2584" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "2585" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "2586" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "2587" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "2588" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "2589" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "2590" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "2591" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "2592" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "2593" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "2594" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "2595" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "2596" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "2597" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "2598" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "2599" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "2600" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "2601" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "2602" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "2603" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "2604" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "2605" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "2606" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "2607" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "2608" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "2609" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "2610" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "2611" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "2612" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "2613" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "2614" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "2615" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "2616" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "2617" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "2618" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "2619" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "2620" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "2621" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "2622" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "2623" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "2624" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "2625" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "2626" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "2627" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "2628" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "2629" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "2630" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "2631" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "2632" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "2633" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "2634" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "2635" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "2636" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "2637" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "2638" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "2639" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "2640" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "2641" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "2642" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "2643" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "2644" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "2645" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "2646" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "2647" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "2648" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "2649" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "2650" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "2651" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "2652" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "2653" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "2654" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "2655" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "2656" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "2657" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "2658" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "2659" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "2660" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "2661" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "2662" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "2663" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "2664" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "2665" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "2666" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "2667" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "2668" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "2669" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "2670" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "2671" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "2672" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction7" DstPort 2 } Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction10" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction11" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction12" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction13" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction14" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction15" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction16" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction17" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction18" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction19" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction20" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction21" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction22" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction23" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 80] Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } Branch { Points [0, 150] Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } Branch { Points [0, 155] Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } Branch { Points [0, 175] Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } Branch { Points [0, 180; 5, 0] Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } Branch { Points [-5, 0; 0, 175] Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } Branch { Points [0, 185] Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } Branch { Points [0, 190] Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } Branch { Points [0, 195] Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } Branch { Points [0, 215] Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } Branch { Points [0, 230] Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } Branch { Points [0, 240] Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } Branch { Points [0, 260] Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } Branch { Points [0, 265] Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } Branch { Points [0, 275] Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } Branch { Points [0, 280] Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } Branch { Points [0, 285] Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } Branch { Points [0, 300] Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } Branch { Points [0, 305] Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } Branch { Points [0, 310] Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } Branch { Points [0, 315] Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } Branch { Points [0, 320] Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } } } } } } } } } } } } } } } } } } } } } } } Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [5, 0] Branch { DstBlock "Math\nFunction2" DstPort 2 } Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } } Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } } } } Block { BlockType Sum Name "Sum" SID "2673" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "2674" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "2675" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "2676" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "2677" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { DstBlock "Display3" DstPort 1 } Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } Branch { DstBlock "Data Type Conversion1" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { DstBlock "Exponent" DstPort 1 } Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { DstBlock "Sign" DstPort 1 } Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } } } Block { BlockType Outport Name "d_E_Q" SID "2678" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "d_E_Q" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem10" SID "2679" Ports [4, 1] Position [525, 371, 630, 539] ShowName off AncestorBlock "gnss_sdr_galileo_e1_tcp_connector_tracking_lib/gnss_sdr/gnss_sdr_galileo_e1_tcp_connector_" "tracking_rx/Subsystem1" LibraryVersion "*1.82" MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem10" Location [528, 347, 1021, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" SIDHighWatermark "460" Block { BlockType Inport Name "In1" SID "2679:236" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "2679:237" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "2679:238" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "2679:239" Position [25, 43, 55, 57] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "2679:240" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "2679:241" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "2679:242" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "2679:243" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "2679:244" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "2679:245" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "2679:246" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "2679:247" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "2679:248" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "2679:249" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "2679:250" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "2679:251" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "2679:252" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "2679:253" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "2679:254" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "2679:255" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "2679:256" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "2679:257" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "2679:258" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "2679:259" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "2679:260" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "2679:261" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "2679:262" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "2679:263" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "2679:264" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "2679:265" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "2679:266" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "2679:267" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "2679:268" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "2679:269" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "2679:270" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "2679:271" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "2679:272" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "2679:273" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "2679:274" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "2679:275" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "2679:276" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "2679:277" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "2679:278" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "2679:279" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "2679:280" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "2679:281" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "2679:282" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "2679:283" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "2679:284" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "2679:285" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "2679:286" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "2679:287" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "2679:288" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "2679:289" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "2679:290" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "2679:291" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "2679:292" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "2679:293" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "2679:294" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "2679:295" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "2679:296" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "2679:297" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "2679:298" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "2679:299" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "2679:300" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "2679:301" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "2679:302" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "2679:303" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "2679:304" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "2679:305" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "2679:306" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "2679:307" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "2679:308" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "2679:309" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "2679:310" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "2679:311" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "2679:312" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "2679:313" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "2679:314" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "2679:315" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "2679:316" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "2679:317" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "2679:318" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "2679:319" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "2679:320" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "2679:321" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "2679:322" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "2679:323" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "2679:324" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "2679:325" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "2679:326" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "2679:327" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "2679:328" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "2679:329" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "2679:330" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "2679:331" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "2679:332" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "2679:333" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "2679:334" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "2679:335" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "2679:336" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "2679:337" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "2679:338" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "2679:339" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "2679:340" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "2679:341" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "2679:342" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "2679:343" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "2679:344" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "2679:345" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "2679:346" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "2679:347" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "2679:348" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "2679:349" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "2679:350" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "2679:351" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "2679:352" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "2679:353" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "2679:354" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "2679:355" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "2679:356" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "2679:357" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "2679:358" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "2679:359" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "2679:360" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "2679:361" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "2679:362" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "2679:363" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "2679:364" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "2679:365" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "2679:366" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "2679:367" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "2679:368" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "2679:369" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "2679:370" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "2679:371" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "2679:372" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "2679:373" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "2679:374" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "2679:375" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "2679:376" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "2679:377" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "2679:378" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "2679:379" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "2679:380" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "2679:381" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "2679:382" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "2679:383" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "2679:384" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "2679:385" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "2679:386" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "2679:387" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "2679:388" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "2679:389" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "2679:390" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "2679:391" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "2679:392" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "2679:393" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "2679:394" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "2679:395" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "2679:396" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "2679:397" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "2679:398" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "2679:399" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "2679:400" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "2679:401" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "2679:402" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "2679:403" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "2679:404" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "2679:405" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "2679:406" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "2679:407" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "2679:408" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "2679:409" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "2679:410" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "2679:411" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "2679:412" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "2679:413" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "2679:414" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "2679:415" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "2679:416" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "2679:417" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "2679:418" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "2679:419" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "2679:420" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "2679:421" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "2679:422" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "2679:423" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "2679:424" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "2679:425" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "2679:426" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "2679:427" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "2679:428" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "2679:429" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "2679:430" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "2679:431" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "2679:432" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "2679:433" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "2679:434" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "2679:435" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "2679:436" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "2679:437" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "2679:438" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "2679:439" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "2679:440" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "2679:441" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "2679:442" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "2679:443" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "2679:444" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "2679:445" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "2679:446" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "2679:447" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "2679:448" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "2679:449" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "2679:450" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "2679:451" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "2679:452" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "2679:453" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "2679:454" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction7" DstPort 2 } Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction10" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction11" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction12" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction13" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction14" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction15" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction16" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction17" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction18" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction19" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction20" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction21" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction22" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction23" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 80] Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } Branch { Points [0, 150] Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } Branch { Points [0, 155] Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } Branch { Points [0, 175] Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } Branch { Points [0, 180; 5, 0] Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } Branch { Points [-5, 0; 0, 175] Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } Branch { Points [0, 185] Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } Branch { Points [0, 190] Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } Branch { Points [0, 195] Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } Branch { Points [0, 215] Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } Branch { Points [0, 230] Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } Branch { Points [0, 240] Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } Branch { Points [0, 260] Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } Branch { Points [0, 265] Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } Branch { Points [0, 275] Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } Branch { Points [0, 280] Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } Branch { Points [0, 285] Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } Branch { Points [0, 300] Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } Branch { Points [0, 305] Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } Branch { Points [0, 310] Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } Branch { Points [0, 315] Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } Branch { Points [0, 320] Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } } } } } } } } } } } } } } } } } } } } } } } Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [5, 0] Branch { DstBlock "Math\nFunction2" DstPort 2 } Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } } Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } } } } Block { BlockType Sum Name "Sum" SID "2679:455" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "2679:456" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "2679:457" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "2679:458" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "2679:459" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { DstBlock "Display3" DstPort 1 } Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } Branch { DstBlock "Data Type Conversion1" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { DstBlock "Exponent" DstPort 1 } Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { DstBlock "Sign" DstPort 1 } Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } } } Block { BlockType Outport Name "d_vE_Q" SID "2679:460" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "d_vE_Q" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem11" SID "2680" Ports [4, 1] Position [525, 1191, 630, 1359] ShowName off AncestorBlock "gnss_sdr_galileo_e1_tcp_connector_tracking_lib/gnss_sdr/gnss_sdr_galileo_e1_tcp_connector_" "tracking_rx/Subsystem2" LibraryVersion "*1.82" MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem11" Location [528, 347, 1021, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" SIDHighWatermark "686" Block { BlockType Inport Name "In1" SID "2680:462" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "2680:463" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "2680:464" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "2680:465" Position [25, 43, 55, 57] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "2680:466" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "2680:467" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "2680:468" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "2680:469" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "2680:470" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "2680:471" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "2680:472" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "2680:473" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "2680:474" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "2680:475" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "2680:476" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "2680:477" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "2680:478" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "2680:479" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "2680:480" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "2680:481" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "2680:482" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "2680:483" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "2680:484" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "2680:485" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "2680:486" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "2680:487" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "2680:488" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "2680:489" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "2680:490" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "2680:491" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "2680:492" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "2680:493" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "2680:494" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "2680:495" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "2680:496" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "2680:497" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "2680:498" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "2680:499" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "2680:500" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "2680:501" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "2680:502" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "2680:503" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "2680:504" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "2680:505" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "2680:506" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "2680:507" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "2680:508" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "2680:509" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "2680:510" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "2680:511" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "2680:512" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "2680:513" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "2680:514" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "2680:515" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "2680:516" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "2680:517" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "2680:518" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "2680:519" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "2680:520" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "2680:521" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "2680:522" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "2680:523" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "2680:524" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "2680:525" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "2680:526" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "2680:527" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "2680:528" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "2680:529" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "2680:530" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "2680:531" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "2680:532" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "2680:533" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "2680:534" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "2680:535" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "2680:536" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "2680:537" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "2680:538" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "2680:539" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "2680:540" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "2680:541" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "2680:542" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "2680:543" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "2680:544" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "2680:545" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "2680:546" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "2680:547" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "2680:548" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "2680:549" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "2680:550" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "2680:551" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "2680:552" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "2680:553" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "2680:554" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "2680:555" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "2680:556" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "2680:557" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "2680:558" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "2680:559" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "2680:560" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "2680:561" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "2680:562" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "2680:563" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "2680:564" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "2680:565" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "2680:566" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "2680:567" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "2680:568" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "2680:569" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "2680:570" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "2680:571" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "2680:572" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "2680:573" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "2680:574" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "2680:575" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "2680:576" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "2680:577" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "2680:578" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "2680:579" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "2680:580" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "2680:581" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "2680:582" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "2680:583" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "2680:584" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "2680:585" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "2680:586" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "2680:587" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "2680:588" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "2680:589" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "2680:590" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "2680:591" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "2680:592" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "2680:593" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "2680:594" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "2680:595" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "2680:596" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "2680:597" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "2680:598" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "2680:599" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "2680:600" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "2680:601" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "2680:602" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "2680:603" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "2680:604" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "2680:605" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "2680:606" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "2680:607" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "2680:608" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "2680:609" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "2680:610" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "2680:611" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "2680:612" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "2680:613" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "2680:614" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "2680:615" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "2680:616" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "2680:617" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "2680:618" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "2680:619" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "2680:620" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "2680:621" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "2680:622" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "2680:623" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "2680:624" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "2680:625" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "2680:626" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "2680:627" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "2680:628" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "2680:629" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "2680:630" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "2680:631" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "2680:632" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "2680:633" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "2680:634" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "2680:635" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "2680:636" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "2680:637" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "2680:638" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "2680:639" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "2680:640" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "2680:641" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "2680:642" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "2680:643" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "2680:644" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "2680:645" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "2680:646" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "2680:647" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "2680:648" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "2680:649" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "2680:650" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "2680:651" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "2680:652" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "2680:653" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "2680:654" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "2680:655" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "2680:656" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "2680:657" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "2680:658" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "2680:659" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "2680:660" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "2680:661" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "2680:662" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "2680:663" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "2680:664" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "2680:665" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "2680:666" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "2680:667" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "2680:668" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "2680:669" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "2680:670" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "2680:671" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "2680:672" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "2680:673" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "2680:674" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "2680:675" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "2680:676" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "2680:677" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "2680:678" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "2680:679" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "2680:680" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } Branch { Points [5, 0] Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } Branch { DstBlock "Math\nFunction2" DstPort 2 } } } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } Branch { Points [0, 80] Branch { Points [0, 150] Branch { Points [0, 155] Branch { Points [0, 175] Branch { Points [0, 180; 5, 0] Branch { Points [-5, 0; 0, 175] Branch { Points [0, 185] Branch { Points [0, 190] Branch { Points [0, 195] Branch { Points [0, 215] Branch { Points [0, 230] Branch { Points [0, 240] Branch { Points [0, 260] Branch { Points [0, 265] Branch { Points [0, 275] Branch { Points [0, 280] Branch { Points [0, 285] Branch { Points [0, 300] Branch { Points [0, 305] Branch { Points [0, 310] Branch { Points [0, 315] Branch { Points [0, 320] Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } } } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } Branch { DstBlock "Math\nFunction23" DstPort 2 } } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } Branch { DstBlock "Math\nFunction22" DstPort 2 } } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } Branch { DstBlock "Math\nFunction21" DstPort 2 } } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } Branch { DstBlock "Math\nFunction20" DstPort 2 } } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } Branch { DstBlock "Math\nFunction19" DstPort 2 } } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } Branch { DstBlock "Math\nFunction18" DstPort 2 } } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } Branch { DstBlock "Math\nFunction17" DstPort 2 } } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } Branch { DstBlock "Math\nFunction16" DstPort 2 } } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } Branch { DstBlock "Math\nFunction15" DstPort 2 } } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } Branch { DstBlock "Math\nFunction14" DstPort 2 } } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } Branch { DstBlock "Math\nFunction13" DstPort 2 } } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } Branch { DstBlock "Math\nFunction12" DstPort 2 } } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } Branch { DstBlock "Math\nFunction11" DstPort 2 } } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } Branch { DstBlock "Math\nFunction10" DstPort 2 } } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } Branch { DstBlock "Math\nFunction7" DstPort 2 } } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } } } Block { BlockType Sum Name "Sum" SID "2680:681" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "2680:682" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "2680:683" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "2680:684" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "2680:685" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } Branch { DstBlock "Sign" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } Branch { DstBlock "Exponent" DstPort 1 } } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { DstBlock "Data Type Conversion1" DstPort 1 } Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } Branch { DstBlock "Display3" DstPort 1 } } } } Block { BlockType Outport Name "d_vL_I" SID "2680:686" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "d_vL_I" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem12" SID "2681" Ports [4, 1] Position [525, 1351, 630, 1519] ShowName off AncestorBlock "gnss_sdr_galileo_e1_tcp_connector_tracking_lib/gnss_sdr/gnss_sdr_galileo_e1_tcp_connector_" "tracking_rx/Subsystem3" LibraryVersion "*1.82" MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem12" Location [528, 347, 1021, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" SIDHighWatermark "912" Block { BlockType Inport Name "In1" SID "2681:688" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "2681:689" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "2681:690" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "2681:691" Position [25, 43, 55, 57] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "2681:692" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "2681:693" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "2681:694" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "2681:695" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "2681:696" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "2681:697" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "2681:698" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "2681:699" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "2681:700" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "2681:701" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "2681:702" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "2681:703" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "2681:704" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "2681:705" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "2681:706" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "2681:707" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "2681:708" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "2681:709" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "2681:710" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "2681:711" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "2681:712" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "2681:713" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "2681:714" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "2681:715" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "2681:716" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "2681:717" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "2681:718" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "2681:719" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "2681:720" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "2681:721" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "2681:722" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "2681:723" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "2681:724" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "2681:725" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "2681:726" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "2681:727" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "2681:728" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "2681:729" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "2681:730" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "2681:731" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "2681:732" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "2681:733" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "2681:734" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "2681:735" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "2681:736" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "2681:737" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "2681:738" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "2681:739" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "2681:740" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "2681:741" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "2681:742" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "2681:743" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "2681:744" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "2681:745" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "2681:746" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "2681:747" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "2681:748" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "2681:749" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "2681:750" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "2681:751" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "2681:752" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "2681:753" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "2681:754" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "2681:755" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "2681:756" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "2681:757" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "2681:758" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "2681:759" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "2681:760" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "2681:761" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "2681:762" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "2681:763" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "2681:764" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "2681:765" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "2681:766" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "2681:767" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "2681:768" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "2681:769" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "2681:770" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "2681:771" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "2681:772" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "2681:773" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "2681:774" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "2681:775" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "2681:776" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "2681:777" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "2681:778" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "2681:779" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "2681:780" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "2681:781" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "2681:782" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "2681:783" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "2681:784" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "2681:785" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "2681:786" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "2681:787" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "2681:788" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "2681:789" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "2681:790" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "2681:791" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "2681:792" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "2681:793" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "2681:794" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "2681:795" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "2681:796" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "2681:797" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "2681:798" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "2681:799" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "2681:800" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "2681:801" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "2681:802" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "2681:803" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "2681:804" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "2681:805" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "2681:806" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "2681:807" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "2681:808" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "2681:809" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "2681:810" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "2681:811" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "2681:812" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "2681:813" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "2681:814" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "2681:815" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "2681:816" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "2681:817" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "2681:818" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "2681:819" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "2681:820" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "2681:821" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "2681:822" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "2681:823" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "2681:824" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "2681:825" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "2681:826" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "2681:827" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "2681:828" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "2681:829" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "2681:830" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "2681:831" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "2681:832" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "2681:833" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "2681:834" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "2681:835" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "2681:836" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "2681:837" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "2681:838" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "2681:839" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "2681:840" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "2681:841" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "2681:842" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "2681:843" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "2681:844" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "2681:845" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "2681:846" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "2681:847" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "2681:848" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "2681:849" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "2681:850" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "2681:851" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "2681:852" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "2681:853" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "2681:854" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "2681:855" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "2681:856" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "2681:857" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "2681:858" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "2681:859" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "2681:860" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "2681:861" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "2681:862" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "2681:863" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "2681:864" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "2681:865" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "2681:866" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "2681:867" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "2681:868" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "2681:869" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "2681:870" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "2681:871" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "2681:872" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "2681:873" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "2681:874" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "2681:875" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "2681:876" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "2681:877" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "2681:878" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "2681:879" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "2681:880" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "2681:881" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "2681:882" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "2681:883" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "2681:884" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "2681:885" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "2681:886" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "2681:887" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "2681:888" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "2681:889" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "2681:890" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "2681:891" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "2681:892" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "2681:893" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "2681:894" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "2681:895" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "2681:896" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "2681:897" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "2681:898" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "2681:899" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "2681:900" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "2681:901" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "2681:902" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "2681:903" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "2681:904" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "2681:905" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "2681:906" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction7" DstPort 2 } Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction10" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction11" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction12" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction13" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction14" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction15" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction16" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction17" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction18" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction19" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction20" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction21" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction22" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction23" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 80] Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } Branch { Points [0, 150] Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } Branch { Points [0, 155] Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } Branch { Points [0, 175] Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } Branch { Points [0, 180; 5, 0] Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } Branch { Points [-5, 0; 0, 175] Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } Branch { Points [0, 185] Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } Branch { Points [0, 190] Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } Branch { Points [0, 195] Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } Branch { Points [0, 215] Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } Branch { Points [0, 230] Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } Branch { Points [0, 240] Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } Branch { Points [0, 260] Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } Branch { Points [0, 265] Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } Branch { Points [0, 275] Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } Branch { Points [0, 280] Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } Branch { Points [0, 285] Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } Branch { Points [0, 300] Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } Branch { Points [0, 305] Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } Branch { Points [0, 310] Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } Branch { Points [0, 315] Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } Branch { Points [0, 320] Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } } } } } } } } } } } } } } } } } } } } } } } Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [5, 0] Branch { DstBlock "Math\nFunction2" DstPort 2 } Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } } Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } } } } Block { BlockType Sum Name "Sum" SID "2681:907" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "2681:908" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "2681:909" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "2681:910" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "2681:911" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { DstBlock "Display3" DstPort 1 } Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } Branch { DstBlock "Data Type Conversion1" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { DstBlock "Exponent" DstPort 1 } Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { DstBlock "Sign" DstPort 1 } Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } } } Block { BlockType Outport Name "d_vL_Q" SID "2681:912" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "d_vL_Q" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem2" SID "2682" Ports [4, 1] Position [525, 866, 630, 1034] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem2" Location [528, 347, 1021, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "2683" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "2684" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "2685" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "2686" Position [25, 43, 55, 57] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "2687" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "2688" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "2689" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "2690" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "2691" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "2692" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "2693" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "2694" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "2695" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "2696" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "2697" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "2698" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "2699" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "2700" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "2701" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "2702" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "2703" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "2704" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "2705" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "2706" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "2707" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "2708" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "2709" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "2710" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "2711" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "2712" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "2713" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "2714" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "2715" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "2716" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "2717" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "2718" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "2719" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "2720" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "2721" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "2722" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "2723" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "2724" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "2725" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "2726" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "2727" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "2728" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "2729" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "2730" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "2731" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "2732" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "2733" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "2734" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "2735" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "2736" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "2737" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "2738" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "2739" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "2740" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "2741" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "2742" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "2743" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "2744" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "2745" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "2746" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "2747" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "2748" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "2749" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "2750" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "2751" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "2752" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "2753" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "2754" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "2755" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "2756" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "2757" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "2758" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "2759" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "2760" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "2761" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "2762" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "2763" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "2764" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "2765" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "2766" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "2767" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "2768" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "2769" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "2770" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "2771" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "2772" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "2773" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "2774" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "2775" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "2776" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "2777" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "2778" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "2779" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "2780" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "2781" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "2782" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "2783" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "2784" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "2785" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "2786" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "2787" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "2788" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "2789" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "2790" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "2791" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "2792" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "2793" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "2794" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "2795" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "2796" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "2797" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "2798" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "2799" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "2800" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "2801" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "2802" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "2803" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "2804" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "2805" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "2806" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "2807" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "2808" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "2809" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "2810" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "2811" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "2812" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "2813" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "2814" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "2815" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "2816" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "2817" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "2818" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "2819" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "2820" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "2821" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "2822" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "2823" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "2824" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "2825" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "2826" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "2827" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "2828" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "2829" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "2830" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "2831" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "2832" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "2833" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "2834" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "2835" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "2836" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "2837" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "2838" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "2839" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "2840" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "2841" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "2842" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "2843" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "2844" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "2845" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "2846" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "2847" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "2848" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "2849" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "2850" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "2851" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "2852" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "2853" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "2854" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "2855" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "2856" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "2857" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "2858" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "2859" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "2860" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "2861" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "2862" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "2863" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "2864" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "2865" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "2866" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "2867" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "2868" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "2869" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "2870" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "2871" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "2872" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "2873" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "2874" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "2875" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "2876" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "2877" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "2878" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "2879" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "2880" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "2881" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "2882" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "2883" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "2884" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "2885" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "2886" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "2887" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "2888" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "2889" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "2890" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "2891" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "2892" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "2893" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "2894" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "2895" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "2896" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "2897" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "2898" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "2899" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "2900" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "2901" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } Branch { Points [5, 0] Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } Branch { DstBlock "Math\nFunction2" DstPort 2 } } } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } Branch { Points [0, 80] Branch { Points [0, 150] Branch { Points [0, 155] Branch { Points [0, 175] Branch { Points [0, 180; 5, 0] Branch { Points [-5, 0; 0, 175] Branch { Points [0, 185] Branch { Points [0, 190] Branch { Points [0, 195] Branch { Points [0, 215] Branch { Points [0, 230] Branch { Points [0, 240] Branch { Points [0, 260] Branch { Points [0, 265] Branch { Points [0, 275] Branch { Points [0, 280] Branch { Points [0, 285] Branch { Points [0, 300] Branch { Points [0, 305] Branch { Points [0, 310] Branch { Points [0, 315] Branch { Points [0, 320] Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } } } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } Branch { DstBlock "Math\nFunction23" DstPort 2 } } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } Branch { DstBlock "Math\nFunction22" DstPort 2 } } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } Branch { DstBlock "Math\nFunction21" DstPort 2 } } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } Branch { DstBlock "Math\nFunction20" DstPort 2 } } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } Branch { DstBlock "Math\nFunction19" DstPort 2 } } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } Branch { DstBlock "Math\nFunction18" DstPort 2 } } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } Branch { DstBlock "Math\nFunction17" DstPort 2 } } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } Branch { DstBlock "Math\nFunction16" DstPort 2 } } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } Branch { DstBlock "Math\nFunction15" DstPort 2 } } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } Branch { DstBlock "Math\nFunction14" DstPort 2 } } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } Branch { DstBlock "Math\nFunction13" DstPort 2 } } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } Branch { DstBlock "Math\nFunction12" DstPort 2 } } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } Branch { DstBlock "Math\nFunction11" DstPort 2 } } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } Branch { DstBlock "Math\nFunction10" DstPort 2 } } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } Branch { DstBlock "Math\nFunction7" DstPort 2 } } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } } } Block { BlockType Sum Name "Sum" SID "2902" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "2903" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "2904" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "2905" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "2906" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } Branch { DstBlock "Sign" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } Branch { DstBlock "Exponent" DstPort 1 } } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { DstBlock "Data Type Conversion1" DstPort 1 } Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } Branch { DstBlock "Display3" DstPort 1 } } } } Block { BlockType Outport Name "d_L_I" SID "2907" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "d_L_I" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem3" SID "2908" Ports [4, 1] Position [525, 1026, 630, 1194] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem3" Location [528, 347, 1021, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "2909" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "2910" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "2911" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "2912" Position [25, 43, 55, 57] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "2913" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "2914" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "2915" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "2916" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "2917" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "2918" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "2919" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "2920" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "2921" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "2922" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "2923" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "2924" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "2925" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "2926" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "2927" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "2928" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "2929" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "2930" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "2931" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "2932" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "2933" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "2934" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "2935" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "2936" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "2937" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "2938" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "2939" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "2940" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "2941" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "2942" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "2943" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "2944" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "2945" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "2946" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "2947" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "2948" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "2949" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "2950" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "2951" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "2952" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "2953" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "2954" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "2955" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "2956" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "2957" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "2958" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "2959" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "2960" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "2961" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "2962" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "2963" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "2964" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "2965" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "2966" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "2967" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "2968" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "2969" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "2970" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "2971" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "2972" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "2973" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "2974" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "2975" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "2976" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "2977" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "2978" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "2979" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "2980" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "2981" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "2982" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "2983" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "2984" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "2985" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "2986" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "2987" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "2988" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "2989" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "2990" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "2991" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "2992" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "2993" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "2994" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "2995" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "2996" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "2997" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "2998" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "2999" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "3000" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "3001" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "3002" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "3003" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "3004" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "3005" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "3006" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "3007" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "3008" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "3009" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "3010" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "3011" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "3012" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "3013" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "3014" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "3015" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "3016" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "3017" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "3018" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "3019" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "3020" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "3021" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "3022" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "3023" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "3024" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "3025" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "3026" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "3027" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "3028" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "3029" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "3030" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "3031" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "3032" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "3033" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "3034" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "3035" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "3036" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "3037" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "3038" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "3039" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "3040" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "3041" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "3042" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "3043" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "3044" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "3045" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "3046" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "3047" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "3048" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "3049" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "3050" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "3051" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "3052" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "3053" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "3054" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "3055" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "3056" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "3057" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "3058" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "3059" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "3060" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "3061" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "3062" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "3063" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "3064" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "3065" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "3066" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "3067" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "3068" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "3069" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "3070" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "3071" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "3072" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "3073" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "3074" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "3075" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "3076" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "3077" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "3078" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "3079" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "3080" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "3081" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "3082" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "3083" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "3084" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "3085" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "3086" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "3087" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "3088" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "3089" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "3090" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "3091" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "3092" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "3093" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "3094" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "3095" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "3096" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "3097" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "3098" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "3099" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "3100" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "3101" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "3102" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "3103" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "3104" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "3105" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "3106" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "3107" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "3108" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "3109" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "3110" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "3111" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "3112" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "3113" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "3114" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "3115" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "3116" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "3117" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "3118" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "3119" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "3120" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "3121" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "3122" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "3123" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "3124" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "3125" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "3126" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "3127" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction7" DstPort 2 } Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction10" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction11" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction12" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction13" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction14" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction15" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction16" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction17" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction18" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction19" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction20" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction21" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction22" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction23" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 80] Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } Branch { Points [0, 150] Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } Branch { Points [0, 155] Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } Branch { Points [0, 175] Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } Branch { Points [0, 180; 5, 0] Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } Branch { Points [-5, 0; 0, 175] Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } Branch { Points [0, 185] Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } Branch { Points [0, 190] Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } Branch { Points [0, 195] Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } Branch { Points [0, 215] Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } Branch { Points [0, 230] Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } Branch { Points [0, 240] Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } Branch { Points [0, 260] Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } Branch { Points [0, 265] Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } Branch { Points [0, 275] Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } Branch { Points [0, 280] Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } Branch { Points [0, 285] Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } Branch { Points [0, 300] Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } Branch { Points [0, 305] Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } Branch { Points [0, 310] Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } Branch { Points [0, 315] Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } Branch { Points [0, 320] Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } } } } } } } } } } } } } } } } } } } } } } } Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [5, 0] Branch { DstBlock "Math\nFunction2" DstPort 2 } Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } } Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } } } } Block { BlockType Sum Name "Sum" SID "3128" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "3129" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "3130" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "3131" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "3132" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { DstBlock "Display3" DstPort 1 } Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } Branch { DstBlock "Data Type Conversion1" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { DstBlock "Exponent" DstPort 1 } Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { DstBlock "Sign" DstPort 1 } Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } } } Block { BlockType Outport Name "d_L_Q" SID "3133" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "d_L_Q" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem4" SID "3134" Ports [4, 1] Position [525, 1516, 630, 1684] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem4" Location [528, 347, 1021, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "3135" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "3136" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "3137" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "3138" Position [25, 43, 55, 57] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "3139" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "3140" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "3141" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "3142" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "3143" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "3144" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "3145" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "3146" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "3147" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "3148" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "3149" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "3150" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "3151" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "3152" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "3153" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "3154" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "3155" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "3156" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "3157" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "3158" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "3159" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "3160" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "3161" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "3162" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "3163" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "3164" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "3165" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "3166" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "3167" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "3168" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "3169" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "3170" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "3171" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "3172" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "3173" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "3174" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "3175" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "3176" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "3177" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "3178" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "3179" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "3180" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "3181" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "3182" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "3183" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "3184" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "3185" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "3186" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "3187" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "3188" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "3189" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "3190" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "3191" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "3192" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "3193" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "3194" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "3195" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "3196" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "3197" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "3198" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "3199" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "3200" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "3201" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "3202" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "3203" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "3204" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "3205" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "3206" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "3207" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "3208" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "3209" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "3210" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "3211" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "3212" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "3213" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "3214" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "3215" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "3216" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "3217" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "3218" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "3219" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "3220" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "3221" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "3222" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "3223" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "3224" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "3225" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "3226" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "3227" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "3228" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "3229" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "3230" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "3231" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "3232" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "3233" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "3234" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "3235" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "3236" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "3237" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "3238" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "3239" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "3240" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "3241" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "3242" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "3243" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "3244" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "3245" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "3246" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "3247" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "3248" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "3249" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "3250" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "3251" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "3252" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "3253" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "3254" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "3255" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "3256" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "3257" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "3258" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "3259" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "3260" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "3261" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "3262" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "3263" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "3264" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "3265" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "3266" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "3267" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "3268" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "3269" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "3270" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "3271" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "3272" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "3273" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "3274" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "3275" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "3276" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "3277" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "3278" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "3279" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "3280" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "3281" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "3282" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "3283" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "3284" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "3285" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "3286" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "3287" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "3288" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "3289" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "3290" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "3291" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "3292" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "3293" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "3294" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "3295" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "3296" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "3297" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "3298" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "3299" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "3300" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "3301" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "3302" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "3303" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "3304" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "3305" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "3306" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "3307" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "3308" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "3309" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "3310" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "3311" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "3312" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "3313" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "3314" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "3315" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "3316" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "3317" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "3318" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "3319" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "3320" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "3321" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "3322" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "3323" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "3324" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "3325" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "3326" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "3327" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "3328" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "3329" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "3330" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "3331" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "3332" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "3333" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "3334" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "3335" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "3336" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "3337" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "3338" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "3339" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "3340" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "3341" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "3342" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "3343" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "3344" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "3345" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "3346" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "3347" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "3348" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "3349" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "3350" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "3351" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "3352" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "3353" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction7" DstPort 2 } Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction10" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction11" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction12" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction13" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction14" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction15" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction16" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction17" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction18" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction19" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction20" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction21" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction22" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction23" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 80] Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } Branch { Points [0, 150] Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } Branch { Points [0, 155] Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } Branch { Points [0, 175] Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } Branch { Points [0, 180; 5, 0] Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } Branch { Points [-5, 0; 0, 175] Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } Branch { Points [0, 185] Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } Branch { Points [0, 190] Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } Branch { Points [0, 195] Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } Branch { Points [0, 215] Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } Branch { Points [0, 230] Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } Branch { Points [0, 240] Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } Branch { Points [0, 260] Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } Branch { Points [0, 265] Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } Branch { Points [0, 275] Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } Branch { Points [0, 280] Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } Branch { Points [0, 285] Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } Branch { Points [0, 300] Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } Branch { Points [0, 305] Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } Branch { Points [0, 310] Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } Branch { Points [0, 315] Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } Branch { Points [0, 320] Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } } } } } } } } } } } } } } } } } } } } } } } Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [5, 0] Branch { DstBlock "Math\nFunction2" DstPort 2 } Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } } Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } } } } Block { BlockType Sum Name "Sum" SID "3354" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "3355" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "3356" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "3357" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "3358" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { DstBlock "Display3" DstPort 1 } Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } Branch { DstBlock "Data Type Conversion1" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { DstBlock "Exponent" DstPort 1 } Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { DstBlock "Sign" DstPort 1 } Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } } } Block { BlockType Outport Name "d_P_I" SID "3359" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "d_P_I" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem5" SID "3360" Ports [4, 1] Position [525, 1681, 630, 1839] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem5" Location [528, 347, 1021, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "3361" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "3362" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "3363" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "3364" Position [25, 43, 55, 57] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "3365" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "3366" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "3367" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "3368" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "3369" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "3370" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "3371" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "3372" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "3373" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "3374" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "3375" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "3376" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "3377" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "3378" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "3379" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "3380" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "3381" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "3382" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "3383" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "3384" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "3385" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "3386" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "3387" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "3388" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "3389" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "3390" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "3391" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "3392" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "3393" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "3394" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "3395" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "3396" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "3397" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "3398" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "3399" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "3400" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "3401" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "3402" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "3403" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "3404" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "3405" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "3406" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "3407" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "3408" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "3409" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "3410" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "3411" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "3412" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "3413" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "3414" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "3415" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "3416" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "3417" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "3418" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "3419" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "3420" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "3421" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "3422" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "3423" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "3424" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "3425" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "3426" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "3427" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "3428" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "3429" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "3430" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "3431" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "3432" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "3433" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "3434" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "3435" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "3436" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "3437" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "3438" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "3439" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "3440" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "3441" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "3442" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "3443" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "3444" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "3445" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "3446" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "3447" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "3448" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "3449" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "3450" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "3451" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "3452" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "3453" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "3454" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "3455" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "3456" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "3457" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "3458" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "3459" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "3460" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "3461" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "3462" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "3463" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "3464" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "3465" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "3466" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "3467" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "3468" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "3469" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "3470" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "3471" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "3472" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "3473" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "3474" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "3475" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "3476" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "3477" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "3478" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "3479" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "3480" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "3481" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "3482" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "3483" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "3484" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "3485" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "3486" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "3487" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "3488" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "3489" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "3490" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "3491" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "3492" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "3493" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "3494" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "3495" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "3496" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "3497" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "3498" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "3499" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "3500" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "3501" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "3502" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "3503" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "3504" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "3505" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "3506" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "3507" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "3508" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "3509" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "3510" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "3511" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "3512" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "3513" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "3514" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "3515" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "3516" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "3517" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "3518" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "3519" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "3520" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "3521" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "3522" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "3523" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "3524" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "3525" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "3526" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "3527" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "3528" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "3529" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "3530" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "3531" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "3532" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "3533" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "3534" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "3535" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "3536" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "3537" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "3538" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "3539" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "3540" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "3541" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "3542" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "3543" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "3544" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "3545" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "3546" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "3547" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "3548" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "3549" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "3550" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "3551" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "3552" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "3553" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "3554" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "3555" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "3556" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "3557" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "3558" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "3559" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "3560" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "3561" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "3562" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "3563" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "3564" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "3565" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "3566" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "3567" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "3568" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "3569" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "3570" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "3571" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "3572" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "3573" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "3574" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "3575" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "3576" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "3577" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "3578" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "3579" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } Branch { Points [5, 0] Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } Branch { DstBlock "Math\nFunction2" DstPort 2 } } } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } Branch { Points [0, 80] Branch { Points [0, 150] Branch { Points [0, 155] Branch { Points [0, 175] Branch { Points [0, 180; 5, 0] Branch { Points [-5, 0; 0, 175] Branch { Points [0, 185] Branch { Points [0, 190] Branch { Points [0, 195] Branch { Points [0, 215] Branch { Points [0, 230] Branch { Points [0, 240] Branch { Points [0, 260] Branch { Points [0, 265] Branch { Points [0, 275] Branch { Points [0, 280] Branch { Points [0, 285] Branch { Points [0, 300] Branch { Points [0, 305] Branch { Points [0, 310] Branch { Points [0, 315] Branch { Points [0, 320] Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } } } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } Branch { DstBlock "Math\nFunction23" DstPort 2 } } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } Branch { DstBlock "Math\nFunction22" DstPort 2 } } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } Branch { DstBlock "Math\nFunction21" DstPort 2 } } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } Branch { DstBlock "Math\nFunction20" DstPort 2 } } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } Branch { DstBlock "Math\nFunction19" DstPort 2 } } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } Branch { DstBlock "Math\nFunction18" DstPort 2 } } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } Branch { DstBlock "Math\nFunction17" DstPort 2 } } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } Branch { DstBlock "Math\nFunction16" DstPort 2 } } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } Branch { DstBlock "Math\nFunction15" DstPort 2 } } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } Branch { DstBlock "Math\nFunction14" DstPort 2 } } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } Branch { DstBlock "Math\nFunction13" DstPort 2 } } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } Branch { DstBlock "Math\nFunction12" DstPort 2 } } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } Branch { DstBlock "Math\nFunction11" DstPort 2 } } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } Branch { DstBlock "Math\nFunction10" DstPort 2 } } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } Branch { DstBlock "Math\nFunction7" DstPort 2 } } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } } } Block { BlockType Sum Name "Sum" SID "3580" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "3581" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "3582" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "3583" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "3584" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } Branch { DstBlock "Sign" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } Branch { DstBlock "Exponent" DstPort 1 } } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { DstBlock "Data Type Conversion1" DstPort 1 } Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } Branch { DstBlock "Display3" DstPort 1 } } } } Block { BlockType Outport Name "d_P_Q" SID "3585" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "d_P_Q" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem6" SID "3586" Ports [4, 1] Position [525, 1839, 630, 2001] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem6" Location [528, 347, 1055, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "3587" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "3588" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "3589" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "3590" Position [25, 43, 55, 57] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "3591" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "3592" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "3593" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "3594" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "3595" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "3596" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "3597" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "3598" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "3599" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "3600" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "3601" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "3602" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "3603" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "3604" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "3605" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "3606" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "3607" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "3608" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "3609" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "3610" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "3611" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "3612" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "3613" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "3614" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "3615" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "3616" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "3617" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "3618" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "3619" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "3620" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "3621" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "3622" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "3623" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "3624" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "3625" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "3626" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "3627" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "3628" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "3629" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "3630" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "3631" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "3632" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "3633" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "3634" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "3635" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "3636" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "3637" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "3638" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "3639" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "3640" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "3641" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "3642" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "3643" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "3644" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "3645" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "3646" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "3647" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "3648" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "3649" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "3650" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "3651" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "3652" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "3653" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "3654" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "3655" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "3656" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "3657" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "3658" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "3659" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "3660" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "3661" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "3662" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "3663" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "3664" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "3665" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "3666" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "3667" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "3668" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "3669" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "3670" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "3671" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "3672" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "3673" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "3674" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "3675" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "3676" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "3677" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "3678" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "3679" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "3680" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "3681" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "3682" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "3683" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "3684" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "3685" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "3686" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "3687" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "3688" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "3689" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "3690" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "3691" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "3692" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "3693" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "3694" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "3695" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "3696" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "3697" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "3698" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "3699" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "3700" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "3701" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "3702" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "3703" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "3704" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "3705" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "3706" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "3707" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "3708" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "3709" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "3710" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "3711" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "3712" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "3713" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "3714" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "3715" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "3716" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "3717" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "3718" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "3719" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "3720" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "3721" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "3722" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "3723" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "3724" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "3725" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "3726" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "3727" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "3728" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "3729" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "3730" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "3731" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "3732" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "3733" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "3734" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "3735" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "3736" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "3737" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "3738" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "3739" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "3740" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "3741" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "3742" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "3743" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "3744" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "3745" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "3746" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "3747" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "3748" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "3749" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "3750" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "3751" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "3752" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "3753" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "3754" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "3755" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "3756" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "3757" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "3758" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "3759" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "3760" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "3761" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "3762" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "3763" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "3764" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "3765" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "3766" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "3767" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "3768" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "3769" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "3770" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "3771" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "3772" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "3773" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "3774" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "3775" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "3776" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "3777" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "3778" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "3779" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "3780" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "3781" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "3782" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "3783" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "3784" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "3785" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "3786" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "3787" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "3788" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "3789" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "3790" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "3791" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "3792" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "3793" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "3794" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "3795" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "3796" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "3797" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "3798" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "3799" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "3800" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "3801" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "3802" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "3803" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "3804" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "3805" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction7" DstPort 2 } Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction10" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction11" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction12" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction13" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction14" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction15" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction16" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction17" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction18" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction19" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction20" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction21" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction22" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction23" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 80] Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } Branch { Points [0, 150] Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } Branch { Points [0, 155] Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } Branch { Points [0, 175] Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } Branch { Points [0, 180; 5, 0] Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } Branch { Points [-5, 0; 0, 175] Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } Branch { Points [0, 185] Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } Branch { Points [0, 190] Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } Branch { Points [0, 195] Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } Branch { Points [0, 215] Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } Branch { Points [0, 230] Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } Branch { Points [0, 240] Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } Branch { Points [0, 260] Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } Branch { Points [0, 265] Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } Branch { Points [0, 275] Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } Branch { Points [0, 280] Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } Branch { Points [0, 285] Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } Branch { Points [0, 300] Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } Branch { Points [0, 305] Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } Branch { Points [0, 310] Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } Branch { Points [0, 315] Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } Branch { Points [0, 320] Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } } } } } } } } } } } } } } } } } } } } } } } Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [5, 0] Branch { DstBlock "Math\nFunction2" DstPort 2 } Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } } Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } } } } Block { BlockType Sum Name "Sum" SID "3806" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "3807" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "3808" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "3809" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "3810" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { DstBlock "Display3" DstPort 1 } Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } Branch { DstBlock "Data Type Conversion1" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { DstBlock "Exponent" DstPort 1 } Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { DstBlock "Sign" DstPort 1 } Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } } } Block { BlockType Outport Name "d_acq_carrier_doppler_Hz" SID "3811" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "d_acq_carrier_doppler_Hz" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem7" SID "3812" Ports [4, 1] Position [525, 2000, 630, 2160] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem7" Location [528, 347, 1038, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "3813" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "3814" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "3815" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "3816" Position [25, 43, 55, 57] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "3817" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "3818" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "3819" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "3820" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "3821" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "3822" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "3823" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "3824" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "3825" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "3826" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "3827" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "3828" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "3829" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "3830" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "3831" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "3832" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "3833" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "3834" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "3835" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "3836" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "3837" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "3838" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "3839" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "3840" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "3841" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "3842" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "3843" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "3844" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "3845" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "3846" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "3847" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "3848" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "3849" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "3850" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "3851" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "3852" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "3853" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "3854" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "3855" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "3856" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "3857" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "3858" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "3859" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "3860" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "3861" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "3862" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "3863" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "3864" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "3865" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "3866" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "3867" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "3868" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "3869" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "3870" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "3871" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "3872" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "3873" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "3874" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "3875" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "3876" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "3877" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "3878" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "3879" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "3880" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "3881" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "3882" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "3883" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "3884" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "3885" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "3886" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "3887" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "3888" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "3889" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "3890" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "3891" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "3892" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "3893" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "3894" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "3895" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "3896" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "3897" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "3898" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "3899" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "3900" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "3901" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "3902" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "3903" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "3904" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "3905" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "3906" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "3907" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "3908" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "3909" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "3910" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "3911" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "3912" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "3913" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "3914" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "3915" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "3916" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "3917" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "3918" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "3919" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "3920" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "3921" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "3922" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "3923" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "3924" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "3925" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "3926" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "3927" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "3928" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "3929" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "3930" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "3931" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "3932" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "3933" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "3934" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "3935" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "3936" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "3937" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "3938" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "3939" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "3940" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "3941" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "3942" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "3943" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "3944" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "3945" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "3946" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "3947" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "3948" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "3949" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "3950" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "3951" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "3952" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "3953" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "3954" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "3955" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "3956" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "3957" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "3958" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "3959" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "3960" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "3961" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "3962" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "3963" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "3964" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "3965" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "3966" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "3967" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "3968" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "3969" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "3970" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "3971" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "3972" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "3973" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "3974" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "3975" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "3976" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "3977" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "3978" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "3979" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "3980" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "3981" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "3982" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "3983" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "3984" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "3985" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "3986" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "3987" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "3988" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "3989" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "3990" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "3991" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "3992" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "3993" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "3994" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "3995" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "3996" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "3997" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "3998" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "3999" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "4000" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "4001" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "4002" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "4003" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "4004" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "4005" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "4006" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "4007" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "4008" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "4009" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "4010" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "4011" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "4012" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "4013" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "4014" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "4015" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "4016" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "4017" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "4018" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "4019" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "4020" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "4021" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "4022" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "4023" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "4024" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "4025" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "4026" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "4027" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "4028" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "4029" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "4030" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "4031" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } Branch { Points [5, 0] Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } Branch { DstBlock "Math\nFunction2" DstPort 2 } } } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } Branch { Points [0, 80] Branch { Points [0, 150] Branch { Points [0, 155] Branch { Points [0, 175] Branch { Points [0, 180; 5, 0] Branch { Points [-5, 0; 0, 175] Branch { Points [0, 185] Branch { Points [0, 190] Branch { Points [0, 195] Branch { Points [0, 215] Branch { Points [0, 230] Branch { Points [0, 240] Branch { Points [0, 260] Branch { Points [0, 265] Branch { Points [0, 275] Branch { Points [0, 280] Branch { Points [0, 285] Branch { Points [0, 300] Branch { Points [0, 305] Branch { Points [0, 310] Branch { Points [0, 315] Branch { Points [0, 320] Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } } } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } Branch { DstBlock "Math\nFunction23" DstPort 2 } } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } Branch { DstBlock "Math\nFunction22" DstPort 2 } } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } Branch { DstBlock "Math\nFunction21" DstPort 2 } } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } Branch { DstBlock "Math\nFunction20" DstPort 2 } } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } Branch { DstBlock "Math\nFunction19" DstPort 2 } } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } Branch { DstBlock "Math\nFunction18" DstPort 2 } } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } Branch { DstBlock "Math\nFunction17" DstPort 2 } } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } Branch { DstBlock "Math\nFunction16" DstPort 2 } } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } Branch { DstBlock "Math\nFunction15" DstPort 2 } } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } Branch { DstBlock "Math\nFunction14" DstPort 2 } } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } Branch { DstBlock "Math\nFunction13" DstPort 2 } } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } Branch { DstBlock "Math\nFunction12" DstPort 2 } } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } Branch { DstBlock "Math\nFunction11" DstPort 2 } } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } Branch { DstBlock "Math\nFunction10" DstPort 2 } } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } Branch { DstBlock "Math\nFunction7" DstPort 2 } } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } } } Block { BlockType Sum Name "Sum" SID "4032" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "4033" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "4034" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "4035" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "4036" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } Branch { DstBlock "Sign" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } Branch { DstBlock "Exponent" DstPort 1 } } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { DstBlock "Data Type Conversion1" DstPort 1 } Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } Branch { DstBlock "Display3" DstPort 1 } } } } Block { BlockType Outport Name "enable_tracking" SID "4037" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "enable_tracking" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem8" SID "4038" Ports [4, 1] Position [525, 56, 630, 214] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem8" Location [528, 347, 1021, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "4039" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "4040" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "4041" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "4042" Position [25, 43, 55, 57] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "4043" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "4044" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "4045" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "4046" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "4047" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "4048" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "4049" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "4050" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "4051" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "4052" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "4053" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "4054" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "4055" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "4056" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "4057" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "4058" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "4059" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "4060" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "4061" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "4062" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "4063" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "4064" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "4065" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "4066" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "4067" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "4068" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "4069" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "4070" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "4071" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "4072" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "4073" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "4074" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "4075" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "4076" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "4077" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "4078" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "4079" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "4080" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "4081" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "4082" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "4083" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "4084" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "4085" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "4086" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "4087" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "4088" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "4089" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "4090" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "4091" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "4092" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "4093" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "4094" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "4095" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "4096" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "4097" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "4098" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "4099" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "4100" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "4101" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "4102" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "4103" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "4104" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "4105" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "4106" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "4107" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "4108" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "4109" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "4110" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "4111" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "4112" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "4113" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "4114" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "4115" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "4116" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "4117" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "4118" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "4119" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "4120" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "4121" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "4122" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "4123" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "4124" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "4125" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "4126" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "4127" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "4128" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "4129" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "4130" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "4131" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "4132" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "4133" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "4134" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "4135" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "4136" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "4137" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "4138" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "4139" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "4140" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "4141" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "4142" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "4143" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "4144" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "4145" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "4146" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "4147" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "4148" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "4149" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "4150" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "4151" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "4152" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "4153" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "4154" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "4155" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "4156" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "4157" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "4158" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "4159" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "4160" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "4161" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "4162" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "4163" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "4164" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "4165" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "4166" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "4167" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "4168" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "4169" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "4170" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "4171" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "4172" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "4173" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "4174" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "4175" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "4176" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "4177" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "4178" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "4179" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "4180" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "4181" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "4182" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "4183" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "4184" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "4185" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "4186" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "4187" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "4188" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "4189" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "4190" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "4191" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "4192" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "4193" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "4194" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "4195" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "4196" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "4197" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "4198" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "4199" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "4200" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "4201" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "4202" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "4203" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "4204" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "4205" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "4206" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "4207" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "4208" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "4209" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "4210" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "4211" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "4212" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "4213" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "4214" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "4215" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "4216" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "4217" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "4218" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "4219" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "4220" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "4221" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "4222" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "4223" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "4224" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "4225" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "4226" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "4227" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "4228" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "4229" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "4230" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "4231" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "4232" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "4233" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "4234" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "4235" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "4236" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "4237" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "4238" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "4239" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "4240" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "4241" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "4242" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "4243" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "4244" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "4245" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "4246" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "4247" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "4248" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "4249" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "4250" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "4251" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "4252" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "4253" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "4254" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "4255" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "4256" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "4257" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } Branch { Points [5, 0] Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } Branch { DstBlock "Math\nFunction2" DstPort 2 } } } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } Branch { Points [0, 80] Branch { Points [0, 150] Branch { Points [0, 155] Branch { Points [0, 175] Branch { Points [0, 180; 5, 0] Branch { Points [-5, 0; 0, 175] Branch { Points [0, 185] Branch { Points [0, 190] Branch { Points [0, 195] Branch { Points [0, 215] Branch { Points [0, 230] Branch { Points [0, 240] Branch { Points [0, 260] Branch { Points [0, 265] Branch { Points [0, 275] Branch { Points [0, 280] Branch { Points [0, 285] Branch { Points [0, 300] Branch { Points [0, 305] Branch { Points [0, 310] Branch { Points [0, 315] Branch { Points [0, 320] Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } } } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } Branch { DstBlock "Math\nFunction23" DstPort 2 } } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } Branch { DstBlock "Math\nFunction22" DstPort 2 } } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } Branch { DstBlock "Math\nFunction21" DstPort 2 } } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } Branch { DstBlock "Math\nFunction20" DstPort 2 } } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } Branch { DstBlock "Math\nFunction19" DstPort 2 } } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } Branch { DstBlock "Math\nFunction18" DstPort 2 } } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } Branch { DstBlock "Math\nFunction17" DstPort 2 } } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } Branch { DstBlock "Math\nFunction16" DstPort 2 } } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } Branch { DstBlock "Math\nFunction15" DstPort 2 } } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } Branch { DstBlock "Math\nFunction14" DstPort 2 } } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } Branch { DstBlock "Math\nFunction13" DstPort 2 } } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } Branch { DstBlock "Math\nFunction12" DstPort 2 } } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } Branch { DstBlock "Math\nFunction11" DstPort 2 } } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } Branch { DstBlock "Math\nFunction10" DstPort 2 } } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } Branch { DstBlock "Math\nFunction7" DstPort 2 } } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } } } Block { BlockType Sum Name "Sum" SID "4258" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "4259" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "4260" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "4261" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "4262" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } Branch { DstBlock "Sign" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } Branch { DstBlock "Exponent" DstPort 1 } } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { DstBlock "Data Type Conversion1" DstPort 1 } Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } Branch { DstBlock "Display3" DstPort 1 } } } } Block { BlockType Outport Name "control_id" SID "4263" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "control_id" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem9" SID "4264" Ports [4, 1] Position [525, 211, 630, 379] ShowName off AncestorBlock "gnss_sdr_galileo_e1_tcp_connector_tracking_lib/gnss_sdr/gnss_sdr_galileo_e1_tcp_connector_" "tracking_rx/Subsystem" LibraryVersion "*1.82" MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem9" Location [528, 347, 1021, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" SIDHighWatermark "234" Block { BlockType Inport Name "In1" SID "4264:10" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "4264:11" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "4264:12" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "4264:13" Position [25, 43, 55, 57] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "4264:14" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "4264:15" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "4264:16" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "4264:17" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "4264:18" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "4264:19" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "4264:20" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "4264:21" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "4264:22" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "4264:23" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "4264:24" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "4264:25" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "4264:26" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "4264:27" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "4264:28" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "4264:29" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "4264:30" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "4264:31" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "4264:32" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "4264:33" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "4264:34" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "4264:35" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "4264:36" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "4264:37" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "4264:38" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "4264:39" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "4264:40" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "4264:41" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "4264:42" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "4264:43" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "4264:44" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "4264:45" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "4264:46" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "4264:47" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "4264:48" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "4264:49" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "4264:50" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "4264:51" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "4264:52" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "4264:53" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "4264:54" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "4264:55" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "4264:56" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "4264:57" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "4264:58" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "4264:59" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "4264:60" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "4264:61" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "4264:62" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "4264:63" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "4264:64" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "4264:65" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "4264:66" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "4264:67" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "4264:68" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "4264:69" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "4264:70" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "4264:71" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "4264:72" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "4264:73" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "4264:74" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "4264:75" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "4264:76" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "4264:77" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "4264:78" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "4264:79" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "4264:80" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "4264:81" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "4264:82" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "4264:83" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "4264:84" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "4264:85" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "4264:86" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "4264:87" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "4264:88" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "4264:89" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "4264:90" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "4264:91" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "4264:92" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "4264:93" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "4264:94" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "4264:95" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "4264:96" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "4264:97" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "4264:98" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "4264:99" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "4264:100" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.308" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "4264:101" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "4264:102" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "4264:103" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "4264:104" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "4264:105" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "4264:106" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "4264:107" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "4264:108" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "4264:109" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "4264:110" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "4264:111" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "4264:112" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "4264:113" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "4264:114" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "4264:115" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "4264:116" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "4264:117" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "4264:118" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "4264:119" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "4264:120" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "4264:121" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "4264:122" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "4264:123" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "4264:124" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "4264:125" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "4264:126" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "4264:127" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "4264:128" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "4264:129" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "4264:130" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "4264:131" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "4264:132" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "4264:133" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "4264:134" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "4264:135" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "4264:136" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "4264:137" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "4264:138" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "4264:139" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "4264:140" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "4264:141" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "4264:142" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "4264:143" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "4264:144" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "4264:145" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "4264:146" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "4264:147" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "4264:148" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "4264:149" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "4264:150" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "4264:151" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "4264:152" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "4264:153" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "4264:154" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "4264:155" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "4264:156" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "4264:157" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "4264:158" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "4264:159" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "4264:160" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "4264:161" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "4264:162" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "4264:163" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "4264:164" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "4264:165" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "4264:166" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "4264:167" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "4264:168" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "4264:169" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "4264:170" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "4264:171" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "4264:172" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "4264:173" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "4264:174" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "4264:175" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "4264:176" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "4264:177" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "4264:178" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "4264:179" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "4264:180" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "4264:181" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "4264:182" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "4264:183" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "4264:184" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "4264:185" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "4264:186" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "4264:187" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "4264:188" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "4264:189" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "4264:190" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "4264:191" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "4264:192" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "4264:193" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "4264:194" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "4264:195" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "4264:196" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "4264:197" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "4264:198" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "4264:199" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "4264:200" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "4264:201" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "4264:202" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "4264:203" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "4264:204" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "4264:205" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "4264:206" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "4264:207" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "4264:208" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "4264:209" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "4264:210" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "4264:211" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "4264:212" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "4264:213" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "4264:214" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "4264:215" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "4264:216" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "4264:217" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "4264:218" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "4264:219" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "4264:220" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "4264:221" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "4264:222" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "4264:223" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "4264:224" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "4264:225" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "4264:226" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "4264:227" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "4264:228" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } Branch { Points [5, 0] Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } Branch { DstBlock "Math\nFunction2" DstPort 2 } } } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } Branch { Points [0, 80] Branch { Points [0, 150] Branch { Points [0, 155] Branch { Points [0, 175] Branch { Points [0, 180; 5, 0] Branch { Points [-5, 0; 0, 175] Branch { Points [0, 185] Branch { Points [0, 190] Branch { Points [0, 195] Branch { Points [0, 215] Branch { Points [0, 230] Branch { Points [0, 240] Branch { Points [0, 260] Branch { Points [0, 265] Branch { Points [0, 275] Branch { Points [0, 280] Branch { Points [0, 285] Branch { Points [0, 300] Branch { Points [0, 305] Branch { Points [0, 310] Branch { Points [0, 315] Branch { Points [0, 320] Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } } } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } Branch { DstBlock "Math\nFunction23" DstPort 2 } } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } Branch { DstBlock "Math\nFunction22" DstPort 2 } } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } Branch { DstBlock "Math\nFunction21" DstPort 2 } } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } Branch { DstBlock "Math\nFunction20" DstPort 2 } } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } Branch { DstBlock "Math\nFunction19" DstPort 2 } } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } Branch { DstBlock "Math\nFunction18" DstPort 2 } } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } Branch { DstBlock "Math\nFunction17" DstPort 2 } } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } Branch { DstBlock "Math\nFunction16" DstPort 2 } } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } Branch { DstBlock "Math\nFunction15" DstPort 2 } } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } Branch { DstBlock "Math\nFunction14" DstPort 2 } } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } Branch { DstBlock "Math\nFunction13" DstPort 2 } } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } Branch { DstBlock "Math\nFunction12" DstPort 2 } } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } Branch { DstBlock "Math\nFunction11" DstPort 2 } } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } Branch { DstBlock "Math\nFunction10" DstPort 2 } } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } Branch { DstBlock "Math\nFunction7" DstPort 2 } } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } } } Block { BlockType Sum Name "Sum" SID "4264:229" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "4264:230" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "4264:231" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "4264:232" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "4264:233" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } Branch { DstBlock "Sign" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } Branch { DstBlock "Exponent" DstPort 1 } } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { DstBlock "Data Type Conversion1" DstPort 1 } Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } Branch { DstBlock "Display3" DstPort 1 } } } } Block { BlockType Outport Name "d_vE_I" SID "4264:234" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "d_vE_I" DstPort 1 } } } Block { BlockType Outport Name "control_id" SID "4265" Position [685, 128, 715, 142] IconDisplay "Port number" } Block { BlockType Outport Name "d_vE_I" SID "4266" Position [690, 288, 720, 302] Port "2" IconDisplay "Port number" } Block { BlockType Outport Name "d_vE_Q" SID "4267" Position [690, 448, 720, 462] Port "3" IconDisplay "Port number" } Block { BlockType Outport Name "d_E_I" SID "4268" Position [690, 613, 720, 627] Port "4" IconDisplay "Port number" } Block { BlockType Outport Name "d_E_Q" SID "4269" Position [690, 778, 720, 792] Port "5" IconDisplay "Port number" } Block { BlockType Outport Name "d_L_I" SID "4270" Position [690, 943, 720, 957] Port "6" IconDisplay "Port number" } Block { BlockType Outport Name "d_L_Q" SID "4271" Position [690, 1103, 720, 1117] Port "7" IconDisplay "Port number" } Block { BlockType Outport Name "d_vL_I" SID "4272" Position [690, 1268, 720, 1282] Port "8" IconDisplay "Port number" } Block { BlockType Outport Name "d_vL_Q" SID "4273" Position [690, 1428, 720, 1442] Port "9" IconDisplay "Port number" } Block { BlockType Outport Name "d_P_I" SID "4274" Position [690, 1593, 720, 1607] Port "10" IconDisplay "Port number" } Block { BlockType Outport Name "d_P_Q" SID "4275" Position [690, 1753, 720, 1767] Port "11" IconDisplay "Port number" } Block { BlockType Outport Name "d_acq_carrier_doppler_Hz" SID "4276" Position [690, 1913, 720, 1927] Port "12" IconDisplay "Port number" } Block { BlockType Outport Name "enable_tracking" SID "4277" Position [690, 2073, 720, 2087] Port "13" IconDisplay "Port number" } Line { SrcBlock "Multiport\nSelector" SrcPort 52 Points [150, 0] DstBlock "Subsystem7" DstPort 4 } Line { SrcBlock "Multiport\nSelector" SrcPort 51 Points [150, 0] DstBlock "Subsystem7" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 50 Points [150, 0] DstBlock "Subsystem7" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 49 Points [150, 0] DstBlock "Subsystem7" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 48 Points [150, 0] DstBlock "Subsystem6" DstPort 4 } Line { SrcBlock "Multiport\nSelector" SrcPort 47 Points [150, 0] DstBlock "Subsystem6" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 46 Points [150, 0] DstBlock "Subsystem6" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 45 Points [150, 0] DstBlock "Subsystem6" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 44 Points [150, 0] DstBlock "Subsystem5" DstPort 4 } Line { SrcBlock "Multiport\nSelector" SrcPort 43 Points [150, 0] DstBlock "Subsystem5" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 42 Points [150, 0] DstBlock "Subsystem5" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 41 Points [150, 0] DstBlock "Subsystem5" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 40 Points [150, 0] DstBlock "Subsystem4" DstPort 4 } Line { SrcBlock "Multiport\nSelector" SrcPort 39 Points [150, 0] DstBlock "Subsystem4" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 38 Points [150, 0] DstBlock "Subsystem4" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 37 Points [150, 0] DstBlock "Subsystem4" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 36 Points [150, 0] DstBlock "Subsystem12" DstPort 4 } Line { SrcBlock "Multiport\nSelector" SrcPort 35 Points [150, 0] DstBlock "Subsystem12" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 34 Points [150, 0] DstBlock "Subsystem12" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 33 Points [150, 0] DstBlock "Subsystem12" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 32 Points [150, 0] DstBlock "Subsystem11" DstPort 4 } Line { SrcBlock "Multiport\nSelector" SrcPort 31 Points [150, 0] DstBlock "Subsystem11" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 30 Points [150, 0] DstBlock "Subsystem11" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 29 Points [150, 0] DstBlock "Subsystem11" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 28 DstBlock "Subsystem3" DstPort 4 } Line { SrcBlock "Multiport\nSelector" SrcPort 27 DstBlock "Subsystem3" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 26 DstBlock "Subsystem3" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 25 DstBlock "Subsystem3" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 24 DstBlock "Subsystem2" DstPort 4 } Line { SrcBlock "Multiport\nSelector" SrcPort 23 DstBlock "Subsystem2" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 22 DstBlock "Subsystem2" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 21 DstBlock "Subsystem2" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 20 Points [150, 0] DstBlock "Subsystem1" DstPort 4 } Line { SrcBlock "Multiport\nSelector" SrcPort 19 Points [150, 0] DstBlock "Subsystem1" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 18 Points [150, 0] DstBlock "Subsystem1" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 17 Points [150, 0] DstBlock "Subsystem1" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 16 Points [150, 0] DstBlock "Subsystem" DstPort 4 } Line { SrcBlock "Multiport\nSelector" SrcPort 15 Points [150, 0] DstBlock "Subsystem" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 14 Points [150, 0] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 13 Points [0, -10] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 12 Points [0, -15] DstBlock "Subsystem10" DstPort 4 } Line { SrcBlock "Multiport\nSelector" SrcPort 11 Points [150, 0] DstBlock "Subsystem10" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 10 Points [0, -15] DstBlock "Subsystem10" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 9 Points [0, -15] DstBlock "Subsystem10" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 8 Points [0, -15] DstBlock "Subsystem9" DstPort 4 } Line { SrcBlock "Multiport\nSelector" SrcPort 7 Points [0, -15] DstBlock "Subsystem9" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 6 Points [0, -15] DstBlock "Subsystem9" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 5 Points [0, -15] DstBlock "Subsystem9" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 4 Points [0, -15] DstBlock "Subsystem8" DstPort 4 } Line { SrcBlock "Multiport\nSelector" SrcPort 3 Points [0, -15] DstBlock "Subsystem8" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 2 Points [0, -15] DstBlock "Subsystem8" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 1 Points [0, -15] DstBlock "Subsystem8" DstPort 1 } Line { SrcBlock "Subsystem11" SrcPort 1 DstBlock "d_vL_I" DstPort 1 } Line { SrcBlock "Subsystem12" SrcPort 1 DstBlock "d_vL_Q" DstPort 1 } Line { SrcBlock "Subsystem9" SrcPort 1 DstBlock "d_vE_I" DstPort 1 } Line { SrcBlock "Subsystem10" SrcPort 1 DstBlock "d_vE_Q" DstPort 1 } Line { SrcBlock "Subsystem7" SrcPort 1 DstBlock "enable_tracking" DstPort 1 } Line { SrcBlock "Subsystem6" SrcPort 1 DstBlock "d_acq_carrier_doppler_Hz" DstPort 1 } Line { SrcBlock "Subsystem5" SrcPort 1 DstBlock "d_P_Q" DstPort 1 } Line { SrcBlock "Subsystem8" SrcPort 1 DstBlock "control_id" DstPort 1 } Line { SrcBlock "Subsystem" SrcPort 1 DstBlock "d_E_I" DstPort 1 } Line { SrcBlock "Subsystem1" SrcPort 1 DstBlock "d_E_Q" DstPort 1 } Line { SrcBlock "Subsystem2" SrcPort 1 DstBlock "d_L_I" DstPort 1 } Line { SrcBlock "Subsystem3" SrcPort 1 DstBlock "d_L_Q" DstPort 1 } Line { SrcBlock "Subsystem4" SrcPort 1 DstBlock "d_P_I" DstPort 1 } Line { SrcBlock "RX" SrcPort 1 Points [0, 5] DstBlock "Multiport\nSelector" DstPort 1 } Annotation { Position [285, 79] } } } Block { BlockType SubSystem Name "gnss_sdr_galileo_e1_tcp_connector_tracking_tx" SID "2090" Ports [4] Position [495, 20, 710, 315] ShowPortLabels "SignalName" MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "gnss_sdr_galileo_e1_tcp_connector_tracking_tx" Location [1137, 408, 1445, 698] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "control_id" SID "2091" Position [30, 38, 60, 52] IconDisplay "Port number" } Block { BlockType Inport Name "code_nco" SID "2092" Position [30, 98, 60, 112] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "carr_nco" SID "2093" Position [30, 158, 60, 172] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "carrier_doppler_Hz" SID "2094" Position [30, 218, 60, 232] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "TX" SID "2096" Ports [1] Position [140, 77, 275, 193] LibraryVersion "1.84" DialogController "instrumentcreatedialog" DialogControllerArgs "DataTag5" SourceBlock "instrumentlib/TCP//IP Send" SourceType "TCP/IP Send" Host "84.88.61.86" Port "2070" EnableBlockingMode on Timeout "5" ByteOrder "LittleEndian" } Block { BlockType Concatenate Name "Vector\nConcatenate1" SID "2097" Ports [4, 1] Position [95, 12, 100, 258] BackgroundColor "black" ShowName off NumInputs "4" Mode "Vector" } Line { SrcBlock "carrier_doppler_Hz" SrcPort 1 DstBlock "Vector\nConcatenate1" DstPort 4 } Line { SrcBlock "Vector\nConcatenate1" SrcPort 1 DstBlock "TX" DstPort 1 } Line { SrcBlock "control_id" SrcPort 1 DstBlock "Vector\nConcatenate1" DstPort 1 } Line { SrcBlock "code_nco" SrcPort 1 DstBlock "Vector\nConcatenate1" DstPort 2 } Line { SrcBlock "carr_nco" SrcPort 1 DstBlock "Vector\nConcatenate1" DstPort 3 } } } } } } } MatData { NumRecords 6 DataRecord { Tag DataTag5 Data " %)30 . : 8 ( 0 % \" $ ! 0 . . 8 ( ! " " % \" $ ' 0 0 !P '1C<&EP. % * % * ---------------------------------------------------------------------- % */ function gnss_sdr_galileo_e1_tcp_connector_tracking_start(num_channels) %User parameters host = '84.88.61.86'; %Remote IP address (GNSS-SDR computer IP) port = 2070; %Remote port (GNSS-SDR computer port for Ch0) num_vars_rx = 13; %Number of variables expected from GNSS-SDR num_vars_tx = 4; %Number of variable to be transmitted to GNSS-SDR timeout = '10'; %Timeout [s] %name of the tracking block, it must match the name of the Simulink %model tracking_block_name = 'gnss_sdr_galileo_e1_tcp_connector_tracking'; % Layout coordinates for the first gnss_sdr_galileo_e1_tcp_connector_tracking % block and offset definitions X0 = 20; X1 = 170; Y0 = 20; Y1 = 140; X_offset = 200; Y_offset = 160; %Calculate the size of the data received from GNSS-SDR %(float = 4 bytes each variable) datasize_RX = num_vars_rx*4; %Create a Simulink model simulink('open'); new_system('gnss_sdr_galileo_e1_tcp_connector_tracking_aux'); open_system('gnss_sdr_galileo_e1_tcp_connector_tracking_aux'); %Set parameters to avoid warnings in the Command Window set_param('gnss_sdr_galileo_e1_tcp_connector_tracking_aux',... 'InheritedTsInSrcMsg', 'none'); warning('off', 'Simulink:Commands:SetParamLinkChangeWarn'); %Assign values to the variables used by Simulink in the base workspace %DLL assignin('base', 'B_DLL', 2); assignin('base', 'zeta_DLL', 0.7); assignin('base', 'k_DLL', 1); assignin('base', 'd_pdi_code', 0.004); %PLL assignin('base', 'B_PLL', 30); assignin('base', 'zeta_PLL', 0.65); assignin('base', 'k_PLL', 0.25); assignin('base', 'd_pdi_carr', 0.004); %Block generation from the Simulink Library for i = 0:num_channels-1; %Add and prepare an empty block to become the TCP connector block tcp_connector_block=['gnss_sdr_galileo_e1_tcp_connector_tracking_aux/gnss_sdr_galileo_e1_tcp_connector_tracking_', num2str(i)]; add_block('simulink/Ports & Subsystems/Subsystem', tcp_connector_block); delete_line(tcp_connector_block,'In1/1', 'Out1/1') tcp_connector_tracking_i_In1 = ['gnss_sdr_galileo_e1_tcp_connector_tracking_aux/gnss_sdr_galileo_e1_tcp_connector_tracking_',num2str(i),'/In1']; tcp_connector_tracking_i_Out1 = ['gnss_sdr_galileo_e1_tcp_connector_tracking_aux/gnss_sdr_galileo_e1_tcp_connector_tracking_',num2str(i),'/Out1']; delete_block(tcp_connector_tracking_i_In1); delete_block(tcp_connector_tracking_i_Out1); %Add to the TCP connector block the receiver, the tracking and the %transmitter blocks tcp_connector_tracking_rx_block = ['gnss_sdr_galileo_e1_tcp_connector_tracking_aux/gnss_sdr_galileo_e1_tcp_connector_tracking_',num2str(i),'/gnss_sdr_galileo_e1_tcp_connector_tracking_rx']; tcp_connector_tracking_block = ['gnss_sdr_galileo_e1_tcp_connector_tracking_aux/gnss_sdr_galileo_e1_tcp_connector_tracking_',num2str(i),'/',tracking_block_name]; tcp_connector_tracking_tx_block = ['gnss_sdr_galileo_e1_tcp_connector_tracking_aux/gnss_sdr_galileo_e1_tcp_connector_tracking_',num2str(i),'/gnss_sdr_galileo_e1_tcp_connector_tracking_tx']; add_block('simulink/User-Defined Functions/gnss_sdr/gnss_sdr_galileo_e1_tcp_connector_tracking_rx',tcp_connector_tracking_rx_block); path_to_tracking_block = ['simulink/User-Defined Functions/gnss_sdr/', tracking_block_name]; add_block(path_to_tracking_block, tcp_connector_tracking_block); add_block('simulink/User-Defined Functions/gnss_sdr/gnss_sdr_galileo_e1_tcp_connector_tracking_tx',tcp_connector_tracking_tx_block); %Connect the receiver block to the tracking block for j=1:num_vars_rx; rx_out_ports =['gnss_sdr_galileo_e1_tcp_connector_tracking_rx/',num2str(j)]; tracking_in_ports =[tracking_block_name,'/',num2str(j)]; add_line(tcp_connector_block, rx_out_ports, tracking_in_ports) end %Connect the tracking block to the transmitter block for k=1:num_vars_tx; tracking_out_ports =[tracking_block_name,'/',num2str(k)]; tx_in_ports =['gnss_sdr_galileo_e1_tcp_connector_tracking_tx/',num2str(k)]; add_line(tcp_connector_block, tracking_out_ports, tx_in_ports) end %Add, place and connect two scopes in the TCP connector block name_scope_1 = [tcp_connector_block,'/Scope']; add_block('simulink/Sinks/Scope', name_scope_1, 'Position', [600 425 650 475]); set_param(name_scope_1, 'NumInputPorts', '5', 'LimitDataPoints', 'off'); add_line(tcp_connector_block, 'gnss_sdr_galileo_e1_tcp_connector_tracking_rx/10', 'Scope/1', 'autorouting','on') add_line(tcp_connector_block, 'gnss_sdr_galileo_e1_tcp_connector_tracking_rx/11', 'Scope/2', 'autorouting','on') tracking_scope_port3 = [tracking_block_name,'/2']; add_line(tcp_connector_block, tracking_scope_port3, 'Scope/3', 'autorouting','on') tracking_scope_port4 = [tracking_block_name,'/3']; add_line(tcp_connector_block, tracking_scope_port4, 'Scope/4', 'autorouting','on') tracking_scope_port5 = [tracking_block_name,'/4']; add_line(tcp_connector_block, tracking_scope_port5, 'Scope/5', 'autorouting','on') name_scope_2 = [tcp_connector_block,'/EPL']; add_block('simulink/Sinks/Scope', name_scope_2, 'Position', [475 500 525 550]); set_param(name_scope_2, 'LimitDataPoints', 'off'); tracking_scope2_port5 = [tracking_block_name,'/5']; add_line(tcp_connector_block, tracking_scope2_port5, 'EPL/1', 'autorouting','on') %Set the TCP receiver parameters tcp_receiver = ['gnss_sdr_galileo_e1_tcp_connector_tracking_aux/gnss_sdr_galileo_e1_tcp_connector_tracking_',num2str(i),'/gnss_sdr_galileo_e1_tcp_connector_tracking_rx/RX']; set_param(tcp_receiver, 'Port', num2str(port+i), 'Host', host, 'DataSize', num2str(datasize_RX), 'Timeout', timeout); %Set the TCP transmitter parameters tcp_transmitter = ['gnss_sdr_galileo_e1_tcp_connector_tracking_aux/gnss_sdr_galileo_e1_tcp_connector_tracking_',num2str(i),'/gnss_sdr_galileo_e1_tcp_connector_tracking_tx/TX']; set_param(tcp_transmitter, 'Port', num2str(port+i), 'Host', host,'Timeout', timeout); %New layout coordinates for each block X2 = X0 + floor(i/4)*X_offset; X3 = X1 + floor(i/4)*X_offset; Y2 = Y0 + (i-4*floor(i/4))*Y_offset; Y3 = Y1 + (i-4*floor(i/4))*Y_offset; %Place the block in the layout set_param(tcp_connector_block, 'Position', [X2 Y2 X3 Y3]); end %Set parameters to configure the model Solver set_param('gnss_sdr_galileo_e1_tcp_connector_tracking_aux',... 'SolverType', 'Fixed-step', 'Solver', 'FixedStepDiscrete',... 'FixedStep', 'auto', 'StopTime', 'inf'); %Save the model with a definitive name save_system('gnss_sdr_galileo_e1_tcp_connector_tracking_aux', 'gnss_sdr_galileo_e1_tcp_connector_tracking_ready'); simulink('close'); %Run the Simulink model set_param('gnss_sdr_galileo_e1_tcp_connector_tracking_ready','simulationcommand','start'); end gnss-sdr-0.0.9/src/utils/simulink/Single Thread/gnss_sdr_tcp_connector_tracking_lib.mdl000066400000000000000000045202061305042567700314450ustar00rootroot00000000000000Library { Name "gnss_sdr_tcp_connector_tracking_lib" Version 7.6 MdlSubVersion 0 SavedCharacterEncoding "windows-1252" LibraryType "BlockLibrary" SaveDefaultBlockParams on ScopeRefreshTime 0.035000 OverrideScopeRefreshTime on DisableAllScopes off MaxMDLFileLineLength 120 Created "Thu Mar 08 11:41:48 2012" Creator "David Pubill" UpdateHistory "UpdateHistoryNever" ModifiedByFormat "%" LastModifiedBy "gnss" ModifiedDateFormat "%" LastModifiedDate "Wed Jun 27 13:07:39 2012" RTWModifiedTimeStamp 262702783 ModelVersionFormat "1.%" ConfigurationManager "None" SampleTimeColors off SampleTimeAnnotations off LibraryLinkDisplay "none" WideLines off ShowLineDimensions off ShowPortDataTypes off ShowLoopsOnError on IgnoreBidirectionalLines off ShowStorageClass off ShowTestPointIcons on ShowSignalResolutionIcons on ShowViewerIcons on SortedOrder off ExecutionContextIcon off ShowLinearizationAnnotations on BlockNameDataTip off BlockParametersDataTip off BlockDescriptionStringDataTip off ToolBar on StatusBar on BrowserShowLibraryLinks off BrowserLookUnderMasks off SimulationMode "normal" LinearizationMsg "none" Profile off ParamWorkspaceSource "MATLABWorkspace" RecordCoverage off CovSaveName "covdata" CovMetricSettings "dw" CovNameIncrementing off CovHtmlReporting on CovForceBlockReductionOff on covSaveCumulativeToWorkspaceVar on CovSaveSingleToWorkspaceVar on CovCumulativeReport off CovReportOnPause on CovModelRefEnable "Off" CovExternalEMLEnable off ExtModeBatchMode off ExtModeEnableFloating on ExtModeTrigType "manual" ExtModeTrigMode "normal" ExtModeTrigPort "1" ExtModeTrigElement "any" ExtModeTrigDuration 1000 ExtModeTrigDurationFloating "auto" ExtModeTrigHoldOff 0 ExtModeTrigDelay 0 ExtModeTrigDirection "rising" ExtModeTrigLevel 0 ExtModeArchiveMode "off" ExtModeAutoIncOneShot off ExtModeIncDirWhenArm off ExtModeAddSuffixToVar off ExtModeWriteAllDataToWs off ExtModeArmWhenConnect on ExtModeSkipDownloadWhenConnect off ExtModeLogAll on ExtModeAutoUpdateStatusClock on ShowModelReferenceBlockVersion off ShowModelReferenceBlockIO off Array { Type "Handle" Dimension 1 Simulink.ConfigSet { $ObjectID 1 Version "1.10.0" Array { Type "Handle" Dimension 9 Simulink.SolverCC { $ObjectID 2 Version "1.10.0" StartTime "0.0" StopTime "10.0" AbsTol "auto" FixedStep "auto" InitialStep "auto" MaxNumMinSteps "-1" MaxOrder 5 ZcThreshold "auto" ConsecutiveZCsStepRelTol "10*128*eps" MaxConsecutiveZCs "1000" ExtrapolationOrder 4 NumberNewtonIterations 1 MaxStep "auto" MinStep "auto" MaxConsecutiveMinStep "1" RelTol "1e-3" SolverMode "Auto" ConcurrentTasks off Solver "VariableStepDiscrete" SolverName "VariableStepDiscrete" SolverJacobianMethodControl "auto" ShapePreserveControl "DisableAll" ZeroCrossControl "UseLocalSettings" ZeroCrossAlgorithm "Nonadaptive" AlgebraicLoopSolver "TrustRegion" SolverResetMethod "Fast" PositivePriorityOrder off AutoInsertRateTranBlk off SampleTimeConstraint "Unconstrained" InsertRTBMode "Whenever possible" } Simulink.DataIOCC { $ObjectID 3 Version "1.10.0" Decimation "1" ExternalInput "[t, u]" FinalStateName "xFinal" InitialState "xInitial" LimitDataPoints on MaxDataPoints "1000" LoadExternalInput off LoadInitialState off SaveFinalState off SaveCompleteFinalSimState off SaveFormat "Array" SaveOutput on SaveState off SignalLogging on DSMLogging on InspectSignalLogs off SaveTime on ReturnWorkspaceOutputs off StateSaveName "xout" TimeSaveName "tout" OutputSaveName "yout" SignalLoggingName "logsout" DSMLoggingName "dsmout" OutputOption "RefineOutputTimes" OutputTimes "[]" ReturnWorkspaceOutputsName "out" Refine "1" } Simulink.OptimizationCC { $ObjectID 4 Version "1.10.0" Array { Type "Cell" Dimension 8 Cell "BooleansAsBitfields" Cell "PassReuseOutputArgsAs" Cell "PassReuseOutputArgsThreshold" Cell "ZeroExternalMemoryAtStartup" Cell "ZeroInternalMemoryAtStartup" Cell "OptimizeModelRefInitCode" Cell "NoFixptDivByZeroProtection" Cell "UseSpecifiedMinMax" PropName "DisabledProps" } BlockReduction on BooleanDataType on ConditionallyExecuteInputs on InlineParams off UseIntDivNetSlope off UseSpecifiedMinMax off InlineInvariantSignals off OptimizeBlockIOStorage on BufferReuse on EnhancedBackFolding off StrengthReduction off ExpressionFolding on BooleansAsBitfields off BitfieldContainerType "uint_T" EnableMemcpy on MemcpyThreshold 64 PassReuseOutputArgsAs "Structure reference" ExpressionDepthLimit 2147483647 FoldNonRolledExpr on LocalBlockOutputs on RollThreshold 5 SystemCodeInlineAuto off StateBitsets off DataBitsets off UseTempVars off ZeroExternalMemoryAtStartup on ZeroInternalMemoryAtStartup on InitFltsAndDblsToZero off NoFixptDivByZeroProtection off EfficientFloat2IntCast off EfficientMapNaN2IntZero on OptimizeModelRefInitCode off LifeSpan "inf" MaxStackSize "Inherit from target" BufferReusableBoundary on SimCompilerOptimization "Off" AccelVerboseBuild off } Simulink.DebuggingCC { $ObjectID 5 Version "1.10.0" RTPrefix "error" ConsistencyChecking "none" ArrayBoundsChecking "none" SignalInfNanChecking "none" SignalRangeChecking "none" ReadBeforeWriteMsg "UseLocalSettings" WriteAfterWriteMsg "UseLocalSettings" WriteAfterReadMsg "UseLocalSettings" AlgebraicLoopMsg "warning" ArtificialAlgebraicLoopMsg "warning" SaveWithDisabledLinksMsg "warning" SaveWithParameterizedLinksMsg "none" CheckSSInitialOutputMsg on UnderspecifiedInitializationDetection "Classic" MergeDetectMultiDrivingBlocksExec "none" CheckExecutionContextPreStartOutputMsg off CheckExecutionContextRuntimeOutputMsg off SignalResolutionControl "UseLocalSettings" BlockPriorityViolationMsg "warning" MinStepSizeMsg "warning" TimeAdjustmentMsg "none" MaxConsecutiveZCsMsg "error" MaskedZcDiagnostic "warning" IgnoredZcDiagnostic "warning" SolverPrmCheckMsg "warning" InheritedTsInSrcMsg "warning" DiscreteInheritContinuousMsg "warning" MultiTaskDSMMsg "error" MultiTaskCondExecSysMsg "error" MultiTaskRateTransMsg "error" SingleTaskRateTransMsg "none" TasksWithSamePriorityMsg "warning" SigSpecEnsureSampleTimeMsg "warning" CheckMatrixSingularityMsg "none" IntegerOverflowMsg "warning" Int32ToFloatConvMsg "warning" ParameterDowncastMsg "error" ParameterOverflowMsg "error" ParameterUnderflowMsg "none" ParameterPrecisionLossMsg "warning" ParameterTunabilityLossMsg "warning" FixptConstUnderflowMsg "none" FixptConstOverflowMsg "none" FixptConstPrecisionLossMsg "none" UnderSpecifiedDataTypeMsg "none" UnnecessaryDatatypeConvMsg "none" VectorMatrixConversionMsg "none" InvalidFcnCallConnMsg "error" FcnCallInpInsideContextMsg "Use local settings" SignalLabelMismatchMsg "none" UnconnectedInputMsg "warning" UnconnectedOutputMsg "warning" UnconnectedLineMsg "warning" SFcnCompatibilityMsg "none" UniqueDataStoreMsg "none" BusObjectLabelMismatch "warning" RootOutportRequireBusObject "warning" AssertControl "UseLocalSettings" EnableOverflowDetection off ModelReferenceIOMsg "none" ModelReferenceMultiInstanceNormalModeStructChecksumCheck "error" ModelReferenceVersionMismatchMessage "none" ModelReferenceIOMismatchMessage "none" ModelReferenceCSMismatchMessage "none" UnknownTsInhSupMsg "warning" ModelReferenceDataLoggingMessage "warning" ModelReferenceSymbolNameMessage "warning" ModelReferenceExtraNoncontSigs "error" StateNameClashWarn "warning" SimStateInterfaceChecksumMismatchMsg "warning" InitInArrayFormatMsg "warning" StrictBusMsg "ErrorLevel1" BusNameAdapt "WarnAndRepair" NonBusSignalsTreatedAsBus "none" LoggingUnavailableSignals "error" BlockIODiagnostic "none" SFUnusedDataAndEventsDiag "warning" SFUnexpectedBacktrackingDiag "warning" SFInvalidInputDataAccessInChartInitDiag "warning" SFNoUnconditionalDefaultTransitionDiag "warning" SFTransitionOutsideNaturalParentDiag "warning" } Simulink.HardwareCC { $ObjectID 6 Version "1.10.0" ProdBitPerChar 8 ProdBitPerShort 16 ProdBitPerInt 32 ProdBitPerLong 32 ProdBitPerFloat 32 ProdBitPerDouble 64 ProdBitPerPointer 32 ProdLargestAtomicInteger "Char" ProdLargestAtomicFloat "None" ProdIntDivRoundTo "Undefined" ProdEndianess "Unspecified" ProdWordSize 32 ProdShiftRightIntArith on ProdHWDeviceType "32-bit Generic" TargetBitPerChar 8 TargetBitPerShort 16 TargetBitPerInt 32 TargetBitPerLong 32 TargetBitPerFloat 32 TargetBitPerDouble 64 TargetBitPerPointer 32 TargetLargestAtomicInteger "Char" TargetLargestAtomicFloat "None" TargetShiftRightIntArith on TargetIntDivRoundTo "Undefined" TargetEndianess "Unspecified" TargetWordSize 32 TargetTypeEmulationWarnSuppressLevel 0 TargetPreprocMaxBitsSint 32 TargetPreprocMaxBitsUint 32 TargetHWDeviceType "Specified" TargetUnknown off ProdEqTarget on } Simulink.ModelReferenceCC { $ObjectID 7 Version "1.10.0" UpdateModelReferenceTargets "IfOutOfDateOrStructuralChange" CheckModelReferenceTargetMessage "error" EnableParallelModelReferenceBuilds off ParallelModelReferenceErrorOnInvalidPool on ParallelModelReferenceMATLABWorkerInit "None" ModelReferenceNumInstancesAllowed "Multi" PropagateVarSize "Infer from blocks in model" ModelReferencePassRootInputsByReference on ModelReferenceMinAlgLoopOccurrences off PropagateSignalLabelsOutOfModel off SupportModelReferenceSimTargetCustomCode off } Simulink.SFSimCC { $ObjectID 8 Version "1.10.0" SFSimEnableDebug on SFSimOverflowDetection on SFSimEcho on SimBlas on SimCtrlC on SimExtrinsic on SimIntegrity on SimUseLocalCustomCode off SimParseCustomCode on SimBuildMode "sf_incremental_build" } Simulink.RTWCC { $BackupClass "Simulink.RTWCC" $ObjectID 9 Version "1.10.0" Array { Type "Cell" Dimension 7 Cell "IncludeHyperlinkInReport" Cell "GenerateTraceInfo" Cell "GenerateTraceReport" Cell "GenerateTraceReportSl" Cell "GenerateTraceReportSf" Cell "GenerateTraceReportEml" Cell "GenerateSLWebview" PropName "DisabledProps" } SystemTargetFile "grt.tlc" GenCodeOnly off MakeCommand "make_rtw" GenerateMakefile on TemplateMakefile "grt_default_tmf" GenerateReport off SaveLog off RTWVerbose on RetainRTWFile off ProfileTLC off TLCDebug off TLCCoverage off TLCAssert off ProcessScriptMode "Default" ConfigurationMode "Optimized" ConfigAtBuild off RTWUseLocalCustomCode off RTWUseSimCustomCode off IncludeHyperlinkInReport off LaunchReport off TargetLang "C" IncludeBusHierarchyInRTWFileBlockHierarchyMap off IncludeERTFirstTime off GenerateTraceInfo off GenerateTraceReport off GenerateTraceReportSl off GenerateTraceReportSf off GenerateTraceReportEml off GenerateCodeInfo off GenerateSLWebview off RTWCompilerOptimization "Off" CheckMdlBeforeBuild "Off" CustomRebuildMode "OnUpdate" Array { Type "Handle" Dimension 2 Simulink.CodeAppCC { $ObjectID 10 Version "1.10.0" Array { Type "Cell" Dimension 21 Cell "IgnoreCustomStorageClasses" Cell "IgnoreTestpoints" Cell "InsertBlockDesc" Cell "InsertPolySpaceComments" Cell "SFDataObjDesc" Cell "MATLABFcnDesc" Cell "SimulinkDataObjDesc" Cell "DefineNamingRule" Cell "SignalNamingRule" Cell "ParamNamingRule" Cell "InlinedPrmAccess" Cell "CustomSymbolStr" Cell "CustomSymbolStrGlobalVar" Cell "CustomSymbolStrType" Cell "CustomSymbolStrField" Cell "CustomSymbolStrFcn" Cell "CustomSymbolStrFcnArg" Cell "CustomSymbolStrBlkIO" Cell "CustomSymbolStrTmpVar" Cell "CustomSymbolStrMacro" Cell "ReqsInCode" PropName "DisabledProps" } ForceParamTrailComments off GenerateComments on IgnoreCustomStorageClasses on IgnoreTestpoints off IncHierarchyInIds off MaxIdLength 31 PreserveName off PreserveNameWithParent off ShowEliminatedStatement off IncAutoGenComments off SimulinkDataObjDesc off SFDataObjDesc off MATLABFcnDesc off IncDataTypeInIds off MangleLength 1 CustomSymbolStrGlobalVar "$R$N$M" CustomSymbolStrType "$N$R$M" CustomSymbolStrField "$N$M" CustomSymbolStrFcn "$R$N$M$F" CustomSymbolStrFcnArg "rt$I$N$M" CustomSymbolStrBlkIO "rtb_$N$M" CustomSymbolStrTmpVar "$N$M" CustomSymbolStrMacro "$R$N$M" DefineNamingRule "None" ParamNamingRule "None" SignalNamingRule "None" InsertBlockDesc off InsertPolySpaceComments off SimulinkBlockComments on MATLABSourceComments off EnableCustomComments off InlinedPrmAccess "Literals" ReqsInCode off UseSimReservedNames off } Simulink.GRTTargetCC { $BackupClass "Simulink.TargetCC" $ObjectID 11 Version "1.10.0" Array { Type "Cell" Dimension 16 Cell "GeneratePreprocessorConditionals" Cell "IncludeMdlTerminateFcn" Cell "CombineOutputUpdateFcns" Cell "SuppressErrorStatus" Cell "ERTCustomFileBanners" Cell "GenerateSampleERTMain" Cell "GenerateTestInterfaces" Cell "ModelStepFunctionPrototypeControlCompliant" Cell "CPPClassGenCompliant" Cell "MultiInstanceERTCode" Cell "PurelyIntegerCode" Cell "SupportComplex" Cell "SupportAbsoluteTime" Cell "SupportContinuousTime" Cell "SupportNonInlinedSFcns" Cell "PortableWordSizes" PropName "DisabledProps" } TargetFcnLib "ansi_tfl_table_tmw.mat" TargetLibSuffix "" TargetPreCompLibLocation "" TargetFunctionLibrary "ANSI_C" UtilityFuncGeneration "Auto" ERTMultiwordTypeDef "System defined" ERTCodeCoverageTool "None" ERTMultiwordLength 256 MultiwordLength 2048 GenerateFullHeader on GenerateSampleERTMain off GenerateTestInterfaces off IsPILTarget off ModelReferenceCompliant on ParMdlRefBuildCompliant on CompOptLevelCompliant on IncludeMdlTerminateFcn on GeneratePreprocessorConditionals "Disable all" CombineOutputUpdateFcns off CombineSignalStateStructs off SuppressErrorStatus off ERTFirstTimeCompliant off IncludeFileDelimiter "Auto" ERTCustomFileBanners off SupportAbsoluteTime on LogVarNameModifier "rt_" MatFileLogging on MultiInstanceERTCode off SupportNonFinite on SupportComplex on PurelyIntegerCode off SupportContinuousTime on SupportNonInlinedSFcns on SupportVariableSizeSignals off EnableShiftOperators on ParenthesesLevel "Nominal" PortableWordSizes off ModelStepFunctionPrototypeControlCompliant off CPPClassGenCompliant off AutosarCompliant off UseMalloc off ExtMode off ExtModeStaticAlloc off ExtModeTesting off ExtModeStaticAllocSize 1000000 ExtModeTransport 0 ExtModeMexFile "ext_comm" ExtModeIntrfLevel "Level1" RTWCAPISignals off RTWCAPIParams off RTWCAPIStates off GenerateASAP2 off } PropName "Components" } } hdlcoderui.hdlcc { $ObjectID 12 Version "1.10.0" Description "HDL Coder custom configuration component" Name "HDL Coder" Array { Type "Cell" Dimension 1 Cell "" PropName "HDLConfigFile" } HDLCActiveTab "0" } PropName "Components" } Name "Configuration" CurrentDlgPage "Solver" ConfigPrmDlgPosition " [ 400, 210, 1280, 840 ] " } PropName "ConfigurationSets" } BlockDefaults { ForegroundColor "black" BackgroundColor "white" DropShadow off NamePlacement "normal" FontName "Helvetica" FontSize 10 FontWeight "normal" FontAngle "normal" ShowName on BlockRotation 0 BlockMirror off } AnnotationDefaults { HorizontalAlignment "center" VerticalAlignment "middle" ForegroundColor "black" BackgroundColor "white" DropShadow off FontName "Helvetica" FontSize 10 FontWeight "normal" FontAngle "normal" UseDisplayTextAsClickCallback off } LineDefaults { FontName "Helvetica" FontSize 9 FontWeight "normal" FontAngle "normal" } BlockParameterDefaults { Block { BlockType Abs ZeroCross on SampleTime "-1" OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: Same as input" LockScale off RndMeth "Floor" SaturateOnIntegerOverflow on } Block { BlockType ComplexToRealImag Output "Real and imag" SampleTime "-1" } Block { BlockType Concatenate NumInputs "2" ConcatenateDimension "1" } Block { BlockType Constant Value "1" VectorParams1D on SamplingMode "Sample based" OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: Inherit from 'Constant value'" LockScale off SampleTime "inf" FramePeriod "inf" PreserveConstantTs off } Block { BlockType DataTypeConversion OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: Inherit via back propagation" LockScale off ConvertRealWorld "Real World Value (RWV)" RndMeth "Zero" SaturateOnIntegerOverflow on SampleTime "-1" } Block { BlockType Display Format "short" Decimation "10" Floating off SampleTime "-1" } Block { BlockType Fcn Expr "sin(u[1])" SampleTime "-1" } Block { BlockType Gain Gain "1" Multiplication "Element-wise(K.*u)" ParamMin "[]" ParamMax "[]" ParamDataTypeStr "Inherit: Same as input" OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: Same as input" LockScale off RndMeth "Floor" SaturateOnIntegerOverflow on SampleTime "-1" } Block { BlockType Inport Port "1" OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: auto" LockScale off BusOutputAsStruct off PortDimensions "-1" VarSizeSig "Inherit" SampleTime "-1" SignalType "auto" SamplingMode "auto" LatchByDelayingOutsideSignal off LatchInputForFeedbackSignals off Interpolate on } Block { BlockType Math Operator "exp" OutputSignalType "auto" SampleTime "-1" OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: Same as first input" LockScale off RndMeth "Floor" SaturateOnIntegerOverflow on IntermediateResultsDataTypeStr "Inherit: Inherit via internal rule" AlgorithmType "Newton-Raphson" Iterations "3" } Block { BlockType Mux Inputs "4" DisplayOption "none" UseBusObject off BusObject "BusObject" NonVirtualBus off } Block { BlockType Outport Port "1" OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: auto" LockScale off BusOutputAsStruct off PortDimensions "-1" VarSizeSig "Inherit" SampleTime "-1" SignalType "auto" SamplingMode "auto" SourceOfInitialOutputValue "Dialog" OutputWhenDisabled "held" InitialOutput "[]" } Block { BlockType Product Inputs "2" Multiplication "Element-wise(.*)" CollapseMode "All dimensions" CollapseDim "1" InputSameDT on OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: Same as first input" LockScale off RndMeth "Zero" SaturateOnIntegerOverflow on SampleTime "-1" } Block { BlockType RealImagToComplex Input "Real and imag" ConstantPart "0" SampleTime "-1" } Block { BlockType SubSystem ShowPortLabels "FromPortIcon" Permissions "ReadWrite" PermitHierarchicalResolution "All" TreatAsAtomicUnit off CheckFcnCallInpInsideContextMsg off SystemSampleTime "-1" RTWFcnNameOpts "Auto" RTWFileNameOpts "Auto" RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" SimViewingDevice off DataTypeOverride "UseLocalSettings" DataTypeOverrideAppliesTo "AllNumericTypes" MinMaxOverflowLogging "UseLocalSettings" Variant off GeneratePreprocessorConditionals off } Block { BlockType Sum IconShape "rectangular" Inputs "++" CollapseMode "All dimensions" CollapseDim "1" InputSameDT on AccumDataTypeStr "Inherit: Inherit via internal rule" OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: Same as first input" LockScale off RndMeth "Floor" SaturateOnIntegerOverflow on SampleTime "-1" } Block { BlockType Switch Criteria "u2 >= Threshold" Threshold "0" InputSameDT on OutMin "[]" OutMax "[]" OutDataTypeStr "Inherit: Inherit via internal rule" LockScale off RndMeth "Floor" SaturateOnIntegerOverflow on ZeroCross on SampleTime "-1" AllowDiffInputSizes off } Block { BlockType Terminator } Block { BlockType Trigonometry Operator "sin" ApproximationMethod "None" NumberOfIterations "11" OutputSignalType "auto" SampleTime "-1" } Block { BlockType UnitDelay X0 "0" InputProcessing "Inherited" SampleTime "1" StateMustResolveToSignalObject off RTWStateStorageClass "Auto" } } System { Name "gnss_sdr_tcp_connector_tracking_lib" Location [532, 307, 1230, 742] Open on ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" ReportName "simulink-default.rpt" SIDHighWatermark "2078" Block { BlockType Reference Name "Model Info" SID "2" Ports [] Position [15, 15, 436, 409] ForegroundColor "green" ShowName off LibraryVersion "1.233" FontName "Arial" SourceBlock "simulink/Model-Wide\nUtilities/Model Info" SourceType "CMBlock" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off InitialBlockCM "None" BlockCM "None" Frame "on" DisplayStringWithTags "/*! \n * \\file gnss_sdr_tcp_connector_tracking_lib.mdl\n * \\brief gnss_sdr_tcp_con" "nector_tracking Simulink library model. For \n * further information, please check the README_gnss_sdr_tcp_con" "nector_tracking.txt\n * file or the README_gnss_sdr_tcp_connector_parallel_tracking.txt\n * file for parallel " "computing execution.\n *\n * \\author David Pubill, 2012. dpubill(at)cttc.es\n * ----------------------------" "---------------------------------------------\n *\n * Copyright (C) 2010-2012 (see AUTHORS file for a list of" " contributors)\n *\n * GNSS-SDR is a software defined Global Navigation\n * Satellite Systems receiv" "er\n *\n * This file is part of GNSS-SDR.\n *\n * GNSS-SDR is free software: you can redistribute it and/or " "modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundati" "on, either version 3 of the License, or\n * at your option) any later version.\n *\n * GNSS-SDR is distribute" "d in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * M" "ERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n" " *\n * You should have received a copy of the GNU General Public License\n * along with GNSS-SDR. If not, see" " .\n *\n * ---------------------------------------------------------------------" "----\n */" MaskDisplayString "/*! \\n * \\file gnss_sdr_tcp_connector_tracking_lib.mdl\\n * \\brief gnss_sdr_tcp_c" "onnector_tracking Simulink library model. For \\n * further information, please check the README_gnss_sdr_tcp_" "connector_tracking.txt\\n * file or the README_gnss_sdr_tcp_connector_parallel_tracking.txt\\n * file for para" "llel computing execution.\\n *\\n * \\author David Pubill, 2012. dpubill(at)cttc.es\\n * --------------------" "-----------------------------------------------------\\n *\\n * Copyright (C) 2010-2012 (see AUTHORS file for" " a list of contributors)\\n *\\n * GNSS-SDR is a software defined Global Navigation\\n * Satellite S" "ystems receiver\\n *\\n * This file is part of GNSS-SDR.\\n *\\n * GNSS-SDR is free software: you can redist" "ribute it and/or modify\\n * it under the terms of the GNU General Public License as published by\\n * the Fre" "e Software Foundation, either version 3 of the License, or\\n * at your option) any later version.\\n *\\n * " "GNSS-SDR is distributed in the hope that it will be useful,\\n * but WITHOUT ANY WARRANTY; without even the imp" "lied warranty of\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\n * GNU General Public Li" "cense for more details.\\n *\\n * You should have received a copy of the GNU General Public License\\n * alon" "g with GNSS-SDR. If not, see .\\n *\\n * ---------------------------------------" "----------------------------------\\n */" HorizontalTextAlignment "Left" LeftAlignmentValue "0.02" SourceBlockDiagram "gnss_sdr_tcp_connector_tracking_lib" TagMaxNumber "20" } Block { BlockType SubSystem Name "gnss_sdr" SID "2052" Ports [] Position [460, 127, 605, 263] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "gnss_sdr" Location [395, 454, 1025, 704] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType SubSystem Name "gnss_sdr_tcp_connector_tracking" SID "3" Ports [9, 5] Position [230, 26, 400, 224] AncestorBlock "simulink/User-Defined\nFunctions/gnss_sdr/gnss_sdr_tcp_connector_tracking" LibraryVersion "*1.267" MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "gnss_sdr_tcp_connector_tracking" Location [191, 355, 936, 831] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" SIDHighWatermark "11895" SIDPrevWatermark "11844" Block { BlockType Inport Name "control_id" SID "3:11618" Position [55, 13, 85, 27] IconDisplay "Port number" } Block { BlockType Inport Name "d_E_I" SID "3:11619" Position [55, 48, 85, 62] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "d_E_Q" SID "3:11620" Position [55, 83, 85, 97] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "d_L_I" SID "3:11621" Position [55, 128, 85, 142] Port "4" IconDisplay "Port number" } Block { BlockType Inport Name "d_L_Q" SID "3:11622" Position [55, 163, 85, 177] Port "5" IconDisplay "Port number" } Block { BlockType Inport Name "d_P_I" SID "3:11623" Position [55, 243, 85, 257] Port "6" IconDisplay "Port number" } Block { BlockType Inport Name "d_P_Q" SID "3:11624" Position [55, 278, 85, 292] Port "7" IconDisplay "Port number" } Block { BlockType Inport Name "d_acq_carrier_doppler_[Hz]" SID "3:11625" Position [55, 313, 85, 327] Port "8" IconDisplay "Port number" } Block { BlockType Inport Name "enable_tracking" SID "3:11626" Position [55, 363, 85, 377] Port "9" IconDisplay "Port number" } Block { BlockType Abs Name "Abs" SID "3:11888" Position [295, 214, 315, 236] ShowName off SaturateOnIntegerOverflow off } Block { BlockType Abs Name "Abs1" SID "3:11891" Position [295, 189, 315, 211] ShowName off SaturateOnIntegerOverflow off } Block { BlockType Abs Name "Abs2" SID "3:11892" Position [295, 164, 315, 186] ShowName off SaturateOnIntegerOverflow off } Block { BlockType SubSystem Name "Carrier Tracking \n(PLL)" SID "3:11630" Ports [3, 2] Position [260, 244, 385, 396] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Carrier Tracking \n(PLL)" Location [119, 115, 924, 369] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "P" SID "3:11631" Position [55, 38, 85, 52] IconDisplay "Port number" } Block { BlockType Inport Name "d_acq_carrier_doppler_[Hz]" SID "3:11632" Position [55, 153, 85, 167] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "enable_tracking" SID "3:11633" Position [55, 213, 85, 227] Port "3" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "3:11634" Position [160, 140, 200, 180] ShowName off OutDataTypeStr "double" } Block { BlockType Reference Name "Delay" SID "3:11635" Ports [1, 1] Position [470, 75, 500, 115] BlockRotation 270 ShowName off LibraryVersion "1.233" UserDataPersistent on UserData "DataTag0" SourceBlock "simulink/Discrete/Integer Delay" SourceType "Integer Delay" NumDelays "1" InputProcessing "Inherited" vinit "0.0" samptime "Ti" } Block { BlockType SubSystem Name "Error\nAccumulator" SID "3:11636" Ports [2, 1] Position [575, 28, 685, 92] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Error\nAccumulator" Location [361, 424, 744, 624] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "e" SID "3:11637" Position [30, 23, 60, 37] IconDisplay "Port number" } Block { BlockType Inport Name "enable_tracking" SID "3:11638" Position [30, 58, 60, 72] Port "2" IconDisplay "Port number" } Block { BlockType Constant Name "Constant" SID "3:11639" Position [145, 85, 175, 115] ShowName off Value "0" SampleTime "-1" } Block { BlockType Sum Name "Sum2" SID "3:11640" Ports [2, 1] Position [90, 20, 110, 40] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" } Block { BlockType Switch Name "Switch" SID "3:11641" Position [200, 12, 250, 118] ShowName off Threshold "1" InputSameDT off SaturateOnIntegerOverflow off } Block { BlockType UnitDelay Name "Unit Delay" SID "3:11642" Position [170, 135, 205, 175] BlockMirror on ShowName off SampleTime "-1" } Block { BlockType Outport Name "sum(e)" SID "3:11643" Position [325, 58, 355, 72] IconDisplay "Port number" } Line { SrcBlock "e" SrcPort 1 DstBlock "Sum2" DstPort 1 } Line { SrcBlock "Unit Delay" SrcPort 1 Points [-65, 0] DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 DstBlock "Switch" DstPort 1 } Line { SrcBlock "Switch" SrcPort 1 Points [25, 0] Branch { DstBlock "sum(e)" DstPort 1 } Branch { Points [0, 90] DstBlock "Unit Delay" DstPort 1 } } Line { SrcBlock "enable_tracking" SrcPort 1 DstBlock "Switch" DstPort 2 } Line { SrcBlock "Constant" SrcPort 1 DstBlock "Switch" DstPort 3 } } } Block { BlockType SubSystem Name "First-Order\nLow-Pass Filter" SID "3:11644" Ports [1, 1] Position [310, 21, 370, 69] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "First-Order\nLow-Pass Filter" Location [181, 144, 1019, 332] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In" SID "3:11645" Position [25, 28, 55, 42] IconDisplay "Port number" } Block { BlockType Constant Name "B" SID "3:11646" Position [15, 99, 65, 131] ShowName off Value "B_PLL" SampleTime "T" } Block { BlockType Product Name "Product" SID "3:11647" Ports [2, 1] Position [265, 92, 295, 123] ShowName off InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product1" SID "3:11648" Ports [2, 1] Position [170, 27, 205, 63] ShowName off InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum" SID "3:11649" Ports [2, 1] Position [410, 35, 430, 55] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SampleTime "T" } Block { BlockType Sum Name "Sum1" SID "3:11650" Ports [2, 1] Position [325, 100, 345, 120] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" } Block { BlockType UnitDelay Name "Unit Delay" SID "3:11651" Position [360, 140, 395, 180] BlockMirror on ShowName off SampleTime "T" } Block { BlockType Gain Name "gamma" SID "3:11652" Position [110, 40, 140, 70] Gain "(16*(0.707)^2*T) / (1 + 4*(0.707)^2);" ParamDataTypeStr "Inherit: Inherit via internal rule" OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Gain Name "rho" SID "3:11653" Position [105, 104, 155, 126] Gain "(4*T) / (1 + 4*(0.707)^2)" ParamDataTypeStr "Inherit: Inherit via internal rule" OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out" SID "3:11654" Position [460, 38, 490, 52] IconDisplay "Port number" } Line { SrcBlock "rho" SrcPort 1 DstBlock "Product" DstPort 2 } Line { SrcBlock "gamma" SrcPort 1 DstBlock "Product1" DstPort 2 } Line { Labels [0, 0] SrcBlock "B" SrcPort 1 Points [15, 0] Branch { DstBlock "rho" DstPort 1 } Branch { Points [0, -60] DstBlock "gamma" DstPort 1 } } Line { SrcBlock "Product" SrcPort 1 DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Product1" SrcPort 1 Points [20, 0] Branch { Points [0, 55] DstBlock "Product" DstPort 1 } Branch { DstBlock "Sum" DstPort 1 } } Line { SrcBlock "Sum1" SrcPort 1 Points [70, 0] Branch { DstBlock "Sum" DstPort 2 } Branch { Points [0, 50] DstBlock "Unit Delay" DstPort 1 } } Line { Labels [0, 0] SrcBlock "Unit Delay" SrcPort 1 Points [-20, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "In" SrcPort 1 DstBlock "Product1" DstPort 1 } Line { SrcBlock "Sum" SrcPort 1 DstBlock "Out" DstPort 1 } } } Block { BlockType SubSystem Name "PLL Costas loop two \nquadrant arctan discriminator" SID "3:11866" Ports [1, 1] Position [150, 14, 210, 76] AncestorBlock "gnss_sdr_tcp_connector_tracking_lib/gnss_sdr/gnss_sdr_tcp_connector_tracking/Carrier Tracking \n" "(PLL)/atan2(Q,I)1/PLL Costas loop two quadrant arctan discriminator" LibraryVersion "*1.36" MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "PLL Costas loop two \nquadrant arctan discriminator" Location [32, 150, 415, 234] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" SIDHighWatermark "11859" SIDPrevWatermark "11859" Block { BlockType Inport Name "In" SID "3:11866:11670" Position [25, 38, 55, 52] IconDisplay "Port number" } Block { BlockType ComplexToRealImag Name "Complex to\nReal-Imag" SID "3:11866:11671" Ports [1, 2] Position [80, 28, 110, 57] ShowName off Output "Real and imag" } Block { BlockType Product Name "Divide" SID "3:11866:11672" Ports [2, 1] Position [150, 27, 180, 58] ShowName off Inputs "*/" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Trigonometry Name "Trigonometric\nFunction" SID "3:11866:11673" Ports [1, 1] Position [220, 30, 250, 60] ShowName off Operator "atan" } Block { BlockType Outport Name "Out" SID "3:11866:11674" Position [285, 38, 315, 52] IconDisplay "Port number" } Line { SrcBlock "Divide" SrcPort 1 DstBlock "Trigonometric\nFunction" DstPort 1 } Line { SrcBlock "Complex to\nReal-Imag" SrcPort 1 DstBlock "Divide" DstPort 1 } Line { SrcBlock "In" SrcPort 1 DstBlock "Complex to\nReal-Imag" DstPort 1 } Line { SrcBlock "Trigonometric\nFunction" SrcPort 1 DstBlock "Out" DstPort 1 } Line { SrcBlock "Complex to\nReal-Imag" SrcPort 2 DstBlock "Divide" DstPort 2 } } } Block { BlockType Sum Name "Sum" SID "3:11658" Ports [2, 1] Position [475, 35, 495, 55] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "3:11659" Ports [2, 1] Position [510, 150, 530, 170] ShowName off IconShape "round" Inputs "++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Gain Name "[Hz] to [rad/Ti]" SID "3:11860" Position [285, 143, 355, 177] Gain "2*pi*Ti" } Block { BlockType Gain Name "[rad/Ti] to [rad/s]" SID "3:11664" Position [620, 142, 655, 178] Gain "1/Ti" ParamDataTypeStr "Inherit: Inherit via internal rule" OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "carrier_error" SID "3:11679" Position [720, 53, 750, 67] IconDisplay "Port number" } Block { BlockType Outport Name "carrier_doppler" SID "3:11680" Position [720, 153, 750, 167] Port "2" IconDisplay "Port number" } Line { SrcBlock "Sum" SrcPort 1 DstBlock "Error\nAccumulator" DstPort 1 } Line { SrcBlock "Error\nAccumulator" SrcPort 1 DstBlock "carrier_error" DstPort 1 } Line { SrcBlock "P" SrcPort 1 DstBlock "PLL Costas loop two \nquadrant arctan discriminator" DstPort 1 } Line { SrcBlock "[rad/Ti] to [rad/s]" SrcPort 1 DstBlock "carrier_doppler" DstPort 1 } Line { SrcBlock "Delay" SrcPort 1 DstBlock "Sum" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 DstBlock "[rad/Ti] to [rad/s]" DstPort 1 } Line { SrcBlock "d_acq_carrier_doppler_[Hz]" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "[Hz] to [rad/Ti]" DstPort 1 } Line { SrcBlock "enable_tracking" SrcPort 1 Points [455, 0; 0, -145] DstBlock "Error\nAccumulator" DstPort 2 } Line { SrcBlock "[Hz] to [rad/Ti]" SrcPort 1 Points [125, 0] Branch { DstBlock "Delay" DstPort 1 } Branch { DstBlock "Sum2" DstPort 2 } } Line { SrcBlock "First-Order\nLow-Pass Filter" SrcPort 1 Points [75, 0] Branch { DstBlock "Sum" DstPort 1 } Branch { Points [0, -40; 70, 0] DstBlock "Sum2" DstPort 1 } } Line { SrcBlock "PLL Costas loop two \nquadrant arctan discriminator" SrcPort 1 DstBlock "First-Order\nLow-Pass Filter" DstPort 1 } } } Block { BlockType SubSystem Name "Code Tracking\n(DLL)" SID "3:11681" Ports [4, 1] Position [445, 41, 560, 224] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Code Tracking\n(DLL)" Location [159, 437, 775, 684] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "E" SID "3:11682" Position [25, 43, 55, 57] IconDisplay "Port number" } Block { BlockType Inport Name "P" SID "3:11683" Position [25, 78, 55, 92] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "L" SID "3:11684" Position [25, 113, 55, 127] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "carrier_aid" SID "3:11685" Position [25, 183, 55, 197] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Delay" SID "3:11687" Ports [1, 1] Position [493, 130, 527, 160] BlockRotation 270 ShowName off LibraryVersion "1.233" UserDataPersistent on UserData "DataTag1" SourceBlock "simulink/Discrete/Integer Delay" SourceType "Integer Delay" NumDelays "1" InputProcessing "Inherited" vinit "0.0" samptime "Ti" } Block { BlockType SubSystem Name "Early-Late Power" SID "3:11688" Ports [2, 1] Position [190, 16, 255, 154] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Early-Late Power" Location [509, 255, 823, 453] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "E" SID "3:11689" Position [15, 23, 45, 37] IconDisplay "Port number" } Block { BlockType Inport Name "L" SID "3:11690" Position [15, 133, 45, 147] Port "2" IconDisplay "Port number" } Block { BlockType Math Name "E power" SID "3:11863" Ports [1, 1] Position [90, 15, 120, 45] Operator "magnitude^2" } Block { BlockType Math Name "L power" SID "3:11864" Ports [1, 1] Position [90, 125, 120, 155] Operator "magnitude^2" } Block { BlockType Sum Name "Sum" SID "3:11865" Ports [2, 1] Position [140, 75, 160, 95] ShowName off IconShape "round" Inputs "+|-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" } Block { BlockType Gain Name "to [chip]" SID "3:11703" Position [185, 70, 215, 100] Gain "1/SFunSlope" } Block { BlockType Outport Name "Tau" SID "3:11704" Position [245, 78, 275, 92] IconDisplay "Port number" } Line { SrcBlock "to [chip]" SrcPort 1 DstBlock "Tau" DstPort 1 } Line { SrcBlock "Sum" SrcPort 1 DstBlock "to [chip]" DstPort 1 } Line { SrcBlock "L power" SrcPort 1 Points [25, 0] DstBlock "Sum" DstPort 2 } Line { SrcBlock "E power" SrcPort 1 Points [25, 0] DstBlock "Sum" DstPort 1 } Line { SrcBlock "E" SrcPort 1 DstBlock "E power" DstPort 1 } Line { SrcBlock "L" SrcPort 1 DstBlock "L power" DstPort 1 } } } Block { BlockType Gain Name "Gain" SID "3:11714" Position [350, 70, 380, 100] Gain "-1" ParamDataTypeStr "Inherit: Inherit via internal rule" OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType SubSystem Name "Normalization" SID "3:11716" Ports [3, 3] Position [85, 35, 135, 135] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Normalization" Location [536, 524, 961, 789] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "E" SID "3:11717" Position [25, 28, 55, 42] IconDisplay "Port number" } Block { BlockType Inport Name "P" SID "3:11718" Position [25, 108, 55, 122] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "L" SID "3:11719" Position [25, 198, 55, 212] Port "3" IconDisplay "Port number" } Block { BlockType Product Name "E Normalisation" SID "3:11720" Ports [2, 1] Position [270, 26, 315, 59] Inputs "*/" InputSameDT off RndMeth "Floor" } Block { BlockType Product Name "L Normalisation" SID "3:11721" Ports [2, 1] Position [270, 196, 315, 229] Inputs "*/" InputSameDT off RndMeth "Floor" } Block { BlockType Product Name "P Normalisation" SID "3:11722" Ports [2, 1] Position [270, 106, 315, 139] Inputs "*/" InputSameDT off RndMeth "Floor" } Block { BlockType SubSystem Name "Power Estimation" SID "3:11723" Ports [1, 1] Position [120, 126, 195, 184] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Power Estimation" Location [431, 459, 986, 620] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "in" SID "3:11724" Position [25, 78, 55, 92] IconDisplay "Port number" } Block { BlockType Abs Name "Abs(Im)" SID "3:11725" Position [175, 105, 205, 135] SaturateOnIntegerOverflow off } Block { BlockType Abs Name "Abs(Re)" SID "3:11726" Position [175, 30, 205, 60] SaturateOnIntegerOverflow off } Block { BlockType ComplexToRealImag Name "Complex to\nReal-Imag" SID "3:11728" Ports [1, 2] Position [105, 68, 135, 97] Output "Real and imag" } Block { BlockType Math Name "Im^2" SID "3:11739" Ports [1, 1] Position [335, 105, 365, 135] Operator "square" } Block { BlockType SubSystem Name "Mean(Im)" SID "3:11747" Ports [1, 1] Position [240, 95, 300, 145] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Mean(Im)" Location [489, 513, 989, 689] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "in" SID "3:11748" Position [25, 83, 55, 97] IconDisplay "Port number" } Block { BlockType Gain Name "Gain" SID "3:11749" Position [340, 70, 385, 110] ShowName off Gain "1/10" ParamDataTypeStr "Inherit: Inherit via internal rule" OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Integer Delay" SID "3:11750" Ports [1, 1] Position [125, 28, 160, 62] ShowName off LibraryVersion "1.302" UserDataPersistent on UserData "DataTag2" SourceBlock "simulink/Discrete/Integer Delay" SourceType "Integer Delay" NumDelays "10" InputProcessing "Inherited" vinit "100" samptime "-1" } Block { BlockType Sum Name "Sum" SID "3:11751" Ports [3, 1] Position [195, 80, 215, 100] ShowName off IconShape "round" Inputs "-++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType UnitDelay Name "Unit Delay" SID "3:11752" Position [235, 118, 270, 152] BlockMirror on ShowName off X0 "100*10" SampleTime "-1" } Block { BlockType Outport Name "mean" SID "3:11753" Position [425, 83, 455, 97] IconDisplay "Port number" } Line { SrcBlock "Integer Delay" SrcPort 1 Points [40, 0] DstBlock "Sum" DstPort 1 } Line { SrcBlock "in" SrcPort 1 Points [30, 0] Branch { Points [0, -45] DstBlock "Integer Delay" DstPort 1 } Branch { DstBlock "Sum" DstPort 2 } } Line { SrcBlock "Gain" SrcPort 1 DstBlock "mean" DstPort 1 } Line { SrcBlock "Unit Delay" SrcPort 1 Points [-25, 0] DstBlock "Sum" DstPort 3 } Line { SrcBlock "Sum" SrcPort 1 Points [90, 0] Branch { DstBlock "Gain" DstPort 1 } Branch { Points [0, 45] DstBlock "Unit Delay" DstPort 1 } } } } Block { BlockType SubSystem Name "Mean(Re)" SID "3:11754" Ports [1, 1] Position [240, 20, 300, 70] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Mean(Re)" Location [489, 513, 989, 689] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "in" SID "3:11755" Position [25, 83, 55, 97] IconDisplay "Port number" } Block { BlockType Gain Name "Gain" SID "3:11756" Position [330, 70, 375, 110] Gain "1/10" ParamDataTypeStr "Inherit: Inherit via internal rule" OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Integer Delay" SID "3:11757" Ports [1, 1] Position [125, 28, 160, 62] ShowName off LibraryVersion "1.302" UserDataPersistent on UserData "DataTag3" SourceBlock "simulink/Discrete/Integer Delay" SourceType "Integer Delay" NumDelays "100" InputProcessing "Inherited" vinit "100" samptime "-1" } Block { BlockType Sum Name "Sum" SID "3:11758" Ports [3, 1] Position [195, 80, 215, 100] ShowName off IconShape "round" Inputs "-++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType UnitDelay Name "Unit Delay" SID "3:11759" Position [230, 118, 265, 152] BlockMirror on ShowName off X0 "100*10" SampleTime "-1" } Block { BlockType Outport Name "mean" SID "3:11760" Position [425, 83, 455, 97] IconDisplay "Port number" } Line { SrcBlock "Sum" SrcPort 1 Points [75, 0] Branch { Points [0, 45] DstBlock "Unit Delay" DstPort 1 } Branch { DstBlock "Gain" DstPort 1 } } Line { SrcBlock "Unit Delay" SrcPort 1 Points [-20, 0] DstBlock "Sum" DstPort 3 } Line { SrcBlock "Gain" SrcPort 1 DstBlock "mean" DstPort 1 } Line { SrcBlock "in" SrcPort 1 Points [30, 0] Branch { DstBlock "Sum" DstPort 2 } Branch { Points [0, -45] DstBlock "Integer Delay" DstPort 1 } } Line { SrcBlock "Integer Delay" SrcPort 1 Points [40, 0] DstBlock "Sum" DstPort 1 } } } Block { BlockType Math Name "Power\nto\nAmplitude" SID "3:11763" Ports [1, 1] Position [435, 70, 465, 100] Operator "sqrt" } Block { BlockType Math Name "Re^2" SID "3:11765" Ports [1, 1] Position [335, 30, 365, 60] Operator "square" } Block { BlockType Sum Name "Sum" SID "3:11769" Ports [2, 1] Position [380, 75, 400, 95] ShowName off IconShape "round" Inputs "+|+" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "out" SID "3:11777" Position [490, 78, 520, 92] IconDisplay "Port number" } Line { SrcBlock "Im^2" SrcPort 1 Points [20, 0] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Re^2" SrcPort 1 Points [20, 0] DstBlock "Sum" DstPort 1 } Line { SrcBlock "Complex to\nReal-Imag" SrcPort 1 Points [15, 0; 0, -30] DstBlock "Abs(Re)" DstPort 1 } Line { SrcBlock "Abs(Re)" SrcPort 1 DstBlock "Mean(Re)" DstPort 1 } Line { SrcBlock "Complex to\nReal-Imag" SrcPort 2 Points [20, 0] DstBlock "Abs(Im)" DstPort 1 } Line { SrcBlock "Abs(Im)" SrcPort 1 DstBlock "Mean(Im)" DstPort 1 } Line { SrcBlock "Sum" SrcPort 1 DstBlock "Power\nto\nAmplitude" DstPort 1 } Line { SrcBlock "Mean(Im)" SrcPort 1 DstBlock "Im^2" DstPort 1 } Line { SrcBlock "Mean(Re)" SrcPort 1 DstBlock "Re^2" DstPort 1 } Line { SrcBlock "in" SrcPort 1 DstBlock "Complex to\nReal-Imag" DstPort 1 } Line { SrcBlock "Power\nto\nAmplitude" SrcPort 1 DstBlock "out" DstPort 1 } } } Block { BlockType Outport Name "E'" SID "3:11778" Position [360, 38, 390, 52] IconDisplay "Port number" } Block { BlockType Outport Name "P'" SID "3:11779" Position [360, 118, 390, 132] Port "2" IconDisplay "Port number" } Block { BlockType Outport Name "L'" SID "3:11780" Position [360, 208, 390, 222] Port "3" IconDisplay "Port number" } Line { SrcBlock "P" SrcPort 1 Points [25, 0] Branch { DstBlock "P Normalisation" DstPort 1 } Branch { Labels [0, 0] Points [0, 40] DstBlock "Power Estimation" DstPort 1 } } Line { SrcBlock "E" SrcPort 1 DstBlock "E Normalisation" DstPort 1 } Line { SrcBlock "E Normalisation" SrcPort 1 DstBlock "E'" DstPort 1 } Line { SrcBlock "P Normalisation" SrcPort 1 DstBlock "P'" DstPort 1 } Line { SrcBlock "L" SrcPort 1 DstBlock "L Normalisation" DstPort 1 } Line { SrcBlock "L Normalisation" SrcPort 1 DstBlock "L'" DstPort 1 } Line { SrcBlock "Power Estimation" SrcPort 1 Points [30, 0; 0, 0] Branch { Points [0, -25] Branch { Points [0, -80] DstBlock "E Normalisation" DstPort 2 } Branch { DstBlock "P Normalisation" DstPort 2 } } Branch { Points [0, 65] DstBlock "L Normalisation" DstPort 2 } } } } Block { BlockType Sum Name "Sum" SID "3:11783" Ports [2, 1] Position [500, 75, 520, 95] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Terminator Name "Terminator" SID "3:11784" Position [155, 75, 175, 95] ShowName off } Block { BlockType SubSystem Name "Zero Order\nLow-Pass Filter" SID "3:11785" Ports [1, 1] Position [405, 59, 460, 111] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Zero Order\nLow-Pass Filter" Location [217, 135, 598, 254] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "in" SID "3:11894" Position [25, 28, 55, 42] IconDisplay "Port number" } Block { BlockType Constant Name "B" SID "3:11787" Position [15, 66, 65, 94] ShowName off Value "B_DLL" SampleTime "T" } Block { BlockType Fcn Name "Fcn" SID "3:11788" Position [100, 63, 245, 97] ShowName off Expr "(4*u*T) / (1 + 2*u*T);" } Block { BlockType Product Name "Product" SID "3:11789" Ports [2, 1] Position [285, 42, 315, 73] ShowName off InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "out" SID "3:11895" Position [345, 53, 375, 67] IconDisplay "Port number" } Line { SrcBlock "Fcn" SrcPort 1 Points [20, 0] DstBlock "Product" DstPort 2 } Line { SrcBlock "B" SrcPort 1 DstBlock "Fcn" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "out" DstPort 1 } Line { SrcBlock "in" SrcPort 1 Points [210, 0] DstBlock "Product" DstPort 1 } } } Block { BlockType Gain Name "[chip] to [s]" SID "3:11862" Position [290, 70, 320, 100] Gain "Tc" } Block { BlockType Gain Name "[rad/s] to [s/Ti]" SID "3:11795" Position [290, 174, 415, 206] Gain "-Ti/(2*pi*f0)" ParamDataTypeStr "Inherit: Inherit via internal rule" OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "code_error [s]" SID "3:11798" Position [565, 78, 595, 92] IconDisplay "Port number" } Line { SrcBlock "Gain" SrcPort 1 DstBlock "Zero Order\nLow-Pass Filter" DstPort 1 } Line { SrcBlock "L" SrcPort 1 DstBlock "Normalization" DstPort 3 } Line { SrcBlock "P" SrcPort 1 DstBlock "Normalization" DstPort 2 } Line { SrcBlock "E" SrcPort 1 DstBlock "Normalization" DstPort 1 } Line { SrcBlock "[chip] to [s]" SrcPort 1 DstBlock "Gain" DstPort 1 } Line { SrcBlock "Early-Late Power" SrcPort 1 DstBlock "[chip] to [s]" DstPort 1 } Line { SrcBlock "[rad/s] to [s/Ti]" SrcPort 1 Points [90, 0] DstBlock "Delay" DstPort 1 } Line { SrcBlock "carrier_aid" SrcPort 1 DstBlock "[rad/s] to [s/Ti]" DstPort 1 } Line { SrcBlock "Sum" SrcPort 1 DstBlock "code_error [s]" DstPort 1 } Line { SrcBlock "Delay" SrcPort 1 DstBlock "Sum" DstPort 2 } Line { SrcBlock "Normalization" SrcPort 3 DstBlock "Early-Late Power" DstPort 2 } Line { SrcBlock "Normalization" SrcPort 1 DstBlock "Early-Late Power" DstPort 1 } Line { SrcBlock "Normalization" SrcPort 2 DstBlock "Terminator" DstPort 1 } Line { SrcBlock "Zero Order\nLow-Pass Filter" SrcPort 1 DstBlock "Sum" DstPort 1 } } } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "3:11799" Position [580, 115, 620, 155] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "3:11800" Position [180, 55, 220, 95] ShowName off OutDataTypeStr "double" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "3:11801" Position [580, 340, 620, 380] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "3:11802" Position [580, 265, 620, 305] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "3:11803" Position [180, 135, 220, 175] ShowName off OutDataTypeStr "double" } Block { BlockType DataTypeConversion Name "Data Type \nConversion6" SID "3:11804" Position [180, 250, 220, 290] ShowName off OutDataTypeStr "double" } Block { BlockType Mux Name "Mux" SID "3:11886" Ports [3, 1] Position [335, 159, 340, 241] ShowName off Inputs "3" DisplayOption "bar" } Block { BlockType RealImagToComplex Name "Real-Imag to\nComplex" SID "3:11806" Ports [2, 1] Position [125, 36, 160, 109] ShowName off Input "Real and imag" } Block { BlockType RealImagToComplex Name "Real-Imag to\nComplex1" SID "3:11807" Ports [2, 1] Position [125, 116, 160, 189] ShowName off Input "Real and imag" } Block { BlockType RealImagToComplex Name "Real-Imag to\nComplex2" SID "3:11808" Ports [2, 1] Position [125, 231, 160, 304] ShowName off Input "Real and imag" } Block { BlockType Gain Name "[rad/s] to [Hz]" SID "3:11812" Position [485, 345, 515, 375] Gain "1/(2*pi)" ParamDataTypeStr "Inherit: Inherit via internal rule" OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "control_id_" SID "3:11813" Position [655, 13, 685, 27] IconDisplay "Port number" } Block { BlockType Outport Name "code_error_[s]" SID "3:11814" Position [655, 128, 685, 142] Port "2" IconDisplay "Port number" } Block { BlockType Outport Name "carrier_error" SID "3:11815" Position [655, 278, 685, 292] Port "3" IconDisplay "Port number" } Block { BlockType Outport Name "carrier_doppler_[Hz]" SID "3:11816" Position [655, 353, 685, 367] Port "4" IconDisplay "Port number" } Block { BlockType Outport Name "EPL Scope" SID "3:11893" Position [655, 423, 685, 437] Port "5" IconDisplay "Port number" } Line { SrcBlock "Carrier Tracking \n(PLL)" SrcPort 2 Points [15, 0] Branch { Points [0, -160] DstBlock "Code Tracking\n(DLL)" DstPort 4 } Branch { DstBlock "[rad/s] to [Hz]" DstPort 1 } } Line { SrcBlock "Code Tracking\n(DLL)" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "Real-Imag to\nComplex" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "Carrier Tracking \n(PLL)" SrcPort 1 DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "Real-Imag to\nComplex1" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Real-Imag to\nComplex2" SrcPort 1 DstBlock "Data Type \nConversion6" DstPort 1 } Line { SrcBlock "d_E_I" SrcPort 1 DstBlock "Real-Imag to\nComplex" DstPort 1 } Line { SrcBlock "d_E_Q" SrcPort 1 DstBlock "Real-Imag to\nComplex" DstPort 2 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "code_error_[s]" DstPort 1 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "carrier_error" DstPort 1 } Line { SrcBlock "control_id" SrcPort 1 DstBlock "control_id_" DstPort 1 } Line { SrcBlock "d_L_I" SrcPort 1 DstBlock "Real-Imag to\nComplex1" DstPort 1 } Line { SrcBlock "d_L_Q" SrcPort 1 DstBlock "Real-Imag to\nComplex1" DstPort 2 } Line { SrcBlock "d_P_I" SrcPort 1 DstBlock "Real-Imag to\nComplex2" DstPort 1 } Line { SrcBlock "d_P_Q" SrcPort 1 DstBlock "Real-Imag to\nComplex2" DstPort 2 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 Points [45, 0] Branch { Points [0, -10] DstBlock "Code Tracking\n(DLL)" DstPort 1 } Branch { Points [0, 100] DstBlock "Abs2" DstPort 1 } } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 Points [25, 0] Branch { DstBlock "Code Tracking\n(DLL)" DstPort 3 } Branch { Points [0, 70] DstBlock "Abs" DstPort 1 } } Line { SrcBlock "Data Type \nConversion6" SrcPort 1 Points [10, 0] Branch { DstBlock "Carrier Tracking \n(PLL)" DstPort 1 } Branch { Points [0, -160; 25, 0] Branch { DstBlock "Code Tracking\n(DLL)" DstPort 2 } Branch { Points [0, 90] DstBlock "Abs1" DstPort 1 } } } Line { SrcBlock "d_acq_carrier_doppler_[Hz]" SrcPort 1 DstBlock "Carrier Tracking \n(PLL)" DstPort 2 } Line { SrcBlock "[rad/s] to [Hz]" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "carrier_doppler_[Hz]" DstPort 1 } Line { SrcBlock "enable_tracking" SrcPort 1 DstBlock "Carrier Tracking \n(PLL)" DstPort 3 } Line { SrcBlock "Abs" SrcPort 1 DstBlock "Mux" DstPort 3 } Line { SrcBlock "Abs1" SrcPort 1 DstBlock "Mux" DstPort 2 } Line { SrcBlock "Abs2" SrcPort 1 DstBlock "Mux" DstPort 1 } Line { SrcBlock "Mux" SrcPort 1 Points [50, 0; 0, 230] DstBlock "EPL Scope" DstPort 1 } } } Block { BlockType SubSystem Name "gnss_sdr_tcp_connector_tracking_rx" SID "6" Ports [0, 9] Position [25, 26, 195, 224] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "gnss_sdr_tcp_connector_tracking_rx" Location [6, 82, 455, 978] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "59" Block { BlockType Reference Name "Multiport\nSelector" SID "7" Ports [1, 36] Position [185, 25, 285, 1475] ShowName off LibraryVersion "1.462" SourceBlock "dspindex/Multiport\nSelector" SourceType "Multiport Selector" rowsOrCols "Rows" idxCellArray "{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33," "34,35,36}" idxErrMode "Clip Index" } Block { BlockType Reference Name "RX" SID "8" Ports [0, 1] Position [30, 691, 165, 809] LibraryVersion "1.84" DialogController "instrumentcreatedialog" DialogControllerArgs "DataTag4" SourceBlock "instrumentlib/TCP//IP Receive" SourceType "TCP/IP Receive" Host "84.88.61.86" Port "2070" DataSize "36" EnableBlockingMode on Timeout "5" SampleTime "-1" DataType "uint8" ByteOrder "BigEndian" } Block { BlockType SubSystem Name "Subsystem" SID "9" Ports [4, 1] Position [395, 186, 500, 354] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [528, 347, 1021, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "10" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "11" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "12" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "13" Position [25, 48, 55, 62] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "14" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "15" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "16" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "17" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "18" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "19" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "20" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "21" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "22" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "23" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "24" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "25" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "26" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "27" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "28" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "29" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "30" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "31" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "32" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "33" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "34" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "35" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "36" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "37" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "38" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "39" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "40" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "41" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "42" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "43" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "44" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "45" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "46" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "47" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "48" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "49" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "50" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "51" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "52" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "53" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "54" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "55" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "56" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "57" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "58" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "59" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "60" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "61" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "62" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "63" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "64" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "65" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "66" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "67" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "68" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "69" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "70" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "71" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "72" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "73" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "74" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "75" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "76" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "77" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "78" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "79" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "80" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "81" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "82" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "83" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "84" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "85" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "86" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "87" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "88" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "89" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "90" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "91" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "92" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "93" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "94" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "95" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "96" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "97" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "98" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "99" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "100" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "101" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "102" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "103" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "104" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "105" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "106" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "107" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "108" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "109" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "110" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "111" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "112" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "113" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "114" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "115" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "116" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "117" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "118" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "119" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "120" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "121" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "122" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "123" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "124" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "125" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "126" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "127" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "128" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "129" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "130" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "131" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "132" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "133" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "134" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "135" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "136" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "137" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "138" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "139" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "140" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "141" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "142" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "143" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "144" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "145" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "146" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "147" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "148" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "149" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "150" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "151" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "152" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "153" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "154" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "155" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "156" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "157" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "158" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "159" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "160" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "161" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "162" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "163" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "164" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "165" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "166" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "167" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "168" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "169" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "170" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "171" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "172" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "173" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "174" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "175" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "176" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "177" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "178" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "179" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "180" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "181" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "182" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "183" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "184" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "185" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "186" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "187" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "188" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "189" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "190" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "191" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "192" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "193" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "194" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "195" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "196" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "197" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "198" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "199" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "200" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "201" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "202" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "203" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "204" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "205" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "206" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "207" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "208" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "209" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "210" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "211" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "212" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "213" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "214" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "215" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "216" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "217" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "218" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "219" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "220" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "221" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "222" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "223" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "224" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "225" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "226" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "227" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "228" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction7" DstPort 2 } Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction10" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction11" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction12" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction13" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction14" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction15" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction16" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction17" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction18" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction19" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction20" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction21" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction22" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction23" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 80] Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } Branch { Points [0, 150] Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } Branch { Points [0, 155] Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } Branch { Points [0, 175] Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } Branch { Points [0, 180; 5, 0] Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } Branch { Points [-5, 0; 0, 175] Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } Branch { Points [0, 185] Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } Branch { Points [0, 190] Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } Branch { Points [0, 195] Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } Branch { Points [0, 215] Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } Branch { Points [0, 230] Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } Branch { Points [0, 240] Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } Branch { Points [0, 260] Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } Branch { Points [0, 265] Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } Branch { Points [0, 275] Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } Branch { Points [0, 280] Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } Branch { Points [0, 285] Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } Branch { Points [0, 300] Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } Branch { Points [0, 305] Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } Branch { Points [0, 310] Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } Branch { Points [0, 315] Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } Branch { Points [0, 320] Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } } } } } } } } } } } } } } } } } } } } } } } Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [5, 0] Branch { DstBlock "Math\nFunction2" DstPort 2 } Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } } Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } } } } Block { BlockType Sum Name "Sum" SID "229" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "230" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "231" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "232" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "233" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { DstBlock "Display3" DstPort 1 } Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } Branch { DstBlock "Data Type Conversion1" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { DstBlock "Exponent" DstPort 1 } Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { DstBlock "Sign" DstPort 1 } Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } } } Block { BlockType Outport Name "d_E_I" SID "234" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "d_E_I" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "In4" SrcPort 1 Points [10, 0; 0, -5] DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem1" SID "235" Ports [4, 1] Position [395, 346, 500, 514] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem1" Location [528, 347, 1021, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "236" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "237" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "238" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "239" Position [25, 48, 55, 62] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "240" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "241" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "242" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "243" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "244" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "245" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "246" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "247" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "248" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "249" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "250" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "251" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "252" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "253" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "254" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "255" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "256" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "257" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "258" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "259" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "260" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "261" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "262" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "263" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "264" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "265" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "266" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "267" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "268" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "269" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "270" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "271" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "272" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "273" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "274" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "275" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "276" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "277" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "278" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "279" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "280" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "281" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "282" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "283" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "284" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "285" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "286" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "287" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "288" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "289" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "290" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "291" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "292" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "293" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "294" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "295" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "296" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "297" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "298" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "299" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "300" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "301" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "302" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "303" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "304" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "305" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "306" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "307" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "308" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "309" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "310" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "311" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "312" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "313" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "314" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "315" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "316" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "317" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "318" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "319" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "320" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "321" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "322" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "323" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "324" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "325" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "326" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "327" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "328" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "329" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "330" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "331" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "332" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "333" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "334" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "335" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "336" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "337" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "338" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "339" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "340" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "341" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "342" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "343" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "344" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "345" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "346" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "347" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "348" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "349" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "350" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "351" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "352" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "353" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "354" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "355" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "356" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "357" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "358" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "359" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "360" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "361" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "362" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "363" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "364" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "365" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "366" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "367" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "368" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "369" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "370" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "371" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "372" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "373" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "374" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "375" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "376" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "377" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "378" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "379" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "380" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "381" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "382" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "383" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "384" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "385" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "386" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "387" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "388" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "389" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "390" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "391" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "392" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "393" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "394" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "395" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "396" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "397" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "398" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "399" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "400" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "401" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "402" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "403" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "404" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "405" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "406" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "407" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "408" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "409" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "410" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "411" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "412" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "413" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "414" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "415" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "416" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "417" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "418" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "419" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "420" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "421" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "422" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "423" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "424" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "425" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "426" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "427" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "428" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "429" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "430" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "431" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "432" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "433" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "434" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "435" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "436" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "437" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "438" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "439" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "440" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "441" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "442" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "443" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "444" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "445" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "446" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "447" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "448" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "449" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "450" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "451" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "452" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "453" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "454" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } Branch { Points [5, 0] Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } Branch { DstBlock "Math\nFunction2" DstPort 2 } } } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } Branch { Points [0, 80] Branch { Points [0, 150] Branch { Points [0, 155] Branch { Points [0, 175] Branch { Points [0, 180; 5, 0] Branch { Points [-5, 0; 0, 175] Branch { Points [0, 185] Branch { Points [0, 190] Branch { Points [0, 195] Branch { Points [0, 215] Branch { Points [0, 230] Branch { Points [0, 240] Branch { Points [0, 260] Branch { Points [0, 265] Branch { Points [0, 275] Branch { Points [0, 280] Branch { Points [0, 285] Branch { Points [0, 300] Branch { Points [0, 305] Branch { Points [0, 310] Branch { Points [0, 315] Branch { Points [0, 320] Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } } } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } Branch { DstBlock "Math\nFunction23" DstPort 2 } } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } Branch { DstBlock "Math\nFunction22" DstPort 2 } } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } Branch { DstBlock "Math\nFunction21" DstPort 2 } } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } Branch { DstBlock "Math\nFunction20" DstPort 2 } } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } Branch { DstBlock "Math\nFunction19" DstPort 2 } } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } Branch { DstBlock "Math\nFunction18" DstPort 2 } } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } Branch { DstBlock "Math\nFunction17" DstPort 2 } } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } Branch { DstBlock "Math\nFunction16" DstPort 2 } } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } Branch { DstBlock "Math\nFunction15" DstPort 2 } } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } Branch { DstBlock "Math\nFunction14" DstPort 2 } } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } Branch { DstBlock "Math\nFunction13" DstPort 2 } } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } Branch { DstBlock "Math\nFunction12" DstPort 2 } } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } Branch { DstBlock "Math\nFunction11" DstPort 2 } } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } Branch { DstBlock "Math\nFunction10" DstPort 2 } } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } Branch { DstBlock "Math\nFunction7" DstPort 2 } } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } } } Block { BlockType Sum Name "Sum" SID "455" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "456" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "457" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "458" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "459" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } Branch { DstBlock "Sign" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } Branch { DstBlock "Exponent" DstPort 1 } } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { DstBlock "Data Type Conversion1" DstPort 1 } Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } Branch { DstBlock "Display3" DstPort 1 } } } } Block { BlockType Outport Name "d_E_Q" SID "460" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 Points [10, 0; 0, -5] DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "d_E_Q" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem2" SID "461" Ports [4, 1] Position [395, 506, 500, 674] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem2" Location [528, 347, 1021, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "462" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "463" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "464" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "465" Position [25, 48, 55, 62] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "466" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "467" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "468" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "469" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "470" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "471" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "472" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "473" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "474" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "475" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "476" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "477" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "478" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "479" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "480" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "481" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "482" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "483" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "484" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "485" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "486" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "487" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "488" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "489" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "490" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "491" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "492" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "493" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "494" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "495" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "496" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "497" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "498" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "499" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "500" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "501" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "502" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "503" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "504" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "505" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "506" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "507" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "508" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "509" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "510" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "511" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "512" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "513" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "514" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "515" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "516" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "517" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "518" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "519" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "520" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "521" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "522" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "523" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "524" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "525" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "526" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "527" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "528" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "529" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "530" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "531" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "532" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "533" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "534" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "535" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "536" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "537" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "538" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "539" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "540" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "541" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "542" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "543" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "544" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "545" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "546" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "547" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "548" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "549" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "550" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "551" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "552" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "553" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "554" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "555" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "556" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "557" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "558" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "559" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "560" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "561" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "562" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "563" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "564" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "565" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "566" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "567" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "568" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "569" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "570" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "571" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "572" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "573" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "574" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "575" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "576" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "577" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "578" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "579" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "580" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "581" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "582" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "583" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "584" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "585" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "586" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "587" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "588" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "589" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "590" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "591" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "592" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "593" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "594" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "595" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "596" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "597" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "598" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "599" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "600" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "601" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "602" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "603" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "604" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "605" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "606" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "607" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "608" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "609" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "610" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "611" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "612" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "613" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "614" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "615" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "616" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "617" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "618" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "619" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "620" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "621" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "622" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "623" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "624" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "625" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "626" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "627" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "628" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "629" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "630" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "631" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "632" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "633" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "634" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "635" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "636" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "637" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "638" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "639" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "640" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "641" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "642" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "643" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "644" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "645" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "646" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "647" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "648" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "649" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "650" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "651" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "652" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "653" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "654" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "655" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "656" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "657" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "658" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "659" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "660" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "661" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "662" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "663" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "664" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "665" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "666" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "667" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "668" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "669" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "670" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "671" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "672" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "673" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "674" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "675" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "676" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "677" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "678" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "679" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "680" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction7" DstPort 2 } Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction10" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction11" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction12" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction13" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction14" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction15" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction16" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction17" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction18" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction19" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction20" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction21" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction22" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction23" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 80] Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } Branch { Points [0, 150] Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } Branch { Points [0, 155] Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } Branch { Points [0, 175] Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } Branch { Points [0, 180; 5, 0] Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } Branch { Points [-5, 0; 0, 175] Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } Branch { Points [0, 185] Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } Branch { Points [0, 190] Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } Branch { Points [0, 195] Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } Branch { Points [0, 215] Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } Branch { Points [0, 230] Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } Branch { Points [0, 240] Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } Branch { Points [0, 260] Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } Branch { Points [0, 265] Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } Branch { Points [0, 275] Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } Branch { Points [0, 280] Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } Branch { Points [0, 285] Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } Branch { Points [0, 300] Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } Branch { Points [0, 305] Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } Branch { Points [0, 310] Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } Branch { Points [0, 315] Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } Branch { Points [0, 320] Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } } } } } } } } } } } } } } } } } } } } } } } Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [5, 0] Branch { DstBlock "Math\nFunction2" DstPort 2 } Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } } Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } } } } Block { BlockType Sum Name "Sum" SID "681" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "682" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "683" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "684" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "685" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { DstBlock "Display3" DstPort 1 } Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } Branch { DstBlock "Data Type Conversion1" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { DstBlock "Exponent" DstPort 1 } Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { DstBlock "Sign" DstPort 1 } Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } } } Block { BlockType Outport Name "d_L_I" SID "686" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "d_L_I" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "In4" SrcPort 1 Points [10, 0; 0, -5] DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem3" SID "687" Ports [4, 1] Position [395, 666, 500, 834] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem3" Location [528, 347, 1021, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "688" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "689" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "690" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "691" Position [25, 48, 55, 62] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "692" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "693" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "694" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "695" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "696" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "697" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "698" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "699" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "700" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "701" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "702" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "703" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "704" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "705" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "706" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "707" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "708" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "709" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "710" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "711" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "712" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "713" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "714" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "715" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "716" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "717" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "718" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "719" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "720" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "721" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "722" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "723" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "724" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "725" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "726" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "727" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "728" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "729" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "730" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "731" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "732" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "733" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "734" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "735" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "736" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "737" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "738" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "739" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "740" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "741" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "742" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "743" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "744" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "745" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "746" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "747" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "748" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "749" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "750" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "751" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "752" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "753" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "754" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "755" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "756" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "757" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "758" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "759" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "760" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "761" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "762" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "763" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "764" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "765" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "766" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "767" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "768" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "769" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "770" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "771" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "772" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "773" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "774" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "775" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "776" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "777" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "778" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "779" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "780" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "781" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "782" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "783" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "784" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "785" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "786" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "787" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "788" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "789" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "790" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "791" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "792" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "793" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "794" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "795" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "796" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "797" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "798" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "799" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "800" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "801" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "802" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "803" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "804" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "805" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "806" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "807" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "808" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "809" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "810" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "811" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "812" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "813" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "814" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "815" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "816" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "817" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "818" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "819" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "820" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "821" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "822" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "823" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "824" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "825" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "826" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "827" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "828" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "829" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "830" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "831" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "832" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "833" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "834" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "835" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "836" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "837" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "838" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "839" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "840" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "841" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "842" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "843" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "844" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "845" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "846" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "847" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "848" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "849" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "850" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "851" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "852" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "853" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "854" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "855" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "856" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "857" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "858" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "859" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "860" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "861" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "862" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "863" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "864" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "865" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "866" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "867" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "868" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "869" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "870" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "871" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "872" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "873" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "874" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "875" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "876" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "877" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "878" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "879" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "880" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "881" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "882" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "883" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "884" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "885" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "886" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "887" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "888" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "889" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "890" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "891" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "892" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "893" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "894" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "895" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "896" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "897" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "898" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "899" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "900" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "901" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "902" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "903" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "904" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "905" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "906" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } Branch { Points [5, 0] Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } Branch { DstBlock "Math\nFunction2" DstPort 2 } } } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } Branch { Points [0, 80] Branch { Points [0, 150] Branch { Points [0, 155] Branch { Points [0, 175] Branch { Points [0, 180; 5, 0] Branch { Points [-5, 0; 0, 175] Branch { Points [0, 185] Branch { Points [0, 190] Branch { Points [0, 195] Branch { Points [0, 215] Branch { Points [0, 230] Branch { Points [0, 240] Branch { Points [0, 260] Branch { Points [0, 265] Branch { Points [0, 275] Branch { Points [0, 280] Branch { Points [0, 285] Branch { Points [0, 300] Branch { Points [0, 305] Branch { Points [0, 310] Branch { Points [0, 315] Branch { Points [0, 320] Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } } } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } Branch { DstBlock "Math\nFunction23" DstPort 2 } } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } Branch { DstBlock "Math\nFunction22" DstPort 2 } } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } Branch { DstBlock "Math\nFunction21" DstPort 2 } } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } Branch { DstBlock "Math\nFunction20" DstPort 2 } } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } Branch { DstBlock "Math\nFunction19" DstPort 2 } } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } Branch { DstBlock "Math\nFunction18" DstPort 2 } } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } Branch { DstBlock "Math\nFunction17" DstPort 2 } } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } Branch { DstBlock "Math\nFunction16" DstPort 2 } } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } Branch { DstBlock "Math\nFunction15" DstPort 2 } } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } Branch { DstBlock "Math\nFunction14" DstPort 2 } } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } Branch { DstBlock "Math\nFunction13" DstPort 2 } } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } Branch { DstBlock "Math\nFunction12" DstPort 2 } } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } Branch { DstBlock "Math\nFunction11" DstPort 2 } } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } Branch { DstBlock "Math\nFunction10" DstPort 2 } } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } Branch { DstBlock "Math\nFunction7" DstPort 2 } } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } } } Block { BlockType Sum Name "Sum" SID "907" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "908" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "909" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "910" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "911" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } Branch { DstBlock "Sign" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } Branch { DstBlock "Exponent" DstPort 1 } } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { DstBlock "Data Type Conversion1" DstPort 1 } Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } Branch { DstBlock "Display3" DstPort 1 } } } } Block { BlockType Outport Name "d_L_Q" SID "912" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 Points [10, 0; 0, -5] DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "d_L_Q" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem4" SID "913" Ports [4, 1] Position [395, 826, 500, 994] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem4" Location [528, 347, 1021, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "914" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "915" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "916" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "917" Position [25, 48, 55, 62] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "918" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "919" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "920" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "921" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "922" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "923" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "924" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "925" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "926" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "927" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "928" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "929" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "930" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "931" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "932" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "933" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "934" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "935" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "936" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "937" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "938" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "939" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "940" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "941" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "942" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "943" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "944" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "945" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "946" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "947" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "948" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "949" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "950" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "951" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "952" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "953" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "954" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "955" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "956" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "957" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "958" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "959" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "960" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "961" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "962" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "963" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "964" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "965" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "966" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "967" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "968" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "969" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "970" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "971" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "972" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "973" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "974" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "975" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "976" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "977" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "978" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "979" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "980" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "981" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "982" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "983" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "984" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "985" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "986" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "987" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "988" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "989" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "990" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "991" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "992" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "993" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "994" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "995" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "996" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "997" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "998" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "999" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "1000" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "1001" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "1002" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "1003" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "1004" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "1005" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "1006" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "1007" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "1008" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "1009" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "1010" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "1011" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "1012" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "1013" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "1014" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "1015" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "1016" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "1017" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "1018" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "1019" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "1020" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "1021" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "1022" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "1023" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "1024" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "1025" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "1026" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "1027" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "1028" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "1029" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "1030" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "1031" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "1032" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "1033" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "1034" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "1035" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "1036" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "1037" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "1038" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "1039" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "1040" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "1041" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "1042" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "1043" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "1044" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "1045" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "1046" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "1047" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "1048" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "1049" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "1050" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "1051" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "1052" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "1053" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "1054" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "1055" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "1056" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "1057" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "1058" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "1059" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "1060" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "1061" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "1062" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "1063" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "1064" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "1065" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "1066" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "1067" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "1068" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "1069" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "1070" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "1071" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "1072" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "1073" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "1074" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "1075" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "1076" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "1077" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "1078" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "1079" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "1080" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "1081" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "1082" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "1083" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "1084" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "1085" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "1086" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "1087" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "1088" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "1089" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "1090" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "1091" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "1092" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "1093" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "1094" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "1095" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "1096" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "1097" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "1098" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "1099" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "1100" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "1101" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "1102" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "1103" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "1104" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "1105" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "1106" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "1107" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "1108" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "1109" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "1110" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "1111" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "1112" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "1113" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "1114" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "1115" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "1116" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "1117" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "1118" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "1119" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "1120" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "1121" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "1122" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "1123" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "1124" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "1125" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "1126" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "1127" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "1128" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "1129" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "1130" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "1131" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "1132" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } Branch { Points [5, 0] Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } Branch { DstBlock "Math\nFunction2" DstPort 2 } } } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } Branch { Points [0, 80] Branch { Points [0, 150] Branch { Points [0, 155] Branch { Points [0, 175] Branch { Points [0, 180; 5, 0] Branch { Points [-5, 0; 0, 175] Branch { Points [0, 185] Branch { Points [0, 190] Branch { Points [0, 195] Branch { Points [0, 215] Branch { Points [0, 230] Branch { Points [0, 240] Branch { Points [0, 260] Branch { Points [0, 265] Branch { Points [0, 275] Branch { Points [0, 280] Branch { Points [0, 285] Branch { Points [0, 300] Branch { Points [0, 305] Branch { Points [0, 310] Branch { Points [0, 315] Branch { Points [0, 320] Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } } } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } Branch { DstBlock "Math\nFunction23" DstPort 2 } } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } Branch { DstBlock "Math\nFunction22" DstPort 2 } } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } Branch { DstBlock "Math\nFunction21" DstPort 2 } } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } Branch { DstBlock "Math\nFunction20" DstPort 2 } } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } Branch { DstBlock "Math\nFunction19" DstPort 2 } } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } Branch { DstBlock "Math\nFunction18" DstPort 2 } } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } Branch { DstBlock "Math\nFunction17" DstPort 2 } } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } Branch { DstBlock "Math\nFunction16" DstPort 2 } } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } Branch { DstBlock "Math\nFunction15" DstPort 2 } } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } Branch { DstBlock "Math\nFunction14" DstPort 2 } } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } Branch { DstBlock "Math\nFunction13" DstPort 2 } } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } Branch { DstBlock "Math\nFunction12" DstPort 2 } } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } Branch { DstBlock "Math\nFunction11" DstPort 2 } } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } Branch { DstBlock "Math\nFunction10" DstPort 2 } } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } Branch { DstBlock "Math\nFunction7" DstPort 2 } } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } } } Block { BlockType Sum Name "Sum" SID "1133" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "1134" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "1135" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "1136" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "1137" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } Branch { DstBlock "Sign" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } Branch { DstBlock "Exponent" DstPort 1 } } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { DstBlock "Data Type Conversion1" DstPort 1 } Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } Branch { DstBlock "Display3" DstPort 1 } } } } Block { BlockType Outport Name "d_P_I" SID "1138" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 Points [10, 0; 0, -5] DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "d_P_I" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem5" SID "1139" Ports [4, 1] Position [395, 991, 500, 1149] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem5" Location [528, 347, 1021, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "1140" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "1141" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "1142" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "1143" Position [25, 48, 55, 62] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "1144" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "1145" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "1146" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "1147" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "1148" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "1149" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "1150" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "1151" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "1152" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "1153" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "1154" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "1155" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "1156" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "1157" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "1158" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "1159" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "1160" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "1161" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "1162" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "1163" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "1164" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "1165" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "1166" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "1167" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "1168" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "1169" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "1170" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "1171" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "1172" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "1173" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "1174" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "1175" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "1176" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "1177" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "1178" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "1179" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "1180" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "1181" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "1182" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "1183" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "1184" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "1185" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "1186" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "1187" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "1188" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "1189" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "1190" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "1191" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "1192" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "1193" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "1194" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "1195" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "1196" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "1197" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "1198" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "1199" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "1200" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "1201" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "1202" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "1203" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "1204" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "1205" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "1206" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "1207" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "1208" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "1209" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "1210" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "1211" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "1212" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "1213" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "1214" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "1215" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "1216" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "1217" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "1218" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "1219" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "1220" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "1221" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "1222" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "1223" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "1224" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "1225" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "1226" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "1227" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "1228" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "1229" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "1230" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "1231" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "1232" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "1233" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "1234" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "1235" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "1236" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "1237" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "1238" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "1239" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "1240" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "1241" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "1242" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "1243" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "1244" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "1245" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "1246" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "1247" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "1248" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "1249" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "1250" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "1251" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "1252" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "1253" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "1254" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "1255" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "1256" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "1257" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "1258" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "1259" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "1260" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "1261" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "1262" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "1263" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "1264" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "1265" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "1266" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "1267" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "1268" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "1269" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "1270" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "1271" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "1272" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "1273" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "1274" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "1275" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "1276" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "1277" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "1278" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "1279" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "1280" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "1281" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "1282" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "1283" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "1284" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "1285" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "1286" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "1287" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "1288" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "1289" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "1290" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "1291" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "1292" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "1293" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "1294" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "1295" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "1296" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "1297" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "1298" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "1299" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "1300" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "1301" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "1302" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "1303" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "1304" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "1305" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "1306" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "1307" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "1308" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "1309" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "1310" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "1311" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "1312" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "1313" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "1314" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "1315" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "1316" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "1317" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "1318" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "1319" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "1320" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "1321" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "1322" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "1323" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "1324" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "1325" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "1326" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "1327" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "1328" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "1329" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "1330" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "1331" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "1332" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "1333" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "1334" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "1335" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "1336" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "1337" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "1338" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "1339" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "1340" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "1341" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "1342" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "1343" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "1344" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "1345" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "1346" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "1347" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "1348" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "1349" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "1350" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "1351" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "1352" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "1353" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "1354" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "1355" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "1356" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "1357" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "1358" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction7" DstPort 2 } Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction10" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction11" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction12" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction13" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction14" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction15" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction16" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction17" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction18" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction19" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction20" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction21" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction22" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction23" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 80] Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } Branch { Points [0, 150] Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } Branch { Points [0, 155] Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } Branch { Points [0, 175] Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } Branch { Points [0, 180; 5, 0] Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } Branch { Points [-5, 0; 0, 175] Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } Branch { Points [0, 185] Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } Branch { Points [0, 190] Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } Branch { Points [0, 195] Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } Branch { Points [0, 215] Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } Branch { Points [0, 230] Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } Branch { Points [0, 240] Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } Branch { Points [0, 260] Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } Branch { Points [0, 265] Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } Branch { Points [0, 275] Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } Branch { Points [0, 280] Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } Branch { Points [0, 285] Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } Branch { Points [0, 300] Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } Branch { Points [0, 305] Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } Branch { Points [0, 310] Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } Branch { Points [0, 315] Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } Branch { Points [0, 320] Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } } } } } } } } } } } } } } } } } } } } } } } Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [5, 0] Branch { DstBlock "Math\nFunction2" DstPort 2 } Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } } Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } } } } Block { BlockType Sum Name "Sum" SID "1359" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "1360" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "1361" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "1362" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "1363" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { DstBlock "Display3" DstPort 1 } Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } Branch { DstBlock "Data Type Conversion1" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { DstBlock "Exponent" DstPort 1 } Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { DstBlock "Sign" DstPort 1 } Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } } } Block { BlockType Outport Name "d_P_Q" SID "1364" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "d_P_Q" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "In4" SrcPort 1 Points [10, 0; 0, -5] DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem6" SID "1365" Ports [4, 1] Position [395, 1149, 500, 1311] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem6" Location [528, 347, 1021, 586] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "1366" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "1367" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "1368" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "1369" Position [25, 43, 55, 57] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "1370" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "1371" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "1372" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "1373" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "1374" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "1375" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "1376" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "1377" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "1378" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "1379" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "1380" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "1381" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "1382" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "1383" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "1384" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "1385" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "1386" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "1387" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "1388" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "1389" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "1390" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "1391" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "1392" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "1393" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "1394" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "1395" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "1396" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "1397" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "1398" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "1399" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "1400" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "1401" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "1402" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "1403" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "1404" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "1405" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "1406" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "1407" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "1408" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "1409" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "1410" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "1411" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "1412" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "1413" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "1414" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "1415" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "1416" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "1417" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "1418" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "1419" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "1420" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "1421" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "1422" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "1423" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "1424" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "1425" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "1426" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "1427" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "1428" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "1429" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "1430" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "1431" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "1432" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "1433" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "1434" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "1435" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "1436" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "1437" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "1438" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "1439" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "1440" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "1441" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "1442" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "1443" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "1444" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "1445" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "1446" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "1447" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "1448" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "1449" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "1450" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "1451" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "1452" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "1453" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "1454" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "1455" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "1456" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "1457" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "1458" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "1459" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "1460" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "1461" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "1462" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "1463" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "1464" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "1465" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "1466" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "1467" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "1468" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "1469" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "1470" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "1471" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "1472" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "1473" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "1474" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "1475" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "1476" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "1477" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "1478" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "1479" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "1480" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "1481" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "1482" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "1483" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "1484" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "1485" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "1486" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "1487" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "1488" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "1489" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "1490" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "1491" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "1492" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "1493" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "1494" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "1495" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "1496" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "1497" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "1498" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "1499" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "1500" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "1501" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "1502" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "1503" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "1504" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "1505" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "1506" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "1507" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "1508" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "1509" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "1510" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "1511" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "1512" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "1513" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "1514" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "1515" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "1516" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "1517" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "1518" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "1519" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "1520" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "1521" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "1522" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "1523" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "1524" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "1525" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "1526" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "1527" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "1528" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "1529" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "1530" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "1531" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "1532" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "1533" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "1534" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "1535" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "1536" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "1537" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "1538" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "1539" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "1540" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "1541" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "1542" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "1543" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "1544" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "1545" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "1546" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "1547" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "1548" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "1549" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "1550" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "1551" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "1552" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "1553" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "1554" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "1555" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "1556" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "1557" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "1558" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "1559" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "1560" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "1561" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "1562" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "1563" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "1564" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "1565" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "1566" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "1567" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "1568" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "1569" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "1570" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "1571" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "1572" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "1573" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "1574" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "1575" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "1576" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "1577" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "1578" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "1579" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "1580" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "1581" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "1582" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "1583" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "1584" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } Branch { Points [5, 0] Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } Branch { DstBlock "Math\nFunction2" DstPort 2 } } } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } Branch { Points [0, 80] Branch { Points [0, 150] Branch { Points [0, 155] Branch { Points [0, 175] Branch { Points [0, 180; 5, 0] Branch { Points [-5, 0; 0, 175] Branch { Points [0, 185] Branch { Points [0, 190] Branch { Points [0, 195] Branch { Points [0, 215] Branch { Points [0, 230] Branch { Points [0, 240] Branch { Points [0, 260] Branch { Points [0, 265] Branch { Points [0, 275] Branch { Points [0, 280] Branch { Points [0, 285] Branch { Points [0, 300] Branch { Points [0, 305] Branch { Points [0, 310] Branch { Points [0, 315] Branch { Points [0, 320] Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } } Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } } Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } } } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } Branch { DstBlock "Math\nFunction23" DstPort 2 } } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } Branch { DstBlock "Math\nFunction22" DstPort 2 } } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } Branch { DstBlock "Math\nFunction21" DstPort 2 } } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } Branch { DstBlock "Math\nFunction20" DstPort 2 } } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } Branch { DstBlock "Math\nFunction19" DstPort 2 } } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } Branch { DstBlock "Math\nFunction18" DstPort 2 } } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } Branch { DstBlock "Math\nFunction17" DstPort 2 } } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } Branch { DstBlock "Math\nFunction16" DstPort 2 } } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } Branch { DstBlock "Math\nFunction15" DstPort 2 } } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } Branch { DstBlock "Math\nFunction14" DstPort 2 } } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } Branch { DstBlock "Math\nFunction13" DstPort 2 } } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } Branch { DstBlock "Math\nFunction12" DstPort 2 } } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } Branch { DstBlock "Math\nFunction11" DstPort 2 } } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } Branch { DstBlock "Math\nFunction10" DstPort 2 } } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } Branch { DstBlock "Math\nFunction7" DstPort 2 } } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } } } Block { BlockType Sum Name "Sum" SID "1585" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "1586" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "1587" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "1588" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "1589" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } Branch { DstBlock "Sign" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } Branch { DstBlock "Exponent" DstPort 1 } } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { DstBlock "Data Type Conversion1" DstPort 1 } Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } Branch { DstBlock "Display3" DstPort 1 } } } } Block { BlockType Outport Name "d_acq_carrier_doppler_hz" SID "1590" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "d_acq_carrier_doppler_hz" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem7" SID "1591" Ports [4, 1] Position [395, 1310, 500, 1470] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem7" Location [528, 347, 1038, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "1592" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "1593" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "1594" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "1595" Position [25, 43, 55, 57] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "1596" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "1597" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "1598" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "1599" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "1600" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "1601" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "1602" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "1603" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "1604" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "1605" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "1606" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "1607" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "1608" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "1609" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "1610" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "1611" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "1612" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "1613" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "1614" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "1615" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "1616" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "1617" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "1618" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "1619" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "1620" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "1621" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "1622" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "1623" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "1624" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "1625" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "1626" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "1627" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "1628" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "1629" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "1630" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "1631" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "1632" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "1633" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "1634" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "1635" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "1636" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "1637" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "1638" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "1639" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "1640" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "1641" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "1642" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "1643" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "1644" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "1645" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "1646" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "1647" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "1648" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "1649" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "1650" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "1651" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "1652" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "1653" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "1654" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "1655" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "1656" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "1657" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "1658" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "1659" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "1660" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "1661" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "1662" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "1663" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "1664" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "1665" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "1666" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "1667" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "1668" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "1669" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "1670" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "1671" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "1672" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "1673" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "1674" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "1675" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "1676" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "1677" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "1678" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "1679" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "1680" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "1681" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "1682" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "1683" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "1684" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "1685" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "1686" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "1687" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "1688" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "1689" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "1690" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "1691" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "1692" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "1693" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "1694" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "1695" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "1696" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "1697" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "1698" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "1699" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "1700" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "1701" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "1702" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "1703" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "1704" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "1705" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "1706" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "1707" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "1708" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "1709" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "1710" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "1711" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "1712" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "1713" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "1714" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "1715" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "1716" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "1717" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "1718" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "1719" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "1720" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "1721" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "1722" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "1723" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "1724" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "1725" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "1726" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "1727" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "1728" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "1729" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "1730" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "1731" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "1732" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "1733" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "1734" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "1735" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "1736" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "1737" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "1738" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "1739" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "1740" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "1741" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "1742" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "1743" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "1744" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "1745" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "1746" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "1747" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "1748" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "1749" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "1750" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "1751" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "1752" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "1753" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "1754" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "1755" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "1756" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "1757" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "1758" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "1759" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "1760" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "1761" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "1762" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "1763" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "1764" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "1765" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "1766" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "1767" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "1768" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "1769" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "1770" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "1771" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "1772" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "1773" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "1774" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "1775" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "1776" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "1777" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "1778" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "1779" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "1780" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "1781" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "1782" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "1783" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "1784" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "1785" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "1786" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "1787" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "1788" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "1789" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "1790" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "1791" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "1792" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "1793" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "1794" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "1795" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "1796" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "1797" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "1798" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "1799" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "1800" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "1801" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "1802" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "1803" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "1804" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "1805" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "1806" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "1807" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "1808" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "1809" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "1810" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction7" DstPort 2 } Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction10" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction11" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction12" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction13" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction14" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction15" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction16" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction17" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction18" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction19" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction20" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction21" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction22" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction23" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 80] Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } Branch { Points [0, 150] Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } Branch { Points [0, 155] Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } Branch { Points [0, 175] Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } Branch { Points [0, 180; 5, 0] Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } Branch { Points [-5, 0; 0, 175] Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } Branch { Points [0, 185] Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } Branch { Points [0, 190] Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } Branch { Points [0, 195] Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } Branch { Points [0, 215] Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } Branch { Points [0, 230] Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } Branch { Points [0, 240] Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } Branch { Points [0, 260] Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } Branch { Points [0, 265] Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } Branch { Points [0, 275] Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } Branch { Points [0, 280] Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } Branch { Points [0, 285] Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } Branch { Points [0, 300] Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } Branch { Points [0, 305] Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } Branch { Points [0, 310] Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } Branch { Points [0, 315] Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } Branch { Points [0, 320] Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } } } } } } } } } } } } } } } } } } } } } } } Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [5, 0] Branch { DstBlock "Math\nFunction2" DstPort 2 } Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } } Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } } } } Block { BlockType Sum Name "Sum" SID "1811" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "1812" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "1813" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "1814" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "1815" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { DstBlock "Display3" DstPort 1 } Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } Branch { DstBlock "Data Type Conversion1" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { DstBlock "Exponent" DstPort 1 } Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { DstBlock "Sign" DstPort 1 } Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } } } Block { BlockType Outport Name "enable_tracking" SID "1816" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "enable_tracking" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } } } Block { BlockType SubSystem Name "Subsystem8" SID "1817" Ports [4, 1] Position [395, 31, 500, 189] ShowName off MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem8" Location [528, 347, 1021, 603] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "1818" Position [25, 178, 55, 192] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "1819" Position [25, 133, 55, 147] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "1820" Position [25, 88, 55, 102] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "1821" Position [25, 48, 55, 62] Port "4" IconDisplay "Port number" } Block { BlockType DataTypeConversion Name "Data Type \nConversion1" SID "1822" Position [100, 75, 140, 115] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion2" SID "1823" Position [100, 120, 140, 160] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion3" SID "1824" Position [100, 165, 140, 205] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion4" SID "1825" Position [100, 30, 140, 70] ShowName off OutDataTypeStr "single" } Block { BlockType DataTypeConversion Name "Data Type \nConversion5" SID "1826" Position [365, 100, 405, 140] ShowName off OutDataTypeStr "single" } Block { BlockType SubSystem Name "hex2float" SID "1827" Ports [4, 1] Position [190, 25, 320, 210] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "hex2float" Location [13, 125, 1281, 839] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "1828" Position [50, 48, 80, 62] IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "1829" Position [25, 248, 55, 262] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "In3" SID "1830" Position [50, 433, 80, 447] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "In4" SID "1831" Position [50, 528, 80, 542] Port "4" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator" SID "1832" Ports [1, 1] Position [375, 161, 415, 199] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "1833" Ports [1, 1] Position [255, 251, 295, 289] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator2" SID "1834" Ports [1, 1] Position [285, 26, 325, 64] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('10000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator3" SID "1835" Ports [1, 1] Position [255, 336, 295, 374] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('01111111')" BitMaskRealWorld "Stored Integer" } Block { BlockType Constant Name "Constant4" SID "1836" Position [855, 280, 885, 310] Value "127" } Block { BlockType Constant Name "Constant5" SID "1837" Position [650, 655, 740, 685] Value "8388608" } Block { BlockType Constant Name "Constant7" SID "1838" Position [740, 45, 770, 75] Value "-1" } Block { BlockType DataTypeConversion Name "Data Type Conversion" SID "1839" Position [105, 38, 180, 72] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion1" SID "1840" Position [105, 238, 180, 272] OutDataTypeStr "uint8" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion2" SID "1841" Position [110, 333, 185, 367] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion3" SID "1842" Position [105, 423, 180, 457] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion4" SID "1843" Position [105, 518, 180, 552] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion5" SID "1844" Position [800, 653, 875, 687] OutDataTypeStr "uint32" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType DataTypeConversion Name "Data Type Conversion7" SID "1845" Position [670, 118, 745, 152] OutDataTypeStr "double" RndMeth "Floor" SaturateOnIntegerOverflow off } Block { BlockType Display Name "Display3" SID "1846" Ports [1] Position [460, 162, 550, 188] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "1847" Ports [1] Position [670, 217, 760, 243] Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Exponent" SID "1848" Ports [1] Position [715, 282, 805, 308] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Display Name "Mantissa" SID "1849" Ports [1] Position [1015, 558, 1295, 592] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction" SID "1850" Ports [2, 1] Position [825, 102, 855, 133] Operator "pow" } Block { BlockType Product Name "Product" SID "1851" Ports [2, 1] Position [1225, 277, 1255, 308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Reference Name "Shift\nArithmetic" SID "1852" Ports [1, 1] Position [565, 215, 645, 255] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-1" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic1" SID "1853" Ports [1, 1] Position [335, 255, 415, 295] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic2" SID "1854" Ports [1, 1] Position [360, 25, 440, 65] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "7" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic3" SID "1855" Ports [1, 1] Position [370, 335, 450, 375] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-16" nBinPtShiftRight "0" } Block { BlockType Reference Name "Shift\nArithmetic4" SID "1856" Ports [1, 1] Position [375, 420, 455, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Shift\nArithmetic" SourceType "Shift Arithmetic" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off nBitShiftRight "-8" nBinPtShiftRight "0" } Block { BlockType Display Name "Sign" SID "1857" Ports [1] Position [480, 32, 570, 58] BackgroundColor "cyan" Format "binary (Stored Integer)" Decimation "1" Lockdown off } Block { BlockType SubSystem Name "Subsystem" SID "1858" Ports [2, 1] Position [1125, 350, 1165, 410] MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "Subsystem" Location [2, 82, 1653, 1004] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" Block { BlockType Inport Name "In1" SID "1859" Position [25, 235, 55, 250] BlockRotation 270 IconDisplay "Port number" } Block { BlockType Inport Name "In2" SID "1860" Position [220, 358, 250, 372] Port "2" IconDisplay "Port number" } Block { BlockType Reference Name "Bitwise\nOperator1" SID "1861" Ports [1, 1] Position [410, 241, 450, 279] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0100000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator10" SID "1862" Ports [1, 1] Position [425, 1086, 465, 1124] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000001000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator11" SID "1863" Ports [1, 1] Position [425, 1266, 465, 1304] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000100000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator12" SID "1864" Ports [1, 1] Position [425, 1446, 465, 1484] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000010000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator13" SID "1865" Ports [1, 1] Position [425, 1636, 465, 1674] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000001000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator14" SID "1866" Ports [1, 1] Position [425, 1836, 465, 1874] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000100000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator15" SID "1867" Ports [1, 1] Position [425, 2046, 465, 2084] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000010000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator16" SID "1868" Ports [1, 1] Position [425, 2276, 465, 2314] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000001000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator17" SID "1869" Ports [1, 1] Position [425, 2521, 465, 2559] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000100000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator18" SID "1870" Ports [1, 1] Position [425, 2776, 465, 2814] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000010000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator19" SID "1871" Ports [1, 1] Position [425, 3041, 465, 3079] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000001000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator20" SID "1872" Ports [1, 1] Position [425, 3316, 465, 3354] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000100000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator21" SID "1873" Ports [1, 1] Position [425, 3596, 465, 3634] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000010000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator22" SID "1874" Ports [1, 1] Position [425, 3886, 465, 3924] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000001000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator23" SID "1875" Ports [1, 1] Position [425, 4181, 465, 4219] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000100000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator24" SID "1876" Ports [1, 1] Position [425, 4486, 465, 4524] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000010000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator25" SID "1877" Ports [1, 1] Position [425, 4796, 465, 4834] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000001000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator26" SID "1878" Ports [1, 1] Position [430, 5111, 470, 5149] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000100')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator27" SID "1879" Ports [1, 1] Position [430, 5431, 470, 5469] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000010')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator28" SID "1880" Ports [1, 1] Position [430, 5756, 470, 5794] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000000000000000000000001')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator6" SID "1881" Ports [1, 1] Position [415, 426, 455, 464] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0010000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator7" SID "1882" Ports [1, 1] Position [415, 576, 455, 614] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0001000000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator8" SID "1883" Ports [1, 1] Position [420, 736, 460, 774] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000100000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Bitwise\nOperator9" SID "1884" Ports [1, 1] Position [425, 906, 465, 944] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Bitwise\nOperator" SourceType "Bitwise Operator" logicop "AND" UseBitMask on NumInputPorts "1" BitMask "bin2dec('0000010000000000000000000')" BitMaskRealWorld "Stored Integer" } Block { BlockType Reference Name "Compare\nTo Zero1" SID "1885" Ports [1, 1] Position [480, 245, 510, 275] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero10" SID "1886" Ports [1, 1] Position [495, 1840, 525, 1870] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero11" SID "1887" Ports [1, 1] Position [495, 2050, 525, 2080] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero12" SID "1888" Ports [1, 1] Position [495, 2280, 525, 2310] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero13" SID "1889" Ports [1, 1] Position [495, 2525, 525, 2555] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero14" SID "1890" Ports [1, 1] Position [495, 2780, 525, 2810] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero15" SID "1891" Ports [1, 1] Position [495, 3045, 525, 3075] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero16" SID "1892" Ports [1, 1] Position [495, 3320, 525, 3350] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero17" SID "1893" Ports [1, 1] Position [495, 3600, 525, 3630] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero18" SID "1894" Ports [1, 1] Position [495, 3890, 525, 3920] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero19" SID "1895" Ports [1, 1] Position [495, 4185, 525, 4215] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero2" SID "1896" Ports [1, 1] Position [485, 430, 515, 460] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero20" SID "1897" Ports [1, 1] Position [495, 4490, 525, 4520] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero21" SID "1898" Ports [1, 1] Position [495, 4800, 525, 4830] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero22" SID "1899" Ports [1, 1] Position [500, 5115, 530, 5145] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero23" SID "1900" Ports [1, 1] Position [500, 5435, 530, 5465] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero24" SID "1901" Ports [1, 1] Position [500, 5760, 530, 5790] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero3" SID "1902" Ports [1, 1] Position [485, 580, 515, 610] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero4" SID "1903" Ports [1, 1] Position [490, 740, 520, 770] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero5" SID "1904" Ports [1, 1] Position [495, 910, 525, 940] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero6" SID "1905" Ports [1, 1] Position [495, 1090, 525, 1120] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero7" SID "1906" Ports [1, 1] Position [495, 1270, 525, 1300] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero8" SID "1907" Ports [1, 1] Position [495, 1450, 525, 1480] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Reference Name "Compare\nTo Zero9" SID "1908" Ports [1, 1] Position [495, 1640, 525, 1670] LibraryVersion "1.302" SourceBlock "simulink/Logic and Bit\nOperations/Compare\nTo Zero" SourceType "Compare To Zero" ShowPortLabels "FromPortIcon" SystemSampleTime "-1" FunctionWithSeparateData off RTWMemSecFuncInitTerm "Inherit from model" RTWMemSecFuncExecute "Inherit from model" RTWMemSecDataConstants "Inherit from model" RTWMemSecDataInternal "Inherit from model" RTWMemSecDataParameters "Inherit from model" GeneratePreprocessorConditionals off relop ">" LogicOutDataTypeMode "uint8" ZeroCross off } Block { BlockType Constant Name "Constant1" SID "1909" Position [360, 145, 390, 175] Value "2" } Block { BlockType Constant Name "Constant10" SID "1910" Position [365, 480, 395, 510] Value "2" } Block { BlockType Constant Name "Constant11" SID "1911" Position [335, 550, 365, 580] } Block { BlockType Constant Name "Constant12" SID "1912" Position [370, 640, 400, 670] Value "2" } Block { BlockType Constant Name "Constant13" SID "1913" Position [340, 710, 370, 740] } Block { BlockType Constant Name "Constant14" SID "1914" Position [375, 810, 405, 840] Value "2" } Block { BlockType Constant Name "Constant15" SID "1915" Position [345, 880, 375, 910] } Block { BlockType Constant Name "Constant16" SID "1916" Position [375, 990, 405, 1020] Value "2" } Block { BlockType Constant Name "Constant17" SID "1917" Position [345, 1060, 375, 1090] } Block { BlockType Constant Name "Constant18" SID "1918" Position [375, 1170, 405, 1200] Value "2" } Block { BlockType Constant Name "Constant19" SID "1919" Position [345, 1240, 375, 1270] } Block { BlockType Constant Name "Constant2" SID "1920" Position [345, 400, 375, 430] } Block { BlockType Constant Name "Constant20" SID "1921" Position [375, 1350, 405, 1380] Value "2" } Block { BlockType Constant Name "Constant21" SID "1922" Position [345, 1420, 375, 1450] } Block { BlockType Constant Name "Constant22" SID "1923" Position [375, 1540, 405, 1570] Value "2" } Block { BlockType Constant Name "Constant23" SID "1924" Position [345, 1610, 375, 1640] } Block { BlockType Constant Name "Constant24" SID "1925" Position [375, 1740, 405, 1770] Value "2" } Block { BlockType Constant Name "Constant25" SID "1926" Position [345, 1810, 375, 1840] } Block { BlockType Constant Name "Constant26" SID "1927" Position [375, 1950, 405, 1980] Value "2" } Block { BlockType Constant Name "Constant27" SID "1928" Position [345, 2020, 375, 2050] } Block { BlockType Constant Name "Constant28" SID "1929" Position [375, 2180, 405, 2210] Value "2" } Block { BlockType Constant Name "Constant29" SID "1930" Position [345, 2250, 375, 2280] } Block { BlockType Constant Name "Constant30" SID "1931" Position [375, 2425, 405, 2455] Value "2" } Block { BlockType Constant Name "Constant31" SID "1932" Position [345, 2495, 375, 2525] } Block { BlockType Constant Name "Constant32" SID "1933" Position [375, 2680, 405, 2710] Value "2" } Block { BlockType Constant Name "Constant33" SID "1934" Position [345, 2750, 375, 2780] } Block { BlockType Constant Name "Constant34" SID "1935" Position [375, 2945, 405, 2975] Value "2" } Block { BlockType Constant Name "Constant35" SID "1936" Position [345, 3015, 375, 3045] } Block { BlockType Constant Name "Constant36" SID "1937" Position [375, 3220, 405, 3250] Value "2" } Block { BlockType Constant Name "Constant37" SID "1938" Position [345, 3290, 375, 3320] } Block { BlockType Constant Name "Constant38" SID "1939" Position [375, 3500, 405, 3530] Value "2" } Block { BlockType Constant Name "Constant39" SID "1940" Position [345, 3570, 375, 3600] } Block { BlockType Constant Name "Constant40" SID "1941" Position [375, 3790, 405, 3820] Value "2" } Block { BlockType Constant Name "Constant41" SID "1942" Position [345, 3860, 375, 3890] } Block { BlockType Constant Name "Constant42" SID "1943" Position [375, 4085, 405, 4115] Value "2" } Block { BlockType Constant Name "Constant43" SID "1944" Position [345, 4155, 375, 4185] } Block { BlockType Constant Name "Constant44" SID "1945" Position [375, 4390, 405, 4420] Value "2" } Block { BlockType Constant Name "Constant45" SID "1946" Position [345, 4460, 375, 4490] } Block { BlockType Constant Name "Constant46" SID "1947" Position [375, 4700, 405, 4730] Value "2" } Block { BlockType Constant Name "Constant47" SID "1948" Position [345, 4770, 375, 4800] } Block { BlockType Constant Name "Constant48" SID "1949" Position [380, 5015, 410, 5045] Value "2" } Block { BlockType Constant Name "Constant49" SID "1950" Position [350, 5085, 380, 5115] } Block { BlockType Constant Name "Constant50" SID "1951" Position [380, 5335, 410, 5365] Value "2" } Block { BlockType Constant Name "Constant51" SID "1952" Position [350, 5405, 380, 5435] } Block { BlockType Constant Name "Constant52" SID "1953" Position [380, 5660, 410, 5690] Value "2" } Block { BlockType Constant Name "Constant53" SID "1954" Position [350, 5730, 380, 5760] } Block { BlockType Constant Name "Constant8" SID "1955" Position [365, 330, 395, 360] Value "2" } Block { BlockType Display Name "Display1" SID "1956" Ports [1] Position [730, 507, 820, 533] Decimation "1" Lockdown off } Block { BlockType Display Name "Display2" SID "1957" Ports [1] Position [775, 657, 865, 683] Decimation "1" Lockdown off } Block { BlockType Display Name "Display3" SID "1958" Ports [1] Position [740, 857, 830, 883] Decimation "1" Lockdown off } Block { BlockType Display Name "Display4" SID "1959" Ports [1] Position [770, 1057, 860, 1083] Decimation "1" Lockdown off } Block { BlockType Display Name "Display5" SID "1960" Ports [1] Position [735, 332, 825, 358] Decimation "1" Lockdown off } Block { BlockType Display Name "Display6" SID "1961" Ports [1] Position [770, 1187, 860, 1213] Decimation "1" Lockdown off } Block { BlockType Display Name "Display7" SID "1962" Ports [1] Position [640, 197, 730, 223] Decimation "1" Lockdown off } Block { BlockType Display Name "Display8" SID "1963" Ports [1] Position [490, 317, 580, 343] Decimation "1" Lockdown off } Block { BlockType Math Name "Math\nFunction1" SID "1964" Ports [2, 1] Position [420, 177, 450, 208] Operator "pow" } Block { BlockType Math Name "Math\nFunction10" SID "1965" Ports [2, 1] Position [435, 1772, 465, 1803] Operator "pow" } Block { BlockType Math Name "Math\nFunction11" SID "1966" Ports [2, 1] Position [435, 1982, 465, 2013] Operator "pow" } Block { BlockType Math Name "Math\nFunction12" SID "1967" Ports [2, 1] Position [435, 2212, 465, 2243] Operator "pow" } Block { BlockType Math Name "Math\nFunction13" SID "1968" Ports [2, 1] Position [435, 2457, 465, 2488] Operator "pow" } Block { BlockType Math Name "Math\nFunction14" SID "1969" Ports [2, 1] Position [435, 2712, 465, 2743] Operator "pow" } Block { BlockType Math Name "Math\nFunction15" SID "1970" Ports [2, 1] Position [435, 2977, 465, 3008] Operator "pow" } Block { BlockType Math Name "Math\nFunction16" SID "1971" Ports [2, 1] Position [435, 3252, 465, 3283] Operator "pow" } Block { BlockType Math Name "Math\nFunction17" SID "1972" Ports [2, 1] Position [435, 3532, 465, 3563] Operator "pow" } Block { BlockType Math Name "Math\nFunction18" SID "1973" Ports [2, 1] Position [435, 3822, 465, 3853] Operator "pow" } Block { BlockType Math Name "Math\nFunction19" SID "1974" Ports [2, 1] Position [435, 4117, 465, 4148] Operator "pow" } Block { BlockType Math Name "Math\nFunction2" SID "1975" Ports [2, 1] Position [425, 362, 455, 393] Operator "pow" } Block { BlockType Math Name "Math\nFunction20" SID "1976" Ports [2, 1] Position [435, 4422, 465, 4453] Operator "pow" } Block { BlockType Math Name "Math\nFunction21" SID "1977" Ports [2, 1] Position [435, 4732, 465, 4763] Operator "pow" } Block { BlockType Math Name "Math\nFunction22" SID "1978" Ports [2, 1] Position [440, 5047, 470, 5078] Operator "pow" } Block { BlockType Math Name "Math\nFunction23" SID "1979" Ports [2, 1] Position [440, 5367, 470, 5398] Operator "pow" } Block { BlockType Math Name "Math\nFunction24" SID "1980" Ports [2, 1] Position [440, 5692, 470, 5723] Operator "pow" } Block { BlockType Math Name "Math\nFunction3" SID "1981" Ports [2, 1] Position [425, 512, 455, 543] Operator "pow" } Block { BlockType Math Name "Math\nFunction4" SID "1982" Ports [2, 1] Position [430, 672, 460, 703] Operator "pow" } Block { BlockType Math Name "Math\nFunction5" SID "1983" Ports [2, 1] Position [435, 842, 465, 873] Operator "pow" } Block { BlockType Math Name "Math\nFunction6" SID "1984" Ports [2, 1] Position [435, 1022, 465, 1053] Operator "pow" } Block { BlockType Math Name "Math\nFunction7" SID "1985" Ports [2, 1] Position [435, 1202, 465, 1233] Operator "pow" } Block { BlockType Math Name "Math\nFunction8" SID "1986" Ports [2, 1] Position [435, 1382, 465, 1413] Operator "pow" } Block { BlockType Math Name "Math\nFunction9" SID "1987" Ports [2, 1] Position [435, 1572, 465, 1603] Operator "pow" } Block { BlockType Product Name "Product1" SID "1988" Ports [2, 1] Position [555, 202, 585, 233] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product10" SID "1989" Ports [2, 1] Position [570, 1797, 600, 1828] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product11" SID "1990" Ports [2, 1] Position [570, 2007, 600, 2038] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product12" SID "1991" Ports [2, 1] Position [570, 2237, 600, 2268] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product13" SID "1992" Ports [2, 1] Position [570, 2482, 600, 2513] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product14" SID "1993" Ports [2, 1] Position [570, 2737, 600, 2768] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product15" SID "1994" Ports [2, 1] Position [570, 3002, 600, 3033] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product16" SID "1995" Ports [2, 1] Position [570, 3277, 600, 3308] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product17" SID "1996" Ports [2, 1] Position [570, 3557, 600, 3588] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product18" SID "1997" Ports [2, 1] Position [570, 3847, 600, 3878] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product19" SID "1998" Ports [2, 1] Position [570, 4142, 600, 4173] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product2" SID "1999" Ports [2, 1] Position [560, 387, 590, 418] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product20" SID "2000" Ports [2, 1] Position [570, 4447, 600, 4478] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product21" SID "2001" Ports [2, 1] Position [570, 4757, 600, 4788] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product22" SID "2002" Ports [2, 1] Position [575, 5072, 605, 5103] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product23" SID "2003" Ports [2, 1] Position [575, 5392, 605, 5423] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product24" SID "2004" Ports [2, 1] Position [575, 5717, 605, 5748] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product3" SID "2005" Ports [2, 1] Position [560, 537, 590, 568] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product4" SID "2006" Ports [2, 1] Position [565, 697, 595, 728] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product5" SID "2007" Ports [2, 1] Position [570, 867, 600, 898] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product6" SID "2008" Ports [2, 1] Position [570, 1047, 600, 1078] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product7" SID "2009" Ports [2, 1] Position [570, 1227, 600, 1258] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product8" SID "2010" Ports [2, 1] Position [570, 1407, 600, 1438] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Product Name "Product9" SID "2011" Ports [2, 1] Position [570, 1597, 600, 1628] InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "2012" Ports [2, 1] Position [380, 380, 400, 400] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum10" SID "2013" Ports [2, 1] Position [380, 1400, 400, 1420] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum11" SID "2014" Ports [2, 1] Position [380, 1590, 400, 1610] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum12" SID "2015" Ports [2, 1] Position [380, 1790, 400, 1810] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum13" SID "2016" Ports [2, 1] Position [380, 2000, 400, 2020] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum14" SID "2017" Ports [2, 1] Position [380, 2230, 400, 2250] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum15" SID "2018" Ports [2, 1] Position [380, 2475, 400, 2495] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum16" SID "2019" Ports [2, 1] Position [380, 2730, 400, 2750] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum17" SID "2020" Ports [2, 1] Position [380, 2995, 400, 3015] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum18" SID "2021" Ports [2, 1] Position [380, 3270, 400, 3290] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum19" SID "2022" Ports [2, 1] Position [380, 3550, 400, 3570] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum20" SID "2023" Ports [2, 1] Position [380, 3840, 400, 3860] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum21" SID "2024" Ports [2, 1] Position [380, 4135, 400, 4155] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum22" SID "2025" Ports [2, 1] Position [380, 4440, 400, 4460] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum23" SID "2026" Ports [2, 1] Position [380, 4750, 400, 4770] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum24" SID "2027" Ports [2, 1] Position [385, 5065, 405, 5085] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum25" SID "2028" Ports [2, 1] Position [385, 5385, 405, 5405] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum26" SID "2029" Ports [2, 1] Position [385, 5710, 405, 5730] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum27" SID "2030" Ports [24, 1] Position [760, 3171, 820, 3479] ShowName off Inputs "|++++++++++++++++++++++++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum5" SID "2031" Ports [2, 1] Position [370, 530, 390, 550] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum6" SID "2032" Ports [2, 1] Position [375, 690, 395, 710] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum7" SID "2033" Ports [2, 1] Position [380, 860, 400, 880] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum8" SID "2034" Ports [2, 1] Position [380, 1040, 400, 1060] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum9" SID "2035" Ports [2, 1] Position [380, 1220, 400, 1240] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "2036" Position [845, 3318, 875, 3332] IconDisplay "Port number" } Line { SrcBlock "Constant8" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction2" DstPort 1 } Line { SrcBlock "Bitwise\nOperator6" SrcPort 1 DstBlock "Compare\nTo Zero2" DstPort 1 } Line { SrcBlock "Compare\nTo Zero2" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product2" DstPort 2 } Line { SrcBlock "Math\nFunction2" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product2" DstPort 1 } Line { SrcBlock "Constant10" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction3" DstPort 1 } Line { SrcBlock "Bitwise\nOperator7" SrcPort 1 DstBlock "Compare\nTo Zero3" DstPort 1 } Line { SrcBlock "Compare\nTo Zero3" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product3" DstPort 2 } Line { SrcBlock "Math\nFunction3" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product3" DstPort 1 } Line { SrcBlock "Constant11" SrcPort 1 DstBlock "Sum5" DstPort 2 } Line { SrcBlock "Sum5" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, 10; -40, 0] DstBlock "Sum6" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction3" DstPort 2 } } Line { SrcBlock "Constant12" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction4" DstPort 1 } Line { SrcBlock "Bitwise\nOperator8" SrcPort 1 DstBlock "Compare\nTo Zero4" DstPort 1 } Line { SrcBlock "Compare\nTo Zero4" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product4" DstPort 2 } Line { SrcBlock "Math\nFunction4" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product4" DstPort 1 } Line { SrcBlock "Constant13" SrcPort 1 DstBlock "Sum6" DstPort 2 } Line { SrcBlock "Sum6" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-40, 0] DstBlock "Sum7" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction4" DstPort 2 } } Line { SrcBlock "Constant14" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction5" DstPort 1 } Line { SrcBlock "Bitwise\nOperator9" SrcPort 1 DstBlock "Compare\nTo Zero5" DstPort 1 } Line { SrcBlock "Compare\nTo Zero5" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product5" DstPort 2 } Line { SrcBlock "Math\nFunction5" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product5" DstPort 1 } Line { SrcBlock "Constant15" SrcPort 1 DstBlock "Sum7" DstPort 2 } Line { SrcBlock "Sum7" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum8" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction5" DstPort 2 } } Line { SrcBlock "Constant16" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction6" DstPort 1 } Line { SrcBlock "Bitwise\nOperator10" SrcPort 1 DstBlock "Compare\nTo Zero6" DstPort 1 } Line { SrcBlock "Compare\nTo Zero6" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product6" DstPort 2 } Line { SrcBlock "Math\nFunction6" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product6" DstPort 1 } Line { SrcBlock "Constant17" SrcPort 1 DstBlock "Sum8" DstPort 2 } Line { SrcBlock "Sum8" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [-45, 0] DstBlock "Sum9" DstPort 1 } Branch { Points [0, -5] DstBlock "Math\nFunction6" DstPort 2 } } Line { SrcBlock "Constant18" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction7" DstPort 1 } Line { SrcBlock "Bitwise\nOperator11" SrcPort 1 DstBlock "Compare\nTo Zero7" DstPort 1 } Line { SrcBlock "Compare\nTo Zero7" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product7" DstPort 2 } Line { SrcBlock "Math\nFunction7" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product7" DstPort 1 } Line { SrcBlock "Constant19" SrcPort 1 DstBlock "Sum9" DstPort 2 } Line { SrcBlock "Sum9" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction7" DstPort 2 } Branch { Points [0, 5; -50, 0] DstBlock "Sum10" DstPort 1 } } Line { SrcBlock "Constant20" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction8" DstPort 1 } Line { SrcBlock "Bitwise\nOperator12" SrcPort 1 DstBlock "Compare\nTo Zero8" DstPort 1 } Line { SrcBlock "Compare\nTo Zero8" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product8" DstPort 2 } Line { SrcBlock "Math\nFunction8" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product8" DstPort 1 } Line { SrcBlock "Constant21" SrcPort 1 DstBlock "Sum10" DstPort 2 } Line { SrcBlock "Sum10" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction8" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum11" DstPort 1 } } Line { SrcBlock "Constant22" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction9" DstPort 1 } Line { SrcBlock "Bitwise\nOperator13" SrcPort 1 DstBlock "Compare\nTo Zero9" DstPort 1 } Line { SrcBlock "Compare\nTo Zero9" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product9" DstPort 2 } Line { SrcBlock "Math\nFunction9" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product9" DstPort 1 } Line { SrcBlock "Constant23" SrcPort 1 DstBlock "Sum11" DstPort 2 } Line { SrcBlock "Sum11" SrcPort 1 Points [0, 0; 5, 0] Branch { Points [0, -5] DstBlock "Math\nFunction9" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum12" DstPort 1 } } Line { SrcBlock "Constant24" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction10" DstPort 1 } Line { SrcBlock "Bitwise\nOperator14" SrcPort 1 DstBlock "Compare\nTo Zero10" DstPort 1 } Line { SrcBlock "Compare\nTo Zero10" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product10" DstPort 2 } Line { SrcBlock "Math\nFunction10" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product10" DstPort 1 } Line { SrcBlock "Constant25" SrcPort 1 DstBlock "Sum12" DstPort 2 } Line { SrcBlock "Sum12" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction10" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum13" DstPort 1 } } Line { SrcBlock "Constant26" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction11" DstPort 1 } Line { SrcBlock "Bitwise\nOperator15" SrcPort 1 DstBlock "Compare\nTo Zero11" DstPort 1 } Line { SrcBlock "Compare\nTo Zero11" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product11" DstPort 2 } Line { SrcBlock "Math\nFunction11" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product11" DstPort 1 } Line { SrcBlock "Constant27" SrcPort 1 DstBlock "Sum13" DstPort 2 } Line { SrcBlock "Sum13" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction11" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum14" DstPort 1 } } Line { SrcBlock "Constant28" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction12" DstPort 1 } Line { SrcBlock "Bitwise\nOperator16" SrcPort 1 DstBlock "Compare\nTo Zero12" DstPort 1 } Line { SrcBlock "Compare\nTo Zero12" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product12" DstPort 2 } Line { SrcBlock "Math\nFunction12" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product12" DstPort 1 } Line { SrcBlock "Constant29" SrcPort 1 DstBlock "Sum14" DstPort 2 } Line { SrcBlock "Sum14" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction12" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum15" DstPort 1 } } Line { SrcBlock "Constant30" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction13" DstPort 1 } Line { SrcBlock "Bitwise\nOperator17" SrcPort 1 DstBlock "Compare\nTo Zero13" DstPort 1 } Line { SrcBlock "Compare\nTo Zero13" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product13" DstPort 2 } Line { SrcBlock "Math\nFunction13" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product13" DstPort 1 } Line { SrcBlock "Constant31" SrcPort 1 DstBlock "Sum15" DstPort 2 } Line { SrcBlock "Sum15" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction13" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum16" DstPort 1 } } Line { SrcBlock "Constant32" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction14" DstPort 1 } Line { SrcBlock "Bitwise\nOperator18" SrcPort 1 DstBlock "Compare\nTo Zero14" DstPort 1 } Line { SrcBlock "Compare\nTo Zero14" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product14" DstPort 2 } Line { SrcBlock "Math\nFunction14" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product14" DstPort 1 } Line { SrcBlock "Constant33" SrcPort 1 DstBlock "Sum16" DstPort 2 } Line { SrcBlock "Sum16" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction14" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum17" DstPort 1 } } Line { SrcBlock "Constant34" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction15" DstPort 1 } Line { SrcBlock "Bitwise\nOperator19" SrcPort 1 DstBlock "Compare\nTo Zero15" DstPort 1 } Line { SrcBlock "Compare\nTo Zero15" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product15" DstPort 2 } Line { SrcBlock "Math\nFunction15" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product15" DstPort 1 } Line { SrcBlock "Constant35" SrcPort 1 DstBlock "Sum17" DstPort 2 } Line { SrcBlock "Sum17" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction15" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum18" DstPort 1 } } Line { SrcBlock "Constant36" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction16" DstPort 1 } Line { SrcBlock "Bitwise\nOperator20" SrcPort 1 DstBlock "Compare\nTo Zero16" DstPort 1 } Line { SrcBlock "Compare\nTo Zero16" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product16" DstPort 2 } Line { SrcBlock "Math\nFunction16" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product16" DstPort 1 } Line { SrcBlock "Constant37" SrcPort 1 DstBlock "Sum18" DstPort 2 } Line { SrcBlock "Sum18" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction16" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum19" DstPort 1 } } Line { SrcBlock "Constant38" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction17" DstPort 1 } Line { SrcBlock "Bitwise\nOperator21" SrcPort 1 DstBlock "Compare\nTo Zero17" DstPort 1 } Line { SrcBlock "Compare\nTo Zero17" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product17" DstPort 2 } Line { SrcBlock "Math\nFunction17" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product17" DstPort 1 } Line { SrcBlock "Constant39" SrcPort 1 DstBlock "Sum19" DstPort 2 } Line { SrcBlock "Sum19" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction17" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum20" DstPort 1 } } Line { SrcBlock "Constant40" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction18" DstPort 1 } Line { SrcBlock "Bitwise\nOperator22" SrcPort 1 DstBlock "Compare\nTo Zero18" DstPort 1 } Line { SrcBlock "Compare\nTo Zero18" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product18" DstPort 2 } Line { SrcBlock "Math\nFunction18" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product18" DstPort 1 } Line { SrcBlock "Constant41" SrcPort 1 DstBlock "Sum20" DstPort 2 } Line { SrcBlock "Sum20" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction18" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum21" DstPort 1 } } Line { SrcBlock "Constant42" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction19" DstPort 1 } Line { SrcBlock "Bitwise\nOperator23" SrcPort 1 DstBlock "Compare\nTo Zero19" DstPort 1 } Line { SrcBlock "Compare\nTo Zero19" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product19" DstPort 2 } Line { SrcBlock "Math\nFunction19" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product19" DstPort 1 } Line { SrcBlock "Constant43" SrcPort 1 DstBlock "Sum21" DstPort 2 } Line { SrcBlock "Sum21" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction19" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum22" DstPort 1 } } Line { SrcBlock "Constant44" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction20" DstPort 1 } Line { SrcBlock "Bitwise\nOperator24" SrcPort 1 DstBlock "Compare\nTo Zero20" DstPort 1 } Line { SrcBlock "Compare\nTo Zero20" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product20" DstPort 2 } Line { SrcBlock "Math\nFunction20" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product20" DstPort 1 } Line { SrcBlock "Constant45" SrcPort 1 DstBlock "Sum22" DstPort 2 } Line { SrcBlock "Sum22" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction20" DstPort 2 } Branch { Points [-45, 0] DstBlock "Sum23" DstPort 1 } } Line { SrcBlock "Constant46" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction21" DstPort 1 } Line { SrcBlock "Bitwise\nOperator25" SrcPort 1 DstBlock "Compare\nTo Zero21" DstPort 1 } Line { SrcBlock "Compare\nTo Zero21" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product21" DstPort 2 } Line { SrcBlock "Math\nFunction21" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product21" DstPort 1 } Line { SrcBlock "Constant47" SrcPort 1 DstBlock "Sum23" DstPort 2 } Line { SrcBlock "Sum23" SrcPort 1 Points [5, 0; 0, -5] Branch { DstBlock "Math\nFunction21" DstPort 2 } Branch { Points [-40, 0] DstBlock "Sum24" DstPort 1 } } Line { SrcBlock "Constant48" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction22" DstPort 1 } Line { SrcBlock "Bitwise\nOperator26" SrcPort 1 DstBlock "Compare\nTo Zero22" DstPort 1 } Line { SrcBlock "Compare\nTo Zero22" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product22" DstPort 2 } Line { SrcBlock "Math\nFunction22" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product22" DstPort 1 } Line { SrcBlock "Constant49" SrcPort 1 DstBlock "Sum24" DstPort 2 } Line { SrcBlock "Sum24" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction22" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum25" DstPort 1 } } Line { SrcBlock "Constant50" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction23" DstPort 1 } Line { SrcBlock "Bitwise\nOperator27" SrcPort 1 DstBlock "Compare\nTo Zero23" DstPort 1 } Line { SrcBlock "Compare\nTo Zero23" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product23" DstPort 2 } Line { SrcBlock "Math\nFunction23" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product23" DstPort 1 } Line { SrcBlock "Constant51" SrcPort 1 DstBlock "Sum25" DstPort 2 } Line { SrcBlock "Sum25" SrcPort 1 Points [5, 0; 0, -5; 5, 0] Branch { DstBlock "Math\nFunction23" DstPort 2 } Branch { Points [-50, 0] DstBlock "Sum26" DstPort 1 } } Line { SrcBlock "Constant52" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction24" DstPort 1 } Line { SrcBlock "Bitwise\nOperator28" SrcPort 1 DstBlock "Compare\nTo Zero24" DstPort 1 } Line { SrcBlock "Compare\nTo Zero24" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product24" DstPort 2 } Line { SrcBlock "Math\nFunction24" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product24" DstPort 1 } Line { SrcBlock "Constant53" SrcPort 1 DstBlock "Sum26" DstPort 2 } Line { SrcBlock "Sum26" SrcPort 1 Points [5, 0; 0, -5] DstBlock "Math\nFunction24" DstPort 2 } Line { SrcBlock "Product2" SrcPort 1 Points [40, 0] Branch { Points [0, 2830] DstBlock "Sum27" DstPort 3 } Branch { Points [0, -60] DstBlock "Display5" DstPort 1 } } Line { SrcBlock "Product3" SrcPort 1 Points [105, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 4 } Branch { Points [0, -35] DstBlock "Display1" DstPort 1 } } Line { SrcBlock "Product4" SrcPort 1 Points [105, 0] Branch { Points [40, 0] DstBlock "Sum27" DstPort 5 } Branch { Points [0, -45] DstBlock "Display2" DstPort 1 } } Line { SrcBlock "Product5" SrcPort 1 Points [15, 0] Branch { Points [0, 2380] DstBlock "Sum27" DstPort 6 } Branch { Points [0, -15] DstBlock "Display3" DstPort 1 } } Line { SrcBlock "Product6" SrcPort 1 Points [40, 0; 0, 5] Branch { Points [0, 2205] DstBlock "Sum27" DstPort 7 } Branch { DstBlock "Display4" DstPort 1 } } Line { SrcBlock "Product7" SrcPort 1 Points [95, 0] Branch { Points [45, 0] DstBlock "Sum27" DstPort 8 } Branch { Points [0, -45] DstBlock "Display6" DstPort 1 } } Line { SrcBlock "Product8" SrcPort 1 Points [40, 0; 0, 1870] DstBlock "Sum27" DstPort 9 } Line { SrcBlock "Product9" SrcPort 1 Points [40, 0; 0, 1690] DstBlock "Sum27" DstPort 10 } Line { SrcBlock "Product10" SrcPort 1 Points [40, 0; 0, 1500] DstBlock "Sum27" DstPort 11 } Line { SrcBlock "Product11" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 12 } Line { SrcBlock "Product12" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 13 } Line { SrcBlock "Product13" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 14 } Line { SrcBlock "Product14" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 15 } Line { SrcBlock "Product15" SrcPort 1 Points [40, 0; 0, 345] DstBlock "Sum27" DstPort 16 } Line { SrcBlock "Product16" SrcPort 1 Points [40, 0; 0, 80] DstBlock "Sum27" DstPort 17 } Line { SrcBlock "Product17" SrcPort 1 Points [40, 0; 0, -190] DstBlock "Sum27" DstPort 18 } Line { SrcBlock "Product18" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 19 } Line { SrcBlock "Product19" SrcPort 1 Points [40, 0; 0, -755] DstBlock "Sum27" DstPort 20 } Line { SrcBlock "Product20" SrcPort 1 Points [140, 0] DstBlock "Sum27" DstPort 21 } Line { SrcBlock "Product21" SrcPort 1 Points [40, 0; 0, -1350] DstBlock "Sum27" DstPort 22 } Line { SrcBlock "Product22" SrcPort 1 Points [35, 0; 0, -1655] DstBlock "Sum27" DstPort 23 } Line { SrcBlock "Product23" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 2 } Line { SrcBlock "Product24" SrcPort 1 Points [135, 0] DstBlock "Sum27" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 Points [0, -10; 280, 0] Branch { Points [0, -20] DstBlock "Math\nFunction1" DstPort 2 } Branch { Points [0, 170] DstBlock "Sum1" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 80] Branch { DstBlock "Bitwise\nOperator6" DstPort 1 } Branch { Points [0, 150] Branch { DstBlock "Bitwise\nOperator7" DstPort 1 } Branch { Points [0, 155] Branch { Points [0, 5] DstBlock "Bitwise\nOperator8" DstPort 1 } Branch { Points [0, 175] Branch { DstBlock "Bitwise\nOperator9" DstPort 1 } Branch { Points [0, 180; 5, 0] Branch { DstBlock "Bitwise\nOperator10" DstPort 1 } Branch { Points [-5, 0; 0, 175] Branch { Points [0, 5] DstBlock "Bitwise\nOperator11" DstPort 1 } Branch { Points [0, 185] Branch { DstBlock "Bitwise\nOperator12" DstPort 1 } Branch { Points [0, 190] Branch { DstBlock "Bitwise\nOperator13" DstPort 1 } Branch { Points [0, 195] Branch { Points [0, 5] DstBlock "Bitwise\nOperator14" DstPort 1 } Branch { Points [0, 215] Branch { DstBlock "Bitwise\nOperator15" DstPort 1 } Branch { Points [0, 230] Branch { DstBlock "Bitwise\nOperator16" DstPort 1 } Branch { Points [0, 240] Branch { Points [0, 5] DstBlock "Bitwise\nOperator17" DstPort 1 } Branch { Points [0, 260] Branch { DstBlock "Bitwise\nOperator18" DstPort 1 } Branch { Points [0, 265] Branch { DstBlock "Bitwise\nOperator19" DstPort 1 } Branch { Points [0, 275] Branch { DstBlock "Bitwise\nOperator20" DstPort 1 } Branch { Points [0, 280] Branch { DstBlock "Bitwise\nOperator21" DstPort 1 } Branch { Points [0, 285] Branch { Points [0, 5] DstBlock "Bitwise\nOperator22" DstPort 1 } Branch { Points [0, 300] Branch { DstBlock "Bitwise\nOperator23" DstPort 1 } Branch { Points [0, 305] Branch { DstBlock "Bitwise\nOperator24" DstPort 1 } Branch { Points [0, 310] Branch { DstBlock "Bitwise\nOperator25" DstPort 1 } Branch { Points [0, 315] Branch { DstBlock "Bitwise\nOperator26" DstPort 1 } Branch { Points [0, 320] Branch { DstBlock "Bitwise\nOperator27" DstPort 1 } Branch { Points [0, 325] DstBlock "Bitwise\nOperator28" DstPort 1 } } } } } } } } } } } } } } } } } } } } } } } Branch { Points [0, -105] DstBlock "Bitwise\nOperator1" DstPort 1 } } Line { SrcBlock "Sum27" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "Constant1" SrcPort 1 Points [5, 0; 0, 25] DstBlock "Math\nFunction1" DstPort 1 } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 DstBlock "Compare\nTo Zero1" DstPort 1 } Line { SrcBlock "Compare\nTo Zero1" SrcPort 1 Points [10, 0; 0, -35] DstBlock "Product1" DstPort 2 } Line { SrcBlock "Math\nFunction1" SrcPort 1 Points [40, 0; 0, 15] DstBlock "Product1" DstPort 1 } Line { SrcBlock "Constant2" SrcPort 1 DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Sum1" SrcPort 1 Points [0, -5] Branch { Points [5, 0] Branch { DstBlock "Math\nFunction2" DstPort 2 } Branch { Points [0, -55] DstBlock "Display8" DstPort 1 } } Branch { Points [-50, 0] DstBlock "Sum5" DstPort 1 } } Line { SrcBlock "Product1" SrcPort 1 Points [15, 0] Branch { Points [0, -10] DstBlock "Display7" DstPort 1 } Branch { Points [110, 0; 0, 3225] DstBlock "Sum27" DstPort 24 } } } } Block { BlockType Sum Name "Sum" SID "2037" Ports [2, 1] Position [670, 290, 690, 310] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum1" SID "2038" Ports [3, 1] Position [845, 400, 875, 430] ShowName off IconShape "round" Inputs "|+++|" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum2" SID "2039" Ports [2, 1] Position [880, 235, 900, 255] ShowName off IconShape "round" Inputs "|+-" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Sum Name "Sum3" SID "2040" Ports [2, 1] Position [945, 625, 965, 645] ShowName off IconShape "round" Inputs "|++" InputSameDT off OutDataTypeStr "Inherit: Inherit via internal rule" SaturateOnIntegerOverflow off } Block { BlockType Outport Name "Out1" SID "2041" Position [1280, 288, 1310, 302] IconDisplay "Port number" } Line { SrcBlock "Bitwise\nOperator" SrcPort 1 Points [25, 0] Branch { DstBlock "Display3" DstPort 1 } Branch { Points [0, 55] DstBlock "Shift\nArithmetic" DstPort 1 } } Line { SrcBlock "Data Type Conversion" SrcPort 1 Points [50, 0] Branch { Points [0, 125] DstBlock "Bitwise\nOperator" DstPort 1 } Branch { Points [0, -10] DstBlock "Bitwise\nOperator2" DstPort 1 } } Line { SrcBlock "In2" SrcPort 1 Points [15, 0] Branch { Points [0, 95] DstBlock "Data Type Conversion2" DstPort 1 } Branch { DstBlock "Data Type Conversion1" DstPort 1 } } Line { SrcBlock "Data Type Conversion1" SrcPort 1 Points [25, 0; 0, 15] DstBlock "Bitwise\nOperator1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic" SrcPort 1 Points [0, -5] Branch { DstBlock "Display4" DstPort 1 } Branch { Points [5, 0] DstBlock "Sum" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator1" SrcPort 1 Points [10, 0; 0, 5] DstBlock "Shift\nArithmetic1" DstPort 1 } Line { SrcBlock "Shift\nArithmetic1" SrcPort 1 Points [155, 0; 0, 50] DstBlock "Sum" DstPort 2 } Line { SrcBlock "Sum" SrcPort 1 Points [0, -5; 5, 0] Branch { DstBlock "Exponent" DstPort 1 } Branch { Points [0, -50] DstBlock "Sum2" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator2" SrcPort 1 DstBlock "Shift\nArithmetic2" DstPort 1 } Line { SrcBlock "Shift\nArithmetic2" SrcPort 1 Points [10, 0] Branch { DstBlock "Sign" DstPort 1 } Branch { Points [0, 90] DstBlock "Data Type Conversion7" DstPort 1 } } Line { SrcBlock "Bitwise\nOperator3" SrcPort 1 DstBlock "Shift\nArithmetic3" DstPort 1 } Line { SrcBlock "Data Type Conversion2" SrcPort 1 Points [30, 0; 0, 5] DstBlock "Bitwise\nOperator3" DstPort 1 } Line { SrcBlock "Shift\nArithmetic3" SrcPort 1 Points [5, 0; 0, 10; 379, 0] DstBlock "Sum1" DstPort 1 } Line { SrcBlock "Data Type Conversion3" SrcPort 1 DstBlock "Shift\nArithmetic4" DstPort 1 } Line { SrcBlock "Shift\nArithmetic4" SrcPort 1 Points [370, 0] DstBlock "Sum1" DstPort 2 } Line { SrcBlock "Data Type Conversion4" SrcPort 1 Points [320, 0; 0, -64; 334, 0] DstBlock "Sum1" DstPort 3 } Line { SrcBlock "Sum1" SrcPort 1 Points [30, 0; 0, 155] Branch { Points [0, 5] DstBlock "Mantissa" DstPort 1 } Branch { Points [0, 65] DstBlock "Sum3" DstPort 1 } } Line { SrcBlock "Constant4" SrcPort 1 DstBlock "Sum2" DstPort 2 } Line { SrcBlock "Sum2" SrcPort 1 Points [0, 5; 45, 0; 0, 115] DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Sum3" SrcPort 1 Points [5, 0; 0, -240] DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Constant5" SrcPort 1 DstBlock "Data Type Conversion5" DstPort 1 } Line { SrcBlock "Data Type Conversion5" SrcPort 1 Points [75, 0] DstBlock "Sum3" DstPort 2 } Line { SrcBlock "Subsystem" SrcPort 1 Points [25, 0; 0, -30; 5, 0; 0, -50] DstBlock "Product" DstPort 2 } Line { SrcBlock "Constant7" SrcPort 1 Points [20, 0; 0, 50] DstBlock "Math\nFunction" DstPort 1 } Line { SrcBlock "Data Type Conversion7" SrcPort 1 Points [60, 0] DstBlock "Math\nFunction" DstPort 2 } Line { SrcBlock "Math\nFunction" SrcPort 1 Points [175, 0; 0, 165] DstBlock "Product" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type Conversion" DstPort 1 } Line { SrcBlock "Product" SrcPort 1 DstBlock "Out1" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type Conversion3" DstPort 1 } Line { SrcBlock "In4" SrcPort 1 DstBlock "Data Type Conversion4" DstPort 1 } } } Block { BlockType Outport Name "control_id" SID "2042" Position [440, 113, 470, 127] IconDisplay "Port number" OutputWhenDisabled "reset" InitialOutput "0" } Line { SrcBlock "Data Type \nConversion5" SrcPort 1 DstBlock "control_id" DstPort 1 } Line { SrcBlock "hex2float" SrcPort 1 DstBlock "Data Type \nConversion5" DstPort 1 } Line { SrcBlock "Data Type \nConversion4" SrcPort 1 DstBlock "hex2float" DstPort 1 } Line { SrcBlock "Data Type \nConversion1" SrcPort 1 DstBlock "hex2float" DstPort 2 } Line { SrcBlock "Data Type \nConversion2" SrcPort 1 DstBlock "hex2float" DstPort 3 } Line { SrcBlock "Data Type \nConversion3" SrcPort 1 DstBlock "hex2float" DstPort 4 } Line { SrcBlock "In4" SrcPort 1 Points [10, 0; 0, -5] DstBlock "Data Type \nConversion4" DstPort 1 } Line { SrcBlock "In3" SrcPort 1 DstBlock "Data Type \nConversion1" DstPort 1 } Line { SrcBlock "In2" SrcPort 1 DstBlock "Data Type \nConversion2" DstPort 1 } Line { SrcBlock "In1" SrcPort 1 DstBlock "Data Type \nConversion3" DstPort 1 } } } Block { BlockType Outport Name "control_id" SID "2043" Position [555, 103, 585, 117] IconDisplay "Port number" } Block { BlockType Outport Name "d_E_I" SID "2044" Position [560, 263, 590, 277] Port "2" IconDisplay "Port number" } Block { BlockType Outport Name "d_E_Q" SID "2045" Position [560, 423, 590, 437] Port "3" IconDisplay "Port number" } Block { BlockType Outport Name "d_L_I" SID "2046" Position [560, 583, 590, 597] Port "4" IconDisplay "Port number" } Block { BlockType Outport Name "d_L_Q" SID "2047" Position [560, 743, 590, 757] Port "5" IconDisplay "Port number" } Block { BlockType Outport Name "d_P_I" SID "2048" Position [560, 903, 590, 917] Port "6" IconDisplay "Port number" } Block { BlockType Outport Name "d_P_Q" SID "2049" Position [560, 1063, 590, 1077] Port "7" IconDisplay "Port number" } Block { BlockType Outport Name "d_acq_carrier_doppler_hz" SID "2050" Position [555, 1223, 585, 1237] Port "8" IconDisplay "Port number" } Block { BlockType Outport Name "enable_tracking" SID "2051" Position [560, 1383, 590, 1397] Port "9" IconDisplay "Port number" } Line { SrcBlock "RX" SrcPort 1 DstBlock "Multiport\nSelector" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 1 DstBlock "Subsystem8" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 2 DstBlock "Subsystem8" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 3 DstBlock "Subsystem8" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 4 DstBlock "Subsystem8" DstPort 4 } Line { SrcBlock "Multiport\nSelector" SrcPort 5 DstBlock "Subsystem" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 6 DstBlock "Subsystem" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 7 DstBlock "Subsystem" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 8 DstBlock "Subsystem" DstPort 4 } Line { SrcBlock "Multiport\nSelector" SrcPort 9 DstBlock "Subsystem1" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 10 DstBlock "Subsystem1" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 11 DstBlock "Subsystem1" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 12 DstBlock "Subsystem1" DstPort 4 } Line { SrcBlock "Multiport\nSelector" SrcPort 13 DstBlock "Subsystem2" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 14 DstBlock "Subsystem2" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 15 DstBlock "Subsystem2" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 16 DstBlock "Subsystem2" DstPort 4 } Line { SrcBlock "Multiport\nSelector" SrcPort 17 DstBlock "Subsystem3" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 18 DstBlock "Subsystem3" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 19 DstBlock "Subsystem3" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 20 DstBlock "Subsystem3" DstPort 4 } Line { SrcBlock "Multiport\nSelector" SrcPort 21 DstBlock "Subsystem4" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 22 DstBlock "Subsystem4" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 23 DstBlock "Subsystem4" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 24 DstBlock "Subsystem4" DstPort 4 } Line { SrcBlock "Multiport\nSelector" SrcPort 25 DstBlock "Subsystem5" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 26 DstBlock "Subsystem5" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 27 DstBlock "Subsystem5" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 28 DstBlock "Subsystem5" DstPort 4 } Line { SrcBlock "Subsystem4" SrcPort 1 DstBlock "d_P_I" DstPort 1 } Line { SrcBlock "Subsystem3" SrcPort 1 DstBlock "d_L_Q" DstPort 1 } Line { SrcBlock "Subsystem2" SrcPort 1 DstBlock "d_L_I" DstPort 1 } Line { SrcBlock "Subsystem1" SrcPort 1 DstBlock "d_E_Q" DstPort 1 } Line { SrcBlock "Subsystem" SrcPort 1 DstBlock "d_E_I" DstPort 1 } Line { SrcBlock "Subsystem8" SrcPort 1 DstBlock "control_id" DstPort 1 } Line { SrcBlock "Subsystem5" SrcPort 1 DstBlock "d_P_Q" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 29 DstBlock "Subsystem6" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 30 DstBlock "Subsystem6" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 31 DstBlock "Subsystem6" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 32 DstBlock "Subsystem6" DstPort 4 } Line { SrcBlock "Subsystem6" SrcPort 1 DstBlock "d_acq_carrier_doppler_hz" DstPort 1 } Line { SrcBlock "Subsystem7" SrcPort 1 DstBlock "enable_tracking" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 33 DstBlock "Subsystem7" DstPort 1 } Line { SrcBlock "Multiport\nSelector" SrcPort 34 DstBlock "Subsystem7" DstPort 2 } Line { SrcBlock "Multiport\nSelector" SrcPort 35 DstBlock "Subsystem7" DstPort 3 } Line { SrcBlock "Multiport\nSelector" SrcPort 36 DstBlock "Subsystem7" DstPort 4 } Annotation { Position [285, 79] } } } Block { BlockType SubSystem Name "gnss_sdr_tcp_connector_tracking_tx" SID "5" Ports [4] Position [430, 26, 600, 224] AncestorBlock "simulink/User-Defined\nFunctions/gnss_sdr/gnss_sdr_tcp_connector_tracking_tx" LibraryVersion "*1.267" MinAlgLoopOccurrences off PropExecContextOutsideSubsystem off RTWSystemCode "Auto" FunctionWithSeparateData off Opaque off RequestExecContextInheritance off MaskHideContents off System { Name "gnss_sdr_tcp_connector_tracking_tx" Location [1137, 408, 1500, 698] Open off ModelBrowserVisibility off ModelBrowserWidth 200 ScreenColor "white" PaperOrientation "landscape" PaperPositionMode "auto" PaperType "A4" PaperUnits "centimeters" TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] TiledPageScale 1 ShowPageBoundaries off ZoomFactor "100" SIDHighWatermark "11844" SIDPrevWatermark "11844" Block { BlockType Inport Name "control_id" SID "5:11610" Position [30, 38, 60, 52] IconDisplay "Port number" } Block { BlockType Inport Name "code_error" SID "5:11611" Position [30, 98, 60, 112] Port "2" IconDisplay "Port number" } Block { BlockType Inport Name "carr_error" SID "5:11612" Position [30, 158, 60, 172] Port "3" IconDisplay "Port number" } Block { BlockType Inport Name "carrier_doppler_hz" SID "5:11613" Position [30, 218, 60, 232] Port "4" IconDisplay "Port number" } Block { BlockType Display Name "Display" SID "5:11614" Ports [1] Position [175, 234, 330, 266] ShowName off Format "long" Decimation "1" Lockdown off } Block { BlockType Reference Name "TX" SID "5:11615" Ports [1] Position [175, 77, 310, 193] LibraryVersion "1.84" DialogController "instrumentcreatedialog" DialogControllerArgs "DataTag5" SourceBlock "instrumentlib/TCP//IP Send" SourceType "TCP/IP Send" Host "84.88.61.86" Port "2070" EnableBlockingMode on Timeout "10" ByteOrder "LittleEndian" } Block { BlockType Concatenate Name "Vector\nConcatenate1" SID "5:11616" Ports [4, 1] Position [95, 12, 100, 258] BackgroundColor "black" ShowName off NumInputs "4" Mode "Vector" } Line { SrcBlock "carr_error" SrcPort 1 DstBlock "Vector\nConcatenate1" DstPort 3 } Line { SrcBlock "code_error" SrcPort 1 DstBlock "Vector\nConcatenate1" DstPort 2 } Line { SrcBlock "control_id" SrcPort 1 DstBlock "Vector\nConcatenate1" DstPort 1 } Line { SrcBlock "Vector\nConcatenate1" SrcPort 1 Points [15, 0] Branch { DstBlock "TX" DstPort 1 } Branch { Points [0, 115] DstBlock "Display" DstPort 1 } } Line { SrcBlock "carrier_doppler_hz" SrcPort 1 DstBlock "Vector\nConcatenate1" DstPort 4 } } } } } } } MatData { NumRecords 6 DataRecord { Tag DataTag5 Data " %)30 . : 8 ( 0 % \" $ ! 0 . . 8 ( ! " " % \" $ ' 0 0 !P '1C<&EP. % * % * ---------------------------------------------------------------------- % */ function gnss_sdr_tcp_connector_tracking_start(num_channels) %User parameters host = '84.88.61.86'; %Remote IP address (GNSS-SDR computer IP) port = 2070; %Remote port (GNSS-SDR computer port for Ch0) num_vars_rx = 9; %Number of variables expected from GNSS-SDR num_vars_tx = 4; %Number of variable to be transmitted to GNSS-SDR timeout = '40'; %Timeout [s] %name of the tracking block, it must match the name of the Simulink %model tracking_block_name = 'gnss_sdr_tcp_connector_tracking'; % Layout coordinates for the first gnss_sdr_tcp_connector_tracking % block and offset definitions X0 = 20; X1 = 170; Y0 = 20; Y1 = 140; X_offset = 200; Y_offset = 160; %Calculate the size of the data received from GNSS-SDR %(float = 4 bytes each variable) datasize_RX = num_vars_rx*4; %Create a Simulink model simulink('open'); new_system('gnss_sdr_tcp_connector_tracking_aux'); open_system('gnss_sdr_tcp_connector_tracking_aux'); %Set parameters to avoid warnings in the Command Window set_param('gnss_sdr_tcp_connector_tracking_aux',... 'InheritedTsInSrcMsg', 'none'); warning('off', 'Simulink:Commands:SetParamLinkChangeWarn'); %Assign values to the variables used by Simulink in the base workspace assignin('base', 'Ti', 1e-3); assignin('base', 'f0', 1.57542e9); assignin('base', 'SFunSlope', 3.5); assignin('base', 'Tc', 4e-3/4092); assignin('base', 'T', 1e-3); assignin('base', 'B_PLL', 50); assignin('base', 'B_DLL', 2); %Block generation from the Simulink Library for i = 0:num_channels-1; %Add and prepare an empty block to become the TCP connector block tcp_connector_block=['gnss_sdr_tcp_connector_tracking_aux/gnss_sdr_tcp_connector_tracking_', num2str(i)]; add_block('simulink/Ports & Subsystems/Subsystem', tcp_connector_block); delete_line(tcp_connector_block,'In1/1', 'Out1/1') tcp_connector_tracking_i_In1 = ['gnss_sdr_tcp_connector_tracking_aux/gnss_sdr_tcp_connector_tracking_',num2str(i),'/In1']; tcp_connector_tracking_i_Out1 = ['gnss_sdr_tcp_connector_tracking_aux/gnss_sdr_tcp_connector_tracking_',num2str(i),'/Out1']; delete_block(tcp_connector_tracking_i_In1); delete_block(tcp_connector_tracking_i_Out1); %Add to the TCP connector block the receiver, the tracking and the %transmitter blocks tcp_connector_tracking_rx_block = ['gnss_sdr_tcp_connector_tracking_aux/gnss_sdr_tcp_connector_tracking_',num2str(i),'/gnss_sdr_tcp_connector_tracking_rx']; tcp_connector_tracking_block = ['gnss_sdr_tcp_connector_tracking_aux/gnss_sdr_tcp_connector_tracking_',num2str(i),'/',tracking_block_name]; tcp_connector_tracking_tx_block = ['gnss_sdr_tcp_connector_tracking_aux/gnss_sdr_tcp_connector_tracking_',num2str(i),'/gnss_sdr_tcp_connector_tracking_tx']; add_block('simulink/User-Defined Functions/gnss_sdr/gnss_sdr_tcp_connector_tracking_rx',tcp_connector_tracking_rx_block); path_to_tracking_block = ['simulink/User-Defined Functions/gnss_sdr/', tracking_block_name]; add_block(path_to_tracking_block, tcp_connector_tracking_block); add_block('simulink/User-Defined Functions/gnss_sdr/gnss_sdr_tcp_connector_tracking_tx',tcp_connector_tracking_tx_block); %Connect the receiver block to the tracking block for j=1:num_vars_rx; rx_out_ports =['gnss_sdr_tcp_connector_tracking_rx/',num2str(j)]; tracking_in_ports =[tracking_block_name,'/',num2str(j)]; add_line(tcp_connector_block, rx_out_ports, tracking_in_ports) end %Connect the tracking block to the transmitter block for k=1:num_vars_tx; tracking_out_ports =[tracking_block_name,'/',num2str(k)]; tx_in_ports =['gnss_sdr_tcp_connector_tracking_tx/',num2str(k)]; add_line(tcp_connector_block, tracking_out_ports, tx_in_ports) end %Add, place and connect two scopes in the TCP connector block name_scope_1 = [tcp_connector_block,'/Scope']; add_block('simulink/Sinks/Scope', name_scope_1, 'Position', [500 300 550 350]); set_param(name_scope_1, 'NumInputPorts', '4', 'LimitDataPoints', 'off'); add_line(tcp_connector_block, 'gnss_sdr_tcp_connector_tracking_rx/9', 'Scope/1', 'autorouting','on') tracking_scope_port2 = [tracking_block_name,'/2']; add_line(tcp_connector_block, tracking_scope_port2, 'Scope/2', 'autorouting','on') tracking_scope_port3 = [tracking_block_name,'/3']; add_line(tcp_connector_block, tracking_scope_port3, 'Scope/3', 'autorouting','on') tracking_scope_port4 = [tracking_block_name,'/4']; add_line(tcp_connector_block, tracking_scope_port4, 'Scope/4', 'autorouting','on') name_scope_2 = [tcp_connector_block,'/EPL']; add_block('simulink/Sinks/Scope', name_scope_2, 'Position', [500 400 550 450]); set_param(name_scope_2, 'LimitDataPoints', 'off'); tracking_scope2_port5 = [tracking_block_name,'/5']; add_line(tcp_connector_block, tracking_scope2_port5, 'EPL/1', 'autorouting','on') %Set the TCP receiver parameters tcp_receiver = ['gnss_sdr_tcp_connector_tracking_aux/gnss_sdr_tcp_connector_tracking_',num2str(i),'/gnss_sdr_tcp_connector_tracking_rx/RX']; set_param(tcp_receiver, 'Port', num2str(port+i), 'Host', host, 'DataSize', num2str(datasize_RX), 'Timeout', timeout); %Set the TCP transmitter parameters tcp_transmitter = ['gnss_sdr_tcp_connector_tracking_aux/gnss_sdr_tcp_connector_tracking_',num2str(i),'/gnss_sdr_tcp_connector_tracking_tx/TX']; set_param(tcp_transmitter, 'Port', num2str(port+i), 'Host', host,'Timeout', timeout); %New layout coordinates for each block X2 = X0 + floor(i/4)*X_offset; X3 = X1 + floor(i/4)*X_offset; Y2 = Y0 + (i-4*floor(i/4))*Y_offset; Y3 = Y1 + (i-4*floor(i/4))*Y_offset; %Place the block in the layout set_param(tcp_connector_block, 'Position', [X2 Y2 X3 Y3]); end %Set parameters to configure the model Solver set_param('gnss_sdr_tcp_connector_tracking_aux',... 'SolverType', 'Fixed-step', 'Solver', 'FixedStepDiscrete',... 'FixedStep', 'auto', 'StopTime', 'inf'); %Save the model with a definitive name save_system('gnss_sdr_tcp_connector_tracking_aux', 'gnss_sdr_tcp_connector_tracking_ready'); simulink('close'); %Run the Simulink model set_param('gnss_sdr_tcp_connector_tracking_ready','simulationcommand','start'); end